Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArystanbek Dyussenov <arystan.d@gmail.com>2010-09-04 22:49:07 +0400
committerArystanbek Dyussenov <arystan.d@gmail.com>2010-09-04 22:49:07 +0400
commit90b464d3728d9ed8ec26fdf59058d236b99dbcd9 (patch)
treee88cab4fb1358e962b19f658064ca8c9f8d29f5b
parent08d02dd04d836976b25793bb1d4c6a86b3f924c7 (diff)
parentb0b787ef38f9947b3176642556f5282eb3518f69 (diff)
COLLADA branch: merge from trunk -r 28015:31610.soc-2009-chingachgook
-rw-r--r--CMake/macros.cmake172
-rw-r--r--CMakeLists.txt761
-rw-r--r--Makefile6
-rw-r--r--SConstruct197
-rwxr-xr-xbuild_files/cmake/example_scripts/cmake_linux_install.sh37
-rwxr-xr-xbuild_files/cmake/example_scripts/make_quicky.py119
-rw-r--r--build_files/cmake/macros.cmake253
-rwxr-xr-xbuild_files/make/example_scripts/linux_nanmakefiles.sh38
-rwxr-xr-xbuild_files/make/example_scripts/macos_nanmakefiles.sh18
-rwxr-xr-xbuild_files/make/example_scripts/sunos_nanmakefiles.sh35
-rw-r--r--build_files/make/nan_compile.mk (renamed from source/nan_compile.mk)20
-rw-r--r--build_files/make/nan_definitions.mk (renamed from source/nan_definitions.mk)48
-rw-r--r--build_files/make/nan_link.mk (renamed from source/nan_link.mk)12
-rw-r--r--build_files/make/nan_subdirs.mk (renamed from source/nan_subdirs.mk)0
-rw-r--r--build_files/make/nan_warn.mk (renamed from source/nan_warn.mk)0
-rw-r--r--build_files/scons/config/aix4-config.py (renamed from config/aix4-config.py)13
-rw-r--r--build_files/scons/config/darwin-config.py (renamed from config/darwin-config.py)16
-rw-r--r--build_files/scons/config/freebsd7-config.py213
-rw-r--r--build_files/scons/config/freebsd8-config.py213
-rw-r--r--build_files/scons/config/freebsd9-config.py213
-rw-r--r--build_files/scons/config/irix6-config.py (renamed from config/irix6-config.py)2
-rw-r--r--build_files/scons/config/linux2-config.py (renamed from config/linux2-config.py)19
-rw-r--r--build_files/scons/config/linuxcross-config.py (renamed from config/linuxcross-config.py)21
-rw-r--r--build_files/scons/config/openbsd3-config.py (renamed from config/openbsd3-config.py)0
-rw-r--r--build_files/scons/config/sunos5-config.py (renamed from config/sunos5-config.py)0
-rw-r--r--build_files/scons/config/win32-mingw-config.py (renamed from config/win32-mingw-config.py)10
-rw-r--r--build_files/scons/config/win32-vc-config.py (renamed from config/win32-vc-config.py)7
-rw-r--r--build_files/scons/config/win64-vc-config.py (renamed from config/win64-vc-config.py)7
-rw-r--r--build_files/scons/tools/Blender.py (renamed from tools/Blender.py)105
-rw-r--r--build_files/scons/tools/__init__.py (renamed from tools/__init__.py)0
-rw-r--r--build_files/scons/tools/bcolors.py (renamed from tools/bcolors.py)0
-rw-r--r--build_files/scons/tools/btools.py (renamed from tools/btools.py)261
-rw-r--r--build_files/scons/tools/crossmingw.py (renamed from tools/crossmingw.py)1
-rw-r--r--[-rwxr-xr-x]build_files/scons/tools/mstoolkit.py (renamed from tools/mstoolkit.py)0
-rw-r--r--doc/blender-cmake.txt4
-rw-r--r--doc/blender.1340
-rw-r--r--doc/blender.1.py136
-rw-r--r--extern/CMakeLists.txt4
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp2
-rw-r--r--extern/glew/include/GL/glew.h8
-rw-r--r--extern/glew/src/glew.c6
-rw-r--r--extern/libopenjpeg/CMakeLists.txt2
-rw-r--r--extern/libopenjpeg/dwt.c10
-rw-r--r--extern/libopenjpeg/opj_malloc.h2
-rw-r--r--extern/libopenjpeg/patches/fbsd.patch13
-rw-r--r--extern/lzma/CMakeLists.txt5
-rw-r--r--extern/lzma/SConscript2
-rw-r--r--extern/lzo/CMakeLists.txt2
-rw-r--r--extern/lzo/SConscript2
-rw-r--r--intern/CMakeLists.txt4
-rw-r--r--intern/audaspace/CMakeLists.txt21
-rw-r--r--intern/audaspace/FX/AUD_AccumulatorFactory.cpp43
-rw-r--r--intern/audaspace/FX/AUD_AccumulatorFactory.h14
-rw-r--r--intern/audaspace/FX/AUD_AccumulatorReader.cpp99
-rw-r--r--intern/audaspace/FX/AUD_AccumulatorReader.h75
-rw-r--r--intern/audaspace/FX/AUD_BaseIIRFilterReader.cpp76
-rw-r--r--intern/audaspace/FX/AUD_BaseIIRFilterReader.h114
-rw-r--r--intern/audaspace/FX/AUD_ButterworthFactory.cpp49
-rw-r--r--intern/audaspace/FX/AUD_ButterworthFactory.h14
-rw-r--r--intern/audaspace/FX/AUD_ButterworthReader.cpp124
-rw-r--r--intern/audaspace/FX/AUD_ButterworthReader.h83
-rw-r--r--intern/audaspace/FX/AUD_CallbackIIRFilterReader.cpp (renamed from intern/audaspace/FX/AUD_RectifyReader.cpp)36
-rw-r--r--intern/audaspace/FX/AUD_CallbackIIRFilterReader.h83
-rw-r--r--intern/audaspace/FX/AUD_DelayFactory.cpp24
-rw-r--r--intern/audaspace/FX/AUD_DelayFactory.h24
-rw-r--r--intern/audaspace/FX/AUD_DelayReader.cpp56
-rw-r--r--intern/audaspace/FX/AUD_DelayReader.h25
-rw-r--r--intern/audaspace/FX/AUD_DoubleFactory.cpp50
-rw-r--r--intern/audaspace/FX/AUD_DoubleFactory.h (renamed from intern/audaspace/FX/AUD_SquareReader.h)42
-rw-r--r--intern/audaspace/FX/AUD_DoubleReader.cpp109
-rw-r--r--intern/audaspace/FX/AUD_DoubleReader.h21
-rw-r--r--intern/audaspace/FX/AUD_EffectFactory.cpp13
-rw-r--r--intern/audaspace/FX/AUD_EffectFactory.h22
-rw-r--r--intern/audaspace/FX/AUD_EffectReader.cpp22
-rw-r--r--intern/audaspace/FX/AUD_EffectReader.h16
-rw-r--r--intern/audaspace/FX/AUD_EnvelopeFactory.cpp56
-rw-r--r--intern/audaspace/FX/AUD_EnvelopeFactory.h24
-rw-r--r--intern/audaspace/FX/AUD_EnvelopeReader.cpp86
-rw-r--r--intern/audaspace/FX/AUD_EnvelopeReader.h84
-rw-r--r--intern/audaspace/FX/AUD_FaderFactory.cpp42
-rw-r--r--intern/audaspace/FX/AUD_FaderFactory.h47
-rw-r--r--intern/audaspace/FX/AUD_FaderReader.cpp54
-rw-r--r--intern/audaspace/FX/AUD_FaderReader.h34
-rw-r--r--intern/audaspace/FX/AUD_HighpassFactory.cpp38
-rw-r--r--intern/audaspace/FX/AUD_HighpassFactory.h17
-rw-r--r--intern/audaspace/FX/AUD_HighpassReader.cpp116
-rw-r--r--intern/audaspace/FX/AUD_HighpassReader.h83
-rw-r--r--intern/audaspace/FX/AUD_IIRFilterFactory.cpp39
-rw-r--r--intern/audaspace/FX/AUD_IIRFilterFactory.h66
-rw-r--r--intern/audaspace/FX/AUD_IIRFilterReader.cpp50
-rw-r--r--intern/audaspace/FX/AUD_IIRFilterReader.h (renamed from intern/audaspace/FX/AUD_VolumeReader.h)44
-rw-r--r--intern/audaspace/FX/AUD_LimiterFactory.cpp28
-rw-r--r--intern/audaspace/FX/AUD_LimiterFactory.h29
-rw-r--r--intern/audaspace/FX/AUD_LimiterReader.cpp36
-rw-r--r--intern/audaspace/FX/AUD_LimiterReader.h13
-rw-r--r--intern/audaspace/FX/AUD_LoopFactory.cpp24
-rw-r--r--intern/audaspace/FX/AUD_LoopFactory.h26
-rw-r--r--intern/audaspace/FX/AUD_LoopReader.cpp71
-rw-r--r--intern/audaspace/FX/AUD_LoopReader.h27
-rw-r--r--intern/audaspace/FX/AUD_LowpassFactory.cpp38
-rw-r--r--intern/audaspace/FX/AUD_LowpassFactory.h17
-rw-r--r--intern/audaspace/FX/AUD_LowpassReader.cpp115
-rw-r--r--intern/audaspace/FX/AUD_PingPongFactory.cpp45
-rw-r--r--intern/audaspace/FX/AUD_PingPongFactory.h13
-rw-r--r--intern/audaspace/FX/AUD_PitchFactory.cpp19
-rw-r--r--intern/audaspace/FX/AUD_PitchFactory.h27
-rw-r--r--intern/audaspace/FX/AUD_PitchReader.cpp5
-rw-r--r--intern/audaspace/FX/AUD_PitchReader.h9
-rw-r--r--intern/audaspace/FX/AUD_RectifyFactory.cpp25
-rw-r--r--intern/audaspace/FX/AUD_RectifyFactory.h14
-rw-r--r--intern/audaspace/FX/AUD_ReverseFactory.cpp15
-rw-r--r--intern/audaspace/FX/AUD_ReverseFactory.h12
-rw-r--r--intern/audaspace/FX/AUD_ReverseReader.cpp38
-rw-r--r--intern/audaspace/FX/AUD_ReverseReader.h29
-rw-r--r--intern/audaspace/FX/AUD_SquareFactory.cpp45
-rw-r--r--intern/audaspace/FX/AUD_SquareFactory.h24
-rw-r--r--intern/audaspace/FX/AUD_SumFactory.cpp22
-rw-r--r--intern/audaspace/FX/AUD_SumFactory.h9
-rw-r--r--intern/audaspace/FX/AUD_SumReader.cpp68
-rw-r--r--intern/audaspace/FX/AUD_SuperposeFactory.cpp49
-rw-r--r--intern/audaspace/FX/AUD_SuperposeFactory.h63
-rw-r--r--intern/audaspace/FX/AUD_SuperposeReader.cpp115
-rw-r--r--intern/audaspace/FX/AUD_SuperposeReader.h79
-rw-r--r--intern/audaspace/FX/AUD_VolumeFactory.cpp29
-rw-r--r--intern/audaspace/FX/AUD_VolumeFactory.h24
-rw-r--r--intern/audaspace/FX/AUD_VolumeReader.cpp69
-rw-r--r--intern/audaspace/Makefile21
-rw-r--r--intern/audaspace/OpenAL/AUD_OpenALDevice.cpp1069
-rw-r--r--intern/audaspace/OpenAL/AUD_OpenALDevice.h73
-rw-r--r--intern/audaspace/Python/AUD_PyAPI.cpp2973
-rw-r--r--intern/audaspace/Python/AUD_PyAPI.h67
-rw-r--r--intern/audaspace/Python/Makefile76
-rw-r--r--intern/audaspace/SConscript16
-rw-r--r--intern/audaspace/SDL/AUD_SDLDevice.cpp11
-rw-r--r--intern/audaspace/SDL/AUD_SDLDevice.h4
-rw-r--r--intern/audaspace/SRC/AUD_SRCResampleFactory.cpp24
-rw-r--r--intern/audaspace/SRC/AUD_SRCResampleFactory.h9
-rw-r--r--intern/audaspace/SRC/AUD_SRCResampleReader.cpp36
-rw-r--r--intern/audaspace/SRC/AUD_SRCResampleReader.h29
-rw-r--r--intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp39
-rw-r--r--intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h19
-rw-r--r--intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp143
-rw-r--r--intern/audaspace/ffmpeg/AUD_FFMPEGReader.h26
-rw-r--r--intern/audaspace/fftw/AUD_BandPassReader.h1
-rw-r--r--intern/audaspace/intern/AUD_3DMath.h189
-rw-r--r--intern/audaspace/intern/AUD_Buffer.cpp21
-rw-r--r--intern/audaspace/intern/AUD_Buffer.h8
-rw-r--r--intern/audaspace/intern/AUD_BufferReader.cpp33
-rw-r--r--intern/audaspace/intern/AUD_BufferReader.h14
-rw-r--r--intern/audaspace/intern/AUD_C-API.cpp487
-rw-r--r--intern/audaspace/intern/AUD_C-API.h197
-rw-r--r--intern/audaspace/intern/AUD_ChannelMapperFactory.cpp35
-rw-r--r--intern/audaspace/intern/AUD_ChannelMapperFactory.h8
-rw-r--r--intern/audaspace/intern/AUD_ChannelMapperReader.cpp32
-rw-r--r--intern/audaspace/intern/AUD_ChannelMapperReader.h12
-rw-r--r--intern/audaspace/intern/AUD_ConverterFactory.cpp23
-rw-r--r--intern/audaspace/intern/AUD_ConverterFactory.h9
-rw-r--r--intern/audaspace/intern/AUD_ConverterReader.cpp18
-rw-r--r--intern/audaspace/intern/AUD_ConverterReader.h15
-rw-r--r--intern/audaspace/intern/AUD_DefaultMixer.cpp63
-rw-r--r--intern/audaspace/intern/AUD_DefaultMixer.h (renamed from intern/audaspace/FX/AUD_SumReader.h)41
-rw-r--r--intern/audaspace/intern/AUD_FileFactory.cpp60
-rw-r--r--intern/audaspace/intern/AUD_FileFactory.h19
-rw-r--r--intern/audaspace/intern/AUD_I3DDevice.h291
-rw-r--r--intern/audaspace/intern/AUD_IDevice.h111
-rw-r--r--intern/audaspace/intern/AUD_IFactory.h2
-rw-r--r--intern/audaspace/intern/AUD_IReader.h27
-rw-r--r--intern/audaspace/intern/AUD_LinearResampleFactory.cpp24
-rw-r--r--intern/audaspace/intern/AUD_LinearResampleFactory.h9
-rw-r--r--intern/audaspace/intern/AUD_LinearResampleReader.cpp45
-rw-r--r--intern/audaspace/intern/AUD_LinearResampleReader.h42
-rw-r--r--intern/audaspace/intern/AUD_Mixer.cpp74
-rw-r--r--intern/audaspace/intern/AUD_Mixer.h53
-rw-r--r--intern/audaspace/intern/AUD_MixerFactory.cpp73
-rw-r--r--intern/audaspace/intern/AUD_MixerFactory.h58
-rw-r--r--intern/audaspace/intern/AUD_NULLDevice.cpp50
-rw-r--r--intern/audaspace/intern/AUD_NULLDevice.h22
-rw-r--r--intern/audaspace/intern/AUD_PyInit.h47
-rw-r--r--intern/audaspace/intern/AUD_ReadDevice.cpp10
-rw-r--r--intern/audaspace/intern/AUD_ReadDevice.h10
-rw-r--r--intern/audaspace/intern/AUD_Reference.h22
-rw-r--r--intern/audaspace/intern/AUD_SequencerFactory.cpp32
-rw-r--r--intern/audaspace/intern/AUD_SequencerFactory.h8
-rw-r--r--intern/audaspace/intern/AUD_SequencerReader.cpp77
-rw-r--r--intern/audaspace/intern/AUD_SequencerReader.h26
-rw-r--r--intern/audaspace/intern/AUD_SilenceFactory.cpp (renamed from intern/audaspace/intern/AUD_SourceCaps.h)22
-rw-r--r--intern/audaspace/intern/AUD_SilenceFactory.h (renamed from intern/audaspace/FX/AUD_RectifyReader.h)33
-rw-r--r--intern/audaspace/intern/AUD_SilenceReader.cpp (renamed from intern/audaspace/FX/AUD_SquareReader.cpp)55
-rw-r--r--intern/audaspace/intern/AUD_SilenceReader.h (renamed from intern/audaspace/FX/AUD_LowpassReader.h)64
-rw-r--r--intern/audaspace/intern/AUD_SinusFactory.cpp19
-rw-r--r--intern/audaspace/intern/AUD_SinusFactory.h20
-rw-r--r--intern/audaspace/intern/AUD_SinusReader.cpp41
-rw-r--r--intern/audaspace/intern/AUD_SinusReader.h29
-rw-r--r--intern/audaspace/intern/AUD_SoftwareDevice.cpp302
-rw-r--r--intern/audaspace/intern/AUD_SoftwareDevice.h21
-rw-r--r--intern/audaspace/intern/AUD_Space.h164
-rw-r--r--intern/audaspace/intern/AUD_StreamBufferFactory.cpp19
-rw-r--r--intern/audaspace/intern/AUD_StreamBufferFactory.h6
-rw-r--r--intern/audaspace/intern/Makefile3
-rw-r--r--intern/audaspace/jack/AUD_JackDevice.cpp55
-rw-r--r--intern/audaspace/jack/AUD_JackDevice.h22
-rw-r--r--intern/audaspace/make/msvc_9_0/audaspace.vcproj130
-rw-r--r--intern/audaspace/sndfile/AUD_SndFileFactory.cpp34
-rw-r--r--intern/audaspace/sndfile/AUD_SndFileFactory.h19
-rw-r--r--intern/audaspace/sndfile/AUD_SndFileReader.cpp53
-rw-r--r--intern/audaspace/sndfile/AUD_SndFileReader.h21
-rw-r--r--intern/boolop/CMakeLists.txt2
-rw-r--r--intern/boolop/SConscript4
-rw-r--r--intern/bsp/CMakeLists.txt2
-rw-r--r--intern/bsp/SConscript2
-rw-r--r--intern/bsp/intern/BSP_MeshPrimitives.cpp4
-rw-r--r--intern/bsp/intern/CSG_BooleanOps.cpp4
-rw-r--r--intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.cpp4
-rw-r--r--intern/bsp/test/BSP_GhostTest/BSP_MeshDrawer.cpp4
-rw-r--r--intern/bsp/test/BSP_GhostTest/BSP_PlyLoader.cpp4
-rw-r--r--intern/bsp/test/BSP_GhostTest/main.cpp4
-rw-r--r--intern/bsp/test/BSP_GhostTest/plyfile.c4
-rw-r--r--intern/container/CMakeLists.txt2
-rw-r--r--intern/container/SConscript2
-rw-r--r--intern/container/intern/CTR_List.cpp4
-rw-r--r--intern/decimation/CMakeLists.txt2
-rw-r--r--intern/decimation/SConscript2
-rw-r--r--intern/decimation/intern/LOD_EdgeCollapser.cpp4
-rw-r--r--intern/decimation/intern/LOD_ExternNormalEditor.cpp4
-rw-r--r--intern/decimation/intern/LOD_FaceNormalEditor.cpp4
-rw-r--r--intern/decimation/intern/LOD_ManMesh2.cpp4
-rw-r--r--intern/decimation/intern/LOD_MeshPrimitives.cpp4
-rw-r--r--intern/decimation/intern/LOD_QSDecimator.cpp4
-rw-r--r--intern/decimation/intern/LOD_QuadricEditor.cpp4
-rw-r--r--intern/decimation/intern/LOD_decimation.cpp4
-rw-r--r--intern/elbeem/CMakeLists.txt2
-rw-r--r--intern/elbeem/SConscript2
-rw-r--r--intern/ghost/CMakeLists.txt98
-rw-r--r--intern/ghost/GHOST_C-api.h31
-rw-r--r--intern/ghost/GHOST_ISystem.h14
-rw-r--r--intern/ghost/GHOST_IWindow.h15
-rw-r--r--intern/ghost/GHOST_Path-api.h (renamed from source/blender/imbuf/intern/IMB_bitplanes.h)42
-rw-r--r--intern/ghost/SConscript7
-rw-r--r--intern/ghost/intern/GHOST_Buttons.cpp4
-rw-r--r--intern/ghost/intern/GHOST_C-api.cpp31
-rw-r--r--intern/ghost/intern/GHOST_CallbackEventConsumer.cpp4
-rw-r--r--intern/ghost/intern/GHOST_DisplayManager.cpp4
-rw-r--r--intern/ghost/intern/GHOST_DisplayManagerCarbon.cpp4
-rw-r--r--intern/ghost/intern/GHOST_DisplayManagerWin32.cpp4
-rw-r--r--intern/ghost/intern/GHOST_DisplayManagerX11.cpp4
-rw-r--r--intern/ghost/intern/GHOST_DropTargetWin32.cpp4
-rw-r--r--intern/ghost/intern/GHOST_EventDragnDrop.h2
-rw-r--r--intern/ghost/intern/GHOST_EventManager.cpp4
-rw-r--r--intern/ghost/intern/GHOST_EventPrinter.cpp4
-rw-r--r--intern/ghost/intern/GHOST_ISystem.cpp4
-rw-r--r--intern/ghost/intern/GHOST_ModifierKeys.cpp4
-rw-r--r--intern/ghost/intern/GHOST_Path-api.cpp (renamed from source/blender/imbuf/intern/IMB_amiga.h)35
-rw-r--r--intern/ghost/intern/GHOST_Rect.cpp4
-rw-r--r--intern/ghost/intern/GHOST_System.cpp4
-rw-r--r--intern/ghost/intern/GHOST_System.h7
-rw-r--r--intern/ghost/intern/GHOST_SystemCarbon.cpp22
-rw-r--r--intern/ghost/intern/GHOST_SystemCarbon.h9
-rw-r--r--intern/ghost/intern/GHOST_SystemCocoa.h22
-rw-r--r--intern/ghost/intern/GHOST_SystemCocoa.mm82
-rw-r--r--intern/ghost/intern/GHOST_SystemWin32.cpp42
-rw-r--r--intern/ghost/intern/GHOST_SystemWin32.h15
-rw-r--r--intern/ghost/intern/GHOST_SystemX11.cpp26
-rw-r--r--intern/ghost/intern/GHOST_SystemX11.h8
-rw-r--r--intern/ghost/intern/GHOST_TimerManager.cpp4
-rw-r--r--intern/ghost/intern/GHOST_Window.cpp6
-rw-r--r--intern/ghost/intern/GHOST_Window.h14
-rw-r--r--intern/ghost/intern/GHOST_WindowCarbon.cpp8
-rw-r--r--intern/ghost/intern/GHOST_WindowCocoa.h19
-rw-r--r--intern/ghost/intern/GHOST_WindowCocoa.mm69
-rw-r--r--intern/ghost/intern/GHOST_WindowManager.cpp4
-rw-r--r--intern/ghost/intern/GHOST_WindowWin32.cpp27
-rw-r--r--intern/ghost/intern/GHOST_WindowWin32.h3
-rw-r--r--intern/ghost/intern/GHOST_WindowX11.cpp13
-rw-r--r--intern/ghost/intern/GHOST_WindowX11.h1
-rw-r--r--intern/ghost/intern/Makefile2
-rw-r--r--intern/ghost/make/msvc_9_0/ghost.vcproj8
-rw-r--r--intern/ghost/test/gears/GHOST_C-Test.c4
-rw-r--r--intern/ghost/test/gears/GHOST_Test.cpp4
-rw-r--r--intern/ghost/test/multitest/Basic.c4
-rw-r--r--intern/ghost/test/multitest/EventToBuf.c4
-rw-r--r--intern/ghost/test/multitest/MultiTest.c4
-rw-r--r--intern/ghost/test/multitest/ScrollBar.c4
-rw-r--r--intern/ghost/test/multitest/Util.c4
-rw-r--r--intern/ghost/test/multitest/WindowData.c4
-rw-r--r--intern/guardedalloc/CMakeLists.txt4
-rw-r--r--intern/guardedalloc/MEM_guardedalloc.h18
-rw-r--r--intern/guardedalloc/SConscript2
-rw-r--r--intern/guardedalloc/intern/mallocn.c67
-rw-r--r--intern/guardedalloc/test/simpletest/memtest.c4
-rw-r--r--intern/iksolver/CMakeLists.txt2
-rw-r--r--intern/iksolver/SConscript2
-rw-r--r--intern/iksolver/intern/IK_QSegment.cpp23
-rw-r--r--intern/iksolver/intern/TNT/svd.h10
-rw-r--r--intern/iksolver/intern/TNT/vec.h2
-rw-r--r--intern/iksolver/test/ik_glut_test/common/GlutDrawer.cpp4
-rw-r--r--intern/iksolver/test/ik_glut_test/common/GlutKeyboardManager.cpp4
-rw-r--r--intern/iksolver/test/ik_glut_test/common/GlutMouseManager.cpp4
-rw-r--r--intern/iksolver/test/ik_glut_test/intern/main.cpp4
-rw-r--r--intern/itasc/CMakeLists.txt2
-rw-r--r--intern/itasc/MovingFrame.cpp2
-rw-r--r--intern/itasc/SConscript2
-rw-r--r--intern/memutil/CMakeLists.txt2
-rw-r--r--intern/memutil/SConscript2
-rw-r--r--intern/memutil/intern/MEM_CacheLimiterC-Api.cpp4
-rw-r--r--intern/memutil/intern/MEM_RefCountedC-Api.cpp4
-rw-r--r--intern/moto/CMakeLists.txt2
-rw-r--r--intern/moto/SConscript2
-rw-r--r--intern/moto/intern/MT_CmMatrix4x4.cpp4
-rw-r--r--intern/moto/intern/MT_Matrix3x3.cpp4
-rw-r--r--intern/moto/intern/MT_Matrix4x4.cpp4
-rw-r--r--intern/moto/intern/MT_Plane3.cpp4
-rw-r--r--intern/moto/intern/MT_Point3.cpp4
-rw-r--r--intern/moto/intern/MT_Quaternion.cpp4
-rw-r--r--intern/moto/intern/MT_Transform.cpp4
-rw-r--r--intern/moto/intern/MT_Vector2.cpp4
-rw-r--r--intern/moto/intern/MT_Vector3.cpp4
-rw-r--r--intern/moto/intern/MT_Vector4.cpp4
-rw-r--r--intern/moto/intern/MT_random.cpp4
-rw-r--r--intern/opennl/CMakeLists.txt2
-rw-r--r--intern/opennl/SConscript4
-rw-r--r--intern/smoke/CMakeLists.txt2
-rw-r--r--intern/smoke/SConscript2
-rw-r--r--intern/smoke/extern/smoke_API.h6
-rw-r--r--intern/smoke/intern/FLUID_3D.cpp197
-rw-r--r--intern/smoke/intern/FLUID_3D.h24
-rw-r--r--intern/smoke/intern/WTURBULENCE.cpp17
-rw-r--r--intern/smoke/intern/smoke_API.cpp44
-rw-r--r--intern/string/CMakeLists.txt2
-rw-r--r--intern/string/SConscript2
-rw-r--r--intern/string/STR_String.h4
-rw-r--r--intern/string/intern/STR_String.cpp8
-rw-r--r--po/Makefile2
-rw-r--r--projectfiles_vc9/blender/BPY_python/BPY_python.vcproj56
-rw-r--r--projectfiles_vc9/blender/blender.sln23
-rw-r--r--projectfiles_vc9/blender/blender.vcproj12
-rw-r--r--projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj44
-rw-r--r--projectfiles_vc9/blender/blenlib/BLI_blenlib.vcproj12
-rw-r--r--projectfiles_vc9/blender/editors/ED_editors.vcproj126
-rw-r--r--projectfiles_vc9/blender/gpu/BL_gpu.vcproj14
-rw-r--r--projectfiles_vc9/blender/imbuf/BL_imbuf.vcproj144
-rw-r--r--projectfiles_vc9/blender/makesrna/RNA_makesrna.vcproj28
-rw-r--r--projectfiles_vc9/blender/makesrna/RNA_rna.vcproj4
-rw-r--r--projectfiles_vc9/blender/modifiers/modifiers.vcproj491
-rw-r--r--projectfiles_vc9/gameengine/gamelogic/SCA_GameLogic.vcproj16
-rw-r--r--release/Makefile6
-rw-r--r--release/VERSION2
-rw-r--r--release/bin/.blender/.Blanguages (renamed from bin/.blender/.Blanguages)0
-rw-r--r--release/bin/.blender/.bfont.ttf (renamed from bin/.blender/.bfont.ttf)bin65932 -> 65932 bytes
-rwxr-xr-xrelease/bin/blender-thumbnailer.py131
-rw-r--r--release/datafiles/blenderbuttonsbin210034 -> 209697 bytes
-rw-r--r--release/datafiles/brushicons/add.pngbin0 -> 10948 bytes
-rw-r--r--release/datafiles/brushicons/blob.pngbin0 -> 10703 bytes
-rw-r--r--release/datafiles/brushicons/blur.pngbin0 -> 9327 bytes
-rw-r--r--release/datafiles/brushicons/clay.pngbin0 -> 11181 bytes
-rw-r--r--release/datafiles/brushicons/clone.pngbin0 -> 10774 bytes
-rw-r--r--release/datafiles/brushicons/crease.pngbin0 -> 8638 bytes
-rw-r--r--release/datafiles/brushicons/darken.pngbin0 -> 9653 bytes
-rw-r--r--release/datafiles/brushicons/draw.pngbin0 -> 11349 bytes
-rw-r--r--release/datafiles/brushicons/fill.pngbin0 -> 16892 bytes
-rw-r--r--release/datafiles/brushicons/flatten.pngbin0 -> 9114 bytes
-rw-r--r--release/datafiles/brushicons/grab.pngbin0 -> 8045 bytes
-rw-r--r--release/datafiles/brushicons/inflate.pngbin0 -> 8840 bytes
-rw-r--r--release/datafiles/brushicons/layer.pngbin0 -> 11004 bytes
-rw-r--r--release/datafiles/brushicons/lighten.pngbin0 -> 9437 bytes
-rw-r--r--release/datafiles/brushicons/mix.pngbin0 -> 10448 bytes
-rw-r--r--release/datafiles/brushicons/multiply.pngbin0 -> 10039 bytes
-rw-r--r--release/datafiles/brushicons/nudge.pngbin0 -> 18012 bytes
-rw-r--r--release/datafiles/brushicons/pinch.pngbin0 -> 9880 bytes
-rw-r--r--release/datafiles/brushicons/scrape.pngbin0 -> 13055 bytes
-rw-r--r--release/datafiles/brushicons/smear.pngbin0 -> 9358 bytes
-rw-r--r--release/datafiles/brushicons/smooth.pngbin0 -> 16428 bytes
-rw-r--r--release/datafiles/brushicons/snake_hook.pngbin0 -> 9710 bytes
-rw-r--r--release/datafiles/brushicons/soften.pngbin0 -> 9219 bytes
-rw-r--r--release/datafiles/brushicons/subtract.pngbin0 -> 10173 bytes
-rw-r--r--release/datafiles/brushicons/texdraw.pngbin0 -> 9462 bytes
-rw-r--r--release/datafiles/brushicons/thumb.pngbin0 -> 9098 bytes
-rw-r--r--release/datafiles/brushicons/twist.pngbin0 -> 10889 bytes
-rw-r--r--release/datafiles/brushicons/vertexdraw.pngbin0 -> 10253 bytes
-rw-r--r--release/datafiles/splash.pngbin211350 -> 185087 bytes
-rw-r--r--release/freedesktop/blender.desktop2
-rw-r--r--release/plugins/Makefile2
-rw-r--r--release/plugins/bmake2
-rw-r--r--release/plugins/sequence/Makefile2
-rw-r--r--release/plugins/texture/Makefile2
-rw-r--r--release/scripts/io/engine_render_pov.py964
-rw-r--r--release/scripts/io/export_3ds.py79
-rw-r--r--release/scripts/io/export_fbx.py281
-rw-r--r--release/scripts/io/export_mdd.py54
-rw-r--r--release/scripts/io/export_obj.py554
-rw-r--r--release/scripts/io/export_ply.py44
-rw-r--r--release/scripts/io/export_x3d.py195
-rw-r--r--release/scripts/io/import_anim_bvh.py56
-rw-r--r--release/scripts/io/import_scene_3ds.py289
-rw-r--r--release/scripts/io/import_scene_obj.py364
-rw-r--r--release/scripts/io/import_shape_mdd.py19
-rw-r--r--release/scripts/io/netrender/__init__.py41
-rw-r--r--release/scripts/io/netrender/client.py37
-rw-r--r--release/scripts/io/netrender/master.py93
-rw-r--r--release/scripts/io/netrender/master_html.py112
-rw-r--r--release/scripts/io/netrender/model.py14
-rw-r--r--release/scripts/io/netrender/netrender.css4
-rw-r--r--release/scripts/io/netrender/operators.py123
-rw-r--r--release/scripts/io/netrender/repath.py150
-rw-r--r--release/scripts/io/netrender/slave.py99
-rw-r--r--release/scripts/io/netrender/ui.py368
-rw-r--r--release/scripts/io/netrender/utils.py46
-rw-r--r--release/scripts/keyingsets/keyingsets_utils.py22
-rw-r--r--release/scripts/modules/add_object_utils.py83
-rw-r--r--release/scripts/modules/animsys_refactor.py201
-rwxr-xr-xrelease/scripts/modules/blend_render_info.py100
-rw-r--r--release/scripts/modules/bpy/__init__.py12
-rw-r--r--release/scripts/modules/bpy/path.py174
-rw-r--r--release/scripts/modules/bpy/utils.py217
-rw-r--r--release/scripts/modules/bpy_types.py298
-rw-r--r--release/scripts/modules/bpyml.py204
-rw-r--r--release/scripts/modules/bpyml_ui.py100
-rw-r--r--release/scripts/modules/console/complete_calltip.py2
-rw-r--r--release/scripts/modules/console/complete_import.py6
-rw-r--r--release/scripts/modules/graphviz_export.py35
-rw-r--r--release/scripts/modules/rigify/__init__.py60
-rw-r--r--release/scripts/modules/rigify/arm_biped.py72
-rw-r--r--release/scripts/modules/rigify/copy.py4
-rw-r--r--release/scripts/modules/rigify/delta.py8
-rw-r--r--release/scripts/modules/rigify/eye_balls.py161
-rw-r--r--release/scripts/modules/rigify/eye_lid.py119
-rw-r--r--release/scripts/modules/rigify/finger_curl.py162
-rw-r--r--release/scripts/modules/rigify/leg_biped.py80
-rw-r--r--release/scripts/modules/rigify/leg_quadruped.py62
-rw-r--r--release/scripts/modules/rigify/mouth.py94
-rw-r--r--release/scripts/modules/rigify/neck.py344
-rw-r--r--release/scripts/modules/rigify/neck_flex.py52
-rw-r--r--release/scripts/modules/rigify/palm_curl.py24
-rw-r--r--release/scripts/modules/rigify/shape_key_control.py4
-rw-r--r--release/scripts/modules/rigify/shape_key_distance.py4
-rw-r--r--release/scripts/modules/rigify/shape_key_rotdiff.py4
-rw-r--r--release/scripts/modules/rigify/spine_pivot_flex.py72
-rw-r--r--release/scripts/modules/rigify/stretch.py6
-rw-r--r--release/scripts/modules/rigify/stretch_twist.py12
-rw-r--r--release/scripts/modules/rigify/tail_control.py16
-rw-r--r--release/scripts/modules/rigify/tongue.py361
-rw-r--r--release/scripts/modules/rigify/track_dual.py6
-rw-r--r--release/scripts/modules/rigify/track_reverse.py4
-rw-r--r--release/scripts/modules/rigify_utils.py22
-rw-r--r--release/scripts/modules/rna_info.py212
-rw-r--r--release/scripts/modules/rna_prop_ui.py139
-rw-r--r--release/scripts/op/add_armature_human.py154
-rw-r--r--release/scripts/op/add_mesh_torus.py54
-rw-r--r--release/scripts/op/animsys_update.py699
-rw-r--r--release/scripts/op/console_python.py157
-rw-r--r--release/scripts/op/console_shell.py2
-rw-r--r--release/scripts/op/fcurve_euler_filter.py17
-rw-r--r--release/scripts/op/image.py77
-rw-r--r--release/scripts/op/mesh.py40
-rw-r--r--release/scripts/op/nla.py39
-rw-r--r--release/scripts/op/object.py168
-rw-r--r--release/scripts/op/object_align.py45
-rw-r--r--release/scripts/op/object_randomize_transform.py6
-rw-r--r--release/scripts/op/presets.py120
-rw-r--r--release/scripts/op/screen_play_rendered_anim.py8
-rw-r--r--release/scripts/op/sequencer.py72
-rw-r--r--release/scripts/op/uv.py46
-rw-r--r--release/scripts/op/uvcalc_follow_active.py37
-rw-r--r--release/scripts/op/uvcalc_smart_project.py62
-rw-r--r--release/scripts/op/vertexpaint_dirt.py39
-rw-r--r--release/scripts/op/wm.py325
-rw-r--r--release/scripts/presets/cloth/cotton.py1
-rw-r--r--release/scripts/presets/cloth/denim.py1
-rw-r--r--release/scripts/presets/cloth/leather.py1
-rw-r--r--release/scripts/presets/cloth/rubber.py1
-rw-r--r--release/scripts/presets/cloth/silk.py1
-rw-r--r--release/scripts/presets/ffmpeg/DV.py1
-rw-r--r--release/scripts/presets/ffmpeg/DVD.py3
-rw-r--r--release/scripts/presets/ffmpeg/SVCD.py3
-rw-r--r--release/scripts/presets/ffmpeg/VCD.py3
-rw-r--r--release/scripts/presets/ffmpeg/h264.py3
-rw-r--r--release/scripts/presets/ffmpeg/theora.py3
-rw-r--r--release/scripts/presets/ffmpeg/xvid.py3
-rw-r--r--release/scripts/presets/interaction/blender.py16
-rw-r--r--release/scripts/presets/interaction/maya.py386
-rw-r--r--release/scripts/presets/render/DVCPRO_HD_1080p.py1
-rw-r--r--release/scripts/presets/render/DVCPRO_HD_720p.py1
-rw-r--r--release/scripts/presets/render/HDTV_1080p.py1
-rw-r--r--release/scripts/presets/render/HDTV_720p.py1
-rw-r--r--release/scripts/presets/render/HDV_1080p.py1
-rw-r--r--release/scripts/presets/render/TV_NTSC_16_colon_9.py1
-rw-r--r--release/scripts/presets/render/TV_NTSC_4_colon_3.py1
-rw-r--r--release/scripts/presets/render/TV_PAL_16_colon_9.py1
-rw-r--r--release/scripts/presets/render/TV_PAL_4_colon_3.py1
-rw-r--r--release/scripts/presets/sss/apple.py1
-rw-r--r--release/scripts/presets/sss/chicken.py1
-rw-r--r--release/scripts/presets/sss/cream.py1
-rw-r--r--release/scripts/presets/sss/ketchup.py1
-rw-r--r--release/scripts/presets/sss/marble.py1
-rw-r--r--release/scripts/presets/sss/potato.py1
-rw-r--r--release/scripts/presets/sss/skim_milk.py1
-rw-r--r--release/scripts/presets/sss/skin1.py1
-rw-r--r--release/scripts/presets/sss/skin2.py1
-rw-r--r--release/scripts/presets/sss/whole_milk.py1
-rw-r--r--release/scripts/presets/sunsky/classic.py1
-rw-r--r--release/scripts/presets/sunsky/desert.py1
-rw-r--r--release/scripts/presets/sunsky/mountain.py1
-rw-r--r--release/scripts/templates/gamelogic.py4
-rw-r--r--release/scripts/templates/operator.py17
-rw-r--r--release/scripts/templates/operator_modal.py3
-rw-r--r--release/scripts/templates/operator_modal_draw.py21
-rw-r--r--release/scripts/templates/operator_modal_view3d.py53
-rw-r--r--release/scripts/templates/operator_simple.py5
-rw-r--r--release/scripts/templates/operator_uv.py20
-rw-r--r--release/scripts/templates/panel_simple.py2
-rw-r--r--release/scripts/ui/properties_animviz.py149
-rw-r--r--release/scripts/ui/properties_data_armature.py222
-rw-r--r--release/scripts/ui/properties_data_armature_rigify.py69
-rw-r--r--release/scripts/ui/properties_data_bone.py300
-rw-r--r--release/scripts/ui/properties_data_camera.py89
-rw-r--r--release/scripts/ui/properties_data_curve.py223
-rw-r--r--release/scripts/ui/properties_data_empty.py26
-rw-r--r--release/scripts/ui/properties_data_lamp.py284
-rw-r--r--release/scripts/ui/properties_data_lattice.py72
-rw-r--r--release/scripts/ui/properties_data_mesh.py200
-rw-r--r--release/scripts/ui/properties_data_metaball.py90
-rw-r--r--release/scripts/ui/properties_data_modifier.py494
-rw-r--r--release/scripts/ui/properties_game.py327
-rw-r--r--release/scripts/ui/properties_material.py915
-rw-r--r--release/scripts/ui/properties_object.py228
-rw-r--r--release/scripts/ui/properties_object_constraint.py514
-rw-r--r--release/scripts/ui/properties_particle.py498
-rw-r--r--release/scripts/ui/properties_physics_cloth.py117
-rw-r--r--release/scripts/ui/properties_physics_common.py136
-rw-r--r--release/scripts/ui/properties_physics_field.py105
-rw-r--r--release/scripts/ui/properties_physics_fluid.py146
-rw-r--r--release/scripts/ui/properties_physics_smoke.py186
-rw-r--r--release/scripts/ui/properties_physics_softbody.py152
-rw-r--r--release/scripts/ui/properties_render.py422
-rw-r--r--release/scripts/ui/properties_scene.py157
-rw-r--r--release/scripts/ui/properties_texture.py640
-rw-r--r--release/scripts/ui/properties_world.py257
-rw-r--r--release/scripts/ui/space_buttons.py72
-rw-r--r--release/scripts/ui/space_console.py28
-rw-r--r--release/scripts/ui/space_dopesheet.py77
-rw-r--r--release/scripts/ui/space_filebrowser.py38
-rw-r--r--release/scripts/ui/space_graph.py35
-rw-r--r--release/scripts/ui/space_image.py304
-rw-r--r--release/scripts/ui/space_info.py203
-rw-r--r--release/scripts/ui/space_logic.py60
-rw-r--r--release/scripts/ui/space_nla.py29
-rw-r--r--release/scripts/ui/space_node.py40
-rw-r--r--release/scripts/ui/space_outliner.py37
-rw-r--r--release/scripts/ui/space_sequencer.py457
-rw-r--r--release/scripts/ui/space_text.py115
-rw-r--r--release/scripts/ui/space_time.py88
-rw-r--r--release/scripts/ui/space_userpref.py1733
-rw-r--r--release/scripts/ui/space_userpref_keymap.py800
-rw-r--r--release/scripts/ui/space_view3d.py529
-rw-r--r--release/scripts/ui/space_view3d_toolbar.py716
-rw-r--r--release/text/copyright.txt33
-rw-r--r--release/text/readme.html10
-rw-r--r--release/windows/inno/blender.iss92
-rw-r--r--release/windows/inno/copyright.txt56
-rw-r--r--release/windows/installer/00.checked.bmpbin0 -> 2610 bytes
-rw-r--r--release/windows/installer/00.header.bmp (renamed from release/windows/inno/header.bmp)bin25818 -> 25818 bytes
-rw-r--r--release/windows/installer/00.installer.ico (renamed from release/windows/inno/installer.ico)bin25214 -> 25214 bytes
-rw-r--r--release/windows/installer/00.sconsblender.nsi225
-rw-r--r--release/windows/installer/01.installer.bmp (renamed from release/windows/inno/installer.bmp)bin154542 -> 154542 bytes
-rw-r--r--source/Makefile35
-rw-r--r--source/blender/CMakeLists.txt14
-rw-r--r--source/blender/Makefile4
-rw-r--r--source/blender/SConscript5
-rw-r--r--source/blender/avi/AVI_avi.h2
-rw-r--r--source/blender/avi/CMakeLists.txt1
-rw-r--r--source/blender/avi/Makefile2
-rw-r--r--source/blender/avi/intern/Makefile2
-rw-r--r--source/blender/avi/intern/avi.c2
-rw-r--r--source/blender/avi/intern/avi_intern.h2
-rw-r--r--source/blender/avi/intern/avirgb.c4
-rw-r--r--source/blender/avi/intern/codecs.c4
-rw-r--r--source/blender/avi/intern/endian.c4
-rw-r--r--source/blender/avi/intern/mjpeg.c4
-rw-r--r--source/blender/avi/intern/options.c4
-rw-r--r--source/blender/avi/intern/rgb32.c4
-rw-r--r--source/blender/blenfont/BLF_api.h60
-rw-r--r--source/blender/blenfont/BLF_types.h0
-rw-r--r--source/blender/blenfont/Makefile2
-rw-r--r--source/blender/blenfont/intern/Makefile3
-rw-r--r--source/blender/blenfont/intern/blf.c269
-rw-r--r--source/blender/blenfont/intern/blf_font.c2
-rw-r--r--source/blender/blenfont/intern/blf_lang.c59
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h2
-rw-r--r--source/blender/blenkernel/BKE_anim.h8
-rw-r--r--source/blender/blenkernel/BKE_armature.h3
-rw-r--r--source/blender/blenkernel/BKE_blender.h6
-rw-r--r--source/blender/blenkernel/BKE_bmesh.h2
-rw-r--r--source/blender/blenkernel/BKE_brush.h28
-rw-r--r--source/blender/blenkernel/BKE_cloth.h54
-rw-r--r--source/blender/blenkernel/BKE_collision.h18
-rw-r--r--source/blender/blenkernel/BKE_colortools.h10
-rw-r--r--source/blender/blenkernel/BKE_constraint.h6
-rw-r--r--source/blender/blenkernel/BKE_context.h11
-rw-r--r--source/blender/blenkernel/BKE_curve.h14
-rw-r--r--source/blender/blenkernel/BKE_customdata.h6
-rw-r--r--source/blender/blenkernel/BKE_deform.h2
-rw-r--r--source/blender/blenkernel/BKE_depsgraph.h12
-rw-r--r--source/blender/blenkernel/BKE_displist.h5
-rw-r--r--source/blender/blenkernel/BKE_effect.h1
-rw-r--r--source/blender/blenkernel/BKE_fcurve.h5
-rw-r--r--source/blender/blenkernel/BKE_fluidsim.h15
-rw-r--r--source/blender/blenkernel/BKE_global.h3
-rw-r--r--source/blender/blenkernel/BKE_group.h1
-rw-r--r--source/blender/blenkernel/BKE_idcode.h (renamed from source/blender/imbuf/intern/IMB_png.h)53
-rw-r--r--source/blender/blenkernel/BKE_idprop.h3
-rw-r--r--source/blender/blenkernel/BKE_image.h5
-rw-r--r--source/blender/blenkernel/BKE_key.h3
-rw-r--r--source/blender/blenkernel/BKE_lattice.h2
-rw-r--r--source/blender/blenkernel/BKE_library.h6
-rw-r--r--source/blender/blenkernel/BKE_main.h1
-rw-r--r--source/blender/blenkernel/BKE_material.h5
-rw-r--r--source/blender/blenkernel/BKE_mball.h6
-rw-r--r--source/blender/blenkernel/BKE_mesh.h5
-rw-r--r--source/blender/blenkernel/BKE_modifier.h4
-rw-r--r--source/blender/blenkernel/BKE_multires.h14
-rw-r--r--source/blender/blenkernel/BKE_node.h24
-rw-r--r--source/blender/blenkernel/BKE_object.h3
-rw-r--r--source/blender/blenkernel/BKE_paint.h12
-rw-r--r--source/blender/blenkernel/BKE_pointcache.h21
-rw-r--r--source/blender/blenkernel/BKE_report.h2
-rw-r--r--source/blender/blenkernel/BKE_sca.h7
-rw-r--r--source/blender/blenkernel/BKE_scene.h24
-rw-r--r--source/blender/blenkernel/BKE_screen.h6
-rw-r--r--source/blender/blenkernel/BKE_sequencer.h98
-rw-r--r--source/blender/blenkernel/BKE_shrinkwrap.h2
-rw-r--r--source/blender/blenkernel/BKE_smoke.h1
-rw-r--r--source/blender/blenkernel/BKE_softbody.h6
-rw-r--r--source/blender/blenkernel/BKE_sound.h4
-rw-r--r--source/blender/blenkernel/BKE_subsurf.h5
-rw-r--r--source/blender/blenkernel/BKE_text.h2
-rw-r--r--source/blender/blenkernel/BKE_texture.h4
-rw-r--r--source/blender/blenkernel/BKE_utildefines.h9
-rw-r--r--source/blender/blenkernel/CMakeLists.txt36
-rw-r--r--source/blender/blenkernel/Makefile2
-rw-r--r--source/blender/blenkernel/SConscript12
-rw-r--r--source/blender/blenkernel/intern/BME_Customdata.c2
-rw-r--r--source/blender/blenkernel/intern/BME_conversions.c11
-rw-r--r--source/blender/blenkernel/intern/BME_tools.c4
-rw-r--r--source/blender/blenkernel/intern/CCGSubSurf.c12
-rw-r--r--source/blender/blenkernel/intern/CCGSubSurf.h4
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c87
-rw-r--r--source/blender/blenkernel/intern/Makefile22
-rw-r--r--source/blender/blenkernel/intern/action.c33
-rw-r--r--source/blender/blenkernel/intern/anim.c172
-rw-r--r--source/blender/blenkernel/intern/anim_sys.c40
-rw-r--r--source/blender/blenkernel/intern/armature.c248
-rw-r--r--source/blender/blenkernel/intern/blender.c57
-rw-r--r--source/blender/blenkernel/intern/bmfont.c6
-rw-r--r--source/blender/blenkernel/intern/boids.c55
-rw-r--r--source/blender/blenkernel/intern/booleanops_mesh.c1
-rw-r--r--source/blender/blenkernel/intern/brush.c688
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c106
-rw-r--r--source/blender/blenkernel/intern/cloth.c16
-rw-r--r--source/blender/blenkernel/intern/collision.c61
-rw-r--r--source/blender/blenkernel/intern/colortools.c386
-rw-r--r--source/blender/blenkernel/intern/constraint.c496
-rw-r--r--source/blender/blenkernel/intern/context.c27
-rw-r--r--source/blender/blenkernel/intern/curve.c283
-rw-r--r--source/blender/blenkernel/intern/customdata.c53
-rw-r--r--source/blender/blenkernel/intern/deform.c16
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c196
-rw-r--r--source/blender/blenkernel/intern/displist.c219
-rw-r--r--source/blender/blenkernel/intern/effect.c39
-rw-r--r--source/blender/blenkernel/intern/exotic.c2
-rw-r--r--source/blender/blenkernel/intern/fcurve.c27
-rw-r--r--source/blender/blenkernel/intern/fluidsim.c580
-rw-r--r--source/blender/blenkernel/intern/fmodifier.c17
-rw-r--r--source/blender/blenkernel/intern/font.c159
-rw-r--r--source/blender/blenkernel/intern/group.c27
-rw-r--r--source/blender/blenkernel/intern/icons.c18
-rw-r--r--source/blender/blenkernel/intern/idcode.c128
-rw-r--r--source/blender/blenkernel/intern/idprop.c95
-rw-r--r--source/blender/blenkernel/intern/image.c376
-rw-r--r--source/blender/blenkernel/intern/image_gen.c56
-rw-r--r--source/blender/blenkernel/intern/implicit.c79
-rw-r--r--source/blender/blenkernel/intern/ipo.c194
-rw-r--r--source/blender/blenkernel/intern/key.c377
-rw-r--r--source/blender/blenkernel/intern/lattice.c267
-rw-r--r--source/blender/blenkernel/intern/library.c135
-rw-r--r--source/blender/blenkernel/intern/material.c37
-rw-r--r--source/blender/blenkernel/intern/mball.c111
-rw-r--r--source/blender/blenkernel/intern/mesh.c125
-rw-r--r--source/blender/blenkernel/intern/modifier.c9864
-rw-r--r--source/blender/blenkernel/intern/multires.c164
-rw-r--r--source/blender/blenkernel/intern/nla.c10
-rw-r--r--source/blender/blenkernel/intern/node.c47
-rw-r--r--source/blender/blenkernel/intern/object.c351
-rw-r--r--source/blender/blenkernel/intern/packedFile.c16
-rw-r--r--source/blender/blenkernel/intern/paint.c101
-rw-r--r--source/blender/blenkernel/intern/particle.c327
-rw-r--r--source/blender/blenkernel/intern/particle_system.c76
-rw-r--r--source/blender/blenkernel/intern/pointcache.c209
-rw-r--r--source/blender/blenkernel/intern/property.c14
-rw-r--r--source/blender/blenkernel/intern/report.c19
-rw-r--r--source/blender/blenkernel/intern/sca.c250
-rw-r--r--source/blender/blenkernel/intern/scene.c224
-rw-r--r--source/blender/blenkernel/intern/screen.c89
-rw-r--r--source/blender/blenkernel/intern/seqcache.c267
-rw-r--r--source/blender/blenkernel/intern/seqeffects.c395
-rw-r--r--source/blender/blenkernel/intern/sequencer.c2259
-rw-r--r--source/blender/blenkernel/intern/shrinkwrap.c12
-rw-r--r--source/blender/blenkernel/intern/sketch.c9
-rw-r--r--source/blender/blenkernel/intern/smoke.c263
-rw-r--r--source/blender/blenkernel/intern/softbody.c1024
-rw-r--r--source/blender/blenkernel/intern/sound.c41
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c60
-rw-r--r--source/blender/blenkernel/intern/text.c41
-rw-r--r--source/blender/blenkernel/intern/texture.c142
-rw-r--r--source/blender/blenkernel/intern/world.c31
-rw-r--r--source/blender/blenkernel/intern/writeavi.c5
-rw-r--r--source/blender/blenkernel/intern/writeffmpeg.c16
-rw-r--r--source/blender/blenkernel/intern/writeframeserver.c5
-rw-r--r--source/blender/blenlib/BLI_args.h12
-rw-r--r--source/blender/blenlib/BLI_bfile.h37
-rw-r--r--source/blender/blenlib/BLI_bpath.h5
-rw-r--r--source/blender/blenlib/BLI_cpu.h (renamed from source/blender/imbuf/intern/IMB_divers.h)21
-rw-r--r--source/blender/blenlib/BLI_fileops.h1
-rw-r--r--source/blender/blenlib/BLI_fnmatch.h2
-rw-r--r--source/blender/blenlib/BLI_ghash.h9
-rw-r--r--source/blender/blenlib/BLI_kdopbvh.h7
-rw-r--r--source/blender/blenlib/BLI_linklist.h3
-rw-r--r--source/blender/blenlib/BLI_listbase.h1
-rw-r--r--source/blender/blenlib/BLI_math.h2
-rw-r--r--source/blender/blenlib/BLI_math_base.h3
-rw-r--r--source/blender/blenlib/BLI_math_color.h6
-rw-r--r--source/blender/blenlib/BLI_math_geom.h36
-rw-r--r--source/blender/blenlib/BLI_math_inline.h3
-rw-r--r--source/blender/blenlib/BLI_math_matrix.h6
-rw-r--r--source/blender/blenlib/BLI_math_rotation.h15
-rw-r--r--source/blender/blenlib/BLI_math_vector.h13
-rw-r--r--source/blender/blenlib/BLI_memarena.h2
-rw-r--r--source/blender/blenlib/BLI_path_util.h85
-rw-r--r--source/blender/blenlib/BLI_pbvh.h34
-rw-r--r--source/blender/blenlib/BLI_rand.h6
-rw-r--r--source/blender/blenlib/BLI_rect.h5
-rw-r--r--source/blender/blenlib/BLI_storage.h3
-rw-r--r--source/blender/blenlib/BLI_storage_types.h2
-rw-r--r--source/blender/blenlib/BLI_threads.h7
-rw-r--r--source/blender/blenlib/BLI_uvproject.h3
-rw-r--r--source/blender/blenlib/BLI_winstuff.h4
-rw-r--r--source/blender/blenlib/CMakeLists.txt4
-rw-r--r--source/blender/blenlib/Makefile2
-rw-r--r--source/blender/blenlib/intern/BLI_args.c102
-rw-r--r--source/blender/blenlib/intern/BLI_bfile.c359
-rw-r--r--source/blender/blenlib/intern/BLI_ghash.c10
-rw-r--r--source/blender/blenlib/intern/BLI_heap.c2
-rw-r--r--source/blender/blenlib/intern/BLI_linklist.c36
-rw-r--r--source/blender/blenlib/intern/BLI_memarena.c12
-rw-r--r--source/blender/blenlib/intern/Makefile2
-rw-r--r--source/blender/blenlib/intern/bpath.c25
-rw-r--r--source/blender/blenlib/intern/cpu.c (renamed from source/blender/imbuf/intern/IMB_dpxcineon.h)56
-rw-r--r--source/blender/blenlib/intern/dynlib.c4
-rw-r--r--source/blender/blenlib/intern/fileops.c43
-rw-r--r--source/blender/blenlib/intern/fnmatch.c4
-rw-r--r--source/blender/blenlib/intern/graph.c6
-rw-r--r--source/blender/blenlib/intern/gsqueue.c4
-rw-r--r--source/blender/blenlib/intern/listbase.c21
-rw-r--r--source/blender/blenlib/intern/math_color.c45
-rw-r--r--source/blender/blenlib/intern/math_geom.c586
-rw-r--r--source/blender/blenlib/intern/math_geom_inline.c138
-rw-r--r--source/blender/blenlib/intern/math_matrix.c525
-rw-r--r--source/blender/blenlib/intern/math_rotation.c64
-rw-r--r--source/blender/blenlib/intern/math_vector.c20
-rw-r--r--source/blender/blenlib/intern/math_vector_inline.c35
-rw-r--r--source/blender/blenlib/intern/noise.c15
-rw-r--r--source/blender/blenlib/intern/path_util.c493
-rw-r--r--source/blender/blenlib/intern/pbvh.c417
-rw-r--r--source/blender/blenlib/intern/rand.c4
-rw-r--r--source/blender/blenlib/intern/rct.c45
-rw-r--r--source/blender/blenlib/intern/scanfill.c6
-rw-r--r--source/blender/blenlib/intern/storage.c48
-rw-r--r--source/blender/blenlib/intern/threads.c51
-rw-r--r--source/blender/blenlib/intern/time.c4
-rw-r--r--source/blender/blenlib/intern/uvproject.c11
-rw-r--r--source/blender/blenlib/intern/voxel.c11
-rw-r--r--source/blender/blenlib/intern/winstuff.c5
-rw-r--r--source/blender/blenloader/BLO_readfile.h21
-rw-r--r--source/blender/blenloader/BLO_writefile.h4
-rw-r--r--source/blender/blenloader/Makefile2
-rw-r--r--source/blender/blenloader/intern/Makefile2
-rw-r--r--source/blender/blenloader/intern/readblenentry.c127
-rw-r--r--source/blender/blenloader/intern/readfile.c650
-rw-r--r--source/blender/blenloader/intern/undofile.c7
-rw-r--r--source/blender/blenloader/intern/writefile.c90
-rw-r--r--source/blender/blenpluginapi/CMakeLists.txt1
-rw-r--r--source/blender/blenpluginapi/Makefile2
-rw-r--r--source/blender/blenpluginapi/iff.h153
-rw-r--r--source/blender/blenpluginapi/intern/Makefile2
-rw-r--r--source/blender/blenpluginapi/intern/pluginapi.c65
-rw-r--r--source/blender/collada/CMakeLists.txt6
-rw-r--r--source/blender/collada/DocumentExporter.cpp22
-rw-r--r--source/blender/collada/DocumentImporter.cpp90
-rw-r--r--source/blender/collada/Makefile4
-rw-r--r--source/blender/collada/SConscript7
-rw-r--r--source/blender/editors/CMakeLists.txt112
-rw-r--r--source/blender/editors/Makefile2
-rw-r--r--source/blender/editors/animation/CMakeLists.txt34
-rw-r--r--source/blender/editors/animation/Makefile2
-rw-r--r--source/blender/editors/animation/anim_channels_defines.c47
-rw-r--r--source/blender/editors/animation/anim_channels_edit.c52
-rw-r--r--source/blender/editors/animation/anim_deps.c4
-rw-r--r--source/blender/editors/animation/anim_draw.c24
-rw-r--r--source/blender/editors/animation/anim_filter.c104
-rw-r--r--source/blender/editors/animation/anim_markers.c5
-rw-r--r--source/blender/editors/animation/anim_ops.c3
-rw-r--r--source/blender/editors/animation/drivers.c67
-rw-r--r--source/blender/editors/animation/fmodifier_ui.c46
-rw-r--r--source/blender/editors/animation/keyframes_draw.c15
-rw-r--r--source/blender/editors/animation/keyframes_edit.c1
-rw-r--r--source/blender/editors/animation/keyframes_general.c2
-rw-r--r--source/blender/editors/animation/keyframing.c74
-rw-r--r--source/blender/editors/animation/keyingsets.c52
-rw-r--r--source/blender/editors/armature/CMakeLists.txt39
-rw-r--r--source/blender/editors/armature/Makefile3
-rw-r--r--source/blender/editors/armature/SConscript1
-rw-r--r--source/blender/editors/armature/armature_intern.h3
-rw-r--r--source/blender/editors/armature/armature_ops.c28
-rw-r--r--source/blender/editors/armature/editarmature.c263
-rw-r--r--source/blender/editors/armature/editarmature_generate.c11
-rw-r--r--source/blender/editors/armature/editarmature_retarget.c13
-rw-r--r--source/blender/editors/armature/editarmature_sketch.c59
-rw-r--r--source/blender/editors/armature/meshlaplacian.c224
-rw-r--r--source/blender/editors/armature/meshlaplacian.h2
-rw-r--r--source/blender/editors/armature/poseSlide.c8
-rw-r--r--source/blender/editors/armature/poseUtils.c7
-rw-r--r--source/blender/editors/armature/poselib.c41
-rw-r--r--source/blender/editors/armature/poseobject.c239
-rw-r--r--source/blender/editors/armature/reeb.c23
-rw-r--r--source/blender/editors/curve/CMakeLists.txt34
-rw-r--r--source/blender/editors/curve/Makefile2
-rw-r--r--source/blender/editors/curve/curve_intern.h20
-rw-r--r--source/blender/editors/curve/curve_ops.c37
-rw-r--r--source/blender/editors/curve/editcurve.c1652
-rw-r--r--source/blender/editors/curve/editfont.c134
-rw-r--r--source/blender/editors/datafiles/B.blend.c12378
-rw-r--r--source/blender/editors/datafiles/Bfont.c4
-rw-r--r--source/blender/editors/datafiles/CMakeLists.txt26
-rw-r--r--source/blender/editors/datafiles/Makefile2
-rw-r--r--source/blender/editors/datafiles/SConscript2
-rw-r--r--source/blender/editors/datafiles/add.png.c349
-rw-r--r--source/blender/editors/datafiles/blenderbuttons.c13120
-rw-r--r--source/blender/editors/datafiles/blob.png.c341
-rw-r--r--source/blender/editors/datafiles/blur.png.c298
-rw-r--r--source/blender/editors/datafiles/clay.png.c356
-rw-r--r--source/blender/editors/datafiles/clone.png.c343
-rw-r--r--source/blender/editors/datafiles/crease.png.c276
-rw-r--r--source/blender/editors/datafiles/darken.png.c308
-rw-r--r--source/blender/editors/datafiles/draw.png.c361
-rw-r--r--source/blender/editors/datafiles/fill.png.c534
-rw-r--r--source/blender/editors/datafiles/flatten.png.c291
-rw-r--r--source/blender/editors/datafiles/grab.png.c258
-rw-r--r--source/blender/editors/datafiles/inflate.png.c283
-rw-r--r--source/blender/editors/datafiles/layer.png.c350
-rw-r--r--source/blender/editors/datafiles/lighten.png.c301
-rw-r--r--source/blender/editors/datafiles/mix.png.c333
-rw-r--r--source/blender/editors/datafiles/multiply.png.c320
-rw-r--r--source/blender/editors/datafiles/nudge.png.c569
-rw-r--r--source/blender/editors/datafiles/pinch.png.c315
-rw-r--r--source/blender/editors/datafiles/scrape.png.c414
-rw-r--r--source/blender/editors/datafiles/smear.png.c299
-rw-r--r--source/blender/editors/datafiles/smooth.png.c520
-rw-r--r--source/blender/editors/datafiles/snake_hook.png.c310
-rw-r--r--source/blender/editors/datafiles/soften.png.c295
-rw-r--r--source/blender/editors/datafiles/splash.png.c12394
-rw-r--r--source/blender/editors/datafiles/startup.blend.c11468
-rw-r--r--source/blender/editors/datafiles/subtract.png.c324
-rw-r--r--source/blender/editors/datafiles/texdraw.png.c302
-rw-r--r--source/blender/editors/datafiles/thumb.png.c291
-rw-r--r--source/blender/editors/datafiles/twist.png.c347
-rw-r--r--source/blender/editors/datafiles/vertexdraw.png.c327
-rw-r--r--source/blender/editors/gpencil/CMakeLists.txt35
-rw-r--r--source/blender/editors/gpencil/Makefile2
-rw-r--r--source/blender/editors/gpencil/drawgpencil.c54
-rw-r--r--source/blender/editors/gpencil/editaction_gpencil.c14
-rw-r--r--source/blender/editors/gpencil/gpencil_buttons.c31
-rw-r--r--source/blender/editors/gpencil/gpencil_edit.c77
-rw-r--r--source/blender/editors/gpencil/gpencil_paint.c57
-rw-r--r--source/blender/editors/include/ED_anim_api.h6
-rw-r--r--source/blender/editors/include/ED_armature.h5
-rw-r--r--source/blender/editors/include/ED_curve.h12
-rw-r--r--source/blender/editors/include/ED_datafiles.h92
-rw-r--r--source/blender/editors/include/ED_gpencil.h6
-rw-r--r--source/blender/editors/include/ED_keyframing.h2
-rw-r--r--source/blender/editors/include/ED_lattice.h33
-rw-r--r--source/blender/editors/include/ED_logic.h (renamed from source/blender/imbuf/intern/IMB_ham.h)23
-rw-r--r--source/blender/editors/include/ED_mesh.h13
-rw-r--r--source/blender/editors/include/ED_object.h47
-rw-r--r--source/blender/editors/include/ED_physics.h2
-rw-r--r--source/blender/editors/include/ED_render.h1
-rw-r--r--source/blender/editors/include/ED_screen.h5
-rw-r--r--source/blender/editors/include/ED_screen_types.h1
-rw-r--r--source/blender/editors/include/ED_sculpt.h2
-rw-r--r--source/blender/editors/include/ED_util.h1
-rw-r--r--source/blender/editors/include/ED_view3d.h15
-rw-r--r--source/blender/editors/include/UI_icons.h45
-rw-r--r--source/blender/editors/include/UI_interface.h22
-rw-r--r--source/blender/editors/include/UI_resources.h6
-rw-r--r--source/blender/editors/include/UI_view2d.h1
-rw-r--r--source/blender/editors/interface/CMakeLists.txt46
-rw-r--r--source/blender/editors/interface/Makefile2
-rw-r--r--source/blender/editors/interface/interface.c29
-rw-r--r--source/blender/editors/interface/interface_anim.c4
-rw-r--r--source/blender/editors/interface/interface_draw.c442
-rw-r--r--source/blender/editors/interface/interface_handlers.c364
-rw-r--r--source/blender/editors/interface/interface_icons.c155
-rw-r--r--source/blender/editors/interface/interface_intern.h14
-rw-r--r--source/blender/editors/interface/interface_layout.c85
-rw-r--r--source/blender/editors/interface/interface_ops.c3
-rw-r--r--source/blender/editors/interface/interface_panel.c80
-rw-r--r--source/blender/editors/interface/interface_regions.c75
-rw-r--r--source/blender/editors/interface/interface_style.c86
-rw-r--r--source/blender/editors/interface/interface_templates.c738
-rw-r--r--source/blender/editors/interface/interface_widgets.c262
-rw-r--r--source/blender/editors/interface/resources.c110
-rw-r--r--source/blender/editors/interface/view2d.c25
-rw-r--r--source/blender/editors/interface/view2d_ops.c157
-rw-r--r--source/blender/editors/mesh/CMakeLists.txt40
-rw-r--r--source/blender/editors/mesh/Makefile2
-rw-r--r--source/blender/editors/mesh/editface.c11
-rw-r--r--source/blender/editors/mesh/editmesh.c62
-rw-r--r--source/blender/editors/mesh/editmesh_add.c65
-rw-r--r--source/blender/editors/mesh/editmesh_lib.c24
-rw-r--r--source/blender/editors/mesh/editmesh_loop.c14
-rw-r--r--source/blender/editors/mesh/editmesh_mods.c66
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c262
-rw-r--r--source/blender/editors/mesh/loopcut.c14
-rw-r--r--source/blender/editors/mesh/mesh_data.c112
-rw-r--r--source/blender/editors/mesh/mesh_intern.h1
-rw-r--r--source/blender/editors/mesh/mesh_ops.c11
-rw-r--r--source/blender/editors/mesh/meshtools.c177
-rw-r--r--source/blender/editors/metaball/CMakeLists.txt35
-rw-r--r--source/blender/editors/metaball/Makefile2
-rw-r--r--source/blender/editors/metaball/mball_edit.c66
-rw-r--r--source/blender/editors/object/CMakeLists.txt47
-rw-r--r--source/blender/editors/object/Makefile2
-rw-r--r--source/blender/editors/object/object_add.c443
-rw-r--r--source/blender/editors/object/object_bake.c27
-rw-r--r--source/blender/editors/object/object_constraint.c382
-rw-r--r--source/blender/editors/object/object_edit.c520
-rw-r--r--source/blender/editors/object/object_group.c105
-rw-r--r--source/blender/editors/object/object_hook.c40
-rw-r--r--source/blender/editors/object/object_intern.h32
-rw-r--r--source/blender/editors/object/object_lattice.c117
-rw-r--r--source/blender/editors/object/object_modifier.c442
-rw-r--r--source/blender/editors/object/object_ops.c72
-rw-r--r--source/blender/editors/object/object_relations.c216
-rw-r--r--source/blender/editors/object/object_select.c226
-rw-r--r--source/blender/editors/object/object_shapekey.c8
-rw-r--r--source/blender/editors/object/object_transform.c473
-rw-r--r--source/blender/editors/object/object_vgroup.c330
-rw-r--r--source/blender/editors/physics/CMakeLists.txt47
-rw-r--r--source/blender/editors/physics/Makefile2
-rw-r--r--source/blender/editors/physics/particle_boids.c7
-rw-r--r--source/blender/editors/physics/particle_edit.c149
-rw-r--r--source/blender/editors/physics/particle_object.c37
-rw-r--r--source/blender/editors/physics/physics_fluid.c156
-rw-r--r--source/blender/editors/physics/physics_intern.h4
-rw-r--r--source/blender/editors/physics/physics_ops.c6
-rw-r--r--source/blender/editors/physics/physics_pointcache.c42
-rw-r--r--source/blender/editors/render/CMakeLists.txt54
-rw-r--r--source/blender/editors/render/Makefile2
-rw-r--r--source/blender/editors/render/render_internal.c151
-rw-r--r--source/blender/editors/render/render_opengl.c138
-rw-r--r--source/blender/editors/render/render_preview.c104
-rw-r--r--source/blender/editors/render/render_shading.c59
-rw-r--r--source/blender/editors/screen/CMakeLists.txt72
-rw-r--r--source/blender/editors/screen/Makefile2
-rw-r--r--source/blender/editors/screen/SConscript11
-rw-r--r--source/blender/editors/screen/area.c69
-rw-r--r--source/blender/editors/screen/screen_context.c58
-rw-r--r--source/blender/editors/screen/screen_edit.c58
-rw-r--r--source/blender/editors/screen/screen_intern.h3
-rw-r--r--source/blender/editors/screen/screen_ops.c250
-rw-r--r--source/blender/editors/screen/screendump.c19
-rw-r--r--source/blender/editors/sculpt_paint/CMakeLists.txt41
-rw-r--r--source/blender/editors/sculpt_paint/Makefile2
-rw-r--r--source/blender/editors/sculpt_paint/SConscript10
-rw-r--r--source/blender/editors/sculpt_paint/paint_image.c207
-rw-r--r--source/blender/editors/sculpt_paint/paint_intern.h9
-rw-r--r--source/blender/editors/sculpt_paint/paint_ops.c244
-rw-r--r--source/blender/editors/sculpt_paint/paint_stroke.c831
-rw-r--r--source/blender/editors/sculpt_paint/paint_undo.c36
-rw-r--r--source/blender/editors/sculpt_paint/paint_utils.c7
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex.c94
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c3102
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_intern.h48
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_undo.c302
-rw-r--r--source/blender/editors/sound/CMakeLists.txt35
-rw-r--r--source/blender/editors/sound/Makefile4
-rw-r--r--source/blender/editors/sound/SConscript2
-rw-r--r--source/blender/editors/sound/sound_ops.c48
-rw-r--r--source/blender/editors/space_action/CMakeLists.txt35
-rw-r--r--source/blender/editors/space_action/Makefile2
-rw-r--r--source/blender/editors/space_action/action_draw.c12
-rw-r--r--source/blender/editors/space_action/action_edit.c65
-rw-r--r--source/blender/editors/space_action/action_ops.c3
-rw-r--r--source/blender/editors/space_action/action_select.c60
-rw-r--r--source/blender/editors/space_action/space_action.c12
-rw-r--r--source/blender/editors/space_api/CMakeLists.txt34
-rw-r--r--source/blender/editors/space_api/Makefile2
-rw-r--r--source/blender/editors/space_api/SConscript3
-rw-r--r--source/blender/editors/space_api/space.c3
-rw-r--r--source/blender/editors/space_api/spacetypes.c3
-rw-r--r--source/blender/editors/space_buttons/CMakeLists.txt34
-rw-r--r--source/blender/editors/space_buttons/Makefile2
-rw-r--r--source/blender/editors/space_buttons/SConscript3
-rw-r--r--source/blender/editors/space_buttons/buttons_context.c20
-rw-r--r--source/blender/editors/space_buttons/buttons_header.c5
-rw-r--r--source/blender/editors/space_buttons/buttons_ops.c58
-rw-r--r--source/blender/editors/space_buttons/space_buttons.c40
-rw-r--r--source/blender/editors/space_console/CMakeLists.txt40
-rw-r--r--source/blender/editors/space_console/Makefile3
-rw-r--r--source/blender/editors/space_console/SConscript1
-rw-r--r--source/blender/editors/space_console/console_draw.c37
-rw-r--r--source/blender/editors/space_console/console_ops.c6
-rw-r--r--source/blender/editors/space_console/console_report.c6
-rw-r--r--source/blender/editors/space_console/space_console.c75
-rw-r--r--source/blender/editors/space_file/CMakeLists.txt67
-rw-r--r--source/blender/editors/space_file/Makefile13
-rw-r--r--source/blender/editors/space_file/SConscript4
-rw-r--r--source/blender/editors/space_file/file_draw.c61
-rw-r--r--source/blender/editors/space_file/file_intern.h2
-rw-r--r--source/blender/editors/space_file/file_ops.c195
-rw-r--r--source/blender/editors/space_file/file_panels.c2
-rw-r--r--source/blender/editors/space_file/filelist.c183
-rw-r--r--source/blender/editors/space_file/filelist.h1
-rw-r--r--source/blender/editors/space_file/filesel.c149
-rw-r--r--source/blender/editors/space_file/fsmenu.c78
-rw-r--r--source/blender/editors/space_file/fsmenu.h5
-rw-r--r--source/blender/editors/space_file/space_file.c54
-rw-r--r--source/blender/editors/space_file/writeimage.c21
-rw-r--r--source/blender/editors/space_graph/CMakeLists.txt35
-rw-r--r--source/blender/editors/space_graph/Makefile4
-rw-r--r--source/blender/editors/space_graph/graph_buttons.c114
-rw-r--r--source/blender/editors/space_graph/graph_draw.c27
-rw-r--r--source/blender/editors/space_graph/graph_edit.c87
-rw-r--r--source/blender/editors/space_graph/graph_ops.c5
-rw-r--r--source/blender/editors/space_graph/graph_select.c48
-rw-r--r--source/blender/editors/space_graph/graph_utils.c11
-rw-r--r--source/blender/editors/space_graph/space_graph.c16
-rw-r--r--source/blender/editors/space_image/CMakeLists.txt53
-rw-r--r--source/blender/editors/space_image/Makefile19
-rw-r--r--source/blender/editors/space_image/SConscript3
-rw-r--r--source/blender/editors/space_image/image_buttons.c66
-rw-r--r--source/blender/editors/space_image/image_draw.c32
-rw-r--r--source/blender/editors/space_image/image_header.c8
-rw-r--r--source/blender/editors/space_image/image_ops.c379
-rw-r--r--source/blender/editors/space_image/image_render.c2
-rw-r--r--source/blender/editors/space_image/space_image.c51
-rw-r--r--source/blender/editors/space_info/CMakeLists.txt35
-rw-r--r--source/blender/editors/space_info/Makefile2
-rw-r--r--source/blender/editors/space_info/SConscript3
-rw-r--r--source/blender/editors/space_info/info_intern.h2
-rw-r--r--source/blender/editors/space_info/info_ops.c105
-rw-r--r--source/blender/editors/space_info/info_stats.c7
-rw-r--r--source/blender/editors/space_info/space_info.c44
-rw-r--r--source/blender/editors/space_logic/CMakeLists.txt39
-rw-r--r--source/blender/editors/space_logic/Makefile2
-rw-r--r--source/blender/editors/space_logic/logic_buttons.c10
-rw-r--r--source/blender/editors/space_logic/logic_header.c120
-rw-r--r--source/blender/editors/space_logic/logic_intern.h4
-rw-r--r--source/blender/editors/space_logic/logic_ops.c696
-rw-r--r--source/blender/editors/space_logic/logic_window.c1685
-rw-r--r--source/blender/editors/space_logic/space_logic.c29
-rw-r--r--source/blender/editors/space_nla/CMakeLists.txt34
-rw-r--r--source/blender/editors/space_nla/Makefile2
-rw-r--r--source/blender/editors/space_nla/nla_buttons.c39
-rw-r--r--source/blender/editors/space_nla/nla_channels.c62
-rw-r--r--source/blender/editors/space_nla/nla_draw.c9
-rw-r--r--source/blender/editors/space_nla/nla_edit.c43
-rw-r--r--source/blender/editors/space_nla/nla_ops.c6
-rw-r--r--source/blender/editors/space_nla/nla_select.c10
-rw-r--r--source/blender/editors/space_nla/space_nla.c13
-rw-r--r--source/blender/editors/space_node/CMakeLists.txt42
-rw-r--r--source/blender/editors/space_node/Makefile2
-rw-r--r--source/blender/editors/space_node/drawnode.c218
-rw-r--r--source/blender/editors/space_node/node_buttons.c7
-rw-r--r--source/blender/editors/space_node/node_draw.c94
-rw-r--r--source/blender/editors/space_node/node_edit.c655
-rw-r--r--source/blender/editors/space_node/node_header.c3
-rw-r--r--source/blender/editors/space_node/node_intern.h20
-rw-r--r--source/blender/editors/space_node/node_ops.c48
-rw-r--r--source/blender/editors/space_node/node_select.c93
-rw-r--r--source/blender/editors/space_node/node_state.c27
-rw-r--r--source/blender/editors/space_node/space_node.c60
-rw-r--r--source/blender/editors/space_outliner/CMakeLists.txt36
-rw-r--r--source/blender/editors/space_outliner/Makefile2
-rw-r--r--source/blender/editors/space_outliner/outliner.c433
-rw-r--r--source/blender/editors/space_outliner/outliner_intern.h22
-rw-r--r--source/blender/editors/space_outliner/outliner_ops.c2
-rw-r--r--source/blender/editors/space_outliner/space_outliner.c8
-rw-r--r--source/blender/editors/space_script/CMakeLists.txt40
-rw-r--r--source/blender/editors/space_script/Makefile2
-rw-r--r--source/blender/editors/space_script/script_edit.c39
-rw-r--r--source/blender/editors/space_script/script_header.c4
-rw-r--r--source/blender/editors/space_script/script_intern.h1
-rw-r--r--source/blender/editors/space_script/script_ops.c6
-rw-r--r--source/blender/editors/space_script/space_script.c10
-rw-r--r--source/blender/editors/space_sequencer/CMakeLists.txt36
-rw-r--r--source/blender/editors/space_sequencer/Makefile3
-rw-r--r--source/blender/editors/space_sequencer/sequencer_add.c166
-rw-r--r--source/blender/editors/space_sequencer/sequencer_buttons.c3
-rw-r--r--source/blender/editors/space_sequencer/sequencer_draw.c320
-rw-r--r--source/blender/editors/space_sequencer/sequencer_edit.c656
-rw-r--r--source/blender/editors/space_sequencer/sequencer_intern.h12
-rw-r--r--source/blender/editors/space_sequencer/sequencer_ops.c50
-rw-r--r--source/blender/editors/space_sequencer/sequencer_select.c85
-rw-r--r--source/blender/editors/space_sequencer/space_sequencer.c38
-rw-r--r--source/blender/editors/space_sound/CMakeLists.txt34
-rw-r--r--source/blender/editors/space_sound/Makefile4
-rw-r--r--source/blender/editors/space_sound/sound_header.c1
-rw-r--r--source/blender/editors/space_sound/space_sound.c6
-rw-r--r--source/blender/editors/space_text/CMakeLists.txt41
-rw-r--r--source/blender/editors/space_text/Makefile2
-rw-r--r--source/blender/editors/space_text/space_text.c62
-rw-r--r--source/blender/editors/space_text/text_draw.c159
-rw-r--r--source/blender/editors/space_text/text_header.c9
-rw-r--r--source/blender/editors/space_text/text_ops.c70
-rw-r--r--source/blender/editors/space_time/CMakeLists.txt34
-rw-r--r--source/blender/editors/space_time/Makefile2
-rw-r--r--source/blender/editors/space_time/space_time.c257
-rw-r--r--source/blender/editors/space_time/time_ops.c2
-rw-r--r--source/blender/editors/space_userpref/CMakeLists.txt34
-rw-r--r--source/blender/editors/space_userpref/Makefile2
-rw-r--r--source/blender/editors/space_userpref/SConscript3
-rw-r--r--source/blender/editors/space_userpref/space_userpref.c1
-rw-r--r--source/blender/editors/space_view3d/CMakeLists.txt50
-rw-r--r--source/blender/editors/space_view3d/Makefile2
-rw-r--r--source/blender/editors/space_view3d/SConscript2
-rw-r--r--source/blender/editors/space_view3d/drawanimviz.c46
-rw-r--r--source/blender/editors/space_view3d/drawarmature.c27
-rw-r--r--source/blender/editors/space_view3d/drawmesh.c25
-rw-r--r--source/blender/editors/space_view3d/drawobject.c670
-rw-r--r--source/blender/editors/space_view3d/drawvolume.c18
-rw-r--r--source/blender/editors/space_view3d/space_view3d.c99
-rw-r--r--source/blender/editors/space_view3d/view3d_buttons.c74
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c372
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c402
-rw-r--r--source/blender/editors/space_view3d/view3d_header.c35
-rw-r--r--source/blender/editors/space_view3d/view3d_intern.h24
-rw-r--r--source/blender/editors/space_view3d/view3d_ops.c29
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c111
-rw-r--r--source/blender/editors/space_view3d/view3d_snap.c274
-rw-r--r--source/blender/editors/space_view3d/view3d_toolbar.c10
-rw-r--r--source/blender/editors/space_view3d/view3d_view.c307
-rw-r--r--source/blender/editors/transform/CMakeLists.txt34
-rw-r--r--source/blender/editors/transform/Makefile2
-rw-r--r--source/blender/editors/transform/transform.c305
-rw-r--r--source/blender/editors/transform/transform.h5
-rw-r--r--source/blender/editors/transform/transform_constraints.c22
-rw-r--r--source/blender/editors/transform/transform_conversions.c214
-rw-r--r--source/blender/editors/transform/transform_generics.c72
-rw-r--r--source/blender/editors/transform/transform_input.c8
-rw-r--r--source/blender/editors/transform/transform_manipulator.c16
-rw-r--r--source/blender/editors/transform/transform_ops.c67
-rw-r--r--source/blender/editors/transform/transform_orientations.c18
-rw-r--r--source/blender/editors/transform/transform_snap.c33
-rw-r--r--source/blender/editors/util/CMakeLists.txt34
-rw-r--r--source/blender/editors/util/Makefile2
-rw-r--r--source/blender/editors/util/ed_util.c31
-rw-r--r--source/blender/editors/util/editmode_undo.c4
-rw-r--r--source/blender/editors/util/numinput.c2
-rw-r--r--source/blender/editors/util/undo.c21
-rw-r--r--source/blender/editors/uvedit/CMakeLists.txt35
-rw-r--r--source/blender/editors/uvedit/Makefile2
-rw-r--r--source/blender/editors/uvedit/uvedit_draw.c8
-rw-r--r--source/blender/editors/uvedit/uvedit_ops.c5
-rw-r--r--source/blender/editors/uvedit/uvedit_parametrizer.c12
-rw-r--r--source/blender/editors/uvedit/uvedit_unwrap_ops.c6
-rw-r--r--source/blender/gpu/CMakeLists.txt6
-rw-r--r--source/blender/gpu/GPU_buffers.h (renamed from source/blender/gpu/gpu_buffers.h)10
-rw-r--r--source/blender/gpu/GPU_draw.h4
-rw-r--r--source/blender/gpu/GPU_extensions.h16
-rw-r--r--source/blender/gpu/GPU_material.h2
-rw-r--r--source/blender/gpu/Makefile2
-rw-r--r--source/blender/gpu/SConscript3
-rw-r--r--source/blender/gpu/intern/Makefile2
-rw-r--r--source/blender/gpu/intern/gpu_buffers.c91
-rw-r--r--source/blender/gpu/intern/gpu_codegen.c9
-rw-r--r--source/blender/gpu/intern/gpu_draw.c64
-rw-r--r--source/blender/gpu/intern/gpu_extensions.c30
-rw-r--r--source/blender/gpu/intern/gpu_material.c20
-rw-r--r--source/blender/gpu/intern/gpu_shader_material.glsl32
-rw-r--r--source/blender/gpu/intern/gpu_shader_material.glsl.c388
-rw-r--r--source/blender/ikplugin/Makefile2
-rw-r--r--source/blender/ikplugin/intern/Makefile2
-rw-r--r--source/blender/ikplugin/intern/ikplugin_api.c1
-rw-r--r--source/blender/imbuf/CMakeLists.txt42
-rw-r--r--source/blender/imbuf/IMB_imbuf.h264
-rw-r--r--source/blender/imbuf/IMB_imbuf_types.h212
-rw-r--r--source/blender/imbuf/IMB_thumbs.h11
-rw-r--r--source/blender/imbuf/Makefile2
-rw-r--r--source/blender/imbuf/SConscript12
-rw-r--r--source/blender/imbuf/intern/IMB_anim.h19
-rw-r--r--source/blender/imbuf/intern/IMB_anim5.h20
-rw-r--r--source/blender/imbuf/intern/IMB_bmp.h47
-rw-r--r--source/blender/imbuf/intern/IMB_cmap.h46
-rw-r--r--source/blender/imbuf/intern/IMB_cocoa.h43
-rw-r--r--source/blender/imbuf/intern/IMB_filetype.h121
-rw-r--r--source/blender/imbuf/intern/IMB_filter.h3
-rw-r--r--source/blender/imbuf/intern/IMB_hamx.h47
-rw-r--r--source/blender/imbuf/intern/IMB_iris.h46
-rw-r--r--source/blender/imbuf/intern/IMB_jp2.h49
-rw-r--r--source/blender/imbuf/intern/IMB_jpeg.h49
-rw-r--r--source/blender/imbuf/intern/IMB_metadata.h (renamed from source/blender/imbuf/intern/IMB_imginfo.h)29
-rw-r--r--source/blender/imbuf/intern/IMB_tiff.h45
-rw-r--r--source/blender/imbuf/intern/Makefile19
-rw-r--r--source/blender/imbuf/intern/allocimbuf.c406
-rw-r--r--source/blender/imbuf/intern/amiga.c540
-rw-r--r--source/blender/imbuf/intern/anim.c393
-rw-r--r--source/blender/imbuf/intern/anim5.c539
-rw-r--r--source/blender/imbuf/intern/antialias.c466
-rw-r--r--source/blender/imbuf/intern/bitplanes.c356
-rw-r--r--source/blender/imbuf/intern/bmp.c8
-rw-r--r--source/blender/imbuf/intern/cache.c444
-rw-r--r--source/blender/imbuf/intern/cineon/CMakeLists.txt1
-rw-r--r--source/blender/imbuf/intern/cineon/Makefile2
-rw-r--r--source/blender/imbuf/intern/cineon/cineon_dpx.c6
-rw-r--r--source/blender/imbuf/intern/cmap.c580
-rw-r--r--source/blender/imbuf/intern/cspace.c176
-rw-r--r--source/blender/imbuf/intern/data.c142
-rw-r--r--source/blender/imbuf/intern/dds/CMakeLists.txt5
-rw-r--r--source/blender/imbuf/intern/dds/Makefile2
-rw-r--r--source/blender/imbuf/intern/dds/dds_api.cpp6
-rw-r--r--source/blender/imbuf/intern/dds/dds_api.h2
-rw-r--r--source/blender/imbuf/intern/dither.c130
-rw-r--r--source/blender/imbuf/intern/divers.c151
-rw-r--r--source/blender/imbuf/intern/dynlibtiff.c249
-rw-r--r--source/blender/imbuf/intern/dynlibtiff.h55
-rw-r--r--source/blender/imbuf/intern/filetype.c106
-rw-r--r--source/blender/imbuf/intern/filter.c96
-rwxr-xr-xsource/blender/imbuf/intern/gen_dynlibtiff.py303
-rw-r--r--source/blender/imbuf/intern/ham.c276
-rw-r--r--source/blender/imbuf/intern/hamx.c581
-rw-r--r--source/blender/imbuf/intern/iff.c224
-rw-r--r--source/blender/imbuf/intern/imageprocess.c10
-rw-r--r--source/blender/imbuf/intern/imbuf.h93
-rw-r--r--source/blender/imbuf/intern/imbuf_cocoa.m4
-rw-r--r--source/blender/imbuf/intern/imbuf_patch.h111
-rw-r--r--source/blender/imbuf/intern/iris.c53
-rw-r--r--source/blender/imbuf/intern/jp2.c68
-rw-r--r--source/blender/imbuf/intern/jpeg.c50
-rw-r--r--source/blender/imbuf/intern/matrix.h84
-rw-r--r--source/blender/imbuf/intern/md5.c4
-rw-r--r--source/blender/imbuf/intern/metadata.c (renamed from source/blender/imbuf/intern/imginfo.c)61
-rw-r--r--source/blender/imbuf/intern/module.c (renamed from source/blender/imbuf/intern/IMB_radiance_hdr.h)30
-rw-r--r--source/blender/imbuf/intern/openexr/CMakeLists.txt5
-rw-r--r--source/blender/imbuf/intern/openexr/Makefile2
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_api.cpp186
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_api.h2
-rw-r--r--source/blender/imbuf/intern/png.c48
-rw-r--r--source/blender/imbuf/intern/radiance_hdr.c15
-rw-r--r--source/blender/imbuf/intern/readimage.c326
-rw-r--r--source/blender/imbuf/intern/rectop.c1
-rw-r--r--source/blender/imbuf/intern/rotate.c4
-rw-r--r--source/blender/imbuf/intern/scaling.c190
-rw-r--r--source/blender/imbuf/intern/targa.c93
-rw-r--r--source/blender/imbuf/intern/thumbs.c64
-rw-r--r--source/blender/imbuf/intern/thumbs_blend.c192
-rw-r--r--source/blender/imbuf/intern/tiff.c502
-rw-r--r--source/blender/imbuf/intern/util.c259
-rw-r--r--source/blender/imbuf/intern/writeimage.c172
-rw-r--r--source/blender/makesdna/DNA_ID.h13
-rw-r--r--source/blender/makesdna/DNA_action_types.h9
-rw-r--r--source/blender/makesdna/DNA_actuator_types.h29
-rw-r--r--source/blender/makesdna/DNA_armature_types.h2
-rw-r--r--source/blender/makesdna/DNA_brush_types.h146
-rw-r--r--source/blender/makesdna/DNA_camera_types.h6
-rw-r--r--source/blender/makesdna/DNA_color_types.h48
-rw-r--r--source/blender/makesdna/DNA_constraint_types.h103
-rw-r--r--source/blender/makesdna/DNA_controller_types.h4
-rw-r--r--source/blender/makesdna/DNA_curve_types.h44
-rw-r--r--source/blender/makesdna/DNA_documentation.h2
-rw-r--r--source/blender/makesdna/DNA_image_types.h6
-rw-r--r--source/blender/makesdna/DNA_lamp_types.h18
-rw-r--r--source/blender/makesdna/DNA_lattice_types.h11
-rw-r--r--source/blender/makesdna/DNA_mesh_types.h4
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h23
-rw-r--r--source/blender/makesdna/DNA_node_types.h9
-rw-r--r--source/blender/makesdna/DNA_object_force.h3
-rw-r--r--source/blender/makesdna/DNA_object_types.h19
-rw-r--r--source/blender/makesdna/DNA_particle_types.h2
-rw-r--r--source/blender/makesdna/DNA_scene_types.h142
-rw-r--r--source/blender/makesdna/DNA_screen_types.h2
-rw-r--r--source/blender/makesdna/DNA_sdna_types.h2
-rw-r--r--source/blender/makesdna/DNA_sensor_types.h16
-rw-r--r--source/blender/makesdna/DNA_sequence_types.h44
-rw-r--r--source/blender/makesdna/DNA_smoke_types.h24
-rw-r--r--source/blender/makesdna/DNA_sound_types.h28
-rw-r--r--source/blender/makesdna/DNA_space_types.h72
-rw-r--r--source/blender/makesdna/DNA_texture_types.h12
-rw-r--r--source/blender/makesdna/DNA_userdef_types.h36
-rw-r--r--source/blender/makesdna/DNA_view3d_types.h4
-rw-r--r--source/blender/makesdna/DNA_wave_types.h50
-rw-r--r--source/blender/makesdna/DNA_windowmanager_types.h14
-rw-r--r--source/blender/makesdna/DNA_world_types.h10
-rw-r--r--source/blender/makesdna/Makefile2
-rw-r--r--source/blender/makesdna/intern/Makefile2
-rw-r--r--source/blender/makesdna/intern/SConscript4
-rw-r--r--source/blender/makesdna/intern/dna_genfile.c6
-rw-r--r--source/blender/makesdna/intern/makesdna.c14
-rw-r--r--source/blender/makesrna/Makefile2
-rw-r--r--source/blender/makesrna/RNA_access.h20
-rw-r--r--source/blender/makesrna/RNA_define.h6
-rw-r--r--source/blender/makesrna/RNA_enum_types.h12
-rw-r--r--source/blender/makesrna/RNA_types.h44
-rw-r--r--source/blender/makesrna/SConscript16
-rw-r--r--source/blender/makesrna/intern/CMakeLists.txt65
-rw-r--r--source/blender/makesrna/intern/Makefile22
-rw-r--r--source/blender/makesrna/intern/SConscript18
-rw-r--r--source/blender/makesrna/intern/makesrna.c31
-rw-r--r--source/blender/makesrna/intern/rna_ID.c20
-rw-r--r--source/blender/makesrna/intern/rna_access.c213
-rw-r--r--source/blender/makesrna/intern/rna_action.c232
-rw-r--r--source/blender/makesrna/intern/rna_actuator.c1050
-rw-r--r--source/blender/makesrna/intern/rna_actuator_api.c72
-rw-r--r--source/blender/makesrna/intern/rna_animation.c64
-rw-r--r--source/blender/makesrna/intern/rna_animation_api.c4
-rw-r--r--source/blender/makesrna/intern/rna_animviz.c39
-rw-r--r--source/blender/makesrna/intern/rna_armature.c108
-rw-r--r--source/blender/makesrna/intern/rna_boid.c69
-rw-r--r--source/blender/makesrna/intern/rna_brush.c540
-rw-r--r--source/blender/makesrna/intern/rna_camera.c41
-rw-r--r--source/blender/makesrna/intern/rna_cloth.c14
-rw-r--r--source/blender/makesrna/intern/rna_color.c159
-rw-r--r--source/blender/makesrna/intern/rna_constraint.c223
-rw-r--r--source/blender/makesrna/intern/rna_context.c42
-rw-r--r--source/blender/makesrna/intern/rna_controller.c145
-rw-r--r--source/blender/makesrna/intern/rna_controller_api.c81
-rw-r--r--source/blender/makesrna/intern/rna_curve.c340
-rw-r--r--source/blender/makesrna/intern/rna_define.c150
-rw-r--r--source/blender/makesrna/intern/rna_fcurve.c299
-rw-r--r--source/blender/makesrna/intern/rna_fluidsim.c37
-rw-r--r--source/blender/makesrna/intern/rna_gpencil.c48
-rw-r--r--source/blender/makesrna/intern/rna_group.c3
-rw-r--r--source/blender/makesrna/intern/rna_image.c56
-rw-r--r--source/blender/makesrna/intern/rna_image_api.c50
-rw-r--r--source/blender/makesrna/intern/rna_internal.h25
-rw-r--r--source/blender/makesrna/intern/rna_internal_types.h2
-rw-r--r--source/blender/makesrna/intern/rna_key.c8
-rw-r--r--source/blender/makesrna/intern/rna_lamp.c43
-rw-r--r--source/blender/makesrna/intern/rna_lattice.c67
-rw-r--r--source/blender/makesrna/intern/rna_main.c32
-rw-r--r--source/blender/makesrna/intern/rna_main_api.c356
-rw-r--r--source/blender/makesrna/intern/rna_material.c210
-rw-r--r--source/blender/makesrna/intern/rna_material_api.c9
-rw-r--r--source/blender/makesrna/intern/rna_mesh.c487
-rw-r--r--source/blender/makesrna/intern/rna_mesh_api.c33
-rw-r--r--source/blender/makesrna/intern/rna_meta.c185
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c336
-rw-r--r--source/blender/makesrna/intern/rna_nla.c28
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c187
-rw-r--r--source/blender/makesrna/intern/rna_object.c575
-rw-r--r--source/blender/makesrna/intern/rna_object_api.c109
-rw-r--r--source/blender/makesrna/intern/rna_object_force.c229
-rw-r--r--source/blender/makesrna/intern/rna_particle.c386
-rw-r--r--source/blender/makesrna/intern/rna_pose.c150
-rw-r--r--source/blender/makesrna/intern/rna_property.c17
-rw-r--r--source/blender/makesrna/intern/rna_render.c4
-rw-r--r--source/blender/makesrna/intern/rna_rna.c53
-rw-r--r--source/blender/makesrna/intern/rna_scene.c784
-rw-r--r--source/blender/makesrna/intern/rna_scene_api.c24
-rw-r--r--source/blender/makesrna/intern/rna_screen.c14
-rw-r--r--source/blender/makesrna/intern/rna_sculpt_paint.c180
-rw-r--r--source/blender/makesrna/intern/rna_sensor.c396
-rw-r--r--source/blender/makesrna/intern/rna_sensor_api.c72
-rw-r--r--source/blender/makesrna/intern/rna_sequencer.c470
-rw-r--r--source/blender/makesrna/intern/rna_sequencer_api.c72
-rw-r--r--source/blender/makesrna/intern/rna_smoke.c86
-rw-r--r--source/blender/makesrna/intern/rna_sound.c12
-rw-r--r--source/blender/makesrna/intern/rna_space.c588
-rw-r--r--source/blender/makesrna/intern/rna_text.c46
-rw-r--r--source/blender/makesrna/intern/rna_texture.c169
-rw-r--r--source/blender/makesrna/intern/rna_timeline.c4
-rw-r--r--source/blender/makesrna/intern/rna_ui.c74
-rw-r--r--source/blender/makesrna/intern/rna_ui_api.c64
-rw-r--r--source/blender/makesrna/intern/rna_userdef.c269
-rw-r--r--source/blender/makesrna/intern/rna_vfont.c6
-rw-r--r--source/blender/makesrna/intern/rna_wm.c136
-rw-r--r--source/blender/makesrna/intern/rna_wm_api.c4
-rw-r--r--source/blender/makesrna/intern/rna_world.c65
-rwxr-xr-xsource/blender/makesrna/rna_cleanup/rna_cleaner.py321
-rwxr-xr-xsource/blender/makesrna/rna_cleanup/rna_cleaner_merge.py61
-rw-r--r--source/blender/makesrna/rna_cleanup/rna_properties.txt4605
-rwxr-xr-xsource/blender/makesrna/rna_cleanup/rna_update.sh13
-rw-r--r--source/blender/modifiers/CMakeLists.txt48
-rw-r--r--source/blender/modifiers/MOD_modifiertypes.h74
-rw-r--r--source/blender/modifiers/Makefile34
-rw-r--r--source/blender/modifiers/SConscript20
-rw-r--r--source/blender/modifiers/intern/MOD_armature.c179
-rw-r--r--source/blender/modifiers/intern/MOD_array.c780
-rw-r--r--source/blender/modifiers/intern/MOD_bevel.c141
-rw-r--r--source/blender/modifiers/intern/MOD_boolean.c140
-rw-r--r--source/blender/modifiers/intern/MOD_boolean_util.c (renamed from source/blender/blenkernel/intern/booleanops.c)18
-rw-r--r--source/blender/modifiers/intern/MOD_boolean_util.h (renamed from source/blender/blenkernel/BKE_booleanops.h)11
-rw-r--r--source/blender/modifiers/intern/MOD_build.c300
-rw-r--r--source/blender/modifiers/intern/MOD_cast.c628
-rw-r--r--source/blender/modifiers/intern/MOD_cloth.c206
-rw-r--r--source/blender/modifiers/intern/MOD_collision.c253
-rw-r--r--source/blender/modifiers/intern/MOD_curve.c150
-rw-r--r--source/blender/modifiers/intern/MOD_decimate.c199
-rw-r--r--source/blender/modifiers/intern/MOD_displace.c354
-rw-r--r--source/blender/modifiers/intern/MOD_edgesplit.c1295
-rw-r--r--source/blender/modifiers/intern/MOD_explode.c903
-rw-r--r--source/blender/modifiers/intern/MOD_fluidsim.c158
-rw-r--r--source/blender/modifiers/intern/MOD_fluidsim_util.c608
-rw-r--r--source/blender/modifiers/intern/MOD_fluidsim_util.h (renamed from source/blender/blenkernel/BKE_simple_deform.h)20
-rw-r--r--source/blender/modifiers/intern/MOD_hook.c279
-rw-r--r--source/blender/modifiers/intern/MOD_lattice.c144
-rw-r--r--source/blender/modifiers/intern/MOD_mask.c409
-rw-r--r--source/blender/modifiers/intern/MOD_meshdeform.c452
-rw-r--r--source/blender/modifiers/intern/MOD_mirror.c349
-rw-r--r--source/blender/modifiers/intern/MOD_multires.c123
-rw-r--r--source/blender/modifiers/intern/MOD_none.c70
-rw-r--r--source/blender/modifiers/intern/MOD_particleinstance.c341
-rw-r--r--source/blender/modifiers/intern/MOD_particlesystem.c232
-rw-r--r--source/blender/modifiers/intern/MOD_screw.c899
-rw-r--r--source/blender/modifiers/intern/MOD_shapekey.c112
-rw-r--r--source/blender/modifiers/intern/MOD_shrinkwrap.c171
-rw-r--r--source/blender/modifiers/intern/MOD_simpledeform.c (renamed from source/blender/blenkernel/intern/simple_deform.c)206
-rw-r--r--source/blender/modifiers/intern/MOD_smoke.c146
-rw-r--r--source/blender/modifiers/intern/MOD_smooth.c269
-rw-r--r--source/blender/modifiers/intern/MOD_softbody.c77
-rw-r--r--source/blender/modifiers/intern/MOD_solidify.c666
-rw-r--r--source/blender/modifiers/intern/MOD_subsurf.c144
-rw-r--r--source/blender/modifiers/intern/MOD_surface.c183
-rw-r--r--source/blender/modifiers/intern/MOD_util.c186
-rw-r--r--source/blender/modifiers/intern/MOD_util.h48
-rw-r--r--source/blender/modifiers/intern/MOD_uvproject.c423
-rw-r--r--source/blender/modifiers/intern/MOD_wave.c460
-rw-r--r--source/blender/modifiers/intern/Makefile55
-rw-r--r--source/blender/nodes/Makefile2
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c86
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c174
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c43
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_crop.c9
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_defocus.c58
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_displace.c157
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c4
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c7
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_scale.c4
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c2
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_texture.c9
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_value.c2
-rw-r--r--source/blender/nodes/intern/CMP_nodes/Makefile2
-rw-r--r--source/blender/nodes/intern/CMP_util.c18
-rw-r--r--source/blender/nodes/intern/Makefile2
-rw-r--r--source/blender/nodes/intern/SHD_nodes/Makefile2
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_geom.c11
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_material.c2
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_value.c2
-rw-r--r--source/blender/nodes/intern/TEX_nodes/Makefile2
-rw-r--r--source/blender/python/BPY_extern.h6
-rw-r--r--source/blender/python/CMakeLists.txt1
-rw-r--r--source/blender/python/Makefile2
-rw-r--r--source/blender/python/SConscript7
-rw-r--r--source/blender/python/doc/epy/Geometry.py4
-rw-r--r--source/blender/python/doc/epy/Mathutils.py2
-rw-r--r--source/blender/python/doc/examples/Mathutils.Euler.py3
-rw-r--r--source/blender/python/doc/examples/Mathutils.Matrix.py3
-rw-r--r--source/blender/python/doc/examples/Mathutils.Quaternion.py3
-rw-r--r--source/blender/python/doc/examples/Mathutils.py17
-rw-r--r--source/blender/python/doc/examples/bpy.data.py29
-rw-r--r--source/blender/python/doc/examples/mathutils.Euler.py3
-rw-r--r--source/blender/python/doc/examples/mathutils.Matrix.py3
-rw-r--r--source/blender/python/doc/examples/mathutils.Quaternion.py3
-rw-r--r--source/blender/python/doc/examples/mathutils.Vector.py (renamed from source/blender/python/doc/examples/Mathutils.Vector.py)14
-rw-r--r--source/blender/python/doc/examples/mathutils.py18
-rw-r--r--source/blender/python/doc/sphinx_doc_gen.py464
-rwxr-xr-xsource/blender/python/doc/sphinx_doc_gen.sh7
-rw-r--r--source/blender/python/generic/CMakeLists.txt2
-rw-r--r--source/blender/python/generic/Makefile2
-rw-r--r--source/blender/python/generic/Mathutils.c721
-rw-r--r--source/blender/python/generic/bgl.c34
-rw-r--r--source/blender/python/generic/bgl.h4
-rw-r--r--source/blender/python/generic/blf_api.c (renamed from source/blender/python/generic/blf.c)180
-rw-r--r--source/blender/python/generic/blf_api.h (renamed from source/blender/python/generic/blf.h)0
-rw-r--r--source/blender/python/generic/bpy_internal_import.c59
-rw-r--r--source/blender/python/generic/bpy_internal_import.h5
-rw-r--r--source/blender/python/generic/geometry.c (renamed from source/blender/python/generic/Geometry.c)32
-rw-r--r--source/blender/python/generic/geometry.h (renamed from source/blender/python/generic/Geometry.h)2
-rw-r--r--source/blender/python/generic/mathutils.c273
-rw-r--r--source/blender/python/generic/mathutils.h (renamed from source/blender/python/generic/Mathutils.h)65
-rw-r--r--source/blender/python/generic/mathutils_color.c560
-rw-r--r--source/blender/python/generic/mathutils_color.h (renamed from source/blender/imbuf/intern/IMB_targa.h)34
-rw-r--r--source/blender/python/generic/mathutils_euler.c (renamed from source/blender/python/generic/euler.c)345
-rw-r--r--source/blender/python/generic/mathutils_euler.h (renamed from source/blender/python/generic/euler.h)9
-rw-r--r--source/blender/python/generic/mathutils_matrix.c (renamed from source/blender/python/generic/matrix.c)567
-rw-r--r--source/blender/python/generic/mathutils_matrix.h (renamed from source/blender/python/generic/matrix.h)15
-rw-r--r--source/blender/python/generic/mathutils_quat.c (renamed from source/blender/python/generic/quat.c)531
-rw-r--r--source/blender/python/generic/mathutils_quat.h (renamed from source/blender/python/generic/quat.h)11
-rw-r--r--source/blender/python/generic/mathutils_vector.c (renamed from source/blender/python/generic/vector.c)501
-rw-r--r--source/blender/python/generic/mathutils_vector.h (renamed from source/blender/python/generic/vector.h)13
-rw-r--r--source/blender/python/generic/noise.c760
-rw-r--r--source/blender/python/intern/Makefile3
-rw-r--r--source/blender/python/intern/bpy.c111
-rw-r--r--source/blender/python/intern/bpy_app.c6
-rw-r--r--source/blender/python/intern/bpy_driver.c43
-rw-r--r--source/blender/python/intern/bpy_interface.c117
-rw-r--r--source/blender/python/intern/bpy_operator.c4
-rw-r--r--source/blender/python/intern/bpy_operator_wrap.c23
-rw-r--r--source/blender/python/intern/bpy_props.c135
-rw-r--r--source/blender/python/intern/bpy_props.h14
-rw-r--r--source/blender/python/intern/bpy_rna.c1346
-rw-r--r--source/blender/python/intern/bpy_rna.h6
-rw-r--r--source/blender/python/intern/bpy_rna_callback.c29
-rw-r--r--source/blender/python/intern/bpy_util.c26
-rw-r--r--source/blender/python/intern/bpy_util.h2
-rw-r--r--source/blender/quicktime/CMakeLists.txt9
-rw-r--r--source/blender/quicktime/Makefile2
-rw-r--r--source/blender/quicktime/SConscript3
-rw-r--r--source/blender/quicktime/apple/Makefile3
-rw-r--r--source/blender/quicktime/apple/qtkit_export.m524
-rw-r--r--source/blender/quicktime/apple/qtkit_import.m18
-rw-r--r--source/blender/quicktime/apple/quicktime_export.c30
-rw-r--r--source/blender/quicktime/apple/quicktime_import.c2
-rw-r--r--source/blender/quicktime/quicktime_export.h21
-rw-r--r--source/blender/quicktime/quicktime_import.h4
-rw-r--r--source/blender/readblenfile/CMakeLists.txt1
-rw-r--r--source/blender/readblenfile/Makefile2
-rw-r--r--source/blender/readblenfile/intern/BLO_readblenfile.c13
-rw-r--r--source/blender/readblenfile/intern/Makefile2
-rw-r--r--source/blender/readblenfile/stub/Makefile2
-rw-r--r--source/blender/readblenfile/test/Makefile2
-rw-r--r--source/blender/readblenfile/test/test.c4
-rw-r--r--source/blender/render/CMakeLists.txt15
-rw-r--r--source/blender/render/Makefile2
-rw-r--r--source/blender/render/SConscript33
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h19
-rw-r--r--source/blender/render/extern/include/RE_shader_ext.h5
-rw-r--r--source/blender/render/intern/Makefile2
-rw-r--r--source/blender/render/intern/include/render_types.h36
-rw-r--r--source/blender/render/intern/include/renderdatabase.h5
-rw-r--r--source/blender/render/intern/include/texture.h10
-rw-r--r--source/blender/render/intern/include/volume_precache.h6
-rw-r--r--source/blender/render/intern/raytrace/Makefile6
-rw-r--r--source/blender/render/intern/raytrace/bvh.h1
-rw-r--r--source/blender/render/intern/raytrace/rayobject.cpp20
-rw-r--r--source/blender/render/intern/raytrace/rayobject_qbvh.cpp5
-rw-r--r--source/blender/render/intern/raytrace/rayobject_rtbuild.cpp10
-rw-r--r--source/blender/render/intern/raytrace/rayobject_svbvh.cpp6
-rw-r--r--source/blender/render/intern/raytrace/rayobject_vbvh.cpp4
-rw-r--r--source/blender/render/intern/raytrace/reorganize.h4
-rw-r--r--source/blender/render/intern/source/Makefile2
-rw-r--r--source/blender/render/intern/source/convertblender.c203
-rw-r--r--source/blender/render/intern/source/envmap.c11
-rw-r--r--source/blender/render/intern/source/gammaCorrectionTables.c6
-rw-r--r--source/blender/render/intern/source/imagetexture.c122
-rw-r--r--source/blender/render/intern/source/occlusion.c5
-rw-r--r--source/blender/render/intern/source/pipeline.c151
-rw-r--r--source/blender/render/intern/source/pointdensity.c16
-rw-r--r--source/blender/render/intern/source/rayobject_instance.c7
-rw-r--r--source/blender/render/intern/source/rayshade.c40
-rw-r--r--source/blender/render/intern/source/rendercore.c20
-rw-r--r--source/blender/render/intern/source/renderdatabase.c28
-rw-r--r--source/blender/render/intern/source/shadbuf.c8
-rw-r--r--source/blender/render/intern/source/shadeinput.c46
-rw-r--r--source/blender/render/intern/source/shadeoutput.c2
-rw-r--r--source/blender/render/intern/source/sss.c7
-rw-r--r--source/blender/render/intern/source/strand.c8
-rw-r--r--source/blender/render/intern/source/texture.c24
-rw-r--r--source/blender/render/intern/source/volume_precache.c94
-rw-r--r--source/blender/render/intern/source/volumetric.c57
-rw-r--r--source/blender/render/intern/source/voxeldata.c169
-rw-r--r--source/blender/verify/Makefile2
-rw-r--r--source/blender/verify/intern/BLO_verify.c4
-rw-r--r--source/blender/verify/intern/Makefile2
-rw-r--r--source/blender/windowmanager/CMakeLists.txt4
-rw-r--r--source/blender/windowmanager/Makefile2
-rw-r--r--source/blender/windowmanager/SConscript4
-rw-r--r--source/blender/windowmanager/WM_api.h36
-rw-r--r--source/blender/windowmanager/WM_types.h32
-rw-r--r--source/blender/windowmanager/intern/Makefile2
-rw-r--r--source/blender/windowmanager/intern/wm.c31
-rw-r--r--source/blender/windowmanager/intern/wm_dragdrop.c2
-rw-r--r--source/blender/windowmanager/intern/wm_draw.c58
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c192
-rw-r--r--source/blender/windowmanager/intern/wm_files.c269
-rw-r--r--source/blender/windowmanager/intern/wm_init_exit.c137
-rw-r--r--source/blender/windowmanager/intern/wm_jobs.c119
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c7
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c449
-rw-r--r--source/blender/windowmanager/intern/wm_subwindow.c30
-rw-r--r--source/blender/windowmanager/intern/wm_window.c71
-rw-r--r--source/blender/windowmanager/wm_event_types.h13
-rw-r--r--source/blender/windowmanager/wm_files.h2
-rw-r--r--source/blender/windowmanager/wm_window.h2
-rw-r--r--source/blenderplayer/CMakeLists.txt31
-rw-r--r--source/blenderplayer/bad_level_call_stubs/Makefile2
-rw-r--r--source/blenderplayer/bad_level_call_stubs/stubs.c51
-rw-r--r--source/creator/CMakeLists.txt342
-rw-r--r--source/creator/Makefile14
-rw-r--r--source/creator/SConscript12
-rw-r--r--source/creator/buildinfo.c4
-rw-r--r--source/creator/creator.c537
-rw-r--r--source/darwin/Makefile8
-rw-r--r--source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp76
-rw-r--r--source/gameengine/BlenderRoutines/CMakeLists.txt1
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp42
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderCanvas.h22
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderGL.cpp4
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderInputDevice.cpp4
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h13
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp4
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h4
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.cpp4
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.h4
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h2
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderSystem.cpp4
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderSystem.h2
-rw-r--r--source/gameengine/BlenderRoutines/Makefile2
-rw-r--r--source/gameengine/Converter/BL_ActionActuator.cpp4
-rw-r--r--source/gameengine/Converter/BL_ArmatureActuator.cpp6
-rw-r--r--source/gameengine/Converter/BL_ArmatureChannel.cpp15
-rw-r--r--source/gameengine/Converter/BL_ArmatureConstraint.cpp6
-rw-r--r--source/gameengine/Converter/BL_ArmatureObject.cpp14
-rw-r--r--source/gameengine/Converter/BL_ArmatureObject.h2
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp12
-rw-r--r--source/gameengine/Converter/BL_DeformableGameObject.cpp4
-rw-r--r--source/gameengine/Converter/BL_DeformableGameObject.h2
-rw-r--r--source/gameengine/Converter/BL_MeshDeformer.cpp4
-rw-r--r--source/gameengine/Converter/BL_MeshDeformer.h2
-rw-r--r--source/gameengine/Converter/BL_ModifierDeformer.cpp16
-rw-r--r--source/gameengine/Converter/BL_ModifierDeformer.h3
-rw-r--r--source/gameengine/Converter/BL_ShapeActionActuator.cpp4
-rw-r--r--source/gameengine/Converter/BL_ShapeDeformer.h2
-rw-r--r--source/gameengine/Converter/BL_SkinDeformer.h2
-rw-r--r--source/gameengine/Converter/BlenderWorldInfo.cpp4
-rw-r--r--source/gameengine/Converter/BlenderWorldInfo.h2
-rw-r--r--source/gameengine/Converter/CMakeLists.txt1
-rw-r--r--source/gameengine/Converter/KX_BlenderScalarInterpolator.h4
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.cpp12
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.h2
-rw-r--r--source/gameengine/Converter/KX_ConvertControllers.cpp12
-rw-r--r--source/gameengine/Converter/KX_ConvertProperties.cpp4
-rw-r--r--source/gameengine/Converter/KX_ConvertSensors.cpp14
-rw-r--r--source/gameengine/Converter/KX_IpoConvert.cpp6
-rw-r--r--source/gameengine/Converter/KX_SoftBodyDeformer.h2
-rw-r--r--source/gameengine/Converter/Makefile2
-rw-r--r--source/gameengine/Expressions/BoolValue.cpp4
-rw-r--r--source/gameengine/Expressions/BoolValue.h2
-rw-r--r--source/gameengine/Expressions/CMakeLists.txt1
-rw-r--r--source/gameengine/Expressions/ConstExpr.cpp4
-rw-r--r--source/gameengine/Expressions/ConstExpr.h2
-rw-r--r--source/gameengine/Expressions/EXP_C-Api.cpp4
-rw-r--r--source/gameengine/Expressions/EmptyValue.cpp4
-rw-r--r--source/gameengine/Expressions/EmptyValue.h2
-rw-r--r--source/gameengine/Expressions/ErrorValue.cpp4
-rw-r--r--source/gameengine/Expressions/ErrorValue.h2
-rw-r--r--source/gameengine/Expressions/Expression.cpp4
-rw-r--r--source/gameengine/Expressions/Expression.h4
-rw-r--r--source/gameengine/Expressions/FloatValue.cpp4
-rw-r--r--source/gameengine/Expressions/FloatValue.h2
-rw-r--r--source/gameengine/Expressions/IdentifierExpr.cpp4
-rw-r--r--source/gameengine/Expressions/IdentifierExpr.h2
-rw-r--r--source/gameengine/Expressions/IfExpr.cpp4
-rw-r--r--source/gameengine/Expressions/IfExpr.h2
-rw-r--r--source/gameengine/Expressions/InputParser.cpp4
-rw-r--r--source/gameengine/Expressions/InputParser.h2
-rw-r--r--source/gameengine/Expressions/IntValue.cpp4
-rw-r--r--source/gameengine/Expressions/IntValue.h2
-rw-r--r--source/gameengine/Expressions/KX_HashedPtr.cpp4
-rw-r--r--source/gameengine/Expressions/KX_HashedPtr.h2
-rw-r--r--source/gameengine/Expressions/ListValue.cpp10
-rw-r--r--source/gameengine/Expressions/Makefile2
-rw-r--r--source/gameengine/Expressions/Operator1Expr.cpp4
-rw-r--r--source/gameengine/Expressions/Operator1Expr.h2
-rw-r--r--source/gameengine/Expressions/Operator2Expr.cpp4
-rw-r--r--source/gameengine/Expressions/Operator2Expr.h2
-rw-r--r--source/gameengine/Expressions/PyObjectPlus.cpp8
-rw-r--r--source/gameengine/Expressions/PyObjectPlus.h18
-rw-r--r--source/gameengine/Expressions/StringValue.cpp4
-rw-r--r--source/gameengine/Expressions/StringValue.h2
-rw-r--r--source/gameengine/Expressions/Value.cpp4
-rw-r--r--source/gameengine/Expressions/Value.h4
-rw-r--r--source/gameengine/Expressions/VectorValue.cpp4
-rw-r--r--source/gameengine/Expressions/VectorValue.h2
-rw-r--r--source/gameengine/Expressions/VoidValue.h2
-rw-r--r--source/gameengine/GameLogic/CMakeLists.txt1
-rw-r--r--source/gameengine/GameLogic/Joystick/Makefile2
-rw-r--r--source/gameengine/GameLogic/Makefile6
-rw-r--r--source/gameengine/GameLogic/SCA_2DFilterActuator.cpp3
-rw-r--r--source/gameengine/GameLogic/SCA_ANDController.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_ActuatorEventManager.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_ActuatorEventManager.h2
-rw-r--r--source/gameengine/GameLogic/SCA_ActuatorSensor.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_AlwaysEventManager.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_AlwaysEventManager.h2
-rw-r--r--source/gameengine/GameLogic/SCA_AlwaysSensor.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_BasicEventManager.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_BasicEventManager.h2
-rw-r--r--source/gameengine/GameLogic/SCA_DelaySensor.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_EventManager.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_EventManager.h2
-rw-r--r--source/gameengine/GameLogic/SCA_ExpressionController.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_ExpressionController.h2
-rw-r--r--source/gameengine/GameLogic/SCA_IActuator.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_IActuator.h2
-rw-r--r--source/gameengine/GameLogic/SCA_IController.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_IInputDevice.h11
-rw-r--r--source/gameengine/GameLogic/SCA_ILogicBrick.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_IObject.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_IScene.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_IScene.h2
-rw-r--r--source/gameengine/GameLogic/SCA_ISensor.cpp21
-rw-r--r--source/gameengine/GameLogic/SCA_ISensor.h15
-rw-r--r--source/gameengine/GameLogic/SCA_JoystickManager.cpp3
-rw-r--r--source/gameengine/GameLogic/SCA_JoystickManager.h2
-rw-r--r--source/gameengine/GameLogic/SCA_JoystickSensor.cpp5
-rw-r--r--source/gameengine/GameLogic/SCA_KeyboardManager.h2
-rw-r--r--source/gameengine/GameLogic/SCA_KeyboardSensor.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_LogicManager.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_LogicManager.h2
-rw-r--r--source/gameengine/GameLogic/SCA_MouseManager.cpp18
-rw-r--r--source/gameengine/GameLogic/SCA_MouseManager.h5
-rw-r--r--source/gameengine/GameLogic/SCA_MouseSensor.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_NANDController.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_NORController.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_ORController.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_PropertyActuator.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_PropertyEventManager.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_PropertyEventManager.h2
-rw-r--r--source/gameengine/GameLogic/SCA_PropertySensor.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_PythonController.cpp74
-rw-r--r--source/gameengine/GameLogic/SCA_PythonKeyboard.cpp104
-rw-r--r--source/gameengine/GameLogic/SCA_PythonKeyboard.h (renamed from source/blender/imbuf/intern/IMB_iff.h)34
-rw-r--r--source/gameengine/GameLogic/SCA_PythonMouse.cpp178
-rw-r--r--source/gameengine/GameLogic/SCA_PythonMouse.h53
-rw-r--r--source/gameengine/GameLogic/SCA_RandomActuator.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_RandomEventManager.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_RandomEventManager.h2
-rw-r--r--source/gameengine/GameLogic/SCA_RandomNumberGenerator.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_RandomNumberGenerator.h2
-rw-r--r--source/gameengine/GameLogic/SCA_RandomSensor.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_TimeEventManager.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_TimeEventManager.h2
-rw-r--r--source/gameengine/GameLogic/SCA_XNORController.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_XORController.cpp4
-rw-r--r--source/gameengine/GamePlayer/Makefile2
-rw-r--r--source/gameengine/GamePlayer/common/CMakeLists.txt1
-rw-r--r--source/gameengine/GamePlayer/common/GPC_Canvas.cpp10
-rw-r--r--source/gameengine/GamePlayer/common/GPC_Engine.cpp4
-rw-r--r--source/gameengine/GamePlayer/common/GPC_MouseDevice.cpp4
-rw-r--r--source/gameengine/GamePlayer/common/GPC_RawImage.cpp4
-rw-r--r--source/gameengine/GamePlayer/common/GPC_RawLoadDotBlendArray.cpp4
-rw-r--r--source/gameengine/GamePlayer/common/GPC_RawLogoArrays.cpp4
-rw-r--r--source/gameengine/GamePlayer/common/GPC_System.cpp4
-rw-r--r--source/gameengine/GamePlayer/common/Makefile2
-rw-r--r--source/gameengine/GamePlayer/common/bmfont.cpp4
-rw-r--r--source/gameengine/GamePlayer/common/unix/GPU_Canvas.cpp4
-rw-r--r--source/gameengine/GamePlayer/common/unix/GPU_Engine.cpp4
-rw-r--r--source/gameengine/GamePlayer/common/unix/GPU_Engine.h2
-rw-r--r--source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.cpp2
-rw-r--r--source/gameengine/GamePlayer/common/unix/GPU_System.cpp4
-rw-r--r--source/gameengine/GamePlayer/common/unix/Makefile2
-rw-r--r--source/gameengine/GamePlayer/common/windows/GPW_Canvas.cpp4
-rw-r--r--source/gameengine/GamePlayer/common/windows/GPW_Engine.cpp4
-rw-r--r--source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.cpp13
-rw-r--r--source/gameengine/GamePlayer/common/windows/GPW_System.cpp4
-rw-r--r--source/gameengine/GamePlayer/common/windows/Makefile2
-rw-r--r--source/gameengine/GamePlayer/ghost/CMakeLists.txt1
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_Application.cpp12
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_Canvas.cpp16
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_Canvas.h4
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_KeyboardDevice.cpp14
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_System.cpp4
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_ghost.cpp8
-rw-r--r--source/gameengine/GamePlayer/ghost/Makefile2
-rw-r--r--source/gameengine/Ketsji/BL_BlenderShader.h9
-rw-r--r--source/gameengine/Ketsji/BL_Material.h2
-rw-r--r--source/gameengine/Ketsji/BL_Shader.cpp2
-rw-r--r--source/gameengine/Ketsji/BL_Shader.h6
-rw-r--r--source/gameengine/Ketsji/BL_Texture.h2
-rw-r--r--source/gameengine/Ketsji/CMakeLists.txt1
-rw-r--r--source/gameengine/Ketsji/KXNetwork/CMakeLists.txt1
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.cpp4
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp4
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectSensor.cpp4
-rw-r--r--source/gameengine/Ketsji/KXNetwork/Makefile2
-rw-r--r--source/gameengine/Ketsji/KX_ArmatureSensor.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_BlenderMaterial.cpp43
-rw-r--r--source/gameengine/Ketsji/KX_BlenderMaterial.h14
-rw-r--r--source/gameengine/Ketsji/KX_BulletPhysicsController.h2
-rw-r--r--source/gameengine/Ketsji/KX_Camera.cpp37
-rw-r--r--source/gameengine/Ketsji/KX_Camera.h4
-rw-r--r--source/gameengine/Ketsji/KX_CameraActuator.cpp6
-rw-r--r--source/gameengine/Ketsji/KX_CameraIpoSGController.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_CameraIpoSGController.h2
-rw-r--r--source/gameengine/Ketsji/KX_ClientObjectInfo.h2
-rw-r--r--source/gameengine/Ketsji/KX_ConstraintActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_ConstraintWrapper.cpp12
-rw-r--r--source/gameengine/Ketsji/KX_ConstraintWrapper.h2
-rw-r--r--source/gameengine/Ketsji/KX_Dome.cpp2
-rw-r--r--source/gameengine/Ketsji/KX_Dome.h2
-rw-r--r--source/gameengine/Ketsji/KX_EmptyObject.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_EmptyObject.h2
-rw-r--r--source/gameengine/Ketsji/KX_GameActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.cpp98
-rw-r--r--source/gameengine/Ketsji/KX_IInterpolator.h2
-rw-r--r--source/gameengine/Ketsji/KX_IPO_SGController.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_IPO_SGController.h2
-rw-r--r--source/gameengine/Ketsji/KX_IPhysicsController.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_IPhysicsController.h2
-rw-r--r--source/gameengine/Ketsji/KX_IScalarInterpolator.h2
-rw-r--r--source/gameengine/Ketsji/KX_ISceneConverter.h2
-rw-r--r--source/gameengine/Ketsji/KX_ISystem.h2
-rw-r--r--source/gameengine/Ketsji/KX_IpoActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.cpp46
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.h5
-rw-r--r--source/gameengine/Ketsji/KX_Light.cpp13
-rw-r--r--source/gameengine/Ketsji/KX_LightIpoSGController.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_LightIpoSGController.h2
-rw-r--r--source/gameengine/Ketsji/KX_MaterialIpoController.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_MaterialIpoController.h2
-rw-r--r--source/gameengine/Ketsji/KX_MeshProxy.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_MotionState.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_MotionState.h2
-rw-r--r--source/gameengine/Ketsji/KX_NearSensor.cpp3
-rw-r--r--source/gameengine/Ketsji/KX_ObColorIpoSGController.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_ObColorIpoSGController.h2
-rw-r--r--source/gameengine/Ketsji/KX_ObjectActuator.cpp47
-rw-r--r--source/gameengine/Ketsji/KX_OrientationInterpolator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_OrientationInterpolator.h2
-rw-r--r--source/gameengine/Ketsji/KX_ParentActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_PolyProxy.cpp165
-rw-r--r--source/gameengine/Ketsji/KX_PolyProxy.h10
-rw-r--r--source/gameengine/Ketsji/KX_PolygonMaterial.cpp8
-rw-r--r--source/gameengine/Ketsji/KX_PolygonMaterial.h1
-rw-r--r--source/gameengine/Ketsji/KX_PositionInterpolator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_PositionInterpolator.h2
-rw-r--r--source/gameengine/Ketsji/KX_PyConstraintBinding.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_PyMath.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_PyMath.h2
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.cpp145
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.h1
-rw-r--r--source/gameengine/Ketsji/KX_PythonInitTypes.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_PythonSeq.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_RadarSensor.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_RayCast.cpp2
-rw-r--r--source/gameengine/Ketsji/KX_RayCast.h4
-rw-r--r--source/gameengine/Ketsji/KX_RayEventManager.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_RayEventManager.h2
-rw-r--r--source/gameengine/Ketsji/KX_RaySensor.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.h2
-rw-r--r--source/gameengine/Ketsji/KX_SG_NodeRelationships.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_SG_NodeRelationships.h6
-rw-r--r--source/gameengine/Ketsji/KX_ScalarInterpolator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_ScalarInterpolator.h2
-rw-r--r--source/gameengine/Ketsji/KX_ScalingInterpolator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_ScalingInterpolator.h2
-rw-r--r--source/gameengine/Ketsji/KX_Scene.cpp20
-rw-r--r--source/gameengine/Ketsji/KX_Scene.h10
-rw-r--r--source/gameengine/Ketsji/KX_SceneActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_SoundActuator.cpp203
-rw-r--r--source/gameengine/Ketsji/KX_SoundActuator.h4
-rw-r--r--source/gameengine/Ketsji/KX_StateActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_TimeCategoryLogger.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_TimeCategoryLogger.h2
-rw-r--r--source/gameengine/Ketsji/KX_TimeLogger.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_TimeLogger.h2
-rw-r--r--source/gameengine/Ketsji/KX_TouchEventManager.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_TouchEventManager.h2
-rw-r--r--source/gameengine/Ketsji/KX_TouchSensor.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_TrackToActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_VehicleWrapper.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_VertexProxy.cpp458
-rw-r--r--source/gameengine/Ketsji/KX_VertexProxy.h31
-rw-r--r--source/gameengine/Ketsji/KX_VisibilityActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_WorldInfo.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_WorldInfo.h2
-rw-r--r--source/gameengine/Ketsji/KX_WorldIpoController.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_WorldIpoController.h2
-rw-r--r--source/gameengine/Ketsji/Makefile6
-rw-r--r--source/gameengine/Makefile2
-rw-r--r--source/gameengine/Network/CMakeLists.txt1
-rw-r--r--source/gameengine/Network/LoopBackNetwork/CMakeLists.txt1
-rw-r--r--source/gameengine/Network/LoopBackNetwork/Makefile2
-rw-r--r--source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.cpp9
-rw-r--r--source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h8
-rw-r--r--source/gameengine/Network/Makefile2
-rw-r--r--source/gameengine/Network/NG_NetworkDeviceInterface.h8
-rw-r--r--source/gameengine/Network/NG_NetworkMessage.cpp4
-rw-r--r--source/gameengine/Network/NG_NetworkMessage.h2
-rw-r--r--source/gameengine/Network/NG_NetworkObject.cpp4
-rw-r--r--source/gameengine/Network/NG_NetworkObject.h2
-rw-r--r--source/gameengine/Network/NG_NetworkScene.cpp6
-rw-r--r--source/gameengine/Network/NG_NetworkScene.h2
-rw-r--r--source/gameengine/Network/TerraplayNetwork/Makefile2
-rw-r--r--source/gameengine/Network/TerraplayNetwork/NG_TerraplayNetworkDeviceInterface.cpp4
-rw-r--r--source/gameengine/Network/TerraplayNetwork/NG_TerraplayNetworkDeviceInterface.h2
-rw-r--r--source/gameengine/Physics/Bullet/CMakeLists.txt1
-rw-r--r--source/gameengine/Physics/Bullet/CcdGraphicController.h2
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.cpp2
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.h6
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h2
-rw-r--r--source/gameengine/Physics/Bullet/Makefile2
-rw-r--r--source/gameengine/Physics/Dummy/CMakeLists.txt1
-rw-r--r--source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp4
-rw-r--r--source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h2
-rw-r--r--source/gameengine/Physics/Dummy/Makefile2
-rw-r--r--source/gameengine/Physics/Makefile2
-rw-r--r--source/gameengine/Physics/common/CMakeLists.txt1
-rw-r--r--source/gameengine/Physics/common/Makefile2
-rw-r--r--source/gameengine/Physics/common/PHY_IController.cpp4
-rw-r--r--source/gameengine/Physics/common/PHY_IController.h2
-rw-r--r--source/gameengine/Physics/common/PHY_IGraphicController.cpp4
-rw-r--r--source/gameengine/Physics/common/PHY_IGraphicController.h2
-rw-r--r--source/gameengine/Physics/common/PHY_IMotionState.cpp4
-rw-r--r--source/gameengine/Physics/common/PHY_IMotionState.h2
-rw-r--r--source/gameengine/Physics/common/PHY_IPhysicsController.cpp4
-rw-r--r--source/gameengine/Physics/common/PHY_IPhysicsController.h2
-rw-r--r--source/gameengine/Physics/common/PHY_IPhysicsEnvironment.cpp4
-rw-r--r--source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h4
-rw-r--r--source/gameengine/Physics/common/PHY_IVehicle.h2
-rw-r--r--source/gameengine/PyDoc/API_intro.py2
-rw-r--r--source/gameengine/PyDoc/GameKeys.py174
-rw-r--r--source/gameengine/PyDoc/GameLogic.py515
-rw-r--r--source/gameengine/PyDoc/GameTypes.py6147
-rw-r--r--source/gameengine/PyDoc/PhysicsConstraints.py326
-rw-r--r--source/gameengine/PyDoc/Rasterizer.py221
-rw-r--r--source/gameengine/PyDoc/SConscript34
-rw-r--r--source/gameengine/PyDoc/VideoTexture.py54
-rw-r--r--source/gameengine/PyDoc/bge.events.rst229
-rw-r--r--source/gameengine/PyDoc/bge.logic.rst930
-rw-r--r--source/gameengine/PyDoc/bge.render.rst242
-rw-r--r--source/gameengine/PyDoc/bge.types.rst5202
-rw-r--r--source/gameengine/Rasterizer/CMakeLists.txt1
-rw-r--r--source/gameengine/Rasterizer/Makefile6
-rw-r--r--source/gameengine/Rasterizer/RAS_2DFilterManager.cpp4
-rw-r--r--source/gameengine/Rasterizer/RAS_2DFilterManager.h2
-rw-r--r--source/gameengine/Rasterizer/RAS_BucketManager.cpp10
-rw-r--r--source/gameengine/Rasterizer/RAS_BucketManager.h4
-rw-r--r--source/gameengine/Rasterizer/RAS_Deformer.h2
-rw-r--r--source/gameengine/Rasterizer/RAS_FramingManager.cpp4
-rw-r--r--source/gameengine/Rasterizer/RAS_FramingManager.h4
-rw-r--r--source/gameengine/Rasterizer/RAS_ICanvas.h31
-rw-r--r--source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp4
-rw-r--r--source/gameengine/Rasterizer/RAS_IPolygonMaterial.h2
-rw-r--r--source/gameengine/Rasterizer/RAS_IRasterizer.h2
-rw-r--r--source/gameengine/Rasterizer/RAS_IRenderTools.h2
-rw-r--r--source/gameengine/Rasterizer/RAS_MaterialBucket.h6
-rw-r--r--source/gameengine/Rasterizer/RAS_MeshObject.h2
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt1
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/Makefile6
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h2
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h2
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp8
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h2
-rw-r--r--source/gameengine/Rasterizer/RAS_Polygon.h2
-rw-r--r--source/gameengine/Rasterizer/RAS_Rect.h2
-rw-r--r--source/gameengine/Rasterizer/RAS_TexVert.h2
-rw-r--r--source/gameengine/Rasterizer/RAS_texmatrix.cpp4
-rw-r--r--source/gameengine/SceneGraph/CMakeLists.txt1
-rw-r--r--source/gameengine/SceneGraph/Makefile2
-rw-r--r--source/gameengine/SceneGraph/SG_BBox.h2
-rw-r--r--source/gameengine/SceneGraph/SG_Controller.cpp4
-rw-r--r--source/gameengine/SceneGraph/SG_Controller.h2
-rw-r--r--source/gameengine/SceneGraph/SG_DList.h2
-rw-r--r--source/gameengine/SceneGraph/SG_IObject.cpp4
-rw-r--r--source/gameengine/SceneGraph/SG_IObject.h2
-rw-r--r--source/gameengine/SceneGraph/SG_Node.cpp4
-rw-r--r--source/gameengine/SceneGraph/SG_Node.h2
-rw-r--r--source/gameengine/SceneGraph/SG_ParentRelation.h2
-rw-r--r--source/gameengine/SceneGraph/SG_QList.h2
-rw-r--r--source/gameengine/SceneGraph/SG_Spatial.cpp4
-rw-r--r--source/gameengine/SceneGraph/SG_Spatial.h2
-rw-r--r--source/gameengine/SceneGraph/SG_Tree.h4
-rw-r--r--source/gameengine/VideoTexture/CMakeLists.txt1
-rw-r--r--source/gameengine/VideoTexture/ImageBase.cpp4
-rw-r--r--source/gameengine/VideoTexture/ImageBuff.cpp2
-rw-r--r--source/gameengine/VideoTexture/Makefile2
-rw-r--r--source/gameengine/VideoTexture/VideoFFmpeg.cpp3
-rw-r--r--source/gameengine/VideoTexture/blendVideoTex.cpp2
-rw-r--r--source/icons/Makefile2
-rw-r--r--source/kernel/CMakeLists.txt1
-rw-r--r--source/kernel/Makefile2
-rw-r--r--source/kernel/gen_messaging/Makefile2
-rw-r--r--source/kernel/gen_messaging/intern/Makefile2
-rw-r--r--source/kernel/gen_messaging/intern/messaging.c4
-rw-r--r--source/kernel/gen_system/GEN_HashedPtr.cpp4
-rw-r--r--source/kernel/gen_system/GEN_Matrix4x4.cpp4
-rw-r--r--source/kernel/gen_system/Makefile2
-rw-r--r--source/kernel/gen_system/SYS_SingletonSystem.cpp4
-rw-r--r--source/kernel/gen_system/SYS_System.cpp4
1996 files changed, 136313 insertions, 92733 deletions
diff --git a/CMake/macros.cmake b/CMake/macros.cmake
deleted file mode 100644
index 0accf960cff..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_OPENCOLLADA)
- LINK_DIRECTORIES(${OPENCOLLADA_LIBPATH})
- LINK_DIRECTORIES(${PCRE_LIBPATH})
- LINK_DIRECTORIES(${EXPAT_LIBPATH})
- ENDIF(WITH_OPENCOLLADA)
- 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(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 ba344a0a434..608b881a281 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,111 @@ 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)
+
+GET_BLENDER_VERSION()
+
+# Blender internal features
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_LCMS "Enable color correction with lcms" 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
+OPTION(WITH_FLUID "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_IMAGE_OPENEXR "Enable OpenEXR Support (http://www.openexr.com)" ON)
+OPTION(WITH_IMAGE_OPENJPEG "Enable OpenJpeg Support (http://www.openjpeg.org/)" OFF)
+OPTION(WITH_IMAGE_TIFF "Enable LibTIFF Support" ON)
+OPTION(WITH_IMAGE_DDS "Enable DDS Image Support" ON)
+OPTION(WITH_IMAGE_CINEON "Enable CINEON and DPX Image Support" ON)
+OPTION(WITH_IMAGE_HDR "Enable HDR Image 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)
+OPTION(WITH_PYTHON_INSTALL "Copy system python into the blender install folder" 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)
+IF(NOT WITH_INSTALL AND WITH_PYTHON_INSTALL)
+ MESSAGE("WARNING: WITH_PYTHON_INSTALL needs WITH_INSTALL")
+ENDIF(NOT WITH_INSTALL AND WITH_PYTHON_INSTALL)
+
+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 +176,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,24 +222,53 @@ IF(UNIX AND NOT APPLE)
ENDIF(NOT SDL_FOUND)
ENDIF(WITH_SDL)
- 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)
-
- 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)
-
+ IF(WITH_IMAGE_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_IMAGE_OPENEXR OFF)
+ ENDIF(NOT OPENEXR_INC)
+ ENDIF(WITH_IMAGE_OPENEXR)
+
+ IF(WITH_IMAGE_TIFF)
+ FIND_PACKAGE(TIFF)
+ IF(NOT TIFF_FOUND)
+ SET(WITH_IMAGE_TIFF OFF)
+ ENDIF(NOT TIFF_FOUND)
+ ENDIF(WITH_IMAGE_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)
+
IF(WITH_FFTW3)
SET(FFTW3 /usr)
SET(FFTW3_INC ${FFTW3}/include)
@@ -211,12 +281,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)
@@ -230,13 +294,17 @@ IF(UNIX AND NOT APPLE)
SET(EXPAT_LIB expat)
ENDIF (WITH_OPENCOLLADA)
+ FIND_PACKAGE(X11 REQUIRED)
- # Could use ${X11_Xinput_LIB} ${X11_X11_LIB} too
- SET(LLIBS "-lXi -lutil -lc -lm -lpthread -lstdc++ -lX11")
+ SET(LLIBS "-lutil -lc -lm -lpthread -lstdc++ ${X11_X11_LIB} ${X11_Xinput_LIB}")
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)
@@ -257,6 +325,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
@@ -269,133 +338,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)
@@ -404,30 +361,277 @@ 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_IMAGE_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_IMAGE_OPENEXR)
+
+ IF(WITH_IMAGE_TIFF)
+ SET(TIFF ${LIBDIR}/tiff)
+ SET(TIFF_LIBRARY libtiff)
+ SET(TIFF_INCLUDE_DIR ${TIFF}/include)
+ SET(TIFF_LIBPATH ${TIFF}/lib)
+ ENDIF(WITH_IMAGE_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_IMAGE_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_IMAGE_OPENEXR)
+
+ IF(WITH_IMAGE_TIFF)
+ SET(TIFF ${LIBDIR}/gcc/tiff)
+ SET(TIFF_LIBRARY tiff)
+ SET(TIFF_INCLUDE_DIR ${TIFF}/include)
+ SET(TIFF_LIBPATH ${TIFF}/lib)
+ ENDIF(WITH_IMAGE_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)
+
+ 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)
@@ -474,12 +678,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 "")
@@ -487,10 +691,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)
@@ -511,15 +717,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)
-
- 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_IMAGE_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_IMAGE_OPENEXR)
+
+ 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)
@@ -567,10 +785,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")
@@ -580,8 +800,12 @@ IF(APPLE)
SET(JPEG_INC "${JPEG}/include")
SET(JPEG_LIBPATH ${JPEG}/lib)
- SET(TIFF ${LIBDIR}/tiff)
- SET(TIFF_INC ${TIFF}/include)
+ IF(WITH_IMAGE_TIFF)
+ SET(TIFF ${LIBDIR}/tiff)
+ SET(TIFF_INCLUDE_DIR ${TIFF}/include)
+ SET(TIFF_LIBRARY tiff)
+ SET(TIFF_LIBPATH ${TIFF}/lib)
+ ENDIF(WITH_IMAGE_TIFF)
SET(EXETYPE MACOSX_BUNDLE)
@@ -604,11 +828,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)
@@ -631,13 +850,31 @@ IF(WITH_BUILDINFO)
ENDIF(BUILD_REV_RETURN)
ENDIF(WIN32)
ENDIF(WITH_BUILDINFO)
-
#-----------------------------------------------------------------------------
# Common.
-set(OPENJPEG ${CMAKE_SOURCE_DIR}/extern/libopenjpeg)
-set(OPENJPEG_INC ${OPENJPEG})
-set(OPENJPEG_LIb extern_libopenjpeg)
+IF(WITH_RAYOPTIMIZATION)
+ IF(CMAKE_COMPILER_IS_GNUCC)
+ IF(SUPPORT_SSE_BUILD)
+ SET(PLATFORM_CFLAGS " -msse ${PLATFORM_CFLAGS}")
+ ADD_DEFINITIONS(-D__SSE__)
+ ADD_DEFINITIONS(-D__MMX__)
+ ENDIF(SUPPORT_SSE_BUILD)
+ IF(SUPPORT_SSE2_BUILD)
+ SET(PLATFORM_CFLAGS " -msse2 ${PLATFORM_CFLAGS}")
+ ADD_DEFINITIONS(-D__SSE2__)
+ IF(NOT SUPPORT_SSE_BUILD) # dont double up
+ ADD_DEFINITIONS(-D__MMX__)
+ ENDIF(NOT SUPPORT_SSE_BUILD)
+ ENDIF(SUPPORT_SSE2_BUILD)
+ ENDIF(CMAKE_COMPILER_IS_GNUCC)
+ENDIF(WITH_RAYOPTIMIZATION)
+
+IF(WITH_IMAGE_OPENJPEG)
+ set(OPENJPEG ${CMAKE_SOURCE_DIR}/extern/libopenjpeg)
+ set(OPENJPEG_INC ${OPENJPEG})
+ set(OPENJPEG_LIb extern_openjpeg)
+ENDIF(WITH_IMAGE_OPENJPEG)
#-----------------------------------------------------------------------------
# Blender WebPlugin
diff --git a/Makefile b/Makefile
index 7c883c41741..d92edf2c02c 100644
--- a/Makefile
+++ b/Makefile
@@ -41,16 +41,16 @@ 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)
- DIRS ?= dlltool extern intern source po
+ DIRS ?= $(NANBLENDERHOME)/build_files/make/dlltool extern intern source po
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/SConstruct b/SConstruct
index 30d8788f040..811298cc851 100644
--- a/SConstruct
+++ b/SConstruct
@@ -46,15 +46,22 @@ import glob
import re
from tempfile import mkdtemp
-import tools.Blender
-import tools.btools
-import tools.bcolors
+# store path to tools
+toolpath=os.path.join(".", "build_files", "scons", "tools")
+
+# needed for importing tools
+sys.path.append(toolpath)
+
+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
@@ -117,7 +124,7 @@ if toolset:
print "Using " + toolset
if toolset=='mstoolkit':
env = BlenderEnvironment(ENV = os.environ)
- env.Tool('mstoolkit', ['tools'])
+ env.Tool('mstoolkit', [toolpath])
else:
env = BlenderEnvironment(tools=[toolset], ENV = os.environ)
# xxx commented out, as was supressing warnings under mingw..
@@ -157,7 +164,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
@@ -166,7 +173,7 @@ else:
if crossbuild and env['PLATFORM'] != 'win32':
print B.bc.HEADER+"Preparing for crossbuild"+B.bc.ENDC
- env.Tool('crossmingw', ['tools'])
+ env.Tool('crossmingw', [toolpath])
# todo: determine proper libs/includes etc.
# Needed for gui programs, console programs should do without it
@@ -182,7 +189,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 +200,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,15 +208,38 @@ 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
-# because the blender binary is installed in $BF_INSTALLDIR/bin/blender
+if 'blenderlite' in B.targets:
+ target_env_defs = {}
+ 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
+ target_env_defs['WITH_BF_FFMPEG'] = False
+ target_env_defs['WITH_BF_QUICKTIME'] = False
+ target_env_defs['WITH_BF_REDCODE'] = False
+ target_env_defs['WITH_BF_DDS'] = False
+ target_env_defs['WITH_BF_CINEON'] = False
+ target_env_defs['WITH_BF_HDR'] = False
+ target_env_defs['WITH_BF_ZLIB'] = False
+ target_env_defs['WITH_BF_SDL'] = False
+ target_env_defs['WITH_BF_JPEG'] = False
+ target_env_defs['WITH_BF_PNG'] = False
+ target_env_defs['WITH_BF_BULLET'] = False
+ target_env_defs['WITH_BF_BINRELOC'] = False
+ target_env_defs['BF_BUILDINFO'] = False
+ target_env_defs['BF_NO_ELBEEM'] = True
+ target_env_defs['WITH_BF_PYTHON'] = False
+
+ # Merge blenderlite, let command line to override
+ for k,v in target_env_defs.iteritems():
+ if k not in B.arguments:
+ env[k] = v
-if env['WITH_BF_FHS']:
- BLENDERPATH = os.path.join(env['BF_INSTALLDIR'], 'share', 'blender', env['BF_VERSION'])
-else:
- BLENDERPATH = env['BF_INSTALLDIR']
if env['WITH_BF_OPENMP'] == 1:
if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
@@ -263,33 +293,6 @@ if 'blenderplayer' in B.targets:
if 'blendernogame' in B.targets:
env['WITH_BF_GAMEENGINE'] = False
-if 'blenderlite' in B.targets:
- target_env_defs = {}
- 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_ICONV'] = False
- target_env_defs['WITH_BF_INTERNATIONAL'] = False
- target_env_defs['WITH_BF_OPENJPEG'] = False
- target_env_defs['WITH_BF_FFMPEG'] = False
- target_env_defs['WITH_BF_QUICKTIME'] = False
- target_env_defs['WITH_BF_REDCODE'] = False
- target_env_defs['WITH_BF_DDS'] = False
- target_env_defs['WITH_BF_ZLIB'] = False
- target_env_defs['WITH_BF_SDL'] = False
- target_env_defs['WITH_BF_JPEG'] = False
- target_env_defs['WITH_BF_PNG'] = False
- target_env_defs['WITH_BF_BULLET'] = False
- target_env_defs['WITH_BF_BINRELOC'] = False
- target_env_defs['BF_BUILDINFO'] = False
- target_env_defs['BF_NO_ELBEEM'] = True
- target_env_defs['WITH_BF_PYTHON'] = False
-
- # Merge blenderlite, let command line to override
- for k,v in target_env_defs.iteritems():
- if k not in B.arguments:
- env[k] = v
-
# disable elbeem (fluidsim) compilation?
if env['BF_NO_ELBEEM'] == 1:
env['CPPFLAGS'].append('-DDISABLE_ELBEEM')
@@ -302,7 +305,7 @@ if env['WITH_BF_SDL'] == False and env['OURPLATFORM'] in ('win32-vc', 'win32-min
# lastly we check for root_build_dir ( we should not do before, otherwise we might do wrong builddir
B.root_build_dir = env['BF_BUILDDIR']
-B.doc_build_dir = os.path.join(BLENDERPATH, 'doc')
+B.doc_build_dir = os.path.join(env['BF_INSTALLDIR'], 'doc')
if not B.root_build_dir[-1]==os.sep:
B.root_build_dir += os.sep
if not B.doc_build_dir[-1]==os.sep:
@@ -357,8 +360,9 @@ if not os.path.isdir ( B.root_build_dir):
os.makedirs ( B.root_build_dir + 'extern' )
os.makedirs ( B.root_build_dir + 'lib' )
os.makedirs ( B.root_build_dir + 'bin' )
-if not os.path.isdir(B.doc_build_dir) and env['WITH_BF_DOCS']:
- os.makedirs ( B.doc_build_dir )
+# # Docs not working with epy anymore
+# if not os.path.isdir(B.doc_build_dir) and env['WITH_BF_DOCS']:
+# os.makedirs ( B.doc_build_dir )
Help(opts.GenerateHelpText(env))
@@ -402,12 +406,12 @@ 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", mainlist + thestatlibs + dobj, 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')
playerlist += B.create_blender_liblist(env, 'extern')
- env.BlenderProg(B.root_build_dir, "blenderplayer", dobj + playerlist, [], thestatlibs + thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blenderplayer')
+ env.BlenderProg(B.root_build_dir, "blenderplayer", playerlist, thestatlibs + dobj + thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blenderplayer')
##### Now define some targets
@@ -423,18 +427,19 @@ if env['OURPLATFORM']=='darwin':
for dp, dn, df in os.walk(bundle):
if '.svn' in dn:
dn.remove('.svn')
+ if '_svn' in dn:
+ dn.remove('_svn')
dir=env['BF_INSTALLDIR']+dp[len(bundledir):]
source=[dp+os.sep+f for f in df]
blenderinstall.append(env.Install(dir=dir,source=source))
else:
- if env['WITH_BF_FHS']: dir= os.path.join(env['BF_INSTALLDIR'], 'bin')
- else: dir= env['BF_INSTALLDIR']
-
- blenderinstall = env.Install(dir=dir, source=B.program_list)
+ blenderinstall = env.Install(dir=env['BF_INSTALLDIR'], 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 = []
@@ -442,6 +447,8 @@ if env['OURPLATFORM']!='darwin':
for dp, dn, df in os.walk('bin/.blender'):
if '.svn' in dn:
dn.remove('.svn')
+ if '_svn' in dn:
+ dn.remove('_svn')
for f in df:
if not env['WITH_BF_INTERNATIONAL']:
@@ -453,30 +460,35 @@ 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))
+ dir= os.path.join(*([env['BF_INSTALLDIR']] + [VERSION] + ['datafiles'] + dp.split(os.sep)[1:])) # skip bin
+ datafilestargetlist.append(dir + os.sep + f)
+ else:
+ dotblendlist.append(os.path.join(dp, f))
+ dir= os.path.join(*([env['BF_INSTALLDIR']] + [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):
if '.svn' in dn:
dn.remove('.svn')
+ if '_svn' in dn:
+ dn.remove('_svn')
- if env['WITH_BF_FHS']: dir = BLENDERPATH
- else: dir = os.path.join(env['BF_INSTALLDIR'], '.blender')
+ 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']
@@ -490,9 +502,11 @@ if env['OURPLATFORM']=='linux2':
for tp, tn, tf in os.walk('release/freedesktop/icons'):
if '.svn' in tn:
tn.remove('.svn')
+ if '_svn' in tn:
+ tn.remove('_svn')
for f in tf:
iconlist.append(os.path.join(tp, f))
- icontargetlist.append( os.path.join(*([BLENDERPATH] + tp.split(os.sep)[2:] + [f])) )
+ icontargetlist.append( os.path.join(*([env['BF_INSTALLDIR']] + tp.split(os.sep)[2:] + [f])) )
iconinstall = []
for targetdir,srcfile in zip(icontargetlist, iconlist):
@@ -516,27 +530,29 @@ plugtargetlist = []
for tp, tn, tf in os.walk('release/plugins'):
if '.svn' in tn:
tn.remove('.svn')
+ if '_svn' in tn:
+ tn.remove('_svn')
df = tp[8:] # remove 'release/'
for f in tf:
pluglist.append(os.path.join(tp, f))
- plugtargetlist.append( os.path.join(BLENDERPATH, df, f) )
+ plugtargetlist.append( os.path.join(env['BF_INSTALLDIR'], df, f) )
# header files for plugins
pluglist.append('source/blender/blenpluginapi/documentation.h')
-plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'documentation.h'))
+plugtargetlist.append(os.path.join(env['BF_INSTALLDIR'], 'plugins', 'include', 'documentation.h'))
pluglist.append('source/blender/blenpluginapi/externdef.h')
-plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'externdef.h'))
+plugtargetlist.append(os.path.join(env['BF_INSTALLDIR'], 'plugins', 'include', 'externdef.h'))
pluglist.append('source/blender/blenpluginapi/floatpatch.h')
-plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'floatpatch.h'))
+plugtargetlist.append(os.path.join(env['BF_INSTALLDIR'], 'plugins', 'include', 'floatpatch.h'))
pluglist.append('source/blender/blenpluginapi/iff.h')
-plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'iff.h'))
+plugtargetlist.append(os.path.join(env['BF_INSTALLDIR'], 'plugins', 'include', 'iff.h'))
pluglist.append('source/blender/blenpluginapi/plugin.h')
-plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'plugin.h'))
+plugtargetlist.append(os.path.join(env['BF_INSTALLDIR'], 'plugins', 'include', 'plugin.h'))
pluglist.append('source/blender/blenpluginapi/util.h')
-plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'util.h'))
+plugtargetlist.append(os.path.join(env['BF_INSTALLDIR'], 'plugins', 'include', 'util.h'))
pluglist.append('source/blender/blenpluginapi/plugin.DEF')
-plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'plugin.def'))
+plugtargetlist.append(os.path.join(env['BF_INSTALLDIR'], 'plugins', 'include', 'plugin.def'))
plugininstall = []
for targetdir,srcfile in zip(plugtargetlist, pluglist):
@@ -548,10 +564,12 @@ texttargetlist = []
for tp, tn, tf in os.walk('release/text'):
if '.svn' in tn:
tn.remove('.svn')
+ if '_svn' in tn:
+ tn.remove('_svn')
for f in tf:
textlist.append(tp+os.sep+f)
-textinstall = env.Install(dir=BLENDERPATH, source=textlist)
+textinstall = env.Install(dir=env['BF_INSTALLDIR'], source=textlist)
if env['OURPLATFORM']=='darwin':
allinstall = [blenderinstall, plugininstall, textinstall]
@@ -569,10 +587,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
@@ -610,9 +630,6 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'win64-vc', 'linuxcross'):
'${BF_FFMPEG_LIBPATH}/avdevice-52.dll',
'${BF_FFMPEG_LIBPATH}/avutil-50.dll',
'${BF_FFMPEG_LIBPATH}/swscale-0.dll']
-
- if env['WITH_BF_JACK']:
- dllsources += ['${LCGDIR}/jack/lib/libjack.dll']
windlls = env.Install(dir=env['BF_INSTALLDIR'], source = dllsources)
allinstall += windlls
@@ -645,17 +662,3 @@ Default(B.program_list)
if not env['WITHOUT_BF_INSTALL']:
Default(installtarget)
-
-#------------ EPYDOC
-if env['WITH_BF_DOCS']:
- try:
- import epydoc
- except ImportError:
- epydoc = None
-
- if epydoc:
- SConscript('source/gameengine/PyDoc/SConscript')
- else:
- print "No epydoc install detected, Python API and Gameengine API Docs will not be generated "
-
-
diff --git a/build_files/cmake/example_scripts/cmake_linux_install.sh b/build_files/cmake/example_scripts/cmake_linux_install.sh
new file mode 100755
index 00000000000..7770efcf392
--- /dev/null
+++ b/build_files/cmake/example_scripts/cmake_linux_install.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+# This shell script checks out and compiles blender, tested on ubuntu 10.04
+# assumes you have dependancies installed alredy
+
+# See this page for more info:
+# http://wiki.blender.org/index.php/Dev:2.5/Doc/Building_Blender/Linux/Generic_Distro/CMake
+
+# grab blender
+mkdir ~/blender-svn
+cd ~/blender-svn
+svn co https://svn.blender.org/svnroot/bf-blender/trunk/blender
+
+# create cmake dir
+mkdir ~/blender-svn/build-cmake
+cd ~/blender-svn/build-cmake
+
+# cmake without copying files for fast rebuilds
+# the files from svn will be used in place
+cmake ../blender -DWITH_INSTALL:BOOL=FALSE
+
+# make blender, will take some time
+make
+
+# link the binary to blenders source directory to run quickly
+ln -s ~/blender-svn/build-cmake/bin/blender ~/blender-svn/blender/blender.bin
+
+# useful info
+echo ""
+echo "* Useful Commands *"
+echo " Run Blender: ~/blender-svn/blender/blender.bin"
+echo " Update Blender: svn up ~/blender-svn/blender"
+echo " Reconfigure Blender: cd ~/blender-svn/build-cmake ; cmake ."
+echo " Build Blender: cd ~/blender-svn/build-cmake ; make"
+echo ""
+
+
diff --git a/build_files/cmake/example_scripts/make_quicky.py b/build_files/cmake/example_scripts/make_quicky.py
new file mode 100755
index 00000000000..69f7604c8cc
--- /dev/null
+++ b/build_files/cmake/example_scripts/make_quicky.py
@@ -0,0 +1,119 @@
+#! /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.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+def print_help(targets):
+ print("CMake quicky wrapper, no valid targets given.")
+ print(" * targets can contain a subset of the full target name.")
+ print(" * arguments with a '-' prefix are passed onto make.")
+ print(" * this must run from the cmake build dir")
+ print(" * alias this with a short command for speedy access, in bash:")
+ print(" alias mk='../blender/build_files/cmake/example_scripts/make_quicky.py'")
+ print("")
+ print(" eg: make_quicky.py -j3 extern python")
+ print(" ...will execute")
+ print(" make -j3 extern_binreloc extern_glew bf_python bf_python_ext blender/fast")
+ print("")
+ print("Target List:")
+ for t in targets:
+ print(" %s" % t)
+ print("...exiting")
+
+
+def main():
+ targets = set()
+
+ # collect targets
+ file = open("Makefile", "r")
+ for line in file:
+ line = line.rstrip()
+ if not line or line[0] in ". \t@$#":
+ continue
+
+ line = line.split("#", 1)[0]
+ if ":" not in line:
+ continue
+
+ line = line.split(":", 1)[0]
+
+ if "/" in line: # cmake terget options, dont need these
+ continue
+
+ targets.add(line)
+ file.close()
+
+
+ # remove cmake targets
+ bad = set([
+ "help",
+ "clean",
+ "all",
+ "preinstall",
+ "install",
+ "default_target",
+ "edit_cache",
+ "cmake_force",
+ "rebuild_cache",
+ "depend",
+ "cmake_check_build_system",
+ ])
+
+ targets -= set(bad)
+
+
+ # parse args
+ targets = list(targets)
+ targets.sort()
+
+ import sys
+ if len(sys.argv) == 1:
+ print_help(targets)
+ return
+
+ targets_new = []
+ args = []
+ for arg in sys.argv[1:]:
+ if arg[0] in "/-":
+ args.append(arg)
+ else:
+ found = False
+ for t in targets:
+ if arg in t and t not in targets_new:
+ targets_new.append(t)
+ found = True
+
+ if not found:
+ print("Error '%s' not found in...")
+ for t in targets:
+ print(" %s" % t)
+ print("...aborting.")
+ return
+
+ # execute
+ cmd = "make %s %s blender/fast" % (" ".join(args), " ".join(targets_new))
+ print("cmake building with targets: %s" % " ".join(targets_new))
+ print("executing: %s" % cmd)
+
+ import os
+ os.system(cmd)
+
+if __name__ == "__main__":
+ main()
diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
new file mode 100644
index 00000000000..0957ace301c
--- /dev/null
+++ b/build_files/cmake/macros.cmake
@@ -0,0 +1,253 @@
+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_IMAGE_OPENEXR)
+ LINK_DIRECTORIES(${OPENEXR_LIBPATH})
+ ENDIF(WITH_IMAGE_OPENEXR)
+ IF(WITH_IMAGE_TIFF)
+ LINK_DIRECTORIES(${TIFF_LIBPATH})
+ ENDIF(WITH_IMAGE_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_IMAGE_TIFF)
+ TARGET_LINK_LIBRARIES(${target} ${TIFF_LIBRARY})
+ ENDIF(WITH_IMAGE_TIFF)
+ IF(WITH_IMAGE_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_IMAGE_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(CheckCSourceRuns)
+
+ 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") # TODO, SSE 1 ?
+ ENDIF()
+
+ CHECK_C_SOURCE_RUNS("
+ #include <xmmintrin.h>
+ int main() { __m128 v = _mm_setzero_ps(); return 0; }"
+ SUPPORT_SSE_BUILD)
+
+ CHECK_C_SOURCE_RUNS("
+ #include <emmintrin.h>
+ int main() { __m128d v = _mm_setzero_pd(); return 0; }"
+ SUPPORT_SSE2_BUILD)
+ MESSAGE(STATUS "Detecting SSE support")
+
+ IF(SUPPORT_SSE_BUILD)
+ MESSAGE(STATUS " ...SSE support found.")
+ ELSE(SUPPORT_SSE_BUILD)
+ MESSAGE(STATUS " ...SSE support missing.")
+ ENDIF(SUPPORT_SSE_BUILD)
+
+ IF(SUPPORT_SSE2_BUILD)
+ MESSAGE(STATUS " ...SSE2 support found.")
+ ELSE(SUPPORT_SSE2_BUILD)
+ MESSAGE(STATUS " ...SSE2 support missing.")
+ ENDIF(SUPPORT_SSE2_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
index c8501587e00..4107bb1820d 100644
--- a/source/nan_compile.mk
+++ b/build_files/make/nan_compile.mk
@@ -82,14 +82,13 @@ 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
-
CFLAGS += -arch $(MACOSX_ARCHITECTURE) #-isysroot $(MACOSX_SDK) -mmacosx-version-min=$(MACOSX_MIN_VERS)
CCFLAGS += -arch $(MACOSX_ARCHITECTURE) #-isysroot $(MACOSX_SDK) -mmacosx-version-min=$(MACOSX_MIN_VERS)
@@ -100,8 +99,8 @@ ifeq ($(OS),darwin)
REL_CFLAGS += -O2
REL_CCFLAGS += -O2
endif
-
- CPPFLAGS += -D_THREAD_SAFE -fpascal-strings
+
+ CPPFLAGS += -D_THREAD_SAFE
ifeq ($(WITH_COCOA), true)
CPPFLAGS += -DGHOST_COCOA
@@ -172,11 +171,14 @@ 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
+ ifeq ($(WITH_BF_RAYOPTIMIZATION), true)
+ CCFLAGS += -msse
+ endif
ifeq ($(CPU),alpha)
CFLAGS += -mieee
endif
@@ -212,7 +214,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
index a3748ae247f..d8da2189e6d 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,19 @@ ifndef CONFIG_GUESS
export BF_PCRE_LIBS ?= $(BF_PCRE)/lib/libpcre.a
endif
+ export WITH_TIFF ?= true
+ #enable raytracing optimization (currently only for i386 and x86_64)
+ ifeq ($(CPU),powerpc)
+ export WITH_BF_RAYOPTIMIZATION ?= false
+ else
+ export WITH_BF_RAYOPTIMIZATION ?= true
+ endif
+
+ export WITH_LCMS ?= false
+ export WITH_CINEON ?= true
+ export WITH_HDR ?= true
+
# Compare recreated .mo files with committed ones
export BF_VERIFY_MO_FILES ?= true
@@ -207,8 +219,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 +287,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 +382,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 +424,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 +446,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 +550,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 +560,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 +630,14 @@ ifndef CONFIG_GUESS
endif # freebsd
endif # darwin
+ # default tiff libs
+ export NAN_TIFF_LIBS ?= $(NAN_TIFF)/lib/libtiff.a
+
+ # default path to lcms, may be overidden in platform sections above or in user-def.mk
+ export BF_LCMS ?= $(LCGDIR)/lcms
+ export BF_LCMS_INC ?= $(BF_LCMS)/include
+ export BF_LCMS_LIBS ?= $(BF_LCMS)/lib/liblcms.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
index 3ab4f9710db..43fba13f45b 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,12 @@ ifeq ($(WITH_OPENCOLLADA),true)
LLIBS += $(BF_OPENCOLLADA_LIBS)
endif
+ifeq ($(WITH_TIFF),true)
+ LLIBS += $(NAN_TIFF_LIBS)
+endif
+
+ifeq ($(WITH_LCMS),true)
+ LLIBS += $(BF_LCMS_LIBS)
+endif
+
LLIBS += $(NAN_PYTHON_LIB)
diff --git a/source/nan_subdirs.mk b/build_files/make/nan_subdirs.mk
index 58200a28b67..58200a28b67 100644
--- a/source/nan_subdirs.mk
+++ b/build_files/make/nan_subdirs.mk
diff --git a/source/nan_warn.mk b/build_files/make/nan_warn.mk
index c195fb333ab..c195fb333ab 100644
--- a/source/nan_warn.mk
+++ b/build_files/make/nan_warn.mk
diff --git a/config/aix4-config.py b/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
index bac4c9ab165..1423e8fb392 100644
--- a/config/darwin-config.py
+++ b/build_files/scons/config/darwin-config.py
@@ -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/build_files/scons/config/freebsd7-config.py b/build_files/scons/config/freebsd7-config.py
new file mode 100644
index 00000000000..5678b4bda0a
--- /dev/null
+++ b/build_files/scons/config/freebsd7-config.py
@@ -0,0 +1,213 @@
+CC = 'gcc44'
+CXX = 'g++44'
+
+LCGDIR = '../lib/freebsd7'
+LIBDIR = "${LCGDIR}"
+
+BF_PYTHON = '/usr/local'
+BF_PYTHON_LIBPATH = '${BF_PYTHON}/lib'
+BF_PYTHON_VERSION = '3.1'
+WITH_BF_STATICPYTHON = False
+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_STATIC = '${BF_PYTHON}/lib/libpython${BF_PYTHON_VERSION}.a'
+
+WITH_BF_OPENAL = True
+WITH_BF_STATICOPENAL = False
+BF_OPENAL = '/usr/local'
+BF_OPENAL_INC = '${BF_OPENAL}/include'
+BF_OPENAL_LIB = 'openal'
+BF_OPENAL_LIB_STATIC = '${BF_OPENAL}/lib/libopenal.a'
+
+BF_CXX = '/usr/local'
+WITH_BF_STATICCXX = False
+BF_CXX_LIB_STATIC = '${BF_CXX}/lib/libstdc++.a'
+
+BF_LIBSAMPLERATE = '/usr/local'
+BF_LIBSAMPLERATE_INC = '${BF_LIBSAMPLERATE}/include'
+BF_LIBSAMPLERATE_LIB = 'samplerate'
+BF_LIBSAMPLERATE_LIBPATH = '${BF_LIBSAMPLERATE}/lib'
+
+WITH_BF_JACK = True
+BF_JACK = '/usr/local'
+BF_JACK_INC = '${BF_JACK}/include/jack'
+BF_JACK_LIB = 'jack'
+BF_JACK_LIBPATH = '${BF_JACK}/lib'
+
+WITH_BF_SNDFILE = True
+BF_SNDFILE = '/usr/local'
+BF_SNDFILE_INC = '${BF_SNDFILE}/include/sndfile'
+BF_SNDFILE_LIB = 'sndfile'
+BF_SNDFILE_LIBPATH = '${BF_SNDFILE}/lib'
+
+WITH_BF_SDL = True
+BF_SDL = '/usr/local' #$(shell sdl-config --prefix)
+BF_SDL_INC = '${BF_SDL}/include/SDL' #$(shell $(BF_SDL)/bin/sdl-config --cflags)
+BF_SDL_LIB = 'SDL' #BF_SDL #$(shell $(BF_SDL)/bin/sdl-config --libs) -lSDL_mixer
+
+WITH_BF_OPENEXR = True
+WITH_BF_STATICOPENEXR = False
+BF_OPENEXR = '/usr/local'
+# when compiling with your own openexr lib you might need to set...
+# BF_OPENEXR_INC = '${BF_OPENEXR}/include/OpenEXR ${BF_OPENEXR}/include'
+
+BF_OPENEXR_INC = '${BF_OPENEXR}/include/OpenEXR'
+BF_OPENEXR_LIB = 'Half IlmImf Iex Imath '
+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'
+# BF_OPENEXR_LIBPATH = '${BF_OPENEXR}/lib'
+
+WITH_BF_DDS = True
+
+WITH_BF_JPEG = True
+BF_JPEG = '/usr/local'
+BF_JPEG_INC = '${BF_JPEG}/include'
+BF_JPEG_LIB = 'jpeg'
+
+WITH_BF_PNG = True
+BF_PNG = '/usr/local'
+BF_PNG_INC = '${BF_PNG}/include'
+BF_PNG_LIB = 'png'
+
+WITH_BF_TIFF = True
+BF_TIFF = '/usr/local'
+BF_TIFF_INC = '${BF_TIFF}/include'
+BF_TIFF_LIB = 'tiff'
+
+WITH_BF_ZLIB = True
+BF_ZLIB = '/usr'
+BF_ZLIB_INC = '${BF_ZLIB}/include'
+BF_ZLIB_LIB = 'z'
+
+WITH_BF_INTERNATIONAL = True
+
+BF_GETTEXT = '/usr/local'
+BF_GETTEXT_INC = '${BF_GETTEXT}/include'
+BF_GETTEXT_LIB = 'gettextlib'
+BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib'
+
+WITH_BF_GAMEENGINE = False
+WITH_BF_PLAYER = True
+
+WITH_BF_BULLET = True
+BF_BULLET = '#extern/bullet2/src'
+BF_BULLET_INC = '${BF_BULLET}'
+BF_BULLET_LIB = 'extern_bullet'
+
+# enable freetype2 support for text objects
+BF_FREETYPE = '/usr/local'
+BF_FREETYPE_INC = '${BF_FREETYPE}/include ${BF_FREETYPE}/include/freetype2'
+BF_FREETYPE_LIB = 'freetype'
+
+### XXX Find what this actually wants; it doesn't want libquicktime.
+WITH_BF_QUICKTIME = False # -DWITH_QUICKTIME
+BF_QUICKTIME = '/usr/local'
+BF_QUICKTIME_INC = '${BF_QUICKTIME}/include'
+
+WITH_BF_ICONV = True
+BF_ICONV = LIBDIR + "/iconv"
+BF_ICONV_INC = '${BF_ICONV}/include'
+BF_ICONV_LIB = 'iconv'
+BF_ICONV_LIBPATH = '${BF_ICONV}/lib'
+
+WITH_BF_BINRELOC = True
+
+# enable ffmpeg support
+WITH_BF_FFMPEG = True # -DWITH_FFMPEG
+BF_FFMPEG = '/usr/local'
+BF_FFMPEG_LIB = 'avformat avcodec swscale avutil avdevice'
+BF_FFMPEG_INC = '${BF_FFMPEG}/include'
+BF_FFMPEG_LIBPATH='${BF_FFMPEG}/lib'
+
+# enable ogg, vorbis and theora in ffmpeg
+WITH_BF_OGG = True # -DWITH_OGG
+BF_OGG = '/usr/local'
+BF_OGG_INC = '${BF_OGG}/include'
+BF_OGG_LIB = 'ogg vorbis vorbisenc theoraenc theoradec'
+
+WITH_BF_OPENJPEG = True
+BF_OPENJPEG = '#extern/libopenjpeg'
+BF_OPENJPEG_LIB = ''
+BF_OPENJPEG_INC = '${BF_OPENJPEG}'
+BF_OPENJPEG_LIBPATH='${BF_OPENJPEG}/lib'
+
+WITH_BF_FFTW3 = True
+BF_FFTW3 = LIBDIR + '/usr/local'
+BF_FFTW3_INC = '${BF_FFTW3}/include'
+BF_FFTW3_LIB = 'fftw3'
+BF_FFTW3_LIBPATH = '${BF_FFTW3}/lib'
+
+WITH_BF_REDCODE = True
+BF_REDCODE = '#extern/libredcode'
+BF_REDCODE_LIB = ''
+# BF_REDCODE_INC = '${BF_REDCODE}/include'
+BF_REDCODE_INC = '${BF_REDCODE}/../' #C files request "libredcode/format.h" which is in "#extern/libredcode/format.h", stupid but compiles for now.
+BF_REDCODE_LIBPATH='${BF_REDCODE}/lib'
+
+# Mesa Libs should go here if your using them as well....
+WITH_BF_STATICOPENGL = False
+BF_OPENGL = '/usr/local'
+BF_OPENGL_INC = '${BF_OPENGL}/include'
+BF_OPENGL_LIB = 'GL GLU X11 Xi'
+BF_OPENGL_LIBPATH = '/usr/X11R6/lib'
+BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a'
+
+WITH_BF_COLLADA = False
+BF_COLLADA = '#source/blender/collada'
+BF_COLLADA_INC = '${BF_COLLADA}'
+BF_COLLADA_LIB = 'bf_collada'
+BF_OPENCOLLADA = '/usr'
+BF_OPENCOLLADA_INC = '${BF_OPENCOLLADA}'
+BF_OPENCOLLADA_LIB = 'OpenCOLLADAStreamWriter OpenCOLLADASaxFrameworkLoader OpenCOLLADAFramework OpenCOLLADABaseUtils GeneratedSaxParser UTF MathMLSolver pcre buffer ftoa'
+BF_OPENCOLLADA_LIBPATH = '${BF_OPENCOLLADA}/lib'
+BF_PCRE = '/usr/local'
+BF_PCRE_LIB = 'pcre'
+BF_PCRE_LIBPATH = '${BF_PCRE}/lib'
+BF_EXPAT = '/usr/local'
+BF_EXPAT_LIB = 'expat'
+BF_EXPAT_LIBPATH = '${BF_EXPAT}/lib'
+
+WITH_BF_OPENMP = True
+
+#Ray trace optimization
+WITH_BF_RAYOPTIMIZATION = True
+BF_RAYOPTIMIZATION_SSE_FLAGS = ['-msse','-pthread']
+
+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','-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
+##
+##AR = ar
+##ARFLAGS = ruv
+##ARFLAGSQUIET = ru
+##
+C_WARN = ['-Wno-char-subscripts', '-Wdeclaration-after-statement']
+CC_WARN = ['-Wall']
+CXX_WARN = ['-Wno-invalid-offsetof', '-Wno-sign-compare']
+
+
+##FIX_STUBS_WARNINGS = -Wno-unused
+
+LLIBS = ['util', 'c', 'm', 'pthread', 'stdc++']
+##LOPTS = --dynamic
+##DYNLDFLAGS = -shared $(LDFLAGS)
+
+BF_PROFILE = False
+BF_PROFILE_CCFLAGS = ['-pg','-g']
+BF_PROFILE_LINKFLAGS = ['-pg']
+
+BF_DEBUG = False
+BF_DEBUG_CCFLAGS = ['-g']
+
+BF_BUILDDIR = '../build/freebsd7'
+BF_INSTALLDIR='../install/freebsd7'
+
+#Link against pthread
+PLATFORM_LINKFLAGS = ['-pthread']
diff --git a/build_files/scons/config/freebsd8-config.py b/build_files/scons/config/freebsd8-config.py
new file mode 100644
index 00000000000..bc09e87d59f
--- /dev/null
+++ b/build_files/scons/config/freebsd8-config.py
@@ -0,0 +1,213 @@
+CC = 'gcc44'
+CXX = 'g++44'
+
+LCGDIR = '../lib/freebsd8'
+LIBDIR = "${LCGDIR}"
+
+BF_PYTHON = '/usr/local'
+BF_PYTHON_LIBPATH = '${BF_PYTHON}/lib'
+BF_PYTHON_VERSION = '3.1'
+WITH_BF_STATICPYTHON = False
+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_STATIC = '${BF_PYTHON}/lib/libpython${BF_PYTHON_VERSION}.a'
+
+WITH_BF_OPENAL = True
+WITH_BF_STATICOPENAL = False
+BF_OPENAL = '/usr/local'
+BF_OPENAL_INC = '${BF_OPENAL}/include'
+BF_OPENAL_LIB = 'openal'
+BF_OPENAL_LIB_STATIC = '${BF_OPENAL}/lib/libopenal.a'
+
+BF_CXX = '/usr/local'
+WITH_BF_STATICCXX = False
+BF_CXX_LIB_STATIC = '${BF_CXX}/lib/libstdc++.a'
+
+BF_LIBSAMPLERATE = '/usr/local'
+BF_LIBSAMPLERATE_INC = '${BF_LIBSAMPLERATE}/include'
+BF_LIBSAMPLERATE_LIB = 'samplerate'
+BF_LIBSAMPLERATE_LIBPATH = '${BF_LIBSAMPLERATE}/lib'
+
+WITH_BF_JACK = True
+BF_JACK = '/usr/local'
+BF_JACK_INC = '${BF_JACK}/include/jack'
+BF_JACK_LIB = 'jack'
+BF_JACK_LIBPATH = '${BF_JACK}/lib'
+
+WITH_BF_SNDFILE = True
+BF_SNDFILE = '/usr/local'
+BF_SNDFILE_INC = '${BF_SNDFILE}/include/sndfile'
+BF_SNDFILE_LIB = 'sndfile'
+BF_SNDFILE_LIBPATH = '${BF_SNDFILE}/lib'
+
+WITH_BF_SDL = True
+BF_SDL = '/usr/local' #$(shell sdl-config --prefix)
+BF_SDL_INC = '${BF_SDL}/include/SDL' #$(shell $(BF_SDL)/bin/sdl-config --cflags)
+BF_SDL_LIB = 'SDL' #BF_SDL #$(shell $(BF_SDL)/bin/sdl-config --libs) -lSDL_mixer
+
+WITH_BF_OPENEXR = True
+WITH_BF_STATICOPENEXR = False
+BF_OPENEXR = '/usr/local'
+# when compiling with your own openexr lib you might need to set...
+# BF_OPENEXR_INC = '${BF_OPENEXR}/include/OpenEXR ${BF_OPENEXR}/include'
+
+BF_OPENEXR_INC = '${BF_OPENEXR}/include/OpenEXR'
+BF_OPENEXR_LIB = 'Half IlmImf Iex Imath '
+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'
+# BF_OPENEXR_LIBPATH = '${BF_OPENEXR}/lib'
+
+WITH_BF_DDS = True
+
+WITH_BF_JPEG = True
+BF_JPEG = '/usr/local'
+BF_JPEG_INC = '${BF_JPEG}/include'
+BF_JPEG_LIB = 'jpeg'
+
+WITH_BF_PNG = True
+BF_PNG = '/usr/local'
+BF_PNG_INC = '${BF_PNG}/include'
+BF_PNG_LIB = 'png'
+
+WITH_BF_TIFF = True
+BF_TIFF = '/usr/local'
+BF_TIFF_INC = '${BF_TIFF}/include'
+BF_TIFF_LIB = 'tiff'
+
+WITH_BF_ZLIB = True
+BF_ZLIB = '/usr'
+BF_ZLIB_INC = '${BF_ZLIB}/include'
+BF_ZLIB_LIB = 'z'
+
+WITH_BF_INTERNATIONAL = True
+
+BF_GETTEXT = '/usr/local'
+BF_GETTEXT_INC = '${BF_GETTEXT}/include'
+BF_GETTEXT_LIB = 'gettextlib'
+BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib'
+
+WITH_BF_GAMEENGINE = False
+WITH_BF_PLAYER = True
+
+WITH_BF_BULLET = True
+BF_BULLET = '#extern/bullet2/src'
+BF_BULLET_INC = '${BF_BULLET}'
+BF_BULLET_LIB = 'extern_bullet'
+
+# enable freetype2 support for text objects
+BF_FREETYPE = '/usr/local'
+BF_FREETYPE_INC = '${BF_FREETYPE}/include ${BF_FREETYPE}/include/freetype2'
+BF_FREETYPE_LIB = 'freetype'
+
+### XXX Find what this actually wants; it doesn't want libquicktime.
+WITH_BF_QUICKTIME = False # -DWITH_QUICKTIME
+BF_QUICKTIME = '/usr/local'
+BF_QUICKTIME_INC = '${BF_QUICKTIME}/include'
+
+WITH_BF_ICONV = True
+BF_ICONV = LIBDIR + "/iconv"
+BF_ICONV_INC = '${BF_ICONV}/include'
+BF_ICONV_LIB = 'iconv'
+BF_ICONV_LIBPATH = '${BF_ICONV}/lib'
+
+WITH_BF_BINRELOC = True
+
+# enable ffmpeg support
+WITH_BF_FFMPEG = True # -DWITH_FFMPEG
+BF_FFMPEG = '/usr/local'
+BF_FFMPEG_LIB = 'avformat avcodec swscale avutil avdevice'
+BF_FFMPEG_INC = '${BF_FFMPEG}/include'
+BF_FFMPEG_LIBPATH='${BF_FFMPEG}/lib'
+
+# enable ogg, vorbis and theora in ffmpeg
+WITH_BF_OGG = True # -DWITH_OGG
+BF_OGG = '/usr/local'
+BF_OGG_INC = '${BF_OGG}/include'
+BF_OGG_LIB = 'ogg vorbis vorbisenc theoraenc theoradec'
+
+WITH_BF_OPENJPEG = True
+BF_OPENJPEG = '#extern/libopenjpeg'
+BF_OPENJPEG_LIB = ''
+BF_OPENJPEG_INC = '${BF_OPENJPEG}'
+BF_OPENJPEG_LIBPATH='${BF_OPENJPEG}/lib'
+
+WITH_BF_FFTW3 = True
+BF_FFTW3 = LIBDIR + '/usr/local'
+BF_FFTW3_INC = '${BF_FFTW3}/include'
+BF_FFTW3_LIB = 'fftw3'
+BF_FFTW3_LIBPATH = '${BF_FFTW3}/lib'
+
+WITH_BF_REDCODE = True
+BF_REDCODE = '#extern/libredcode'
+BF_REDCODE_LIB = ''
+# BF_REDCODE_INC = '${BF_REDCODE}/include'
+BF_REDCODE_INC = '${BF_REDCODE}/../' #C files request "libredcode/format.h" which is in "#extern/libredcode/format.h", stupid but compiles for now.
+BF_REDCODE_LIBPATH='${BF_REDCODE}/lib'
+
+# Mesa Libs should go here if your using them as well....
+WITH_BF_STATICOPENGL = False
+BF_OPENGL = '/usr/local'
+BF_OPENGL_INC = '${BF_OPENGL}/include'
+BF_OPENGL_LIB = 'GL GLU X11 Xi'
+BF_OPENGL_LIBPATH = '/usr/X11R6/lib'
+BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a'
+
+WITH_BF_COLLADA = False
+BF_COLLADA = '#source/blender/collada'
+BF_COLLADA_INC = '${BF_COLLADA}'
+BF_COLLADA_LIB = 'bf_collada'
+BF_OPENCOLLADA = '/usr'
+BF_OPENCOLLADA_INC = '${BF_OPENCOLLADA}'
+BF_OPENCOLLADA_LIB = 'OpenCOLLADAStreamWriter OpenCOLLADASaxFrameworkLoader OpenCOLLADAFramework OpenCOLLADABaseUtils GeneratedSaxParser UTF MathMLSolver pcre buffer ftoa'
+BF_OPENCOLLADA_LIBPATH = '${BF_OPENCOLLADA}/lib'
+BF_PCRE = '/usr/local'
+BF_PCRE_LIB = 'pcre'
+BF_PCRE_LIBPATH = '${BF_PCRE}/lib'
+BF_EXPAT = '/usr/local'
+BF_EXPAT_LIB = 'expat'
+BF_EXPAT_LIBPATH = '${BF_EXPAT}/lib'
+
+WITH_BF_OPENMP = True
+
+#Ray trace optimization
+WITH_BF_RAYOPTIMIZATION = True
+BF_RAYOPTIMIZATION_SSE_FLAGS = ['-msse','-pthread']
+
+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','-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
+##
+##AR = ar
+##ARFLAGS = ruv
+##ARFLAGSQUIET = ru
+##
+C_WARN = ['-Wno-char-subscripts', '-Wdeclaration-after-statement']
+CC_WARN = ['-Wall']
+CXX_WARN = ['-Wno-invalid-offsetof', '-Wno-sign-compare']
+
+
+##FIX_STUBS_WARNINGS = -Wno-unused
+
+LLIBS = ['util', 'c', 'm', 'pthread', 'stdc++']
+##LOPTS = --dynamic
+##DYNLDFLAGS = -shared $(LDFLAGS)
+
+BF_PROFILE = False
+BF_PROFILE_CCFLAGS = ['-pg','-g']
+BF_PROFILE_LINKFLAGS = ['-pg']
+
+BF_DEBUG = False
+BF_DEBUG_CCFLAGS = ['-g']
+
+BF_BUILDDIR = '../build/freebsd8'
+BF_INSTALLDIR='../install/freebsd8'
+
+#Link against pthread
+PLATFORM_LINKFLAGS = ['-pthread']
diff --git a/build_files/scons/config/freebsd9-config.py b/build_files/scons/config/freebsd9-config.py
new file mode 100644
index 00000000000..3fb4ebe7cd6
--- /dev/null
+++ b/build_files/scons/config/freebsd9-config.py
@@ -0,0 +1,213 @@
+CC = 'gcc44'
+CXX = 'g++44'
+
+LCGDIR = '../lib/freebsd9'
+LIBDIR = "${LCGDIR}"
+
+BF_PYTHON = '/usr/local'
+BF_PYTHON_LIBPATH = '${BF_PYTHON}/lib'
+BF_PYTHON_VERSION = '3.1'
+WITH_BF_STATICPYTHON = False
+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_STATIC = '${BF_PYTHON}/lib/libpython${BF_PYTHON_VERSION}.a'
+
+WITH_BF_OPENAL = True
+WITH_BF_STATICOPENAL = False
+BF_OPENAL = '/usr/local'
+BF_OPENAL_INC = '${BF_OPENAL}/include'
+BF_OPENAL_LIB = 'openal'
+BF_OPENAL_LIB_STATIC = '${BF_OPENAL}/lib/libopenal.a'
+
+BF_CXX = '/usr/local'
+WITH_BF_STATICCXX = False
+BF_CXX_LIB_STATIC = '${BF_CXX}/lib/libstdc++.a'
+
+BF_LIBSAMPLERATE = '/usr/local'
+BF_LIBSAMPLERATE_INC = '${BF_LIBSAMPLERATE}/include'
+BF_LIBSAMPLERATE_LIB = 'samplerate'
+BF_LIBSAMPLERATE_LIBPATH = '${BF_LIBSAMPLERATE}/lib'
+
+WITH_BF_JACK = True
+BF_JACK = '/usr/local'
+BF_JACK_INC = '${BF_JACK}/include/jack'
+BF_JACK_LIB = 'jack'
+BF_JACK_LIBPATH = '${BF_JACK}/lib'
+
+WITH_BF_SNDFILE = True
+BF_SNDFILE = '/usr/local'
+BF_SNDFILE_INC = '${BF_SNDFILE}/include/sndfile'
+BF_SNDFILE_LIB = 'sndfile'
+BF_SNDFILE_LIBPATH = '${BF_SNDFILE}/lib'
+
+WITH_BF_SDL = True
+BF_SDL = '/usr/local' #$(shell sdl-config --prefix)
+BF_SDL_INC = '${BF_SDL}/include/SDL' #$(shell $(BF_SDL)/bin/sdl-config --cflags)
+BF_SDL_LIB = 'SDL' #BF_SDL #$(shell $(BF_SDL)/bin/sdl-config --libs) -lSDL_mixer
+
+WITH_BF_OPENEXR = True
+WITH_BF_STATICOPENEXR = False
+BF_OPENEXR = '/usr/local'
+# when compiling with your own openexr lib you might need to set...
+# BF_OPENEXR_INC = '${BF_OPENEXR}/include/OpenEXR ${BF_OPENEXR}/include'
+
+BF_OPENEXR_INC = '${BF_OPENEXR}/include/OpenEXR'
+BF_OPENEXR_LIB = 'Half IlmImf Iex Imath '
+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'
+# BF_OPENEXR_LIBPATH = '${BF_OPENEXR}/lib'
+
+WITH_BF_DDS = True
+
+WITH_BF_JPEG = True
+BF_JPEG = '/usr/local'
+BF_JPEG_INC = '${BF_JPEG}/include'
+BF_JPEG_LIB = 'jpeg'
+
+WITH_BF_PNG = True
+BF_PNG = '/usr/local'
+BF_PNG_INC = '${BF_PNG}/include'
+BF_PNG_LIB = 'png'
+
+WITH_BF_TIFF = True
+BF_TIFF = '/usr/local'
+BF_TIFF_INC = '${BF_TIFF}/include'
+BF_TIFF_LIB = 'tiff'
+
+WITH_BF_ZLIB = True
+BF_ZLIB = '/usr'
+BF_ZLIB_INC = '${BF_ZLIB}/include'
+BF_ZLIB_LIB = 'z'
+
+WITH_BF_INTERNATIONAL = True
+
+BF_GETTEXT = '/usr/local'
+BF_GETTEXT_INC = '${BF_GETTEXT}/include'
+BF_GETTEXT_LIB = 'gettextlib'
+BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib'
+
+WITH_BF_GAMEENGINE = False
+WITH_BF_PLAYER = True
+
+WITH_BF_BULLET = True
+BF_BULLET = '#extern/bullet2/src'
+BF_BULLET_INC = '${BF_BULLET}'
+BF_BULLET_LIB = 'extern_bullet'
+
+# enable freetype2 support for text objects
+BF_FREETYPE = '/usr/local'
+BF_FREETYPE_INC = '${BF_FREETYPE}/include ${BF_FREETYPE}/include/freetype2'
+BF_FREETYPE_LIB = 'freetype'
+
+### XXX Find what this actually wants; it doesn't want libquicktime.
+WITH_BF_QUICKTIME = False # -DWITH_QUICKTIME
+BF_QUICKTIME = '/usr/local'
+BF_QUICKTIME_INC = '${BF_QUICKTIME}/include'
+
+WITH_BF_ICONV = True
+BF_ICONV = LIBDIR + "/iconv"
+BF_ICONV_INC = '${BF_ICONV}/include'
+BF_ICONV_LIB = 'iconv'
+BF_ICONV_LIBPATH = '${BF_ICONV}/lib'
+
+WITH_BF_BINRELOC = True
+
+# enable ffmpeg support
+WITH_BF_FFMPEG = True # -DWITH_FFMPEG
+BF_FFMPEG = '/usr/local'
+BF_FFMPEG_LIB = 'avformat avcodec swscale avutil avdevice'
+BF_FFMPEG_INC = '${BF_FFMPEG}/include'
+BF_FFMPEG_LIBPATH='${BF_FFMPEG}/lib'
+
+# enable ogg, vorbis and theora in ffmpeg
+WITH_BF_OGG = True # -DWITH_OGG
+BF_OGG = '/usr/local'
+BF_OGG_INC = '${BF_OGG}/include'
+BF_OGG_LIB = 'ogg vorbis vorbisenc theoraenc theoradec'
+
+WITH_BF_OPENJPEG = True
+BF_OPENJPEG = '#extern/libopenjpeg'
+BF_OPENJPEG_LIB = ''
+BF_OPENJPEG_INC = '${BF_OPENJPEG}'
+BF_OPENJPEG_LIBPATH='${BF_OPENJPEG}/lib'
+
+WITH_BF_FFTW3 = True
+BF_FFTW3 = LIBDIR + '/usr/local'
+BF_FFTW3_INC = '${BF_FFTW3}/include'
+BF_FFTW3_LIB = 'fftw3'
+BF_FFTW3_LIBPATH = '${BF_FFTW3}/lib'
+
+WITH_BF_REDCODE = True
+BF_REDCODE = '#extern/libredcode'
+BF_REDCODE_LIB = ''
+# BF_REDCODE_INC = '${BF_REDCODE}/include'
+BF_REDCODE_INC = '${BF_REDCODE}/../' #C files request "libredcode/format.h" which is in "#extern/libredcode/format.h", stupid but compiles for now.
+BF_REDCODE_LIBPATH='${BF_REDCODE}/lib'
+
+# Mesa Libs should go here if your using them as well....
+WITH_BF_STATICOPENGL = False
+BF_OPENGL = '/usr/local'
+BF_OPENGL_INC = '${BF_OPENGL}/include'
+BF_OPENGL_LIB = 'GL GLU X11 Xi'
+BF_OPENGL_LIBPATH = '/usr/X11R6/lib'
+BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a'
+
+WITH_BF_COLLADA = False
+BF_COLLADA = '#source/blender/collada'
+BF_COLLADA_INC = '${BF_COLLADA}'
+BF_COLLADA_LIB = 'bf_collada'
+BF_OPENCOLLADA = '/usr'
+BF_OPENCOLLADA_INC = '${BF_OPENCOLLADA}'
+BF_OPENCOLLADA_LIB = 'OpenCOLLADAStreamWriter OpenCOLLADASaxFrameworkLoader OpenCOLLADAFramework OpenCOLLADABaseUtils GeneratedSaxParser UTF MathMLSolver pcre buffer ftoa'
+BF_OPENCOLLADA_LIBPATH = '${BF_OPENCOLLADA}/lib'
+BF_PCRE = '/usr/local'
+BF_PCRE_LIB = 'pcre'
+BF_PCRE_LIBPATH = '${BF_PCRE}/lib'
+BF_EXPAT = '/usr/local'
+BF_EXPAT_LIB = 'expat'
+BF_EXPAT_LIBPATH = '${BF_EXPAT}/lib'
+
+WITH_BF_OPENMP = True
+
+#Ray trace optimization
+WITH_BF_RAYOPTIMIZATION = True
+BF_RAYOPTIMIZATION_SSE_FLAGS = ['-msse','-pthread']
+
+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','-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
+##
+##AR = ar
+##ARFLAGS = ruv
+##ARFLAGSQUIET = ru
+##
+C_WARN = ['-Wno-char-subscripts', '-Wdeclaration-after-statement']
+CC_WARN = ['-Wall']
+CXX_WARN = ['-Wno-invalid-offsetof', '-Wno-sign-compare']
+
+
+##FIX_STUBS_WARNINGS = -Wno-unused
+
+LLIBS = ['util', 'c', 'm', 'pthread', 'stdc++']
+##LOPTS = --dynamic
+##DYNLDFLAGS = -shared $(LDFLAGS)
+
+BF_PROFILE = False
+BF_PROFILE_CCFLAGS = ['-pg','-g']
+BF_PROFILE_LINKFLAGS = ['-pg']
+
+BF_DEBUG = False
+BF_DEBUG_CCFLAGS = ['-g']
+
+BF_BUILDDIR = '../build/freebsd9'
+BF_INSTALLDIR='../install/freebsd9'
+
+#Link against pthread
+PLATFORM_LINKFLAGS = ['-pthread']
diff --git a/config/irix6-config.py b/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
index db6d5839d89..75428937b39 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'
@@ -82,6 +84,8 @@ BF_GETTEXT = '/usr'
BF_GETTEXT_INC = '${BF_GETTEXT}/include'
BF_GETTEXT_LIB = 'gettextlib'
BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib'
+#WITH_BF_GETTEXT_STATIC = True
+#BF_GETTEXT_LIB_STATIC = '${BF_GETTEXT}/lib/libgettextlib.a'
WITH_BF_GAMEENGINE = True
WITH_BF_PLAYER = False
@@ -95,6 +99,8 @@ BF_BULLET_LIB = 'extern_bullet'
BF_FREETYPE = '/usr'
BF_FREETYPE_INC = '${BF_FREETYPE}/include ${BF_FREETYPE}/include/freetype2'
BF_FREETYPE_LIB = 'freetype'
+#WITH_BF_FREETYPE_STATIC = True
+#BF_FREETYPE_LIB_STATIC = '${BF_FREETYPE}/lib/libfreetype.a'
WITH_BF_QUICKTIME = False # -DWITH_QUICKTIME
BF_QUICKTIME = '/usr/local'
@@ -114,6 +120,8 @@ BF_FFMPEG = '/usr'
BF_FFMPEG_LIB = 'avformat avcodec swscale avutil avdevice'
BF_FFMPEG_INC = '${BF_FFMPEG}/include'
BF_FFMPEG_LIBPATH='${BF_FFMPEG}/lib'
+#WITH_BF_STATICFFMPEG = True
+#BF_FFMPEG_LIB_STATIC = '${BF_FFMPEG_LIBPATH}/libavformat.a ${BF_FFMPEG_LIBPATH/libavcodec.a ${BF_FFMPEG_LIBPATH}/libswscale.a ${BF_FFMPEG_LIBPATH}/libavutil.a ${BF_FFMPEG_LIBPATH}/libavdevice.a'
# enable ogg, vorbis and theora in ffmpeg
WITH_BF_OGG = False # -DWITH_OGG
@@ -148,7 +156,7 @@ BF_OPENGL_LIB = 'GL GLU X11 Xi'
BF_OPENGL_LIBPATH = '/usr/X11R6/lib'
BF_OPENGL_LIB_STATIC = '${BF_OPENGL_LIBPATH}/libGL.a ${BF_OPENGL_LIBPATH}/libGLU.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a ${BF_OPENGL_LIBPATH}/libX11.a ${BF_OPENGL_LIBPATH}/libXi.a ${BF_OPENGL_LIBPATH}/libXext.a ${BF_OPENGL_LIBPATH}/libXxf86vm.a'
-WITH_BF_COLLADA = True
+WITH_BF_COLLADA = False
BF_COLLADA = '#source/blender/collada'
BF_COLLADA_INC = '${BF_COLLADA}'
BF_COLLADA_LIB = 'bf_collada'
@@ -166,7 +174,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 +183,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
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
index 0ef9ba5d0a4..0ef9ba5d0a4 100644
--- a/config/openbsd3-config.py
+++ b/build_files/scons/config/openbsd3-config.py
diff --git a/config/sunos5-config.py b/build_files/scons/config/sunos5-config.py
index a0713735a5b..a0713735a5b 100644
--- a/config/sunos5-config.py
+++ b/build_files/scons/config/sunos5-config.py
diff --git a/config/win32-mingw-config.py b/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
index 041458dc4cb..3572dd113bf 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'
@@ -129,7 +130,7 @@ BF_OPENJPEG_LIB = ''
BF_OPENJPEG_INC = '${BF_OPENJPEG}'
BF_OPENJPEG_LIBPATH='${BF_OPENJPEG}/lib'
-WITH_BF_FFTW3 = False
+WITH_BF_FFTW3 = True
BF_FFTW3 = LIBDIR + '/fftw3'
BF_FFTW3_INC = '${BF_FFTW3}/include'
BF_FFTW3_LIB = 'libfftw'
@@ -145,11 +146,11 @@ 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
diff --git a/config/win64-vc-config.py b/build_files/scons/config/win64-vc-config.py
index 5ec72b35ce2..0a4b05a28bf 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'
@@ -158,11 +159,11 @@ 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
@@ -193,8 +194,6 @@ CXX_WARN = []
LLIBS = ['ws2_32', 'vfw32', 'winmm', 'kernel32', 'user32', 'gdi32', 'comdlg32', 'advapi32', 'shfolder', 'shell32', 'ole32', 'oleaut32', 'uuid']
-WITH_BF_DOCS=False
-
BF_DEBUG=False
BF_BSC=False
diff --git a/tools/Blender.py b/build_files/scons/tools/Blender.py
index 8e8898a62eb..c2ccfcc8689 100644
--- a/tools/Blender.py
+++ b/build_files/scons/tools/Blender.py
@@ -31,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
@@ -119,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'],
@@ -136,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']:
@@ -146,10 +147,20 @@ 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_FFMPEG'] and lenv['WITH_BF_STATICFFMPEG']:
+ statlibs += Split(lenv['BF_FFMPEG_LIB_STATIC'])
if lenv['WITH_BF_INTERNATIONAL']:
libincs += Split(lenv['BF_GETTEXT_LIBPATH'])
+ if lenv['WITH_BF_GETTEXT_STATIC']:
+ statlibs += Split(lenv['BF_GETTEXT_LIB_STATIC'])
+ if lenv['WITH_BF_FREETYPE_STATIC']:
+ statlibs += Split(lenv['BF_FREETYPE_LIB_STATIC'])
if lenv['WITH_BF_OPENAL']:
libincs += Split(lenv['BF_OPENAL_LIBPATH'])
if lenv['WITH_BF_STATICOPENAL']:
@@ -175,6 +186,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
@@ -187,13 +201,14 @@ def setup_syslibs(lenv):
lenv['BF_LIBSAMPLERATE_LIB']
]
- syslibs += Split(lenv['BF_FREETYPE_LIB'])
+ if not lenv['WITH_BF_FREETYPE_STATIC']:
+ syslibs += Split(lenv['BF_FREETYPE_LIB'])
if lenv['WITH_BF_PYTHON'] and not lenv['WITH_BF_STATICPYTHON']:
if lenv['BF_DEBUG'] and lenv['OURPLATFORM'] in ('win32-vc', 'win64-vc', 'win32-mingw'):
syslibs.append(lenv['BF_PYTHON_LIB']+'_d')
else:
syslibs.append(lenv['BF_PYTHON_LIB'])
- if lenv['WITH_BF_INTERNATIONAL']:
+ if lenv['WITH_BF_INTERNATIONAL'] and not lenv['WITH_BF_GETTEXT_STATIC']:
syslibs += Split(lenv['BF_GETTEXT_LIB'])
if lenv['WITH_BF_OPENAL']:
if not lenv['WITH_BF_STATICOPENAL']:
@@ -208,7 +223,9 @@ 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_FFMPEG']:
+ if lenv['WITH_BF_TIFF']:
+ syslibs += Split(lenv['BF_TIFF_LIB'])
+ if lenv['WITH_BF_FFMPEG'] and not lenv['WITH_BF_STATICFFMPEG']:
syslibs += Split(lenv['BF_FFMPEG_LIB'])
if lenv['WITH_BF_OGG']:
syslibs += Split(lenv['BF_OGG_LIB'])
@@ -224,7 +241,6 @@ def setup_syslibs(lenv):
syslibs += Split(lenv['BF_OPENGL_LIB'])
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'])
if lenv['WITH_BF_COLLADA']:
@@ -353,7 +369,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 +475,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,11 +505,10 @@ 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))
- if libdir == '../lib/darwin-9.x.universal':
- python_zip = 'python_' + osxarch + '.zip' # set specific python_arch.zip
- else:
- python_zip = 'python.zip' # compatibility for darwin8 python.zip
+ print("Installing to %s"%(installdir))
+ python_zip = 'python_' + osxarch + '.zip' # set specific python_arch.zip
print("unzipping to app-bundle: %s"%(python_zip))
bldroot = env.Dir('.').abspath
binary = env['BINARYKIND']
@@ -500,45 +519,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
- 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)
- 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)
+ cmd = installdir + '/%s.app/Contents/MacOS/%s'%(binary,VERSION)
+ shutil.copy(bldroot + '/release/bin/.blender/.bfont.ttf', cmd)
+ shutil.copy(bldroot + '/release/bin/.blender/.Blanguages', cmd)
+ cmd = 'cp -R %s/release/bin/%s/locale %s/%s.app/Contents/Resources/'%(bldroot,VERSION,installdir,binary)
+ commands.getoutput(cmd)
+ cmd = 'cp -R %s/release/bin/%s/locale %s/%s.app/Contents/MacOS/%s/'%(bldroot,VERSION,installdir,binary,VERSION)
+ commands.getoutput(cmd)
+ cmd = 'cp %s/release/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/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,17 +567,16 @@ 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
def run(cmd):
print 'Install command:', cmd
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')
-
+
+ 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'] )
@@ -711,7 +729,7 @@ class BlenderEnvironment(SConsEnvironment):
# note: libs is a global
add_lib_to_dict(self, libs, libtype, libname, priority)
- def BlenderProg(self=None, builddir=None, progname=None, sources=None, includes=None, libs=None, libpath=None, binarykind=''):
+ def BlenderProg(self=None, builddir=None, progname=None, sources=None, libs=None, libpath=None, binarykind=''):
global vcp
print bc.HEADER+'Configuring program '+bc.ENDC+bc.OKGREEN+progname+bc.ENDC
lenv = self.Clone()
@@ -737,7 +755,6 @@ class BlenderEnvironment(SConsEnvironment):
lenv.Append(LINKFLAGS = lenv['BF_OPENGL_LINKFLAGS'])
if lenv['BF_PROFILE']:
lenv.Append(LINKFLAGS = lenv['BF_PROFILE_LINKFLAGS'])
- lenv.Append(CPPPATH=includes)
if root_build_dir[0]==os.sep or root_build_dir[1]==':':
lenv.Append(LIBPATH=root_build_dir + '/lib')
lenv.Append(LIBPATH=libpath)
diff --git a/tools/__init__.py b/build_files/scons/tools/__init__.py
index e69de29bb2d..e69de29bb2d 100644
--- a/tools/__init__.py
+++ b/build_files/scons/tools/__init__.py
diff --git a/tools/bcolors.py b/build_files/scons/tools/bcolors.py
index b01bb781524..b01bb781524 100644
--- a/tools/bcolors.py
+++ b/build_files/scons/tools/bcolors.py
diff --git a/tools/btools.py b/build_files/scons/tools/btools.py
index 4cb86ecee62..894a32c14a1 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.53' # This is used in creating the local config directories
+
def print_arguments(args, bc):
if len(args):
for k,v in args.iteritems():
@@ -35,21 +36,22 @@ def validate_arguments(args, bc):
'WITH_BF_SNDFILE', 'BF_SNDFILE', 'BF_SNDFILE_INC', 'BF_SNDFILE_LIB', 'BF_SNDFILE_LIBPATH',
'BF_PTHREADS', 'BF_PTHREADS_INC', 'BF_PTHREADS_LIB', 'BF_PTHREADS_LIBPATH',
'WITH_BF_OPENEXR', 'BF_OPENEXR', 'BF_OPENEXR_INC', 'BF_OPENEXR_LIB', 'BF_OPENEXR_LIBPATH', 'WITH_BF_STATICOPENEXR', 'BF_OPENEXR_LIB_STATIC',
- 'WITH_BF_DDS',
+ 'WITH_BF_DDS', 'WITH_BF_CINEON', 'WITH_BF_HDR',
'WITH_BF_FFMPEG', 'BF_FFMPEG_LIB','BF_FFMPEG_EXTRA', 'BF_FFMPEG', 'BF_FFMPEG_INC',
+ 'WITH_BF_STATICFFMPEG', 'BF_FFMPEG_LIB_STATIC',
'WITH_BF_OGG', 'BF_OGG', 'BF_OGG_LIB',
'WITH_BF_JPEG', 'BF_JPEG', 'BF_JPEG_INC', 'BF_JPEG_LIB', 'BF_JPEG_LIBPATH',
'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',
+ 'BF_GETTEXT', 'BF_GETTEXT_INC', 'BF_GETTEXT_LIB', 'WITH_BF_GETTEXT_STATIC', 'BF_GETTEXT_LIB_STATIC', 'BF_GETTEXT_LIBPATH',
'WITH_BF_ICONV', 'BF_ICONV', 'BF_ICONV_INC', 'BF_ICONV_LIB', 'BF_ICONV_LIBPATH',
'WITH_BF_GAMEENGINE', 'WITH_BF_BULLET', 'BF_BULLET', 'BF_BULLET_INC', 'BF_BULLET_LIB',
'BF_WINTAB', 'BF_WINTAB_INC',
- 'WITH_BF_FREETYPE', 'BF_FREETYPE', 'BF_FREETYPE_INC', 'BF_FREETYPE_LIB', 'BF_FREETYPE_LIBPATH',
+ 'WITH_BF_FREETYPE', 'BF_FREETYPE', 'BF_FREETYPE_INC', 'BF_FREETYPE_LIB', 'BF_FREETYPE_LIBPATH', 'BF_FREETYPE_LIB_STATIC', 'WITH_BF_FREETYPE_STATIC',
'WITH_BF_QUICKTIME', 'BF_QUICKTIME', 'BF_QUICKTIME_INC', 'BF_QUICKTIME_LIB', 'BF_QUICKTIME_LIBPATH',
'WITH_BF_FFTW3', 'BF_FFTW3', 'BF_FFTW3_INC', 'BF_FFTW3_LIB', 'BF_FFTW3_LIBPATH',
'WITH_BF_STATICOPENGL', 'BF_OPENGL', 'BF_OPENGL_INC', 'BF_OPENGL_LIB', 'BF_OPENGL_LIBPATH', 'BF_OPENGL_LIB_STATIC',
@@ -73,16 +75,16 @@ 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',
- 'WITH_BF_FHS',
'BF_VERSION',
'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
@@ -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'),
@@ -222,7 +224,11 @@ def read_opts(cfg, args):
('BF_OPENEXR_LIBPATH', 'OPENEXR library path', ''),
('BF_OPENEXR_LIB_STATIC', 'OPENEXR static library', ''),
- (BoolVariable('WITH_BF_DDS', 'Use DDS if true', True)),
+ (BoolVariable('WITH_BF_DDS', 'Support DDS image format if true', True)),
+
+ (BoolVariable('WITH_BF_CINEON', 'Support CINEON and DPX image formats if true', True)),
+
+ (BoolVariable('WITH_BF_HDR', 'Support HDR image formats if true', True)),
(BoolVariable('WITH_BF_FFMPEG', 'Use FFMPEG if true', False)),
('BF_FFMPEG', 'FFMPEG base path', ''),
@@ -231,6 +237,8 @@ def read_opts(cfg, args):
('BF_FFMPEG_INC', 'FFMPEG includes', ''),
('BF_FFMPEG_LIBPATH', 'FFMPEG library path', ''),
+ (BoolVariable('WITH_BF_STATICFFMPEG', 'Use static FFMPEG if true', False)),
+ ('BF_FFMPEG_LIB_STATIC', 'Static FFMPEG libraries', ''),
(BoolVariable('WITH_BF_OGG', 'Use OGG, THEORA, VORBIS in FFMPEG if true',
False)),
@@ -261,11 +269,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', ''),
@@ -277,6 +292,8 @@ def read_opts(cfg, args):
('BF_GETTEXT', 'gettext base path', ''),
('BF_GETTEXT_INC', 'gettext include path', ''),
('BF_GETTEXT_LIB', 'gettext library', ''),
+ (BoolVariable('WITH_BF_GETTEXT_STATIC', 'Use static gettext library if true', False)),
+ ('BF_GETTEXT_LIB_STATIC', 'static gettext library', ''),
('BF_GETTEXT_LIBPATH', 'gettext library path', ''),
(BoolVariable('WITH_BF_ICONV', 'Use iconv if true', True)),
@@ -297,29 +314,14 @@ def read_opts(cfg, args):
('BF_CXX', 'c++ base path for libstdc++, only used when static linking', ''),
(BoolVariable('WITH_BF_STATICCXX', 'static link to stdc++', False)),
('BF_CXX_LIB_STATIC', 'static library path for stdc++', ''),
-##
-##WITH_BF_NSPR = True
-##BF_NSPR = $(LCGDIR)/nspr
-##BF_NSPR_INC = -I$(BF_NSPR)/include -I$(BF_NSPR)/include/nspr
-##BF_NSPR_LIB =
-### Uncomment the following line to use Mozilla inplace of netscape
-##CPPFLAGS += -DMOZ_NOT_NET
-### Location of MOZILLA/Netscape header files...
-##BF_MOZILLA = $(LCGDIR)/mozilla
-##BF_MOZILLA_INC = -I$(BF_MOZILLA)/include/mozilla/nspr -I$(BF_MOZILLA)/include/mozilla -I$(BF_MOZILLA)/include/mozilla/xpcom -I$(BF_MOZILLA)/include/mozilla/idl
-##BF_MOZILLA_LIB =
-### Will fall back to look in BF_MOZILLA_INC/nspr and BF_MOZILLA_LIB
-### if this is not set.
-##
-### Be paranoid regarding library creation (do not update archives)
-##BF_PARANOID = True
-##
-### enable freetype2 support for text objects
+
(BoolVariable('WITH_BF_FREETYPE', 'Use FreeType2 if true', True)),
('BF_FREETYPE', 'Freetype base path', ''),
('BF_FREETYPE_INC', 'Freetype include path', ''),
('BF_FREETYPE_LIB', 'Freetype library', ''),
('BF_FREETYPE_LIBPATH', 'Freetype library path', ''),
+ (BoolVariable('WITH_BF_FREETYPE_STATIC', 'Use Static Freetype if true', False)),
+ ('BF_FREETYPE_LIB_STATIC', 'Static Freetype library', ''),
(BoolVariable('WITH_BF_OPENMP', 'Use OpenMP if true', False)),
('BF_OPENMP', 'Base path to OpenMP (used when cross-compiling with older versions of WinGW)', ''),
@@ -399,8 +401,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)),
@@ -417,18 +419,14 @@ 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)),
+# (BoolVariable('WITH_BF_DOCS', 'Generate API documentation', False)),
('BF_CONFIG', 'SCons python config file used to set default options', 'user_config.py'),
('BF_NUMJOBS', 'Number of build processes to spawn', '1'),
('BF_MSVS', 'Generate MSVS project files and solution', False),
-
- (BoolVariable('WITH_BF_FHS', 'Use the Unix "Filesystem Hierarchy Standard" rather then a redistributable directory layout', False)),
+
('BF_VERSION', 'The root path for Unix (non-apple)', '2.5'),
(BoolVariable('BF_UNIT_TEST', 'Build with unit test support.', False)),
@@ -436,36 +434,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()
-
+ if env['OURPLATFORM'] == 'win32-vc':
+ bitness = '32'
+ elif env['OURPLATFORM'] == 'win64-vc':
+ bitness = '64'
+ else:
+ bitness = '-mingw'
+
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')
+ 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)
- shutil.copy('source/blender/blenpluginapi/plugin.def',install_base_dir+env['BF_INSTALLDIR']+'/plugins/include/')
+ 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 ####
@@ -475,149 +497,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)
-
- # 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)
+ ns_cnt = string.replace(ns_cnt, "[DODATAFILES]", datafiles)
- # 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
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
index 4eeefa5ed9d..4eeefa5ed9d 100755..100644
--- a/tools/mstoolkit.py
+++ b/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..dd5e60ff900
--- /dev/null
+++ b/doc/blender.1
@@ -0,0 +1,340 @@
+.TH "BLENDER" "1" "July 15, 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 <file>
+.br
+Load <file> 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 <name>
+.br
+Set the active scene <name> for rendering
+.br
+
+.TP
+.B \-f or \-\-render\-frame <frame>
+.br
+Render frame <frame> and save it.
+.br
++<frame> start frame relative, \-<frame> end frame relative.
+.br
+
+.TP
+.B \-s or \-\-frame\-start <frame>
+.br
+Set start to frame <frame> (use before the \-a argument)
+.br
+
+.TP
+.B \-e or \-\-frame\-end <frame>
+.br
+Set end to frame <frame> (use before the \-a argument)
+.br
+
+.TP
+.B \-j or \-\-frame\-jump <frames>
+.br
+Set number of frames to step forward after each rendered frame
+.br
+
+.TP
+.B \-o or \-\-render\-output <path>
+.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 <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 <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 <bool>
+.br
+Set option to add the file extension to the end of the file
+.br
+
+.TP
+.B \-t or \-\-threads <threads>
+.br
+Use amount of <threads> for rendering in background
+.br
+[1\-BLENDER_MAX_THREADS], 0 for systems processor count.
+.br
+
+.IP
+
+.SS "Animation Playback Options:"
+
+.TP
+.B \-a <options> <file(s)>
+.br
+Playback <file(s)>, only operates this way when not running in background.
+.br
+ \-p <sx> <sy> Open with lower left corner at <sx>, <sy>
+.br
+ \-m Read from disk (Don't buffer)
+.br
+ \-f <fps> <fps\-base> Specify FPS to start with
+.br
+ \-j <frame> Set frame step to <frame>
+.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 <sx> <sy> <w> <h>
+.br
+Open with lower left corner at <sx>, <sy> and width and height as <w>, <h>
+.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 <filename>
+.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"
+ \fIBLENDER_USER_CONFIG\fR Directory for user configuration files.
+ \fIBLENDER_SYSTEM_CONFIG\fR Directory for system wide configuration files.
+ \fIBLENDER_USER_SCRIPTS\fR Directory for user scripts.
+ \fIBLENDER_SYSTEM_SCRIPTS\fR Directory for system wide scripts.
+ \fIBLENDER_USER_DATAFILES\fR Directory for user data files (icons, translations, ..).
+ \fIBLENDER_SYSTEM_DATAFILES\fR Directory for system wide data files.
+ \fIBLENDER_SYSTEM_PYTHON\fR Directory for system python libraries.
+ \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
+<mester@uni-bremen.de> and updated by Cyril Brulebois
+<cyril.brulebois@enst-bretagne.fr> and Dan Eicher <dan@trollwerks.org>.
diff --git a/doc/blender.1.py b/doc/blender.1.py
new file mode 100644
index 00000000000..7c7fc987c64
--- /dev/null
+++ b/doc/blender.1.py
@@ -0,0 +1,136 @@
+#!/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>
+
+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]
+
+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
+<mester@uni-bremen.de> and updated by Cyril Brulebois
+<cyril.brulebois@enst-bretagne.fr> and Dan Eicher <dan@trollwerks.org>.
+''')
+
+print("written:", filepath)
diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt
index 35271d24a2d..b15c8a31c73 100644
--- a/extern/CMakeLists.txt
+++ b/extern/CMakeLists.txt
@@ -34,9 +34,9 @@ ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
ADD_SUBDIRECTORY(glew)
-IF(WITH_OPENJPEG)
+IF(WITH_IMAGE_OPENJPEG)
ADD_SUBDIRECTORY(libopenjpeg)
-ENDIF(WITH_OPENJPEG)
+ENDIF(WITH_IMAGE_OPENJPEG)
IF(WITH_LZO)
ADD_SUBDIRECTORY(lzo)
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp
index 50a79451f5d..07262b95b73 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp
@@ -601,7 +601,7 @@ void btConeTwistConstraint::calcAngleInfo2()
m_solveSwingLimit = false;
// compute rotation of A wrt B (in constraint space)
if (m_bMotorEnabled && (!m_useSolveConstraintObsolete))
- { // it is assumed that setMotorTarget() was alredy called
+ { // it is assumed that setMotorTarget() was already called
// and motor target m_qTarget is within constraint limits
// TODO : split rotation to pure swing and pure twist
// compute desired transforms in world
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/CMakeLists.txt b/extern/libopenjpeg/CMakeLists.txt
index 0a985aceb37..d7b25ed1412 100644
--- a/extern/libopenjpeg/CMakeLists.txt
+++ b/extern/libopenjpeg/CMakeLists.txt
@@ -28,5 +28,5 @@ SET(INC . src)
FILE(GLOB SRC *.c except t1_generate_luts.c)
ADD_DEFINITIONS(-DWITH_OPENJPEG)
-BLENDERLIB(extern_libopenjpeg "${SRC}" "${INC}")
+BLENDERLIB(extern_openjpeg "${SRC}" "${INC}")
#, libtype=['international','player'], priority=[5, 210])
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 <malloc.h>
#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 <malloc.h>
+ #endif
diff --git a/extern/lzma/CMakeLists.txt b/extern/lzma/CMakeLists.txt
index 235cd8c7f8e..15aa5264e37 100644
--- a/extern/lzma/CMakeLists.txt
+++ b/extern/lzma/CMakeLists.txt
@@ -28,7 +28,4 @@ SET(INC . )
FILE(GLOB SRC ./*.c)
-
-
-BLENDERLIB(bf_lzma "${SRC}" "${INC}")
-#, libtype='blender', priority = 0 )
+BLENDERLIB(extern_lzma "${SRC}" "${INC}")
diff --git a/extern/lzma/SConscript b/extern/lzma/SConscript
index 015cdfe339f..d0cfed87cb6 100644
--- a/extern/lzma/SConscript
+++ b/extern/lzma/SConscript
@@ -6,4 +6,4 @@ sources = env.Glob('./*.c')
defs = ''
incs = ' . '
-env.BlenderLib ('bf_lzma', sources, Split(incs), Split(defs), libtype=['intern'], priority=[40] )
+env.BlenderLib ('extern_lzma', sources, Split(incs), Split(defs), libtype=['intern'], priority=[40] )
diff --git a/extern/lzo/CMakeLists.txt b/extern/lzo/CMakeLists.txt
index b640cf658da..8bc887c923e 100644
--- a/extern/lzo/CMakeLists.txt
+++ b/extern/lzo/CMakeLists.txt
@@ -30,5 +30,5 @@ FILE(GLOB SRC minilzo/*.c)
-BLENDERLIB(bf_minilzo "${SRC}" "${INC}")
+BLENDERLIB(extern_minilzo "${SRC}" "${INC}")
#, libtype='blender', priority = 0 )
diff --git a/extern/lzo/SConscript b/extern/lzo/SConscript
index 81bedad25d8..a87034d197a 100644
--- a/extern/lzo/SConscript
+++ b/extern/lzo/SConscript
@@ -6,4 +6,4 @@ sources = env.Glob('minilzo/*.c')
defs = ''
incs = ' include '
-env.BlenderLib ('bf_minilzo', sources, Split(incs), Split(defs), libtype=['intern'], priority=[40] )
+env.BlenderLib ('extern_minilzo', sources, Split(incs), Split(defs), libtype=['intern'], priority=[40] )
diff --git a/intern/CMakeLists.txt b/intern/CMakeLists.txt
index a370118f061..d64029a6671 100644
--- a/intern/CMakeLists.txt
+++ b/intern/CMakeLists.txt
@@ -38,8 +38,8 @@ ADD_SUBDIRECTORY(boolop)
ADD_SUBDIRECTORY(opennl)
ADD_SUBDIRECTORY(smoke)
-IF(WITH_ELBEEM)
+IF(WITH_FLUID)
ADD_SUBDIRECTORY(elbeem)
-ENDIF(WITH_ELBEEM)
+ENDIF(WITH_FLUID)
ADD_SUBDIRECTORY(bsp)
diff --git a/intern/audaspace/CMakeLists.txt b/intern/audaspace/CMakeLists.txt
index 0965a467201..b1ded10e539 100644
--- a/intern/audaspace/CMakeLists.txt
+++ b/intern/audaspace/CMakeLists.txt
@@ -54,12 +54,19 @@ IF(WITH_SNDFILE)
ADD_DEFINITIONS(-DWITH_SNDFILE)
ENDIF(WITH_SNDFILE)
-IF(WITH_FFTW3)
- SET(INC ${INC} fftw ${FFTW3_INC})
- FILE(GLOB FFTW3SRC fftw/*.cpp)
- ADD_DEFINITIONS(-DWITH_FFTW3)
-ENDIF(WITH_FFTW3)
+#IF(WITH_FFTW3)
+# SET(INC ${INC} fftw ${FFTW3_INC})
+# FILE(GLOB FFTW3SRC fftw/*.cpp)
+# ADD_DEFINITIONS(-DWITH_FFTW3)
+#ENDIF(WITH_FFTW3)
-SET(SRC ${SRC} ${FFMPEGSRC} ${SNDFILESRC} ${FFTW3SRC} ${SDLSRC} ${OPENALSRC} ${JACKSRC})
+IF(WITH_PYTHON)
+ SET(INC ${INC} Python ${PYTHON_INC})
+ FILE(GLOB PYTHONSRC Python/*.cpp)
+ELSE(WITH_PYTHON)
+ ADD_DEFINITIONS(-DDISABLE_PYTHON)
+ENDIF(WITH_PYTHON)
-BLENDERLIB(bf_audaspace "${SRC}" "${INC}")
+SET(SRC ${SRC} ${FFMPEGSRC} ${SNDFILESRC} ${FFTW3SRC} ${SDLSRC} ${OPENALSRC} ${JACKSRC} ${PYTHONSRC})
+
+BLENDERLIB(bf_intern_audaspace "${SRC}" "${INC}")
diff --git a/intern/audaspace/FX/AUD_AccumulatorFactory.cpp b/intern/audaspace/FX/AUD_AccumulatorFactory.cpp
index 20709c57ee5..0c51e5241e4 100644
--- a/intern/audaspace/FX/AUD_AccumulatorFactory.cpp
+++ b/intern/audaspace/FX/AUD_AccumulatorFactory.cpp
@@ -24,26 +24,37 @@
*/
#include "AUD_AccumulatorFactory.h"
-#include "AUD_AccumulatorReader.h"
+#include "AUD_CallbackIIRFilterReader.h"
+
+sample_t accumulatorFilterAdditive(AUD_CallbackIIRFilterReader* reader, void* useless)
+{
+ float in = reader->x(0);
+ float lastin = reader->x(-1);
+ float out = reader->y(-1) + in - lastin;
+ if(in > lastin)
+ out += in - lastin;
+ return out;
+}
+
+sample_t accumulatorFilter(AUD_CallbackIIRFilterReader* reader, void* useless)
+{
+ float in = reader->x(0);
+ float lastin = reader->x(-1);
+ float out = reader->y(-1);
+ if(in > lastin)
+ out += in - lastin;
+ return out;
+}
AUD_AccumulatorFactory::AUD_AccumulatorFactory(AUD_IFactory* factory,
bool additive) :
AUD_EffectFactory(factory),
- m_additive(additive) {}
-
-AUD_AccumulatorFactory::AUD_AccumulatorFactory(bool additive) :
- AUD_EffectFactory(0),
- m_additive(additive) {}
-
-AUD_IReader* AUD_AccumulatorFactory::createReader()
+ m_additive(additive)
{
- AUD_IReader* reader = getReader();
-
- if(reader != 0)
- {
- reader = new AUD_AccumulatorReader(reader, m_additive);
- AUD_NEW("reader")
- }
+}
- return reader;
+AUD_IReader* AUD_AccumulatorFactory::createReader() const
+{
+ return new AUD_CallbackIIRFilterReader(getReader(), 2, 2,
+ m_additive ? accumulatorFilterAdditive : accumulatorFilter);
}
diff --git a/intern/audaspace/FX/AUD_AccumulatorFactory.h b/intern/audaspace/FX/AUD_AccumulatorFactory.h
index e475a19ccf6..2b90fa43bdf 100644
--- a/intern/audaspace/FX/AUD_AccumulatorFactory.h
+++ b/intern/audaspace/FX/AUD_AccumulatorFactory.h
@@ -37,7 +37,11 @@ private:
/**
* Whether the accumulator is additive.
*/
- bool m_additive;
+ const bool m_additive;
+
+ // hide copy constructor and operator=
+ AUD_AccumulatorFactory(const AUD_AccumulatorFactory&);
+ AUD_AccumulatorFactory& operator=(const AUD_AccumulatorFactory&);
public:
/**
@@ -47,13 +51,7 @@ public:
*/
AUD_AccumulatorFactory(AUD_IFactory* factory, bool additive = false);
- /**
- * Creates a new accumulator factory.
- * \param additive Whether the accumulator is additive.
- */
- AUD_AccumulatorFactory(bool additive = false);
-
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_ACCUMULATORFACTORY
diff --git a/intern/audaspace/FX/AUD_AccumulatorReader.cpp b/intern/audaspace/FX/AUD_AccumulatorReader.cpp
deleted file mode 100644
index 67ab4157f9c..00000000000
--- a/intern/audaspace/FX/AUD_AccumulatorReader.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * $Id$
- *
- * ***** BEGIN LGPL LICENSE BLOCK *****
- *
- * Copyright 2009 Jörg Hermann Müller
- *
- * This file is part of AudaSpace.
- *
- * AudaSpace is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * AudaSpace is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
- *
- * ***** END LGPL LICENSE BLOCK *****
- */
-
-#include "AUD_AccumulatorReader.h"
-#include "AUD_Buffer.h"
-
-#include <cstring>
-
-#define CC specs.channels + channel
-
-AUD_AccumulatorReader::AUD_AccumulatorReader(AUD_IReader* reader,
- bool additive) :
- AUD_EffectReader(reader),
- m_additive(additive)
-{
- AUD_Specs specs = reader->getSpecs();
- int samplesize = AUD_SAMPLE_SIZE(specs);
-
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
-
- m_sums = new AUD_Buffer(samplesize); AUD_NEW("buffer")
- memset(m_sums->getBuffer(), 0, samplesize);
-
- m_prevs = new AUD_Buffer(samplesize); AUD_NEW("buffer")
- memset(m_prevs->getBuffer(), 0, samplesize);
-}
-
-AUD_AccumulatorReader::~AUD_AccumulatorReader()
-{
- delete m_buffer; AUD_DELETE("buffer")
- delete m_sums; AUD_DELETE("buffer")
- delete m_prevs; AUD_DELETE("buffer")
-}
-
-void AUD_AccumulatorReader::read(int & length, sample_t* & buffer)
-{
- sample_t* buf;
- sample_t* sums;
- sample_t* prevs;
- sums = m_sums->getBuffer();
- prevs = m_prevs->getBuffer();
-
- AUD_Specs specs = m_reader->getSpecs();
-
- m_reader->read(length, buf);
- if(m_buffer->getSize() < length * AUD_SAMPLE_SIZE(specs))
- m_buffer->resize(length * AUD_SAMPLE_SIZE(specs));
-
- buffer = m_buffer->getBuffer();
-
- if(m_additive)
- {
- for(int channel = 0; channel < specs.channels; channel++)
- {
- for(int i = 0; i < length; i++)
- {
- if(buf[i * CC] > prevs[channel])
- sums[channel] += buf[i * CC] - prevs[channel];
- buffer[i * CC] = sums[channel] + buf[i * CC];
- prevs[channel] = buf[i * CC];
- }
- }
- }
- else
- {
- for(int channel = 0; channel < specs.channels; channel++)
- {
- for(int i = 0; i < length * specs.channels; i++)
- {
- if(buf[i * CC] > prevs[channel])
- sums[channel] += buf[i * CC] - prevs[channel];
- buffer[i * CC] = sums[channel];
- prevs[channel] = buf[i * CC];
- }
- }
- }
-}
diff --git a/intern/audaspace/FX/AUD_AccumulatorReader.h b/intern/audaspace/FX/AUD_AccumulatorReader.h
deleted file mode 100644
index 8ad1dda30f6..00000000000
--- a/intern/audaspace/FX/AUD_AccumulatorReader.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * $Id$
- *
- * ***** BEGIN LGPL LICENSE BLOCK *****
- *
- * Copyright 2009 Jörg Hermann Müller
- *
- * This file is part of AudaSpace.
- *
- * AudaSpace is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * AudaSpace is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
- *
- * ***** END LGPL LICENSE BLOCK *****
- */
-
-#ifndef AUD_ACCUMULATORREADER
-#define AUD_ACCUMULATORREADER
-
-#include "AUD_EffectReader.h"
-class AUD_Buffer;
-
-/**
- * This class represents an accumulator.
- */
-class AUD_AccumulatorReader : public AUD_EffectReader
-{
-private:
- /**
- * The playback buffer.
- */
- AUD_Buffer *m_buffer;
-
- /**
- * The sums of the specific channels.
- */
- AUD_Buffer *m_sums;
-
- /**
- * The previous results of the specific channels.
- */
- AUD_Buffer *m_prevs;
-
- /**
- * Whether the accumulator is additive.
- */
- bool m_additive;
-
-public:
- /**
- * Creates a new accumulator reader.
- * \param reader The reader to read from.
- * \param additive Whether the accumulator is additive.
- * \exception AUD_Exception Thrown if the reader specified is NULL.
- */
- AUD_AccumulatorReader(AUD_IReader* reader, bool additive);
-
- /**
- * Destroys the reader.
- */
- virtual ~AUD_AccumulatorReader();
-
- virtual void read(int & length, sample_t* & buffer);
-};
-
-#endif //AUD_ACCUMULATORREADER
diff --git a/intern/audaspace/FX/AUD_BaseIIRFilterReader.cpp b/intern/audaspace/FX/AUD_BaseIIRFilterReader.cpp
new file mode 100644
index 00000000000..9e14bcf0e40
--- /dev/null
+++ b/intern/audaspace/FX/AUD_BaseIIRFilterReader.cpp
@@ -0,0 +1,76 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN LGPL LICENSE BLOCK *****
+ *
+ * Copyright 2009 Jörg Hermann Müller
+ *
+ * This file is part of AudaSpace.
+ *
+ * AudaSpace is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AudaSpace is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * ***** END LGPL LICENSE BLOCK *****
+ */
+
+#include "AUD_BaseIIRFilterReader.h"
+
+#include <cstring>
+
+#define CC m_channels + m_channel
+
+AUD_BaseIIRFilterReader::AUD_BaseIIRFilterReader(AUD_IReader* reader, int in,
+ int out) :
+ AUD_EffectReader(reader),
+ m_channels(reader->getSpecs().channels),
+ m_xlen(in), m_ylen(out),
+ m_xpos(0), m_ypos(0), m_channel(0)
+{
+ m_x = new sample_t[in * m_channels];
+ m_y = new sample_t[out * m_channels];
+
+ memset(m_x, 0, sizeof(sample_t) * in * m_channels);
+ memset(m_y, 0, sizeof(sample_t) * out * m_channels);
+}
+
+AUD_BaseIIRFilterReader::~AUD_BaseIIRFilterReader()
+{
+ delete[] m_x;
+ delete[] m_y;
+}
+
+void AUD_BaseIIRFilterReader::read(int & length, sample_t* & buffer)
+{
+ sample_t* buf;
+
+ int samplesize = AUD_SAMPLE_SIZE(m_reader->getSpecs());
+
+ m_reader->read(length, buf);
+
+ if(m_buffer.getSize() < length * samplesize)
+ m_buffer.resize(length * samplesize);
+
+ buffer = m_buffer.getBuffer();
+
+ for(m_channel = 0; m_channel < m_channels; m_channel++)
+ {
+ for(int i = 0; i < length; i++)
+ {
+ m_x[m_xpos * CC] = buf[i * CC];
+ m_y[m_ypos * CC] = buffer[i * CC] = filter();
+
+ m_xpos = (m_xpos + 1) % m_xlen;
+ m_ypos = (m_ypos + 1) % m_ylen;
+ }
+ }
+}
diff --git a/intern/audaspace/FX/AUD_BaseIIRFilterReader.h b/intern/audaspace/FX/AUD_BaseIIRFilterReader.h
new file mode 100644
index 00000000000..7e2b71983a0
--- /dev/null
+++ b/intern/audaspace/FX/AUD_BaseIIRFilterReader.h
@@ -0,0 +1,114 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN LGPL LICENSE BLOCK *****
+ *
+ * Copyright 2009 Jörg Hermann Müller
+ *
+ * This file is part of AudaSpace.
+ *
+ * AudaSpace is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AudaSpace is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * ***** END LGPL LICENSE BLOCK *****
+ */
+
+#ifndef AUD_BASEIIRFILTERREADER
+#define AUD_BASEIIRFILTERREADER
+
+#include "AUD_EffectReader.h"
+#include "AUD_Buffer.h"
+
+/**
+ * This class is a base class for infinite impulse response filters.
+ */
+class AUD_BaseIIRFilterReader : public AUD_EffectReader
+{
+private:
+ /**
+ * Channel count.
+ */
+ const int m_channels;
+
+ /**
+ * Length of input samples needed.
+ */
+ const int m_xlen;
+
+ /**
+ * Length of output samples needed.
+ */
+ const int m_ylen;
+
+ /**
+ * The playback buffer.
+ */
+ AUD_Buffer m_buffer;
+
+ /**
+ * The last in samples array.
+ */
+ sample_t* m_x;
+
+ /**
+ * The last out samples array.
+ */
+ sample_t* m_y;
+
+ /**
+ * Position of the current input sample in the input array.
+ */
+ int m_xpos;
+
+ /**
+ * Position of the current output sample in the output array.
+ */
+ int m_ypos;
+
+ /**
+ * Current channel.
+ */
+ int m_channel;
+
+ // hide copy constructor and operator=
+ AUD_BaseIIRFilterReader(const AUD_BaseIIRFilterReader&);
+ AUD_BaseIIRFilterReader& operator=(const AUD_BaseIIRFilterReader&);
+
+protected:
+ /**
+ * Creates a new base IIR filter reader.
+ * \param reader The reader to read from.
+ * \param in The count of past input samples needed.
+ * \param out The count of past output samples needed.
+ */
+ AUD_BaseIIRFilterReader(AUD_IReader* reader, int in, int out);
+
+public:
+ inline sample_t x(int pos)
+ {
+ return m_x[(m_xpos + pos + m_xlen) % m_xlen * m_channels + m_channel];
+ }
+
+ inline sample_t y(int pos)
+ {
+ return m_y[(m_ypos + pos + m_ylen) % m_ylen * m_channels + m_channel];
+ }
+
+ virtual ~AUD_BaseIIRFilterReader();
+
+ virtual void read(int & length, sample_t* & buffer);
+
+ virtual sample_t filter()=0;
+};
+
+#endif //AUD_BASEIIRFILTERREADER
diff --git a/intern/audaspace/FX/AUD_ButterworthFactory.cpp b/intern/audaspace/FX/AUD_ButterworthFactory.cpp
index fd0a53def7c..874ff0f6351 100644
--- a/intern/audaspace/FX/AUD_ButterworthFactory.cpp
+++ b/intern/audaspace/FX/AUD_ButterworthFactory.cpp
@@ -24,26 +24,49 @@
*/
#include "AUD_ButterworthFactory.h"
-#include "AUD_ButterworthReader.h"
+#include "AUD_IIRFilterReader.h"
+
+#include <cmath>
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#define BWPB41 0.76536686473
+#define BWPB42 1.84775906502
AUD_ButterworthFactory::AUD_ButterworthFactory(AUD_IFactory* factory,
float frequency) :
AUD_EffectFactory(factory),
- m_frequency(frequency) {}
-
-AUD_ButterworthFactory::AUD_ButterworthFactory(float frequency) :
- AUD_EffectFactory(0),
- m_frequency(frequency) {}
+ m_frequency(frequency)
+{
+}
-AUD_IReader* AUD_ButterworthFactory::createReader()
+AUD_IReader* AUD_ButterworthFactory::createReader() const
{
AUD_IReader* reader = getReader();
- if(reader != 0)
- {
- reader = new AUD_ButterworthReader(reader, m_frequency);
- AUD_NEW("reader")
- }
+ // calculate coefficients
+ float omega = 2 * tan(m_frequency * M_PI / reader->getSpecs().rate);
+ float o2 = omega * omega;
+ float o4 = o2 * o2;
+ float x1 = o2 + 2 * BWPB41 * omega + 4;
+ float x2 = o2 + 2 * BWPB42 * omega + 4;
+ float y1 = o2 - 2 * BWPB41 * omega + 4;
+ float y2 = o2 - 2 * BWPB42 * omega + 4;
+ float o228 = 2 * o2 - 8;
+ float norm = x1 * x2;
+ std::vector<float> a, b;
+ a.push_back(1);
+ a.push_back((x1 + x2) * o228 / norm);
+ a.push_back((x1 * y2 + x2 * y1 + o228 * o228) / norm);
+ a.push_back((y1 + y2) * o228 / norm);
+ a.push_back(y1 * y2 / norm);
+ b.push_back(o4 / norm);
+ b.push_back(4 * o4 / norm);
+ b.push_back(6 * o4 / norm);
+ b.push_back(b[1]);
+ b.push_back(b[0]);
- return reader;
+ return new AUD_IIRFilterReader(reader, b, a);
}
diff --git a/intern/audaspace/FX/AUD_ButterworthFactory.h b/intern/audaspace/FX/AUD_ButterworthFactory.h
index 69169531d70..30b7a402c57 100644
--- a/intern/audaspace/FX/AUD_ButterworthFactory.h
+++ b/intern/audaspace/FX/AUD_ButterworthFactory.h
@@ -37,7 +37,11 @@ private:
/**
* The attack value in seconds.
*/
- float m_frequency;
+ const float m_frequency;
+
+ // hide copy constructor and operator=
+ AUD_ButterworthFactory(const AUD_ButterworthFactory&);
+ AUD_ButterworthFactory& operator=(const AUD_ButterworthFactory&);
public:
/**
@@ -47,13 +51,7 @@ public:
*/
AUD_ButterworthFactory(AUD_IFactory* factory, float frequency);
- /**
- * Creates a new butterworth factory.
- * \param frequency The cutoff frequency.
- */
- AUD_ButterworthFactory(float frequency);
-
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_BUTTERWORTHFACTORY
diff --git a/intern/audaspace/FX/AUD_ButterworthReader.cpp b/intern/audaspace/FX/AUD_ButterworthReader.cpp
deleted file mode 100644
index 2129dfef798..00000000000
--- a/intern/audaspace/FX/AUD_ButterworthReader.cpp
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * $Id$
- *
- * ***** BEGIN LGPL LICENSE BLOCK *****
- *
- * Copyright 2009 Jörg Hermann Müller
- *
- * This file is part of AudaSpace.
- *
- * AudaSpace is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * AudaSpace is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
- *
- * ***** END LGPL LICENSE BLOCK *****
- */
-
-#include "AUD_ButterworthReader.h"
-#include "AUD_Buffer.h"
-
-#include <cstring>
-#include <cmath>
-
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
-
-#define BWPB41 0.76536686473
-#define BWPB42 1.84775906502
-#define CC channels + channel
-
-AUD_ButterworthReader::AUD_ButterworthReader(AUD_IReader* reader,
- float frequency) :
- AUD_EffectReader(reader)
-{
- AUD_Specs specs = reader->getSpecs();
- int samplesize = AUD_SAMPLE_SIZE(specs);
-
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
-
- m_outvalues = new AUD_Buffer(samplesize * 5); AUD_NEW("buffer")
- memset(m_outvalues->getBuffer(), 0, samplesize * 5);
-
- m_invalues = new AUD_Buffer(samplesize * 5); AUD_NEW("buffer")
- memset(m_invalues->getBuffer(), 0, samplesize * 5);
-
- m_position = 0;
-
- // calculate coefficients
- float omega = 2 * tan(frequency * M_PI / specs.rate);
- float o2 = omega * omega;
- float o4 = o2 * o2;
- float x1 = o2 + 2 * BWPB41 * omega + 4;
- float x2 = o2 + 2 * BWPB42 * omega + 4;
- float y1 = o2 - 2 * BWPB41 * omega + 4;
- float y2 = o2 - 2 * BWPB42 * omega + 4;
- float o228 = 2 * o2 - 8;
- float norm = x1 * x2;
- m_coeff[0][0] = 0;
- m_coeff[0][1] = (x1 + x2) * o228 / norm;
- m_coeff[0][2] = (x1 * y2 + x2 * y1 + o228 * o228) / norm;
- m_coeff[0][3] = (y1 + y2) * o228 / norm;
- m_coeff[0][4] = y1 * y2 / norm;
- m_coeff[1][4] = m_coeff[1][0] = o4 / norm;
- m_coeff[1][3] = m_coeff[1][1] = 4 * o4 / norm;
- m_coeff[1][2] = 6 * o4 / norm;
-}
-
-AUD_ButterworthReader::~AUD_ButterworthReader()
-{
- delete m_buffer; AUD_DELETE("buffer")
-
- delete m_outvalues; AUD_DELETE("buffer")
- delete m_invalues; AUD_DELETE("buffer");
-}
-
-void AUD_ButterworthReader::read(int & length, sample_t* & buffer)
-{
- sample_t* buf;
- sample_t* outvalues;
- sample_t* invalues;
-
- outvalues = m_outvalues->getBuffer();
- invalues = m_invalues->getBuffer();
-
- AUD_Specs specs = m_reader->getSpecs();
-
- m_reader->read(length, buf);
-
- if(m_buffer->getSize() < length * AUD_SAMPLE_SIZE(specs))
- m_buffer->resize(length * AUD_SAMPLE_SIZE(specs));
-
- buffer = m_buffer->getBuffer();
- int channels = specs.channels;
-
- for(int channel = 0; channel < channels; channel++)
- {
- for(int i = 0; i < length; i++)
- {
- invalues[m_position * CC] = buf[i * CC];
- outvalues[m_position * CC] = 0;
-
- for(int j = 0; j < 4; j++)
- {
- outvalues[m_position * CC] += m_coeff[1][j] *
- invalues[((m_position + j) % 5) * CC] -
- m_coeff[0][j] *
- outvalues[((m_position + j) % 5) * CC];
- }
-
- buffer[i * CC] = outvalues[m_position * CC];
-
- m_position = (m_position + 4) % 5;
- }
- }
-}
diff --git a/intern/audaspace/FX/AUD_ButterworthReader.h b/intern/audaspace/FX/AUD_ButterworthReader.h
deleted file mode 100644
index b1cbd4e3820..00000000000
--- a/intern/audaspace/FX/AUD_ButterworthReader.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * $Id$
- *
- * ***** BEGIN LGPL LICENSE BLOCK *****
- *
- * Copyright 2009 Jörg Hermann Müller
- *
- * This file is part of AudaSpace.
- *
- * AudaSpace is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * AudaSpace is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
- *
- * ***** END LGPL LICENSE BLOCK *****
- */
-
-#ifndef AUD_BUTTERWORTHREADER
-#define AUD_BUTTERWORTHREADER
-
-#include "AUD_EffectReader.h"
-class AUD_Buffer;
-
-/**
- * This class represents a butterworth filter.
- */
-class AUD_ButterworthReader : public AUD_EffectReader
-{
-private:
- /**
- * The playback buffer.
- */
- AUD_Buffer *m_buffer;
-
- /**
- * The last out values buffer.
- */
- AUD_Buffer *m_outvalues;
-
- /**
- * The last in values buffer.
- */
- AUD_Buffer *m_invalues;
-
- /**
- * The position for buffer cycling.
- */
- int m_position;
-
- /**
- * Filter coefficients.
- */
- float m_coeff[2][5];
-
-public:
- /**
- * Creates a new butterworth reader.
- * \param reader The reader to read from.
- * \param attack The attack value in seconds.
- * \param release The release value in seconds.
- * \param threshold The threshold value.
- * \param arthreshold The attack/release threshold value.
- * \exception AUD_Exception Thrown if the reader specified is NULL.
- */
- AUD_ButterworthReader(AUD_IReader* reader, float frequency);
-
- /**
- * Destroys the reader.
- */
- virtual ~AUD_ButterworthReader();
-
- virtual void read(int & length, sample_t* & buffer);
-};
-
-#endif //AUD_BUTTERWORTHREADER
diff --git a/intern/audaspace/FX/AUD_RectifyReader.cpp b/intern/audaspace/FX/AUD_CallbackIIRFilterReader.cpp
index 5d3ce80e811..02ab6e185fe 100644
--- a/intern/audaspace/FX/AUD_RectifyReader.cpp
+++ b/intern/audaspace/FX/AUD_CallbackIIRFilterReader.cpp
@@ -23,33 +23,25 @@
* ***** END LGPL LICENSE BLOCK *****
*/
-#include "AUD_RectifyReader.h"
-#include "AUD_Buffer.h"
-
-#include <cmath>
-
-AUD_RectifyReader::AUD_RectifyReader(AUD_IReader* reader) :
- AUD_EffectReader(reader)
+#include "AUD_CallbackIIRFilterReader.h"
+
+AUD_CallbackIIRFilterReader::AUD_CallbackIIRFilterReader(AUD_IReader* reader,
+ int in, int out,
+ doFilterIIR doFilter,
+ endFilterIIR endFilter,
+ void* data) :
+ AUD_BaseIIRFilterReader(reader, in, out),
+ m_filter(doFilter), m_endFilter(endFilter), m_data(data)
{
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
}
-AUD_RectifyReader::~AUD_RectifyReader()
+AUD_CallbackIIRFilterReader::~AUD_CallbackIIRFilterReader()
{
- delete m_buffer; AUD_DELETE("buffer")
+ if(m_endFilter)
+ m_endFilter(m_data);
}
-void AUD_RectifyReader::read(int & length, sample_t* & buffer)
+sample_t AUD_CallbackIIRFilterReader::filter()
{
- sample_t* buf;
- AUD_Specs specs = m_reader->getSpecs();
-
- m_reader->read(length, buf);
- if(m_buffer->getSize() < length * AUD_SAMPLE_SIZE(specs))
- m_buffer->resize(length * AUD_SAMPLE_SIZE(specs));
-
- buffer = m_buffer->getBuffer();
-
- for(int i = 0; i < length * specs.channels; i++)
- buffer[i] = fabs(buf[i]);
+ return m_filter(this, m_data);
}
diff --git a/intern/audaspace/FX/AUD_CallbackIIRFilterReader.h b/intern/audaspace/FX/AUD_CallbackIIRFilterReader.h
new file mode 100644
index 00000000000..6472c7baad3
--- /dev/null
+++ b/intern/audaspace/FX/AUD_CallbackIIRFilterReader.h
@@ -0,0 +1,83 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN LGPL LICENSE BLOCK *****
+ *
+ * Copyright 2009 Jörg Hermann Müller
+ *
+ * This file is part of AudaSpace.
+ *
+ * AudaSpace is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AudaSpace is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * ***** END LGPL LICENSE BLOCK *****
+ */
+
+#ifndef AUD_CALLBACKIIRFILTERREADER
+#define AUD_CALLBACKIIRFILTERREADER
+
+#include "AUD_BaseIIRFilterReader.h"
+#include "AUD_Buffer.h"
+
+class AUD_CallbackIIRFilterReader;
+
+typedef sample_t (*doFilterIIR)(AUD_CallbackIIRFilterReader*, void*);
+typedef void (*endFilterIIR)(void*);
+
+/**
+ * This class provides an interface for infinite impulse response filters via a
+ * callback filter function.
+ */
+class AUD_CallbackIIRFilterReader : public AUD_BaseIIRFilterReader
+{
+private:
+ /**
+ * Filter function.
+ */
+ const doFilterIIR m_filter;
+
+ /**
+ * End filter function.
+ */
+ const endFilterIIR m_endFilter;
+
+ /**
+ * Data pointer.
+ */
+ void* m_data;
+
+ // hide copy constructor and operator=
+ AUD_CallbackIIRFilterReader(const AUD_CallbackIIRFilterReader&);
+ AUD_CallbackIIRFilterReader& operator=(const AUD_CallbackIIRFilterReader&);
+
+public:
+ /**
+ * Creates a new callback IIR filter reader.
+ * \param reader The reader to read from.
+ * \param in The count of past input samples needed.
+ * \param out The count of past output samples needed.
+ * \param doFilter The filter callback.
+ * \param endFilter The finishing callback.
+ * \param data Data pointer for the callbacks.
+ */
+ AUD_CallbackIIRFilterReader(AUD_IReader* reader, int in, int out,
+ doFilterIIR doFilter,
+ endFilterIIR endFilter = 0,
+ void* data = 0);
+
+ virtual ~AUD_CallbackIIRFilterReader();
+
+ virtual sample_t filter();
+};
+
+#endif //AUD_CALLBACKIIRFILTERREADER
diff --git a/intern/audaspace/FX/AUD_DelayFactory.cpp b/intern/audaspace/FX/AUD_DelayFactory.cpp
index 25ce4faed4c..f98743d6fb7 100644
--- a/intern/audaspace/FX/AUD_DelayFactory.cpp
+++ b/intern/audaspace/FX/AUD_DelayFactory.cpp
@@ -29,30 +29,16 @@
AUD_DelayFactory::AUD_DelayFactory(AUD_IFactory* factory, float delay) :
AUD_EffectFactory(factory),
- m_delay(delay) {}
-
-AUD_DelayFactory::AUD_DelayFactory(float delay) :
- AUD_EffectFactory(0),
- m_delay(delay) {}
-
-float AUD_DelayFactory::getDelay()
+ m_delay(delay)
{
- return m_delay;
}
-void AUD_DelayFactory::setDelay(float delay)
+float AUD_DelayFactory::getDelay() const
{
- m_delay = delay;
+ return m_delay;
}
-AUD_IReader* AUD_DelayFactory::createReader()
+AUD_IReader* AUD_DelayFactory::createReader() const
{
- AUD_IReader* reader = getReader();
-
- if(reader != 0)
- {
- reader = new AUD_DelayReader(reader, m_delay); AUD_NEW("reader")
- }
-
- return reader;
+ return new AUD_DelayReader(getReader(), m_delay);
}
diff --git a/intern/audaspace/FX/AUD_DelayFactory.h b/intern/audaspace/FX/AUD_DelayFactory.h
index 5ad4b9ab996..721262fb73f 100644
--- a/intern/audaspace/FX/AUD_DelayFactory.h
+++ b/intern/audaspace/FX/AUD_DelayFactory.h
@@ -37,7 +37,11 @@ private:
/**
* The delay in samples.
*/
- float m_delay;
+ const float m_delay;
+
+ // hide copy constructor and operator=
+ AUD_DelayFactory(const AUD_DelayFactory&);
+ AUD_DelayFactory& operator=(const AUD_DelayFactory&);
public:
/**
@@ -45,26 +49,14 @@ public:
* \param factory The input factory.
* \param delay The desired delay in seconds.
*/
- AUD_DelayFactory(AUD_IFactory* factory = 0, float delay = 0);
-
- /**
- * Creates a new delay factory.
- * \param delay The desired delay in seconds.
- */
- AUD_DelayFactory(float delay);
+ AUD_DelayFactory(AUD_IFactory* factory, float delay = 0);
/**
* Returns the delay in seconds.
*/
- float getDelay();
-
- /**
- * Sets the delay.
- * \param delay The new delay value in seconds.
- */
- void setDelay(float delay);
+ float getDelay() const;
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_DELAYFACTORY
diff --git a/intern/audaspace/FX/AUD_DelayReader.cpp b/intern/audaspace/FX/AUD_DelayReader.cpp
index f2521f645aa..e9f0c15b9b4 100644
--- a/intern/audaspace/FX/AUD_DelayReader.cpp
+++ b/intern/audaspace/FX/AUD_DelayReader.cpp
@@ -24,28 +24,19 @@
*/
#include "AUD_DelayReader.h"
-#include "AUD_Buffer.h"
#include <cstring>
AUD_DelayReader::AUD_DelayReader(AUD_IReader* reader, float delay) :
- AUD_EffectReader(reader)
+ AUD_EffectReader(reader),
+ m_delay(int(delay * reader->getSpecs().rate)),
+ m_remdelay(int(delay * reader->getSpecs().rate)),
+ m_empty(true)
{
- m_delay = (int)(delay * reader->getSpecs().rate);
- m_remdelay = m_delay;
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
-}
-
-AUD_DelayReader::~AUD_DelayReader()
-{
- delete m_buffer; AUD_DELETE("buffer")
}
void AUD_DelayReader::seek(int position)
{
- if(position < 0)
- return;
-
if(position < m_delay)
{
m_remdelay = m_delay - position;
@@ -58,18 +49,18 @@ void AUD_DelayReader::seek(int position)
}
}
-int AUD_DelayReader::getLength()
+int AUD_DelayReader::getLength() const
{
int len = m_reader->getLength();
if(len < 0)
return len;
- return len+m_delay;
+ return len + m_delay;
}
-int AUD_DelayReader::getPosition()
+int AUD_DelayReader::getPosition() const
{
if(m_remdelay > 0)
- return m_delay-m_remdelay;
+ return m_delay - m_remdelay;
return m_reader->getPosition() + m_delay;
}
@@ -80,26 +71,41 @@ void AUD_DelayReader::read(int & length, sample_t* & buffer)
AUD_Specs specs = m_reader->getSpecs();
int samplesize = AUD_SAMPLE_SIZE(specs);
- if(m_buffer->getSize() < length * samplesize)
- m_buffer->resize(length * samplesize);
+ if(m_buffer.getSize() < length * samplesize)
+ {
+ m_buffer.resize(length * samplesize);
+ m_empty = false;
+ }
+
+ buffer = m_buffer.getBuffer();
if(length > m_remdelay)
{
- memset(m_buffer->getBuffer(), 0, m_remdelay * samplesize);
+ if(!m_empty)
+ memset(buffer, 0, m_remdelay * samplesize);
+
int len = length - m_remdelay;
- m_reader->read(len, buffer);
- memcpy(m_buffer->getBuffer() + m_remdelay * specs.channels,
- buffer, len * samplesize);
+ sample_t* buf;
+ m_reader->read(len, buf);
+
+ memcpy(buffer + m_remdelay * specs.channels,
+ buf, len * samplesize);
+
if(len < length-m_remdelay)
length = m_remdelay + len;
+
m_remdelay = 0;
+ m_empty = false;
}
else
{
- memset(m_buffer->getBuffer(), 0, length * samplesize);
+ if(!m_empty)
+ {
+ memset(buffer, 0, length * samplesize);
+ m_empty = true;
+ }
m_remdelay -= length;
}
- buffer = m_buffer->getBuffer();
}
else
m_reader->read(length, buffer);
diff --git a/intern/audaspace/FX/AUD_DelayReader.h b/intern/audaspace/FX/AUD_DelayReader.h
index 4662b455dfc..121842b0c6b 100644
--- a/intern/audaspace/FX/AUD_DelayReader.h
+++ b/intern/audaspace/FX/AUD_DelayReader.h
@@ -27,7 +27,7 @@
#define AUD_DELAYREADER
#include "AUD_EffectReader.h"
-class AUD_Buffer;
+#include "AUD_Buffer.h"
/**
* This class reads another reader and changes it's delay.
@@ -38,35 +38,38 @@ private:
/**
* The playback buffer.
*/
- AUD_Buffer *m_buffer;
+ AUD_Buffer m_buffer;
/**
* The delay level.
*/
- int m_delay;
+ const int m_delay;
/**
* The remaining delay for playback.
*/
int m_remdelay;
+ /**
+ * Whether the buffer is currently filled with zeros.
+ */
+ bool m_empty;
+
+ // hide copy constructor and operator=
+ AUD_DelayReader(const AUD_DelayReader&);
+ AUD_DelayReader& operator=(const AUD_DelayReader&);
+
public:
/**
* Creates a new delay reader.
* \param reader The reader to read from.
* \param delay The delay in seconds.
- * \exception AUD_Exception Thrown if the reader specified is NULL.
*/
AUD_DelayReader(AUD_IReader* reader, float delay);
- /**
- * Destroys the reader.
- */
- virtual ~AUD_DelayReader();
-
virtual void seek(int position);
- virtual int getLength();
- virtual int getPosition();
+ virtual int getLength() const;
+ virtual int getPosition() const;
virtual void read(int & length, sample_t* & buffer);
};
diff --git a/intern/audaspace/FX/AUD_DoubleFactory.cpp b/intern/audaspace/FX/AUD_DoubleFactory.cpp
new file mode 100644
index 00000000000..9f625d0763f
--- /dev/null
+++ b/intern/audaspace/FX/AUD_DoubleFactory.cpp
@@ -0,0 +1,50 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN LGPL LICENSE BLOCK *****
+ *
+ * Copyright 2009 Jörg Hermann Müller
+ *
+ * This file is part of AudaSpace.
+ *
+ * AudaSpace is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AudaSpace is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * ***** END LGPL LICENSE BLOCK *****
+ */
+
+#include "AUD_DoubleFactory.h"
+#include "AUD_DoubleReader.h"
+
+AUD_DoubleFactory::AUD_DoubleFactory(AUD_IFactory* factory1, AUD_IFactory* factory2) :
+ m_factory1(factory1), m_factory2(factory2)
+{
+}
+
+AUD_IReader* AUD_DoubleFactory::createReader() const
+{
+ AUD_IReader* reader1 = m_factory1->createReader();
+ AUD_IReader* reader2;
+
+ try
+ {
+ reader2 = m_factory2->createReader();
+ }
+ catch(AUD_Exception&)
+ {
+ delete reader1;
+ throw;
+ }
+
+ return new AUD_DoubleReader(reader1, reader2);
+}
diff --git a/intern/audaspace/FX/AUD_SquareReader.h b/intern/audaspace/FX/AUD_DoubleFactory.h
index 63dda351445..f2e83b2e27a 100644
--- a/intern/audaspace/FX/AUD_SquareReader.h
+++ b/intern/audaspace/FX/AUD_DoubleFactory.h
@@ -23,43 +23,41 @@
* ***** END LGPL LICENSE BLOCK *****
*/
-#ifndef AUD_SQUAREREADER
-#define AUD_SQUAREREADER
+#ifndef AUD_DOUBLEFACTORY
+#define AUD_DOUBLEFACTORY
-#include "AUD_EffectReader.h"
-class AUD_Buffer;
+#include "AUD_IFactory.h"
/**
- * This class changes another signal into a square signal.
+ * This factory plays two other factories behind each other.
+ * \note Readers from the underlying factories must have the same sample rate and channel count.
*/
-class AUD_SquareReader : public AUD_EffectReader
+class AUD_DoubleFactory : public AUD_IFactory
{
private:
/**
- * The playback buffer.
+ * First played factory.
*/
- AUD_Buffer *m_buffer;
+ AUD_IFactory* m_factory1;
/**
- * The threshold level.
+ * Second played factory.
*/
- float m_threshold;
+ AUD_IFactory* m_factory2;
-public:
- /**
- * Creates a new square reader.
- * \param reader The reader to read from.
- * \param threshold The size of the buffer.
- * \exception AUD_Exception Thrown if the reader specified is NULL.
- */
- AUD_SquareReader(AUD_IReader* reader, float threshold);
+ // hide copy constructor and operator=
+ AUD_DoubleFactory(const AUD_DoubleFactory&);
+ AUD_DoubleFactory& operator=(const AUD_DoubleFactory&);
+public:
/**
- * Destroys the reader.
+ * Creates a new double factory.
+ * \param factory1 The first input factory.
+ * \param factory2 The second input factory.
*/
- virtual ~AUD_SquareReader();
+ AUD_DoubleFactory(AUD_IFactory* factory1, AUD_IFactory* factory2);
- virtual void read(int & length, sample_t* & buffer);
+ virtual AUD_IReader* createReader() const;
};
-#endif //AUD_SQUAREREADER
+#endif //AUD_DOUBLEFACTORY
diff --git a/intern/audaspace/FX/AUD_DoubleReader.cpp b/intern/audaspace/FX/AUD_DoubleReader.cpp
index 1e51a094427..5c6ca6a1fc5 100644
--- a/intern/audaspace/FX/AUD_DoubleReader.cpp
+++ b/intern/audaspace/FX/AUD_DoubleReader.cpp
@@ -24,80 +24,51 @@
*/
#include "AUD_DoubleReader.h"
-#include "AUD_Buffer.h"
#include <cstring>
+static const char* specs_error = "AUD_DoubleReader: Both readers have to have "
+ "the same specs.";
+
AUD_DoubleReader::AUD_DoubleReader(AUD_IReader* reader1,
AUD_IReader* reader2) :
- m_reader1(reader1), m_reader2(reader2)
+ m_reader1(reader1), m_reader2(reader2), m_finished1(false)
{
- try
- {
- if(!reader1)
- AUD_THROW(AUD_ERROR_READER);
-
- if(!reader2)
- AUD_THROW(AUD_ERROR_READER);
-
- AUD_Specs s1, s2;
- s1 = reader1->getSpecs();
- s2 = reader2->getSpecs();
- if(memcmp(&s1, &s2, sizeof(AUD_Specs)) != 0)
- AUD_THROW(AUD_ERROR_READER);
- }
-
- catch(AUD_Exception)
+ AUD_Specs s1, s2;
+ s1 = reader1->getSpecs();
+ s2 = reader2->getSpecs();
+ if(memcmp(&s1, &s2, sizeof(AUD_Specs)) != 0)
{
- if(reader1)
- {
- delete reader1; AUD_DELETE("reader")
- }
- if(reader2)
- {
- delete reader2; AUD_DELETE("reader")
- }
-
- throw;
+ delete reader1;
+ delete reader2;
+ AUD_THROW(AUD_ERROR_SPECS, specs_error);
}
-
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
- m_finished1 = false;
}
AUD_DoubleReader::~AUD_DoubleReader()
{
- delete m_reader1; AUD_DELETE("reader")
- delete m_reader2; AUD_DELETE("reader")
- delete m_buffer; AUD_DELETE("buffer")
+ delete m_reader1;
+ delete m_reader2;
}
-bool AUD_DoubleReader::isSeekable()
+bool AUD_DoubleReader::isSeekable() const
{
- return false;
+ return m_reader1->isSeekable() && m_reader2->isSeekable();
}
void AUD_DoubleReader::seek(int position)
{
- int length1 = m_reader1->getLength();
+ m_reader1->seek(position);
- if(position < 0)
- position = 0;
+ int pos1 = m_reader1->getPosition();
- if(position < length1)
- {
- m_reader1->seek(position);
- m_reader2->seek(0);
- m_finished1 = false;
- }
+ if((m_finished1 = (pos1 < position)))
+ m_reader2->seek(position - pos1);
else
- {
- m_reader2->seek(position-length1);
- m_finished1 = true;
- }
+ m_reader2->seek(0);
}
-int AUD_DoubleReader::getLength()
+int AUD_DoubleReader::getLength() const
{
int len1 = m_reader1->getLength();
int len2 = m_reader2->getLength();
@@ -106,49 +77,45 @@ int AUD_DoubleReader::getLength()
return len1 + len2;
}
-int AUD_DoubleReader::getPosition()
+int AUD_DoubleReader::getPosition() const
{
return m_reader1->getPosition() + m_reader2->getPosition();
}
-AUD_Specs AUD_DoubleReader::getSpecs()
+AUD_Specs AUD_DoubleReader::getSpecs() const
{
return m_reader1->getSpecs();
}
-AUD_ReaderType AUD_DoubleReader::getType()
-{
- if(m_reader1->getType() == AUD_TYPE_BUFFER &&
- m_reader2->getType() == AUD_TYPE_BUFFER)
- return AUD_TYPE_BUFFER;
- return AUD_TYPE_STREAM;
-}
-
-bool AUD_DoubleReader::notify(AUD_Message &message)
-{
- return m_reader1->notify(message) | m_reader2->notify(message);
-}
-
void AUD_DoubleReader::read(int & length, sample_t* & buffer)
{
if(!m_finished1)
{
int len = length;
m_reader1->read(len, buffer);
+
if(len < length)
{
AUD_Specs specs = m_reader1->getSpecs();
int samplesize = AUD_SAMPLE_SIZE(specs);
- if(m_buffer->getSize() < length * samplesize)
- m_buffer->resize(length * samplesize);
- memcpy(m_buffer->getBuffer(), buffer, len * samplesize);
+
+ if(m_buffer.getSize() < length * samplesize)
+ m_buffer.resize(length * samplesize);
+
+ sample_t* buf = buffer;
+ buffer = m_buffer.getBuffer();
+
+ memcpy(buffer, buf, len * samplesize);
+
len = length - len;
length -= len;
- m_reader2->read(len, buffer);
- memcpy(m_buffer->getBuffer() + length * specs.channels, buffer,
+ m_reader2->read(len, buf);
+
+ memcpy(buffer + length * specs.channels, buf,
len * samplesize);
+
length += len;
- buffer = m_buffer->getBuffer();
+
m_finished1 = true;
}
}
diff --git a/intern/audaspace/FX/AUD_DoubleReader.h b/intern/audaspace/FX/AUD_DoubleReader.h
index d82b81ec0ba..d80ba33dfe3 100644
--- a/intern/audaspace/FX/AUD_DoubleReader.h
+++ b/intern/audaspace/FX/AUD_DoubleReader.h
@@ -27,7 +27,7 @@
#define AUD_DOUBLEREADER
#include "AUD_IReader.h"
-class AUD_Buffer;
+#include "AUD_Buffer.h"
/**
* This reader plays two readers with the same specs sequently.
@@ -53,15 +53,18 @@ private:
/**
* The playback buffer for the intersecting part.
*/
- AUD_Buffer* m_buffer;
+ AUD_Buffer m_buffer;
+
+ // hide copy constructor and operator=
+ AUD_DoubleReader(const AUD_DoubleReader&);
+ AUD_DoubleReader& operator=(const AUD_DoubleReader&);
public:
/**
* Creates a new ping pong reader.
* \param reader1 The first reader to read from.
* \param reader2 The second reader to read from.
- * \exception AUD_Exception Thrown if one of the reader specified is NULL
- * or the specs from the readers differ.
+ * \exception AUD_Exception Thrown if the specs from the readers differ.
*/
AUD_DoubleReader(AUD_IReader* reader1, AUD_IReader* reader2);
@@ -70,13 +73,11 @@ public:
*/
virtual ~AUD_DoubleReader();
- virtual bool isSeekable();
+ virtual bool isSeekable() const;
virtual void seek(int position);
- virtual int getLength();
- virtual int getPosition();
- virtual AUD_Specs getSpecs();
- virtual AUD_ReaderType getType();
- virtual bool notify(AUD_Message &message);
+ virtual int getLength() const;
+ virtual int getPosition() const;
+ virtual AUD_Specs getSpecs() const;
virtual void read(int & length, sample_t* & buffer);
};
diff --git a/intern/audaspace/FX/AUD_EffectFactory.cpp b/intern/audaspace/FX/AUD_EffectFactory.cpp
index 882499416b7..eda4e4e04b2 100644
--- a/intern/audaspace/FX/AUD_EffectFactory.cpp
+++ b/intern/audaspace/FX/AUD_EffectFactory.cpp
@@ -26,25 +26,16 @@
#include "AUD_EffectFactory.h"
#include "AUD_IReader.h"
-AUD_IReader* AUD_EffectFactory::getReader()
-{
- if(m_factory != 0)
- return m_factory->createReader();
-
- return 0;
-}
-
AUD_EffectFactory::AUD_EffectFactory(AUD_IFactory* factory)
{
m_factory = factory;
}
-void AUD_EffectFactory::setFactory(AUD_IFactory* factory)
+AUD_EffectFactory::~AUD_EffectFactory()
{
- m_factory = factory;
}
-AUD_IFactory* AUD_EffectFactory::getFactory()
+AUD_IFactory* AUD_EffectFactory::getFactory() const
{
return m_factory;
}
diff --git a/intern/audaspace/FX/AUD_EffectFactory.h b/intern/audaspace/FX/AUD_EffectFactory.h
index 67259b9e6c3..fd3746d0da3 100644
--- a/intern/audaspace/FX/AUD_EffectFactory.h
+++ b/intern/audaspace/FX/AUD_EffectFactory.h
@@ -34,6 +34,11 @@
*/
class AUD_EffectFactory : public AUD_IFactory
{
+private:
+ // hide copy constructor and operator=
+ AUD_EffectFactory(const AUD_EffectFactory&);
+ AUD_EffectFactory& operator=(const AUD_EffectFactory&);
+
protected:
/**
* If there is no reader it is created out of this factory.
@@ -44,9 +49,12 @@ protected:
* Returns the reader created out of the factory.
* This method can be used for the createReader function of the implementing
* classes.
- * \return The reader created out of the factory or NULL if there is none.
+ * \return The reader created out of the factory.
*/
- AUD_IReader* getReader();
+ inline AUD_IReader* getReader() const
+ {
+ return m_factory->createReader();
+ }
public:
/**
@@ -58,19 +66,13 @@ public:
/**
* Destroys the factory.
*/
- virtual ~AUD_EffectFactory() {}
-
- /**
- * Sets the input factory.
- * \param factory The input factory.
- */
- void setFactory(AUD_IFactory* factory);
+ virtual ~AUD_EffectFactory();
/**
* Returns the saved factory.
* \return The factory or NULL if there has no factory been saved.
*/
- AUD_IFactory* getFactory();
+ AUD_IFactory* getFactory() const;
};
#endif //AUD_EFFECTFACTORY
diff --git a/intern/audaspace/FX/AUD_EffectReader.cpp b/intern/audaspace/FX/AUD_EffectReader.cpp
index 47026b88440..b54ca279088 100644
--- a/intern/audaspace/FX/AUD_EffectReader.cpp
+++ b/intern/audaspace/FX/AUD_EffectReader.cpp
@@ -27,17 +27,15 @@
AUD_EffectReader::AUD_EffectReader(AUD_IReader* reader)
{
- if(!reader)
- AUD_THROW(AUD_ERROR_READER);
m_reader = reader;
}
AUD_EffectReader::~AUD_EffectReader()
{
- delete m_reader; AUD_DELETE("reader")
+ delete m_reader;
}
-bool AUD_EffectReader::isSeekable()
+bool AUD_EffectReader::isSeekable() const
{
return m_reader->isSeekable();
}
@@ -47,31 +45,21 @@ void AUD_EffectReader::seek(int position)
m_reader->seek(position);
}
-int AUD_EffectReader::getLength()
+int AUD_EffectReader::getLength() const
{
return m_reader->getLength();
}
-int AUD_EffectReader::getPosition()
+int AUD_EffectReader::getPosition() const
{
return m_reader->getPosition();
}
-AUD_Specs AUD_EffectReader::getSpecs()
+AUD_Specs AUD_EffectReader::getSpecs() const
{
return m_reader->getSpecs();
}
-AUD_ReaderType AUD_EffectReader::getType()
-{
- return m_reader->getType();
-}
-
-bool AUD_EffectReader::notify(AUD_Message &message)
-{
- return m_reader->notify(message);
-}
-
void AUD_EffectReader::read(int & length, sample_t* & buffer)
{
m_reader->read(length, buffer);
diff --git a/intern/audaspace/FX/AUD_EffectReader.h b/intern/audaspace/FX/AUD_EffectReader.h
index f64bf34077d..c447f79bc6e 100644
--- a/intern/audaspace/FX/AUD_EffectReader.h
+++ b/intern/audaspace/FX/AUD_EffectReader.h
@@ -34,6 +34,11 @@
*/
class AUD_EffectReader : public AUD_IReader
{
+private:
+ // hide copy constructor and operator=
+ AUD_EffectReader(const AUD_EffectReader&);
+ AUD_EffectReader& operator=(const AUD_EffectReader&);
+
protected:
/**
* The reader to read from.
@@ -44,7 +49,6 @@ public:
/**
* Creates a new effect reader.
* \param reader The reader to read from.
- * \exception AUD_Exception Thrown if the reader specified is NULL.
*/
AUD_EffectReader(AUD_IReader* reader);
@@ -53,13 +57,11 @@ public:
*/
virtual ~AUD_EffectReader();
- virtual bool isSeekable();
+ virtual bool isSeekable() const;
virtual void seek(int position);
- virtual int getLength();
- virtual int getPosition();
- virtual AUD_Specs getSpecs();
- virtual AUD_ReaderType getType();
- virtual bool notify(AUD_Message &message);
+ virtual int getLength() const;
+ virtual int getPosition() const;
+ virtual AUD_Specs getSpecs() const;
virtual void read(int & length, sample_t* & buffer);
};
diff --git a/intern/audaspace/FX/AUD_EnvelopeFactory.cpp b/intern/audaspace/FX/AUD_EnvelopeFactory.cpp
index c3b2c3f24fe..4777da70404 100644
--- a/intern/audaspace/FX/AUD_EnvelopeFactory.cpp
+++ b/intern/audaspace/FX/AUD_EnvelopeFactory.cpp
@@ -24,7 +24,31 @@
*/
#include "AUD_EnvelopeFactory.h"
-#include "AUD_EnvelopeReader.h"
+#include "AUD_CallbackIIRFilterReader.h"
+
+#include <cmath>
+
+struct EnvelopeParameters
+{
+ float attack;
+ float release;
+ float threshold;
+ float arthreshold;
+};
+
+sample_t envelopeFilter(AUD_CallbackIIRFilterReader* reader, EnvelopeParameters* param)
+{
+ float in = fabs(reader->x(0));
+ float out = reader->y(-1);
+ if(in < param->threshold)
+ in = 0.0f;
+ return (in > out ? param->attack : param->release) * (out - in) + in;
+}
+
+void endEnvelopeFilter(EnvelopeParameters* param)
+{
+ delete param;
+}
AUD_EnvelopeFactory::AUD_EnvelopeFactory(AUD_IFactory* factory, float attack,
float release, float threshold,
@@ -33,26 +57,22 @@ AUD_EnvelopeFactory::AUD_EnvelopeFactory(AUD_IFactory* factory, float attack,
m_attack(attack),
m_release(release),
m_threshold(threshold),
- m_arthreshold(arthreshold) {}
-
-AUD_EnvelopeFactory::AUD_EnvelopeFactory(float attack, float release,
- float threshold, float arthreshold) :
- AUD_EffectFactory(0),
- m_attack(attack),
- m_release(release),
- m_threshold(threshold),
- m_arthreshold(arthreshold) {}
+ m_arthreshold(arthreshold)
+{
+}
-AUD_IReader* AUD_EnvelopeFactory::createReader()
+AUD_IReader* AUD_EnvelopeFactory::createReader() const
{
AUD_IReader* reader = getReader();
- if(reader != 0)
- {
- reader = new AUD_EnvelopeReader(reader, m_attack, m_release,
- m_threshold, m_arthreshold);
- AUD_NEW("reader")
- }
+ EnvelopeParameters* param = new EnvelopeParameters();
+ param->arthreshold = m_arthreshold;
+ param->attack = pow(m_arthreshold, 1.0f/(reader->getSpecs().rate * m_attack));
+ param->release = pow(m_arthreshold, 1.0f/(reader->getSpecs().rate * m_release));
+ param->threshold = m_threshold;
- return reader;
+ return new AUD_CallbackIIRFilterReader(reader, 1, 2,
+ (doFilterIIR) envelopeFilter,
+ (endFilterIIR) endEnvelopeFilter,
+ param);
}
diff --git a/intern/audaspace/FX/AUD_EnvelopeFactory.h b/intern/audaspace/FX/AUD_EnvelopeFactory.h
index c79e5472e30..c31c6727d03 100644
--- a/intern/audaspace/FX/AUD_EnvelopeFactory.h
+++ b/intern/audaspace/FX/AUD_EnvelopeFactory.h
@@ -37,22 +37,26 @@ private:
/**
* The attack value in seconds.
*/
- float m_attack;
+ const float m_attack;
/**
* The release value in seconds.
*/
- float m_release;
+ const float m_release;
/**
* The threshold value.
*/
- float m_threshold;
+ const float m_threshold;
/**
* The attack/release threshold value.
*/
- float m_arthreshold;
+ const float m_arthreshold;
+
+ // hide copy constructor and operator=
+ AUD_EnvelopeFactory(const AUD_EnvelopeFactory&);
+ AUD_EnvelopeFactory& operator=(const AUD_EnvelopeFactory&);
public:
/**
@@ -66,17 +70,7 @@ public:
AUD_EnvelopeFactory(AUD_IFactory* factory, float attack, float release,
float threshold, float arthreshold);
- /**
- * Creates a new envelope factory.
- * \param attack The attack value in seconds.
- * \param release The release value in seconds.
- * \param threshold The threshold value.
- * \param arthreshold The attack/release threshold value.
- */
- AUD_EnvelopeFactory(float attack, float release, float threshold,
- float arthreshold);
-
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_ENVELOPEFACTORY
diff --git a/intern/audaspace/FX/AUD_EnvelopeReader.cpp b/intern/audaspace/FX/AUD_EnvelopeReader.cpp
deleted file mode 100644
index 71ccbfd6503..00000000000
--- a/intern/audaspace/FX/AUD_EnvelopeReader.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * $Id$
- *
- * ***** BEGIN LGPL LICENSE BLOCK *****
- *
- * Copyright 2009 Jörg Hermann Müller
- *
- * This file is part of AudaSpace.
- *
- * AudaSpace is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * AudaSpace is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
- *
- * ***** END LGPL LICENSE BLOCK *****
- */
-
-#include "AUD_EnvelopeReader.h"
-#include "AUD_Buffer.h"
-
-#include <cstring>
-#include <cmath>
-
-AUD_EnvelopeReader::AUD_EnvelopeReader(AUD_IReader* reader, float attack,
- float release, float threshold,
- float arthreshold) :
- AUD_EffectReader(reader),
- m_threshold(threshold)
-{
- AUD_Specs specs = reader->getSpecs();
- int samplesize = AUD_SAMPLE_SIZE(specs);
-
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
-
- m_envelopes = new AUD_Buffer(samplesize);
- AUD_NEW("buffer")
- memset(m_envelopes->getBuffer(), 0, samplesize);
-
- m_bAttack = pow(arthreshold, 1.0f/(specs.rate * attack));
- m_bRelease = pow(arthreshold, 1.0f/(specs.rate * release));
-}
-
-AUD_EnvelopeReader::~AUD_EnvelopeReader()
-{
- delete m_buffer; AUD_DELETE("buffer")
- delete m_envelopes; AUD_DELETE("buffer")
-}
-
-void AUD_EnvelopeReader::read(int & length, sample_t* & buffer)
-{
- sample_t* buf;
- sample_t* envelopes;
- envelopes = m_envelopes->getBuffer();
-
- AUD_Specs specs = m_reader->getSpecs();
-
- m_reader->read(length, buf);
- if(m_buffer->getSize() < length * AUD_SAMPLE_SIZE(specs))
- m_buffer->resize(length * AUD_SAMPLE_SIZE(specs));
-
- buffer = m_buffer->getBuffer();
-
- sample_t value;
-
- for(int channel = 0; channel < specs.channels; channel++)
- {
- for(int i = 0; i < length; i++)
- {
- value = fabs(buf[i * specs.channels + channel]);
- if(value < m_threshold)
- value = 0.0f;
-
- buffer[i * specs.channels + channel] = envelopes[channel] =
- ((value > envelopes[channel]) ? m_bAttack : m_bRelease) *
- (envelopes[channel] - value) + value;
- }
- }
-}
diff --git a/intern/audaspace/FX/AUD_EnvelopeReader.h b/intern/audaspace/FX/AUD_EnvelopeReader.h
deleted file mode 100644
index ff9dd23d34c..00000000000
--- a/intern/audaspace/FX/AUD_EnvelopeReader.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * $Id$
- *
- * ***** BEGIN LGPL LICENSE BLOCK *****
- *
- * Copyright 2009 Jörg Hermann Müller
- *
- * This file is part of AudaSpace.
- *
- * AudaSpace is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * AudaSpace is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
- *
- * ***** END LGPL LICENSE BLOCK *****
- */
-
-#ifndef AUD_ENVELOPEREADER
-#define AUD_ENVELOPEREADER
-
-#include "AUD_EffectReader.h"
-class AUD_Buffer;
-
-/**
- * This class represents an envelope follower.
- */
-class AUD_EnvelopeReader : public AUD_EffectReader
-{
-private:
- /**
- * The playback buffer.
- */
- AUD_Buffer *m_buffer;
-
- /**
- * The last envelopes buffer.
- */
- AUD_Buffer *m_envelopes;
-
- /**
- * Attack b value.
- */
- float m_bAttack;
-
- /**
- * Release b value.
- */
- float m_bRelease;
-
- /**
- * Threshold value.
- */
- float m_threshold;
-
-public:
- /**
- * Creates a new envelope reader.
- * \param reader The reader to read from.
- * \param attack The attack value in seconds.
- * \param release The release value in seconds.
- * \param threshold The threshold value.
- * \param arthreshold The attack/release threshold value.
- * \exception AUD_Exception Thrown if the reader specified is NULL.
- */
- AUD_EnvelopeReader(AUD_IReader* reader, float attack, float release,
- float threshold, float arthreshold);
-
- /**
- * Destroys the reader.
- */
- virtual ~AUD_EnvelopeReader();
-
- virtual void read(int & length, sample_t* & buffer);
-};
-
-#endif //AUD_ENVELOPEREADER
diff --git a/intern/audaspace/FX/AUD_FaderFactory.cpp b/intern/audaspace/FX/AUD_FaderFactory.cpp
index 4357e11bd43..bbe9319c928 100644
--- a/intern/audaspace/FX/AUD_FaderFactory.cpp
+++ b/intern/audaspace/FX/AUD_FaderFactory.cpp
@@ -31,54 +31,26 @@ AUD_FaderFactory::AUD_FaderFactory(AUD_IFactory* factory, AUD_FadeType type,
AUD_EffectFactory(factory),
m_type(type),
m_start(start),
- m_length(length) {}
-
-AUD_FaderFactory::AUD_FaderFactory(AUD_FadeType type,
- float start, float length) :
- AUD_EffectFactory(0),
- m_type(type),
- m_start(start),
- m_length(length) {}
-
-AUD_FadeType AUD_FaderFactory::getType()
+ m_length(length)
{
- return m_type;
}
-void AUD_FaderFactory::setType(AUD_FadeType type)
+AUD_FadeType AUD_FaderFactory::getType() const
{
- m_type = type;
+ return m_type;
}
-float AUD_FaderFactory::getStart()
+float AUD_FaderFactory::getStart() const
{
return m_start;
}
-void AUD_FaderFactory::setStart(float start)
-{
- m_start = start;
-}
-
-float AUD_FaderFactory::getLength()
+float AUD_FaderFactory::getLength() const
{
return m_length;
}
-void AUD_FaderFactory::setLength(float length)
+AUD_IReader* AUD_FaderFactory::createReader() const
{
- m_length = length;
-}
-
-AUD_IReader* AUD_FaderFactory::createReader()
-{
- AUD_IReader* reader = getReader();
-
- if(reader != 0)
- {
- reader = new AUD_FaderReader(reader, m_type, m_start, m_length);
- AUD_NEW("reader")
- }
-
- return reader;
+ return new AUD_FaderReader(getReader(), m_type, m_start, m_length);
}
diff --git a/intern/audaspace/FX/AUD_FaderFactory.h b/intern/audaspace/FX/AUD_FaderFactory.h
index 4999ccac8f1..af5d18538ea 100644
--- a/intern/audaspace/FX/AUD_FaderFactory.h
+++ b/intern/audaspace/FX/AUD_FaderFactory.h
@@ -39,17 +39,21 @@ private:
/**
* The fading type.
*/
- AUD_FadeType m_type;
+ const AUD_FadeType m_type;
/**
* The fading start.
*/
- float m_start;
+ const float m_start;
/**
* The fading length.
*/
- float m_length;
+ const float m_length;
+
+ // hide copy constructor and operator=
+ AUD_FaderFactory(const AUD_FaderFactory&);
+ AUD_FaderFactory& operator=(const AUD_FaderFactory&);
public:
/**
@@ -59,53 +63,26 @@ public:
* \param start The time where fading should start in seconds.
* \param length How long fading should last in seconds.
*/
- AUD_FaderFactory(AUD_IFactory* factory = 0,
+ AUD_FaderFactory(AUD_IFactory* factory,
AUD_FadeType type = AUD_FADE_IN,
float start = 0.0f, float length = 1.0f);
/**
- * Creates a new fader factory.
- * \param type The fading type.
- * \param start The time where fading should start in seconds.
- * \param length How long fading should last in seconds.
- */
- AUD_FaderFactory(AUD_FadeType type = AUD_FADE_IN,
- float start = 0.0f, float length = 1.0f);
-
- /**
* Returns the fading type.
*/
- AUD_FadeType getType();
-
- /**
- * Sets the fading type.
- * \param type The new fading type: AUD_FADE_IN or AUD_FADE_OUT.
- */
- void setType(AUD_FadeType type);
+ AUD_FadeType getType() const;
/**
* Returns the fading start.
*/
- float getStart();
-
- /**
- * Sets the fading start.
- * \param start The new fading start.
- */
- void setStart(float start);
+ float getStart() const;
/**
* Returns the fading length.
*/
- float getLength();
-
- /**
- * Sets the fading length.
- * \param start The new fading length.
- */
- void setLength(float length);
+ float getLength() const;
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_FADERFACTORY
diff --git a/intern/audaspace/FX/AUD_FaderReader.cpp b/intern/audaspace/FX/AUD_FaderReader.cpp
index 4e919fff323..2292fa06102 100644
--- a/intern/audaspace/FX/AUD_FaderReader.cpp
+++ b/intern/audaspace/FX/AUD_FaderReader.cpp
@@ -24,7 +24,6 @@
*/
#include "AUD_FaderReader.h"
-#include "AUD_Buffer.h"
#include <cstring>
@@ -33,19 +32,9 @@ AUD_FaderReader::AUD_FaderReader(AUD_IReader* reader, AUD_FadeType type,
AUD_EffectReader(reader),
m_type(type),
m_start(start),
- m_length(length)
+ m_length(length),
+ m_empty(true)
{
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
-}
-
-AUD_FaderReader::~AUD_FaderReader()
-{
- delete m_buffer; AUD_DELETE("buffer")
-}
-
-bool AUD_FaderReader::notify(AUD_Message &message)
-{
- return m_reader->notify(message);
}
void AUD_FaderReader::read(int & length, sample_t* & buffer)
@@ -56,28 +45,50 @@ void AUD_FaderReader::read(int & length, sample_t* & buffer)
m_reader->read(length, buffer);
- if(m_buffer->getSize() < length * samplesize)
- m_buffer->resize(length * samplesize);
-
if((position + length) / (float)specs.rate <= m_start)
{
if(m_type != AUD_FADE_OUT)
{
- buffer = m_buffer->getBuffer();
- memset(buffer, 0, length * samplesize);
+ if(m_buffer.getSize() < length * samplesize)
+ {
+ m_buffer.resize(length * samplesize);
+ m_empty = false;
+ }
+
+ buffer = m_buffer.getBuffer();
+
+ if(!m_empty)
+ {
+ memset(buffer, 0, length * samplesize);
+ m_empty = true;
+ }
}
}
else if(position / (float)specs.rate >= m_start+m_length)
{
if(m_type == AUD_FADE_OUT)
{
- buffer = m_buffer->getBuffer();
- memset(buffer, 0, length * samplesize);
+ if(m_buffer.getSize() < length * samplesize)
+ {
+ m_buffer.resize(length * samplesize);
+ m_empty = false;
+ }
+
+ buffer = m_buffer.getBuffer();
+
+ if(!m_empty)
+ {
+ memset(buffer, 0, length * samplesize);
+ m_empty = true;
+ }
}
}
else
{
- sample_t* buf = m_buffer->getBuffer();
+ if(m_buffer.getSize() < length * samplesize)
+ m_buffer.resize(length * samplesize);
+
+ sample_t* buf = m_buffer.getBuffer();
float volume = 1.0f;
for(int i = 0; i < length * specs.channels; i++)
@@ -98,5 +109,6 @@ void AUD_FaderReader::read(int & length, sample_t* & buffer)
}
buffer = buf;
+ m_empty = false;
}
}
diff --git a/intern/audaspace/FX/AUD_FaderReader.h b/intern/audaspace/FX/AUD_FaderReader.h
index a75ac6e7a47..d9d685af956 100644
--- a/intern/audaspace/FX/AUD_FaderReader.h
+++ b/intern/audaspace/FX/AUD_FaderReader.h
@@ -27,7 +27,7 @@
#define AUD_FADERREADER
#include "AUD_EffectReader.h"
-class AUD_Buffer;
+#include "AUD_Buffer.h"
/**
* This class fades another reader.
@@ -38,24 +38,33 @@ class AUD_FaderReader : public AUD_EffectReader
{
private:
/**
- * The playback buffer.
- */
- AUD_Buffer *m_buffer;
-
- /**
* The fading type.
*/
- AUD_FadeType m_type;
+ const AUD_FadeType m_type;
/**
* The fading start.
*/
- float m_start;
+ const float m_start;
/**
* The fading length.
*/
- float m_length;
+ const float m_length;
+
+ /**
+ * The playback buffer.
+ */
+ AUD_Buffer m_buffer;
+
+ /**
+ * Whether the buffer is empty.
+ */
+ bool m_empty;
+
+ // hide copy constructor and operator=
+ AUD_FaderReader(const AUD_FaderReader&);
+ AUD_FaderReader& operator=(const AUD_FaderReader&);
public:
/**
@@ -63,17 +72,10 @@ public:
* \param type The fading type.
* \param start The time where fading should start in seconds.
* \param length How long fading should last in seconds.
- * \exception AUD_Exception Thrown if the reader specified is NULL.
*/
AUD_FaderReader(AUD_IReader* reader, AUD_FadeType type,
float start,float length);
- /**
- * Destroys the reader.
- */
- virtual ~AUD_FaderReader();
-
- virtual bool notify(AUD_Message &message);
virtual void read(int & length, sample_t* & buffer);
};
diff --git a/intern/audaspace/FX/AUD_HighpassFactory.cpp b/intern/audaspace/FX/AUD_HighpassFactory.cpp
index 384d36beab7..d222e7f615e 100644
--- a/intern/audaspace/FX/AUD_HighpassFactory.cpp
+++ b/intern/audaspace/FX/AUD_HighpassFactory.cpp
@@ -24,28 +24,38 @@
*/
#include "AUD_HighpassFactory.h"
-#include "AUD_HighpassReader.h"
+#include "AUD_IIRFilterReader.h"
+
+#include <cmath>
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
AUD_HighpassFactory::AUD_HighpassFactory(AUD_IFactory* factory, float frequency,
float Q) :
AUD_EffectFactory(factory),
m_frequency(frequency),
- m_Q(Q) {}
-
-AUD_HighpassFactory::AUD_HighpassFactory(float frequency, float Q) :
- AUD_EffectFactory(0),
- m_frequency(frequency),
- m_Q(Q) {}
+ m_Q(Q)
+{
+}
-AUD_IReader* AUD_HighpassFactory::createReader()
+AUD_IReader* AUD_HighpassFactory::createReader() const
{
AUD_IReader* reader = getReader();
- if(reader != 0)
- {
- reader = new AUD_HighpassReader(reader, m_frequency, m_Q);
- AUD_NEW("reader")
- }
+ // calculate coefficients
+ float w0 = 2 * M_PI * m_frequency / reader->getSpecs().rate;
+ float alpha = sin(w0) / (2 * m_Q);
+ float norm = 1 + alpha;
+ float c = cos(w0);
+ std::vector<float> a, b;
+ a.push_back(1);
+ a.push_back(-2 * c / norm);
+ a.push_back((1 - alpha) / norm);
+ b.push_back((1 + c) / (2 * norm));
+ b.push_back((-1 - c) / norm);
+ b.push_back(b[0]);
- return reader;
+ return new AUD_IIRFilterReader(reader, b, a);
}
diff --git a/intern/audaspace/FX/AUD_HighpassFactory.h b/intern/audaspace/FX/AUD_HighpassFactory.h
index 5e31053ed6c..1220157a776 100644
--- a/intern/audaspace/FX/AUD_HighpassFactory.h
+++ b/intern/audaspace/FX/AUD_HighpassFactory.h
@@ -37,12 +37,16 @@ private:
/**
* The attack value in seconds.
*/
- float m_frequency;
+ const float m_frequency;
/**
* The Q factor.
*/
- float m_Q;
+ const float m_Q;
+
+ // hide copy constructor and operator=
+ AUD_HighpassFactory(const AUD_HighpassFactory&);
+ AUD_HighpassFactory& operator=(const AUD_HighpassFactory&);
public:
/**
@@ -53,14 +57,7 @@ public:
*/
AUD_HighpassFactory(AUD_IFactory* factory, float frequency, float Q = 1.0f);
- /**
- * Creates a new highpass factory.
- * \param frequency The cutoff frequency.
- * \param Q The Q factor.
- */
- AUD_HighpassFactory(float frequency, float Q = 1.0f);
-
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_HIGHPASSFACTORY
diff --git a/intern/audaspace/FX/AUD_HighpassReader.cpp b/intern/audaspace/FX/AUD_HighpassReader.cpp
deleted file mode 100644
index 36b1bb8082e..00000000000
--- a/intern/audaspace/FX/AUD_HighpassReader.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * $Id$
- *
- * ***** BEGIN LGPL LICENSE BLOCK *****
- *
- * Copyright 2009 Jörg Hermann Müller
- *
- * This file is part of AudaSpace.
- *
- * AudaSpace is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * AudaSpace is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
- *
- * ***** END LGPL LICENSE BLOCK *****
- */
-
-#include "AUD_HighpassReader.h"
-#include "AUD_Buffer.h"
-
-#include <cstring>
-#include <cmath>
-
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
-
-#define CC channels + channel
-
-AUD_HighpassReader::AUD_HighpassReader(AUD_IReader* reader, float frequency,
- float Q) :
- AUD_EffectReader(reader)
-{
- AUD_Specs specs = reader->getSpecs();
- int samplesize = AUD_SAMPLE_SIZE(specs);
-
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
-
- m_outvalues = new AUD_Buffer(samplesize * AUD_HIGHPASS_ORDER);
- AUD_NEW("buffer")
- memset(m_outvalues->getBuffer(), 0, samplesize * AUD_HIGHPASS_ORDER);
-
- m_invalues = new AUD_Buffer(samplesize * AUD_HIGHPASS_ORDER);
- AUD_NEW("buffer")
- memset(m_invalues->getBuffer(), 0, samplesize * AUD_HIGHPASS_ORDER);
-
- m_position = 0;
-
- // calculate coefficients
- float w0 = 2 * M_PI * frequency / specs.rate;
- float alpha = sin(w0) / (2 * Q);
- float norm = 1 + alpha;
- m_coeff[0][0] = 0;
- m_coeff[0][1] = -2 * cos(w0) / norm;
- m_coeff[0][2] = (1 - alpha) / norm;
- m_coeff[1][2] = m_coeff[1][0] = (1 + cos(w0)) / (2 * norm);
- m_coeff[1][1] = (-1 - cos(w0)) / norm;
-}
-
-AUD_HighpassReader::~AUD_HighpassReader()
-{
- delete m_buffer; AUD_DELETE("buffer")
-
- delete m_outvalues; AUD_DELETE("buffer")
- delete m_invalues; AUD_DELETE("buffer");
-}
-
-void AUD_HighpassReader::read(int & length, sample_t* & buffer)
-{
- sample_t* buf;
- sample_t* outvalues;
- sample_t* invalues;
-
- outvalues = m_outvalues->getBuffer();
- invalues = m_invalues->getBuffer();
-
- AUD_Specs specs = m_reader->getSpecs();
-
- m_reader->read(length, buf);
-
- if(m_buffer->getSize() < length * AUD_SAMPLE_SIZE(specs))
- m_buffer->resize(length * AUD_SAMPLE_SIZE(specs));
-
- buffer = m_buffer->getBuffer();
- int channels = specs.channels;
-
- for(int channel = 0; channel < channels; channel++)
- {
- for(int i = 0; i < length; i++)
- {
- invalues[m_position * CC] = buf[i * CC];
- outvalues[m_position * CC] = 0;
-
- for(int j = 0; j < AUD_HIGHPASS_ORDER; j++)
- {
- outvalues[m_position * CC] += m_coeff[1][j] *
- invalues[((m_position + j) % AUD_HIGHPASS_ORDER) * CC] -
- m_coeff[0][j] *
- outvalues[((m_position + j) % AUD_HIGHPASS_ORDER) * CC];
- }
-
- buffer[i * CC] = outvalues[m_position * CC];
-
- m_position = (m_position + AUD_HIGHPASS_ORDER-1) %
- AUD_HIGHPASS_ORDER;
- }
- }
-}
diff --git a/intern/audaspace/FX/AUD_HighpassReader.h b/intern/audaspace/FX/AUD_HighpassReader.h
deleted file mode 100644
index dc28a62e45b..00000000000
--- a/intern/audaspace/FX/AUD_HighpassReader.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * $Id$
- *
- * ***** BEGIN LGPL LICENSE BLOCK *****
- *
- * Copyright 2009 Jörg Hermann Müller
- *
- * This file is part of AudaSpace.
- *
- * AudaSpace is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * AudaSpace is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
- *
- * ***** END LGPL LICENSE BLOCK *****
- */
-
-#ifndef AUD_HIGHPASSREADER
-#define AUD_HIGHPASSREADER
-
-#include "AUD_EffectReader.h"
-class AUD_Buffer;
-
-#define AUD_HIGHPASS_ORDER 3
-
-/**
- * This class represents a highpass filter.
- */
-class AUD_HighpassReader : public AUD_EffectReader
-{
-private:
- /**
- * The playback buffer.
- */
- AUD_Buffer *m_buffer;
-
- /**
- * The last out values buffer.
- */
- AUD_Buffer *m_outvalues;
-
- /**
- * The last in values buffer.
- */
- AUD_Buffer *m_invalues;
-
- /**
- * The position for buffer cycling.
- */
- int m_position;
-
- /**
- * Filter coefficients.
- */
- float m_coeff[2][AUD_HIGHPASS_ORDER];
-
-public:
- /**
- * Creates a new highpass reader.
- * \param reader The reader to read from.
- * \param frequency The cutoff frequency.
- * \param Q The Q factor.
- * \exception AUD_Exception Thrown if the reader specified is NULL.
- */
- AUD_HighpassReader(AUD_IReader* reader, float frequency, float Q);
-
- /**
- * Destroys the reader.
- */
- virtual ~AUD_HighpassReader();
-
- virtual void read(int & length, sample_t* & buffer);
-};
-
-#endif //AUD_HIGHPASSREADER
diff --git a/intern/audaspace/FX/AUD_IIRFilterFactory.cpp b/intern/audaspace/FX/AUD_IIRFilterFactory.cpp
new file mode 100644
index 00000000000..8cd49a03708
--- /dev/null
+++ b/intern/audaspace/FX/AUD_IIRFilterFactory.cpp
@@ -0,0 +1,39 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN LGPL LICENSE BLOCK *****
+ *
+ * Copyright 2009 Jörg Hermann Müller
+ *
+ * This file is part of AudaSpace.
+ *
+ * AudaSpace is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AudaSpace is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * ***** END LGPL LICENSE BLOCK *****
+ */
+
+#include "AUD_IIRFilterFactory.h"
+#include "AUD_IIRFilterReader.h"
+
+AUD_IIRFilterFactory::AUD_IIRFilterFactory(AUD_IFactory* factory,
+ std::vector<float> b,
+ std::vector<float> a) :
+ AUD_EffectFactory(factory), m_a(a), m_b(b)
+{
+}
+
+AUD_IReader* AUD_IIRFilterFactory::createReader() const
+{
+ return new AUD_IIRFilterReader(getReader(), m_b, m_a);
+}
diff --git a/intern/audaspace/FX/AUD_IIRFilterFactory.h b/intern/audaspace/FX/AUD_IIRFilterFactory.h
new file mode 100644
index 00000000000..567d4f354fe
--- /dev/null
+++ b/intern/audaspace/FX/AUD_IIRFilterFactory.h
@@ -0,0 +1,66 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN LGPL LICENSE BLOCK *****
+ *
+ * Copyright 2009 Jörg Hermann Müller
+ *
+ * This file is part of AudaSpace.
+ *
+ * AudaSpace is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AudaSpace is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * ***** END LGPL LICENSE BLOCK *****
+ */
+
+#ifndef AUD_IIRFILTERFACTORY
+#define AUD_IIRFILTERFACTORY
+
+#include "AUD_EffectFactory.h"
+
+#include <vector>
+
+/**
+ * This factory creates a IIR filter reader.
+ */
+class AUD_IIRFilterFactory : public AUD_EffectFactory
+{
+private:
+ /**
+ * Output filter coefficients.
+ */
+ std::vector<float> m_a;
+
+ /**
+ * Input filter coefficients.
+ */
+ std::vector<float> m_b;
+
+ // hide copy constructor and operator=
+ AUD_IIRFilterFactory(const AUD_IIRFilterFactory&);
+ AUD_IIRFilterFactory& operator=(const AUD_IIRFilterFactory&);
+
+public:
+ /**
+ * Creates a new IIR filter factory.
+ * \param factory The input factory.
+ * \param b The input filter coefficients.
+ * \param a The output filter coefficients.
+ */
+ AUD_IIRFilterFactory(AUD_IFactory* factory, std::vector<float> b,
+ std::vector<float> a);
+
+ virtual AUD_IReader* createReader() const;
+};
+
+#endif //AUD_IIRFILTERFACTORY
diff --git a/intern/audaspace/FX/AUD_IIRFilterReader.cpp b/intern/audaspace/FX/AUD_IIRFilterReader.cpp
new file mode 100644
index 00000000000..120c9f8d0ae
--- /dev/null
+++ b/intern/audaspace/FX/AUD_IIRFilterReader.cpp
@@ -0,0 +1,50 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN LGPL LICENSE BLOCK *****
+ *
+ * Copyright 2009 Jörg Hermann Müller
+ *
+ * This file is part of AudaSpace.
+ *
+ * AudaSpace is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AudaSpace is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * ***** END LGPL LICENSE BLOCK *****
+ */
+
+#include "AUD_IIRFilterReader.h"
+
+AUD_IIRFilterReader::AUD_IIRFilterReader(AUD_IReader* reader,
+ std::vector<float> b,
+ std::vector<float> a) :
+ AUD_BaseIIRFilterReader(reader, b.size(), a.size()), m_a(a), m_b(b)
+{
+ for(int i = 1; i < m_a.size(); i++)
+ m_a[i] /= m_a[0];
+ for(int i = 0; i < m_b.size(); i++)
+ m_b[i] /= m_a[0];
+ m_a[0] = 1;
+}
+
+sample_t AUD_IIRFilterReader::filter()
+{
+ sample_t out = 0;
+
+ for(int i = 1; i < m_a.size(); i++)
+ out -= y(-i) * m_a[i];
+ for(int i = 0; i < m_b.size(); i++)
+ out += x(-i) * m_b[i];
+
+ return out;
+}
diff --git a/intern/audaspace/FX/AUD_VolumeReader.h b/intern/audaspace/FX/AUD_IIRFilterReader.h
index 489f85b10f2..303bc6d92df 100644
--- a/intern/audaspace/FX/AUD_VolumeReader.h
+++ b/intern/audaspace/FX/AUD_IIRFilterReader.h
@@ -23,44 +23,44 @@
* ***** END LGPL LICENSE BLOCK *****
*/
-#ifndef AUD_VOLUMEREADER
-#define AUD_VOLUMEREADER
+#ifndef AUD_IIRFILTERREADER
+#define AUD_IIRFILTERREADER
-#include "AUD_EffectReader.h"
-class AUD_Buffer;
+#include "AUD_BaseIIRFilterReader.h"
+
+#include <vector>
/**
- * This class reads another reader and changes it's volume.
+ * This class is for infinite impulse response filters with simple coefficients.
*/
-class AUD_VolumeReader : public AUD_EffectReader
+class AUD_IIRFilterReader : public AUD_BaseIIRFilterReader
{
private:
/**
- * The playback buffer.
+ * Output filter coefficients.
*/
- AUD_Buffer *m_buffer;
+ std::vector<float> m_a;
/**
- * The volume level.
+ * Input filter coefficients.
*/
- float m_volume;
+ std::vector<float> m_b;
+
+ // hide copy constructor and operator=
+ AUD_IIRFilterReader(const AUD_IIRFilterReader&);
+ AUD_IIRFilterReader& operator=(const AUD_IIRFilterReader&);
public:
/**
- * Creates a new volume reader.
+ * Creates a new IIR filter reader.
* \param reader The reader to read from.
- * \param volume The size of the buffer.
- * \exception AUD_Exception Thrown if the reader specified is NULL.
- */
- AUD_VolumeReader(AUD_IReader* reader, float volume);
-
- /**
- * Destroys the reader.
+ * \param b The input filter coefficients.
+ * \param a The output filter coefficients.
*/
- virtual ~AUD_VolumeReader();
+ AUD_IIRFilterReader(AUD_IReader* reader, std::vector<float> b,
+ std::vector<float> a);
- virtual bool notify(AUD_Message &message);
- virtual void read(int & length, sample_t* & buffer);
+ virtual sample_t filter();
};
-#endif //AUD_VOLUMEREADER
+#endif //AUD_IIRFILTERREADER
diff --git a/intern/audaspace/FX/AUD_LimiterFactory.cpp b/intern/audaspace/FX/AUD_LimiterFactory.cpp
index 6f19575240a..75501afcec3 100644
--- a/intern/audaspace/FX/AUD_LimiterFactory.cpp
+++ b/intern/audaspace/FX/AUD_LimiterFactory.cpp
@@ -31,37 +31,21 @@ AUD_LimiterFactory::AUD_LimiterFactory(AUD_IFactory* factory,
float start, float end) :
AUD_EffectFactory(factory),
m_start(start),
- m_end(end) {}
-
-float AUD_LimiterFactory::getStart()
+ m_end(end)
{
- return m_start;
}
-void AUD_LimiterFactory::setStart(float start)
+float AUD_LimiterFactory::getStart() const
{
- m_start = start;
+ return m_start;
}
-float AUD_LimiterFactory::getEnd()
+float AUD_LimiterFactory::getEnd() const
{
return m_end;
}
-void AUD_LimiterFactory::setEnd(float end)
-{
- m_end = end;
-}
-
-AUD_IReader* AUD_LimiterFactory::createReader()
+AUD_IReader* AUD_LimiterFactory::createReader() const
{
- AUD_IReader* reader = getReader();
-
- if(reader != 0)
- {
- reader = new AUD_LimiterReader(reader, m_start, m_end);
- AUD_NEW("reader")
- }
-
- return reader;
+ return new AUD_LimiterReader(getReader(), m_start, m_end);
}
diff --git a/intern/audaspace/FX/AUD_LimiterFactory.h b/intern/audaspace/FX/AUD_LimiterFactory.h
index 588fea6eb4b..5d9491f60aa 100644
--- a/intern/audaspace/FX/AUD_LimiterFactory.h
+++ b/intern/audaspace/FX/AUD_LimiterFactory.h
@@ -37,12 +37,16 @@ private:
/**
* The start time.
*/
- float m_start;
+ const float m_start;
/**
* The end time.
*/
- float m_end;
+ const float m_end;
+
+ // hide copy constructor and operator=
+ AUD_LimiterFactory(const AUD_LimiterFactory&);
+ AUD_LimiterFactory& operator=(const AUD_LimiterFactory&);
public:
/**
@@ -52,33 +56,20 @@ public:
* \param end The desired end time, a negative value signals that it should
* play to the end.
*/
- AUD_LimiterFactory(AUD_IFactory* factory = 0,
+ AUD_LimiterFactory(AUD_IFactory* factory,
float start = 0, float end = -1);
/**
* Returns the start time.
*/
- float getStart();
-
- /**
- * Sets the start time.
- * \param start The new start time.
- */
- void setStart(float start);
+ float getStart() const;
/**
* Returns the end time.
*/
- float getEnd();
-
- /**
- * Sets the end time.
- * \param end The new end time, a negative value signals that it should play
- * to the end.
- */
- void setEnd(float end);
+ float getEnd() const;
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_LIMITERFACTORY
diff --git a/intern/audaspace/FX/AUD_LimiterReader.cpp b/intern/audaspace/FX/AUD_LimiterReader.cpp
index 05882369001..dd7301213c9 100644
--- a/intern/audaspace/FX/AUD_LimiterReader.cpp
+++ b/intern/audaspace/FX/AUD_LimiterReader.cpp
@@ -30,31 +30,27 @@
AUD_LimiterReader::AUD_LimiterReader(AUD_IReader* reader,
float start, float end) :
- AUD_EffectReader(reader)
+ AUD_EffectReader(reader),
+ m_start(int(start * reader->getSpecs().rate)),
+ m_end(int(end * reader->getSpecs().rate))
{
- m_end = (int)(end * reader->getSpecs().rate);
-
- if(start <= 0)
- m_start = 0;
- else
+ if(m_start > 0)
{
- m_start = (int)(start * reader->getSpecs().rate);
if(m_reader->isSeekable())
m_reader->seek(m_start);
else
{
// skip first m_start samples by reading them
- int length;
+ int length = AUD_DEFAULT_BUFFER_SIZE;
sample_t* buffer;
- for(int i = m_start;
- i >= AUD_DEFAULT_BUFFER_SIZE;
- i -= AUD_DEFAULT_BUFFER_SIZE)
+ for(int len = m_start;
+ length == AUD_DEFAULT_BUFFER_SIZE;
+ len -= AUD_DEFAULT_BUFFER_SIZE)
{
- length = AUD_DEFAULT_BUFFER_SIZE;
+ if(len < AUD_DEFAULT_BUFFER_SIZE)
+ length = len;
m_reader->read(length, buffer);
- length = i;
}
- m_reader->read(length, buffer);
}
}
}
@@ -64,18 +60,18 @@ void AUD_LimiterReader::seek(int position)
m_reader->seek(position + m_start);
}
-int AUD_LimiterReader::getLength()
+int AUD_LimiterReader::getLength() const
{
int len = m_reader->getLength();
- if(m_reader->getType() != AUD_TYPE_BUFFER || len < 0 ||
- (len > m_end && m_end >= 0))
+ if(len < 0 || (len > m_end && m_end >= 0))
len = m_end;
return len - m_start;
}
-int AUD_LimiterReader::getPosition()
+int AUD_LimiterReader::getPosition() const
{
- return m_reader->getPosition() - m_start;
+ int pos = m_reader->getPosition();
+ return AUD_MIN(pos, m_end) - m_start;
}
void AUD_LimiterReader::read(int & length, sample_t* & buffer)
@@ -83,7 +79,7 @@ void AUD_LimiterReader::read(int & length, sample_t* & buffer)
if(m_end >= 0)
{
int position = m_reader->getPosition();
- if(position+length > m_end)
+ if(position + length > m_end)
length = m_end - position;
if(length < 0)
{
diff --git a/intern/audaspace/FX/AUD_LimiterReader.h b/intern/audaspace/FX/AUD_LimiterReader.h
index 9921f5ee1b0..59d6096dcba 100644
--- a/intern/audaspace/FX/AUD_LimiterReader.h
+++ b/intern/audaspace/FX/AUD_LimiterReader.h
@@ -37,12 +37,16 @@ private:
/**
* The start sample: inclusive.
*/
- int m_start;
+ const int m_start;
/**
* The end sample: exlusive.
*/
- int m_end;
+ const int m_end;
+
+ // hide copy constructor and operator=
+ AUD_LimiterReader(const AUD_LimiterReader&);
+ AUD_LimiterReader& operator=(const AUD_LimiterReader&);
public:
/**
@@ -51,13 +55,12 @@ public:
* \param start The desired start sample (inclusive).
* \param end The desired end sample (exklusive), a negative value signals
* that it should play to the end.
- * \exception AUD_Exception Thrown if the reader specified is NULL.
*/
AUD_LimiterReader(AUD_IReader* reader, float start = 0, float end = -1);
virtual void seek(int position);
- virtual int getLength();
- virtual int getPosition();
+ virtual int getLength() const;
+ virtual int getPosition() const;
virtual void read(int & length, sample_t* & buffer);
};
diff --git a/intern/audaspace/FX/AUD_LoopFactory.cpp b/intern/audaspace/FX/AUD_LoopFactory.cpp
index 90186f623ff..6805a8e4b42 100644
--- a/intern/audaspace/FX/AUD_LoopFactory.cpp
+++ b/intern/audaspace/FX/AUD_LoopFactory.cpp
@@ -28,30 +28,16 @@
AUD_LoopFactory::AUD_LoopFactory(AUD_IFactory* factory, int loop) :
AUD_EffectFactory(factory),
- m_loop(loop) {}
-
-AUD_LoopFactory::AUD_LoopFactory(int loop) :
- AUD_EffectFactory(0),
- m_loop(loop) {}
-
-int AUD_LoopFactory::getLoop()
+ m_loop(loop)
{
- return m_loop;
}
-void AUD_LoopFactory::setLoop(int loop)
+int AUD_LoopFactory::getLoop() const
{
- m_loop = loop;
+ return m_loop;
}
-AUD_IReader* AUD_LoopFactory::createReader()
+AUD_IReader* AUD_LoopFactory::createReader() const
{
- AUD_IReader* reader = getReader();
-
- if(reader != 0)
- {
- reader = new AUD_LoopReader(reader, m_loop); AUD_NEW("reader")
- }
-
- return reader;
+ return new AUD_LoopReader(getReader(), m_loop);
}
diff --git a/intern/audaspace/FX/AUD_LoopFactory.h b/intern/audaspace/FX/AUD_LoopFactory.h
index c81d906b82e..f9e358af52d 100644
--- a/intern/audaspace/FX/AUD_LoopFactory.h
+++ b/intern/audaspace/FX/AUD_LoopFactory.h
@@ -38,7 +38,11 @@ private:
/**
* The loop count.
*/
- int m_loop;
+ const int m_loop;
+
+ // hide copy constructor and operator=
+ AUD_LoopFactory(const AUD_LoopFactory&);
+ AUD_LoopFactory& operator=(const AUD_LoopFactory&);
public:
/**
@@ -47,28 +51,14 @@ public:
* \param loop The desired loop count, negative values result in endless
* looping.
*/
- AUD_LoopFactory(AUD_IFactory* factory = 0, int loop = -1);
-
- /**
- * Creates a new loop factory.
- * \param loop The desired loop count, negative values result in endless
- * looping.
- */
- AUD_LoopFactory(int loop);
+ AUD_LoopFactory(AUD_IFactory* factory, int loop = -1);
/**
* Returns the loop count.
*/
- int getLoop();
-
- /**
- * Sets the loop count.
- * \param loop The desired loop count, negative values result in endless
- * looping.
- */
- void setLoop(int loop);
+ int getLoop() const;
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_LOOPFACTORY
diff --git a/intern/audaspace/FX/AUD_LoopReader.cpp b/intern/audaspace/FX/AUD_LoopReader.cpp
index 3bcd8c2f9d3..7521f914a5c 100644
--- a/intern/audaspace/FX/AUD_LoopReader.cpp
+++ b/intern/audaspace/FX/AUD_LoopReader.cpp
@@ -29,36 +29,37 @@
#include <cstring>
AUD_LoopReader::AUD_LoopReader(AUD_IReader* reader, int loop) :
- AUD_EffectReader(reader), m_loop(loop)
+ AUD_EffectReader(reader), m_count(loop), m_left(loop)
{
- m_samples = -1;
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
}
-AUD_LoopReader::~AUD_LoopReader()
+void AUD_LoopReader::seek(int position)
{
- delete m_buffer; AUD_DELETE("buffer")
+ int len = m_reader->getLength();
+ if(len < 0)
+ m_reader->seek(position);
+ else
+ {
+ if(m_count >= 0)
+ {
+ m_left = m_count - (position / len);
+ if(m_left < 0)
+ m_left = 0;
+ }
+ m_reader->seek(position % len);
+ }
}
-AUD_ReaderType AUD_LoopReader::getType()
+int AUD_LoopReader::getLength() const
{
- if(m_loop < 0)
- return AUD_TYPE_STREAM;
- return m_reader->getType();
+ if(m_count < 0)
+ return -1;
+ return m_reader->getLength() * m_count;
}
-bool AUD_LoopReader::notify(AUD_Message &message)
+int AUD_LoopReader::getPosition() const
{
- if(message.type == AUD_MSG_LOOP)
- {
- m_loop = message.loopcount;
- m_samples = message.time * m_reader->getSpecs().rate;
-
- m_reader->notify(message);
-
- return true;
- }
- return m_reader->notify(message);
+ return m_reader->getPosition() * (m_count < 0 ? 1 : m_count);
}
void AUD_LoopReader::read(int & length, sample_t* & buffer)
@@ -66,50 +67,44 @@ void AUD_LoopReader::read(int & length, sample_t* & buffer)
AUD_Specs specs = m_reader->getSpecs();
int samplesize = AUD_SAMPLE_SIZE(specs);
- if(m_samples >= 0)
- {
- if(length > m_samples)
- length = m_samples;
- m_samples -= length;
- }
-
int len = length;
m_reader->read(len, buffer);
- if(len < length && m_loop != 0)
+ if(len < length && m_left)
{
int pos = 0;
- if(m_buffer->getSize() < length * samplesize)
- m_buffer->resize(length * samplesize);
+ if(m_buffer.getSize() < length * samplesize)
+ m_buffer.resize(length * samplesize);
+
+ sample_t* buf = m_buffer.getBuffer();
- memcpy(m_buffer->getBuffer() + pos * specs.channels,
- buffer, len * samplesize);
+ memcpy(buf + pos * specs.channels, buffer, len * samplesize);
pos += len;
- while(pos < length && m_loop != 0)
+ while(pos < length && m_left)
{
- if(m_loop > 0)
- m_loop--;
+ if(m_left > 0)
+ m_left--;
m_reader->seek(0);
len = length - pos;
m_reader->read(len, buffer);
+
// prevent endless loop
if(!len)
break;
- memcpy(m_buffer->getBuffer() + pos * specs.channels,
- buffer, len * samplesize);
+ memcpy(buf + pos * specs.channels, buffer, len * samplesize);
pos += len;
}
length = pos;
- buffer = m_buffer->getBuffer();
+ buffer = buf;
}
else
length = len;
diff --git a/intern/audaspace/FX/AUD_LoopReader.h b/intern/audaspace/FX/AUD_LoopReader.h
index e61a49cb0db..e0ed4cb6bf3 100644
--- a/intern/audaspace/FX/AUD_LoopReader.h
+++ b/intern/audaspace/FX/AUD_LoopReader.h
@@ -27,7 +27,7 @@
#define AUD_LOOPREADER
#include "AUD_EffectReader.h"
-class AUD_Buffer;
+#include "AUD_Buffer.h"
/**
* This class reads another reader and loops it.
@@ -39,17 +39,21 @@ private:
/**
* The playback buffer.
*/
- AUD_Buffer *m_buffer;
+ AUD_Buffer m_buffer;
/**
- * The left loop count.
+ * The loop count.
*/
- int m_loop;
+ const int m_count;
/**
- * The left samples.
+ * The left loop count.
*/
- int m_samples;
+ int m_left;
+
+ // hide copy constructor and operator=
+ AUD_LoopReader(const AUD_LoopReader&);
+ AUD_LoopReader& operator=(const AUD_LoopReader&);
public:
/**
@@ -57,17 +61,12 @@ public:
* \param reader The reader to read from.
* \param loop The desired loop count, negative values result in endless
* looping.
- * \exception AUD_Exception Thrown if the reader specified is NULL.
*/
AUD_LoopReader(AUD_IReader* reader, int loop);
- /**
- * Destroys the reader.
- */
- virtual ~AUD_LoopReader();
-
- virtual AUD_ReaderType getType();
- virtual bool notify(AUD_Message &message);
+ virtual void seek(int position);
+ virtual int getLength() const;
+ virtual int getPosition() const;
virtual void read(int & length, sample_t* & buffer);
};
diff --git a/intern/audaspace/FX/AUD_LowpassFactory.cpp b/intern/audaspace/FX/AUD_LowpassFactory.cpp
index 05dc5ff3994..9244e07631b 100644
--- a/intern/audaspace/FX/AUD_LowpassFactory.cpp
+++ b/intern/audaspace/FX/AUD_LowpassFactory.cpp
@@ -24,28 +24,38 @@
*/
#include "AUD_LowpassFactory.h"
-#include "AUD_LowpassReader.h"
+#include "AUD_IIRFilterReader.h"
+
+#include <cmath>
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
AUD_LowpassFactory::AUD_LowpassFactory(AUD_IFactory* factory, float frequency,
float Q) :
AUD_EffectFactory(factory),
m_frequency(frequency),
- m_Q(Q) {}
-
-AUD_LowpassFactory::AUD_LowpassFactory(float frequency, float Q) :
- AUD_EffectFactory(0),
- m_frequency(frequency),
- m_Q(Q) {}
+ m_Q(Q)
+{
+}
-AUD_IReader* AUD_LowpassFactory::createReader()
+AUD_IReader* AUD_LowpassFactory::createReader() const
{
AUD_IReader* reader = getReader();
- if(reader != 0)
- {
- reader = new AUD_LowpassReader(reader, m_frequency, m_Q);
- AUD_NEW("reader")
- }
+ // calculate coefficients
+ float w0 = 2 * M_PI * m_frequency / reader->getSpecs().rate;
+ float alpha = sin(w0) / (2 * m_Q);
+ float norm = 1 + alpha;
+ float c = cos(w0);
+ std::vector<float> a, b;
+ a.push_back(1);
+ a.push_back(-2 * c / norm);
+ a.push_back((1 - alpha) / norm);
+ b.push_back((1 - c) / (2 * norm));
+ b.push_back((1 - c) / norm);
+ b.push_back(b[0]);
- return reader;
+ return new AUD_IIRFilterReader(reader, b, a);
}
diff --git a/intern/audaspace/FX/AUD_LowpassFactory.h b/intern/audaspace/FX/AUD_LowpassFactory.h
index 8a419823de0..61b76510a9e 100644
--- a/intern/audaspace/FX/AUD_LowpassFactory.h
+++ b/intern/audaspace/FX/AUD_LowpassFactory.h
@@ -37,12 +37,16 @@ private:
/**
* The attack value in seconds.
*/
- float m_frequency;
+ const float m_frequency;
/**
* The Q factor.
*/
- float m_Q;
+ const float m_Q;
+
+ // hide copy constructor and operator=
+ AUD_LowpassFactory(const AUD_LowpassFactory&);
+ AUD_LowpassFactory& operator=(const AUD_LowpassFactory&);
public:
/**
@@ -53,14 +57,7 @@ public:
*/
AUD_LowpassFactory(AUD_IFactory* factory, float frequency, float Q = 1.0f);
- /**
- * Creates a new lowpass factory.
- * \param frequency The cutoff frequency.
- * \param Q The Q factor.
- */
- AUD_LowpassFactory(float frequency, float Q = 1.0f);
-
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_LOWPASSFACTORY
diff --git a/intern/audaspace/FX/AUD_LowpassReader.cpp b/intern/audaspace/FX/AUD_LowpassReader.cpp
deleted file mode 100644
index 6dc0bf66a96..00000000000
--- a/intern/audaspace/FX/AUD_LowpassReader.cpp
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * $Id$
- *
- * ***** BEGIN LGPL LICENSE BLOCK *****
- *
- * Copyright 2009 Jörg Hermann Müller
- *
- * This file is part of AudaSpace.
- *
- * AudaSpace is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * AudaSpace is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
- *
- * ***** END LGPL LICENSE BLOCK *****
- */
-
-#include "AUD_LowpassReader.h"
-#include "AUD_Buffer.h"
-
-#include <cstring>
-#include <cmath>
-
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
-
-#define CC channels + channel
-
-AUD_LowpassReader::AUD_LowpassReader(AUD_IReader* reader, float frequency,
- float Q) :
- AUD_EffectReader(reader)
-{
- AUD_Specs specs = reader->getSpecs();
- int samplesize = AUD_SAMPLE_SIZE(specs);
-
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
-
- m_outvalues = new AUD_Buffer(samplesize * AUD_LOWPASS_ORDER);
- AUD_NEW("buffer")
- memset(m_outvalues->getBuffer(), 0, samplesize * AUD_LOWPASS_ORDER);
-
- m_invalues = new AUD_Buffer(samplesize * AUD_LOWPASS_ORDER);
- AUD_NEW("buffer")
- memset(m_invalues->getBuffer(), 0, samplesize * AUD_LOWPASS_ORDER);
-
- m_position = 0;
-
- // calculate coefficients
- float w0 = 2 * M_PI * frequency / specs.rate;
- float alpha = sin(w0) / (2 * Q);
- float norm = 1 + alpha;
- m_coeff[0][0] = 0;
- m_coeff[0][1] = -2 * cos(w0) / norm;
- m_coeff[0][2] = (1 - alpha) / norm;
- m_coeff[1][2] = m_coeff[1][0] = (1 - cos(w0)) / (2 * norm);
- m_coeff[1][1] = (1 - cos(w0)) / norm;
-}
-
-AUD_LowpassReader::~AUD_LowpassReader()
-{
- delete m_buffer; AUD_DELETE("buffer")
-
- delete m_outvalues; AUD_DELETE("buffer")
- delete m_invalues; AUD_DELETE("buffer");
-}
-
-void AUD_LowpassReader::read(int & length, sample_t* & buffer)
-{
- sample_t* buf;
- sample_t* outvalues;
- sample_t* invalues;
-
- outvalues = m_outvalues->getBuffer();
- invalues = m_invalues->getBuffer();
-
- AUD_Specs specs = m_reader->getSpecs();
-
- m_reader->read(length, buf);
-
- if(m_buffer->getSize() < length * AUD_SAMPLE_SIZE(specs))
- m_buffer->resize(length * AUD_SAMPLE_SIZE(specs));
-
- buffer = m_buffer->getBuffer();
- int channels = specs.channels;
-
- for(int channel = 0; channel < channels; channel++)
- {
- for(int i = 0; i < length; i++)
- {
- invalues[m_position * CC] = buf[i * CC];
- outvalues[m_position * CC] = 0;
-
- for(int j = 0; j < AUD_LOWPASS_ORDER; j++)
- {
- outvalues[m_position * CC] += m_coeff[1][j] *
- invalues[((m_position + j) % AUD_LOWPASS_ORDER) * CC] -
- m_coeff[0][j] *
- outvalues[((m_position + j) % AUD_LOWPASS_ORDER) * CC];
- }
-
- buffer[i * CC] = outvalues[m_position * CC];
-
- m_position = (m_position + AUD_LOWPASS_ORDER-1) % AUD_LOWPASS_ORDER;
- }
- }
-}
diff --git a/intern/audaspace/FX/AUD_PingPongFactory.cpp b/intern/audaspace/FX/AUD_PingPongFactory.cpp
index 8b72afe05e7..b3aaa9e80a4 100644
--- a/intern/audaspace/FX/AUD_PingPongFactory.cpp
+++ b/intern/audaspace/FX/AUD_PingPongFactory.cpp
@@ -28,40 +28,25 @@
#include "AUD_ReverseFactory.h"
AUD_PingPongFactory::AUD_PingPongFactory(AUD_IFactory* factory) :
- AUD_EffectFactory(factory) {}
-
-AUD_IReader* AUD_PingPongFactory::createReader()
+ AUD_EffectFactory(factory)
{
- if(m_factory == 0)
- return 0;
+}
- AUD_IReader* reader = m_factory->createReader();
+AUD_IReader* AUD_PingPongFactory::createReader() const
+{
+ AUD_IReader* reader = getReader();
+ AUD_IReader* reader2;
+ AUD_ReverseFactory factory(m_factory);
- if(reader != 0)
+ try
{
- AUD_IReader* reader2;
- AUD_ReverseFactory factory(m_factory);
-
- try
- {
- reader2 = factory.createReader();
- }
- catch(AUD_Exception)
- {
- reader2 = 0;
- }
-
- if(reader2 != 0)
- {
- reader = new AUD_DoubleReader(reader, reader2);
- AUD_NEW("reader")
- }
- else
- {
- delete reader; AUD_DELETE("reader")
- reader = 0;
- }
+ reader2 = factory.createReader();
+ }
+ catch(AUD_Exception&)
+ {
+ delete reader;
+ throw;
}
- return reader;
+ return new AUD_DoubleReader(reader, reader2);
}
diff --git a/intern/audaspace/FX/AUD_PingPongFactory.h b/intern/audaspace/FX/AUD_PingPongFactory.h
index b8854da550a..82aedca8f7f 100644
--- a/intern/audaspace/FX/AUD_PingPongFactory.h
+++ b/intern/audaspace/FX/AUD_PingPongFactory.h
@@ -34,18 +34,19 @@
*/
class AUD_PingPongFactory : public AUD_EffectFactory
{
+private:
+ // hide copy constructor and operator=
+ AUD_PingPongFactory(const AUD_PingPongFactory&);
+ AUD_PingPongFactory& operator=(const AUD_PingPongFactory&);
+
public:
/**
* Creates a new ping pong factory.
* \param factory The input factory.
*/
- AUD_PingPongFactory(AUD_IFactory* factory = 0);
-
- /**
- * Destroys the factory.
- */
+ AUD_PingPongFactory(AUD_IFactory* factory);
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_PINGPONGFACTORY
diff --git a/intern/audaspace/FX/AUD_PitchFactory.cpp b/intern/audaspace/FX/AUD_PitchFactory.cpp
index 5f814283c12..be285562db3 100644
--- a/intern/audaspace/FX/AUD_PitchFactory.cpp
+++ b/intern/audaspace/FX/AUD_PitchFactory.cpp
@@ -29,20 +29,11 @@
AUD_PitchFactory::AUD_PitchFactory(AUD_IFactory* factory, float pitch) :
AUD_EffectFactory(factory),
- m_pitch(pitch) {}
-
-AUD_PitchFactory::AUD_PitchFactory(float pitch) :
- AUD_EffectFactory(0),
- m_pitch(pitch) {}
-
-AUD_IReader* AUD_PitchFactory::createReader()
+ m_pitch(pitch)
{
- AUD_IReader* reader = getReader();
-
- if(reader != 0)
- {
- reader = new AUD_PitchReader(reader, m_pitch); AUD_NEW("reader")
- }
+}
- return reader;
+AUD_IReader* AUD_PitchFactory::createReader() const
+{
+ return new AUD_PitchReader(getReader(), m_pitch);
}
diff --git a/intern/audaspace/FX/AUD_PitchFactory.h b/intern/audaspace/FX/AUD_PitchFactory.h
index 96c4d0d7e92..52b9b7d99e5 100644
--- a/intern/audaspace/FX/AUD_PitchFactory.h
+++ b/intern/audaspace/FX/AUD_PitchFactory.h
@@ -37,7 +37,11 @@ private:
/**
* The pitch.
*/
- float m_pitch;
+ const float m_pitch;
+
+ // hide copy constructor and operator=
+ AUD_PitchFactory(const AUD_PitchFactory&);
+ AUD_PitchFactory& operator=(const AUD_PitchFactory&);
public:
/**
@@ -45,26 +49,9 @@ public:
* \param factory The input factory.
* \param pitch The desired pitch.
*/
- AUD_PitchFactory(AUD_IFactory* factory = 0, float pitch = 1.0f);
-
- /**
- * Creates a new pitch factory.
- * \param pitch The desired pitch.
- */
- AUD_PitchFactory(float pitch);
-
- /**
- * Returns the pitch.
- */
- float getPitch();
-
- /**
- * Sets the pitch.
- * \param pitch The new pitch value. Should be between 0.0 and 1.0.
- */
- void setPitch(float pitch);
+ AUD_PitchFactory(AUD_IFactory* factory, float pitch);
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_PITCHFACTORY
diff --git a/intern/audaspace/FX/AUD_PitchReader.cpp b/intern/audaspace/FX/AUD_PitchReader.cpp
index c53264e1350..19c3be31968 100644
--- a/intern/audaspace/FX/AUD_PitchReader.cpp
+++ b/intern/audaspace/FX/AUD_PitchReader.cpp
@@ -26,12 +26,11 @@
#include "AUD_PitchReader.h"
AUD_PitchReader::AUD_PitchReader(AUD_IReader* reader, float pitch) :
- AUD_EffectReader(reader)
+ AUD_EffectReader(reader), m_pitch(pitch)
{
- m_pitch = pitch;
}
-AUD_Specs AUD_PitchReader::getSpecs()
+AUD_Specs AUD_PitchReader::getSpecs() const
{
AUD_Specs specs = m_reader->getSpecs();
specs.rate = (AUD_SampleRate)((int)(specs.rate * m_pitch));
diff --git a/intern/audaspace/FX/AUD_PitchReader.h b/intern/audaspace/FX/AUD_PitchReader.h
index 440e9cc843c..cc188cf0ee4 100644
--- a/intern/audaspace/FX/AUD_PitchReader.h
+++ b/intern/audaspace/FX/AUD_PitchReader.h
@@ -37,18 +37,21 @@ private:
/**
* The pitch level.
*/
- float m_pitch;
+ const float m_pitch;
+
+ // hide copy constructor and operator=
+ AUD_PitchReader(const AUD_PitchReader&);
+ AUD_PitchReader& operator=(const AUD_PitchReader&);
public:
/**
* Creates a new pitch reader.
* \param reader The reader to read from.
* \param pitch The size of the buffer.
- * \exception AUD_Exception Thrown if the reader specified is NULL.
*/
AUD_PitchReader(AUD_IReader* reader, float pitch);
- virtual AUD_Specs getSpecs();
+ virtual AUD_Specs getSpecs() const;
};
#endif //AUD_PITCHREADER
diff --git a/intern/audaspace/FX/AUD_RectifyFactory.cpp b/intern/audaspace/FX/AUD_RectifyFactory.cpp
index f97defd793b..2228f949dfe 100644
--- a/intern/audaspace/FX/AUD_RectifyFactory.cpp
+++ b/intern/audaspace/FX/AUD_RectifyFactory.cpp
@@ -24,22 +24,21 @@
*/
#include "AUD_RectifyFactory.h"
-#include "AUD_RectifyReader.h"
+#include "AUD_CallbackIIRFilterReader.h"
-AUD_RectifyFactory::AUD_RectifyFactory(AUD_IFactory* factory) :
- AUD_EffectFactory(factory) {}
-
-AUD_RectifyFactory::AUD_RectifyFactory() :
- AUD_EffectFactory(0) {}
+#include <cmath>
-AUD_IReader* AUD_RectifyFactory::createReader()
+sample_t rectifyFilter(AUD_CallbackIIRFilterReader* reader, void* useless)
{
- AUD_IReader* reader = getReader();
+ return fabs(reader->x(0));
+}
- if(reader != 0)
- {
- reader = new AUD_RectifyReader(reader); AUD_NEW("reader")
- }
+AUD_RectifyFactory::AUD_RectifyFactory(AUD_IFactory* factory) :
+ AUD_EffectFactory(factory)
+{
+}
- return reader;
+AUD_IReader* AUD_RectifyFactory::createReader() const
+{
+ return new AUD_CallbackIIRFilterReader(getReader(), 1, 1, rectifyFilter);
}
diff --git a/intern/audaspace/FX/AUD_RectifyFactory.h b/intern/audaspace/FX/AUD_RectifyFactory.h
index ed00620d318..d8b39e83fdf 100644
--- a/intern/audaspace/FX/AUD_RectifyFactory.h
+++ b/intern/audaspace/FX/AUD_RectifyFactory.h
@@ -33,19 +33,19 @@
*/
class AUD_RectifyFactory : public AUD_EffectFactory
{
+private:
+ // hide copy constructor and operator=
+ AUD_RectifyFactory(const AUD_RectifyFactory&);
+ AUD_RectifyFactory& operator=(const AUD_RectifyFactory&);
+
public:
/**
* Creates a new rectify factory.
* \param factory The input factory.
*/
- AUD_RectifyFactory(AUD_IFactory* factory = 0);
-
- /**
- * Creates a new rectify factory.
- */
- AUD_RectifyFactory();
+ AUD_RectifyFactory(AUD_IFactory* factory);
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_RECTIFYFACTORY
diff --git a/intern/audaspace/FX/AUD_ReverseFactory.cpp b/intern/audaspace/FX/AUD_ReverseFactory.cpp
index 1242641c350..1002e2de87e 100644
--- a/intern/audaspace/FX/AUD_ReverseFactory.cpp
+++ b/intern/audaspace/FX/AUD_ReverseFactory.cpp
@@ -28,16 +28,11 @@
#include "AUD_Space.h"
AUD_ReverseFactory::AUD_ReverseFactory(AUD_IFactory* factory) :
- AUD_EffectFactory(factory) {}
-
-AUD_IReader* AUD_ReverseFactory::createReader()
+ AUD_EffectFactory(factory)
{
- AUD_IReader* reader = getReader();
-
- if(reader != 0)
- {
- reader = new AUD_ReverseReader(reader); AUD_NEW("reader")
- }
+}
- return reader;
+AUD_IReader* AUD_ReverseFactory::createReader() const
+{
+ return new AUD_ReverseReader(getReader());
}
diff --git a/intern/audaspace/FX/AUD_ReverseFactory.h b/intern/audaspace/FX/AUD_ReverseFactory.h
index 4b664c47281..a1995ee68f9 100644
--- a/intern/audaspace/FX/AUD_ReverseFactory.h
+++ b/intern/audaspace/FX/AUD_ReverseFactory.h
@@ -34,17 +34,19 @@
*/
class AUD_ReverseFactory : public AUD_EffectFactory
{
+private:
+ // hide copy constructor and operator=
+ AUD_ReverseFactory(const AUD_ReverseFactory&);
+ AUD_ReverseFactory& operator=(const AUD_ReverseFactory&);
+
public:
/**
* Creates a new reverse factory.
* \param factory The input factory.
*/
- AUD_ReverseFactory(AUD_IFactory* factory = 0);
+ AUD_ReverseFactory(AUD_IFactory* factory);
- /**
- * Destroys the factory.
- */
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_REVERSEFACTORY
diff --git a/intern/audaspace/FX/AUD_ReverseReader.cpp b/intern/audaspace/FX/AUD_ReverseReader.cpp
index 82d6c70ce53..c651ea79577 100644
--- a/intern/audaspace/FX/AUD_ReverseReader.cpp
+++ b/intern/audaspace/FX/AUD_ReverseReader.cpp
@@ -24,27 +24,19 @@
*/
#include "AUD_ReverseReader.h"
-#include "AUD_Buffer.h"
#include <cstring>
-AUD_ReverseReader::AUD_ReverseReader(AUD_IReader* reader) :
- AUD_EffectReader(reader)
-{
- if(reader->getType() != AUD_TYPE_BUFFER)
- AUD_THROW(AUD_ERROR_READER);
-
- m_length = reader->getLength();
- if(m_length < 0)
- AUD_THROW(AUD_ERROR_READER);
+static const char* props_error = "AUD_ReverseReader: The reader has to be "
+ "seekable and a finite length.";
- m_position = 0;
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
-}
-
-AUD_ReverseReader::~AUD_ReverseReader()
+AUD_ReverseReader::AUD_ReverseReader(AUD_IReader* reader) :
+ AUD_EffectReader(reader),
+ m_length(reader->getLength()),
+ m_position(0)
{
- delete m_buffer; AUD_DELETE("buffer")
+ if(m_length < 0 || !reader->isSeekable())
+ AUD_THROW(AUD_ERROR_PROPS, props_error);
}
void AUD_ReverseReader::seek(int position)
@@ -52,12 +44,12 @@ void AUD_ReverseReader::seek(int position)
m_position = position;
}
-int AUD_ReverseReader::getLength()
+int AUD_ReverseReader::getLength() const
{
return m_length;
}
-int AUD_ReverseReader::getPosition()
+int AUD_ReverseReader::getPosition() const
{
return m_position;
}
@@ -66,7 +58,7 @@ void AUD_ReverseReader::read(int & length, sample_t* & buffer)
{
// first correct the length
if(m_position + length > m_length)
- length = m_length-m_position;
+ length = m_length - m_position;
if(length <= 0)
{
@@ -78,10 +70,10 @@ void AUD_ReverseReader::read(int & length, sample_t* & buffer)
int samplesize = AUD_SAMPLE_SIZE(specs);
// resize buffer if needed
- if(m_buffer->getSize() < length * samplesize)
- m_buffer->resize(length * samplesize);
+ if(m_buffer.getSize() < length * samplesize)
+ m_buffer.resize(length * samplesize);
- buffer = m_buffer->getBuffer();
+ buffer = m_buffer.getBuffer();
sample_t* buf;
int len = length;
@@ -105,5 +97,5 @@ void AUD_ReverseReader::read(int & length, sample_t* & buffer)
m_position += length;
- buffer = m_buffer->getBuffer();
+ buffer = m_buffer.getBuffer();
}
diff --git a/intern/audaspace/FX/AUD_ReverseReader.h b/intern/audaspace/FX/AUD_ReverseReader.h
index 045d2ac5a8e..8eb960a5dee 100644
--- a/intern/audaspace/FX/AUD_ReverseReader.h
+++ b/intern/audaspace/FX/AUD_ReverseReader.h
@@ -27,7 +27,7 @@
#define AUD_REVERSEREADER
#include "AUD_EffectReader.h"
-class AUD_Buffer;
+#include "AUD_Buffer.h"
/**
* This class reads another reader from back to front.
@@ -37,37 +37,36 @@ class AUD_ReverseReader : public AUD_EffectReader
{
private:
/**
- * The current position.
+ * The sample count.
*/
- int m_position;
+ const int m_length;
/**
- * The sample count.
+ * The current position.
*/
- int m_length;
+ int m_position;
/**
* The playback buffer.
*/
- AUD_Buffer* m_buffer;
+ AUD_Buffer m_buffer;
+
+ // hide copy constructor and operator=
+ AUD_ReverseReader(const AUD_ReverseReader&);
+ AUD_ReverseReader& operator=(const AUD_ReverseReader&);
public:
/**
* Creates a new reverse reader.
* \param reader The reader to read from.
- * \exception AUD_Exception Thrown if the reader specified is NULL or not
- * a buffer.
+ * \exception AUD_Exception Thrown if the reader specified has an
+ * undeterminable/infinite length or is not seekable.
*/
AUD_ReverseReader(AUD_IReader* reader);
- /**
- * Destroys the reader.
- */
- virtual ~AUD_ReverseReader();
-
virtual void seek(int position);
- virtual int getLength();
- virtual int getPosition();
+ virtual int getLength() const;
+ virtual int getPosition() const;
virtual void read(int & length, sample_t* & buffer);
};
diff --git a/intern/audaspace/FX/AUD_SquareFactory.cpp b/intern/audaspace/FX/AUD_SquareFactory.cpp
index 638acaa9a32..c321a13d79a 100644
--- a/intern/audaspace/FX/AUD_SquareFactory.cpp
+++ b/intern/audaspace/FX/AUD_SquareFactory.cpp
@@ -24,34 +24,39 @@
*/
#include "AUD_SquareFactory.h"
-#include "AUD_SquareReader.h"
+#include "AUD_CallbackIIRFilterReader.h"
-AUD_SquareFactory::AUD_SquareFactory(AUD_IFactory* factory, float threshold) :
- AUD_EffectFactory(factory),
- m_threshold(threshold) {}
-
-AUD_SquareFactory::AUD_SquareFactory(float threshold) :
- AUD_EffectFactory(0),
- m_threshold(threshold) {}
-
-float AUD_SquareFactory::getThreshold()
+sample_t squareFilter(AUD_CallbackIIRFilterReader* reader, float* threshold)
{
- return m_threshold;
+ float in = reader->x(0);
+ if(in >= *threshold)
+ return 1;
+ else if(in <= -*threshold)
+ return -1;
+ else
+ return 0;
}
-void AUD_SquareFactory::setThreshold(float threshold)
+void endSquareFilter(float* threshold)
{
- m_threshold = threshold;
+ delete threshold;
}
-AUD_IReader* AUD_SquareFactory::createReader()
+AUD_SquareFactory::AUD_SquareFactory(AUD_IFactory* factory, float threshold) :
+ AUD_EffectFactory(factory),
+ m_threshold(threshold)
{
- AUD_IReader* reader = getReader();
+}
- if(reader != 0)
- {
- reader = new AUD_SquareReader(reader, m_threshold); AUD_NEW("reader")
- }
+float AUD_SquareFactory::getThreshold() const
+{
+ return m_threshold;
+}
- return reader;
+AUD_IReader* AUD_SquareFactory::createReader() const
+{
+ return new AUD_CallbackIIRFilterReader(getReader(), 1, 1,
+ (doFilterIIR) squareFilter,
+ (endFilterIIR) endSquareFilter,
+ new float(m_threshold));
}
diff --git a/intern/audaspace/FX/AUD_SquareFactory.h b/intern/audaspace/FX/AUD_SquareFactory.h
index dfbe5ae2887..da87dc6f888 100644
--- a/intern/audaspace/FX/AUD_SquareFactory.h
+++ b/intern/audaspace/FX/AUD_SquareFactory.h
@@ -37,7 +37,11 @@ private:
/**
* The threshold.
*/
- float m_threshold;
+ const float m_threshold;
+
+ // hide copy constructor and operator=
+ AUD_SquareFactory(const AUD_SquareFactory&);
+ AUD_SquareFactory& operator=(const AUD_SquareFactory&);
public:
/**
@@ -45,26 +49,14 @@ public:
* \param factory The input factory.
* \param threshold The threshold.
*/
- AUD_SquareFactory(AUD_IFactory* factory = 0, float threshold = 0.0f);
-
- /**
- * Creates a new square factory.
- * \param threshold The threshold.
- */
- AUD_SquareFactory(float threshold);
+ AUD_SquareFactory(AUD_IFactory* factory, float threshold = 0.0f);
/**
* Returns the threshold.
*/
- float getThreshold();
-
- /**
- * Sets the threshold.
- * \param threshold The new threshold value. Should be between 0.0 and 1.0.
- */
- void setThreshold(float threshold);
+ float getThreshold() const;
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_SQUAREFACTORY
diff --git a/intern/audaspace/FX/AUD_SumFactory.cpp b/intern/audaspace/FX/AUD_SumFactory.cpp
index f7990aab8a1..a128e50504c 100644
--- a/intern/audaspace/FX/AUD_SumFactory.cpp
+++ b/intern/audaspace/FX/AUD_SumFactory.cpp
@@ -24,20 +24,18 @@
*/
#include "AUD_SumFactory.h"
-#include "AUD_SumReader.h"
+#include "AUD_IIRFilterReader.h"
AUD_SumFactory::AUD_SumFactory(AUD_IFactory* factory) :
- AUD_EffectFactory(factory) {}
-
-AUD_IReader* AUD_SumFactory::createReader()
+ AUD_EffectFactory(factory)
{
- AUD_IReader* reader = getReader();
-
- if(reader != 0)
- {
- reader = new AUD_SumReader(reader);
- AUD_NEW("reader")
- }
+}
- return reader;
+AUD_IReader* AUD_SumFactory::createReader() const
+{
+ std::vector<float> a, b;
+ a.push_back(1);
+ a.push_back(-1);
+ b.push_back(1);
+ return new AUD_IIRFilterReader(getReader(), b, a);
}
diff --git a/intern/audaspace/FX/AUD_SumFactory.h b/intern/audaspace/FX/AUD_SumFactory.h
index 5cb48e26b10..045a0a3a625 100644
--- a/intern/audaspace/FX/AUD_SumFactory.h
+++ b/intern/audaspace/FX/AUD_SumFactory.h
@@ -33,14 +33,19 @@
*/
class AUD_SumFactory : public AUD_EffectFactory
{
+private:
+ // hide copy constructor and operator=
+ AUD_SumFactory(const AUD_SumFactory&);
+ AUD_SumFactory& operator=(const AUD_SumFactory&);
+
public:
/**
* Creates a new sum factory.
* \param factory The input factory.
*/
- AUD_SumFactory(AUD_IFactory* factory = 0);
+ AUD_SumFactory(AUD_IFactory* factory);
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_SUMFACTORY
diff --git a/intern/audaspace/FX/AUD_SumReader.cpp b/intern/audaspace/FX/AUD_SumReader.cpp
deleted file mode 100644
index 08747790fc9..00000000000
--- a/intern/audaspace/FX/AUD_SumReader.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * $Id$
- *
- * ***** BEGIN LGPL LICENSE BLOCK *****
- *
- * Copyright 2009 Jörg Hermann Müller
- *
- * This file is part of AudaSpace.
- *
- * AudaSpace is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * AudaSpace is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
- *
- * ***** END LGPL LICENSE BLOCK *****
- */
-
-#include "AUD_SumReader.h"
-#include "AUD_Buffer.h"
-
-#include <cstring>
-
-#define CC specs.channels + channel
-
-AUD_SumReader::AUD_SumReader(AUD_IReader* reader) :
- AUD_EffectReader(reader)
-{
- AUD_Specs specs = reader->getSpecs();
- int samplesize = AUD_SAMPLE_SIZE(specs);
-
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
-
- m_sums = new AUD_Buffer(samplesize); AUD_NEW("buffer")
- memset(m_sums->getBuffer(), 0, samplesize);
-}
-
-AUD_SumReader::~AUD_SumReader()
-{
- delete m_buffer; AUD_DELETE("buffer")
- delete m_sums; AUD_DELETE("buffer")
-}
-
-void AUD_SumReader::read(int & length, sample_t* & buffer)
-{
- sample_t* buf;
- sample_t* sums;
- sums = m_sums->getBuffer();
-
- AUD_Specs specs = m_reader->getSpecs();
-
- m_reader->read(length, buf);
- if(m_buffer->getSize() < length * AUD_SAMPLE_SIZE(specs))
- m_buffer->resize(length * AUD_SAMPLE_SIZE(specs));
-
- buffer = m_buffer->getBuffer();
-
- for(int channel = 0; channel < specs.channels; channel++)
- for(int i = 0; i < length * specs.channels; i++)
- buffer[i * CC] = sums[channel] = sums[channel] + buf[i * CC];
-}
diff --git a/intern/audaspace/FX/AUD_SuperposeFactory.cpp b/intern/audaspace/FX/AUD_SuperposeFactory.cpp
new file mode 100644
index 00000000000..6bfc1125ca6
--- /dev/null
+++ b/intern/audaspace/FX/AUD_SuperposeFactory.cpp
@@ -0,0 +1,49 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN LGPL LICENSE BLOCK *****
+ *
+ * Copyright 2009 Jörg Hermann Müller
+ *
+ * This file is part of AudaSpace.
+ *
+ * AudaSpace is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AudaSpace is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * ***** END LGPL LICENSE BLOCK *****
+ */
+
+#include "AUD_SuperposeFactory.h"
+#include "AUD_SuperposeReader.h"
+
+AUD_SuperposeFactory::AUD_SuperposeFactory(AUD_IFactory* factory1, AUD_IFactory* factory2) :
+ m_factory1(factory1), m_factory2(factory2)
+{
+}
+
+AUD_IReader* AUD_SuperposeFactory::createReader() const
+{
+ AUD_IReader* reader1 = m_factory1->createReader();
+ AUD_IReader* reader2;
+ try
+ {
+ reader2 = m_factory2->createReader();
+ }
+ catch(AUD_Exception&)
+ {
+ delete reader1;
+ throw;
+ }
+
+ return new AUD_SuperposeReader(reader1, reader2);
+}
diff --git a/intern/audaspace/FX/AUD_SuperposeFactory.h b/intern/audaspace/FX/AUD_SuperposeFactory.h
new file mode 100644
index 00000000000..a7fde2c182f
--- /dev/null
+++ b/intern/audaspace/FX/AUD_SuperposeFactory.h
@@ -0,0 +1,63 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN LGPL LICENSE BLOCK *****
+ *
+ * Copyright 2009 Jörg Hermann Müller
+ *
+ * This file is part of AudaSpace.
+ *
+ * AudaSpace is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AudaSpace is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * ***** END LGPL LICENSE BLOCK *****
+ */
+
+#ifndef AUD_SUPERPOSEFACTORY
+#define AUD_SUPERPOSEFACTORY
+
+#include "AUD_IFactory.h"
+
+/**
+ * This factory plays two other factories behind each other.
+ * \note Readers from the underlying factories must have the same sample rate and channel count.
+ */
+class AUD_SuperposeFactory : public AUD_IFactory
+{
+private:
+ /**
+ * First played factory.
+ */
+ AUD_IFactory* m_factory1;
+
+ /**
+ * Second played factory.
+ */
+ AUD_IFactory* m_factory2;
+
+ // hide copy constructor and operator=
+ AUD_SuperposeFactory(const AUD_SuperposeFactory&);
+ AUD_SuperposeFactory& operator=(const AUD_SuperposeFactory&);
+
+public:
+ /**
+ * Creates a new superpose factory.
+ * \param factory1 The first input factory.
+ * \param factory2 The second input factory.
+ */
+ AUD_SuperposeFactory(AUD_IFactory* factory1, AUD_IFactory* factory2);
+
+ virtual AUD_IReader* createReader() const;
+};
+
+#endif //AUD_SUPERPOSEFACTORY
diff --git a/intern/audaspace/FX/AUD_SuperposeReader.cpp b/intern/audaspace/FX/AUD_SuperposeReader.cpp
new file mode 100644
index 00000000000..546b79a3a77
--- /dev/null
+++ b/intern/audaspace/FX/AUD_SuperposeReader.cpp
@@ -0,0 +1,115 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN LGPL LICENSE BLOCK *****
+ *
+ * Copyright 2009 Jörg Hermann Müller
+ *
+ * This file is part of AudaSpace.
+ *
+ * AudaSpace is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AudaSpace is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * ***** END LGPL LICENSE BLOCK *****
+ */
+
+#include "AUD_SuperposeReader.h"
+
+#include <cstring>
+
+static const char* specs_error = "AUD_SuperposeReader: Both readers have to "
+ "have the same specs.";
+
+AUD_SuperposeReader::AUD_SuperposeReader(AUD_IReader* reader1, AUD_IReader* reader2) :
+ m_reader1(reader1), m_reader2(reader2)
+{
+ try
+ {
+ AUD_Specs s1, s2;
+ s1 = reader1->getSpecs();
+ s2 = reader2->getSpecs();
+ if(memcmp(&s1, &s2, sizeof(AUD_Specs)))
+ AUD_THROW(AUD_ERROR_SPECS, specs_error);
+ }
+ catch(AUD_Exception&)
+ {
+ delete reader1;
+ delete reader2;
+
+ throw;
+ }
+}
+
+AUD_SuperposeReader::~AUD_SuperposeReader()
+{
+ delete m_reader1;
+ delete m_reader2;
+}
+
+bool AUD_SuperposeReader::isSeekable() const
+{
+ return m_reader1->isSeekable() && m_reader2->isSeekable();
+}
+
+void AUD_SuperposeReader::seek(int position)
+{
+ m_reader1->seek(position);
+ m_reader2->seek(position);
+}
+
+int AUD_SuperposeReader::getLength() const
+{
+ int len1 = m_reader1->getLength();
+ int len2 = m_reader2->getLength();
+ if((len1 < 0) || (len2 < 0))
+ return -1;
+ return AUD_MIN(len1, len2);
+}
+
+int AUD_SuperposeReader::getPosition() const
+{
+ int pos1 = m_reader1->getPosition();
+ int pos2 = m_reader2->getPosition();
+ return AUD_MAX(pos1, pos2);
+}
+
+AUD_Specs AUD_SuperposeReader::getSpecs() const
+{
+ return m_reader1->getSpecs();
+}
+
+void AUD_SuperposeReader::read(int & length, sample_t* & buffer)
+{
+ AUD_Specs specs = m_reader1->getSpecs();
+ int samplesize = AUD_SAMPLE_SIZE(specs);
+
+ if(m_buffer.getSize() < length * samplesize)
+ m_buffer.resize(length * samplesize);
+ buffer = m_buffer.getBuffer();
+
+ int len1 = length;
+ sample_t* buf;
+ m_reader1->read(len1, buf);
+ memcpy(buffer, buf, len1 * samplesize);
+
+ if(len1 < length)
+ memset(buffer + len1 * specs.channels, 0, (length - len1) * samplesize);
+
+ int len2 = length;
+ m_reader2->read(len2, buf);
+
+ for(int i = 0; i < len2 * specs.channels; i++)
+ buffer[i] += buf[i];
+
+ length = AUD_MAX(len1, len2);
+}
diff --git a/intern/audaspace/FX/AUD_SuperposeReader.h b/intern/audaspace/FX/AUD_SuperposeReader.h
new file mode 100644
index 00000000000..eeceb9adfeb
--- /dev/null
+++ b/intern/audaspace/FX/AUD_SuperposeReader.h
@@ -0,0 +1,79 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN LGPL LICENSE BLOCK *****
+ *
+ * Copyright 2009 Jörg Hermann Müller
+ *
+ * This file is part of AudaSpace.
+ *
+ * AudaSpace is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AudaSpace is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * ***** END LGPL LICENSE BLOCK *****
+ */
+
+#ifndef AUD_SUPERPOSEREADER
+#define AUD_SUPERPOSEREADER
+
+#include "AUD_IReader.h"
+#include "AUD_Buffer.h"
+
+/**
+ * This reader plays two readers with the same specs sequently.
+ */
+class AUD_SuperposeReader : public AUD_IReader
+{
+private:
+ /**
+ * The first reader.
+ */
+ AUD_IReader* m_reader1;
+
+ /**
+ * The second reader.
+ */
+ AUD_IReader* m_reader2;
+
+ /**
+ * The playback buffer for the intersecting part.
+ */
+ AUD_Buffer m_buffer;
+
+ // hide copy constructor and operator=
+ AUD_SuperposeReader(const AUD_SuperposeReader&);
+ AUD_SuperposeReader& operator=(const AUD_SuperposeReader&);
+
+public:
+ /**
+ * Creates a new superpose reader.
+ * \param reader1 The first reader to read from.
+ * \param reader2 The second reader to read from.
+ * \exception AUD_Exception Thrown if the specs from the readers differ.
+ */
+ AUD_SuperposeReader(AUD_IReader* reader1, AUD_IReader* reader2);
+
+ /**
+ * Destroys the reader.
+ */
+ virtual ~AUD_SuperposeReader();
+
+ virtual bool isSeekable() const;
+ virtual void seek(int position);
+ virtual int getLength() const;
+ virtual int getPosition() const;
+ virtual AUD_Specs getSpecs() const;
+ virtual void read(int & length, sample_t* & buffer);
+};
+
+#endif //AUD_SUPERPOSEREADER
diff --git a/intern/audaspace/FX/AUD_VolumeFactory.cpp b/intern/audaspace/FX/AUD_VolumeFactory.cpp
index fbde608aa12..1b341a5a51a 100644
--- a/intern/audaspace/FX/AUD_VolumeFactory.cpp
+++ b/intern/audaspace/FX/AUD_VolumeFactory.cpp
@@ -24,34 +24,23 @@
*/
#include "AUD_VolumeFactory.h"
-#include "AUD_VolumeReader.h"
+#include "AUD_IIRFilterReader.h"
AUD_VolumeFactory::AUD_VolumeFactory(AUD_IFactory* factory, float volume) :
AUD_EffectFactory(factory),
- m_volume(volume) {}
-
-AUD_VolumeFactory::AUD_VolumeFactory(float volume) :
- AUD_EffectFactory(0),
- m_volume(volume) {}
-
-float AUD_VolumeFactory::getVolume()
+ m_volume(volume)
{
- return m_volume;
}
-void AUD_VolumeFactory::setVolume(float volume)
+float AUD_VolumeFactory::getVolume() const
{
- m_volume = volume;
+ return m_volume;
}
-AUD_IReader* AUD_VolumeFactory::createReader()
+AUD_IReader* AUD_VolumeFactory::createReader() const
{
- AUD_IReader* reader = getReader();
-
- if(reader != 0)
- {
- reader = new AUD_VolumeReader(reader, m_volume); AUD_NEW("reader")
- }
-
- return reader;
+ std::vector<float> a, b;
+ a.push_back(1);
+ b.push_back(m_volume);
+ return new AUD_IIRFilterReader(getReader(), b, a);
}
diff --git a/intern/audaspace/FX/AUD_VolumeFactory.h b/intern/audaspace/FX/AUD_VolumeFactory.h
index 09f91241b47..a086aab4640 100644
--- a/intern/audaspace/FX/AUD_VolumeFactory.h
+++ b/intern/audaspace/FX/AUD_VolumeFactory.h
@@ -39,7 +39,11 @@ private:
/**
* The volume.
*/
- float m_volume;
+ const float m_volume;
+
+ // hide copy constructor and operator=
+ AUD_VolumeFactory(const AUD_VolumeFactory&);
+ AUD_VolumeFactory& operator=(const AUD_VolumeFactory&);
public:
/**
@@ -47,26 +51,14 @@ public:
* \param factory The input factory.
* \param volume The desired volume.
*/
- AUD_VolumeFactory(AUD_IFactory* factory = 0, float volume = 1.0f);
-
- /**
- * Creates a new volume factory.
- * \param volume The desired volume.
- */
- AUD_VolumeFactory(float volume);
+ AUD_VolumeFactory(AUD_IFactory* factory, float volume);
/**
* Returns the volume.
*/
- float getVolume();
-
- /**
- * Sets the volume.
- * \param volume The new volume value. Should be between 0.0 and 1.0.
- */
- void setVolume(float volume);
+ float getVolume() const;
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_VOLUMEFACTORY
diff --git a/intern/audaspace/FX/AUD_VolumeReader.cpp b/intern/audaspace/FX/AUD_VolumeReader.cpp
deleted file mode 100644
index f094c1e4ea3..00000000000
--- a/intern/audaspace/FX/AUD_VolumeReader.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * $Id$
- *
- * ***** BEGIN LGPL LICENSE BLOCK *****
- *
- * Copyright 2009 Jörg Hermann Müller
- *
- * This file is part of AudaSpace.
- *
- * AudaSpace is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * AudaSpace is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
- *
- * ***** END LGPL LICENSE BLOCK *****
- */
-
-#include "AUD_VolumeReader.h"
-#include "AUD_Buffer.h"
-
-#include <cstring>
-
-AUD_VolumeReader::AUD_VolumeReader(AUD_IReader* reader, float volume) :
- AUD_EffectReader(reader),
- m_volume(volume)
-{
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
-}
-
-AUD_VolumeReader::~AUD_VolumeReader()
-{
- delete m_buffer; AUD_DELETE("buffer")
-}
-
-bool AUD_VolumeReader::notify(AUD_Message &message)
-{
- if(message.type == AUD_MSG_VOLUME)
- {
- m_volume = message.volume;
-
- m_reader->notify(message);
-
- return true;
- }
- return m_reader->notify(message);
-}
-
-void AUD_VolumeReader::read(int & length, sample_t* & buffer)
-{
- sample_t* buf;
- AUD_Specs specs = m_reader->getSpecs();
-
- m_reader->read(length, buf);
- if(m_buffer->getSize() < length*AUD_SAMPLE_SIZE(specs))
- m_buffer->resize(length*AUD_SAMPLE_SIZE(specs));
-
- buffer = m_buffer->getBuffer();
-
- for(int i = 0; i < length * specs.channels; i++)
- buffer[i] = buf[i] * m_volume;
-}
diff --git a/intern/audaspace/Makefile b/intern/audaspace/Makefile
index 4cd15e5d9fb..c1a613af1ae 100644
--- a/intern/audaspace/Makefile
+++ b/intern/audaspace/Makefile
@@ -39,6 +39,7 @@ DIRS = intern
DIRS += FX
DIRS += SDL
DIRS += SRC
+DIRS += Python
ifeq ($(WITH_FFMPEG),true)
DIRS += ffmpeg
@@ -56,9 +57,9 @@ ifeq ($(WITH_SNDFILE),true)
DIRS += sndfile
endif
-ifeq ($(WITH_FFTW3),true)
- DIRS += fftw
-endif
+#ifeq ($(WITH_FFTW3),true)
+# DIRS += fftw
+#endif
include nan_subdirs.mk
@@ -66,7 +67,7 @@ install: $(ALL_OR_DEBUG)
@[ -d $(NAN_AUDASPACE) ] || mkdir $(NAN_AUDASPACE)
@[ -d $(NAN_AUDASPACE)/include ] || mkdir $(NAN_AUDASPACE)/include
@[ -d $(NAN_AUDASPACE)/lib/$(DEBUG_DIR) ] || mkdir $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)
- @../tools/cpifdiff.sh $(DIR)/$(DEBUG_DIR)libaudaspace.a $(DIR)/$(DEBUG_DIR)libaud_sdl.a $(DIR)/$(DEBUG_DIR)libaud_fx.a $(DIR)/$(DEBUG_DIR)libaud_src.a $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)
+ @../tools/cpifdiff.sh $(DIR)/$(DEBUG_DIR)libaudaspace.a $(DIR)/$(DEBUG_DIR)libaud_sdl.a $(DIR)/$(DEBUG_DIR)libaud_python.a $(DIR)/$(DEBUG_DIR)libaud_fx.a $(DIR)/$(DEBUG_DIR)libaud_src.a $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)
ifeq ($(WITH_FFMPEG),true)
@../tools/cpifdiff.sh $(DIR)/$(DEBUG_DIR)libaud_ffmpeg.a $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)
@@ -84,9 +85,9 @@ ifeq ($(WITH_SNDFILE),true)
@../tools/cpifdiff.sh $(DIR)/$(DEBUG_DIR)libaud_sndfile.a $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)
endif
-ifeq ($(WITH_FFTW3),true)
- @../tools/cpifdiff.sh $(DIR)/$(DEBUG_DIR)libaud_fftw.a $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)
-endif
+#ifeq ($(WITH_FFTW3),true)
+# @../tools/cpifdiff.sh $(DIR)/$(DEBUG_DIR)libaud_fftw.a $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)
+#endif
ifeq ($(OS),darwin)
ranlib $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaudaspace.a
@@ -110,9 +111,9 @@ ifeq ($(WITH_SNDFILE),true)
ranlib $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_sndfile.a
endif
-ifeq ($(WITH_FFTW3),true)
- ranlib $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_fftw.a
-endif
+#ifeq ($(WITH_FFTW3),true)
+# ranlib $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_fftw.a
+#endif
endif
@../tools/cpifdiff.sh intern/*.h $(NAN_AUDASPACE)/include/
diff --git a/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp b/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
index 796764989ba..aa7cfcfd880 100644
--- a/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
+++ b/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
@@ -24,9 +24,9 @@
*/
#include "AUD_OpenALDevice.h"
+#include "AUD_IFactory.h"
#include "AUD_IReader.h"
-#include "AUD_ConverterFactory.h"
-#include "AUD_SourceCaps.h"
+#include "AUD_ConverterReader.h"
#include <cstring>
#include <limits>
@@ -65,6 +65,15 @@ struct AUD_OpenALHandle : AUD_Handle
/// Whether the stream doesn't return any more data.
bool data_end;
+
+ /// The loop count of the source.
+ int loopcount;
+
+ /// The stop callback.
+ stopCallback stop;
+
+ /// Stop callback data.
+ void* stop_data;
};
struct AUD_OpenALBufferedFactory
@@ -128,13 +137,9 @@ void AUD_OpenALDevice::updateStreams()
{
// for all sounds
- AUD_HandleIterator it = m_playingSounds->begin();
- while(it != m_playingSounds->end())
+ for(AUD_HandleIterator it = m_playingSounds->begin(); it != m_playingSounds->end(); it++)
{
sound = *it;
- // increment the iterator to make sure it's valid,
- // in case the sound gets deleted after stopping
- ++it;
// is it a streamed sound?
if(!sound->isBuffered)
@@ -156,6 +161,18 @@ void AUD_OpenALDevice::updateStreams()
length = m_buffersize;
sound->reader->read(length, buffer);
+ // looping necessary?
+ if(length == 0 && sound->loopcount)
+ {
+ if(sound->loopcount > 0)
+ sound->loopcount--;
+
+ sound->reader->seek(0);
+
+ length = m_buffersize;
+ sound->reader->read(length, buffer);
+ }
+
// read nothing?
if(length == 0)
{
@@ -212,12 +229,21 @@ void AUD_OpenALDevice::updateStreams()
// if it really stopped
if(sound->data_end)
{
+ if(sound->stop)
+ sound->stop(sound->stop_data);
+
+ // increment the iterator to the next value,
+ // because the sound gets deleted in the list here.
+ ++it;
// pause or
if(sound->keep)
pause(sound);
// stop
else
stop(sound);
+ // decrement again, so that we get the next sound in the
+ // next loop run
+ --it;
}
// continue playing
else
@@ -263,6 +289,8 @@ bool AUD_OpenALDevice::isValid(AUD_Handle* handle)
return false;
}
+static const char* open_error = "AUD_OpenALDevice: Device couldn't be opened.";
+
AUD_OpenALDevice::AUD_OpenALDevice(AUD_DeviceSpecs specs, int buffersize)
{
// cannot determine how many channels or which format OpenAL uses, but
@@ -287,7 +315,7 @@ AUD_OpenALDevice::AUD_OpenALDevice(AUD_DeviceSpecs specs, int buffersize)
m_device = alcOpenDevice(NULL);
if(!m_device)
- AUD_THROW(AUD_ERROR_OPENAL);
+ AUD_THROW(AUD_ERROR_OPENAL, open_error);
// at least try to set the frequency
ALCint attribs[] = { ALC_FREQUENCY, specs.rate, 0 };
@@ -302,12 +330,7 @@ AUD_OpenALDevice::AUD_OpenALDevice(AUD_DeviceSpecs specs, int buffersize)
// check for specific formats and channel counts to be played back
if(alIsExtensionPresent("AL_EXT_FLOAT32") == AL_TRUE)
- {
specs.format = AUD_FORMAT_FLOAT32;
- m_converter = NULL;
- }
- else
- m_converter = new AUD_ConverterFactory(specs); AUD_NEW("factory")
m_useMC = alIsExtensionPresent("AL_EXT_MCFORMATS") == AL_TRUE;
@@ -317,10 +340,9 @@ AUD_OpenALDevice::AUD_OpenALDevice(AUD_DeviceSpecs specs, int buffersize)
m_buffersize = buffersize;
m_playing = false;
- m_playingSounds = new std::list<AUD_OpenALHandle*>(); AUD_NEW("list")
- m_pausedSounds = new std::list<AUD_OpenALHandle*>(); AUD_NEW("list")
+ m_playingSounds = new std::list<AUD_OpenALHandle*>();
+ m_pausedSounds = new std::list<AUD_OpenALHandle*>();
m_bufferedFactories = new std::list<AUD_OpenALBufferedFactory*>();
- AUD_NEW("list")
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
@@ -345,10 +367,10 @@ AUD_OpenALDevice::~AUD_OpenALDevice()
alDeleteSources(1, &sound->source);
if(!sound->isBuffered)
{
- delete sound->reader; AUD_DELETE("reader")
+ delete sound->reader;
alDeleteBuffers(AUD_OPENAL_CYCLE_BUFFERS, sound->buffers);
}
- delete sound; AUD_DELETE("handle")
+ delete sound;
m_playingSounds->erase(m_playingSounds->begin());
}
@@ -359,10 +381,10 @@ AUD_OpenALDevice::~AUD_OpenALDevice()
alDeleteSources(1, &sound->source);
if(!sound->isBuffered)
{
- delete sound->reader; AUD_DELETE("reader")
+ delete sound->reader;
alDeleteBuffers(AUD_OPENAL_CYCLE_BUFFERS, sound->buffers);
}
- delete sound; AUD_DELETE("handle")
+ delete sound;
m_pausedSounds->erase(m_pausedSounds->begin());
}
@@ -370,7 +392,7 @@ AUD_OpenALDevice::~AUD_OpenALDevice()
while(!m_bufferedFactories->empty())
{
alDeleteBuffers(1, &(*(m_bufferedFactories->begin()))->buffer);
- delete *m_bufferedFactories->begin(); AUD_DELETE("bufferedfactory");
+ delete *m_bufferedFactories->begin();
m_bufferedFactories->erase(m_bufferedFactories->begin());
}
@@ -385,22 +407,19 @@ AUD_OpenALDevice::~AUD_OpenALDevice()
else
unlock();
- delete m_playingSounds; AUD_DELETE("list")
- delete m_pausedSounds; AUD_DELETE("list")
- delete m_bufferedFactories; AUD_DELETE("list")
+ delete m_playingSounds;
+ delete m_pausedSounds;
+ delete m_bufferedFactories;
// quit OpenAL
alcMakeContextCurrent(NULL);
alcDestroyContext(m_context);
alcCloseDevice(m_device);
- if(m_converter)
- delete m_converter; AUD_DELETE("factory")
-
pthread_mutex_destroy(&m_mutex);
}
-AUD_DeviceSpecs AUD_OpenALDevice::getSpecs()
+AUD_DeviceSpecs AUD_OpenALDevice::getSpecs() const
{
return m_specs;
}
@@ -496,6 +515,15 @@ bool AUD_OpenALDevice::getFormat(ALenum &format, AUD_Specs specs)
return valid;
}
+static const char* genbuffer_error = "AUD_OpenALDevice: Buffer couldn't be "
+ "generated.";
+static const char* gensource_error = "AUD_OpenALDevice: Source couldn't be "
+ "generated.";
+static const char* queue_error = "AUD_OpenALDevice: Buffer couldn't be "
+ "queued to the source.";
+static const char* bufferdata_error = "AUD_OpenALDevice: Buffer couldn't be "
+ "filled with data.";
+
AUD_Handle* AUD_OpenALDevice::play(AUD_IFactory* factory, bool keep)
{
lock();
@@ -511,11 +539,14 @@ AUD_Handle* AUD_OpenALDevice::play(AUD_IFactory* factory, bool keep)
if((*i)->factory == factory)
{
// create the handle
- sound = new AUD_OpenALHandle; AUD_NEW("handle")
+ sound = new AUD_OpenALHandle;
sound->keep = keep;
sound->current = -1;
sound->isBuffered = true;
sound->data_end = true;
+ sound->loopcount = 0;
+ sound->stop = NULL;
+ sound->stop_data = NULL;
alcSuspendContext(m_context);
@@ -524,23 +555,23 @@ AUD_Handle* AUD_OpenALDevice::play(AUD_IFactory* factory, bool keep)
{
alGenSources(1, &sound->source);
if(alGetError() != AL_NO_ERROR)
- AUD_THROW(AUD_ERROR_OPENAL);
+ AUD_THROW(AUD_ERROR_OPENAL, gensource_error);
try
{
alSourcei(sound->source, AL_BUFFER, (*i)->buffer);
if(alGetError() != AL_NO_ERROR)
- AUD_THROW(AUD_ERROR_OPENAL);
+ AUD_THROW(AUD_ERROR_OPENAL, queue_error);
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
alDeleteSources(1, &sound->source);
throw;
}
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
- delete sound; AUD_DELETE("handle")
+ delete sound;
alcProcessContext(m_context);
throw;
}
@@ -555,7 +586,7 @@ AUD_Handle* AUD_OpenALDevice::play(AUD_IFactory* factory, bool keep)
}
}
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
unlock();
throw;
@@ -568,35 +599,32 @@ AUD_Handle* AUD_OpenALDevice::play(AUD_IFactory* factory, bool keep)
AUD_IReader* reader = factory->createReader();
- if(reader == NULL)
- AUD_THROW(AUD_ERROR_READER);
-
AUD_DeviceSpecs specs = m_specs;
specs.specs = reader->getSpecs();
// check format
bool valid = specs.channels != AUD_CHANNELS_INVALID;
- if(m_converter)
- {
- m_converter->setReader(reader);
- reader = m_converter->createReader();
- }
+ if(m_specs.format != AUD_FORMAT_FLOAT32)
+ reader = new AUD_ConverterReader(reader, m_specs);
// create the handle
- sound = new AUD_OpenALHandle; AUD_NEW("handle")
+ sound = new AUD_OpenALHandle;
sound->keep = keep;
sound->reader = reader;
sound->current = 0;
sound->isBuffered = false;
sound->data_end = false;
+ sound->loopcount = 0;
+ sound->stop = NULL;
+ sound->stop_data = NULL;
valid &= getFormat(sound->format, specs.specs);
if(!valid)
{
- delete sound; AUD_DELETE("handle")
- delete reader; AUD_DELETE("reader")
+ delete sound;
+ delete reader;
return NULL;
}
@@ -608,7 +636,7 @@ AUD_Handle* AUD_OpenALDevice::play(AUD_IFactory* factory, bool keep)
{
alGenBuffers(AUD_OPENAL_CYCLE_BUFFERS, sound->buffers);
if(alGetError() != AL_NO_ERROR)
- AUD_THROW(AUD_ERROR_OPENAL);
+ AUD_THROW(AUD_ERROR_OPENAL, genbuffer_error);
try
{
@@ -623,36 +651,36 @@ AUD_Handle* AUD_OpenALDevice::play(AUD_IFactory* factory, bool keep)
length * AUD_DEVICE_SAMPLE_SIZE(specs),
specs.rate);
if(alGetError() != AL_NO_ERROR)
- AUD_THROW(AUD_ERROR_OPENAL);
+ AUD_THROW(AUD_ERROR_OPENAL, bufferdata_error);
}
alGenSources(1, &sound->source);
if(alGetError() != AL_NO_ERROR)
- AUD_THROW(AUD_ERROR_OPENAL);
+ AUD_THROW(AUD_ERROR_OPENAL, gensource_error);
try
{
alSourceQueueBuffers(sound->source, AUD_OPENAL_CYCLE_BUFFERS,
sound->buffers);
if(alGetError() != AL_NO_ERROR)
- AUD_THROW(AUD_ERROR_OPENAL);
+ AUD_THROW(AUD_ERROR_OPENAL, queue_error);
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
alDeleteSources(1, &sound->source);
throw;
}
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
alDeleteBuffers(AUD_OPENAL_CYCLE_BUFFERS, sound->buffers);
throw;
}
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
- delete sound; AUD_DELETE("handle")
- delete reader; AUD_DELETE("reader")
+ delete sound;
+ delete reader;
alcProcessContext(m_context);
unlock();
throw;
@@ -737,10 +765,10 @@ bool AUD_OpenALDevice::stop(AUD_Handle* handle)
alDeleteSources(1, &sound->source);
if(!sound->isBuffered)
{
- delete sound->reader; AUD_DELETE("reader")
+ delete sound->reader;
alDeleteBuffers(AUD_OPENAL_CYCLE_BUFFERS, sound->buffers);
}
- delete *i; AUD_DELETE("handle")
+ delete *i;
m_playingSounds->erase(i);
result = true;
break;
@@ -757,10 +785,10 @@ bool AUD_OpenALDevice::stop(AUD_Handle* handle)
alDeleteSources(1, &sound->source);
if(!sound->isBuffered)
{
- delete sound->reader; AUD_DELETE("reader")
+ delete sound->reader;
alDeleteBuffers(AUD_OPENAL_CYCLE_BUFFERS, sound->buffers);
}
- delete *i; AUD_DELETE("handle")
+ delete *i;
m_pausedSounds->erase(i);
result = true;
break;
@@ -773,43 +801,31 @@ bool AUD_OpenALDevice::stop(AUD_Handle* handle)
return result;
}
-bool AUD_OpenALDevice::setKeep(AUD_Handle* handle, bool keep)
+bool AUD_OpenALDevice::getKeep(AUD_Handle* handle)
{
bool result = false;
lock();
if(isValid(handle))
- {
- ((AUD_OpenALHandle*)handle)->keep = keep;
- result = true;
- }
+ result = ((AUD_OpenALHandle*)handle)->keep;
unlock();
return result;
}
-bool AUD_OpenALDevice::sendMessage(AUD_Handle* handle, AUD_Message &message)
+bool AUD_OpenALDevice::setKeep(AUD_Handle* handle, bool keep)
{
bool result = false;
lock();
- if(handle == 0)
+ if(isValid(handle))
{
- for(AUD_HandleIterator i = m_playingSounds->begin();
- i != m_playingSounds->end(); i++)
- if(!(*i)->isBuffered)
- result |= (*i)->reader->notify(message);
- for(AUD_HandleIterator i = m_pausedSounds->begin();
- i != m_pausedSounds->end(); i++)
- if(!(*i)->isBuffered)
- result |= (*i)->reader->notify(message);
+ ((AUD_OpenALHandle*)handle)->keep = keep;
+ result = true;
}
- else if(isValid(handle))
- if(!((AUD_OpenALHandle*)handle)->isBuffered)
- result = ((AUD_OpenALHandle*)handle)->reader->notify(message);
unlock();
@@ -947,440 +963,657 @@ void AUD_OpenALDevice::unlock()
pthread_mutex_unlock(&m_mutex);
}
-/******************************************************************************/
-/**************************** Capabilities Code *******************************/
-/******************************************************************************/
+float AUD_OpenALDevice::getVolume() const
+{
+ float result;
+ alGetListenerf(AL_GAIN, &result);
+ return result;
+}
-bool AUD_OpenALDevice::checkCapability(int capability)
+void AUD_OpenALDevice::setVolume(float volume)
{
- return capability == AUD_CAPS_3D_DEVICE ||
- capability == AUD_CAPS_VOLUME ||
- capability == AUD_CAPS_SOURCE_VOLUME ||
- capability == AUD_CAPS_SOURCE_PITCH ||
- capability == AUD_CAPS_BUFFERED_FACTORY;
+ alListenerf(AL_GAIN, volume);
+}
+
+float AUD_OpenALDevice::getVolume(AUD_Handle* handle)
+{
+ lock();
+ float result = std::numeric_limits<float>::quiet_NaN();
+ if(isValid(handle))
+ alGetSourcef(((AUD_OpenALHandle*)handle)->source,AL_GAIN, &result);
+ unlock();
+ return result;
}
-bool AUD_OpenALDevice::setCapability(int capability, void *value)
+bool AUD_OpenALDevice::setVolume(AUD_Handle* handle, float volume)
+{
+ lock();
+ bool result = isValid(handle);
+ if(result)
+ alSourcef(((AUD_OpenALHandle*)handle)->source, AL_GAIN, volume);
+ unlock();
+ return result;
+}
+
+float AUD_OpenALDevice::getPitch(AUD_Handle* handle)
+{
+ lock();
+ float result = std::numeric_limits<float>::quiet_NaN();
+ if(isValid(handle))
+ alGetSourcef(((AUD_OpenALHandle*)handle)->source,AL_PITCH, &result);
+ unlock();
+ return result;
+}
+
+bool AUD_OpenALDevice::setPitch(AUD_Handle* handle, float pitch)
+{
+ lock();
+ bool result = isValid(handle);
+ if(result)
+ alSourcef(((AUD_OpenALHandle*)handle)->source, AL_PITCH, pitch);
+ unlock();
+ return result;
+}
+
+int AUD_OpenALDevice::getLoopCount(AUD_Handle* handle)
+{
+ lock();
+ int result = 0;
+ if(isValid(handle))
+ result = ((AUD_OpenALHandle*)handle)->loopcount;
+ unlock();
+ return result;
+}
+
+bool AUD_OpenALDevice::setLoopCount(AUD_Handle* handle, int count)
+{
+ lock();
+ bool result = isValid(handle);
+ if(result)
+ ((AUD_OpenALHandle*)handle)->loopcount = count;
+ unlock();
+ return result;
+}
+
+bool AUD_OpenALDevice::setStopCallback(AUD_Handle* handle, stopCallback callback, void* data)
+{
+ lock();
+ bool result = isValid(handle);
+ if(result)
+ {
+ AUD_OpenALHandle* h = (AUD_OpenALHandle*)handle;
+ h->stop = callback;
+ h->stop_data = data;
+ }
+ unlock();
+ return result;
+}
+
+/* AUD_XXX Temorary disabled
+
+bool AUD_OpenALDevice::bufferFactory(void *value)
{
bool result = false;
- switch(capability)
+ AUD_IFactory* factory = (AUD_IFactory*) value;
+
+ // load the factory into an OpenAL buffer
+ if(factory)
{
- case AUD_CAPS_VOLUME:
- alListenerf(AL_GAIN, *((float*)value));
- return true;
- case AUD_CAPS_SOURCE_VOLUME:
+ // check if the factory is already buffered
+ lock();
+ for(AUD_BFIterator i = m_bufferedFactories->begin();
+ i != m_bufferedFactories->end(); i++)
{
- AUD_SourceCaps* caps = (AUD_SourceCaps*) value;
- lock();
- if(isValid(caps->handle))
+ if((*i)->factory == factory)
{
- alSourcef(((AUD_OpenALHandle*)caps->handle)->source,
- AL_GAIN, caps->value);
result = true;
+ break;
}
- unlock();
}
- break;
- case AUD_CAPS_SOURCE_PITCH:
+ unlock();
+ if(result)
+ return result;
+
+ AUD_IReader* reader = factory->createReader();
+
+ if(reader == NULL)
+ return false;
+
+ AUD_DeviceSpecs specs = m_specs;
+ specs.specs = reader->getSpecs();
+
+ if(m_specs.format != AUD_FORMAT_FLOAT32)
+ reader = new AUD_ConverterReader(reader, m_specs);
+
+ ALenum format;
+
+ if(!getFormat(format, specs.specs))
{
- AUD_SourceCaps* caps = (AUD_SourceCaps*) value;
- lock();
- if(isValid(caps->handle))
- {
- alSourcef(((AUD_OpenALHandle*)caps->handle)->source,
- AL_PITCH, caps->value);
- result = true;
- }
- unlock();
+ delete reader;
+ return false;
}
- break;
- case AUD_CAPS_BUFFERED_FACTORY:
+
+ // load into a buffer
+ lock();
+ alcSuspendContext(m_context);
+
+ AUD_OpenALBufferedFactory* bf = new AUD_OpenALBufferedFactory;
+ bf->factory = factory;
+
+ try
{
- AUD_IFactory* factory = (AUD_IFactory*) value;
+ alGenBuffers(1, &bf->buffer);
+ if(alGetError() != AL_NO_ERROR)
+ AUD_THROW(AUD_ERROR_OPENAL);
- // load the factory into an OpenAL buffer
- if(factory)
+ try
{
- // check if the factory is already buffered
- lock();
- for(AUD_BFIterator i = m_bufferedFactories->begin();
- i != m_bufferedFactories->end(); i++)
- {
- if((*i)->factory == factory)
- {
- result = true;
- break;
- }
- }
- unlock();
- if(result)
- return result;
+ sample_t* buf;
+ int length = reader->getLength();
- AUD_IReader* reader = factory->createReader();
+ reader->read(length, buf);
+ alBufferData(bf->buffer, format, buf,
+ length * AUD_DEVICE_SAMPLE_SIZE(specs),
+ specs.rate);
+ if(alGetError() != AL_NO_ERROR)
+ AUD_THROW(AUD_ERROR_OPENAL);
+ }
+ catch(AUD_Exception&)
+ {
+ alDeleteBuffers(1, &bf->buffer);
+ throw;
+ }
+ }
+ catch(AUD_Exception&)
+ {
+ delete bf;
+ delete reader;
+ alcProcessContext(m_context);
+ unlock();
+ return false;
+ }
- if(reader == NULL)
- return false;
+ m_bufferedFactories->push_back(bf);
- AUD_DeviceSpecs specs = m_specs;
- specs.specs = reader->getSpecs();
+ alcProcessContext(m_context);
+ unlock();
+ }
+ else
+ {
+ // stop all playing and paused buffered sources
+ lock();
+ alcSuspendContext(m_context);
- // determine format
- bool valid = reader->getType() == AUD_TYPE_BUFFER;
+ AUD_OpenALHandle* sound;
+ AUD_HandleIterator it = m_playingSounds->begin();
+ while(it != m_playingSounds->end())
+ {
+ sound = *it;
+ ++it;
- if(valid)
- {
- if(m_converter)
- {
- m_converter->setReader(reader);
- reader = m_converter->createReader();
- }
- }
+ if(sound->isBuffered)
+ stop(sound);
+ }
+ alcProcessContext(m_context);
- ALenum format;
+ while(!m_bufferedFactories->empty())
+ {
+ alDeleteBuffers(1,
+ &(*(m_bufferedFactories->begin()))->buffer);
+ delete *m_bufferedFactories->begin();
+ m_bufferedFactories->erase(m_bufferedFactories->begin());
+ }
+ unlock();
+ }
- if(valid)
- valid = getFormat(format, specs.specs);
+ return true;
+}*/
- if(!valid)
- {
- delete reader; AUD_DELETE("reader")
- return false;
- }
+/******************************************************************************/
+/**************************** 3D Device Code **********************************/
+/******************************************************************************/
- // load into a buffer
- lock();
- alcSuspendContext(m_context);
+AUD_Vector3 AUD_OpenALDevice::getListenerLocation() const
+{
+ ALfloat p[3];
+ alGetListenerfv(AL_POSITION, p);
+ return AUD_Vector3(p[0], p[1], p[2]);
+}
- AUD_OpenALBufferedFactory* bf = new AUD_OpenALBufferedFactory;
- AUD_NEW("bufferedfactory");
- bf->factory = factory;
+void AUD_OpenALDevice::setListenerLocation(const AUD_Vector3& location)
+{
+ alListenerfv(AL_POSITION, (ALfloat*)location.get());
+}
- try
- {
- alGenBuffers(1, &bf->buffer);
- if(alGetError() != AL_NO_ERROR)
- AUD_THROW(AUD_ERROR_OPENAL);
+AUD_Vector3 AUD_OpenALDevice::getListenerVelocity() const
+{
+ ALfloat v[3];
+ alGetListenerfv(AL_VELOCITY, v);
+ return AUD_Vector3(v[0], v[1], v[2]);
+}
- try
- {
- sample_t* buf;
- int length = reader->getLength();
+void AUD_OpenALDevice::setListenerVelocity(const AUD_Vector3& velocity)
+{
+ alListenerfv(AL_VELOCITY, (ALfloat*)velocity.get());
+}
- reader->read(length, buf);
- alBufferData(bf->buffer, format, buf,
- length * AUD_DEVICE_SAMPLE_SIZE(specs),
- specs.rate);
- if(alGetError() != AL_NO_ERROR)
- AUD_THROW(AUD_ERROR_OPENAL);
- }
- catch(AUD_Exception)
- {
- alDeleteBuffers(1, &bf->buffer);
- throw;
- }
- }
- catch(AUD_Exception)
- {
- delete bf; AUD_DELETE("bufferedfactory")
- delete reader; AUD_DELETE("reader")
- alcProcessContext(m_context);
- unlock();
- return false;
- }
+AUD_Quaternion AUD_OpenALDevice::getListenerOrientation() const
+{
+ // AUD_XXX not implemented yet
+ return AUD_Quaternion(0, 0, 0, 0);
+}
- m_bufferedFactories->push_back(bf);
+void AUD_OpenALDevice::setListenerOrientation(const AUD_Quaternion& orientation)
+{
+ ALfloat direction[6];
+ direction[0] = -2 * (orientation.w() * orientation.y() +
+ orientation.x() * orientation.z());
+ direction[1] = 2 * (orientation.x() * orientation.w() -
+ orientation.z() * orientation.y());
+ direction[2] = 2 * (orientation.x() * orientation.x() +
+ orientation.y() * orientation.y()) - 1;
+ direction[3] = 2 * (orientation.x() * orientation.y() -
+ orientation.w() * orientation.z());
+ direction[4] = 1 - 2 * (orientation.x() * orientation.x() +
+ orientation.z() * orientation.z());
+ direction[5] = 2 * (orientation.w() * orientation.x() +
+ orientation.y() * orientation.z());
+ alListenerfv(AL_ORIENTATION, direction);
+}
- alcProcessContext(m_context);
- unlock();
- }
- else
- {
- // stop all playing and paused buffered sources
- lock();
- alcSuspendContext(m_context);
+float AUD_OpenALDevice::getSpeedOfSound() const
+{
+ return alGetFloat(AL_SPEED_OF_SOUND);
+}
- AUD_OpenALHandle* sound;
- AUD_HandleIterator it = m_playingSounds->begin();
- while(it != m_playingSounds->end())
- {
- sound = *it;
- ++it;
+void AUD_OpenALDevice::setSpeedOfSound(float speed)
+{
+ alSpeedOfSound(speed);
+}
- if(sound->isBuffered)
- stop(sound);
- }
- alcProcessContext(m_context);
+float AUD_OpenALDevice::getDopplerFactor() const
+{
+ return alGetFloat(AL_DOPPLER_FACTOR);
+}
- while(!m_bufferedFactories->empty())
- {
- alDeleteBuffers(1,
- &(*(m_bufferedFactories->begin()))->buffer);
- delete *m_bufferedFactories->begin();
- AUD_DELETE("bufferedfactory");
- m_bufferedFactories->erase(m_bufferedFactories->begin());
- }
- unlock();
- }
+void AUD_OpenALDevice::setDopplerFactor(float factor)
+{
+ alDopplerFactor(factor);
+}
- return true;
- }
- break;
+AUD_DistanceModel AUD_OpenALDevice::getDistanceModel() const
+{
+ switch(alGetInteger(AL_DISTANCE_MODEL))
+ {
+ case AL_INVERSE_DISTANCE:
+ return AUD_DISTANCE_MODEL_INVERSE;
+ case AL_INVERSE_DISTANCE_CLAMPED:
+ return AUD_DISTANCE_MODEL_INVERSE_CLAMPED;
+ case AL_LINEAR_DISTANCE:
+ return AUD_DISTANCE_MODEL_LINEAR;
+ case AL_LINEAR_DISTANCE_CLAMPED:
+ return AUD_DISTANCE_MODEL_LINEAR_CLAMPED;
+ case AL_EXPONENT_DISTANCE:
+ return AUD_DISTANCE_MODEL_EXPONENT;
+ case AL_EXPONENT_DISTANCE_CLAMPED:
+ return AUD_DISTANCE_MODEL_EXPONENT_CLAMPED;
+ default:
+ return AUD_DISTANCE_MODEL_INVALID;
}
- return result;
}
-bool AUD_OpenALDevice::getCapability(int capability, void *value)
+void AUD_OpenALDevice::setDistanceModel(AUD_DistanceModel model)
{
- bool result = false;
-
- switch(capability)
+ switch(model)
{
- case AUD_CAPS_VOLUME:
- alGetListenerf(AL_GAIN, (float*)value);
- return true;
- case AUD_CAPS_SOURCE_VOLUME:
- {
- AUD_SourceCaps* caps = (AUD_SourceCaps*) value;
- lock();
- if(isValid(caps->handle))
- {
- alGetSourcef(((AUD_OpenALHandle*)caps->handle)->source,
- AL_GAIN, &caps->value);
- result = true;
- }
- unlock();
- }
+ case AUD_DISTANCE_MODEL_INVERSE:
+ alDistanceModel(AL_INVERSE_DISTANCE);
break;
- case AUD_CAPS_SOURCE_PITCH:
- {
- AUD_SourceCaps* caps = (AUD_SourceCaps*) value;
- lock();
- if(isValid(caps->handle))
- {
- alGetSourcef(((AUD_OpenALHandle*)caps->handle)->source,
- AL_PITCH, &caps->value);
- result = true;
- }
- unlock();
- }
+ case AUD_DISTANCE_MODEL_INVERSE_CLAMPED:
+ alDistanceModel(AL_INVERSE_DISTANCE_CLAMPED);
+ break;
+ case AUD_DISTANCE_MODEL_LINEAR:
+ alDistanceModel(AL_LINEAR_DISTANCE);
+ break;
+ case AUD_DISTANCE_MODEL_LINEAR_CLAMPED:
+ alDistanceModel(AL_LINEAR_DISTANCE_CLAMPED);
+ break;
+ case AUD_DISTANCE_MODEL_EXPONENT:
+ alDistanceModel(AL_EXPONENT_DISTANCE);
break;
+ case AUD_DISTANCE_MODEL_EXPONENT_CLAMPED:
+ alDistanceModel(AL_EXPONENT_DISTANCE_CLAMPED);
+ break;
+ default:
+ alDistanceModel(AL_NONE);
}
+}
+
+AUD_Vector3 AUD_OpenALDevice::getSourceLocation(AUD_Handle* handle)
+{
+ AUD_Vector3 result = AUD_Vector3(0, 0, 0);
+ ALfloat p[3];
+ lock();
+ if(isValid(handle))
+ {
+ alGetSourcefv(((AUD_OpenALHandle*)handle)->source, AL_POSITION, p);
+ result = AUD_Vector3(p[0], p[1], p[2]);
+ }
+
+ unlock();
return result;
}
-/******************************************************************************/
-/**************************** 3D Device Code **********************************/
-/******************************************************************************/
+bool AUD_OpenALDevice::setSourceLocation(AUD_Handle* handle, const AUD_Vector3& location)
+{
+ lock();
+ bool result = isValid(handle);
+
+ if(result)
+ alSourcefv(((AUD_OpenALHandle*)handle)->source, AL_POSITION,
+ (ALfloat*)location.get());
-AUD_Handle* AUD_OpenALDevice::play3D(AUD_IFactory* factory, bool keep)
+ unlock();
+ return result;
+}
+
+AUD_Vector3 AUD_OpenALDevice::getSourceVelocity(AUD_Handle* handle)
{
- AUD_OpenALHandle* handle = (AUD_OpenALHandle*)play(factory, keep);
- if(handle)
- alSourcei(handle->source, AL_SOURCE_RELATIVE, 0);
- return handle;
+ AUD_Vector3 result = AUD_Vector3(0, 0, 0);
+ ALfloat v[3];
+ lock();
+
+ if(isValid(handle))
+ {
+ alGetSourcefv(((AUD_OpenALHandle*)handle)->source, AL_VELOCITY, v);
+ result = AUD_Vector3(v[0], v[1], v[2]);
+ }
+
+ unlock();
+ return result;
}
-bool AUD_OpenALDevice::updateListener(AUD_3DData &data)
+bool AUD_OpenALDevice::setSourceVelocity(AUD_Handle* handle, const AUD_Vector3& velocity)
{
- alListenerfv(AL_POSITION, (ALfloat*)data.position);
- alListenerfv(AL_VELOCITY, (ALfloat*)data.velocity);
- alListenerfv(AL_ORIENTATION, (ALfloat*)&(data.orientation[3]));
+ lock();
+ bool result = isValid(handle);
- return true;
+ if(result)
+ alSourcefv(((AUD_OpenALHandle*)handle)->source, AL_VELOCITY,
+ (ALfloat*)velocity.get());
+
+ unlock();
+ return result;
}
-bool AUD_OpenALDevice::setSetting(AUD_3DSetting setting, float value)
+AUD_Quaternion AUD_OpenALDevice::getSourceOrientation(AUD_Handle* handle)
{
- switch(setting)
- {
- case AUD_3DS_DISTANCE_MODEL:
- if(value == AUD_DISTANCE_MODEL_NONE)
- alDistanceModel(AL_NONE);
- else if(value == AUD_DISTANCE_MODEL_INVERSE)
- alDistanceModel(AL_INVERSE_DISTANCE);
- else if(value == AUD_DISTANCE_MODEL_INVERSE_CLAMPED)
- alDistanceModel(AL_INVERSE_DISTANCE_CLAMPED);
- else if(value == AUD_DISTANCE_MODEL_LINEAR)
- alDistanceModel(AL_LINEAR_DISTANCE);
- else if(value == AUD_DISTANCE_MODEL_LINEAR_CLAMPED)
- alDistanceModel(AL_LINEAR_DISTANCE_CLAMPED);
- else if(value == AUD_DISTANCE_MODEL_EXPONENT)
- alDistanceModel(AL_EXPONENT_DISTANCE);
- else if(value == AUD_DISTANCE_MODEL_EXPONENT_CLAMPED)
- alDistanceModel(AL_EXPONENT_DISTANCE_CLAMPED);
- else
- return false;
- return true;
- case AUD_3DS_DOPPLER_FACTOR:
- alDopplerFactor(value);
- return true;
- case AUD_3DS_SPEED_OF_SOUND:
- alSpeedOfSound(value);
- return true;
- default:
- return false;
- }
+ // AUD_XXX not implemented yet
+ return AUD_Quaternion(0, 0, 0, 0);
}
-float AUD_OpenALDevice::getSetting(AUD_3DSetting setting)
+bool AUD_OpenALDevice::setSourceOrientation(AUD_Handle* handle, const AUD_Quaternion& orientation)
{
- switch(setting)
+ lock();
+ bool result = isValid(handle);
+
+ if(result)
{
- case AUD_3DS_DISTANCE_MODEL:
- switch(alGetInteger(AL_DISTANCE_MODEL))
- {
- case AL_NONE:
- return AUD_DISTANCE_MODEL_NONE;
- case AL_INVERSE_DISTANCE:
- return AUD_DISTANCE_MODEL_INVERSE;
- case AL_INVERSE_DISTANCE_CLAMPED:
- return AUD_DISTANCE_MODEL_INVERSE_CLAMPED;
- case AL_LINEAR_DISTANCE:
- return AUD_DISTANCE_MODEL_LINEAR;
- case AL_LINEAR_DISTANCE_CLAMPED:
- return AUD_DISTANCE_MODEL_LINEAR_CLAMPED;
- case AL_EXPONENT_DISTANCE:
- return AUD_DISTANCE_MODEL_EXPONENT;
- case AL_EXPONENT_DISTANCE_CLAMPED:
- return AUD_DISTANCE_MODEL_EXPONENT_CLAMPED;
- }
- case AUD_3DS_DOPPLER_FACTOR:
- return alGetFloat(AL_DOPPLER_FACTOR);
- case AUD_3DS_SPEED_OF_SOUND:
- return alGetFloat(AL_SPEED_OF_SOUND);
- default:
- return std::numeric_limits<float>::quiet_NaN();
+ ALfloat direction[3];
+ direction[0] = -2 * (orientation.w() * orientation.y() +
+ orientation.x() * orientation.z());
+ direction[1] = 2 * (orientation.x() * orientation.w() -
+ orientation.z() * orientation.y());
+ direction[2] = 2 * (orientation.x() * orientation.x() +
+ orientation.y() * orientation.y()) - 1;
+ alSourcefv(((AUD_OpenALHandle*)handle)->source, AL_DIRECTION,
+ direction);
}
+
+ unlock();
+ return result;
}
-bool AUD_OpenALDevice::updateSource(AUD_Handle* handle, AUD_3DData &data)
+bool AUD_OpenALDevice::isRelative(AUD_Handle* handle)
{
- bool result = false;
+ int result = std::numeric_limits<float>::quiet_NaN();;
lock();
if(isValid(handle))
- {
- int source = ((AUD_OpenALHandle*)handle)->source;
- alSourcefv(source, AL_POSITION, (ALfloat*)data.position);
- alSourcefv(source, AL_VELOCITY, (ALfloat*)data.velocity);
- alSourcefv(source, AL_DIRECTION, (ALfloat*)&(data.orientation[3]));
- result = true;
- }
+ alGetSourcei(((AUD_OpenALHandle*)handle)->source, AL_SOURCE_RELATIVE,
+ &result);
unlock();
+ return result;
+}
+bool AUD_OpenALDevice::setRelative(AUD_Handle* handle, bool relative)
+{
+ lock();
+ bool result = isValid(handle);
+
+ if(result)
+ alSourcei(((AUD_OpenALHandle*)handle)->source, AL_SOURCE_RELATIVE,
+ relative);
+
+ unlock();
return result;
}
-bool AUD_OpenALDevice::setSourceSetting(AUD_Handle* handle,
- AUD_3DSourceSetting setting,
- float value)
+float AUD_OpenALDevice::getVolumeMaximum(AUD_Handle* handle)
{
+ float result = std::numeric_limits<float>::quiet_NaN();;
+
lock();
- bool result = false;
+ if(isValid(handle))
+ alGetSourcef(((AUD_OpenALHandle*)handle)->source, AL_MAX_GAIN,
+ &result);
+
+ unlock();
+ return result;
+}
+
+bool AUD_OpenALDevice::setVolumeMaximum(AUD_Handle* handle, float volume)
+{
+ lock();
+ bool result = isValid(handle);
+
+ if(result)
+
+ alSourcef(((AUD_OpenALHandle*)handle)->source, AL_MAX_GAIN,
+ volume);
+
+ unlock();
+ return result;
+}
+
+float AUD_OpenALDevice::getVolumeMinimum(AUD_Handle* handle)
+{
+ float result = std::numeric_limits<float>::quiet_NaN();;
+
+ lock();
if(isValid(handle))
- {
- int source = ((AUD_OpenALHandle*)handle)->source;
+ alGetSourcef(((AUD_OpenALHandle*)handle)->source, AL_MIN_GAIN,
+ &result);
- switch(setting)
- {
- case AUD_3DSS_CONE_INNER_ANGLE:
- alSourcef(source, AL_CONE_INNER_ANGLE, value);
- result = true;
- break;
- case AUD_3DSS_CONE_OUTER_ANGLE:
- alSourcef(source, AL_CONE_OUTER_ANGLE, value);
- result = true;
- break;
- case AUD_3DSS_CONE_OUTER_GAIN:
- alSourcef(source, AL_CONE_OUTER_GAIN, value);
- result = true;
- break;
- case AUD_3DSS_IS_RELATIVE:
- alSourcei(source, AL_SOURCE_RELATIVE, value > 0.0f);
- result = true;
- break;
- case AUD_3DSS_MAX_DISTANCE:
- alSourcef(source, AL_MAX_DISTANCE, value);
- result = true;
- break;
- case AUD_3DSS_MAX_GAIN:
- alSourcef(source, AL_MAX_GAIN, value);
- result = true;
- break;
- case AUD_3DSS_MIN_GAIN:
- alSourcef(source, AL_MIN_GAIN, value);
- result = true;
- break;
- case AUD_3DSS_REFERENCE_DISTANCE:
- alSourcef(source, AL_REFERENCE_DISTANCE, value);
- result = true;
- break;
- case AUD_3DSS_ROLLOFF_FACTOR:
- alSourcef(source, AL_ROLLOFF_FACTOR, value);
- result = true;
- break;
- default:
- break;
- }
- }
+ unlock();
+ return result;
+}
+
+bool AUD_OpenALDevice::setVolumeMinimum(AUD_Handle* handle, float volume)
+{
+ lock();
+ bool result = isValid(handle);
+
+ if(result)
+ alSourcef(((AUD_OpenALHandle*)handle)->source, AL_MIN_GAIN,
+ volume);
unlock();
return result;
}
-float AUD_OpenALDevice::getSourceSetting(AUD_Handle* handle,
- AUD_3DSourceSetting setting)
+float AUD_OpenALDevice::getDistanceMaximum(AUD_Handle* handle)
{
float result = std::numeric_limits<float>::quiet_NaN();;
lock();
if(isValid(handle))
- {
- int source = ((AUD_OpenALHandle*)handle)->source;
+ alGetSourcef(((AUD_OpenALHandle*)handle)->source, AL_MAX_DISTANCE,
+ &result);
- switch(setting)
- {
- case AUD_3DSS_CONE_INNER_ANGLE:
- alGetSourcef(source, AL_CONE_INNER_ANGLE, &result);
- break;
- case AUD_3DSS_CONE_OUTER_ANGLE:
- alGetSourcef(source, AL_CONE_OUTER_ANGLE, &result);
- break;
- case AUD_3DSS_CONE_OUTER_GAIN:
- alGetSourcef(source, AL_CONE_OUTER_GAIN, &result);
- break;
- case AUD_3DSS_IS_RELATIVE:
- {
- ALint i;
- alGetSourcei(source, AL_SOURCE_RELATIVE, &i);
- result = i ? 1.0f : 0.0f;
- break;
- }
- case AUD_3DSS_MAX_DISTANCE:
- alGetSourcef(source, AL_MAX_DISTANCE, &result);
- break;
- case AUD_3DSS_MAX_GAIN:
- alGetSourcef(source, AL_MAX_GAIN, &result);
- break;
- case AUD_3DSS_MIN_GAIN:
- alGetSourcef(source, AL_MIN_GAIN, &result);
- break;
- case AUD_3DSS_REFERENCE_DISTANCE:
- alGetSourcef(source, AL_REFERENCE_DISTANCE, &result);
- break;
- case AUD_3DSS_ROLLOFF_FACTOR:
- alGetSourcef(source, AL_ROLLOFF_FACTOR, &result);
- break;
- default:
- break;
- }
- }
+ unlock();
+ return result;
+}
+
+bool AUD_OpenALDevice::setDistanceMaximum(AUD_Handle* handle, float distance)
+{
+ lock();
+ bool result = isValid(handle);
+
+ if(result)
+ alSourcef(((AUD_OpenALHandle*)handle)->source, AL_MAX_DISTANCE,
+ distance);
+
+ unlock();
+ return result;
+}
+
+float AUD_OpenALDevice::getDistanceReference(AUD_Handle* handle)
+{
+ float result = std::numeric_limits<float>::quiet_NaN();;
+
+ lock();
+
+ if(isValid(handle))
+ alGetSourcef(((AUD_OpenALHandle*)handle)->source, AL_REFERENCE_DISTANCE,
+ &result);
+
+ unlock();
+ return result;
+}
+
+bool AUD_OpenALDevice::setDistanceReference(AUD_Handle* handle, float distance)
+{
+ lock();
+ bool result = isValid(handle);
+
+ if(result)
+ alSourcef(((AUD_OpenALHandle*)handle)->source, AL_REFERENCE_DISTANCE,
+ distance);
+
+ unlock();
+ return result;
+}
+
+float AUD_OpenALDevice::getAttenuation(AUD_Handle* handle)
+{
+ float result = std::numeric_limits<float>::quiet_NaN();;
+
+ lock();
+
+ if(isValid(handle))
+ alGetSourcef(((AUD_OpenALHandle*)handle)->source, AL_ROLLOFF_FACTOR,
+ &result);
+
+ unlock();
+ return result;
+}
+
+bool AUD_OpenALDevice::setAttenuation(AUD_Handle* handle, float factor)
+{
+ lock();
+ bool result = isValid(handle);
+
+ if(result)
+ alSourcef(((AUD_OpenALHandle*)handle)->source, AL_ROLLOFF_FACTOR,
+ factor);
+
+ unlock();
+ return result;
+}
+
+float AUD_OpenALDevice::getConeAngleOuter(AUD_Handle* handle)
+{
+ float result = std::numeric_limits<float>::quiet_NaN();;
+
+ lock();
+
+ if(isValid(handle))
+ alGetSourcef(((AUD_OpenALHandle*)handle)->source, AL_CONE_OUTER_ANGLE,
+ &result);
+
+ unlock();
+ return result;
+}
+
+bool AUD_OpenALDevice::setConeAngleOuter(AUD_Handle* handle, float angle)
+{
+ lock();
+ bool result = isValid(handle);
+
+ if(result)
+ alSourcef(((AUD_OpenALHandle*)handle)->source, AL_CONE_OUTER_ANGLE,
+ angle);
+
+ unlock();
+ return result;
+}
+
+float AUD_OpenALDevice::getConeAngleInner(AUD_Handle* handle)
+{
+ float result = std::numeric_limits<float>::quiet_NaN();;
+
+ lock();
+
+ if(isValid(handle))
+ alGetSourcef(((AUD_OpenALHandle*)handle)->source, AL_CONE_INNER_ANGLE,
+ &result);
+
+ unlock();
+ return result;
+}
+
+bool AUD_OpenALDevice::setConeAngleInner(AUD_Handle* handle, float angle)
+{
+ lock();
+ bool result = isValid(handle);
+
+ if(result)
+ alSourcef(((AUD_OpenALHandle*)handle)->source, AL_CONE_INNER_ANGLE,
+ angle);
+
+ unlock();
+ return result;
+}
+
+float AUD_OpenALDevice::getConeVolumeOuter(AUD_Handle* handle)
+{
+ float result = std::numeric_limits<float>::quiet_NaN();;
+
+ lock();
+
+ if(isValid(handle))
+ alGetSourcef(((AUD_OpenALHandle*)handle)->source, AL_CONE_OUTER_GAIN,
+ &result);
+
+ unlock();
+ return result;
+}
+
+bool AUD_OpenALDevice::setConeVolumeOuter(AUD_Handle* handle, float volume)
+{
+ lock();
+ bool result = isValid(handle);
+
+ if(result)
+ alSourcef(((AUD_OpenALHandle*)handle)->source, AL_CONE_OUTER_GAIN,
+ volume);
unlock();
return result;
diff --git a/intern/audaspace/OpenAL/AUD_OpenALDevice.h b/intern/audaspace/OpenAL/AUD_OpenALDevice.h
index cb8c83ab810..985954fc20b 100644
--- a/intern/audaspace/OpenAL/AUD_OpenALDevice.h
+++ b/intern/audaspace/OpenAL/AUD_OpenALDevice.h
@@ -30,7 +30,6 @@
#include "AUD_I3DDevice.h"
struct AUD_OpenALHandle;
struct AUD_OpenALBufferedFactory;
-class AUD_ConverterFactory;
#include <AL/al.h>
#include <AL/alc.h>
@@ -64,11 +63,6 @@ private:
bool m_useMC;
/**
- * The converter factory for readers with wrong input format.
- */
- AUD_ConverterFactory* m_converter;
-
- /**
* The list of sounds that are currently playing.
*/
std::list<AUD_OpenALHandle*>* m_playingSounds;
@@ -123,6 +117,10 @@ private:
*/
bool getFormat(ALenum &format, AUD_Specs specs);
+ // hide copy constructor and operator=
+ AUD_OpenALDevice(const AUD_OpenALDevice&);
+ AUD_OpenALDevice& operator=(const AUD_OpenALDevice&);
+
public:
/**
* Opens the OpenAL audio device for playback.
@@ -142,31 +140,64 @@ public:
virtual ~AUD_OpenALDevice();
- virtual AUD_DeviceSpecs getSpecs();
+ virtual AUD_DeviceSpecs getSpecs() const;
virtual AUD_Handle* play(AUD_IFactory* factory, bool keep = false);
virtual bool pause(AUD_Handle* handle);
virtual bool resume(AUD_Handle* handle);
virtual bool stop(AUD_Handle* handle);
+ virtual bool getKeep(AUD_Handle* handle);
virtual bool setKeep(AUD_Handle* handle, bool keep);
- virtual bool sendMessage(AUD_Handle* handle, AUD_Message &message);
virtual bool seek(AUD_Handle* handle, float position);
virtual float getPosition(AUD_Handle* handle);
virtual AUD_Status getStatus(AUD_Handle* handle);
virtual void lock();
virtual void unlock();
- virtual bool checkCapability(int capability);
- virtual bool setCapability(int capability, void *value);
- virtual bool getCapability(int capability, void *value);
-
- virtual AUD_Handle* play3D(AUD_IFactory* factory, bool keep = false);
- virtual bool updateListener(AUD_3DData &data);
- virtual bool setSetting(AUD_3DSetting setting, float value);
- virtual float getSetting(AUD_3DSetting setting);
- virtual bool updateSource(AUD_Handle* handle, AUD_3DData &data);
- virtual bool setSourceSetting(AUD_Handle* handle,
- AUD_3DSourceSetting setting, float value);
- virtual float getSourceSetting(AUD_Handle* handle,
- AUD_3DSourceSetting setting);
+ virtual float getVolume() const;
+ virtual void setVolume(float volume);
+ virtual float getVolume(AUD_Handle* handle);
+ virtual bool setVolume(AUD_Handle* handle, float volume);
+ virtual float getPitch(AUD_Handle* handle);
+ virtual bool setPitch(AUD_Handle* handle, float pitch);
+ virtual int getLoopCount(AUD_Handle* handle);
+ virtual bool setLoopCount(AUD_Handle* handle, int count);
+ virtual bool setStopCallback(AUD_Handle* handle, stopCallback callback = NULL, void* data = NULL);
+
+ virtual AUD_Vector3 getListenerLocation() const;
+ virtual void setListenerLocation(const AUD_Vector3& location);
+ virtual AUD_Vector3 getListenerVelocity() const;
+ virtual void setListenerVelocity(const AUD_Vector3& velocity);
+ virtual AUD_Quaternion getListenerOrientation() const;
+ virtual void setListenerOrientation(const AUD_Quaternion& orientation);
+ virtual float getSpeedOfSound() const;
+ virtual void setSpeedOfSound(float speed);
+ virtual float getDopplerFactor() const;
+ virtual void setDopplerFactor(float factor);
+ virtual AUD_DistanceModel getDistanceModel() const;
+ virtual void setDistanceModel(AUD_DistanceModel model);
+ virtual AUD_Vector3 getSourceLocation(AUD_Handle* handle);
+ virtual bool setSourceLocation(AUD_Handle* handle, const AUD_Vector3& location);
+ virtual AUD_Vector3 getSourceVelocity(AUD_Handle* handle);
+ virtual bool setSourceVelocity(AUD_Handle* handle, const AUD_Vector3& velocity);
+ virtual AUD_Quaternion getSourceOrientation(AUD_Handle* handle);
+ virtual bool setSourceOrientation(AUD_Handle* handle, const AUD_Quaternion& orientation);
+ virtual bool isRelative(AUD_Handle* handle);
+ virtual bool setRelative(AUD_Handle* handle, bool relative);
+ virtual float getVolumeMaximum(AUD_Handle* handle);
+ virtual bool setVolumeMaximum(AUD_Handle* handle, float volume);
+ virtual float getVolumeMinimum(AUD_Handle* handle);
+ virtual bool setVolumeMinimum(AUD_Handle* handle, float volume);
+ virtual float getDistanceMaximum(AUD_Handle* handle);
+ virtual bool setDistanceMaximum(AUD_Handle* handle, float distance);
+ virtual float getDistanceReference(AUD_Handle* handle);
+ virtual bool setDistanceReference(AUD_Handle* handle, float distance);
+ virtual float getAttenuation(AUD_Handle* handle);
+ virtual bool setAttenuation(AUD_Handle* handle, float factor);
+ virtual float getConeAngleOuter(AUD_Handle* handle);
+ virtual bool setConeAngleOuter(AUD_Handle* handle, float angle);
+ virtual float getConeAngleInner(AUD_Handle* handle);
+ virtual bool setConeAngleInner(AUD_Handle* handle, float angle);
+ virtual float getConeVolumeOuter(AUD_Handle* handle);
+ virtual bool setConeVolumeOuter(AUD_Handle* handle, float volume);
};
#endif //AUD_OPENALDEVICE
diff --git a/intern/audaspace/Python/AUD_PyAPI.cpp b/intern/audaspace/Python/AUD_PyAPI.cpp
new file mode 100644
index 00000000000..b0c55d5856e
--- /dev/null
+++ b/intern/audaspace/Python/AUD_PyAPI.cpp
@@ -0,0 +1,2973 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN LGPL LICENSE BLOCK *****
+ *
+ * Copyright 2009 Jörg Hermann Müller
+ *
+ * This file is part of AudaSpace.
+ *
+ * AudaSpace is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AudaSpace is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * ***** END LGPL LICENSE BLOCK *****
+ */
+
+#include "AUD_PyAPI.h"
+#include "structmember.h"
+
+#include "AUD_I3DDevice.h"
+#include "AUD_NULLDevice.h"
+#include "AUD_DelayFactory.h"
+#include "AUD_DoubleFactory.h"
+#include "AUD_FaderFactory.h"
+#include "AUD_HighpassFactory.h"
+#include "AUD_LimiterFactory.h"
+#include "AUD_LoopFactory.h"
+#include "AUD_LowpassFactory.h"
+#include "AUD_PingPongFactory.h"
+#include "AUD_PitchFactory.h"
+#include "AUD_ReverseFactory.h"
+#include "AUD_SinusFactory.h"
+#include "AUD_FileFactory.h"
+#include "AUD_SquareFactory.h"
+#include "AUD_StreamBufferFactory.h"
+#include "AUD_SuperposeFactory.h"
+#include "AUD_VolumeFactory.h"
+#include "AUD_IIRFilterFactory.h"
+
+#ifdef WITH_SDL
+#include "AUD_SDLDevice.h"
+#endif
+
+#ifdef WITH_OPENAL
+#include "AUD_OpenALDevice.h"
+#endif
+
+#ifdef WITH_JACK
+#include "AUD_JackDevice.h"
+#endif
+
+// ====================================================================
+
+typedef enum
+{
+ AUD_DEVICE_NULL = 0,
+ AUD_DEVICE_OPENAL,
+ AUD_DEVICE_SDL,
+ AUD_DEVICE_JACK,
+ AUD_DEVICE_READ,
+} AUD_DeviceTypes;
+
+// ====================================================================
+
+#define PY_MODULE_ADD_CONSTANT(module, name) PyModule_AddIntConstant(module, #name, name)
+
+// ====================================================================
+
+static PyObject* AUDError;
+
+static const char* device_not_3d_error = "Device is not a 3D device!";
+
+// ====================================================================
+
+static void
+Factory_dealloc(Factory* self)
+{
+ if(self->factory)
+ delete self->factory;
+ Py_XDECREF(self->child_list);
+ Py_TYPE(self)->tp_free((PyObject*)self);
+}
+
+static PyObject *
+Factory_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ Factory *self;
+
+ self = (Factory*)type->tp_alloc(type, 0);
+ if(self != NULL)
+ {
+ static const char *kwlist[] = {"filename", NULL};
+ const char* filename = NULL;
+
+ if(!PyArg_ParseTupleAndKeywords(args, kwds, "s:Factory", const_cast<char**>(kwlist), &filename))
+ {
+ Py_DECREF(self);
+ return NULL;
+ }
+
+ try
+ {
+ self->factory = new AUD_FileFactory(filename);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(self);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)self;
+}
+
+PyDoc_STRVAR(M_aud_Factory_sine_doc,
+ "sine(frequency, rate=44100)\n\n"
+ "Creates a sine factory which plays a sine wave.\n\n"
+ ":arg frequency: The frequency of the sine wave in Hz.\n"
+ ":type frequency: float\n"
+ ":arg rate: The sampling rate in Hz. It's recommended to set this "
+ "value to the playback device's samling rate to avoid resamping.\n"
+ ":type rate: int\n"
+ ":return: The created :class:`Factory` object.\n"
+ ":rtype: :class:`Factory`");
+
+static PyObject *
+Factory_sine(PyTypeObject* type, PyObject* args)
+{
+ float frequency;
+ int rate = 44100;
+
+ if(!PyArg_ParseTuple(args, "f|i:sine", &frequency, &rate))
+ return NULL;
+
+ Factory *self;
+
+ self = (Factory*)type->tp_alloc(type, 0);
+ if(self != NULL)
+ {
+ try
+ {
+ self->factory = new AUD_SinusFactory(frequency, (AUD_SampleRate)rate);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(self);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)self;
+}
+
+PyDoc_STRVAR(M_aud_Factory_file_doc,
+ "file(filename)\n\n"
+ "Creates a factory object of a sound file.\n\n"
+ ":arg filename: Path of the file.\n"
+ ":type filename: string\n"
+ ":return: The created :class:`Factory` object.\n"
+ ":rtype: :class:`Factory`\n\n"
+ ".. warning:: If the file doesn't exist or can't be read you will "
+ "not get an exception immediately, but when you try to start "
+ "playback of that factory.");
+
+static PyObject *
+Factory_file(PyTypeObject* type, PyObject* args)
+{
+ const char* filename = NULL;
+
+ if(!PyArg_ParseTuple(args, "s:file", &filename))
+ return NULL;
+
+ Factory *self;
+
+ self = (Factory*)type->tp_alloc(type, 0);
+ if(self != NULL)
+ {
+ try
+ {
+ self->factory = new AUD_FileFactory(filename);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(self);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)self;
+}
+
+PyDoc_STRVAR(M_aud_Factory_lowpass_doc,
+ "lowpass(frequency, Q=0.5)\n\n"
+ "Creates a second order lowpass filter based on the transfer "
+ "function H(s) = 1 / (s^2 + s/Q + 1)\n\n"
+ ":arg frequency: The cut off trequency of the lowpass.\n"
+ ":type frequency: float\n"
+ ":arg Q: Q factor of the lowpass.\n"
+ ":type Q: float\n"
+ ":return: The created :class:`Factory` object.\n"
+ ":rtype: :class:`Factory`");
+
+static PyObject *
+Factory_lowpass(Factory* self, PyObject* args)
+{
+ float frequency;
+ float Q = 0.5;
+
+ if(!PyArg_ParseTuple(args, "f|f:lowpass", &frequency, &Q))
+ return NULL;
+
+ PyTypeObject* type = ((PyObject*)self)->ob_type;
+ Factory *parent = (Factory*)type->tp_alloc(type, 0);
+
+ if(parent != NULL)
+ {
+ Py_INCREF(self);
+ parent->child_list = (PyObject*)self;
+
+ try
+ {
+ parent->factory = new AUD_LowpassFactory(self->factory, frequency, Q);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(parent);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)parent;
+}
+
+PyDoc_STRVAR(M_aud_Factory_delay_doc,
+ "delay(time)\n\n"
+ "Delays by playing adding silence in front of the other factory's "
+ "data.\n\n"
+ ":arg time: How many seconds of silence should be added before "
+ "the factory.\n"
+ ":type time: float\n"
+ ":return: The created :class:`Factory` object.\n"
+ ":rtype: :class:`Factory`");
+
+static PyObject *
+Factory_delay(Factory* self, PyObject* args)
+{
+ float delay;
+
+ if(!PyArg_ParseTuple(args, "f:delay", &delay))
+ return NULL;
+
+ PyTypeObject* type = ((PyObject*)self)->ob_type;
+ Factory *parent = (Factory*)type->tp_alloc(type, 0);
+
+ if(parent != NULL)
+ {
+ Py_INCREF(self);
+ parent->child_list = (PyObject*)self;
+
+ try
+ {
+ parent->factory = new AUD_DelayFactory(self->factory, delay);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(parent);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)parent;
+}
+
+PyDoc_STRVAR(M_aud_Factory_join_doc,
+ "join(factory)\n\n"
+ "Plays two factories in sequence.\n\n"
+ ":arg factory: The factory to play second.\n"
+ ":type factory: :class:`Factory`\n"
+ ":return: The created :class:`Factory` object.\n"
+ ":rtype: :class:`Factory`\n\n"
+ ".. note:: The two factories have to have the same specifications "
+ "(channels and samplerate).");
+
+static PyObject *
+Factory_join(Factory* self, PyObject* object)
+{
+ PyTypeObject* type = ((PyObject*)self)->ob_type;
+
+ if(!PyObject_TypeCheck(object, type))
+ {
+ PyErr_SetString(PyExc_TypeError, "Object has to be of type Factory!");
+ return NULL;
+ }
+
+ Factory *parent;
+ Factory *child = (Factory*)object;
+
+ parent = (Factory*)type->tp_alloc(type, 0);
+ if(parent != NULL)
+ {
+ parent->child_list = Py_BuildValue("(OO)", self, object);
+
+ try
+ {
+ parent->factory = new AUD_DoubleFactory(self->factory, child->factory);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(parent);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)parent;
+}
+
+PyDoc_STRVAR(M_aud_Factory_highpass_doc,
+ "highpass(frequency, Q=0.5)\n\n"
+ "Creates a second order highpass filter based on the transfer "
+ "function H(s) = s^2 / (s^2 + s/Q + 1)\n\n"
+ ":arg frequency: The cut off trequency of the highpass.\n"
+ ":type frequency: float\n"
+ ":arg Q: Q factor of the lowpass.\n"
+ ":type Q: float\n"
+ ":return: The created :class:`Factory` object.\n"
+ ":rtype: :class:`Factory`");
+
+static PyObject *
+Factory_highpass(Factory* self, PyObject* args)
+{
+ float frequency;
+ float Q = 0.5;
+
+ if(!PyArg_ParseTuple(args, "f|f:highpass", &frequency, &Q))
+ return NULL;
+
+ PyTypeObject* type = ((PyObject*)self)->ob_type;
+ Factory *parent = (Factory*)type->tp_alloc(type, 0);
+
+ if(parent != NULL)
+ {
+ Py_INCREF(self);
+ parent->child_list = (PyObject*)self;
+
+ try
+ {
+ parent->factory = new AUD_HighpassFactory(self->factory, frequency, Q);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(parent);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)parent;
+}
+
+PyDoc_STRVAR(M_aud_Factory_limit_doc,
+ "limit(start, end)\n\n"
+ "Limits a factory within a specific start and end time.\n\n"
+ ":arg start: Start time in seconds.\n"
+ ":type start: float\n"
+ ":arg end: End time in seconds.\n"
+ ":type end: float\n"
+ ":return: The created :class:`Factory` object.\n"
+ ":rtype: :class:`Factory`");
+
+static PyObject *
+Factory_limit(Factory* self, PyObject* args)
+{
+ float start, end;
+
+ if(!PyArg_ParseTuple(args, "ff:limit", &start, &end))
+ return NULL;
+
+ PyTypeObject* type = ((PyObject*)self)->ob_type;
+ Factory *parent = (Factory*)type->tp_alloc(type, 0);
+
+ if(parent != NULL)
+ {
+ Py_INCREF(self);
+ parent->child_list = (PyObject*)self;
+
+ try
+ {
+ parent->factory = new AUD_LimiterFactory(self->factory, start, end);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(parent);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)parent;
+}
+
+PyDoc_STRVAR(M_aud_Factory_pitch_doc,
+ "pitch(factor)\n\n"
+ "Changes the pitch of a factory with a specific factor.\n\n"
+ ":arg factor: The factor to change the pitch with.\n"
+ ":type factor: float\n"
+ ":return: The created :class:`Factory` object.\n"
+ ":rtype: :class:`Factory`\n\n"
+ ".. note:: This is done by changing the sample rate of the "
+ "underlying factory, which has to be an integer, so the factor "
+ "value rounded and the factor may not be 100 % accurate.\n\n"
+ ".. note:: This is a filter function, you might consider using "
+ ":attr:`Handle.pitch` instead.");
+
+static PyObject *
+Factory_pitch(Factory* self, PyObject* args)
+{
+ float factor;
+
+ if(!PyArg_ParseTuple(args, "f:pitch", &factor))
+ return NULL;
+
+ PyTypeObject* type = ((PyObject*)self)->ob_type;
+ Factory *parent = (Factory*)type->tp_alloc(type, 0);
+
+ if(parent != NULL)
+ {
+ Py_INCREF(self);
+ parent->child_list = (PyObject*)self;
+
+ try
+ {
+ parent->factory = new AUD_PitchFactory(self->factory, factor);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(parent);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)parent;
+}
+
+PyDoc_STRVAR(M_aud_Factory_volume_doc,
+ "volume(volume)\n\n"
+ "Changes the volume of a factory.\n\n"
+ ":arg volume: The new volume..\n"
+ ":type volume: float\n"
+ ":return: The created :class:`Factory` object.\n"
+ ":rtype: :class:`Factory`\n\n"
+ ".. note:: Should be in the range [0, 1] to avoid clipping.\n\n"
+ ".. note:: This is a filter function, you might consider using "
+ ":attr:`Handle.volume` instead.");
+
+static PyObject *
+Factory_volume(Factory* self, PyObject* args)
+{
+ float volume;
+
+ if(!PyArg_ParseTuple(args, "f:volume", &volume))
+ return NULL;
+
+ PyTypeObject* type = ((PyObject*)self)->ob_type;
+ Factory *parent = (Factory*)type->tp_alloc(type, 0);
+
+ if(parent != NULL)
+ {
+ Py_INCREF(self);
+ parent->child_list = (PyObject*)self;
+
+ try
+ {
+ parent->factory = new AUD_VolumeFactory(self->factory, volume);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(parent);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)parent;
+}
+
+PyDoc_STRVAR(M_aud_Factory_fadein_doc,
+ "fadein(start, length)\n\n"
+ "Fades a factory in by raising the volume linearly in the given "
+ "time interval.\n\n"
+ ":arg start: Time in seconds when the fading should start.\n"
+ ":type start: float\n"
+ ":arg length: Time in seconds how long the fading should last.\n"
+ ":type length: float\n"
+ ":return: The created :class:`Factory` object.\n"
+ ":rtype: :class:`Factory`\n\n"
+ ".. note:: Before the fade starts it plays silence.");
+
+static PyObject *
+Factory_fadein(Factory* self, PyObject* args)
+{
+ float start, length;
+
+ if(!PyArg_ParseTuple(args, "ff:fadein", &start, &length))
+ return NULL;
+
+ PyTypeObject* type = ((PyObject*)self)->ob_type;
+ Factory *parent = (Factory*)type->tp_alloc(type, 0);
+
+ if(parent != NULL)
+ {
+ Py_INCREF(self);
+ parent->child_list = (PyObject*)self;
+
+ try
+ {
+ parent->factory = new AUD_FaderFactory(self->factory, AUD_FADE_IN, start, length);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(parent);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)parent;
+}
+
+PyDoc_STRVAR(M_aud_Factory_fadeout_doc,
+ "fadeout(start, length)\n\n"
+ "Fades a factory in by lowering the volume linearly in the given "
+ "time interval.\n\n"
+ ":arg start: Time in seconds when the fading should start.\n"
+ ":type start: float\n"
+ ":arg length: Time in seconds how long the fading should last.\n"
+ ":type length: float\n"
+ ":return: The created :class:`Factory` object.\n"
+ ":rtype: :class:`Factory`\n\n"
+ ".. note:: After the fade this factory plays silence, so that "
+ "the length of the factory is not altered.");
+
+static PyObject *
+Factory_fadeout(Factory* self, PyObject* args)
+{
+ float start, length;
+
+ if(!PyArg_ParseTuple(args, "ff:fadeout", &start, &length))
+ return NULL;
+
+ PyTypeObject* type = ((PyObject*)self)->ob_type;
+ Factory *parent = (Factory*)type->tp_alloc(type, 0);
+
+ if(parent != NULL)
+ {
+ Py_INCREF(self);
+ parent->child_list = (PyObject*)self;
+
+ try
+ {
+ parent->factory = new AUD_FaderFactory(self->factory, AUD_FADE_OUT, start, length);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(parent);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)parent;
+}
+
+PyDoc_STRVAR(M_aud_Factory_loop_doc,
+ "loop(count)\n\n"
+ "Loops a factory.\n\n"
+ ":arg count: How often the factory should be looped. "
+ "Negative values mean endlessly.\n"
+ ":type count: integer\n"
+ ":return: The created :class:`Factory` object.\n"
+ ":rtype: :class:`Factory`\n\n"
+ ".. note:: This is a filter function, you might consider using "
+ ":attr:`Handle.loop_count` instead.");
+
+static PyObject *
+Factory_loop(Factory* self, PyObject* args)
+{
+ int loop;
+
+ if(!PyArg_ParseTuple(args, "i:loop", &loop))
+ return NULL;
+
+ PyTypeObject* type = ((PyObject*)self)->ob_type;
+ Factory *parent = (Factory*)type->tp_alloc(type, 0);
+
+ if(parent != NULL)
+ {
+ Py_INCREF(self);
+ parent->child_list = (PyObject*)self;
+
+ try
+ {
+ parent->factory = new AUD_LoopFactory(self->factory, loop);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(parent);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)parent;
+}
+
+PyDoc_STRVAR(M_aud_Factory_mix_doc,
+ "mix(factory)\n\n"
+ "Mixes two factories.\n\n"
+ ":arg factory: The factory to mix over the other.\n"
+ ":type factory: :class:`Factory`\n"
+ ":return: The created :class:`Factory` object.\n"
+ ":rtype: :class:`Factory`\n\n"
+ ".. note:: The two factories have to have the same specifications "
+ "(channels and samplerate).");
+
+static PyObject *
+Factory_mix(Factory* self, PyObject* object)
+{
+ PyTypeObject* type = ((PyObject*)self)->ob_type;
+
+ if(!PyObject_TypeCheck(object, type))
+ {
+ PyErr_SetString(PyExc_TypeError, "Object is not of type Factory!");
+ return NULL;
+ }
+
+ Factory *parent = (Factory*)type->tp_alloc(type, 0);
+ Factory *child = (Factory*)object;
+
+ if(parent != NULL)
+ {
+ parent->child_list = Py_BuildValue("(OO)", self, object);
+
+ try
+ {
+ parent->factory = new AUD_SuperposeFactory(self->factory, child->factory);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(parent);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)parent;
+}
+
+PyDoc_STRVAR(M_aud_Factory_pingpong_doc,
+ "pingpong()\n\n"
+ "Plays a factory forward and then backward.\n"
+ "This is like joining a factory with its reverse.\n\n"
+ ":return: The created :class:`Factory` object.\n"
+ ":rtype: :class:`Factory`");
+
+static PyObject *
+Factory_pingpong(Factory* self)
+{
+ PyTypeObject* type = ((PyObject*)self)->ob_type;
+ Factory *parent = (Factory*)type->tp_alloc(type, 0);
+
+ if(parent != NULL)
+ {
+ Py_INCREF(self);
+ parent->child_list = (PyObject*)self;
+
+ try
+ {
+ parent->factory = new AUD_PingPongFactory(self->factory);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(parent);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)parent;
+}
+
+PyDoc_STRVAR(M_aud_Factory_reverse_doc,
+ "reverse()\n\n"
+ "Plays a factory reversed.\n\n"
+ ":return: The created :class:`Factory` object.\n"
+ ":rtype: :class:`Factory`\n\n"
+ ".. note:: The factory has to have a finite length and has to be "
+ "seekable. It's recommended to use this only with factories with "
+ "fast and accurate seeking, which is not true for encoded audio "
+ "files, such ones should be buffered using :meth:`buffer` before "
+ "being played reversed.\n\n"
+ ".. warning:: If seeking is not accurate in the underlying factory "
+ "you'll likely hear skips/jumps/cracks.");
+
+static PyObject *
+Factory_reverse(Factory* self)
+{
+ PyTypeObject* type = ((PyObject*)self)->ob_type;
+ Factory *parent = (Factory*)type->tp_alloc(type, 0);
+
+ if(parent != NULL)
+ {
+ Py_INCREF(self);
+ parent->child_list = (PyObject*)self;
+
+ try
+ {
+ parent->factory = new AUD_ReverseFactory(self->factory);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(parent);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)parent;
+}
+
+PyDoc_STRVAR(M_aud_Factory_buffer_doc,
+ "buffer()\n\n"
+ "Buffers a factory into RAM.\n"
+ "This saves CPU usage needed for decoding and file access if the "
+ "underlying factory reads from a file on the harddisk, but it "
+ "consumes a lot of memory.\n\n"
+ ":return: The created :class:`Factory` object.\n"
+ ":rtype: :class:`Factory`\n\n"
+ ".. note:: Only known-length factories can be buffered.\n\n"
+ ".. warning:: Raw PCM data needs a lot of space, only buffer "
+ "short factories.");
+
+static PyObject *
+Factory_buffer(Factory* self)
+{
+ PyTypeObject* type = ((PyObject*)self)->ob_type;
+ Factory *parent = (Factory*)type->tp_alloc(type, 0);
+
+ if(parent != NULL)
+ {
+ try
+ {
+ parent->factory = new AUD_StreamBufferFactory(self->factory);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(parent);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)parent;
+}
+
+PyDoc_STRVAR(M_aud_Factory_square_doc,
+ "square(threshold = 0)\n\n"
+ "Makes a square wave out of an audio wave by setting all samples "
+ "with a amplitude >= threshold to 1, all <= -threshold to -1 and "
+ "all between to 0.\n\n"
+ ":arg threshold: Threshold value over which an amplitude counts "
+ "non-zero.\n"
+ ":type threshold: float\n"
+ ":return: The created :class:`Factory` object.\n"
+ ":rtype: :class:`Factory`");
+
+static PyObject *
+Factory_square(Factory* self, PyObject* args)
+{
+ float threshold = 0;
+
+ if(!PyArg_ParseTuple(args, "|f:square", &threshold))
+ return NULL;
+
+ PyTypeObject* type = ((PyObject*)self)->ob_type;
+ Factory *parent = (Factory*)type->tp_alloc(type, 0);
+
+ if(parent != NULL)
+ {
+ Py_INCREF(self);
+ parent->child_list = (PyObject*)self;
+
+ try
+ {
+ parent->factory = new AUD_SquareFactory(self->factory, threshold);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(parent);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)parent;
+}
+
+PyDoc_STRVAR(M_aud_Factory_filter_doc,
+ "filter(b, a = (1))\n\n"
+ "Filters a factory with the supplied IIR filter coefficients.\n"
+ "Without the second parameter you'll get a FIR filter.\n"
+ "If the first value of the a sequence is 0 it will be set to 1 "
+ "automatically.\n"
+ "If the first value of the a sequence is neither 0 nor 1, all "
+ "filter coefficients will be scaled by this value so that it is 1 "
+ "in the end, you don't have to scale yourself.\n\n"
+ ":arg b: The nominator filter coefficients.\n"
+ ":type b: sequence of float\n"
+ ":arg a: The denominator filter coefficients.\n"
+ ":type a: sequence of float\n"
+ ":return: The created :class:`Factory` object.\n"
+ ":rtype: :class:`Factory`");
+
+static PyObject *
+Factory_filter(Factory* self, PyObject* args)
+{
+ PyObject* py_b;
+ PyObject* py_a = NULL;
+
+ if(!PyArg_ParseTuple(args, "O|O:filter", &py_b, &py_a))
+ return NULL;
+
+ if(!PySequence_Check(py_b) || (py_a != NULL && !PySequence_Check(py_a)))
+ {
+ PyErr_SetString(PyExc_TypeError, "Parameter is not a sequence!");
+ return NULL;
+ }
+
+ if(!PySequence_Length(py_b) || (py_a != NULL && !PySequence_Length(py_a)))
+ {
+ PyErr_SetString(PyExc_ValueError, "The sequence has to contain at least one value!");
+ return NULL;
+ }
+
+ std::vector<float> a, b;
+ PyObject* py_value;
+ float value;
+ int result;
+
+ for(int i = 0; i < PySequence_Length(py_b); i++)
+ {
+ py_value = PySequence_GetItem(py_b, i);
+ result = PyArg_Parse(py_value, "f:filter", &value);
+ Py_DECREF(py_value);
+
+ if(!result)
+ return NULL;
+
+ b.push_back(value);
+ }
+
+ if(py_a)
+ {
+ for(int i = 0; i < PySequence_Length(py_a); i++)
+ {
+ py_value = PySequence_GetItem(py_a, i);
+ result = PyArg_Parse(py_value, "f:filter", &value);
+ Py_DECREF(py_value);
+
+ if(!result)
+ return NULL;
+
+ a.push_back(value);
+ }
+
+ if(a[0] == 0)
+ a[0] = 1;
+ }
+ else
+ a.push_back(1);
+
+ PyTypeObject* type = ((PyObject*)self)->ob_type;
+ Factory *parent = (Factory*)type->tp_alloc(type, 0);
+
+ if(parent != NULL)
+ {
+ Py_INCREF(self);
+ parent->child_list = (PyObject*)self;
+
+ try
+ {
+ parent->factory = new AUD_IIRFilterFactory(self->factory, b, a);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(parent);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)parent;
+}
+
+static PyMethodDef Factory_methods[] = {
+ {"sine", (PyCFunction)Factory_sine, METH_VARARGS | METH_CLASS,
+ M_aud_Factory_sine_doc
+ },
+ {"file", (PyCFunction)Factory_file, METH_VARARGS | METH_CLASS,
+ M_aud_Factory_file_doc
+ },
+ {"lowpass", (PyCFunction)Factory_lowpass, METH_VARARGS,
+ M_aud_Factory_lowpass_doc
+ },
+ {"delay", (PyCFunction)Factory_delay, METH_VARARGS,
+ M_aud_Factory_delay_doc
+ },
+ {"join", (PyCFunction)Factory_join, METH_O,
+ M_aud_Factory_join_doc
+ },
+ {"highpass", (PyCFunction)Factory_highpass, METH_VARARGS,
+ M_aud_Factory_highpass_doc
+ },
+ {"limit", (PyCFunction)Factory_limit, METH_VARARGS,
+ M_aud_Factory_limit_doc
+ },
+ {"pitch", (PyCFunction)Factory_pitch, METH_VARARGS,
+ M_aud_Factory_pitch_doc
+ },
+ {"volume", (PyCFunction)Factory_volume, METH_VARARGS,
+ M_aud_Factory_volume_doc
+ },
+ {"fadein", (PyCFunction)Factory_fadein, METH_VARARGS,
+ M_aud_Factory_fadein_doc
+ },
+ {"fadeout", (PyCFunction)Factory_fadeout, METH_VARARGS,
+ M_aud_Factory_fadeout_doc
+ },
+ {"loop", (PyCFunction)Factory_loop, METH_VARARGS,
+ M_aud_Factory_loop_doc
+ },
+ {"mix", (PyCFunction)Factory_mix, METH_O,
+ M_aud_Factory_mix_doc
+ },
+ {"pingpong", (PyCFunction)Factory_pingpong, METH_NOARGS,
+ M_aud_Factory_pingpong_doc
+ },
+ {"reverse", (PyCFunction)Factory_reverse, METH_NOARGS,
+ M_aud_Factory_reverse_doc
+ },
+ {"buffer", (PyCFunction)Factory_buffer, METH_NOARGS,
+ M_aud_Factory_buffer_doc
+ },
+ {"square", (PyCFunction)Factory_square, METH_VARARGS,
+ M_aud_Factory_square_doc
+ },
+ {"filter", (PyCFunction)Factory_filter, METH_VARARGS,
+ M_aud_Factory_filter_doc
+ },
+ {NULL} /* Sentinel */
+};
+
+PyDoc_STRVAR(M_aud_Factory_doc,
+ "Factory objects are immutable and represent a sound that can be "
+ "played simultaneously multiple times. They are called factories "
+ "because they create reader objects internally that are used for "
+ "playback.");
+
+static PyTypeObject FactoryType = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "aud.Factory", /* tp_name */
+ sizeof(Factory), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)Factory_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* 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, /* tp_flags */
+ M_aud_Factory_doc, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ Factory_methods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* 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 */
+ Factory_new, /* tp_new */
+};
+
+// ========== Handle ==================================================
+
+static void
+Handle_dealloc(Handle* self)
+{
+ Py_XDECREF(self->device);
+ Py_TYPE(self)->tp_free((PyObject*)self);
+}
+
+PyDoc_STRVAR(M_aud_Handle_pause_doc,
+ "pause()\n\n"
+ "Pauses playback.\n\n"
+ ":return: Whether the action succeeded.\n"
+ ":rtype: bool");
+
+static PyObject *
+Handle_pause(Handle *self)
+{
+ Device* device = (Device*)self->device;
+
+ try
+ {
+ if(device->device->pause(self->handle))
+ {
+ Py_RETURN_TRUE;
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+
+ Py_RETURN_FALSE;
+}
+
+PyDoc_STRVAR(M_aud_Handle_resume_doc,
+ "resume()\n\n"
+ "Resumes playback.\n\n"
+ ":return: Whether the action succeeded.\n"
+ ":rtype: bool");
+
+static PyObject *
+Handle_resume(Handle *self)
+{
+ Device* device = (Device*)self->device;
+
+ try
+ {
+ if(device->device->resume(self->handle))
+ {
+ Py_RETURN_TRUE;
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+
+ Py_RETURN_FALSE;
+}
+
+PyDoc_STRVAR(M_aud_Handle_stop_doc,
+ "stop()\n\n"
+ "Stops playback.\n\n"
+ ":return: Whether the action succeeded.\n"
+ ":rtype: bool\n\n"
+ ".. note:: This makes the handle invalid.");
+
+static PyObject *
+Handle_stop(Handle *self)
+{
+ Device* device = (Device*)self->device;
+
+ try
+ {
+ if(device->device->stop(self->handle))
+ {
+ Py_RETURN_TRUE;
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+
+ Py_RETURN_FALSE;
+}
+
+static PyMethodDef Handle_methods[] = {
+ {"pause", (PyCFunction)Handle_pause, METH_NOARGS,
+ M_aud_Handle_pause_doc
+ },
+ {"resume", (PyCFunction)Handle_resume, METH_NOARGS,
+ M_aud_Handle_resume_doc
+ },
+ {"stop", (PyCFunction)Handle_stop, METH_NOARGS,
+ M_aud_Handle_stop_doc
+ },
+ {NULL} /* Sentinel */
+};
+
+PyDoc_STRVAR(M_aud_Handle_position_doc,
+ "The playback position of the sound in seconds.");
+
+static PyObject *
+Handle_get_position(Handle *self, void* nothing)
+{
+ Device* device = (Device*)self->device;
+
+ try
+ {
+ return Py_BuildValue("f", device->device->getPosition(self->handle));
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+static int
+Handle_set_position(Handle *self, PyObject* args, void* nothing)
+{
+ float position;
+
+ if(!PyArg_Parse(args, "f:position", &position))
+ return -1;
+
+ Device* device = (Device*)self->device;
+
+ try
+ {
+ if(device->device->seek(self->handle, position))
+ return 0;
+ PyErr_SetString(AUDError, "Couldn't seek the sound!");
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Handle_keep_doc,
+ "Whether the sound should be kept paused in the device when its "
+ "end is reached.\n"
+ "This can be used to seek the sound to some position and start "
+ "playback again.\n\n"
+ ".. warning:: If this is set to true and you forget stopping this "
+ "equals a memory leak as the handle exists until the device is "
+ "destroyed.");
+
+static PyObject *
+Handle_get_keep(Handle *self, void* nothing)
+{
+ Device* device = (Device*)self->device;
+
+ try
+ {
+ if(device->device->getKeep(self->handle))
+ {
+ Py_RETURN_TRUE;
+ }
+ else
+ {
+ Py_RETURN_FALSE;
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+static int
+Handle_set_keep(Handle *self, PyObject* args, void* nothing)
+{
+ if(!PyBool_Check(args))
+ {
+ PyErr_SetString(PyExc_TypeError, "keep is not a boolean!");
+ return -1;
+ }
+
+ bool keep = args == Py_True;
+ Device* device = (Device*)self->device;
+
+ try
+ {
+ if(device->device->setKeep(self->handle, keep))
+ return 0;
+ PyErr_SetString(AUDError, "Couldn't set keep of the sound!");
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Handle_status_doc,
+ "Whether the sound is playing, paused or stopped (=invalid).");
+
+static PyObject *
+Handle_get_status(Handle *self, void* nothing)
+{
+ Device* device = (Device*)self->device;
+
+ try
+ {
+ return Py_BuildValue("i", device->device->getStatus(self->handle));
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+PyDoc_STRVAR(M_aud_Handle_volume_doc,
+ "The volume of the sound.");
+
+static PyObject *
+Handle_get_volume(Handle *self, void* nothing)
+{
+ Device* device = (Device*)self->device;
+
+ try
+ {
+ return Py_BuildValue("f", device->device->getVolume(self->handle));
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+static int
+Handle_set_volume(Handle *self, PyObject* args, void* nothing)
+{
+ float volume;
+
+ if(!PyArg_Parse(args, "f:volume", &volume))
+ return -1;
+
+ Device* device = (Device*)self->device;
+
+ try
+ {
+ if(device->device->setVolume(self->handle, volume))
+ return 0;
+ PyErr_SetString(AUDError, "Couldn't set the sound volume!");
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Handle_pitch_doc,
+ "The pitch of the sound.");
+
+static PyObject *
+Handle_get_pitch(Handle *self, void* nothing)
+{
+ Device* device = (Device*)self->device;
+
+ try
+ {
+ return Py_BuildValue("f", device->device->getPitch(self->handle));
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+static int
+Handle_set_pitch(Handle *self, PyObject* args, void* nothing)
+{
+ float pitch;
+
+ if(!PyArg_Parse(args, "f:pitch", &pitch))
+ return -1;
+
+ Device* device = (Device*)self->device;
+
+ try
+ {
+ if(device->device->setPitch(self->handle, pitch))
+ return 0;
+ PyErr_SetString(AUDError, "Couldn't set the sound pitch!");
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Handle_loop_count_doc,
+ "The (remaining) loop count of the sound. A negative value indicates infinity.");
+
+static PyObject *
+Handle_get_loop_count(Handle *self, void* nothing)
+{
+ Device* device = (Device*)self->device;
+
+ try
+ {
+ return Py_BuildValue("i", device->device->getLoopCount(self->handle));
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+static int
+Handle_set_loop_count(Handle *self, PyObject* args, void* nothing)
+{
+ int loops;
+
+ if(!PyArg_Parse(args, "i:loop_count", &loops))
+ return -1;
+
+ Device* device = (Device*)self->device;
+
+ try
+ {
+ if(device->device->setLoopCount(self->handle, loops))
+ return 0;
+ PyErr_SetString(AUDError, "Couldn't set the loop count!");
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Handle_location_doc,
+ "The source's location in 3D space, a 3D tuple of floats.");
+
+static PyObject *
+Handle_get_location(Handle *self, void* nothing)
+{
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ AUD_Vector3 v = device->getSourceLocation(self->handle);
+ return Py_BuildValue("(fff)", v.x(), v.y(), v.z());
+ }
+ else
+ {
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return NULL;
+}
+
+static int
+Handle_set_location(Handle *self, PyObject* args, void* nothing)
+{
+ float x, y, z;
+
+ if(!PyArg_Parse(args, "(fff):location", &x, &y, &z))
+ return -1;
+
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ AUD_Vector3 location(x, y, z);
+ if(device->setSourceLocation(self->handle, location))
+ return 0;
+ PyErr_SetString(AUDError, "Location couldn't be set!");
+ }
+ else
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Handle_velocity_doc,
+ "The source's velocity in 3D space, a 3D tuple of floats.");
+
+static PyObject *
+Handle_get_velocity(Handle *self, void* nothing)
+{
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ AUD_Vector3 v = device->getSourceVelocity(self->handle);
+ return Py_BuildValue("(fff)", v.x(), v.y(), v.z());
+ }
+ else
+ {
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return NULL;
+}
+
+static int
+Handle_set_velocity(Handle *self, PyObject* args, void* nothing)
+{
+ float x, y, z;
+
+ if(!PyArg_Parse(args, "(fff):velocity", &x, &y, &z))
+ return -1;
+
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ AUD_Vector3 velocity(x, y, z);
+ if(device->setSourceVelocity(self->handle, velocity))
+ return 0;
+ PyErr_SetString(AUDError, "Couldn't set the velocity!");
+ }
+ else
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Handle_orientation_doc,
+ "The source's orientation in 3D space as quaternion, a 4 float tuple.");
+
+static PyObject *
+Handle_get_orientation(Handle *self, void* nothing)
+{
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ AUD_Quaternion o = device->getSourceOrientation(self->handle);
+ return Py_BuildValue("(ffff)", o.w(), o.x(), o.y(), o.z());
+ }
+ else
+ {
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return NULL;
+}
+
+static int
+Handle_set_orientation(Handle *self, PyObject* args, void* nothing)
+{
+ float w, x, y, z;
+
+ if(!PyArg_Parse(args, "(ffff):orientation", &w, &x, &y, &z))
+ return -1;
+
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ AUD_Quaternion orientation(w, x, y, z);
+ if(device->setSourceOrientation(self->handle, orientation))
+ return 0;
+ PyErr_SetString(AUDError, "Couldn't set the orientation!");
+ }
+ else
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Handle_relative_doc,
+ "Whether the source's location, velocity and orientation is relative or absolute to the listener.");
+
+static PyObject *
+Handle_get_relative(Handle *self, void* nothing)
+{
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ if(device->isRelative(self->handle))
+ {
+ Py_RETURN_TRUE;
+ }
+ else
+ {
+ Py_RETURN_FALSE;
+ }
+ }
+ else
+ {
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return NULL;
+}
+
+static int
+Handle_set_relative(Handle *self, PyObject* args, void* nothing)
+{
+ if(!PyBool_Check(args))
+ {
+ PyErr_SetString(PyExc_TypeError, "Value is not a boolean!");
+ return -1;
+ }
+
+ bool relative = (args == Py_True);
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ if(device->setRelative(self->handle, relative))
+ return 0;
+ PyErr_SetString(AUDError, "Couldn't set the relativeness!");
+ }
+ else
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Handle_volume_minimum_doc,
+ "The minimum volume of the source.\n\n"
+ ".. seealso:: :attr:`Device.distance_model`");
+
+static PyObject *
+Handle_get_volume_minimum(Handle *self, void* nothing)
+{
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ return Py_BuildValue("f", device->getVolumeMinimum(self->handle));
+ }
+ else
+ {
+ PyErr_SetString(AUDError, device_not_3d_error);
+ return NULL;
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+static int
+Handle_set_volume_minimum(Handle *self, PyObject* args, void* nothing)
+{
+ float volume;
+
+ if(!PyArg_Parse(args, "f:volume_minimum", &volume))
+ return -1;
+
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ if(device->setVolumeMinimum(self->handle, volume))
+ return 0;
+ PyErr_SetString(AUDError, "Couldn't set the minimum volume!");
+ }
+ else
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Handle_volume_maximum_doc,
+ "The maximum volume of the source.\n\n"
+ ".. seealso:: :attr:`Device.distance_model`");
+
+static PyObject *
+Handle_get_volume_maximum(Handle *self, void* nothing)
+{
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ return Py_BuildValue("f", device->getVolumeMaximum(self->handle));
+ }
+ else
+ {
+ PyErr_SetString(AUDError, device_not_3d_error);
+ return NULL;
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+static int
+Handle_set_volume_maximum(Handle *self, PyObject* args, void* nothing)
+{
+ float volume;
+
+ if(!PyArg_Parse(args, "f:volume_maximum", &volume))
+ return -1;
+
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ if(device->setVolumeMaximum(self->handle, volume))
+ return 0;
+ PyErr_SetString(AUDError, "Couldn't set the maximum volume!");
+ }
+ else
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Handle_distance_reference_doc,
+ "The reference distance of the source.\n"
+ "At this distance the volume will be exactly :attr:`volume`.\n\n"
+ ".. seealso:: :attr:`Device.distance_model`");
+
+static PyObject *
+Handle_get_distance_reference(Handle *self, void* nothing)
+{
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ return Py_BuildValue("f", device->getDistanceReference(self->handle));
+ }
+ else
+ {
+ PyErr_SetString(AUDError, device_not_3d_error);
+ return NULL;
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+static int
+Handle_set_distance_reference(Handle *self, PyObject* args, void* nothing)
+{
+ float distance;
+
+ if(!PyArg_Parse(args, "f:distance_reference", &distance))
+ return -1;
+
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ if(device->setDistanceReference(self->handle, distance))
+ return 0;
+ PyErr_SetString(AUDError, "Couldn't set the reference distance!");
+ }
+ else
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Handle_distance_maximum_doc,
+ "The maximum distance of the source.\n"
+ "If the listener is further away the source volume will be 0.\n\n"
+ ".. seealso:: :attr:`Device.distance_model`");
+
+static PyObject *
+Handle_get_distance_maximum(Handle *self, void* nothing)
+{
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ return Py_BuildValue("f", device->getDistanceMaximum(self->handle));
+ }
+ else
+ {
+ PyErr_SetString(AUDError, device_not_3d_error);
+ return NULL;
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+static int
+Handle_set_distance_maximum(Handle *self, PyObject* args, void* nothing)
+{
+ float distance;
+
+ if(!PyArg_Parse(args, "f:distance_maximum", &distance))
+ return -1;
+
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ if(device->setDistanceMaximum(self->handle, distance))
+ return 0;
+ PyErr_SetString(AUDError, "Couldn't set the maximum distance!");
+ }
+ else
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Handle_attenuation_doc,
+ "This factor is used for distance based attenuation of the "
+ "source.\n\n"
+ ".. seealso:: :attr:`Device.distance_model`");
+
+static PyObject *
+Handle_get_attenuation(Handle *self, void* nothing)
+{
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ return Py_BuildValue("f", device->getAttenuation(self->handle));
+ }
+ else
+ {
+ PyErr_SetString(AUDError, device_not_3d_error);
+ return NULL;
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+static int
+Handle_set_attenuation(Handle *self, PyObject* args, void* nothing)
+{
+ float factor;
+
+ if(!PyArg_Parse(args, "f:attenuation", &factor))
+ return -1;
+
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ if(device->setAttenuation(self->handle, factor))
+ return 0;
+ PyErr_SetString(AUDError, "Couldn't set the attenuation!");
+ }
+ else
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Handle_cone_angle_inner_doc,
+ "The opening angle of the inner cone of the source. If the cone "
+ "values of a source are set there are two (audible) cones with "
+ "the apex at the :attr:`location` of the source and with infinite "
+ "height, heading in the direction of the source's "
+ ":attr:`orientation`.\n"
+ "In the inner cone the volume is normal. Outside the outer cone "
+ "the volume will be :attr:`cone_volume_outer` and in the area "
+ "between the volume will be interpolated linearly.");
+
+static PyObject *
+Handle_get_cone_angle_inner(Handle *self, void* nothing)
+{
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ return Py_BuildValue("f", device->getConeAngleInner(self->handle));
+ }
+ else
+ {
+ PyErr_SetString(AUDError, device_not_3d_error);
+ return NULL;
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+static int
+Handle_set_cone_angle_inner(Handle *self, PyObject* args, void* nothing)
+{
+ float angle;
+
+ if(!PyArg_Parse(args, "f:cone_angle_inner", &angle))
+ return -1;
+
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ if(device->setConeAngleInner(self->handle, angle))
+ return 0;
+ PyErr_SetString(AUDError, "Couldn't set the cone inner angle!");
+ }
+ else
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Handle_cone_angle_outer_doc,
+ "The opening angle of the outer cone of the source.\n\n"
+ ".. seealso:: :attr:`cone_angle_inner`");
+
+static PyObject *
+Handle_get_cone_angle_outer(Handle *self, void* nothing)
+{
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ return Py_BuildValue("f", device->getConeAngleOuter(self->handle));
+ }
+ else
+ {
+ PyErr_SetString(AUDError, device_not_3d_error);
+ return NULL;
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+static int
+Handle_set_cone_angle_outer(Handle *self, PyObject* args, void* nothing)
+{
+ float angle;
+
+ if(!PyArg_Parse(args, "f:cone_angle_outer", &angle))
+ return -1;
+
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ if(device->setConeAngleOuter(self->handle, angle))
+ return 0;
+ PyErr_SetString(AUDError, "Couldn't set the cone outer angle!");
+ }
+ else
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Handle_cone_volume_outer_doc,
+ "The volume outside the outer cone of the source.\n\n"
+ ".. seealso:: :attr:`cone_angle_inner`");
+
+static PyObject *
+Handle_get_cone_volume_outer(Handle *self, void* nothing)
+{
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ return Py_BuildValue("f", device->getConeVolumeOuter(self->handle));
+ }
+ else
+ {
+ PyErr_SetString(AUDError, device_not_3d_error);
+ return NULL;
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+static int
+Handle_set_cone_volume_outer(Handle *self, PyObject* args, void* nothing)
+{
+ float volume;
+
+ if(!PyArg_Parse(args, "f:cone_volume_outer", &volume))
+ return -1;
+
+ Device* dev = (Device*)self->device;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(dev->device);
+ if(device)
+ {
+ if(device->setConeVolumeOuter(self->handle, volume))
+ return 0;
+ PyErr_SetString(AUDError, "Couldn't set the cone outer volume!");
+ }
+ else
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+static PyGetSetDef Handle_properties[] = {
+ {(char*)"position", (getter)Handle_get_position, (setter)Handle_set_position,
+ M_aud_Handle_position_doc, NULL },
+ {(char*)"keep", (getter)Handle_get_keep, (setter)Handle_set_keep,
+ M_aud_Handle_keep_doc, NULL },
+ {(char*)"status", (getter)Handle_get_status, NULL,
+ M_aud_Handle_status_doc, NULL },
+ {(char*)"volume", (getter)Handle_get_volume, (setter)Handle_set_volume,
+ M_aud_Handle_volume_doc, NULL },
+ {(char*)"pitch", (getter)Handle_get_pitch, (setter)Handle_set_pitch,
+ M_aud_Handle_pitch_doc, NULL },
+ {(char*)"loop_count", (getter)Handle_get_loop_count, (setter)Handle_set_loop_count,
+ M_aud_Handle_loop_count_doc, NULL },
+ {(char*)"location", (getter)Handle_get_location, (setter)Handle_set_location,
+ M_aud_Handle_location_doc, NULL },
+ {(char*)"velocity", (getter)Handle_get_velocity, (setter)Handle_set_velocity,
+ M_aud_Handle_velocity_doc, NULL },
+ {(char*)"orientation", (getter)Handle_get_orientation, (setter)Handle_set_orientation,
+ M_aud_Handle_orientation_doc, NULL },
+ {(char*)"relative", (getter)Handle_get_relative, (setter)Handle_set_relative,
+ M_aud_Handle_relative_doc, NULL },
+ {(char*)"volume_minimum", (getter)Handle_get_volume_minimum, (setter)Handle_set_volume_minimum,
+ M_aud_Handle_volume_minimum_doc, NULL },
+ {(char*)"volume_maximum", (getter)Handle_get_volume_maximum, (setter)Handle_set_volume_maximum,
+ M_aud_Handle_volume_maximum_doc, NULL },
+ {(char*)"distance_reference", (getter)Handle_get_distance_reference, (setter)Handle_set_distance_reference,
+ M_aud_Handle_distance_reference_doc, NULL },
+ {(char*)"distance_maximum", (getter)Handle_get_distance_maximum, (setter)Handle_set_distance_maximum,
+ M_aud_Handle_distance_maximum_doc, NULL },
+ {(char*)"attenuation", (getter)Handle_get_attenuation, (setter)Handle_set_attenuation,
+ M_aud_Handle_attenuation_doc, NULL },
+ {(char*)"cone_angle_inner", (getter)Handle_get_cone_angle_inner, (setter)Handle_set_cone_angle_inner,
+ M_aud_Handle_cone_angle_inner_doc, NULL },
+ {(char*)"cone_angle_outer", (getter)Handle_get_cone_angle_outer, (setter)Handle_set_cone_angle_outer,
+ M_aud_Handle_cone_angle_outer_doc, NULL },
+ {(char*)"cone_volume_outer", (getter)Handle_get_cone_volume_outer, (setter)Handle_set_cone_volume_outer,
+ M_aud_Handle_cone_volume_outer_doc, NULL },
+ {NULL} /* Sentinel */
+};
+
+PyDoc_STRVAR(M_aud_Handle_doc,
+ "Handle objects are playback handles that can be used to control "
+ "playback of a sound. If a sound is played back multiple times "
+ "then there are as many handles.");
+
+static PyTypeObject HandleType = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "aud.Handle", /* tp_name */
+ sizeof(Handle), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)Handle_dealloc,/* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* 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, /* tp_flags */
+ M_aud_Handle_doc, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ Handle_methods, /* tp_methods */
+ 0, /* tp_members */
+ Handle_properties, /* 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 */
+ 0, /* tp_new */
+};
+
+// ========== Device ==================================================
+
+static void
+Device_dealloc(Device* self)
+{
+ if(self->device)
+ delete self->device;
+ Py_TYPE(self)->tp_free((PyObject*)self);
+}
+
+static PyObject *
+Device_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ Device *self;
+
+ static const char *kwlist[] = {"type", "rate", "channels", "format", "buffer_size", "name", NULL};
+ int device;
+ int rate = AUD_RATE_44100;
+ int channels = AUD_CHANNELS_STEREO;
+ int format = AUD_FORMAT_FLOAT32;
+ int buffersize = AUD_DEFAULT_BUFFER_SIZE;
+ const char* name = "Audaspace";
+
+ if(!PyArg_ParseTupleAndKeywords(args, kwds, "i|iiiis:Device", const_cast<char**>(kwlist),
+ &device, &rate, &channels, &format, &buffersize, &name))
+ return NULL;
+
+ if(buffersize < 128)
+ {
+ PyErr_SetString(PyExc_ValueError, "buffer_size must be greater than 127!");
+ return NULL;
+ }
+
+ self = (Device*)type->tp_alloc(type, 0);
+ if(self != NULL)
+ {
+ AUD_DeviceSpecs specs;
+ specs.channels = (AUD_Channels)channels;
+ specs.format = (AUD_SampleFormat)format;
+ specs.rate = (AUD_SampleRate)rate;
+
+ self->device = NULL;
+
+ try
+ {
+ switch(device)
+ {
+ case AUD_DEVICE_NULL:
+ self->device = new AUD_NULLDevice();
+ break;
+ case AUD_DEVICE_OPENAL:
+#ifdef WITH_OPENAL
+ self->device = new AUD_OpenALDevice(specs, buffersize);
+#endif
+ break;
+ case AUD_DEVICE_SDL:
+#ifdef WITH_SDL
+ self->device = new AUD_SDLDevice(specs, buffersize);
+#endif
+ break;
+ case AUD_DEVICE_JACK:
+#ifdef WITH_JACK
+ self->device = new AUD_JackDevice(name, specs, buffersize);
+#endif
+ break;
+ case AUD_DEVICE_READ:
+ break;
+ }
+
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(self);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+
+ if(!self->device)
+ {
+ Py_DECREF(self);
+ PyErr_SetString(AUDError, "Unsupported device type!");
+ return NULL;
+ }
+ }
+
+ return (PyObject *)self;
+}
+
+PyDoc_STRVAR(M_aud_Device_play_doc,
+ "play(factory, keep=False)\n\n"
+ "Plays a factory.\n\n"
+ ":arg factory: The factory to play.\n"
+ ":type factory: :class:`Factory`\n"
+ ":arg keep: See :attr:`Handle.keep`.\n"
+ ":type keep: bool\n"
+ ":return: The playback handle with which playback can be "
+ "controlled with.\n"
+ ":rtype: :class:`Handle`");
+
+static PyObject *
+Device_play(Device *self, PyObject *args, PyObject *kwds)
+{
+ PyObject* object;
+ PyObject* keepo = NULL;
+
+ bool keep = false;
+
+ static const char *kwlist[] = {"factory", "keep", NULL};
+
+ if(!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:play", const_cast<char**>(kwlist), &object, &keepo))
+ return NULL;
+
+ if(!PyObject_TypeCheck(object, &FactoryType))
+ {
+ PyErr_SetString(PyExc_TypeError, "Object is not of type Factory!");
+ return NULL;
+ }
+
+ if(keepo != NULL)
+ {
+ if(!PyBool_Check(keepo))
+ {
+ PyErr_SetString(PyExc_TypeError, "keep is not a boolean!");
+ return NULL;
+ }
+
+ keep = keepo == Py_True;
+ }
+
+ Factory* sound = (Factory*)object;
+ Handle *handle;
+
+ handle = (Handle*)HandleType.tp_alloc(&HandleType, 0);
+ if(handle != NULL)
+ {
+ handle->device = (PyObject*)self;
+ Py_INCREF(self);
+
+ try
+ {
+ handle->handle = self->device->play(sound->factory, keep);
+ }
+ catch(AUD_Exception& e)
+ {
+ Py_DECREF(handle);
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)handle;
+}
+
+PyDoc_STRVAR(M_aud_Device_lock_doc,
+ "lock()\n\n"
+ "Locks the device so that it's guaranteed, that no samples are "
+ "read from the streams until :meth:`unlock` is called.\n"
+ "This is useful if you want to do start/stop/pause/resume some "
+ "sounds at the same time.\n\n"
+ ".. note:: The device has to be unlocked as often as locked to be "
+ "able to continue playback.\n\n"
+ ".. warning:: Make sure the time between locking and unlocking is "
+ "as short as possible to avoid clicks.");
+
+static PyObject *
+Device_lock(Device *self)
+{
+ try
+ {
+ self->device->lock();
+ Py_RETURN_NONE;
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+PyDoc_STRVAR(M_aud_Device_unlock_doc,
+ "unlock()\n\n"
+ "Unlocks the device after a lock call, see :meth:`lock` for "
+ "details.");
+
+static PyObject *
+Device_unlock(Device *self)
+{
+ try
+ {
+ self->device->unlock();
+ Py_RETURN_NONE;
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+static PyMethodDef Device_methods[] = {
+ {"play", (PyCFunction)Device_play, METH_VARARGS | METH_KEYWORDS,
+ M_aud_Device_play_doc
+ },
+ {"lock", (PyCFunction)Device_lock, METH_NOARGS,
+ M_aud_Device_lock_doc
+ },
+ {"unlock", (PyCFunction)Device_unlock, METH_NOARGS,
+ M_aud_Device_unlock_doc
+ },
+ {NULL} /* Sentinel */
+};
+
+PyDoc_STRVAR(M_aud_Device_rate_doc,
+ "The sampling rate of the device in Hz.");
+
+static PyObject *
+Device_get_rate(Device *self, void* nothing)
+{
+ try
+ {
+ AUD_DeviceSpecs specs = self->device->getSpecs();
+ return Py_BuildValue("i", specs.rate);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+PyDoc_STRVAR(M_aud_Device_format_doc,
+ "The native sample format of the device.");
+
+static PyObject *
+Device_get_format(Device *self, void* nothing)
+{
+ try
+ {
+ AUD_DeviceSpecs specs = self->device->getSpecs();
+ return Py_BuildValue("i", specs.format);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+PyDoc_STRVAR(M_aud_Device_channels_doc,
+ "The channel count of the device.");
+
+static PyObject *
+Device_get_channels(Device *self, void* nothing)
+{
+ try
+ {
+ AUD_DeviceSpecs specs = self->device->getSpecs();
+ return Py_BuildValue("i", specs.channels);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+PyDoc_STRVAR(M_aud_Device_volume_doc,
+ "The overall volume of the device.");
+
+static PyObject *
+Device_get_volume(Device *self, void* nothing)
+{
+ try
+ {
+ return Py_BuildValue("f", self->device->getVolume());
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+static int
+Device_set_volume(Device *self, PyObject* args, void* nothing)
+{
+ float volume;
+
+ if(!PyArg_Parse(args, "f:volume", &volume))
+ return -1;
+
+ try
+ {
+ self->device->setVolume(volume);
+ return 0;
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return -1;
+ }
+}
+
+PyDoc_STRVAR(M_aud_Device_listener_location_doc,
+ "The listeners's location in 3D space, a 3D tuple of floats.");
+
+static PyObject *
+Device_get_listener_location(Device *self, void* nothing)
+{
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(self->device);
+ if(device)
+ {
+ AUD_Vector3 v = device->getListenerLocation();
+ return Py_BuildValue("(fff)", v.x(), v.y(), v.z());
+ }
+ else
+ {
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return NULL;
+}
+
+static int
+Device_set_listener_location(Device *self, PyObject* args, void* nothing)
+{
+ float x, y, z;
+
+ if(!PyArg_Parse(args, "(fff):listener_location", &x, &y, &z))
+ return -1;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(self->device);
+ if(device)
+ {
+ AUD_Vector3 location(x, y, z);
+ device->setListenerLocation(location);
+ return 0;
+ }
+ else
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Device_listener_velocity_doc,
+ "The listener's velocity in 3D space, a 3D tuple of floats.");
+
+static PyObject *
+Device_get_listener_velocity(Device *self, void* nothing)
+{
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(self->device);
+ if(device)
+ {
+ AUD_Vector3 v = device->getListenerVelocity();
+ return Py_BuildValue("(fff)", v.x(), v.y(), v.z());
+ }
+ else
+ {
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return NULL;
+}
+
+static int
+Device_set_listener_velocity(Device *self, PyObject* args, void* nothing)
+{
+ float x, y, z;
+
+ if(!PyArg_Parse(args, "(fff):listener_velocity", &x, &y, &z))
+ return -1;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(self->device);
+ if(device)
+ {
+ AUD_Vector3 velocity(x, y, z);
+ device->setListenerVelocity(velocity);
+ return 0;
+ }
+ else
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Device_listener_orientation_doc,
+ "The listener's orientation in 3D space as quaternion, a 4 float tuple.");
+
+static PyObject *
+Device_get_listener_orientation(Device *self, void* nothing)
+{
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(self->device);
+ if(device)
+ {
+ AUD_Quaternion o = device->getListenerOrientation();
+ return Py_BuildValue("(ffff)", o.w(), o.x(), o.y(), o.z());
+ }
+ else
+ {
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return NULL;
+}
+
+static int
+Device_set_listener_orientation(Device *self, PyObject* args, void* nothing)
+{
+ float w, x, y, z;
+
+ if(!PyArg_Parse(args, "(ffff):listener_orientation", &w, &x, &y, &z))
+ return -1;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(self->device);
+ if(device)
+ {
+ AUD_Quaternion orientation(w, x, y, z);
+ device->setListenerOrientation(orientation);
+ return 0;
+ }
+ else
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Device_speed_of_sound_doc,
+ "The speed of sound of the device.\n"
+ "The speed of sound in air is typically 343 m/s.");
+
+static PyObject *
+Device_get_speed_of_sound(Device *self, void* nothing)
+{
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(self->device);
+ if(device)
+ {
+ return Py_BuildValue("f", device->getSpeedOfSound());
+ }
+ else
+ {
+ PyErr_SetString(AUDError, device_not_3d_error);
+ return NULL;
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+static int
+Device_set_speed_of_sound(Device *self, PyObject* args, void* nothing)
+{
+ float speed;
+
+ if(!PyArg_Parse(args, "f:speed_of_sound", &speed))
+ return -1;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(self->device);
+ if(device)
+ {
+ device->setSpeedOfSound(speed);
+ return 0;
+ }
+ else
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Device_doppler_factor_doc,
+ "The doppler factor of the device.\n"
+ "This factor is a scaling factor for the velocity vectors in "
+ "doppler calculation. So a value bigger than 1 will exaggerate "
+ "the effect as it raises the velocity.");
+
+static PyObject *
+Device_get_doppler_factor(Device *self, void* nothing)
+{
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(self->device);
+ if(device)
+ {
+ return Py_BuildValue("f", device->getDopplerFactor());
+ }
+ else
+ {
+ PyErr_SetString(AUDError, device_not_3d_error);
+ return NULL;
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+static int
+Device_set_doppler_factor(Device *self, PyObject* args, void* nothing)
+{
+ float factor;
+
+ if(!PyArg_Parse(args, "f:doppler_factor", &factor))
+ return -1;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(self->device);
+ if(device)
+ {
+ device->setDopplerFactor(factor);
+ return 0;
+ }
+ else
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+PyDoc_STRVAR(M_aud_Device_distance_model_doc,
+ "The distance model of the device.\n\n"
+ ".. seealso:: http://connect.creativelabs.com/openal/Documentation/OpenAL%201.1%20Specification.htm#_Toc199835864");
+
+static PyObject *
+Device_get_distance_model(Device *self, void* nothing)
+{
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(self->device);
+ if(device)
+ {
+ return Py_BuildValue("i", int(device->getDistanceModel()));
+ }
+ else
+ {
+ PyErr_SetString(AUDError, device_not_3d_error);
+ return NULL;
+ }
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ return NULL;
+ }
+}
+
+static int
+Device_set_distance_model(Device *self, PyObject* args, void* nothing)
+{
+ int model;
+
+ if(!PyArg_Parse(args, "i:distance_model", &model))
+ return -1;
+
+ try
+ {
+ AUD_I3DDevice* device = dynamic_cast<AUD_I3DDevice*>(self->device);
+ if(device)
+ {
+ device->setDistanceModel(AUD_DistanceModel(model));
+ return 0;
+ }
+ else
+ PyErr_SetString(AUDError, device_not_3d_error);
+ }
+ catch(AUD_Exception& e)
+ {
+ PyErr_SetString(AUDError, e.str);
+ }
+
+ return -1;
+}
+
+static PyGetSetDef Device_properties[] = {
+ {(char*)"rate", (getter)Device_get_rate, NULL,
+ M_aud_Device_rate_doc, NULL },
+ {(char*)"format", (getter)Device_get_format, NULL,
+ M_aud_Device_format_doc, NULL },
+ {(char*)"channels", (getter)Device_get_channels, NULL,
+ M_aud_Device_channels_doc, NULL },
+ {(char*)"volume", (getter)Device_get_volume, (setter)Device_set_volume,
+ M_aud_Device_volume_doc, NULL },
+ {(char*)"listener_location", (getter)Device_get_listener_location, (setter)Device_set_listener_location,
+ M_aud_Device_listener_location_doc, NULL },
+ {(char*)"listener_velocity", (getter)Device_get_listener_velocity, (setter)Device_set_listener_velocity,
+ M_aud_Device_listener_velocity_doc, NULL },
+ {(char*)"listener_orientation", (getter)Device_get_listener_orientation, (setter)Device_set_listener_orientation,
+ M_aud_Device_listener_orientation_doc, NULL },
+ {(char*)"speed_of_sound", (getter)Device_get_speed_of_sound, (setter)Device_set_speed_of_sound,
+ M_aud_Device_speed_of_sound_doc, NULL },
+ {(char*)"doppler_factor", (getter)Device_get_doppler_factor, (setter)Device_set_doppler_factor,
+ M_aud_Device_doppler_factor_doc, NULL },
+ {(char*)"distance_model", (getter)Device_get_distance_model, (setter)Device_set_distance_model,
+ M_aud_Device_distance_model_doc, NULL },
+ {NULL} /* Sentinel */
+};
+
+PyDoc_STRVAR(M_aud_Device_doc,
+ "Device objects represent an audio output backend like OpenAL or "
+ "SDL, but might also represent a file output or RAM buffer "
+ "output.");
+
+static PyTypeObject DeviceType = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "aud.Device", /* tp_name */
+ sizeof(Device), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)Device_dealloc,/* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* 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, /* tp_flags */
+ M_aud_Device_doc, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ Device_methods, /* tp_methods */
+ 0, /* tp_members */
+ Device_properties, /* 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 */
+ Device_new, /* tp_new */
+};
+
+PyObject *
+Device_empty()
+{
+ return DeviceType.tp_alloc(&DeviceType, 0);
+}
+
+// ====================================================================
+
+PyDoc_STRVAR(M_aud_doc,
+ "This module provides access to the audaspace audio library.");
+
+static struct PyModuleDef audmodule = {
+ PyModuleDef_HEAD_INIT,
+ "aud", /* name of module */
+ M_aud_doc, /* module documentation */
+ -1, /* size of per-interpreter state of the module,
+ or -1 if the module keeps state in global variables. */
+ NULL, NULL, NULL, NULL, NULL
+};
+
+PyMODINIT_FUNC
+PyInit_aud(void)
+{
+ PyObject* m;
+
+ if(PyType_Ready(&FactoryType) < 0)
+ return NULL;
+
+ if(PyType_Ready(&DeviceType) < 0)
+ return NULL;
+
+ if(PyType_Ready(&HandleType) < 0)
+ return NULL;
+
+ m = PyModule_Create(&audmodule);
+ if(m == NULL)
+ return NULL;
+
+ Py_INCREF(&FactoryType);
+ PyModule_AddObject(m, "Factory", (PyObject*)&FactoryType);
+
+ Py_INCREF(&DeviceType);
+ PyModule_AddObject(m, "Device", (PyObject*)&DeviceType);
+
+ Py_INCREF(&HandleType);
+ PyModule_AddObject(m, "Handle", (PyObject*)&HandleType);
+
+ AUDError = PyErr_NewException("aud.error", NULL, NULL);
+ Py_INCREF(AUDError);
+ PyModule_AddObject(m, "error", AUDError);
+
+ // device constants
+ PY_MODULE_ADD_CONSTANT(m, AUD_DEVICE_NULL);
+ PY_MODULE_ADD_CONSTANT(m, AUD_DEVICE_OPENAL);
+ PY_MODULE_ADD_CONSTANT(m, AUD_DEVICE_SDL);
+ PY_MODULE_ADD_CONSTANT(m, AUD_DEVICE_JACK);
+ //PY_MODULE_ADD_CONSTANT(m, AUD_DEVICE_READ);
+ // format constants
+ PY_MODULE_ADD_CONSTANT(m, AUD_FORMAT_FLOAT32);
+ PY_MODULE_ADD_CONSTANT(m, AUD_FORMAT_FLOAT64);
+ PY_MODULE_ADD_CONSTANT(m, AUD_FORMAT_INVALID);
+ PY_MODULE_ADD_CONSTANT(m, AUD_FORMAT_S16);
+ PY_MODULE_ADD_CONSTANT(m, AUD_FORMAT_S24);
+ PY_MODULE_ADD_CONSTANT(m, AUD_FORMAT_S32);
+ PY_MODULE_ADD_CONSTANT(m, AUD_FORMAT_U8);
+ // status constants
+ PY_MODULE_ADD_CONSTANT(m, AUD_STATUS_INVALID);
+ PY_MODULE_ADD_CONSTANT(m, AUD_STATUS_PAUSED);
+ PY_MODULE_ADD_CONSTANT(m, AUD_STATUS_PLAYING);
+ // distance model constants
+ PY_MODULE_ADD_CONSTANT(m, AUD_DISTANCE_MODEL_EXPONENT);
+ PY_MODULE_ADD_CONSTANT(m, AUD_DISTANCE_MODEL_EXPONENT_CLAMPED);
+ PY_MODULE_ADD_CONSTANT(m, AUD_DISTANCE_MODEL_INVERSE);
+ PY_MODULE_ADD_CONSTANT(m, AUD_DISTANCE_MODEL_INVERSE_CLAMPED);
+ PY_MODULE_ADD_CONSTANT(m, AUD_DISTANCE_MODEL_LINEAR);
+ PY_MODULE_ADD_CONSTANT(m, AUD_DISTANCE_MODEL_LINEAR_CLAMPED);
+ PY_MODULE_ADD_CONSTANT(m, AUD_DISTANCE_MODEL_INVALID);
+
+ return m;
+}
diff --git a/intern/audaspace/Python/AUD_PyAPI.h b/intern/audaspace/Python/AUD_PyAPI.h
new file mode 100644
index 00000000000..aeeaf94af9d
--- /dev/null
+++ b/intern/audaspace/Python/AUD_PyAPI.h
@@ -0,0 +1,67 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN LGPL LICENSE BLOCK *****
+ *
+ * Copyright 2009 Jörg Hermann Müller
+ *
+ * This file is part of AudaSpace.
+ *
+ * AudaSpace is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AudaSpace is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * ***** END LGPL LICENSE BLOCK *****
+ */
+
+#ifndef AUD_PYAPI
+#define AUD_PYAPI
+
+#include "Python.h"
+
+#ifdef __cplusplus
+extern "C" {
+#include "AUD_IDevice.h"
+#else
+typedef void AUD_IFactory;
+typedef void AUD_IDevice;
+typedef void AUD_Handle;
+#endif
+
+typedef struct {
+ PyObject_HEAD
+ PyObject* child_list;
+ AUD_IFactory* factory;
+} Factory;
+
+typedef struct {
+ PyObject_HEAD
+ AUD_Handle* handle;
+ PyObject* device;
+} Handle;
+
+typedef struct {
+ PyObject_HEAD
+ AUD_IDevice* device;
+} Device;
+
+PyMODINIT_FUNC
+PyInit_aud(void);
+
+extern PyObject *
+Device_empty();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //AUD_PYAPI
diff --git a/intern/audaspace/Python/Makefile b/intern/audaspace/Python/Makefile
new file mode 100644
index 00000000000..a66f86549f5
--- /dev/null
+++ b/intern/audaspace/Python/Makefile
@@ -0,0 +1,76 @@
+# -*- mode: gnumakefile; tab-width: 8; indent-tabs-mode: t; -*-
+# vim: tabstop=8
+#
+# $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 by Blender Foundation
+# All rights reserved.
+#
+# The Original Code is: all of this file.
+#
+# Contributor(s): Ton
+#
+# ***** END GPL LICENSE BLOCK *****
+#
+#
+
+LIBNAME = aud_python
+DIR = $(OCGDIR)/intern/audaspace
+
+include nan_compile.mk
+
+CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
+
+CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
+
+ifeq ($(WITH_SDL),true)
+ CPPFLAGS += -DWITH_SDL
+ CPPFLAGS += $(NAN_SDLCFLAGS)
+endif
+
+ifeq ($(WITH_OPENAL),true)
+ CPPFLAGS += -DWITH_OPENAL
+ CPPFLAGS += -I../OpenAL
+endif
+
+ifeq ($(WITH_JACK),true)
+ CPPFLAGS += -DWITH_JACK
+ CPPFLAGS += $(NAN_JACKCFLAGS)
+ CPPFLAGS += -I../jack
+endif
+
+ifeq ($(WITH_FFMPEG),true)
+ CPPFLAGS += -DWITH_FFMPEG
+ CPPFLAGS += $(NAN_FFMPEGCFLAGS)
+endif
+
+ifeq ($(WITH_SNDFILE),true)
+ CPPFLAGS += -DWITH_SNDFILE
+ CPPFLAGS += -I../sndfile
+ CPPFLAGS += -I$(NAN_SNDFILE)/include
+endif
+
+CPPFLAGS += -I$(NAN_SAMPLERATE)/include/
+CPPFLAGS += -I../ffmpeg
+CPPFLAGS += -I../FX
+CPPFLAGS += -I../SDL
+CPPFLAGS += -I../SRC
+CPPFLAGS += -I../intern
+CPPFLAGS += -I..
+CPPFLAGS += -I.
diff --git a/intern/audaspace/SConscript b/intern/audaspace/SConscript
index bbd2442c480..045ae5dc83b 100644
--- a/intern/audaspace/SConscript
+++ b/intern/audaspace/SConscript
@@ -31,12 +31,18 @@ if env['WITH_BF_SNDFILE']:
incs += ' sndfile ' + env['BF_SNDFILE_INC']
defs.append('WITH_SNDFILE')
-if env['WITH_BF_FFTW3']:
- sources += env.Glob('fftw/*.cpp')
- incs += ' fftw ' + env['BF_FFTW3_INC']
- defs.append('WITH_FFTW3')
+#if env['WITH_BF_FFTW3']:
+# sources += env.Glob('fftw/*.cpp')
+# incs += ' fftw ' + env['BF_FFTW3_INC']
+# defs.append('WITH_FFTW3')
+
+if env['WITH_BF_PYTHON']:
+ sources += env.Glob('Python/*.cpp')
+ incs += ' Python ' + env['BF_PYTHON_INC']
+else:
+ defs.append('DISABLE_PYTHON')
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
incs += ' ' + env['BF_PTHREADS_INC']
-env.BlenderLib ('bf_audaspace', sources, Split(incs), defs, libtype=['intern','player'], priority = [25,215] )
+env.BlenderLib ('bf_intern_audaspace', sources, Split(incs), defs, libtype=['intern','player'], priority = [25,215] )
diff --git a/intern/audaspace/SDL/AUD_SDLDevice.cpp b/intern/audaspace/SDL/AUD_SDLDevice.cpp
index 1a385af8a0c..c1eb7bdf61e 100644
--- a/intern/audaspace/SDL/AUD_SDLDevice.cpp
+++ b/intern/audaspace/SDL/AUD_SDLDevice.cpp
@@ -33,6 +33,10 @@ void AUD_SDLDevice::SDL_mix(void *data, Uint8* buffer, int length)
device->mix((data_t*)buffer,length/AUD_DEVICE_SAMPLE_SIZE(device->m_specs));
}
+static const char* open_error = "AUD_SDLDevice: Device couldn't be opened.";
+static const char* format_error = "AUD_SDLDevice: Obtained unsupported sample "
+ "format.";
+
AUD_SDLDevice::AUD_SDLDevice(AUD_DeviceSpecs specs, int buffersize)
{
if(specs.channels == AUD_CHANNELS_INVALID)
@@ -57,7 +61,7 @@ AUD_SDLDevice::AUD_SDLDevice(AUD_DeviceSpecs specs, int buffersize)
format.userdata = this;
if(SDL_OpenAudio(&format, &obtained) != 0)
- AUD_THROW(AUD_ERROR_SDL);
+ AUD_THROW(AUD_ERROR_SDL, open_error);
m_specs.rate = (AUD_SampleRate)obtained.freq;
m_specs.channels = (AUD_Channels)obtained.channels;
@@ -66,7 +70,10 @@ AUD_SDLDevice::AUD_SDLDevice(AUD_DeviceSpecs specs, int buffersize)
else if(obtained.format == AUDIO_S16LSB || obtained.format == AUDIO_S16MSB)
m_specs.format = AUD_FORMAT_S16;
else
- AUD_THROW(AUD_ERROR_SDL);
+ {
+ SDL_CloseAudio();
+ AUD_THROW(AUD_ERROR_SDL, format_error);
+ }
create();
}
diff --git a/intern/audaspace/SDL/AUD_SDLDevice.h b/intern/audaspace/SDL/AUD_SDLDevice.h
index 4b7de1996e8..af713b27480 100644
--- a/intern/audaspace/SDL/AUD_SDLDevice.h
+++ b/intern/audaspace/SDL/AUD_SDLDevice.h
@@ -44,6 +44,10 @@ private:
*/
static void SDL_mix(void *data, Uint8* buffer, int length);
+ // hide copy constructor and operator=
+ AUD_SDLDevice(const AUD_SDLDevice&);
+ AUD_SDLDevice& operator=(const AUD_SDLDevice&);
+
protected:
virtual void playing(bool playing);
diff --git a/intern/audaspace/SRC/AUD_SRCResampleFactory.cpp b/intern/audaspace/SRC/AUD_SRCResampleFactory.cpp
index caafbd14327..b421bb777e1 100644
--- a/intern/audaspace/SRC/AUD_SRCResampleFactory.cpp
+++ b/intern/audaspace/SRC/AUD_SRCResampleFactory.cpp
@@ -26,28 +26,18 @@
#include "AUD_SRCResampleFactory.h"
#include "AUD_SRCResampleReader.h"
-AUD_SRCResampleFactory::AUD_SRCResampleFactory(AUD_IReader* reader,
- AUD_DeviceSpecs specs) :
- AUD_ResampleFactory(reader, specs) {}
-
AUD_SRCResampleFactory::AUD_SRCResampleFactory(AUD_IFactory* factory,
AUD_DeviceSpecs specs) :
- AUD_ResampleFactory(factory, specs) {}
-
-AUD_SRCResampleFactory::AUD_SRCResampleFactory(AUD_DeviceSpecs specs) :
- AUD_ResampleFactory(specs) {}
+ AUD_ResampleFactory(factory, specs)
+{
+}
-AUD_IReader* AUD_SRCResampleFactory::createReader()
+AUD_IReader* AUD_SRCResampleFactory::createReader() const
{
AUD_IReader* reader = getReader();
- if(reader != 0)
- {
- if(reader->getSpecs().rate != m_specs.rate)
- {
- reader = new AUD_SRCResampleReader(reader, m_specs.specs);
- AUD_NEW("reader")
- }
- }
+ if(reader->getSpecs().rate != m_specs.rate)
+ reader = new AUD_SRCResampleReader(reader, m_specs.specs);
+
return reader;
}
diff --git a/intern/audaspace/SRC/AUD_SRCResampleFactory.h b/intern/audaspace/SRC/AUD_SRCResampleFactory.h
index 4b16c70169c..4edb0e76181 100644
--- a/intern/audaspace/SRC/AUD_SRCResampleFactory.h
+++ b/intern/audaspace/SRC/AUD_SRCResampleFactory.h
@@ -34,12 +34,15 @@
*/
class AUD_SRCResampleFactory : public AUD_ResampleFactory
{
+private:
+ // hide copy constructor and operator=
+ AUD_SRCResampleFactory(const AUD_SRCResampleFactory&);
+ AUD_SRCResampleFactory& operator=(const AUD_SRCResampleFactory&);
+
public:
- AUD_SRCResampleFactory(AUD_IReader* reader, AUD_DeviceSpecs specs);
AUD_SRCResampleFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs);
- AUD_SRCResampleFactory(AUD_DeviceSpecs specs);
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_SRCRESAMPLEFACTORY
diff --git a/intern/audaspace/SRC/AUD_SRCResampleReader.cpp b/intern/audaspace/SRC/AUD_SRCResampleReader.cpp
index e89857635de..91bf7002a49 100644
--- a/intern/audaspace/SRC/AUD_SRCResampleReader.cpp
+++ b/intern/audaspace/SRC/AUD_SRCResampleReader.cpp
@@ -24,7 +24,6 @@
*/
#include "AUD_SRCResampleReader.h"
-#include "AUD_Buffer.h"
#include <cmath>
#include <cstring>
@@ -35,16 +34,18 @@ static long src_callback(void *cb_data, float **data)
return ((AUD_SRCResampleReader*)cb_data)->doCallback(data);
}
+static const char* state_error = "AUD_SRCResampleReader: SRC State couldn't be "
+ "created.";
+
AUD_SRCResampleReader::AUD_SRCResampleReader(AUD_IReader* reader,
AUD_Specs specs) :
- AUD_EffectReader(reader)
+ AUD_EffectReader(reader),
+ m_sspecs(reader->getSpecs()),
+ m_factor(double(specs.rate) / double(m_sspecs.rate)),
+ m_tspecs(specs),
+ m_position(0)
{
- m_sspecs = reader->getSpecs();
-
- m_tspecs = specs;
m_tspecs.channels = m_sspecs.channels;
- m_factor = (double)m_tspecs.rate / (double)m_sspecs.rate;
- m_position = 0;
int error;
m_src = src_callback_new(src_callback,
@@ -56,23 +57,18 @@ AUD_SRCResampleReader::AUD_SRCResampleReader(AUD_IReader* reader,
if(!m_src)
{
// XXX printf("%s\n", src_strerror(error));
- delete m_reader; AUD_DELETE("reader")
- AUD_THROW(AUD_ERROR_READER);
+ AUD_THROW(AUD_ERROR_SRC, state_error);
}
-
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
}
AUD_SRCResampleReader::~AUD_SRCResampleReader()
{
src_delete(m_src);
-
- delete m_buffer; AUD_DELETE("buffer")
}
long AUD_SRCResampleReader::doCallback(float** data)
{
- int length = m_buffer->getSize() / AUD_SAMPLE_SIZE(m_tspecs);
+ int length = m_buffer.getSize() / AUD_SAMPLE_SIZE(m_tspecs);
sample_t* buffer;
m_reader->read(length, buffer);
@@ -88,17 +84,17 @@ void AUD_SRCResampleReader::seek(int position)
m_position = position;
}
-int AUD_SRCResampleReader::getLength()
+int AUD_SRCResampleReader::getLength() const
{
return m_reader->getLength() * m_factor;
}
-int AUD_SRCResampleReader::getPosition()
+int AUD_SRCResampleReader::getPosition() const
{
return m_position;
}
-AUD_Specs AUD_SRCResampleReader::getSpecs()
+AUD_Specs AUD_SRCResampleReader::getSpecs() const
{
return m_tspecs;
}
@@ -107,10 +103,10 @@ void AUD_SRCResampleReader::read(int & length, sample_t* & buffer)
{
int size = length * AUD_SAMPLE_SIZE(m_tspecs);
- if(m_buffer->getSize() < size)
- m_buffer->resize(size);
+ if(m_buffer.getSize() < size)
+ m_buffer.resize(size);
- buffer = m_buffer->getBuffer();
+ buffer = m_buffer.getBuffer();
length = src_callback_read(m_src, m_factor, length, buffer);
diff --git a/intern/audaspace/SRC/AUD_SRCResampleReader.h b/intern/audaspace/SRC/AUD_SRCResampleReader.h
index e09d1b66f13..5e3dafb359b 100644
--- a/intern/audaspace/SRC/AUD_SRCResampleReader.h
+++ b/intern/audaspace/SRC/AUD_SRCResampleReader.h
@@ -27,7 +27,7 @@
#define AUD_SRCRESAMPLEREADER
#include "AUD_EffectReader.h"
-class AUD_Buffer;
+#include "AUD_Buffer.h"
#include <samplerate.h>
@@ -38,14 +38,19 @@ class AUD_SRCResampleReader : public AUD_EffectReader
{
private:
/**
+ * The sample specification of the source.
+ */
+ const AUD_Specs m_sspecs;
+
+ /**
* The resampling factor.
*/
- double m_factor;
+ const double m_factor;
/**
* The sound output buffer.
*/
- AUD_Buffer *m_buffer;
+ AUD_Buffer m_buffer;
/**
* The target specification.
@@ -53,11 +58,6 @@ private:
AUD_Specs m_tspecs;
/**
- * The sample specification of the source.
- */
- AUD_Specs m_sspecs;
-
- /**
* The src state structure.
*/
SRC_STATE* m_src;
@@ -67,14 +67,17 @@ private:
*/
int m_position;
+ // hide copy constructor and operator=
+ AUD_SRCResampleReader(const AUD_SRCResampleReader&);
+ AUD_SRCResampleReader& operator=(const AUD_SRCResampleReader&);
+
public:
/**
* Creates a resampling reader.
* \param reader The reader to mix.
* \param specs The target specification.
* \exception AUD_Exception Thrown if the source specification cannot be
- * mixed to the target specification or if the reader is
- * NULL.
+ * resampled to the target specification.
*/
AUD_SRCResampleReader(AUD_IReader* reader, AUD_Specs specs);
@@ -92,9 +95,9 @@ public:
long doCallback(float** data);
virtual void seek(int position);
- virtual int getLength();
- virtual int getPosition();
- virtual AUD_Specs getSpecs();
+ virtual int getLength() const;
+ virtual int getPosition() const;
+ virtual AUD_Specs getSpecs() const;
virtual void read(int & length, sample_t* & buffer);
};
diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp b/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp
index f67c819ff10..cad64d70790 100644
--- a/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp
+++ b/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp
@@ -23,43 +23,30 @@
* ***** END LGPL LICENSE BLOCK *****
*/
+// needed for INT64_C
+#ifndef __STDC_CONSTANT_MACROS
+#define __STDC_CONSTANT_MACROS
+#endif
+
#include "AUD_FFMPEGFactory.h"
#include "AUD_FFMPEGReader.h"
#include "AUD_Buffer.h"
-AUD_FFMPEGFactory::AUD_FFMPEGFactory(const char* filename)
+AUD_FFMPEGFactory::AUD_FFMPEGFactory(std::string filename) :
+ m_filename(filename)
{
- if(filename != NULL)
- {
- m_filename = new char[strlen(filename)+1]; AUD_NEW("string")
- strcpy(m_filename, filename);
- }
- else
- m_filename = NULL;
}
-AUD_FFMPEGFactory::AUD_FFMPEGFactory(unsigned char* buffer, int size)
+AUD_FFMPEGFactory::AUD_FFMPEGFactory(const data_t* buffer, int size) :
+ m_buffer(new AUD_Buffer(size))
{
- m_filename = NULL;
- m_buffer = AUD_Reference<AUD_Buffer>(new AUD_Buffer(size));
memcpy(m_buffer.get()->getBuffer(), buffer, size);
}
-AUD_FFMPEGFactory::~AUD_FFMPEGFactory()
-{
- if(m_filename)
- {
- delete[] m_filename; AUD_DELETE("string")
- }
-}
-
-AUD_IReader* AUD_FFMPEGFactory::createReader()
+AUD_IReader* AUD_FFMPEGFactory::createReader() const
{
- AUD_IReader* reader;
- if(m_filename)
- reader = new AUD_FFMPEGReader(m_filename);
+ if(m_buffer.get())
+ return new AUD_FFMPEGReader(m_buffer);
else
- reader = new AUD_FFMPEGReader(m_buffer);
- AUD_NEW("reader")
- return reader;
+ return new AUD_FFMPEGReader(m_filename);
}
diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h b/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h
index 22560303a73..43a6ce68ca7 100644
--- a/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h
+++ b/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h
@@ -30,6 +30,8 @@
#include "AUD_Reference.h"
class AUD_Buffer;
+#include <string>
+
/**
* This factory reads a sound file via ffmpeg.
* \warning Notice that the needed formats and codecs have to be registered
@@ -41,33 +43,32 @@ private:
/**
* The filename of the sound source file.
*/
- char* m_filename;
+ const std::string m_filename;
/**
* The buffer to read from.
*/
AUD_Reference<AUD_Buffer> m_buffer;
+ // hide copy constructor and operator=
+ AUD_FFMPEGFactory(const AUD_FFMPEGFactory&);
+ AUD_FFMPEGFactory& operator=(const AUD_FFMPEGFactory&);
+
public:
/**
* Creates a new factory.
* \param filename The sound file path.
*/
- AUD_FFMPEGFactory(const char* filename);
+ AUD_FFMPEGFactory(std::string filename);
/**
* Creates a new factory.
* \param buffer The buffer to read from.
* \param size The size of the buffer.
*/
- AUD_FFMPEGFactory(unsigned char* buffer, int size);
-
- /**
- * Destroys the factory.
- */
- ~AUD_FFMPEGFactory();
+ AUD_FFMPEGFactory(const data_t* buffer, int size);
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_FFMPEGFACTORY
diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
index 027ac015eb5..623e99d5edc 100644
--- a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
+++ b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
@@ -24,23 +24,24 @@
*/
// needed for INT64_C
+#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
+#endif
#include "AUD_FFMPEGReader.h"
-#include "AUD_Buffer.h"
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
}
-int AUD_FFMPEGReader::decode(AVPacket* packet, AUD_Buffer* buffer)
+int AUD_FFMPEGReader::decode(AVPacket* packet, AUD_Buffer& buffer)
{
// save packet parameters
uint8_t *audio_pkg_data = packet->data;
int audio_pkg_size = packet->size;
- int buf_size = buffer->getSize();
+ int buf_size = buffer.getSize();
int buf_pos = 0;
int read_length, data_size;
@@ -51,28 +52,28 @@ int AUD_FFMPEGReader::decode(AVPacket* packet, AUD_Buffer* buffer)
// resize buffer if needed
if(buf_size - buf_pos < AVCODEC_MAX_AUDIO_FRAME_SIZE)
{
- buffer->resize(buf_size + AVCODEC_MAX_AUDIO_FRAME_SIZE, true);
+ buffer.resize(buf_size + AVCODEC_MAX_AUDIO_FRAME_SIZE, true);
buf_size += AVCODEC_MAX_AUDIO_FRAME_SIZE;
}
// read samples from the packet
data_size = buf_size - buf_pos;
/*read_length = avcodec_decode_audio3(m_codecCtx,
- (int16_t*)(((data_t*)buffer->getBuffer())+buf_pos),
+ (int16_t*)(((data_t*)buffer.getBuffer())+buf_pos),
&data_size,
packet);*/
read_length = avcodec_decode_audio2(m_codecCtx,
- (int16_t*)(((data_t*)buffer->getBuffer())+buf_pos),
- &data_size,
- audio_pkg_data,
- audio_pkg_size);
-
- buf_pos += data_size;
+ (int16_t*)(((data_t*)buffer.getBuffer()) + buf_pos),
+ &data_size,
+ audio_pkg_data,
+ audio_pkg_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;
@@ -81,36 +82,50 @@ int AUD_FFMPEGReader::decode(AVPacket* packet, AUD_Buffer* buffer)
return buf_pos;
}
+static const char* streaminfo_error = "AUD_FFMPEGReader: Stream info couldn't "
+ "be found.";
+static const char* noaudio_error = "AUD_FFMPEGReader: File doesn't include an "
+ "audio stream.";
+static const char* nodecoder_error = "AUD_FFMPEGReader: No decoder found for "
+ "the audio stream.";
+static const char* codecopen_error = "AUD_FFMPEGReader: Codec couldn't be "
+ "opened.";
+static const char* format_error = "AUD_FFMPEGReader: Unsupported sample "
+ "format.";
+
void AUD_FFMPEGReader::init()
{
m_position = 0;
m_pkgbuf_left = 0;
if(av_find_stream_info(m_formatCtx)<0)
- AUD_THROW(AUD_ERROR_FFMPEG);
+ AUD_THROW(AUD_ERROR_FFMPEG, streaminfo_error);
// find audio stream and codec
m_stream = -1;
for(unsigned int i = 0; i < m_formatCtx->nb_streams; i++)
+ {
if((m_formatCtx->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO)
&& (m_stream < 0))
{
m_stream=i;
break;
}
+ }
+
if(m_stream == -1)
- AUD_THROW(AUD_ERROR_FFMPEG);
+ AUD_THROW(AUD_ERROR_FFMPEG, noaudio_error);
m_codecCtx = m_formatCtx->streams[m_stream]->codec;
// get a decoder and open it
AVCodec *aCodec = avcodec_find_decoder(m_codecCtx->codec_id);
if(!aCodec)
- AUD_THROW(AUD_ERROR_FFMPEG);
+ AUD_THROW(AUD_ERROR_FFMPEG, nodecoder_error);
if(avcodec_open(m_codecCtx, aCodec)<0)
- AUD_THROW(AUD_ERROR_FFMPEG);
+ AUD_THROW(AUD_ERROR_FFMPEG, codecopen_error);
// XXX this prints file information to stdout:
//dump_format(m_formatCtx, 0, NULL, 0);
@@ -140,45 +155,49 @@ void AUD_FFMPEGReader::init()
m_specs.format = AUD_FORMAT_FLOAT64;
break;
default:
- AUD_THROW(AUD_ERROR_FILE);
+ AUD_THROW(AUD_ERROR_FFMPEG, format_error);
}
m_specs.rate = (AUD_SampleRate) m_codecCtx->sample_rate;
-
- // last but not least if there hasn't been any error, create the buffers
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
- m_pkgbuf = new AUD_Buffer(AVCODEC_MAX_AUDIO_FRAME_SIZE<<1);
- AUD_NEW("buffer")
}
-AUD_FFMPEGReader::AUD_FFMPEGReader(const char* filename)
-{
- m_byteiocontext = NULL;
+static const char* fileopen_error = "AUD_FFMPEGReader: File couldn't be "
+ "opened.";
+AUD_FFMPEGReader::AUD_FFMPEGReader(std::string filename) :
+ m_pkgbuf(AVCODEC_MAX_AUDIO_FRAME_SIZE<<1),
+ m_byteiocontext(NULL)
+{
// open file
- if(av_open_input_file(&m_formatCtx, filename, NULL, 0, NULL)!=0)
- AUD_THROW(AUD_ERROR_FILE);
+ if(av_open_input_file(&m_formatCtx, filename.c_str(), NULL, 0, NULL)!=0)
+ AUD_THROW(AUD_ERROR_FILE, fileopen_error);
try
{
init();
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
av_close_input_file(m_formatCtx);
throw;
}
}
-AUD_FFMPEGReader::AUD_FFMPEGReader(AUD_Reference<AUD_Buffer> buffer)
+static const char* streamopen_error = "AUD_FFMPEGReader: Stream couldn't be "
+ "opened.";
+
+AUD_FFMPEGReader::AUD_FFMPEGReader(AUD_Reference<AUD_Buffer> buffer) :
+ m_pkgbuf(AVCODEC_MAX_AUDIO_FRAME_SIZE<<1),
+ m_membuffer(buffer)
{
m_byteiocontext = (ByteIOContext*)av_mallocz(sizeof(ByteIOContext));
- AUD_NEW("byteiocontext")
- m_membuffer = buffer;
if(init_put_byte(m_byteiocontext, (data_t*)buffer.get()->getBuffer(),
buffer.get()->getSize(), 0, NULL, NULL, NULL, NULL) != 0)
- AUD_THROW(AUD_ERROR_FILE);
+ {
+ av_free(m_byteiocontext);
+ AUD_THROW(AUD_ERROR_FILE, fileopen_error);
+ }
AVProbeData probe_data;
probe_data.filename = "";
@@ -188,16 +207,19 @@ AUD_FFMPEGReader::AUD_FFMPEGReader(AUD_Reference<AUD_Buffer> buffer)
// open stream
if(av_open_input_stream(&m_formatCtx, m_byteiocontext, "", fmt, NULL)!=0)
- AUD_THROW(AUD_ERROR_FILE);
+ {
+ av_free(m_byteiocontext);
+ AUD_THROW(AUD_ERROR_FILE, streamopen_error);
+ }
try
{
init();
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
av_close_input_stream(m_formatCtx);
- av_free(m_byteiocontext); AUD_DELETE("byteiocontext")
+ av_free(m_byteiocontext);
throw;
}
}
@@ -209,16 +231,13 @@ AUD_FFMPEGReader::~AUD_FFMPEGReader()
if(m_byteiocontext)
{
av_close_input_stream(m_formatCtx);
- av_free(m_byteiocontext); AUD_DELETE("byteiocontext")
+ av_free(m_byteiocontext);
}
else
av_close_input_file(m_formatCtx);
-
- delete m_buffer; AUD_DELETE("buffer")
- delete m_pkgbuf; AUD_DELETE("buffer")
}
-bool AUD_FFMPEGReader::isSeekable()
+bool AUD_FFMPEGReader::isSeekable() const
{
return true;
}
@@ -260,9 +279,17 @@ void AUD_FFMPEGReader::seek(int position)
if(m_position < position)
{
- sample_t* buf;
- int length = position - m_position;
- read(length, buf);
+ // read until we're at the right position
+ int length = AUD_DEFAULT_BUFFER_SIZE;
+ sample_t* buffer;
+ for(int len = position - m_position;
+ length == AUD_DEFAULT_BUFFER_SIZE;
+ len -= AUD_DEFAULT_BUFFER_SIZE)
+ {
+ if(len < AUD_DEFAULT_BUFFER_SIZE)
+ length = len;
+ read(length, buffer);
+ }
}
}
}
@@ -276,33 +303,23 @@ void AUD_FFMPEGReader::seek(int position)
}
}
-int AUD_FFMPEGReader::getLength()
+int AUD_FFMPEGReader::getLength() const
{
// return approximated remaning size
return (int)((m_formatCtx->duration * m_codecCtx->sample_rate)
/ AV_TIME_BASE)-m_position;
}
-int AUD_FFMPEGReader::getPosition()
+int AUD_FFMPEGReader::getPosition() const
{
return m_position;
}
-AUD_Specs AUD_FFMPEGReader::getSpecs()
+AUD_Specs AUD_FFMPEGReader::getSpecs() const
{
return m_specs.specs;
}
-AUD_ReaderType AUD_FFMPEGReader::getType()
-{
- return AUD_TYPE_STREAM;
-}
-
-bool AUD_FFMPEGReader::notify(AUD_Message &message)
-{
- return false;
-}
-
void AUD_FFMPEGReader::read(int & length, sample_t* & buffer)
{
// read packages and decode them
@@ -313,10 +330,10 @@ void AUD_FFMPEGReader::read(int & length, sample_t* & buffer)
int sample_size = AUD_DEVICE_SAMPLE_SIZE(m_specs);
// resize output buffer if necessary
- if(m_buffer->getSize() < length * AUD_SAMPLE_SIZE(m_specs))
- m_buffer->resize(length * AUD_SAMPLE_SIZE(m_specs));
+ if(m_buffer.getSize() < length * AUD_SAMPLE_SIZE(m_specs))
+ m_buffer.resize(length * AUD_SAMPLE_SIZE(m_specs));
- buffer = m_buffer->getBuffer();
+ buffer = m_buffer.getBuffer();
pkgbuf_pos = m_pkgbuf_left;
m_pkgbuf_left = 0;
@@ -324,7 +341,7 @@ void AUD_FFMPEGReader::read(int & length, sample_t* & buffer)
if(pkgbuf_pos > 0)
{
data_size = AUD_MIN(pkgbuf_pos, left * sample_size);
- m_convert((data_t*) buffer, (data_t*) m_pkgbuf->getBuffer(),
+ m_convert((data_t*) buffer, (data_t*) m_pkgbuf.getBuffer(),
data_size / AUD_FORMAT_SIZE(m_specs.format));
buffer += data_size / AUD_FORMAT_SIZE(m_specs.format);
left -= data_size/sample_size;
@@ -341,7 +358,7 @@ void AUD_FFMPEGReader::read(int & length, sample_t* & buffer)
// copy to output buffer
data_size = AUD_MIN(pkgbuf_pos, left * sample_size);
- m_convert((data_t*) buffer, (data_t*) m_pkgbuf->getBuffer(),
+ m_convert((data_t*) buffer, (data_t*) m_pkgbuf.getBuffer(),
data_size / AUD_FORMAT_SIZE(m_specs.format));
buffer += data_size / AUD_FORMAT_SIZE(m_specs.format);
left -= data_size/sample_size;
@@ -352,12 +369,12 @@ void AUD_FFMPEGReader::read(int & length, sample_t* & buffer)
if(pkgbuf_pos > data_size)
{
m_pkgbuf_left = pkgbuf_pos-data_size;
- memmove(m_pkgbuf->getBuffer(),
- ((data_t*)m_pkgbuf->getBuffer())+data_size,
+ memmove(m_pkgbuf.getBuffer(),
+ ((data_t*)m_pkgbuf.getBuffer())+data_size,
pkgbuf_pos-data_size);
}
- buffer = m_buffer->getBuffer();
+ buffer = m_buffer.getBuffer();
if(left > 0)
length -= left;
diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h
index f992fdf7a34..8ebf5b45cdc 100644
--- a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h
+++ b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h
@@ -29,7 +29,9 @@
#include "AUD_ConverterFunctions.h"
#include "AUD_IReader.h"
#include "AUD_Reference.h"
-class AUD_Buffer;
+#include "AUD_Buffer.h"
+
+#include <string>
struct AVCodecContext;
extern "C" {
@@ -55,7 +57,7 @@ private:
/**
* The playback buffer.
*/
- AUD_Buffer *m_buffer;
+ AUD_Buffer m_buffer;
/**
* The specification of the audio data.
@@ -65,7 +67,7 @@ private:
/**
* The buffer for package reading.
*/
- AUD_Buffer *m_pkgbuf;
+ AUD_Buffer m_pkgbuf;
/**
* The count of samples still available from the last read package.
@@ -108,13 +110,17 @@ private:
* \param buffer The target buffer.
* \return The count of read bytes.
*/
- int decode(AVPacket* packet, AUD_Buffer* buffer);
+ int decode(AVPacket* packet, AUD_Buffer& buffer);
/**
* Initializes the object.
*/
void init();
+ // hide copy constructor and operator=
+ AUD_FFMPEGReader(const AUD_FFMPEGReader&);
+ AUD_FFMPEGReader& operator=(const AUD_FFMPEGReader&);
+
public:
/**
* Creates a new reader.
@@ -122,7 +128,7 @@ public:
* \exception AUD_Exception Thrown if the file specified does not exist or
* cannot be read with ffmpeg.
*/
- AUD_FFMPEGReader(const char* filename);
+ AUD_FFMPEGReader(std::string filename);
/**
* Creates a new reader.
@@ -137,13 +143,11 @@ public:
*/
virtual ~AUD_FFMPEGReader();
- virtual bool isSeekable();
+ virtual bool isSeekable() const;
virtual void seek(int position);
- virtual int getLength();
- virtual int getPosition();
- virtual AUD_Specs getSpecs();
- virtual AUD_ReaderType getType();
- virtual bool notify(AUD_Message &message);
+ virtual int getLength() const;
+ virtual int getPosition() const;
+ virtual AUD_Specs getSpecs() const;
virtual void read(int & length, sample_t* & buffer);
};
diff --git a/intern/audaspace/fftw/AUD_BandPassReader.h b/intern/audaspace/fftw/AUD_BandPassReader.h
index 7a8fd3b94d5..bb63a3ec818 100644
--- a/intern/audaspace/fftw/AUD_BandPassReader.h
+++ b/intern/audaspace/fftw/AUD_BandPassReader.h
@@ -83,7 +83,6 @@ public:
* \param reader The reader to read from.
* \param low The lowest passed frequency.
* \param high The highest passed frequency.
- * \exception AUD_Exception Thrown if the reader specified is NULL.
*/
AUD_BandPassReader(AUD_IReader* reader, float low, float high);
diff --git a/intern/audaspace/intern/AUD_3DMath.h b/intern/audaspace/intern/AUD_3DMath.h
new file mode 100644
index 00000000000..390bb1b8467
--- /dev/null
+++ b/intern/audaspace/intern/AUD_3DMath.h
@@ -0,0 +1,189 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN LGPL LICENSE BLOCK *****
+ *
+ * Copyright 2009 Jörg Hermann Müller
+ *
+ * This file is part of AudaSpace.
+ *
+ * AudaSpace is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AudaSpace is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * ***** END LGPL LICENSE BLOCK *****
+ */
+
+#ifndef AUD_3DMATH
+#define AUD_3DMATH
+
+class AUD_Quaternion
+{
+private:
+ union
+ {
+ float m_v[4];
+ struct
+ {
+ float m_w;
+ float m_x;
+ float m_y;
+ float m_z;
+ };
+ };
+
+public:
+ /**
+ * Creates a new quaternion.
+ * \param w The w component.
+ * \param x The x component.
+ * \param y The y component.
+ * \param z The z component.
+ */
+ inline AUD_Quaternion(float w, float x, float y, float z) :
+ m_w(w), m_x(x), m_y(y), m_z(z)
+ {
+ }
+
+ /**
+ * Retrieves the w component of the quarternion.
+ * \return The w component.
+ */
+ inline const float& w() const
+ {
+ return m_w;
+ }
+
+ /**
+ * Retrieves the x component of the quarternion.
+ * \return The x component.
+ */
+ inline const float& x() const
+ {
+ return m_x;
+ }
+
+ /**
+ * Retrieves the y component of the quarternion.
+ * \return The y component.
+ */
+ inline const float& y() const
+ {
+ return m_y;
+ }
+
+ /**
+ * Retrieves the z component of the quarternion.
+ * \return The z component.
+ */
+ inline const float& z() const
+ {
+ return m_z;
+ }
+
+ /**
+ * Retrieves the components of the vector.
+ * \param destination Where the 4 float values should be saved to.
+ */
+ inline void get(float* destination) const
+ {
+ destination[0] = m_w;
+ destination[1] = m_x;
+ destination[2] = m_y;
+ destination[3] = m_z;
+ }
+
+ /**
+ * Retrieves the components of the vector.
+ * \return The components as float[4].
+ */
+ inline const float* get() const
+ {
+ return m_v;
+ }
+};
+
+class AUD_Vector3
+{
+private:
+ union
+ {
+ float m_v[3];
+ struct
+ {
+ float m_x;
+ float m_y;
+ float m_z;
+ };
+ };
+
+public:
+ /**
+ * Creates a new 3 dimensional vector.
+ * \param x The x component.
+ * \param y The y component.
+ * \param z The z component.
+ */
+ inline AUD_Vector3(float x, float y, float z) :
+ m_x(x), m_y(y), m_z(z)
+ {
+ }
+
+ /**
+ * Retrieves the x component of the vector.
+ * \return The x component.
+ */
+ inline const float& x() const
+ {
+ return m_x;
+ }
+
+ /**
+ * Retrieves the y component of the vector.
+ * \return The y component.
+ */
+ inline const float& y() const
+ {
+ return m_y;
+ }
+
+ /**
+ * Retrieves the z component of the vector.
+ * \return The z component.
+ */
+ inline const float& z() const
+ {
+ return m_z;
+ }
+
+ /**
+ * Retrieves the components of the vector.
+ * \param destination Where the 3 float values should be saved to.
+ */
+ inline void get(float* destination) const
+ {
+ destination[0] = m_x;
+ destination[1] = m_y;
+ destination[2] = m_z;
+ }
+
+ /**
+ * Retrieves the components of the vector.
+ * \return The components as float[3].
+ */
+ inline const float* get() const
+ {
+ return m_v;
+ }
+};
+
+#endif //AUD_3DMATH
diff --git a/intern/audaspace/intern/AUD_Buffer.cpp b/intern/audaspace/intern/AUD_Buffer.cpp
index a8e74a023bf..11eed399ca5 100644
--- a/intern/audaspace/intern/AUD_Buffer.cpp
+++ b/intern/audaspace/intern/AUD_Buffer.cpp
@@ -34,34 +34,37 @@
AUD_Buffer::AUD_Buffer(int size)
{
m_size = size;
- m_buffer = (data_t*) malloc(size+16); AUD_NEW("buffer")
+ m_buffer = (data_t*) malloc(size+16);
}
AUD_Buffer::~AUD_Buffer()
{
- free(m_buffer); AUD_DELETE("buffer")
+ free(m_buffer);
}
-sample_t* AUD_Buffer::getBuffer()
+sample_t* AUD_Buffer::getBuffer() const
{
return (sample_t*) AUD_ALIGN(m_buffer);
}
-int AUD_Buffer::getSize()
+int AUD_Buffer::getSize() const
{
return m_size;
}
void AUD_Buffer::resize(int size, bool keep)
{
- data_t* buffer = (data_t*) malloc(size+16); AUD_NEW("buffer")
-
- // copy old data over if wanted
if(keep)
+ {
+ data_t* buffer = (data_t*) malloc(size + 16);
+
memcpy(AUD_ALIGN(buffer), AUD_ALIGN(m_buffer), AUD_MIN(size, m_size));
- free(m_buffer); AUD_DELETE("buffer")
+ free(m_buffer);
+ m_buffer = buffer;
+ }
+ else
+ m_buffer = (data_t*) realloc(m_buffer, size + 16);
- m_buffer = buffer;
m_size = size;
}
diff --git a/intern/audaspace/intern/AUD_Buffer.h b/intern/audaspace/intern/AUD_Buffer.h
index f745ee6154b..b3889b35ffe 100644
--- a/intern/audaspace/intern/AUD_Buffer.h
+++ b/intern/audaspace/intern/AUD_Buffer.h
@@ -41,6 +41,10 @@ private:
/// The pointer to the buffer memory.
data_t* m_buffer;
+ // hide copy constructor and operator=
+ AUD_Buffer(const AUD_Buffer&);
+ AUD_Buffer& operator=(const AUD_Buffer&);
+
public:
/**
* Creates a new buffer.
@@ -56,12 +60,12 @@ public:
/**
* Returns the pointer to the buffer in memory.
*/
- sample_t* getBuffer();
+ sample_t* getBuffer() const;
/**
* Returns the size of the buffer in bytes.
*/
- int getSize();
+ int getSize() const;
/**
* Resizes the buffer.
diff --git a/intern/audaspace/intern/AUD_BufferReader.cpp b/intern/audaspace/intern/AUD_BufferReader.cpp
index 0101de338bd..d3af549a868 100644
--- a/intern/audaspace/intern/AUD_BufferReader.cpp
+++ b/intern/audaspace/intern/AUD_BufferReader.cpp
@@ -28,53 +28,36 @@
#include "AUD_Space.h"
AUD_BufferReader::AUD_BufferReader(AUD_Reference<AUD_Buffer> buffer,
- AUD_Specs specs)
+ AUD_Specs specs) :
+ m_position(0), m_buffer(buffer), m_specs(specs)
{
- m_position = 0;
- m_buffer = buffer;
- m_specs = specs;
}
-bool AUD_BufferReader::isSeekable()
+bool AUD_BufferReader::isSeekable() const
{
return true;
}
void AUD_BufferReader::seek(int position)
{
- if(position < 0)
- m_position = 0;
- else if(position > m_buffer.get()->getSize() / AUD_SAMPLE_SIZE(m_specs))
- m_position = m_buffer.get()->getSize() / AUD_SAMPLE_SIZE(m_specs);
- else
- m_position = position;
+ m_position = position;
}
-int AUD_BufferReader::getLength()
+int AUD_BufferReader::getLength() const
{
- return m_buffer.get()->getSize()/AUD_SAMPLE_SIZE(m_specs);
+ return m_buffer.get()->getSize() / AUD_SAMPLE_SIZE(m_specs);
}
-int AUD_BufferReader::getPosition()
+int AUD_BufferReader::getPosition() const
{
return m_position;
}
-AUD_Specs AUD_BufferReader::getSpecs()
+AUD_Specs AUD_BufferReader::getSpecs() const
{
return m_specs;
}
-AUD_ReaderType AUD_BufferReader::getType()
-{
- return AUD_TYPE_BUFFER;
-}
-
-bool AUD_BufferReader::notify(AUD_Message &message)
-{
- return false;
-}
-
void AUD_BufferReader::read(int & length, sample_t* & buffer)
{
int sample_size = AUD_SAMPLE_SIZE(m_specs);
diff --git a/intern/audaspace/intern/AUD_BufferReader.h b/intern/audaspace/intern/AUD_BufferReader.h
index f2d8ff6b57d..a8bd89060b0 100644
--- a/intern/audaspace/intern/AUD_BufferReader.h
+++ b/intern/audaspace/intern/AUD_BufferReader.h
@@ -53,6 +53,10 @@ private:
*/
AUD_Specs m_specs;
+ // hide copy constructor and operator=
+ AUD_BufferReader(const AUD_BufferReader&);
+ AUD_BufferReader& operator=(const AUD_BufferReader&);
+
public:
/**
* Creates a new buffer reader.
@@ -61,13 +65,11 @@ public:
*/
AUD_BufferReader(AUD_Reference<AUD_Buffer> buffer, AUD_Specs specs);
- virtual bool isSeekable();
+ virtual bool isSeekable() const;
virtual void seek(int position);
- virtual int getLength();
- virtual int getPosition();
- virtual AUD_Specs getSpecs();
- virtual AUD_ReaderType getType();
- virtual bool notify(AUD_Message &message);
+ virtual int getLength() const;
+ virtual int getPosition() const;
+ virtual AUD_Specs getSpecs() const;
virtual void read(int & length, sample_t* & buffer);
};
diff --git a/intern/audaspace/intern/AUD_C-API.cpp b/intern/audaspace/intern/AUD_C-API.cpp
index f7394e36c4d..5ca0b0d60b4 100644
--- a/intern/audaspace/intern/AUD_C-API.cpp
+++ b/intern/audaspace/intern/AUD_C-API.cpp
@@ -23,6 +23,19 @@
* ***** END LGPL LICENSE BLOCK *****
*/
+// needed for INT64_C
+#ifndef __STDC_CONSTANT_MACROS
+#define __STDC_CONSTANT_MACROS
+#endif
+
+#ifndef DISABLE_PYTHON
+#include "AUD_PyInit.h"
+#include "AUD_PyAPI.h"
+
+Device* g_device;
+bool g_pyinitialized = false;
+#endif
+
#include <cstdlib>
#include <cstring>
#include <cmath>
@@ -46,9 +59,9 @@
#include "AUD_ChannelMapperFactory.h"
#include "AUD_Buffer.h"
#include "AUD_ReadDevice.h"
-#include "AUD_SourceCaps.h"
#include "AUD_IReader.h"
#include "AUD_SequencerFactory.h"
+#include "AUD_SilenceFactory.h"
#ifdef WITH_SDL
#include "AUD_SDLDevice.h"
@@ -62,6 +75,7 @@
#include "AUD_JackDevice.h"
#endif
+
#ifdef WITH_FFMPEG
extern "C" {
#include <libavformat/avformat.h>
@@ -72,6 +86,7 @@ extern "C" {
typedef AUD_IFactory AUD_Sound;
typedef AUD_ReadDevice AUD_Device;
+typedef AUD_Handle AUD_Channel;
#define AUD_CAPI_IMPLEMENTATION
#include "AUD_C-API.h"
@@ -84,11 +99,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)
@@ -113,7 +132,7 @@ int AUD_init(AUD_DeviceType device, AUD_DeviceSpecs specs, int buffersize)
#endif
#ifdef WITH_JACK
case AUD_JACK_DEVICE:
- dev = new AUD_JackDevice(specs, buffersize);
+ dev = new AUD_JackDevice("Blender", specs, buffersize);
break;
#endif
default:
@@ -121,12 +140,22 @@ int AUD_init(AUD_DeviceType device, AUD_DeviceSpecs specs, int buffersize)
}
AUD_device = dev;
- if(AUD_device->checkCapability(AUD_CAPS_3D_DEVICE))
- AUD_3ddevice = dynamic_cast<AUD_I3DDevice*>(AUD_device);
+ AUD_3ddevice = dynamic_cast<AUD_I3DDevice*>(AUD_device);
+
+#ifndef DISABLE_PYTHON
+ if(g_pyinitialized)
+ {
+ g_device = (Device*)Device_empty();
+ if(g_device != NULL)
+ {
+ g_device->device = dev;
+ }
+ }
+#endif
return true;
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
return false;
}
@@ -150,13 +179,55 @@ int* AUD_enumDevices()
void AUD_exit()
{
- if(AUD_device)
+#ifndef DISABLE_PYTHON
+ if(g_device)
{
+ Py_XDECREF(g_device);
+ g_device = NULL;
+ }
+ else
+#endif
+ if(AUD_device)
delete AUD_device;
- AUD_device = NULL;
- AUD_3ddevice = NULL;
+ AUD_device = NULL;
+ AUD_3ddevice = NULL;
+}
+
+#ifndef DISABLE_PYTHON
+static PyObject* AUD_getCDevice(PyObject* self)
+{
+ if(g_device)
+ {
+ Py_INCREF(g_device);
+ return (PyObject*)g_device;
+ }
+ Py_RETURN_NONE;
+}
+
+static PyMethodDef meth_getcdevice[] = {{ "device", (PyCFunction)AUD_getCDevice, METH_NOARGS,
+ "device()\n\n"
+ "Returns the application's :class:`Device`.\n\n"
+ ":return: The application's :class:`Device`.\n"
+ ":rtype: :class:`Device`"}};
+
+PyObject* AUD_initPython()
+{
+ PyObject* module = PyInit_aud();
+ PyModule_AddObject(module, "device", (PyObject *)PyCFunction_New(meth_getcdevice, NULL));
+ PyDict_SetItemString(PySys_GetObject("modules"), "aud", module);
+ if(AUD_device)
+ {
+ g_device = (Device*)Device_empty();
+ if(g_device != NULL)
+ {
+ g_device->device = AUD_device;
+ }
}
+ g_pyinitialized = true;
+
+ return module;
}
+#endif
void AUD_lock()
{
@@ -174,20 +245,23 @@ AUD_SoundInfo AUD_getInfo(AUD_Sound* sound)
{
assert(sound);
- AUD_IReader* reader = sound->createReader();
-
AUD_SoundInfo info;
+ info.specs.channels = AUD_CHANNELS_INVALID;
+ info.specs.rate = AUD_RATE_INVALID;
+ info.length = 0.0f;
- if(reader)
+ try
{
- info.specs = reader->getSpecs();
- info.length = reader->getLength() / (float) info.specs.rate;
+ AUD_IReader* reader = sound->createReader();
+
+ if(reader)
+ {
+ info.specs = reader->getSpecs();
+ info.length = reader->getLength() / (float) info.specs.rate;
+ }
}
- else
+ catch(AUD_Exception&)
{
- info.specs.channels = AUD_CHANNELS_INVALID;
- info.specs.rate = AUD_RATE_INVALID;
- info.length = 0.0f;
}
return info;
@@ -213,7 +287,7 @@ AUD_Sound* AUD_bufferSound(AUD_Sound* sound)
{
return new AUD_StreamBufferFactory(sound);
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
return NULL;
}
@@ -227,7 +301,7 @@ AUD_Sound* AUD_delaySound(AUD_Sound* sound, float delay)
{
return new AUD_DelayFactory(sound, delay);
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
return NULL;
}
@@ -241,7 +315,7 @@ AUD_Sound* AUD_limitSound(AUD_Sound* sound, float start, float end)
{
return new AUD_LimiterFactory(sound, start, end);
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
return NULL;
}
@@ -255,7 +329,7 @@ AUD_Sound* AUD_pingpongSound(AUD_Sound* sound)
{
return new AUD_PingPongFactory(sound);
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
return NULL;
}
@@ -269,26 +343,21 @@ AUD_Sound* AUD_loopSound(AUD_Sound* sound)
{
return new AUD_LoopFactory(sound);
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
return NULL;
}
}
-int AUD_setLoop(AUD_Handle* handle, int loops, float time)
+int AUD_setLoop(AUD_Channel* handle, int loops)
{
if(handle)
{
- AUD_Message message;
- message.type = AUD_MSG_LOOP;
- message.loopcount = loops;
- message.time = time;
-
try
{
- return AUD_device->sendMessage(handle, message);
+ return AUD_device->setLoopCount(handle, loops);
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
}
}
@@ -303,7 +372,7 @@ AUD_Sound* AUD_rectifySound(AUD_Sound* sound)
{
return new AUD_RectifyFactory(sound);
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
return NULL;
}
@@ -315,7 +384,7 @@ void AUD_unload(AUD_Sound* sound)
delete sound;
}
-AUD_Handle* AUD_play(AUD_Sound* sound, int keep)
+AUD_Channel* AUD_play(AUD_Sound* sound, int keep)
{
assert(AUD_device);
assert(sound);
@@ -323,207 +392,309 @@ AUD_Handle* AUD_play(AUD_Sound* sound, int keep)
{
return AUD_device->play(sound, keep);
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
return NULL;
}
}
-int AUD_pause(AUD_Handle* handle)
+int AUD_pause(AUD_Channel* handle)
{
assert(AUD_device);
return AUD_device->pause(handle);
}
-int AUD_resume(AUD_Handle* handle)
+int AUD_resume(AUD_Channel* handle)
{
assert(AUD_device);
return AUD_device->resume(handle);
}
-int AUD_stop(AUD_Handle* handle)
+int AUD_stop(AUD_Channel* handle)
{
if(AUD_device)
return AUD_device->stop(handle);
return false;
}
-int AUD_setKeep(AUD_Handle* handle, int keep)
+int AUD_setKeep(AUD_Channel* handle, int keep)
{
assert(AUD_device);
return AUD_device->setKeep(handle, keep);
}
-int AUD_seek(AUD_Handle* handle, float seekTo)
+int AUD_seek(AUD_Channel* handle, float seekTo)
{
assert(AUD_device);
return AUD_device->seek(handle, seekTo);
}
-float AUD_getPosition(AUD_Handle* handle)
+float AUD_getPosition(AUD_Channel* handle)
{
assert(AUD_device);
return AUD_device->getPosition(handle);
}
-AUD_Status AUD_getStatus(AUD_Handle* handle)
+AUD_Status AUD_getStatus(AUD_Channel* handle)
{
assert(AUD_device);
return AUD_device->getStatus(handle);
}
-AUD_Handle* AUD_play3D(AUD_Sound* sound, int keep)
+int AUD_setListenerLocation(const float* location)
{
assert(AUD_device);
- assert(sound);
- try
+ if(AUD_3ddevice)
{
- if(AUD_3ddevice)
- return AUD_3ddevice->play3D(sound, keep);
- else
- return AUD_device->play(sound, keep);
+ AUD_Vector3 v(location[0], location[1], location[2]);
+ AUD_3ddevice->setListenerLocation(v);
+ return true;
}
- catch(AUD_Exception)
+
+ return false;
+}
+
+int AUD_setListenerVelocity(const float* velocity)
+{
+ assert(AUD_device);
+
+ if(AUD_3ddevice)
{
- return NULL;
+ AUD_Vector3 v(velocity[0], velocity[1], velocity[2]);
+ AUD_3ddevice->setListenerVelocity(v);
+ return true;
}
+
+ return false;
}
-int AUD_updateListener(AUD_3DData* data)
+int AUD_setListenerOrientation(const float* orientation)
{
assert(AUD_device);
- assert(data);
- try
+ if(AUD_3ddevice)
{
- if(AUD_3ddevice)
- return AUD_3ddevice->updateListener(*data);
+ AUD_Quaternion q(orientation[3], orientation[0], orientation[1], orientation[2]);
+ AUD_3ddevice->setListenerOrientation(q);
+ return true;
}
- catch(AUD_Exception)
+
+ return false;
+}
+
+int AUD_setSpeedOfSound(float speed)
+{
+ assert(AUD_device);
+
+ if(AUD_3ddevice)
{
+ AUD_3ddevice->setSpeedOfSound(speed);
+ return true;
}
+
return false;
}
-int AUD_set3DSetting(AUD_3DSetting setting, float value)
+int AUD_setDopplerFactor(float factor)
{
assert(AUD_device);
- try
+ if(AUD_3ddevice)
{
- if(AUD_3ddevice)
- return AUD_3ddevice->setSetting(setting, value);
+ AUD_3ddevice->setDopplerFactor(factor);
+ return true;
}
- catch(AUD_Exception)
+
+ return false;
+}
+
+int AUD_setDistanceModel(AUD_DistanceModel model)
+{
+ assert(AUD_device);
+
+ if(AUD_3ddevice)
{
+ AUD_3ddevice->setDistanceModel(model);
+ return true;
}
+
return false;
}
-float AUD_get3DSetting(AUD_3DSetting setting)
+int AUD_setSourceLocation(AUD_Channel* handle, const float* location)
{
assert(AUD_device);
- try
+ if(AUD_3ddevice)
{
- if(AUD_3ddevice)
- return AUD_3ddevice->getSetting(setting);
+ AUD_Vector3 v(location[0], location[1], location[2]);
+ return AUD_3ddevice->setSourceLocation(handle, v);
}
- catch(AUD_Exception)
+
+ return false;
+}
+
+int AUD_setSourceVelocity(AUD_Channel* handle, const float* velocity)
+{
+ assert(AUD_device);
+
+ if(AUD_3ddevice)
{
+ AUD_Vector3 v(velocity[0], velocity[1], velocity[2]);
+ return AUD_3ddevice->setSourceVelocity(handle, v);
}
- return 0.0f;
+
+ return false;
}
-int AUD_update3DSource(AUD_Handle* handle, AUD_3DData* data)
+int AUD_setSourceOrientation(AUD_Channel* handle, const float* orientation)
{
- if(handle)
+ assert(AUD_device);
+
+ if(AUD_3ddevice)
{
- assert(AUD_device);
- assert(data);
+ AUD_Quaternion q(orientation[3], orientation[0], orientation[1], orientation[2]);
+ return AUD_3ddevice->setSourceOrientation(handle, q);
+ }
- try
- {
- if(AUD_3ddevice)
- return AUD_3ddevice->updateSource(handle, *data);
- }
- catch(AUD_Exception)
- {
- }
+ return false;
+}
+
+int AUD_setRelative(AUD_Channel* handle, int relative)
+{
+ assert(AUD_device);
+
+ if(AUD_3ddevice)
+ {
+ return AUD_3ddevice->setRelative(handle, relative);
}
+
return false;
}
-int AUD_set3DSourceSetting(AUD_Handle* handle,
- AUD_3DSourceSetting setting, float value)
+int AUD_setVolumeMaximum(AUD_Channel* handle, float volume)
{
- if(handle)
+ assert(AUD_device);
+
+ if(AUD_3ddevice)
{
- assert(AUD_device);
+ return AUD_3ddevice->setVolumeMaximum(handle, volume);
+ }
- try
- {
- if(AUD_3ddevice)
- return AUD_3ddevice->setSourceSetting(handle, setting, value);
- }
- catch(AUD_Exception)
- {
- }
+ return false;
+}
+
+int AUD_setVolumeMinimum(AUD_Channel* handle, float volume)
+{
+ assert(AUD_device);
+
+ if(AUD_3ddevice)
+ {
+ return AUD_3ddevice->setVolumeMinimum(handle, volume);
}
+
return false;
}
-float AUD_get3DSourceSetting(AUD_Handle* handle, AUD_3DSourceSetting setting)
+int AUD_setDistanceMaximum(AUD_Channel* handle, float distance)
{
- if(handle)
+ assert(AUD_device);
+
+ if(AUD_3ddevice)
{
- assert(AUD_device);
+ return AUD_3ddevice->setDistanceMaximum(handle, distance);
+ }
- try
- {
- if(AUD_3ddevice)
- return AUD_3ddevice->getSourceSetting(handle, setting);
- }
- catch(AUD_Exception)
- {
- }
+ return false;
+}
+
+int AUD_setDistanceReference(AUD_Channel* handle, float distance)
+{
+ assert(AUD_device);
+
+ if(AUD_3ddevice)
+ {
+ return AUD_3ddevice->setDistanceReference(handle, distance);
}
- return 0.0f;
+
+ return false;
}
-int AUD_setSoundVolume(AUD_Handle* handle, float volume)
+int AUD_setAttenuation(AUD_Channel* handle, float factor)
+{
+ assert(AUD_device);
+
+ if(AUD_3ddevice)
+ {
+ return AUD_3ddevice->setAttenuation(handle, factor);
+ }
+
+ return false;
+}
+
+int AUD_setConeAngleOuter(AUD_Channel* handle, float angle)
+{
+ assert(AUD_device);
+
+ if(AUD_3ddevice)
+ {
+ return AUD_3ddevice->setConeAngleOuter(handle, angle);
+ }
+
+ return false;
+}
+
+int AUD_setConeAngleInner(AUD_Channel* handle, float angle)
+{
+ assert(AUD_device);
+
+ if(AUD_3ddevice)
+ {
+ return AUD_3ddevice->setConeAngleInner(handle, angle);
+ }
+
+ return false;
+}
+
+int AUD_setConeVolumeOuter(AUD_Channel* handle, float volume)
+{
+ assert(AUD_device);
+
+ if(AUD_3ddevice)
+ {
+ return AUD_3ddevice->setConeVolumeOuter(handle, volume);
+ }
+
+ return false;
+}
+
+int AUD_setSoundVolume(AUD_Channel* handle, float volume)
{
if(handle)
{
assert(AUD_device);
- AUD_SourceCaps caps;
- caps.handle = handle;
- caps.value = volume;
try
{
- return AUD_device->setCapability(AUD_CAPS_SOURCE_VOLUME, &caps);
+ return AUD_device->setVolume(handle, volume);
}
- catch(AUD_Exception) {}
+ catch(AUD_Exception&) {}
}
return false;
}
-int AUD_setSoundPitch(AUD_Handle* handle, float pitch)
+int AUD_setSoundPitch(AUD_Channel* handle, float pitch)
{
if(handle)
{
assert(AUD_device);
- AUD_SourceCaps caps;
- caps.handle = handle;
- caps.value = pitch;
try
{
- return AUD_device->setCapability(AUD_CAPS_SOURCE_PITCH, &caps);
+ return AUD_device->setPitch(handle, pitch);
}
- catch(AUD_Exception) {}
+ catch(AUD_Exception&) {}
}
return false;
}
@@ -534,24 +705,24 @@ AUD_Device* AUD_openReadDevice(AUD_DeviceSpecs specs)
{
return new AUD_ReadDevice(specs);
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
return NULL;
}
}
-AUD_Handle* AUD_playDevice(AUD_Device* device, AUD_Sound* sound, float seek)
+AUD_Channel* AUD_playDevice(AUD_Device* device, AUD_Sound* sound, float seek)
{
assert(device);
assert(sound);
try
{
- AUD_Handle* handle = device->play(sound);
+ AUD_Channel* handle = device->play(sound);
device->seek(handle, seek);
return handle;
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
return NULL;
}
@@ -563,28 +734,26 @@ int AUD_setDeviceVolume(AUD_Device* device, float volume)
try
{
- return device->setCapability(AUD_CAPS_VOLUME, &volume);
+ device->setVolume(volume);
+ return true;
}
- catch(AUD_Exception) {}
+ catch(AUD_Exception&) {}
return false;
}
-int AUD_setDeviceSoundVolume(AUD_Device* device, AUD_Handle* handle,
+int AUD_setDeviceSoundVolume(AUD_Device* device, AUD_Channel* handle,
float volume)
{
if(handle)
{
assert(device);
- AUD_SourceCaps caps;
- caps.handle = handle;
- caps.value = volume;
try
{
- return device->setCapability(AUD_CAPS_SOURCE_VOLUME, &caps);
+ return device->setVolume(handle, volume);
}
- catch(AUD_Exception) {}
+ catch(AUD_Exception&) {}
}
return false;
}
@@ -598,7 +767,7 @@ int AUD_readDevice(AUD_Device* device, data_t* buffer, int length)
{
return device->read(buffer, length);
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
return false;
}
@@ -612,7 +781,7 @@ void AUD_closeReadDevice(AUD_Device* device)
{
delete device;
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
}
}
@@ -669,6 +838,32 @@ float* AUD_readSoundBuffer(const char* filename, float low, float high,
return result;
}
+static void pauseSound(AUD_Channel* handle)
+{
+ assert(AUD_device);
+
+ AUD_device->pause(handle);
+}
+
+AUD_Channel* AUD_pauseAfter(AUD_Channel* handle, float seconds)
+{
+ assert(AUD_device);
+
+ AUD_SilenceFactory silence;
+ AUD_LimiterFactory limiter(&silence, 0, seconds);
+
+ try
+ {
+ AUD_Channel* channel = AUD_device->play(&limiter);
+ AUD_device->setStopCallback(channel, (stopCallback)pauseSound, handle);
+ return channel;
+ }
+ catch(AUD_Exception&)
+ {
+ return NULL;
+ }
+}
+
AUD_Sound* AUD_createSequencer(void* data, AUD_volumeFunction volume)
{
/* AUD_XXX should be this: but AUD_createSequencer is called before the device
@@ -711,23 +906,16 @@ void AUD_muteSequencer(AUD_Sound* sequencer, AUD_SequencerEntry* entry, char mut
int AUD_readSound(AUD_Sound* sound, sample_t* buffer, int length)
{
- AUD_IReader* reader = sound->createReader();
AUD_DeviceSpecs specs;
sample_t* buf;
- specs.specs = reader->getSpecs();
+ specs.rate = AUD_RATE_INVALID;
specs.channels = AUD_CHANNELS_MONO;
- specs.format = AUD_FORMAT_FLOAT32;
-
- AUD_ChannelMapperFactory mapper(reader, specs);
+ specs.format = AUD_FORMAT_INVALID;
- if(!reader || reader->getType() != AUD_TYPE_BUFFER)
- return -1;
+ AUD_ChannelMapperFactory mapper(sound, specs);
- reader = mapper.createReader();
-
- if(!reader)
- return -1;
+ AUD_IReader* reader = mapper.createReader();
int len = reader->getLength();
float samplejump = (float)len / (float)length;
@@ -756,7 +944,7 @@ int AUD_readSound(AUD_Sound* sound, sample_t* buffer, int length)
}
}
- delete reader; AUD_DELETE("reader")
+ delete reader;
return length;
}
@@ -779,7 +967,7 @@ void AUD_stopPlayback()
#endif
}
-void AUD_seekSequencer(AUD_Handle* handle, float time)
+void AUD_seekSequencer(AUD_Channel* handle, float time)
{
#ifdef WITH_JACK
AUD_JackDevice* device = dynamic_cast<AUD_JackDevice*>(AUD_device);
@@ -792,7 +980,7 @@ void AUD_seekSequencer(AUD_Handle* handle, float time)
}
}
-float AUD_getSequencerPosition(AUD_Handle* handle)
+float AUD_getSequencerPosition(AUD_Channel* handle)
{
#ifdef WITH_JACK
AUD_JackDevice* device = dynamic_cast<AUD_JackDevice*>(AUD_device);
@@ -823,16 +1011,3 @@ int AUD_doesPlayback()
#endif
return -1;
}
-
-#ifdef AUD_DEBUG_MEMORY
-int AUD_References(int count, const char* text)
-{
- static int m_count = 0;
- m_count += count;
- if(count > 0)
- printf("+%s\n", text);
- if(count < 0)
- printf("-%s\n", text);
- return m_count;
-}
-#endif
diff --git a/intern/audaspace/intern/AUD_C-API.h b/intern/audaspace/intern/AUD_C-API.h
index a7372c29885..4dc074b9288 100644
--- a/intern/audaspace/intern/AUD_C-API.h
+++ b/intern/audaspace/intern/AUD_C-API.h
@@ -48,7 +48,7 @@ typedef struct
#ifndef AUD_CAPI_IMPLEMENTATION
typedef void AUD_Sound;
- typedef void AUD_Handle;
+ typedef void AUD_Channel;
typedef void AUD_Device;
typedef void AUD_SequencerEntry;
typedef float (*AUD_volumeFunction)(void*, void*, float);
@@ -56,6 +56,11 @@ typedef struct
#endif
/**
+ * Initializes FFMPEG if it is enabled.
+ */
+extern void AUD_initOnce();
+
+/**
* Initializes an audio device.
* \param device The device type that should be used.
* \param specs The audio specification to be used.
@@ -149,10 +154,9 @@ extern AUD_Sound* AUD_loopSound(AUD_Sound* sound);
* Sets a remaining loop count of a looping sound that currently plays.
* \param handle The playback handle.
* \param loops The count of remaining loops, -1 for infinity.
- * \param time The time after which playback should stop, -1 for infinity.
* \return Whether the handle is valid.
*/
-extern int AUD_setLoop(AUD_Handle* handle, int loops, float time);
+extern int AUD_setLoop(AUD_Channel* handle, int loops);
/**
* Rectifies a sound.
@@ -174,28 +178,28 @@ extern void AUD_unload(AUD_Sound* sound);
* paused when its end has been reached.
* \return A handle to the played back sound.
*/
-extern AUD_Handle* AUD_play(AUD_Sound* sound, int keep);
+extern AUD_Channel* AUD_play(AUD_Sound* sound, int keep);
/**
* Pauses a played back sound.
* \param handle The handle to the sound.
* \return Whether the handle has been playing or not.
*/
-extern int AUD_pause(AUD_Handle* handle);
+extern int AUD_pause(AUD_Channel* handle);
/**
* Resumes a paused sound.
* \param handle The handle to the sound.
* \return Whether the handle has been paused or not.
*/
-extern int AUD_resume(AUD_Handle* handle);
+extern int AUD_resume(AUD_Channel* handle);
/**
* Stops a playing or paused sound.
* \param handle The handle to the sound.
* \return Whether the handle has been valid or not.
*/
-extern int AUD_stop(AUD_Handle* handle);
+extern int AUD_stop(AUD_Channel* handle);
/**
* Sets the end behaviour of a playing or paused sound.
@@ -204,7 +208,7 @@ extern int AUD_stop(AUD_Handle* handle);
* paused when its end has been reached.
* \return Whether the handle has been valid or not.
*/
-extern int AUD_setKeep(AUD_Handle* handle, int keep);
+extern int AUD_setKeep(AUD_Channel* handle, int keep);
/**
* Seeks a playing or paused sound.
@@ -212,7 +216,7 @@ extern int AUD_setKeep(AUD_Handle* handle, int keep);
* \param seekTo From where the sound file should be played back in seconds.
* \return Whether the handle has been valid or not.
*/
-extern int AUD_seek(AUD_Handle* handle, float seekTo);
+extern int AUD_seek(AUD_Channel* handle, float seekTo);
/**
* Retrieves the playback position of a handle.
@@ -220,74 +224,155 @@ extern int AUD_seek(AUD_Handle* handle, float seekTo);
* \return The current playback position in seconds or 0.0 if the handle is
* invalid.
*/
-extern float AUD_getPosition(AUD_Handle* handle);
+extern float AUD_getPosition(AUD_Channel* handle);
/**
* Returns the status of a playing, paused or stopped sound.
* \param handle The handle to the sound.
* \return The status of the sound behind the handle.
*/
-extern AUD_Status AUD_getStatus(AUD_Handle* handle);
+extern AUD_Status AUD_getStatus(AUD_Channel* handle);
/**
- * Plays a 3D sound.
- * \param sound The handle of the sound file.
- * \param keep When keep is true the sound source will not be deleted but set to
- * paused when its end has been reached.
- * \return A handle to the played back sound.
- * \note The factory must provide a mono (single channel) source and the device
- * must support 3D audio, otherwise the sound is played back normally.
+ * Sets the listener location.
+ * \param location The new location.
+ */
+extern int AUD_setListenerLocation(const float* location);
+
+/**
+ * Sets the listener velocity.
+ * \param velocity The new velocity.
+ */
+extern int AUD_setListenerVelocity(const float* velocity);
+
+/**
+ * Sets the listener orientation.
+ * \param orientation The new orientation as quaternion.
+ */
+extern int AUD_setListenerOrientation(const float* orientation);
+
+/**
+ * Sets the speed of sound.
+ * This value is needed for doppler effect calculation.
+ * \param speed The new speed of sound.
+ */
+extern int AUD_setSpeedOfSound(float speed);
+
+/**
+ * Sets the doppler factor.
+ * This value is a scaling factor for the velocity vectors of sources and
+ * listener which is used while calculating the doppler effect.
+ * \param factor The new doppler factor.
+ */
+extern int AUD_setDopplerFactor(float factor);
+
+/**
+ * Sets the distance model.
+ * \param model distance model.
+ */
+extern int AUD_setDistanceModel(AUD_DistanceModel model);
+
+/**
+ * Sets the location of a source.
+ * \param handle The handle of the source.
+ * \param location The new location.
+ * \return Whether the action succeeded.
*/
-extern AUD_Handle* AUD_play3D(AUD_Sound* sound, int keep);
+extern int AUD_setSourceLocation(AUD_Channel* handle, const float* location);
/**
- * Updates the listener 3D data.
- * \param data The 3D data.
+ * Sets the velocity of a source.
+ * \param handle The handle of the source.
+ * \param velocity The new velocity.
* \return Whether the action succeeded.
*/
-extern int AUD_updateListener(AUD_3DData* data);
+extern int AUD_setSourceVelocity(AUD_Channel* handle, const float* velocity);
/**
- * Sets a 3D device setting.
- * \param setting The setting type.
- * \param value The new setting value.
+ * Sets the orientation of a source.
+ * \param handle The handle of the source.
+ * \param orientation The new orientation as quaternion.
* \return Whether the action succeeded.
*/
-extern int AUD_set3DSetting(AUD_3DSetting setting, float value);
+extern int AUD_setSourceOrientation(AUD_Channel* handle, const float* orientation);
/**
- * Retrieves a 3D device setting.
- * \param setting The setting type.
- * \return The setting value.
+ * Sets whether the source location, velocity and orientation are relative
+ * to the listener.
+ * \param handle The handle of the source.
+ * \param relative Whether the source is relative.
+ * \return Whether the action succeeded.
+ */
+extern int AUD_setRelative(AUD_Channel* handle, int relative);
+
+/**
+ * Sets the maximum volume of a source.
+ * \param handle The handle of the source.
+ * \param volume The new maximum volume.
+ * \return Whether the action succeeded.
+ */
+extern int AUD_setVolumeMaximum(AUD_Channel* handle, float volume);
+
+/**
+ * Sets the minimum volume of a source.
+ * \param handle The handle of the source.
+ * \param volume The new minimum volume.
+ * \return Whether the action succeeded.
+ */
+extern int AUD_setVolumeMinimum(AUD_Channel* handle, float volume);
+
+/**
+ * Sets the maximum distance of a source.
+ * If a source is further away from the reader than this distance, the
+ * volume will automatically be set to 0.
+ * \param handle The handle of the source.
+ * \param distance The new maximum distance.
+ * \return Whether the action succeeded.
*/
-extern float AUD_get3DSetting(AUD_3DSetting setting);
+extern int AUD_setDistanceMaximum(AUD_Channel* handle, float distance);
/**
- * Updates a listeners 3D data.
- * \param handle The source handle.
- * \param data The 3D data.
+ * Sets the reference distance of a source.
+ * \param handle The handle of the source.
+ * \param distance The new reference distance.
* \return Whether the action succeeded.
*/
-extern int AUD_update3DSource(AUD_Handle* handle, AUD_3DData* data);
+extern int AUD_setDistanceReference(AUD_Channel* handle, float distance);
/**
- * Sets a 3D source setting.
- * \param handle The source handle.
- * \param setting The setting type.
- * \param value The new setting value.
+ * Sets the attenuation of a source.
+ * This value is used for distance calculation.
+ * \param handle The handle of the source.
+ * \param factor The new attenuation.
* \return Whether the action succeeded.
*/
-extern int AUD_set3DSourceSetting(AUD_Handle* handle,
- AUD_3DSourceSetting setting, float value);
+extern int AUD_setAttenuation(AUD_Channel* handle, float factor);
/**
- * Retrieves a 3D source setting.
- * \param handle The source handle.
- * \param setting The setting type.
- * \return The setting value.
+ * Sets the outer angle of the cone of a source.
+ * \param handle The handle of the source.
+ * \param angle The new outer angle of the cone.
+ * \return Whether the action succeeded.
*/
-extern float AUD_get3DSourceSetting(AUD_Handle* handle,
- AUD_3DSourceSetting setting);
+extern int AUD_setConeAngleOuter(AUD_Channel* handle, float angle);
+
+/**
+ * Sets the inner angle of the cone of a source.
+ * \param handle The handle of the source.
+ * \param angle The new inner angle of the cone.
+ * \return Whether the action succeeded.
+ */
+extern int AUD_setConeAngleInner(AUD_Channel* handle, float angle);
+
+/**
+ * Sets the outer volume of the cone of a source.
+ * The volume between inner and outer angle is interpolated between inner
+ * volume and this value.
+ * \param handle The handle of the source.
+ * \param volume The new outer volume of the cone.
+ * \return Whether the action succeeded.
+ */
+extern int AUD_setConeVolumeOuter(AUD_Channel* handle, float volume);
/**
* Sets the volume of a played back sound.
@@ -295,7 +380,7 @@ extern float AUD_get3DSourceSetting(AUD_Handle* handle,
* \param volume The new volume, must be between 0.0 and 1.0.
* \return Whether the action succeeded.
*/
-extern int AUD_setSoundVolume(AUD_Handle* handle, float volume);
+extern int AUD_setSoundVolume(AUD_Channel* handle, float volume);
/**
* Sets the pitch of a played back sound.
@@ -303,7 +388,7 @@ extern int AUD_setSoundVolume(AUD_Handle* handle, float volume);
* \param pitch The new pitch.
* \return Whether the action succeeded.
*/
-extern int AUD_setSoundPitch(AUD_Handle* handle, float pitch);
+extern int AUD_setSoundPitch(AUD_Channel* handle, float pitch);
/**
* Opens a read device, with which audio data can be read.
@@ -327,7 +412,7 @@ extern int AUD_setDeviceVolume(AUD_Device* device, float volume);
* \param seek The position where the sound should be seeked to.
* \return A handle to the played back sound.
*/
-extern AUD_Handle* AUD_playDevice(AUD_Device* device, AUD_Sound* sound, float seek);
+extern AUD_Channel* AUD_playDevice(AUD_Device* device, AUD_Sound* sound, float seek);
/**
* Sets the volume of a played back sound of a read device.
@@ -337,7 +422,7 @@ extern AUD_Handle* AUD_playDevice(AUD_Device* device, AUD_Sound* sound, float se
* \return Whether the action succeeded.
*/
extern int AUD_setDeviceSoundVolume(AUD_Device* device,
- AUD_Handle* handle,
+ AUD_Channel* handle,
float volume);
/**
@@ -367,6 +452,14 @@ extern float* AUD_readSoundBuffer(const char* filename, float low, float high,
float sthreshold, int samplerate,
int* length);
+/**
+ * Pauses a playing sound after a specific amount of time.
+ * \param handle The handle to the sound.
+ * \param time The time in seconds.
+ * \return The silence handle.
+ */
+extern AUD_Channel* AUD_pauseAfter(AUD_Channel* handle, float seconds);
+
extern AUD_Sound* AUD_createSequencer(void* data, AUD_volumeFunction volume);
extern void AUD_destroySequencer(AUD_Sound* sequencer);
@@ -388,9 +481,9 @@ extern void AUD_startPlayback();
extern void AUD_stopPlayback();
-extern void AUD_seekSequencer(AUD_Handle* handle, float time);
+extern void AUD_seekSequencer(AUD_Channel* handle, float time);
-extern float AUD_getSequencerPosition(AUD_Handle* handle);
+extern float AUD_getSequencerPosition(AUD_Channel* handle);
#ifdef WITH_JACK
extern void AUD_setSyncCallback(AUD_syncFunction function, void* data);
diff --git a/intern/audaspace/intern/AUD_ChannelMapperFactory.cpp b/intern/audaspace/intern/AUD_ChannelMapperFactory.cpp
index 3420ed16649..b3d5434b1e3 100644
--- a/intern/audaspace/intern/AUD_ChannelMapperFactory.cpp
+++ b/intern/audaspace/intern/AUD_ChannelMapperFactory.cpp
@@ -28,13 +28,6 @@
#include <cstring>
-AUD_ChannelMapperFactory::AUD_ChannelMapperFactory(AUD_IReader* reader,
- AUD_DeviceSpecs specs) :
- AUD_MixerFactory(reader, specs)
-{
- memset(m_mapping, 0, sizeof(m_mapping));
-}
-
AUD_ChannelMapperFactory::AUD_ChannelMapperFactory(AUD_IFactory* factory,
AUD_DeviceSpecs specs) :
AUD_MixerFactory(factory, specs)
@@ -42,12 +35,6 @@ AUD_ChannelMapperFactory::AUD_ChannelMapperFactory(AUD_IFactory* factory,
memset(m_mapping, 0, sizeof(m_mapping));
}
-AUD_ChannelMapperFactory::AUD_ChannelMapperFactory(AUD_DeviceSpecs specs) :
- AUD_MixerFactory(specs)
-{
- memset(m_mapping, 0, sizeof(m_mapping));
-}
-
AUD_ChannelMapperFactory::~AUD_ChannelMapperFactory()
{
for(int i = 1; i < 10; i++)
@@ -72,12 +59,12 @@ float** AUD_ChannelMapperFactory::getMapping(int ic)
{
int channels = m_specs.channels;
- m_mapping[ic] = new float*[channels+1]; AUD_NEW("mapping")
+ m_mapping[ic] = new float*[channels+1];
m_mapping[ic][channels] = 0;
for(int i = 0; i < channels; i++)
{
- m_mapping[ic][i] = new float[ic+1]; AUD_NEW("mapping")
+ m_mapping[ic][i] = new float[ic+1];
for(int j = 0; j <= ic; j++)
m_mapping[ic][i][j] = ((i == j) || (channels == 1) ||
(ic == 0)) ? 1.0f : 0.0f;
@@ -99,27 +86,21 @@ void AUD_ChannelMapperFactory::deleteMapping(int ic)
{
if(m_mapping[ic][i] != 0)
{
- delete[] m_mapping[ic][i]; AUD_DELETE("mapping")
+ delete[] m_mapping[ic][i];
}
else
break;
}
- delete[] m_mapping[ic]; AUD_DELETE("mapping")
+ delete[] m_mapping[ic];
m_mapping[ic] = 0;
}
}
-AUD_IReader* AUD_ChannelMapperFactory::createReader()
+AUD_IReader* AUD_ChannelMapperFactory::createReader() const
{
AUD_IReader* reader = getReader();
+ int ic = reader->getSpecs().channels;
- if(reader != 0)
- {
- int ic = reader->getSpecs().channels;
-
- reader = new AUD_ChannelMapperReader(reader, getMapping(ic));
- AUD_NEW("reader")
- }
-
- return reader;
+ return new AUD_ChannelMapperReader(reader,
+ const_cast<AUD_ChannelMapperFactory*>(this)->getMapping(ic));
}
diff --git a/intern/audaspace/intern/AUD_ChannelMapperFactory.h b/intern/audaspace/intern/AUD_ChannelMapperFactory.h
index a67bfa12123..2f315874421 100644
--- a/intern/audaspace/intern/AUD_ChannelMapperFactory.h
+++ b/intern/audaspace/intern/AUD_ChannelMapperFactory.h
@@ -40,10 +40,12 @@ private:
*/
float **m_mapping[9];
+ // hide copy constructor and operator=
+ AUD_ChannelMapperFactory(const AUD_ChannelMapperFactory&);
+ AUD_ChannelMapperFactory& operator=(const AUD_ChannelMapperFactory&);
+
public:
- AUD_ChannelMapperFactory(AUD_IReader* reader, AUD_DeviceSpecs specs);
AUD_ChannelMapperFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs);
- AUD_ChannelMapperFactory(AUD_DeviceSpecs specs);
virtual ~AUD_ChannelMapperFactory();
@@ -59,7 +61,7 @@ public:
*/
void deleteMapping(int ic);
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_CHANNELMAPPERFACTORY
diff --git a/intern/audaspace/intern/AUD_ChannelMapperReader.cpp b/intern/audaspace/intern/AUD_ChannelMapperReader.cpp
index d78278219e8..71b9f35b3a4 100644
--- a/intern/audaspace/intern/AUD_ChannelMapperReader.cpp
+++ b/intern/audaspace/intern/AUD_ChannelMapperReader.cpp
@@ -24,7 +24,6 @@
*/
#include "AUD_ChannelMapperReader.h"
-#include "AUD_Buffer.h"
AUD_ChannelMapperReader::AUD_ChannelMapperReader(AUD_IReader* reader,
float **mapping) :
@@ -36,7 +35,7 @@ AUD_ChannelMapperReader::AUD_ChannelMapperReader(AUD_IReader* reader,
m_rch = m_specs.channels;
while(mapping[++channels] != 0);
- m_mapping = new float*[channels]; AUD_NEW("mapping")
+ m_mapping = new float*[channels];
m_specs.channels = (AUD_Channels)channels;
float sum;
@@ -44,7 +43,7 @@ AUD_ChannelMapperReader::AUD_ChannelMapperReader(AUD_IReader* reader,
while(channels--)
{
- m_mapping[channels] = new float[m_rch]; AUD_NEW("mapping")
+ m_mapping[channels] = new float[m_rch];
sum = 0.0f;
for(i=0; i < m_rch; i++)
sum += mapping[channels][i];
@@ -52,8 +51,6 @@ AUD_ChannelMapperReader::AUD_ChannelMapperReader(AUD_IReader* reader,
m_mapping[channels][i] = sum > 0.0f ?
mapping[channels][i]/sum : 0.0f;
}
-
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
}
AUD_ChannelMapperReader::~AUD_ChannelMapperReader()
@@ -62,42 +59,37 @@ AUD_ChannelMapperReader::~AUD_ChannelMapperReader()
while(channels--)
{
- delete[] m_mapping[channels]; AUD_DELETE("mapping")
+ delete[] m_mapping[channels];
}
- delete[] m_mapping; AUD_DELETE("mapping")
-
- delete m_buffer; AUD_DELETE("buffer")
+ delete[] m_mapping;
}
-AUD_Specs AUD_ChannelMapperReader::getSpecs()
+AUD_Specs AUD_ChannelMapperReader::getSpecs() const
{
return m_specs;
}
void AUD_ChannelMapperReader::read(int & length, sample_t* & buffer)
{
- m_reader->read(length, buffer);
+ sample_t* in = buffer;
- int channels = m_specs.channels;
+ m_reader->read(length, in);
- if(m_buffer->getSize() < length * 4 * channels)
- m_buffer->resize(length * 4 * channels);
+ if(m_buffer.getSize() < length * AUD_SAMPLE_SIZE(m_specs))
+ m_buffer.resize(length * AUD_SAMPLE_SIZE(m_specs));
- sample_t* in = buffer;
- sample_t* out = m_buffer->getBuffer();
+ buffer = m_buffer.getBuffer();
sample_t sum;
for(int i = 0; i < length; i++)
{
- for(int j = 0; j < channels; j++)
+ for(int j = 0; j < m_specs.channels; j++)
{
sum = 0;
for(int k = 0; k < m_rch; k++)
sum += m_mapping[j][k] * in[i * m_rch + k];
- out[i * channels + j] = sum;
+ buffer[i * m_specs.channels + j] = sum;
}
}
-
- buffer = m_buffer->getBuffer();
}
diff --git a/intern/audaspace/intern/AUD_ChannelMapperReader.h b/intern/audaspace/intern/AUD_ChannelMapperReader.h
index fe79ab6edd6..398e14da55d 100644
--- a/intern/audaspace/intern/AUD_ChannelMapperReader.h
+++ b/intern/audaspace/intern/AUD_ChannelMapperReader.h
@@ -27,7 +27,7 @@
#define AUD_CHANNELMAPPERREADER
#include "AUD_EffectReader.h"
-class AUD_Buffer;
+#include "AUD_Buffer.h"
/**
* This class maps a sound source's channels to a specific output channel count.
@@ -39,7 +39,7 @@ private:
/**
* The sound output buffer.
*/
- AUD_Buffer *m_buffer;
+ AUD_Buffer m_buffer;
/**
* The output specification.
@@ -56,20 +56,24 @@ private:
*/
float **m_mapping;
+ // hide copy constructor and operator=
+ AUD_ChannelMapperReader(const AUD_ChannelMapperReader&);
+ AUD_ChannelMapperReader& operator=(const AUD_ChannelMapperReader&);
+
public:
/**
* Creates a channel mapper reader.
* \param reader The reader to map.
* \param mapping The mapping specification as two dimensional float array.
- * \exception AUD_Exception Thrown if the reader is NULL.
*/
AUD_ChannelMapperReader(AUD_IReader* reader, float **mapping);
+
/**
* Destroys the reader.
*/
~AUD_ChannelMapperReader();
- virtual AUD_Specs getSpecs();
+ virtual AUD_Specs getSpecs() const;
virtual void read(int & length, sample_t* & buffer);
};
diff --git a/intern/audaspace/intern/AUD_ConverterFactory.cpp b/intern/audaspace/intern/AUD_ConverterFactory.cpp
index 1c6d5468251..057d97fe794 100644
--- a/intern/audaspace/intern/AUD_ConverterFactory.cpp
+++ b/intern/audaspace/intern/AUD_ConverterFactory.cpp
@@ -26,29 +26,18 @@
#include "AUD_ConverterFactory.h"
#include "AUD_ConverterReader.h"
-AUD_ConverterFactory::AUD_ConverterFactory(AUD_IReader* reader,
- AUD_DeviceSpecs specs) :
- AUD_MixerFactory(reader, specs) {}
-
AUD_ConverterFactory::AUD_ConverterFactory(AUD_IFactory* factory,
AUD_DeviceSpecs specs) :
- AUD_MixerFactory(factory, specs) {}
-
-AUD_ConverterFactory::AUD_ConverterFactory(AUD_DeviceSpecs specs) :
- AUD_MixerFactory(specs) {}
+ AUD_MixerFactory(factory, specs)
+{
+}
-AUD_IReader* AUD_ConverterFactory::createReader()
+AUD_IReader* AUD_ConverterFactory::createReader() const
{
AUD_IReader* reader = getReader();
- if(reader != 0)
- {
- if(m_specs.format != AUD_FORMAT_FLOAT32)
- {
- reader = new AUD_ConverterReader(reader, m_specs);
- AUD_NEW("reader")
- }
- }
+ if(m_specs.format != AUD_FORMAT_FLOAT32)
+ reader = new AUD_ConverterReader(reader, m_specs);
return reader;
}
diff --git a/intern/audaspace/intern/AUD_ConverterFactory.h b/intern/audaspace/intern/AUD_ConverterFactory.h
index 11ca6c9f0a8..3535616a4a6 100644
--- a/intern/audaspace/intern/AUD_ConverterFactory.h
+++ b/intern/audaspace/intern/AUD_ConverterFactory.h
@@ -34,12 +34,15 @@
*/
class AUD_ConverterFactory : public AUD_MixerFactory
{
+private:
+ // hide copy constructor and operator=
+ AUD_ConverterFactory(const AUD_ConverterFactory&);
+ AUD_ConverterFactory& operator=(const AUD_ConverterFactory&);
+
public:
- AUD_ConverterFactory(AUD_IReader* reader, AUD_DeviceSpecs specs);
AUD_ConverterFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs);
- AUD_ConverterFactory(AUD_DeviceSpecs specs);
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_CONVERTERFACTORY
diff --git a/intern/audaspace/intern/AUD_ConverterReader.cpp b/intern/audaspace/intern/AUD_ConverterReader.cpp
index 808144085bb..379a7c85851 100644
--- a/intern/audaspace/intern/AUD_ConverterReader.cpp
+++ b/intern/audaspace/intern/AUD_ConverterReader.cpp
@@ -24,7 +24,6 @@
*/
#include "AUD_ConverterReader.h"
-#include "AUD_Buffer.h"
AUD_ConverterReader::AUD_ConverterReader(AUD_IReader* reader,
AUD_DeviceSpecs specs) :
@@ -63,16 +62,9 @@ AUD_ConverterReader::AUD_ConverterReader(AUD_IReader* reader,
}
m_specs.format = specs.format;
-
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
-}
-
-AUD_ConverterReader::~AUD_ConverterReader()
-{
- delete m_buffer; AUD_DELETE("buffer")
}
-AUD_Specs AUD_ConverterReader::getSpecs()
+AUD_Specs AUD_ConverterReader::getSpecs() const
{
return m_specs.specs;
}
@@ -83,11 +75,11 @@ void AUD_ConverterReader::read(int & length, sample_t* & buffer)
int samplesize = AUD_SAMPLE_SIZE(m_specs);
- if(m_buffer->getSize() < length*samplesize)
- m_buffer->resize(length*samplesize);
+ if(m_buffer.getSize() < length * samplesize)
+ m_buffer.resize(length * samplesize);
- m_convert((data_t*)m_buffer->getBuffer(), (data_t*)buffer,
+ m_convert((data_t*)m_buffer.getBuffer(), (data_t*)buffer,
length * m_specs.channels);
- buffer = m_buffer->getBuffer();
+ buffer = m_buffer.getBuffer();
}
diff --git a/intern/audaspace/intern/AUD_ConverterReader.h b/intern/audaspace/intern/AUD_ConverterReader.h
index ba49bbfd9ba..64a46fd63e6 100644
--- a/intern/audaspace/intern/AUD_ConverterReader.h
+++ b/intern/audaspace/intern/AUD_ConverterReader.h
@@ -28,7 +28,7 @@
#include "AUD_EffectReader.h"
#include "AUD_ConverterFunctions.h"
-class AUD_Buffer;
+#include "AUD_Buffer.h"
/**
* This class converts a sound source from one to another format.
@@ -39,7 +39,7 @@ private:
/**
* The sound output buffer.
*/
- AUD_Buffer *m_buffer;
+ AUD_Buffer m_buffer;
/**
* The target specification.
@@ -51,20 +51,19 @@ private:
*/
AUD_convert_f m_convert;
+ // hide copy constructor and operator=
+ AUD_ConverterReader(const AUD_ConverterReader&);
+ AUD_ConverterReader& operator=(const AUD_ConverterReader&);
+
public:
/**
* Creates a converter reader.
* \param reader The reader to convert.
* \param specs The target specification.
- * \exception AUD_Exception Thrown if the reader is NULL.
*/
AUD_ConverterReader(AUD_IReader* reader, AUD_DeviceSpecs specs);
- /**
- * Destroys the reader.
- */
- ~AUD_ConverterReader();
- virtual AUD_Specs getSpecs();
+ virtual AUD_Specs getSpecs() const;
virtual void read(int & length, sample_t* & buffer);
};
diff --git a/intern/audaspace/intern/AUD_DefaultMixer.cpp b/intern/audaspace/intern/AUD_DefaultMixer.cpp
new file mode 100644
index 00000000000..12faa10d866
--- /dev/null
+++ b/intern/audaspace/intern/AUD_DefaultMixer.cpp
@@ -0,0 +1,63 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN LGPL LICENSE BLOCK *****
+ *
+ * Copyright 2009 Jörg Hermann Müller
+ *
+ * This file is part of AudaSpace.
+ *
+ * AudaSpace is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AudaSpace is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * ***** END LGPL LICENSE BLOCK *****
+ */
+
+#include "AUD_DefaultMixer.h"
+#include "AUD_SRCResampleReader.h"
+#include "AUD_ChannelMapperReader.h"
+#include "AUD_ChannelMapperFactory.h"
+
+#include <cstring>
+
+AUD_DefaultMixer::AUD_DefaultMixer(AUD_DeviceSpecs specs) :
+ AUD_Mixer(specs)
+{
+}
+
+AUD_IReader* AUD_DefaultMixer::prepare(AUD_IReader* reader)
+{
+ // hacky for now, until a better channel mapper reader is available
+ AUD_ChannelMapperFactory cmf(NULL, m_specs);
+
+ AUD_Specs specs = reader->getSpecs();
+
+ // if channel count is lower in output, rechannel before resampling
+ if(specs.channels < m_specs.channels)
+ {
+ reader = new AUD_ChannelMapperReader(reader,
+ cmf.getMapping(specs.channels));
+ specs.channels = m_specs.channels;
+ }
+
+ // resample
+ if(specs.rate != m_specs.rate)
+ reader = new AUD_SRCResampleReader(reader, m_specs.specs);
+
+ // rechannel
+ if(specs.channels != m_specs.channels)
+ reader = new AUD_ChannelMapperReader(reader,
+ cmf.getMapping(specs.channels));
+
+ return reader;
+}
diff --git a/intern/audaspace/FX/AUD_SumReader.h b/intern/audaspace/intern/AUD_DefaultMixer.h
index 76ccf2f863a..c2f69629c88 100644
--- a/intern/audaspace/FX/AUD_SumReader.h
+++ b/intern/audaspace/intern/AUD_DefaultMixer.h
@@ -23,42 +23,31 @@
* ***** END LGPL LICENSE BLOCK *****
*/
-#ifndef AUD_SUMREADER
-#define AUD_SUMREADER
+#ifndef AUD_DEFAULTMIXER
+#define AUD_DEFAULTMIXER
-#include "AUD_EffectReader.h"
-class AUD_Buffer;
+#include "AUD_Mixer.h"
/**
- * This class represents an summer.
+ * This class is able to mix audiosignals of different channel count and sample
+ * rate and convert it to a specific output format.
+ * It uses a default ChannelMapperFactory and a SRCResampleFactory for
+ * the perparation.
*/
-class AUD_SumReader : public AUD_EffectReader
+class AUD_DefaultMixer : public AUD_Mixer
{
-private:
- /**
- * The playback buffer.
- */
- AUD_Buffer *m_buffer;
-
- /**
- * The sums of the specific channels.
- */
- AUD_Buffer *m_sums;
-
public:
/**
- * Creates a new sum reader.
- * \param reader The reader to read from.
- * \exception AUD_Exception Thrown if the reader specified is NULL.
+ * Creates the mixer.
*/
- AUD_SumReader(AUD_IReader* reader);
+ AUD_DefaultMixer(AUD_DeviceSpecs specs);
/**
- * Destroys the reader.
+ * This funuction prepares a reader for playback.
+ * \param reader The reader to prepare.
+ * \return The reader that should be used for playback.
*/
- virtual ~AUD_SumReader();
-
- virtual void read(int & length, sample_t* & buffer);
+ virtual AUD_IReader* prepare(AUD_IReader* reader);
};
-#endif //AUD_SUMREADER
+#endif //AUD_DEFAULTMIXER
diff --git a/intern/audaspace/intern/AUD_FileFactory.cpp b/intern/audaspace/intern/AUD_FileFactory.cpp
index b63390803b1..986fc6c109a 100644
--- a/intern/audaspace/intern/AUD_FileFactory.cpp
+++ b/intern/audaspace/intern/AUD_FileFactory.cpp
@@ -23,73 +23,59 @@
* ***** END LGPL LICENSE BLOCK *****
*/
+#ifdef WITH_FFMPEG
+// needed for INT64_C
+#ifndef __STDC_CONSTANT_MACROS
+#define __STDC_CONSTANT_MACROS
+#endif
+#include "AUD_FFMPEGReader.h"
+#endif
+
#include "AUD_FileFactory.h"
#include "AUD_Buffer.h"
#include <cstring>
-#ifdef WITH_FFMPEG
-#include "AUD_FFMPEGReader.h"
-#endif
#ifdef WITH_SNDFILE
#include "AUD_SndFileReader.h"
#endif
-AUD_FileFactory::AUD_FileFactory(const char* filename)
+AUD_FileFactory::AUD_FileFactory(std::string filename) :
+ m_filename(filename)
{
- if(filename != NULL)
- {
- m_filename = new char[strlen(filename)+1]; AUD_NEW("string")
- strcpy(m_filename, filename);
- }
- else
- m_filename = NULL;
}
-AUD_FileFactory::AUD_FileFactory(unsigned char* buffer, int size)
+AUD_FileFactory::AUD_FileFactory(const data_t* buffer, int size) :
+ m_buffer(new AUD_Buffer(size))
{
- m_filename = NULL;
- m_buffer = AUD_Reference<AUD_Buffer>(new AUD_Buffer(size));
memcpy(m_buffer.get()->getBuffer(), buffer, size);
}
-AUD_FileFactory::~AUD_FileFactory()
-{
- if(m_filename)
- {
- delete[] m_filename; AUD_DELETE("string")
- }
-}
+static const char* read_error = "AUD_FileFactory: File couldn't be read.";
-AUD_IReader* AUD_FileFactory::createReader()
+AUD_IReader* AUD_FileFactory::createReader() const
{
- AUD_IReader* reader = 0;
-
#ifdef WITH_SNDFILE
try
{
- if(m_filename)
- reader = new AUD_SndFileReader(m_filename);
+ if(m_buffer.get())
+ return new AUD_SndFileReader(m_buffer);
else
- reader = new AUD_SndFileReader(m_buffer);
- AUD_NEW("reader")
- return reader;
+ return new AUD_SndFileReader(m_filename);
}
- catch(AUD_Exception e) {}
+ catch(AUD_Exception&) {}
#endif
#ifdef WITH_FFMPEG
try
{
- if(m_filename)
- reader = new AUD_FFMPEGReader(m_filename);
+ if(m_buffer.get())
+ return new AUD_FFMPEGReader(m_buffer);
else
- reader = new AUD_FFMPEGReader(m_buffer);
- AUD_NEW("reader")
- return reader;
+ return new AUD_FFMPEGReader(m_filename);
}
- catch(AUD_Exception e) {}
+ catch(AUD_Exception&) {}
#endif
- return reader;
+ AUD_THROW(AUD_ERROR_FILE, read_error);
}
diff --git a/intern/audaspace/intern/AUD_FileFactory.h b/intern/audaspace/intern/AUD_FileFactory.h
index 6ab8f280534..9182667d72e 100644
--- a/intern/audaspace/intern/AUD_FileFactory.h
+++ b/intern/audaspace/intern/AUD_FileFactory.h
@@ -30,6 +30,8 @@
#include "AUD_Reference.h"
class AUD_Buffer;
+#include <string>
+
/**
* This factory tries to read a sound file via all available file readers.
*/
@@ -39,33 +41,32 @@ private:
/**
* The filename of the sound source file.
*/
- char* m_filename;
+ std::string m_filename;
/**
* The buffer to read from.
*/
AUD_Reference<AUD_Buffer> m_buffer;
+ // hide copy constructor and operator=
+ AUD_FileFactory(const AUD_FileFactory&);
+ AUD_FileFactory& operator=(const AUD_FileFactory&);
+
public:
/**
* Creates a new factory.
* \param filename The sound file path.
*/
- AUD_FileFactory(const char* filename);
+ AUD_FileFactory(std::string filename);
/**
* Creates a new factory.
* \param buffer The buffer to read from.
* \param size The size of the buffer.
*/
- AUD_FileFactory(unsigned char* buffer, int size);
-
- /**
- * Destroys the factory.
- */
- ~AUD_FileFactory();
+ AUD_FileFactory(const data_t* buffer, int size);
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_FILEFACTORY
diff --git a/intern/audaspace/intern/AUD_I3DDevice.h b/intern/audaspace/intern/AUD_I3DDevice.h
index c36924160de..629b0997d4d 100644
--- a/intern/audaspace/intern/AUD_I3DDevice.h
+++ b/intern/audaspace/intern/AUD_I3DDevice.h
@@ -27,77 +27,288 @@
#define AUD_I3DDEVICE
#include "AUD_Space.h"
+#include "AUD_3DMath.h"
+
+struct AUD_Handle;
/**
* This class represents an output device for 3D sound.
- * Whether a normal device supports this or not can be checked with the
- * AUD_CAPS_3D_DEVICE capability.
*/
class AUD_I3DDevice
{
public:
/**
- * Plays a 3D sound source.
- * \param factory The factory to create the reader for the sound source.
- * \param keep When keep is true the sound source will not be deleted but
- * set to paused when its end has been reached.
- * \return Returns a handle with which the playback can be controlled.
- * This is NULL if the sound couldn't be played back.
- * \exception AUD_Exception Thrown if there's an unexpected (from the
- * device side) error during creation of the reader.
- * \note The factory must provide a mono (single channel) source otherwise
- * the sound is played back normally.
+ * Retrieves the listener location.
+ * \return The listener location.
+ */
+ virtual AUD_Vector3 getListenerLocation() const=0;
+
+ /**
+ * Sets the listener location.
+ * \param location The new location.
+ */
+ virtual void setListenerLocation(const AUD_Vector3& location)=0;
+
+ /**
+ * Retrieves the listener velocity.
+ * \return The listener velocity.
+ */
+ virtual AUD_Vector3 getListenerVelocity() const=0;
+
+ /**
+ * Sets the listener velocity.
+ * \param velocity The new velocity.
+ */
+ virtual void setListenerVelocity(const AUD_Vector3& velocity)=0;
+
+ /**
+ * Retrieves the listener orientation.
+ * \return The listener orientation as quaternion.
+ */
+ virtual AUD_Quaternion getListenerOrientation() const=0;
+
+ /**
+ * Sets the listener orientation.
+ * \param orientation The new orientation as quaternion.
+ */
+ virtual void setListenerOrientation(const AUD_Quaternion& orientation)=0;
+
+
+ /**
+ * Retrieves the speed of sound.
+ * This value is needed for doppler effect calculation.
+ * \return The speed of sound.
+ */
+ virtual float getSpeedOfSound() const=0;
+
+ /**
+ * Sets the speed of sound.
+ * This value is needed for doppler effect calculation.
+ * \param speed The new speed of sound.
+ */
+ virtual void setSpeedOfSound(float speed)=0;
+
+ /**
+ * Retrieves the doppler factor.
+ * This value is a scaling factor for the velocity vectors of sources and
+ * listener which is used while calculating the doppler effect.
+ * \return The doppler factor.
+ */
+ virtual float getDopplerFactor() const=0;
+
+ /**
+ * Sets the doppler factor.
+ * This value is a scaling factor for the velocity vectors of sources and
+ * listener which is used while calculating the doppler effect.
+ * \param factor The new doppler factor.
+ */
+ virtual void setDopplerFactor(float factor)=0;
+
+ /**
+ * Retrieves the distance model.
+ * \return The distance model.
+ */
+ virtual AUD_DistanceModel getDistanceModel() const=0;
+
+ /**
+ * Sets the distance model.
+ * \param model distance model.
+ */
+ virtual void setDistanceModel(AUD_DistanceModel model)=0;
+
+
+
+ /**
+ * Retrieves the location of a source.
+ * \param handle The handle of the source.
+ * \return The location.
+ */
+ virtual AUD_Vector3 getSourceLocation(AUD_Handle* handle)=0;
+
+ /**
+ * Sets the location of a source.
+ * \param handle The handle of the source.
+ * \param location The new location.
+ * \return Whether the action succeeded.
+ */
+ virtual bool setSourceLocation(AUD_Handle* handle, const AUD_Vector3& location)=0;
+
+ /**
+ * Retrieves the velocity of a source.
+ * \param handle The handle of the source.
+ * \return The velocity.
+ */
+ virtual AUD_Vector3 getSourceVelocity(AUD_Handle* handle)=0;
+
+ /**
+ * Sets the velocity of a source.
+ * \param handle The handle of the source.
+ * \param velocity The new velocity.
+ * \return Whether the action succeeded.
+ */
+ virtual bool setSourceVelocity(AUD_Handle* handle, const AUD_Vector3& velocity)=0;
+
+ /**
+ * Retrieves the orientation of a source.
+ * \param handle The handle of the source.
+ * \return The orientation as quaternion.
+ */
+ virtual AUD_Quaternion getSourceOrientation(AUD_Handle* handle)=0;
+
+ /**
+ * Sets the orientation of a source.
+ * \param handle The handle of the source.
+ * \param orientation The new orientation as quaternion.
+ * \return Whether the action succeeded.
+ */
+ virtual bool setSourceOrientation(AUD_Handle* handle, const AUD_Quaternion& orientation)=0;
+
+
+ /**
+ * Checks whether the source location, velocity and orientation are relative
+ * to the listener.
+ * \param handle The handle of the source.
+ * \return Whether the source is relative.
+ */
+ virtual bool isRelative(AUD_Handle* handle)=0;
+
+ /**
+ * Sets whether the source location, velocity and orientation are relative
+ * to the listener.
+ * \param handle The handle of the source.
+ * \param relative Whether the source is relative.
+ * \return Whether the action succeeded.
+ */
+ virtual bool setRelative(AUD_Handle* handle, bool relative)=0;
+
+ /**
+ * Retrieves the maximum volume of a source.
+ * \param handle The handle of the source.
+ * \return The maximum volume.
+ */
+ virtual float getVolumeMaximum(AUD_Handle* handle)=0;
+
+ /**
+ * Sets the maximum volume of a source.
+ * \param handle The handle of the source.
+ * \param volume The new maximum volume.
+ * \return Whether the action succeeded.
+ */
+ virtual bool setVolumeMaximum(AUD_Handle* handle, float volume)=0;
+
+ /**
+ * Retrieves the minimum volume of a source.
+ * \param handle The handle of the source.
+ * \return The minimum volume.
*/
- virtual AUD_Handle* play3D(AUD_IFactory* factory, bool keep = false)=0;
+ virtual float getVolumeMinimum(AUD_Handle* handle)=0;
/**
- * Updates a listeners 3D data.
- * \param data The 3D data.
+ * Sets the minimum volume of a source.
+ * \param handle The handle of the source.
+ * \param volume The new minimum volume.
* \return Whether the action succeeded.
*/
- virtual bool updateListener(AUD_3DData &data)=0;
+ virtual bool setVolumeMinimum(AUD_Handle* handle, float volume)=0;
+
+ /**
+ * Retrieves the maximum distance of a source.
+ * If a source is further away from the reader than this distance, the
+ * volume will automatically be set to 0.
+ * \param handle The handle of the source.
+ * \return The maximum distance.
+ */
+ virtual float getDistanceMaximum(AUD_Handle* handle)=0;
/**
- * Sets a 3D device setting.
- * \param setting The setting type.
- * \param value The new setting value.
+ * Sets the maximum distance of a source.
+ * If a source is further away from the reader than this distance, the
+ * volume will automatically be set to 0.
+ * \param handle The handle of the source.
+ * \param distance The new maximum distance.
* \return Whether the action succeeded.
*/
- virtual bool setSetting(AUD_3DSetting setting, float value)=0;
+ virtual bool setDistanceMaximum(AUD_Handle* handle, float distance)=0;
/**
- * Retrieves a 3D device setting.
- * \param setting The setting type.
- * \return The setting value.
+ * Retrieves the reference distance of a source.
+ * \param handle The handle of the source.
+ * \return The reference distance.
*/
- virtual float getSetting(AUD_3DSetting setting)=0;
+ virtual float getDistanceReference(AUD_Handle* handle)=0;
/**
- * Updates a listeners 3D data.
- * \param handle The source handle.
- * \param data The 3D data.
+ * Sets the reference distance of a source.
+ * \param handle The handle of the source.
+ * \param distance The new reference distance.
* \return Whether the action succeeded.
*/
- virtual bool updateSource(AUD_Handle* handle, AUD_3DData &data)=0;
+ virtual bool setDistanceReference(AUD_Handle* handle, float distance)=0;
+
+ /**
+ * Retrieves the attenuation of a source.
+ * \param handle The handle of the source.
+ * \return The attenuation.
+ */
+ virtual float getAttenuation(AUD_Handle* handle)=0;
/**
- * Sets a 3D source setting.
- * \param handle The source handle.
- * \param setting The setting type.
- * \param value The new setting value.
+ * Sets the attenuation of a source.
+ * This value is used for distance calculation.
+ * \param handle The handle of the source.
+ * \param factor The new attenuation.
* \return Whether the action succeeded.
*/
- virtual bool setSourceSetting(AUD_Handle* handle,
- AUD_3DSourceSetting setting, float value)=0;
+ virtual bool setAttenuation(AUD_Handle* handle, float factor)=0;
/**
- * Retrieves a 3D source setting.
- * \param handle The source handle.
- * \param setting The setting type.
- * \return The setting value.
+ * Retrieves the outer angle of the cone of a source.
+ * \param handle The handle of the source.
+ * \return The outer angle of the cone.
+ */
+ virtual float getConeAngleOuter(AUD_Handle* handle)=0;
+
+ /**
+ * Sets the outer angle of the cone of a source.
+ * \param handle The handle of the source.
+ * \param angle The new outer angle of the cone.
+ * \return Whether the action succeeded.
+ */
+ virtual bool setConeAngleOuter(AUD_Handle* handle, float angle)=0;
+
+ /**
+ * Retrieves the inner angle of the cone of a source.
+ * \param handle The handle of the source.
+ * \return The inner angle of the cone.
+ */
+ virtual float getConeAngleInner(AUD_Handle* handle)=0;
+
+ /**
+ * Sets the inner angle of the cone of a source.
+ * \param handle The handle of the source.
+ * \param angle The new inner angle of the cone.
+ * \return Whether the action succeeded.
+ */
+ virtual bool setConeAngleInner(AUD_Handle* handle, float angle)=0;
+
+ /**
+ * Retrieves the outer volume of the cone of a source.
+ * The volume between inner and outer angle is interpolated between inner
+ * volume and this value.
+ * \param handle The handle of the source.
+ * \return The outer volume of the cone.
+ */
+ virtual float getConeVolumeOuter(AUD_Handle* handle)=0;
+
+ /**
+ * Sets the outer volume of the cone of a source.
+ * The volume between inner and outer angle is interpolated between inner
+ * volume and this value.
+ * \param handle The handle of the source.
+ * \param volume The new outer volume of the cone.
+ * \return Whether the action succeeded.
*/
- virtual float getSourceSetting(AUD_Handle* handle,
- AUD_3DSourceSetting setting)=0;
+ virtual bool setConeVolumeOuter(AUD_Handle* handle, float volume)=0;
};
#endif //AUD_I3DDEVICE
diff --git a/intern/audaspace/intern/AUD_IDevice.h b/intern/audaspace/intern/AUD_IDevice.h
index e924f57cefc..d0925f6f647 100644
--- a/intern/audaspace/intern/AUD_IDevice.h
+++ b/intern/audaspace/intern/AUD_IDevice.h
@@ -30,9 +30,11 @@
class AUD_IFactory;
/// Handle structure, for inherition.
-typedef struct
+struct AUD_Handle
{
-} AUD_Handle;
+};
+
+typedef void (*stopCallback)(void*);
/**
* This class represents an output device for sound sources.
@@ -53,7 +55,7 @@ public:
/**
* Returns the specification of the device.
*/
- virtual AUD_DeviceSpecs getSpecs()=0;
+ virtual AUD_DeviceSpecs getSpecs() const=0;
/**
* Plays a sound source.
@@ -96,6 +98,16 @@ public:
virtual bool stop(AUD_Handle* handle)=0;
/**
+ * Gets the behaviour of the device for a played back sound when the sound
+ * doesn't return any more samples.
+ * \param handle The handle returned by the play function.
+ * \return
+ * - true if the source will be paused when it's end is reached
+ * - false if the handle won't kept or is invalid.
+ */
+ virtual bool getKeep(AUD_Handle* handle)=0;
+
+ /**
* Sets the behaviour of the device for a played back sound when the sound
* doesn't return any more samples.
* \param handle The handle returned by the play function.
@@ -107,16 +119,6 @@ public:
virtual bool setKeep(AUD_Handle* handle, bool keep)=0;
/**
- * Sends a message to a sound or all sounds that are currently played or
- * paused.
- * \param handle The sound that should receive the message or NULL if all
- * sounds should receive it.
- * \param message The message.
- * \return True if the message has been read by at least one sound.
- */
- virtual bool sendMessage(AUD_Handle* handle, AUD_Message &message)=0;
-
- /**
* Seeks in a played back sound.
* \param handle The handle returned by the play function.
* \param position The new position from where to play back, in seconds.
@@ -163,29 +165,80 @@ public:
virtual void unlock()=0;
/**
- * Checks if a specific capability as available on a device.
- * \param capability The capability.
- * \return Whether it is available or not.
+ * Retrieves the overall device volume.
+ * \return The overall device volume.
*/
- virtual bool checkCapability(int capability)=0;
+ virtual float getVolume() const=0;
/**
- * Set a value of a capability. The data behind the pointer depends on the
- * capability.
- * \param capability The capability.
- * \param value The value.
- * \return Whether the action succeeded or not.
+ * Sets the overall device volume.
+ * \param handle The sound handle.
+ * \param volume The overall device volume.
*/
- virtual bool setCapability(int capability, void *value)=0;
+ virtual void setVolume(float volume)=0;
/**
- * Retrieves a value of a capability. The data behind the pointer depends on
- * the capability.
- * \param capability The capability.
- * \param value The value.
- * \return Whether the action succeeded or not.
+ * Retrieves the volume of a playing sound.
+ * \param handle The sound handle.
+ * \return The volume.
+ */
+ virtual float getVolume(AUD_Handle* handle)=0;
+
+ /**
+ * Sets the volume of a playing sound.
+ * \param handle The sound handle.
+ * \param volume The volume.
+ * \return
+ * - true if the handle is valid.
+ * - false if the handle is invalid.
+ */
+ virtual bool setVolume(AUD_Handle* handle, float volume)=0;
+
+ /**
+ * Retrieves the pitch of a playing sound.
+ * \return The pitch.
+ */
+ virtual float getPitch(AUD_Handle* handle)=0;
+
+ /**
+ * Sets the pitch of a playing sound.
+ * \param handle The sound handle.
+ * \param pitch The pitch.
+ * \return
+ * - true if the handle is valid.
+ * - false if the handle is invalid.
+ */
+ virtual bool setPitch(AUD_Handle* handle, float pitch)=0;
+
+ /**
+ * Retrieves the loop count of a playing sound.
+ * A negative value indicates infinity.
+ * \return The remaining loop count.
+ */
+ virtual int getLoopCount(AUD_Handle* handle)=0;
+
+ /**
+ * Sets the loop count of a playing sound.
+ * A negative value indicates infinity.
+ * \param handle The sound handle.
+ * \param count The new loop count.
+ * \return
+ * - true if the handle is valid.
+ * - false if the handle is invalid.
+ */
+ virtual bool setLoopCount(AUD_Handle* handle, int count)=0;
+
+ /**
+ * Sets the callback function that's called when the end of a playing sound
+ * is reached.
+ * \param handle The sound handle.
+ * \param callback The callback function.
+ * \param data The data that should be passed to the callback function.
+ * \return
+ * - true if the handle is valid.
+ * - false if the handle is invalid.
*/
- virtual bool getCapability(int capability, void *value)=0;
+ virtual bool setStopCallback(AUD_Handle* handle, stopCallback callback = 0, void* data = 0)=0;
};
#endif //AUD_IDevice
diff --git a/intern/audaspace/intern/AUD_IFactory.h b/intern/audaspace/intern/AUD_IFactory.h
index f7f29c9e842..aed53cef749 100644
--- a/intern/audaspace/intern/AUD_IFactory.h
+++ b/intern/audaspace/intern/AUD_IFactory.h
@@ -49,7 +49,7 @@ public:
* \exception AUD_Exception An exception may be thrown if there has been
* a more unexpected error during reader creation.
*/
- virtual AUD_IReader* createReader()=0;
+ virtual AUD_IReader* createReader() const=0;
};
#endif //AUD_IFACTORY
diff --git a/intern/audaspace/intern/AUD_IReader.h b/intern/audaspace/intern/AUD_IReader.h
index 4b563100659..816abfea7f3 100644
--- a/intern/audaspace/intern/AUD_IReader.h
+++ b/intern/audaspace/intern/AUD_IReader.h
@@ -46,7 +46,7 @@ public:
* \return Always returns true for readers of the buffer type.
* \see getType
*/
- virtual bool isSeekable()=0;
+ virtual bool isSeekable() const=0;
/**
* Seeks to a specific position in the source.
@@ -60,12 +60,12 @@ public:
virtual void seek(int position)=0;
/**
- * Returns an aproximated length of the source in samples.
+ * Returns an approximated length of the source in samples.
* For readers of the type buffer this has to return a correct value!
* \return The length as sample count. May be negative if unknown.
* \see getType
*/
- virtual int getLength()=0;
+ virtual int getLength() const=0;
/**
* Returns the position of the source as a sample count value.
@@ -76,30 +76,13 @@ public:
* the buffer ones.
* \see getType
*/
- virtual int getPosition()=0;
+ virtual int getPosition() const=0;
/**
* Returns the specification of the reader.
* \return The AUD_Specs structure.
*/
- virtual AUD_Specs getSpecs()=0;
-
- /**
- * Returns the type of the reader. There are special conditions for the
- * readers of the buffer type. Those have to return correct position and
- * length values as well as they must be seekable.
- * \return AUD_TYPE_BUFFER or AUD_TYPE_STREAM.
- */
- virtual AUD_ReaderType getType()=0;
-
- /**
- * Sends a message to this reader and if it has subreaders it broadcasts
- * the message to them.
- * \param message The message.
- * \return Whether the message has been read by the reader or one of his
- * subreaders.
- */
- virtual bool notify(AUD_Message &message)=0;
+ virtual AUD_Specs getSpecs() const=0;
/**
* Request to read the next length samples out of the source.
diff --git a/intern/audaspace/intern/AUD_LinearResampleFactory.cpp b/intern/audaspace/intern/AUD_LinearResampleFactory.cpp
index e738fc17693..91414c6a392 100644
--- a/intern/audaspace/intern/AUD_LinearResampleFactory.cpp
+++ b/intern/audaspace/intern/AUD_LinearResampleFactory.cpp
@@ -26,28 +26,18 @@
#include "AUD_LinearResampleFactory.h"
#include "AUD_LinearResampleReader.h"
-AUD_LinearResampleFactory::AUD_LinearResampleFactory(AUD_IReader* reader,
- AUD_DeviceSpecs specs) :
- AUD_ResampleFactory(reader, specs) {}
-
AUD_LinearResampleFactory::AUD_LinearResampleFactory(AUD_IFactory* factory,
AUD_DeviceSpecs specs) :
- AUD_ResampleFactory(factory, specs) {}
-
-AUD_LinearResampleFactory::AUD_LinearResampleFactory(AUD_DeviceSpecs specs) :
- AUD_ResampleFactory(specs) {}
+ AUD_ResampleFactory(factory, specs)
+{
+}
-AUD_IReader* AUD_LinearResampleFactory::createReader()
+AUD_IReader* AUD_LinearResampleFactory::createReader() const
{
AUD_IReader* reader = getReader();
- if(reader != 0)
- {
- if(reader->getSpecs().rate != m_specs.rate)
- {
- reader = new AUD_LinearResampleReader(reader, m_specs.specs);
- AUD_NEW("reader")
- }
- }
+ if(reader->getSpecs().rate != m_specs.rate)
+ reader = new AUD_LinearResampleReader(reader, m_specs.specs);
+
return reader;
}
diff --git a/intern/audaspace/intern/AUD_LinearResampleFactory.h b/intern/audaspace/intern/AUD_LinearResampleFactory.h
index 81a9d623815..426641f6099 100644
--- a/intern/audaspace/intern/AUD_LinearResampleFactory.h
+++ b/intern/audaspace/intern/AUD_LinearResampleFactory.h
@@ -33,12 +33,15 @@
*/
class AUD_LinearResampleFactory : public AUD_ResampleFactory
{
+private:
+ // hide copy constructor and operator=
+ AUD_LinearResampleFactory(const AUD_LinearResampleFactory&);
+ AUD_LinearResampleFactory& operator=(const AUD_LinearResampleFactory&);
+
public:
- AUD_LinearResampleFactory(AUD_IReader* reader, AUD_DeviceSpecs specs);
AUD_LinearResampleFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs);
- AUD_LinearResampleFactory(AUD_DeviceSpecs specs);
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_LINEARRESAMPLEFACTORY
diff --git a/intern/audaspace/intern/AUD_LinearResampleReader.cpp b/intern/audaspace/intern/AUD_LinearResampleReader.cpp
index dcd5310575d..cfe7561d336 100644
--- a/intern/audaspace/intern/AUD_LinearResampleReader.cpp
+++ b/intern/audaspace/intern/AUD_LinearResampleReader.cpp
@@ -24,7 +24,6 @@
*/
#include "AUD_LinearResampleReader.h"
-#include "AUD_Buffer.h"
#include <cmath>
#include <cstring>
@@ -33,25 +32,15 @@
AUD_LinearResampleReader::AUD_LinearResampleReader(AUD_IReader* reader,
AUD_Specs specs) :
- AUD_EffectReader(reader)
+ AUD_EffectReader(reader),
+ m_sspecs(reader->getSpecs()),
+ m_factor(float(specs.rate) / float(m_sspecs.rate)),
+ m_tspecs(specs),
+ m_position(0),
+ m_sposition(0)
{
- m_sspecs = reader->getSpecs();
-
- m_tspecs = specs;
m_tspecs.channels = m_sspecs.channels;
- m_factor = (float)m_tspecs.rate / (float)m_sspecs.rate;
-
- m_position = 0;
- m_sposition = 0;
-
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
- m_cache = new AUD_Buffer(2 * AUD_SAMPLE_SIZE(specs)); AUD_NEW("buffer")
-}
-
-AUD_LinearResampleReader::~AUD_LinearResampleReader()
-{
- delete m_buffer; AUD_DELETE("buffer")
- delete m_cache; AUD_DELETE("buffer")
+ m_cache.resize(2 * AUD_SAMPLE_SIZE(m_tspecs));
}
void AUD_LinearResampleReader::seek(int position)
@@ -61,17 +50,17 @@ void AUD_LinearResampleReader::seek(int position)
m_reader->seek(m_sposition);
}
-int AUD_LinearResampleReader::getLength()
+int AUD_LinearResampleReader::getLength() const
{
return m_reader->getLength() * m_factor;
}
-int AUD_LinearResampleReader::getPosition()
+int AUD_LinearResampleReader::getPosition() const
{
return m_position;
}
-AUD_Specs AUD_LinearResampleReader::getSpecs()
+AUD_Specs AUD_LinearResampleReader::getSpecs() const
{
return m_tspecs;
}
@@ -81,13 +70,13 @@ void AUD_LinearResampleReader::read(int & length, sample_t* & buffer)
int samplesize = AUD_SAMPLE_SIZE(m_tspecs);
int size = length * samplesize;
- if(m_buffer->getSize() < size)
- m_buffer->resize(size);
+ if(m_buffer.getSize() < size)
+ m_buffer.resize(size);
int need = ceil((m_position + length) / m_factor) + 1 - m_sposition;
int len = need;
sample_t* buf;
- buffer = m_buffer->getBuffer();
+ buffer = m_buffer.getBuffer();
m_reader->read(len, buf);
@@ -106,9 +95,9 @@ void AUD_LinearResampleReader::read(int & length, sample_t* & buffer)
if(floor(spos) < 0)
{
- low = m_cache->getBuffer()[(int)(floor(spos) + 2) * CC];
+ low = m_cache.getBuffer()[(int)(floor(spos) + 2) * CC];
if(ceil(spos) < 0)
- high = m_cache->getBuffer()[(int)(ceil(spos) + 2) * CC];
+ high = m_cache.getBuffer()[(int)(ceil(spos) + 2) * CC];
else
high = buf[(int)ceil(spos) * CC];
}
@@ -122,11 +111,11 @@ void AUD_LinearResampleReader::read(int & length, sample_t* & buffer)
}
if(len > 1)
- memcpy(m_cache->getBuffer(),
+ memcpy(m_cache.getBuffer(),
buf + (len - 2) * channels,
2 * samplesize);
else if(len == 1)
- memcpy(m_cache->getBuffer() + 1 * channels, buf, samplesize);
+ memcpy(m_cache.getBuffer() + 1 * channels, buf, samplesize);
m_sposition += len;
m_position += length;
diff --git a/intern/audaspace/intern/AUD_LinearResampleReader.h b/intern/audaspace/intern/AUD_LinearResampleReader.h
index c86b8b76c59..fbf56286857 100644
--- a/intern/audaspace/intern/AUD_LinearResampleReader.h
+++ b/intern/audaspace/intern/AUD_LinearResampleReader.h
@@ -27,7 +27,7 @@
#define AUD_LINEARRESAMPLEREADER
#include "AUD_EffectReader.h"
-class AUD_Buffer;
+#include "AUD_Buffer.h"
/**
* This resampling reader uses libsamplerate for resampling.
@@ -36,9 +36,19 @@ class AUD_LinearResampleReader : public AUD_EffectReader
{
private:
/**
+ * The sample specification of the source.
+ */
+ const AUD_Specs m_sspecs;
+
+ /**
* The resampling factor.
*/
- float m_factor;
+ const float m_factor;
+
+ /**
+ * The target specification.
+ */
+ AUD_Specs m_tspecs;
/**
* The current position.
@@ -53,41 +63,29 @@ private:
/**
* The sound output buffer.
*/
- AUD_Buffer *m_buffer;
+ AUD_Buffer m_buffer;
/**
* The input caching buffer.
*/
- AUD_Buffer *m_cache;
-
- /**
- * The target specification.
- */
- AUD_Specs m_tspecs;
+ AUD_Buffer m_cache;
- /**
- * The sample specification of the source.
- */
- AUD_Specs m_sspecs;
+ // hide copy constructor and operator=
+ AUD_LinearResampleReader(const AUD_LinearResampleReader&);
+ AUD_LinearResampleReader& operator=(const AUD_LinearResampleReader&);
public:
/**
* Creates a resampling reader.
* \param reader The reader to mix.
* \param specs The target specification.
- * \exception AUD_Exception Thrown if the reader is NULL.
*/
AUD_LinearResampleReader(AUD_IReader* reader, AUD_Specs specs);
- /**
- * Destroys the reader.
- */
- ~AUD_LinearResampleReader();
-
virtual void seek(int position);
- virtual int getLength();
- virtual int getPosition();
- virtual AUD_Specs getSpecs();
+ virtual int getLength() const;
+ virtual int getPosition() const;
+ virtual AUD_Specs getSpecs() const;
virtual void read(int & length, sample_t* & buffer);
};
diff --git a/intern/audaspace/intern/AUD_Mixer.cpp b/intern/audaspace/intern/AUD_Mixer.cpp
index e77d40fdbca..419ac3af6ac 100644
--- a/intern/audaspace/intern/AUD_Mixer.cpp
+++ b/intern/audaspace/intern/AUD_Mixer.cpp
@@ -24,72 +24,13 @@
*/
#include "AUD_Mixer.h"
-#include "AUD_SRCResampleFactory.h"
-#include "AUD_LinearResampleFactory.h"
-#include "AUD_ChannelMapperFactory.h"
#include "AUD_IReader.h"
-#include "AUD_Buffer.h"
#include <cstring>
-AUD_Mixer::AUD_Mixer()
+AUD_Mixer::AUD_Mixer(AUD_DeviceSpecs specs) :
+ m_specs(specs)
{
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
-
- m_resampler = NULL;
- m_mapper = NULL;
-}
-
-AUD_Mixer::~AUD_Mixer()
-{
- delete m_buffer; AUD_DELETE("buffer")
-
-
- if(m_resampler)
- {
- delete m_resampler; AUD_DELETE("factory")
- }
- if(m_mapper)
- {
- delete m_mapper; AUD_DELETE("factory")
- }
-}
-
-AUD_IReader* AUD_Mixer::prepare(AUD_IReader* reader)
-{
- m_resampler->setReader(reader);
- reader = m_resampler->createReader();
-
- if(reader != NULL && reader->getSpecs().channels != m_specs.channels)
- {
- m_mapper->setReader(reader);
- reader = m_mapper->createReader();
- }
-
- return reader;
-}
-
-AUD_DeviceSpecs AUD_Mixer::getSpecs()
-{
- return m_specs;
-}
-
-void AUD_Mixer::setSpecs(AUD_DeviceSpecs specs)
-{
- m_specs = specs;
-
- if(m_resampler)
- {
- delete m_resampler; AUD_DELETE("factory")
- }
- if(m_mapper)
- {
- delete m_mapper; AUD_DELETE("factory")
- }
-
- m_resampler = new AUD_MIXER_RESAMPLER(specs); AUD_NEW("factory")
- m_mapper = new AUD_ChannelMapperFactory(specs); AUD_NEW("factory")
-
int bigendian = 1;
bigendian = (((char*)&bigendian)[0]) ? 0: 1; // 1 if Big Endian
@@ -121,6 +62,11 @@ void AUD_Mixer::setSpecs(AUD_DeviceSpecs specs)
}
}
+AUD_DeviceSpecs AUD_Mixer::getSpecs() const
+{
+ return m_specs;
+}
+
void AUD_Mixer::add(sample_t* buffer, int start, int length, float volume)
{
AUD_MixerBuffer buf;
@@ -137,10 +83,10 @@ void AUD_Mixer::superpose(data_t* buffer, int length, float volume)
int channels = m_specs.channels;
- if(m_buffer->getSize() < length * channels * 4)
- m_buffer->resize(length * channels * 4);
+ if(m_buffer.getSize() < length * channels * 4)
+ m_buffer.resize(length * channels * 4);
- sample_t* out = m_buffer->getBuffer();
+ sample_t* out = m_buffer.getBuffer();
sample_t* in;
memset(out, 0, length * channels * 4);
diff --git a/intern/audaspace/intern/AUD_Mixer.h b/intern/audaspace/intern/AUD_Mixer.h
index 2e7ba743541..a7f5fb274f0 100644
--- a/intern/audaspace/intern/AUD_Mixer.h
+++ b/intern/audaspace/intern/AUD_Mixer.h
@@ -26,13 +26,8 @@
#ifndef AUD_MIXER
#define AUD_MIXER
-#define AUD_MIXER_RESAMPLER AUD_SRCResampleFactory
-
#include "AUD_ConverterFunctions.h"
-class AUD_ConverterFactory;
-class AUD_MIXER_RESAMPLER;
-class AUD_ChannelMapperFactory;
-class AUD_Buffer;
+#include "AUD_Buffer.h"
class AUD_IReader;
#include <list>
@@ -45,24 +40,12 @@ struct AUD_MixerBuffer
};
/**
- * This class is able to mix audiosignals of different channel count and sample
- * rate and convert it to a specific output format.
- * It uses a default ChannelMapperFactory and a SRCResampleFactory for
- * the perparation.
+ * This abstract class is able to mix audiosignals of different channel count
+ * and sample rate and convert it to a specific output format.
*/
class AUD_Mixer
{
-private:
- /**
- * The resampling factory that resamples all readers for superposition.
- */
- AUD_MIXER_RESAMPLER* m_resampler;
-
- /**
- * The channel mapper factory that maps all readers for superposition.
- */
- AUD_ChannelMapperFactory* m_mapper;
-
+protected:
/**
* The list of buffers to superpose.
*/
@@ -71,12 +54,12 @@ private:
/**
* The output specification.
*/
- AUD_DeviceSpecs m_specs;
+ const AUD_DeviceSpecs m_specs;
/**
* The temporary mixing buffer.
*/
- AUD_Buffer* m_buffer;
+ AUD_Buffer m_buffer;
/**
* Converter function.
@@ -87,31 +70,25 @@ public:
/**
* Creates the mixer.
*/
- AUD_Mixer();
+ AUD_Mixer(AUD_DeviceSpecs specs);
/**
* Destroys the mixer.
*/
- ~AUD_Mixer();
-
- /**
- * This funuction prepares a reader for playback.
- * \param reader The reader to prepare.
- * \return The reader that should be used for playback.
- */
- AUD_IReader* prepare(AUD_IReader* reader);
+ virtual ~AUD_Mixer() {}
/**
* Returns the target specification for superposing.
* \return The target specification.
*/
- AUD_DeviceSpecs getSpecs();
+ AUD_DeviceSpecs getSpecs() const;
/**
- * Sets the target specification for superposing.
- * \param specs The target specification.
+ * This funuction prepares a reader for playback.
+ * \param reader The reader to prepare.
+ * \return The reader that should be used for playback.
*/
- void setSpecs(AUD_DeviceSpecs specs);
+ virtual AUD_IReader* prepare(AUD_IReader* reader)=0;
/**
* Adds a buffer for superposition.
@@ -120,7 +97,7 @@ public:
* \param length The length of the buffer in samples.
* \param volume The mixing volume. Must be a value between 0.0 and 1.0.
*/
- void add(sample_t* buffer, int start, int length, float volume);
+ virtual void add(sample_t* buffer, int start, int length, float volume);
/**
* Superposes all added buffers into an output buffer.
@@ -128,7 +105,7 @@ public:
* \param length The length of the buffer in samples.
* \param volume The mixing volume. Must be a value between 0.0 and 1.0.
*/
- void superpose(data_t* buffer, int length, float volume);
+ virtual void superpose(data_t* buffer, int length, float volume);
};
#endif //AUD_MIXER
diff --git a/intern/audaspace/intern/AUD_MixerFactory.cpp b/intern/audaspace/intern/AUD_MixerFactory.cpp
index e78818301fa..4370bed6ca6 100644
--- a/intern/audaspace/intern/AUD_MixerFactory.cpp
+++ b/intern/audaspace/intern/AUD_MixerFactory.cpp
@@ -26,84 +26,23 @@
#include "AUD_MixerFactory.h"
#include "AUD_IReader.h"
-AUD_IReader* AUD_MixerFactory::getReader()
+AUD_IReader* AUD_MixerFactory::getReader() const
{
- AUD_IReader* reader;
-
- // first check for an existing reader
- if(m_reader != 0)
- {
- reader = m_reader;
- m_reader = 0;
- return reader;
- }
-
- // otherwise create a reader if there is a factory
- if(m_factory != 0)
- {
- reader = m_factory->createReader();
- return reader;
- }
-
- return 0;
-}
-
-AUD_MixerFactory::AUD_MixerFactory(AUD_IReader* reader,
- AUD_DeviceSpecs specs)
-{
- m_specs = specs;
- m_reader = reader;
- m_factory = 0;
+ return m_factory->createReader();
}
AUD_MixerFactory::AUD_MixerFactory(AUD_IFactory* factory,
- AUD_DeviceSpecs specs)
+ AUD_DeviceSpecs specs) :
+ m_specs(specs), m_factory(factory)
{
- m_specs = specs;
- m_reader = 0;
- m_factory = factory;
}
-AUD_MixerFactory::AUD_MixerFactory(AUD_DeviceSpecs specs)
-{
- m_specs = specs;
- m_reader = 0;
- m_factory = 0;
-}
-
-AUD_MixerFactory::~AUD_MixerFactory()
-{
- if(m_reader != 0)
- {
- delete m_reader; AUD_DELETE("reader")
- }
-}
-
-AUD_DeviceSpecs AUD_MixerFactory::getSpecs()
+AUD_DeviceSpecs AUD_MixerFactory::getSpecs() const
{
return m_specs;
}
-void AUD_MixerFactory::setSpecs(AUD_DeviceSpecs specs)
-{
- m_specs = specs;
-}
-
-void AUD_MixerFactory::setReader(AUD_IReader* reader)
-{
- if(m_reader != 0)
- {
- delete m_reader; AUD_DELETE("reader")
- }
- m_reader = reader;
-}
-
-void AUD_MixerFactory::setFactory(AUD_IFactory* factory)
-{
- m_factory = factory;
-}
-
-AUD_IFactory* AUD_MixerFactory::getFactory()
+AUD_IFactory* AUD_MixerFactory::getFactory() const
{
return m_factory;
}
diff --git a/intern/audaspace/intern/AUD_MixerFactory.h b/intern/audaspace/intern/AUD_MixerFactory.h
index a2f4aa78d76..909eca8c148 100644
--- a/intern/audaspace/intern/AUD_MixerFactory.h
+++ b/intern/audaspace/intern/AUD_MixerFactory.h
@@ -35,9 +35,9 @@ class AUD_MixerFactory : public AUD_IFactory
{
protected:
/**
- * The reader that should be mixed later.
+ * The target specification for resampling.
*/
- AUD_IReader* m_reader;
+ const AUD_DeviceSpecs m_specs;
/**
* If there is no reader it is created out of this factory.
@@ -45,73 +45,31 @@ protected:
AUD_IFactory* m_factory;
/**
- * The target specification for resampling.
- */
- AUD_DeviceSpecs m_specs;
-
- /**
- * Returns the reader created out of the factory or taken from m_reader.
+ * Returns the reader created out of the factory.
* This method can be used for the createReader function of the implementing
* classes.
- * \return The reader to mix, or NULL if there is no reader or factory.
+ * \return The reader to mix.
*/
- AUD_IReader* getReader();
+ AUD_IReader* getReader() const;
public:
/**
* Creates a new factory.
- * \param reader The reader to mix.
- * \param specs The target specification.
- */
- AUD_MixerFactory(AUD_IReader* reader, AUD_DeviceSpecs specs);
-
- /**
- * Creates a new factory.
* \param factory The factory to create the readers to mix out of.
* \param specs The target specification.
*/
AUD_MixerFactory(AUD_IFactory* factory, AUD_DeviceSpecs specs);
/**
- * Creates a new factory.
- * \param specs The target specification.
- */
- AUD_MixerFactory(AUD_DeviceSpecs specs);
-
- /**
- * Destroys the resampling factory.
- */
- virtual ~AUD_MixerFactory();
-
- /**
* Returns the target specification for resampling.
*/
- AUD_DeviceSpecs getSpecs();
-
- /**
- * Sets the target specification for resampling.
- * \param specs The specification.
- */
- void setSpecs(AUD_DeviceSpecs specs);
-
- /**
- * Sets the reader for resampling.
- * If there has already been a reader, it will be deleted.
- * \param reader The reader that should be used as source for resampling.
- */
- void setReader(AUD_IReader* reader);
-
- /**
- * Sets the factory for resampling.
- * \param factory The factory that should be used as source for resampling.
- */
- void setFactory(AUD_IFactory* factory);
+ AUD_DeviceSpecs getSpecs() const;
/**
* Returns the saved factory.
- * \return The factory or NULL if there has no factory been saved.
+ * \return The factory.
*/
- AUD_IFactory* getFactory();
+ AUD_IFactory* getFactory() const;
};
#endif //AUD_MIXERFACTORY
diff --git a/intern/audaspace/intern/AUD_NULLDevice.cpp b/intern/audaspace/intern/AUD_NULLDevice.cpp
index c9dfadd1839..272e1e4b5b2 100644
--- a/intern/audaspace/intern/AUD_NULLDevice.cpp
+++ b/intern/audaspace/intern/AUD_NULLDevice.cpp
@@ -31,14 +31,15 @@
AUD_NULLDevice::AUD_NULLDevice()
{
- m_specs.channels = AUD_CHANNELS_INVALID;
- m_specs.format = AUD_FORMAT_INVALID;
- m_specs.rate = AUD_RATE_INVALID;
}
-AUD_DeviceSpecs AUD_NULLDevice::getSpecs()
+AUD_DeviceSpecs AUD_NULLDevice::getSpecs() const
{
- return m_specs;
+ AUD_DeviceSpecs specs;
+ specs.channels = AUD_CHANNELS_INVALID;
+ specs.format = AUD_FORMAT_INVALID;
+ specs.rate = AUD_RATE_INVALID;
+ return specs;
}
AUD_Handle* AUD_NULLDevice::play(AUD_IFactory* factory, bool keep)
@@ -61,12 +62,12 @@ bool AUD_NULLDevice::stop(AUD_Handle* handle)
return false;
}
-bool AUD_NULLDevice::setKeep(AUD_Handle* handle, bool keep)
+bool AUD_NULLDevice::getKeep(AUD_Handle* handle)
{
return false;
}
-bool AUD_NULLDevice::sendMessage(AUD_Handle* handle, AUD_Message &message)
+bool AUD_NULLDevice::setKeep(AUD_Handle* handle, bool keep)
{
return false;
}
@@ -94,17 +95,46 @@ void AUD_NULLDevice::unlock()
{
}
-bool AUD_NULLDevice::checkCapability(int capability)
+float AUD_NULLDevice::getVolume() const
+{
+ return 0;
+}
+
+void AUD_NULLDevice::setVolume(float volume)
+{
+}
+
+float AUD_NULLDevice::getVolume(AUD_Handle* handle)
+{
+ return std::numeric_limits<float>::quiet_NaN();
+}
+
+bool AUD_NULLDevice::setVolume(AUD_Handle* handle, float volume)
{
return false;
}
-bool AUD_NULLDevice::setCapability(int capability, void *value)
+float AUD_NULLDevice::getPitch(AUD_Handle* handle)
+{
+ return std::numeric_limits<float>::quiet_NaN();
+}
+
+bool AUD_NULLDevice::setPitch(AUD_Handle* handle, float pitch)
+{
+ return false;
+}
+
+int AUD_NULLDevice::getLoopCount(AUD_Handle* handle)
+{
+ return 0;
+}
+
+bool AUD_NULLDevice::setLoopCount(AUD_Handle* handle, int count)
{
return false;
}
-bool AUD_NULLDevice::getCapability(int capability, void *value)
+bool AUD_NULLDevice::setStopCallback(AUD_Handle* handle, stopCallback callback, void* data)
{
return false;
}
diff --git a/intern/audaspace/intern/AUD_NULLDevice.h b/intern/audaspace/intern/AUD_NULLDevice.h
index 91ddd23cf71..a1ffdba201a 100644
--- a/intern/audaspace/intern/AUD_NULLDevice.h
+++ b/intern/audaspace/intern/AUD_NULLDevice.h
@@ -33,33 +33,33 @@
*/
class AUD_NULLDevice : public AUD_IDevice
{
-private:
- /**
- * The specs of the device.
- */
- AUD_DeviceSpecs m_specs;
-
public:
/**
* Creates a new NULL device.
*/
AUD_NULLDevice();
- virtual AUD_DeviceSpecs getSpecs();
+ virtual AUD_DeviceSpecs getSpecs() const;
virtual AUD_Handle* play(AUD_IFactory* factory, bool keep = false);
virtual bool pause(AUD_Handle* handle);
virtual bool resume(AUD_Handle* handle);
virtual bool stop(AUD_Handle* handle);
+ virtual bool getKeep(AUD_Handle* handle);
virtual bool setKeep(AUD_Handle* handle, bool keep);
- virtual bool sendMessage(AUD_Handle* handle, AUD_Message &message);
virtual bool seek(AUD_Handle* handle, float position);
virtual float getPosition(AUD_Handle* handle);
virtual AUD_Status getStatus(AUD_Handle* handle);
virtual void lock();
virtual void unlock();
- virtual bool checkCapability(int capability);
- virtual bool setCapability(int capability, void *value);
- virtual bool getCapability(int capability, void *value);
+ virtual float getVolume() const;
+ virtual void setVolume(float volume);
+ virtual float getVolume(AUD_Handle* handle);
+ virtual bool setVolume(AUD_Handle* handle, float volume);
+ virtual float getPitch(AUD_Handle* handle);
+ virtual bool setPitch(AUD_Handle* handle, float pitch);
+ virtual int getLoopCount(AUD_Handle* handle);
+ virtual bool setLoopCount(AUD_Handle* handle, int count);
+ virtual bool setStopCallback(AUD_Handle* handle, stopCallback callback = 0, void* data = 0);
};
#endif //AUD_NULLDEVICE
diff --git a/intern/audaspace/intern/AUD_PyInit.h b/intern/audaspace/intern/AUD_PyInit.h
new file mode 100644
index 00000000000..bd67259449a
--- /dev/null
+++ b/intern/audaspace/intern/AUD_PyInit.h
@@ -0,0 +1,47 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN LGPL LICENSE BLOCK *****
+ *
+ * Copyright 2010 Jörg Hermann Müller
+ *
+ * This file is part of AudaSpace.
+ *
+ * AudaSpace is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AudaSpace is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with AudaSpace. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * ***** END LGPL LICENSE BLOCK *****
+ */
+
+#ifndef AUD_PYINIT
+#define AUD_PYINIT
+
+#ifndef DISABLE_PYTHON
+#include "Python.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Initalizes the Python module.
+ */
+extern PyObject* AUD_initPython();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+#endif //AUD_PYINIT
diff --git a/intern/audaspace/intern/AUD_ReadDevice.cpp b/intern/audaspace/intern/AUD_ReadDevice.cpp
index 37a7d1ae295..cde5694354e 100644
--- a/intern/audaspace/intern/AUD_ReadDevice.cpp
+++ b/intern/audaspace/intern/AUD_ReadDevice.cpp
@@ -23,21 +23,17 @@
* ***** END LGPL LICENSE BLOCK *****
*/
-#include "AUD_Mixer.h"
+#include "AUD_DefaultMixer.h"
#include "AUD_ReadDevice.h"
#include "AUD_IReader.h"
#include <cstring>
-AUD_ReadDevice::AUD_ReadDevice(AUD_DeviceSpecs specs)
+AUD_ReadDevice::AUD_ReadDevice(AUD_DeviceSpecs specs) :
+ m_playing(false)
{
m_specs = specs;
- m_mixer = new AUD_Mixer(); AUD_NEW("mixer")
- m_mixer->setSpecs(m_specs);
-
- m_playing = false;
-
create();
}
diff --git a/intern/audaspace/intern/AUD_ReadDevice.h b/intern/audaspace/intern/AUD_ReadDevice.h
index 3fd90df7755..121bcb8612b 100644
--- a/intern/audaspace/intern/AUD_ReadDevice.h
+++ b/intern/audaspace/intern/AUD_ReadDevice.h
@@ -33,15 +33,19 @@
*/
class AUD_ReadDevice : public AUD_SoftwareDevice
{
-protected:
- virtual void playing(bool playing);
-
private:
/**
* Whether the device currently.
*/
bool m_playing;
+ // hide copy constructor and operator=
+ AUD_ReadDevice(const AUD_ReadDevice&);
+ AUD_ReadDevice& operator=(const AUD_ReadDevice&);
+
+protected:
+ virtual void playing(bool playing);
+
public:
/**
* Creates a new read device.
diff --git a/intern/audaspace/intern/AUD_Reference.h b/intern/audaspace/intern/AUD_Reference.h
index 9bb9d7440b3..6b1001e2b01 100644
--- a/intern/audaspace/intern/AUD_Reference.h
+++ b/intern/audaspace/intern/AUD_Reference.h
@@ -45,12 +45,12 @@ public:
AUD_Reference(T* reference = 0)
{
m_reference = reference;
- m_refcount = new int; AUD_NEW("int")
+ m_refcount = new int;
*m_refcount = 1;
}
/**
- * Copies a AUD_Reference object.
+ * Copies an AUD_Reference object.
* \param ref The AUD_Reference object to copy.
*/
AUD_Reference(const AUD_Reference& ref)
@@ -69,17 +69,17 @@ public:
(*m_refcount)--;
if(*m_refcount == 0)
{
- if(m_reference != 0)
+ if(m_reference)
{
- delete m_reference; AUD_DELETE("buffer")
+ delete m_reference;
}
- delete m_refcount; AUD_DELETE("int")
+ delete m_refcount;
}
}
/**
- * Copies a AUD_Reference object.
- * \param ref The AUD_Reference object to copy.
+ * Assigns an AUD_Reference to this object.
+ * \param ref The AUD_Reference object to assign.
*/
AUD_Reference& operator=(const AUD_Reference& ref)
{
@@ -89,11 +89,11 @@ public:
(*m_refcount)--;
if(*m_refcount == 0)
{
- if(m_reference != 0)
+ if(m_reference)
{
- delete m_reference; AUD_DELETE("buffer")
+ delete m_reference;
}
- delete m_refcount; AUD_DELETE("int")
+ delete m_refcount;
}
m_reference = ref.m_reference;
@@ -106,7 +106,7 @@ public:
/**
* Returns the reference.
*/
- T* get()
+ T* get() const
{
return m_reference;
}
diff --git a/intern/audaspace/intern/AUD_SequencerFactory.cpp b/intern/audaspace/intern/AUD_SequencerFactory.cpp
index bb5cf27fb5f..05c7fefea4a 100644
--- a/intern/audaspace/intern/AUD_SequencerFactory.cpp
+++ b/intern/audaspace/intern/AUD_SequencerFactory.cpp
@@ -28,11 +28,12 @@
typedef std::list<AUD_SequencerReader*>::iterator AUD_ReaderIterator;
-AUD_SequencerFactory::AUD_SequencerFactory(AUD_Specs specs, void* data, AUD_volumeFunction volume)
+AUD_SequencerFactory::AUD_SequencerFactory(AUD_Specs specs, void* data,
+ AUD_volumeFunction volume) :
+ m_specs(specs),
+ m_data(data),
+ m_volume(volume)
{
- m_specs = specs;
- m_data = data;
- m_volume = volume;
}
AUD_SequencerFactory::~AUD_SequencerFactory()
@@ -51,13 +52,23 @@ AUD_SequencerFactory::~AUD_SequencerFactory()
{
entry = m_entries.front();
m_entries.pop_front();
- delete entry; AUD_DELETE("seqentry")
+ delete entry;
}
}
+AUD_IReader* AUD_SequencerFactory::newReader()
+{
+ AUD_SequencerReader* reader = new AUD_SequencerReader(this, m_entries,
+ m_specs, m_data,
+ m_volume);
+ m_readers.push_front(reader);
+
+ return reader;
+}
+
AUD_SequencerEntry* AUD_SequencerFactory::add(AUD_IFactory** sound, float begin, float end, float skip, void* data)
{
- AUD_SequencerEntry* entry = new AUD_SequencerEntry; AUD_NEW("seqentry")
+ AUD_SequencerEntry* entry = new AUD_SequencerEntry;
entry->sound = sound;
entry->begin = begin;
entry->skip = skip;
@@ -80,7 +91,7 @@ void AUD_SequencerFactory::remove(AUD_SequencerEntry* entry)
m_entries.remove(entry);
- delete entry; AUD_DELETE("seqentry")
+ delete entry;
}
void AUD_SequencerFactory::move(AUD_SequencerEntry* entry, float begin, float end, float skip)
@@ -95,12 +106,9 @@ void AUD_SequencerFactory::mute(AUD_SequencerEntry* entry, bool mute)
entry->muted = mute;
}
-AUD_IReader* AUD_SequencerFactory::createReader()
+AUD_IReader* AUD_SequencerFactory::createReader() const
{
- AUD_SequencerReader* reader = new AUD_SequencerReader(this, m_entries, m_specs, m_data, m_volume); AUD_NEW("reader")
- m_readers.push_front(reader);
-
- return reader;
+ return const_cast<AUD_SequencerFactory*>(this)->newReader();
}
void AUD_SequencerFactory::removeReader(AUD_SequencerReader* reader)
diff --git a/intern/audaspace/intern/AUD_SequencerFactory.h b/intern/audaspace/intern/AUD_SequencerFactory.h
index b564c888fc6..a2c8f48fa54 100644
--- a/intern/audaspace/intern/AUD_SequencerFactory.h
+++ b/intern/audaspace/intern/AUD_SequencerFactory.h
@@ -60,6 +60,12 @@ private:
void* m_data;
AUD_volumeFunction m_volume;
+ AUD_IReader* newReader();
+
+ // hide copy constructor and operator=
+ AUD_SequencerFactory(const AUD_SequencerFactory&);
+ AUD_SequencerFactory& operator=(const AUD_SequencerFactory&);
+
public:
AUD_SequencerFactory(AUD_Specs specs, void* data, AUD_volumeFunction volume);
~AUD_SequencerFactory();
@@ -69,7 +75,7 @@ public:
void move(AUD_SequencerEntry* entry, float begin, float end, float skip);
void mute(AUD_SequencerEntry* entry, bool mute);
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
void removeReader(AUD_SequencerReader* reader);
};
diff --git a/intern/audaspace/intern/AUD_SequencerReader.cpp b/intern/audaspace/intern/AUD_SequencerReader.cpp
index 8869d8d54ca..69293205498 100644
--- a/intern/audaspace/intern/AUD_SequencerReader.cpp
+++ b/intern/audaspace/intern/AUD_SequencerReader.cpp
@@ -24,20 +24,22 @@
*/
#include "AUD_SequencerReader.h"
-#include "AUD_Buffer.h"
+#include "AUD_DefaultMixer.h"
#include <math.h>
typedef std::list<AUD_SequencerStrip*>::iterator AUD_StripIterator;
typedef std::list<AUD_SequencerEntry*>::iterator AUD_EntryIterator;
-AUD_SequencerReader::AUD_SequencerReader(AUD_SequencerFactory* factory, std::list<AUD_SequencerEntry*> &entries, AUD_Specs specs, void* data, AUD_volumeFunction volume)
+AUD_SequencerReader::AUD_SequencerReader(AUD_SequencerFactory* factory,
+ std::list<AUD_SequencerEntry*> &entries, AUD_Specs specs,
+ void* data, AUD_volumeFunction volume)
{
AUD_DeviceSpecs dspecs;
dspecs.specs = specs;
dspecs.format = AUD_FORMAT_FLOAT32;
- m_mixer.setSpecs(dspecs);
+ m_mixer = new AUD_DefaultMixer(dspecs);
m_factory = factory;
m_data = data;
m_volume = volume;
@@ -46,12 +48,12 @@ AUD_SequencerReader::AUD_SequencerReader(AUD_SequencerFactory* factory, std::lis
for(AUD_EntryIterator i = entries.begin(); i != entries.end(); i++)
{
- strip = new AUD_SequencerStrip; AUD_NEW("seqstrip")
+ strip = new AUD_SequencerStrip;
strip->entry = *i;
strip->old_sound = NULL;
if(strip->old_sound)
- strip->reader = m_mixer.prepare(strip->old_sound->createReader());
+ strip->reader = m_mixer->prepare(strip->old_sound->createReader());
else
strip->reader = NULL;
@@ -59,7 +61,6 @@ AUD_SequencerReader::AUD_SequencerReader(AUD_SequencerFactory* factory, std::lis
}
m_position = 0;
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
}
AUD_SequencerReader::~AUD_SequencerReader()
@@ -75,12 +76,12 @@ AUD_SequencerReader::~AUD_SequencerReader()
m_strips.pop_front();
if(strip->reader)
{
- delete strip->reader; AUD_DELETE("reader")
+ delete strip->reader;
}
- delete strip; AUD_DELETE("seqstrip")
+ delete strip;
}
- delete m_buffer; AUD_DELETE("buffer")
+ delete m_mixer;
}
void AUD_SequencerReader::destroy()
@@ -92,19 +93,19 @@ void AUD_SequencerReader::destroy()
{
strip = m_strips.front();
m_strips.pop_front();
- delete strip; AUD_DELETE("seqstrip")
+ delete strip;
}
}
void AUD_SequencerReader::add(AUD_SequencerEntry* entry)
{
- AUD_SequencerStrip* strip = new AUD_SequencerStrip; AUD_NEW("seqstrip")
+ AUD_SequencerStrip* strip = new AUD_SequencerStrip;
strip->entry = entry;
if(*strip->entry->sound)
{
strip->old_sound = *strip->entry->sound;
- strip->reader = m_mixer.prepare(strip->old_sound->createReader());
+ strip->reader = m_mixer->prepare(strip->old_sound->createReader());
}
else
{
@@ -125,16 +126,16 @@ void AUD_SequencerReader::remove(AUD_SequencerEntry* entry)
i++;
if(strip->reader)
{
- delete strip->reader; AUD_DELETE("reader")
+ delete strip->reader;
}
m_strips.remove(strip);
- delete strip; AUD_DELETE("seqstrip")
+ delete strip;
return;
}
}
}
-bool AUD_SequencerReader::isSeekable()
+bool AUD_SequencerReader::isSeekable() const
{
return true;
}
@@ -144,44 +145,24 @@ void AUD_SequencerReader::seek(int position)
m_position = position;
}
-int AUD_SequencerReader::getLength()
+int AUD_SequencerReader::getLength() const
{
return -1;
}
-int AUD_SequencerReader::getPosition()
+int AUD_SequencerReader::getPosition() const
{
return m_position;
}
-AUD_Specs AUD_SequencerReader::getSpecs()
+AUD_Specs AUD_SequencerReader::getSpecs() const
{
- return m_mixer.getSpecs().specs;
-}
-
-AUD_ReaderType AUD_SequencerReader::getType()
-{
- return AUD_TYPE_STREAM;
-}
-
-bool AUD_SequencerReader::notify(AUD_Message &message)
-{
- bool result = false;
- AUD_SequencerStrip* strip;
-
- for(AUD_StripIterator i = m_strips.begin(); i != m_strips.end(); i++)
- {
- strip = *i;
- if(strip->reader)
- result |= (*i)->reader->notify(message);
- }
-
- return result;
+ return m_mixer->getSpecs().specs;
}
void AUD_SequencerReader::read(int & length, sample_t* & buffer)
{
- AUD_DeviceSpecs specs = m_mixer.getSpecs();
+ AUD_DeviceSpecs specs = m_mixer->getSpecs();
int samplesize = AUD_SAMPLE_SIZE(specs);
int rate = specs.rate;
@@ -191,9 +172,9 @@ void AUD_SequencerReader::read(int & length, sample_t* & buffer)
AUD_SequencerStrip* strip;
sample_t* buf;
- if(m_buffer->getSize() < size)
- m_buffer->resize(size);
- buffer = m_buffer->getBuffer();
+ if(m_buffer.getSize() < size)
+ m_buffer.resize(size);
+ buffer = m_buffer.getBuffer();
for(AUD_StripIterator i = m_strips.begin(); i != m_strips.end(); i++)
{
@@ -204,12 +185,10 @@ void AUD_SequencerReader::read(int & length, sample_t* & buffer)
{
strip->old_sound = *strip->entry->sound;
if(strip->reader)
- {
- delete strip->reader; AUD_DELETE("reader")
- }
+ delete strip->reader;
if(strip->old_sound)
- strip->reader = m_mixer.prepare(strip->old_sound->createReader());
+ strip->reader = m_mixer->prepare(strip->old_sound->createReader());
else
strip->reader = NULL;
}
@@ -236,14 +215,14 @@ void AUD_SequencerReader::read(int & length, sample_t* & buffer)
if(strip->reader->getPosition() != current)
strip->reader->seek(current);
strip->reader->read(len, buf);
- m_mixer.add(buf, skip, len, m_volume(m_data, strip->entry->data, (float)m_position / (float)rate));
+ m_mixer->add(buf, skip, len, m_volume(m_data, strip->entry->data, (float)m_position / (float)rate));
}
}
}
}
}
- m_mixer.superpose((data_t*)buffer, length, 1.0f);
+ m_mixer->superpose((data_t*)buffer, length, 1.0f);
m_position += length;
}
diff --git a/intern/audaspace/intern/AUD_SequencerReader.h b/intern/audaspace/intern/AUD_SequencerReader.h
index a50e1642260..fd7d94c7578 100644
--- a/intern/audaspace/intern/AUD_SequencerReader.h
+++ b/intern/audaspace/intern/AUD_SequencerReader.h
@@ -28,9 +28,8 @@
#include "AUD_IReader.h"
#include "AUD_SequencerFactory.h"
-#include "AUD_Mixer.h"
-
-class AUD_Buffer;
+#include "AUD_Buffer.h"
+class AUD_Mixer;
struct AUD_SequencerStrip
{
@@ -53,12 +52,12 @@ private:
/**
* The sound output buffer.
*/
- AUD_Buffer *m_buffer;
+ AUD_Buffer m_buffer;
/**
* The target specification.
*/
- AUD_Mixer m_mixer;
+ AUD_Mixer* m_mixer;
/**
* Saves the SequencerFactory the reader belongs to.
@@ -70,14 +69,17 @@ private:
void* m_data;
AUD_volumeFunction m_volume;
+ // hide copy constructor and operator=
+ AUD_SequencerReader(const AUD_SequencerReader&);
+ AUD_SequencerReader& operator=(const AUD_SequencerReader&);
+
public:
/**
* Creates a resampling reader.
* \param reader The reader to mix.
* \param specs The target specification.
- * \exception AUD_Exception Thrown if the reader is NULL.
*/
- AUD_SequencerReader(AUD_SequencerFactory* factory, std::list<AUD_SequencerEntry*> &entries, AUD_Specs specs, void* data, AUD_volumeFunction volume);
+ AUD_SequencerReader(AUD_SequencerFactory* factory, std::list<AUD_SequencerEntry*> &entries, const AUD_Specs specs, void* data, AUD_volumeFunction volume);
/**
* Destroys the reader.
@@ -89,13 +91,11 @@ public:
void add(AUD_SequencerEntry* entry);
void remove(AUD_SequencerEntry* entry);
- virtual bool isSeekable();
+ virtual bool isSeekable() const;
virtual void seek(int position);
- virtual int getLength();
- virtual int getPosition();
- virtual AUD_Specs getSpecs();
- virtual AUD_ReaderType getType();
- virtual bool notify(AUD_Message &message);
+ virtual int getLength() const;
+ virtual int getPosition() const;
+ virtual AUD_Specs getSpecs() const;
virtual void read(int & length, sample_t* & buffer);
};
diff --git a/intern/audaspace/intern/AUD_SourceCaps.h b/intern/audaspace/intern/AUD_SilenceFactory.cpp
index b1edd2b9b4e..4e59d7486d5 100644
--- a/intern/audaspace/intern/AUD_SourceCaps.h
+++ b/intern/audaspace/intern/AUD_SilenceFactory.cpp
@@ -23,19 +23,15 @@
* ***** END LGPL LICENSE BLOCK *****
*/
-#ifndef AUD_SOURCECAPS
-#define AUD_SOURCECAPS
+#include "AUD_SilenceFactory.h"
+#include "AUD_SilenceReader.h"
+#include "AUD_Space.h"
-#include "AUD_IDevice.h"
-
-/// The structure for source capabilities.
-typedef struct
+AUD_SilenceFactory::AUD_SilenceFactory()
{
- /// The source to apply the capability on.
- AUD_Handle* handle;
-
- /// The value for the capability.
- float value;
-} AUD_SourceCaps;
+}
-#endif //AUD_SOURCECAPS
+AUD_IReader* AUD_SilenceFactory::createReader() const
+{
+ return new AUD_SilenceReader();
+}
diff --git a/intern/audaspace/FX/AUD_RectifyReader.h b/intern/audaspace/intern/AUD_SilenceFactory.h
index afbe2e59cab..bc8a5b92727 100644
--- a/intern/audaspace/FX/AUD_RectifyReader.h
+++ b/intern/audaspace/intern/AUD_SilenceFactory.h
@@ -23,37 +23,28 @@
* ***** END LGPL LICENSE BLOCK *****
*/
-#ifndef AUD_RECTIFYREADER
-#define AUD_RECTIFYREADER
+#ifndef AUD_SILENCEFACTORY
+#define AUD_SILENCEFACTORY
-#include "AUD_EffectReader.h"
-class AUD_Buffer;
+#include "AUD_IFactory.h"
/**
- * This class reads another reader and rectifies it.
+ * This factory creates a reader that plays a sine tone.
*/
-class AUD_RectifyReader : public AUD_EffectReader
+class AUD_SilenceFactory : public AUD_IFactory
{
private:
- /**
- * The playback buffer.
- */
- AUD_Buffer *m_buffer;
+ // hide copy constructor and operator=
+ AUD_SilenceFactory(const AUD_SilenceFactory&);
+ AUD_SilenceFactory& operator=(const AUD_SilenceFactory&);
public:
/**
- * Creates a new rectify reader.
- * \param reader The reader to read from.
- * \exception AUD_Exception Thrown if the reader specified is NULL.
- */
- AUD_RectifyReader(AUD_IReader* reader);
-
- /**
- * Destroys the reader.
+ * Creates a new silence factory.
*/
- virtual ~AUD_RectifyReader();
+ AUD_SilenceFactory();
- virtual void read(int & length, sample_t* & buffer);
+ virtual AUD_IReader* createReader() const;
};
-#endif //AUD_RECTIFYREADER
+#endif //AUD_SILENCEFACTORY
diff --git a/intern/audaspace/FX/AUD_SquareReader.cpp b/intern/audaspace/intern/AUD_SilenceReader.cpp
index 2d4dc52fe27..5243286c5e4 100644
--- a/intern/audaspace/FX/AUD_SquareReader.cpp
+++ b/intern/audaspace/intern/AUD_SilenceReader.cpp
@@ -23,41 +23,52 @@
* ***** END LGPL LICENSE BLOCK *****
*/
-#include "AUD_SquareReader.h"
-#include "AUD_Buffer.h"
+#include "AUD_SilenceReader.h"
#include <cstring>
-AUD_SquareReader::AUD_SquareReader(AUD_IReader* reader, float threshold) :
- AUD_EffectReader(reader),
- m_threshold(threshold)
+AUD_SilenceReader::AUD_SilenceReader() :
+ m_position(0)
{
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
}
-AUD_SquareReader::~AUD_SquareReader()
+bool AUD_SilenceReader::isSeekable() const
{
- delete m_buffer; AUD_DELETE("buffer")
+ return true;
}
-void AUD_SquareReader::read(int & length, sample_t* & buffer)
+void AUD_SilenceReader::seek(int position)
{
- sample_t* buf;
- AUD_Specs specs = m_reader->getSpecs();
+ m_position = position;
+}
- m_reader->read(length, buf);
- if(m_buffer->getSize() < length * AUD_SAMPLE_SIZE(specs))
- m_buffer->resize(length * AUD_SAMPLE_SIZE(specs));
+int AUD_SilenceReader::getLength() const
+{
+ return -1;
+}
+
+int AUD_SilenceReader::getPosition() const
+{
+ return m_position;
+}
- buffer = m_buffer->getBuffer();
+AUD_Specs AUD_SilenceReader::getSpecs() const
+{
+ AUD_Specs specs;
+ specs.rate = AUD_RATE_44100;
+ specs.channels = AUD_CHANNELS_MONO;
+ return specs;
+}
- for(int i = 0; i < length * specs.channels; i++)
+void AUD_SilenceReader::read(int & length, sample_t* & buffer)
+{
+ // resize if necessary
+ if(m_buffer.getSize() < length * sizeof(sample_t))
{
- if(buf[i] >= m_threshold)
- buffer[i] = 1.0f;
- else if(buf[i] <= -m_threshold)
- buffer[i] = -1.0f;
- else
- buffer[i] = 0.0f;
+ m_buffer.resize(length * sizeof(sample_t));
+ memset(m_buffer.getBuffer(), 0, m_buffer.getSize());
}
+
+ buffer = m_buffer.getBuffer();
+ m_position += length;
}
diff --git a/intern/audaspace/FX/AUD_LowpassReader.h b/intern/audaspace/intern/AUD_SilenceReader.h
index a490ba52c1c..a8b959b5309 100644
--- a/intern/audaspace/FX/AUD_LowpassReader.h
+++ b/intern/audaspace/intern/AUD_SilenceReader.h
@@ -23,61 +23,49 @@
* ***** END LGPL LICENSE BLOCK *****
*/
-#ifndef AUD_LOWPASSREADER
-#define AUD_LOWPASSREADER
+#ifndef AUD_SILENCEREADER
+#define AUD_SILENCEREADER
-#include "AUD_EffectReader.h"
-class AUD_Buffer;
-
-#define AUD_LOWPASS_ORDER 3
+#include "AUD_IReader.h"
+#include "AUD_Buffer.h"
/**
- * This class represents a lowpass filter.
+ * This class is used for sine tone playback.
+ * The output format is in the 16 bit format and stereo, the sample rate can be
+ * specified.
+ * As the two channels both play the same the output could also be mono, but
+ * in most cases this will result in having to resample for output, so stereo
+ * sound is created directly.
*/
-class AUD_LowpassReader : public AUD_EffectReader
+class AUD_SilenceReader : public AUD_IReader
{
private:
/**
- * The playback buffer.
- */
- AUD_Buffer *m_buffer;
-
- /**
- * The last out values buffer.
- */
- AUD_Buffer *m_outvalues;
-
- /**
- * The last in values buffer.
- */
- AUD_Buffer *m_invalues;
-
- /**
- * The position for buffer cycling.
+ * The current position in samples.
*/
int m_position;
/**
- * Filter coefficients.
+ * The playback buffer.
*/
- float m_coeff[2][AUD_LOWPASS_ORDER];
+ AUD_Buffer m_buffer;
-public:
- /**
- * Creates a new lowpass reader.
- * \param reader The reader to read from.
- * \param frequency The cutoff frequency.
- * \param Q The Q factor.
- * \exception AUD_Exception Thrown if the reader specified is NULL.
- */
- AUD_LowpassReader(AUD_IReader* reader, float frequency, float Q);
+ // hide copy constructor and operator=
+ AUD_SilenceReader(const AUD_SilenceReader&);
+ AUD_SilenceReader& operator=(const AUD_SilenceReader&);
+public:
/**
- * Destroys the reader.
+ * Creates a new reader.
*/
- virtual ~AUD_LowpassReader();
+ AUD_SilenceReader();
+ virtual bool isSeekable() const;
+ virtual void seek(int position);
+ virtual int getLength() const;
+ virtual int getPosition() const;
+ virtual AUD_Specs getSpecs() const;
virtual void read(int & length, sample_t* & buffer);
};
-#endif //AUD_LOWPASSREADER
+#endif //AUD_SILENCEREADER
diff --git a/intern/audaspace/intern/AUD_SinusFactory.cpp b/intern/audaspace/intern/AUD_SinusFactory.cpp
index ae878b9df60..3c8e5ccc567 100644
--- a/intern/audaspace/intern/AUD_SinusFactory.cpp
+++ b/intern/audaspace/intern/AUD_SinusFactory.cpp
@@ -27,25 +27,18 @@
#include "AUD_SinusReader.h"
#include "AUD_Space.h"
-AUD_SinusFactory::AUD_SinusFactory(double frequency, AUD_SampleRate sampleRate)
+AUD_SinusFactory::AUD_SinusFactory(float frequency, AUD_SampleRate sampleRate) :
+ m_frequency(frequency),
+ m_sampleRate(sampleRate)
{
- m_frequency = frequency;
- m_sampleRate = sampleRate;
}
-AUD_IReader* AUD_SinusFactory::createReader()
-{
- AUD_IReader* reader = new AUD_SinusReader(m_frequency, m_sampleRate);
- AUD_NEW("reader")
- return reader;
-}
-
-double AUD_SinusFactory::getFrequency()
+float AUD_SinusFactory::getFrequency() const
{
return m_frequency;
}
-void AUD_SinusFactory::setFrequency(double frequency)
+AUD_IReader* AUD_SinusFactory::createReader() const
{
- m_frequency = frequency;
+ return new AUD_SinusReader(m_frequency, m_sampleRate);
}
diff --git a/intern/audaspace/intern/AUD_SinusFactory.h b/intern/audaspace/intern/AUD_SinusFactory.h
index ffb36e741b9..2c5965e11f0 100644
--- a/intern/audaspace/intern/AUD_SinusFactory.h
+++ b/intern/audaspace/intern/AUD_SinusFactory.h
@@ -37,12 +37,16 @@ private:
/**
* The frequence of the sine wave.
*/
- double m_frequency;
+ const float m_frequency;
/**
* The target sample rate for output.
*/
- AUD_SampleRate m_sampleRate;
+ const AUD_SampleRate m_sampleRate;
+
+ // hide copy constructor and operator=
+ AUD_SinusFactory(const AUD_SinusFactory&);
+ AUD_SinusFactory& operator=(const AUD_SinusFactory&);
public:
/**
@@ -50,21 +54,15 @@ public:
* \param frequency The desired frequency.
* \param sampleRate The target sample rate for playback.
*/
- AUD_SinusFactory(double frequency,
+ AUD_SinusFactory(float frequency,
AUD_SampleRate sampleRate = AUD_RATE_44100);
/**
* Returns the frequency of the sine wave.
*/
- double getFrequency();
-
- /**
- * Sets the frequency.
- * \param frequency The new frequency.
- */
- void setFrequency(double frequency);
+ float getFrequency() const;
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_SINUSFACTORY
diff --git a/intern/audaspace/intern/AUD_SinusReader.cpp b/intern/audaspace/intern/AUD_SinusReader.cpp
index c52513d5d2e..e810c576a5c 100644
--- a/intern/audaspace/intern/AUD_SinusReader.cpp
+++ b/intern/audaspace/intern/AUD_SinusReader.cpp
@@ -24,7 +24,6 @@
*/
#include "AUD_SinusReader.h"
-#include "AUD_Buffer.h"
#include <cmath>
@@ -32,20 +31,14 @@
#define M_PI 3.14159265358979323846
#endif
-AUD_SinusReader::AUD_SinusReader(double frequency, AUD_SampleRate sampleRate)
+AUD_SinusReader::AUD_SinusReader(float frequency, AUD_SampleRate sampleRate) :
+ m_frequency(frequency),
+ m_position(0),
+ m_sampleRate(sampleRate)
{
- m_frequency = frequency;
- m_position = 0;
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
- m_sampleRate = sampleRate;
}
-AUD_SinusReader::~AUD_SinusReader()
-{
- delete m_buffer; AUD_DELETE("buffer")
-}
-
-bool AUD_SinusReader::isSeekable()
+bool AUD_SinusReader::isSeekable() const
{
return true;
}
@@ -55,17 +48,17 @@ void AUD_SinusReader::seek(int position)
m_position = position;
}
-int AUD_SinusReader::getLength()
+int AUD_SinusReader::getLength() const
{
return -1;
}
-int AUD_SinusReader::getPosition()
+int AUD_SinusReader::getPosition() const
{
return m_position;
}
-AUD_Specs AUD_SinusReader::getSpecs()
+AUD_Specs AUD_SinusReader::getSpecs() const
{
AUD_Specs specs;
specs.rate = m_sampleRate;
@@ -73,27 +66,17 @@ AUD_Specs AUD_SinusReader::getSpecs()
return specs;
}
-AUD_ReaderType AUD_SinusReader::getType()
-{
- return AUD_TYPE_STREAM;
-}
-
-bool AUD_SinusReader::notify(AUD_Message &message)
-{
- return false;
-}
-
void AUD_SinusReader::read(int & length, sample_t* & buffer)
{
// resize if necessary
- if(m_buffer->getSize() < length * sizeof(sample_t))
- m_buffer->resize(length * sizeof(sample_t));
+ if(m_buffer.getSize() < length * sizeof(sample_t))
+ m_buffer.resize(length * sizeof(sample_t));
// fill with sine data
- buffer = m_buffer->getBuffer();
+ buffer = m_buffer.getBuffer();
for(int i = 0; i < length; i++)
{
- buffer[i] = sin((m_position + i) * 2.0f * M_PI * m_frequency /
+ buffer[i] = sin((m_position + i) * 2 * M_PI * m_frequency /
(float)m_sampleRate);
}
diff --git a/intern/audaspace/intern/AUD_SinusReader.h b/intern/audaspace/intern/AUD_SinusReader.h
index cb060dd8a43..4b88ed15db1 100644
--- a/intern/audaspace/intern/AUD_SinusReader.h
+++ b/intern/audaspace/intern/AUD_SinusReader.h
@@ -27,7 +27,7 @@
#define AUD_SINUSREADER
#include "AUD_IReader.h"
-class AUD_Buffer;
+#include "AUD_Buffer.h"
/**
* This class is used for sine tone playback.
@@ -43,7 +43,7 @@ private:
/**
* The frequency of the sine wave.
*/
- double m_frequency;
+ const float m_frequency;
/**
* The current position in samples.
@@ -53,12 +53,16 @@ private:
/**
* The playback buffer.
*/
- AUD_Buffer* m_buffer;
+ AUD_Buffer m_buffer;
/**
* The sample rate for the output.
*/
- AUD_SampleRate m_sampleRate;
+ const AUD_SampleRate m_sampleRate;
+
+ // hide copy constructor and operator=
+ AUD_SinusReader(const AUD_SinusReader&);
+ AUD_SinusReader& operator=(const AUD_SinusReader&);
public:
/**
@@ -66,20 +70,13 @@ public:
* \param frequency The frequency of the sine wave.
* \param sampleRate The output sample rate.
*/
- AUD_SinusReader(double frequency, AUD_SampleRate sampleRate);
-
- /**
- * Destroys the reader.
- */
- virtual ~AUD_SinusReader();
+ AUD_SinusReader(float frequency, AUD_SampleRate sampleRate);
- virtual bool isSeekable();
+ virtual bool isSeekable() const;
virtual void seek(int position);
- virtual int getLength();
- virtual int getPosition();
- virtual AUD_Specs getSpecs();
- virtual AUD_ReaderType getType();
- virtual bool notify(AUD_Message &message);
+ virtual int getLength() const;
+ virtual int getPosition() const;
+ virtual AUD_Specs getSpecs() const;
virtual void read(int & length, sample_t* & buffer);
};
diff --git a/intern/audaspace/intern/AUD_SoftwareDevice.cpp b/intern/audaspace/intern/AUD_SoftwareDevice.cpp
index 5a3f25fba07..0c0206608e3 100644
--- a/intern/audaspace/intern/AUD_SoftwareDevice.cpp
+++ b/intern/audaspace/intern/AUD_SoftwareDevice.cpp
@@ -25,11 +25,11 @@
#include "AUD_SoftwareDevice.h"
#include "AUD_IReader.h"
-#include "AUD_Mixer.h"
+#include "AUD_DefaultMixer.h"
#include "AUD_IFactory.h"
-#include "AUD_SourceCaps.h"
#include <cstring>
+#include <limits>
/// Saves the data for playback.
struct AUD_SoftwareHandle : AUD_Handle
@@ -42,18 +42,24 @@ struct AUD_SoftwareHandle : AUD_Handle
/// The volume of the source.
float volume;
+
+ /// The loop count of the source.
+ int loopcount;
+
+ /// The stop callback.
+ stopCallback stop;
+
+ /// Stop callback data.
+ void* stop_data;
};
typedef std::list<AUD_SoftwareHandle*>::iterator AUD_HandleIterator;
void AUD_SoftwareDevice::create()
{
- m_playingSounds = new std::list<AUD_SoftwareHandle*>(); AUD_NEW("list")
- m_pausedSounds = new std::list<AUD_SoftwareHandle*>(); AUD_NEW("list")
m_playback = false;
m_volume = 1.0f;
- m_mixer = new AUD_Mixer(); AUD_NEW("mixer")
- m_mixer->setSpecs(m_specs);
+ m_mixer = new AUD_DefaultMixer(m_specs);
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
@@ -69,25 +75,27 @@ void AUD_SoftwareDevice::destroy()
if(m_playback)
playing(m_playback = false);
- delete m_mixer; AUD_DELETE("mixer")
+ delete m_mixer;
+
+ AUD_SoftwareHandle* handle;
// delete all playing sounds
- while(m_playingSounds->begin() != m_playingSounds->end())
+ while(!m_playingSounds.empty())
{
- delete (*(m_playingSounds->begin()))->reader; AUD_DELETE("reader")
- delete *(m_playingSounds->begin()); AUD_DELETE("handle")
- m_playingSounds->erase(m_playingSounds->begin());
+ handle = m_playingSounds.front();
+ m_playingSounds.pop_front();
+ delete handle->reader;
+ delete handle;
}
- delete m_playingSounds; AUD_DELETE("list")
// delete all paused sounds
- while(m_pausedSounds->begin() != m_pausedSounds->end())
+ while(!m_pausedSounds.empty())
{
- delete (*(m_pausedSounds->begin()))->reader; AUD_DELETE("reader")
- delete *(m_pausedSounds->begin()); AUD_DELETE("handle")
- m_pausedSounds->erase(m_pausedSounds->begin());
+ handle = m_pausedSounds.front();
+ m_pausedSounds.pop_front();
+ delete handle->reader;
+ delete handle;
}
- delete m_pausedSounds; AUD_DELETE("list")
pthread_mutex_destroy(&m_mutex);
}
@@ -99,12 +107,16 @@ void AUD_SoftwareDevice::mix(data_t* buffer, int length)
{
AUD_SoftwareHandle* sound;
int len;
+ int pos;
sample_t* buf;
std::list<AUD_SoftwareHandle*> stopSounds;
+ std::list<AUD_Buffer*> tempBufs;
+ AUD_Buffer* tempbuf;
+ int samplesize = AUD_SAMPLE_SIZE(m_specs);
// for all sounds
- AUD_HandleIterator it = m_playingSounds->begin();
- while(it != m_playingSounds->end())
+ AUD_HandleIterator it = m_playingSounds.begin();
+ while(it != m_playingSounds.end())
{
sound = *it;
// increment the iterator to make sure it's valid,
@@ -112,14 +124,42 @@ void AUD_SoftwareDevice::mix(data_t* buffer, int length)
++it;
// get the buffer from the source
+ pos = 0;
len = length;
sound->reader->read(len, buf);
- m_mixer->add(buf, 0, len, sound->volume);
+ // in case of looping
+ while(pos + len < length && sound->loopcount)
+ {
+ tempbuf = new AUD_Buffer(len * samplesize);
+ memcpy(tempbuf->getBuffer(), buf, len * samplesize);
+ tempBufs.push_back(tempbuf);
+ m_mixer->add(tempbuf->getBuffer(), pos, len, sound->volume);
+
+ pos += len;
+
+ if(sound->loopcount > 0)
+ sound->loopcount--;
+
+ sound->reader->seek(0);
+
+ len = length - pos;
+ sound->reader->read(len, buf);
+
+ // prevent endless loop
+ if(!len)
+ break;
+ }
+
+ m_mixer->add(buf, pos, len, sound->volume);
+ pos += len;
// in case the end of the sound is reached
- if(len < length)
+ if(pos < length)
{
+ if(sound->stop)
+ sound->stop(sound->stop_data);
+
if(sound->keep)
pause(sound);
else
@@ -130,12 +170,20 @@ void AUD_SoftwareDevice::mix(data_t* buffer, int length)
// superpose
m_mixer->superpose(buffer, length, m_volume);
+ // cleanup
while(!stopSounds.empty())
{
sound = stopSounds.front();
stopSounds.pop_front();
stop(sound);
}
+
+ while(!tempBufs.empty())
+ {
+ tempbuf = tempBufs.front();
+ tempBufs.pop_front();
+ delete tempbuf;
+ }
}
unlock();
@@ -143,18 +191,18 @@ void AUD_SoftwareDevice::mix(data_t* buffer, int length)
bool AUD_SoftwareDevice::isValid(AUD_Handle* handle)
{
- for(AUD_HandleIterator i = m_playingSounds->begin();
- i != m_playingSounds->end(); i++)
+ for(AUD_HandleIterator i = m_playingSounds.begin();
+ i != m_playingSounds.end(); i++)
if(*i == handle)
return true;
- for(AUD_HandleIterator i = m_pausedSounds->begin();
- i != m_pausedSounds->end(); i++)
+ for(AUD_HandleIterator i = m_pausedSounds.begin();
+ i != m_pausedSounds.end(); i++)
if(*i == handle)
return true;
return false;
}
-AUD_DeviceSpecs AUD_SoftwareDevice::getSpecs()
+AUD_DeviceSpecs AUD_SoftwareDevice::getSpecs() const
{
return m_specs;
}
@@ -163,24 +211,22 @@ AUD_Handle* AUD_SoftwareDevice::play(AUD_IFactory* factory, bool keep)
{
AUD_IReader* reader = factory->createReader();
- if(reader == NULL)
- AUD_THROW(AUD_ERROR_READER);
-
// prepare the reader
reader = m_mixer->prepare(reader);
if(reader == NULL)
return NULL;
- AUD_Specs rs = reader->getSpecs();
-
// play sound
- AUD_SoftwareHandle* sound = new AUD_SoftwareHandle; AUD_NEW("handle")
+ AUD_SoftwareHandle* sound = new AUD_SoftwareHandle;
sound->keep = keep;
sound->reader = reader;
sound->volume = 1.0f;
+ sound->loopcount = 0;
+ sound->stop = NULL;
+ sound->stop_data = NULL;
lock();
- m_playingSounds->push_back(sound);
+ m_playingSounds.push_back(sound);
if(!m_playback)
playing(m_playback = true);
@@ -196,14 +242,14 @@ bool AUD_SoftwareDevice::pause(AUD_Handle* handle)
lock();
// only songs that are played can be paused
- for(AUD_HandleIterator i = m_playingSounds->begin();
- i != m_playingSounds->end(); i++)
+ for(AUD_HandleIterator i = m_playingSounds.begin();
+ i != m_playingSounds.end(); i++)
{
if(*i == handle)
{
- m_pausedSounds->push_back(*i);
- m_playingSounds->erase(i);
- if(m_playingSounds->empty())
+ m_pausedSounds.push_back(*i);
+ m_playingSounds.erase(i);
+ if(m_playingSounds.empty())
playing(m_playback = false);
result = true;
break;
@@ -222,13 +268,13 @@ bool AUD_SoftwareDevice::resume(AUD_Handle* handle)
lock();
// only songs that are paused can be resumed
- for(AUD_HandleIterator i = m_pausedSounds->begin();
- i != m_pausedSounds->end(); i++)
+ for(AUD_HandleIterator i = m_pausedSounds.begin();
+ i != m_pausedSounds.end(); i++)
{
if(*i == handle)
{
- m_playingSounds->push_back(*i);
- m_pausedSounds->erase(i);
+ m_playingSounds.push_back(*i);
+ m_pausedSounds.erase(i);
if(!m_playback)
playing(m_playback = true);
result = true;
@@ -247,15 +293,15 @@ bool AUD_SoftwareDevice::stop(AUD_Handle* handle)
lock();
- for(AUD_HandleIterator i = m_playingSounds->begin();
- i != m_playingSounds->end(); i++)
+ for(AUD_HandleIterator i = m_playingSounds.begin();
+ i != m_playingSounds.end(); i++)
{
if(*i == handle)
{
- delete (*i)->reader; AUD_DELETE("reader")
- delete *i; AUD_DELETE("handle")
- m_playingSounds->erase(i);
- if(m_playingSounds->empty())
+ delete (*i)->reader;
+ delete *i;
+ m_playingSounds.erase(i);
+ if(m_playingSounds.empty())
playing(m_playback = false);
result = true;
break;
@@ -263,14 +309,14 @@ bool AUD_SoftwareDevice::stop(AUD_Handle* handle)
}
if(!result)
{
- for(AUD_HandleIterator i = m_pausedSounds->begin();
- i != m_pausedSounds->end(); i++)
+ for(AUD_HandleIterator i = m_pausedSounds.begin();
+ i != m_pausedSounds.end(); i++)
{
if(*i == handle)
{
- delete (*i)->reader; AUD_DELETE("reader")
- delete *i; AUD_DELETE("handle")
- m_pausedSounds->erase(i);
+ delete (*i)->reader;
+ delete *i;
+ m_pausedSounds.erase(i);
result = true;
break;
}
@@ -282,41 +328,34 @@ bool AUD_SoftwareDevice::stop(AUD_Handle* handle)
return result;
}
-bool AUD_SoftwareDevice::setKeep(AUD_Handle* handle, bool keep)
+bool AUD_SoftwareDevice::getKeep(AUD_Handle* handle)
{
bool result = false;
lock();
if(isValid(handle))
- {
- ((AUD_SoftwareHandle*)handle)->keep = keep;
- result = true;
- }
+ result = ((AUD_SoftwareHandle*)handle)->keep;
unlock();
return result;
}
-bool AUD_SoftwareDevice::sendMessage(AUD_Handle* handle, AUD_Message &message)
+bool AUD_SoftwareDevice::setKeep(AUD_Handle* handle, bool keep)
{
- lock();
-
bool result = false;
- if(handle == 0)
+ lock();
+
+ if(isValid(handle))
{
- for(AUD_HandleIterator i = m_playingSounds->begin();
- i != m_playingSounds->end(); i++)
- result |= (*i)->reader->notify(message);
- for(AUD_HandleIterator i = m_pausedSounds->begin();
- i != m_pausedSounds->end(); i++)
- result |= (*i)->reader->notify(message);
+ ((AUD_SoftwareHandle*)handle)->keep = keep;
+ result = true;
}
- else if(isValid(handle))
- result = ((AUD_SoftwareHandle*)handle)->reader->notify(message);
+
unlock();
+
return result;
}
@@ -361,8 +400,8 @@ AUD_Status AUD_SoftwareDevice::getStatus(AUD_Handle* handle)
lock();
- for(AUD_HandleIterator i = m_playingSounds->begin();
- i != m_playingSounds->end(); i++)
+ for(AUD_HandleIterator i = m_playingSounds.begin();
+ i != m_playingSounds.end(); i++)
{
if(*i == handle)
{
@@ -372,8 +411,8 @@ AUD_Status AUD_SoftwareDevice::getStatus(AUD_Handle* handle)
}
if(status == AUD_STATUS_INVALID)
{
- for(AUD_HandleIterator i = m_pausedSounds->begin();
- i != m_pausedSounds->end(); i++)
+ for(AUD_HandleIterator i = m_pausedSounds.begin();
+ i != m_pausedSounds.end(); i++)
{
if(*i == handle)
{
@@ -398,77 +437,76 @@ void AUD_SoftwareDevice::unlock()
pthread_mutex_unlock(&m_mutex);
}
-bool AUD_SoftwareDevice::checkCapability(int capability)
+float AUD_SoftwareDevice::getVolume() const
{
- return capability == AUD_CAPS_SOFTWARE_DEVICE ||
- capability == AUD_CAPS_VOLUME ||
- capability == AUD_CAPS_SOURCE_VOLUME;
+ return m_volume;
}
-bool AUD_SoftwareDevice::setCapability(int capability, void *value)
+void AUD_SoftwareDevice::setVolume(float volume)
{
- bool result = false;
+ m_volume = volume;
+}
- switch(capability)
- {
- case AUD_CAPS_VOLUME:
- lock();
- m_volume = *((float*)value);
- if(m_volume > 1.0f)
- m_volume = 1.0f;
- else if(m_volume < 0.0f)
- m_volume = 0.0f;
- unlock();
- return true;
- case AUD_CAPS_SOURCE_VOLUME:
- {
- AUD_SourceCaps* caps = (AUD_SourceCaps*) value;
- lock();
- if(isValid(caps->handle))
- {
- AUD_SoftwareHandle* handle = (AUD_SoftwareHandle*)caps->handle;
- handle->volume = caps->value;
- if(handle->volume > 1.0f)
- handle->volume = 1.0f;
- else if(handle->volume < 0.0f)
- handle->volume = 0.0f;
- result = true;
- }
- unlock();
- }
- break;
- }
+float AUD_SoftwareDevice::getVolume(AUD_Handle* handle)
+{
+ lock();
+ float result = std::numeric_limits<float>::quiet_NaN();
+ if(isValid(handle))
+ result = ((AUD_SoftwareHandle*)handle)->volume;
+ unlock();
+ return result;
+}
- return result;;
+bool AUD_SoftwareDevice::setVolume(AUD_Handle* handle, float volume)
+{
+ lock();
+ bool result = isValid(handle);
+ if(result)
+ ((AUD_SoftwareHandle*)handle)->volume = volume;
+ unlock();
+ return result;
}
-bool AUD_SoftwareDevice::getCapability(int capability, void *value)
+float AUD_SoftwareDevice::getPitch(AUD_Handle* handle)
{
- bool result = false;
+ return std::numeric_limits<float>::quiet_NaN();
+}
- switch(capability)
- {
- case AUD_CAPS_VOLUME:
- lock();
- *((float*)value) = m_volume;
- unlock();
- return true;
- case AUD_CAPS_SOURCE_VOLUME:
- {
- AUD_SourceCaps* caps = (AUD_SourceCaps*) value;
+bool AUD_SoftwareDevice::setPitch(AUD_Handle* handle, float pitch)
+{
+ return false;
+}
- lock();
+int AUD_SoftwareDevice::getLoopCount(AUD_Handle* handle)
+{
+ lock();
+ int result = 0;
+ if(isValid(handle))
+ result = ((AUD_SoftwareHandle*)handle)->loopcount;
+ unlock();
+ return result;
+}
- if(isValid(caps->handle))
- {
- caps->value = ((AUD_SoftwareHandle*)caps->handle)->volume;
- result = true;
- }
+bool AUD_SoftwareDevice::setLoopCount(AUD_Handle* handle, int count)
+{
+ lock();
+ bool result = isValid(handle);
+ if(result)
+ ((AUD_SoftwareHandle*)handle)->loopcount = count;
+ unlock();
+ return result;
+}
- unlock();
- }
- break;
+bool AUD_SoftwareDevice::setStopCallback(AUD_Handle* handle, stopCallback callback, void* data)
+{
+ lock();
+ bool result = isValid(handle);
+ if(result)
+ {
+ AUD_SoftwareHandle* h = (AUD_SoftwareHandle*)handle;
+ h->stop = callback;
+ h->stop_data = data;
}
-
+ unlock();
return result;
}
diff --git a/intern/audaspace/intern/AUD_SoftwareDevice.h b/intern/audaspace/intern/AUD_SoftwareDevice.h
index a12fddb1e00..93b0f165c7a 100644
--- a/intern/audaspace/intern/AUD_SoftwareDevice.h
+++ b/intern/audaspace/intern/AUD_SoftwareDevice.h
@@ -29,6 +29,7 @@
#include "AUD_IDevice.h"
struct AUD_SoftwareHandle;
class AUD_Mixer;
+class AUD_Buffer;
#include <list>
#include <pthread.h>
@@ -81,12 +82,12 @@ private:
/**
* The list of sounds that are currently playing.
*/
- std::list<AUD_SoftwareHandle*>* m_playingSounds;
+ std::list<AUD_SoftwareHandle*> m_playingSounds;
/**
* The list of sounds that are currently paused.
*/
- std::list<AUD_SoftwareHandle*>* m_pausedSounds;
+ std::list<AUD_SoftwareHandle*> m_pausedSounds;
/**
* Whether there is currently playback.
@@ -111,21 +112,27 @@ private:
bool isValid(AUD_Handle* handle);
public:
- virtual AUD_DeviceSpecs getSpecs();
+ virtual AUD_DeviceSpecs getSpecs() const;
virtual AUD_Handle* play(AUD_IFactory* factory, bool keep = false);
virtual bool pause(AUD_Handle* handle);
virtual bool resume(AUD_Handle* handle);
virtual bool stop(AUD_Handle* handle);
+ virtual bool getKeep(AUD_Handle* handle);
virtual bool setKeep(AUD_Handle* handle, bool keep);
- virtual bool sendMessage(AUD_Handle* handle, AUD_Message &message);
virtual bool seek(AUD_Handle* handle, float position);
virtual float getPosition(AUD_Handle* handle);
virtual AUD_Status getStatus(AUD_Handle* handle);
virtual void lock();
virtual void unlock();
- virtual bool checkCapability(int capability);
- virtual bool setCapability(int capability, void *value);
- virtual bool getCapability(int capability, void *value);
+ virtual float getVolume() const;
+ virtual void setVolume(float volume);
+ virtual float getVolume(AUD_Handle* handle);
+ virtual bool setVolume(AUD_Handle* handle, float volume);
+ virtual float getPitch(AUD_Handle* handle);
+ virtual bool setPitch(AUD_Handle* handle, float pitch);
+ virtual int getLoopCount(AUD_Handle* handle);
+ virtual bool setLoopCount(AUD_Handle* handle, int count);
+ virtual bool setStopCallback(AUD_Handle* handle, stopCallback callback = NULL, void* data = NULL);
};
#endif //AUD_SOFTWAREDEVICE
diff --git a/intern/audaspace/intern/AUD_Space.h b/intern/audaspace/intern/AUD_Space.h
index 9e857ce73b0..e411b831d52 100644
--- a/intern/audaspace/intern/AUD_Space.h
+++ b/intern/audaspace/intern/AUD_Space.h
@@ -33,7 +33,7 @@
/// The size of a sample in the specified format in bytes.
#define AUD_SAMPLE_SIZE(specs) (specs.channels * sizeof(sample_t))
/// Throws a AUD_Exception with the provided error code.
-#define AUD_THROW(exception) { AUD_Exception e; e.error = exception; throw e; }
+#define AUD_THROW(exception, errorstr) { AUD_Exception e; e.error = exception; e.str = errorstr; throw e; }
/// Returns the smaller of the two values.
#define AUD_MIN(a, b) (((a) < (b)) ? (a) : (b))
@@ -47,64 +47,6 @@
/// The default playback buffer size of a device.
#define AUD_DEFAULT_BUFFER_SIZE 1024
-// Capability defines
-
-/// This capability checks whether a device is a 3D device. See AUD_I3DDevice.h.
-#define AUD_CAPS_3D_DEVICE 0x0001
-
-/**
- * This capability checks whether a device is a software device. See
- * AUD_SoftwareDevice.
- */
-#define AUD_CAPS_SOFTWARE_DEVICE 0x0002
-
-/**
- * This capability enables the user to set the overall volume of the device.
- * You can set and get it with the pointer pointing to a float value between
- * 0.0 (muted) and 1.0 (maximum volume).
- */
-#define AUD_CAPS_VOLUME 0x0101
-
-/**
- * This capability enables the user to set the volume of a source.
- * You can set and get it with the pointer pointing to a AUD_SourceValue
- * structure defined in AUD_SourceCaps.h.
- */
-#define AUD_CAPS_SOURCE_VOLUME 0x1001
-
-/**
- * This capability enables the user to set the pitch of a source.
- * You can set and get it with the pointer pointing to a AUD_SourceValue
- * structure defined in AUD_SourceCaps.h.
- */
-#define AUD_CAPS_SOURCE_PITCH 0x1002
-
-/**
- * This capability enables the user to buffer a factory into the device.
- * Setting with the factory as pointer loads the factory into a device internal
- * buffer. Play function calls with the buffered factory as argument result in
- * the internal buffer being played back, so there's no reader created, what
- * also results in not being able to send messages to that handle.
- * A repeated call with the same factory doesn't do anything.
- * A set call with a NULL pointer results in all buffered factories being
- * deleted.
- * \note This is only possible with factories that create readers of the buffer
- * type.
- */
-#define AUD_CAPS_BUFFERED_FACTORY 0x2001
-
-// Used for debugging memory leaks.
-//#define AUD_DEBUG_MEMORY
-
-#ifdef AUD_DEBUG_MEMORY
-extern int AUD_References(int count, const char* text);
-#define AUD_NEW(text) AUD_References(1, text);
-#define AUD_DELETE(text) AUD_References(-1, text);
-#else
-#define AUD_NEW(text)
-#define AUD_DELETE(text)
-#endif
-
/**
* The format of a sample.
* The last 4 bit save the byte count of the format.
@@ -154,17 +96,6 @@ typedef enum
AUD_RATE_192000 = 192000 /// 192000 Hz.
} AUD_SampleRate;
-/**
- * Type of a reader.
- * @see AUD_IReader for details.
- */
-typedef enum
-{
- AUD_TYPE_INVALID = 0, /// Invalid reader type.
- AUD_TYPE_BUFFER, /// Reader reads from a buffer.
- AUD_TYPE_STREAM /// Reader reads from a stream.
-} AUD_ReaderType;
-
/// Status of a playback handle.
typedef enum
{
@@ -177,23 +108,16 @@ typedef enum
typedef enum
{
AUD_NO_ERROR = 0,
- AUD_ERROR_READER,
- AUD_ERROR_FACTORY,
+ AUD_ERROR_SPECS,
+ AUD_ERROR_PROPS,
AUD_ERROR_FILE,
+ AUD_ERROR_SRC,
AUD_ERROR_FFMPEG,
- AUD_ERROR_SDL,
AUD_ERROR_OPENAL,
- AUD_ERROR_JACK
+ AUD_ERROR_SDL,
+ AUD_ERROR_JACK,
} AUD_Error;
-/// Message codes.
-typedef enum
-{
- AUD_MSG_INVALID = 0, /// Invalid message.
- AUD_MSG_LOOP, /// Loop reader message.
- AUD_MSG_VOLUME /// Volume reader message.
-} AUD_MessageType;
-
/// Fading types.
typedef enum
{
@@ -201,39 +125,17 @@ typedef enum
AUD_FADE_OUT
} AUD_FadeType;
-/// 3D device settings.
-typedef enum
-{
- AUD_3DS_NONE, /// No setting.
- AUD_3DS_SPEED_OF_SOUND, /// Speed of sound.
- AUD_3DS_DOPPLER_FACTOR, /// Doppler factor.
- AUD_3DS_DISTANCE_MODEL /// Distance model.
-} AUD_3DSetting;
-
/// Possible distance models for the 3D device.
-#define AUD_DISTANCE_MODEL_NONE 0.0f
-#define AUD_DISTANCE_MODEL_INVERSE 1.0f
-#define AUD_DISTANCE_MODEL_INVERSE_CLAMPED 2.0f
-#define AUD_DISTANCE_MODEL_LINEAR 3.0f
-#define AUD_DISTANCE_MODEL_LINEAR_CLAMPED 4.0f
-#define AUD_DISTANCE_MODEL_EXPONENT 5.0f
-#define AUD_DISTANCE_MODEL_EXPONENT_CLAMPED 6.0f
-
-/// 3D source settings.
typedef enum
{
- AUD_3DSS_NONE, /// No setting.
- AUD_3DSS_IS_RELATIVE, /// > 0 tells that the sound source is
- /// relative to the listener
- AUD_3DSS_MIN_GAIN, /// Minimum gain.
- AUD_3DSS_MAX_GAIN, /// Maximum gain.
- AUD_3DSS_REFERENCE_DISTANCE, /// Reference distance.
- AUD_3DSS_MAX_DISTANCE, /// Maximum distance.
- AUD_3DSS_ROLLOFF_FACTOR, /// Rolloff factor.
- AUD_3DSS_CONE_INNER_ANGLE, /// Cone inner angle.
- AUD_3DSS_CONE_OUTER_ANGLE, /// Cone outer angle.
- AUD_3DSS_CONE_OUTER_GAIN /// Cone outer gain.
-} AUD_3DSourceSetting;
+ AUD_DISTANCE_MODEL_INVALID = 0,
+ AUD_DISTANCE_MODEL_INVERSE,
+ AUD_DISTANCE_MODEL_INVERSE_CLAMPED,
+ AUD_DISTANCE_MODEL_LINEAR,
+ AUD_DISTANCE_MODEL_LINEAR_CLAMPED,
+ AUD_DISTANCE_MODEL_EXPONENT,
+ AUD_DISTANCE_MODEL_EXPONENT_CLAMPED,
+} AUD_DistanceModel;
/// Sample type.(float samples)
typedef float sample_t;
@@ -280,42 +182,12 @@ typedef struct
*/
AUD_Error error;
- // void* userData; - for the case it is needed someday
-} AUD_Exception;
-
-/// Message structure.
-typedef struct
-{
/**
- * The message type.
+ * Error string.
*/
- AUD_MessageType type;
-
- union
- {
- // loop reader
- struct
- {
- int loopcount;
- float time;
- };
-
- // volume reader
- float volume;
- };
-} AUD_Message;
+ const char* str;
-/// Handle structure, for inherition.
-typedef struct
-{
- /// x, y and z coordinates of the object.
- float position[3];
-
- /// x, y and z coordinates telling the velocity and direction of the object.
- float velocity[3];
-
- /// 3x3 matrix telling the orientation of the object.
- float orientation[9];
-} AUD_3DData;
+ // void* userData; - for the case it is needed someday
+} AUD_Exception;
#endif //AUD_SPACE
diff --git a/intern/audaspace/intern/AUD_StreamBufferFactory.cpp b/intern/audaspace/intern/AUD_StreamBufferFactory.cpp
index 4d2cd9e2505..c1eb8161e30 100644
--- a/intern/audaspace/intern/AUD_StreamBufferFactory.cpp
+++ b/intern/audaspace/intern/AUD_StreamBufferFactory.cpp
@@ -29,22 +29,19 @@
#include <cstring>
-AUD_StreamBufferFactory::AUD_StreamBufferFactory(AUD_IFactory* factory)
+AUD_StreamBufferFactory::AUD_StreamBufferFactory(AUD_IFactory* factory) :
+ m_buffer(new AUD_Buffer())
{
AUD_IReader* reader = factory->createReader();
- if(reader == NULL)
- AUD_THROW(AUD_ERROR_READER);
-
m_specs = reader->getSpecs();
- m_buffer = AUD_Reference<AUD_Buffer>(new AUD_Buffer()); AUD_NEW("buffer")
int sample_size = AUD_SAMPLE_SIZE(m_specs);
int length;
int index = 0;
sample_t* buffer;
- // get an aproximated size if possible
+ // get an approximated size if possible
int size = reader->getLength();
if(size <= 0)
@@ -68,13 +65,11 @@ AUD_StreamBufferFactory::AUD_StreamBufferFactory(AUD_IFactory* factory)
index += length;
}
- m_buffer.get()->resize(index*sample_size, true);
- delete reader; AUD_DELETE("reader")
+ m_buffer.get()->resize(index * sample_size, true);
+ delete reader;
}
-AUD_IReader* AUD_StreamBufferFactory::createReader()
+AUD_IReader* AUD_StreamBufferFactory::createReader() const
{
- AUD_IReader* reader = new AUD_BufferReader(m_buffer, m_specs);
- AUD_NEW("reader")
- return reader;
+ return new AUD_BufferReader(m_buffer, m_specs);
}
diff --git a/intern/audaspace/intern/AUD_StreamBufferFactory.h b/intern/audaspace/intern/AUD_StreamBufferFactory.h
index eda06f6c10c..d0cf1001e5c 100644
--- a/intern/audaspace/intern/AUD_StreamBufferFactory.h
+++ b/intern/audaspace/intern/AUD_StreamBufferFactory.h
@@ -47,6 +47,10 @@ private:
*/
AUD_Specs m_specs;
+ // hide copy constructor and operator=
+ AUD_StreamBufferFactory(const AUD_StreamBufferFactory&);
+ AUD_StreamBufferFactory& operator=(const AUD_StreamBufferFactory&);
+
public:
/**
* Creates the factory and reads the reader created by the factory supplied
@@ -56,7 +60,7 @@ public:
*/
AUD_StreamBufferFactory(AUD_IFactory* factory);
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_STREAMBUFFERFACTORY
diff --git a/intern/audaspace/intern/Makefile b/intern/audaspace/intern/Makefile
index 8b159f4a639..b89a8bcd397 100644
--- a/intern/audaspace/intern/Makefile
+++ b/intern/audaspace/intern/Makefile
@@ -35,6 +35,8 @@ include nan_compile.mk
CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
+CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
+
ifeq ($(WITH_SDL),true)
CPPFLAGS += -DWITH_SDL
CPPFLAGS += $(NAN_SDLCFLAGS)
@@ -67,5 +69,6 @@ CPPFLAGS += -I../ffmpeg
CPPFLAGS += -I../FX
CPPFLAGS += -I../SDL
CPPFLAGS += -I../SRC
+CPPFLAGS += -I../Python
CPPFLAGS += -I..
CPPFLAGS += -I.
diff --git a/intern/audaspace/jack/AUD_JackDevice.cpp b/intern/audaspace/jack/AUD_JackDevice.cpp
index ae7725be81c..5aa3f7b3fc1 100644
--- a/intern/audaspace/jack/AUD_JackDevice.cpp
+++ b/intern/audaspace/jack/AUD_JackDevice.cpp
@@ -26,7 +26,6 @@
#include "AUD_Mixer.h"
#include "AUD_JackDevice.h"
#include "AUD_IReader.h"
-#include "AUD_Buffer.h"
#include <stdio.h>
#include <stdlib.h>
@@ -43,8 +42,8 @@ void AUD_JackDevice::updateRingBuffers()
unsigned int samplesize = AUD_SAMPLE_SIZE(m_specs);
unsigned int i, j;
unsigned int channels = m_specs.channels;
- sample_t* buffer = m_buffer->getBuffer();
- float* deinterleave = m_deinterleavebuf->getBuffer();
+ sample_t* buffer = m_buffer.getBuffer();
+ float* deinterleave = m_deinterleavebuf.getBuffer();
jack_transport_state_t state;
jack_position_t position;
@@ -173,7 +172,13 @@ void AUD_JackDevice::jack_shutdown(void *data)
device->m_valid = false;
}
-AUD_JackDevice::AUD_JackDevice(AUD_DeviceSpecs specs, int buffersize)
+static const char* clientopen_error = "AUD_JackDevice: Couldn't connect to "
+ "jack server.";
+static const char* port_error = "AUD_JackDevice: Couldn't create output port.";
+static const char* activate_error = "AUD_JackDevice: Couldn't activate the "
+ "client.";
+
+AUD_JackDevice::AUD_JackDevice(std::string name, AUD_DeviceSpecs specs, int buffersize)
{
if(specs.channels == AUD_CHANNELS_INVALID)
specs.channels = AUD_CHANNELS_STEREO;
@@ -186,9 +191,9 @@ AUD_JackDevice::AUD_JackDevice(AUD_DeviceSpecs specs, int buffersize)
jack_status_t status;
// open client
- m_client = jack_client_open("Blender", options, &status);
+ m_client = jack_client_open(name.c_str(), options, &status);
if(m_client == NULL)
- AUD_THROW(AUD_ERROR_JACK);
+ AUD_THROW(AUD_ERROR_JACK, clientopen_error);
// set callbacks
jack_set_process_callback(m_client, AUD_JackDevice::jack_mix, this);
@@ -196,7 +201,7 @@ AUD_JackDevice::AUD_JackDevice(AUD_DeviceSpecs specs, int buffersize)
jack_set_sync_callback(m_client, AUD_JackDevice::jack_sync, this);
// register our output channels which are called ports in jack
- m_ports = new jack_port_t*[m_specs.channels]; AUD_NEW("jack_port")
+ m_ports = new jack_port_t*[m_specs.channels];
try
{
@@ -208,25 +213,25 @@ AUD_JackDevice::AUD_JackDevice(AUD_DeviceSpecs specs, int buffersize)
JACK_DEFAULT_AUDIO_TYPE,
JackPortIsOutput, 0);
if(m_ports[i] == NULL)
- AUD_THROW(AUD_ERROR_JACK);
+ AUD_THROW(AUD_ERROR_JACK, port_error);
}
}
- catch(AUD_Exception)
+ catch(AUD_Exception&)
{
jack_client_close(m_client);
- delete[] m_ports; AUD_DELETE("jack_port")
+ delete[] m_ports;
throw;
}
m_specs.rate = (AUD_SampleRate)jack_get_sample_rate(m_client);
buffersize *= sizeof(sample_t);
- m_ringbuffers = new jack_ringbuffer_t*[specs.channels]; AUD_NEW("jack_buffers")
+ m_ringbuffers = new jack_ringbuffer_t*[specs.channels];
for(unsigned int i = 0; i < specs.channels; i++)
m_ringbuffers[i] = jack_ringbuffer_create(buffersize);
buffersize *= specs.channels;
- m_buffer = new AUD_Buffer(buffersize); AUD_NEW("buffer");
- m_deinterleavebuf = new AUD_Buffer(buffersize); AUD_NEW("buffer");
+ m_deinterleavebuf.resize(buffersize);
+ m_buffer.resize(buffersize);
create();
@@ -238,25 +243,19 @@ AUD_JackDevice::AUD_JackDevice(AUD_DeviceSpecs specs, int buffersize)
pthread_mutex_init(&m_mixingLock, NULL);
pthread_cond_init(&m_mixingCondition, NULL);
- try
- {
- // activate the client
- if(jack_activate(m_client))
- AUD_THROW(AUD_ERROR_JACK);
- }
- catch(AUD_Exception)
+ // activate the client
+ if(jack_activate(m_client))
{
jack_client_close(m_client);
- delete[] m_ports; AUD_DELETE("jack_port")
- delete m_buffer; AUD_DELETE("buffer");
- delete m_deinterleavebuf; AUD_DELETE("buffer");
+ delete[] m_ports;
for(unsigned int i = 0; i < specs.channels; i++)
jack_ringbuffer_free(m_ringbuffers[i]);
- delete[] m_ringbuffers; AUD_DELETE("jack_buffers")
+ delete[] m_ringbuffers;
pthread_mutex_destroy(&m_mixingLock);
pthread_cond_destroy(&m_mixingCondition);
destroy();
- throw;
+
+ AUD_THROW(AUD_ERROR_JACK, activate_error);
}
const char** ports = jack_get_ports(m_client, NULL, NULL,
@@ -284,7 +283,7 @@ AUD_JackDevice::~AUD_JackDevice()
jack_client_close(m_client);
m_valid = false;
- delete[] m_ports; AUD_DELETE("jack_port")
+ delete[] m_ports;
pthread_mutex_lock(&m_mixingLock);
pthread_cond_signal(&m_mixingCondition);
@@ -293,11 +292,9 @@ AUD_JackDevice::~AUD_JackDevice()
pthread_cond_destroy(&m_mixingCondition);
pthread_mutex_destroy(&m_mixingLock);
- delete m_buffer; AUD_DELETE("buffer");
- delete m_deinterleavebuf; AUD_DELETE("buffer");
for(unsigned int i = 0; i < m_specs.channels; i++)
jack_ringbuffer_free(m_ringbuffers[i]);
- delete[] m_ringbuffers; AUD_DELETE("jack_buffers")
+ delete[] m_ringbuffers;
destroy();
}
diff --git a/intern/audaspace/jack/AUD_JackDevice.h b/intern/audaspace/jack/AUD_JackDevice.h
index 58e34978c1f..418992e0db1 100644
--- a/intern/audaspace/jack/AUD_JackDevice.h
+++ b/intern/audaspace/jack/AUD_JackDevice.h
@@ -28,7 +28,9 @@
#include "AUD_SoftwareDevice.h"
-class AUD_Buffer;
+#include "AUD_Buffer.h"
+
+#include <string>
#include <jack.h>
#include <ringbuffer.h>
@@ -54,9 +56,12 @@ private:
/**
* The output buffer.
*/
- AUD_Buffer* m_buffer;
+ AUD_Buffer m_buffer;
- AUD_Buffer* m_deinterleavebuf;
+ /**
+ * The deinterleaving buffer.
+ */
+ AUD_Buffer m_deinterleavebuf;
jack_ringbuffer_t** m_ringbuffers;
@@ -114,16 +119,23 @@ private:
void updateRingBuffers();
+ // hide copy constructor and operator=
+ AUD_JackDevice(const AUD_JackDevice&);
+ AUD_JackDevice& operator=(const AUD_JackDevice&);
+
protected:
virtual void playing(bool playing);
public:
/**
* Creates a Jack client for audio output.
- * \param specs The wanted audio specification, where only the channel count is important.
+ * \param name The client name.
+ * \param specs The wanted audio specification, where only the channel count
+ * is important.
+ * \param buffersize The size of the internal buffer.
* \exception AUD_Exception Thrown if the audio device cannot be opened.
*/
- AUD_JackDevice(AUD_DeviceSpecs specs, int buffersize = AUD_DEFAULT_BUFFER_SIZE);
+ AUD_JackDevice(std::string name, AUD_DeviceSpecs specs, int buffersize = AUD_DEFAULT_BUFFER_SIZE);
/**
* Closes the Jack client.
diff --git a/intern/audaspace/make/msvc_9_0/audaspace.vcproj b/intern/audaspace/make/msvc_9_0/audaspace.vcproj
index 379f435e3b8..e6d83f18b01 100644
--- a/intern/audaspace/make/msvc_9_0/audaspace.vcproj
+++ b/intern/audaspace/make/msvc_9_0/audaspace.vcproj
@@ -44,7 +44,7 @@
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="2"
- AdditionalIncludeDirectories="..\..;..\..\ffmpeg;..\..\FX;..\..\intern;..\..\OpenAL;..\..\SDL;..\..\SRC;..\..\sndfile;..\..\..\..\..\lib\windows\pthreads\include;..\..\..\..\..\lib\windows\samplerate\include;..\..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\..\lib\windows\sdl\include;..\..\..\..\..\lib\windows\openal\include;..\..\..\..\..\lib\windows\jack\include;..\..\..\..\..\lib\windows\sndfile\include;..\..\..\..\..\lib\windows\fftw3\include"
+ AdditionalIncludeDirectories="..\..;..\..\ffmpeg;..\..\FX;..\..\intern;..\..\OpenAL;..\..\SDL;..\..\SRC;..\..\sndfile;..\..\Python;..\..\..\..\..\lib\windows\pthreads\include;..\..\..\..\..\lib\windows\samplerate\include;..\..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\..\lib\windows\sdl\include;..\..\..\..\..\lib\windows\openal\include;..\..\..\..\..\lib\windows\jack\include;..\..\..\..\..\lib\windows\sndfile\include;..\..\..\..\..\lib\windows\fftw3\include;..\..\..\..\..\lib\windows\python\include\python3.1"
PreprocessorDefinitions="WIN32,NDEBUG,_LIB,WITH_FFMPEG,WITH_SDL,WITH_OPENAL"
StringPooling="true"
RuntimeLibrary="0"
@@ -118,7 +118,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..;..\..\ffmpeg;..\..\FX;..\..\intern;..\..\OpenAL;..\..\SDL;..\..\SRC;..\..\sndfile;..\..\..\..\..\lib\windows\pthreads\include;..\..\..\..\..\lib\windows\samplerate\include;..\..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\..\lib\windows\sdl\include;..\..\..\..\..\lib\windows\openal\include;..\..\..\..\..\lib\windows\jack\include;..\..\..\..\..\lib\windows\sndfile\include;..\..\..\..\..\lib\windows\fftw3\include"
+ AdditionalIncludeDirectories="..\..;..\..\ffmpeg;..\..\FX;..\..\intern;..\..\OpenAL;..\..\SDL;..\..\SRC;..\..\sndfile;..\..\Python;..\..\..\..\..\lib\windows\pthreads\include;..\..\..\..\..\lib\windows\samplerate\include;..\..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\..\lib\windows\sdl\include;..\..\..\..\..\lib\windows\openal\include;..\..\..\..\..\lib\windows\jack\include;..\..\..\..\..\lib\windows\sndfile\include;..\..\..\..\..\lib\windows\fftw3\include;..\..\..\..\..\lib\windows\python\include\python3.1"
PreprocessorDefinitions="WIN32,_DEBUG,_LIB,WITH_FFMPEG,WITH_SDL,WITH_OPENAL"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@@ -193,7 +193,7 @@
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="2"
- AdditionalIncludeDirectories="..\..;..\..\ffmpeg;..\..\FX;..\..\intern;..\..\OpenAL;..\..\SDL;..\..\SRC;..\..\sndfile;..\..\..\..\..\lib\windows\pthreads\include;..\..\..\..\..\lib\windows\samplerate\include;..\..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\..\lib\windows\sdl\include;..\..\..\..\..\lib\windows\openal\include;..\..\..\..\..\lib\windows\jack\include;..\..\..\..\..\lib\windows\sndfile\include;..\..\..\..\..\lib\windows\fftw3\include"
+ AdditionalIncludeDirectories="..\..;..\..\ffmpeg;..\..\FX;..\..\intern;..\..\OpenAL;..\..\SDL;..\..\SRC;..\..\sndfile;..\..\Python;..\..\..\..\..\lib\windows\pthreads\include;..\..\..\..\..\lib\windows\samplerate\include;..\..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\..\lib\windows\sdl\include;..\..\..\..\..\lib\windows\openal\include;..\..\..\..\..\lib\windows\jack\include;..\..\..\..\..\lib\windows\sndfile\include;..\..\..\..\..\lib\windows\fftw3\include;..\..\..\..\..\lib\windows\python\include\python3.1"
PreprocessorDefinitions="WIN32,NDEBUG,_LIB,WITH_FFMPEG,WITH_SDL,WITH_OPENAL"
StringPooling="true"
RuntimeLibrary="2"
@@ -267,7 +267,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..;..\..\ffmpeg;..\..\FX;..\..\intern;..\..\OpenAL;..\..\SDL;..\..\SRC;..\..\sndfile;..\..\..\..\..\lib\windows\pthreads\include;..\..\..\..\..\lib\windows\samplerate\include;..\..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\..\lib\windows\sdl\include;..\..\..\..\..\lib\windows\openal\include;..\..\..\..\..\lib\windows\jack\include;..\..\..\..\..\lib\windows\sndfile\include;..\..\..\..\..\lib\windows\fftw3\include"
+ AdditionalIncludeDirectories="..\..;..\..\ffmpeg;..\..\FX;..\..\intern;..\..\OpenAL;..\..\SDL;..\..\SRC;..\..\sndfile;..\..\Python;..\..\..\..\..\lib\windows\pthreads\include;..\..\..\..\..\lib\windows\samplerate\include;..\..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\..\lib\windows\sdl\include;..\..\..\..\..\lib\windows\openal\include;..\..\..\..\..\lib\windows\jack\include;..\..\..\..\..\lib\windows\sndfile\include;..\..\..\..\..\lib\windows\fftw3\include;..\..\..\..\..\lib\windows\python\include\python3.1"
PreprocessorDefinitions="WIN32,_DEBUG,_LIB,WITH_FFMPEG,WITH_SDL,WITH_OPENAL"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -322,6 +322,10 @@
Name="intern"
>
<File
+ RelativePath="..\..\intern\AUD_3DMath.h"
+ >
+ </File>
+ <File
RelativePath="..\..\intern\AUD_Buffer.cpp"
>
</File>
@@ -386,6 +390,14 @@
>
</File>
<File
+ RelativePath="..\..\intern\AUD_DefaultMixer.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\AUD_DefaultMixer.h"
+ >
+ </File>
+ <File
RelativePath="..\..\intern\AUD_FileFactory.cpp"
>
</File>
@@ -450,6 +462,10 @@
>
</File>
<File
+ RelativePath="..\..\intern\AUD_PyInit.h"
+ >
+ </File>
+ <File
RelativePath="..\..\intern\AUD_ReadDevice.cpp"
>
</File>
@@ -482,6 +498,22 @@
>
</File>
<File
+ RelativePath="..\..\intern\AUD_SilenceFactory.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\AUD_SilenceFactory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\AUD_SilenceReader.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\AUD_SilenceReader.h"
+ >
+ </File>
+ <File
RelativePath="..\..\intern\AUD_SinusFactory.cpp"
>
</File>
@@ -506,10 +538,6 @@
>
</File>
<File
- RelativePath="..\..\intern\AUD_SourceCaps.h"
- >
- </File>
- <File
RelativePath="..\..\intern\AUD_Space.h"
>
</File>
@@ -554,11 +582,11 @@
>
</File>
<File
- RelativePath="..\..\FX\AUD_AccumulatorReader.cpp"
+ RelativePath="..\..\FX\AUD_BaseIIRFilterReader.cpp"
>
</File>
<File
- RelativePath="..\..\FX\AUD_AccumulatorReader.h"
+ RelativePath="..\..\FX\AUD_BaseIIRFilterReader.h"
>
</File>
<File
@@ -570,11 +598,11 @@
>
</File>
<File
- RelativePath="..\..\FX\AUD_ButterworthReader.cpp"
+ RelativePath="..\..\FX\AUD_CallbackIIRFilterReader.cpp"
>
</File>
<File
- RelativePath="..\..\FX\AUD_ButterworthReader.h"
+ RelativePath="..\..\FX\AUD_CallbackIIRFilterReader.h"
>
</File>
<File
@@ -594,6 +622,14 @@
>
</File>
<File
+ RelativePath="..\..\FX\AUD_DoubleFactory.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\FX\AUD_DoubleFactory.h"
+ >
+ </File>
+ <File
RelativePath="..\..\FX\AUD_DoubleReader.cpp"
>
</File>
@@ -626,14 +662,6 @@
>
</File>
<File
- RelativePath="..\..\FX\AUD_EnvelopeReader.cpp"
- >
- </File>
- <File
- RelativePath="..\..\FX\AUD_EnvelopeReader.h"
- >
- </File>
- <File
RelativePath="..\..\FX\AUD_FaderFactory.cpp"
>
</File>
@@ -658,11 +686,19 @@
>
</File>
<File
- RelativePath="..\..\FX\AUD_HighpassReader.cpp"
+ RelativePath="..\..\FX\AUD_IIRFilterFactory.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\FX\AUD_IIRFilterFactory.h"
>
</File>
<File
- RelativePath="..\..\FX\AUD_HighpassReader.h"
+ RelativePath="..\..\FX\AUD_IIRFilterReader.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\FX\AUD_IIRFilterReader.h"
>
</File>
<File
@@ -706,14 +742,6 @@
>
</File>
<File
- RelativePath="..\..\FX\AUD_LowpassReader.cpp"
- >
- </File>
- <File
- RelativePath="..\..\FX\AUD_LowpassReader.h"
- >
- </File>
- <File
RelativePath="..\..\FX\AUD_PingPongFactory.cpp"
>
</File>
@@ -746,14 +774,6 @@
>
</File>
<File
- RelativePath="..\..\FX\AUD_RectifyReader.cpp"
- >
- </File>
- <File
- RelativePath="..\..\FX\AUD_RectifyReader.h"
- >
- </File>
- <File
RelativePath="..\..\FX\AUD_ReverseFactory.cpp"
>
</File>
@@ -778,14 +798,6 @@
>
</File>
<File
- RelativePath="..\..\FX\AUD_SquareReader.cpp"
- >
- </File>
- <File
- RelativePath="..\..\FX\AUD_SquareReader.h"
- >
- </File>
- <File
RelativePath="..\..\FX\AUD_SumFactory.cpp"
>
</File>
@@ -794,27 +806,27 @@
>
</File>
<File
- RelativePath="..\..\FX\AUD_SumReader.cpp"
+ RelativePath="..\..\FX\AUD_SuperposeFactory.cpp"
>
</File>
<File
- RelativePath="..\..\FX\AUD_SumReader.h"
+ RelativePath="..\..\FX\AUD_SuperposeFactory.h"
>
</File>
<File
- RelativePath="..\..\FX\AUD_VolumeFactory.cpp"
+ RelativePath="..\..\FX\AUD_SuperposeReader.cpp"
>
</File>
<File
- RelativePath="..\..\FX\AUD_VolumeFactory.h"
+ RelativePath="..\..\FX\AUD_SuperposeReader.h"
>
</File>
<File
- RelativePath="..\..\FX\AUD_VolumeReader.cpp"
+ RelativePath="..\..\FX\AUD_VolumeFactory.cpp"
>
</File>
<File
- RelativePath="..\..\FX\AUD_VolumeReader.h"
+ RelativePath="..\..\FX\AUD_VolumeFactory.h"
>
</File>
</Filter>
@@ -895,22 +907,14 @@
</File>
</Filter>
<Filter
- Name="fftw"
+ Name="Python"
>
<File
- RelativePath="..\..\fftw\AUD_BandPassFactory.cpp"
- >
- </File>
- <File
- RelativePath="..\..\fftw\AUD_BandPassFactory.h"
- >
- </File>
- <File
- RelativePath="..\..\fftw\AUD_BandPassReader.cpp"
+ RelativePath="..\..\Python\AUD_PyAPI.cpp"
>
</File>
<File
- RelativePath="..\..\fftw\AUD_BandPassReader.h"
+ RelativePath="..\..\Python\AUD_PyAPI.h"
>
</File>
</Filter>
diff --git a/intern/audaspace/sndfile/AUD_SndFileFactory.cpp b/intern/audaspace/sndfile/AUD_SndFileFactory.cpp
index bac6dc321f4..d8ea7006073 100644
--- a/intern/audaspace/sndfile/AUD_SndFileFactory.cpp
+++ b/intern/audaspace/sndfile/AUD_SndFileFactory.cpp
@@ -29,39 +29,21 @@
#include <cstring>
-AUD_SndFileFactory::AUD_SndFileFactory(const char* filename)
+AUD_SndFileFactory::AUD_SndFileFactory(std::string filename) :
+ m_filename(filename)
{
- if(filename != NULL)
- {
- m_filename = new char[strlen(filename)+1]; AUD_NEW("string")
- strcpy(m_filename, filename);
- }
- else
- m_filename = NULL;
}
-AUD_SndFileFactory::AUD_SndFileFactory(unsigned char* buffer, int size)
+AUD_SndFileFactory::AUD_SndFileFactory(const data_t* buffer, int size) :
+ m_buffer(new AUD_Buffer(size))
{
- m_filename = NULL;
- m_buffer = AUD_Reference<AUD_Buffer>(new AUD_Buffer(size));
memcpy(m_buffer.get()->getBuffer(), buffer, size);
}
-AUD_SndFileFactory::~AUD_SndFileFactory()
-{
- if(m_filename)
- {
- delete[] m_filename; AUD_DELETE("string")
- }
-}
-
-AUD_IReader* AUD_SndFileFactory::createReader()
+AUD_IReader* AUD_SndFileFactory::createReader() const
{
- AUD_IReader* reader;
- if(m_filename)
- reader = new AUD_SndFileReader(m_filename);
+ if(m_buffer.get())
+ return new AUD_SndFileReader(m_buffer);
else
- reader = new AUD_SndFileReader(m_buffer);
- AUD_NEW("reader")
- return reader;
+ return new AUD_SndFileReader(m_filename);
}
diff --git a/intern/audaspace/sndfile/AUD_SndFileFactory.h b/intern/audaspace/sndfile/AUD_SndFileFactory.h
index 98187ff1590..350e48abef8 100644
--- a/intern/audaspace/sndfile/AUD_SndFileFactory.h
+++ b/intern/audaspace/sndfile/AUD_SndFileFactory.h
@@ -30,6 +30,8 @@
#include "AUD_Reference.h"
class AUD_Buffer;
+#include <string>
+
/**
* This factory reads a sound file via libsndfile.
*/
@@ -39,33 +41,32 @@ private:
/**
* The filename of the sound source file.
*/
- char* m_filename;
+ std::string m_filename;
/**
* The buffer to read from.
*/
AUD_Reference<AUD_Buffer> m_buffer;
+ // hide copy constructor and operator=
+ AUD_SndFileFactory(const AUD_SndFileFactory&);
+ AUD_SndFileFactory& operator=(const AUD_SndFileFactory&);
+
public:
/**
* Creates a new factory.
* \param filename The sound file path.
*/
- AUD_SndFileFactory(const char* filename);
+ AUD_SndFileFactory(std::string filename);
/**
* Creates a new factory.
* \param buffer The buffer to read from.
* \param size The size of the buffer.
*/
- AUD_SndFileFactory(unsigned char* buffer, int size);
-
- /**
- * Destroys the factory.
- */
- ~AUD_SndFileFactory();
+ AUD_SndFileFactory(const data_t* buffer, int size);
- virtual AUD_IReader* createReader();
+ virtual AUD_IReader* createReader() const;
};
#endif //AUD_SNDFILEFACTORY
diff --git a/intern/audaspace/sndfile/AUD_SndFileReader.cpp b/intern/audaspace/sndfile/AUD_SndFileReader.cpp
index f9ed8d6388e..488a06d8728 100644
--- a/intern/audaspace/sndfile/AUD_SndFileReader.cpp
+++ b/intern/audaspace/sndfile/AUD_SndFileReader.cpp
@@ -24,7 +24,6 @@
*/
#include "AUD_SndFileReader.h"
-#include "AUD_Buffer.h"
#include <cstring>
@@ -77,30 +76,31 @@ sf_count_t AUD_SndFileReader::vio_tell(void *user_data)
return reader->m_memoffset;
}
-AUD_SndFileReader::AUD_SndFileReader(const char* filename)
+static const char* fileopen_error = "AUD_SndFileReader: File couldn't be "
+ "read.";
+
+AUD_SndFileReader::AUD_SndFileReader(std::string filename) :
+ m_position(0)
{
SF_INFO sfinfo;
sfinfo.format = 0;
- m_sndfile = sf_open(filename, SFM_READ, &sfinfo);
+ m_sndfile = sf_open(filename.c_str(), SFM_READ, &sfinfo);
if(!m_sndfile)
- AUD_THROW(AUD_ERROR_FILE);
+ AUD_THROW(AUD_ERROR_FILE, fileopen_error);
m_specs.channels = (AUD_Channels) sfinfo.channels;
m_specs.rate = (AUD_SampleRate) sfinfo.samplerate;
m_length = sfinfo.frames;
m_seekable = sfinfo.seekable;
- m_position = 0;
-
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
}
-AUD_SndFileReader::AUD_SndFileReader(AUD_Reference<AUD_Buffer> buffer)
+AUD_SndFileReader::AUD_SndFileReader(AUD_Reference<AUD_Buffer> buffer) :
+ m_position(0),
+ m_membuffer(buffer),
+ m_memoffset(0)
{
- m_membuffer = buffer;
- m_memoffset = 0;
-
m_vio.get_filelen = vio_get_filelen;
m_vio.read = vio_read;
m_vio.seek = vio_seek;
@@ -113,25 +113,20 @@ AUD_SndFileReader::AUD_SndFileReader(AUD_Reference<AUD_Buffer> buffer)
m_sndfile = sf_open_virtual(&m_vio, SFM_READ, &sfinfo, this);
if(!m_sndfile)
- AUD_THROW(AUD_ERROR_FILE);
+ AUD_THROW(AUD_ERROR_FILE, fileopen_error);
m_specs.channels = (AUD_Channels) sfinfo.channels;
m_specs.rate = (AUD_SampleRate) sfinfo.samplerate;
m_length = sfinfo.frames;
m_seekable = sfinfo.seekable;
- m_position = 0;
-
- m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
}
AUD_SndFileReader::~AUD_SndFileReader()
{
sf_close(m_sndfile);
-
- delete m_buffer; AUD_DELETE("buffer")
}
-bool AUD_SndFileReader::isSeekable()
+bool AUD_SndFileReader::isSeekable() const
{
return m_seekable;
}
@@ -145,40 +140,30 @@ void AUD_SndFileReader::seek(int position)
}
}
-int AUD_SndFileReader::getLength()
+int AUD_SndFileReader::getLength() const
{
return m_length;
}
-int AUD_SndFileReader::getPosition()
+int AUD_SndFileReader::getPosition() const
{
return m_position;
}
-AUD_Specs AUD_SndFileReader::getSpecs()
+AUD_Specs AUD_SndFileReader::getSpecs() const
{
return m_specs;
}
-AUD_ReaderType AUD_SndFileReader::getType()
-{
- return AUD_TYPE_STREAM;
-}
-
-bool AUD_SndFileReader::notify(AUD_Message &message)
-{
- return false;
-}
-
void AUD_SndFileReader::read(int & length, sample_t* & buffer)
{
int sample_size = AUD_SAMPLE_SIZE(m_specs);
// resize output buffer if necessary
- if(m_buffer->getSize() < length*sample_size)
- m_buffer->resize(length*sample_size);
+ if(m_buffer.getSize() < length*sample_size)
+ m_buffer.resize(length*sample_size);
- buffer = m_buffer->getBuffer();
+ buffer = m_buffer.getBuffer();
length = sf_readf_float(m_sndfile, buffer, length);
diff --git a/intern/audaspace/sndfile/AUD_SndFileReader.h b/intern/audaspace/sndfile/AUD_SndFileReader.h
index 8886b6e9efc..a53189fdecd 100644
--- a/intern/audaspace/sndfile/AUD_SndFileReader.h
+++ b/intern/audaspace/sndfile/AUD_SndFileReader.h
@@ -28,8 +28,9 @@
#include "AUD_IReader.h"
#include "AUD_Reference.h"
-class AUD_Buffer;
+#include "AUD_Buffer.h"
+#include <string>
#include <sndfile.h>
typedef sf_count_t (*sf_read_f)(SNDFILE *sndfile, void *ptr, sf_count_t frames);
@@ -63,7 +64,7 @@ private:
/**
* The playback buffer.
*/
- AUD_Buffer* m_buffer;
+ AUD_Buffer m_buffer;
/**
* The sndfile.
@@ -91,6 +92,10 @@ private:
static sf_count_t vio_read(void *ptr, sf_count_t count, void *user_data);
static sf_count_t vio_tell(void *user_data);
+ // hide copy constructor and operator=
+ AUD_SndFileReader(const AUD_SndFileReader&);
+ AUD_SndFileReader& operator=(const AUD_SndFileReader&);
+
public:
/**
* Creates a new reader.
@@ -98,7 +103,7 @@ public:
* \exception AUD_Exception Thrown if the file specified does not exist or
* cannot be read with libsndfile.
*/
- AUD_SndFileReader(const char* filename);
+ AUD_SndFileReader(std::string filename);
/**
* Creates a new reader.
@@ -113,13 +118,11 @@ public:
*/
virtual ~AUD_SndFileReader();
- virtual bool isSeekable();
+ virtual bool isSeekable() const;
virtual void seek(int position);
- virtual int getLength();
- virtual int getPosition();
- virtual AUD_Specs getSpecs();
- virtual AUD_ReaderType getType();
- virtual bool notify(AUD_Message &message);
+ virtual int getLength() const;
+ virtual int getPosition() const;
+ virtual AUD_Specs getSpecs() const;
virtual void read(int & length, sample_t* & buffer);
};
diff --git a/intern/boolop/CMakeLists.txt b/intern/boolop/CMakeLists.txt
index e06b19a5d39..99923bc99dc 100644
--- a/intern/boolop/CMakeLists.txt
+++ b/intern/boolop/CMakeLists.txt
@@ -28,5 +28,5 @@ SET(INC . intern extern ../moto/include ../container ../memutil ../../source/ble
FILE(GLOB SRC intern/*.cpp)
-BLENDERLIB(blender_bop "${SRC}" "${INC}")
+BLENDERLIB(bf_intern_bop "${SRC}" "${INC}")
#, libtype='common', priority=5 )
diff --git a/intern/boolop/SConscript b/intern/boolop/SConscript
index 6a85b2d69be..5cf32862f96 100644
--- a/intern/boolop/SConscript
+++ b/intern/boolop/SConscript
@@ -8,7 +8,7 @@ incs += ' ../../source/blender/makesdna ../../intern/guardedalloc'
incs += ' ../../source/blender/blenlib'
if (env['OURPLATFORM'] == 'win32-mingw'):
- env.BlenderLib ('blender_bop', sources, Split(incs) , [], libtype='intern', priority = 5 )
+ env.BlenderLib ('bf_intern_bop', sources, Split(incs) , [], libtype='intern', priority = 5 )
else:
- env.BlenderLib ('blender_bop', sources, Split(incs) , [], libtype='intern', priority = 5 )
+ env.BlenderLib ('bf_intern_bop', sources, Split(incs) , [], libtype='intern', priority = 5 )
diff --git a/intern/bsp/CMakeLists.txt b/intern/bsp/CMakeLists.txt
index c95752ed5ed..4f87e161030 100644
--- a/intern/bsp/CMakeLists.txt
+++ b/intern/bsp/CMakeLists.txt
@@ -28,5 +28,5 @@ SET(INC intern ../container ../moto/include ../memutil)
FILE(GLOB SRC intern/*.cpp)
-BLENDERLIB(blender_BSP "${SRC}" "${INC}")
+BLENDERLIB(bf_intern_bsp "${SRC}" "${INC}")
#, libtype='core', priority=15 )
diff --git a/intern/bsp/SConscript b/intern/bsp/SConscript
index ff5a213d7b8..705c31193f3 100644
--- a/intern/bsp/SConscript
+++ b/intern/bsp/SConscript
@@ -5,5 +5,5 @@ sources = env.Glob('intern/*.cpp')
incs = 'intern ../container ../moto/include ../memutil'
-env.BlenderLib ('blender_BSP', sources, Split(incs), [], libtype='core', priority=200 )
+env.BlenderLib ('bf_intern_bsp', sources, Split(incs), [], libtype='core', priority=200 )
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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#endif
-
#if defined(WIN32) || defined(__APPLE__)
# ifdef WIN32
# include <windows.h>
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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <string.h>
#include "ply.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
char *type_names[] = {
"invalid",
"char", "short", "int",
diff --git a/intern/container/CMakeLists.txt b/intern/container/CMakeLists.txt
index 5835d561abd..462b62ae8bb 100644
--- a/intern/container/CMakeLists.txt
+++ b/intern/container/CMakeLists.txt
@@ -28,5 +28,5 @@ SET(INC .)
FILE(GLOB SRC intern/*.cpp)
-BLENDERLIB(blender_CTR "${SRC}" "${INC}")
+BLENDERLIB(bf_intern_ctr "${SRC}" "${INC}")
#, libtype=['intern'], priority = 10 )
diff --git a/intern/container/SConscript b/intern/container/SConscript
index d05104da562..2d93e90b555 100644
--- a/intern/container/SConscript
+++ b/intern/container/SConscript
@@ -4,4 +4,4 @@ Import ('env')
sources = env.Glob('intern/*.cpp')
incs = '.'
-env.BlenderLib ('blender_CTR', sources, Split(incs) , [], libtype='intern', priority = 10 )
+env.BlenderLib ('bf_intern_ctr', sources, Split(incs) , [], libtype='intern', priority = 10 )
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 <config.h>
-#endif
-
#include "CTR_List.h"
diff --git a/intern/decimation/CMakeLists.txt b/intern/decimation/CMakeLists.txt
index e7aff161692..7fdf08978a4 100644
--- a/intern/decimation/CMakeLists.txt
+++ b/intern/decimation/CMakeLists.txt
@@ -28,5 +28,5 @@ SET(INC . ../moto/include ../container ../memutil)
FILE(GLOB SRC intern/*.cpp)
-BLENDERLIB(bf_decimation "${SRC}" "${INC}")
+BLENDERLIB(bf_intern_decimate "${SRC}" "${INC}")
#, libtype=['core','common','player'], priority = [10, 20, 25] )
diff --git a/intern/decimation/SConscript b/intern/decimation/SConscript
index 2dd86c44cf1..2fc7781bd59 100644
--- a/intern/decimation/SConscript
+++ b/intern/decimation/SConscript
@@ -5,4 +5,4 @@ sources = env.Glob('intern/*.cpp')
incs = '. ../moto/include ../container ../memutil'
-env.BlenderLib ('bf_decimation', sources, Split(incs) , [], libtype=['core'], priority = [200] )
+env.BlenderLib ('bf_intern_decimate', sources, Split(incs) , [], libtype=['core'], priority = [200] )
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 <config.h>
-#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 <vector>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#endif
-
#include "../extern/LOD_decimation.h"
#include "LOD_DecimationClass.h"
diff --git a/intern/elbeem/CMakeLists.txt b/intern/elbeem/CMakeLists.txt
index e45a210bd88..d0e100907b1 100644
--- a/intern/elbeem/CMakeLists.txt
+++ b/intern/elbeem/CMakeLists.txt
@@ -37,5 +37,5 @@ IF(WITH_OPENMP)
ADD_DEFINITIONS(-DPARALLEL=1)
ENDIF(WITH_OPENMP)
-BLENDERLIB_NOLIST(bf_elbeem "${SRC}" "${INC}")
+BLENDERLIB_NOLIST(bf_intern_elbeem "${SRC}" "${INC}")
#, libtype='blender', priority=0 )
diff --git a/intern/elbeem/SConscript b/intern/elbeem/SConscript
index f0417f74001..9c035c0c285 100644
--- a/intern/elbeem/SConscript
+++ b/intern/elbeem/SConscript
@@ -19,4 +19,4 @@ if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
incs += ' ' + env['BF_PNG_INC'] + ' ' + env['BF_ZLIB_INC']
incs += ' extern '
-env.BlenderLib ('bf_elbeem', sources, Split(incs), Split(defs), libtype='intern', priority=0 )
+env.BlenderLib ('bf_intern_elbeem', sources, Split(incs), Split(defs), libtype='intern', priority=0 )
diff --git a/intern/ghost/CMakeLists.txt b/intern/ghost/CMakeLists.txt
index ba62bcb8e4b..c6ffd4b1913 100644
--- a/intern/ghost/CMakeLists.txt
+++ b/intern/ghost/CMakeLists.txt
@@ -24,57 +24,71 @@
#
# ***** 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
+ )
+
+ ADD_DEFINITIONS(-DPREFIX="${CMAKE_INSTALL_PREFIX}")
+
ENDIF(APPLE)
-BLENDERLIB(bf_ghost "${SRC}" "${INC}")
-#, libtype=['core','player'], priority = [25,15] )
+BLENDERLIB(bf_intern_ghost "${SRC}" "${INC}")
+
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
@@ -235,6 +235,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
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 *****
*/
+
+#ifndef GHOST_PATH_API_H
+#define GHOST_PATH_API_H
+
+#include "GHOST_Types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
/**
- * \file IMB_bitplanes.h
- * \ingroup imbuf
- * \brief Function declarations for bitplanes.c
+ * 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();
-#ifndef IMB_BITPLANES_H
-#define IMB_BITPLANES_H
+/**
+ * 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();
-struct ImBuf;
-void imb_bptolong(struct ImBuf *ibuf);
-void imb_longtobp(struct ImBuf *ibuf);
-unsigned int **imb_copyplanelist(struct ImBuf *ibuf);
+/**
+ * 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..2e2e19bf01f 100644
--- a/intern/ghost/SConscript
+++ b/intern/ghost/SConscript
@@ -14,7 +14,7 @@ if window_system == 'darwin':
pf = ['GHOST_DisplayManager', 'GHOST_System', 'GHOST_Window', 'GHOST_DropTarget']
defs=['_USE_MATH_DEFINES']
-if window_system in ('linux2', 'openbsd3', 'sunos5', 'freebsd6', 'irix6', 'aix4', 'aix5'):
+if window_system in ('linux2', 'openbsd3', 'sunos5', 'freebsd7', 'freebsd8', 'freebsd9', 'irix6', 'aix4', 'aix5'):
for f in pf:
try:
sources.remove('intern' + os.sep + f + 'Win32.cpp')
@@ -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] )
-
+env.BlenderLib ('bf_intern_ghost', sources, Split(incs), defines=defs, libtype=['intern','player'], priority = [40,15] ) \ No newline at end of file
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 <config.h>
-#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 <stdlib.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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_EventDragnDrop.h b/intern/ghost/intern/GHOST_EventDragnDrop.h
index ea13a33f889..1fcfddf5349 100644
--- a/intern/ghost/intern/GHOST_EventDragnDrop.h
+++ b/intern/ghost/intern/GHOST_EventDragnDrop.h
@@ -69,7 +69,7 @@ public:
* @param time The time this event was generated.
* @param type The type of this event.
* @param dataType The type of the drop candidate object
- * @param window The window where the event occured
+ * @param window The window where the event occurred
* @param x The x-coordinate of the location the cursor was at at the time of the event.
* @param y The y-coordinate of the location the cursor was at at the time of the event.
* @param data The "content" dropped in the window
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 <algorithm>
#include "GHOST_Debug.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#endif
-
#include "GHOST_ModifierKeys.h"
diff --git a/source/blender/imbuf/intern/IMB_amiga.h b/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
-struct ImBuf;
+#include "intern/GHOST_Debug.h"
+#include "GHOST_Path-api.h"
+#include "GHOST_ISystem.h"
-struct ImBuf *imb_loadamiga(int *iffmem,int flags);
-short imb_encodebodyh(struct ImBuf *ibuf, int file);
-short imb_encodebodyv(struct ImBuf *ibuf, int file);
+const GHOST_TUns8* GHOST_getSystemDir()
+{
+ GHOST_ISystem* system = GHOST_ISystem::getSystem();
+ return system ? system->getSystemDir() : NULL;
+}
-#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 <config.h>
-#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 <config.h>
-#endif
-
#include "GHOST_System.h"
#include <time.h>
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 b25f8890cf1..3ae8ec02dda 100644
--- a/intern/ghost/intern/GHOST_SystemCocoa.h
+++ b/intern/ghost/intern/GHOST_SystemCocoa.h
@@ -155,7 +155,7 @@ public:
* @param draggedObjectType The type object concerned (currently array of file names, string, TIFF image)
* @param mouseX x mouse coordinate (in cocoa base window coordinates)
* @param mouseY y mouse coordinate
- * @param window The window on which the event occured
+ * @param window The window on which the event occurred
* @return Indication whether the event was handled.
*/
GHOST_TSuccess handleDraggingEvent(GHOST_TEventType eventType, GHOST_TDragnDropTypes draggedObjectType,
@@ -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.
***************************************************************************************/
@@ -228,9 +228,15 @@ 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
- * @param window The window on which the event occured
+ * @param window The window on which the event occurred
* @return Indication whether the event was handled.
*/
GHOST_TSuccess handleWindowEvent(GHOST_TEventType eventType, GHOST_WindowCocoa* window);
@@ -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 b66b1e4033d..b7038a30e00 100644
--- a/intern/ghost/intern/GHOST_SystemCocoa.mm
+++ b/intern/ghost/intern/GHOST_SystemCocoa.mm
@@ -807,7 +807,27 @@ GHOST_TSuccess GHOST_SystemCocoa::getCursorPosition(GHOST_TInt32& x, GHOST_TInt3
/**
* @note : expect Cocoa screen coordinates
*/
-GHOST_TSuccess GHOST_SystemCocoa::setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) const
+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;
GHOST_WindowCocoa* window = (GHOST_WindowCocoa*)m_windowManager->getActiveWindow();
@@ -1090,7 +1110,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) {
@@ -1098,7 +1118,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;
@@ -1109,7 +1129,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);
@@ -1117,7 +1137,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';
@@ -1279,6 +1299,11 @@ GHOST_TUns8 GHOST_SystemCocoa::handleQuitRequest()
NSArray *windowsList = [NSApp orderedWindows];
if ([windowsList count]) {
[[windowsList objectAtIndex:0] makeKeyAndOrderFront:nil];
+ //Handle the modifiers keyes changed state issue
+ //as recovering from the quit dialog is like application
+ //gaining focus back.
+ //Main issue fixed is Cmd modifier not being cleared
+ handleApplicationBecomeActiveEvent();
}
}
@@ -1517,7 +1542,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);
@@ -1530,7 +1555,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr)
NSPoint mousePos = [event locationInWindow];
pushEvent(new GHOST_EventCursor([event timestamp]*1000, GHOST_kEventCursorMove, window, mousePos.x, mousePos.y));
m_cursorDelta_x=0;
- m_cursorDelta_y=0; //Mouse motion occured between two cursor warps, so we can reset the delta counter
+ m_cursorDelta_y=0; //Mouse motion occurred between two cursor warps, so we can reset the delta counter
}
break;
}
@@ -1771,22 +1796,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]);
@@ -1799,22 +1818,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 <config.h>
-#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 <windows.h>
+#include <shlobj.h>
+
// 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..35b8debf6b4 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.
@@ -209,7 +214,7 @@ public:
* @param draggedObjectType The type object concerned (currently array of file names, string, ?bitmap)
* @param mouseX x mouse coordinate (in window coordinates)
* @param mouseY y mouse coordinate
- * @param window The window on which the event occured
+ * @param window The window on which the event occurred
* @return Indication whether the event was handled.
*/
static GHOST_TSuccess pushDragDropEvent(GHOST_TEventType eventType, GHOST_TDragnDropTypes draggedObjectType,GHOST_IWindow* window, int mouseX, int mouseY, void* data);
diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp
index 1b7589fc432..961a637e616 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 <config.h>
-#endif
-
#include "GHOST_SystemX11.h"
#include "GHOST_WindowX11.h"
#include "GHOST_WindowManager.h"
@@ -71,6 +67,10 @@
#include <stdio.h> // for fprintf only
#include <cstdlib> // for exit
+#ifndef PREFIX
+# define PREFIX "/usr/local"
+#endif
+
typedef struct NDOFPlatformInfo {
Display *display;
Window window;
@@ -469,7 +469,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) {
@@ -970,7 +970,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
@@ -1465,19 +1465,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*) PREFIX "/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.
@@ -241,6 +241,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
* to the display not the window and are public for every
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 <config.h>
-#endif
-
#include "GHOST_TimerManager.h"
#include <algorithm>
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 <config.h>
-#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
@@ -192,6 +192,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
*/
virtual void setAcceptDragOperation(bool canAccept);
@@ -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 <config.h>
-#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 cb27ee4e83e..7948e88e1ab 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 7520375c10e..a97f7621bb0 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) {
@@ -732,7 +733,7 @@ GHOST_TSuccess GHOST_WindowCocoa::setState(GHOST_TWindowState state)
#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 mainScreen]])
+ if ([[m_window screen] isEqual:[[NSScreen screens] objectAtIndex:0]])
{
[NSApp setPresentationOptions:(NSApplicationPresentationHideDock | NSApplicationPresentationAutoHideMenuBar)];
}
@@ -743,7 +744,7 @@ GHOST_TSuccess GHOST_WindowCocoa::setState(GHOST_TWindowState state)
#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 mainScreen]])
+ 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
@@ -1020,6 +1021,66 @@ GHOST_TSuccess GHOST_WindowCocoa::invalidate()
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
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 <config.h>
-#endif
-
#include "GHOST_WindowManager.h"
#include <algorithm>
#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 <config.h>
-#endif
-
#include <string.h>
#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 a7779400488..b51e14275c9 100644
--- a/intern/ghost/make/msvc_9_0/ghost.vcproj
+++ b/intern/ghost/make/msvc_9_0/ghost.vcproj
@@ -469,6 +469,10 @@
>
</File>
<File
+ RelativePath="..\..\GHOST_Path-api.h"
+ >
+ </File>
+ <File
RelativePath="..\..\GHOST_Rect.h"
>
</File>
@@ -526,6 +530,10 @@
>
</File>
<File
+ RelativePath="..\..\intern\GHOST_Path-api.cpp"
+ >
+ </File>
+ <File
RelativePath="..\..\intern\GHOST_Rect.cpp"
>
</File>
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 <config.h>
-#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 <iostream>
#include <math.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#if defined(WIN32) || defined(__APPLE__)
#ifdef WIN32
#include <windows.h>
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 <config.h>
-#endif
-
int min_i(int a, int b) {
return (a<b)?a:b;
}
diff --git a/intern/ghost/test/multitest/EventToBuf.c b/intern/ghost/test/multitest/EventToBuf.c
index 0c855c36ded..1dbaad35994 100644
--- a/intern/ghost/test/multitest/EventToBuf.c
+++ b/intern/ghost/test/multitest/EventToBuf.c
@@ -30,10 +30,6 @@
#include <stdio.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <config.h>
-#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 <math.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <stdarg.h>
#include <stdio.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <stdlib.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "MEM_guardedalloc.h"
#include "GHOST_C-api.h"
diff --git a/intern/guardedalloc/CMakeLists.txt b/intern/guardedalloc/CMakeLists.txt
index 21f43b7320e..642b04fdb60 100644
--- a/intern/guardedalloc/CMakeLists.txt
+++ b/intern/guardedalloc/CMakeLists.txt
@@ -28,10 +28,10 @@ SET(INC .)
FILE(GLOB SRC intern/*.c)
-BLENDERLIB(bf_guardedalloc "${SRC}" "${INC}")
+BLENDERLIB(bf_intern_guardedalloc "${SRC}" "${INC}")
# Override C++ alloc optional
IF(WITH_CXX_GUARDEDALLOC)
FILE(GLOB SRC cpp/*.cpp)
- BLENDERLIB(bf_guardedalloc_cpp "${SRC}" "${INC}")
+ BLENDERLIB(bf_intern_guardedalloc_cpp "${SRC}" "${INC}")
ENDIF(WITH_CXX_GUARDEDALLOC)
diff --git a/intern/guardedalloc/MEM_guardedalloc.h b/intern/guardedalloc/MEM_guardedalloc.h
index 45c2e048df9..6b78b0b6bdc 100644
--- a/intern/guardedalloc/MEM_guardedalloc.h
+++ b/intern/guardedalloc/MEM_guardedalloc.h
@@ -63,10 +63,10 @@
extern "C" {
#endif
- /** Returns the lenght of the allocated memory segment pointed at
+ /** Returns the length 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.
@@ -89,23 +89,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 */
@@ -144,6 +144,12 @@ extern "C" {
uintptr_t MEM_get_mapped_memory_in_use(void);
int MEM_get_memory_blocks_in_use(void);
+ /*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/SConscript b/intern/guardedalloc/SConscript
index 2ee0f84b464..0c9c7d13608 100644
--- a/intern/guardedalloc/SConscript
+++ b/intern/guardedalloc/SConscript
@@ -5,4 +5,4 @@ Import('env')
sources = env.Glob('intern/*.c')
incs = '.'
-env.BlenderLib ('bf_guardedalloc', sources, Split(incs), defines=[], libtype=['intern','player'], priority = [5,150] )
+env.BlenderLib ('bf_intern_guardedalloc', sources, Split(incs), defines=[], libtype=['intern','player'], priority = [5,150] )
diff --git a/intern/guardedalloc/intern/mallocn.c b/intern/guardedalloc/intern/mallocn.c
index 806f8d183ba..09f2d33a674 100644
--- a/intern/guardedalloc/intern/mallocn.c
+++ b/intern/guardedalloc/intern/mallocn.c
@@ -36,13 +36,20 @@
#include <stdlib.h>
#include <string.h> /* memcpy */
#include <stdarg.h>
+#include <sys/types.h>
+/* 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 <sys/types.h>
#include "mmap_win.h"
#else
-#include <sys/types.h>
#include <sys/mman.h>
#endif
@@ -82,7 +89,7 @@ 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;
@@ -131,7 +138,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;
@@ -213,7 +220,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;
@@ -245,7 +252,7 @@ void *MEM_dupallocN(void *vmemh)
return newp;
}
-void *MEM_reallocN(void *vmemh, unsigned int len)
+void *MEM_reallocN(void *vmemh, size_t len)
{
void *newp= NULL;
@@ -267,7 +274,7 @@ void *MEM_reallocN(void *vmemh, unsigned int len)
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;
@@ -286,9 +293,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;
@@ -312,11 +321,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;
@@ -337,12 +346,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;
@@ -370,6 +379,7 @@ 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();
#ifdef DEBUG_MEMCOUNTER
if(_mallocn_count==DEBUG_MEMCOUNTER_ERROR_VAL)
@@ -380,7 +390,7 @@ void *MEM_mapallocN(unsigned int len, const char *str)
}
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);
}
}
@@ -463,12 +473,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; a<totpb; a++, pb++)
- printf("%s items: %d, len: %.3f MB\n", pb->name, 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 */
@@ -487,12 +502,12 @@ 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 {
#ifdef DEBUG_MEMCOUNTER
- print_error("%s len: %d %p, count: %d\n",membl->name,membl->len, membl+1, membl->_count);
+ 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: %d %p\n",membl->name,membl->len, membl+1);
+ print_error("%s len: " SIZET_FORMAT " %p\n", membl->name, SIZET_ARG(membl->len), membl+1);
#endif
}
if(membl->next)
@@ -790,6 +805,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 <stdlib.h>
#include "MEM_guardedalloc.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
static void mem_error_cb(const char *errorStr)
{
fprintf(stderr, "%s", errorStr);
diff --git a/intern/iksolver/CMakeLists.txt b/intern/iksolver/CMakeLists.txt
index 3c345ae7e6a..8ea05ac994d 100644
--- a/intern/iksolver/CMakeLists.txt
+++ b/intern/iksolver/CMakeLists.txt
@@ -28,5 +28,5 @@ SET(INC intern ../moto/include ../memutil)
FILE(GLOB SRC intern/*.cpp)
-BLENDERLIB(bf_IK "${SRC}" "${INC}")
+BLENDERLIB(bf_intern_ik "${SRC}" "${INC}")
#, libtype=['blender'], priority = [10] )
diff --git a/intern/iksolver/SConscript b/intern/iksolver/SConscript
index 7adb2d50893..bdf7cd350ff 100644
--- a/intern/iksolver/SConscript
+++ b/intern/iksolver/SConscript
@@ -5,5 +5,5 @@ sources = env.Glob('intern/*.cpp')
incs = 'intern ../moto/include ../memutil'
-env.BlenderLib ('bf_IK', sources, Split(incs), [], libtype=['intern','player'], priority=[100,90] )
+env.BlenderLib ('bf_intern_ik', sources, Split(incs), [], libtype=['intern','player'], priority=[100,90] )
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 <cmath>
// 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/intern/TNT/vec.h b/intern/iksolver/intern/TNT/vec.h
index 1729d83ca10..040097afbd9 100644
--- a/intern/iksolver/intern/TNT/vec.h
+++ b/intern/iksolver/intern/TNT/vec.h
@@ -416,7 +416,7 @@ void vectoradd(
A[i] += B[i];
}
-// same with seperate output vector
+// same with separate output vector
template <class T>
void vectoradd(
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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#endif
-
#include "MEM_SmartPtr.h"
#ifdef USE_QUATERNIONS
diff --git a/intern/itasc/CMakeLists.txt b/intern/itasc/CMakeLists.txt
index 7b442446d62..39443bd2b22 100644
--- a/intern/itasc/CMakeLists.txt
+++ b/intern/itasc/CMakeLists.txt
@@ -28,5 +28,5 @@ SET(INC ../../extern/Eigen2)
FILE(GLOB SRC *.cpp kdl/*.cpp kdl/utilities/*.cpp)
-BLENDERLIB(bf_ITASC "${SRC}" "${INC}")
+BLENDERLIB(bf_intern_itasc "${SRC}" "${INC}")
#, libtype=['blender'], priority = [10] )
diff --git a/intern/itasc/MovingFrame.cpp b/intern/itasc/MovingFrame.cpp
index e923b1fab27..914f950e436 100644
--- a/intern/itasc/MovingFrame.cpp
+++ b/intern/itasc/MovingFrame.cpp
@@ -52,7 +52,7 @@ void MovingFrame::pushInternalFrame(CacheTS timestamp)
}
}
-// load pose just preceeding timestamp
+// load pose just preceding timestamp
// return false if no cache position was found
bool MovingFrame::popInternalFrame(CacheTS timestamp)
{
diff --git a/intern/itasc/SConscript b/intern/itasc/SConscript
index 9e11b6c7119..5fa4246d711 100644
--- a/intern/itasc/SConscript
+++ b/intern/itasc/SConscript
@@ -7,5 +7,5 @@ sources += env.Glob('kdl/utilities/*.cpp')
incs = '. ../../extern/Eigen2'
-env.BlenderLib ('bf_ITASC', sources, Split(incs), [], libtype=['intern','player'], priority=[20,100] )
+env.BlenderLib ('bf_intern_itasc', sources, Split(incs), [], libtype=['intern','player'], priority=[20,100] )
diff --git a/intern/memutil/CMakeLists.txt b/intern/memutil/CMakeLists.txt
index 51391bd3006..3dc725acb50 100644
--- a/intern/memutil/CMakeLists.txt
+++ b/intern/memutil/CMakeLists.txt
@@ -28,5 +28,5 @@ SET(INC . ..)
FILE(GLOB SRC intern/*.cpp)
-BLENDERLIB(bf_memutil "${SRC}" "${INC}")
+BLENDERLIB(bf_intern_memutil "${SRC}" "${INC}")
#, libtype=['intern', 'player'], priority = [0, 180] )
diff --git a/intern/memutil/SConscript b/intern/memutil/SConscript
index 318d4a3997e..c9a03982615 100644
--- a/intern/memutil/SConscript
+++ b/intern/memutil/SConscript
@@ -5,4 +5,4 @@ sources = env.Glob('intern/*.cpp')
incs = '. ..'
-env.BlenderLib ('bf_memutil', sources, Split(incs), [], libtype=['intern','player'], priority = [0,155] )
+env.BlenderLib ('bf_intern_memutil', sources, Split(incs), [], libtype=['intern','player'], priority = [0,155] )
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 <config.h>
-#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 <config.h>
-#endif
-
#include "MEM_RefCountedC-Api.h"
#include "MEM_RefCounted.h"
diff --git a/intern/moto/CMakeLists.txt b/intern/moto/CMakeLists.txt
index a5ed0f729de..3d6d3d1a783 100644
--- a/intern/moto/CMakeLists.txt
+++ b/intern/moto/CMakeLists.txt
@@ -28,5 +28,5 @@ SET(INC include)
FILE(GLOB SRC intern/*.cpp)
-BLENDERLIB(bf_moto "${SRC}" "${INC}")
+BLENDERLIB(bf_intern_moto "${SRC}" "${INC}")
#, libtype=['intern','game','game2','player'], priority = [15, 55, 100, 135] )
diff --git a/intern/moto/SConscript b/intern/moto/SConscript
index d9bbafe4623..ba257a33b14 100644
--- a/intern/moto/SConscript
+++ b/intern/moto/SConscript
@@ -5,4 +5,4 @@ sources = env.Glob('intern/*.cpp')
incs = 'include'
-env.BlenderLib ('bf_moto', sources, Split(incs), [], libtype=['intern','player'], priority = [130,95] )
+env.BlenderLib ('bf_intern_moto', sources, Split(incs), [], libtype=['intern','player'], priority = [130,95] )
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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#endif
-
#include "MT_random.h"
/* Period parameters */
diff --git a/intern/opennl/CMakeLists.txt b/intern/opennl/CMakeLists.txt
index d76abe12a00..0551c94e586 100644
--- a/intern/opennl/CMakeLists.txt
+++ b/intern/opennl/CMakeLists.txt
@@ -28,6 +28,6 @@ SET(INC extern superlu)
FILE(GLOB SRC intern/*.c superlu/*.c)
-BLENDERLIB(blender_ONL "${SRC}" "${INC}")
+BLENDERLIB(bf_intern_opennl "${SRC}" "${INC}")
#, libtype='core', priority=55 )
diff --git a/intern/opennl/SConscript b/intern/opennl/SConscript
index f68810d2f16..ff66b4ad6e1 100644
--- a/intern/opennl/SConscript
+++ b/intern/opennl/SConscript
@@ -6,7 +6,7 @@ sources = env.Glob('intern/*.c') + env.Glob('superlu/*.c')
incs = 'extern superlu'
if (env['OURPLATFORM'] == 'win32-mingw'):
- env.BlenderLib ('blender_ONL', sources, Split(incs), [], libtype=['core','intern'], priority=[1,80] )
+ env.BlenderLib ('bf_intern_opennl', sources, Split(incs), [], libtype=['core','intern'], priority=[1,80] )
else:
- env.BlenderLib ('blender_ONL', sources, Split(incs), [], libtype=['core'], priority=[55] )
+ env.BlenderLib ('bf_intern_opennl', sources, Split(incs), [], libtype=['core'], priority=[55] )
diff --git a/intern/smoke/CMakeLists.txt b/intern/smoke/CMakeLists.txt
index 8579c76b322..f099efd2bb8 100644
--- a/intern/smoke/CMakeLists.txt
+++ b/intern/smoke/CMakeLists.txt
@@ -38,5 +38,5 @@ IF(WITH_FFTW3)
ENDIF(WITH_FFTW3)
-BLENDERLIB(bf_smoke "${SRC}" "${INC}")
+BLENDERLIB(bf_intern_smoke "${SRC}" "${INC}")
#, libtype='blender', priority = 0 )
diff --git a/intern/smoke/SConscript b/intern/smoke/SConscript
index 2fc8798fc78..fa32c5f36c3 100644
--- a/intern/smoke/SConscript
+++ b/intern/smoke/SConscript
@@ -19,4 +19,4 @@ if env['WITH_BF_FFTW3']:
defs += ' FFTW3=1'
incs += env['BF_FFTW3_INC']
-env.BlenderLib ('bf_smoke', sources, Split(incs), Split(defs), libtype=['intern'], priority=[40] )
+env.BlenderLib ('bf_intern_smoke', sources, Split(incs), Split(defs), libtype=['intern'], priority=[40] )
diff --git a/intern/smoke/extern/smoke_API.h b/intern/smoke/extern/smoke_API.h
index 3e296fd7c90..b340c914519 100644
--- a/intern/smoke/extern/smoke_API.h
+++ b/intern/smoke/extern/smoke_API.h
@@ -38,11 +38,11 @@ struct FLUID_3D;
void smoke_export(struct FLUID_3D *fluid, float *dt, float *dx, float **dens, float **densold, float **heat, float **heatold, float **vx, float **vy, float **vz, float **vxold, float **vyold, float **vzold, unsigned char **obstacles);
// low res
-struct FLUID_3D *smoke_init(int *res, float *p0, float dt);
+struct FLUID_3D *smoke_init(int *res, float *p0);
void smoke_free(struct FLUID_3D *fluid);
-void smoke_initBlenderRNA(struct FLUID_3D *fluid, float *alpha, float *beta);
-void smoke_step(struct FLUID_3D *fluid, size_t framenr);
+void smoke_initBlenderRNA(struct FLUID_3D *fluid, float *alpha, float *beta, float *dt_factor, float *vorticity, int *border_colli);
+void smoke_step(struct FLUID_3D *fluid, size_t framenr, float fps);
float *smoke_get_density(struct FLUID_3D *fluid);
float *smoke_get_heat(struct FLUID_3D *fluid);
diff --git a/intern/smoke/intern/FLUID_3D.cpp b/intern/smoke/intern/FLUID_3D.cpp
index 4ac960b5ef0..05fbb918d24 100644
--- a/intern/smoke/intern/FLUID_3D.cpp
+++ b/intern/smoke/intern/FLUID_3D.cpp
@@ -35,23 +35,15 @@
#include <omp.h>
#endif // PARALLEL
-// boundary conditions of the fluid domain
-#define DOMAIN_BC_FRONT 0 // z
-#define DOMAIN_BC_TOP 1 // y
-#define DOMAIN_BC_LEFT 1 // x
-#define DOMAIN_BC_BACK DOMAIN_BC_FRONT
-#define DOMAIN_BC_BOTTOM DOMAIN_BC_TOP
-#define DOMAIN_BC_RIGHT DOMAIN_BC_LEFT
-
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
-FLUID_3D::FLUID_3D(int *res, float *p0, float dt) :
- _xRes(res[0]), _yRes(res[1]), _zRes(res[2]), _res(0.0f), _dt(dt)
+FLUID_3D::FLUID_3D(int *res, float *p0) :
+ _xRes(res[0]), _yRes(res[1]), _zRes(res[2]), _res(0.0f)
{
// set simulation consts
- // _dt = dt; // 0.10
+ _dt = DT_DEFAULT; // just in case. set in step from a RNA factor
// start point of array
_p0[0] = p0[0];
@@ -61,7 +53,6 @@ FLUID_3D::FLUID_3D(int *res, float *p0, float dt) :
_iterations = 100;
_tempAmb = 0;
_heatDiffusion = 1e-3;
- _vorticityEps = 2.0;
_totalTime = 0.0f;
_totalSteps = 0;
_res = Vec3Int(_xRes,_yRes,_zRes);
@@ -77,9 +68,9 @@ FLUID_3D::FLUID_3D(int *res, float *p0, float dt) :
// scale the constants according to the refinement of the grid
_dx = 1.0f / (float)_maxRes;
- float scaling = 64.0f / _maxRes;
- scaling = (scaling < 1.0f) ? 1.0f : scaling;
- _vorticityEps /= scaling;
+ _constantScaling = 64.0f / _maxRes;
+ _constantScaling = (_constantScaling < 1.0f) ? 1.0f : _constantScaling;
+ _vorticityEps = 2.0f / _constantScaling; // Just in case set a default value
// allocate arrays
_totalCells = _xRes * _yRes * _zRes;
@@ -126,30 +117,42 @@ FLUID_3D::FLUID_3D(int *res, float *p0, float dt) :
_obstacles[x] = false;
}
+ // boundary conditions of the fluid domain
+ // set default values -> vertically non-colliding
+ _domainBcFront = true;
+ _domainBcTop = false;
+ _domainBcLeft = true;
+ _domainBcBack = _domainBcFront;
+ _domainBcBottom = _domainBcTop;
+ _domainBcRight = _domainBcLeft;
+
+ _colloPrev = 1; // default value
+
+
// set side obstacles
int index;
for (int y = 0; y < _yRes; y++)
for (int x = 0; x < _xRes; x++)
{
- // front slab
+ // bottom slab
index = x + y * _xRes;
- if(DOMAIN_BC_FRONT==1) _obstacles[index] = 1;
+ if(_domainBcBottom==1) _obstacles[index] = 1;
- // back slab
+ // top slab
index += _totalCells - _slabSize;
- if(DOMAIN_BC_BACK==1) _obstacles[index] = 1;
+ if(_domainBcTop==1) _obstacles[index] = 1;
}
for (int z = 0; z < _zRes; z++)
for (int x = 0; x < _xRes; x++)
{
- // bottom slab
+ // front slab
index = x + z * _slabSize;
- if(DOMAIN_BC_BOTTOM==1) _obstacles[index] = 1;
+ if(_domainBcFront==1) _obstacles[index] = 1;
- // top slab
+ // back slab
index += _slabSize - _xRes;
- if(DOMAIN_BC_TOP==1) _obstacles[index] = 1;
+ if(_domainBcBack==1) _obstacles[index] = 1;
}
for (int z = 0; z < _zRes; z++)
@@ -157,12 +160,13 @@ FLUID_3D::FLUID_3D(int *res, float *p0, float dt) :
{
// left slab
index = y * _xRes + z * _slabSize;
- if(DOMAIN_BC_LEFT==1) _obstacles[index] = 1;
+ if(_domainBcLeft==1) _obstacles[index] = 1;
// right slab
index += _xRes - 1;
- if(DOMAIN_BC_RIGHT==1) _obstacles[index] = 1;
+ if(_domainBcRight==1) _obstacles[index] = 1;
}
+
}
FLUID_3D::~FLUID_3D()
@@ -193,17 +197,32 @@ FLUID_3D::~FLUID_3D()
}
// init direct access functions from blender
-void FLUID_3D::initBlenderRNA(float *alpha, float *beta)
+void FLUID_3D::initBlenderRNA(float *alpha, float *beta, float *dt_factor, float *vorticity, int *borderCollision)
{
_alpha = alpha;
_beta = beta;
+ _dtFactor = dt_factor;
+ _vorticityRNA = vorticity;
+ _borderColli = borderCollision;
}
//////////////////////////////////////////////////////////////////////
// step simulation once
//////////////////////////////////////////////////////////////////////
-void FLUID_3D::step()
+void FLUID_3D::step(float dt)
{
+ // If border rules have been changed
+ if (_colloPrev != *_borderColli) {
+ setBorderCollisions();
+ }
+
+
+ // set delta time by dt_factor
+ _dt = (*_dtFactor) * dt;
+ // set vorticity from RNA value
+ _vorticityEps = (*_vorticityRNA)/_constantScaling;
+
+
#if PARALLEL==1
int threadval = 1;
threadval = omp_get_max_threads();
@@ -246,6 +265,13 @@ void FLUID_3D::step()
#pragma omp single
{
#endif
+ /*
+ * addForce() changed Temp values to preserve thread safety
+ * (previous functions in per thread loop still needed
+ * original velocity data)
+ *
+ * So swap temp values to velocity
+ */
SWAP_POINTERS(_xVelocity, _xVelocityTemp);
SWAP_POINTERS(_yVelocity, _yVelocityTemp);
SWAP_POINTERS(_zVelocity, _zVelocityTemp);
@@ -276,6 +302,10 @@ void FLUID_3D::step()
#pragma omp single
{
#endif
+ /*
+ * For thread safety use "Old" to read
+ * "current" values but still allow changing values.
+ */
SWAP_POINTERS(_xVelocity, _xVelocityOld);
SWAP_POINTERS(_yVelocity, _yVelocityOld);
SWAP_POINTERS(_zVelocity, _zVelocityOld);
@@ -334,6 +364,10 @@ void FLUID_3D::step()
}
#endif
+ /*
+ * swap final velocity back to Velocity array
+ * from temp xForce storage
+ */
SWAP_POINTERS(_xVelocity, _xForce);
SWAP_POINTERS(_yVelocity, _yForce);
SWAP_POINTERS(_zVelocity, _zForce);
@@ -351,6 +385,88 @@ void FLUID_3D::step()
}
+
+// Set border collision model from RNA setting
+
+void FLUID_3D::setBorderCollisions() {
+
+
+ _colloPrev = *_borderColli; // saving the current value
+
+ // boundary conditions of the fluid domain
+ if (_colloPrev == 0)
+ {
+ // No collisions
+ _domainBcFront = false;
+ _domainBcTop = false;
+ _domainBcLeft = false;
+ }
+ else if (_colloPrev == 2)
+ {
+ // Collide with all sides
+ _domainBcFront = true;
+ _domainBcTop = true;
+ _domainBcLeft = true;
+ }
+ else
+ {
+ // Default values: Collide with "walls", but not top and bottom
+ _domainBcFront = true;
+ _domainBcTop = false;
+ _domainBcLeft = true;
+ }
+
+ _domainBcBack = _domainBcFront;
+ _domainBcBottom = _domainBcTop;
+ _domainBcRight = _domainBcLeft;
+
+
+
+ // set side obstacles
+ int index;
+ for (int y = 0; y < _yRes; y++)
+ for (int x = 0; x < _xRes; x++)
+ {
+ // front slab
+ index = x + y * _xRes;
+ if(_domainBcBottom==1) _obstacles[index] = 1;
+ else _obstacles[index] = 0;
+
+ // back slab
+ index += _totalCells - _slabSize;
+ if(_domainBcTop==1) _obstacles[index] = 1;
+ else _obstacles[index] = 0;
+ }
+
+ for (int z = 0; z < _zRes; z++)
+ for (int x = 0; x < _xRes; x++)
+ {
+ // bottom slab
+ index = x + z * _slabSize;
+ if(_domainBcFront==1) _obstacles[index] = 1;
+ else _obstacles[index] = 0;
+
+ // top slab
+ index += _slabSize - _xRes;
+ if(_domainBcBack==1) _obstacles[index] = 1;
+ else _obstacles[index] = 0;
+ }
+
+ for (int z = 0; z < _zRes; z++)
+ for (int y = 0; y < _yRes; y++)
+ {
+ // left slab
+ index = y * _xRes + z * _slabSize;
+ if(_domainBcLeft==1) _obstacles[index] = 1;
+ else _obstacles[index] = 0;
+
+ // right slab
+ index += _xRes - 1;
+ if(_domainBcRight==1) _obstacles[index] = 1;
+ else _obstacles[index] = 0;
+ }
+}
+
//////////////////////////////////////////////////////////////////////
// helper function to dampen co-located grid artifacts of given arrays in intervals
// (only needed for velocity, strength (w) depends on testcase...
@@ -428,6 +544,10 @@ void FLUID_3D::artificialDampingExactSL(int pos) {
for (y = 1; y < _res[1]-1; y++)
for (x = 1+(y+z)%2; x < _res[0]-1; x+=2) {
index = x + y*_res[0] + posslab;
+ /*
+ * Uses xForce as temporary storage to allow other threads to read
+ * old values from xVelocityTemp
+ */
_xForce[index] = (1-w)*_xVelocityTemp[index] + 1./6. * w*(
_xVelocityTemp[index+1] + _xVelocityTemp[index-1] +
_xVelocityTemp[index+_res[0]] + _xVelocityTemp[index-_res[0]] +
@@ -450,6 +570,11 @@ void FLUID_3D::artificialDampingExactSL(int pos) {
for (y = 1; y < _res[1]-1; y++)
for (x = 1+(y+z+1)%2; x < _res[0]-1; x+=2) {
index = x + y*_res[0] + posslab;
+
+ /*
+ * Uses xForce as temporary storage to allow other threads to read
+ * old values from xVelocityTemp
+ */
_xForce[index] = (1-w)*_xVelocityTemp[index] + 1./6. * w*(
_xVelocityTemp[index+1] + _xVelocityTemp[index-1] +
_xVelocityTemp[index+_res[0]] + _xVelocityTemp[index-_res[0]] +
@@ -661,13 +786,13 @@ void FLUID_3D::project()
setObstacleBoundaries(_pressure, 0, _zRes);
// copy out the boundaries
- if(DOMAIN_BC_LEFT == 0) setNeumannX(_xVelocity, _res, 0, _zRes);
+ if(_domainBcLeft == 0) setNeumannX(_xVelocity, _res, 0, _zRes);
else setZeroX(_xVelocity, _res, 0, _zRes);
- if(DOMAIN_BC_TOP == 0) setNeumannY(_yVelocity, _res, 0, _zRes);
+ if(_domainBcFront == 0) setNeumannY(_yVelocity, _res, 0, _zRes);
else setZeroY(_yVelocity, _res, 0, _zRes);
- if(DOMAIN_BC_FRONT == 0) setNeumannZ(_zVelocity, _res, 0, _zRes);
+ if(_domainBcTop == 0) setNeumannZ(_zVelocity, _res, 0, _zRes);
else setZeroZ(_zVelocity, _res, 0, _zRes);
// calculate divergence
@@ -1060,13 +1185,13 @@ void FLUID_3D::advectMacCormackBegin(int zBegin, int zEnd)
{
Vec3Int res = Vec3Int(_xRes,_yRes,_zRes);
- if(DOMAIN_BC_LEFT == 0) copyBorderX(_xVelocityOld, res, zBegin, zEnd);
+ if(_domainBcLeft == 0) copyBorderX(_xVelocityOld, res, zBegin, zEnd);
else setZeroX(_xVelocityOld, res, zBegin, zEnd);
- if(DOMAIN_BC_TOP == 0) copyBorderY(_yVelocityOld, res, zBegin, zEnd);
+ if(_domainBcFront == 0) copyBorderY(_yVelocityOld, res, zBegin, zEnd);
else setZeroY(_yVelocityOld, res, zBegin, zEnd);
- if(DOMAIN_BC_FRONT == 0) copyBorderZ(_zVelocityOld, res, zBegin, zEnd);
+ if(_domainBcTop == 0) copyBorderZ(_zVelocityOld, res, zBegin, zEnd);
else setZeroZ(_zVelocityOld, res, zBegin, zEnd);
}
@@ -1114,13 +1239,13 @@ void FLUID_3D::advectMacCormackEnd2(int zBegin, int zEnd)
advectFieldMacCormack2(dt0, _xVelocityOld, _yVelocityOld, _zVelocityOld, _yVelocityOld, _yVelocityTemp, _yVelocity, t1, res, _obstacles, zBegin, zEnd);
advectFieldMacCormack2(dt0, _xVelocityOld, _yVelocityOld, _zVelocityOld, _zVelocityOld, _zVelocityTemp, _zVelocity, t1, res, _obstacles, zBegin, zEnd);
- if(DOMAIN_BC_LEFT == 0) copyBorderX(_xVelocityTemp, res, zBegin, zEnd);
+ if(_domainBcLeft == 0) copyBorderX(_xVelocityTemp, res, zBegin, zEnd);
else setZeroX(_xVelocityTemp, res, zBegin, zEnd);
- if(DOMAIN_BC_TOP == 0) copyBorderY(_yVelocityTemp, res, zBegin, zEnd);
+ if(_domainBcFront == 0) copyBorderY(_yVelocityTemp, res, zBegin, zEnd);
else setZeroY(_yVelocityTemp, res, zBegin, zEnd);
- if(DOMAIN_BC_FRONT == 0) copyBorderZ(_zVelocityTemp, res, zBegin, zEnd);
+ if(_domainBcTop == 0) copyBorderZ(_zVelocityTemp, res, zBegin, zEnd);
else setZeroZ(_zVelocityTemp, res, zBegin, zEnd);
setZeroBorder(_density, res, zBegin, zEnd);
diff --git a/intern/smoke/intern/FLUID_3D.h b/intern/smoke/intern/FLUID_3D.h
index ab121ef506e..c244180ee57 100644
--- a/intern/smoke/intern/FLUID_3D.h
+++ b/intern/smoke/intern/FLUID_3D.h
@@ -30,11 +30,15 @@
#include <cstdlib>
#include <cmath>
+#include <cstring>
#include <iostream>
#include "OBSTACLE.h"
// #include "WTURBULENCE.h"
#include "VEC3.h"
+// timestep default value for nice appearance
+#define DT_DEFAULT 0.1f;
+
using namespace std;
using namespace BasicVector;
class WTURBULENCE;
@@ -42,11 +46,11 @@ class WTURBULENCE;
class FLUID_3D
{
public:
- FLUID_3D(int *res, /* int amplify, */ float *p0, float dt);
+ FLUID_3D(int *res, /* int amplify, */ float *p0);
FLUID_3D() {};
virtual ~FLUID_3D();
- void initBlenderRNA(float *alpha, float *beta);
+ void initBlenderRNA(float *alpha, float *beta, float *dt_factor, float *vorticity, int *border_colli);
// create & allocate vector noise advection
void initVectorNoise(int amplify);
@@ -54,7 +58,7 @@ class FLUID_3D
void addSmokeColumn();
static void addSmokeTestCase(float* field, Vec3Int res);
- void step();
+ void step(float dt);
void addObstacle(OBSTACLE* obstacle);
const float* xVelocity() { return _xVelocity; };
@@ -110,11 +114,25 @@ class FLUID_3D
// simulation constants
float _dt;
+ float *_dtFactor;
float _vorticityEps;
float _heatDiffusion;
+ float *_vorticityRNA; // RNA-pointer.
float *_alpha; // for the buoyancy density term <-- as pointer to get blender RNA in here
float *_beta; // was _buoyancy <-- as pointer to get blender RNA in here
float _tempAmb; /* ambient temperature */
+ float _constantScaling;
+
+ bool _domainBcFront; // z
+ bool _domainBcTop; // y
+ bool _domainBcLeft; // x
+ bool _domainBcBack; // DOMAIN_BC_FRONT
+ bool _domainBcBottom; // DOMAIN_BC_TOP
+ bool _domainBcRight; // DOMAIN_BC_LEFT
+ int *_borderColli; // border collision rules <-- as pointer to get blender RNA in here
+ int _colloPrev; // To track whether value has been changed (to not
+ // have to recalibrate borders if nothing has changed
+ void setBorderCollisions();
// WTURBULENCE object, if active
// WTURBULENCE* _wTurbulence;
diff --git a/intern/smoke/intern/WTURBULENCE.cpp b/intern/smoke/intern/WTURBULENCE.cpp
index 6d43bc95471..917c510348a 100644
--- a/intern/smoke/intern/WTURBULENCE.cpp
+++ b/intern/smoke/intern/WTURBULENCE.cpp
@@ -825,13 +825,18 @@ void WTURBULENCE::stepTurbulenceFull(float dtOrg, float* xvel, float* yvel, floa
// get LU factorization of texture jacobian and apply
// it to unit vectors
sLU LU = computeLU(jacobian);
- float xUnwarped[] = {1.0f, 0.0f, 0.0f};
- float yUnwarped[] = {0.0f, 1.0f, 0.0f};
- float zUnwarped[] = {0.0f, 0.0f, 1.0f};
- float xWarped[] = {1.0f, 0.0f, 0.0f};
- float yWarped[] = {0.0f, 1.0f, 0.0f};
- float zWarped[] = {0.0f, 0.0f, 1.0f};
+ float xUnwarped[3], yUnwarped[3], zUnwarped[3];
+ float xWarped[3], yWarped[3], zWarped[3];
bool nonSingular = isNonsingular(LU);
+
+ xUnwarped[0] = 1.0f; xUnwarped[1] = 0.0f; xUnwarped[2] = 0.0f;
+ yUnwarped[0] = 0.0f; yUnwarped[1] = 1.0f; yUnwarped[2] = 0.0f;
+ zUnwarped[0] = 0.0f; zUnwarped[1] = 0.0f; zUnwarped[2] = 1.0f;
+
+ xWarped[0] = 1.0f; xWarped[1] = 0.0f; xWarped[2] = 0.0f;
+ yWarped[0] = 0.0f; yWarped[1] = 1.0f; yWarped[2] = 0.0f;
+ zWarped[0] = 0.0f; zWarped[1] = 0.0f; zWarped[2] = 1.0f;
+
#if 0
// UNUSED
float eigMax = 10.0f;
diff --git a/intern/smoke/intern/smoke_API.cpp b/intern/smoke/intern/smoke_API.cpp
index 427f4d53171..168395f370d 100644
--- a/intern/smoke/intern/smoke_API.cpp
+++ b/intern/smoke/intern/smoke_API.cpp
@@ -33,10 +33,10 @@
#include <math.h>
// y in smoke is z in blender
-extern "C" FLUID_3D *smoke_init(int *res, float *p0, float dt)
+extern "C" FLUID_3D *smoke_init(int *res, float *p0)
{
// smoke lib uses y as top-bottom/vertical axis where blender uses z
- FLUID_3D *fluid = new FLUID_3D(res, p0, dt);
+ FLUID_3D *fluid = new FLUID_3D(res, p0);
// printf("xres: %d, yres: %d, zres: %d\n", res[0], res[1], res[2]);
@@ -75,9 +75,41 @@ extern "C" size_t smoke_get_index2d(int x, int max_x, int y /*, int max_y, int z
return x + y * max_x;
}
-extern "C" void smoke_step(FLUID_3D *fluid, size_t framenr)
+extern "C" void smoke_step(FLUID_3D *fluid, size_t framenr, float fps)
{
- fluid->step();
+ /* stability values copied from wturbulence.cpp */
+ const int maxSubSteps = 25;
+ const float maxVel = 0.5f; /* TODO: maybe 0.5 is still too high, please confirm! -dg */
+
+ float dt = DT_DEFAULT;
+ float maxVelMag = 0.0f;
+ int totalSubsteps;
+ int substep = 0;
+ float dtSubdiv;
+
+ /* get max velocity and lower the dt value if it is too high */
+ size_t size= fluid->_xRes * fluid->_yRes * fluid->_zRes;
+
+ for(size_t i = 0; i < size; i++)
+ {
+ float vtemp = (fluid->_xVelocity[i]*fluid->_xVelocity[i]+fluid->_yVelocity[i]*fluid->_yVelocity[i]+fluid->_zVelocity[i]*fluid->_zVelocity[i]);
+ if(vtemp > maxVelMag)
+ maxVelMag = vtemp;
+ }
+
+ /* adapt timestep for different framerates, dt = 0.1 is at 25fps */
+ dt *= (25.0f / fps);
+
+ maxVelMag = sqrt(maxVelMag) * dt * (*(fluid->_dtFactor));
+ totalSubsteps = (int)((maxVelMag / maxVel) + 1.0f); /* always round up */
+ totalSubsteps = (totalSubsteps < 1) ? 1 : totalSubsteps;
+ totalSubsteps = (totalSubsteps > maxSubSteps) ? maxSubSteps : totalSubsteps;
+ dtSubdiv = (float)dt / (float)totalSubsteps;
+
+ // printf("totalSubsteps: %d, maxVelMag: %f, dt: %f\n", totalSubsteps, maxVelMag, dt);
+
+ for(substep = 0; substep < totalSubsteps; substep++)
+ fluid->step(dtSubdiv);
}
extern "C" void smoke_turbulence_step(WTURBULENCE *wt, FLUID_3D *fluid)
@@ -85,9 +117,9 @@ extern "C" void smoke_turbulence_step(WTURBULENCE *wt, FLUID_3D *fluid)
wt->stepTurbulenceFull(fluid->_dt/fluid->_dx, fluid->_xVelocity, fluid->_yVelocity, fluid->_zVelocity, fluid->_obstacles);
}
-extern "C" void smoke_initBlenderRNA(FLUID_3D *fluid, float *alpha, float *beta)
+extern "C" void smoke_initBlenderRNA(FLUID_3D *fluid, float *alpha, float *beta, float *dt_factor, float *vorticity, int *border_colli)
{
- fluid->initBlenderRNA(alpha, beta);
+ fluid->initBlenderRNA(alpha, beta, dt_factor, vorticity, border_colli);
}
extern "C" void smoke_dissolve(FLUID_3D *fluid, int speed, int log)
diff --git a/intern/string/CMakeLists.txt b/intern/string/CMakeLists.txt
index c726f7483e5..7aeace4ca83 100644
--- a/intern/string/CMakeLists.txt
+++ b/intern/string/CMakeLists.txt
@@ -28,5 +28,5 @@ SET(INC .)
FILE(GLOB SRC intern/*.cpp)
-BLENDERLIB(bf_string "${SRC}" "${INC}")
+BLENDERLIB(bf_intern_string "${SRC}" "${INC}")
#, libtype=['core', 'player'], priority = [30,10] )
diff --git a/intern/string/SConscript b/intern/string/SConscript
index 4aca220183c..f8342bf12c2 100644
--- a/intern/string/SConscript
+++ b/intern/string/SConscript
@@ -4,4 +4,4 @@ Import ('env')
sources = env.Glob('intern/*.cpp')
incs = '.'
-env.BlenderLib ('bf_string', sources, Split(incs), [], libtype=['intern','player'], priority = [50,10] )
+env.BlenderLib ('bf_intern_string', sources, Split(incs), [], libtype=['intern','player'], priority = [50,10] )
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/intern/string/intern/STR_String.cpp b/intern/string/intern/STR_String.cpp
index d468cd4bdbd..3e035fd7905 100644
--- a/intern/string/intern/STR_String.cpp
+++ b/intern/string/intern/STR_String.cpp
@@ -359,7 +359,7 @@ int STR_String::Find(char c, int pos) const
//
-// Find the first occurence of <str> in the string
+// Find the first occurrence of <str> in the string
//
int STR_String::Find(const char *str, int pos) const
{
@@ -373,7 +373,7 @@ int STR_String::Find(const char *str, int pos) const
//
-// Find the first occurence of <str> in the string
+// Find the first occurrence of <str> in the string
//
int STR_String::Find(rcSTR_String str, int pos) const
{
@@ -387,7 +387,7 @@ int STR_String::Find(rcSTR_String str, int pos) const
//
-// Find the last occurence of <c> in the string
+// Find the last occurrence of <c> in the string
//
int STR_String::RFind(char c) const
{
@@ -399,7 +399,7 @@ int STR_String::RFind(char c) const
//
-// Find the first occurence of any character in character set <set> in the string
+// Find the first occurrence of any character in character set <set> in the string
//
int STR_String::FindOneOf(const char *set, int pos) const
{
diff --git a/po/Makefile b/po/Makefile
index b656a00fb38..bbd1caa68ad 100644
--- a/po/Makefile
+++ b/po/Makefile
@@ -51,7 +51,7 @@ $(DIR)%/LC_MESSAGES/blender.mo: %.po
mkdir -p $(@D)
msgfmt -o $@ $<
ifeq ($(BF_VERIFY_MO_FILES), true)
- @cmp $@ $(NANBLENDERHOME)/bin/.blender/locale/$(basename $<)/LC_MESSAGES/blender.mo \
+ @cmp $@ $(NANBLENDERHOME)/release/bin/.blender/locale/$(basename $<)/LC_MESSAGES/blender.mo \
|| ( echo Mismatch between generated and commited $(basename $<).mo catalog && \
rm -f $@ && false )
endif
diff --git a/projectfiles_vc9/blender/BPY_python/BPY_python.vcproj b/projectfiles_vc9/blender/BPY_python/BPY_python.vcproj
index 6946a23c507..d416f9e3be8 100644
--- a/projectfiles_vc9/blender/BPY_python/BPY_python.vcproj
+++ b/projectfiles_vc9/blender/BPY_python/BPY_python.vcproj
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\lib\windows\python\include\python3.1;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\img;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\include;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesrna;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenloader;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\editors\include"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\lib\windows\python\include\python3.1;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\img;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\include;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesrna;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenloader;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\editors\include;..\..\..\intern\audaspace\intern"
PreprocessorDefinitions="_DEBUG,WIN32,_LIB;WITH_FFMPEG"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@@ -121,7 +121,7 @@
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\lib\windows\python\include\python3.1;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\img;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\include;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesrna;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenloader;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\editors\include"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\lib\windows\python\include\python3.1;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\img;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\include;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesrna;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenloader;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\editors\include;..\..\..\intern\audaspace\intern"
PreprocessorDefinitions="WIN32,NDEBUG,_LIB"
StringPooling="true"
RuntimeLibrary="0"
@@ -198,7 +198,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\lib\windows\python\include\python3.1;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\img;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\include;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesrna;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenloader;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\editors\include"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\lib\windows\python\include\python3.1;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\img;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\include;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesrna;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenloader;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\editors\include;..\..\..\intern\audaspace\intern"
PreprocessorDefinitions="_DEBUG,WIN32,_LIB;WITH_FFMPEG"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@@ -275,7 +275,7 @@
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\lib\windows\python\include\python3.1;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\img;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\include;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesrna;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenloader;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\editors\include"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\lib\windows\python\include\python3.1;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\img;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\include;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesrna;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenloader;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\editors\include;..\..\..\intern\audaspace\intern"
PreprocessorDefinitions="WIN32,NDEBUG,_LIB"
StringPooling="true"
RuntimeLibrary="0"
@@ -392,7 +392,7 @@
>
</File>
<File
- RelativePath="..\..\..\source\blender\python\generic\blf.c"
+ RelativePath="..\..\..\source\blender\python\generic\blf_api.c"
>
</File>
<File
@@ -400,31 +400,39 @@
>
</File>
<File
- RelativePath="..\..\..\source\blender\python\generic\euler.c"
+ RelativePath="..\..\..\source\blender\python\generic\geometry.c"
>
</File>
<File
- RelativePath="..\..\..\source\blender\python\generic\Geometry.c"
+ RelativePath="..\..\..\source\blender\python\generic\IDProp.c"
>
</File>
<File
- RelativePath="..\..\..\source\blender\python\generic\IDProp.c"
+ RelativePath="..\..\..\source\blender\python\generic\mathutils.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\python\generic\mathutils_color.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\python\generic\mathutils_euler.c"
>
</File>
<File
- RelativePath="..\..\..\source\blender\python\generic\Mathutils.c"
+ RelativePath="..\..\..\source\blender\python\generic\mathutils_matrix.c"
>
</File>
<File
- RelativePath="..\..\..\source\blender\python\generic\matrix.c"
+ RelativePath="..\..\..\source\blender\python\generic\mathutils_quat.c"
>
</File>
<File
- RelativePath="..\..\..\source\blender\python\generic\quat.c"
+ RelativePath="..\..\..\source\blender\python\generic\mathutils_vector.c"
>
</File>
<File
- RelativePath="..\..\..\source\blender\python\generic\vector.c"
+ RelativePath="..\..\..\source\blender\python\generic\noise.c"
>
</File>
</Filter>
@@ -477,6 +485,10 @@
>
</File>
<File
+ RelativePath="..\..\..\source\blender\python\intern\bpy_rna_callback.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\python\intern\bpy_util.h"
>
</File>
@@ -489,7 +501,7 @@
>
</File>
<File
- RelativePath="..\..\..\source\blender\python\generic\blf.h"
+ RelativePath="..\..\..\source\blender\python\generic\blf_api.h"
>
</File>
<File
@@ -497,31 +509,35 @@
>
</File>
<File
- RelativePath="..\..\..\source\blender\python\generic\euler.h"
+ RelativePath="..\..\..\source\blender\python\generic\geometry.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\python\generic\IDProp.h"
>
</File>
<File
- RelativePath="..\..\..\source\blender\python\generic\Geometry.h"
+ RelativePath="..\..\..\source\blender\python\generic\mathutils.h"
>
</File>
<File
- RelativePath="..\..\..\source\blender\python\generic\IDProp.h"
+ RelativePath="..\..\..\source\blender\python\generic\mathutils_color.h"
>
</File>
<File
- RelativePath="..\..\..\source\blender\python\generic\Mathutils.h"
+ RelativePath="..\..\..\source\blender\python\generic\mathutils_euler.h"
>
</File>
<File
- RelativePath="..\..\..\source\blender\python\generic\matrix.h"
+ RelativePath="..\..\..\source\blender\python\generic\mathutils_matrix.h"
>
</File>
<File
- RelativePath="..\..\..\source\blender\python\generic\quat.h"
+ RelativePath="..\..\..\source\blender\python\generic\mathutils_quat.h"
>
</File>
<File
- RelativePath="..\..\..\source\blender\python\generic\vector.h"
+ RelativePath="..\..\..\source\blender\python\generic\mathutils_vector.h"
>
</File>
</Filter>
diff --git a/projectfiles_vc9/blender/blender.sln b/projectfiles_vc9/blender/blender.sln
index 27c3e81262c..8cbf5cf35c7 100644
--- a/projectfiles_vc9/blender/blender.sln
+++ b/projectfiles_vc9/blender/blender.sln
@@ -7,6 +7,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "blender", "blender.vcproj",
{6E24BF09-9653-4166-A871-F65CC9E98A9B} = {6E24BF09-9653-4166-A871-F65CC9E98A9B}
{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}
@@ -337,6 +338,8 @@ 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
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BL_modifiers", "modifiers\modifiers.vcproj", "{7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
3D Plugin Debug|Win32 = 3D Plugin Debug|Win32
@@ -1594,6 +1597,26 @@ 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
+ {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
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/projectfiles_vc9/blender/blender.vcproj b/projectfiles_vc9/blender/blender.vcproj
index 9b2613de861..83ea66cebd7 100644
--- a/projectfiles_vc9/blender/blender.vcproj
+++ b/projectfiles_vc9/blender/blender.vcproj
@@ -45,8 +45,8 @@
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\source\blender;..\..\source\blender\imbuf;..\..\source\blender\misc;..\..\source\blender\blenlib;..\..\source\blender\editors\include;..\..\source\blender\python;..\..\source\blender\windowmanager;..\..\source\blender\renderui;..\..\source\blender\makesdna;..\..\source\blender\makesrna;..\..\source\blender\blenkernel;..\..\source\blender\blenloader;..\..\source\blender\renderconverter;..\..\source\blender\render\extern\include;..\..\source\blender\radiosity\extern\include;..\..\source\kernel\gen_system;..\..\source\kernel\gen_messaging;..\..\..\build\msvc_9\extern\glew\include;..\..\source\blender\gpu"
- PreprocessorDefinitions="NDEBUG;WIN32;_CONSOLE;WITH_QUICKTIME;GAMEBLENDER=1;USE_SUMO_SOLID;FTGL_LIBRARY_STATIC"
+ AdditionalIncludeDirectories="..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\source\blender;..\..\source\blender\imbuf;..\..\source\blender\misc;..\..\source\blender\blenlib;..\..\source\blender\editors\include;..\..\source\blender\python;..\..\source\blender\windowmanager;..\..\source\blender\renderui;..\..\source\blender\makesdna;..\..\source\blender\makesrna;..\..\source\blender\blenkernel;..\..\source\blender\blenloader;..\..\source\blender\renderconverter;..\..\source\blender\render\extern\include;..\..\source\blender\radiosity\extern\include;..\..\source\kernel\gen_system;..\..\source\kernel\gen_messaging;..\..\..\build\msvc_9\extern\glew\include;..\..\source\blender\gpu;..\..\..\lib\windows\pthreads\include"
+ PreprocessorDefinitions="NDEBUG;WIN32;_CONSOLE;WITH_QUICKTIME;GAMEBLENDER=1;USE_SUMO_SOLID;FTGL_LIBRARY_STATIC;WITH_LZMA;WITH_LZO"
StringPooling="true"
RuntimeLibrary="0"
EnableFunctionLevelLinking="true"
@@ -74,7 +74,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
- AdditionalDependencies="libsamplerate.lib SDL.lib freetype2ST.lib gnu_gettext.lib qtmlClient.lib wrap_oal.lib ws2_32.lib dxguid.lib opengl32.lib libjpeg.lib glu32.lib vfw32.lib winmm.lib libpng_st.lib zlib.lib python31.lib pthreadVSE2.lib pthreadVC2.lib libtiff.lib Half.lib Iex.lib IlmImf.lib Imath.lib IlmThread.lib avcodec-52.lib avformat-52.lib avutil-50.lib swscale-0.lib avdevice-52.lib libsndfile-1.lib OpenCOLLADABaseUtils.lib OpenCOLLADAFramework.lib OpenCOLLADAStreamWriter.lib OpenCOLLADASaxFrameworkLoader.lib pcre.lib UTF.lib GeneratedSaxParser.lib MathMLSolver.lib xml2.lib buffer.lib ftoa.lib"
+ AdditionalDependencies="libsamplerate.lib SDL.lib freetype2ST.lib gnu_gettext.lib qtmlClient.lib wrap_oal.lib ws2_32.lib dxguid.lib opengl32.lib libjpeg.lib glu32.lib vfw32.lib winmm.lib libpng_st.lib zlib.lib python31.lib pthreadVSE2.lib pthreadVC2.lib libtiff.lib Half.lib Iex.lib IlmImf.lib Imath.lib IlmThread.lib avcodec-52.lib avformat-52.lib avutil-50.lib swscale-0.lib avdevice-52.lib libsndfile-1.lib OpenCOLLADABaseUtils.lib OpenCOLLADAFramework.lib OpenCOLLADAStreamWriter.lib OpenCOLLADASaxFrameworkLoader.lib pcre.lib GeneratedSaxParser.lib MathMLSolver.lib xml2.lib buffer.lib ftoa.lib"
ShowProgress="0"
OutputFile="..\..\..\install\msvc_9\blender.exe"
LinkIncremental="1"
@@ -141,8 +141,8 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\source\blender;..\..\source\blender\imbuf;..\..\source\blender\misc;..\..\source\blender\blenlib;..\..\source\blender\editors\include;..\..\source\blender\python;..\..\source\blender\windowmanager;..\..\source\blender\renderui;..\..\source\blender\makesdna;..\..\source\blender\makesrna;..\..\source\blender\blenkernel;..\..\source\blender\blenloader;..\..\source\blender\renderconverter;..\..\source\blender\render\extern\include;..\..\source\blender\radiosity\extern\include;..\..\source\kernel\gen_system;..\..\source\kernel\gen_messaging;..\..\..\build\msvc_9\extern\glew\include;..\..\source\blender\gpu"
- PreprocessorDefinitions="_DEBUG;WIN32;_CONSOLE;WITH_QUICKTIME"
+ AdditionalIncludeDirectories="..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\source\blender;..\..\source\blender\imbuf;..\..\source\blender\misc;..\..\source\blender\blenlib;..\..\source\blender\editors\include;..\..\source\blender\python;..\..\source\blender\windowmanager;..\..\source\blender\renderui;..\..\source\blender\makesdna;..\..\source\blender\makesrna;..\..\source\blender\blenkernel;..\..\source\blender\blenloader;..\..\source\blender\renderconverter;..\..\source\blender\render\extern\include;..\..\source\blender\radiosity\extern\include;..\..\source\kernel\gen_system;..\..\source\kernel\gen_messaging;..\..\..\build\msvc_9\extern\glew\include;..\..\source\blender\gpu;..\..\..\lib\windows\pthreads\include"
+ PreprocessorDefinitions="_DEBUG;WIN32;_CONSOLE;WITH_QUICKTIME;WITH_LZMA;WITH_LZO"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
@@ -169,7 +169,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386&#x0D;&#x0A;"
- AdditionalDependencies="SDL.lib freetype2ST.lib gnu_gettext.lib qtmlClient.lib wrap_oal.lib ws2_32.lib dxguid.lib opengl32.lib libjpeg.lib glu32.lib vfw32.lib winmm.lib libpng_st.lib zlib.lib python31_d.lib pthreadVSE2.lib pthreadVC2.lib libtiff.lib Half_d.lib Iex_d.lib Imath_d.lib IlmImf_d.lib IlmThread_d.lib avcodec-52.lib avformat-52.lib avdevice-52.lib avutil-50.lib swscale-0.lib libsndfile-1.lib libsamplerate.lib libjack.lib OpenCOLLADABaseUtils_d.lib OpenCOLLADAFramework_d.lib OpenCOLLADAStreamWriter_d.lib OpenCOLLADASaxFrameworkLoader_d.lib pcre_d.lib UTF_d.lib GeneratedSaxParser_d.lib MathMLSolver_d.lib xml2_d.lib buffer_d.lib ftoa_d.lib"
+ AdditionalDependencies="SDL.lib freetype2ST.lib gnu_gettext.lib qtmlClient.lib wrap_oal.lib ws2_32.lib dxguid.lib opengl32.lib libjpeg.lib glu32.lib vfw32.lib winmm.lib libpng_st.lib zlib.lib python31_d.lib pthreadVSE2.lib pthreadVC2.lib libtiff.lib Half_d.lib Iex_d.lib Imath_d.lib IlmImf_d.lib IlmThread_d.lib avcodec-52.lib avformat-52.lib avdevice-52.lib avutil-50.lib swscale-0.lib libsndfile-1.lib libsamplerate.lib libjack.lib OpenCOLLADABaseUtils_d.lib OpenCOLLADAFramework_d.lib OpenCOLLADAStreamWriter_d.lib OpenCOLLADASaxFrameworkLoader_d.lib pcre_d.lib GeneratedSaxParser_d.lib MathMLSolver_d.lib xml2_d.lib buffer_d.lib ftoa_d.lib"
ShowProgress="0"
OutputFile="..\..\..\install\msvc_9d\blender.exe"
LinkIncremental="2"
diff --git a/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj b/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj
index 470f84f9c60..ba24f2185ab 100644
--- a/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj
+++ b/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- 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"
+ 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"
PreprocessorDefinitions="_DEBUG,WIN32,_LIB"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -118,7 +118,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- 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"
+ 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"
PreprocessorDefinitions="_DEBUG;WIN32;_LIB;WITH_OPENEXR;WITH_DDS;WITH_BULLET;WITH_FFMPEG;GLEW_STATIC"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@@ -194,7 +194,7 @@
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
- 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"
+ 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"
PreprocessorDefinitions="NDEBUG;WIN32;_LIB;UNWRAPPER;WITH_OPENEXR;WITH_DDS;WITH_BULLET=1;WITH_FFMPEG;GLEW_STATIC"
StringPooling="true"
RuntimeLibrary="0"
@@ -269,7 +269,7 @@
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- 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"
+ 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"
PreprocessorDefinitions="NDEBUG,WIN32,_LIB"
StringPooling="true"
RuntimeLibrary="2"
@@ -344,7 +344,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- 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"
+ 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"
PreprocessorDefinitions="_DEBUG;WIN32;_LIB;WITH_FFMPEG;GLEW_STATIC"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@@ -419,7 +419,7 @@
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- 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"
+ 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"
PreprocessorDefinitions="NDEBUG;WIN32;_LIB;UNWRAPPER;WITH_FFMPEG;GLEW_STATIC"
StringPooling="true"
RuntimeLibrary="0"
@@ -527,10 +527,6 @@
>
</File>
<File
- RelativePath="..\..\..\source\blender\blenkernel\intern\booleanops.c"
- >
- </File>
- <File
RelativePath="..\..\..\source\blender\blenkernel\intern\booleanops_mesh.c"
>
</File>
@@ -639,6 +635,10 @@
>
</File>
<File
+ RelativePath="..\..\..\source\blender\blenkernel\intern\idcode.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\blenkernel\intern\idprop.c"
>
</File>
@@ -747,19 +747,19 @@
>
</File>
<File
- RelativePath="..\..\..\source\blender\blenkernel\intern\seqeffects.c"
+ RelativePath="..\..\..\source\blender\blenkernel\intern\seqcache.c"
>
</File>
<File
- RelativePath="..\..\..\source\blender\blenkernel\intern\sequencer.c"
+ RelativePath="..\..\..\source\blender\blenkernel\intern\seqeffects.c"
>
</File>
<File
- RelativePath="..\..\..\source\blender\blenkernel\intern\shrinkwrap.c"
+ RelativePath="..\..\..\source\blender\blenkernel\intern\sequencer.c"
>
</File>
<File
- RelativePath="..\..\..\source\blender\blenkernel\intern\simple_deform.c"
+ RelativePath="..\..\..\source\blender\blenkernel\intern\shrinkwrap.c"
>
</File>
<File
@@ -964,6 +964,10 @@
>
</File>
<File
+ RelativePath="..\..\..\source\blender\blenkernel\BKE_gpencil.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\blenkernel\BKE_group.h"
>
</File>
@@ -972,6 +976,14 @@
>
</File>
<File
+ RelativePath="..\..\..\source\blender\blenkernel\BKE_idcode.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\blenkernel\BKE_idprop.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\blenkernel\BKE_image.h"
>
</File>
@@ -1160,10 +1172,6 @@
>
</File>
<File
- RelativePath="..\..\..\source\blender\blenkernel\Makefile"
- >
- </File>
- <File
RelativePath="..\..\..\source\blender\blenkernel\nla_private.h"
>
</File>
diff --git a/projectfiles_vc9/blender/blenlib/BLI_blenlib.vcproj b/projectfiles_vc9/blender/blenlib/BLI_blenlib.vcproj
index 72a3ae9a2f4..cda5d65ab84 100644
--- a/projectfiles_vc9/blender/blenlib/BLI_blenlib.vcproj
+++ b/projectfiles_vc9/blender/blenlib/BLI_blenlib.vcproj
@@ -528,6 +528,10 @@
>
</File>
<File
+ RelativePath="..\..\..\source\blender\blenlib\intern\cpu.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\blenlib\intern\DLRB_tree.c"
>
</File>
@@ -584,6 +588,10 @@
>
</File>
<File
+ RelativePath="..\..\..\source\blender\blenlib\intern\math_geom_inline.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\blenlib\intern\math_matrix.c"
>
</File>
@@ -681,6 +689,10 @@
>
</File>
<File
+ RelativePath="..\..\..\source\blender\blenlib\BLI_cpu.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\blenlib\BLI_dlrbTree.h"
>
</File>
diff --git a/projectfiles_vc9/blender/editors/ED_editors.vcproj b/projectfiles_vc9/blender/editors/ED_editors.vcproj
index 7bfaf4314fb..12cb98c0a2a 100644
--- a/projectfiles_vc9/blender/editors/ED_editors.vcproj
+++ b/projectfiles_vc9/blender/editors/ED_editors.vcproj
@@ -235,6 +235,10 @@
>
</File>
<File
+ RelativePath="..\..\..\source\blender\editors\include\ED_logic.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\editors\include\ED_markers.h"
>
</File>
@@ -352,7 +356,7 @@
Filter="c"
>
<File
- RelativePath="..\..\..\source\blender\editors\datafiles\B.blend.c"
+ RelativePath="..\..\..\source\blender\editors\datafiles\add.png.c"
>
</File>
<File
@@ -368,10 +372,78 @@
>
</File>
<File
+ RelativePath="..\..\..\source\blender\editors\datafiles\blob.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\blur.png.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\editors\datafiles\bmonofont.ttf.c"
>
</File>
<File
+ RelativePath="..\..\..\source\blender\editors\datafiles\clay.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\clone.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\crease.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\darken.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\draw.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\fill.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\flatten.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\grab.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\inflate.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\layer.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\lighten.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\mix.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\multiply.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\nudge.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\pinch.png.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\editors\datafiles\preview.blend.c"
>
</File>
@@ -380,9 +452,53 @@
>
</File>
<File
+ RelativePath="..\..\..\source\blender\editors\datafiles\scrape.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\smear.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\smooth.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\snake_hook.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\soften.png.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\editors\datafiles\splash.png.c"
>
</File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\startup.blend.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\subtract.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\texdraw.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\thumb.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\twist.png.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\datafiles\vertexdraw.png.c"
+ >
+ </File>
</Filter>
<Filter
Name="interface"
@@ -1343,6 +1459,10 @@
RelativePath="..\..\..\source\blender\editors\sculpt_paint\sculpt_intern.h"
>
</File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\sculpt_paint\sculpt_undo.c"
+ >
+ </File>
</Filter>
<Filter
Name="uvedit"
@@ -1468,11 +1588,11 @@
>
</File>
<File
- RelativePath="..\..\..\source\blender\editors\space_logic\logic_header.c"
+ RelativePath="..\..\..\source\blender\editors\space_logic\logic_intern.h"
>
</File>
<File
- RelativePath="..\..\..\source\blender\editors\space_logic\logic_intern.h"
+ RelativePath="..\..\..\source\blender\editors\space_logic\logic_ops.c"
>
</File>
<File
diff --git a/projectfiles_vc9/blender/gpu/BL_gpu.vcproj b/projectfiles_vc9/blender/gpu/BL_gpu.vcproj
index a182a3eceb5..f69af190044 100644
--- a/projectfiles_vc9/blender/gpu/BL_gpu.vcproj
+++ b/projectfiles_vc9/blender/gpu/BL_gpu.vcproj
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\gpu"
+ AdditionalIncludeDirectories="..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\gpu;..\..\..\..\lib\windows\pthreads\include"
PreprocessorDefinitions="_DEBUG,WIN32,_LIB,DWORDS_LITTLEENDIAN"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -118,7 +118,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\gpu"
+ AdditionalIncludeDirectories="..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\gpu;..\..\..\..\lib\windows\pthreads\include"
PreprocessorDefinitions="_DEBUG;WIN32;_LIB;DWORDS_LITTLEENDIAN;GLEW_STATIC"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@@ -194,7 +194,7 @@
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\gpu"
+ AdditionalIncludeDirectories="..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\gpu;..\..\..\..\lib\windows\pthreads\include"
PreprocessorDefinitions="NDEBUG;WIN32;_LIB;DWORDS_LITTLEENDIAN;GLEW_STATIC"
StringPooling="true"
RuntimeLibrary="0"
@@ -269,7 +269,7 @@
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\gpu"
+ AdditionalIncludeDirectories="..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\gpu;..\..\..\..\lib\windows\pthreads\include"
PreprocessorDefinitions="NDEBUG,WIN32,_LIB,DWORDS_LITTLEENDIAN"
StringPooling="true"
RuntimeLibrary="2"
@@ -344,7 +344,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\gpu"
+ AdditionalIncludeDirectories="..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\gpu;..\..\..\..\lib\windows\pthreads\include"
PreprocessorDefinitions="_DEBUG;WIN32;_LIB;DWORDS_LITTLEENDIAN;GLEW_STATIC"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@@ -419,7 +419,7 @@
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\gpu"
+ AdditionalIncludeDirectories="..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\gpu;..\..\..\..\lib\windows\pthreads\include"
PreprocessorDefinitions="NDEBUG;WIN32;_LIB;DWORDS_LITTLEENDIAN;GLEW_STATIC"
StringPooling="true"
RuntimeLibrary="0"
@@ -508,7 +508,7 @@
Filter="h;hpp;hxx;hm;inl"
>
<File
- RelativePath="..\..\..\source\blender\gpu\gpu_buffers.h"
+ RelativePath="..\..\..\source\blender\gpu\GPU_buffers.h"
>
</File>
<File
diff --git a/projectfiles_vc9/blender/imbuf/BL_imbuf.vcproj b/projectfiles_vc9/blender/imbuf/BL_imbuf.vcproj
index 26bbab73154..3da0d068401 100644
--- a/projectfiles_vc9/blender/imbuf/BL_imbuf.vcproj
+++ b/projectfiles_vc9/blender/imbuf/BL_imbuf.vcproj
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\jpeg\include;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\png\include;..\..\..\..\lib\windows\tiff\include;..\..\..\..\lib\windows\openexr\include;..\..\..\..\lib\windows\openexr\include\Iex;..\..\..\..\lib\windows\openexr\include\Imath;..\..\..\..\lib\windows\openexr\include\IlmImf;..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\imbuf\intern;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\imbuf\intern\openexr;..\..\..\source\blender\imbuf\intern\dds;..\..\..\source\blender\windowmanager;..\..\..\source\blender\makesrna"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\jpeg\include;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\png\include;..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\tiff\include;..\..\..\..\lib\windows\openexr\include;..\..\..\..\lib\windows\openexr\include\Iex;..\..\..\..\lib\windows\openexr\include\Imath;..\..\..\..\lib\windows\openexr\include\IlmImf;..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\imbuf\intern;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\imbuf\intern\openexr;..\..\..\source\blender\imbuf\intern\dds;..\..\..\source\blender\windowmanager;..\..\..\source\blender\makesrna"
PreprocessorDefinitions="_DEBUG;WIN32;_LIB;WITH_QUICKTIME;WITH_OPENEXR;WITH_DDS;WITH_FFMPEG"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@@ -118,7 +118,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\jpeg\include;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\png\include;..\..\..\..\lib\windows\tiff\include;..\..\..\..\lib\windows\openexr\include;..\..\..\..\lib\windows\openexr\include\Iex;..\..\..\..\lib\windows\openexr\include\Imath;..\..\..\..\lib\windows\openexr\include\IlmImf;..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\imbuf\intern;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\imbuf\intern\openexr;..\..\..\source\blender\imbuf\intern\dds;..\..\..\source\blender\windowmanager;..\..\..\source\blender\makesrna"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\jpeg\include;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\png\include;..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\tiff\include;..\..\..\..\lib\windows\openexr\include;..\..\..\..\lib\windows\openexr\include\Iex;..\..\..\..\lib\windows\openexr\include\Imath;..\..\..\..\lib\windows\openexr\include\IlmImf;..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\imbuf\intern;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\imbuf\intern\openexr;..\..\..\source\blender\imbuf\intern\dds;..\..\..\source\blender\windowmanager;..\..\..\source\blender\makesrna"
PreprocessorDefinitions="_DEBUG,WIN32,_LIB"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -192,7 +192,7 @@
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\jpeg\include;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\png\include;..\..\..\..\lib\windows\tiff\include;..\..\..\..\lib\windows\openexr\include;..\..\..\..\lib\windows\openexr\include\Iex;..\..\..\..\lib\windows\openexr\include\Imath;..\..\..\..\lib\windows\openexr\include\IlmImf;..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\imbuf\intern;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\imbuf\intern\openexr;..\..\..\source\blender\imbuf\intern\dds;..\..\..\source\blender\windowmanager;..\..\..\source\blender\makesrna"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\jpeg\include;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\png\include;..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\tiff\include;..\..\..\..\lib\windows\openexr\include;..\..\..\..\lib\windows\openexr\include\Iex;..\..\..\..\lib\windows\openexr\include\Imath;..\..\..\..\lib\windows\openexr\include\IlmImf;..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\imbuf\intern;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\imbuf\intern\openexr;..\..\..\source\blender\imbuf\intern\dds;..\..\..\source\blender\windowmanager;..\..\..\source\blender\makesrna"
PreprocessorDefinitions="NDEBUG,WIN32,_LIB,WITH_QUICKTIME"
StringPooling="true"
RuntimeLibrary="2"
@@ -268,7 +268,7 @@
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\jpeg\include;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\png\include;..\..\..\..\lib\windows\tiff\include;..\..\..\..\lib\windows\openexr\include;..\..\..\..\lib\windows\openexr\include\Iex;..\..\..\..\lib\windows\openexr\include\Imath;..\..\..\..\lib\windows\openexr\include\IlmImf;..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\imbuf\intern;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\imbuf\intern\openexr;..\..\..\source\blender\imbuf\intern\dds;..\..\..\source\blender\windowmanager;..\..\..\source\blender\makesrna"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\jpeg\include;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\png\include;..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\tiff\include;..\..\..\..\lib\windows\openexr\include;..\..\..\..\lib\windows\openexr\include\Iex;..\..\..\..\lib\windows\openexr\include\Imath;..\..\..\..\lib\windows\openexr\include\IlmImf;..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\imbuf\intern;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\imbuf\intern\openexr;..\..\..\source\blender\imbuf\intern\dds;..\..\..\source\blender\windowmanager;..\..\..\source\blender\makesrna"
PreprocessorDefinitions="NDEBUG;WIN32;_LIB;WITH_QUICKTIME;WITH_OPENEXR;WITH_DDS;WITH_FFMPEG"
StringPooling="true"
RuntimeLibrary="0"
@@ -343,7 +343,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\jpeg\include;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\png\include;..\..\..\..\lib\windows\tiff\include;..\..\..\..\lib\windows\openexr\include;..\..\..\..\lib\windows\openexr\include\Iex;..\..\..\..\lib\windows\openexr\include\Imath;..\..\..\..\lib\windows\openexr\include\IlmImf;..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\imbuf\intern;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\imbuf\intern\openexr;..\..\..\source\blender\imbuf\intern\dds;..\..\..\source\blender\windowmanager;..\..\..\source\blender\makesrna"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\jpeg\include;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\png\include;..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\tiff\include;..\..\..\..\lib\windows\openexr\include;..\..\..\..\lib\windows\openexr\include\Iex;..\..\..\..\lib\windows\openexr\include\Imath;..\..\..\..\lib\windows\openexr\include\IlmImf;..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\imbuf\intern;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\imbuf\intern\openexr;..\..\..\source\blender\imbuf\intern\dds;..\..\..\source\blender\windowmanager;..\..\..\source\blender\makesrna"
PreprocessorDefinitions="_DEBUG;WIN32;_LIB;WITH_QUICKTIME;WITH_DDS;WITH_FFMPEG"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@@ -418,7 +418,7 @@
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\jpeg\include;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\png\include;..\..\..\..\lib\windows\tiff\include;..\..\..\..\lib\windows\openexr\include;..\..\..\..\lib\windows\openexr\include\Iex;..\..\..\..\lib\windows\openexr\include\Imath;..\..\..\..\lib\windows\openexr\include\IlmImf;..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\imbuf\intern;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\imbuf\intern\openexr;..\..\..\source\blender\imbuf\intern\dds;..\..\..\source\blender\windowmanager;..\..\..\source\blender\makesrna"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\jpeg\include;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\png\include;..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\tiff\include;..\..\..\..\lib\windows\openexr\include;..\..\..\..\lib\windows\openexr\include\Iex;..\..\..\..\lib\windows\openexr\include\Imath;..\..\..\..\lib\windows\openexr\include\IlmImf;..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\imbuf\intern;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\imbuf\intern\openexr;..\..\..\source\blender\imbuf\intern\dds;..\..\..\source\blender\windowmanager;..\..\..\source\blender\makesrna"
PreprocessorDefinitions="NDEBUG;WIN32;_LIB;WITH_QUICKTIME;WITH_DDS;WITH_FFMPEG"
StringPooling="true"
RuntimeLibrary="0"
@@ -478,43 +478,15 @@
>
</File>
<File
- RelativePath="..\..\..\source\blender\imbuf\intern\amiga.c"
- >
- </File>
- <File
RelativePath="..\..\..\source\blender\imbuf\intern\anim.c"
>
</File>
<File
- RelativePath="..\..\..\source\blender\imbuf\intern\anim5.c"
- >
- </File>
- <File
- RelativePath="..\..\..\source\blender\imbuf\intern\antialias.c"
- >
- </File>
- <File
- RelativePath="..\..\..\source\blender\imbuf\intern\bitplanes.c"
- >
- </File>
- <File
RelativePath="..\..\..\source\blender\imbuf\intern\bmp.c"
>
</File>
<File
- RelativePath="..\..\..\source\blender\imbuf\intern\cmap.c"
- >
- </File>
- <File
- RelativePath="..\..\..\source\blender\imbuf\intern\cspace.c"
- >
- </File>
- <File
- RelativePath="..\..\..\source\blender\imbuf\intern\data.c"
- >
- </File>
- <File
- RelativePath="..\..\..\source\blender\imbuf\intern\dither.c"
+ RelativePath="..\..\..\source\blender\imbuf\intern\cache.c"
>
</File>
<File
@@ -522,7 +494,7 @@
>
</File>
<File
- RelativePath="..\..\..\source\blender\imbuf\intern\dynlibtiff.c"
+ RelativePath="..\..\..\source\blender\imbuf\intern\filetype.c"
>
</File>
<File
@@ -530,39 +502,31 @@
>
</File>
<File
- RelativePath="..\..\..\source\blender\imbuf\intern\ham.c"
- >
- </File>
- <File
- RelativePath="..\..\..\source\blender\imbuf\intern\hamx.c"
+ RelativePath="..\..\..\source\blender\imbuf\intern\imageprocess.c"
>
</File>
<File
- RelativePath="..\..\..\source\blender\imbuf\intern\iff.c"
+ RelativePath="..\..\..\source\blender\imbuf\intern\iris.c"
>
</File>
<File
- RelativePath="..\..\..\source\blender\imbuf\intern\imageprocess.c"
+ RelativePath="..\..\..\source\blender\imbuf\intern\jp2.c"
>
</File>
<File
- RelativePath="..\..\..\source\blender\imbuf\intern\imginfo.c"
+ RelativePath="..\..\..\source\blender\imbuf\intern\jpeg.c"
>
</File>
<File
- RelativePath="..\..\..\source\blender\imbuf\intern\iris.c"
+ RelativePath="..\..\..\source\blender\imbuf\intern\md5.c"
>
</File>
<File
- RelativePath="..\..\..\source\blender\imbuf\intern\jp2.c"
+ RelativePath="..\..\..\source\blender\imbuf\intern\metadata.c"
>
</File>
<File
- RelativePath="..\..\..\source\blender\imbuf\intern\jpeg.c"
- >
- </File>
- <File
- RelativePath="..\..\..\source\blender\imbuf\intern\md5.c"
+ RelativePath="..\..\..\source\blender\imbuf\intern\module.c"
>
</File>
<File
@@ -626,6 +590,10 @@
>
</File>
<File
+ RelativePath="..\..\..\source\blender\imbuf\intern\thumbs_blend.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\imbuf\intern\tiff.c"
>
</File>
@@ -780,43 +748,19 @@
Filter="h;hpp;hxx;hm;inl"
>
<File
- RelativePath="..\..\..\source\blender\imbuf\intern\dynlibtiff.h"
- >
- </File>
- <File
RelativePath="..\..\..\source\blender\imbuf\intern\IMB_allocimbuf.h"
>
</File>
<File
- RelativePath="..\..\..\source\blender\imbuf\intern\IMB_amiga.h"
- >
- </File>
- <File
RelativePath="..\..\..\source\blender\imbuf\intern\IMB_anim.h"
>
</File>
<File
- RelativePath="..\..\..\source\blender\imbuf\intern\IMB_anim5.h"
- >
- </File>
- <File
RelativePath="..\..\..\source\blender\imbuf\intern\IMB_bitplanes.h"
>
</File>
<File
- RelativePath="..\..\..\source\blender\imbuf\intern\IMB_bmp.h"
- >
- </File>
- <File
- RelativePath="..\..\..\source\blender\imbuf\intern\IMB_cmap.h"
- >
- </File>
- <File
- RelativePath="..\..\..\source\blender\imbuf\intern\IMB_divers.h"
- >
- </File>
- <File
- RelativePath="..\..\..\source\blender\imbuf\intern\IMB_dpxcineon.h"
+ RelativePath="..\..\..\source\blender\imbuf\intern\IMB_filetype.h"
>
</File>
<File
@@ -824,18 +768,6 @@
>
</File>
<File
- RelativePath="..\..\..\source\blender\imbuf\intern\IMB_ham.h"
- >
- </File>
- <File
- RelativePath="..\..\..\source\blender\imbuf\intern\IMB_hamx.h"
- >
- </File>
- <File
- RelativePath="..\..\..\source\blender\imbuf\intern\IMB_iff.h"
- >
- </File>
- <File
RelativePath="..\..\..\source\blender\imbuf\IMB_imbuf.h"
>
</File>
@@ -844,31 +776,7 @@
>
</File>
<File
- RelativePath="..\..\..\source\blender\imbuf\intern\IMB_imginfo.h"
- >
- </File>
- <File
- RelativePath="..\..\..\source\blender\imbuf\intern\IMB_iris.h"
- >
- </File>
- <File
- RelativePath="..\..\..\source\blender\imbuf\intern\IMB_jp2.h"
- >
- </File>
- <File
- RelativePath="..\..\..\source\blender\imbuf\intern\IMB_jpeg.h"
- >
- </File>
- <File
- RelativePath="..\..\..\source\blender\imbuf\intern\IMB_png.h"
- >
- </File>
- <File
- RelativePath="..\..\..\source\blender\imbuf\intern\IMB_radiance_hdr.h"
- >
- </File>
- <File
- RelativePath="..\..\..\source\blender\imbuf\intern\IMB_targa.h"
+ RelativePath="..\..\..\source\blender\imbuf\intern\IMB_metadata.h"
>
</File>
<File
@@ -876,19 +784,11 @@
>
</File>
<File
- RelativePath="..\..\..\source\blender\imbuf\intern\IMB_tiff.h"
- >
- </File>
- <File
RelativePath="..\..\..\source\blender\imbuf\intern\imbuf.h"
>
</File>
<File
- RelativePath="..\..\..\source\blender\imbuf\intern\imbuf_patch.h"
- >
- </File>
- <File
- RelativePath="..\..\..\source\blender\imbuf\intern\matrix.h"
+ RelativePath="..\..\..\source\blender\imbuf\intern\md5.h"
>
</File>
<File
diff --git a/projectfiles_vc9/blender/makesrna/RNA_makesrna.vcproj b/projectfiles_vc9/blender/makesrna/RNA_makesrna.vcproj
index 3819a298e47..74f798973d4 100644
--- a/projectfiles_vc9/blender/makesrna/RNA_makesrna.vcproj
+++ b/projectfiles_vc9/blender/makesrna/RNA_makesrna.vcproj
@@ -45,7 +45,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesrna\internal"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesrna\internal"
PreprocessorDefinitions="_DEBUG,WIN32,_CONSOLE"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -140,7 +140,7 @@
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesrna\internal"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesrna\internal"
PreprocessorDefinitions="NDEBUG,WIN32,_CONSOLE;GAMEBLENDER=1;WITH_SDL;WITH_OPENAL;WITH_JACK"
StringPooling="true"
RuntimeLibrary="0"
@@ -233,7 +233,7 @@
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesrna\internal"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesrna\internal"
PreprocessorDefinitions="NDEBUG,WIN32,_CONSOLE"
StringPooling="true"
RuntimeLibrary="2"
@@ -326,7 +326,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesrna\internal"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesrna\internal"
PreprocessorDefinitions="_DEBUG;WIN32;_CONSOLE;GAMEBLENDER=1;WITH_SDL;WITH_OPENAL;WITH_JACK"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@@ -422,7 +422,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesrna\internal"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesrna\internal"
PreprocessorDefinitions="_DEBUG,WIN32,_CONSOLE;GAMEBLENDER=1;WITH_SDL;WITH_OPENAL;WITH_JACK"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@@ -518,7 +518,7 @@
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesrna\internal"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\gpu;..\..\..\source\blender\windowmanager;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesrna\internal"
PreprocessorDefinitions="NDEBUG,WIN32,_CONSOLE;GAMEBLENDER=1;WITH_SDL;WITH_OPENAL;WITH_JACK"
StringPooling="true"
RuntimeLibrary="0"
@@ -606,6 +606,10 @@
>
</File>
<File
+ RelativePath="..\..\..\source\blender\makesrna\intern\rna_actuator_api.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\makesrna\intern\rna_animation.c"
>
</File>
@@ -658,6 +662,10 @@
>
</File>
<File
+ RelativePath="..\..\..\source\blender\makesrna\intern\rna_controller_api.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\makesrna\intern\rna_curve.c"
>
</File>
@@ -810,10 +818,18 @@
>
</File>
<File
+ RelativePath="..\..\..\source\blender\makesrna\intern\rna_sensor_api.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\makesrna\intern\rna_sequencer.c"
>
</File>
<File
+ RelativePath="..\..\..\source\blender\makesrna\intern\rna_sequencer_api.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\makesrna\intern\rna_smoke.c"
>
</File>
diff --git a/projectfiles_vc9/blender/makesrna/RNA_rna.vcproj b/projectfiles_vc9/blender/makesrna/RNA_rna.vcproj
index 4fb2e780853..1fe05a11aec 100644
--- a/projectfiles_vc9/blender/makesrna/RNA_rna.vcproj
+++ b/projectfiles_vc9/blender/makesrna/RNA_rna.vcproj
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\makesrna\intern;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\ikplugin;..\..\..\source\blender\windowmanager;..\..\..\source\blender\editors\include;..\..\..\source\blender\gpu;..\..\..\source\blender\render\extern\include"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\makesrna\intern;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\ikplugin;..\..\..\source\blender\windowmanager;..\..\..\source\blender\editors\include;..\..\..\source\blender\gpu;..\..\..\source\blender\render\extern\include"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;GAMEBLENDER=1"
MinimalRebuild="true"
BasicRuntimeChecks="3"
@@ -114,7 +114,7 @@
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\makesrna\intern;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\ikplugin;..\..\..\source\blender\windowmanager;..\..\..\source\blender\editors\include;..\..\..\source\blender\gpu;..\..\..\source\blender\render\extern\include"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\makesrna\intern;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\ikplugin;..\..\..\source\blender\windowmanager;..\..\..\source\blender\editors\include;..\..\..\source\blender\gpu;..\..\..\source\blender\render\extern\include"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;GAMEBLENDER=1"
MinimalRebuild="true"
RuntimeLibrary="0"
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 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9,00"
+ Name="BL_modifiers"
+ ProjectGUID="{7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}"
+ RootNamespace="BL_modifiers"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="BlenderPlayer Debug|Win32"
+ OutputDirectory="$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="4"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\zlib\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;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenkernel\intern;..\..\..\source\blender\makesdna;..\..\..\source\blender\modifiers;..\..\..\source\blender\render\extern\include"
+ PreprocessorDefinitions="_DEBUG;WIN32;_LIB"
+ MinimalRebuild="false"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ DefaultCharIsUnsigned="true"
+ UsePrecompiledHeader="0"
+ PrecompiledHeaderFile="..\..\..\..\build\msvc_9\source\blender\modifiers\debug\modifiers.pch"
+ AssemblerListingLocation="..\..\..\..\build\msvc_9\source\blender\modifiers\debug\"
+ ObjectFile="..\..\..\..\build\msvc_9\source\blender\modifiers\debug\"
+ ProgramDataBaseFileName="..\..\..\..\build\msvc_9\source\blender\modifiers\debug\"
+ WarningLevel="2"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="..\..\..\..\build\msvc_9\libs\debug\BL_modifiers.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="BlenderPlayer Release|Win32"
+ OutputDirectory="$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="4"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\zlib\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;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenkernel\intern;..\..\..\source\blender\makesdna;..\..\..\source\blender\modifiers;..\..\..\source\blender\render\extern\include"
+ PreprocessorDefinitions="_DEBUG;WIN32;_LIB"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="0"
+ DefaultCharIsUnsigned="true"
+ UsePrecompiledHeader="0"
+ PrecompiledHeaderFile="..\..\..\..\build\msvc_9\source\blender\modifiers\modifiers.pch"
+ AssemblerListingLocation="..\..\..\..\build\msvc_9\source\blender\modifiers\"
+ ObjectFile="..\..\..\..\build\msvc_9\source\blender\modifiers\"
+ ProgramDataBaseFileName="..\..\..\..\build\msvc_9\source\blender\modifiers\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="..\..\..\..\build\msvc_9\libs\BL_modifiers.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Blender Debug|Win32"
+ OutputDirectory="..\..\..\..\build\msvc_9\source\blender\modifiers\debug"
+ IntermediateDirectory="..\..\..\..\build\msvc_9\source\blender\modifiers\debug"
+ ConfigurationType="4"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\zlib\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;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenkernel\intern;..\..\..\source\blender\makesdna;..\..\..\source\blender\modifiers;..\..\..\source\blender\render\extern\include"
+ PreprocessorDefinitions="_DEBUG;WIN32;_LIB;WITH_LZO;WITH_LZMA"
+ MinimalRebuild="false"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ DefaultCharIsUnsigned="true"
+ UsePrecompiledHeader="0"
+ PrecompiledHeaderFile="..\..\..\..\build\msvc_9\source\blender\modifiers\debug\modifiers.pch"
+ AssemblerListingLocation="..\..\..\..\build\msvc_9\source\blender\modifiers\debug\"
+ ObjectFile="..\..\..\..\build\msvc_9\source\blender\modifiers\debug\"
+ ProgramDataBaseFileName="..\..\..\..\build\msvc_9\source\blender\modifiers\debug\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="..\..\..\..\build\msvc_9\libs\debug\BL_modifiers.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Blender Release|Win32"
+ OutputDirectory="..\..\..\..\build\msvc_9\source\blender\imbuf"
+ IntermediateDirectory="..\..\..\..\build\msvc_9\source\blender\imbuf"
+ ConfigurationType="4"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\zlib\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;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenkernel\intern;..\..\..\source\blender\makesdna;..\..\..\source\blender\modifiers;..\..\..\source\blender\render\extern\include"
+ PreprocessorDefinitions="NDEBUG;WIN32;_LIB;WITH_LZO;WITH_LZMA"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="0"
+ DefaultCharIsUnsigned="true"
+ UsePrecompiledHeader="0"
+ PrecompiledHeaderFile="..\..\..\..\build\msvc_9\source\blender\modifiers\modifiers.pch"
+ AssemblerListingLocation="..\..\..\..\build\msvc_9\source\blender\modifiers\"
+ ObjectFile="..\..\..\..\build\msvc_9\source\blender\modifiers\"
+ ProgramDataBaseFileName="..\..\..\..\build\msvc_9\source\blender\modifiers\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="..\..\..\..\build\msvc_9\libs\BL_modifiers.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_armature.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_array.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_bevel.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_boolean.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_boolean_util.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_build.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_cast.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_cloth.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_collision.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_curve.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_decimate.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_displace.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_edgesplit.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_explode.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_fluidsim.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_fluidsim_util.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_hook.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_lattice.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_mask.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_meshdeform.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_mirror.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_multires.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_none.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_particleinstance.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_particlesystem.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_screw.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_shapekey.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_shrinkwrap.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_simpledeform.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_smoke.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_smooth.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_softbody.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_solidify.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_subsurf.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_surface.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_util.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_uvproject.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_wave.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\MOD_modifiertypes.h"
+ >
+ </File>
+ <Filter
+ Name="intern"
+ >
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_boolean_util.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_fluidsim_util.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\modifiers\intern\MOD_util.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/projectfiles_vc9/gameengine/gamelogic/SCA_GameLogic.vcproj b/projectfiles_vc9/gameengine/gamelogic/SCA_GameLogic.vcproj
index f59a0280940..8c74ec18b41 100644
--- a/projectfiles_vc9/gameengine/gamelogic/SCA_GameLogic.vcproj
+++ b/projectfiles_vc9/gameengine/gamelogic/SCA_GameLogic.vcproj
@@ -607,6 +607,14 @@
>
</File>
<File
+ RelativePath="..\..\..\source\gameengine\GameLogic\SCA_PythonKeyboard.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\gameengine\GameLogic\SCA_PythonMouse.cpp"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\gameengine\GameLogic\SCA_RandomActuator.cpp"
>
</File>
@@ -776,6 +784,14 @@
>
</File>
<File
+ RelativePath="..\..\..\source\gameengine\GameLogic\SCA_PythonKeyboard.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\gameengine\GameLogic\SCA_PythonMouse.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\gameengine\GameLogic\SCA_RandomActuator.h"
>
</File>
diff --git a/release/Makefile b/release/Makefile
index 809ac548724..bef76b349b2 100644
--- a/release/Makefile
+++ b/release/Makefile
@@ -16,7 +16,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.
@@ -114,8 +114,8 @@ install: package
ifneq ($(OS), darwin)
@[ ! -d $(OCGDIR)/bin/.blender ] || \
cp -r $(OCGDIR)/bin/.blender $(DISTDIR)
- @cp $(NANBLENDERHOME)/bin/.blender/.Blanguages $(CONFDIR)
- @cp $(NANBLENDERHOME)/bin/.blender/.bfont.ttf $(CONFDIR)
+ @cp $(NANBLENDERHOME)/release/bin/.blender/.Blanguages $(CONFDIR)
+ @cp $(NANBLENDERHOME)/release/bin/.blender/.bfont.ttf $(CONFDIR)
endif
@echo "----> Copy blender$(EXT0) executable"
ifeq ($(TYPE),-static)
diff --git a/release/VERSION b/release/VERSION
index 49d0a5da421..c43732bd65a 100644
--- a/release/VERSION
+++ b/release/VERSION
@@ -1 +1 @@
-2.5-alpha2
+2.5-beta
diff --git a/bin/.blender/.Blanguages b/release/bin/.blender/.Blanguages
index 9f3b3ef80dc..9f3b3ef80dc 100644
--- a/bin/.blender/.Blanguages
+++ b/release/bin/.blender/.Blanguages
diff --git a/bin/.blender/.bfont.ttf b/release/bin/.blender/.bfont.ttf
index 58cd6b5e61e..58cd6b5e61e 100644
--- a/bin/.blender/.bfont.ttf
+++ b/release/bin/.blender/.bfont.ttf
Binary files differ
diff --git a/release/bin/blender-thumbnailer.py b/release/bin/blender-thumbnailer.py
new file mode 100755
index 00000000000..27d6259d172
--- /dev/null
+++ b/release/bin/blender-thumbnailer.py
@@ -0,0 +1,131 @@
+#!/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 #####
+
+"""
+Thumbnailer runs with python 2.6 and 3.x.
+To run automatically with nautilus:
+ gconftool --type boolean --set /desktop/gnome/thumbnailers/application@x-blender/enable true
+ gconftool --type string --set /desktop/gnome/thumbnailers/application@x-blender/command "blender-thumbnailer.py %i %o"
+"""
+
+import struct
+
+def blend_extract_thumb(path):
+ import os
+
+ # def MAKE_ID(tag): ord(tag[0])<<24 | ord(tag[1])<<16 | ord(tag[2])<<8 | ord(tag[3])
+ REND = 1145980242 # MAKE_ID(b'REND')
+ TEST = 1414743380 # MAKE_ID(b'TEST')
+
+ blendfile = open(path, 'rb')
+
+ head = blendfile.read(12)
+
+ if head[0:2] == b'\x1f\x8b': # gzip magic
+ import gzip
+ blendfile.close()
+ blendfile = gzip.open(path, 'rb')
+ head = blendfile.read(12)
+
+ if not head.startswith(b'BLENDER'):
+ blendfile.close()
+ return None, 0, 0
+
+ is_64_bit = (head[7] == b'-')
+
+ # true for PPC, false for X86
+ is_big_endian = (head[8] == b'V')
+
+ # blender pre 2.5 had no thumbs
+ if head[9:11] <= b'24':
+ return None, 0, 0
+
+ sizeof_bhead = 24 if is_64_bit else 20
+ int_endian_pair = '>ii' if is_big_endian else '<ii'
+
+ while True:
+ bhead = blendfile.read(sizeof_bhead)
+
+ if len(bhead) < sizeof_bhead:
+ return None, 0, 0
+
+ code, length = struct.unpack(int_endian_pair, bhead[0:8]) # 8 == sizeof(int) * 2
+
+ if code == REND:
+ blendfile.seek(length, os.SEEK_CUR)
+ else:
+ break
+
+
+ if code != TEST:
+ return None, 0, 0
+
+ try:
+ x, y = struct.unpack(int_endian_pair, blendfile.read(8)) # 8 == sizeof(int) * 2
+ except struct.error:
+ return None, 0, 0
+
+ length -= 8 # sizeof(int) * 2
+
+ if length != x * y * 4:
+ return None, 0, 0
+
+ image_buffer = blendfile.read(length)
+
+ if len(image_buffer) != length:
+ return None, 0, 0
+
+ return image_buffer, x, y
+
+
+def write_png(buf, width, height):
+ import zlib
+
+ # reverse the vertical line order and add null bytes at the start
+ width_byte_4 = width * 4
+ raw_data = b"".join([b'\x00' + buf[span:span + width_byte_4] for span in range((height - 1) * width * 4, -1, - width_byte_4)])
+
+ def png_pack(png_tag, data):
+ chunk_head = png_tag + data
+ return struct.pack("!I", len(data)) + chunk_head + struct.pack("!I", 0xFFFFFFFF & zlib.crc32(chunk_head))
+
+ return b"".join([
+ b'\x89PNG\r\n\x1a\n',
+ png_pack(b'IHDR', struct.pack("!2I5B", width, height, 8, 6, 0, 0, 0)),
+ png_pack(b'IDAT', zlib.compress(raw_data, 9)),
+ png_pack(b'IEND', b'')])
+
+
+if __name__ == '__main__':
+ import sys
+
+ if len(sys.argv) < 2:
+ print("Expected 2 arguments <input.blend> <output.png>")
+ else:
+ file_in = sys.argv[-2]
+
+ buf, width, height = blend_extract_thumb(file_in)
+
+ if buf:
+ file_out = sys.argv[-1]
+
+ f = open(file_out, "wb")
+ f.write(write_png(buf, width, height))
+ f.close()
diff --git a/release/datafiles/blenderbuttons b/release/datafiles/blenderbuttons
index 2aee30b407f..b9fa75cc254 100644
--- a/release/datafiles/blenderbuttons
+++ b/release/datafiles/blenderbuttons
Binary files differ
diff --git a/release/datafiles/brushicons/add.png b/release/datafiles/brushicons/add.png
new file mode 100644
index 00000000000..ad041bed130
--- /dev/null
+++ b/release/datafiles/brushicons/add.png
Binary files differ
diff --git a/release/datafiles/brushicons/blob.png b/release/datafiles/brushicons/blob.png
new file mode 100644
index 00000000000..1d63d1e873c
--- /dev/null
+++ b/release/datafiles/brushicons/blob.png
Binary files differ
diff --git a/release/datafiles/brushicons/blur.png b/release/datafiles/brushicons/blur.png
new file mode 100644
index 00000000000..6b8fc4b6053
--- /dev/null
+++ b/release/datafiles/brushicons/blur.png
Binary files differ
diff --git a/release/datafiles/brushicons/clay.png b/release/datafiles/brushicons/clay.png
new file mode 100644
index 00000000000..dab73b7cbdd
--- /dev/null
+++ b/release/datafiles/brushicons/clay.png
Binary files differ
diff --git a/release/datafiles/brushicons/clone.png b/release/datafiles/brushicons/clone.png
new file mode 100644
index 00000000000..89677961d81
--- /dev/null
+++ b/release/datafiles/brushicons/clone.png
Binary files differ
diff --git a/release/datafiles/brushicons/crease.png b/release/datafiles/brushicons/crease.png
new file mode 100644
index 00000000000..ac057e081c1
--- /dev/null
+++ b/release/datafiles/brushicons/crease.png
Binary files differ
diff --git a/release/datafiles/brushicons/darken.png b/release/datafiles/brushicons/darken.png
new file mode 100644
index 00000000000..ee312c7a04f
--- /dev/null
+++ b/release/datafiles/brushicons/darken.png
Binary files differ
diff --git a/release/datafiles/brushicons/draw.png b/release/datafiles/brushicons/draw.png
new file mode 100644
index 00000000000..2cbc8052312
--- /dev/null
+++ b/release/datafiles/brushicons/draw.png
Binary files differ
diff --git a/release/datafiles/brushicons/fill.png b/release/datafiles/brushicons/fill.png
new file mode 100644
index 00000000000..654ec7b66fc
--- /dev/null
+++ b/release/datafiles/brushicons/fill.png
Binary files differ
diff --git a/release/datafiles/brushicons/flatten.png b/release/datafiles/brushicons/flatten.png
new file mode 100644
index 00000000000..401226be862
--- /dev/null
+++ b/release/datafiles/brushicons/flatten.png
Binary files differ
diff --git a/release/datafiles/brushicons/grab.png b/release/datafiles/brushicons/grab.png
new file mode 100644
index 00000000000..d3ebbef31ad
--- /dev/null
+++ b/release/datafiles/brushicons/grab.png
Binary files differ
diff --git a/release/datafiles/brushicons/inflate.png b/release/datafiles/brushicons/inflate.png
new file mode 100644
index 00000000000..f3ad313add8
--- /dev/null
+++ b/release/datafiles/brushicons/inflate.png
Binary files differ
diff --git a/release/datafiles/brushicons/layer.png b/release/datafiles/brushicons/layer.png
new file mode 100644
index 00000000000..df3b02fb766
--- /dev/null
+++ b/release/datafiles/brushicons/layer.png
Binary files differ
diff --git a/release/datafiles/brushicons/lighten.png b/release/datafiles/brushicons/lighten.png
new file mode 100644
index 00000000000..6dacf6dcc75
--- /dev/null
+++ b/release/datafiles/brushicons/lighten.png
Binary files differ
diff --git a/release/datafiles/brushicons/mix.png b/release/datafiles/brushicons/mix.png
new file mode 100644
index 00000000000..d871d241769
--- /dev/null
+++ b/release/datafiles/brushicons/mix.png
Binary files differ
diff --git a/release/datafiles/brushicons/multiply.png b/release/datafiles/brushicons/multiply.png
new file mode 100644
index 00000000000..2dd32463627
--- /dev/null
+++ b/release/datafiles/brushicons/multiply.png
Binary files differ
diff --git a/release/datafiles/brushicons/nudge.png b/release/datafiles/brushicons/nudge.png
new file mode 100644
index 00000000000..84964e91f30
--- /dev/null
+++ b/release/datafiles/brushicons/nudge.png
Binary files differ
diff --git a/release/datafiles/brushicons/pinch.png b/release/datafiles/brushicons/pinch.png
new file mode 100644
index 00000000000..b60bcd66a36
--- /dev/null
+++ b/release/datafiles/brushicons/pinch.png
Binary files differ
diff --git a/release/datafiles/brushicons/scrape.png b/release/datafiles/brushicons/scrape.png
new file mode 100644
index 00000000000..9b7a57c1b9f
--- /dev/null
+++ b/release/datafiles/brushicons/scrape.png
Binary files differ
diff --git a/release/datafiles/brushicons/smear.png b/release/datafiles/brushicons/smear.png
new file mode 100644
index 00000000000..4cdc2205c46
--- /dev/null
+++ b/release/datafiles/brushicons/smear.png
Binary files differ
diff --git a/release/datafiles/brushicons/smooth.png b/release/datafiles/brushicons/smooth.png
new file mode 100644
index 00000000000..052e2452d13
--- /dev/null
+++ b/release/datafiles/brushicons/smooth.png
Binary files differ
diff --git a/release/datafiles/brushicons/snake_hook.png b/release/datafiles/brushicons/snake_hook.png
new file mode 100644
index 00000000000..f8351d909ee
--- /dev/null
+++ b/release/datafiles/brushicons/snake_hook.png
Binary files differ
diff --git a/release/datafiles/brushicons/soften.png b/release/datafiles/brushicons/soften.png
new file mode 100644
index 00000000000..2b2e9116f30
--- /dev/null
+++ b/release/datafiles/brushicons/soften.png
Binary files differ
diff --git a/release/datafiles/brushicons/subtract.png b/release/datafiles/brushicons/subtract.png
new file mode 100644
index 00000000000..c28975ecf20
--- /dev/null
+++ b/release/datafiles/brushicons/subtract.png
Binary files differ
diff --git a/release/datafiles/brushicons/texdraw.png b/release/datafiles/brushicons/texdraw.png
new file mode 100644
index 00000000000..1241349a15e
--- /dev/null
+++ b/release/datafiles/brushicons/texdraw.png
Binary files differ
diff --git a/release/datafiles/brushicons/thumb.png b/release/datafiles/brushicons/thumb.png
new file mode 100644
index 00000000000..8c39075fc8a
--- /dev/null
+++ b/release/datafiles/brushicons/thumb.png
Binary files differ
diff --git a/release/datafiles/brushicons/twist.png b/release/datafiles/brushicons/twist.png
new file mode 100644
index 00000000000..53904427660
--- /dev/null
+++ b/release/datafiles/brushicons/twist.png
Binary files differ
diff --git a/release/datafiles/brushicons/vertexdraw.png b/release/datafiles/brushicons/vertexdraw.png
new file mode 100644
index 00000000000..8bd2dc1be8a
--- /dev/null
+++ b/release/datafiles/brushicons/vertexdraw.png
Binary files differ
diff --git a/release/datafiles/splash.png b/release/datafiles/splash.png
index 1894d2c2bdc..89e195937bc 100644
--- a/release/datafiles/splash.png
+++ b/release/datafiles/splash.png
Binary files 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/plugins/Makefile b/release/plugins/Makefile
index 3ed2ee2161e..ee7086b331d 100644
--- a/release/plugins/Makefile
+++ b/release/plugins/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/release/plugins/bmake b/release/plugins/bmake
index f03e9270011..9740bfa716a 100644
--- a/release/plugins/bmake
+++ b/release/plugins/bmake
@@ -16,7 +16,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/release/plugins/sequence/Makefile b/release/plugins/sequence/Makefile
index 0e1463fae7f..ab847adf5fe 100644
--- a/release/plugins/sequence/Makefile
+++ b/release/plugins/sequence/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/release/plugins/texture/Makefile b/release/plugins/texture/Makefile
index 0e1463fae7f..ab847adf5fe 100644
--- a/release/plugins/texture/Makefile
+++ b/release/plugins/texture/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/release/scripts/io/engine_render_pov.py b/release/scripts/io/engine_render_pov.py
deleted file mode 100644
index e64e3bf05fb..00000000000
--- a/release/scripts/io/engine_render_pov.py
+++ /dev/null
@@ -1,964 +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.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-# <pep8 compliant>
-
-import bpy
-
-from math import atan, pi, degrees
-import subprocess
-import os
-import sys
-import time
-
-import platform as pltfrm
-
-if pltfrm.architecture()[0] == '64bit':
- bitness = 64
-else:
- bitness = 32
-
-
-def write_pov(filename, scene=None, info_callback=None):
- file = open(filename, 'w')
-
- # Only for testing
- if not scene:
- scene = bpy.data.scenes[0]
-
- render = scene.render
- world = scene.world
-
- def uniqueName(name, nameSeq):
-
- if name not in nameSeq:
- return name
-
- name_orig = name
- i = 1
- while name in nameSeq:
- name = '%s_%.3d' % (name_orig, i)
- i += 1
-
- return name
-
- def writeMatrix(matrix):
- file.write('\tmatrix <%.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f>\n' %\
- (matrix[0][0], matrix[0][1], matrix[0][2], matrix[1][0], matrix[1][1], matrix[1][2], matrix[2][0], matrix[2][1], matrix[2][2], matrix[3][0], matrix[3][1], matrix[3][2]))
-
- def writeObjectMaterial(material):
- if material and material.transparency_method == 'RAYTRACE':
- file.write('\tinterior { ior %.6f }\n' % material.raytrace_transparency.ior)
-
- # Other interior args
- # fade_distance 2
- # fade_power [Value]
- # fade_color
-
- # dispersion
- # dispersion_samples
-
- materialNames = {}
- DEF_MAT_NAME = 'Default'
-
- def writeMaterial(material):
- # Assumes only called once on each material
-
- if material:
- name_orig = material.name
- else:
- name_orig = DEF_MAT_NAME
-
- name = materialNames[name_orig] = uniqueName(bpy.utils.clean_name(name_orig), materialNames)
-
- file.write('#declare %s = finish {\n' % name)
-
- if material:
- file.write('\tdiffuse %.3g\n' % material.diffuse_intensity)
- file.write('\tspecular %.3g\n' % material.specular_intensity)
-
- file.write('\tambient %.3g\n' % material.ambient)
- #file.write('\tambient rgb <%.3g, %.3g, %.3g>\n' % tuple([c*material.ambient for c in world.ambient_color])) # povray blends the global value
-
- # map hardness between 0.0 and 1.0
- roughness = ((1.0 - ((material.specular_hardness - 1.0) / 510.0)))
- # scale from 0.0 to 0.1
- roughness *= 0.1
- # add a small value because 0.0 is invalid
- roughness += (1 / 511.0)
-
- file.write('\troughness %.3g\n' % roughness)
-
- # 'phong 70.0 '
-
- if material.raytrace_mirror.enabled:
- raytrace_mirror = material.raytrace_mirror
- if raytrace_mirror.reflect_factor:
- file.write('\treflection {\n')
- file.write('\t\trgb <%.3g, %.3g, %.3g>' % tuple(material.mirror_color))
- file.write('\t\tfresnel 1 falloff %.3g exponent %.3g metallic %.3g} ' % (raytrace_mirror.fresnel, raytrace_mirror.fresnel_factor, raytrace_mirror.reflect_factor))
-
- else:
- file.write('\tdiffuse 0.8\n')
- file.write('\tspecular 0.2\n')
-
-
- # This is written into the object
- '''
- if material and material.transparency_method=='RAYTRACE':
- 'interior { ior %.3g} ' % material.raytrace_transparency.ior
- '''
-
- #file.write('\t\t\tcrand 1.0\n') # Sand granyness
- #file.write('\t\t\tmetallic %.6f\n' % material.spec)
- #file.write('\t\t\tphong %.6f\n' % material.spec)
- #file.write('\t\t\tphong_size %.6f\n' % material.spec)
- #file.write('\t\t\tbrilliance %.6f ' % (material.specular_hardness/256.0) # Like hardness
-
- file.write('}\n')
-
- def exportCamera():
- camera = scene.camera
- matrix = camera.matrix
-
- # compute resolution
- Qsize = float(render.resolution_x) / float(render.resolution_y)
-
- file.write('camera {\n')
- file.write('\tlocation <0, 0, 0>\n')
- file.write('\tlook_at <0, 0, -1>\n')
- file.write('\tright <%s, 0, 0>\n' % - Qsize)
- file.write('\tup <0, 1, 0>\n')
- file.write('\tangle %f \n' % (360.0 * atan(16.0 / camera.data.lens) / pi))
-
- file.write('\trotate <%.6f, %.6f, %.6f>\n' % tuple([degrees(e) for e in matrix.rotation_part().to_euler()]))
- file.write('\ttranslate <%.6f, %.6f, %.6f>\n' % (matrix[3][0], matrix[3][1], matrix[3][2]))
- file.write('}\n')
-
- def exportLamps(lamps):
- # Get all lamps
- for ob in lamps:
- lamp = ob.data
-
- matrix = ob.matrix
-
- color = tuple([c * lamp.energy for c in lamp.color]) # Colour is modified by energy
-
- file.write('light_source {\n')
- file.write('\t< 0,0,0 >\n')
- file.write('\tcolor rgb<%.3g, %.3g, %.3g>\n' % color)
-
- if lamp.type == 'POINT': # Point Lamp
- pass
- elif lamp.type == 'SPOT': # Spot
- file.write('\tspotlight\n')
-
- # Falloff is the main radius from the centre line
- file.write('\tfalloff %.2f\n' % (degrees(lamp.spot_size) / 2.0)) # 1 TO 179 FOR BOTH
- file.write('\tradius %.6f\n' % ((degrees(lamp.spot_size) / 2.0) * (1.0 - lamp.spot_blend)))
-
- # Blender does not have a tightness equivilent, 0 is most like blender default.
- file.write('\ttightness 0\n') # 0:10f
-
- file.write('\tpoint_at <0, 0, -1>\n')
- elif lamp.type == 'SUN':
- file.write('\tparallel\n')
- file.write('\tpoint_at <0, 0, -1>\n') # *must* be after 'parallel'
-
- elif lamp.type == 'AREA':
-
- size_x = lamp.size
- samples_x = lamp.shadow_ray_samples_x
- if lamp.shape == 'SQUARE':
- size_y = size_x
- samples_y = samples_x
- else:
- size_y = lamp.size_y
- samples_y = lamp.shadow_ray_samples_y
-
- file.write('\tarea_light <%d,0,0>,<0,0,%d> %d, %d\n' % (size_x, size_y, samples_x, samples_y))
- if lamp.shadow_ray_sampling_method == 'CONSTANT_JITTERED':
- if lamp.jitter:
- file.write('\tjitter\n')
- else:
- file.write('\tadaptive 1\n')
- file.write('\tjitter\n')
-
- if lamp.shadow_method == 'NOSHADOW':
- file.write('\tshadowless\n')
-
- file.write('\tfade_distance %.6f\n' % lamp.distance)
- file.write('\tfade_power %d\n' % 1) # Could use blenders lamp quad?
- writeMatrix(matrix)
-
- file.write('}\n')
-
- def exportMeta(metas):
-
- # TODO - blenders 'motherball' naming is not supported.
-
- for ob in metas:
- meta = ob.data
-
- file.write('blob {\n')
- file.write('\t\tthreshold %.4g\n' % meta.threshold)
-
- try:
- material = meta.materials[0] # lame! - blender cant do enything else.
- except:
- material = None
-
- for elem in meta.elements:
-
- if elem.type not in ('BALL', 'ELLIPSOID'):
- continue # Not supported
-
- loc = elem.location
-
- stiffness = elem.stiffness
- if elem.negative:
- stiffness = - stiffness
-
- if elem.type == 'BALL':
-
- file.write('\tsphere { <%.6g, %.6g, %.6g>, %.4g, %.4g ' % (loc.x, loc.y, loc.z, elem.radius, stiffness))
-
- # After this wecould do something simple like...
- # "pigment {Blue} }"
- # except we'll write the color
-
- elif elem.type == 'ELLIPSOID':
- # location is modified by scale
- file.write('\tsphere { <%.6g, %.6g, %.6g>, %.4g, %.4g ' % (loc.x / elem.size_x, loc.y / elem.size_y, loc.z / elem.size_z, elem.radius, stiffness))
- file.write('scale <%.6g, %.6g, %.6g> ' % (elem.size_x, elem.size_y, elem.size_z))
-
- if material:
- diffuse_color = material.diffuse_color
-
- if material.transparency and material.transparency_method == 'RAYTRACE':
- trans = 1.0 - material.raytrace_transparency.filter
- else:
- trans = 0.0
-
- file.write('pigment {rgbft<%.3g, %.3g, %.3g, %.3g, %.3g>} finish {%s} }\n' % \
- (diffuse_color[0], diffuse_color[1], diffuse_color[2], 1.0 - material.alpha, trans, materialNames[material.name]))
-
- else:
- file.write('pigment {rgb<1 1 1>} finish {%s} }\n' % DEF_MAT_NAME) # Write the finish last.
-
- writeObjectMaterial(material)
-
- writeMatrix(ob.matrix)
-
- file.write('}\n')
-
- def exportMeshs(sel):
-
- ob_num = 0
-
- for ob in sel:
- ob_num += 1
-
- if ob.type in ('LAMP', 'CAMERA', 'EMPTY', 'META', 'ARMATURE'):
- continue
-
- me = ob.data
- me_materials = me.materials
-
- me = ob.create_mesh(True, 'RENDER')
-
- if not me:
- continue
-
- if info_callback:
- info_callback('Object %2.d of %2.d (%s)' % (ob_num, len(sel), ob.name))
-
- #if ob.type!='MESH':
- # continue
- # me = ob.data
-
- matrix = ob.matrix
- try:
- uv_layer = me.active_uv_texture.data
- except:
- uv_layer = None
-
- try:
- vcol_layer = me.active_vertex_color.data
- except:
- vcol_layer = None
-
- faces_verts = [f.verts for f in me.faces]
- faces_normals = [tuple(f.normal) for f in me.faces]
- verts_normals = [tuple(v.normal) for v in me.verts]
-
- # quads incur an extra face
- quadCount = len([f for f in faces_verts if len(f) == 4])
-
- file.write('mesh2 {\n')
- file.write('\tvertex_vectors {\n')
- file.write('\t\t%s' % (len(me.verts))) # vert count
- for v in me.verts:
- file.write(',\n\t\t<%.6f, %.6f, %.6f>' % tuple(v.co)) # vert count
- file.write('\n }\n')
-
-
- # Build unique Normal list
- uniqueNormals = {}
- for fi, f in enumerate(me.faces):
- fv = faces_verts[fi]
- # [-1] is a dummy index, use a list so we can modify in place
- if f.smooth: # Use vertex normals
- for v in fv:
- key = verts_normals[v]
- uniqueNormals[key] = [-1]
- else: # Use face normal
- key = faces_normals[fi]
- uniqueNormals[key] = [-1]
-
- file.write('\tnormal_vectors {\n')
- file.write('\t\t%d' % len(uniqueNormals)) # vert count
- idx = 0
- for no, index in uniqueNormals.items():
- file.write(',\n\t\t<%.6f, %.6f, %.6f>' % no) # vert count
- index[0] = idx
- idx += 1
- file.write('\n }\n')
-
-
- # Vertex colours
- vertCols = {} # Use for material colours also.
-
- if uv_layer:
- # Generate unique UV's
- uniqueUVs = {}
-
- for fi, uv in enumerate(uv_layer):
-
- if len(faces_verts[fi]) == 4:
- uvs = uv.uv1, uv.uv2, uv.uv3, uv.uv4
- else:
- uvs = uv.uv1, uv.uv2, uv.uv3
-
- for uv in uvs:
- uniqueUVs[tuple(uv)] = [-1]
-
- file.write('\tuv_vectors {\n')
- #print unique_uvs
- file.write('\t\t%s' % (len(uniqueUVs))) # vert count
- idx = 0
- for uv, index in uniqueUVs.items():
- file.write(',\n\t\t<%.6f, %.6f>' % uv)
- index[0] = idx
- idx += 1
- '''
- else:
- # Just add 1 dummy vector, no real UV's
- file.write('\t\t1') # vert count
- file.write(',\n\t\t<0.0, 0.0>')
- '''
- file.write('\n }\n')
-
-
- if me.vertex_colors:
-
- for fi, f in enumerate(me.faces):
- material_index = f.material_index
- material = me_materials[material_index]
-
- if material and material.vertex_color_paint:
-
- col = vcol_layer[fi]
-
- if len(faces_verts[fi]) == 4:
- cols = col.color1, col.color2, col.color3, col.color4
- else:
- cols = col.color1, col.color2, col.color3
-
- for col in cols:
- key = col[0], col[1], col[2], material_index # Material index!
- vertCols[key] = [-1]
-
- else:
- if material:
- diffuse_color = tuple(material.diffuse_color)
- key = diffuse_color[0], diffuse_color[1], diffuse_color[2], material_index
- vertCols[key] = [-1]
-
-
- else:
- # No vertex colours, so write material colours as vertex colours
- for i, material in enumerate(me_materials):
-
- if material:
- diffuse_color = tuple(material.diffuse_color)
- key = diffuse_color[0], diffuse_color[1], diffuse_color[2], i # i == f.mat
- vertCols[key] = [-1]
-
-
- # Vert Colours
- file.write('\ttexture_list {\n')
- file.write('\t\t%s' % (len(vertCols))) # vert count
- idx = 0
- for col, index in vertCols.items():
-
- if me_materials:
- material = me_materials[col[3]]
- material_finish = materialNames[material.name]
-
- if material.transparency and material.transparency_method == 'RAYTRACE':
- trans = 1.0 - material.raytrace_transparency.filter
- else:
- trans = 0.0
-
- else:
- material_finish = DEF_MAT_NAME # not working properly,
- trans = 0.0
-
- #print material.apl
- file.write(',\n\t\ttexture { pigment {rgbft<%.3g, %.3g, %.3g, %.3g, %.3g>} finish {%s}}' %
- (col[0], col[1], col[2], 1.0 - material.alpha, trans, material_finish))
-
- index[0] = idx
- idx += 1
-
- file.write('\n }\n')
-
- # Face indicies
- file.write('\tface_indices {\n')
- file.write('\t\t%d' % (len(me.faces) + quadCount)) # faces count
- for fi, f in enumerate(me.faces):
- fv = faces_verts[fi]
- material_index = f.material_index
- if len(fv) == 4:
- indicies = (0, 1, 2), (0, 2, 3)
- else:
- indicies = ((0, 1, 2),)
-
- if vcol_layer:
- col = vcol_layer[fi]
-
- if len(fv) == 4:
- cols = col.color1, col.color2, col.color3, col.color4
- else:
- cols = col.color1, col.color2, col.color3
-
-
- if not me_materials or me_materials[material_index] == None: # No materials
- for i1, i2, i3 in indicies:
- file.write(',\n\t\t<%d,%d,%d>' % (fv[i1], fv[i2], fv[i3])) # vert count
- else:
- material = me_materials[material_index]
- for i1, i2, i3 in indicies:
- if me.vertex_colors and material.vertex_color_paint:
- # Colour per vertex - vertex colour
-
- col1 = cols[i1]
- col2 = cols[i2]
- col3 = cols[i3]
-
- ci1 = vertCols[col1[0], col1[1], col1[2], material_index][0]
- ci2 = vertCols[col2[0], col2[1], col2[2], material_index][0]
- ci3 = vertCols[col3[0], col3[1], col3[2], material_index][0]
- else:
- # Colour per material - flat material colour
- diffuse_color = material.diffuse_color
- ci1 = ci2 = ci3 = vertCols[diffuse_color[0], diffuse_color[1], diffuse_color[2], f.material_index][0]
-
- file.write(',\n\t\t<%d,%d,%d>, %d,%d,%d' % (fv[i1], fv[i2], fv[i3], ci1, ci2, ci3)) # vert count
-
-
- file.write('\n }\n')
-
- # normal_indices indicies
- file.write('\tnormal_indices {\n')
- file.write('\t\t%d' % (len(me.faces) + quadCount)) # faces count
- for fi, fv in enumerate(faces_verts):
-
- if len(fv) == 4:
- indicies = (0, 1, 2), (0, 2, 3)
- else:
- indicies = ((0, 1, 2),)
-
- for i1, i2, i3 in indicies:
- if f.smooth:
- file.write(',\n\t\t<%d,%d,%d>' %\
- (uniqueNormals[verts_normals[fv[i1]]][0],\
- uniqueNormals[verts_normals[fv[i2]]][0],\
- uniqueNormals[verts_normals[fv[i3]]][0])) # vert count
- else:
- idx = uniqueNormals[faces_normals[fi]][0]
- file.write(',\n\t\t<%d,%d,%d>' % (idx, idx, idx)) # vert count
-
- file.write('\n }\n')
-
- if uv_layer:
- file.write('\tuv_indices {\n')
- file.write('\t\t%d' % (len(me.faces) + quadCount)) # faces count
- for fi, fv in enumerate(faces_verts):
-
- if len(fv) == 4:
- indicies = (0, 1, 2), (0, 2, 3)
- else:
- indicies = ((0, 1, 2),)
-
- uv = uv_layer[fi]
- if len(faces_verts[fi]) == 4:
- uvs = tuple(uv.uv1), tuple(uv.uv2), tuple(uv.uv3), tuple(uv.uv4)
- else:
- uvs = tuple(uv.uv1), tuple(uv.uv2), tuple(uv.uv3)
-
- for i1, i2, i3 in indicies:
- file.write(',\n\t\t<%d,%d,%d>' %\
- (uniqueUVs[uvs[i1]][0],\
- uniqueUVs[uvs[i2]][0],\
- uniqueUVs[uvs[i2]][0])) # vert count
- file.write('\n }\n')
-
- if me.materials:
- material = me.materials[0] # dodgy
- writeObjectMaterial(material)
-
- writeMatrix(matrix)
- file.write('}\n')
-
- bpy.data.meshes.remove(me)
-
- def exportWorld(world):
- if not world:
- return
-
- mist = world.mist
-
- if mist.enabled:
- 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,)))
- #file.write('\tfog_offset %.6f\n' % mist.start)
- #file.write('\tfog_alt 5\n')
- #file.write('\tturbulence 0.2\n')
- #file.write('\tturb_depth 0.3\n')
- file.write('\tfog_type 1\n')
- file.write('}\n')
-
- def exportGlobalSettings(scene):
-
- file.write('global_settings {\n')
-
- if scene.pov_radio_enable:
- file.write('\tradiosity {\n')
- file.write("\t\tadc_bailout %.4g\n" % scene.pov_radio_adc_bailout)
- file.write("\t\talways_sample %d\n" % scene.pov_radio_always_sample)
- file.write("\t\tbrightness %.4g\n" % scene.pov_radio_brightness)
- file.write("\t\tcount %d\n" % scene.pov_radio_count)
- file.write("\t\terror_bound %.4g\n" % scene.pov_radio_error_bound)
- file.write("\t\tgray_threshold %.4g\n" % scene.pov_radio_gray_threshold)
- file.write("\t\tlow_error_factor %.4g\n" % scene.pov_radio_low_error_factor)
- file.write("\t\tmedia %d\n" % scene.pov_radio_media)
- file.write("\t\tminimum_reuse %.4g\n" % scene.pov_radio_minimum_reuse)
- file.write("\t\tnearest_count %d\n" % scene.pov_radio_nearest_count)
- file.write("\t\tnormal %d\n" % scene.pov_radio_normal)
- file.write("\t\trecursion_limit %d\n" % scene.pov_radio_recursion_limit)
- file.write('\t}\n')
-
- if world:
- file.write("\tambient_light rgb<%.3g, %.3g, %.3g>\n" % tuple(world.ambient_color))
-
- file.write('}\n')
-
-
- # Convert all materials to strings we can access directly per vertex.
- writeMaterial(None) # default material
-
- for material in bpy.data.materials:
- writeMaterial(material)
-
- exportCamera()
- #exportMaterials()
- 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)
- exportWorld(scene.world)
- exportGlobalSettings(scene)
-
- file.close()
-
-
-def write_pov_ini(filename_ini, filename_pov, filename_image):
- scene = bpy.data.scenes[0]
- render = scene.render
-
- x = int(render.resolution_x * render.resolution_percentage * 0.01)
- y = int(render.resolution_y * render.resolution_percentage * 0.01)
-
- file = open(filename_ini, 'w')
-
- file.write('Input_File_Name="%s"\n' % filename_pov)
- file.write('Output_File_Name="%s"\n' % filename_image)
-
- file.write('Width=%d\n' % x)
- file.write('Height=%d\n' % y)
-
- # Needed for border render.
- '''
- file.write('Start_Column=%d\n' % part.x)
- file.write('End_Column=%d\n' % (part.x+part.w))
-
- file.write('Start_Row=%d\n' % (part.y))
- file.write('End_Row=%d\n' % (part.y+part.h))
- '''
-
- file.write('Display=0\n')
- file.write('Pause_When_Done=0\n')
- file.write('Output_File_Type=T\n') # TGA, best progressive loading
- file.write('Output_Alpha=1\n')
-
- if 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:
- file.write('Antialias=0\n')
-
- file.close()
-
-# Radiosity panel, use in the scene for now.
-FloatProperty = bpy.types.Scene.FloatProperty
-IntProperty = bpy.types.Scene.IntProperty
-BoolProperty = bpy.types.Scene.BoolProperty
-
-# Not a real pov option, just to know if we should write
-BoolProperty(attr="pov_radio_enable",
- name="Enable Radiosity",
- description="Enable povrays radiosity calculation",
- default=False)
-BoolProperty(attr="pov_radio_display_advanced",
- name="Advanced Options",
- description="Show advanced options",
- default=False)
-
-# Real pov options
-FloatProperty(attr="pov_radio_adc_bailout",
- name="ADC Bailout",
- description="The adc_bailout for radiosity rays. Use adc_bailout = 0.01 / brightest_ambient_object for good results",
- min=0.0, max=1000.0, soft_min=0.0, soft_max=1.0, default=0.01)
-
-BoolProperty(attr="pov_radio_always_sample",
- name="Always Sample",
- description="Only use the data from the pretrace step and not gather any new samples during the final radiosity pass",
- default=True)
-
-FloatProperty(attr="pov_radio_brightness",
- name="Brightness",
- description="Amount objects are brightened before being returned upwards to the rest of the system",
- min=0.0, max=1000.0, soft_min=0.0, soft_max=10.0, default=1.0)
-
-IntProperty(attr="pov_radio_count",
- name="Ray Count",
- description="Number of rays that are sent out whenever a new radiosity value has to be calculated",
- min=1, max=1600, default=35)
-
-FloatProperty(attr="pov_radio_error_bound",
- name="Error Bound",
- description="One of the two main speed/quality tuning values, lower values are more accurate",
- min=0.0, max=1000.0, soft_min=0.1, soft_max=10.0, default=1.8)
-
-FloatProperty(attr="pov_radio_gray_threshold",
- name="Gray Threshold",
- description="One of the two main speed/quality tuning values, lower values are more accurate",
- min=0.0, max=1.0, soft_min=0, soft_max=1, default=0.0)
-
-FloatProperty(attr="pov_radio_low_error_factor",
- name="Low Error Factor",
- description="If you calculate just enough samples, but no more, you will get an image which has slightly blotchy lighting",
- min=0.0, max=1.0, soft_min=0.0, soft_max=1.0, default=0.5)
-
-# max_sample - not available yet
-BoolProperty(attr="pov_radio_media",
- name="Media",
- description="Radiosity estimation can be affected by media",
- default=False)
-
-FloatProperty(attr="pov_radio_minimum_reuse",
- name="Minimum Reuse",
- description="Fraction of the screen width which sets the minimum radius of reuse for each sample point (At values higher than 2% expect errors)",
- min=0.0, max=1.0, soft_min=0.1, soft_max=0.1, default=0.015)
-
-IntProperty(attr="pov_radio_nearest_count",
- name="Nearest Count",
- description="Number of old ambient values blended together to create a new interpolated value",
- min=1, max=20, default=5)
-
-BoolProperty(attr="pov_radio_normal",
- name="Normals",
- description="Radiosity estimation can be affected by normals",
- default=False)
-
-IntProperty(attr="pov_radio_recursion_limit",
- name="Recursion Limit",
- description="how many recursion levels are used to calculate the diffuse inter-reflection",
- min=1, max=20, default=3)
-
-
-class PovrayRender(bpy.types.RenderEngine):
- bl_idname = 'POVRAY_RENDER'
- bl_label = "Povray"
- DELAY = 0.02
-
- def _export(self, scene):
- import tempfile
-
- self._temp_file_in = tempfile.mktemp(suffix='.pov')
- self._temp_file_out = tempfile.mktemp(suffix='.tga')
- self._temp_file_ini = tempfile.mktemp(suffix='.ini')
- '''
- self._temp_file_in = '/test.pov'
- self._temp_file_out = '/test.tga'
- self._temp_file_ini = '/test.ini'
- '''
-
- def info_callback(txt):
- self.update_stats("", "POVRAY: " + txt)
-
- write_pov(self._temp_file_in, scene, info_callback)
-
- def _render(self):
-
- try:
- os.remove(self._temp_file_out) # so as not to load the old file
- except:
- pass
-
- write_pov_ini(self._temp_file_ini, self._temp_file_in, self._temp_file_out)
-
- print ("***-STARTING-***")
-
- pov_binary = "povray"
-
- if sys.platform == 'win32':
- import winreg
- regKey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, 'Software\\POV-Ray\\v3.6\\Windows')
-
- if bitness == 64:
- pov_binary = winreg.QueryValueEx(regKey, 'Home')[0] + '\\bin\\pvengine64'
- else:
- pov_binary = winreg.QueryValueEx(regKey, 'Home')[0] + '\\bin\\pvengine'
-
- 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
- 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-***")
-
- def _cleanup(self):
- for f in (self._temp_file_in, self._temp_file_ini, self._temp_file_out):
- try:
- os.remove(f)
- except:
- pass
-
- self.update_stats("", "")
-
- def render(self, scene):
-
- self.update_stats("", "POVRAY: Exporting data from Blender")
- self._export(scene)
- self.update_stats("", "POVRAY: Parsing File")
- self._render()
-
- r = scene.render
-
- # compute resolution
- x = int(r.resolution_x * r.resolution_percentage * 0.01)
- y = int(r.resolution_y * r.resolution_percentage * 0.01)
-
- # Wait for the file to be created
- while not os.path.exists(self._temp_file_out):
- if self.test_break():
- try:
- self._process.terminate()
- except:
- pass
- break
-
- if self._process.poll() != None:
- self.update_stats("", "POVRAY: Failed")
- break
-
- time.sleep(self.DELAY)
-
- if os.path.exists(self._temp_file_out):
-
- self.update_stats("", "POVRAY: Rendering")
-
- prev_size = -1
-
- def update_image():
- result = self.begin_result(0, 0, x, y)
- lay = result.layers[0]
- # possible the image wont load early on.
- try:
- lay.load_from_file(self._temp_file_out)
- except:
- pass
- self.end_result(result)
-
- # Update while povray renders
- while True:
-
- # test if povray exists
- if self._process.poll() is not None:
- update_image()
- break
-
- # user exit
- if self.test_break():
- try:
- self._process.terminate()
- except:
- pass
-
- break
-
- # Would be nice to redirect the output
- # stdout_value, stderr_value = self._process.communicate() # locks
-
-
- # check if the file updated
- new_size = os.path.getsize(self._temp_file_out)
-
- if new_size != prev_size:
- update_image()
- prev_size = new_size
-
- time.sleep(self.DELAY)
-
- self._cleanup()
-
-
-# Use some of the existing buttons.
-import properties_render
-properties_render.RENDER_PT_render.COMPAT_ENGINES.add('POVRAY_RENDER')
-properties_render.RENDER_PT_dimensions.COMPAT_ENGINES.add('POVRAY_RENDER')
-properties_render.RENDER_PT_antialiasing.COMPAT_ENGINES.add('POVRAY_RENDER')
-properties_render.RENDER_PT_output.COMPAT_ENGINES.add('POVRAY_RENDER')
-del properties_render
-
-# Use only a subset of the world panels
-import properties_world
-properties_world.WORLD_PT_preview.COMPAT_ENGINES.add('POVRAY_RENDER')
-properties_world.WORLD_PT_context_world.COMPAT_ENGINES.add('POVRAY_RENDER')
-properties_world.WORLD_PT_world.COMPAT_ENGINES.add('POVRAY_RENDER')
-properties_world.WORLD_PT_mist.COMPAT_ENGINES.add('POVRAY_RENDER')
-del properties_world
-
-# Example of wrapping every class 'as is'
-import properties_material
-for member in dir(properties_material):
- subclass = getattr(properties_material, member)
- try:
- subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
- except:
- pass
-del properties_material
-
-
-class RenderButtonsPanel(bpy.types.Panel):
- bl_space_type = 'PROPERTIES'
- bl_region_type = 'WINDOW'
- bl_context = "render"
- # COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here
-
- def poll(self, context):
- rd = context.scene.render
- return (rd.use_game_engine == False) and (rd.engine in self.COMPAT_ENGINES)
-
-
-class RENDER_PT_povray_radiosity(RenderButtonsPanel):
- bl_label = "Radiosity"
- COMPAT_ENGINES = {'POVRAY_RENDER'}
-
- def draw_header(self, context):
- scene = context.scene
-
- self.layout.prop(scene, "pov_radio_enable", text="")
-
- def draw(self, context):
- layout = self.layout
-
- scene = context.scene
- rd = scene.render
-
- layout.active = scene.pov_radio_enable
-
- split = layout.split()
-
- col = split.column()
- col.prop(scene, "pov_radio_count", text="Rays")
- col.prop(scene, "pov_radio_recursion_limit", text="Recursions")
- col = split.column()
- col.prop(scene, "pov_radio_error_bound", text="Error")
-
- layout.prop(scene, "pov_radio_display_advanced")
-
- if scene.pov_radio_display_advanced:
- split = layout.split()
-
- col = split.column()
- col.prop(scene, "pov_radio_adc_bailout", slider=True)
- col.prop(scene, "pov_radio_gray_threshold", slider=True)
- col.prop(scene, "pov_radio_low_error_factor", slider=True)
-
- col = split.column()
- col.prop(scene, "pov_radio_brightness")
- col.prop(scene, "pov_radio_minimum_reuse", text="Min Reuse")
- col.prop(scene, "pov_radio_nearest_count")
-
- split = layout.split()
-
- col = split.column()
- col.label(text="Estimation Influence:")
- col.prop(scene, "pov_radio_media")
- col.prop(scene, "pov_radio_normal")
-
- col = split.column()
- col.prop(scene, "pov_radio_always_sample")
-
-
-classes = [
- PovrayRender,
- RENDER_PT_povray_radiosity]
-
-
-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/io/export_3ds.py b/release/scripts/io/export_3ds.py
index d46cc712e9a..706e7eb1516 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)
@@ -565,14 +564,14 @@ def extract_triangles(mesh):
img = None
for i, face in enumerate(mesh.faces):
- f_v = face.verts
+ f_v = face.vertices
# f_v = face.v
- uf = mesh.active_uv_texture.data[i] if do_uv else None
+ uf = mesh.uv_textures.active.data[i] if do_uv else None
if do_uv:
f_uv = uf.uv
- # f_uv = (uf.uv1, uf.uv2, uf.uv3, uf.uv4) if face.verts[3] else (uf.uv1, uf.uv2, uf.uv3)
+ # f_uv = (uf.uv1, uf.uv2, uf.uv3, uf.uv4) if face.vertices[3] else (uf.uv1, uf.uv2, uf.uv3)
# f_uv = face.uv
img = uf.image if uf else None
# img = face.image
@@ -762,18 +761,18 @@ def make_mesh_chunk(mesh, materialDict):
if len(mesh.uv_textures):
# if mesh.faceUV:
# Remove the face UVs and convert it to vertex UV:
- vert_array, uv_array, tri_list = remove_face_uv(mesh.verts, tri_list)
+ vert_array, uv_array, tri_list = remove_face_uv(mesh.vertices, tri_list)
else:
# Add the vertices to the vertex array:
vert_array = _3ds_array()
- for vert in mesh.verts:
+ for vert in mesh.vertices:
vert_array.add(_3ds_point_3d(vert.co))
# If the mesh has vertex UVs, create an array of UVs:
if len(mesh.sticky):
# if mesh.vertexUV:
uv_array = _3ds_array()
for uv in mesh.sticky:
-# for vert in mesh.verts:
+# for vert in mesh.vertices:
uv_array.add(_3ds_point_uv(uv.co))
# uv_array.add(_3ds_point_uv(vert.uvco))
else:
@@ -923,7 +922,7 @@ def make_kf_obj_node(obj, name_to_id):
"""
# import BPyMessages
-def save_3ds(filename, context):
+def write(filename, context):
'''Save the Blender scene to a 3ds file.'''
# Time the export
@@ -942,7 +941,8 @@ def save_3ds(filename, context):
sce = context.scene
# sce= bpy.data.scenes.active
- bpy.ops.object.mode_set(mode='OBJECT')
+ if context.object:
+ bpy.ops.object.mode_set(mode='OBJECT')
# Initialize the main chunk (primary):
primary = _3ds_chunk(PRIMARY)
@@ -968,11 +968,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
@@ -982,7 +983,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)
@@ -997,7 +998,7 @@ def save_3ds(filename, context):
if not mat_ls:
mat = mat_name = None
- for f, uf in zip(data.faces, data.active_uv_texture.data):
+ for f, uf in zip(data.faces, data.uv_textures.active.data):
if mat_ls:
mat_index = f.material_index
# mat_index = f.mat
@@ -1006,7 +1007,7 @@ def save_3ds(filename, context):
mat = mat_ls[mat_index]
if mat: mat_name = mat.name
else: mat_name = None
- # else there alredy set to none
+ # else there already set to none
img = uf.image
# img = f.image
@@ -1064,7 +1065,7 @@ def save_3ds(filename, context):
'''
if not blender_mesh.users:
bpy.data.meshes.remove(blender_mesh)
-# blender_mesh.verts = None
+# blender_mesh.vertices = None
i+=i
@@ -1106,53 +1107,47 @@ def save_3ds(filename, context):
#primary.dump()
-# if __name__=='__main__':
-# if struct:
-# Blender.Window.FileSelector(save_3ds, "Export 3DS", Blender.sys.makename(ext='.3ds'))
-# else:
-# Blender.Draw.PupMenu("Error%t|This script requires a full python installation")
-# # save_3ds('/test_b.3ds')
+# # write('/test_b.3ds')
from bpy.props import *
class Export3DS(bpy.types.Operator):
'''Export to 3DS file format (.3ds)'''
bl_idname = "export.autodesk_3ds"
bl_label = 'Export 3DS'
- # List of operator properties, the attributes will be assigned
- # 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'})
+ @classmethod
+ def poll(cls, context): # Poll isnt working yet
+ return context.active_object != None
+
def execute(self, context):
- save_3ds(self.properties.path, context)
+ filepath = self.properties.filepath
+ filepath = bpy.path.ensure_ext(filepath, ".3ds")
+
+ write(filepath, context)
return {'FINISHED'}
def invoke(self, context, event):
- wm = context.manager
- wm.add_fileselect(self)
- return {'RUNNING_MODAL'}
+ import os
+ if not self.properties.is_property_set("filepath"):
+ self.properties.filepath = os.path.splitext(bpy.data.filepath)[0] + ".3ds"
- def poll(self, context): # Poll isnt working yet
- return context.active_object != None
+ context.manager.add_fileselect(self)
+ return {'RUNNING_MODAL'}
# 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
+ self.layout.operator(Export3DS.bl_idname, text="3D Studio (.3ds)")
def register():
- bpy.types.register(Export3DS)
bpy.types.INFO_MT_file_export.append(menu_func)
+
def unregister():
- bpy.types.unregister(Export3DS)
bpy.types.INFO_MT_file_export.remove(menu_func)
if __name__ == "__main__":
register()
-
diff --git a/release/scripts/io/export_fbx.py b/release/scripts/io/export_fbx.py
index 9dd3a68f4da..486f7d8199b 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
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.path.abspath(tex.filepath))
# Now copy images
copyCount = 0
@@ -122,7 +83,7 @@ def copy_images(dest_dir, textures):
if Blender.sys.exists(image_path):
# Make a name for the target path.
dest_image_path = dest_dir + image_path.split('\\')[-1].split('/')[-1]
- if not Blender.sys.exists(dest_image_path): # Image isnt alredy there
+ if not Blender.sys.exists(dest_image_path): # Image isnt already there
print('\tCopying "%s" > "%s"' % (image_path, dest_image_path))
try:
copy_file(image_path, dest_image_path)
@@ -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,22 +104,22 @@ def eulerRadToDeg(eul):
return ret
-mtx4_identity = Mathutils.Matrix()
+mtx4_identity = Matrix()
# testing
-mtx_x90 = Mathutils.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')
-#mtx_z90 = RotationMatrix( 90, 3, 'z')
-#mtx_z90n = RotationMatrix(-90, 3, 'z')
-
-#mtx4_x90 = RotationMatrix( 90, 4, 'x')
-mtx4_x90n = Mathutils.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
+mtx_x90 = Matrix.Rotation( math.pi/2, 3, 'X') # used
+#mtx_x90n = Matrix.Rotation(-90, 3, 'x')
+#mtx_y90 = Matrix.Rotation( 90, 3, 'y')
+#mtx_y90n = Matrix.Rotation(-90, 3, 'y')
+#mtx_z90 = Matrix.Rotation( 90, 3, 'z')
+#mtx_z90n = Matrix.Rotation(-90, 3, 'z')
+
+#mtx4_x90 = Matrix.Rotation( 90, 4, 'x')
+mtx4_x90n = Matrix.Rotation(-math.pi/2, 4, 'X') # used
+#mtx4_y90 = Matrix.Rotation( 90, 4, 'y')
+mtx4_y90n = Matrix.Rotation(-math.pi/2, 4, 'Y') # used
+mtx4_z90 = Matrix.Rotation( math.pi/2, 4, 'Z') # used
+mtx4_z90n = Matrix.Rotation(-math.pi/2, 4, 'Z') # used
# def strip_path(p):
# return p.split('\\')[-1].split('/')[-1]
@@ -215,7 +176,7 @@ def sane_name(data, dct):
name = 'unnamed' # blank string, ASKING FOR TROUBLE!
else:
- name = bpy.utils.clean_name(name) # use our own
+ name = bpy.path.clean_name(name) # use our own
while name in iter(dct.values()): name = increment_string(name)
@@ -239,14 +200,14 @@ def sane_groupname(data): return sane_name(data, sane_name_mapping_group)
# FORCE_CWD - dont use the basepath, just add a ./ to the filename.
# use when we know the file will be in the basepath.
# '''
-# fname = bpy.utils.expandpath(fname_orig)
+# fname = bpy.path.abspath(fname_orig)
# # fname = Blender.sys.expandpath(fname_orig)
# fname_strip = os.path.basename(fname)
# # fname_strip = strip_path(fname)
# if FORCE_CWD:
# fname_rel = '.' + os.sep + fname_strip
# else:
-# fname_rel = bpy.utils.relpath(fname, basepath)
+# fname_rel = bpy.path.relpath(fname, basepath)
# # fname_rel = Blender.sys.relpath(fname, basepath)
# if fname_rel.startswith('//'): fname_rel = '.' + os.sep + fname_rel[2:]
# return fname, fname_strip, fname_rel
@@ -260,7 +221,7 @@ def mat4x4str(mat):
def getVertsFromGroup(me, group_index):
ret = []
- for i, v in enumerate(me.verts):
+ for i, v in enumerate(me.vertices):
for g in v.groups:
if g.group == group_index:
ret.append((i, g.weight))
@@ -282,11 +243,11 @@ def BPyMesh_meshWeight2List(ob):
if not len_groupNames:
# no verts? return a vert aligned empty list
- return [[] for i in range(len(me.verts))], []
+ return [[] for i in range(len(me.vertices))], []
else:
- vWeightList= [[0.0]*len_groupNames for i in range(len(me.verts))]
+ vWeightList= [[0.0]*len_groupNames for i in range(len(me.vertices))]
- for i, v in enumerate(me.verts):
+ for i, v in enumerate(me.vertices):
for g in v.groups:
vWeightList[i][g.group] = g.weight
@@ -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,7 +305,8 @@ def write(filename, batch_objects = None, \
BATCH_OWN_DIR = False
):
- bpy.ops.object.mode_set(mode='OBJECT')
+ if bpy.context.object:
+ bpy.ops.object.mode_set(mode='OBJECT')
# ----------------- Batch support!
if BATCH_ENABLE:
@@ -392,13 +354,13 @@ def write(filename, batch_objects = None, \
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)
-# newname = BATCH_FILE_PREFIX + BPySys.bpy.utils.clean_name(data.name)
+ newname = BATCH_FILE_PREFIX + bpy.path.clean_name(data.name)
+# newname = BATCH_FILE_PREFIX + BPySys.bpy.path.clean_name(data.name)
if BATCH_OWN_DIR:
new_fbxpath = fbxpath + newname + os.sep
- # path may alredy exist
+ # path may already exist
# TODO - might exist but be a file. unlikely but should probably account for it.
if bpy.utils.exists(new_fbxpath) == 0:
@@ -430,7 +392,7 @@ def write(filename, batch_objects = None, \
# Call self with modified args
- # Dont pass batch options since we alredy usedt them
+ # Dont pass batch options since we already usedt them
write(filename, data.objects,
context,
False,
@@ -567,7 +529,7 @@ def write(filename, batch_objects = None, \
self.fbxGroupNames = []
self.fbxParent = None # set later on IF the parent is in the selection.
if matrixWorld: self.matrixWorld = GLOBAL_MATRIX * matrixWorld
- else: self.matrixWorld = GLOBAL_MATRIX * ob.matrix
+ else: self.matrixWorld = GLOBAL_MATRIX * ob.matrix_world
# else: self.matrixWorld = ob.matrixWorld * GLOBAL_MATRIX
self.__anim_poselist = {} # we should only access this
@@ -578,8 +540,7 @@ def write(filename, batch_objects = None, \
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:
@@ -600,8 +561,8 @@ def write(filename, batch_objects = None, \
matrix_rot = matrix_rot * mtx_x90
elif type =='CAMERA':
# elif ob and type =='Camera':
- y = matrix_rot * Mathutils.Vector(0,1,0)
- matrix_rot = Mathutils.RotationMatrix(math.pi/2, 3, y) * matrix_rot
+ y = matrix_rot * Vector((0.0, 1.0, 0.0))
+ matrix_rot = Matrix.Rotation(math.pi/2, 3, y) * matrix_rot
return matrix_rot
@@ -685,7 +646,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
@@ -702,8 +663,8 @@ def write(filename, batch_objects = None, \
matrix_rot = matrix_rot * mtx_x90
rot = tuple(matrix_rot.to_euler())
elif ob and ob.type =='Camera':
- y = matrix_rot * Mathutils.Vector(0,1,0)
- matrix_rot = Mathutils.RotationMatrix(math.pi/2, 3, y) * matrix_rot
+ y = matrix_rot * Vector((0.0, 1.0, 0.0))
+ matrix_rot = Matrix.Rotation(math.pi/2, 3, y) * matrix_rot
rot = tuple(matrix_rot.to_euler())
else:
rot = tuple(matrix_rot.to_euler())
@@ -987,10 +948,7 @@ def write(filename, batch_objects = None, \
render = scene.render
width = render.resolution_x
height = render.resolution_y
-# render = scene.render
-# width = render.sizeX
-# height = render.sizeY
- aspect = float(width)/height
+ aspect = width / height
data = my_cam.blenObject.data
@@ -1002,11 +960,9 @@ def write(filename, batch_objects = None, \
file.write('\n\t\t\tProperty: "FieldOfView", "FieldOfView", "A+",%.6f' % math.degrees(data.angle))
file.write('\n\t\t\tProperty: "FieldOfViewX", "FieldOfView", "A+",1')
file.write('\n\t\t\tProperty: "FieldOfViewY", "FieldOfView", "A+",1')
- file.write('\n\t\t\tProperty: "FocalLength", "Real", "A+",14.0323972702026')
+ # file.write('\n\t\t\tProperty: "FocalLength", "Real", "A+",14.0323972702026')
file.write('\n\t\t\tProperty: "OpticalCenterX", "Real", "A+",%.6f' % data.shift_x) # not sure if this is in the correct units?
-# file.write('\n\t\t\tProperty: "OpticalCenterX", "Real", "A+",%.6f' % data.shiftX) # not sure if this is in the correct units?
file.write('\n\t\t\tProperty: "OpticalCenterY", "Real", "A+",%.6f' % data.shift_y) # ditto
-# file.write('\n\t\t\tProperty: "OpticalCenterY", "Real", "A+",%.6f' % data.shiftY) # ditto
file.write('\n\t\t\tProperty: "BackgroundColor", "Color", "A+",0,0,0')
file.write('\n\t\t\tProperty: "TurnTable", "Real", "A+",0')
file.write('\n\t\t\tProperty: "DisplayTurnTableIcon", "bool", "",1')
@@ -1015,7 +971,7 @@ def write(filename, batch_objects = None, \
file.write('\n\t\t\tProperty: "UseRealTimeMotionBlur", "bool", "",1')
file.write('\n\t\t\tProperty: "ResolutionMode", "enum", "",0')
file.write('\n\t\t\tProperty: "ApertureMode", "enum", "",2')
- file.write('\n\t\t\tProperty: "GateFit", "enum", "",0')
+ file.write('\n\t\t\tProperty: "GateFit", "enum", "",2')
file.write('\n\t\t\tProperty: "CameraFormat", "enum", "",0')
file.write('\n\t\t\tProperty: "AspectW", "double", "",%i' % width)
file.write('\n\t\t\tProperty: "AspectH", "double", "",%i' % height)
@@ -1088,8 +1044,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(matrix_rot * Mathutils.Vector(0,1,0)) )
- file.write('\n\t\tLookAt: %.6f,%.6f,%.6f' % tuple(matrix_rot * Mathutils.Vector(0,0,-1)) )
+ 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' )
@@ -1126,7 +1082,7 @@ def write(filename, batch_objects = None, \
else:
do_shadow = 0
- if light.only_shadow or (not light.diffuse and not light.specular):
+ if light.use_only_shadow or (not light.diffuse and not light.specular):
# if mode & Blender.Lamp.Modes.OnlyShadow or (mode & Blender.Lamp.Modes.NoDiffuse and mode & Blender.Lamp.Modes.NoSpecular):
do_light = 0
else:
@@ -1234,7 +1190,7 @@ def write(filename, batch_objects = None, \
# mat_spec = mat.spec/2.0
mat_alpha = mat.alpha
mat_emit = mat.emit
- mat_shadeless = mat.shadeless
+ mat_shadeless = mat.use_shadeless
# mat_shadeless = mat.mode & Blender.Material.Modes.SHADELESS
if mat_shadeless:
mat_shader = 'Lambert'
@@ -1294,7 +1250,7 @@ def write(filename, batch_objects = None, \
file.write('\n\t}')
def copy_image(image):
- fn = bpy.utils.expandpath(image.filename)
+ fn = bpy.path.abspath(image.filepath)
fn_strip = os.path.basename(fn)
if EXP_IMAGE_COPY:
@@ -1321,7 +1277,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 = ''
@@ -1371,9 +1327,9 @@ def write(filename, batch_objects = None, \
Property: "CurrentMappingType", "enum", "",0
Property: "UVSwap", "bool", "",0''')
- file.write('\n\t\t\tProperty: "WrapModeU", "enum", "",%i' % tex.clamp_x)
+ file.write('\n\t\t\tProperty: "WrapModeU", "enum", "",%i' % tex.use_clamp_x)
# file.write('\n\t\t\tProperty: "WrapModeU", "enum", "",%i' % tex.clampX)
- file.write('\n\t\t\tProperty: "WrapModeV", "enum", "",%i' % tex.clamp_y)
+ file.write('\n\t\t\tProperty: "WrapModeV", "enum", "",%i' % tex.use_clamp_y)
# file.write('\n\t\t\tProperty: "WrapModeV", "enum", "",%i' % tex.clampY)
file.write('''
@@ -1386,7 +1342,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 = ''
@@ -1442,7 +1398,7 @@ def write(filename, batch_objects = None, \
# TODO - this is a bit lazy, we could have a simple write loop
# for this case because all weights are 1.0 but for now this is ok
# Parent Bones arent used all that much anyway.
- vgroup_data = [(j, 1.0) for j in range(len(my_mesh.blenData.verts))]
+ vgroup_data = [(j, 1.0) for j in range(len(my_mesh.blenData.vertices))]
else:
# This bone is not a parent of this mesh object, no weights
vgroup_data = []
@@ -1531,7 +1487,7 @@ def write(filename, batch_objects = None, \
file.write('\n\t\tVertices: ')
i=-1
- for v in me.verts:
+ for v in me.vertices:
if i==-1:
file.write('%.6f,%.6f,%.6f' % tuple(v.co)); i=0
else:
@@ -1543,17 +1499,14 @@ def write(filename, batch_objects = None, \
file.write('\n\t\tPolygonVertexIndex: ')
i=-1
for f in me.faces:
- fi = [v for v in 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.vertices[:]
- # 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:
@@ -1561,22 +1514,38 @@ 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.is_loose:
+ ed_val = ed.vertices[:]
+ 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:
if i==-1:
- file.write('%i,%i' % (ed.verts[0], ed.verts[1]))
+ file.write('%i,%i' % (ed.vertices[0], ed.vertices[1]))
# file.write('%i,%i' % (ed.v1.index, ed.v2.index))
i=0
else:
if i==13:
file.write('\n\t\t')
i=0
- file.write(',%i,%i' % (ed.verts[0], ed.verts[1]))
+ file.write(',%i,%i' % (ed.vertices[0], ed.vertices[1]))
# file.write(',%i,%i' % (ed.v1.index, ed.v2.index))
i+=1
@@ -1591,7 +1560,7 @@ def write(filename, batch_objects = None, \
Normals: ''')
i=-1
- for v in me.verts:
+ for v in me.vertices:
if i==-1:
file.write('%.15f,%.15f,%.15f' % tuple(v.normal)); i=0
# file.write('%.15f,%.15f,%.15f' % tuple(v.no)); i=0
@@ -1615,11 +1584,11 @@ def write(filename, batch_objects = None, \
i=-1
for f in me.faces:
if i==-1:
- file.write('%i' % f.smooth); i=0
+ file.write('%i' % f.use_smooth); i=0
else:
if i==54:
file.write('\n '); i=0
- file.write(',%i' % f.smooth)
+ file.write(',%i' % f.use_smooth)
i+=1
file.write('\n\t\t}')
@@ -1633,27 +1602,23 @@ def write(filename, batch_objects = None, \
ReferenceInformationType: "Direct"
Smoothing: ''')
-# SHARP = Blender.Mesh.EdgeFlags.SHARP
i=-1
for ed in me.edges:
if i==-1:
- file.write('%i' % (ed.sharp)); i=0
-# file.write('%i' % ((ed.flag&SHARP)!=0)); i=0
+ file.write('%i' % (ed.use_edge_sharp)); i=0
else:
if i==54:
file.write('\n '); i=0
- file.write(',%i' % (ed.sharp))
-# file.write(',%i' % ((ed.flag&SHARP)!=0))
+ file.write(',%i' % (ed.use_edge_sharp))
i+=1
file.write('\n\t\t}')
-# del SHARP
# small utility function
# returns a slice of data depending on number of face verts
# data is either a MeshTextureFace or MeshColor
def face_data(data, face):
- totvert = len(f.verts)
+ totvert = len(f.vertices)
return data[:totvert]
@@ -1665,7 +1630,7 @@ def write(filename, batch_objects = None, \
# if me.vertexColors:
collayers = me.vertex_colors
# collayers = me.getColorLayerNames()
- collayer_orig = me.active_vertex_color
+ collayer_orig = me.vertex_colors.active
# collayer_orig = me.activeColorLayer
for colindex, collayer in enumerate(collayers):
# me.activeColorLayer = collayer
@@ -1735,7 +1700,7 @@ def write(filename, batch_objects = None, \
if do_uvs:
uvlayers = me.uv_textures
# uvlayers = me.getUVLayerNames()
- uvlayer_orig = me.active_uv_texture
+ uvlayer_orig = me.uv_textures.active
# uvlayer_orig = me.activeUVLayer
for uvindex, uvlayer in enumerate(me.uv_textures):
# for uvindex, uvlayer in enumerate(uvlayers):
@@ -1869,8 +1834,8 @@ def write(filename, batch_objects = None, \
mats = my_mesh.blenMaterialList
- if me.active_uv_texture:
- uv_faces = me.active_uv_texture.data
+ if me.uv_textures.active:
+ uv_faces = me.uv_textures.active.data
else:
uv_faces = [None] * len(me.faces)
@@ -2037,9 +2002,8 @@ 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.frame_current)
@@ -2052,9 +2016,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:
@@ -2083,7 +2047,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:
@@ -2094,7 +2058,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
@@ -2104,7 +2068,7 @@ def write(filename, batch_objects = None, \
# ob.copy().link(me)
# # If new mesh has no vgroups we can try add if verts are teh same
# if not me.getVertGroupNames(): # vgroups were not kept by the modifier
-# if len(me.verts) == len(orig_mesh.verts):
+# if len(me.vertices) == len(orig_mesh.vertices):
# groupNames, vWeightDict = BPyMesh.meshWeight2Dict(orig_mesh)
# BPyMesh.dict2MeshWeight(me, groupNames, vWeightDict)
@@ -2139,7 +2103,7 @@ def write(filename, batch_objects = None, \
material_mapping_local = {}
if len(me.uv_textures) > 0:
# if me.faceUV:
- uvlayer_orig = me.active_uv_texture
+ uvlayer_orig = me.uv_textures.active
# uvlayer_orig = me.activeUVLayer
for uvlayer in me.uv_textures:
# for uvlayer in me.getUVLayerNames():
@@ -2213,9 +2177,7 @@ 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.frame_current)
# Blender.Set('curframe', Blender.Get('curframe'))
@@ -2793,7 +2755,7 @@ Takes: {''')
act_end = end
else:
# use existing name
- if blenAction == blenActionDefault: # have we alredy got the name
+ if blenAction == blenActionDefault: # have we already got the name
file.write('\n\tTake: "%s" {' % sane_name_mapping_take[blenAction.name])
else:
file.write('\n\tTake: "%s" {' % sane_takename(blenAction))
@@ -2812,7 +2774,7 @@ Takes: {''')
# Set the action active
for my_bone in ob_arms:
- if blenAction in my_bone.blenActionList:
+ if ob.animation_data and blenAction in my_bone.blenActionList:
ob.animation_data.action = blenAction
# print '\t\tSetting Action!', blenAction
# scene.update(1)
@@ -2948,7 +2910,7 @@ Takes: {''')
for val, frame in context_bone_anim_keys:
if frame != context_bone_anim_keys[0][1]: # not the first
file.write(',')
- # frame is alredy one less then blenders frame
+ # frame is already one less then blenders frame
file.write('\n\t\t\t\t\t\t\t%i,%.15f,L' % (fbx_time(frame), val ))
if i==0: file.write('\n\t\t\t\t\t\tColor: 1,0,0')
@@ -2970,7 +2932,8 @@ 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.animation_data.action = my_bone.blenAction
+ if my_bone.blenObject.animation_data:
+ my_bone.blenObject.animation_data.action = my_bone.blenAction
file.write('\n}')
@@ -2994,13 +2957,12 @@ Takes: {''')
# Clear mesh data Only when writing with modifiers applied
for me in meshes_to_clear:
bpy.data.meshes.remove(me)
-# me.verts = None
+# me.vertices = None
# --------------------------- 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
@@ -3068,7 +3030,7 @@ Takes: {''')
# --------------------------------------------
# UI Function - not a part of the exporter.
-# this is to seperate the user interface from the rest of the exporter.
+# this is to separate the user interface from the rest of the exporter.
# from Blender import Draw, Window
EVENT_NONE = 0
EVENT_EXIT = 1
@@ -3365,7 +3327,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)
@@ -3395,12 +3357,16 @@ class ExportFBX(bpy.types.Operator):
BATCH_FILE_PREFIX = StringProperty(name="Prefix", description="Prefix each file with this name", maxlen=1024, default="")
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
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")
+
+ filepath = self.properties.filepath
+ filepath = bpy.path.ensure_ext(filepath, ".fbx")
GLOBAL_MATRIX = mtx4_identity
GLOBAL_MATRIX[0][0] = GLOBAL_MATRIX[1][1] = GLOBAL_MATRIX[2][2] = self.properties.TX_SCALE
@@ -3408,7 +3374,7 @@ class ExportFBX(bpy.types.Operator):
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(filepath,
None, # XXX
context,
self.properties.EXP_OBS_SELECTED,
@@ -3428,25 +3394,29 @@ class ExportFBX(bpy.types.Operator):
self.properties.BATCH_ENABLE,
self.properties.BATCH_GROUP,
self.properties.BATCH_FILE_PREFIX,
- self.properties.BATCH_OWN_DIR)
+ self.properties.BATCH_OWN_DIR,
+ )
return {'FINISHED'}
def invoke(self, context, event):
- wm = context.manager
- wm.add_fileselect(self)
+ import os
+ if not self.properties.is_property_set("filepath"):
+ self.properties.filepath = os.path.splitext(bpy.data.filepath)[0] + ".fbx"
+
+ context.manager.add_fileselect(self)
return {'RUNNING_MODAL'}
# 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)
# - Draw.PupMenu alternative in 2.5?, temporarily replaced PupMenu with print
-# - get rid of bpy.utils.clean_name somehow
+# - get rid of bpy.path.clean_name somehow
# + fixed: isinstance(inst, bpy.types.*) doesn't work on RNA objects: line 565
# + get rid of BPyObject_getObjectArmature, move it in RNA?
# - BATCH_ENABLE and BATCH_GROUP options: line 327
@@ -3461,24 +3431,21 @@ class ExportFBX(bpy.types.Operator):
# - bpy.data.remove_scene: line 366
# - bpy.sys.time move to bpy.sys.util?
# - new scene creation, activation: lines 327-342, 368
-# - uses bpy.utils.expandpath, *.relpath - replace at least relpath
+# - uses bpy.path.abspath, *.relpath - replace at least relpath
# SMALL or COSMETICAL
# - find a way to get blender version, and put it in bpy.util?, old was Blender.Get('version')
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
+ self.layout.operator(ExportFBX.bl_idname, text="Autodesk FBX (.fbx)")
def register():
- bpy.types.register(ExportFBX)
bpy.types.INFO_MT_file_export.append(menu_func)
def unregister():
- bpy.types.unregister(ExportFBX)
bpy.types.INFO_MT_file_export.remove(menu_func)
if __name__ == "__main__":
diff --git a/release/scripts/io/export_mdd.py b/release/scripts/io/export_mdd.py
index be3ddbc73bd..b2eda13fc8f 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
@@ -65,7 +65,7 @@ def check_vertcount(mesh, vertcount):
'''
check and make sure the vertcount is consistent throughout the frame range
'''
- if len(mesh.verts) != vertcount:
+ if len(mesh.vertices) != vertcount:
raise Exception('Error, number of verts has changed during animation, cannot export')
f.close()
zero_file(filepath)
@@ -84,17 +84,17 @@ def write(filename, sce, ob, PREF_STARTFRAME, PREF_ENDFRAME, PREF_FPS):
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],\
[0.0, 0.0, 0.0, 1.0],\
)
- numverts = len(me.verts)
+ numverts = len(me.vertices)
numframes = PREF_ENDFRAME - PREF_STARTFRAME + 1
PREF_FPS = float(PREF_FPS)
@@ -113,8 +113,8 @@ def write(filename, sce, ob, PREF_STARTFRAME, PREF_ENDFRAME, PREF_FPS):
"""
check_vertcount(me, numverts)
- me.transform(mat_flip * ob.matrix)
- f.write(pack(">%df" % (numverts * 3), *[axis for v in me.verts for axis in v.co]))
+ me.transform(mat_flip * ob.matrix_world)
+ f.write(pack(">%df" % (numverts * 3), *[axis for v in me.vertices for axis in v.co]))
for frame in range(PREF_STARTFRAME, PREF_ENDFRAME + 1):#in order to start at desired frame
"""
@@ -123,15 +123,15 @@ 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]))
+ f.write(pack(">%df" % (numverts * 3), *[axis for v in me.vertices for axis in v.co]))
"""
- me_tmp.verts= None
+ me_tmp.vertices= None
"""
f.close()
@@ -159,41 +159,49 @@ 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)
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):
+ @classmethod
+ def poll(cls, context):
ob = context.active_object
return (ob and ob.type == 'MESH')
def execute(self, context):
- if not self.properties.path:
- raise Exception("filename not set")
- write(self.properties.path, context.scene, context.active_object,
- self.properties.frame_start, self.properties.frame_end, self.properties.fps)
+ filepath = self.properties.filepath
+ filepath = bpy.path.ensure_ext(filepath, ".mdd")
+
+ write(filepath,
+ context.scene,
+ context.active_object,
+ self.properties.frame_start,
+ self.properties.frame_end,
+ self.properties.fps,
+ )
+
return {'FINISHED'}
def invoke(self, context, event):
- wm = context.manager
- wm.add_fileselect(self)
+ import os
+ if not self.properties.is_property_set("filepath"):
+ self.properties.filepath = os.path.splitext(bpy.data.filepath)[0] + ".mdd"
+
+ context.manager.add_fileselect(self)
return {'RUNNING_MODAL'}
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
+ self.layout.operator(ExportMDD.bl_idname, text="Lightwave Point Cache (.mdd)")
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__":
diff --git a/release/scripts/io/export_obj.py b/release/scripts/io/export_obj.py
index c10a698c9d3..37c6059d173 100644
--- a/release/scripts/io/export_obj.py
+++ b/release/scripts/io/export_obj.py
@@ -18,13 +18,6 @@
# <pep8 compliant>
-"""
-Name: 'Wavefront (.obj)...'
-Blender: 248
-Group: 'Export'
-Tooltip: 'Save a Wavefront OBJ File'
-"""
-
__author__ = "Campbell Barton, Jiri Hnidek, Paolo Ciccone"
__url__ = ['http://wiki.blender.org/index.php/Scripts/Manual/Export/wavefront_obj', 'www.blender.org', 'blenderartists.org']
__version__ = "1.21"
@@ -47,17 +40,7 @@ import time
import shutil
import bpy
-import Mathutils
-
-
-# Returns a tuple - path,extension.
-# 'hello.obj' > ('hello', '.obj')
-def splitExt(path):
- dotidx = path.rfind('.')
- if dotidx == -1:
- return path, ''
- else:
- return path[:dotidx], path[dotidx:]
+import mathutils
def fixName(name):
if name == None:
@@ -65,15 +48,15 @@ def fixName(name):
else:
return name.replace(' ', '_')
-def write_mtl(scene, filename, copy_images, mtl_dict):
+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.path.abspath(image.filepath)
fn_strip = os.path.basename(fn)
if copy_images:
rel = fn_strip
@@ -86,9 +69,9 @@ def write_mtl(scene, filename, copy_images, mtl_dict):
return rel
- file = open(filename, "w")
+ file = open(filepath, "w")
# XXX
-# file.write('# Blender MTL File: %s\n' % Blender.Get('filename').split('\\')[-1].split('/')[-1])
+# 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():
@@ -100,7 +83,7 @@ def write_mtl(scene, filename, copy_images, mtl_dict):
if mat:
file.write('Ns %.6f\n' % ((mat.specular_hardness-1) * 1.9607843137254901) ) # Hardness, convert blenders 1-511 to MTL's
- file.write('Ka %.6f %.6f %.6f\n' % tuple([c*mat.ambient for c in worldAmb]) ) # Ambient, uses mirror colour,
+ file.write('Ka %.6f %.6f %.6f\n' % tuple([c*mat.ambient for c in worldAmb]) ) # Ambient, uses mirror colour,
file.write('Kd %.6f %.6f %.6f\n' % tuple([c*mat.diffuse_intensity for c in mat.diffuse_color]) ) # Diffuse
file.write('Ks %.6f %.6f %.6f\n' % tuple([c*mat.specular_intensity for c in mat.specular_color]) ) # Specular
if hasattr(mat, "ior"):
@@ -110,7 +93,7 @@ def write_mtl(scene, filename, copy_images, mtl_dict):
file.write('d %.6f\n' % mat.alpha) # Alpha (obj uses 'd' for dissolve)
# 0 to disable lighting, 1 for ambient & diffuse only (specular color set to black), 2 for full lighting.
- if mat.shadeless:
+ if mat.use_shadeless:
file.write('illum 0\n') # ignore lighting
elif mat.specular_intensity == 0:
file.write('illum 1\n') # no specular.
@@ -120,26 +103,26 @@ def write_mtl(scene, filename, copy_images, mtl_dict):
else:
#write a dummy material here?
file.write('Ns 0\n')
- file.write('Ka %.6f %.6f %.6f\n' % tuple([c for c in worldAmb]) ) # Ambient, uses mirror colour,
+ file.write('Ka %.6f %.6f %.6f\n' % tuple([c for c in worldAmb]) ) # Ambient, uses mirror colour,
file.write('Kd 0.8 0.8 0.8\n')
file.write('Ks 0.8 0.8 0.8\n')
file.write('d 1\n') # No alpha
file.write('illum 2\n') # light normaly
# Write images!
- if img: # We have an image on the face!
+ if img: # We have an image on the face!
# 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.
@@ -164,8 +147,8 @@ def copy_file(source, dest):
def copy_images(dest_dir):
if dest_dir[-1] != os.sep:
dest_dir += os.sep
-# if dest_dir[-1] != sys.sep:
-# dest_dir += sys.sep
+# if dest_dir[-1] != sys.sep:
+# dest_dir += sys.sep
# Get unique image names
uniqueImages = {}
@@ -188,63 +171,61 @@ def copy_images(dest_dir):
# Now copy images
copyCount = 0
-# for bImage in uniqueImages.values():
-# image_path = bpy.utils.expandpath(bImage.filename)
-# if bpy.sys.exists(image_path):
-# # Make a name for the target path.
-# dest_image_path = dest_dir + image_path.split('\\')[-1].split('/')[-1]
-# if not bpy.utils.exists(dest_image_path): # Image isnt alredy there
-# print('\tCopying "%s" > "%s"' % (image_path, dest_image_path))
-# copy_file(image_path, dest_image_path)
-# copyCount+=1
+# for bImage in uniqueImages.values():
+# image_path = bpy.path.abspath(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]
+# if not bpy.utils.exists(dest_image_path): # Image isnt already there
+# print('\tCopying "%s" > "%s"' % (image_path, dest_image_path))
+# copy_file(image_path, dest_image_path)
+# copyCount+=1
-# paths= bpy.util.copy_images(uniqueImages.values(), dest_dir)
+# paths= bpy.util.copy_images(uniqueImages.values(), dest_dir)
print('\tCopied %d images' % copyCount)
-# print('\tCopied %d images' % copyCount)
-# XXX not converted
+
def test_nurbs_compat(ob):
- if ob.type != 'Curve':
+ if ob.type != 'CURVE':
return False
- for nu in ob.data:
- if (not nu.knotsV) and nu.type != 1: # not a surface and not bezier
+ for nu in ob.data.splines:
+ if nu.point_count_v == 1 and nu.type != 'BEZIER': # not a surface and not bezier
return True
return False
-# XXX not converted
def write_nurb(file, ob, ob_mat):
tot_verts = 0
cu = ob.data
# use negative indices
- Vector = Blender.Mathutils.Vector
- for nu in cu:
-
- if nu.type==0: DEG_ORDER_U = 1
- else: DEG_ORDER_U = nu.orderU-1 # Tested to be correct
+ for nu in cu.splines:
+ if nu.type == 'POLY':
+ DEG_ORDER_U = 1
+ else:
+ DEG_ORDER_U = nu.order_u - 1 # odd but tested to be correct
- if nu.type==1:
+ if nu.type == 'BEZIER':
print("\tWarning, bezier curve:", ob.name, "only poly and nurbs curves supported")
continue
- if nu.knotsV:
+ if nu.point_count_v > 1:
print("\tWarning, surface:", ob.name, "only poly and nurbs curves supported")
continue
- if len(nu) <= DEG_ORDER_U:
- print("\tWarning, orderU is lower then vert count, skipping:", ob.name)
+ if len(nu.points) <= DEG_ORDER_U:
+ print("\tWarning, order_u is lower then vert count, skipping:", ob.name)
continue
pt_num = 0
- do_closed = (nu.flagU & 1)
- do_endpoints = (do_closed==0) and (nu.flagU & 2)
+ do_closed = nu.use_cyclic_u
+ do_endpoints = (do_closed == 0) and nu.use_endpoint_u
- for pt in nu:
- pt = Vector(pt[0], pt[1], pt[2]) * ob_mat
+ for pt in nu.points:
+ pt = ob_mat * pt.co.copy().resize3D()
file.write('v %.6f %.6f %.6f\n' % (pt[0], pt[1], pt[2]))
pt_num += 1
tot_verts += pt_num
@@ -264,7 +245,7 @@ def write_nurb(file, ob, ob_mat):
pt_num += DEG_ORDER_U
curve_ls = curve_ls + curve_ls[0:DEG_ORDER_U]
- file.write('curv 0.0 1.0 %s\n' % (' '.join( [str(i) for i in curve_ls] ))) # Blender has no U and V values for the curve
+ file.write('curv 0.0 1.0 %s\n' % (' '.join([str(i) for i in curve_ls]))) # Blender has no U and V values for the curve
# 'parm' keyword
tot_parm = (DEG_ORDER_U + 1) + pt_num
@@ -282,7 +263,7 @@ def write_nurb(file, ob, ob_mat):
return tot_verts
-def write(filename, objects, scene,
+def write_file(filepath, objects, scene,
EXPORT_TRI=False,
EXPORT_EDGES=False,
EXPORT_NORMALS=False,
@@ -299,7 +280,7 @@ def write(filename, objects, scene,
EXPORT_POLYGROUPS=False,
EXPORT_CURVE_AS_NURBS=True):
'''
- Basic write function. The context and options must be alredy set
+ Basic write function. The context and options must be already set
This can be accessed externaly
eg.
write( 'c:\\test\\foobar.obj', Blender.Object.GetSelected() ) # Using default options.
@@ -325,10 +306,10 @@ def write(filename, objects, scene,
of vertices is the face's group
"""
weightDict = {}
- for vert_index in face.verts:
-# for vert in face:
+ for vert_index in face.vertices:
+# for vert in face:
vWeights = vWeightMap[vert_index]
-# vWeights = vWeightMap[vert]
+# vWeights = vWeightMap[vert]
for vGroupName, weight in vWeights:
weightDict[vGroupName] = weightDict.get(vGroupName, 0) + weight
@@ -343,7 +324,7 @@ def write(filename, objects, scene,
def getVertsFromGroup(me, group_index):
ret = []
- for i, v in enumerate(me.verts):
+ for i, v in enumerate(me.vertices):
for g in v.groups:
if g.group == group_index:
ret.append((i, g.weight))
@@ -351,26 +332,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()
+# time1 = sys.time()
+# scn = Scene.GetCurrent()
- file = open(filename, "w")
+ file = open(filepath, "w")
# Write Header
- file.write('# Blender v%s OBJ File: %s\n' % (bpy.app.version_string, bpy.data.filename.split('/')[-1].split('\\')[-1] ))
+ 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.Matrix.Rotation(-math.pi/2, 4, 'X')
# Initialize totals, these are updated each object
totverts = totuvco = totno = 1
@@ -396,48 +377,48 @@ 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:
- # XXX postponed
-# # Nurbs curve support
-# if EXPORT_CURVE_AS_NURBS and test_nurbs_compat(ob):
-# if EXPORT_ROTX90:
-# ob_mat = ob_mat * mat_xrot90
-
-# totverts += write_nurb(file, ob, ob_mat)
-
-# continue
-# end nurbs
+ # Nurbs curve support
+ if EXPORT_CURVE_AS_NURBS and test_nurbs_compat(ob):
+ if EXPORT_ROTX90:
+ ob_mat = ob_mat * mat_xrot90
+ totverts += write_nurb(file, ob, ob_mat)
+ continue
+ # END NURBS
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)
else:
me.transform(ob_mat)
-# # Will work for non meshes now! :)
-# me= BPyMesh.getMeshFromObject(ob, containerMesh, EXPORT_APPLY_MODIFIERS, EXPORT_POLYGROUPS, scn)
-# if not me:
-# continue
+# # Will work for non meshes now! :)
+# me= BPyMesh.getMeshFromObject(ob, containerMesh, EXPORT_APPLY_MODIFIERS, EXPORT_POLYGROUPS, scn)
+# if not me:
+# continue
if EXPORT_UV:
faceuv = len(me.uv_textures) > 0
+ uv_layer = me.uv_textures.active.data[:]
else:
faceuv = False
+ me_verts = me.vertices[:]
+
# XXX - todo, find a better way to do triangulation
# ...removed convert_to_triface because it relies on editmesh
'''
@@ -446,7 +427,7 @@ def write(filename, objects, scene,
# Add a dummy object to it.
has_quads = False
for f in me.faces:
- if f.verts[3] != 0:
+ if f.vertices[3] != 0:
has_quads = True
break
@@ -468,7 +449,7 @@ def write(filename, objects, scene,
else:
edges = []
- if not (len(face_index_pairs)+len(edges)+len(me.verts)): # Make sure there is somthing to write
+ if not (len(face_index_pairs)+len(edges)+len(me.vertices)): # Make sure there is somthing to write
# clean up
bpy.data.meshes.remove(me)
@@ -479,13 +460,13 @@ def write(filename, objects, scene,
# High Quality Normals
if EXPORT_NORMALS and face_index_pairs:
me.calc_normals()
-# if EXPORT_NORMALS_HQ:
-# BPyMesh.meshCalcNormals(me)
-# else:
-# # transforming normals is incorrect
-# # when the matrix is scaled,
-# # better to recalculate them
-# me.calcNormals()
+# if EXPORT_NORMALS_HQ:
+# BPyMesh.meshCalcNormals(me)
+# else:
+# # transforming normals is incorrect
+# # when the matrix is scaled,
+# # better to recalculate them
+# me.calcNormals()
materials = me.materials
@@ -510,29 +491,24 @@ def write(filename, objects, scene,
if EXPORT_KEEP_VERT_ORDER:
pass
elif faceuv:
- # XXX update
- tface = me.active_uv_texture.data
-
- face_index_pairs.sort(key=lambda a: (a[0].material_index, hash(tface[a[1]].image), a[0].smooth))
+ face_index_pairs.sort(key=lambda a: (a[0].material_index, hash(uv_layer[a[1]].image), a[0].use_smooth))
elif len(materials) > 1:
- face_index_pairs.sort(key = lambda a: (a[0].material_index, a[0].smooth))
+ face_index_pairs.sort(key = lambda a: (a[0].material_index, a[0].use_smooth))
else:
# no materials
- face_index_pairs.sort(key = lambda a: a[0].smooth)
-# if EXPORT_KEEP_VERT_ORDER:
-# pass
-# elif faceuv:
-# try: faces.sort(key = lambda a: (a.mat, a.image, a.smooth))
-# except: faces.sort(lambda a,b: cmp((a.mat, a.image, a.smooth), (b.mat, b.image, b.smooth)))
-# elif len(materials) > 1:
-# try: faces.sort(key = lambda a: (a.mat, a.smooth))
-# except: faces.sort(lambda a,b: cmp((a.mat, a.smooth), (b.mat, b.smooth)))
-# else:
-# # no materials
-# try: faces.sort(key = lambda a: a.smooth)
-# except: faces.sort(lambda a,b: cmp(a.smooth, b.smooth))
-
- faces = [pair[0] for pair in face_index_pairs]
+ face_index_pairs.sort(key = lambda a: a[0].use_smooth)
+# if EXPORT_KEEP_VERT_ORDER:
+# pass
+# elif faceuv:
+# try: faces.sort(key = lambda a: (a.mat, a.image, a.use_smooth))
+# except: faces.sort(lambda a,b: cmp((a.mat, a.image, a.use_smooth), (b.mat, b.image, b.use_smooth)))
+# elif len(materials) > 1:
+# try: faces.sort(key = lambda a: (a.mat, a.use_smooth))
+# except: faces.sort(lambda a,b: cmp((a.mat, a.use_smooth), (b.mat, b.use_smooth)))
+# else:
+# # no materials
+# try: faces.sort(key = lambda a: a.use_smooth)
+# except: faces.sort(lambda a,b: cmp(a.use_smooth, b.use_smooth))
# Set the default mat to no material and no image.
contextMat = (0, 0) # Can never be this, so we will label a new material teh first chance we get.
@@ -553,28 +529,17 @@ def write(filename, objects, scene,
# Vert
- for v in me.verts:
+ for v in me_verts:
file.write('v %.6f %.6f %.6f\n' % tuple(v.co))
# UV
if faceuv:
- uv_face_mapping = [[0,0,0,0] for f in faces] # a bit of a waste for tri's :/
+ uv_face_mapping = [[0,0,0,0] for i in range(len(face_index_pairs))] # a bit of a waste for tri's :/
uv_dict = {} # could use a set() here
- uv_layer = me.active_uv_texture
+ uv_layer = me.uv_textures.active.data
for f, f_index in face_index_pairs:
-
- tface = uv_layer.data[f_index]
-
- # workaround, since tface.uv iteration is wrong atm
- uvs = tface.uv
- # uvs = [tface.uv1, tface.uv2, tface.uv3]
-
- # # add another UV if it's a quad
- # if len(f.verts) == 4:
- # uvs.append(tface.uv4)
-
- for uv_index, uv in enumerate(uvs):
+ for uv_index, uv in enumerate(uv_layer[f_index].uv):
uvkey = veckey2d(uv)
try:
uv_face_mapping[f_index][uv_index] = uv_dict[uvkey]
@@ -582,27 +547,16 @@ def write(filename, objects, scene,
uv_face_mapping[f_index][uv_index] = uv_dict[uvkey] = len(uv_dict)
file.write('vt %.6f %.6f\n' % tuple(uv))
-# uv_dict = {} # could use a set() here
-# for f_index, f in enumerate(faces):
-
-# for uv_index, uv in enumerate(f.uv):
-# uvkey = veckey2d(uv)
-# try:
-# uv_face_mapping[f_index][uv_index] = uv_dict[uvkey]
-# except:
-# uv_face_mapping[f_index][uv_index] = uv_dict[uvkey] = len(uv_dict)
-# file.write('vt %.6f %.6f\n' % tuple(uv))
-
uv_unique_count = len(uv_dict)
-# del uv, uvkey, uv_dict, f_index, uv_index
+# del uv, uvkey, uv_dict, f_index, uv_index
# Only need uv_unique_count and uv_face_mapping
# NORMAL, Smooth/Non smoothed.
if EXPORT_NORMALS:
- for f in faces:
- if f.smooth:
- for vIdx in f.verts:
- v = me.verts[vIdx]
+ for f, f_index in face_index_pairs:
+ if f.use_smooth:
+ for v_idx in f.vertices:
+ v = me_verts[v_idx]
noKey = veckey3d(v.normal)
if noKey not in globalNormals:
globalNormals[noKey] = totno
@@ -622,66 +576,66 @@ def write(filename, objects, scene,
# XXX
if EXPORT_POLYGROUPS:
# Retrieve the list of vertex groups
-# vertGroupNames = me.getVertGroupNames()
+# vertGroupNames = me.getVertGroupNames()
currentVGroup = ''
# Create a dictionary keyed by face id and listing, for each vertex, the vertex groups it belongs to
- vgroupsMap = [[] for _i in range(len(me.verts))]
-# vgroupsMap = [[] for _i in xrange(len(me.verts))]
+ vgroupsMap = [[] for _i in range(len(me_verts))]
+# vgroupsMap = [[] for _i in xrange(len(me_verts))]
for g in ob.vertex_groups:
-# for vertexGroupName in vertGroupNames:
- for vIdx, vWeight in getVertsFromGroup(me, g.index):
-# for vIdx, vWeight in me.getVertsFromGroup(vertexGroupName, 1):
- vgroupsMap[vIdx].append((g.name, vWeight))
+# for vertexGroupName in vertGroupNames:
+ for v_idx, vWeight in getVertsFromGroup(me, g.index):
+# for v_idx, vWeight in me.getVertsFromGroup(vertexGroupName, 1):
+ vgroupsMap[v_idx].append((g.name, vWeight))
- for f_index, f in enumerate(faces):
- f_v = [{"index": index, "vertex": me.verts[index]} for index in f.verts]
+ for f, f_index in face_index_pairs:
+ f_v = [me_verts[v_idx] for v_idx in f.vertices]
- # if f.verts[3] == 0:
- # f_v.pop()
+ # if f.vertices[3] == 0:
+ # f_v.pop()
-# f_v= f.v
- f_smooth= f.smooth
+# f_v= f.v
+ f_smooth= f.use_smooth
f_mat = min(f.material_index, len(materialNames)-1)
-# f_mat = min(f.mat, len(materialNames)-1)
+# f_mat = min(f.mat, len(materialNames)-1)
if faceuv:
- tface = me.active_uv_texture.data[face_index_pairs[f_index][1]]
+ tface = uv_layer[f_index]
f_image = tface.image
f_uv = tface.uv
# f_uv= [tface.uv1, tface.uv2, tface.uv3]
- # if len(f.verts) == 4:
- # f_uv.append(tface.uv4)
-# f_image = f.image
-# f_uv= f.uv
+ # if len(f.vertices) == 4:
+ # f_uv.append(tface.uv4)
+# f_image = f.image
+# f_uv= f.uv
# MAKE KEY
if faceuv and f_image: # Object is always true.
- key = materialNames[f_mat], f_image.name
+ key = materialNames[f_mat], f_image.name
else:
- key = materialNames[f_mat], None # No image, use None instead.
+ key = materialNames[f_mat], None # No image, use None instead.
# Write the vertex group
if EXPORT_POLYGROUPS:
if len(ob.vertex_groups):
# find what vertext group the face belongs to
theVGroup = findVertexGroupName(f,vgroupsMap)
- if theVGroup != currentVGroup:
+ if theVGroup != currentVGroup:
currentVGroup = theVGroup
file.write('g %s\n' % theVGroup)
-# # Write the vertex group
-# if EXPORT_POLYGROUPS:
-# if vertGroupNames:
-# # find what vertext group the face belongs to
-# theVGroup = findVertexGroupName(f,vgroupsMap)
-# if theVGroup != currentVGroup:
-# currentVGroup = theVGroup
-# file.write('g %s\n' % theVGroup)
+# # Write the vertex group
+# if EXPORT_POLYGROUPS:
+# if vertGroupNames:
+# # find what vertext group the face belongs to
+# theVGroup = findVertexGroupName(f,vgroupsMap)
+# if theVGroup != currentVGroup:
+# currentVGroup = theVGroup
+# file.write('g %s\n' % theVGroup)
# CHECK FOR CONTEXT SWITCH
if key == contextMat:
- pass # Context alredy switched, dont do anything
+ pass # Context already switched, dont do anything
else:
if key[0] == None and key[1] == None:
# Write a null material, since we know the context has changed.
@@ -725,21 +679,21 @@ def write(filename, objects, scene,
if f_smooth: # Smoothed, use vertex normals
for vi, v in enumerate(f_v):
file.write( ' %d/%d/%d' % \
- (v["index"] + totverts,
+ (v.index + totverts,
totuvco + uv_face_mapping[f_index][vi],
- globalNormals[ veckey3d(v["vertex"].normal) ]) ) # vert, uv, normal
+ globalNormals[ veckey3d(v.normal) ]) ) # vert, uv, normal
else: # No smoothing, face normals
no = globalNormals[ veckey3d(f.normal) ]
for vi, v in enumerate(f_v):
file.write( ' %d/%d/%d' % \
- (v["index"] + totverts,
+ (v.index + totverts,
totuvco + uv_face_mapping[f_index][vi],
no) ) # vert, uv, normal
else: # No Normals
for vi, v in enumerate(f_v):
file.write( ' %d/%d' % (\
- v["index"] + totverts,\
+ v.index + totverts,\
totuvco + uv_face_mapping[f_index][vi])) # vert, uv
face_vert_index += len(f_v)
@@ -749,25 +703,25 @@ def write(filename, objects, scene,
if f_smooth: # Smoothed, use vertex normals
for v in f_v:
file.write( ' %d//%d' %
- (v["index"] + totverts, globalNormals[ veckey3d(v["vertex"].normal) ]) )
+ (v.index + totverts, globalNormals[ veckey3d(v.normal) ]) )
else: # No smoothing, face normals
no = globalNormals[ veckey3d(f.normal) ]
for v in f_v:
- file.write( ' %d//%d' % (v["index"] + totverts, no) )
+ file.write( ' %d//%d' % (v.index + totverts, no) )
else: # No Normals
for v in f_v:
- file.write( ' %d' % (v["index"] + totverts) )
+ file.write( ' %d' % (v.index + totverts) )
file.write('\n')
# Write edges.
if EXPORT_EDGES:
for ed in edges:
- if ed.loose:
- file.write('f %d %d\n' % (ed.verts[0] + totverts, ed.verts[1] + totverts))
+ if ed.is_loose:
+ file.write('f %d %d\n' % (ed.vertices[0] + totverts, ed.vertices[1] + totverts))
# Make the indicies global rather then per mesh
- totverts += len(me.verts)
+ totverts += len(me_verts)
if faceuv:
totuvco += uv_unique_count
@@ -782,53 +736,53 @@ def write(filename, objects, scene,
# Now we have all our materials, save them
if EXPORT_MTL:
- write_mtl(scene, mtlfilename, EXPORT_COPY_IMAGES, mtl_dict)
-# if EXPORT_COPY_IMAGES:
-# dest_dir = os.path.basename(filename)
-# # dest_dir = filename
-# # # 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, mtl_dict)
-# else:
-# print('\tError: "%s" could not be used as a base for an image path.' % filename)
+ write_mtl(scene, mtlfilepath, EXPORT_COPY_IMAGES, mtl_dict)
+# if EXPORT_COPY_IMAGES:
+# 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, mtl_dict)
+# else:
+# 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,
- EXPORT_APPLY_MODIFIERS = True, # not used
- EXPORT_ROTX90 = True, # wrong
- EXPORT_TRI = False, # ok
- EXPORT_EDGES = False,
- EXPORT_NORMALS = False, # not yet
- EXPORT_NORMALS_HQ = False, # not yet
- EXPORT_UV = True, # ok
- EXPORT_MTL = True,
- EXPORT_SEL_ONLY = True, # ok
- EXPORT_ALL_SCENES = False, # XXX not working atm
- EXPORT_ANIMATION = False,
- EXPORT_COPY_IMAGES = False,
- EXPORT_BLEN_OBS = True,
- EXPORT_GROUP_BY_OB = False,
- EXPORT_GROUP_BY_MAT = False,
- EXPORT_KEEP_VERT_ORDER = False,
- EXPORT_POLYGROUPS = False,
- EXPORT_CURVE_AS_NURBS = True):
+
+def write(filepath, context,
+ EXPORT_TRI, # ok
+ EXPORT_EDGES,
+ EXPORT_NORMALS, # not yet
+ EXPORT_NORMALS_HQ, # not yet
+ EXPORT_UV, # ok
+ EXPORT_MTL,
+ EXPORT_COPY_IMAGES,
+ EXPORT_APPLY_MODIFIERS, # ok
+ EXPORT_ROTX90, # wrong
+ EXPORT_BLEN_OBS,
+ EXPORT_GROUP_BY_OB,
+ EXPORT_GROUP_BY_MAT,
+ EXPORT_KEEP_VERT_ORDER,
+ EXPORT_POLYGROUPS,
+ EXPORT_CURVE_AS_NURBS,
+ EXPORT_SEL_ONLY, # ok
+ EXPORT_ALL_SCENES, # XXX not working atm
+ EXPORT_ANIMATION): # Not used
- base_name, ext = splitExt(filename)
+ base_name, ext = os.path.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 context.object:
+ bpy.ops.object.mode_set(mode='OBJECT')
-# if EXPORT_ALL_SCENES:
-# export_scenes = bpy.data.scenes
-# else:
-# export_scenes = [orig_scene]
+# if EXPORT_ALL_SCENES:
+# export_scenes = bpy.data.scenes
+# else:
+# export_scenes = [orig_scene]
# XXX only exporting one scene atm since changing
# current scene is not possible.
@@ -837,49 +791,58 @@ def do_export(filename, context,
export_scenes = [orig_scene]
# Export all scenes.
- for scn in export_scenes:
- # scn.makeCurrent() # If already current, this is not slow.
- # context = scn.getRenderingContext()
- orig_frame = scn.frame_current
+ for scene in export_scenes:
+ # scene.makeCurrent() # If already current, this is not slow.
+ # context = scene.getRenderingContext()
+ orig_frame = scene.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.
+ context_name[1] = '_%s' % bpy.path.clean_name(scene.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.frame_start, context.frame_end + 1) # Up to and including the end frame.
+ scene_frames = range(scene.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.frame_current = frame
+ scene.frame_current = frame
if EXPORT_SEL_ONLY:
- export_objects = context.selected_objects
+ objects = context.selected_objects
else:
- export_objects = scn.objects
+ objects = scene.objects
full_path= ''.join(context_name)
# erm... bit of a problem here, this can overwrite files when exporting frames. not too bad.
# EXPORT THE FILE.
- write(full_path, export_objects, scn,
- EXPORT_TRI, EXPORT_EDGES, EXPORT_NORMALS,
- EXPORT_NORMALS_HQ, EXPORT_UV, EXPORT_MTL,
- EXPORT_COPY_IMAGES, EXPORT_APPLY_MODIFIERS,
- EXPORT_ROTX90, EXPORT_BLEN_OBS,
- EXPORT_GROUP_BY_OB, EXPORT_GROUP_BY_MAT, EXPORT_KEEP_VERT_ORDER,
- EXPORT_POLYGROUPS, EXPORT_CURVE_AS_NURBS)
-
-
- scn.frame_current = orig_frame
+ write_file(full_path, objects, scene,
+ EXPORT_TRI,
+ EXPORT_EDGES,
+ EXPORT_NORMALS,
+ EXPORT_NORMALS_HQ,
+ EXPORT_UV,
+ EXPORT_MTL,
+ EXPORT_COPY_IMAGES,
+ EXPORT_APPLY_MODIFIERS,
+ EXPORT_ROTX90,
+ EXPORT_BLEN_OBS,
+ EXPORT_GROUP_BY_OB,
+ EXPORT_GROUP_BY_MAT,
+ EXPORT_KEEP_VERT_ORDER,
+ EXPORT_POLYGROUPS,
+ EXPORT_CURVE_AS_NURBS)
+
+
+ scene.frame_current = orig_frame
# Restore old active scene.
-# orig_scene.makeCurrent()
-# Window.WaitCursor(0)
+# orig_scene.makeCurrent()
+# Window.WaitCursor(0)
'''
@@ -900,28 +863,28 @@ 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
- use_selection = BoolProperty(name="Selection Only", description="", default= False)
+ use_selection = BoolProperty(name="Selection Only", description="Export selected objects only", default= False)
use_all_scenes = BoolProperty(name="All Scenes", description="", default= False)
- use_animation = BoolProperty(name="All Animation", description="", default= False)
+ use_animation = BoolProperty(name="Animation", description="", default= False)
# object group
- use_modifiers = BoolProperty(name="Apply Modifiers", description="", default= True)
+ use_modifiers = BoolProperty(name="Apply Modifiers", description="Apply modifiers (preview resolution)", default= True)
use_rotate90 = BoolProperty(name="Rotate X90", description="", default= True)
# extra data group
- use_edges = BoolProperty(name="Edges", description="", default= True)
- use_normals = BoolProperty(name="Normals", description="", default= False)
- use_hq_normals = BoolProperty(name="High Quality Normals", description="", default= True)
+ use_edges = BoolProperty(name="Edges", description="", default=True)
+ use_normals = BoolProperty(name="Normals", description="", default=False)
+ use_hq_normals = BoolProperty(name="High Quality Normals", description="", default=True)
use_uvs = BoolProperty(name="UVs", description="", default= True)
- use_materials = BoolProperty(name="Materials", description="", default= True)
- copy_images = BoolProperty(name="Copy Images", description="", default= False)
- use_triangles = BoolProperty(name="Triangulate", description="", default= False)
- use_vertex_groups = BoolProperty(name="Polygroups", description="", default= False)
- use_nurbs = BoolProperty(name="Nurbs", description="", default= False)
+ use_materials = BoolProperty(name="Materials", description="", default=True)
+ copy_images = BoolProperty(name="Copy Images", description="", default=False)
+ use_triangles = BoolProperty(name="Triangulate", description="", default=False)
+ use_vertex_groups = BoolProperty(name="Polygroups", description="", default=False)
+ use_nurbs = BoolProperty(name="Nurbs", description="", default=False)
# grouping group
use_blen_objects = BoolProperty(name="Objects as OBJ Objects", description="", default= True)
@@ -932,48 +895,48 @@ class ExportOBJ(bpy.types.Operator):
def execute(self, context):
- path = self.properties.path
- if not path.lower().endswith(".obj"):
- path += ".obj"
-
- do_export(path, context,
- EXPORT_TRI=self.properties.use_triangles,
- EXPORT_EDGES=self.properties.use_edges,
- EXPORT_NORMALS=self.properties.use_normals,
- EXPORT_NORMALS_HQ=self.properties.use_hq_normals,
- EXPORT_UV=self.properties.use_uvs,
- EXPORT_MTL=self.properties.use_materials,
- EXPORT_COPY_IMAGES=self.properties.copy_images,
- EXPORT_APPLY_MODIFIERS=self.properties.use_modifiers,
- EXPORT_ROTX90=self.properties.use_rotate90,
- EXPORT_BLEN_OBS=self.properties.use_blen_objects,
- EXPORT_GROUP_BY_OB=self.properties.group_by_object,
- EXPORT_GROUP_BY_MAT=self.properties.group_by_material,
- EXPORT_KEEP_VERT_ORDER=self.properties.keep_vertex_order,
- EXPORT_POLYGROUPS=self.properties.use_vertex_groups,
- EXPORT_CURVE_AS_NURBS=self.properties.use_nurbs,
- EXPORT_SEL_ONLY=self.properties.use_selection,
- EXPORT_ALL_SCENES=self.properties.use_all_scenes)
+ filepath = self.properties.filepath
+ filepath = bpy.path.ensure_ext(filepath, ".obj")
+
+ write(filepath, context,
+ EXPORT_TRI=self.properties.use_triangles,
+ EXPORT_EDGES=self.properties.use_edges,
+ EXPORT_NORMALS=self.properties.use_normals,
+ EXPORT_NORMALS_HQ=self.properties.use_hq_normals,
+ EXPORT_UV=self.properties.use_uvs,
+ EXPORT_MTL=self.properties.use_materials,
+ EXPORT_COPY_IMAGES=self.properties.copy_images,
+ EXPORT_APPLY_MODIFIERS=self.properties.use_modifiers,
+ EXPORT_ROTX90=self.properties.use_rotate90,
+ EXPORT_BLEN_OBS=self.properties.use_blen_objects,
+ EXPORT_GROUP_BY_OB=self.properties.group_by_object,
+ EXPORT_GROUP_BY_MAT=self.properties.group_by_material,
+ EXPORT_KEEP_VERT_ORDER=self.properties.keep_vertex_order,
+ EXPORT_POLYGROUPS=self.properties.use_vertex_groups,
+ EXPORT_CURVE_AS_NURBS=self.properties.use_nurbs,
+ EXPORT_SEL_ONLY=self.properties.use_selection,
+ EXPORT_ALL_SCENES=self.properties.use_all_scenes,
+ EXPORT_ANIMATION=self.properties.use_animation)
return {'FINISHED'}
def invoke(self, context, event):
- wm = context.manager
- wm.add_fileselect(self)
+ import os
+ if not self.properties.is_property_set("filepath"):
+ self.properties.filepath = os.path.splitext(bpy.data.filepath)[0] + ".obj"
+
+ context.manager.add_fileselect(self)
return {'RUNNING_MODAL'}
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
+ self.layout.operator(ExportOBJ.bl_idname, text="Wavefront (.obj)")
def register():
- bpy.types.register(ExportOBJ)
bpy.types.INFO_MT_file_export.append(menu_func)
def unregister():
- bpy.types.unregister(ExportOBJ)
bpy.types.INFO_MT_file_export.remove(menu_func)
@@ -986,4 +949,3 @@ def unregister():
if __name__ == "__main__":
register()
-
diff --git a/release/scripts/io/export_ply.py b/release/scripts/io/export_ply.py
index 23a3eb8b9ee..946be68ec41 100644
--- a/release/scripts/io/export_ply.py
+++ b/release/scripts/io/export_ply.py
@@ -99,11 +99,12 @@ def write(filename, scene, ob, \
Window.WaitCursor(1)
"""
- bpy.ops.object.mode_set(mode='OBJECT')
+ if scene.objects.active:
+ 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
@@ -111,7 +112,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)
@@ -128,7 +129,7 @@ def write(filename, scene, ob, \
vertexColors = False
if faceUV:
- active_uv_layer = mesh.active_uv_texture
+ active_uv_layer = mesh.uv_textures.active
if not active_uv_layer:
EXPORT_UV = False
faceUV = None
@@ -136,7 +137,7 @@ def write(filename, scene, ob, \
active_uv_layer = active_uv_layer.data
if vertexColors:
- active_col_layer = mesh.active_vertex_color
+ active_col_layer = mesh.vertex_colors.active
if not active_col_layer:
EXPORT_COLORS = False
vertexColors = None
@@ -146,7 +147,7 @@ def write(filename, scene, ob, \
# incase
color = uvcoord = uvcoord_key = normal = normal_key = None
- mesh_verts = mesh.verts # save a lookup
+ mesh_verts = mesh.vertices # save a lookup
ply_verts = [] # list of dictionaries
# vdict = {} # (index, normal, uv) -> new index
vdict = [{} for i in range(len(mesh_verts))]
@@ -155,7 +156,7 @@ def write(filename, scene, ob, \
for i, f in enumerate(mesh.faces):
- smooth = f.smooth
+ smooth = f.use_smooth
if not smooth:
normal = tuple(f.normal)
normal_key = rvec3d(normal)
@@ -167,7 +168,7 @@ def write(filename, scene, ob, \
col = active_col_layer[i]
col = col.color1, col.color2, col.color3, col.color4
- f_verts = f.verts
+ f_verts = f.vertices
pf = ply_faces[i]
for j, vidx in enumerate(f_verts):
@@ -203,7 +204,7 @@ def write(filename, scene, ob, \
file.write('ply\n')
file.write('format ascii 1.0\n')
- file.write('comment Created by Blender %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))
@@ -267,23 +268,22 @@ 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)
use_uvs = BoolProperty(name="UVs", description="Exort the active UV layer", default=True)
use_colors = BoolProperty(name="Vertex Colors", description="Exort the active vertex color layer", default=True)
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.active_object != None
def execute(self, context):
- # print("Selected: " + context.active_object.name)
+ filepath = self.properties.filepath
+ filepath = bpy.path.ensure_ext(filepath, ".ply")
- if not self.properties.path:
- raise Exception("filename not set")
-
- write(self.properties.path, context.scene, context.active_object,\
+ write(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,
@@ -293,8 +293,11 @@ class ExportPLY(bpy.types.Operator):
return {'FINISHED'}
def invoke(self, context, event):
- wm = context.manager
- wm.add_fileselect(self)
+ import os
+ if not self.properties.is_property_set("filepath"):
+ self.properties.filepath = os.path.splitext(bpy.data.filepath)[0] + ".ply"
+
+ context.manager.add_fileselect(self)
return {'RUNNING_MODAL'}
def draw(self, context):
@@ -310,17 +313,14 @@ 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
+ self.layout.operator(ExportPLY.bl_idname, text="Stanford (.ply)")
def register():
- bpy.types.register(ExportPLY)
bpy.types.INFO_MT_file_export.append(menu_func)
def unregister():
- bpy.types.unregister(ExportPLY)
bpy.types.INFO_MT_file_export.remove(menu_func)
if __name__ == "__main__":
diff --git a/release/scripts/io/export_x3d.py b/release/scripts/io/export_x3d.py
index dccc5808bc5..12fe63f5296 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.Matrix.Rotation(-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()
@@ -258,12 +258,9 @@ class x3d_class:
def writeFog(self, world):
if world:
- mtype = world.mist.falloff
- # mtype = world.getMistype()
- mparam = world.mist
- # mparam = world.getMist()
+ mtype = world.mist_settings.falloff
+ mparam = world.mist_settings
grd = world.horizon_color
- # grd = world.getHor()
grd0, grd1, grd2 = grd[0], grd[1], grd[2]
else:
return
@@ -300,7 +297,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 +343,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("<PointLight DEF=\"%s\" " % safeName)
@@ -364,7 +361,7 @@ class x3d_class:
return
else:
dx,dy,dz = self.computeDirection(mtx)
- # location=(ob.matrixWorld*MATWORLD).translation_part()
+ # location=(ob.matrix_world*MATWORLD).translation_part()
location=(mtx*MATWORLD).translation_part()
self.writeIndented("<%s\n" % obname,1)
self.writeIndented("direction=\"%s %s %s\"\n" % (round(dx,3),round(dy,3),round(dz,3)))
@@ -402,17 +399,17 @@ class x3d_class:
if len(mesh.faces) == 0: return
mode = []
# mode = 0
- if mesh.active_uv_texture:
+ if mesh.uv_textures.active:
# if mesh.faceUV:
- for face in mesh.active_uv_texture.data:
+ for face in mesh.uv_textures.active.data:
# for face in mesh.faces:
- if face.halo and 'HALO' not in mode:
+ if face.use_halo and 'HALO' not in mode:
mode += ['HALO']
- if face.billboard and 'BILLBOARD' not in mode:
+ if face.use_billboard and 'BILLBOARD' not in mode:
mode += ['BILLBOARD']
- if face.object_color and 'OBJECT_COLOR' not in mode:
+ if face.use_object_color and 'OBJECT_COLOR' not in mode:
mode += ['OBJECT_COLOR']
- if face.collision and 'COLLISION' not in mode:
+ if face.use_collision and 'COLLISION' not in mode:
mode += ['COLLISION']
# mode |= face.mode
@@ -445,7 +442,7 @@ class x3d_class:
else:
bTwoSided=0
- # mtx = ob.matrixWorld * MATWORLD # mtx is now passed
+ # mtx = ob.matrix_world * MATWORLD # mtx is now passed
mtx = mtx * MATWORLD
loc= mtx.translation_part()
@@ -461,16 +458,16 @@ class x3d_class:
self.writeIndented("<Shape>\n",1)
maters=mesh.materials
hasImageTexture=0
- issmooth=0
+ is_smooth = False
- if len(maters) > 0 or mesh.active_uv_texture:
+ if len(maters) > 0 or mesh.uv_textures.active:
# if len(maters) > 0 or mesh.faceUV:
self.writeIndented("<Appearance>\n", 1)
# right now this script can only handle a single material per mesh.
if len(maters) >= 1:
mat=maters[0]
# matFlags = mat.getMode()
- if not mat.face_texture:
+ if not mat.use_face_texture:
# if not matFlags & Blender.Material.Modes['TEXFACE']:
self.writeMaterial(mat, self.cleanStr(mat.name,''), world)
# self.writeMaterial(mat, self.cleanStr(maters[0].name,''), world)
@@ -480,9 +477,9 @@ class x3d_class:
#-- textures
face = None
- if mesh.active_uv_texture:
+ if mesh.uv_textures.active:
# if mesh.faceUV:
- for face in mesh.active_uv_texture.data:
+ for face in mesh.uv_textures.active.data:
# for face in mesh.faces:
if face.image:
# if (hasImageTexture == 0) and (face.image):
@@ -516,16 +513,16 @@ class x3d_class:
self.file.write("solid=\"true\" ")
for face in mesh.faces:
- if face.smooth:
- issmooth=1
- break
- if issmooth==1:
- creaseAngle=(mesh.autosmooth_angle)*(math.pi/180.0)
+ if face.use_smooth:
+ is_smooth = True
+ break
+ if is_smooth == True:
+ creaseAngle=(mesh.auto_smooth_angle)*(math.pi/180.0)
# creaseAngle=(mesh.degr)*(math.pi/180.0)
self.file.write("creaseAngle=\"%s\" " % (round(creaseAngle,self.cp)))
#--- output textureCoordinates if UV texture used
- if mesh.active_uv_texture:
+ if mesh.uv_textures.active:
# if mesh.faceUV:
if self.matonly == 1 and self.share == 1:
self.writeFaceColors(mesh)
@@ -540,7 +537,7 @@ class x3d_class:
self.writeCoordinates(ob, mesh, meshName, EXPORT_TRI)
#--- output textureCoordinates if UV texture used
- if mesh.active_uv_texture:
+ if mesh.uv_textures.active:
# if mesh.faceUV:
if hasImageTexture == 1:
self.writeTextureCoordinates(mesh)
@@ -581,7 +578,7 @@ class x3d_class:
if self.writingcoords == 0:
self.file.write('coordIndex="')
for face in mesh.faces:
- fv = face.verts
+ fv = face.vertices
# fv = face.v
if len(fv)==3:
@@ -601,10 +598,10 @@ class x3d_class:
self.file.write("\">\n")
else:
#-- vertices
- # mesh.transform(ob.matrixWorld)
+ # mesh.transform(ob.matrix_world)
self.writeIndented("<Coordinate DEF=\"%s%s\" \n" % ("coord_",meshName), 1)
self.file.write("\t\t\t\tpoint=\"")
- for v in mesh.verts:
+ for v in mesh.vertices:
self.file.write("%.6f %.6f %.6f, " % tuple(v.co))
self.file.write("\" />")
self.writeIndented("\n", -1)
@@ -614,11 +611,11 @@ class x3d_class:
texIndexList=[]
j=0
- for face in mesh.active_uv_texture.data:
+ for face in mesh.uv_textures.active.data:
# for face in mesh.faces:
# workaround, since tface.uv iteration is wrong atm
uvs = face.uv
- # uvs = [face.uv1, face.uv2, face.uv3, face.uv4] if face.verts[3] else [face.uv1, face.uv2, face.uv3]
+ # uvs = [face.uv1, face.uv2, face.uv3, face.uv4] if face.vertices[3] else [face.uv1, face.uv2, face.uv3]
for uv in uvs:
# for uv in face.uv:
@@ -646,10 +643,10 @@ class x3d_class:
def writeFaceColors(self, mesh):
if self.writingcolor == 0:
self.file.write("colorPerVertex=\"false\" ")
- elif mesh.active_vertex_color:
+ elif mesh.vertex_colors.active:
# else:
self.writeIndented("<Color color=\"", 1)
- for face in mesh.active_vertex_color.data:
+ for face in mesh.vertex_colors.active.data:
c = face.color1
if self.verbose > 2:
print("Debug: face.col r=%d g=%d b=%d" % (c[0], c[1], c[2]))
@@ -699,7 +696,7 @@ class x3d_class:
# specB = (mat.specCol[2]+0.001)/(1.25/(mat.spec+0.001))
transp = 1-mat.alpha
# matFlags = mat.getMode()
- if mat.shadeless:
+ if mat.use_shadeless:
# if matFlags & Blender.Material.Modes['SHADELESS']:
ambient = 1
shine = 1
@@ -717,7 +714,7 @@ class x3d_class:
def writeImageTexture(self, image):
name = image.name
- filename = image.filename.split('/')[-1].split('\\')[-1]
+ filename = image.filepath.split('/')[-1].split('\\')[-1]
if name in self.texNames:
self.writeIndented("<ImageTexture USE=\"%s\" />\n" % self.cleanStr(name))
self.texNames[name] += 1
@@ -731,7 +728,7 @@ class x3d_class:
def writeBackground(self, world, alltextures):
if world: worldname = world.name
else: return
- blending = (world.blend_sky, world.paper_sky, world.real_sky)
+ blending = (world.use_sky_blend, world.use_sky_paper, world.use_sky_real)
# blending = world.getSkytype()
grd = world.horizon_color
# grd = world.getHor()
@@ -794,28 +791,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.path.abspath(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 +849,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 +868,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
@@ -912,7 +909,7 @@ class x3d_class:
# if EXPORT_APPLY_MODIFIERS:
# if containerMesh:
- # containerMesh.verts = None
+ # containerMesh.vertices = None
self.cleanup()
@@ -961,16 +958,11 @@ class x3d_class:
faceMap={}
nFaceIndx=0
- if mesh.active_uv_texture:
+ if mesh.uv_textures.active:
# if mesh.faceUV:
- for face in mesh.active_uv_texture.data:
- # for face in mesh.faces:
- sidename='';
- if face.twoside:
- # if face.mode & Mesh.FaceModes.TWOSIDE:
- sidename='two'
- else:
- sidename='one'
+ for face in mesh.uv_textures.active.data:
+ # for face in mesh.faces
+ sidename = "two" if face.use_twoside else "one"
if sidename in sided:
sided[sidename]+=1
@@ -1003,8 +995,8 @@ class x3d_class:
if face.mode & Mesh.FaceModes.TWOSIDE:
print("Debug: face.mode twosided")
- print("Debug: face.transp=0x%x (enum)" % face.transp)
- if face.transp == Mesh.FaceTranspModes.SOLID:
+ print("Debug: face.transp=0x%x (enum)" % face.blend_type)
+ if face.blend_type == Mesh.FaceTranspModes.SOLID:
print("Debug: face.transp.SOLID")
if face.image:
@@ -1030,7 +1022,7 @@ class x3d_class:
# print("Debug: mesh.faceUV=%d" % mesh.faceUV)
print("Debug: mesh.hasVertexColours=%d" % (len(mesh.vertex_colors) > 0))
# print("Debug: mesh.hasVertexColours=%d" % mesh.hasVertexColours())
- print("Debug: mesh.verts=%d" % len(mesh.verts))
+ print("Debug: mesh.vertices=%d" % len(mesh.vertices))
print("Debug: mesh.faces=%d" % len(mesh.faces))
print("Debug: mesh.materials=%d" % len(mesh.materials))
@@ -1140,7 +1132,7 @@ class x3d_class:
# Callbacks, needed before Main
##########################################################
-def x3d_export(filename,
+def write(filename,
context,
EXPORT_APPLY_MODIFIERS=False,
EXPORT_TRI=False,
@@ -1156,8 +1148,9 @@ def x3d_export(filename,
scene = context.scene
world = scene.world
-
- bpy.ops.object.mode_set(mode='OBJECT')
+
+ if scene.objects.active:
+ bpy.ops.object.mode_set(mode='OBJECT')
# XXX these are global textures while .Get() returned only scene's?
alltextures = bpy.data.textures
@@ -1174,50 +1167,6 @@ def x3d_export(filename,
)
-def x3d_export_ui(filename):
- if not filename.endswith(extension):
- filename += extension
- #if _safeOverwrite and sys.exists(filename):
- # result = Draw.PupMenu("File Already Exists, Overwrite?%t|Yes%x1|No%x0")
- #if(result != 1):
- # return
-
- # Get user options
- EXPORT_APPLY_MODIFIERS = Draw.Create(1)
- EXPORT_TRI = Draw.Create(0)
- EXPORT_GZIP = Draw.Create( filename.lower().endswith('.x3dz') )
-
- # Get USER Options
- pup_block = [\
- ('Apply Modifiers', EXPORT_APPLY_MODIFIERS, 'Use transformed mesh data from each object.'),\
- ('Triangulate', EXPORT_TRI, 'Triangulate quads.'),\
- ('Compress', EXPORT_GZIP, 'GZip the resulting file, requires a full python install'),\
- ]
-
- if not Draw.PupBlock('Export...', pup_block):
- return
-
- Blender.Window.EditMode(0)
- Blender.Window.WaitCursor(1)
-
- x3d_export(filename,\
- EXPORT_APPLY_MODIFIERS = EXPORT_APPLY_MODIFIERS.val,\
- EXPORT_TRI = EXPORT_TRI.val,\
- EXPORT_GZIP = EXPORT_GZIP.val\
- )
-
- Blender.Window.WaitCursor(0)
-
-
-
-#########################################################
-# main routine
-#########################################################
-
-
-# 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):
@@ -1227,7 +1176,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)
@@ -1235,26 +1184,35 @@ 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)
+ filepath = self.properties.filepath
+ filepath = bpy.path.ensure_ext(filepath, ".x3d")
+
+ write(filepath,
+ context,
+ self.properties.apply_modifiers,
+ self.properties.triangulate,
+ self.properties.compress,
+ )
+
return {'FINISHED'}
def invoke(self, context, event):
- wm = context.manager
- wm.add_fileselect(self)
+ import os
+ if not self.properties.is_property_set("filepath"):
+ self.properties.filepath = os.path.splitext(bpy.data.filepath)[0] + ".x3d"
+
+ context.manager.add_fileselect(self)
return {'RUNNING_MODAL'}
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
+ self.layout.operator(ExportX3D.bl_idname, text="X3D Extensible 3D (.x3d)")
def register():
- bpy.types.register(ExportX3D)
bpy.types.INFO_MT_file_export.append(menu_func)
def unregister():
- bpy.types.unregister(ExportX3D)
bpy.types.INFO_MT_file_export.remove(menu_func)
# NOTES
@@ -1262,4 +1220,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 e6142a2db8a..04cae915a49 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
class bvh_node_class(object):
@@ -78,12 +78,12 @@ MATRIX_IDENTITY_4x4 = Matrix([1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0,
def eulerRotate(x, y, z, rot_order):
# Clamp all values between 0 and 360, values outside this raise an error.
- mats = [RotationMatrix(x, 3, 'X'), RotationMatrix(y, 3, 'Y'), RotationMatrix(z, 3, 'Z')]
+ mats = [Matrix.Rotation(x, 3, 'X'), Matrix.Rotation(y, 3, 'Y'), Matrix.Rotation(z, 3, 'Z')]
return (MATRIX_IDENTITY_3x3 * mats[rot_order[0]] * (mats[rot_order[1]] * (mats[rot_order[2]]))).to_euler()
# 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
@@ -328,7 +328,7 @@ def bvh_node_dict2objects(context, bvh_nodes, IMPORT_START_FRAME=1, IMPORT_LOOP=
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
@@ -347,7 +347,7 @@ def bvh_node_dict2armature(context, bvh_nodes, ROT_MODE='XYZ', IMPORT_START_FRAM
scn = context.scene
#XXX scn.objects.selected = []
for ob in scn.objects:
- ob.selected = False
+ ob.select = False
scn.set_frame(IMPORT_START_FRAME)
@@ -356,7 +356,7 @@ def bvh_node_dict2armature(context, bvh_nodes, ROT_MODE='XYZ', IMPORT_START_FRAM
scn.objects.link(arm_ob)
- arm_ob.selected = True
+ arm_ob.select = True
scn.objects.active = arm_ob
print(scn.objects.active)
@@ -426,7 +426,7 @@ def bvh_node_dict2armature(context, bvh_nodes, ROT_MODE='XYZ', IMPORT_START_FRAM
bvh_node.parent and\
bvh_node.parent.temp.name not in ZERO_AREA_BONES and\
bvh_node.parent.rest_tail_local == bvh_node.rest_head_local:
- bvh_node.temp.connected = True
+ bvh_node.temp.use_connect = True
# Replace the editbone with the editbone name,
# to avoid memory errors accessing the editbone outside editmode
@@ -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()
@@ -520,18 +518,18 @@ def bvh_node_dict2armature(context, bvh_nodes, ROT_MODE='XYZ', IMPORT_START_FRAM
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 * Matrix.Translation(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)
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)
@@ -614,12 +612,10 @@ def menu_func(self, context):
def register():
- bpy.types.register(BvhImporter)
bpy.types.INFO_MT_file_import.append(menu_func)
def unregister():
- bpy.types.unregister(BvhImporter)
bpy.types.INFO_MT_file_import.remove(menu_func)
if __name__ == "__main__":
diff --git a/release/scripts/io/import_scene_3ds.py b/release/scripts/io/import_scene_3ds.py
index 19bb734028b..d34b5ad0723 100644
--- a/release/scripts/io/import_scene_3ds.py
+++ b/release/scripts/io/import_scene_3ds.py
@@ -141,10 +141,10 @@ import os
import time
import struct
-from import_scene_obj import unpack_face_list, load_image
+from import_scene_obj import load_image
import bpy
-import Mathutils
+import mathutils
BOUNDS_3DS = []
@@ -266,12 +266,10 @@ def read_string(file):
s += struct.unpack('<c', file.read(1))[0]
#print 'string: ',s
+ #remove the null character from the string
s = str(s[:-1], 'ASCII')
# print("read string", s)
-
- #remove the null character from the string
return s
-# return s[:-1]
######################################################
# IMPORT
@@ -300,7 +298,6 @@ def add_texture_to_material(image, texture, material, mapto):
if image:
texture.image = image
-# if image: texture.setImage(image) # double check its an image.
material.add_texture(texture, "UV", mapto)
@@ -310,12 +307,12 @@ 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()
- contextMesh_vertls = None
+ contextMatrix_rot = None # Blender.mathutils.Matrix(); contextMatrix.identity()
+ #contextMatrix_tx = None # Blender.mathutils.Matrix(); contextMatrix.identity()
+ contextMesh_vertls = None # flat array: (verts * 3)
contextMesh_facels = None
contextMeshMaterials = {} # matname:[face_idxs]
- contextMeshUV = None
+ contextMeshUV = None # flat array (verts * 2)
TEXTURE_DICT = {}
MATDICT = {}
@@ -333,115 +330,71 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
# print STRUCT_SIZE_4x3MAT, ' STRUCT_SIZE_4x3MAT'
def putContextMesh(myContextMesh_vertls, myContextMesh_facels, myContextMeshMaterials):
-
- materialFaces = set() # faces that have a material. Can optimize?
-
- # Now make copies with assigned materils.
-
- def makeMeshMaterialCopy(matName, faces):
- '''
- Make a new mesh with only face the faces that use this material.
- faces can be any iterable object - containing ints.
- '''
-
- faceVertUsers = [False] * len(myContextMesh_vertls)
- ok = 0
- for fIdx in faces:
- for vindex in myContextMesh_facels[fIdx]:
- faceVertUsers[vindex] = True
- if matName != None: # if matName is none then this is a set(), meaning we are using the untextured faces and do not need to store textured faces.
- materialFaces.add(fIdx)
- ok = 1
-
- if not ok:
- return
-
- myVertMapping = {}
- vertMappingIndex = 0
-
- vertsToUse = [i for i in range(len(myContextMesh_vertls)) if faceVertUsers[i]]
- myVertMapping = dict( [ (ii, i) for i, ii in enumerate(vertsToUse) ] )
-
- tempName= '%s_%s' % (contextObName, matName) # matName may be None.
- bmesh = bpy.data.meshes.new(tempName)
-
- if matName == None:
- img = None
+
+ bmesh = bpy.data.meshes.new(contextObName)
+ if myContextMesh_vertls:
+
+ bmesh.vertices.add(len(myContextMesh_vertls)//3)
+ bmesh.faces.add(len(myContextMesh_facels))
+ bmesh.vertices.foreach_set("co", myContextMesh_vertls)
+
+ eekadoodle_faces = []
+ for v1, v2, v3 in myContextMesh_facels:
+ eekadoodle_faces.extend([v3, v1, v2, 0] if v3 == 0 else [v1, v2, v3, 0])
+ bmesh.faces.foreach_set("vertices_raw", eekadoodle_faces)
+
+ if bmesh.faces and contextMeshUV:
+ bmesh.uv_textures.new()
+ uv_faces = bmesh.uv_textures.active.data[:]
else:
- bmat = MATDICT[matName][1]
- bmesh.add_material(bmat)
-# bmesh.materials = [bmat]
- try: img = TEXTURE_DICT[bmat.name]
- except: img = None
-
-# bmesh_verts = bmesh.verts
- if len(vertsToUse):
- bmesh.add_geometry(len(vertsToUse), 0, len(faces))
-
- # XXX why add extra vertex?
-# bmesh_verts.extend( [Vector()] )
- bmesh.verts.foreach_set("co", [x for tup in [myContextMesh_vertls[i] for i in vertsToUse] for x in tup])
-# bmesh_verts.extend( [myContextMesh_vertls[i] for i in vertsToUse] )
-
- # +1 because of DUMMYVERT
- bmesh.faces.foreach_set("verts_raw", unpack_face_list([[myVertMapping[vindex] for vindex in myContextMesh_facels[fIdx]] for fIdx in faces]))
-# face_mapping = bmesh.faces.extend( [ [ bmesh_verts[ myVertMapping[vindex]+1] for vindex in myContextMesh_facels[fIdx]] for fIdx in faces ], indexList=True )
-
- if bmesh.faces and (contextMeshUV or img):
- bmesh.add_uv_texture()
- for ii, i in enumerate(faces):
-
- # Mapped index- faces may have not been added- if so, then map to the correct index
- # BUGGY API - face_mapping is not always the right length
-# map_index = face_mapping[ii]
-
- if 1:
-# if map_index != None:
- targetFace = bmesh.faces[ii]
-# targetFace = bmesh.faces[map_index]
-
- uf = bmesh.active_uv_texture.data[ii]
-
- if contextMeshUV:
- # v.index-1 because of the DUMMYVERT
- uvs = [contextMeshUV[vindex] for vindex in myContextMesh_facels[i]]
-
- if len(myContextMesh_facels[i]) == 3:
- uf.uv1, uf.uv2, uf.uv3, uf.uv4 = uvs + [(0.0, 0.0)]
- else:
- uf.uv1, uf.uv2, uf.uv3, uf.uv4 = uvs
-# targetFace.uv = [contextMeshUV[vindex] for vindex in myContextMesh_facels[i]]
- if img:
- uf.image = img
-
- # to get this image to show up in 'Textured' shading mode
- uf.tex = True
-
- # bmesh.transform(contextMatrix)
- ob = bpy.data.objects.new(tempName, bmesh)
- SCN.objects.link(ob)
-# ob = SCN_OBJECTS.new(bmesh, tempName)
- '''
- if contextMatrix_tx:
- ob.setMatrix(contextMatrix_tx)
- '''
-
- if contextMatrix_rot:
- # ob.matrix = [x for row in contextMatrix_rot for x in row]
- ob.matrix = contextMatrix_rot
-# ob.setMatrix(contextMatrix_rot)
-
- importedObjects.append(ob)
- bmesh.update()
-# bmesh.calcNormals()
-
- for matName, faces in myContextMeshMaterials.items():
- makeMeshMaterialCopy(matName, faces)
-
- if len(materialFaces) != len(myContextMesh_facels):
- # Invert material faces.
- makeMeshMaterialCopy(None, set(range(len( myContextMesh_facels ))) - materialFaces)
- #raise 'Some UnMaterialed faces', len(contextMesh.faces)
+ uv_faces = None
+
+ for mat_idx, (matName, faces) in enumerate(myContextMeshMaterials.items()):
+ if matName is None:
+ bmat = None
+ else:
+ bmat = MATDICT[matName][1]
+ img = TEXTURE_DICT.get(bmat.name)
+
+ bmesh.materials.link(bmat) # can be None
+
+ if uv_faces and img:
+ for fidx in faces:
+ bmesh.faces[fidx].material_index = mat_idx
+ uf = uv_faces[fidx]
+ uf.image = img
+ uf.use_image = True
+ else:
+ for fidx in faces:
+ bmesh.faces[fidx].material_index = mat_idx
+
+ if uv_faces:
+ for fidx, uf in enumerate(uv_faces):
+ face = myContextMesh_facels[fidx]
+ v1, v2, v3 = face
+
+ # eekadoodle
+ if v3 == 0:
+ v1, v2, v3 = v3, v1, v2
+
+ uf.uv1 = contextMeshUV[v1 * 2:(v1 * 2) + 2]
+ uf.uv2 = contextMeshUV[v2 * 2:(v2 * 2) + 2]
+ uf.uv3 = contextMeshUV[v3 * 2:(v3 * 2) + 2]
+ # always a tri
+
+ ob = bpy.data.objects.new(tempName, bmesh)
+ SCN.objects.link(ob)
+
+ '''
+ if contextMatrix_tx:
+ ob.setMatrix(contextMatrix_tx)
+ '''
+
+ if contextMatrix_rot:
+ ob.matrix_world = contextMatrix_rot
+
+ importedObjects.append(ob)
+ bmesh.update()
#a spare chunk
new_chunk = chunk()
@@ -460,9 +413,7 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
return [float(col)/255 for col in struct.unpack('<3B', temp_data)] # data [0,1,2] == rgb
def read_texture(new_chunk, temp_chunk, name, mapto):
- new_texture = bpy.data.textures.new(name)
- new_texture.type = 'IMAGE'
- new_texture = new_texture.recast_type()
+ new_texture = bpy.data.textures.new(name, type='IMAGE')
img = None
while (new_chunk.bytes_read < new_chunk.length):
@@ -669,14 +620,10 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
new_chunk.bytes_read += 2
# print 'number of verts: ', num_verts
- def getvert():
- temp_data = struct.unpack('<3f', file.read(STRUCT_SIZE_3FLOAT))
- new_chunk.bytes_read += STRUCT_SIZE_3FLOAT #12: 3 floats x 4 bytes each
- return temp_data
-
- #contextMesh.verts.extend( [Vector(),] ) # DUMMYVERT! - remove when blenders internals are fixed.
- contextMesh_vertls = [getvert() for i in range(num_verts)]
-
+ contextMesh_vertls = struct.unpack('<%df' % (num_verts * 3), file.read(STRUCT_SIZE_3FLOAT * num_verts))
+ new_chunk.bytes_read += STRUCT_SIZE_3FLOAT * num_verts
+ # dummyvert is not used atm!
+
#print 'object verts: bytes read: ', new_chunk.bytes_read
elif (new_chunk.ID == OBJECT_FACES):
@@ -686,15 +633,11 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
new_chunk.bytes_read += 2
#print 'number of faces: ', num_faces
- def getface():
- # print '\ngetting a face'
- temp_data = file.read(STRUCT_SIZE_4UNSIGNED_SHORT)
- new_chunk.bytes_read += STRUCT_SIZE_4UNSIGNED_SHORT #4 short ints x 2 bytes each
- v1,v2,v3,dummy = struct.unpack('<4H', temp_data)
- return v1, v2, v3
-
- contextMesh_facels = [ getface() for i in range(num_faces) ]
-
+ # print '\ngetting a face'
+ temp_data = file.read(STRUCT_SIZE_4UNSIGNED_SHORT * num_faces)
+ new_chunk.bytes_read += STRUCT_SIZE_4UNSIGNED_SHORT * num_faces #4 short ints x 2 bytes each
+ contextMesh_facels = struct.unpack('<%dH' % (num_faces * 4), temp_data)
+ contextMesh_facels = [contextMesh_facels[i - 3:i] for i in range(3, (num_faces * 4) + 3, 4)]
elif (new_chunk.ID == OBJECT_MATERIAL):
# print 'elif (new_chunk.ID == OBJECT_MATERIAL):'
@@ -705,12 +648,11 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
num_faces_using_mat = struct.unpack('<H', temp_data)[0]
new_chunk.bytes_read += STRUCT_SIZE_UNSIGNED_SHORT
- def getmat():
- temp_data = file.read(STRUCT_SIZE_UNSIGNED_SHORT)
- new_chunk.bytes_read += STRUCT_SIZE_UNSIGNED_SHORT
- return struct.unpack('<H', temp_data)[0]
+
+ temp_data = file.read(STRUCT_SIZE_UNSIGNED_SHORT * num_faces_using_mat)
+ new_chunk.bytes_read += STRUCT_SIZE_UNSIGNED_SHORT * num_faces_using_mat
- contextMeshMaterials[material_name]= [ getmat() for i in range(num_faces_using_mat) ]
+ contextMeshMaterials[material_name]= struct.unpack("<%dH" % (num_faces_using_mat), temp_data)
#look up the material in all the materials
@@ -719,12 +661,9 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
num_uv = struct.unpack('<H', temp_data)[0]
new_chunk.bytes_read += 2
- 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) )
-
- contextMeshUV = [ getuv() for i in range(num_uv) ]
+ temp_data = file.read(STRUCT_SIZE_2FLOAT * num_uv)
+ new_chunk.bytes_read += STRUCT_SIZE_2FLOAT * num_uv
+ contextMeshUV = struct.unpack('<%df' % (num_uv * 2), temp_data)
elif (new_chunk.ID == OBJECT_TRANS_MATRIX):
# How do we know the matrix size? 54 == 4x4 48 == 4x3
@@ -732,7 +671,7 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
data = list( struct.unpack('<ffffffffffff', temp_data) )
new_chunk.bytes_read += STRUCT_SIZE_4x3MAT
- contextMatrix_rot = Mathutils.Matrix(\
+ contextMatrix_rot = mathutils.Matrix(\
data[:3] + [0],\
data[3:6] + [0],\
data[6:9] + [0],\
@@ -740,7 +679,7 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
'''
- contextMatrix_rot = Blender.Mathutils.Matrix(\
+ contextMatrix_rot = Blender.mathutils.Matrix(\
data[:3] + [0],\
data[3:6] + [0],\
data[6:9] + [0],\
@@ -748,14 +687,14 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
'''
'''
- contextMatrix_rot = Blender.Mathutils.Matrix(\
+ contextMatrix_rot = Blender.mathutils.Matrix(\
data[:3] ,\
data[3:6],\
data[6:9])
'''
'''
- contextMatrix_rot = Blender.Mathutils.Matrix()
+ contextMatrix_rot = Blender.mathutils.Matrix()
m = 0
for j in xrange(4):
for i in xrange(3):
@@ -773,7 +712,7 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
#print contextMatrix_rot
contextMatrix_rot.invert()
#print contextMatrix_rot
- #contextMatrix_tx = Blender.Mathutils.TranslationMatrix(0.5 * Blender.Mathutils.Vector(data[9:]))
+ #contextMatrix_tx = mathutils.Matrix.Translation(0.5 * Blender.mathutils.Vector(data[9:]))
#contextMatrix_tx.invert()
#tx.invert()
@@ -808,7 +747,7 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
# FINISHED LOOP
# There will be a number of objects still not added
- if contextMesh_facels != None:
+ if CreateBlenderObject:
putContextMesh(contextMesh_vertls, contextMesh_facels, contextMeshMaterials)
def load_3ds(filename, context, IMPORT_CONSTRAIN_BOUNDS=10.0, IMAGE_SEARCH=True, APPLY_MATRIX=False):
@@ -885,14 +824,12 @@ def load_3ds(filename, context, IMPORT_CONSTRAIN_BOUNDS=10.0, IMAGE_SEARCH=True,
# REMOVE DUMMYVERT, - remove this in the next release when blenders internal are fixed.
-
-# for ob in importedObjects:
-# if ob.type == 'MESH':
-# # if ob.type=='Mesh':
-# me = ob.getData(mesh=1)
-# me.verts.delete([me.verts[0],])
-# if not APPLY_MATRIX:
-# me.transform(ob.matrixWorld.copy().invert())
+ for ob in importedObjects:
+ if ob.type == 'MESH':
+ me = ob.data
+# me.vertices.delete([me.vertices[0],]) # XXX, todo
+ if not APPLY_MATRIX:
+ me.transform(ob.matrix_world.copy().invert())
# Done DUMMYVERT
"""
@@ -946,11 +883,11 @@ def load_3ds(filename, context, IMPORT_CONSTRAIN_BOUNDS=10.0, IMAGE_SEARCH=True,
SCALE/=10
# SCALE Matrix
- SCALE_MAT = Mathutils.Matrix([SCALE,0,0,0],[0,SCALE,0,0],[0,0,SCALE,0],[0,0,0,1])
-# SCALE_MAT = Blender.Mathutils.Matrix([SCALE,0,0,0],[0,SCALE,0,0],[0,0,SCALE,0],[0,0,0,1])
+ SCALE_MAT = mathutils.Matrix([SCALE,0,0,0],[0,SCALE,0,0],[0,0,SCALE,0],[0,0,0,1])
+# SCALE_MAT = Blender.mathutils.Matrix([SCALE,0,0,0],[0,SCALE,0,0],[0,0,SCALE,0],[0,0,0,1])
for ob in importedObjects:
- ob.setMatrix(ob.matrixWorld * SCALE_MAT)
+ ob.matrix_world = ob.matrix_world * SCALE_MAT
# Done constraining to bounds.
@@ -1011,17 +948,19 @@ class IMPORT_OT_autodesk_3ds(bpy.types.Operator):
# List of operator properties, the attributes will be assigned
# to the class instance from the operator settings before calling.
+ filepath = StringProperty(name="File Path", description="Filepath used for importing the 3DS file", maxlen= 1024, default= "")
- path = StringProperty(name="File Path", description="File path used for importing the 3DS file", maxlen= 1024, default= "")
- filename = StringProperty(name="File Name", description="Name of the file.")
- directory = StringProperty(name="Directory", description="Directory of the file.")
-
-# size_constraint = FloatProperty(name="Size Constraint", description="Scale the model by 10 until it reacehs the size constraint. Zero Disables.", min=0.0, max=1000.0, soft_min=0.0, soft_max=1000.0, default=10.0),
-# search_images = BoolProperty(name="Image Search", description="Search subdirectories for any assosiated images (Warning, may be slow)", default=True),
-# apply_matrix = BoolProperty(name="Transform Fix", description="Workaround for object transformations importing incorrectly", default=False),
+ constrain_size = FloatProperty(name="Size Constraint", description="Scale the model by 10 until it reacehs the size constraint. Zero Disables.", min=0.0, max=1000.0, soft_min=0.0, soft_max=1000.0, default=10.0)
+ search_images = BoolProperty(name="Image Search", description="Search subdirectories for any assosiated images (Warning, may be slow)", default=True)
+ apply_transform = BoolProperty(name="Apply Transform", description="Workaround for object transformations importing incorrectly", default=False)
def execute(self, context):
- load_3ds(self.properties.path, context, 0.0, False, False)
+ load_3ds(self.properties.filepath,
+ context,
+ IMPORT_CONSTRAIN_BOUNDS=self.properties.constrain_size,
+ IMAGE_SEARCH=self.properties.search_images,
+ APPLY_MATRIX=self.properties.apply_transform)
+
return {'FINISHED'}
def invoke(self, context, event):
@@ -1034,11 +973,9 @@ def menu_func(self, context):
self.layout.operator(IMPORT_OT_autodesk_3ds.bl_idname, text="3D Studio (.3ds)")
def register():
- bpy.types.register(IMPORT_OT_autodesk_3ds)
bpy.types.INFO_MT_file_import.append(menu_func)
def unregister():
- bpy.types.unregister(IMPORT_OT_autodesk_3ds)
bpy.types.INFO_MT_file_import.remove(menu_func)
# NOTES:
diff --git a/release/scripts/io/import_scene_obj.py b/release/scripts/io/import_scene_obj.py
index 9a147b06b07..88caaf7eeb5 100644
--- a/release/scripts/io/import_scene_obj.py
+++ b/release/scripts/io/import_scene_obj.py
@@ -30,62 +30,11 @@ Run this script from "File->Import" menu and then load the desired OBJ file.
Note, This loads mesh objects and materials only, nurbs and curves are not supported.
"""
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# Script copyright (C) Campbell J Barton 2007
-#
-# 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 LICENCE BLOCK *****
-# --------------------------------------------------------------------------
-
import os
import time
import bpy
-import Mathutils
-import Geometry
-
-# from Blender import Mesh, Draw, Window, Texture, Material, sys
-# # import BPyMesh
-# import BPyImage
-# import BPyMessages
-
-# try: import os
-# except: os= False
-
-# Generic path functions
-def stripFile(path):
- '''Return directory, where the file is'''
- lastSlash= max(path.rfind('\\'), path.rfind('/'))
- if lastSlash != -1:
- path= path[:lastSlash]
- return '%s%s' % (path, os.sep)
-# return '%s%s' % (path, sys.sep)
-
-def stripPath(path):
- '''Strips the slashes from the back of a string'''
- return path.split('/')[-1].split('\\')[-1]
-
-def stripExt(name): # name is a string
- '''Strips the prefix off the name before writing'''
- index= name.rfind('.')
- if index != -1:
- return name[ : index ]
- else:
- return name
-# end path funcs
+import mathutils
+from geometry import PolyFill
def unpack_list(list_of_tuples):
l = []
@@ -95,23 +44,21 @@ def unpack_list(list_of_tuples):
# same as above except that it adds 0 for triangle faces
def unpack_face_list(list_of_tuples):
- l = []
- for t in list_of_tuples:
- face = [i for i in t]
-
- if len(face) != 3 and len(face) != 4:
- raise RuntimeError("{0} vertices in face.".format(len(face)))
+ # allocate the entire list
+ flat_ls = [0] * (len(list_of_tuples) * 4)
+ i = 0
- # rotate indices if the 4th is 0
- if len(face) == 4 and face[3] == 0:
- face = [face[3], face[0], face[1], face[2]]
-
- if len(face) == 3:
- face.append(0)
+ for t in list_of_tuples:
+ if len(t) == 3:
+ if t[2] == 0:
+ t = t[1], t[2], t[0]
+ else: # assuem quad
+ if t[3] == 0 or t[2] == 0:
+ t = t[2], t[3], t[0], t[1]
- l.extend(face)
-
- return l
+ flat_ls[i:i + len(t)] = t
+ i += 4
+ return flat_ls
def BPyMesh_ngon(from_data, indices, PREF_FIX_LOOPS= True):
'''
@@ -127,7 +74,7 @@ def BPyMesh_ngon(from_data, indices, PREF_FIX_LOOPS= True):
if not set: # Need sets for this, otherwise do a normal fill.
PREF_FIX_LOOPS= False
- Vector= Mathutils.Vector
+ Vector= mathutils.Vector
if not indices:
return []
@@ -152,13 +99,13 @@ def BPyMesh_ngon(from_data, indices, PREF_FIX_LOOPS= True):
if type(from_data) in (tuple, list):
verts= [Vector(from_data[i]) for ii, i in enumerate(indices)]
else:
- verts= [from_data.verts[i].co for ii, i in enumerate(indices)]
+ verts= [from_data.vertices[i].co for ii, i in enumerate(indices)]
for i in range(len(verts)-1, 0, -1): # same as reversed(xrange(1, len(verts))):
if verts[i][1]==verts[i-1][0]:
verts.pop(i-1)
- fill= Geometry.PolyFill([verts])
+ fill= PolyFill([verts])
else:
'''
@@ -169,7 +116,7 @@ def BPyMesh_ngon(from_data, indices, PREF_FIX_LOOPS= True):
if type(from_data) in (tuple, list):
verts= [vert_treplet(Vector(from_data[i]), ii) for ii, i in enumerate(indices)]
else:
- verts= [vert_treplet(from_data.verts[i].co, ii) for ii, i in enumerate(indices)]
+ verts= [vert_treplet(from_data.vertices[i].co, ii) for ii, i in enumerate(indices)]
edges= [(i, i-1) for i in range(len(verts))]
if edges:
@@ -266,7 +213,7 @@ def BPyMesh_ngon(from_data, indices, PREF_FIX_LOOPS= True):
vert_map[i+ii]= vert[2]
ii+=len(verts)
- fill= Geometry.PolyFill([ [v[0] for v in loop] for loop in loop_list ])
+ fill= PolyFill([ [v[0] for v in loop] for loop in loop_list ])
#draw_loops(loop_list)
#raise 'done loop'
# map to original indicies
@@ -318,24 +265,28 @@ def load_image(imagepath, dirname):
if os.path.exists(imagepath):
return bpy.data.images.load(imagepath)
- variants = [os.path.join(dirname, imagepath), os.path.join(dirname, os.path.basename(imagepath))]
+ variants = [imagepath, os.path.join(dirname, imagepath), os.path.join(dirname, os.path.basename(imagepath))]
- for path in variants:
- if os.path.exists(path):
- return bpy.data.images.load(path)
- else:
- print(path, "doesn't exist")
+ for filepath in variants:
+ for nfilepath in (filepath, bpy.path.resolve_ncase(filepath)):
+ if os.path.exists(nfilepath):
+ return bpy.data.images.load(nfilepath)
# TODO comprehensiveImageLoad also searched in bpy.config.textureDir
return None
def obj_image_load(imagepath, DIR, IMAGE_SEARCH):
-
if '_' in imagepath:
image= load_image(imagepath.replace('_', ' '), DIR)
- if image: return image
+ if image:
+ return image
- return load_image(imagepath, DIR)
+ image = load_image(imagepath, DIR)
+ if image:
+ return image
+
+ print("failed to load '%s' doesn't exist", imagepath)
+ return None
# def obj_image_load(imagepath, DIR, IMAGE_SEARCH):
# '''
@@ -360,25 +311,22 @@ def create_materials(filepath, material_libs, unique_materials, unique_material_
Create all the used materials in this obj,
assign colors and images to the materials from all referenced material libs
'''
- DIR= stripFile(filepath)
+ DIR= os.path.dirname(filepath)
#==================================================================================#
# This function sets textures defined in .mtl file #
#==================================================================================#
def load_material_image(blender_material, context_material_name, imagepath, type):
- texture= bpy.data.textures.new(type)
- texture.type= 'IMAGE'
- texture = texture.recast_type() # Workaround for limitation in rna api.
-# texture= bpy.data.textures.new(type)
-# texture.setType('Image')
+ texture= bpy.data.textures.new(name=type, type='IMAGE')
# Absolute path - c:\.. etc would work here
- image= obj_image_load(imagepath, DIR, IMAGE_SEARCH)
- has_data = image.has_data if image else False
+ image = obj_image_load(imagepath, DIR, IMAGE_SEARCH)
+ has_data = False
if image:
texture.image = image
+ has_data = image.has_data
# Adds textures for materials (rendering)
if type == 'Kd':
@@ -386,38 +334,32 @@ def create_materials(filepath, material_libs, unique_materials, unique_material_
# Image has alpha
# XXX bitmask won't work?
- blender_material.add_texture(texture, "UV", ("COLOR", "ALPHA"))
+ blender_material.add_texture(texture, 'UV', {'COLOR', 'ALPHA'})
texture.mipmap = True
texture.interpolation = True
texture.use_alpha = True
- blender_material.z_transparency = True
+ blender_material.use_transparency = True
blender_material.alpha = 0.0
-
-# blender_material.setTexture(0, texture, Texture.TexCo.UV, Texture.MapTo.COL | Texture.MapTo.ALPHA)
-# texture.setImageFlags('MipMap', 'InterPol', 'UseAlpha')
-# blender_material.mode |= Material.Modes.ZTRANSP
-# blender_material.alpha = 0.0
else:
- blender_material.add_texture(texture, "UV", "COLOR")
-# blender_material.setTexture(0, texture, Texture.TexCo.UV, Texture.MapTo.COL)
+ blender_material.add_texture(texture, 'UV', 'COLOR')
# adds textures to faces (Textured/Alt-Z mode)
# Only apply the diffuse texture to the face if the image has not been set with the inline usemat func.
unique_material_images[context_material_name]= image, has_data # set the texface image
elif type == 'Ka':
- blender_material.add_texture(texture, "UV", "AMBIENT")
+ blender_material.add_texture(texture, 'UV', 'AMBIENT')
# blender_material.setTexture(1, texture, Texture.TexCo.UV, Texture.MapTo.CMIR) # TODO- Add AMB to BPY API
elif type == 'Ks':
- blender_material.add_texture(texture, "UV", "SPECULARITY")
+ blender_material.add_texture(texture, 'UV', 'SPECULARITY')
# blender_material.setTexture(2, texture, Texture.TexCo.UV, Texture.MapTo.SPEC)
elif type == 'Bump':
- blender_material.add_texture(texture, "UV", "NORMAL")
+ blender_material.add_texture(texture, 'UV', 'NORMAL')
# blender_material.setTexture(3, texture, Texture.TexCo.UV, Texture.MapTo.NOR)
elif type == 'D':
- blender_material.add_texture(texture, "UV", "ALPHA")
+ blender_material.add_texture(texture, 'UV', 'ALPHA')
blender_material.z_transparency = True
blender_material.alpha = 0.0
# blender_material.setTexture(4, texture, Texture.TexCo.UV, Texture.MapTo.ALPHA)
@@ -426,15 +368,14 @@ def create_materials(filepath, material_libs, unique_materials, unique_material_
# Todo, unset deffuse material alpha if it has an alpha channel
elif type == 'refl':
- blender_material.add_texture(texture, "UV", "REFLECTION")
+ blender_material.add_texture(texture, 'UV', 'REFLECTION')
# blender_material.setTexture(5, texture, Texture.TexCo.UV, Texture.MapTo.REF)
# Add an MTL with the same name as the obj if no MTLs are spesified.
- temp_mtl= stripExt(stripPath(filepath))+ '.mtl'
+ temp_mtl = os.path.splitext((os.path.basename(filepath)))[0] + '.mtl'
- if os.path.exists(DIR + temp_mtl) and temp_mtl not in material_libs:
-# if sys.exists(DIR + temp_mtl) and temp_mtl not in material_libs:
+ if os.path.exists(os.path.join(DIR, temp_mtl)) and temp_mtl not in material_libs:
material_libs.append( temp_mtl )
del temp_mtl
@@ -448,11 +389,9 @@ def create_materials(filepath, material_libs, unique_materials, unique_material_
unique_material_images[None]= None, False
for libname in material_libs:
- mtlpath= DIR + libname
+ mtlpath= os.path.join(DIR, libname)
if not os.path.exists(mtlpath):
-# if not sys.exists(mtlpath):
- #print '\tError Missing MTL: "%s"' % mtlpath
- pass
+ print ("\tError Missing MTL: '%s'" % mtlpath)
else:
#print '\t\tloading mtl: "%s"' % mtlpath
context_material= None
@@ -471,22 +410,16 @@ def create_materials(filepath, material_libs, unique_materials, unique_material_
line_lower= line.lower().lstrip()
if line_lower.startswith('ka'):
context_material.mirror_color = (float(line_split[1]), float(line_split[2]), float(line_split[3]))
-# context_material.setMirCol((float(line_split[1]), float(line_split[2]), float(line_split[3])))
elif line_lower.startswith('kd'):
context_material.diffuse_color = (float(line_split[1]), float(line_split[2]), float(line_split[3]))
-# context_material.setRGBCol((float(line_split[1]), float(line_split[2]), float(line_split[3])))
elif line_lower.startswith('ks'):
context_material.specular_color = (float(line_split[1]), float(line_split[2]), float(line_split[3]))
-# context_material.setSpecCol((float(line_split[1]), float(line_split[2]), float(line_split[3])))
elif line_lower.startswith('ns'):
context_material.specular_hardness = int((float(line_split[1])*0.51))
-# context_material.setHardness( int((float(line_split[1])*0.51)) )
elif line_lower.startswith('ni'): # Refraction index
- context_material.raytrace_transparency.ior = max(1, min(float(line_split[1]), 3))
-# context_material.setIOR( max(1, min(float(line_split[1]), 3))) # Between 1 and 3
+ context_material.raytrace_transparency.ior = max(1, min(float(line_split[1]), 3)) # Between 1 and 3
elif line_lower.startswith('d') or line_lower.startswith('tr'):
context_material.alpha = float(line_split[1])
-# context_material.setAlpha(float(line_split[1]))
elif line_lower.startswith('map_ka'):
img_filepath= line_value(line.split())
if img_filepath:
@@ -517,49 +450,32 @@ def create_materials(filepath, material_libs, unique_materials, unique_material_
-def split_mesh(verts_loc, faces, unique_materials, filepath, SPLIT_OB_OR_GROUP, SPLIT_MATERIALS):
+def split_mesh(verts_loc, faces, unique_materials, filepath, SPLIT_OB_OR_GROUP):
'''
- Takes vert_loc and faces, and seperates into multiple sets of
+ Takes vert_loc and faces, and separates into multiple sets of
(verts_loc, faces, unique_materials, dataname)
'''
- filename = stripExt(stripPath(filepath))
+ filename = os.path.splitext((os.path.basename(filepath)))[0]
- if not SPLIT_OB_OR_GROUP and not SPLIT_MATERIALS:
+ if not SPLIT_OB_OR_GROUP:
# use the filename for the object name since we arnt chopping up the mesh.
return [(verts_loc, faces, unique_materials, filename)]
-
def key_to_name(key):
# if the key is a tuple, join it to make a string
- if type(key) == tuple:
- return '%s_%s' % key
- elif not key:
+ if not key:
return filename # assume its a string. make sure this is true if the splitting code is changed
else:
return key
# Return a key that makes the faces unique.
- if SPLIT_OB_OR_GROUP and not SPLIT_MATERIALS:
- def face_key(face):
- return face[4] # object
-
- elif not SPLIT_OB_OR_GROUP and SPLIT_MATERIALS:
- def face_key(face):
- return face[2] # material
-
- else: # Both
- def face_key(face):
- return face[4], face[2] # object,material
-
-
face_split_dict= {}
oldkey= -1 # initialize to a value that will never match the key
for face in faces:
-
- key= face_key(face)
+ key= face[4]
if oldkey != key:
# Check the key has changed.
@@ -584,7 +500,6 @@ def split_mesh(verts_loc, faces, unique_materials, filepath, SPLIT_OB_OR_GROUP,
vert_remap[i]= new_index # set the new remapped index so we only add once and can reference next time.
face_vert_loc_indicies[enum] = new_index # remap to the local index
verts_split.append( verts_loc[i] ) # add the vert to the local verts
-
else:
face_vert_loc_indicies[enum] = vert_remap[i] # remap to the local index
@@ -594,12 +509,11 @@ def split_mesh(verts_loc, faces, unique_materials, filepath, SPLIT_OB_OR_GROUP,
faces_split.append(face)
-
# remove one of the itemas and reorder
return [(value[0], value[1], value[2], key_to_name(key)) for key, value in list(face_split_dict.items())]
-def create_mesh(scn, new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_loc, verts_tex, faces, unique_materials, unique_material_images, unique_smooth_groups, vertex_groups, dataname):
+def create_mesh(new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_loc, verts_tex, faces, unique_materials, unique_material_images, unique_smooth_groups, vertex_groups, dataname):
'''
Takes all the data gathered and generates a mesh, adding the new object to new_objects
deals with fgons, sharp edges and assigning materials
@@ -609,7 +523,7 @@ def create_mesh(scn, new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_l
if unique_smooth_groups:
sharp_edges= {}
- smooth_group_users= dict([ (context_smooth_group, {}) for context_smooth_group in list(unique_smooth_groups.keys()) ])
+ smooth_group_users = {context_smooth_group: {} for context_smooth_group in list(unique_smooth_groups.keys())}
context_smooth_group_old= -1
# Split fgons into tri's
@@ -663,14 +577,14 @@ def create_mesh(scn, new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_l
if has_ngons and len_face_vert_loc_indicies > 4:
ngon_face_indices= BPyMesh_ngon(verts_loc, face_vert_loc_indicies)
- faces.extend(\
- [(\
- [face_vert_loc_indicies[ngon[0]], face_vert_loc_indicies[ngon[1]], face_vert_loc_indicies[ngon[2]] ],\
- [face_vert_tex_indicies[ngon[0]], face_vert_tex_indicies[ngon[1]], face_vert_tex_indicies[ngon[2]] ],\
- context_material,\
- context_smooth_group,\
- context_object)\
- for ngon in ngon_face_indices]\
+ faces.extend(
+ [(
+ [face_vert_loc_indicies[ngon[0]], face_vert_loc_indicies[ngon[1]], face_vert_loc_indicies[ngon[2]] ],
+ [face_vert_tex_indicies[ngon[0]], face_vert_tex_indicies[ngon[1]], face_vert_tex_indicies[ngon[2]] ],
+ context_material,
+ context_smooth_group,
+ context_object)
+ for ngon in ngon_face_indices]
)
# edges to make fgons
@@ -704,7 +618,7 @@ def create_mesh(scn, new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_l
# map the material names to an index
- material_mapping= dict([(name, i) for i, name in enumerate(unique_materials)]) # enumerate over unique_materials keys()
+ material_mapping = {name: i for i, name in enumerate(unique_materials)} # enumerate over unique_materials keys()
materials= [None] * len(unique_materials)
@@ -715,30 +629,25 @@ def create_mesh(scn, new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_l
# make sure the list isnt too big
for material in materials:
- me.add_material(material)
- #me.verts.extend([(0,0,0)]) # dummy vert
+ me.materials.link(material)
- me.add_geometry(len(verts_loc), 0, len(faces))
+ me.vertices.add(len(verts_loc))
+ me.faces.add(len(faces))
# verts_loc is a list of (x, y, z) tuples
- me.verts.foreach_set("co", unpack_list(verts_loc))
-# me.verts.extend(verts_loc)
+ me.vertices.foreach_set("co", unpack_list(verts_loc))
# faces is a list of (vert_indices, texco_indices, ...) tuples
# XXX faces should contain either 3 or 4 verts
# XXX no check for valid face indices
- me.faces.foreach_set("verts_raw", unpack_face_list([f[0] for f in faces]))
-# face_mapping= me.faces.extend([f[0] for f in faces], indexList=True)
+ me.faces.foreach_set("vertices_raw", unpack_face_list([f[0] for f in faces]))
if verts_tex and me.faces:
- me.add_uv_texture()
-# me.faceUV= 1
- # TEXMODE= Mesh.FaceModes['TEX']
+ me.uv_textures.new()
context_material_old= -1 # avoid a dict lookup
mat= 0 # rare case it may be un-initialized.
me_faces= me.faces
-# ALPHA= Mesh.FaceTranspModes.ALPHA
for i, face in enumerate(faces):
if len(face[0]) < 2:
@@ -747,14 +656,8 @@ def create_mesh(scn, new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_l
if CREATE_EDGES:
edges.append(face[0])
else:
-# face_index_map= face_mapping[i]
-
- # since we use foreach_set to add faces, all of them are added
- if 1:
-# if face_index_map!=None: # None means the face wasnt added
blender_face = me.faces[i]
-# blender_face= me_faces[face_index_map]
face_vert_loc_indicies,\
face_vert_tex_indicies,\
@@ -765,7 +668,7 @@ def create_mesh(scn, new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_l
if context_smooth_group:
- blender_face.smooth= True
+ blender_face.use_smooth = True
if context_material:
if context_material_old is not context_material:
@@ -781,14 +684,12 @@ def create_mesh(scn, new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_l
blender_tface= me.uv_textures[0].data[i]
if context_material:
- image, has_data= unique_material_images[context_material]
+ image, has_data = unique_material_images[context_material]
if image: # Can be none if the material dosnt have an image.
- blender_tface.image= image
-# blender_face.image= image
- if has_data:
-# if has_data and image.depth == 32:
- blender_tface.transp = 'ALPHA'
-# blender_face.transp |= ALPHA
+ blender_tface.image = image
+ blender_tface.use_image = True
+ if has_data and image.depth == 32:
+ blender_tface.blend_type = 'ALPHA'
# BUG - Evil eekadoodle problem where faces that have vert index 0 location at 3 or 4 are shuffled.
if len(face_vert_loc_indicies)==4:
@@ -814,10 +715,10 @@ def create_mesh(scn, new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_l
if CREATE_EDGES:
- me.add_geometry(0, len(edges), 0)
+ me.edges.add(len(edges))
# edges should be a list of (a, b) tuples
- me.edges.foreach_set("verts", unpack_list(edges))
+ me.edges.foreach_set("vertices", unpack_list(edges))
# me_edges.extend( edges )
# del me_edges
@@ -832,8 +733,8 @@ def create_mesh(scn, new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_l
# if CREATE_FGONS and fgon_edges:
# for fgon_edge in fgon_edges.keys():
# for ed in me.edges:
-# if edges_match(fgon_edge, ed.verts):
-# ed.fgon = True
+# if edges_match(fgon_edge, ed.vertices):
+# ed.is_fgon = True
# if CREATE_FGONS and fgon_edges:
# FGON= Mesh.EdgeFlags.FGON
@@ -846,8 +747,8 @@ def create_mesh(scn, new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_l
# if unique_smooth_groups and sharp_edges:
# for sharp_edge in sharp_edges.keys():
# for ed in me.edges:
-# if edges_match(sharp_edge, ed.verts):
-# ed.sharp = True
+# if edges_match(sharp_edge, ed.vertices):
+# ed.use_edge_sharp = True
# if unique_smooth_groups and sharp_edges:
# SHARP= Mesh.EdgeFlags.SHARP
@@ -860,21 +761,18 @@ def create_mesh(scn, new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_l
# me.calcNormals()
ob= bpy.data.objects.new("Mesh", me)
- scn.objects.link(ob)
new_objects.append(ob)
# Create the vertex groups. No need to have the flag passed here since we test for the
# content of the vertex_groups. If the user selects to NOT have vertex groups saved then
# the following test will never run
for group_name, group_indicies in vertex_groups.items():
- group= ob.add_vertex_group(group_name)
-# me.addVertGroup(group_name)
+ group= ob.vertex_groups.new(group_name)
for vertex_index in group_indicies:
- ob.add_vertex_to_group(vertex_index, group, 1.0, 'REPLACE')
-# me.assignVertsToGroup(group_name, group_indicies, 1.00, Mesh.AssignModes.REPLACE)
+ ob.vertex_groups.assign(vertex_index, group, 1.0, 'REPLACE')
-def create_nurbs(scn, context_nurbs, vert_loc, new_objects):
+def create_nurbs(context_nurbs, vert_loc, new_objects):
'''
Add nurbs object to blender, only support one type at the moment
'''
@@ -899,21 +797,14 @@ def create_nurbs(scn, context_nurbs, vert_loc, new_objects):
print('\tWarning, surfaces not supported')
return
- cu = bpy.data.curves.new(name, 'Curve')
- cu.flag |= 1 # 3D curve
+ cu = bpy.data.curves.new(name, 'CURVE')
+ cu.dimensions = '3D'
- nu = None
- for pt in curv_idx:
+ nu = cu.splines.new('NURBS')
+ nu.points.add(len(curv_idx) - 1) # a point is added to start with
+ nu.points.foreach_set("co", [co_axis for vt_idx in curv_idx for co_axis in (vert_loc[vt_idx] + (1.0,))])
- pt = vert_loc[pt]
- pt = (pt[0], pt[1], pt[2], 1.0)
-
- if nu == None:
- nu = cu.appendNurb(pt)
- else:
- nu.append(pt)
-
- nu.orderU = deg[0]+1
+ nu.order_u = deg[0] + 1
# get for endpoint flag from the weighting
if curv_range and len(parm_u) > deg[0]+1:
@@ -932,7 +823,7 @@ def create_nurbs(scn, context_nurbs, vert_loc, new_objects):
do_endpoints = False
if do_endpoints:
- nu.flagU |= 2
+ nu.use_endpoint_u = True
# close
@@ -947,10 +838,11 @@ def create_nurbs(scn, context_nurbs, vert_loc, new_objects):
break
if do_closed:
- nu.flagU |= 1
+ nu.use_cyclic_u = True
'''
+
+ ob= bpy.data.objects.new("Nurb", cu)
- ob = scn.objects.new(cu)
new_objects.append(ob)
@@ -1271,11 +1163,9 @@ def load_obj(filepath,
verts_loc[:] = [(v[0], v[2], -v[1]) for v in verts_loc]
# deselect all
-# if context.selected_objects:
-# bpy.ops.OBJECT_OT_select_all()
+ bpy.ops.object.select_all(action='DESELECT')
scene = context.scene
-# scn = bpy.data.scenes.active
# scn.objects.selected = []
new_objects= [] # put new objects here
@@ -1284,13 +1174,20 @@ def load_obj(filepath,
if SPLIT_OBJECTS or SPLIT_GROUPS: SPLIT_OB_OR_GROUP = True
else: SPLIT_OB_OR_GROUP = False
- for verts_loc_split, faces_split, unique_materials_split, dataname in split_mesh(verts_loc, faces, unique_materials, filepath, SPLIT_OB_OR_GROUP, SPLIT_MATERIALS):
+ for verts_loc_split, faces_split, unique_materials_split, dataname in split_mesh(verts_loc, faces, unique_materials, filepath, SPLIT_OB_OR_GROUP):
# Create meshes from the data, warning 'vertex_groups' wont support splitting
- create_mesh(scene, new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_loc_split, verts_tex, faces_split, unique_materials_split, unique_material_images, unique_smooth_groups, vertex_groups, dataname)
+ create_mesh(new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_loc_split, verts_tex, faces_split, unique_materials_split, unique_material_images, unique_smooth_groups, vertex_groups, dataname)
# nurbs support
-# for context_nurbs in nurbs:
-# create_nurbs(scn, context_nurbs, verts_loc, new_objects)
+ for context_nurbs in nurbs:
+ create_nurbs(context_nurbs, verts_loc, new_objects)
+
+ # Create new obj
+ for obj in new_objects:
+ base = scene.objects.link(obj)
+ base.select = True
+
+ scene.update()
axis_min= [ 1000000000]*3
@@ -1333,14 +1230,13 @@ def load_obj_ui(filepath, BATCH_LOAD= False):
if BPyMessages.Error_NoFile(filepath):
return
- global CREATE_SMOOTH_GROUPS, CREATE_FGONS, CREATE_EDGES, SPLIT_OBJECTS, SPLIT_GROUPS, SPLIT_MATERIALS, CLAMP_SIZE, IMAGE_SEARCH, POLYGROUPS, KEEP_VERT_ORDER, ROTATE_X90
+ global CREATE_SMOOTH_GROUPS, CREATE_FGONS, CREATE_EDGES, SPLIT_OBJECTS, SPLIT_GROUPS, CLAMP_SIZE, IMAGE_SEARCH, POLYGROUPS, KEEP_VERT_ORDER, ROTATE_X90
CREATE_SMOOTH_GROUPS= Draw.Create(0)
CREATE_FGONS= Draw.Create(1)
CREATE_EDGES= Draw.Create(1)
SPLIT_OBJECTS= Draw.Create(0)
SPLIT_GROUPS= Draw.Create(0)
- SPLIT_MATERIALS= Draw.Create(0)
CLAMP_SIZE= Draw.Create(10.0)
IMAGE_SEARCH= Draw.Create(1)
POLYGROUPS= Draw.Create(0)
@@ -1359,7 +1255,6 @@ 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'),\
- ('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)'),\
@@ -1372,7 +1267,6 @@ def load_obj_ui(filepath, BATCH_LOAD= False):
if KEEP_VERT_ORDER.val:
SPLIT_OBJECTS.val = False
SPLIT_GROUPS.val = False
- SPLIT_MATERIALS.val = False
'''
@@ -1394,25 +1288,25 @@ def load_obj_ui(filepath, BATCH_LOAD= False):
GLOBALS['EVENT'] = e
def do_split(e,v):
- global SPLIT_OBJECTS, SPLIT_GROUPS, SPLIT_MATERIALS, KEEP_VERT_ORDER, POLYGROUPS
- if SPLIT_OBJECTS.val or SPLIT_GROUPS.val or SPLIT_MATERIALS.val:
+ global SPLIT_OBJECTS, SPLIT_GROUPS, KEEP_VERT_ORDER, POLYGROUPS
+ if SPLIT_OBJECTS.val or SPLIT_GROUPS.val:
KEEP_VERT_ORDER.val = 0
POLYGROUPS.val = 0
else:
KEEP_VERT_ORDER.val = 1
def do_vertorder(e,v):
- global SPLIT_OBJECTS, SPLIT_GROUPS, SPLIT_MATERIALS, KEEP_VERT_ORDER
+ global SPLIT_OBJECTS, SPLIT_GROUPS, KEEP_VERT_ORDER
if KEEP_VERT_ORDER.val:
- SPLIT_OBJECTS.val = SPLIT_GROUPS.val = SPLIT_MATERIALS.val = 0
+ SPLIT_OBJECTS.val = SPLIT_GROUPS.val = 0
else:
- if not (SPLIT_OBJECTS.val or SPLIT_GROUPS.val or SPLIT_MATERIALS.val):
+ if not (SPLIT_OBJECTS.val or SPLIT_GROUPS.val):
KEEP_VERT_ORDER.val = 1
def do_polygroups(e,v):
- global SPLIT_OBJECTS, SPLIT_GROUPS, SPLIT_MATERIALS, KEEP_VERT_ORDER, POLYGROUPS
+ global SPLIT_OBJECTS, SPLIT_GROUPS, KEEP_VERT_ORDER, POLYGROUPS
if POLYGROUPS.val:
- SPLIT_OBJECTS.val = SPLIT_GROUPS.val = SPLIT_MATERIALS.val = 0
+ SPLIT_OBJECTS.val = SPLIT_GROUPS.val = 0
def do_help(e,v):
url = __url__[0]
@@ -1432,7 +1326,7 @@ def load_obj_ui(filepath, BATCH_LOAD= False):
ui_x -= 165
ui_y -= 90
- global CREATE_SMOOTH_GROUPS, CREATE_FGONS, CREATE_EDGES, SPLIT_OBJECTS, SPLIT_GROUPS, SPLIT_MATERIALS, CLAMP_SIZE, IMAGE_SEARCH, POLYGROUPS, KEEP_VERT_ORDER, ROTATE_X90
+ global CREATE_SMOOTH_GROUPS, CREATE_FGONS, CREATE_EDGES, SPLIT_OBJECTS, SPLIT_GROUPS, CLAMP_SIZE, IMAGE_SEARCH, POLYGROUPS, KEEP_VERT_ORDER, ROTATE_X90
Draw.Label('Import...', ui_x+9, ui_y+159, 220, 21)
Draw.BeginAlign()
@@ -1445,7 +1339,6 @@ 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('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
@@ -1495,7 +1388,7 @@ def load_obj_ui(filepath, BATCH_LOAD= False):
return
for f in files:
- scn= bpy.data.scenes.new( stripExt(f) )
+ scn= bpy.data.scenes.new(os.path.splitext(f)[0])
scn.makeCurrent()
load_obj(sys.join(filepath, f),\
@@ -1505,7 +1398,6 @@ def load_obj_ui(filepath, BATCH_LOAD= False):
CREATE_EDGES.val,\
SPLIT_OBJECTS.val,\
SPLIT_GROUPS.val,\
- SPLIT_MATERIALS.val,\
ROTATE_X90.val,\
IMAGE_SEARCH.val,\
POLYGROUPS.val
@@ -1519,7 +1411,6 @@ def load_obj_ui(filepath, BATCH_LOAD= False):
CREATE_EDGES.val,\
SPLIT_OBJECTS.val,\
SPLIT_GROUPS.val,\
- SPLIT_MATERIALS.val,\
ROTATE_X90.val,\
IMAGE_SEARCH.val,\
POLYGROUPS.val
@@ -1576,14 +1467,13 @@ 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="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)
@@ -1596,7 +1486,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,
@@ -1604,7 +1494,6 @@ class IMPORT_OT_obj(bpy.types.Operator):
self.properties.CREATE_EDGES,
self.properties.SPLIT_OBJECTS,
self.properties.SPLIT_GROUPS,
- self.properties.SPLIT_MATERIALS,
self.properties.ROTATE_X90,
self.properties.IMAGE_SEARCH,
self.properties.POLYGROUPS)
@@ -1612,8 +1501,7 @@ class IMPORT_OT_obj(bpy.types.Operator):
return {'FINISHED'}
def invoke(self, context, event):
- wm = context.manager
- wm.add_fileselect(self)
+ context.manager.add_fileselect(self)
return {'RUNNING_MODAL'}
@@ -1622,11 +1510,9 @@ def menu_func(self, context):
def register():
- bpy.types.register(IMPORT_OT_obj)
bpy.types.INFO_MT_file_import.append(menu_func)
def unregister():
- bpy.types.unregister(IMPORT_OT_obj)
bpy.types.INFO_MT_file_import.remove(menu_func)
@@ -1634,13 +1520,11 @@ def unregister():
# check later: line 489
# can convert now: edge flags, edges: lines 508-528
# ngon (uses python module BPyMesh): 384-414
-# nurbs: 947-
# NEXT clamp size: get bound box with RNA
# get back to l 140 (here)
# search image in bpy.config.textureDir - load_image
# replaced BPyImage.comprehensiveImageLoad with a simplified version that only checks additional directory specified, but doesn't search dirs recursively (obj_image_load)
# bitmask won't work? - 132
-# uses operator bpy.ops.OBJECT_OT_select_all() to deselect all (not necessary?)
# uses bpy.sys.time()
if __name__ == "__main__":
diff --git a/release/scripts/io/import_shape_mdd.py b/release/scripts/io/import_shape_mdd.py
index 884fa92ddd0..c7b199918a2 100644
--- a/release/scripts/io/import_shape_mdd.py
+++ b/release/scripts/io/import_shape_mdd.py
@@ -12,7 +12,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.
#
# ***** END GPL LICENCE BLOCK *****
@@ -66,7 +66,7 @@ def mdd_import(filepath, ob, scene, PREF_START_FRAME=0, PREF_JUMP=1):
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
+ ob.show_shape_key = True
verts = ob.data.shape_keys.keys[len(ob.data.shape_keys.keys)-1].data
@@ -74,7 +74,7 @@ def mdd_import(filepath, ob, scene, PREF_START_FRAME=0, PREF_JUMP=1):
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
+ ob.show_shape_key = False
# insert keyframes
@@ -104,7 +104,7 @@ 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
@@ -116,19 +116,20 @@ 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)
frame_start = IntProperty(name="Start Frame", description="Start frame for inserting animation", min=minframe, max=maxframe, default=0)
- def poll(self, context):
+ @classmethod
+ def poll(cls, 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.frame_start, 1)
+ mdd_import(self.properties.filepath, bpy.context.active_object, context.scene, self.properties.frame_start, 1)
return {'FINISHED'}
@@ -143,12 +144,10 @@ 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)
if __name__ == "__main__":
diff --git a/release/scripts/io/netrender/__init__.py b/release/scripts/io/netrender/__init__.py
index e06d061f173..5a705e95aa8 100644
--- a/release/scripts/io/netrender/__init__.py
+++ b/release/scripts/io/netrender/__init__.py
@@ -18,15 +18,31 @@
# This directory is a Python package.
-from netrender import model
-from netrender import operators
-from netrender import client
-from netrender import slave
-from netrender import master
-from netrender import master_html
-from netrender import utils
-from netrender import balancing
-from netrender import ui
+# To support reload properly, try to access a package var, if it's there, reload everything
+try:
+ init_data
+
+ reload(model)
+ reload(operators)
+ reload(client)
+ reload(slave)
+ reload(master)
+ reload(master_html)
+ reload(utils)
+ reload(balancing)
+ reload(ui)
+ reload(repath)
+except:
+ from netrender import model
+ from netrender import operators
+ from netrender import client
+ from netrender import slave
+ from netrender import master
+ from netrender import master_html
+ from netrender import utils
+ from netrender import balancing
+ from netrender import ui
+ from netrender import repath
jobs = []
slaves = []
@@ -37,11 +53,10 @@ init_data = True
init_address = True
def register():
- pass # TODO
+ ui.addProperties()
+
def unregister():
import bpy
- bpy.types.unregister(ui.NetRenderJob)
- bpy.types.unregister(ui.NetRenderSettings)
- bpy.types.unregister(ui.NetRenderSlave)
+ bpy.types.Scene.RemoveProperty("network_render")
diff --git a/release/scripts/io/netrender/client.py b/release/scripts/io/netrender/client.py
index 3acc0e1c2e1..6f0f6460ae1 100644
--- a/release/scripts/io/netrender/client.py
+++ b/release/scripts/io/netrender/client.py
@@ -41,7 +41,7 @@ def addFluidFiles(job, path):
job.addFile(path + fluid_file, current_frame, current_frame)
def addPointCache(job, ob, point_cache, default_path):
- if not point_cache.disk_cache:
+ if not point_cache.use_disk_cache:
return
@@ -49,7 +49,7 @@ def addPointCache(job, ob, point_cache, default_path):
if name == "":
name = "".join(["%02X" % ord(c) for c in ob.name])
- cache_path = bpy.utils.expandpath(point_cache.filepath) if point_cache.external else default_path
+ cache_path = bpy.path.abspath(point_cache.filepath) if point_cache.use_external else default_path
index = "%02i" % point_cache.index
@@ -101,7 +101,7 @@ def clientSendJob(conn, scene, anim = False):
else:
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.path.abspath(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.path.abspath(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
@@ -135,15 +139,18 @@ def clientSendJob(conn, scene, anim = False):
for object in bpy.data.objects:
for modifier in object.modifiers:
if modifier.type == 'FLUID_SIMULATION' and modifier.settings.type == "DOMAIN":
- addFluidFiles(job, bpy.utils.expandpath(modifier.settings.path))
+ addFluidFiles(job, bpy.path.abspath(modifier.settings.path))
elif modifier.type == "CLOTH":
addPointCache(job, object, modifier.point_cache, default_path)
elif modifier.type == "SOFT_BODY":
addPointCache(job, object, modifier.point_cache, default_path)
elif modifier.type == "SMOKE" and modifier.smoke_type == "TYPE_DOMAIN":
addPointCache(job, object, modifier.domain_settings.point_cache_low, default_path)
- if modifier.domain_settings.highres:
+ if modifier.domain_settings.use_high_resolution:
addPointCache(job, object, modifier.domain_settings.point_cache_high, default_path)
+ elif modifier.type == "MULTIRES" and modifier.is_external:
+ file_path = bpy.path.abspath(modifier.filepath)
+ job.addFile(file_path)
# particles modifier are stupid and don't contain data
# we have to go through the object property
@@ -164,6 +171,7 @@ def clientSendJob(conn, scene, anim = False):
# try to send path first
conn.request("POST", "/job", repr(job.serialize()))
response = conn.getresponse()
+ response.read()
job_id = response.getheader("job-id")
@@ -174,6 +182,7 @@ def clientSendJob(conn, scene, anim = False):
conn.request("PUT", fileURL(job_id, rfile.index), f)
f.close()
response = conn.getresponse()
+ response.read()
# server will reply with ACCEPTED until all files are found
@@ -182,7 +191,6 @@ def clientSendJob(conn, scene, anim = False):
def requestResult(conn, job_id, frame):
conn.request("GET", renderURL(job_id, frame))
-@rnaType
class NetworkRenderEngine(bpy.types.RenderEngine):
bl_idname = 'NET_RENDER'
bl_label = "Network Render"
@@ -202,7 +210,7 @@ class NetworkRenderEngine(bpy.types.RenderEngine):
address = "" if netsettings.server_address == "[default]" else netsettings.server_address
- master.runMaster((address, netsettings.server_port), netsettings.master_broadcast, netsettings.master_clear, netsettings.path, self.update_stats, self.test_break)
+ master.runMaster((address, netsettings.server_port), netsettings.master_broadcast, netsettings.use_master_clear, netsettings.path, self.update_stats, self.test_break)
def render_slave(self, scene):
@@ -230,6 +238,7 @@ class NetworkRenderEngine(bpy.types.RenderEngine):
requestResult(conn, job_id, scene.frame_current)
response = conn.getresponse()
+ response.read()
if response.status == http.client.NO_CONTENT:
new_job = True
@@ -238,16 +247,19 @@ class NetworkRenderEngine(bpy.types.RenderEngine):
requestResult(conn, job_id, scene.frame_current)
response = conn.getresponse()
+ response.read()
while response.status == http.client.ACCEPTED and not self.test_break():
time.sleep(1)
requestResult(conn, job_id, scene.frame_current)
response = conn.getresponse()
+ response.read()
# cancel new jobs (animate on network) on break
if self.test_break() and new_job:
conn.request("POST", cancelURL(job_id))
response = conn.getresponse()
+ response.read()
print( response.status, response.reason )
netsettings.job_id = 0
@@ -259,7 +271,7 @@ class NetworkRenderEngine(bpy.types.RenderEngine):
x= int(r.resolution_x*r.resolution_percentage*0.01)
y= int(r.resolution_y*r.resolution_percentage*0.01)
- f = open(netsettings.path + "output.exr", "wb")
+ f = open(os.path.join(netsettings.path, "output.exr"), "wb")
buf = response.read(1024)
while buf:
@@ -269,7 +281,7 @@ class NetworkRenderEngine(bpy.types.RenderEngine):
f.close()
result = self.begin_result(0, 0, x, y)
- result.load_from_file(netsettings.path + "output.exr")
+ result.load_from_file(os.path.join(netsettings.path, "output.exr"))
self.end_result(result)
conn.close()
@@ -284,3 +296,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..6deb925420b 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
@@ -84,7 +89,7 @@ class MRenderJob(netrender.model.RenderJob):
def save(self):
if self.save_path:
- f = open(self.save_path + "job.txt", "w")
+ f = open(os.path.join(self.save_path, "job.txt"), "w")
f.write(repr(self.serialize()))
f.close()
@@ -129,8 +134,8 @@ class MRenderJob(netrender.model.RenderJob):
self.status = JOB_QUEUED
def addLog(self, frames):
- log_name = "_".join(("%04d" % f for f in frames)) + ".log"
- log_path = self.save_path + log_name
+ log_name = "_".join(("%06d" % f for f in frames)) + ".log"
+ log_path = os.path.join(self.save_path, log_name)
for number in frames:
frame = self[number]
@@ -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)
@@ -250,7 +260,7 @@ class RenderHandler(http.server.BaseHTTPRequestHandler):
elif frame.status == DONE:
self.server.stats("", "Sending result to client")
- filename = job.save_path + "%04d" % frame_number + ".exr"
+ filename = os.path.join(job.save_path, "%06d.exr" % frame_number)
f = open(filename, 'rb')
self.send_head(content = "image/x-exr")
@@ -284,7 +294,7 @@ class RenderHandler(http.server.BaseHTTPRequestHandler):
if frame.status in (QUEUED, DISPATCHED):
self.send_head(http.client.ACCEPTED)
elif frame.status == DONE:
- filename = job.save_path + "%04d" % frame_number + ".exr"
+ filename = os.path.join(job.save_path, "%06d.exr" % frame_number)
thumbname = thumbnail(filename)
@@ -706,12 +716,12 @@ class RenderHandler(http.server.BaseHTTPRequestHandler):
if file_index > 0:
file_path = prefixPath(job.save_path, render_file.filepath, main_path)
else:
- file_path = job.save_path + main_name
+ file_path = os.path.join(job.save_path, main_name)
buf = self.rfile.read(length)
# add same temp file + renames as slave
-
+
f = open(file_path, "wb")
f.write(buf)
f.close()
@@ -762,7 +772,7 @@ class RenderHandler(http.server.BaseHTTPRequestHandler):
if job_result == DONE:
length = int(self.headers['content-length'])
buf = self.rfile.read(length)
- f = open(job.save_path + "%04d" % job_frame + ".exr", 'wb')
+ f = open(os.path.join(job.save_path, "%06d.exr" % job_frame), 'wb')
f.write(buf)
f.close()
@@ -812,13 +822,12 @@ class RenderHandler(http.server.BaseHTTPRequestHandler):
if job.type == netrender.model.JOB_BLENDER:
length = int(self.headers['content-length'])
buf = self.rfile.read(length)
- f = open(job.save_path + "%04d" % job_frame + ".jpg", 'wb')
+ f = open(os.path.join(job.save_path, "%06d.jpg" % job_frame), 'wb')
f.write(buf)
f.close()
del buf
- self.send_head()
else: # frame not found
self.send_head(http.client.NO_CONTENT)
else: # job not found
@@ -861,16 +870,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 = os.path.join(path, "master_" + str(os.getpid()))
+ 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 +896,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)
@@ -977,7 +1006,7 @@ class RenderMasterServer(socketserver.ThreadingMixIn, http.server.HTTPServer):
self.jobs_map[job.id] = job
# create job directory
- job.save_path = self.path + "job_" + job.id + os.sep
+ job.save_path = os.path.join(self.path, "job_" + job.id)
if not os.path.exists(job.save_path):
os.mkdir(job.save_path)
@@ -1001,8 +1030,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 +1060,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 +1068,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 +1081,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..74155f6bd66 100644
--- a/release/scripts/io/netrender/master_html.py
+++ b/release/scripts/io/netrender/master_html.py
@@ -27,8 +27,10 @@ def get(handler):
def output(text):
handler.wfile.write(bytes(text, encoding='utf8'))
- def head(title):
+ def head(title, refresh = False):
output("<html><head>")
+ if refresh:
+ output("<meta http-equiv='refresh' content=5>")
output("<script src='/html/netrender.js' type='text/javascript'></script>")
# output("<script src='/html/json2.js' type='text/javascript'></script>")
output("<title>")
@@ -103,54 +105,7 @@ def get(handler):
f.close()
elif handler.path == "/html" or handler.path == "/":
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 "&nbsp;"
- )
-
- 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 "&nbsp;"
- )
-
- 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 "&nbsp;"
- )
-
- 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()
+ head("NetRender", refresh = True)
output("<h2>Jobs</h2>")
@@ -203,6 +158,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 "&nbsp;"
+ )
+
+ 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 "&nbsp;"
+ )
+
+ 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 "&nbsp;"
+ )
+
+ endTable()
output("</body></html>")
@@ -234,13 +236,17 @@ def get(handler):
tot_cache = 0
tot_fluid = 0
+ rowTable(job.files[0].filepath)
+ rowTable("Other Files", class_style = "toggle", extra = "onclick='toggleDisplay(&quot;.other&quot;, &quot;none&quot;, &quot;table-row&quot;)'")
+
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(&quot;.cache&quot;, &quot;none&quot;, &quot;table-row&quot;)'")
@@ -256,9 +262,9 @@ def get(handler):
endTable()
- output("<h2>Blacklist</h2>")
-
if job.blacklist:
+ output("<h2>Blacklist</h2>")
+
startTable()
headerTable("name", "address")
@@ -267,8 +273,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 4c027436560..252b1146b67 100644
--- a/release/scripts/io/netrender/operators.py
+++ b/release/scripts/io/netrender/operators.py
@@ -26,20 +26,20 @@ from netrender.utils import *
import netrender.client as client
import netrender.model
-@rnaType
class RENDER_OT_netslave_bake(bpy.types.Operator):
'''NEED DESCRIPTION'''
bl_idname = "render.netslavebake"
bl_label = "Bake all in file"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return True
def execute(self, context):
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
@@ -52,45 +52,45 @@ class RENDER_OT_netslave_bake(bpy.types.Operator):
modifier.settings.path = relative_path
bpy.ops.fluid.bake({"active_object": object, "scene": scene})
elif modifier.type == "CLOTH":
- modifier.point_cache.step = 1
- modifier.point_cache.disk_cache = True
- modifier.point_cache.external = False
+ modifier.point_cache.frame_step = 1
+ modifier.point_cache.use_disk_cache = True
+ modifier.point_cache.use_external = False
elif modifier.type == "SOFT_BODY":
- modifier.point_cache.step = 1
- modifier.point_cache.disk_cache = True
- modifier.point_cache.external = False
+ modifier.point_cache.frame_step = 1
+ modifier.point_cache.use_disk_cache = True
+ modifier.point_cache.use_external = False
elif modifier.type == "SMOKE" and modifier.smoke_type == "TYPE_DOMAIN":
- modifier.domain_settings.point_cache_low.step = 1
- modifier.domain_settings.point_cache_low.disk_cache = True
- modifier.domain_settings.point_cache_low.external = False
- modifier.domain_settings.point_cache_high.step = 1
- modifier.domain_settings.point_cache_high.disk_cache = True
- modifier.domain_settings.point_cache_high.external = False
+ modifier.domain_settings.point_cache_low.use_step = 1
+ modifier.domain_settings.point_cache_low.use_disk_cache = True
+ modifier.domain_settings.point_cache_low.use_external = False
+ modifier.domain_settings.point_cache_high.use_step = 1
+ modifier.domain_settings.point_cache_high.use_disk_cache = True
+ modifier.domain_settings.point_cache_high.use_external = False
# particles modifier are stupid and don't contain data
# we have to go through the object property
for psys in object.particle_systems:
- psys.point_cache.step = 1
- psys.point_cache.disk_cache = True
- psys.point_cache.external = False
+ psys.point_cache.use_step = 1
+ psys.point_cache.use_disk_cache = True
+ psys.point_cache.use_external = False
psys.point_cache.filepath = relative_path
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'}
def invoke(self, context, event):
return self.execute(context)
-@rnaType
class RENDER_OT_netclientanim(bpy.types.Operator):
'''Start rendering an animation on network'''
bl_idname = "render.netclientanim"
bl_label = "Animation on network"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return True
def execute(self, context):
@@ -111,13 +111,13 @@ class RENDER_OT_netclientanim(bpy.types.Operator):
def invoke(self, context, event):
return self.execute(context)
-@rnaType
class RENDER_OT_netclientrun(bpy.types.Operator):
'''Start network rendering service'''
bl_idname = "render.netclientstart"
bl_label = "Start Service"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return True
def execute(self, context):
@@ -128,13 +128,13 @@ class RENDER_OT_netclientrun(bpy.types.Operator):
def invoke(self, context, event):
return self.execute(context)
-@rnaType
class RENDER_OT_netclientsend(bpy.types.Operator):
'''Send Render Job to the Network'''
bl_idname = "render.netclientsend"
bl_label = "Send job"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return True
def execute(self, context):
@@ -158,13 +158,43 @@ 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"
+
+ @classmethod
+ def poll(cls, 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)
+
class RENDER_OT_netclientstatus(bpy.types.Operator):
'''Refresh the status of the current jobs'''
bl_idname = "render.netclientstatus"
bl_label = "Client Status"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return True
def execute(self, context):
@@ -175,6 +205,7 @@ class RENDER_OT_netclientstatus(bpy.types.Operator):
conn.request("GET", "/status")
response = conn.getresponse()
+ response.read()
print( response.status, response.reason )
jobs = (netrender.model.RenderJob.materialize(j) for j in eval(str(response.read(), encoding='utf8')))
@@ -198,13 +229,13 @@ class RENDER_OT_netclientstatus(bpy.types.Operator):
def invoke(self, context, event):
return self.execute(context)
-@rnaType
class RENDER_OT_netclientblacklistslave(bpy.types.Operator):
'''Operator documentation text, will be used for the operator tooltip and python docs.'''
bl_idname = "render.netclientblacklistslave"
bl_label = "Client Blacklist Slave"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return True
def execute(self, context):
@@ -228,13 +259,13 @@ class RENDER_OT_netclientblacklistslave(bpy.types.Operator):
def invoke(self, context, event):
return self.execute(context)
-@rnaType
class RENDER_OT_netclientwhitelistslave(bpy.types.Operator):
'''Operator documentation text, will be used for the operator tooltip and python docs.'''
bl_idname = "render.netclientwhitelistslave"
bl_label = "Client Whitelist Slave"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return True
def execute(self, context):
@@ -259,13 +290,13 @@ class RENDER_OT_netclientwhitelistslave(bpy.types.Operator):
return self.execute(context)
-@rnaType
class RENDER_OT_netclientslaves(bpy.types.Operator):
'''Refresh status about available Render slaves'''
bl_idname = "render.netclientslaves"
bl_label = "Client Slaves"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return True
def execute(self, context):
@@ -276,6 +307,7 @@ class RENDER_OT_netclientslaves(bpy.types.Operator):
conn.request("GET", "/slaves")
response = conn.getresponse()
+ response.read()
print( response.status, response.reason )
slaves = (netrender.model.RenderSlave.materialize(s) for s in eval(str(response.read(), encoding='utf8')))
@@ -304,13 +336,13 @@ class RENDER_OT_netclientslaves(bpy.types.Operator):
def invoke(self, context, event):
return self.execute(context)
-@rnaType
class RENDER_OT_netclientcancel(bpy.types.Operator):
'''Cancel the selected network rendering job.'''
bl_idname = "render.netclientcancel"
bl_label = "Client Cancel"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
netsettings = context.scene.network_render
return netsettings.active_job_index >= 0 and len(netsettings.jobs) > 0
@@ -324,6 +356,7 @@ class RENDER_OT_netclientcancel(bpy.types.Operator):
conn.request("POST", cancelURL(job.id))
response = conn.getresponse()
+ response.read()
print( response.status, response.reason )
netsettings.jobs.remove(netsettings.active_job_index)
@@ -333,13 +366,13 @@ class RENDER_OT_netclientcancel(bpy.types.Operator):
def invoke(self, context, event):
return self.execute(context)
-@rnaType
class RENDER_OT_netclientcancelall(bpy.types.Operator):
'''Cancel all running network rendering jobs.'''
bl_idname = "render.netclientcancelall"
bl_label = "Client Cancel All"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return True
def execute(self, context):
@@ -350,6 +383,7 @@ class RENDER_OT_netclientcancelall(bpy.types.Operator):
conn.request("POST", "/clear")
response = conn.getresponse()
+ response.read()
print( response.status, response.reason )
while(len(netsettings.jobs) > 0):
@@ -360,13 +394,13 @@ class RENDER_OT_netclientcancelall(bpy.types.Operator):
def invoke(self, context, event):
return self.execute(context)
-@rnaType
class netclientdownload(bpy.types.Operator):
'''Download render results from the network'''
bl_idname = "render.netclientdownload"
bl_label = "Client Download"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
netsettings = context.scene.network_render
return netsettings.active_job_index >= 0 and len(netsettings.jobs) > 0
@@ -382,6 +416,7 @@ class netclientdownload(bpy.types.Operator):
for frame in job.frames:
client.requestResult(conn, job.id, frame.number)
response = conn.getresponse()
+ response.read()
if response.status != http.client.OK:
print("missing", frame.number)
@@ -389,7 +424,7 @@ class netclientdownload(bpy.types.Operator):
print("got back", frame.number)
- f = open(netsettings.path + "%06d" % frame.number + ".exr", "wb")
+ f = open(os.path.join(netsettings.path, "%06d.exr" % frame.number), "wb")
buf = response.read(1024)
while buf:
@@ -405,13 +440,13 @@ class netclientdownload(bpy.types.Operator):
def invoke(self, context, event):
return self.execute(context)
-@rnaType
class netclientscan(bpy.types.Operator):
'''Listen on network for master server broadcasting its address and port.'''
bl_idname = "render.netclientscan"
bl_label = "Client Scan"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return True
def execute(self, context):
@@ -428,13 +463,13 @@ class netclientscan(bpy.types.Operator):
def invoke(self, context, event):
return self.execute(context)
-@rnaType
class netclientweb(bpy.types.Operator):
'''Open new window with information about running rendering jobs'''
bl_idname = "render.netclientweb"
bl_label = "Open Master Monitor"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
netsettings = context.scene.network_render
return netsettings.server_address != "[default]"
diff --git a/release/scripts/io/netrender/repath.py b/release/scripts/io/netrender/repath.py
new file mode 100644
index 00000000000..3ac9636b628
--- /dev/null
+++ b/release/scripts/io/netrender/repath.py
@@ -0,0 +1,150 @@
+# ##### 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.use_external = False
+
+ def processFluid(fluid):
+ new_path = path_map.get(fluid.filepath, 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[os.path.split(paths[i])[1]] = paths[i+1]
+
+ # TODO original paths aren't really the orignal path (they are the normalized path
+ # so we repath using the filenames only.
+
+ ###########################
+ # LIBRARIES
+ ###########################
+ for lib in bpy.data.libraries:
+ file_path = bpy.path.abspath(lib.filepath)
+ new_path = path_map.get(os.path.split(file_path)[1], 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.path.abspath(image.filepath)
+ new_path = path_map.get(os.path.split(file_path)[1], 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.use_high_resolution:
+ processPointCache(modifier.domain_settings.point_cache_high)
+ elif modifier.type == "MULTIRES" and modifier.is_external:
+ file_path = bpy.path.abspath(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(filepath=new_path, check_existing=False)
diff --git a/release/scripts/io/netrender/slave.py b/release/scripts/io/netrender/slave.py
index d24490385fb..b383481824b 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]
@@ -58,18 +59,30 @@ def slave_Info():
def testCancel(conn, job_id, frame_number):
conn.request("HEAD", "/status", headers={"job-id":job_id, "job-frame": str(frame_number)})
- # cancelled if job isn't found anymore
- if conn.getresponse().status == http.client.NO_CONTENT:
+ # canceled if job isn't found anymore
+ if responseStatus(conn) == http.client.NO_CONTENT:
return True
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)
-
- 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})
+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 found:
+ # Force prefix path if not found
+ job_full_path = prefixPath(JOB_PREFIX, rfile.filepath, main_path, force = True)
+ temp_path = os.path.join(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 +98,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
@@ -98,13 +113,16 @@ def render_slave(engine, netsettings, threads):
if conn:
conn.request("POST", "/slave", repr(slave_Info().serialize()))
response = conn.getresponse()
+ response.read()
slave_id = response.getheader("slave-id")
- NODE_PREFIX = netsettings.path + "slave_" + slave_id + os.sep
+ NODE_PREFIX = os.path.join(netsettings.path, "slave_" + slave_id)
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,8 +131,9 @@ 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
+ JOB_PREFIX = os.path.join(NODE_PREFIX, "job_" + job.id)
if not os.path.exists(JOB_PREFIX):
os.mkdir(JOB_PREFIX)
@@ -123,19 +142,23 @@ 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])
conn.request("POST", "/log", bytes(repr(logfile.serialize()), encoding='utf8'))
response = conn.getresponse()
+ response.read()
first_frame = job.frames[0].number
@@ -151,7 +174,7 @@ def render_slave(engine, netsettings, threads):
frame_args += ["-f", str(frame.number)]
val = SetErrorMode()
- process = subprocess.Popen([BLENDER_PATH, "-b", "-noaudio", job_full_path, "-t", str(threads), "-o", JOB_PREFIX + "######", "-E", "BLENDER_RENDER", "-F", "MULTILAYER"] + frame_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ process = subprocess.Popen([BLENDER_PATH, "-b", "-noaudio", job_full_path, "-t", str(threads), "-o", os.path.join(JOB_PREFIX, "######"), "-E", "BLENDER_RENDER", "-F", "MULTILAYER"] + frame_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
RestoreErrorMode(val)
elif job.type == netrender.model.JOB_PROCESS:
command = job.frames[0].command
@@ -175,6 +198,11 @@ 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()
+ response.read()
+
+ # Also output on console
+ if netsettings.use_slave_output_log:
+ print(str(stdout, encoding='utf8'), end="")
stdout = bytes()
@@ -182,15 +210,32 @@ 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()
if cancelled:
# kill process if needed
if process.poll() == None:
- process.terminate()
+ try:
+ process.terminate()
+ except OSError:
+ pass
continue # to next frame
+ # flush the rest of the logs
+ if stdout:
+ # Also output on console
+ if netsettings.use_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 responseStatus(conn) == http.client.NO_CONTENT:
+ continue
+
total_t = time.time() - start_t
avg_t = total_t / len(job.frames)
@@ -199,13 +244,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)}
@@ -216,26 +254,27 @@ def render_slave(engine, netsettings, threads):
if job.type == netrender.model.JOB_BLENDER:
# send image back to server
- filename = JOB_PREFIX + "%06d" % frame.number + ".exr"
+ filename = os.path.join(JOB_PREFIX, "%06d.exr" % frame.number)
# thumbnail first
- if netsettings.slave_thumb:
+ if netsettings.use_slave_thumb:
thumbname = thumbnail(filename)
f = open(thumbname, 'rb')
conn.request("PUT", "/thumb", f, headers=headers)
f.close()
- conn.getresponse()
+ responseStatus(conn)
+
f = open(filename, 'rb')
conn.request("PUT", "/render", f, headers=headers)
f.close()
- if conn.getresponse().status == http.client.NO_CONTENT:
+ if responseStatus(conn) == http.client.NO_CONTENT:
continue
elif job.type == netrender.model.JOB_PROCESS:
conn.request("PUT", "/render", headers=headers)
- if conn.getresponse().status == http.client.NO_CONTENT:
+ if responseStatus(conn) == http.client.NO_CONTENT:
continue
else:
headers["job-result"] = str(ERROR)
@@ -243,8 +282,10 @@ def render_slave(engine, netsettings, threads):
headers["job-frame"] = str(frame.number)
# send error result back to server
conn.request("PUT", "/render", headers=headers)
- if conn.getresponse().status == http.client.NO_CONTENT:
+ if responseStatus(conn) == http.client.NO_CONTENT:
continue
+
+ engine.update_stats("", "Network render connected to master, waiting for jobs")
else:
if timeout < MAX_TIMEOUT:
timeout += INCREMENT_TIMEOUT
@@ -256,7 +297,7 @@ def render_slave(engine, netsettings, threads):
conn.close()
- if netsettings.slave_clear:
+ if netsettings.use_slave_clear:
clearSlave(NODE_PREFIX)
if __name__ == "__main__":
diff --git a/release/scripts/io/netrender/ui.py b/release/scripts/io/netrender/ui.py
index f8b29fdd326..c2d943f63f8 100644
--- a/release/scripts/io/netrender/ui.py
+++ b/release/scripts/io/netrender/ui.py
@@ -36,9 +36,14 @@ DISPATCHED = 1
DONE = 2
ERROR = 3
+def base_poll(cls, context):
+ rd = context.scene.render
+ return (rd.use_game_engine==False) and (rd.engine in cls.COMPAT_ENGINES)
+
+
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,22 +81,26 @@ 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"
# COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here
-
- def poll(self, context):
+
+ @classmethod
+ def poll(cls, context):
rd = context.scene.render
- return (rd.use_game_engine==False) and (rd.engine in self.COMPAT_ENGINES)
+ return (rd.use_game_engine==False) and (rd.engine in cls.COMPAT_ENGINES)
# 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'}
+ @classmethod
+ def poll(cls, context):
+ return super(RENDER_PT_network_settings, cls).poll(context)
+
def draw(self, context):
layout = self.layout
@@ -122,15 +131,14 @@ 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'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
scene = context.scene
- return (super().poll(context)
- and scene.network_render.mode == "RENDER_SLAVE")
+ return super(RENDER_PT_network_slave_settings, cls).poll(context) and scene.network_render.mode == "RENDER_SLAVE"
def draw(self, context):
layout = self.layout
@@ -139,22 +147,23 @@ class RENDER_PT_network_slave_settings(RenderButtonsPanel):
rd = scene.render
netsettings = scene.network_render
- layout.prop(netsettings, "slave_clear")
- layout.prop(netsettings, "slave_thumb")
+ layout.prop(netsettings, "use_slave_clear")
+ layout.prop(netsettings, "use_slave_thumb")
+ layout.prop(netsettings, "use_slave_output_log")
layout.label(text="Threads:")
layout.prop(rd, "threads_mode", expand=True)
sub = layout.column()
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'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
scene = context.scene
- return (super().poll(context)
- and scene.network_render.mode == "RENDER_MASTER")
+ return super(RENDER_PT_network_master_settings, cls).poll(context) and scene.network_render.mode == "RENDER_MASTER"
def draw(self, context):
layout = self.layout
@@ -162,18 +171,17 @@ class RENDER_PT_network_master_settings(RenderButtonsPanel):
scene = context.scene
netsettings = scene.network_render
- layout.prop(netsettings, "master_broadcast")
- layout.prop(netsettings, "master_clear")
+ layout.prop(netsettings, "use_master_broadcast")
+ layout.prop(netsettings, "use_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'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
scene = context.scene
- return (super().poll(context)
- and scene.network_render.mode == "RENDER_CLIENT")
+ return super(RENDER_PT_network_job, cls).poll(context) and scene.network_render.mode == "RENDER_CLIENT"
def draw(self, context):
layout = self.layout
@@ -186,6 +194,7 @@ 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("render.render", text="Get Image", icon='RENDER_STILL')
@@ -205,18 +214,18 @@ class RENDER_PT_network_job(RenderButtonsPanel):
row.prop(netsettings, "priority")
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):
+ @classmethod
+ def poll(cls, 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]")
+ return super(RENDER_PT_network_slaves, cls).poll(context) and netsettings.server_address != "[default]"
def draw(self, context):
layout = self.layout
@@ -243,18 +252,18 @@ class RENDER_PT_network_slaves(RenderButtonsPanel):
layout.label(text="Seen: " + time.ctime(slave.last_seen))
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):
+ @classmethod
+ def poll(cls, 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]")
+ return super(RENDER_PT_network_slaves_blacklist, cls).poll(context) and netsettings.server_address != "[default]"
def draw(self, context):
layout = self.layout
@@ -280,18 +289,18 @@ class RENDER_PT_network_slaves_blacklist(RenderButtonsPanel):
layout.label(text="Seen: " + time.ctime(slave.last_seen))
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):
+ @classmethod
+ def poll(cls, 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]")
+ return super(RENDER_PT_network_jobs, cls).poll(context) and netsettings.server_address != "[default]"
def draw(self, context):
layout = self.layout
@@ -320,145 +329,148 @@ class RENDER_PT_network_jobs(RenderButtonsPanel):
layout.label(text="Done: %04i" % job.results[DONE])
layout.label(text="Error: %04i" % job.results[ERROR])
-@rnaType
class NetRenderSettings(bpy.types.IDPropertyGroup):
pass
-@rnaType
class NetRenderSlave(bpy.types.IDPropertyGroup):
pass
-@rnaType
class NetRenderJob(bpy.types.IDPropertyGroup):
pass
-bpy.types.Scene.PointerProperty(attr="network_render", type=NetRenderSettings, name="Network Render", description="Network Render Settings")
-
-NetRenderSettings.StringProperty( attr="server_address",
- name="Server address",
- description="IP or name of the master render server",
- maxlen = 128,
- default = "[default]")
-
-NetRenderSettings.IntProperty( attr="server_port",
- name="Server port",
- description="port of the master render server",
- default = 8000,
- min=1,
- max=65535)
-
-NetRenderSettings.BoolProperty( attr="master_broadcast",
- name="Broadcast",
- description="broadcast master server address on local network",
- default = True)
-
-NetRenderSettings.BoolProperty( attr="slave_clear",
- name="Clear on exit",
- description="delete downloaded files on exit",
- default = True)
-
-NetRenderSettings.BoolProperty( attr="slave_thumb",
- name="Generate thumbnails",
- description="Generate thumbnails on slaves instead of master",
- default = False)
-
-NetRenderSettings.BoolProperty( attr="master_clear",
- name="Clear on exit",
- description="delete saved files on exit",
- default = False)
-
-default_path = os.environ.get("TEMP")
-
-if not default_path:
- if os.name == 'nt':
- default_path = "c:/tmp/"
- else:
- default_path = "/tmp/"
-elif not default_path.endswith(os.sep):
- default_path += os.sep
-
-NetRenderSettings.StringProperty( attr="path",
- name="Path",
- description="Path for temporary files",
- maxlen = 128,
- default = default_path,
- subtype='FILE_PATH')
-
-NetRenderSettings.StringProperty( attr="job_name",
- name="Job name",
- description="Name of the job",
- maxlen = 128,
- default = "[default]")
-
-NetRenderSettings.StringProperty( attr="job_category",
- name="Job category",
- description="Category of the job",
- maxlen = 128,
- default = "")
-
-NetRenderSettings.IntProperty( attr="chunks",
- name="Chunks",
- description="Number of frame to dispatch to each slave in one chunk",
- default = 5,
- min=1,
- max=65535)
-
-NetRenderSettings.IntProperty( attr="priority",
- name="Priority",
- description="Priority of the job",
- default = 1,
- min=1,
- max=10)
-
-NetRenderSettings.StringProperty( attr="job_id",
- name="Network job id",
- description="id of the last sent render job",
- maxlen = 64,
- default = "")
-
-NetRenderSettings.IntProperty( attr="active_slave_index",
- name="Index of the active slave",
- description="",
- default = -1,
- min= -1,
- max=65535)
-
-NetRenderSettings.IntProperty( attr="active_blacklisted_slave_index",
- name="Index of the active slave",
- description="",
- default = -1,
- min= -1,
- max=65535)
-
-NetRenderSettings.IntProperty( attr="active_job_index",
- name="Index of the active job",
- description="",
- default = -1,
- min= -1,
- max=65535)
-
-NetRenderSettings.EnumProperty(attr="mode",
- items=(
- ("RENDER_CLIENT", "Client", "Act as render client"),
- ("RENDER_MASTER", "Master", "Act as render master"),
- ("RENDER_SLAVE", "Slave", "Act as render slave"),
- ),
- name="Network mode",
- description="Mode of operation of this instance",
- default="RENDER_CLIENT")
-
-NetRenderSettings.CollectionProperty(attr="slaves", type=NetRenderSlave, name="Slaves", description="")
-NetRenderSettings.CollectionProperty(attr="slaves_blacklist", type=NetRenderSlave, name="Slaves Blacklist", description="")
-NetRenderSettings.CollectionProperty(attr="jobs", type=NetRenderJob, name="Job List", description="")
-
-NetRenderSlave.StringProperty( attr="name",
- name="Name of the slave",
- description="",
- maxlen = 64,
- default = "")
-
-NetRenderJob.StringProperty( attr="name",
- name="Name of the job",
- description="",
- maxlen = 128,
- default = "")
+def addProperties():
+ bpy.types.Scene.PointerProperty(attr="network_render", type=NetRenderSettings, name="Network Render", description="Network Render Settings")
+
+ NetRenderSettings.StringProperty( attr="server_address",
+ name="Server address",
+ description="IP or name of the master render server",
+ maxlen = 128,
+ default = "[default]")
+
+ NetRenderSettings.IntProperty( attr="server_port",
+ name="Server port",
+ description="port of the master render server",
+ default = 8000,
+ min=1,
+ max=65535)
+
+ NetRenderSettings.BoolProperty( attr="use_master_broadcast",
+ name="Broadcast",
+ description="broadcast master server address on local network",
+ default = True)
+
+ NetRenderSettings.BoolProperty( attr="use_slave_clear",
+ name="Clear on exit",
+ description="delete downloaded files on exit",
+ default = True)
+
+ NetRenderSettings.BoolProperty( attr="use_slave_thumb",
+ name="Generate thumbnails",
+ description="Generate thumbnails on slaves instead of master",
+ default = False)
+
+ NetRenderSettings.BoolProperty( attr="use_slave_output_log",
+ 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="use_master_clear",
+ name="Clear on exit",
+ description="delete saved files on exit",
+ default = False)
+
+ default_path = os.environ.get("TEMP")
+
+ if not default_path:
+ if os.name == 'nt':
+ default_path = "c:/tmp/"
+ else:
+ default_path = "/tmp/"
+ elif not default_path.endswith(os.sep):
+ default_path += os.sep
+
+ NetRenderSettings.StringProperty( attr="path",
+ name="Path",
+ description="Path for temporary files",
+ maxlen = 128,
+ default = default_path,
+ subtype='FILE_PATH')
+
+ NetRenderSettings.StringProperty( attr="job_name",
+ name="Job name",
+ description="Name of the job",
+ maxlen = 128,
+ default = "[default]")
+
+ NetRenderSettings.StringProperty( attr="job_category",
+ name="Job category",
+ description="Category of the job",
+ maxlen = 128,
+ default = "")
+
+ NetRenderSettings.IntProperty( attr="chunks",
+ name="Chunks",
+ description="Number of frame to dispatch to each slave in one chunk",
+ default = 5,
+ min=1,
+ max=65535)
+
+ NetRenderSettings.IntProperty( attr="priority",
+ name="Priority",
+ description="Priority of the job",
+ default = 1,
+ min=1,
+ max=10)
+
+ NetRenderSettings.StringProperty( attr="job_id",
+ name="Network job id",
+ description="id of the last sent render job",
+ maxlen = 64,
+ default = "")
+
+ NetRenderSettings.IntProperty( attr="active_slave_index",
+ name="Index of the active slave",
+ description="",
+ default = -1,
+ min= -1,
+ max=65535)
+
+ NetRenderSettings.IntProperty( attr="active_blacklisted_slave_index",
+ name="Index of the active slave",
+ description="",
+ default = -1,
+ min= -1,
+ max=65535)
+
+ NetRenderSettings.IntProperty( attr="active_job_index",
+ name="Index of the active job",
+ description="",
+ default = -1,
+ min= -1,
+ max=65535)
+
+ NetRenderSettings.EnumProperty(attr="mode",
+ items=(
+ ("RENDER_CLIENT", "Client", "Act as render client"),
+ ("RENDER_MASTER", "Master", "Act as render master"),
+ ("RENDER_SLAVE", "Slave", "Act as render slave"),
+ ),
+ name="Network mode",
+ description="Mode of operation of this instance",
+ default="RENDER_CLIENT")
+
+ NetRenderSettings.CollectionProperty(attr="slaves", type=NetRenderSlave, name="Slaves", description="")
+ NetRenderSettings.CollectionProperty(attr="slaves_blacklist", type=NetRenderSlave, name="Slaves Blacklist", description="")
+ NetRenderSettings.CollectionProperty(attr="jobs", type=NetRenderJob, name="Job List", description="")
+
+ NetRenderSlave.StringProperty( attr="name",
+ name="Name of the slave",
+ description="",
+ maxlen = 64,
+ default = "")
+
+ NetRenderJob.StringProperty( attr="name",
+ name="Name of the job",
+ description="",
+ maxlen = 128,
+ default = "")
diff --git a/release/scripts/io/netrender/utils.py b/release/scripts/io/netrender/utils.py
index 37787732f09..81617ac0d30 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
@@ -57,9 +57,10 @@ FRAME_STATUS_TEXT = {
ERROR: "Error"
}
-def rnaType(rna_type):
- if bpy: bpy.types.register(rna_type)
- return rna_type
+def responseStatus(conn):
+ response = conn.getresponse()
+ response.read()
+ return response.status
def reporting(report, message, errorType = None):
if errorType:
@@ -154,22 +155,37 @@ 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):
- p, n = os.path.split(full_path)
+ if force or not os.path.exists(full_path):
+ p, n = os.path.split(os.path.normpath(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 = os.path.join(prefix_directory, p[len(prefix_path)+1:]) # +1 to remove separator
+ if not os.path.exists(directory):
+ os.mkdir(directory)
+ else:
+ directory = prefix_directory
+ full_path = os.path.join(directory, n)
else:
- full_path = prefix_directory + n
+ full_path = os.path.join(prefix_directory, n)
else:
- full_path = prefix_directory + file_path
+ full_path = (prefix_directory, file_path)
return full_path
@@ -200,7 +216,7 @@ def thumbnail(filename):
scene = bpy.data.scenes[0] # FIXME, this is dodgy!
scene.render.file_format = "JPEG"
scene.render.file_quality = 90
- bpy.ops.image.open(path = filename)
+ bpy.ops.image.open(filepath=filename)
img = bpy.data.images[imagename]
img.save_render(thumbname, scene=scene)
diff --git a/release/scripts/keyingsets/keyingsets_utils.py b/release/scripts/keyingsets/keyingsets_utils.py
index 4ad6dab798f..901aa715296 100644
--- a/release/scripts/keyingsets/keyingsets_utils.py
+++ b/release/scripts/keyingsets/keyingsets_utils.py
@@ -26,7 +26,7 @@ def RKS_POLL_selected_objects(ksi, context):
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.select_pose_bones):
+ if context.active_pose_bone or len(context.selected_pose_bones):
return True;
# nothing selected
@@ -84,7 +84,7 @@ def get_transform_generators_base_info(data):
grouping = None
else:
# get the path to the ID-block
- path = data.path_to_id()
+ 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
@@ -96,14 +96,14 @@ def get_transform_generators_base_info(data):
# 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)
+ 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)
+ ks.paths.add(id_block, path, group_method='NAMED', group_name=grouping)
else:
ks.paths.add(id_block, path)
@@ -116,14 +116,14 @@ def RKS_GEN_rotation(ksi, context, ks, data):
# rotation mode affects the property used
if data.rotation_mode == 'QUATERNION':
path = path_add_property(base_path, "rotation_quaternion")
- elif data.rotation_mode == 'AXISANGLE':
+ elif data.rotation_mode == 'AXIS_ANGLE':
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)
+ ks.paths.add(id_block, path, group_method='NAMED', group_name=grouping)
else:
ks.paths.add(id_block, path)
@@ -137,7 +137,7 @@ def RKS_GEN_scaling(ksi, context, ks, data):
# add Keying Set entry for this...
if grouping:
- ks.paths.add(id_block, path, grouping_method='NAMED', group_name=grouping)
+ ks.paths.add(id_block, path, group_method='NAMED', group_name=grouping)
else:
ks.paths.add(id_block, path)
@@ -147,15 +147,11 @@ def RKS_GEN_scaling(ksi, context, ks, data):
classes = []
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
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..eaa97512f89
--- /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.Matrix.Translation(mathutils.Vector(operator.properties.location))
+ rotation = mathutils.Euler(operator.properties.rotation).to_matrix().resize4x4()
+ else:
+ # TODO, local view cursor!
+ location = mathutils.Matrix.Translation(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.select = False
+
+ obj_new = bpy.data.objects.new(obdata.name, obdata)
+
+ base = scene.objects.link(obj_new)
+ base.select = 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.select = 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.use_enter_edit_mode:
+ bpy.ops.object.mode_set(mode='EDIT')
+
+ return base
diff --git a/release/scripts/modules/animsys_refactor.py b/release/scripts/modules/animsys_refactor.py
new file mode 100644
index 00000000000..8cc91873b0e
--- /dev/null
+++ b/release/scripts/modules/animsys_refactor.py
@@ -0,0 +1,201 @@
+# ##### 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 has utility functions for renaming
+rna values in fcurves and drivers.
+
+The main function to use is: update_data_paths(...)
+"""
+
+IS_TESTING = False
+
+class DataPathBuilder(object):
+ __slots__ = ("data_path", )
+ """ Dummy class used to parse fcurve and driver data paths.
+ """
+ def __init__(self, attrs):
+ self.data_path = attrs
+
+ def __getattr__(self, attr):
+ str_value = ".%s" % attr
+ return DataPathBuilder(self.data_path + (str_value, ))
+
+ def __getitem__(self, key):
+ str_value = '["%s"]' % key
+ return DataPathBuilder(self.data_path + (str_value, ))
+
+ def resolve(self, real_base, rna_update_from_map=None):
+ """ Return (attribute, value) pairs.
+ """
+ pairs = []
+ base = real_base
+ for item in self.data_path:
+ if base is not Ellipsis:
+ try:
+ # this only works when running with an old blender
+ # where the old path will resolve
+ base = eval("base" + item)
+ except:
+ base_new = Ellipsis
+ # guess the new name
+ if item.startswith("."):
+ for item_new in rna_update_from_map.get(item[1:], ()):
+ try:
+ print("base." + item_new)
+ base_new = eval("base." + item_new)
+ break # found, dont keep looking
+ except:
+ pass
+
+ if base_new is Ellipsis:
+ print("Failed to resolve data path:", self.data_path)
+ base = base_new
+
+ pairs.append((item, base))
+ return pairs
+
+import bpy
+
+
+def id_iter():
+ type_iter = type(bpy.data.objects)
+
+ for attr in dir(bpy.data):
+ data_iter = getattr(bpy.data, attr, None)
+ if type(data_iter) == type_iter:
+ for id_data in data_iter:
+ if id_data.library is None:
+ yield id_data
+
+
+def anim_data_actions(anim_data):
+ actions = []
+ actions.append(anim_data.action)
+ for track in anim_data.nla_tracks:
+ for strip in track.strips:
+ actions.append(strip.action)
+
+ # filter out None
+ return [act for act in actions if act]
+
+
+def classes_recursive(base_type, clss=None):
+ if clss is None:
+ clss = [base_type]
+ else:
+ clss.append(base_type)
+
+ for base_type_iter in base_type.__bases__:
+ if base_type_iter is not object:
+ classes_recursive(base_type_iter, clss)
+
+ return clss
+
+
+def find_path_new(id_data, data_path, rna_update_dict, rna_update_from_map):
+ # ignore ID props for now
+ if data_path.startswith("["):
+ return data_path
+
+ # recursive path fixing, likely will be one in most cases.
+ data_path_builder = eval("DataPathBuilder(tuple())." + data_path)
+ data_resolve = data_path_builder.resolve(id_data, rna_update_from_map)
+
+ path_new = [pair[0] for pair in data_resolve]
+
+ # print(data_resolve)
+ data_base = id_data
+
+ for i, (attr, data) in enumerate(data_resolve):
+ if data is Ellipsis:
+ break
+
+ if attr.startswith("."):
+ # try all classes
+ for data_base_type in classes_recursive(type(data_base)):
+ attr_new = rna_update_dict.get(data_base_type.__name__, {}).get(attr[1:])
+ if attr_new:
+ path_new[i] = "." + attr_new
+
+ # set this as the base for further properties
+ data_base = data
+
+ data_path_new = "".join(path_new)[1:] # skip the first "."
+ return data_path_new
+
+
+def update_data_paths(rna_update):
+ ''' rna_update triple [(class_name, from, to), ...]
+ '''
+
+ # make a faster lookup dict
+ rna_update_dict = {}
+ for ren_class, ren_from, ren_to in rna_update:
+ rna_update_dict.setdefault(ren_class, {})[ren_from] = ren_to
+
+ rna_update_from_map = {}
+ for ren_class, ren_from, ren_to in rna_update:
+ rna_update_from_map.setdefault(ren_from, []).append(ren_to)
+
+ for id_data in id_iter():
+ anim_data = getattr(id_data, "animation_data", None)
+ if anim_data is None:
+ continue
+
+ for fcurve in anim_data.drivers:
+ for var in fcurve.driver.variables:
+ if var.type == 'SINGLE_PROP':
+ for tar in var.targets:
+ id_data_other = tar.id
+ data_path = tar.data_path
+
+ if id_data_other and data_path:
+ data_path_new = find_path_new(id_data_other, data_path, rna_update_dict, rna_update_from_map)
+ # print(data_path_new)
+ if data_path_new != data_path:
+ if not IS_TESTING:
+ tar.data_path = data_path_new
+ print("driver (%s): %s -> %s" % (id_data_other.name, data_path, data_path_new))
+
+
+
+ for action in anim_data_actions(anim_data):
+ for fcu in action.fcurves:
+ data_path = fcu.data_path
+ data_path_new = find_path_new(id_data, data_path, rna_update_dict, rna_update_from_map)
+ # print(data_path_new)
+ if data_path_new != data_path:
+ if not IS_TESTING:
+ fcu.data_path = data_path_new
+ print("fcurve (%s): %s -> %s" % (id_data.name, data_path, data_path_new))
+
+
+if __name__ == "__main__":
+
+ # Example, should be called externally
+ # (class, from, to)
+ replace_ls = [
+ ('AnimVizMotionPaths', 'frame_after', 'frame_after'),
+ ('AnimVizMotionPaths', 'frame_before', 'frame_before'),
+ ('AnimVizOnionSkinning', 'frame_after', 'frame_after'),
+ ]
+
+ update_data_paths(replace_ls)
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 f0025290f09..5b7d5a76336 100644
--- a/release/scripts/modules/bpy/__init__.py
+++ b/release/scripts/modules/bpy/__init__.py
@@ -26,7 +26,7 @@ data = _bpy.data
context = _bpy.context
# python modules
-from bpy import utils
+from bpy import utils, path
from bpy import ops as _ops_module
@@ -43,18 +43,12 @@ 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 :|
-
- if not app.debug:
- _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.TextDoc.bold = lambda self, text: text
+ pydoc.Helper.getline = lambda self, prompt: None
+ pydoc.TextDoc.use_bold = lambda self, text: text
# if "-d" in sys.argv: # Enable this to measure startup speed
diff --git a/release/scripts/modules/bpy/path.py b/release/scripts/modules/bpy/path.py
new file mode 100644
index 00000000000..63149f2fce8
--- /dev/null
+++ b/release/scripts/modules/bpy/path.py
@@ -0,0 +1,174 @@
+# ##### 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 has a similar scope to os.path, containing utility
+functions for dealing with paths in Blender.
+"""
+
+import bpy as _bpy
+import os as _os
+
+def abspath(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.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
+
+
+def clean_name(name, replace="_"):
+ """
+ Returns a name with characters replaced that may cause problems under various circumstances, such as writing to a file.
+ All characters besides A-Z/a-z, 0-9 are replaced with "_"
+ or the replace argument if defined.
+ """
+
+ unclean_chars = \
+ "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\
+ \x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\
+ \x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\
+ \x2e\x2f\x3a\x3b\x3c\x3d\x3e\x3f\x40\x5b\x5c\x5d\x5e\x60\x7b\
+ \x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\
+ \x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\
+ \x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\
+ \xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\
+ \xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\
+ \xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\
+ \xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\
+ \xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\
+ \xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe"
+
+ for ch in unclean_chars:
+ name = name.replace(ch, replace)
+ return name
+
+
+def display_name(name):
+ """
+ Creates a display string from name to be used menus and the user interface.
+ Capitalize the first letter in all lowercase names, mixed case names are kept as is.
+ Intended for use with filenames and module names.
+ """
+
+ name_base = _os.path.splitext(name)[0]
+
+ # string replacements
+ name_base = name_base.replace("_colon_", ":")
+
+ name_base = name_base.replace("_", " ")
+
+ if name_base.islower():
+ return name_base.capitalize()
+ else:
+ return name_base
+
+
+def resolve_ncase(path):
+ """
+ Resolve a case insensitive path on a case sensitive system,
+ returning a string with the path if found else return the original path.
+ """
+
+ import os
+
+ def _ncase_path_found(path):
+ if path=='' or os.path.exists(path):
+ return path, True
+
+ filename = os.path.basename(path) # filename may be a directory or a file
+ dirpath = os.path.dirname(path)
+
+ suffix = ""
+ if not filename: # dir ends with a slash?
+ if len(dirpath) < len(path):
+ suffix = path[:len(path)-len(dirpath)]
+
+ filename = os.path.basename(dirpath)
+ dirpath = os.path.dirname(dirpath)
+
+ if not os.path.exists(dirpath):
+ dirpath, found = _ncase_path_found(dirpath)
+
+ if not found:
+ return path, False
+
+ # at this point, the directory exists but not the file
+
+ # we are expecting 'dirpath' to be a directory, but it could be a file
+ if os.path.isdir(dirpath):
+ files = os.listdir(dirpath)
+ else:
+ return path, False
+
+ filename_low = filename.lower()
+ f_iter_nocase = None
+
+ for f_iter in files:
+ if f_iter.lower() == filename_low:
+ f_iter_nocase = f_iter
+ break
+
+ if f_iter_nocase:
+ return os.path.join(dirpath, f_iter_nocase) + suffix, True
+ else:
+ # cant find the right one, just return the path as is.
+ return path, False
+
+ ncase_path, found = _ncase_path_found(path)
+ return ncase_path if found else path
+
+
+def ensure_ext(filepath, ext, case_sensitive=False):
+ """
+ Return the path with the extension added its its not alredy set.
+
+ :arg ext: The extension to check for.
+ :type ext: string
+ :arg case_sensitive: Check for matching case when comparing extensions.
+ :type case_sensitive: bool
+ """
+ import os
+ fn_base, fn_ext = os.path.splitext(filepath)
+ if fn_base and fn_ext:
+ if (case_sensitive and ext == fn_ext) or (ext.lower() == fn_ext.lower()):
+ return filepath
+ else:
+ return fn_base + ext
+
+ else:
+ return filepath + ext
diff --git a/release/scripts/modules/bpy/utils.py b/release/scripts/modules/bpy/utils.py
index 5b0599fe25f..7cfe476c2e7 100644
--- a/release/scripts/modules/bpy/utils.py
+++ b/release/scripts/modules/bpy/utils.py
@@ -19,7 +19,7 @@
# <pep8 compliant>
"""
-This module contains utility functions spesific to blender but
+This module contains utility functions specific to blender but
not assosiated with blenders internal data.
"""
@@ -27,8 +27,8 @@ import bpy as _bpy
import os as _os
import sys as _sys
-from _bpy import home_paths
-
+from _bpy import blend_paths
+from _bpy import script_paths as _bpy_script_paths
def _test_import(module_name, loaded_modules):
import traceback
@@ -59,7 +59,7 @@ def modules_from_path(path, loaded_modules):
:arg path: this path is scanned for scripts and packages.
:type path: string
- :arg loaded_modules: alredy loaded module names, files matching these names will be ignored.
+ :arg loaded_modules: already loaded module names, files matching these names will be ignored.
:type loaded_modules: set
:return: all loaded modules.
:rtype: list
@@ -83,9 +83,9 @@ def modules_from_path(path, loaded_modules):
modules.append(mod)
return modules
-
-_loaded = [] # store loaded modules for reloading.
-_bpy_types = __import__("bpy_types") # keep for comparisons, never ever reload this.
+
+_global_loaded_modules = [] # store loaded module names for reloading.
+import bpy_types as _bpy_types # keep for comparisons, never ever reload this.
def load_scripts(reload_scripts=False, refresh_scripts=False):
@@ -100,12 +100,39 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
import traceback
import time
+ # must be set back to True on exits
+ _bpy_types._register_immediate = False
+
t_main = time.time()
loaded_modules = set()
if refresh_scripts:
original_modules = _sys.modules.values()
+
+ if reload_scripts:
+ _bpy_types.TypeMap.clear()
+ _bpy_types.PropertiesMap.clear()
+
+ def register_module_call(mod):
+ _bpy_types._register_module(mod.__name__)
+ register = getattr(mod, "register", None)
+ if register:
+ try:
+ register()
+ except:
+ traceback.print_exc()
+ else:
+ print("\nWarning! '%s' has no register function, this is now a requirement for registerable scripts." % mod.__file__)
+
+ def unregister_module_call(mod):
+ _bpy_types._unregister_module(mod.__name__)
+ unregister = getattr(mod, "unregister", None)
+ if unregister:
+ try:
+ unregister()
+ except:
+ traceback.print_exc()
def sys_path_ensure(path):
if path not in _sys.path: # reloading would add twice
@@ -133,63 +160,45 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
mod = test_reload(mod)
if mod:
- register = getattr(mod, "register", None)
- if register:
- try:
- register()
- except:
- traceback.print_exc()
- else:
- print("\nWarning! '%s' has no register function, this is now a requirement for registerable scripts." % mod.__file__)
- _loaded.append(mod)
+ register_module_call(mod)
+ _global_loaded_modules.append(mod.__name__)
if reload_scripts:
- # reload modules that may not be directly included
- for type_class_name in dir(_bpy.types):
- type_class = getattr(_bpy.types, type_class_name)
- module_name = getattr(type_class, "__module__", "")
-
- if module_name and module_name != "bpy.types": # hard coded for C types
- loaded_modules.add(module_name)
- # sorting isnt needed but rather it be pradictable
- for module_name in sorted(loaded_modules):
- print("Reloading:", module_name)
- test_reload(_sys.modules[module_name])
+ # module names -> modules
+ _global_loaded_modules[:] = [_sys.modules[mod_name] for mod_name in _global_loaded_modules]
# loop over and unload all scripts
- _loaded.reverse()
- for mod in _loaded:
- unregister = getattr(mod, "unregister", None)
- if unregister:
- try:
- unregister()
- except:
- traceback.print_exc()
- _loaded[:] = []
-
- for base_path in script_paths(user=False):
- for path_subdir in ("ui", "op", "io", "cfg", "keyingsets"):
- path = _os.path.join(base_path, path_subdir)
- if _os.path.isdir(path):
- sys_path_ensure(path)
+ _global_loaded_modules.reverse()
+ for mod in _global_loaded_modules:
+ unregister_module_call(mod)
- for mod in modules_from_path(path, loaded_modules):
- test_register(mod)
+ for mod in _global_loaded_modules:
+ test_reload(mod)
+
+ _global_loaded_modules[:] = []
user_path = user_script_path()
- if user_path:
- for path_subdir in ("", "ui", "op", "io", "cfg", "keyingsets"):
- path = _os.path.join(user_path, path_subdir)
+
+ 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)
+ # only add this to sys.modules, dont run
+ if path_subdir == "modules":
+ continue
+
+ 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)
# load addons
used_ext = {ext.module for ext in _bpy.context.user_preferences.addons}
- paths = script_paths("addons")
+ paths = script_paths("addons") + script_paths("addons_contrib")
for path in paths:
sys_path_ensure(path)
@@ -202,61 +211,11 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
print("gc.collect() -> %d" % gc.collect())
if _bpy.app.debug:
- print("Time %.4f" % (time.time() - t_main))
-
-
-def expandpath(path):
- if path.startswith("//"):
- return _os.path.join(_os.path.dirname(_bpy.data.filename), path[2:])
-
- return path
-
+ print("Python Script Load Time %.4f" % (time.time() - t_main))
+
+ _bpy_types._register_immediate = True
-_unclean_chars = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, \
- 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, \
- 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 46, 47, 58, 59, 60, 61, 62, 63, \
- 64, 91, 92, 93, 94, 96, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, \
- 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, \
- 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, \
- 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, \
- 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, \
- 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, \
- 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, \
- 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, \
- 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, \
- 245, 246, 247, 248, 249, 250, 251, 252, 253, 254]
-_unclean_chars = ''.join([chr(i) for i in _unclean_chars])
-
-
-def clean_name(name, replace="_"):
- """
- Returns a name with characters replaced that may cause problems under various circumstances, such as writing to a file.
- All characters besides A-Z/a-z, 0-9 are replaced with "_"
- or the replace argument if defined.
- """
- for ch in _unclean_chars:
- name = name.replace(ch, replace)
- return name
-
-
-def display_name(name):
- """
- Creates a display string from name to be used menus and the user interface.
- Capitalize the first letter in all lowercase names, mixed case names are kept as is.
- Intended for use with filenames and module names.
- """
- name_base = _os.path.splitext(name)[0]
-
- # string replacements
- name_base = name_base.replace("_colon_", ":")
-
- name_base = name_base.replace("_", " ")
-
- if name_base.islower():
- return name_base.capitalize()
- else:
- return name_base
# base scripts
@@ -265,7 +224,7 @@ _scripts = (_os.path.normpath(_scripts), )
def user_script_path():
- path = _bpy.context.user_preferences.filepaths.python_scripts_directory
+ path = _bpy.context.user_preferences.filepaths.script_directory
if path:
path = _os.path.normpath(path)
@@ -284,11 +243,11 @@ def script_paths(subdir=None, user=True):
# add user scripts dir
if user:
- user_script_path = _bpy.context.user_preferences.filepaths.python_scripts_directory
+ user_script_path = _bpy.context.user_preferences.filepaths.script_directory
else:
user_script_path = None
- for path in home_paths("scripts") + (user_script_path, ):
+ for path in _bpy_script_paths() + (user_script_path, ):
if path:
path = _os.path.normpath(path)
if path not in scripts and _os.path.isdir(path):
@@ -311,7 +270,55 @@ _presets = _os.path.join(_scripts[0], "presets") # FIXME - multiple paths
def preset_paths(subdir):
'''
- Returns a list of paths for a spesific preset.
+ Returns a list of paths for a specific preset.
'''
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 16fac74b9d0..84d05a7a48d 100644
--- a/release/scripts/modules/bpy_types.py
+++ b/release/scripts/modules/bpy_types.py
@@ -19,7 +19,8 @@
# <pep8 compliant>
from _bpy import types as bpy_types
-from Mathutils import Vector
+import _bpy
+from mathutils import Vector
StructRNA = bpy_types.Struct.__bases__[0]
# StructRNA = bpy_types.Struct
@@ -29,15 +30,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", "grease_pencil", "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 +93,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 +141,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 +282,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
@@ -260,25 +306,30 @@ class Mesh(bpy_types.ID):
Make a mesh from a list of verts/edges/faces
Until we have a nicer way to make geometry, use this.
"""
- self.add_geometry(len(verts), len(edges), len(faces))
+ self.vertices.add(len(verts))
+ self.edges.add(len(edges))
+ self.faces.add(len(faces))
verts_flat = [f for v in verts for f in v]
- self.verts.foreach_set("co", verts_flat)
+ self.vertices.foreach_set("co", verts_flat)
del verts_flat
edges_flat = [i for e in edges for i in e]
- self.edges.foreach_set("verts", edges_flat)
+ self.edges.foreach_set("vertices", edges_flat)
del edges_flat
def treat_face(f):
if len(f) == 3:
- return f[0], f[1], f[2], 0
- elif f[3] == 0:
+ if f[2] == 0:
+ return f[2], f[0], f[1], 0
+ else:
+ return f[0], f[1], f[2], 0
+ elif f[2] == 0 or f[3] == 0:
return f[3], f[0], f[1], f[2]
return f
faces_flat = [v for f in faces for v in treat_face(f)]
- self.faces.foreach_set("verts_raw", faces_flat)
+ self.faces.foreach_set("vertices_raw", faces_flat)
del faces_flat
@property
@@ -303,7 +354,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 +365,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
@@ -326,7 +377,7 @@ class Mesh(bpy_types.ID):
for f in faces:
# if len(f) == 4:
- if f.verts_raw[3] != 0:
+ if f.vertices_raw[3] != 0:
edge_keys = f.edge_keys
for i, edkey in enumerate(f.edge_keys):
edges.setdefault(edkey, []).append(edge_keys[OTHER_INDEX[i]])
@@ -379,13 +430,77 @@ 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.select}
+
+ while edges:
+ current_edge = edges.pop()
+ vert_end, vert_start = current_edge.vertices[:]
+ 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.vertices
+ 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__ = ()
@property
def key(self):
- return ord_ind(*tuple(self.verts))
+ return ord_ind(*tuple(self.vertices))
class MeshFace(StructRNA):
@@ -394,8 +509,8 @@ class MeshFace(StructRNA):
@property
def center(self):
"""The midpoint of the face."""
- face_verts = self.verts[:]
- mesh_verts = self.id_data.verts
+ face_verts = self.vertices[:]
+ mesh_verts = self.id_data.vertices
if len(face_verts) == 3:
return (mesh_verts[face_verts[0]].co + mesh_verts[face_verts[1]].co + mesh_verts[face_verts[2]].co) / 3.0
else:
@@ -403,17 +518,110 @@ class MeshFace(StructRNA):
@property
def edge_keys(self):
- verts = self.verts[:]
+ verts = self.vertices[:]
if len(verts) == 3:
return ord_ind(verts[0], verts[1]), ord_ind(verts[1], verts[2]), ord_ind(verts[2], verts[0])
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.body 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
+TypeMap = {}
+# Properties (IDPropertyGroup) are different from types because they need to be registered
+# before adding sub properties to them, so they are registered on definition
+# and unregistered on unload
+PropertiesMap = {}
+
+# Using our own loading function we set this to false
+# so when running a script directly in the text editor
+# registers moduals instantly.
+_register_immediate = True
+
+def _unregister_module(module, free=True):
+ for t in TypeMap.get(module, ()):
+ try:
+ bpy_types.unregister(t)
+ except:
+ import traceback
+ print("bpy.utils._unregister_module(): Module '%s' failed to unregister class '%s.%s'" % (module, t.__module__, t.__name__))
+ traceback.print_exc()
+
+ if free == True and module in TypeMap:
+ del TypeMap[module]
+
-class OrderedMeta(type):
+ for t in PropertiesMap.get(module, ()):
+ try:
+ bpy_types.unregister(t)
+ except:
+ import traceback
+ print("bpy.utils._unload_module(): Module '%s' failed to unregister class '%s.%s'" % (module, t.__module__, t.__name__))
+ traceback.print_exc()
+
+ if free == True and module in PropertiesMap:
+ del PropertiesMap[module]
+
+
+def _register_module(module):
+ for t in TypeMap.get(module, ()):
+ try:
+ bpy_types.register(t)
+ except:
+ import traceback
+ print("bpy.utils._register_module(): Module '%s' failed to register class '%s.%s'" % (module, t.__module__, t.__name__))
+ traceback.print_exc()
+
+
+class RNAMeta(type):
+ @classmethod
+ def _register_immediate(cls):
+ return _register_immediate
+
+ def __new__(cls, name, bases, classdict, **args):
+ result = type.__new__(cls, name, bases, classdict)
+ if bases and bases[0] != StructRNA:
+ module = result.__module__
+
+ ClassMap = TypeMap
+
+ # Register right away if needed
+ if cls._register_immediate():
+ bpy_types.register(result)
+ ClassMap = PropertiesMap
+
+ # first part of packages only
+ if "." in module:
+ module = module[:module.index(".")]
+
+ ClassMap.setdefault(module, []).append(result)
+
+ return result
+
+class RNAMetaRegister(RNAMeta):
+ @classmethod
+ def _register_immediate(cls):
+ return True
+
+class OrderedMeta(RNAMeta):
def __init__(cls, name, bases, attributes):
super(OrderedMeta, cls).__init__(name, bases, attributes)
@@ -422,7 +630,6 @@ class OrderedMeta(type):
def __prepare__(name, bases, **kwargs):
return collections.OrderedDict()
-
# Only defined so operators members can be used by accessing self.order
class Operator(StructRNA, metaclass=OrderedMeta):
__slots__ = ()
@@ -437,7 +644,12 @@ class Macro(StructRNA, metaclass=OrderedMeta):
def define(self, opname):
from _bpy import ops
return ops.macro_define(self, opname)
+
+class IDPropertyGroup(StructRNA, metaclass=RNAMetaRegister):
+ __slots__ = ()
+class RenderEngine(StructRNA, metaclass=RNAMeta):
+ __slots__ = ()
class _GenericUI:
__slots__ = ()
@@ -479,20 +691,20 @@ class _GenericUI:
pass
-class Panel(StructRNA, _GenericUI):
+class Panel(StructRNA, _GenericUI, metaclass=RNAMeta):
__slots__ = ()
-class Header(StructRNA, _GenericUI):
+class Header(StructRNA, _GenericUI, metaclass=RNAMeta):
__slots__ = ()
-class Menu(StructRNA, _GenericUI):
+class Menu(StructRNA, _GenericUI, metaclass=RNAMeta):
__slots__ = ()
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,22 +713,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
- props = layout.operator(operator, text=bpy.utils.display_name(f))
+ preset_name = bpy.path.display_name(f)
+ props = layout.operator(operator, text=preset_name)
for attr, value in props_default.items():
setattr(props, attr, value)
- props.path = path
+ 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/bpyml.py b/release/scripts/modules/bpyml.py
new file mode 100644
index 00000000000..a2ba9ec8006
--- /dev/null
+++ b/release/scripts/modules/bpyml.py
@@ -0,0 +1,204 @@
+# ##### 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 translates a python like XML representation into XML
+or simple python blender/ui function calls.
+
+ sometag(arg=10) [
+ another()
+ another(key="value")
+ ]
+
+# converts into ...
+
+ <sometag arg="10">
+ <another/>
+ <another key="value" />
+ </sometag>
+
+"""
+
+TAG, ARGS, CHILDREN = range(3)
+class ReturnStore(tuple):
+ def __getitem__(self, key):
+
+ # single item get's
+ if type(key) is ReturnStore:
+ key = (key, )
+
+ if type(key) is tuple:
+ children = self[CHILDREN]
+ if children:
+ raise Exception("Only a single __getitem__ is allowed on the ReturnStore")
+ else:
+ children[:] = key
+ return self
+ else:
+ return tuple.__getitem__(self, key)
+
+
+class FunctionStore(object):
+ def __call__(self, **kwargs):
+ return ReturnStore((self.__class__.__name__, kwargs, []))
+
+
+def tag_vars(tags, module=__name__):
+ return {tag: type(tag, (FunctionStore, ), {"__module__": module})() for tag in tags}
+
+
+def tag_module(mod_name, tags):
+ import sys
+ from types import ModuleType
+ mod = ModuleType(mod_name)
+ sys.modules[mod_name] = mod
+ dict_values = tag_vars(tags, mod_name)
+ mod.__dict__.update(dict_values)
+ return mod
+
+
+def toxml(py_data, indent=" "):
+
+ if len(py_data) != 1 or type(py_data) != list:
+ raise Exception("Expected a list with one member")
+
+ def _to_xml(py_item, xml_node=None):
+ if xml_node is None:
+ xml_node = newdoc.createElement(py_item[TAG])
+
+ for key, value in py_item[ARGS].items():
+ xml_node.setAttribute(key, str(value))
+
+ for py_item_child in py_item[CHILDREN]:
+ xml_node.appendChild(_to_xml(py_item_child))
+
+ return xml_node
+
+ def _to_xml_iter(xml_parent, data_ls):
+ for py_item in data_ls:
+ xml_node = newdoc.createElement(py_item[TAG])
+
+
+ # ok if its empty
+ _to_xml_iter(xml_node, py_item[CHILDREN])
+
+ import xml.dom.minidom
+ impl = xml.dom.minidom.getDOMImplementation()
+ newdoc = impl.createDocument(None, py_data[0][TAG], None)
+
+ _to_xml(py_data[0], newdoc.documentElement)
+
+ return newdoc.documentElement.toprettyxml(indent=" ")
+
+
+def fromxml(data):
+ def _fromxml_kwargs(xml_node):
+ kwargs = {}
+ for key, value in xml_node.attributes.items():
+ kwargs[key] = value
+ return kwargs
+
+
+ def _fromxml(xml_node):
+ py_item = (xml_node.tagName, _fromxml_kwargs(xml_node), [])
+ #_fromxml_iter(py_item, xml_node.childNodes)
+ for xml_node_child in xml_node.childNodes:
+ if xml_node_child.nodeType not in (xml_node_child.TEXT_NODE, xml_node_child.COMMENT_NODE):
+ py_item[CHILDREN].append(_fromxml(xml_node_child))
+ return py_item
+
+ import xml.dom.minidom
+ xml_doc = xml.dom.minidom.parseString(data)
+ return [_fromxml(xml_doc.documentElement)]
+
+
+def topretty_py(py_data, indent=" "):
+
+ if len(py_data) != 1:
+ raise Exception("Expected a list with one member")
+
+ lines = []
+
+ def _to_kwargs(kwargs):
+ return ", ".join([("%s=%s" % (key, repr(value))) for key, value in sorted(kwargs.items())])
+
+ def _topretty(py_item, indent_ctx, last):
+ if py_item[CHILDREN]:
+ lines.append("%s%s(%s) [" % (indent_ctx, py_item[TAG], _to_kwargs(py_item[ARGS])))
+ py_item_last = py_item[CHILDREN][-1]
+ for py_item_child in py_item[CHILDREN]:
+ _topretty(py_item_child, indent_ctx + indent, (py_item_child is py_item_last))
+ lines.append("%s]%s" % (indent_ctx, ("" if last else ",")))
+ else:
+ lines.append("%s%s(%s)%s" % (indent_ctx, py_item[TAG], _to_kwargs(py_item[ARGS]), ("" if last else ",")))
+
+ _topretty(py_data[0], "", True)
+
+ return "\n".join(lines)
+
+if __name__ == "__main__":
+ # testing code.
+
+ tag_module("bpyml_test", ("ui", "prop", "row", "column", "active", "separator", "split"))
+ from bpyml_test import *
+
+ draw = [
+ ui() [
+ split() [
+ column() [
+ prop(data='context.scene.render', property='use_stamp_time', text='Time'),
+ prop(data='context.scene.render', property='use_stamp_date', text='Date'),
+ prop(data='context.scene.render', property='use_stamp_render_time', text='RenderTime'),
+ prop(data='context.scene.render', property='use_stamp_frame', text='Frame'),
+ prop(data='context.scene.render', property='use_stamp_scene', text='Scene'),
+ prop(data='context.scene.render', property='use_stamp_camera', text='Camera'),
+ prop(data='context.scene.render', property='use_stamp_filename', text='Filename'),
+ prop(data='context.scene.render', property='use_stamp_marker', text='Marker'),
+ prop(data='context.scene.render', property='use_stamp_sequencer_strip', text='Seq. Strip')
+ ],
+ column() [
+ active(expr='context.scene.render.use_stamp'),
+ prop(data='context.scene.render', property='stamp_foreground', slider=True),
+ prop(data='context.scene.render', property='stamp_background', slider=True),
+ separator(),
+ prop(data='context.scene.render', property='stamp_font_size', text='Font Size')
+ ]
+ ],
+ split(percentage=0.2) [
+ prop(data='context.scene.render', property='use_stamp_note', text='Note'),
+ row() [
+ active(expr='context.scene.render.use_stamp_note'),
+ prop(data='context.scene.render', property='stamp_note_text', text='')
+ ]
+ ]
+ ]
+ ]
+
+ xml_data = toxml(draw)
+ print(xml_data) # xml version
+
+ py_data = fromxml(xml_data)
+ print(py_data) # converted back to py
+
+ xml_data = toxml(py_data)
+ print(xml_data) # again back to xml
+
+ py_data = fromxml(xml_data) # pretty python version
+ print(topretty_py(py_data))
diff --git a/release/scripts/modules/bpyml_ui.py b/release/scripts/modules/bpyml_ui.py
new file mode 100644
index 00000000000..ad68d1b0d7e
--- /dev/null
+++ b/release/scripts/modules/bpyml_ui.py
@@ -0,0 +1,100 @@
+# ##### 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 as _bpy
+import bpyml
+from bpyml import TAG, ARGS, CHILDREN
+from types import ModuleType
+
+_uilayout_rna = _bpy.types.UILayout.bl_rna
+
+_uilayout_tags = ["ui"] + \
+ _uilayout_rna.properties.keys() + \
+ _uilayout_rna.functions.keys()
+
+# these need to be imported directly
+# >>> from bpyml_ui.locals import *
+locals = bpyml.tag_module("%s.locals" % __name__ , _uilayout_tags)
+
+
+def _parse_rna(prop, value):
+ if prop.type == 'FLOAT':
+ value = float(value)
+ elif prop.type == 'INT':
+ value = int(value)
+ elif prop.type == 'BOOLEAN':
+ if value in (True, False):
+ pass
+ else:
+ if value not in ("True", "False"):
+ raise Exception("invalid bool value: %s" % value)
+ value = bool(value == "True")
+ elif prop.type in ('STRING', 'ENUM'):
+ pass
+ elif prop.type == 'POINTER':
+ value = eval("_bpy." + value)
+ else:
+ raise Exception("type not supported %s.%s" % (prop.identifier, prop.type))
+ return value
+
+
+def _parse_rna_args(base, py_node):
+ rna_params = base.bl_rna.functions[py_node[TAG]].parameters
+ args = {}
+ for key, value in py_node[ARGS].items():
+ args[key] = _parse_rna(rna_params[key], value)
+ return args
+
+
+def _call_recursive(context, base, py_node):
+ prop = base.bl_rna.properties.get(py_node[TAG])
+ if py_node[TAG] in base.bl_rna.properties:
+ value = py_node[ARGS].get("expr")
+ if value:
+ value = eval(value, {"context": _bpy.context})
+ setattr(base, py_node[TAG], value)
+ else:
+ value = py_node[ARGS]['value'] # have to have this
+ setattr(base, name, value)
+ else:
+ args = _parse_rna_args(base, py_node)
+ func_new = getattr(base, py_node[TAG])
+ base_new = func_new(**args) # call blender func
+ if base_new is not None:
+ for py_node_child in py_node[CHILDREN]:
+ _call_recursive(context, base_new, py_node_child)
+
+
+class BPyML_BaseUI():
+ '''
+ This is a mix-in class that defines a draw function
+ which checks for draw_data
+ '''
+
+ def draw(self, context):
+ layout = self.layout
+ for py_node in self.draw_data[CHILDREN]:
+ _call_recursive(context, layout, py_node)
+
+ def draw_header(self, context):
+ layout = self.layout
+ for py_node in self.draw_header_data[CHILDREN]:
+ _call_recursive(context, layout, py_node)
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..2389e1f9020 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
@@ -66,7 +66,7 @@ def graph_armature(obj, path, FAKE_PARENT=True, CONSTRAINTS=True, DRIVERS=True,
print("")
for bone in bones:
b = arm.bones[bone]
- print(">>", bone, ["*>", "->"][b.connected], getattr(getattr(b, "parent", ""), "name", ""))
+ print(">>", bone, ["*>", "->"][b.use_connect], getattr(getattr(b, "parent", ""), "name", ""))
label = [bone]
bone = arm.bones[bone]
@@ -103,7 +103,7 @@ def graph_armature(obj, path, FAKE_PARENT=True, CONSTRAINTS=True, DRIVERS=True,
parent = bone.parent
if parent:
parent_name = parent.name
- connected = bone.connected
+ connected = bone.use_connect
elif FAKE_PARENT:
parent_name = 'Object::%s' % obj.name
connected = False
@@ -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 ee6cc934c1b..98d9bb235a2 100644
--- a/release/scripts/modules/rigify/__init__.py
+++ b/release/scripts/modules/rigify/__init__.py
@@ -19,7 +19,7 @@
# <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
@@ -159,8 +159,8 @@ def generate_rig(context, obj_orig, prefix="ORG-", META_DEF=True):
# Not needed but catches any errors before duplicating
validate_rig(context, obj_orig)
- global_undo = context.user_preferences.edit.global_undo
- context.user_preferences.edit.global_undo = False
+ use_global_undo = context.user_preferences.edit.use_global_undo
+ context.user_preferences.edit.use_global_undo = False
mode_orig = context.mode
rest_backup = obj_orig.data.pose_position
obj_orig.data.pose_position = 'REST'
@@ -191,8 +191,8 @@ def generate_rig(context, obj_orig, prefix="ORG-", META_DEF=True):
obj.animation_data_clear()
# Select generated rig object
- obj_orig.selected = False
- obj.selected = True
+ obj_orig.select = False
+ obj.select = True
scene.objects.active = obj
# Remove all bones from the generated rig armature.
@@ -212,9 +212,9 @@ def generate_rig(context, obj_orig, prefix="ORG-", META_DEF=True):
# Select the temp rigs for merging
for objt in scene.objects:
- objt.selected = False # deselect all objects
- temp_rig_1.selected = True
- temp_rig_2.selected = True
+ objt.select = False # deselect all objects
+ temp_rig_1.select = True
+ temp_rig_2.select = True
scene.objects.active = temp_rig_2
# Merge the temporary rigs
@@ -225,8 +225,8 @@ def generate_rig(context, obj_orig, prefix="ORG-", META_DEF=True):
# Select the generated rig
for objt in scene.objects:
- objt.selected = False # deselect all objects
- obj.selected = True
+ objt.select = False # deselect all objects
+ obj.select = True
scene.objects.active = obj
# Copy over the pose_bone properties
@@ -282,7 +282,7 @@ def generate_rig(context, obj_orig, prefix="ORG-", META_DEF=True):
edit_bone.head = (0.0, 0.0, 0.0)
edit_bone.tail = (0.0, 1.0, 0.0)
edit_bone.roll = 0.0
- edit_bone.layer = ROOT_LAYERS
+ edit_bone.layers = ROOT_LAYERS
bpy.ops.object.mode_set(mode='OBJECT')
# key: bone name
@@ -412,7 +412,7 @@ def generate_rig(context, obj_orig, prefix="ORG-", META_DEF=True):
else:
root_ebone_tmp = root_ebone
- ebone.connected = False
+ ebone.use_connect = False
ebone.parent = root_ebone_tmp
'''
@@ -429,7 +429,7 @@ def generate_rig(context, obj_orig, prefix="ORG-", META_DEF=True):
con.target = obj
con.subtarget = bone_name
- if not pbone.bone.connected:
+ if not pbone.bone.use_connect:
con = pbone.constraints.new('COPY_LOCATION')
con.target = obj
con.subtarget = bone_name
@@ -445,33 +445,33 @@ def generate_rig(context, obj_orig, prefix="ORG-", META_DEF=True):
layer_second_last[30] = True
for bone_name, bone in arm.bones.items():
- bone.deform = False # Non DEF bones shouldn't deform
+ bone.use_deform = False # Non DEF bones shouldn't deform
if bone_name.startswith(ORG_PREFIX):
- bone.layer = ORG_LAYERS
+ bone.layers = ORG_LAYERS
elif bone_name.startswith(MCH_PREFIX): # XXX fixme
- bone.layer = MCH_LAYERS
+ bone.layers = MCH_LAYERS
elif bone_name.startswith(DEF_PREFIX): # XXX fixme
- bone.layer = DEF_LAYERS
- bone.deform = True
+ bone.layers = DEF_LAYERS
+ bone.use_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)
- layer_tot[:] = [max(lay) for lay in zip(layer_tot, bone.layer)]
+ layer_tot[:] = [max(lay) for lay in zip(layer_tot, bone.layers)]
# 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)]
- arm.layer = layer_show
+ arm.layers = layer_show
- # obj.restrict_view = True
- obj.data.draw_axes = False
+ # obj.hide = True
+ obj.data.show_axes = False
bpy.ops.object.mode_set(mode=mode_orig)
obj_orig.data.pose_position = rest_backup
obj.data.pose_position = 'POSE'
obj_orig.data.pose_position = 'POSE'
- context.user_preferences.edit.global_undo = global_undo
+ context.user_preferences.edit.use_global_undo = use_global_undo
print("Done.\n")
@@ -490,8 +490,8 @@ def generate_test(context, metarig_type="", GENERATE_FINAL=True):
scene.objects.link(obj_new)
scene.objects.active = obj_new
for obj in scene.objects:
- obj.selected = False
- obj_new.selected = True
+ obj.select = False
+ obj_new.select = True
for module_name in get_submodule_types():
if (metarig_type and module_name != metarig_type):
@@ -534,10 +534,10 @@ 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)
+ fn = base_name + "-" + bpy.path.clean_name(obj.name)
path_dot = fn + ".dot"
path_png = fn + ".png"
@@ -548,11 +548,11 @@ def generate_test_all(context, GRAPH=False):
i = 0
for obj, obj_new in new_objects:
- obj.data.drawtype = 'STICK'
+ obj.data.draw_type = 'STICK'
obj.location[1] += i
obj_new.location[1] += i
- obj_new.selected = False
- obj.selected = True
+ obj_new.select = False
+ obj.select = True
i += 4
diff --git a/release/scripts/modules/rigify/arm_biped.py b/release/scripts/modules/rigify/arm_biped.py
index 7aa6a37304a..ac878c3c076 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"
@@ -37,24 +37,24 @@ def metarig_template():
bone.head[:] = 0.0000, -0.0425, 0.0000
bone.tail[:] = 0.0942, -0.0075, 0.0333
bone.roll = -0.2227
- bone.connected = False
+ bone.use_connect = False
bone = arm.edit_bones.new('upper_arm')
bone.head[:] = 0.1066, -0.0076, -0.0010
bone.tail[:] = 0.2855, 0.0206, -0.0104
bone.roll = 1.6152
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['shoulder']
bone = arm.edit_bones.new('forearm')
bone.head[:] = 0.2855, 0.0206, -0.0104
bone.tail[:] = 0.4550, -0.0076, -0.0023
bone.roll = 1.5153
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['upper_arm']
bone = arm.edit_bones.new('hand')
bone.head[:] = 0.4550, -0.0076, -0.0023
bone.tail[:] = 0.5423, -0.0146, -0.0131
bone.roll = -3.0083
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['forearm']
bpy.ops.object.mode_set(mode='OBJECT')
@@ -78,7 +78,7 @@ def metarig_definition(obj, orig_bone_name):
hands = []
for pbone in obj.pose.bones:
index = pbone.parent_index(mt.arm_p)
- if index == 2 and pbone.bone.connected and pbone.bone.parent.connected:
+ if index == 2 and pbone.bone.use_connect and pbone.bone.parent.use_connect:
hands.append(pbone)
if len(hands) != 1:
@@ -106,12 +106,12 @@ def ik(obj, definitions, base_names, options):
ik_chain = mt.copy(to_fmt="MCH-%s_ik", base_names=base_names, exclude_attrs=["shoulder"])
# IK needs no parent_index
- ik_chain.hand_e.connected = False
+ ik_chain.hand_e.use_connect = False
ik_chain.hand_e.parent = None
- ik_chain.hand_e.local_location = False
+ ik_chain.hand_e.use_local_location = False
ik_chain.rename("hand", get_base_name(base_names[mt.hand]) + "_ik" + get_side_name(mt.hand))
- ik_chain.arm_e.connected = False
+ ik_chain.arm_e.use_connect = False
ik_chain.arm_e.parent = mt.shoulder_e
# Add the bone used for the arms poll target
@@ -119,7 +119,7 @@ def ik(obj, definitions, base_names, options):
ik.pole = add_pole_target_bone(obj, mt.forearm, "elbow_target" + get_side_name(mt.forearm), mode='ZAVERAGE')
ik.update()
- ik.pole_e.local_location = False
+ ik.pole_e.use_local_location = False
# option: elbow_parent
elbow_parent_name = options.get("elbow_parent", "")
@@ -137,8 +137,8 @@ def ik(obj, definitions, base_names, options):
ik.pole_vis = add_stretch_to(obj, mt.forearm, ik.pole, "VIS-%s_ik" % base_names[mt.forearm])
ik.update()
- ik.hand_vis_e.restrict_select = True
- ik.pole_vis_e.restrict_select = True
+ ik.hand_vis_e.hide_select = True
+ ik.pole_vis_e.hide_select = True
bpy.ops.object.mode_set(mode='OBJECT')
@@ -147,9 +147,9 @@ def ik(obj, definitions, base_names, options):
ik_chain.update()
# Set IK dof
- ik_chain.forearm_p.ik_dof_x = True
- ik_chain.forearm_p.ik_dof_y = False
- ik_chain.forearm_p.ik_dof_z = False
+ ik_chain.forearm_p.lock_ik_x = False
+ ik_chain.forearm_p.lock_ik_y = True
+ ik_chain.forearm_p.lock_ik_z = True
con = ik_chain.forearm_p.constraints.new('IK')
con.target = obj
@@ -161,18 +161,18 @@ def ik(obj, definitions, base_names, options):
con.use_stretch = True
con.use_target = True
con.use_rotation = False
- con.chain_length = 2
+ con.chain_count = 2
con.pole_angle = -pi/2
# last step setup layers
if "ik_layer" in options:
layer = [n==options["ik_layer"] for n in range(0,32)]
else:
- layer = list(mt.arm_b.layer)
- ik_chain.hand_b.layer = layer
- ik.hand_vis_b.layer = layer
- ik.pole_b.layer = layer
- ik.pole_vis_b.layer = layer
+ layer = list(mt.arm_b.layers)
+ ik_chain.hand_b.layers = layer
+ ik.hand_vis_b.layers = layer
+ ik.pole_b.layers = layer
+ ik.pole_vis_b.layers = layer
bpy.ops.object.mode_set(mode='EDIT')
# don't blend the shoulder
@@ -192,12 +192,12 @@ 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])
ex.socket = ex.socket_e.name
- ex.socket_e.connected = False
+ ex.socket_e.use_connect = False
ex.socket_e.parent = mt.shoulder_e
ex.socket_e.length *= 0.5
@@ -206,11 +206,11 @@ def fk(obj, definitions, base_names, options):
ex.hand_delta_e = copy_bone_simple(arm, fk_chain.hand, "MCH-delta_%s" % base_names[mt.hand], parent=True)
ex.hand_delta = ex.hand_delta_e.name
ex.hand_delta_e.length *= 0.5
- ex.hand_delta_e.connected = False
+ ex.hand_delta_e.use_connect = False
if "hand_roll" in options:
ex.hand_delta_e.roll += radians(options["hand_roll"])
- fk_chain.hand_e.connected = False
+ fk_chain.hand_e.use_connect = False
fk_chain.hand_e.parent = ex.hand_delta_e
bpy.ops.object.mode_set(mode='OBJECT')
@@ -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)
@@ -273,10 +273,10 @@ def fk(obj, definitions, base_names, options):
if "fk_layer" in options:
layer = [n==options["fk_layer"] for n in range(0,32)]
else:
- layer = list(mt.arm_b.layer)
- fk_chain.arm_b.layer = layer
- fk_chain.forearm_b.layer = layer
- fk_chain.hand_b.layer = layer
+ layer = list(mt.arm_b.layers)
+ fk_chain.arm_b.layers = layer
+ fk_chain.forearm_b.layers = layer
+ fk_chain.hand_b.layers = layer
# Forearm was getting wrong roll somehow. Hack to fix that.
bpy.ops.object.mode_set(mode='EDIT')
@@ -295,8 +295,8 @@ def deform(obj, definitions, base_names, options):
# Create upper arm bones: two bones, each half of the upper arm.
uarm1 = copy_bone_simple(obj.data, definitions[1], "DEF-%s.01" % base_names[definitions[1]], parent=True)
uarm2 = copy_bone_simple(obj.data, definitions[1], "DEF-%s.02" % base_names[definitions[1]], parent=True)
- uarm1.connected = False
- uarm2.connected = False
+ uarm1.use_connect = False
+ uarm2.use_connect = False
uarm2.parent = uarm1
center = uarm1.center
uarm1.tail = center
@@ -305,8 +305,8 @@ def deform(obj, definitions, base_names, options):
# Create forearm bones: two bones, each half of the forearm.
farm1 = copy_bone_simple(obj.data, definitions[2], "DEF-%s.01" % base_names[definitions[2]], parent=True)
farm2 = copy_bone_simple(obj.data, definitions[2], "DEF-%s.02" % base_names[definitions[2]], parent=True)
- farm1.connected = False
- farm2.connected = False
+ farm1.use_connect = False
+ farm2.use_connect = False
farm2.parent = farm1
center = farm1.center
farm1.tail = center
@@ -314,7 +314,7 @@ def deform(obj, definitions, base_names, options):
# Create twist bone
twist = copy_bone_simple(obj.data, definitions[2], "MCH-arm_twist")
- twist.connected = False
+ twist.use_connect = False
twist.parent = obj.data.edit_bones[definitions[3]]
twist.length /= 2
diff --git a/release/scripts/modules/rigify/copy.py b/release/scripts/modules/rigify/copy.py
index e0bff555a9b..c051e5bb7f6 100644
--- a/release/scripts/modules/rigify/copy.py
+++ b/release/scripts/modules/rigify/copy.py
@@ -33,7 +33,7 @@ def metarig_template():
bone.head[:] = 0.0000, 0.0000, 0.0000
bone.tail[:] = 0.0000, 0.0000, 1.0000
bone.roll = 0.0000
- bone.connected = False
+ bone.use_connect = False
bpy.ops.object.mode_set(mode='OBJECT')
pbone = obj.pose.bones['Bone']
@@ -98,7 +98,7 @@ def control(obj, definitions, base_names, options):
cp.cpy_p.lock_scale = tuple(mt.cpy_p.lock_scale)
# Layers
- cp.cpy_b.layer = list(mt.cpy_b.layer)
+ cp.cpy_b.layers = list(mt.cpy_b.layers)
return (mt.cpy,)
diff --git a/release/scripts/modules/rigify/delta.py b/release/scripts/modules/rigify/delta.py
index dce03b5f412..d0b4fbccce9 100644
--- a/release/scripts/modules/rigify/delta.py
+++ b/release/scripts/modules/rigify/delta.py
@@ -34,18 +34,18 @@ def metarig_template():
bone.head[:] = 0.0000, 0.0000, 0.0000
bone.tail[:] = -0.0000, 0.7382, 0.1895
bone.roll = -0.0000
- bone.connected = False
+ bone.use_connect = False
bone = arm.edit_bones.new('delta')
bone.head[:] = -0.0497, 0.8414, 0.3530
bone.tail[:] = -0.2511, 1.1588, 0.9653
bone.roll = 2.6044
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['bonesker']
bone = arm.edit_bones.new('boney')
bone.head[:] = 0.7940, 2.5592, 0.4134
bone.tail[:] = 0.7940, 3.3975, 0.4890
bone.roll = 3.1416
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['delta']
bpy.ops.object.mode_set(mode='OBJECT')
@@ -67,7 +67,7 @@ def metarig_definition(obj, orig_bone_name):
if len(children) != 1:
raise RigifyError("only 1 child supported for delta on bone '%s'" % delta.name)
- if delta.connected:
+ if delta.use_connect:
raise RigifyError("bone cannot be connected to its parent '%s'" % delta.name)
bone_definition = [delta.name, children[0].name]
diff --git a/release/scripts/modules/rigify/eye_balls.py b/release/scripts/modules/rigify/eye_balls.py
index 8c126151024..f65d56b9f2b 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
@@ -55,7 +134,7 @@ def metarig_template():
bone.head[:] = 0.0000, 0.0000, 0.0000
bone.tail[:] = 0.0000, 0.0000, 1.0000
bone.roll = 0.0000
- bone.connected = False
+ bone.use_connect = False
bpy.ops.object.mode_set(mode='OBJECT')
pbone = obj.pose.bones['Bone']
@@ -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]
@@ -243,22 +328,66 @@ def control(obj, definitions, base_names, options):
con.transform_channel = 'SCALE_X'
con.frame_start = -20
con.frame_end = 20
- con.minimum = 0.0
- con.maximum = 2.0
+ con.min = 0.0
+ con.max = 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)
# Set layers
- #layer = list(bb[definitions[2]].layer)
- #bb[lid1].layer = layer
- #bb[lid2].layer = layer
- #bb[lid3].layer = layer
- #bb[lid4].layer = layer
- #bb[lid5].layer = layer
- #bb[lid6].layer = layer
- #bb[lid7].layer = layer
- #bb[lid8].layer = layer
+ #layer = list(bb[definitions[2]].layers)
+ #bb[lid1].layers = layer
+ #bb[lid2].layers = layer
+ #bb[lid3].layers = layer
+ #bb[lid4].layers = layer
+ #bb[lid5].layers = layer
+ #bb[lid6].layers = layer
+ #bb[lid7].layers = layer
+ #bb[lid8].layers = layer
return (None,)
diff --git a/release/scripts/modules/rigify/eye_lid.py b/release/scripts/modules/rigify/eye_lid.py
index 6eb1ff87d82..3f336e268c6 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
@@ -56,7 +56,7 @@ def metarig_template():
bone.head[:] = 0.0000, 0.0000, 0.0000
bone.tail[:] = 0.0000, 0.0000, 1.0000
bone.roll = 0.0000
- bone.connected = False
+ bone.use_connect = False
bpy.ops.object.mode_set(mode='OBJECT')
pbone = obj.pose.bones['Bone']
@@ -148,10 +148,10 @@ def deform(obj, definitions, base_names, options):
eb[dlid3].parent = eb[dlid4]
eb[dlid33].parent = eb[dlid3]
- eb[dlid2].connected = True
- eb[dlid22].connected = True
- eb[dlid3].connected = True
- eb[dlid33].connected = True
+ eb[dlid2].use_connect = True
+ eb[dlid22].use_connect = True
+ eb[dlid3].use_connect = True
+ eb[dlid33].use_connect = True
eb[dlid1].bbone_segments = 8
eb[dlid2].bbone_segments = 8
@@ -170,10 +170,10 @@ def deform(obj, definitions, base_names, options):
eb[dlid7].parent = eb[dlid8]
eb[dlid77].parent = eb[dlid7]
- eb[dlid6].connected = True
- eb[dlid66].connected = True
- eb[dlid7].connected = True
- eb[dlid77].connected = True
+ eb[dlid6].use_connect = True
+ eb[dlid66].use_connect = True
+ eb[dlid7].use_connect = True
+ eb[dlid77].use_connect = True
eb[dlid5].bbone_segments = 8
eb[dlid6].bbone_segments = 8
@@ -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
@@ -435,10 +436,10 @@ def control(obj, definitions, base_names, options):
con.transform_channel = 'LOCATION_Y'
con.frame_start = -30
con.frame_end = 30
- con.minimum = -distance*2
- con.maximum = distance
+ con.min = -distance*2
+ con.max = 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()
@@ -454,10 +455,10 @@ def control(obj, definitions, base_names, options):
con.transform_channel = 'LOCATION_Y'
con.frame_start = -30
con.frame_end = 30
- con.minimum = -distance*2
- con.maximum = distance
+ con.min = -distance*2
+ con.max = 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()
@@ -472,10 +473,10 @@ def control(obj, definitions, base_names, options):
con.transform_channel = 'LOCATION_Y'
con.frame_start = -30
con.frame_end = 30
- con.minimum = -distance*2
- con.maximum = distance
+ con.min = -distance*2
+ con.max = 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()
@@ -490,10 +491,10 @@ def control(obj, definitions, base_names, options):
con.transform_channel = 'LOCATION_Y'
con.frame_start = -30
con.frame_end = 30
- con.minimum = -distance*2
- con.maximum = distance
+ con.min = -distance*2
+ con.max = 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()
@@ -508,10 +509,10 @@ def control(obj, definitions, base_names, options):
con.transform_channel = 'LOCATION_Y'
con.frame_start = -30
con.frame_end = 30
- con.minimum = -distance*2
- con.maximum = distance
+ con.min = -distance*2
+ con.max = 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()
@@ -527,10 +528,10 @@ def control(obj, definitions, base_names, options):
con.transform_channel = 'LOCATION_Y'
con.frame_start = -30
con.frame_end = 30
- con.minimum = -distance
- con.maximum = distance*2
+ con.min = -distance
+ con.max = 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()
@@ -545,10 +546,10 @@ def control(obj, definitions, base_names, options):
con.transform_channel = 'LOCATION_Y'
con.frame_start = -30
con.frame_end = 30
- con.minimum = -distance
- con.maximum = distance*2
+ con.min = -distance
+ con.max = 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()
@@ -563,10 +564,10 @@ def control(obj, definitions, base_names, options):
con.transform_channel = 'LOCATION_Y'
con.frame_start = -30
con.frame_end = 30
- con.minimum = -distance
- con.maximum = distance*2
+ con.min = -distance
+ con.max = 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()
@@ -581,10 +582,10 @@ def control(obj, definitions, base_names, options):
con.transform_channel = 'LOCATION_Y'
con.frame_start = -30
con.frame_end = 30
- con.minimum = -distance
- con.maximum = distance*2
+ con.min = -distance
+ con.max = 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()
@@ -599,10 +600,10 @@ def control(obj, definitions, base_names, options):
con.transform_channel = 'LOCATION_Y'
con.frame_start = -30
con.frame_end = 30
- con.minimum = -distance
- con.maximum = distance*2
+ con.min = -distance
+ con.max = 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()
@@ -614,15 +615,15 @@ def control(obj, definitions, base_names, options):
# Set layers
- layer = list(bb[definitions[2]].layer)
- bb[lid1].layer = layer
- bb[lid2].layer = layer
- bb[lid3].layer = layer
- bb[lid4].layer = layer
- bb[lid5].layer = layer
- bb[lid6].layer = layer
- bb[lid7].layer = layer
- bb[lid8].layer = layer
+ layer = list(bb[definitions[2]].layers)
+ bb[lid1].layers = layer
+ bb[lid2].layers = layer
+ bb[lid3].layers = layer
+ bb[lid4].layers = layer
+ bb[lid5].layers = layer
+ bb[lid6].layers = layer
+ bb[lid7].layers = layer
+ bb[lid8].layers = layer
return (None,)
@@ -647,7 +648,7 @@ def make_lid_stretch_bone(obj, name, bone1, bone2, roll_alpha):
# Create the bone, pointing from bone1 to bone2
bone_e = copy_bone_simple(obj.data, bone1, name, parent=True)
- bone_e.connected = False
+ bone_e.use_connect = False
bone_e.tail = eb[bone2].head
bone = bone_e.name
diff --git a/release/scripts/modules/rigify/finger_curl.py b/release/scripts/modules/rigify/finger_curl.py
index fcf57f81d3e..947ec75c9f8 100644
--- a/release/scripts/modules/rigify/finger_curl.py
+++ b/release/scripts/modules/rigify/finger_curl.py
@@ -35,18 +35,18 @@ def metarig_template():
bone.head[:] = 0.0000, 0.0000, 0.0000
bone.tail[:] = 0.0353, -0.0184, -0.0053
bone.roll = -2.8722
- bone.connected = False
+ bone.use_connect = False
bone = arm.edit_bones.new('finger.02')
bone.head[:] = 0.0353, -0.0184, -0.0053
bone.tail[:] = 0.0702, -0.0364, -0.0146
bone.roll = -2.7099
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['finger.01']
bone = arm.edit_bones.new('finger.03')
bone.head[:] = 0.0702, -0.0364, -0.0146
bone.tail[:] = 0.0903, -0.0461, -0.0298
bone.roll = -2.1709
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['finger.02']
bpy.ops.object.mode_set(mode='OBJECT')
@@ -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,11 +79,13 @@ 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)
- f1a.connected = False
- f1b.connected = False
+ f1a.use_connect = False
+ f1b.use_connect = False
f1b.parent = f1a
center = f1a.center
f1a.tail = center
@@ -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,35 +177,42 @@ 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].use_connect = eb[org_f1].use_connect
eb[control].parent = eb[org_f1].parent
eb[control].length = tot_len
# 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
- 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].use_connect = False
+ eb[df3].use_connect = False
+ eb[f2].use_connect = False
+ eb[df2].use_connect = False
+ eb[f1].use_connect = False
+ eb[df1].use_connect = eb[org_f1].use_connect
+
+ 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]
@@ -215,10 +220,10 @@ def main(obj, bone_definition, base_names, options):
# Set up bones for hinge
if make_hinge:
- socket = copy_bone_simple(arm, org_f1, "MCH-socket_" + control, parent=True).name
- hinge = copy_bone_simple(arm, eb[org_f1].parent.name, "MCH-hinge_" + control).name
+ socket = copy_bone_simple(arm, org_f1, "MCH-socket_"+control, parent=True).name
+ hinge = copy_bone_simple(arm, eb[org_f1].parent.name, "MCH-hinge_"+control).name
- eb[control].connected = False
+ eb[control].use_connect = False
eb[control].parent = eb[hinge]
# Create the deform rig while we're still in edit mode
@@ -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,23 +348,31 @@ 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
# 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[0]].layer)
- for bone_name in [f1, f2, f3]:
- arm.bones[bone_name].layer = layer
+ layer = list(arm.bones[bone_definition[0]].layers)
+ #for bone_name in [f1, f2, f3]:
+ # arm.bones[bone_name].layers = layer
+ arm.bones[f1].layers = layer
+ arm.bones[f2].layers = layer
+ if three_digits:
+ arm.bones[f3].layers = layer
- layer = list(arm.bones[bone_definition[0]].layer)
- bb[control].layer = layer
+ layer = list(arm.bones[bone_definition[0]].layers)
+ bb[control].layers = 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 0d3fbabba68..d2ddba9f549 100644
--- a/release/scripts/modules/rigify/leg_biped.py
+++ b/release/scripts/modules/rigify/leg_biped.py
@@ -36,36 +36,36 @@ def metarig_template():
bone.head[:] = 0.0000, 0.0000, 0.0000
bone.tail[:] = 0.0000, 0.0000, 0.2506
bone.roll = 0.0000
- bone.connected = False
+ bone.use_connect = False
bone = arm.edit_bones.new('thigh')
bone.head[:] = 0.1253, 0.0000, -0.0000
bone.tail[:] = 0.0752, -0.0251, -0.4260
bone.roll = 0.1171
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['hips']
bone = arm.edit_bones.new('shin')
bone.head[:] = 0.0752, -0.0251, -0.4260
bone.tail[:] = 0.0752, 0.0000, -0.8771
bone.roll = 0.0000
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['thigh']
bone = arm.edit_bones.new('foot')
bone.head[:] = 0.0752, 0.0000, -0.8771
bone.tail[:] = 0.1013, -0.1481, -0.9773
bone.roll = -0.4662
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['shin']
bone = arm.edit_bones.new('toe')
bone.head[:] = 0.1013, -0.1481, -0.9773
bone.tail[:] = 0.1100, -0.2479, -0.9773
bone.roll = 3.1416
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['foot']
bone = arm.edit_bones.new('heel')
bone.head[:] = 0.0652, 0.0501, -1.0024
bone.tail[:] = 0.0927, -0.1002, -1.0024
bone.roll = 0.0000
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['foot']
bpy.ops.object.mode_set(mode='OBJECT')
@@ -109,11 +109,11 @@ def metarig_definition(obj, orig_bone_name):
if len(children) != 2:
raise RigifyError("expected the foot bone:'%s' to have 2 children" % bone.name)
- if children[0].connected == children[1].connected:
+ if children[0].use_connect == children[1].use_connect:
raise RigifyError("expected one bone to be connected")
toe, heel = children
- if heel.connected:
+ if heel.use_connect:
toe, heel = heel, toe
@@ -154,7 +154,7 @@ def ik(obj, bone_definition, base_names, options):
ik.foot_e = copy_bone_simple(arm, mt.heel, base_foot_name + "_ik" + get_side_name(base_names[mt_chain.foot]))
ik.foot = ik.foot_e.name
ik.foot_e.translate(mt_chain.foot_e.head - ik.foot_e.head)
- ik.foot_e.local_location = False
+ ik.foot_e.use_local_location = False
# foot roll: heel pointing backwards, half length
ik.foot_roll_e = copy_bone_simple(arm, mt.heel, base_foot_name + "_roll" + get_side_name(base_names[mt_chain.foot]))
@@ -180,11 +180,11 @@ def ik(obj, bone_definition, base_names, options):
# rename 'MCH-toe' --> to 'toe_ik' and make the child of ik.foot_roll_01
# ------------------ FK or IK?
ik_chain.rename("toe", get_base_name(base_names[mt_chain.toe]) + "_ik" + get_side_name(base_names[mt_chain.toe]))
- ik_chain.toe_e.connected = False
+ ik_chain.toe_e.use_connect = False
ik_chain.toe_e.parent = ik.foot_roll_01_e
# re-parent ik_chain.foot to the
- ik_chain.foot_e.connected = False
+ ik_chain.foot_e.use_connect = False
ik_chain.foot_e.parent = ik.foot_roll_02_e
@@ -198,10 +198,10 @@ def ik(obj, bone_definition, base_names, options):
ik.knee_target_e.translate(offset)
ik.knee_target_e.length *= 0.5
ik.knee_target_e.parent = ik.foot_e
- ik.knee_target_e.local_location = False
+ ik.knee_target_e.use_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')
@@ -211,9 +211,9 @@ def ik(obj, bone_definition, base_names, options):
ik_chain.update()
# Set IK dof
- ik_chain.shin_p.ik_dof_x = True
- ik_chain.shin_p.ik_dof_y = False
- ik_chain.shin_p.ik_dof_z = False
+ ik_chain.shin_p.lock_ik_x = False
+ ik_chain.shin_p.lock_ik_y = True
+ ik_chain.shin_p.lock_ik_z = True
# Set rotation modes and axis locks
ik.foot_roll_p.rotation_mode = 'XYZ'
@@ -225,7 +225,7 @@ def ik(obj, bone_definition, base_names, options):
# IK
con = ik_chain.shin_p.constraints.new('IK')
- con.chain_length = 2
+ con.chain_count = 2
con.iterations = 500
con.pole_angle = -pi / 2.0
con.use_tail = True
@@ -256,22 +256,22 @@ def ik(obj, bone_definition, base_names, options):
con.owner_space = 'LOCAL'
if con_l is cons[-1][-1]:
- con.minimum_x = 0.0
- con.maximum_x = 180.0 # XXX -deg
+ con.min_x = 0.0
+ con.max_x = 180.0 # XXX -deg
else:
- con.minimum_x = -180.0 # XXX -deg
- con.maximum_x = 0.0
+ con.min_x = -180.0 # XXX -deg
+ con.max_x = 0.0
# last step setup layers
if "ik_layer" in options:
layer = [n == options["ik_layer"] for n in range(0, 32)]
else:
- layer = list(mt_chain.thigh_b.layer)
+ layer = list(mt_chain.thigh_b.layers)
for attr in ik_chain.attr_names:
- getattr(ik_chain, attr + "_b").layer = layer
+ getattr(ik_chain, attr + "_b").layers = layer
for attr in ik.attr_names:
- getattr(ik, attr + "_b").layer = layer
+ getattr(ik, attr + "_b").layers = layer
bpy.ops.object.mode_set(mode='EDIT')
@@ -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
@@ -312,11 +312,11 @@ def fk(obj, bone_definition, base_names, options):
foot = foot_e.name
foot_e.translate(mt_chain.foot_e.head - foot_e.head)
foot_e.parent = fk_chain.shin_e
- foot_e.connected = fk_chain.foot_e.connected
- fk_chain.foot_e.connected = False
+ foot_e.use_connect = fk_chain.foot_e.use_connect
+ fk_chain.foot_e.use_connect = False
fk_chain.foot_e.parent = foot_e
- fk_chain.thigh_e.connected = False
+ fk_chain.thigh_e.use_connect = False
fk_chain.thigh_e.parent = ex.thigh_hinge_e
bpy.ops.object.mode_set(mode='OBJECT')
@@ -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'
@@ -370,12 +370,12 @@ def fk(obj, bone_definition, base_names, options):
if "fk_layer" in options:
layer = [n == options["fk_layer"] for n in range(0, 32)]
else:
- layer = list(mt_chain.thigh_b.layer)
+ layer = list(mt_chain.thigh_b.layers)
for attr in fk_chain.attr_names:
- getattr(fk_chain, attr + "_b").layer = layer
+ getattr(fk_chain, attr + "_b").layers = layer
for attr in ex.attr_names:
- getattr(ex, attr + "_b").layer = layer
- arm.bones[foot].layer = layer
+ getattr(ex, attr + "_b").layers = layer
+ arm.bones[foot].layers = layer
bpy.ops.object.mode_set(mode='EDIT')
@@ -390,8 +390,8 @@ def deform(obj, definitions, base_names, options):
# Create upper leg bones: two bones, each half of the upper leg.
uleg1 = copy_bone_simple(obj.data, definitions[1], "DEF-%s.01" % base_names[definitions[1]], parent=True)
uleg2 = copy_bone_simple(obj.data, definitions[1], "DEF-%s.02" % base_names[definitions[1]], parent=True)
- uleg1.connected = False
- uleg2.connected = False
+ uleg1.use_connect = False
+ uleg2.use_connect = False
uleg2.parent = uleg1
center = uleg1.center
uleg1.tail = center
@@ -400,8 +400,8 @@ def deform(obj, definitions, base_names, options):
# Create lower leg bones: two bones, each half of the lower leg.
lleg1 = copy_bone_simple(obj.data, definitions[2], "DEF-%s.01" % base_names[definitions[2]], parent=True)
lleg2 = copy_bone_simple(obj.data, definitions[2], "DEF-%s.02" % base_names[definitions[2]], parent=True)
- lleg1.connected = False
- lleg2.connected = False
+ lleg1.use_connect = False
+ lleg2.use_connect = False
lleg2.parent = lleg1
center = lleg1.center
lleg1.tail = center
@@ -410,7 +410,7 @@ def deform(obj, definitions, base_names, options):
# Create a bone for the second lower leg deform bone to twist with
twist = copy_bone_simple(obj.data, lleg2.name, "MCH-leg_twist")
twist.length /= 4
- twist.connected = False
+ twist.use_connect = False
twist.parent = obj.data.edit_bones[definitions[3]]
# Create foot bone
diff --git a/release/scripts/modules/rigify/leg_quadruped.py b/release/scripts/modules/rigify/leg_quadruped.py
index c21680740bd..739a6402c4b 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"
@@ -37,30 +37,30 @@ def metarig_template():
bone.head[:] = -0.0728, -0.2427, 0.0000
bone.tail[:] = -0.0728, -0.2427, 0.2427
bone.roll = 0.0000
- bone.connected = False
+ bone.use_connect = False
bone = arm.edit_bones.new('thigh')
bone.head[:] = 0.0000, 0.0000, -0.0000
bone.tail[:] = 0.0813, -0.2109, -0.3374
bone.roll = -0.4656
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['body']
bone = arm.edit_bones.new('shin')
bone.head[:] = 0.0813, -0.2109, -0.3374
bone.tail[:] = 0.0714, -0.0043, -0.5830
bone.roll = -0.2024
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['thigh']
bone = arm.edit_bones.new('foot')
bone.head[:] = 0.0714, -0.0043, -0.5830
bone.tail[:] = 0.0929, -0.0484, -0.7652
bone.roll = -0.3766
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['shin']
bone = arm.edit_bones.new('toe')
bone.head[:] = 0.0929, -0.0484, -0.7652
bone.tail[:] = 0.1146, -0.1244, -0.7652
bone.roll = -0.0000
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['foot']
bpy.ops.object.mode_set(mode='OBJECT')
@@ -120,7 +120,7 @@ def ik(obj, bone_definition, base_names, options):
ik_chain = mt_chain.copy(to_fmt="MCH-%s.ik", base_names=base_names)
- ik_chain.thigh_e.connected = False
+ ik_chain.thigh_e.use_connect = False
ik_chain.thigh_e.parent = mt.hips_e
ik_chain.foot_e.parent = None
@@ -128,10 +128,10 @@ def ik(obj, bone_definition, base_names, options):
ik_chain.rename("toe", get_base_name(base_names[bone_definition[4]]) + "_ik" + get_side_name(base_names[bone_definition[4]]))
# keep the foot_ik as the parent
- ik_chain.toe_e.connected = False
+ ik_chain.toe_e.use_connect = False
# Foot uses pose space, not local space, for translation
- ik_chain.foot_e.local_location = False
+ ik_chain.foot_e.use_local_location = False
# must be after disconnecting the toe
ik_chain.foot_e.align_orientation(mt_chain.toe_e)
@@ -141,7 +141,7 @@ def ik(obj, bone_definition, base_names, options):
# knee rotator
knee_rotator = copy_bone_simple(arm, mt_chain.toe, "knee_rotator" + get_side_name(base_names[mt_chain.foot]), parent=True).name
- eb[knee_rotator].connected = False
+ eb[knee_rotator].use_connect = False
eb[knee_rotator].parent = eb[mt.hips]
eb[knee_rotator].head = eb[ik_chain.thigh].head
eb[knee_rotator].tail = eb[knee_rotator].head + eb[mt_chain.toe].vector
@@ -156,11 +156,11 @@ def ik(obj, bone_definition, base_names, options):
# then align it with the foot but reverse direction.
ik.foot_roll_e = copy_bone_simple(arm, mt_chain.toe, get_base_name(base_names[mt_chain.foot]) + "_roll" + get_side_name(base_names[mt_chain.foot]))
ik.foot_roll = ik.foot_roll_e.name
- ik.foot_roll_e.connected = False
+ ik.foot_roll_e.use_connect = False
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])
@@ -175,7 +175,7 @@ def ik(obj, bone_definition, base_names, options):
ik.foot_target_e.parent = ik.foot_roll_01_e
ik.foot_target_e.align_orientation(ik_chain.foot_e)
ik.foot_target_e.length = ik_chain.foot_e.length / 2.0
- ik.foot_target_e.connected = True
+ ik.foot_target_e.use_connect = True
# MCH-foot.02 child of MCH-foot
ik.foot_roll_02_e = copy_bone_simple(arm, mt_chain.foot, "MCH-%s_02" % 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'
@@ -268,7 +268,7 @@ def ik(obj, bone_definition, base_names, options):
# IK
con = ik_chain.shin_p.constraints.new('IK')
- con.chain_length = 2
+ con.chain_count = 2
con.iterations = 500
con.pole_angle = -90.0 # XXX - in deg!
con.use_tail = True
@@ -289,12 +289,12 @@ def ik(obj, bone_definition, base_names, options):
if "ik_layer" in options:
layer = [n==options["ik_layer"] for n in range(0,32)]
else:
- layer = list(mt_chain.thigh_b.layer)
+ layer = list(mt_chain.thigh_b.layers)
for attr in ik_chain.attr_names:
- obj.data.bones[getattr(ik_chain, attr)].layer = layer
+ obj.data.bones[getattr(ik_chain, attr)].layers = layer
for attr in ik.attr_names:
- obj.data.bones[getattr(ik, attr)].layer = layer
- obj.data.bones[knee_rotator].layer = layer
+ obj.data.bones[getattr(ik, attr)].layers = layer
+ obj.data.bones[knee_rotator].layers = layer
return None, ik_chain.thigh, ik_chain.shin, ik_chain.foot, ik_chain.toe
@@ -325,7 +325,7 @@ def fk(obj, bone_definition, base_names, options):
eb[hinge].length = eb[mt.hips].length / 2
# Make leg child of hinge
- eb[fk_chain.thigh].connected = False
+ eb[fk_chain.thigh].use_connect = False
eb[fk_chain.thigh].parent = eb[hinge]
@@ -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'
@@ -396,8 +396,8 @@ def deform(obj, definitions, base_names, options):
# Create upper leg bones: two bones, each half of the upper leg.
uleg1 = copy_bone_simple(obj.data, definitions[1], "DEF-%s.01" % base_names[definitions[1]], parent=True)
uleg2 = copy_bone_simple(obj.data, definitions[1], "DEF-%s.02" % base_names[definitions[1]], parent=True)
- uleg1.connected = False
- uleg2.connected = False
+ uleg1.use_connect = False
+ uleg2.use_connect = False
uleg2.parent = uleg1
center = uleg1.center
uleg1.tail = center
@@ -406,8 +406,8 @@ def deform(obj, definitions, base_names, options):
# Create lower leg bones: two bones, each half of the lower leg.
lleg1 = copy_bone_simple(obj.data, definitions[2], "DEF-%s.01" % base_names[definitions[2]], parent=True)
lleg2 = copy_bone_simple(obj.data, definitions[2], "DEF-%s.02" % base_names[definitions[2]], parent=True)
- lleg1.connected = False
- lleg2.connected = False
+ lleg1.use_connect = False
+ lleg2.use_connect = False
lleg2.parent = lleg1
center = lleg1.center
lleg1.tail = center
@@ -416,7 +416,7 @@ def deform(obj, definitions, base_names, options):
# Create a bone for the second lower leg deform bone to twist with
twist = copy_bone_simple(obj.data, lleg2.name, "MCH-leg_twist")
twist.length /= 4
- twist.connected = False
+ twist.use_connect = False
twist.parent = obj.data.edit_bones[definitions[3]]
# Create foot bone
diff --git a/release/scripts/modules/rigify/mouth.py b/release/scripts/modules/rigify/mouth.py
index 4defd28f56a..ce232b91e7b 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
@@ -93,7 +93,7 @@ def metarig_template():
bone.head[:] = 0.0000, 0.0000, 0.0000
bone.tail[:] = 0.0000, 0.0000, 1.0000
bone.roll = 0.0000
- bone.connected = False
+ bone.use_connect = False
bpy.ops.object.mode_set(mode='OBJECT')
pbone = obj.pose.bones['Bone']
@@ -151,8 +151,8 @@ def deform(obj, definitions, base_names, options):
eb[spread_l_2].tail = eb[definitions[5]].head
eb[spread_l_1].roll = 0
eb[spread_l_2].roll = 0
- eb[spread_l_1].connected = False
- eb[spread_l_2].connected = False
+ eb[spread_l_1].use_connect = False
+ eb[spread_l_2].use_connect = False
eb[spread_l_1].parent = eb[definitions[6]]
eb[spread_l_2].parent = eb[definitions[6]]
@@ -162,8 +162,8 @@ def deform(obj, definitions, base_names, options):
eb[spread_r_2].tail = eb[definitions[3]].head
eb[spread_r_1].roll = 0
eb[spread_r_2].roll = 0
- eb[spread_r_1].connected = False
- eb[spread_r_2].connected = False
+ eb[spread_r_1].use_connect = False
+ eb[spread_r_2].use_connect = False
eb[spread_r_1].parent = eb[definitions[2]]
eb[spread_r_2].parent = eb[definitions[2]]
@@ -171,9 +171,9 @@ def deform(obj, definitions, base_names, options):
# Jaw open bones (for driving corrective shape keys)
jopen1 = copy_bone_simple(obj.data, jaw, "MCH-"+base_names[jaw]+".track1", parent=True).name
- eb[jopen1].connected = False
+ eb[jopen1].use_connect = 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]
@@ -426,8 +426,8 @@ 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].use_connect = False
+ 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
@@ -458,7 +458,7 @@ def control(obj, definitions, base_names, options):
con.target = obj
con.subtarget = jaw
con.head_tail = 1.0
- con.original_length = bb[jopent].length
+ con.rest_length = bb[jopent].length
con.volume = 'NO_VOLUME'
# Head lips to jaw lips
@@ -545,10 +545,10 @@ def control(obj, definitions, base_names, options):
con.transform_channel = 'SCALE_Y'
con.frame_start = 0
con.frame_end = 60
- con.minimum = 0.0
- con.maximum = 1.0
+ con.min = 0.0
+ con.max = 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()
@@ -563,10 +563,10 @@ def control(obj, definitions, base_names, options):
con.transform_channel = 'SCALE_Y'
con.frame_start = 0
con.frame_end = 60
- con.minimum = 0.0
- con.maximum = 1.0
+ con.min = 0.0
+ con.max = 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()
@@ -581,10 +581,10 @@ def control(obj, definitions, base_names, options):
con.transform_channel = 'SCALE_Y'
con.frame_start = 0
con.frame_end = 60
- con.minimum = 0.0
- con.maximum = 1.0
+ con.min = 0.0
+ con.max = 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()
@@ -599,10 +599,10 @@ def control(obj, definitions, base_names, options):
con.transform_channel = 'SCALE_Y'
con.frame_start = 0
con.frame_end = 60
- con.minimum = 0.0
- con.maximum = 1.0
+ con.min = 0.0
+ con.max = 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()
@@ -617,10 +617,10 @@ def control(obj, definitions, base_names, options):
con.transform_channel = 'SCALE_Y'
con.frame_start = 0
con.frame_end = 60
- con.minimum = 0.0
- con.maximum = 1.0
+ con.min = 0.0
+ con.max = 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()
@@ -635,10 +635,10 @@ def control(obj, definitions, base_names, options):
con.transform_channel = 'SCALE_Y'
con.frame_start = 0
con.frame_end = 60
- con.minimum = 0.0
- con.maximum = 1.0
+ con.min = 0.0
+ con.max = 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()
@@ -653,10 +653,10 @@ def control(obj, definitions, base_names, options):
con.transform_channel = 'SCALE_Y'
con.frame_start = 0
con.frame_end = 60
- con.minimum = 0.0
- con.maximum = 1.0
+ con.min = 0.0
+ con.max = 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()
@@ -671,10 +671,10 @@ def control(obj, definitions, base_names, options):
con.transform_channel = 'SCALE_Y'
con.frame_start = 0
con.frame_end = 60
- con.minimum = 0.0
- con.maximum = 1.0
+ con.min = 0.0
+ con.max = 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()
@@ -684,15 +684,15 @@ def control(obj, definitions, base_names, options):
# Set layers
- layer = list(bb[definitions[2]].layer)
- bb[lip1].layer = layer
- bb[lip2].layer = layer
- bb[lip3].layer = layer
- bb[lip4].layer = layer
- bb[lip5].layer = layer
- bb[lip6].layer = layer
- bb[lip7].layer = layer
- bb[lip8].layer = layer
+ layer = list(bb[definitions[2]].layers)
+ bb[lip1].layers = layer
+ bb[lip2].layers = layer
+ bb[lip3].layers = layer
+ bb[lip4].layers = layer
+ bb[lip5].layers = layer
+ bb[lip6].layers = layer
+ bb[lip7].layers = layer
+ bb[lip8].layers = layer
return (None,)
@@ -717,7 +717,7 @@ def make_lip_stretch_bone(obj, name, bone1, bone2, roll_alpha):
# Create the bone, pointing from bone1 to bone2
bone_e = copy_bone_simple(obj.data, bone1, name, parent=True)
- bone_e.connected = False
+ bone_e.use_connect = False
bone_e.tail = eb[bone2].head
bone = bone_e.name
diff --git a/release/scripts/modules/rigify/neck.py b/release/scripts/modules/rigify/neck.py
new file mode 100644
index 00000000000..56717f0ebb0
--- /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.use_connect = 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.use_connect = 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.use_connect = 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.use_connect = 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.use_connect = 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.use_connect = 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.use_connect = 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]].layers)
+ for bone in neck:
+ bb[bone].layers = layer
+
+ layer = list(arm.bones[bone_definition[1]].layers)
+ bb[neck_ctrl].layers = layer
+ bb[head_ctrl].layers = 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 e45d128433a..7daf3d3bb4b 100644
--- a/release/scripts/modules/rigify/neck_flex.py
+++ b/release/scripts/modules/rigify/neck_flex.py
@@ -36,42 +36,42 @@ def metarig_template():
bone.head[:] = 0.0000, -0.0276, -0.1328
bone.tail[:] = 0.0000, -0.0170, -0.0197
bone.roll = 0.0000
- bone.connected = False
+ bone.use_connect = 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.use_connect = 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.use_connect = 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.use_connect = 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.use_connect = 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.use_connect = 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.use_connect = True
bone.parent = arm.edit_bones['neck.04']
bpy.ops.object.mode_set(mode='OBJECT')
@@ -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
@@ -156,7 +156,7 @@ def main(obj, bone_definition, base_names, options):
# 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_e.use_connect = False
ex.head = ex.head_e.name
# offset
head_length = ex.head_e.length
@@ -165,7 +165,7 @@ def main(obj, bone_definition, base_names, options):
# 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_e.use_connect = 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
@@ -173,10 +173,10 @@ def main(obj, bone_definition, base_names, options):
# 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.use_connect = 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
@@ -195,9 +195,9 @@ def main(obj, bone_definition, base_names, options):
neck_e_parent.roll = mt.head_e.roll
orig_parent = neck_e.parent
- neck_e.connected = False
+ neck_e.use_connect = False
neck_e.parent = neck_e_parent
- neck_e_parent.connected = False
+ neck_e_parent.use_connect = False
if i == 0:
neck_e_parent.parent = mt.body_e
@@ -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,15 +254,15 @@ 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
+ fcurve.modifiers.remove(fcurve.modifiers[0]) # grr dont need a modifier
for i in range(len(neck_chain)):
var = driver.variables.new()
@@ -296,12 +296,12 @@ 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"
- fcurve.modifiers.remove(0) # grr dont need a modifier
+ fcurve.modifiers.remove(fcurve.modifiers[0]) # grr dont need a modifier
# add target
@@ -334,14 +334,14 @@ def main(obj, bone_definition, base_names, options):
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)
+ layer = list(arm.bones[bone_definition[1]].layers)
for attr in ex_chain.attr_names:
- getattr(ex_chain, attr + "_b").layer = layer
+ getattr(ex_chain, attr + "_b").layers = layer
for attr in ex.attr_names:
- getattr(ex, attr + "_b").layer = layer
+ getattr(ex, attr + "_b").layers = layer
- layer = list(arm.bones[bone_definition[1]].layer)
- ex.head_ctrl_b.layer = layer
+ layer = list(arm.bones[bone_definition[1]].layers)
+ ex.head_ctrl_b.layers = layer
# no blending the result of this
diff --git a/release/scripts/modules/rigify/palm_curl.py b/release/scripts/modules/rigify/palm_curl.py
index 6626438709d..c063e2b31c9 100644
--- a/release/scripts/modules/rigify/palm_curl.py
+++ b/release/scripts/modules/rigify/palm_curl.py
@@ -35,42 +35,42 @@ def metarig_template():
bone.head[:] = 0.0004, -0.0629, 0.0000
bone.tail[:] = 0.0021, -0.0209, 0.0000
bone.roll = 0.0000
- bone.connected = False
+ bone.use_connect = False
bone = arm.edit_bones.new('palm.03')
bone.head[:] = -0.0000, 0.0000, 0.0000
bone.tail[:] = 0.0025, 0.0644, -0.0065
bone.roll = -3.1396
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['hand']
bone = arm.edit_bones.new('palm.02')
bone.head[:] = 0.0252, -0.0000, 0.0000
bone.tail[:] = 0.0324, 0.0627, -0.0065
bone.roll = -3.1357
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['hand']
bone = arm.edit_bones.new('palm.01')
bone.head[:] = 0.0504, 0.0000, 0.0000
bone.tail[:] = 0.0703, 0.0508, -0.0065
bone.roll = -3.1190
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['hand']
bone = arm.edit_bones.new('palm.04')
bone.head[:] = -0.0252, 0.0000, 0.0000
bone.tail[:] = -0.0286, 0.0606, -0.0065
bone.roll = 3.1386
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['hand']
bone = arm.edit_bones.new('palm.05')
bone.head[:] = -0.0504, 0.0000, 0.0000
bone.tail[:] = -0.0669, 0.0534, -0.0065
bone.roll = 3.1239
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['hand']
bone = arm.edit_bones.new('thumb')
bone.head[:] = 0.0682, -0.0148, 0.0000
bone.tail[:] = 0.1063, 0.0242, -0.0065
bone.roll = -3.0929
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['hand']
bpy.ops.object.mode_set(mode='OBJECT')
@@ -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
@@ -194,7 +194,7 @@ def main(obj, bone_definition, base_names, options):
driver.expression = "(1.0-cos(x))-s"
for fcurve in driver_fcurves:
- fcurve.modifiers.remove(0) # grr dont need a modifier
+ fcurve.modifiers.remove(fcurve.modifiers[0]) # grr dont need a modifier
var = driver.variables.new()
var.name = "x"
@@ -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
@@ -263,7 +263,7 @@ def main(obj, bone_definition, base_names, options):
# last step setup layers
- arm.bones[control_name].layer = list(arm.bones[bone_definition[1]].layer)
+ arm.bones[control_name].layers = list(arm.bones[bone_definition[1]].layers)
# no blending the result of this
diff --git a/release/scripts/modules/rigify/shape_key_control.py b/release/scripts/modules/rigify/shape_key_control.py
index fd0e900a7b5..1bfca60255d 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
@@ -74,7 +74,7 @@ def metarig_template():
#bone.head[:] = 0.0000, 0.0000, 0.0000
#bone.tail[:] = 0.0000, 0.0000, 1.0000
#bone.roll = 0.0000
- #bone.connected = False
+ #bone.use_connect = False
#
#bpy.ops.object.mode_set(mode='OBJECT')
#pbone = obj.pose.bones['Bone']
diff --git a/release/scripts/modules/rigify/shape_key_distance.py b/release/scripts/modules/rigify/shape_key_distance.py
index 68501ac829b..7d69517216f 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
@@ -71,7 +71,7 @@ def metarig_template():
bone.head[:] = 0.0000, 0.0000, 0.0000
bone.tail[:] = 0.0000, 0.0000, 1.0000
bone.roll = 0.0000
- bone.connected = False
+ bone.use_connect = False
bpy.ops.object.mode_set(mode='OBJECT')
pbone = obj.pose.bones['Bone']
diff --git a/release/scripts/modules/rigify/shape_key_rotdiff.py b/release/scripts/modules/rigify/shape_key_rotdiff.py
index 2c30d95e666..dfc3b914a6a 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
@@ -71,7 +71,7 @@ def metarig_template():
bone.head[:] = 0.0000, 0.0000, 0.0000
bone.tail[:] = 0.0000, 0.0000, 1.0000
bone.roll = 0.0000
- bone.connected = False
+ bone.use_connect = False
bpy.ops.object.mode_set(mode='OBJECT')
pbone = obj.pose.bones['Bone']
diff --git a/release/scripts/modules/rigify/spine_pivot_flex.py b/release/scripts/modules/rigify/spine_pivot_flex.py
index 422c632e95a..7782380eedb 100644
--- a/release/scripts/modules/rigify/spine_pivot_flex.py
+++ b/release/scripts/modules/rigify/spine_pivot_flex.py
@@ -36,54 +36,54 @@ def metarig_template():
bone.head[:] = 0.0000, -0.0306, 0.1039
bone.tail[:] = 0.0000, -0.0306, -0.0159
bone.roll = 0.0000
- bone.connected = False
+ bone.use_connect = False
bone = arm.edit_bones.new('rib_cage')
bone.head[:] = 0.0000, -0.0306, 0.1039
bone.tail[:] = 0.0000, -0.0306, 0.2236
bone.roll = -0.0000
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['pelvis']
bone = arm.edit_bones.new('spine.01')
bone.head[:] = 0.0000, 0.0000, -0.0000
bone.tail[:] = 0.0000, -0.0306, 0.1039
bone.roll = -0.0000
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['rib_cage']
bone = arm.edit_bones.new('spine.02')
bone.head[:] = 0.0000, -0.0306, 0.1039
bone.tail[:] = -0.0000, -0.0398, 0.2045
bone.roll = -0.0000
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['spine.01']
bone = arm.edit_bones.new('spine.03')
bone.head[:] = -0.0000, -0.0398, 0.2045
bone.tail[:] = -0.0000, -0.0094, 0.2893
bone.roll = -0.0000
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['spine.02']
bone = arm.edit_bones.new('spine.04')
bone.head[:] = -0.0000, -0.0094, 0.2893
bone.tail[:] = -0.0000, 0.0335, 0.3595
bone.roll = -0.0000
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['spine.03']
bone = arm.edit_bones.new('spine.05')
bone.head[:] = -0.0000, 0.0335, 0.3595
bone.tail[:] = -0.0000, 0.0555, 0.4327
bone.roll = -0.0000
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['spine.04']
bone = arm.edit_bones.new('spine.06')
bone.head[:] = -0.0000, 0.0555, 0.4327
bone.tail[:] = -0.0000, 0.0440, 0.5207
bone.roll = -0.0000
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['spine.05']
bone = arm.edit_bones.new('spine.07')
bone.head[:] = -0.0000, 0.0440, 0.5207
bone.tail[:] = -0.0000, 0.0021, 0.5992
bone.roll = -0.0000
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['spine.06']
bpy.ops.object.mode_set(mode='OBJECT')
@@ -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, Matrix
from math import radians, pi
arm = obj.data
@@ -172,17 +172,17 @@ def main(obj, bone_definition, base_names, options):
ex.pelvis_copy_e = copy_bone_simple(arm, mt.pelvis, base_names[mt.pelvis]) # no parent
ex.pelvis_copy = ex.pelvis_copy_e.name
- ex.pelvis_copy_e.local_location = False
+ ex.pelvis_copy_e.use_local_location = False
# 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.connected = False
+ ex.spine_rotate_e.translate(Vector((0.0, spine_chain_segment_length / 2.0, 0.0)))
+ ex.spine_rotate_e.use_connect = False
ex.spine_rotate_e.parent = ex.pelvis_copy_e
@@ -191,7 +191,7 @@ def main(obj, bone_definition, base_names, options):
ex.ribcage_copy_e = copy_bone_simple(arm, mt.ribcage, base_names[mt.ribcage])
ex.ribcage_copy = ex.ribcage_copy_e.name
- ex.ribcage_copy_e.connected = False
+ ex.ribcage_copy_e.use_connect = False
ex.ribcage_copy_e.parent = ex.ribcage_hinge_e
spine_chain = [child.name for child in spine_chain]
@@ -219,7 +219,7 @@ def main(obj, bone_definition, base_names, options):
ebone = copy_bone_simple(arm, child_name, "MCH-rev_%s" % child_name_orig)
setattr(rv_chain, attr, ebone.name)
- ebone.connected = False
+ ebone.use_connect = False
mt_chain.update()
ex_chain.update()
@@ -230,13 +230,13 @@ def main(obj, bone_definition, base_names, options):
attr = ex_chain.attr_names[i] + "_e"
ebone = getattr(ex_chain, attr)
if i == 0:
- ebone.connected = False
+ ebone.use_connect = False
ebone.parent = ex.pelvis_copy_e
else:
attr_parent = ex_chain.attr_names[i - 1] + "_e"
ebone.parent = getattr(ex_chain, attr_parent)
- # intentional! get the parent from the other paralelle chain member
+ # intentional! get the parent from the other parallel chain member
getattr(rv_chain, attr).parent = ebone
@@ -255,16 +255,16 @@ def main(obj, bone_definition, base_names, options):
spine_e = getattr(ex_chain, ex_chain.attr_names[i] + "_e")
orig_parent = spine_e.parent
- spine_e.connected = False
+ spine_e.use_connect = False
spine_e.parent = spine_e_parent
- spine_e_parent.connected = False
+ spine_e_parent.use_connect = False
spine_e_parent.parent = orig_parent
# Rotate the rev chain 180 about the by the first bones center point
pivot = (rv_chain.spine_01_e.head + rv_chain.spine_01_e.tail) * 0.5
- matrix = RotationMatrix(radians(180), 3, 'X')
+ matrix = Matrix.Rotation(radians(180), 3, 'X')
for i, attr in enumerate(rv_chain.attr_names): # similar to neck
spine_e = getattr(rv_chain, attr + "_e")
# use the first bone as the pivot
@@ -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,13 +347,13 @@ 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
+ fcurve.modifiers.remove(fcurve.modifiers[0]) # grr dont need a modifier
for i in range(spine_chain_len - 1):
var = driver.variables.new()
@@ -385,12 +385,12 @@ 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"
- fcurve.modifiers.remove(0) # grr dont need a modifier
+ fcurve.modifiers.remove(fcurve.modifiers[0]) # grr dont need a modifier
# add target
@@ -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'
@@ -465,17 +465,17 @@ def main(obj, bone_definition, base_names, options):
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)
+ layer = list(arm.bones[bone_definition[1]].layers)
for attr in ex.attr_names:
- getattr(ex, attr + "_b").layer = layer
+ getattr(ex, attr + "_b").layers = layer
for attr in ex_chain.attr_names:
- getattr(ex_chain, attr + "_b").layer = layer
+ getattr(ex_chain, attr + "_b").layers = layer
for attr in rv_chain.attr_names:
- getattr(rv_chain, attr + "_b").layer = layer
+ getattr(rv_chain, attr + "_b").layers = layer
- layer = list(arm.bones[bone_definition[1]].layer)
- arm.bones[ex.pelvis_copy].layer = layer
- arm.bones[ex.ribcage_copy].layer = layer
+ layer = list(arm.bones[bone_definition[1]].layers)
+ arm.bones[ex.pelvis_copy].layers = layer
+ arm.bones[ex.ribcage_copy].layers = layer
# no support for blending chains
return None
diff --git a/release/scripts/modules/rigify/stretch.py b/release/scripts/modules/rigify/stretch.py
index 1c3d317b4b1..6a498e5aa29 100644
--- a/release/scripts/modules/rigify/stretch.py
+++ b/release/scripts/modules/rigify/stretch.py
@@ -35,7 +35,7 @@ RIG_TYPE = "stretch"
# bone.head[:] = 0.0000, 0.0000, 0.0000
# bone.tail[:] = 0.0000, 0.0000, 1.0000
# bone.roll = 0.0000
-# bone.connected = False
+# bone.use_connect = False
#
# bpy.ops.object.mode_set(mode='OBJECT')
# pbone = obj.pose.bones['Bone']
@@ -84,7 +84,7 @@ def main(obj, bone_definition, base_names, options):
mbone2 = "ORG-" + options["to"]
bone_e = copy_bone_simple(obj.data, mbone1, "DEF-%s" % base_names[bone_definition[0]])
- bone_e.connected = False
+ bone_e.use_connect = False
bone_e.parent = eb[mbone1]
bone_e.tail = eb[mbone2].head
bone = bone_e.name
@@ -100,7 +100,7 @@ def main(obj, bone_definition, base_names, options):
con = pb[bone].constraints.new('STRETCH_TO')
con.target = obj
con.subtarget = mbone2
- con.original_length = bb[bone].length
+ con.rest_length = bb[bone].length
if preserve_volume:
con.volume = 'VOLUME_XZX'
else:
diff --git a/release/scripts/modules/rigify/stretch_twist.py b/release/scripts/modules/rigify/stretch_twist.py
index 66719d80d42..07ce031967f 100644
--- a/release/scripts/modules/rigify/stretch_twist.py
+++ b/release/scripts/modules/rigify/stretch_twist.py
@@ -35,7 +35,7 @@ RIG_TYPE = "stretch_twist"
# bone.head[:] = 0.0000, 0.0000, 0.0000
# bone.tail[:] = 0.0000, 0.0000, 1.0000
# bone.roll = 0.0000
-# bone.connected = False
+# bone.use_connect = False
#
# bpy.ops.object.mode_set(mode='OBJECT')
# pbone = obj.pose.bones['Bone']
@@ -86,20 +86,20 @@ def main(obj, bone_definition, base_names, options):
mbone2 = "ORG-" + options["to"]
bone_e = copy_bone_simple(obj.data, mbone1, "MCH-%s" % base_names[bone_definition[0]])
- bone_e.connected = False
+ bone_e.use_connect = False
bone_e.parent = None
bone_e.head = (eb[mbone1].head + eb[mbone2].head) / 2
bone_e.tail = (bone_e.head[0], bone_e.head[1], bone_e.head[2]+0.1)
mid_bone = bone_e.name
bone_e = copy_bone_simple(obj.data, mbone1, "DEF-%s.01" % base_names[bone_definition[0]])
- bone_e.connected = False
+ bone_e.use_connect = False
bone_e.parent = eb[mbone1]
bone_e.tail = eb[mid_bone].head
bone1 = bone_e.name
bone_e = copy_bone_simple(obj.data, mbone2, "DEF-%s.02" % base_names[bone_definition[0]])
- bone_e.connected = False
+ bone_e.use_connect = False
bone_e.parent = eb[mbone2]
bone_e.tail = eb[mid_bone].head
bone2 = bone_e.name
@@ -128,7 +128,7 @@ def main(obj, bone_definition, base_names, options):
con = pb[bone1].constraints.new('STRETCH_TO')
con.target = obj
con.subtarget = mid_bone
- con.original_length = bb[bone1].length
+ con.rest_length = bb[bone1].length
if preserve_volume:
con.volume = 'VOLUME_XZX'
else:
@@ -142,7 +142,7 @@ def main(obj, bone_definition, base_names, options):
con = pb[bone2].constraints.new('STRETCH_TO')
con.target = obj
con.subtarget = mid_bone
- con.original_length = bb[bone2].length
+ con.rest_length = bb[bone2].length
if preserve_volume:
con.volume = 'VOLUME_XZX'
else:
diff --git a/release/scripts/modules/rigify/tail_control.py b/release/scripts/modules/rigify/tail_control.py
index c0addf97a52..50a9bb236da 100644
--- a/release/scripts/modules/rigify/tail_control.py
+++ b/release/scripts/modules/rigify/tail_control.py
@@ -12,7 +12,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.
#
# ##### END GPL LICENSE BLOCK #####
@@ -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, Matrix
from math import radians, pi
# not used, defined for completeness
@@ -40,7 +40,7 @@ def metarig_template():
#bone.head[:] = 0.0000, -0.0306, 0.1039
#bone.tail[:] = 0.0000, -0.0306, -0.0159
#bone.roll = 0.0000
- #bone.connected = False
+ #bone.use_connect = False
#bpy.ops.object.mode_set(mode='OBJECT')
#pbone = obj.pose.bones['tail.01']
@@ -85,9 +85,9 @@ def main(obj, bone_definitions, base_names, options):
for bone_def in bone_definitions:
bone = copy_bone_simple(arm, bone_def, base_names[bone_def], parent=True).name
if i == 1: # Don't change parent of first tail bone
- eb[bone].connected = False
+ eb[bone].use_connect = False
eb[bone].parent = eb[hinge2]
- eb[bone].local_location = False
+ eb[bone].use_local_location = False
i = 1
bones += [bone]
@@ -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()
diff --git a/release/scripts/modules/rigify/tongue.py b/release/scripts/modules/rigify/tongue.py
new file mode 100644
index 00000000000..36c4316adc5
--- /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.use_connect = 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.use_connect = 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.use_connect = 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.use_connect = 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.use_connect = 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.use_connect = 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.use_connect = 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.use_connect = 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.use_connect = 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.use_connect = 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.use_connect = False
+ neck_e.parent = neck_e_parent
+ neck_e_parent.use_connect = 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(fcurve.modifiers[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(fcurve.modifiers[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]].layers)
+ for attr in ex_chain.attr_names:
+ getattr(ex_chain, attr + "_b").layers = layer
+ for attr in ex.attr_names:
+ getattr(ex, attr + "_b").layers = layer
+
+ layer = list(arm.bones[bone_definition[1]].layers)
+ ex.head_ctrl_b.layers = 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 38c2a86ab32..f9c48a3bfcb 100644
--- a/release/scripts/modules/rigify/track_dual.py
+++ b/release/scripts/modules/rigify/track_dual.py
@@ -35,7 +35,7 @@ RIG_TYPE = "track_dual"
# bone.head[:] = 0.0000, 0.0000, 0.0000
# bone.tail[:] = 0.0000, 0.0000, 1.0000
# bone.roll = 0.0000
-# bone.connected = False
+# bone.use_connect = False
#
# bpy.ops.object.mode_set(mode='OBJECT')
# pbone = obj.pose.bones['Bone']
@@ -76,13 +76,13 @@ def main(obj, bone_definition, base_names, options):
mbone2 = "ORG-" + options["to"]
bone_e = copy_bone_simple(obj.data, mbone1, "DEF-%s.01" % base_names[bone_definition[0]])
- bone_e.connected = False
+ bone_e.use_connect = False
bone_e.parent = eb[mbone1]
bone_e.tail = (eb[mbone1].head + eb[mbone2].head) / 2
bone1 = bone_e.name
bone_e = copy_bone_simple(obj.data, mbone2, "DEF-%s.02" % base_names[bone_definition[0]])
- bone_e.connected = False
+ bone_e.use_connect = False
bone_e.parent = eb[mbone1]
bone_e.tail = (eb[mbone1].head + eb[mbone2].head) / 2
bone2 = bone_e.name
diff --git a/release/scripts/modules/rigify/track_reverse.py b/release/scripts/modules/rigify/track_reverse.py
index 21d38c28920..a65ac0e9416 100644
--- a/release/scripts/modules/rigify/track_reverse.py
+++ b/release/scripts/modules/rigify/track_reverse.py
@@ -35,7 +35,7 @@ RIG_TYPE = "track_reverse"
# bone.head[:] = 0.0000, 0.0000, 0.0000
# bone.tail[:] = 0.0000, 0.0000, 1.0000
# bone.roll = 0.0000
-# bone.connected = False
+# bone.use_connect = False
#
# bpy.ops.object.mode_set(mode='OBJECT')
# pbone = obj.pose.bones['Bone']
@@ -78,7 +78,7 @@ def main(obj, bone_definition, base_names, options):
mbone2 = "ORG-" + options["to"]
bone_e = copy_bone_simple(obj.data, mbone2, "DEF-%s.02" % base_names[bone_definition[0]])
- bone_e.connected = False
+ bone_e.use_connect = False
bone_e.parent = eb[mbone1]
bone_e.tail = eb[mbone1].head
bone = bone_e.name
diff --git a/release/scripts/modules/rigify_utils.py b/release/scripts/modules/rigify_utils.py
index 812342b3ebc..1ffe366e0d5 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 = '-._'
@@ -67,7 +67,7 @@ def add_stretch_to(obj, from_name, to_name, name):
con = stretch_pbone.constraints.new('STRETCH_TO')
con.target = obj
con.subtarget = to_name
- con.original_length = (head - tail).length
+ con.rest_length = (head - tail).length
con.keep_axis = 'PLANE_X'
con.volume = 'NO_VOLUME'
@@ -81,13 +81,13 @@ def copy_bone_simple(arm, from_bone, name, parent=False):
ebone_new = arm.edit_bones.new(name)
if parent:
- ebone_new.connected = ebone.connected
+ ebone_new.use_connect = ebone.use_connect
ebone_new.parent = ebone.parent
ebone_new.head = ebone.head
ebone_new.tail = ebone.tail
ebone_new.roll = ebone.roll
- ebone_new.layer = list(ebone.layer)
+ ebone_new.layers = list(ebone.layers)
return ebone_new
@@ -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,10 +154,10 @@ 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
+ fcurve.modifiers.remove(fcurve.modifiers[0]) # grr dont need a modifier
blend_target(driver)
@@ -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:
@@ -276,7 +276,7 @@ def write_meta_rig(obj, func_name="metarig_template"):
code.append(" bone.head[:] = %.4f, %.4f, %.4f" % bone.head.to_tuple(4))
code.append(" bone.tail[:] = %.4f, %.4f, %.4f" % bone.tail.to_tuple(4))
code.append(" bone.roll = %.4f" % bone.roll)
- code.append(" bone.connected = %s" % str(bone.connected))
+ code.append(" bone.use_connect = %s" % str(bone.use_connect))
if bone.parent:
code.append(" bone.parent = arm.edit_bones['%s']" % bone.parent.name)
diff --git a/release/scripts/modules/rna_info.py b/release/scripts/modules/rna_info.py
index 8a93f98815c..0a93121c559 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
@@ -252,6 +302,7 @@ class InfoFunctionRNA:
self.identifier = rna_func.identifier
# self.name = rna_func.name # functions have no name!
self.description = rna_func.description.strip()
+ self.is_classmethod = not rna_func.use_self
self.args = []
self.return_values = ()
@@ -263,7 +314,7 @@ class InfoFunctionRNA:
for rna_prop in rna_func.parameters.values():
prop = GetInfoPropertyRNA(rna_prop, parent_id)
- if rna_prop.use_output:
+ if rna_prop.is_output:
self.return_values.append(prop)
else:
self.args.append(prop)
@@ -366,21 +417,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)
-
- 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):
'''
@@ -426,7 +463,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
@@ -438,12 +476,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
@@ -478,41 +510,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 AttributeError:
- rna_prop_ptr = None
+ rna_prop_ptr = getattr(rna_prop, "fixed_type", None)
# Does this property point to me?
if rna_prop_ptr:
@@ -525,16 +543,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()
@@ -573,11 +581,21 @@ 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)
for op_mod_name in sorted(op_mods):
- if op_mod_name.startswith('__') or op_mod_name in ("add", "remove"):
+ if op_mod_name.startswith('__'):
continue
op_mod = getattr(bpy.ops, op_mod_name)
@@ -603,3 +621,33 @@ 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 = v.identifier # "".join(sid for sid in struct_id if struct_id)
+
+ for base in v.get_bases():
+ struct_id_str = base.identifier + "|" + struct_id_str
+
+ props = [(prop.identifier, prop) for prop in v.properties]
+ for prop_id, prop in sorted(props):
+ # if prop.type == 'boolean':
+ # continue
+ prop_type = prop.type
+ if prop.array_length > 0:
+ prop_type += "[%d]" % prop.array_length
+
+ data.append("%s.%s -> %s: %s%s %s" % (struct_id_str, prop.identifier, prop.identifier, prop_type, ", (read-only)" if prop.is_readonly else "", prop.description))
+ data.sort()
+
+ if bpy.app.background:
+ import sys
+ sys.stderr.write("\n".join(data))
+ sys.stderr.write("\n\nEOF\n")
+ 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..4ee0b40faa8 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:
@@ -124,141 +124,18 @@ def draw(layout, context, context_member, use_edit=True):
assign_props(prop, val_draw, key)
-class PropertyPanel(bpy.types.Panel):
+class PropertyPanel():
"""
The subclass should have its own poll function
and the variable '_context_path' MUST be set.
"""
bl_label = "Custom Properties"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ return bool(eval("context.%s" % cls._context_path))
def draw(self, context):
draw(self.layout, context, self._context_path)
-
-from bpy.props import *
-
-
-rna_path = StringProperty(name="Property Edit",
- description="Property path edit", maxlen=1024, default="", options={'HIDDEN'})
-
-rna_value = StringProperty(name="Property Value",
- description="Property value edit", maxlen=1024, default="")
-
-rna_property = StringProperty(name="Property Name",
- description="Property name edit", maxlen=1024, default="")
-
-rna_min = FloatProperty(name="Min", default=0.0, precision=3)
-rna_max = FloatProperty(name="Max", default=1.0, precision=3)
-
-
-class WM_OT_properties_edit(bpy.types.Operator):
- '''Internal use (edit a property path)'''
- bl_idname = "wm.properties_edit"
- bl_label = "Edit Property"
-
- path = rna_path
- property = rna_property
- value = rna_value
- min = rna_min
- max = rna_max
- description = StringProperty(name="Tip", default="")
-
- def execute(self, context):
- path = self.properties.path
- value = self.properties.value
- prop = self.properties.property
- prop_old = self._last_prop[0]
-
- try:
- value_eval = eval(value)
- except:
- value_eval = value
-
- # First remove
- item = eval("context.%s" % path)
-
- rna_idprop_ui_prop_clear(item, prop_old)
- exec_str = "del item['%s']" % prop_old
- # print(exec_str)
- exec(exec_str)
-
-
- # Reassign
- exec_str = "item['%s'] = %s" % (prop, repr(value_eval))
- # print(exec_str)
- exec(exec_str)
- self._last_prop[:] = [prop]
-
- prop_type = type(item[prop])
-
- prop_ui = rna_idprop_ui_prop_get(item, prop)
-
- if prop_type in (float, int):
-
- prop_ui['soft_min'] = prop_ui['min'] = prop_type(self.properties.min)
- prop_ui['soft_max'] = prop_ui['max'] = prop_type(self.properties.max)
-
- prop_ui['description'] = self.properties.description
-
- return {'FINISHED'}
-
- def invoke(self, context, event):
-
- self._last_prop = [self.properties.property]
-
- item = eval("context.%s" % self.properties.path)
-
- # setup defaults
- prop_ui = rna_idprop_ui_prop_get(item, self.properties.property, False) # dont create
- if prop_ui:
- self.properties.min = prop_ui.get("min", -1000000000)
- self.properties.max = prop_ui.get("max", 1000000000)
- self.properties.description = prop_ui.get("description", "")
-
- wm = context.manager
- # This crashes, TODO - fix
- #return wm.invoke_props_popup(self, event)
-
- wm.invoke_props_popup(self, event)
- return {'RUNNING_MODAL'}
-
-
-class WM_OT_properties_add(bpy.types.Operator):
- '''Internal use (edit a property path)'''
- bl_idname = "wm.properties_add"
- bl_label = "Add Property"
-
- path = rna_path
-
- def execute(self, context):
- item = eval("context.%s" % self.properties.path)
-
- def unique_name(names):
- prop = 'prop'
- prop_new = prop
- i = 1
- while prop_new in names:
- prop_new = prop + str(i)
- i += 1
-
- return prop_new
-
- property = unique_name(item.keys())
-
- item[property] = 1.0
- return {'FINISHED'}
-
-
-class WM_OT_properties_remove(bpy.types.Operator):
- '''Internal use (edit a property path)'''
- bl_idname = "wm.properties_remove"
- bl_label = "Add Property"
-
- path = rna_path
- property = rna_property
-
- def execute(self, context):
- item = eval("context.%s" % self.properties.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 b00b735d16d..e0558e84315 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?
@@ -33,426 +33,426 @@ def metarig_template():
bone.head[:] = -0.0000, -0.0145, 1.1263
bone.tail[:] = -0.0000, -0.0145, 0.9563
bone.roll = 3.1416
- bone.connected = False
+ bone.use_connect = False
bone = arm.edit_bones.new('torso')
bone.head[:] = -0.0000, -0.0145, 1.1263
bone.tail[:] = -0.0000, -0.0145, 1.2863
bone.roll = 3.1416
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['pelvis']
bone = arm.edit_bones.new('spine.01')
bone.head[:] = 0.0000, 0.0394, 0.9688
bone.tail[:] = -0.0000, -0.0145, 1.1263
bone.roll = 0.0000
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['torso']
bone = arm.edit_bones.new('spine.02')
bone.head[:] = -0.0000, -0.0145, 1.1263
bone.tail[:] = -0.0000, -0.0213, 1.2884
bone.roll = -0.0000
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['spine.01']
bone = arm.edit_bones.new('thigh.L')
bone.head[:] = 0.0933, -0.0421, 1.0434
bone.tail[:] = 0.0933, -0.0516, 0.5848
bone.roll = 0.0000
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['spine.01']
bone = arm.edit_bones.new('thigh.R')
bone.head[:] = -0.0933, -0.0421, 1.0434
bone.tail[:] = -0.0933, -0.0516, 0.5848
bone.roll = -0.0000
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['spine.01']
bone = arm.edit_bones.new('spine.03')
bone.head[:] = -0.0000, -0.0213, 1.2884
bone.tail[:] = -0.0000, 0.0160, 1.3705
bone.roll = -0.0000
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['spine.02']
bone = arm.edit_bones.new('shin.L')
bone.head[:] = 0.0933, -0.0516, 0.5848
bone.tail[:] = 0.0915, 0.0100, 0.1374
bone.roll = 0.0034
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['thigh.L']
bone = arm.edit_bones.new('shin.R')
bone.head[:] = -0.0933, -0.0516, 0.5848
bone.tail[:] = -0.0915, 0.0100, 0.1374
bone.roll = -0.0034
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['thigh.R']
bone = arm.edit_bones.new('spine.04')
bone.head[:] = -0.0000, 0.0160, 1.3705
bone.tail[:] = -0.0000, 0.0590, 1.4497
bone.roll = -0.0000
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['spine.03']
bone = arm.edit_bones.new('foot.L')
bone.head[:] = 0.0915, 0.0100, 0.1374
bone.tail[:] = 0.1033, -0.0968, 0.0510
bone.roll = 2.8964
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['shin.L']
bone = arm.edit_bones.new('foot.R')
bone.head[:] = -0.0915, 0.0100, 0.1374
bone.tail[:] = -0.1033, -0.0968, 0.0510
bone.roll = -2.8793
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['shin.R']
bone = arm.edit_bones.new('neck_base')
bone.head[:] = -0.0000, 0.0590, 1.4497
bone.tail[:] = -0.0000, 0.0401, 1.5389
bone.roll = -0.0000
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['spine.04']
bone = arm.edit_bones.new('toe.L')
bone.head[:] = 0.1033, -0.0968, 0.0510
bone.tail[:] = 0.1136, -0.1848, 0.0510
bone.roll = 0.0001
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['foot.L']
bone = arm.edit_bones.new('heel.L')
bone.head[:] = 0.0809, 0.0969, -0.0000
bone.tail[:] = 0.1020, -0.0846, -0.0000
bone.roll = -0.0001
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['foot.L']
bone = arm.edit_bones.new('toe.R')
bone.head[:] = -0.1033, -0.0968, 0.0510
bone.tail[:] = -0.1136, -0.1848, 0.0510
bone.roll = -0.0002
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['foot.R']
bone = arm.edit_bones.new('heel.R')
bone.head[:] = -0.0809, 0.0969, -0.0000
bone.tail[:] = -0.1020, -0.0846, -0.0000
bone.roll = -0.0000
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['foot.R']
bone = arm.edit_bones.new('head')
bone.head[:] = -0.0000, 0.0401, 1.5389
bone.tail[:] = -0.0000, 0.0401, 1.5979
bone.roll = 3.1416
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['neck_base']
bone = arm.edit_bones.new('DLT-shoulder.L')
bone.head[:] = 0.0141, -0.0346, 1.4991
bone.tail[:] = 0.1226, 0.0054, 1.4991
bone.roll = 0.0005
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['neck_base']
bone = arm.edit_bones.new('DLT-shoulder.R')
bone.head[:] = -0.0141, -0.0346, 1.4991
bone.tail[:] = -0.1226, 0.0054, 1.4991
bone.roll = -0.0005
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['neck_base']
bone = arm.edit_bones.new('neck.01')
bone.head[:] = -0.0000, 0.0401, 1.5389
bone.tail[:] = -0.0000, 0.0176, 1.5916
bone.roll = 0.0000
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['head']
bone = arm.edit_bones.new('shoulder.L')
bone.head[:] = 0.0141, -0.0346, 1.4991
bone.tail[:] = 0.1226, 0.0216, 1.5270
bone.roll = -0.1225
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['DLT-shoulder.L']
bone = arm.edit_bones.new('shoulder.R')
bone.head[:] = -0.0141, -0.0346, 1.4991
bone.tail[:] = -0.1226, 0.0216, 1.5270
bone.roll = 0.0849
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['DLT-shoulder.R']
bone = arm.edit_bones.new('neck.02')
bone.head[:] = -0.0000, 0.0176, 1.5916
bone.tail[:] = -0.0000, 0.0001, 1.6499
bone.roll = 0.0000
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['neck.01']
bone = arm.edit_bones.new('DLT-upper_arm.L')
bone.head[:] = 0.1482, 0.0483, 1.4943
bone.tail[:] = 0.2586, 0.1057, 1.5124
bone.roll = 1.4969
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['shoulder.L']
bone = arm.edit_bones.new('DLT-upper_arm.R')
bone.head[:] = -0.1482, 0.0483, 1.4943
bone.tail[:] = -0.2586, 0.1057, 1.5124
bone.roll = -1.4482
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['shoulder.R']
bone = arm.edit_bones.new('neck.03')
bone.head[:] = -0.0000, 0.0001, 1.6499
bone.tail[:] = -0.0000, 0.0001, 1.8522
bone.roll = 0.0000
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['neck.02']
bone = arm.edit_bones.new('upper_arm.L')
bone.head[:] = 0.1482, 0.0483, 1.4943
bone.tail[:] = 0.3929, 0.0522, 1.4801
bone.roll = 1.6281
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['DLT-upper_arm.L']
bone = arm.edit_bones.new('upper_arm.R')
bone.head[:] = -0.1482, 0.0483, 1.4943
bone.tail[:] = -0.3929, 0.0522, 1.4801
bone.roll = -1.6281
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['DLT-upper_arm.R']
bone = arm.edit_bones.new('forearm.L')
bone.head[:] = 0.3929, 0.0522, 1.4801
bone.tail[:] = 0.6198, 0.0364, 1.4906
bone.roll = 1.5240
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['upper_arm.L']
bone = arm.edit_bones.new('forearm.R')
bone.head[:] = -0.3929, 0.0522, 1.4801
bone.tail[:] = -0.6198, 0.0364, 1.4906
bone.roll = -1.5219
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['upper_arm.R']
bone = arm.edit_bones.new('hand.L')
bone.head[:] = 0.6198, 0.0364, 1.4906
bone.tail[:] = 0.6592, 0.0364, 1.4853
bone.roll = -3.0065
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['forearm.L']
bone = arm.edit_bones.new('hand.R')
bone.head[:] = -0.6198, 0.0364, 1.4906
bone.tail[:] = -0.6592, 0.0364, 1.4853
bone.roll = 3.0065
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['forearm.R']
bone = arm.edit_bones.new('palm.04.L')
bone.head[:] = 0.6514, 0.0658, 1.4906
bone.tail[:] = 0.7287, 0.0810, 1.4747
bone.roll = -3.0715
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['hand.L']
bone = arm.edit_bones.new('palm.03.L')
bone.head[:] = 0.6533, 0.0481, 1.4943
bone.tail[:] = 0.7386, 0.0553, 1.4781
bone.roll = -3.0290
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['hand.L']
bone = arm.edit_bones.new('palm.02.L')
bone.head[:] = 0.6539, 0.0305, 1.4967
bone.tail[:] = 0.7420, 0.0250, 1.4835
bone.roll = -3.0669
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['hand.L']
bone = arm.edit_bones.new('palm.01.L')
bone.head[:] = 0.6514, 0.0116, 1.4961
bone.tail[:] = 0.7361, -0.0074, 1.4823
bone.roll = -2.9422
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['hand.L']
bone = arm.edit_bones.new('thumb.01.L')
bone.head[:] = 0.6380, -0.0005, 1.4848
bone.tail[:] = 0.6757, -0.0408, 1.4538
bone.roll = -0.7041
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['hand.L']
bone = arm.edit_bones.new('palm.04.R')
bone.head[:] = -0.6514, 0.0658, 1.4906
bone.tail[:] = -0.7287, 0.0810, 1.4747
bone.roll = 3.0715
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['hand.R']
bone = arm.edit_bones.new('palm.03.R')
bone.head[:] = -0.6533, 0.0481, 1.4943
bone.tail[:] = -0.7386, 0.0553, 1.4781
bone.roll = 3.0290
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['hand.R']
bone = arm.edit_bones.new('palm.02.R')
bone.head[:] = -0.6539, 0.0305, 1.4967
bone.tail[:] = -0.7420, 0.0250, 1.4835
bone.roll = 3.0669
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['hand.R']
bone = arm.edit_bones.new('thumb.01.R')
bone.head[:] = -0.6380, -0.0005, 1.4848
bone.tail[:] = -0.6757, -0.0408, 1.4538
bone.roll = 0.7041
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['hand.R']
bone = arm.edit_bones.new('palm.01.R')
bone.head[:] = -0.6514, 0.0116, 1.4961
bone.tail[:] = -0.7361, -0.0074, 1.4823
bone.roll = 2.9332
- bone.connected = False
+ bone.use_connect = False
bone.parent = arm.edit_bones['hand.R']
bone = arm.edit_bones.new('finger_pinky.01.L')
bone.head[:] = 0.7287, 0.0810, 1.4747
bone.tail[:] = 0.7698, 0.0947, 1.4635
bone.roll = -3.0949
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['palm.04.L']
bone = arm.edit_bones.new('finger_ring.01.L')
bone.head[:] = 0.7386, 0.0553, 1.4781
bone.tail[:] = 0.7890, 0.0615, 1.4667
bone.roll = -3.0081
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['palm.03.L']
bone = arm.edit_bones.new('finger_middle.01.L')
bone.head[:] = 0.7420, 0.0250, 1.4835
bone.tail[:] = 0.7975, 0.0221, 1.4712
bone.roll = -2.9982
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['palm.02.L']
bone = arm.edit_bones.new('finger_index.01.L')
bone.head[:] = 0.7361, -0.0074, 1.4823
bone.tail[:] = 0.7843, -0.0204, 1.4718
bone.roll = -3.0021
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['palm.01.L']
bone = arm.edit_bones.new('thumb.02.L')
bone.head[:] = 0.6757, -0.0408, 1.4538
bone.tail[:] = 0.6958, -0.0568, 1.4376
bone.roll = -0.6963
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['thumb.01.L']
bone = arm.edit_bones.new('finger_pinky.01.R')
bone.head[:] = -0.7287, 0.0810, 1.4747
bone.tail[:] = -0.7698, 0.0947, 1.4635
bone.roll = 3.0949
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['palm.04.R']
bone = arm.edit_bones.new('finger_ring.01.R')
bone.head[:] = -0.7386, 0.0553, 1.4781
bone.tail[:] = -0.7890, 0.0615, 1.4667
bone.roll = 2.9892
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['palm.03.R']
bone = arm.edit_bones.new('finger_middle.01.R')
bone.head[:] = -0.7420, 0.0250, 1.4835
bone.tail[:] = -0.7975, 0.0221, 1.4712
bone.roll = 2.9816
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['palm.02.R']
bone = arm.edit_bones.new('thumb.02.R')
bone.head[:] = -0.6757, -0.0408, 1.4538
bone.tail[:] = -0.6958, -0.0568, 1.4376
bone.roll = 0.6963
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['thumb.01.R']
bone = arm.edit_bones.new('finger_index.01.R')
bone.head[:] = -0.7361, -0.0074, 1.4823
bone.tail[:] = -0.7843, -0.0204, 1.4718
bone.roll = 2.9498
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['palm.01.R']
bone = arm.edit_bones.new('finger_pinky.02.L')
bone.head[:] = 0.7698, 0.0947, 1.4635
bone.tail[:] = 0.7910, 0.1018, 1.4577
bone.roll = -3.0949
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['finger_pinky.01.L']
bone = arm.edit_bones.new('finger_ring.02.L')
bone.head[:] = 0.7890, 0.0615, 1.4667
bone.tail[:] = 0.8177, 0.0650, 1.4600
bone.roll = -3.0006
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['finger_ring.01.L']
bone = arm.edit_bones.new('finger_middle.02.L')
bone.head[:] = 0.7975, 0.0221, 1.4712
bone.tail[:] = 0.8289, 0.0206, 1.4643
bone.roll = -2.9995
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['finger_middle.01.L']
bone = arm.edit_bones.new('finger_index.02.L')
bone.head[:] = 0.7843, -0.0204, 1.4718
bone.tail[:] = 0.8117, -0.0275, 1.4660
bone.roll = -3.0064
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['finger_index.01.L']
bone = arm.edit_bones.new('thumb.03.L')
bone.head[:] = 0.6958, -0.0568, 1.4376
bone.tail[:] = 0.7196, -0.0671, 1.4210
bone.roll = -0.8072
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['thumb.02.L']
bone = arm.edit_bones.new('finger_pinky.02.R')
bone.head[:] = -0.7698, 0.0947, 1.4635
bone.tail[:] = -0.7910, 0.1018, 1.4577
bone.roll = 3.0949
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['finger_pinky.01.R']
bone = arm.edit_bones.new('finger_ring.02.R')
bone.head[:] = -0.7890, 0.0615, 1.4667
bone.tail[:] = -0.8177, 0.0650, 1.4600
bone.roll = 3.0341
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['finger_ring.01.R']
bone = arm.edit_bones.new('finger_middle.02.R')
bone.head[:] = -0.7975, 0.0221, 1.4712
bone.tail[:] = -0.8289, 0.0206, 1.4643
bone.roll = 3.0291
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['finger_middle.01.R']
bone = arm.edit_bones.new('thumb.03.R')
bone.head[:] = -0.6958, -0.0568, 1.4376
bone.tail[:] = -0.7196, -0.0671, 1.4210
bone.roll = 0.8072
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['thumb.02.R']
bone = arm.edit_bones.new('finger_index.02.R')
bone.head[:] = -0.7843, -0.0204, 1.4718
bone.tail[:] = -0.8117, -0.0275, 1.4660
bone.roll = 3.0705
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['finger_index.01.R']
bone = arm.edit_bones.new('finger_pinky.03.L')
bone.head[:] = 0.7910, 0.1018, 1.4577
bone.tail[:] = 0.8109, 0.1085, 1.4523
bone.roll = -3.0949
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['finger_pinky.02.L']
bone = arm.edit_bones.new('finger_ring.03.L')
bone.head[:] = 0.8177, 0.0650, 1.4600
bone.tail[:] = 0.8396, 0.0677, 1.4544
bone.roll = -2.9819
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['finger_ring.02.L']
bone = arm.edit_bones.new('finger_middle.03.L')
bone.head[:] = 0.8289, 0.0206, 1.4643
bone.tail[:] = 0.8534, 0.0193, 1.4589
bone.roll = -3.0004
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['finger_middle.02.L']
bone = arm.edit_bones.new('finger_index.03.L')
bone.head[:] = 0.8117, -0.0275, 1.4660
bone.tail[:] = 0.8331, -0.0333, 1.4615
bone.roll = -3.0103
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['finger_index.02.L']
bone = arm.edit_bones.new('finger_pinky.03.R')
bone.head[:] = -0.7910, 0.1018, 1.4577
bone.tail[:] = -0.8109, 0.1085, 1.4523
bone.roll = 3.0949
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['finger_pinky.02.R']
bone = arm.edit_bones.new('finger_ring.03.R')
bone.head[:] = -0.8177, 0.0650, 1.4600
bone.tail[:] = -0.8396, 0.0677, 1.4544
bone.roll = 2.9819
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['finger_ring.02.R']
bone = arm.edit_bones.new('finger_middle.03.R')
bone.head[:] = -0.8289, 0.0206, 1.4643
bone.tail[:] = -0.8534, 0.0193, 1.4589
bone.roll = 3.0004
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['finger_middle.02.R']
bone = arm.edit_bones.new('finger_index.03.R')
bone.head[:] = -0.8117, -0.0275, 1.4660
bone.tail[:] = -0.8331, -0.0333, 1.4615
bone.roll = 2.9917
- bone.connected = True
+ bone.use_connect = True
bone.parent = arm.edit_bones['finger_index.02.R']
bpy.ops.object.mode_set(mode='OBJECT')
@@ -487,11 +487,11 @@ def metarig_template():
pbone = obj.pose.bones['shoulder.L']
pbone['type'] = 'copy'
pbone = obj.pose.bones['shoulder.L']
- pbone['copy.layer'] = 1
+ pbone['copy.layers'] = 1
pbone = obj.pose.bones['shoulder.R']
pbone['type'] = 'copy'
pbone = obj.pose.bones['shoulder.R']
- pbone['copy.layer'] = 1
+ pbone['copy.layers'] = 1
pbone = obj.pose.bones['DLT-upper_arm.L']
pbone['type'] = 'delta'
pbone = obj.pose.bones['DLT-upper_arm.R']
@@ -515,7 +515,7 @@ def metarig_template():
pbone = obj.pose.bones['palm.01.L']
pbone['type'] = 'palm_curl'
pbone = obj.pose.bones['palm.01.L']
- pbone['palm_curl.layer'] = 5
+ pbone['palm_curl.layers'] = 5
pbone = obj.pose.bones['thumb.01.L']
pbone['type'] = 'finger_curl'
pbone = obj.pose.bones['thumb.01.L']
@@ -531,7 +531,7 @@ def metarig_template():
pbone = obj.pose.bones['palm.01.R']
pbone['type'] = 'palm_curl'
pbone = obj.pose.bones['palm.01.R']
- pbone['palm_curl.layer'] = 5
+ pbone['palm_curl.layers'] = 5
pbone = obj.pose.bones['finger_pinky.01.L']
pbone['type'] = 'finger_curl'
pbone = obj.pose.bones['finger_pinky.01.L']
@@ -606,12 +606,10 @@ menu_func = (lambda self, context: self.layout.operator(AddHuman.bl_idname,
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__":
diff --git a/release/scripts/op/add_mesh_torus.py b/release/scripts/op/add_mesh_torus.py
index 601cc712dda..217aa8fae83 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
@@ -117,39 +121,15 @@ class AddTorus(bpy.types.Operator):
mesh = bpy.data.meshes.new("Torus")
- 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)
-
- scene = context.scene
-
- # ugh
- for ob in scene.objects:
- ob.selected = False
+ mesh.vertices.add(len(verts_loc) // 3)
+ mesh.faces.add(len(faces) // 4)
+ mesh.vertices.foreach_set("co", verts_loc)
+ mesh.faces.foreach_set("vertices_raw", faces)
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'}
@@ -159,12 +139,10 @@ def menu_func(self, context):
def register():
- bpy.types.register(AddTorus)
bpy.types.INFO_MT_mesh_add.append(menu_func)
def unregister():
- bpy.types.unregister(AddTorus)
bpy.types.INFO_MT_mesh_add.remove(menu_func)
if __name__ == "__main__":
diff --git a/release/scripts/op/animsys_update.py b/release/scripts/op/animsys_update.py
new file mode 100644
index 00000000000..0fe03a0cc4d
--- /dev/null
+++ b/release/scripts/op/animsys_update.py
@@ -0,0 +1,699 @@
+# ##### 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>
+
+data_path_update = [
+ ("ClothCollisionSettings", "min_distance", "distance_min"),
+ ("ClothCollisionSettings", "self_min_distance", "self_distance_min"),
+ ("ClothCollisionSettings", "enable_collision", "use_collision"),
+ ("ClothCollisionSettings", "enable_self_collision", "use_self_collision"),
+ ("ClothSettings", "pin_cloth", "use_pin_cloth"),
+ ("ClothSettings", "stiffness_scaling", "use_stiffness_scale"),
+ ("CollisionSettings", "random_damping", "damping_random"),
+ ("CollisionSettings", "random_friction", "friction_random"),
+ ("CollisionSettings", "inner_thickness", "thickness_inner"),
+ ("CollisionSettings", "outer_thickness", "thickness_outer"),
+ ("CollisionSettings", "kill_particles", "use_particle_kill"),
+ ("Constraint", "proxy_local", "is_proxy_local"),
+ ("ActionConstraint", "maximum", "max"),
+ ("ActionConstraint", "minimum", "min"),
+ ("FollowPathConstraint", "use_fixed_position", "use_fixed_location"),
+ ("KinematicConstraint", "chain_length", "chain_count"),
+ ("KinematicConstraint", "pos_lock_x", "lock_location_x"),
+ ("KinematicConstraint", "pos_lock_y", "lock_location_y"),
+ ("KinematicConstraint", "pos_lock_z", "lock_location_z"),
+ ("KinematicConstraint", "rot_lock_x", "lock_rotation_x"),
+ ("KinematicConstraint", "rot_lock_y", "lock_rotation_y"),
+ ("KinematicConstraint", "rot_lock_z", "lock_rotation_z"),
+ ("KinematicConstraint", "axis_reference", "reference_axis"),
+ ("KinematicConstraint", "use_position", "use_location"),
+ ("LimitLocationConstraint", "maximum_x", "max_x"),
+ ("LimitLocationConstraint", "maximum_y", "max_y"),
+ ("LimitLocationConstraint", "maximum_z", "max_z"),
+ ("LimitLocationConstraint", "minimum_x", "min_x"),
+ ("LimitLocationConstraint", "minimum_y", "min_y"),
+ ("LimitLocationConstraint", "minimum_z", "min_z"),
+ ("LimitLocationConstraint", "use_maximum_x", "use_max_x"),
+ ("LimitLocationConstraint", "use_maximum_y", "use_max_y"),
+ ("LimitLocationConstraint", "use_maximum_z", "use_max_z"),
+ ("LimitLocationConstraint", "use_minimum_x", "use_min_x"),
+ ("LimitLocationConstraint", "use_minimum_y", "use_min_y"),
+ ("LimitLocationConstraint", "use_minimum_z", "use_min_z"),
+ ("LimitLocationConstraint", "limit_transform", "use_transform_limit"),
+ ("LimitRotationConstraint", "maximum_x", "max_x"),
+ ("LimitRotationConstraint", "maximum_y", "max_y"),
+ ("LimitRotationConstraint", "maximum_z", "max_z"),
+ ("LimitRotationConstraint", "minimum_x", "min_x"),
+ ("LimitRotationConstraint", "minimum_y", "min_y"),
+ ("LimitRotationConstraint", "minimum_z", "min_z"),
+ ("LimitRotationConstraint", "limit_transform", "use_transform_limit"),
+ ("LimitScaleConstraint", "maximum_x", "max_x"),
+ ("LimitScaleConstraint", "maximum_y", "max_y"),
+ ("LimitScaleConstraint", "maximum_z", "max_z"),
+ ("LimitScaleConstraint", "minimum_x", "min_x"),
+ ("LimitScaleConstraint", "minimum_y", "min_y"),
+ ("LimitScaleConstraint", "minimum_z", "min_z"),
+ ("LimitScaleConstraint", "use_maximum_x", "use_max_x"),
+ ("LimitScaleConstraint", "use_maximum_y", "use_max_y"),
+ ("LimitScaleConstraint", "use_maximum_z", "use_max_z"),
+ ("LimitScaleConstraint", "use_minimum_x", "use_min_x"),
+ ("LimitScaleConstraint", "use_minimum_y", "use_min_y"),
+ ("LimitScaleConstraint", "use_minimum_z", "use_min_z"),
+ ("LimitScaleConstraint", "limit_transform", "use_transform_limit"),
+ ("PivotConstraint", "enabled_rotation_range", "rotation_range"),
+ ("PivotConstraint", "use_relative_position", "use_relative_location"),
+ ("PythonConstraint", "number_of_targets", "target_count"),
+ ("SplineIKConstraint", "chain_length", "chain_count"),
+ ("SplineIKConstraint", "chain_offset", "use_chain_offset"),
+ ("SplineIKConstraint", "even_divisions", "use_even_divisions"),
+ ("SplineIKConstraint", "y_stretch", "use_y_stretch"),
+ ("SplineIKConstraint", "xz_scaling_mode", "xz_scale_mode"),
+ ("StretchToConstraint", "original_length", "rest_length"),
+ ("TrackToConstraint", "target_z", "use_target_z"),
+ ("TransformConstraint", "extrapolate_motion", "use_motion_extrapolate"),
+ ("FieldSettings", "do_location", "apply_to_location"),
+ ("FieldSettings", "do_rotation", "apply_to_rotation"),
+ ("FieldSettings", "maximum_distance", "distance_max"),
+ ("FieldSettings", "minimum_distance", "distance_min"),
+ ("FieldSettings", "radial_maximum", "radial_max"),
+ ("FieldSettings", "radial_minimum", "radial_min"),
+ ("FieldSettings", "force_2d", "use_2d_force"),
+ ("FieldSettings", "do_absorption", "use_absorption"),
+ ("FieldSettings", "global_coordinates", "use_global_coords"),
+ ("FieldSettings", "guide_path_add", "use_guide_path_add"),
+ ("FieldSettings", "multiple_springs", "use_multiple_springs"),
+ ("FieldSettings", "use_coordinates", "use_object_coords"),
+ ("FieldSettings", "root_coordinates", "use_root_coords"),
+ ("ControlFluidSettings", "reverse_frames", "use_reverse_frames"),
+ ("DomainFluidSettings", "real_world_size", "simulation_scale"),
+ ("DomainFluidSettings", "surface_smoothing", "surface_smooth"),
+ ("DomainFluidSettings", "reverse_frames", "use_reverse_frames"),
+ ("DomainFluidSettings", "generate_speed_vectors", "use_speed_vectors"),
+ ("DomainFluidSettings", "override_time", "use_time_override"),
+ ("FluidFluidSettings", "export_animated_mesh", "use_animated_mesh"),
+ ("InflowFluidSettings", "export_animated_mesh", "use_animated_mesh"),
+ ("InflowFluidSettings", "local_coordinates", "use_local_coords"),
+ ("ObstacleFluidSettings", "export_animated_mesh", "use_animated_mesh"),
+ ("OutflowFluidSettings", "export_animated_mesh", "use_animated_mesh"),
+ ("ParticleFluidSettings", "drops", "use_drops"),
+ ("ParticleFluidSettings", "floats", "use_floats"),
+ ("Armature", "drawtype", "draw_type"),
+ ("Armature", "layer_protection", "layers_protected"),
+ ("Armature", "auto_ik", "use_auto_ik"),
+ ("Armature", "delay_deform", "use_deform_delay"),
+ ("Armature", "deform_envelope", "use_deform_envelopes"),
+ ("Armature", "deform_quaternion", "use_deform_preserve_volume"),
+ ("Armature", "deform_vertexgroups", "use_deform_vertex_groups"),
+ ("Armature", "x_axis_mirror", "use_mirror_x"),
+ ("Curve", "width", "offset"),
+ ("Image", "animation_speed", "fps"),
+ ("Image", "animation_end", "frame_end"),
+ ("Image", "animation_start", "frame_start"),
+ ("Image", "animated", "use_animation"),
+ ("Image", "clamp_x", "use_clamp_x"),
+ ("Image", "clamp_y", "use_clamp_y"),
+ ("Image", "premultiply", "use_premultiply"),
+ ("AreaLamp", "shadow_ray_sampling_method", "shadow_ray_sample_method"),
+ ("AreaLamp", "only_shadow", "use_only_shadow"),
+ ("AreaLamp", "shadow_layer", "use_shadow_layer"),
+ ("AreaLamp", "umbra", "use_umbra"),
+ ("PointLamp", "shadow_ray_sampling_method", "shadow_ray_sample_method"),
+ ("PointLamp", "only_shadow", "use_only_shadow"),
+ ("PointLamp", "shadow_layer", "use_shadow_layer"),
+ ("PointLamp", "sphere", "use_sphere"),
+ ("SpotLamp", "shadow_ray_sampling_method", "shadow_ray_sample_method"),
+ ("SpotLamp", "auto_clip_end", "use_auto_clip_end"),
+ ("SpotLamp", "auto_clip_start", "use_auto_clip_start"),
+ ("SpotLamp", "only_shadow", "use_only_shadow"),
+ ("SpotLamp", "shadow_layer", "use_shadow_layer"),
+ ("SpotLamp", "sphere", "use_sphere"),
+ ("SunLamp", "only_shadow", "use_only_shadow"),
+ ("SunLamp", "shadow_layer", "use_shadow_layer"),
+ ("Material", "z_offset", "offset_z"),
+ ("Material", "shadow_casting_alpha", "shadow_cast_alpha"),
+ ("Material", "cast_approximate", "use_cast_approximate"),
+ ("Material", "cast_buffer_shadows", "use_cast_buffer_shadows"),
+ ("Material", "cast_shadows_only", "use_cast_shadows_only"),
+ ("Material", "face_texture", "use_face_texture"),
+ ("Material", "face_texture_alpha", "use_face_texture_alpha"),
+ ("Material", "full_oversampling", "use_full_oversampling"),
+ ("Material", "light_group_exclusive", "use_light_group_exclusive"),
+ ("Material", "object_color", "use_object_color"),
+ ("Material", "only_shadow", "use_only_shadow"),
+ ("Material", "ray_shadow_bias", "use_ray_shadow_bias"),
+ ("Material", "traceable", "use_raytrace"),
+ ("Material", "shadeless", "use_shadeless"),
+ ("Material", "tangent_shading", "use_tangent_shading"),
+ ("Material", "transparency", "use_transparency"),
+ ("Material", "receive_transparent_shadows", "use_transparent_shadows"),
+ ("Material", "vertex_color_light", "use_vertex_color_light"),
+ ("Material", "vertex_color_paint", "use_vertex_color_paint"),
+ ("Mesh", "autosmooth_angle", "auto_smooth_angle"),
+ ("Mesh", "autosmooth", "use_auto_smooth"),
+ ("Object", "max_draw_type", "draw_type"),
+ ("Object", "use_dupli_verts_rotation", "use_dupli_vertices_rotation"),
+ ("Object", "shape_key_edit_mode", "use_shape_key_edit_mode"),
+ ("Object", "slow_parent", "use_slow_parent"),
+ ("Object", "time_offset_add_parent", "use_time_offset_add_parent"),
+ ("Object", "time_offset_edit", "use_time_offset_edit"),
+ ("Object", "time_offset_parent", "use_time_offset_parent"),
+ ("Object", "time_offset_particle", "use_time_offset_particle"),
+ ("ParticleSettings", "adaptive_pix", "adaptive_pixel"),
+ ("ParticleSettings", "child_effector", "apply_effector_to_children"),
+ ("ParticleSettings", "child_guide", "apply_guide_to_children"),
+ ("ParticleSettings", "billboard_split_offset", "billboard_offset_split"),
+ ("ParticleSettings", "billboard_random_tilt", "billboard_tilt_random"),
+ ("ParticleSettings", "child_length_thres", "child_length_threshold"),
+ ("ParticleSettings", "child_random_size", "child_size_random"),
+ ("ParticleSettings", "clumppow", "clump_shape"),
+ ("ParticleSettings", "damp_factor", "damping"),
+ ("ParticleSettings", "draw_as", "draw_method"),
+ ("ParticleSettings", "random_factor", "factor_random"),
+ ("ParticleSettings", "grid_invert", "invert_grid"),
+ ("ParticleSettings", "random_length", "length_random"),
+ ("ParticleSettings", "random_lifetime", "lifetime_random"),
+ ("ParticleSettings", "billboard_lock", "lock_billboard"),
+ ("ParticleSettings", "boids_2d", "lock_boids_to_surface"),
+ ("ParticleSettings", "object_aligned_factor", "object_align_factor"),
+ ("ParticleSettings", "random_phase_factor", "phase_factor_random"),
+ ("ParticleSettings", "ren_as", "render_type"),
+ ("ParticleSettings", "rendered_child_nbr", "rendered_child_count"),
+ ("ParticleSettings", "random_rotation_factor", "rotation_factor_random"),
+ ("ParticleSettings", "rough1", "roughness_1"),
+ ("ParticleSettings", "rough1_size", "roughness_1_size"),
+ ("ParticleSettings", "rough2", "roughness_2"),
+ ("ParticleSettings", "rough2_size", "roughness_2_size"),
+ ("ParticleSettings", "rough2_thres", "roughness_2_threshold"),
+ ("ParticleSettings", "rough_end_shape", "roughness_end_shape"),
+ ("ParticleSettings", "rough_endpoint", "roughness_endpoint"),
+ ("ParticleSettings", "random_size", "size_random"),
+ ("ParticleSettings", "abs_path_time", "use_absolute_path_time"),
+ ("ParticleSettings", "animate_branching", "use_animate_branching"),
+ ("ParticleSettings", "branching", "use_branching"),
+ ("ParticleSettings", "died", "use_dead"),
+ ("ParticleSettings", "die_on_collision", "use_die_on_collision"),
+ ("ParticleSettings", "rotation_dynamic", "use_dynamic_rotation"),
+ ("ParticleSettings", "even_distribution", "use_even_distribution"),
+ ("ParticleSettings", "rand_group", "use_group_pick_random"),
+ ("ParticleSettings", "hair_bspline", "use_hair_bspline"),
+ ("ParticleSettings", "sizemass", "use_multiply_size_mass"),
+ ("ParticleSettings", "react_multiple", "use_react_multiple"),
+ ("ParticleSettings", "react_start_end", "use_react_start_end"),
+ ("ParticleSettings", "render_adaptive", "use_render_adaptive"),
+ ("ParticleSettings", "self_effect", "use_self_effect"),
+ ("ParticleSettings", "enable_simplify", "use_simplify"),
+ ("ParticleSettings", "size_deflect", "use_size_deflect"),
+ ("ParticleSettings", "render_strand", "use_strand_primitive"),
+ ("ParticleSettings", "symmetric_branching", "use_symmetric_branching"),
+ ("ParticleSettings", "velocity_length", "use_velocity_length"),
+ ("ParticleSettings", "whole_group", "use_whole_group"),
+ ("CloudsTexture", "noise_size", "noise_scale"),
+ ("DistortedNoiseTexture", "noise_size", "noise_scale"),
+ ("EnvironmentMapTexture", "filter_size_minimum", "use_filter_size_min"),
+ ("EnvironmentMapTexture", "mipmap_gauss", "use_mipmap_gauss"),
+ ("ImageTexture", "calculate_alpha", "use_calculate_alpha"),
+ ("ImageTexture", "checker_even", "use_checker_even"),
+ ("ImageTexture", "checker_odd", "use_checker_odd"),
+ ("ImageTexture", "filter_size_minimum", "use_filter_size_min"),
+ ("ImageTexture", "flip_axis", "use_flip_axis"),
+ ("ImageTexture", "mipmap_gauss", "use_mipmap_gauss"),
+ ("ImageTexture", "mirror_x", "use_mirror_x"),
+ ("ImageTexture", "mirror_y", "use_mirror_y"),
+ ("ImageTexture", "normal_map", "use_normal_map"),
+ ("MarbleTexture", "noise_size", "noise_scale"),
+ ("MarbleTexture", "noisebasis2", "noisebasis_2"),
+ ("MusgraveTexture", "highest_dimension", "dimension_max"),
+ ("MusgraveTexture", "noise_size", "noise_scale"),
+ ("StucciTexture", "noise_size", "noise_scale"),
+ ("VoronoiTexture", "coloring", "color_mode"),
+ ("VoronoiTexture", "noise_size", "noise_scale"),
+ ("WoodTexture", "noise_size", "noise_scale"),
+ ("WoodTexture", "noisebasis2", "noisebasis_2"),
+ ("World", "blend_sky", "use_sky_blend"),
+ ("World", "paper_sky", "use_sky_paper"),
+ ("World", "real_sky", "use_sky_real"),
+ ("ImageUser", "auto_refresh", "use_auto_refresh"),
+ ("MaterialHalo", "flares_sub", "flare_subflare_count"),
+ ("MaterialHalo", "flare_subsize", "flare_subflare_size"),
+ ("MaterialHalo", "line_number", "line_count"),
+ ("MaterialHalo", "rings", "ring_count"),
+ ("MaterialHalo", "star_tips", "star_tip_count"),
+ ("MaterialHalo", "xalpha", "use_extreme_alpha"),
+ ("MaterialHalo", "flare_mode", "use_flare_mode"),
+ ("MaterialHalo", "vertex_normal", "use_vertex_normal"),
+ ("MaterialPhysics", "align_to_normal", "use_normal_align"),
+ ("MaterialStrand", "min_size", "size_min"),
+ ("MaterialStrand", "blender_units", "use_blender_units"),
+ ("MaterialStrand", "surface_diffuse", "use_surface_diffuse"),
+ ("MaterialStrand", "tangent_shading", "use_tangent_shading"),
+ ("MaterialSubsurfaceScattering", "error_tolerance", "error_threshold"),
+ ("MaterialVolume", "depth_cutoff", "depth_threshold"),
+ ("MaterialVolume", "lighting_mode", "light_method"),
+ ("MaterialVolume", "step_calculation", "step_method"),
+ ("MaterialVolume", "external_shadows", "use_external_shadows"),
+ ("MaterialVolume", "light_cache", "use_light_cache"),
+ ("ArmatureModifier", "multi_modifier", "use_multi_modifier"),
+ ("ArrayModifier", "constant_offset_displacement", "constant_offset_displace"),
+ ("ArrayModifier", "merge_distance", "merge_threshold"),
+ ("ArrayModifier", "relative_offset_displacement", "relative_offset_displace"),
+ ("ArrayModifier", "constant_offset", "use_constant_offset"),
+ ("ArrayModifier", "merge_adjacent_vertices", "use_merge_vertices"),
+ ("ArrayModifier", "merge_end_vertices", "use_merge_vertices_cap"),
+ ("ArrayModifier", "add_offset_object", "use_object_offset"),
+ ("ArrayModifier", "relative_offset", "use_relative_offset"),
+ ("BevelModifier", "only_vertices", "use_only_vertices"),
+ ("CastModifier", "from_radius", "use_radius_as_size"),
+ ("DisplaceModifier", "midlevel", "mid_level"),
+ ("DisplaceModifier", "texture_coordinates", "texture_coords"),
+ ("EdgeSplitModifier", "use_sharp", "use_edge_sharp"),
+ ("ExplodeModifier", "split_edges", "use_edge_split"),
+ ("MirrorModifier", "merge_limit", "merge_threshold"),
+ ("MirrorModifier", "mirror_u", "use_mirror_u"),
+ ("MirrorModifier", "mirror_v", "use_mirror_v"),
+ ("MirrorModifier", "mirror_vertex_groups", "use_mirror_vertex_groups"),
+ ("ParticleInstanceModifier", "particle_system_number", "particle_system_index"),
+ ("ParticleInstanceModifier", "keep_shape", "use_preserve_shape"),
+ ("ShrinkwrapModifier", "cull_back_faces", "use_cull_back_faces"),
+ ("ShrinkwrapModifier", "cull_front_faces", "use_cull_front_faces"),
+ ("ShrinkwrapModifier", "keep_above_surface", "use_keep_above_surface"),
+ ("SimpleDeformModifier", "lock_x_axis", "lock_x"),
+ ("SimpleDeformModifier", "lock_y_axis", "lock_y"),
+ ("SmokeModifier", "smoke_type", "type"),
+ ("SubsurfModifier", "subsurf_uv", "use_subsurf_uv"),
+ ("UVProjectModifier", "num_projectors", "projector_count"),
+ ("UVProjectModifier", "override_image", "use_image_override"),
+ ("WaveModifier", "texture_coordinates", "texture_coords"),
+ ("WaveModifier", "x_normal", "use_normal_x"),
+ ("WaveModifier", "y_normal", "use_normal_y"),
+ ("WaveModifier", "z_normal", "use_normal_z"),
+ ("NlaStrip", "blending", "blend_type"),
+ ("NlaStrip", "animated_influence", "use_animated_influence"),
+ ("NlaStrip", "animated_time", "use_animated_time"),
+ ("NlaStrip", "animated_time_cyclic", "use_animated_time_cyclic"),
+ ("NlaStrip", "auto_blending", "use_auto_blend"),
+ ("CompositorNodeAlphaOver", "convert_premul", "use_premultiply"),
+ ("CompositorNodeBlur", "sizex", "size_x"),
+ ("CompositorNodeBlur", "sizey", "size_y"),
+ ("CompositorNodeChannelMatte", "algorithm", "limit_method"),
+ ("CompositorNodeChromaMatte", "acceptance", "tolerance"),
+ ("CompositorNodeColorBalance", "correction_formula", "correction_method"),
+ ("CompositorNodeColorSpill", "algorithm", "limit_method"),
+ ("CompositorNodeColorSpill", "unspill", "use_unspill"),
+ ("CompositorNodeCrop", "x2", "max_x"),
+ ("CompositorNodeCrop", "y2", "max_y"),
+ ("CompositorNodeCrop", "x1", "min_x"),
+ ("CompositorNodeCrop", "y1", "min_y"),
+ ("CompositorNodeCrop", "crop_size", "use_crop_size"),
+ ("CompositorNodeDefocus", "max_blur", "blur_max"),
+ ("CompositorNodeDefocus", "gamma_correction", "use_gamma_correction"),
+ ("CompositorNodeGlare", "rotate_45", "use_rotate_45"),
+ ("CompositorNodeImage", "auto_refresh", "use_auto_refresh"),
+ ("CompositorNodeLensdist", "projector", "use_projector"),
+ ("CompositorNodeVecBlur", "max_speed", "speed_max"),
+ ("CompositorNodeVecBlur", "min_speed", "speed_min"),
+ ("ShaderNodeMapping", "maximum", "max"),
+ ("ShaderNodeMapping", "minimum", "min"),
+ ("ShaderNodeMapping", "clamp_maximum", "use_max"),
+ ("ShaderNodeMapping", "clamp_minimum", "use_min"),
+ ("VertexPaint", "all_faces", "use_all_faces"),
+ ("VertexPaint", "spray", "use_spray"),
+ ("ParticleEdit", "add_keys", "default_key_count"),
+ ("ParticleEdit", "selection_mode", "select_mode"),
+ ("ParticleEdit", "auto_velocity", "use_auto_velocity"),
+ ("ParticleEdit", "add_interpolate", "use_default_interpolate"),
+ ("ParticleEdit", "emitter_deflect", "use_emitter_deflect"),
+ ("ParticleEdit", "fade_time", "use_fade_time"),
+ ("ParticleEdit", "keep_lengths", "use_preserve_length"),
+ ("ParticleEdit", "keep_root", "use_preserve_root"),
+ ("ParticleSystem", "vertex_group_clump_negate", "invert_vertex_group_clump"),
+ ("ParticleSystem", "vertex_group_density_negate", "invert_vertex_group_density"),
+ ("ParticleSystem", "vertex_group_field_negate", "invert_vertex_group_field"),
+ ("ParticleSystem", "vertex_group_kink_negate", "invert_vertex_group_kink"),
+ ("ParticleSystem", "vertex_group_length_negate", "invert_vertex_group_length"),
+ ("ParticleSystem", "vertex_group_rotation_negate", "invert_vertex_group_rotation"),
+ ("ParticleSystem", "vertex_group_roughness1_negate", "invert_vertex_group_roughness_1"),
+ ("ParticleSystem", "vertex_group_roughness2_negate", "invert_vertex_group_roughness_2"),
+ ("ParticleSystem", "vertex_group_roughness_end_negate", "invert_vertex_group_roughness_end"),
+ ("ParticleSystem", "vertex_group_size_negate", "invert_vertex_group_size"),
+ ("ParticleSystem", "vertex_group_tangent_negate", "invert_vertex_group_tangent"),
+ ("ParticleSystem", "vertex_group_velocity_negate", "invert_vertex_group_velocity"),
+ ("ParticleSystem", "hair_dynamics", "use_hair_dynamics"),
+ ("ParticleSystem", "keyed_timing", "use_keyed_timing"),
+ ("PointDensity", "falloff_softness", "falloff_soft"),
+ ("PointDensity", "particle_cache", "particle_cache_space"),
+ ("PointDensity", "turbulence_size", "turbulence_scale"),
+ ("PointDensity", "turbulence", "use_turbulence"),
+ ("PointDensity", "vertices_cache", "vertex_cache_space"),
+ ("PoseBone", "ik_lin_weight", "ik_linear_weight"),
+ ("PoseBone", "ik_rot_weight", "ik_rotation_weight"),
+ ("PoseBone", "ik_limit_x", "use_ik_limit_x"),
+ ("PoseBone", "ik_limit_y", "use_ik_limit_y"),
+ ("PoseBone", "ik_limit_z", "use_ik_limit_z"),
+ ("PoseBone", "ik_lin_control", "use_ik_linear_control"),
+ ("PoseBone", "ik_rot_control", "use_ik_rotation_control"),
+ ("SPHFluidSettings", "spring_k", "spring_force"),
+ ("SPHFluidSettings", "stiffness_k", "stiffness"),
+ ("SPHFluidSettings", "stiffness_knear", "stiffness_near"),
+ ("SceneGameData", "framing_color", "frame_color"),
+ ("SceneGameData", "framing_type", "frame_type"),
+ ("SceneGameData", "eye_separation", "stereo_eye_separation"),
+ ("SceneGameData", "activity_culling", "use_activity_culling"),
+ ("SceneGameData", "auto_start", "use_auto_start"),
+ ("SceneGameData", "glsl_extra_textures", "use_glsl_extra_textures"),
+ ("SceneGameData", "glsl_lights", "use_glsl_lights"),
+ ("SceneGameData", "glsl_nodes", "use_glsl_nodes"),
+ ("SceneGameData", "glsl_ramps", "use_glsl_ramps"),
+ ("SceneGameData", "glsl_shaders", "use_glsl_shaders"),
+ ("SceneGameData", "glsl_shadows", "use_glsl_shadows"),
+ ("Sequence", "blend_opacity", "blend_alpha"),
+ ("Sequence", "blend_mode", "blend_type"),
+ ("Sequence", "frame_final_length", "frame_final_duration"),
+ ("Sequence", "use_effect_default_fade", "use_default_fade"),
+ ("SequenceColorBalance", "inverse_gain", "invert_gain"),
+ ("SequenceColorBalance", "inverse_gamma", "invert_gamma"),
+ ("SequenceColorBalance", "inverse_lift", "invert_lift"),
+ ("EffectSequence", "multiply_colors", "color_multiply"),
+ ("EffectSequence", "de_interlace", "use_deinterlace"),
+ ("EffectSequence", "flip_x", "use_flip_x"),
+ ("EffectSequence", "flip_y", "use_flip_y"),
+ ("EffectSequence", "convert_float", "use_float"),
+ ("EffectSequence", "premultiply", "use_premultiply"),
+ ("EffectSequence", "proxy_custom_directory", "use_proxy_custom_directory"),
+ ("EffectSequence", "proxy_custom_file", "use_proxy_custom_file"),
+ ("EffectSequence", "reverse_frames", "use_reverse_frames"),
+ ("GlowSequence", "blur_distance", "blur_radius"),
+ ("GlowSequence", "only_boost", "use_only_boost"),
+ ("SpeedControlSequence", "curve_compress_y", "use_curve_compress_y"),
+ ("SpeedControlSequence", "curve_velocity", "use_curve_velocity"),
+ ("SpeedControlSequence", "frame_blending", "use_frame_blend"),
+ ("TransformSequence", "uniform_scale", "use_uniform_scale"),
+ ("ImageSequence", "animation_end_offset", "animation_offset_end"),
+ ("ImageSequence", "animation_start_offset", "animation_offset_start"),
+ ("ImageSequence", "multiply_colors", "color_multiply"),
+ ("ImageSequence", "de_interlace", "use_deinterlace"),
+ ("ImageSequence", "flip_x", "use_flip_x"),
+ ("ImageSequence", "flip_y", "use_flip_y"),
+ ("ImageSequence", "convert_float", "use_float"),
+ ("ImageSequence", "premultiply", "use_premultiply"),
+ ("ImageSequence", "proxy_custom_directory", "use_proxy_custom_directory"),
+ ("ImageSequence", "proxy_custom_file", "use_proxy_custom_file"),
+ ("ImageSequence", "reverse_frames", "use_reverse_frames"),
+ ("MetaSequence", "animation_end_offset", "animation_offset_end"),
+ ("MetaSequence", "animation_start_offset", "animation_offset_start"),
+ ("MetaSequence", "multiply_colors", "color_multiply"),
+ ("MetaSequence", "de_interlace", "use_deinterlace"),
+ ("MetaSequence", "flip_x", "use_flip_x"),
+ ("MetaSequence", "flip_y", "use_flip_y"),
+ ("MetaSequence", "convert_float", "use_float"),
+ ("MetaSequence", "premultiply", "use_premultiply"),
+ ("MetaSequence", "proxy_custom_directory", "use_proxy_custom_directory"),
+ ("MetaSequence", "proxy_custom_file", "use_proxy_custom_file"),
+ ("MetaSequence", "reverse_frames", "use_reverse_frames"),
+ ("MovieSequence", "animation_end_offset", "animation_offset_end"),
+ ("MovieSequence", "animation_start_offset", "animation_offset_start"),
+ ("MovieSequence", "multiply_colors", "color_multiply"),
+ ("MovieSequence", "de_interlace", "use_deinterlace"),
+ ("MovieSequence", "flip_x", "use_flip_x"),
+ ("MovieSequence", "flip_y", "use_flip_y"),
+ ("MovieSequence", "convert_float", "use_float"),
+ ("MovieSequence", "premultiply", "use_premultiply"),
+ ("MovieSequence", "proxy_custom_directory", "use_proxy_custom_directory"),
+ ("MovieSequence", "proxy_custom_file", "use_proxy_custom_file"),
+ ("MovieSequence", "reverse_frames", "use_reverse_frames"),
+ ("MulticamSequence", "animation_end_offset", "animation_offset_end"),
+ ("MulticamSequence", "animation_start_offset", "animation_offset_start"),
+ ("MulticamSequence", "multiply_colors", "color_multiply"),
+ ("MulticamSequence", "de_interlace", "use_deinterlace"),
+ ("MulticamSequence", "flip_x", "use_flip_x"),
+ ("MulticamSequence", "flip_y", "use_flip_y"),
+ ("MulticamSequence", "convert_float", "use_float"),
+ ("MulticamSequence", "premultiply", "use_premultiply"),
+ ("MulticamSequence", "proxy_custom_directory", "use_proxy_custom_directory"),
+ ("MulticamSequence", "proxy_custom_file", "use_proxy_custom_file"),
+ ("MulticamSequence", "reverse_frames", "use_reverse_frames"),
+ ("SceneSequence", "animation_end_offset", "animation_offset_end"),
+ ("SceneSequence", "animation_start_offset", "animation_offset_start"),
+ ("SceneSequence", "multiply_colors", "color_multiply"),
+ ("SceneSequence", "de_interlace", "use_deinterlace"),
+ ("SceneSequence", "flip_x", "use_flip_x"),
+ ("SceneSequence", "flip_y", "use_flip_y"),
+ ("SceneSequence", "convert_float", "use_float"),
+ ("SceneSequence", "premultiply", "use_premultiply"),
+ ("SceneSequence", "proxy_custom_directory", "use_proxy_custom_directory"),
+ ("SceneSequence", "proxy_custom_file", "use_proxy_custom_file"),
+ ("SceneSequence", "reverse_frames", "use_reverse_frames"),
+ ("SoundSequence", "animation_end_offset", "animation_offset_end"),
+ ("SoundSequence", "animation_start_offset", "animation_offset_start"),
+ ("SmokeDomainSettings", "smoke_domain_colli", "collision_extents"),
+ ("SmokeDomainSettings", "smoke_cache_high_comp", "point_cache_compress_high_type"),
+ ("SmokeDomainSettings", "smoke_cache_comp", "point_cache_compress_type"),
+ ("SmokeDomainSettings", "maxres", "resolution_max"),
+ ("SmokeDomainSettings", "smoothemitter", "smooth_emitter"),
+ ("SmokeDomainSettings", "dissolve_smoke", "use_dissolve_smoke"),
+ ("SmokeDomainSettings", "dissolve_smoke_log", "use_dissolve_smoke_log"),
+ ("SmokeDomainSettings", "highres", "use_high_resolution"),
+ ("SoftBodySettings", "bending", "bend"),
+ ("SoftBodySettings", "error_limit", "error_threshold"),
+ ("SoftBodySettings", "lcom", "location_mass_center"),
+ ("SoftBodySettings", "lrot", "rotation_estimate"),
+ ("SoftBodySettings", "lscale", "scale_estimate"),
+ ("SoftBodySettings", "maxstep", "step_max"),
+ ("SoftBodySettings", "minstep", "step_min"),
+ ("SoftBodySettings", "diagnose", "use_diagnose"),
+ ("SoftBodySettings", "edge_collision", "use_edge_collision"),
+ ("SoftBodySettings", "estimate_matrix", "use_estimate_matrix"),
+ ("SoftBodySettings", "face_collision", "use_face_collision"),
+ ("SoftBodySettings", "self_collision", "use_self_collision"),
+ ("SoftBodySettings", "stiff_quads", "use_stiff_quads"),
+ ("TexMapping", "maximum", "max"),
+ ("TexMapping", "minimum", "min"),
+ ("TexMapping", "has_maximum", "use_max"),
+ ("TexMapping", "has_minimum", "use_min"),
+ ("TextCharacterFormat", "bold", "use_bold"),
+ ("TextCharacterFormat", "italic", "use_italic"),
+ ("TextCharacterFormat", "underline", "use_underline"),
+ ("TextureSlot", "rgb_to_intensity", "use_rgb_to_intensity"),
+ ("TextureSlot", "stencil", "use_stencil"),
+ ("LampTextureSlot", "texture_coordinates", "texture_coords"),
+ ("LampTextureSlot", "map_color", "use_map_color"),
+ ("LampTextureSlot", "map_shadow", "use_map_shadow"),
+ ("MaterialTextureSlot", "coloremission_factor", "color_emission_factor"),
+ ("MaterialTextureSlot", "colordiff_factor", "diffuse_color_factor"),
+ ("MaterialTextureSlot", "x_mapping", "mapping_x"),
+ ("MaterialTextureSlot", "y_mapping", "mapping_y"),
+ ("MaterialTextureSlot", "z_mapping", "mapping_z"),
+ ("MaterialTextureSlot", "colorreflection_factor", "reflection_color_factor"),
+ ("MaterialTextureSlot", "colorspec_factor", "specular_color_factor"),
+ ("MaterialTextureSlot", "texture_coordinates", "texture_coords"),
+ ("MaterialTextureSlot", "colortransmission_factor", "transmission_color_factor"),
+ ("MaterialTextureSlot", "from_dupli", "use_from_dupli"),
+ ("MaterialTextureSlot", "from_original", "use_from_original"),
+ ("MaterialTextureSlot", "map_alpha", "use_map_alpha"),
+ ("MaterialTextureSlot", "map_ambient", "use_map_ambient"),
+ ("MaterialTextureSlot", "map_colordiff", "use_map_color_diff"),
+ ("MaterialTextureSlot", "map_coloremission", "use_map_color_emission"),
+ ("MaterialTextureSlot", "map_colorreflection", "use_map_color_reflection"),
+ ("MaterialTextureSlot", "map_colorspec", "use_map_color_spec"),
+ ("MaterialTextureSlot", "map_colortransmission", "use_map_color_transmission"),
+ ("MaterialTextureSlot", "map_density", "use_map_density"),
+ ("MaterialTextureSlot", "map_diffuse", "use_map_diffuse"),
+ ("MaterialTextureSlot", "map_displacement", "use_map_displacement"),
+ ("MaterialTextureSlot", "map_emission", "use_map_emission"),
+ ("MaterialTextureSlot", "map_emit", "use_map_emit"),
+ ("MaterialTextureSlot", "map_hardness", "use_map_hardness"),
+ ("MaterialTextureSlot", "map_mirror", "use_map_mirror"),
+ ("MaterialTextureSlot", "map_normal", "use_map_normal"),
+ ("MaterialTextureSlot", "map_raymir", "use_map_raymir"),
+ ("MaterialTextureSlot", "map_reflection", "use_map_reflect"),
+ ("MaterialTextureSlot", "map_scattering", "use_map_scatter"),
+ ("MaterialTextureSlot", "map_specular", "use_map_specular"),
+ ("MaterialTextureSlot", "map_translucency", "use_map_translucency"),
+ ("MaterialTextureSlot", "map_warp", "use_map_warp"),
+ ("WorldTextureSlot", "texture_coordinates", "texture_coords"),
+ ("WorldTextureSlot", "map_blend", "use_map_blend"),
+ ("WorldTextureSlot", "map_horizon", "use_map_horizon"),
+ ("WorldTextureSlot", "map_zenith_down", "use_map_zenith_down"),
+ ("WorldTextureSlot", "map_zenith_up", "use_map_zenith_up"),
+ ("VoxelData", "still_frame_number", "still_frame"),
+ ("WorldLighting", "ao_blend_mode", "ao_blend_type"),
+ ("WorldLighting", "error_tolerance", "error_threshold"),
+ ("WorldLighting", "use_ambient_occlusion", "use_ambient_occlusian"),
+ ("WorldLighting", "pixel_cache", "use_cache"),
+ ("WorldLighting", "use_environment_lighting", "use_environment_light"),
+ ("WorldLighting", "use_indirect_lighting", "use_indirect_light"),
+ ("WorldStarsSettings", "color_randomization", "color_random"),
+ ("WorldStarsSettings", "min_distance", "distance_min"),
+ ("WorldLighting", "falloff", "use_falloff"),
+ ("Constraint", "disabled", "is_valid"),
+ ("ClampToConstraint", "cyclic", "use_cyclic"),
+ ("ImageTexture", "filter", "filter_type"),
+ ("ImageTexture", "interpolation", "use_interpolation"),
+ ("ImageTexture", "mipmap", "use_mipmap"),
+ ("ImageUser", "frames", "frame_duration"),
+ ("ImageUser", "offset", "frame_offset"),
+ ("ImageUser", "cyclic", "use_cyclic"),
+ ("ArmatureModifier", "invert", "invert_vertex_group"),
+ ("ArmatureModifier", "quaternion", "use_deform_preserve_volume"),
+ ("ArrayModifier", "length", "fit_length"),
+ ("BevelModifier", "angle", "angle_limit"),
+ ("BuildModifier", "length", "frame_duration"),
+ ("BuildModifier", "randomize", "use_random_order"),
+ ("CastModifier", "x", "use_x"),
+ ("CastModifier", "y", "use_y"),
+ ("CastModifier", "z", "use_z"),
+ ("ExplodeModifier", "size", "use_size"),
+ ("MaskModifier", "invert", "invert_vertex_group"),
+ ("MeshDeformModifier", "invert", "invert_vertex_group"),
+ ("MeshDeformModifier", "dynamic", "use_dynamic_bind"),
+ ("MirrorModifier", "clip", "use_clip"),
+ ("MirrorModifier", "x", "use_x"),
+ ("MirrorModifier", "y", "use_y"),
+ ("MirrorModifier", "z", "use_z"),
+ ("ParticleInstanceModifier", "children", "use_children"),
+ ("ParticleInstanceModifier", "normal", "use_normal"),
+ ("ParticleInstanceModifier", "size", "use_size"),
+ ("ShrinkwrapModifier", "negative", "use_negative_direction"),
+ ("ShrinkwrapModifier", "positive", "use_positive_direction"),
+ ("ShrinkwrapModifier", "x", "use_project_x"),
+ ("ShrinkwrapModifier", "y", "use_project_y"),
+ ("ShrinkwrapModifier", "z", "use_project_z"),
+ ("ShrinkwrapModifier", "mode", "wrap_method"),
+ ("SimpleDeformModifier", "mode", "deform_method"),
+ ("SimpleDeformModifier", "relative", "use_relative"),
+ ("SmoothModifier", "repeat", "iterations"),
+ ("SmoothModifier", "x", "use_x"),
+ ("SmoothModifier", "y", "use_y"),
+ ("SmoothModifier", "z", "use_z"),
+ ("SolidifyModifier", "invert", "invert_vertex_group"),
+ ("WaveModifier", "cyclic", "use_cyclic"),
+ ("WaveModifier", "normals", "use_normal"),
+ ("WaveModifier", "x", "use_x"),
+ ("WaveModifier", "y", "use_y"),
+ ("DampedTrackConstraint", "track", "track_axis"),
+ ("FloorConstraint", "sticky", "use_sticky"),
+ ("FollowPathConstraint", "forward", "forward_axis"),
+ ("FollowPathConstraint", "up", "up_axis"),
+ ("LockedTrackConstraint", "lock", "lock_axis"),
+ ("LockedTrackConstraint", "track", "track_axis"),
+ ("MaintainVolumeConstraint", "axis", "free_axis"),
+ ("TrackToConstraint", "track", "track_axis"),
+ ("TrackToConstraint", "up", "up_axis"),
+ ("GameProperty", "debug", "show_debug"),
+ ("Image", "tiles", "use_tiles"),
+ ("Lamp", "diffuse", "use_diffuse"),
+ ("Lamp", "negative", "use_negative"),
+ ("Lamp", "layer", "use_own_layer"),
+ ("Lamp", "specular", "use_specular"),
+ ("AreaLamp", "dither", "use_dither"),
+ ("AreaLamp", "jitter", "use_jitter"),
+ ("SpotLamp", "square", "use_square"),
+ ("Material", "cubic", "use_cubic"),
+ ("Material", "shadows", "use_shadows"),
+ ("ParticleSettings", "amount", "count"),
+ ("ParticleSettings", "display", "draw_percentage"),
+ ("ParticleSettings", "velocity", "show_velocity"),
+ ("ParticleSettings", "trand", "use_emit_random"),
+ ("ParticleSettings", "parent", "use_parent_particles"),
+ ("ParticleSettings", "emitter", "use_render_emitter"),
+ ("ParticleSettings", "viewport", "use_simplify_viewport"),
+ ("Texture", "brightness", "intensity"),
+ ("CloudsTexture", "stype", "cloud_type"),
+ ("EnvironmentMapTexture", "filter", "filter_type"),
+ ("EnvironmentMapTexture", "mipmap", "use_mipmap"),
+ ("MarbleTexture", "stype", "marble_type"),
+ ("StucciTexture", "stype", "stucci_type"),
+ ("WoodTexture", "stype", "wood_type"),
+ ("World", "range", "color_range"),
+ ("World", "lighting", "light_settings"),
+ ("World", "mist", "mist_settings"),
+ ("World", "stars", "star_settings"),
+ ("MaterialHalo", "lines", "use_lines"),
+ ("MaterialHalo", "ring", "use_ring"),
+ ("MaterialHalo", "soft", "use_soft"),
+ ("MaterialHalo", "star", "use_star"),
+ ("MaterialHalo", "texture", "use_texture"),
+ ("MaterialPhysics", "damp", "damping"),
+ ("MaterialRaytraceTransparency", "limit", "depth_max"),
+ ("NlaStrip", "reversed", "use_reverse"),
+ ("CompositorNodeBlur", "bokeh", "use_bokeh"),
+ ("CompositorNodeBlur", "gamma", "use_gamma_correction"),
+ ("CompositorNodeBlur", "relative", "use_relative"),
+ ("CompositorNodeChannelMatte", "high", "limit_max"),
+ ("CompositorNodeChannelMatte", "low", "limit_min"),
+ ("CompositorNodeChannelMatte", "channel", "matte_channel"),
+ ("CompositorNodeChromaMatte", "cutoff", "threshold"),
+ ("CompositorNodeColorMatte", "h", "color_hue"),
+ ("CompositorNodeColorMatte", "s", "color_saturation"),
+ ("CompositorNodeColorMatte", "v", "color_value"),
+ ("CompositorNodeDBlur", "wrap", "use_wrap"),
+ ("CompositorNodeDefocus", "preview", "use_preview"),
+ ("CompositorNodeHueSat", "hue", "color_hue"),
+ ("CompositorNodeHueSat", "sat", "color_saturation"),
+ ("CompositorNodeHueSat", "val", "color_value"),
+ ("CompositorNodeImage", "frames", "frame_duration"),
+ ("CompositorNodeImage", "offset", "frame_offset"),
+ ("CompositorNodeImage", "start", "frame_start"),
+ ("CompositorNodeImage", "cyclic", "use_cyclic"),
+ ("CompositorNodeInvert", "alpha", "invert_alpha"),
+ ("CompositorNodeInvert", "rgb", "invert_rgb"),
+ ("CompositorNodeLensdist", "fit", "use_fit"),
+ ("CompositorNodeLensdist", "jitter", "use_jitter"),
+ ("CompositorNodeMixRGB", "alpha", "use_alpha"),
+ ("CompositorNodeRotate", "filter", "filter_type"),
+ ("CompositorNodeTime", "end", "frame_end"),
+ ("CompositorNodeTime", "start", "frame_start"),
+ ("CompositorNodeVecBlur", "curved", "use_curved"),
+ ("ShaderNodeExtendedMaterial", "diffuse", "use_diffuse"),
+ ("ShaderNodeExtendedMaterial", "specular", "use_specular"),
+ ("ShaderNodeMaterial", "diffuse", "use_diffuse"),
+ ("ShaderNodeMaterial", "specular", "use_specular"),
+ ("ShaderNodeMixRGB", "alpha", "use_alpha"),
+ ("TextureNodeCurveTime", "end", "frame_end"),
+ ("TextureNodeCurveTime", "start", "frame_start"),
+ ("TextureNodeMixRGB", "alpha", "use_alpha"),
+ ("TextureSlot", "negate", "invert"),
+ ("TextureSlot", "size", "scale"),
+ ("SoftBodySettings", "damp", "damping"),
+ ("SequenceCrop", "right", "max_x"),
+ ("SequenceCrop", "top", "max_y"),
+ ("SequenceCrop", "bottom", "min_x"),
+ ("SequenceCrop", "left", "min_y"),
+ ]
+
+
+import bpy
+
+
+class UpdateAnimData(bpy.types.Operator):
+ ''''''
+ bl_idname = "anim.update_data_paths"
+ bl_label = "Update Animation Data"
+
+ def execute(self, context):
+ import animsys_refactor
+ reload(animsys_refactor)
+ animsys_refactor.update_data_paths(data_path_update)
+ return {'FINISHED'}
+
+
+if __name__ == "__main__":
+ bpy.ops.anim.update_data_paths()
+
+def register():
+ pass \ No newline at end of file
diff --git a/release/scripts/op/console_python.py b/release/scripts/op/console_python.py
index a9fa90ee6fa..918c31cff04 100644
--- a/release/scripts/op/console_python.py
+++ b/release/scripts/op/console_python.py
@@ -22,6 +22,9 @@ import bpy
language_id = 'python'
+# store our own __main__ module, not 100% needed
+# but python expects this in some places
+_BPY_MAIN_OWN = True
def add_scrollback(text, text_type):
for l in text.split('\n'):
@@ -33,31 +36,56 @@ def get_console(console_id):
'''
helper function for console operators
currently each text datablock gets its own
- console - bpython_code.InteractiveConsole()
+ console - code.InteractiveConsole()
...which is stored in this function.
console_id can be any hashable type
'''
from code import InteractiveConsole
- try:
- consoles = get_console.consoles
- except:
+ consoles = getattr(get_console, "consoles", None)
+ hash_next = hash(bpy.context.manager)
+
+ if consoles is None:
consoles = get_console.consoles = {}
+ get_console.consoles_namespace_hash = hash_next
+ else:
+ # check if clearning the namespace is needed to avoid a memory leak.
+ # the window manager is normally loaded with new blend files
+ # so this is a reasonable way to deal with namespace clearing.
+ # bpy.data hashing is reset by undo so cant be used.
+ hash_prev = getattr(get_console, "consoles_namespace_hash", 0)
- # clear all dead consoles, use text names as IDs
- # TODO, find a way to clear IDs
- '''
- for console_id in list(consoles.keys()):
- if console_id not in bpy.data.texts:
- del consoles[id]
- '''
+ if hash_prev != hash_next:
+ get_console.consoles_namespace_hash = hash_next
+ consoles.clear()
- try:
- console, stdout, stderr = consoles[console_id]
- except:
- namespace = {'__builtins__': __builtins__, 'bpy': bpy}
- console = InteractiveConsole(namespace)
+ console_data = consoles.get(console_id)
+
+ if console_data:
+ console, stdout, stderr = console_data
+
+ # XXX, bug in python 3.1.2 ? (worked in 3.1.1)
+ # seems there is no way to clear StringIO objects for writing, have to make new ones each time.
+ import io
+ stdout = io.StringIO()
+ stderr = io.StringIO()
+ else:
+ if _BPY_MAIN_OWN:
+ import types
+ bpy_main_mod = types.ModuleType("__main__")
+ namespace = bpy_main_mod.__dict__
+ else:
+ namespace = {}
+
+ namespace["__builtins__"] = sys.modules["builtins"]
+ namespace["bpy"] = bpy
+ namespace["C"] = bpy.context
+
+ console = InteractiveConsole(locals=namespace, filename="<blender_console>")
+
+ if _BPY_MAIN_OWN:
+ console._bpy_main_mod = bpy_main_mod
import io
stdout = io.StringIO()
@@ -77,7 +105,7 @@ def execute(context):
sc = context.space_data
try:
- line = sc.history[-1].line
+ line_object = sc.history[-1]
except:
return {'CANCELLED'}
@@ -86,21 +114,36 @@ def execute(context):
console, stdout, stderr = get_console(hash(context.region))
- # Hack, useful but must add some other way to access
- #if "C" not in console.locals:
- console.locals["C"] = context
-
# redirect output
sys.stdout = stdout
sys.stderr = stderr
- # run the console
- if not line.strip():
- line_exec = '\n' # executes a multiline statement
- else:
- line_exec = line
+ # dont allow the stdin to be used, can lock blender.
+ stdin_backup = sys.stdin
+ sys.stdin = None
- is_multiline = console.push(line_exec)
+ if _BPY_MAIN_OWN:
+ main_mod_back = sys.modules["__main__"]
+ sys.modules["__main__"] = console._bpy_main_mod
+
+ # incase exception happens
+ line = "" # incase of encodingf error
+ is_multiline = False
+
+ try:
+ line = line_object.body
+
+ # run the console, "\n" executes a multiline statement
+ line_exec = line if line.strip() else "\n"
+
+ is_multiline = console.push(line_exec)
+ except:
+ # unlikely, but this can happen with unicode errors for example.
+ import traceback
+ stderr.write(traceback.format_exc())
+
+ if _BPY_MAIN_OWN:
+ sys.modules["__main__"] = main_mod_back
stdout.seek(0)
stderr.seek(0)
@@ -136,6 +179,9 @@ def execute(context):
if output_err:
add_scrollback(output_err, 'ERROR')
+ # restore the stdin
+ sys.stdin = stdin_backup
+
return {'FINISHED'}
@@ -146,27 +192,48 @@ def autocomplete(context):
console = get_console(hash(context.region))[0]
- current_line = sc.history[-1]
- line = current_line.line
-
if not console:
return {'CANCELLED'}
if sc.console_type != 'PYTHON':
return {'CANCELLED'}
- # This function isnt aware of the text editor or being an operator
- # just does the autocomp then copy its results back
- current_line.line, current_line.current_character, scrollback = \
- intellisense.expand(
- line=current_line.line,
- cursor=current_line.current_character,
- namespace=console.locals,
- private=bpy.app.debug)
+ # dont allow the stdin to be used, can lock blender.
+ # note: unlikely stdin would be used for autocomp. but its possible.
+ stdin_backup = sys.stdin
+ sys.stdin = None
+
+ scrollback = ""
+ scrollback_error = ""
+
+ if _BPY_MAIN_OWN:
+ main_mod_back = sys.modules["__main__"]
+ sys.modules["__main__"] = console._bpy_main_mod
+
+ try:
+ current_line = sc.history[-1]
+ line = current_line.body
+
+ # This function isnt aware of the text editor or being an operator
+ # just does the autocomp then copy its results back
+ current_line.body, current_line.current_character, scrollback = \
+ intellisense.expand(
+ line=current_line.body,
+ cursor=current_line.current_character,
+ namespace=console.locals,
+ private=bpy.app.debug)
+ except:
+ # unlikely, but this can happen with unicode errors for example.
+ # or if the api attribute access its self causes an error.
+ import traceback
+ scrollback_error = traceback.format_exc()
+
+ if _BPY_MAIN_OWN:
+ sys.modules["__main__"] = main_mod_back
# Separate automplete output by command prompts
if scrollback != '':
- bpy.ops.console.scrollback_append(text=sc.prompt + current_line.line, type='INPUT')
+ bpy.ops.console.scrollback_append(text=sc.prompt + current_line.body, type='INPUT')
# Now we need to copy back the line from blender back into the
# text editor. This will change when we dont use the text editor
@@ -174,6 +241,12 @@ def autocomplete(context):
if scrollback:
add_scrollback(scrollback, 'INFO')
+ if scrollback_error:
+ add_scrollback(scrollback_error, 'ERROR')
+
+ # restore the stdin
+ sys.stdin = stdin_backup
+
context.area.tag_redraw()
return {'FINISHED'}
@@ -190,16 +263,12 @@ def banner(context):
add_scrollback("Execute: Enter", 'OUTPUT')
add_scrollback("Autocomplete: Ctrl+Space", 'OUTPUT')
add_scrollback("Ctrl +/- Wheel: Zoom", 'OUTPUT')
- add_scrollback("Builtin Modules: bpy, bpy.data, bpy.ops, bpy.props, bpy.types, bpy.context, bgl, blf, Mathutils, Geometry", 'OUTPUT')
+ add_scrollback("Builtin Modules: bpy, bpy.data, bpy.ops, bpy.props, bpy.types, bpy.context, bgl, blf, mathutils, geometry", 'OUTPUT')
add_scrollback("", 'OUTPUT')
add_scrollback(" WARNING!!! Blender 2.5 API is subject to change, see API reference for more info.", 'ERROR')
add_scrollback("", 'OUTPUT')
sc.prompt = PROMPT
- # Add context into the namespace for quick access
- console = get_console(hash(context.region))[0]
- console.locals["C"] = bpy.context
-
return {'FINISHED'}
diff --git a/release/scripts/op/console_shell.py b/release/scripts/op/console_shell.py
index e269cc0bb2f..2c5b48acd34 100644
--- a/release/scripts/op/console_shell.py
+++ b/release/scripts/op/console_shell.py
@@ -47,7 +47,7 @@ def execute(context):
sc = context.space_data
try:
- line = sc.history[-1].line
+ line = sc.history[-1].body
except:
return {'CANCELLED'}
diff --git a/release/scripts/op/fcurve_euler_filter.py b/release/scripts/op/fcurve_euler_filter.py
index 1c9e9a73312..a2730e16843 100644
--- a/release/scripts/op/fcurve_euler_filter.py
+++ b/release/scripts/op/fcurve_euler_filter.py
@@ -1,13 +1,13 @@
from math import *
import bpy
-from Mathutils import *
+from mathutils import *
def main(context):
def cleanupEulCurve(fcv):
keys = []
for k in fcv.keyframe_points:
- keys.append([k.handle1.copy(), k.co.copy(), k.handle2.copy()])
+ keys.append([k.handle_left.copy(), k.co.copy(), k.handle_right.copy()])
print(keys)
for i in range(len(keys)):
@@ -34,13 +34,13 @@ def main(context):
for i in range(len(keys)):
for x in range(2):
- fcv.keyframe_points[i].handle1[x] = keys[i][0][x]
+ fcv.keyframe_points[i].handle_left[x] = keys[i][0][x]
fcv.keyframe_points[i].co[x] = keys[i][1][x]
- fcv.keyframe_points[i].handle2[x] = keys[i][2][x]
+ fcv.keyframe_points[i].handle_right[x] = keys[i][2][x]
flist = bpy.context.active_object.animation_data.action.fcurves
for f in flist:
- if f.selected and f.data_path.endswith("rotation_euler"):
+ if f.select and f.data_path.endswith("rotation_euler"):
cleanupEulCurve(f)
class DiscontFilterOp(bpy.types.Operator):
@@ -48,7 +48,8 @@ class DiscontFilterOp(bpy.types.Operator):
bl_idname = "graph.euler_filter"
bl_label = "Filter out discontinuities in the active fcurves"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.active_object != None
def execute(self, context):
@@ -56,10 +57,10 @@ class DiscontFilterOp(bpy.types.Operator):
return {'FINISHED'}
def register():
- bpy.types.register(DiscontFilterOp)
+ pass
def unregister():
- bpy.types.unregister(DiscontFilterOp)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/op/image.py b/release/scripts/op/image.py
index f362f55d37e..c8160ded9a4 100644
--- a/release/scripts/op/image.py
+++ b/release/scripts/op/image.py
@@ -28,7 +28,7 @@ class EditExternally(bpy.types.Operator):
bl_label = "Image Edit Externally"
bl_options = {'REGISTER'}
- path = StringProperty(name="File Path", description="Path to an image file", maxlen= 1024, default= "")
+ filepath = StringProperty(name="File Path", description="Path to an image file", maxlen=1024, default="")
def _editor_guess(self, context):
import platform
@@ -50,17 +50,21 @@ class EditExternally(bpy.types.Operator):
# 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 os
import subprocess
- path = self.properties.path
- image_editor = self._editor_guess(context)
+ filepath = bpy.path.abspath(self.properties.filepath)
+
+ if not os.path.exists(filepath):
+ self.report('ERROR', "Image path '%s' not found." % filepath)
+ return {'CANCELLED'}
- cmd = []
- cmd.extend(image_editor)
- cmd.append(bpy.utils.expandpath(path))
+ cmd = self._editor_guess(context) + [filepath]
subprocess.Popen(cmd)
@@ -68,12 +72,12 @@ class EditExternally(bpy.types.Operator):
def invoke(self, context, event):
try:
- path = context.space_data.image.filename
+ filepath = context.space_data.image.filepath
except:
self.report({'ERROR'}, "Image not found on disk")
return {'CANCELLED'}
- self.properties.path = path
+ self.properties.filepath = filepath
self.execute(context)
return {'FINISHED'}
@@ -88,14 +92,14 @@ class SaveDirty(bpy.types.Operator):
def execute(self, context):
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)
+ if image.is_dirty:
+ filepath = bpy.path.abspath(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'}
@@ -129,35 +133,37 @@ class ProjectEdit(bpy.types.Operator):
self.report({'ERROR'}, "Could not make new image")
return {'CANCELLED'}
- filename = os.path.basename(bpy.data.filename)
- filename = os.path.splitext(filename)[0]
- # filename = bpy.utils.clean_name(filename) # fixes <memory> rubbish, needs checking
+ filepath = os.path.basename(bpy.data.filepath)
+ filepath = os.path.splitext(filepath)[0]
+ # filepath = bpy.path.clean_name(filepath) # fixes <memory> rubbish, needs checking
- if filename.startswith("."): # TODO, have a way to check if the file is saved, assuem .B25.blend
- filename = os.path.join(os.path.dirname(bpy.data.filename), filename)
+ 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:
- filename = "//" + filename
+ filepath = "//" + filepath
obj = context.object
if obj:
- filename += "_" + bpy.utils.clean_name(obj.name)
+ filepath += "_" + bpy.path.clean_name(obj.name)
- filename_final = filename + "." + EXT
+ filepath_final = filepath + "." + EXT
i = 0
- while os.path.exists(bpy.utils.expandpath(filename_final)):
- filename_final = filename + ("%.3d.%s" % (i, EXT))
+ while os.path.exists(bpy.path.abspath(filepath_final)):
+ filepath_final = filepath + ("%.3d.%s" % (i, EXT))
i += 1
- image_new.name = os.path.basename(filename_final)
+ image_new.name = os.path.basename(filepath_final)
ProjectEdit._proj_hack[0] = image_new.name
- image_new.filename_raw = filename_final # TODO, filename raw is crummy
+ image_new.filepath_raw = filepath_final # TODO, filepath raw is crummy
image_new.file_format = 'PNG'
image_new.save()
- bpy.ops.image.external_edit(path=filename_final)
+ bpy.ops.image.external_edit(filepath=filepath_final)
return {'FINISHED'}
@@ -182,23 +188,12 @@ class ProjectApply(bpy.types.Operator):
return {'FINISHED'}
-classes = [
- EditExternally,
- SaveDirty,
- ProjectEdit,
- ProjectApply]
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
-
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/op/mesh.py b/release/scripts/op/mesh.py
index 3989e51b6ca..9e684cea9c2 100644
--- a/release/scripts/op/mesh.py
+++ b/release/scripts/op/mesh.py
@@ -28,7 +28,8 @@ class MeshSelectInteriorFaces(bpy.types.Operator):
bl_label = "Select Interior Faces"
bl_options = {'REGISTER', 'UNDO'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
ob = context.active_object
return (ob and ob.type == 'MESH')
@@ -54,9 +55,9 @@ class MeshSelectInteriorFaces(bpy.types.Operator):
for index, face in enumerate(face_list):
if(test_interior(index)):
- face.selected = True
+ face.select = True
else:
- face.selected = False
+ face.select = False
if is_editmode:
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
@@ -69,14 +70,15 @@ class MeshMirrorUV(bpy.types.Operator):
bl_label = "Copy Mirrored UV coords"
bl_options = {'REGISTER', 'UNDO'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
ob = context.active_object
return (ob and ob.type == 'MESH')
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')
@@ -89,7 +91,7 @@ class MeshMirrorUV(bpy.types.Operator):
mirror_gt = {}
mirror_lt = {}
- vcos = [v.co.to_tuple(5) for v in mesh.verts]
+ vcos = [v.co.to_tuple(5) for v in mesh.vertices]
for i, co in enumerate(vcos):
if co[0] > 0.0:
@@ -100,7 +102,7 @@ class MeshMirrorUV(bpy.types.Operator):
mirror_gt[co] = i
mirror_lt[co] = i
- #for i, v in enumerate(mesh.verts):
+ #for i, v in enumerate(mesh.vertices):
vmap = {}
for mirror_a, mirror_b in (mirror_gt, mirror_lt), (mirror_lt, mirror_gt):
for co, i in mirror_a.items():
@@ -122,20 +124,20 @@ class MeshMirrorUV(bpy.types.Operator):
# as a list
faces = mesh.faces[:]
- fuvsel = [(False not in uv.uv_selected) for uv in active_uv_layer]
+ fuvsel = [(False not in uv.select_uv) for uv in active_uv_layer]
fcents = [f.center for f in faces]
# find mirror faces
mirror_fm = {}
for i, f in enumerate(faces):
- verts = f.verts[:]
+ verts = f.vertices[:]
verts.sort()
verts = tuple(verts)
mirror_fm[verts] = i
fmap = {}
for i, f in enumerate(faces):
- verts = [vmap.get(j) for j in f.verts]
+ verts = [vmap.get(j) for j in f.vertices]
if None not in verts:
verts.sort()
j = mirror_fm.get(tuple(verts))
@@ -157,8 +159,8 @@ class MeshMirrorUV(bpy.types.Operator):
uv2 = fuvs_cpy[j]
# get the correct rotation
- v1 = faces[j].verts[:]
- v2 = [vmap[k] for k in faces[i].verts[:]]
+ v1 = faces[j].vertices[:]
+ v2 = [vmap[k] for k in faces[i].vertices[:]]
for k in range(len(uv1)):
@@ -172,22 +174,12 @@ class MeshMirrorUV(bpy.types.Operator):
return {'FINISHED'}
-# Register the operator
-classes = [
- MeshSelectInteriorFaces,
- MeshMirrorUV]
-
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/op/nla.py b/release/scripts/op/nla.py
index db8c0be053a..44bd5d91e32 100644
--- a/release/scripts/op/nla.py
+++ b/release/scripts/op/nla.py
@@ -22,7 +22,7 @@ import bpy
def pose_info():
- from Mathutils import Matrix
+ from mathutils import Matrix
info = {}
@@ -100,7 +100,7 @@ def bake(frame_start, frame_end, step=1, only_selected=False):
pose_items = pose.bones.items()
for name, pbone in pose_items:
- if only_selected and not pbone.selected:
+ if only_selected and not pbone.select:
continue
for f in frame_range:
@@ -109,34 +109,19 @@ def bake(frame_start, frame_end, step=1, only_selected=False):
#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)
+
+ pbone.keyframe_insert("location", -1, f, name)
rotation_mode = pbone.rotation_mode
if rotation_mode == 'QUATERNION':
- pbone.keyframe_insert("rotation_quaternion", -1, f)
+ pbone.keyframe_insert("rotation_quaternion", -1, f, name)
elif rotation_mode == 'AXIS_ANGLE':
- pbone.keyframe_insert("rotation_axis_angle", -1, f)
+ pbone.keyframe_insert("rotation_axis_angle", -1, f, name)
else: # euler, XYZ, ZXY etc
- pbone.keyframe_insert("rotation_euler", -1, f)
-
- pbone.keyframe_insert("scale", -1, f)
-
- # assign groups, could become a more generic function
- agrp_loc = action.groups.add("Location")
- agrp_rot = action.groups.add("Rotation")
- agrp_sca = action.groups.add("Scale")
-
- for fcu in action.fcurves:
- path = fcu.data_path.rsplit(".", 1)[-1]
+ pbone.keyframe_insert("rotation_euler", -1, f, name)
- if path.startswith("loc"):
- fcu.group = agrp_loc
- if path.startswith("rot"):
- fcu.group = agrp_rot
- if path.startswith("sca"):
- fcu.group = agrp_sca
+ pbone.keyframe_insert("scale", -1, f, name)
return action
@@ -145,7 +130,7 @@ from bpy.props import *
class BakeAction(bpy.types.Operator):
- '''Add a torus mesh'''
+ '''Bake animation to an Action'''
bl_idname = "nla.bake"
bl_label = "Bake Action"
bl_options = {'REGISTER', 'UNDO'}
@@ -165,7 +150,7 @@ class BakeAction(bpy.types.Operator):
def execute(self, context):
props = self.properties
- action = bake(props.frame_start, props.frame_end, props.step, props.only_selected)
+ action = bake(props.frame_start, props.frame_end, props.step, props.show_only_selected)
# basic cleanup, could move elsewhere
for fcu in action.fcurves:
@@ -193,12 +178,12 @@ class BakeAction(bpy.types.Operator):
def register():
- bpy.types.register(BakeAction)
+ pass
# bpy.types.INFO_MT_mesh_add.append(menu_func)
def unregister():
- bpy.types.unregister(BakeAction)
+ pass
# bpy.types.INFO_MT_mesh_add.remove(menu_func)
if __name__ == "__main__":
diff --git a/release/scripts/op/object.py b/release/scripts/op/object.py
index 026d4409272..cb97fb736b9 100644
--- a/release/scripts/op/object.py
+++ b/release/scripts/op/object.py
@@ -52,9 +52,9 @@ class SelectPattern(bpy.types.Operator):
# Can be pose bones or objects
for item in items:
if pattern_match(item.name, self.properties.pattern):
- item.selected = True
+ item.select = True
elif not self.properties.extend:
- item.selected = False
+ item.select = False
return {'FINISHED'}
@@ -80,7 +80,8 @@ class SelectCamera(bpy.types.Operator):
bl_label = "Select Camera"
bl_options = {'REGISTER', 'UNDO'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.scene.camera is not None
def execute(self, context):
@@ -90,7 +91,7 @@ class SelectCamera(bpy.types.Operator):
self.report({'WARNING'}, "Active camera is not in this scene")
context.scene.objects.active = camera
- camera.selected = True
+ camera.select = True
return {'FINISHED'}
@@ -109,30 +110,51 @@ class SelectHierarchy(bpy.types.Operator):
extend = BoolProperty(name="Extend", description="Extend the existing selection", default=False)
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.object
def execute(self, context):
- obj = context.object
+ select_new = []
+ act_new = None
+
+
+ selected_objects = context.selected_objects
+ obj_act = context.object
+
+ if context.object not in selected_objects:
+ selected_objects.append(context.object)
+
if self.properties.direction == 'PARENT':
- parent = obj.parent
- if not parent:
- return {'CANCELLED'}
- obj_act = parent
+ for obj in selected_objects:
+ parent = obj.parent
+
+ if parent:
+ if obj_act == obj:
+ act_new = parent
+
+ select_new.append(parent)
+
else:
- children = obj.children
- if len(children) != 1:
- return {'CANCELLED'}
- obj_act = children[0]
+ for obj in selected_objects:
+ select_new.extend(obj.children)
- if not self.properties.extend:
- # obj.selected = False
- bpy.ops.object.select_all(action='DESELECT')
+ if select_new:
+ select_new.sort(key=lambda obj_iter: obj_iter.name)
+ act_new = select_new[0]
- obj_act.selected = True
- context.scene.objects.active = obj_act
+ # dont edit any object settings above this
+ if select_new:
+ if not self.properties.extend:
+ bpy.ops.object.select_all(action='DESELECT')
- return {'FINISHED'}
+ for obj in select_new:
+ obj.select = True
+
+ context.scene.objects.active = act_new
+ return {'FINISHED'}
+
+ return {'CANCELLED'}
class SubdivisionSet(bpy.types.Operator):
@@ -147,7 +169,8 @@ class SubdivisionSet(bpy.types.Operator):
relative = BoolProperty(name="Relative", description="Apply the subsurf level as an offset relative to the current level", default=False)
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
obs = context.selected_editable_objects
return (obs is not None)
@@ -233,10 +256,10 @@ class ShapeTransfer(bpy.types.Operator):
key = ob.add_shape_key(from_mix=False) # we need a rest
key.name = name
ob.active_shape_key_index = len(me.shape_keys.keys) - 1
- ob.shape_key_lock = True
+ ob.show_shape_key = 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
@@ -246,28 +269,28 @@ class ShapeTransfer(bpy.types.Operator):
orig_shape_coords = me_cos(ob_act.active_shape_key.data)
- orig_normals = me_nos(me.verts)
- # orig_coords = me_cos(me.verts) # the actual mverts location isnt as relyable as the base shape :S
+ orig_normals = me_nos(me.vertices)
+ # orig_coords = me_cos(me.vertices) # the actual mverts location isnt as relyable as the base shape :S
orig_coords = me_cos(me.shape_keys.keys[0].data)
for ob_other in objects:
me_other = ob_other.data
- if len(me_other.verts) != len(me.verts):
+ if len(me_other.vertices) != len(me.vertices):
self.report({'WARNING'}, "Skipping '%s', vertex count differs" % ob_other.name)
continue
- target_normals = me_nos(me_other.verts)
+ target_normals = me_nos(me_other.vertices)
if me_other.shape_keys:
target_coords = me_cos(me_other.shape_keys.keys[0].data)
else:
- target_coords = me_cos(me_other.verts)
+ target_coords = me_cos(me_other.vertices)
ob_add_shape(ob_other, orig_key_name)
# editing the final coords, only list that stores wrapped coords
target_shape_coords = [v.co for v in ob_other.active_shape_key.data]
- median_coords = [[] for i in range(len(me.verts))]
+ median_coords = [[] for i in range(len(me.vertices))]
# Method 1, edge
if mode == 'OFFSET':
@@ -276,7 +299,7 @@ class ShapeTransfer(bpy.types.Operator):
elif mode == 'RELATIVE_FACE':
for face in me.faces:
- i1, i2, i3, i4 = face.verts_raw
+ i1, i2, i3, i4 = face.vertices_raw
if i4 != 0:
pt = BarycentricTransform(orig_shape_coords[i1],
orig_coords[i4], orig_coords[i1], orig_coords[i2],
@@ -316,7 +339,7 @@ class ShapeTransfer(bpy.types.Operator):
elif mode == 'RELATIVE_EDGE':
for ed in me.edges:
- i1, i2 = ed.verts
+ i1, i2 = ed.vertices
v1, v2 = orig_coords[i1], orig_coords[i2]
edge_length = (v1 - v2).length
n1loc = v1 + orig_normals[i1] * edge_length
@@ -359,7 +382,8 @@ class ShapeTransfer(bpy.types.Operator):
return {'FINISHED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
obj = context.active_object
return (obj and obj.mode != 'EDIT')
@@ -389,7 +413,8 @@ class JoinUVs(bpy.types.Operator):
bl_idname = "object.join_uvs"
bl_label = "Join as UVs"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
obj = context.active_object
return (obj and obj.type == 'MESH')
@@ -402,13 +427,13 @@ class JoinUVs(bpy.types.Operator):
if is_editmode:
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
- if not mesh.active_uv_texture:
+ if not mesh.uv_textures:
self.report({'WARNING'}, "Object: %s, Mesh: '%s' has no UVs\n" % (obj.name, mesh.name))
else:
len_faces = len(mesh.faces)
uv_array = array.array('f', [0.0] * 8) * len_faces # seems to be the fastest way to create an array
- mesh.active_uv_texture.data.foreach_get("uv_raw", uv_array)
+ mesh.uv_textures.active.data.foreach_get("uv_raw", uv_array)
objects = context.selected_editable_objects[:]
@@ -426,10 +451,9 @@ class JoinUVs(bpy.types.Operator):
if len(mesh_other.faces) != len_faces:
self.report({'WARNING'}, "Object: %s, Mesh: '%s' has %d faces, expected %d\n" % (obj_other.name, mesh_other.name, len(mesh_other.faces), len_faces))
else:
- uv_other = mesh_other.active_uv_texture
+ uv_other = mesh_other.uv_textures.active
if not uv_other:
- mesh_other.add_uv_texture() # should return the texture it adds
- uv_other = mesh_other.active_uv_texture
+ uv_other = mesh_other.uv_textures.new() # should return the texture it adds
# finally do the copy
uv_other.data.foreach_set("uv_raw", uv_array)
@@ -447,17 +471,18 @@ class MakeDupliFace(bpy.types.Operator):
bl_idname = "object.make_dupli_face"
bl_label = "Make DupliFace"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
obj = context.active_object
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
@@ -473,14 +498,16 @@ 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]
- faces = list(range(int(len(face_verts) / 3)))
+ face_verts = [axis for obj in objects for v in matrix_to_quat(obj.matrix_world) for axis in v]
+ faces = list(range(len(face_verts) // 3))
mesh = bpy.data.meshes.new(data.name + "_dupli")
- mesh.add_geometry(int(len(face_verts) / 3), 0, int(len(face_verts) / (4 * 3)))
- mesh.verts.foreach_set("co", face_verts)
- mesh.faces.foreach_set("verts_raw", faces)
+ mesh.vertices.add(len(face_verts) // 3)
+ mesh.faces.add(len(face_verts) // 12)
+
+ mesh.vertices.foreach_set("co", face_verts)
+ mesh.faces.foreach_set("vertices_raw", faces)
mesh.update() # generates edge data
# pick an object to use
@@ -507,26 +534,43 @@ class MakeDupliFace(bpy.types.Operator):
return {'FINISHED'}
-classes = [
- SelectPattern,
- SelectCamera,
- SelectHierarchy,
- SubdivisionSet,
- ShapeTransfer,
- JoinUVs,
- MakeDupliFace]
+class IsolateTypeRender(bpy.types.Operator):
+ '''Hide unselected render objects of same type as active by setting the hide render flag'''
+ bl_idname = "object.isolate_type_render"
+ bl_label = "Restrict Render Unselected"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ def execute(self, context):
+ act_type = context.object.type
+
+ for obj in context.visible_objects:
+
+ if obj.select:
+ obj.hide_render = False
+ else:
+ if obj.type == act_type:
+ obj.hide_render = True
+
+ return {'FINISHED'}
+
+class ClearAllRestrictRender(bpy.types.Operator):
+ '''Reveal all render objects by setting the hide render flag'''
+ bl_idname = "object.hide_render_clear_all"
+ bl_label = "Clear All Restrict Render"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ def execute(self, context):
+ for obj in context.scene.objects:
+ obj.hide_render = False
+ return {'FINISHED'}
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
- register()
+ register() \ No newline at end of file
diff --git a/release/scripts/op/object_align.py b/release/scripts/op/object_align.py
index c5fcc3d2a32..dc9b7c34523 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')
@@ -265,7 +263,8 @@ class AlignObjects(bpy.types.Operator):
align_z = BoolProperty(name="Align Z",
description="Align in the Z axis", default=False)
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.mode == 'OBJECT'
def execute(self, context):
@@ -288,12 +287,10 @@ def menu_func(self, context):
def register():
- bpy.types.register(AlignObjects)
bpy.types.VIEW3D_MT_transform.append(menu_func)
def unregister():
- bpy.types.unregister(AlignObjects)
bpy.types.VIEW3D_MT_transform.remove(menu_func)
if __name__ == "__main__":
diff --git a/release/scripts/op/object_randomize_transform.py b/release/scripts/op/object_randomize_transform.py
index 3d3feb66424..8c3f4eb6dfd 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:
@@ -140,12 +140,10 @@ def menu_func(self, context):
def register():
- bpy.types.register(RandomizeLocRotSize)
bpy.types.VIEW3D_MT_transform.append(menu_func)
def unregister():
- bpy.types.unregister(RandomizeLocRotSize)
bpy.types.VIEW3D_MT_transform.remove(menu_func)
if __name__ == "__main__":
diff --git a/release/scripts/op/presets.py b/release/scripts/op/presets.py
index 1a8e57f7c32..4d15d94f408 100644
--- a/release/scripts/op/presets.py
+++ b/release/scripts/op/presets.py
@@ -22,13 +22,13 @@ import bpy
import os
-class AddPresetBase(bpy.types.Operator):
+class AddPresetBase():
'''Base preset class, only for subclassing
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.keyconfigs.active = 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,29 +72,48 @@ class AddPresetBase(bpy.types.Operator):
return {'RUNNING_MODAL'}
-class AddPresetRender(AddPresetBase):
+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, bpy.types.Operator):
'''Add a Render Preset'''
bl_idname = "render.preset_add"
bl_label = "Add Render Preset"
name = AddPresetBase.name
preset_values = [
- "bpy.context.scene.render.resolution_x",
- "bpy.context.scene.render.resolution_y",
- "bpy.context.scene.render.pixel_aspect_x",
- "bpy.context.scene.render.pixel_aspect_y",
+ "bpy.context.scene.render.field_order",
"bpy.context.scene.render.fps",
"bpy.context.scene.render.fps_base",
+ "bpy.context.scene.render.pixel_aspect_x",
+ "bpy.context.scene.render.pixel_aspect_y",
"bpy.context.scene.render.resolution_percentage",
- "bpy.context.scene.render.fields",
- "bpy.context.scene.render.field_order",
- "bpy.context.scene.render.fields_still",
+ "bpy.context.scene.render.resolution_x",
+ "bpy.context.scene.render.resolution_y",
+ "bpy.context.scene.render.use_fields",
+ "bpy.context.scene.render.use_fields_still",
]
preset_subdir = "render"
-class AddPresetSSS(AddPresetBase):
+class AddPresetSSS(AddPresetBase, bpy.types.Operator):
'''Add a Subsurface Scattering Preset'''
bl_idname = "material.sss_preset_add"
bl_label = "Add SSS Preset"
@@ -102,7 +125,7 @@ class AddPresetSSS(AddPresetBase):
"bpy.context.material.subsurface_scattering.color[1]",
"bpy.context.material.subsurface_scattering.color[2]",
"bpy.context.material.subsurface_scattering.color_factor",
- "bpy.context.material.subsurface_scattering.error_tolerance",
+ "bpy.context.material.subsurface_scattering.error_threshold",
"bpy.context.material.subsurface_scattering.front",
"bpy.context.material.subsurface_scattering.ior",
"bpy.context.material.subsurface_scattering.radius[0]",
@@ -115,66 +138,77 @@ class AddPresetSSS(AddPresetBase):
preset_subdir = "sss"
-class AddPresetCloth(AddPresetBase):
+class AddPresetCloth(AddPresetBase, bpy.types.Operator):
'''Add a Cloth Preset'''
bl_idname = "cloth.preset_add"
bl_label = "Add Cloth Preset"
name = AddPresetBase.name
preset_values = [
- "bpy.context.cloth.settings.quality",
- "bpy.context.cloth.settings.mass",
- "bpy.context.cloth.settings.structural_stiffness",
+ "bpy.context.cloth.settings.air_damping",
"bpy.context.cloth.settings.bending_stiffness",
+ "bpy.context.cloth.settings.mass",
+ "bpy.context.cloth.settings.quality",
"bpy.context.cloth.settings.spring_damping",
- "bpy.context.cloth.settings.air_damping",
+ "bpy.context.cloth.settings.structural_stiffness",
]
preset_subdir = "cloth"
-class AddPresetSunSky(AddPresetBase):
+class AddPresetSunSky(AddPresetBase, bpy.types.Operator):
'''Add a Sky & Atmosphere Preset'''
bl_idname = "lamp.sunsky_preset_add"
bl_label = "Add Sunsky Preset"
name = AddPresetBase.name
preset_values = [
+ "bpy.context.object.data.sky.atmosphere_extinction",
+ "bpy.context.object.data.sky.atmosphere_inscattering",
"bpy.context.object.data.sky.atmosphere_turbidity",
- "bpy.context.object.data.sky.sky_blend_type",
- "bpy.context.object.data.sky.sky_blend",
+ "bpy.context.object.data.sky.backscattered_light",
"bpy.context.object.data.sky.horizon_brightness",
"bpy.context.object.data.sky.spread",
- "bpy.context.object.data.sky.sky_color_space",
- "bpy.context.object.data.sky.sky_exposure",
"bpy.context.object.data.sky.sun_brightness",
- "bpy.context.object.data.sky.sun_size",
- "bpy.context.object.data.sky.backscattered_light",
"bpy.context.object.data.sky.sun_intensity",
- "bpy.context.object.data.sky.atmosphere_inscattering",
- "bpy.context.object.data.sky.atmosphere_extinction",
+ "bpy.context.object.data.sky.sun_size",
+ "bpy.context.object.data.sky.use_sky_blend",
+ "bpy.context.object.data.sky.use_sky_blend_type",
+ "bpy.context.object.data.sky.use_sky_color_space",
+ "bpy.context.object.data.sky.use_sky_exposure",
]
preset_subdir = "sunsky"
-classes = [
- AddPresetRender,
- AddPresetSSS,
- AddPresetCloth,
- AddPresetSunSky]
+class AddPresetInteraction(AddPresetBase, bpy.types.Operator):
+ '''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.use_drag_immediately",
+ "bpy.context.user_preferences.edit.use_insertkey_xyz_to_rgb",
+ "bpy.context.user_preferences.inputs.invert_mouse_wheel_zoom",
+ "bpy.context.user_preferences.inputs.select_mouse",
+ "bpy.context.user_preferences.inputs.use_emulate_numpad",
+ "bpy.context.user_preferences.inputs.use_mouse_continuous",
+ "bpy.context.user_preferences.inputs.use_mouse_emulate_3_button",
+ "bpy.context.user_preferences.inputs.view_rotate_method",
+ "bpy.context.user_preferences.inputs.view_zoom_axis",
+ "bpy.context.user_preferences.inputs.view_zoom_method",
+ ]
+ preset_subdir = "interaction"
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/op/screen_play_rendered_anim.py b/release/scripts/op/screen_play_rendered_anim.py
index 2ecd445df1d..80260755714 100644
--- a/release/scripts/op/screen_play_rendered_anim.py
+++ b/release/scripts/op/screen_play_rendered_anim.py
@@ -79,7 +79,7 @@ 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)
+ file_path = bpy.path.abspath(rd.filepath)
is_movie = rd.is_movie_format
# try and guess a command line if it doesn't exist
@@ -105,7 +105,7 @@ class PlayRenderedAnim(bpy.types.Operator):
# works for movies and images
file = rd.frame_path(frame=scene.frame_start)
- file = bpy.utils.expandpath(file) # expand '//'
+ file = bpy.path.abspath(file) # expand '//'
cmd = [player_path]
# extra options, fps controls etc.
@@ -144,11 +144,11 @@ class PlayRenderedAnim(bpy.types.Operator):
def register():
- bpy.types.register(PlayRenderedAnim)
+ pass
def unregister():
- bpy.types.unregister(PlayRenderedAnim)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/op/sequencer.py b/release/scripts/op/sequencer.py
index b3b674cb97e..feedb5cb4a8 100644
--- a/release/scripts/op/sequencer.py
+++ b/release/scripts/op/sequencer.py
@@ -20,6 +20,8 @@
import bpy
+from bpy.props import *
+
class SequencerCrossfadeSounds(bpy.types.Operator):
'''Do crossfading volume animation of two selected sound strips.'''
@@ -28,7 +30,8 @@ class SequencerCrossfadeSounds(bpy.types.Operator):
bl_label = "Crossfade sounds"
bl_options = {'REGISTER', 'UNDO'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
if context.scene and context.scene.sequence_editor and context.scene.sequence_editor.active_strip:
return context.scene.sequence_editor.active_strip.type == 'SOUND'
else:
@@ -38,7 +41,7 @@ class SequencerCrossfadeSounds(bpy.types.Operator):
seq1 = None
seq2 = None
for s in context.scene.sequence_editor.sequences:
- if s.selected and s.type == 'SOUND':
+ if s.select and s.type == 'SOUND':
if seq1 == None:
seq1 = s
elif seq2 == None:
@@ -71,12 +74,73 @@ class SequencerCrossfadeSounds(bpy.types.Operator):
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)
+
+ @classmethod
+ def poll(cls, 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 or camera >= s.channel:
+ return {'FINISHED'}
+
+ if not s.select:
+ s.select = 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.select 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'}
+
+ @classmethod
+ def poll(cls, 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.select and s.type == 'MOVIE':
+ s.use_deinterlace = True
+
+ return {'FINISHED'}
+
+
def register():
- bpy.types.register(SequencerCrossfadeSounds)
+ pass
def unregister():
- bpy.types.unregister(SequencerCrossfadeSounds)
+ pass
+
if __name__ == "__main__":
register()
diff --git a/release/scripts/op/uv.py b/release/scripts/op/uv.py
index f22db9d87a8..238c11d6e06 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=(
@@ -39,7 +39,8 @@ class ExportUVLayout(bpy.types.Operator):
description="File format to export the UV layout to",
default='SVG')
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
obj = context.active_object
return (obj and obj.type == 'MESH')
@@ -68,14 +69,14 @@ class ExportUVLayout(bpy.types.Operator):
def _face_uv_iter(self, context):
obj = context.active_object
mesh = obj.data
- uv_layer = mesh.active_uv_texture.data
+ uv_layer = mesh.uv_textures.active.data
uv_layer_len = len(uv_layer)
if not self.properties.export_all:
local_image = Ellipsis
- if context.tool_settings.uv_local_view:
+ if context.tool_settings.show_uv_local_view:
space_data = self._space_image(context)
if space_data:
local_image = space_data.image
@@ -85,9 +86,9 @@ class ExportUVLayout(bpy.types.Operator):
for i in range(uv_layer_len):
uv_elem = uv_layer[i]
# context checks
- if faces[i].selected and (local_image is Ellipsis or local_image == uv_elem.image):
+ if faces[i].select and (local_image is Ellipsis or local_image == uv_elem.image):
#~ uv = uv_elem.uv
- #~ if False not in uv_elem.uv_selected[:len(uv)]:
+ #~ if False not in uv_elem.select_uv[:len(uv)]:
#~ yield (i, uv)
# just write what we see.
@@ -113,7 +114,9 @@ class ExportUVLayout(bpy.types.Operator):
mode = self.properties.mode
- file = open(self.properties.path, "w")
+ filepath = self.properties.filepath
+ filepath = bpy.path.ensure_ext(filepath, "." + mode.lower())
+ file = open(filepath, "w")
fw = file.write
if mode == 'SVG':
@@ -123,7 +126,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 +170,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,17 +213,16 @@ 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():
- bpy.types.register(ExportUVLayout)
bpy.types.IMAGE_MT_uvs.append(menu_func)
-def unreguster():
- bpy.types.unregister(ExportUVLayout)
+def unregister():
bpy.types.IMAGE_MT_uvs.remove(menu_func)
if __name__ == "__main__":
diff --git a/release/scripts/op/uvcalc_follow_active.py b/release/scripts/op/uvcalc_follow_active.py
index c8a13441048..9f809dd39f8 100644
--- a/release/scripts/op/uvcalc_follow_active.py
+++ b/release/scripts/op/uvcalc_follow_active.py
@@ -26,10 +26,10 @@ import bpy
def extend(obj, operator, EXTEND_MODE):
me = obj.data
- me_verts = me.verts
+ me_verts = me.vertices
# script will fail without UVs
- if not me.active_uv_texture:
- me.add_uv_texture()
+ if not me.uv_textures:
+ me.uv_textures.new()
# Toggle Edit mode
@@ -54,20 +54,20 @@ def extend(obj, operator, EXTEND_MODE):
# assume a quad
return [(vi[0], vi[1]), (vi[1], vi[2]), (vi[2], vi[3]), (vi[3], vi[0])]
- vidx_source = face_source.verts
- vidx_target = face_target.verts
+ vidx_source = face_source.vertices
+ vidx_target = face_target.vertices
- faceUVsource = me.active_uv_texture.data[face_source.index]
+ faceUVsource = me.uv_textures.active.data[face_source.index]
uvs_source = [faceUVsource.uv1, faceUVsource.uv2, faceUVsource.uv3, faceUVsource.uv4]
- faceUVtarget = me.active_uv_texture.data[face_target.index]
+ faceUVtarget = me.uv_textures.active.data[face_target.index]
uvs_target = [faceUVtarget.uv1, faceUVtarget.uv2, faceUVtarget.uv3, faceUVtarget.uv4]
# 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)
@@ -138,15 +138,15 @@ def extend(obj, operator, EXTEND_MODE):
uvs_vhash_target[edgepair_outer_target[iA]][:] = uvs_vhash_source[edgepair_inner_source[1]] + (uvs_vhash_source[edgepair_inner_source[1]] - uvs_vhash_source[edgepair_outer_source[0]])
- if me.active_uv_texture == None:
- me.add_uv_texture
+ if not me.uv_textures:
+ me.uv_textures.new()
face_act = me.faces.active
if face_act == -1:
operator.report({'ERROR'}, "No active face.")
return
- face_sel = [f for f in me.faces if len(f.verts) == 4 and f.selected]
+ face_sel = [f for f in me.faces if len(f.vertices) == 4 and f.select]
face_act_local_index = -1
for i, f in enumerate(face_sel):
@@ -177,11 +177,9 @@ def extend(obj, operator, EXTEND_MODE):
except:
edge_faces[edkey] = [i]
- #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])
- me_verts = me.verts
+ edge_loops = me.edge_loops_from_faces(face_sel, [ed.key for ed in me.edges if ed.use_seam])
+ me_verts = me.vertices
for loop in edge_loops:
looplen = [0.0]
for ed in loop:
@@ -192,7 +190,7 @@ def extend(obj, operator, EXTEND_MODE):
# remove seams, so we dont map accross seams.
for ed in me.edges:
- if ed.seam:
+ if ed.use_seam:
# remove the edge pair if we can
try:
del edge_faces[ed.key]
@@ -249,7 +247,8 @@ class FollowActiveQuads(bpy.types.Operator):
description="Method to space UV edge loops",
default="LENGTH")
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
obj = context.active_object
return (obj is not None and obj.type == 'MESH')
@@ -263,12 +262,10 @@ menu_func = (lambda self, context: self.layout.operator(FollowActiveQuads.bl_idn
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__":
diff --git a/release/scripts/op/uvcalc_smart_project.py b/release/scripts/op/uvcalc_smart_project.py
index c88faae2818..c4e19afc810 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
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
@@ -276,15 +275,15 @@ def testNewVecLs2DRotIsBetter(vecs, mat=-1, bestAreaSoFar = -1):
# Takes a list of faces that make up a UV island and rotate
# until they optimally fit inside a square.
-ROTMAT_2D_POS_90D = RotationMatrix( radians(90.0), 2)
-ROTMAT_2D_POS_45D = RotationMatrix( radians(45.0), 2)
+ROTMAT_2D_POS_90D = Matrix.Rotation( radians(90.0), 2)
+ROTMAT_2D_POS_45D = Matrix.Rotation( radians(45.0), 2)
RotMatStepRotation = []
rot_angle = 22.5 #45.0/2
while rot_angle > 0.1:
RotMatStepRotation.append([\
- RotationMatrix( radians(rot_angle), 2),\
- RotationMatrix( radians(-rot_angle), 2)])
+ Matrix.Rotation( radians(rot_angle), 2),\
+ Matrix.Rotation( radians(-rot_angle), 2)])
rot_angle = rot_angle/2.0
@@ -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
@@ -525,7 +524,7 @@ def mergeUvIslands(islandList):
then move us 1 whole width accross,
Its possible this is a bad idea since 2 skinny Angular faces
could join without 1 whole move, but its a lot more optimal to speed this up
- since we have alredy tested for it.
+ since we have already tested for it.
It gives about 10% speedup with minimal errors.
'''
@@ -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
@@ -605,7 +604,7 @@ def getUvIslands(faceGroups, me):
# Get seams so we dont cross over seams
edge_seams = {} # shoudl be a set
for ed in me.edges:
- if ed.seam:
+ if ed.use_seam:
edge_seams[ed.key] = None # dummy var- use sets!
# Done finding seams
@@ -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)
@@ -793,7 +792,7 @@ def VectoMat(vec):
class thickface(object):
__slost__= 'v', 'uv', 'no', 'area', 'edge_keys'
def __init__(self, face, uvface, mesh_verts):
- self.v = [mesh_verts[i] for i in face.verts]
+ self.v = [mesh_verts[i] for i in face.vertices]
if len(self.v)==4:
self.uv = uvface.uv1, uvface.uv2, uvface.uv3, uvface.uv4
else:
@@ -822,7 +821,7 @@ def main(context, island_margin, projection_limit):
#XXX ob = objects.active
ob= objects[0]
- if ob and ob.selected == 0 and ob.type == 'MESH':
+ if ob and (not ob.select) and ob.type == 'MESH':
# Add to the list
obList =[ob]
del objects
@@ -893,14 +892,14 @@ def main(context, island_margin, projection_limit):
# Tag as used
me.tag = True
- if len(me.uv_textures)==0: # Mesh has no UV Coords, dont bother.
- me.add_uv_texture()
+ if not me.uv_textures: # Mesh has no UV Coords, dont bother.
+ me.uv_textures.new()
- uv_layer = me.active_uv_texture.data
- me_verts = list(me.verts)
+ uv_layer = me.uv_textures.active.data
+ me_verts = list(me.vertices)
if USER_ONLY_SELECTED_FACES:
- meshFaces = [thickface(f, uv_layer[i], me_verts) for i, f in enumerate(me.faces) if f.selected]
+ meshFaces = [thickface(f, uv_layer[i], me_verts) for i, f in enumerate(me.faces) if f.select]
#else:
# meshFaces = map(thickface, me.faces)
@@ -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)
@@ -1028,7 +1027,7 @@ def main(context, island_margin, projection_limit):
bestAng = fvec.dot(projectVecs[0])
bestAngIdx = 0
- # Cycle through the remaining, first alredy done
+ # Cycle through the remaining, first already done
while i-1:
i-=1
@@ -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]
@@ -1125,7 +1124,8 @@ class SmartProject(bpy.types.Operator):
description="Margin to reduce bleed from adjacent islands.",
default=0.0, min=0.0, max=1.0)
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.active_object != None
def execute(self, context):
@@ -1139,12 +1139,10 @@ menu_func = (lambda self, context: self.layout.operator(SmartProject.bl_idname,
def register():
- bpy.types.register(SmartProject)
bpy.types.VIEW3D_MT_uv_map.append(menu_func)
def unregister():
- bpy.types.unregister(SmartProject)
bpy.types.VIEW3D_MT_uv_map.remove(menu_func)
if __name__ == "__main__":
diff --git a/release/scripts/op/vertexpaint_dirt.py b/release/scripts/op/vertexpaint_dirt.py
index f2c2d5bd864..72317cf8c11 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 *
@@ -43,7 +43,7 @@ def applyVertexDirt(me, blur_iterations, blur_strength, clamp_dirt, clamp_clean,
#BPyMesh.meshCalcNormals(me)
- vert_tone = [0.0] * len(me.verts)
+ vert_tone = [0.0] * len(me.vertices)
min_tone = 180.0
max_tone = 0.0
@@ -51,24 +51,29 @@ def applyVertexDirt(me, blur_iterations, blur_strength, clamp_dirt, clamp_clean,
# create lookup table for each vertex's connected vertices (via edges)
con = []
- con = [[] for i in range(len(me.verts))]
+ con = [[] for i in range(len(me.vertices))]
# add connected verts
for e in me.edges:
- con[e.verts[0]].append(e.verts[1])
- con[e.verts[1]].append(e.verts[0])
+ con[e.vertices[0]].append(e.vertices[1])
+ con[e.vertices[1]].append(e.vertices[0])
- for v in me.verts:
+ for i, v in enumerate(me.vertices):
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.vertices[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):
@@ -122,15 +127,15 @@ def applyVertexDirt(me, blur_iterations, blur_strength, clamp_dirt, clamp_clean,
return('CANCELLED', )
for i, f in enumerate(me.faces):
- if not me.use_paint_mask or f.selected:
+ if not me.use_paint_mask or f.select:
f_col = active_col_layer[i]
f_col = [f_col.color1, f_col.color2, f_col.color3, f_col.color4]
- for j, v in enumerate(f.verts):
+ for j, v in enumerate(f.vertices):
col = f_col[j]
- tone = vert_tone[me.verts[v].index]
+ tone = vert_tone[me.vertices[v].index]
tone = (tone - min_tone) / tone_range
if dirt_only:
@@ -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,15 +176,15 @@ class VertexPaintDirt(bpy.types.Operator):
print('Dirt calculated in %.6f' % (time.time() - t))
- return('FINISHED',)
+ return {'FINISHED'}
def register():
- bpy.types.register(VertexPaintDirt)
+ pass
def unregister():
- bpy.types.unregister(VertexPaintDirt)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/op/wm.py b/release/scripts/op/wm.py
index 5893a9cf472..cc35a0ab3dd 100644
--- a/release/scripts/op/wm.py
+++ b/release/scripts/op/wm.py
@@ -16,16 +16,15 @@
#
# ##### END GPL LICENSE BLOCK #####
-# <pep8-80 compliant>
+# <pep8 compliant>
import bpy
from bpy.props import *
-
+from rna_prop_ui import rna_idprop_ui_prop_get, rna_idprop_ui_prop_clear
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,7 +92,7 @@ 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
@@ -106,18 +105,18 @@ class WM_OT_context_scale_int(bpy.types.Operator): # same as enum
bl_label = "Context Set"
bl_options = {'UNDO'}
- path = rna_path_prop
+ 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.path) is Ellipsis:
+ if context_path_validate(context, self.properties.data_path) is Ellipsis:
return {'PASS_THROUGH'}
value = self.properties.value
- path = self.properties.path
+ data_path = self.properties.data_path
if value == 1.0: # nothing to do
return {'CANCELLED'}
@@ -129,9 +128,9 @@ class WM_OT_context_scale_int(bpy.types.Operator): # same as enum
else:
add = "-1"
func = "min"
- exec("context.%s = %s(round(context.%s * value), context.%s + %s)" % (path, func, path, path, add))
+ 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.path)
+ exec("context.%s *= value" % self.properties.data_path)
return {'FINISHED'}
@@ -142,7 +141,7 @@ class WM_OT_context_set_float(bpy.types.Operator): # same as enum
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
@@ -156,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="")
@@ -169,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="")
@@ -183,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'}
@@ -201,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'}
@@ -220,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="")
@@ -229,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'}
@@ -247,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'}
@@ -261,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'}
@@ -281,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]"
@@ -323,9 +322,45 @@ 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'}
+
+
+class WM_OT_context_set_id(bpy.types.Operator):
+ '''Toggle a context value.'''
+ bl_idname = "wm.context_set_id"
+ bl_label = "Set Library ID"
+ bl_options = {'UNDO'}
+
+ data_path = rna_path_prop
+ value = StringProperty(name="Value",
+ description="Assign value", maxlen=1024, default="")
+
+ def execute(self, context):
+ value = self.properties.value
+ data_path = self.properties.data_path
+
+ # match the pointer type from the target property to bpy.data.*
+ # so we lookup the correct list.
+ data_path_base, data_path_prop = data_path.rsplit(".", 1)
+ data_prop_rna = eval("context.%s" % data_path_base).rna_type.properties[data_path_prop]
+ data_prop_rna_type = data_prop_rna.fixed_type
+
+ id_iter = None
+
+ for prop in bpy.data.rna_type.properties:
+ if prop.rna_type.identifier == "CollectionProperty":
+ if prop.fixed_type == data_prop_rna_type:
+ id_iter = prop.identifier
+ break
+
+ if id_iter:
+ value_id = getattr(bpy.data, id_iter).get(value)
+ exec("context.%s=value_id" % data_path)
+
return {'FINISHED'}
+
doc_id = StringProperty(name="Doc ID",
description="", maxlen=1024, default="", options={'HIDDEN'})
@@ -338,27 +373,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
@@ -369,17 +404,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()
@@ -408,7 +443,7 @@ class WM_OT_context_modal_mouse(bpy.types.Operator):
if not self._values:
self.report({'WARNING'}, "Nothing to operate on: %s[ ].%s" %
- (self.properties.path_iter, self.properties.path_item))
+ (self.properties.data_path_iter, self.properties.data_path_item))
return {'CANCELLED'}
else:
@@ -419,7 +454,7 @@ class WM_OT_context_modal_mouse(bpy.types.Operator):
class WM_OT_url_open(bpy.types.Operator):
- "Open the Blender Wiki in the Webbrowser"
+ "Open a website in the Webbrowser"
bl_idname = "wm.url_open"
bl_label = ""
@@ -431,6 +466,39 @@ class WM_OT_url_open(bpy.types.Operator):
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.path.abspath(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"
@@ -544,58 +612,139 @@ class WM_OT_doc_edit(bpy.types.Operator):
return wm.invoke_props_dialog(self, width=600)
-class WM_OT_reload_scripts(bpy.types.Operator):
- '''Load online reference docs'''
- bl_idname = "wm.reload_scripts"
- bl_label = "Reload Scripts"
+from bpy.props import *
+
+
+rna_path = StringProperty(name="Property Edit",
+ description="Property data_path edit", maxlen=1024, default="", options={'HIDDEN'})
+
+rna_value = StringProperty(name="Property Value",
+ description="Property value edit", maxlen=1024, default="")
+
+rna_property = StringProperty(name="Property Name",
+ description="Property name edit", maxlen=1024, default="")
+
+rna_min = FloatProperty(name="Min", default=0.0, precision=3)
+rna_max = FloatProperty(name="Max", default=1.0, precision=3)
+
+
+class WM_OT_properties_edit(bpy.types.Operator):
+ '''Internal use (edit a property data_path)'''
+ bl_idname = "wm.properties_edit"
+ bl_label = "Edit Property"
+
+ data_path = rna_path
+ property = rna_property
+ value = rna_value
+ min = rna_min
+ max = rna_max
+ description = StringProperty(name="Tip", default="")
def execute(self, context):
- MOD = type(bpy)
- bpy.utils.load_scripts(True)
+ data_path = self.properties.data_path
+ value = self.properties.value
+ prop = self.properties.property
+ prop_old = self._last_prop[0]
+
+ try:
+ value_eval = eval(value)
+ except:
+ value_eval = value
+
+ # First remove
+ item = eval("context.%s" % data_path)
+
+ rna_idprop_ui_prop_clear(item, prop_old)
+ exec_str = "del item['%s']" % prop_old
+ # print(exec_str)
+ exec(exec_str)
+
+
+ # Reassign
+ exec_str = "item['%s'] = %s" % (prop, repr(value_eval))
+ # print(exec_str)
+ exec(exec_str)
+ self._last_prop[:] = [prop]
+
+ prop_type = type(item[prop])
+
+ prop_ui = rna_idprop_ui_prop_get(item, prop)
+
+ if prop_type in (float, int):
+
+ prop_ui['soft_min'] = prop_ui['min'] = prop_type(self.properties.min)
+ prop_ui['soft_max'] = prop_ui['max'] = prop_type(self.properties.max)
+
+ prop_ui['description'] = self.properties.description
+
return {'FINISHED'}
+ def invoke(self, context, event):
-import rna_prop_ui
+ self._last_prop = [self.properties.property]
-classes = [
- MESH_OT_delete_edgeloop,
+ item = eval("context.%s" % self.properties.data_path)
- 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,
- WM_OT_context_set_value,
- WM_OT_context_toggle,
- WM_OT_context_toggle_enum,
- WM_OT_context_cycle_enum,
- WM_OT_context_cycle_int,
- WM_OT_context_modal_mouse,
+ # setup defaults
+ prop_ui = rna_idprop_ui_prop_get(item, self.properties.property, False) # dont create
+ if prop_ui:
+ self.properties.min = prop_ui.get("min", -1000000000)
+ self.properties.max = prop_ui.get("max", 1000000000)
+ self.properties.description = prop_ui.get("description", "")
- WM_OT_url_open,
+ wm = context.manager
+ # This crashes, TODO - fix
+ #return wm.invoke_props_popup(self, event)
+
+ wm.invoke_props_popup(self, event)
+ return {'RUNNING_MODAL'}
- WM_OT_doc_view,
- WM_OT_doc_edit,
- WM_OT_reload_scripts,
+class WM_OT_properties_add(bpy.types.Operator):
+ '''Internal use (edit a property data_path)'''
+ bl_idname = "wm.properties_add"
+ bl_label = "Add Property"
+
+ data_path = rna_path
+
+ def execute(self, context):
+ item = eval("context.%s" % self.properties.data_path)
+
+ def unique_name(names):
+ prop = 'prop'
+ prop_new = prop
+ i = 1
+ while prop_new in names:
+ prop_new = prop + str(i)
+ i += 1
- # experemental!
- rna_prop_ui.WM_OT_properties_edit,
- rna_prop_ui.WM_OT_properties_add,
- rna_prop_ui.WM_OT_properties_remove]
+ return prop_new
+ property = unique_name(item.keys())
+
+ item[property] = 1.0
+ return {'FINISHED'}
+
+
+class WM_OT_properties_remove(bpy.types.Operator):
+ '''Internal use (edit a property data_path)'''
+ bl_idname = "wm.properties_remove"
+ bl_label = "Remove Property"
+
+ data_path = rna_path
+ property = rna_property
+
+ def execute(self, context):
+ item = eval("context.%s" % self.properties.data_path)
+ del item[self.properties.property]
+ return {'FINISHED'}
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
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
index db1bc0fac92..4cdb2f271b9 100644
--- a/release/scripts/presets/ffmpeg/DV.py
+++ b/release/scripts/presets/ffmpeg/DV.py
@@ -1,3 +1,4 @@
+import bpy
is_ntsc = (bpy.context.scene.render.fps != 25)
bpy.context.scene.render.ffmpeg_format = "DV"
diff --git a/release/scripts/presets/ffmpeg/DVD.py b/release/scripts/presets/ffmpeg/DVD.py
index 6ac6c3c5ff7..233bdab4f20 100644
--- a/release/scripts/presets/ffmpeg/DVD.py
+++ b/release/scripts/presets/ffmpeg/DVD.py
@@ -1,3 +1,4 @@
+import bpy
is_ntsc = (bpy.context.scene.render.fps != 25)
bpy.context.scene.render.ffmpeg_format = "MPEG2"
@@ -15,4 +16,4 @@ 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 \ No newline at end of file
+bpy.context.scene.render.ffmpeg_muxrate = 10080000
diff --git a/release/scripts/presets/ffmpeg/SVCD.py b/release/scripts/presets/ffmpeg/SVCD.py
index 1d8752f02d9..52f938623b8 100644
--- a/release/scripts/presets/ffmpeg/SVCD.py
+++ b/release/scripts/presets/ffmpeg/SVCD.py
@@ -1,3 +1,4 @@
+import bpy
is_ntsc = (bpy.context.scene.render.fps != 25)
bpy.context.scene.render.ffmpeg_format = "MPEG2"
@@ -15,4 +16,4 @@ 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 \ No newline at end of file
+bpy.context.scene.render.ffmpeg_muxrate = 0
diff --git a/release/scripts/presets/ffmpeg/VCD.py b/release/scripts/presets/ffmpeg/VCD.py
index 303fd85eefb..876fa2d8ba6 100644
--- a/release/scripts/presets/ffmpeg/VCD.py
+++ b/release/scripts/presets/ffmpeg/VCD.py
@@ -1,3 +1,4 @@
+import bpy
is_ntsc = (bpy.context.scene.render.fps != 25)
bpy.context.scene.render.ffmpeg_format = "MPEG1"
@@ -15,4 +16,4 @@ 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 \ No newline at end of file
+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
index e46dcd46176..74e6890a5d4 100644
--- a/release/scripts/presets/ffmpeg/h264.py
+++ b/release/scripts/presets/ffmpeg/h264.py
@@ -1,3 +1,4 @@
+import bpy
is_ntsc = (bpy.context.scene.render.fps != 25)
bpy.context.scene.render.ffmpeg_format = "H264"
@@ -13,4 +14,4 @@ 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 \ No newline at end of file
+bpy.context.scene.render.ffmpeg_muxrate = 10080000
diff --git a/release/scripts/presets/ffmpeg/theora.py b/release/scripts/presets/ffmpeg/theora.py
index bb84d977da3..6ce9d4ea7ed 100644
--- a/release/scripts/presets/ffmpeg/theora.py
+++ b/release/scripts/presets/ffmpeg/theora.py
@@ -1,3 +1,4 @@
+import bpy
is_ntsc = (bpy.context.scene.render.fps != 25)
bpy.context.scene.render.ffmpeg_format = "OGG"
@@ -13,4 +14,4 @@ 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 \ No newline at end of file
+bpy.context.scene.render.ffmpeg_muxrate = 10080000
diff --git a/release/scripts/presets/ffmpeg/xvid.py b/release/scripts/presets/ffmpeg/xvid.py
index c0f5a3adb10..0c8e3989451 100644
--- a/release/scripts/presets/ffmpeg/xvid.py
+++ b/release/scripts/presets/ffmpeg/xvid.py
@@ -1,3 +1,4 @@
+import bpy
is_ntsc = (bpy.context.scene.render.fps != 25)
bpy.context.scene.render.ffmpeg_format = "AVI"
@@ -13,4 +14,4 @@ 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 \ No newline at end of file
+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..229aa657b2f
--- /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.use_mouse_auto_depth = False
+bpy.context.user_preferences.view.use_zoom_to_mouse = False
+bpy.context.user_preferences.view.use_rotate_around_active = False
+bpy.context.user_preferences.edit.use_drag_immediately = False
+bpy.context.user_preferences.edit.use_insertkey_xyz_to_rgb = False
+bpy.context.user_preferences.inputs.select_mouse = 'RIGHT'
+bpy.context.user_preferences.inputs.view_zoom_method = 'DOLLY'
+bpy.context.user_preferences.inputs.view_zoom_axis = 'VERTICAL'
+bpy.context.user_preferences.inputs.view_rotate_method = 'TRACKBALL'
+bpy.context.user_preferences.inputs.invert_mouse_wheel_zoom = False
diff --git a/release/scripts/presets/interaction/maya.py b/release/scripts/presets/interaction/maya.py
new file mode 100644
index 00000000000..4fcf987c9b2
--- /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.show_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_shade'
+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_shade'
+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.use_pivot_point_align'
+kmi = km.items.add('wm.context_toggle', 'Q', 'PRESS')
+kmi.properties.data_path = 'space_data.show_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_edit_falloff'
+kmi = km.items.add('wm.context_toggle_enum', 'O', 'PRESS')
+kmi.properties.data_path = 'tool_settings.proportional_edit'
+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.hide_view_clear', 'H', 'PRESS', alt=True)
+kmi = km.items.add('object.hide_view_set', 'H', 'PRESS')
+kmi = km.items.add('object.hide_view_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_edit_falloff'
+kmi = km.items.add('wm.context_toggle_enum', 'O', 'PRESS')
+kmi.properties.data_path = 'tool_settings.proportional_edit'
+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_edit'
+kmi.properties.value_1 = 'DISABLED'
+kmi.properties.value_2 = 'CONNECTED'
+kmi = km.items.add('mesh.select_all', 'SELECTMOUSE', 'CLICK')
+kmi.properties.action = 'DESELECT'
+
+wm.keyconfigs.active = kc
+
+bpy.context.user_preferences.edit.use_drag_immediately = True
+bpy.context.user_preferences.edit.use_insertkey_xyz_to_rgb = False
+bpy.context.user_preferences.inputs.select_mouse = 'LEFT'
+bpy.context.user_preferences.inputs.view_zoom_method = 'DOLLY'
+bpy.context.user_preferences.inputs.view_zoom_axis = 'HORIZONTAL'
+bpy.context.user_preferences.inputs.view_rotate_method = 'TURNTABLE'
+bpy.context.user_preferences.inputs.invert_mouse_wheel_zoom = True
diff --git a/release/scripts/presets/render/DVCPRO_HD_1080p.py b/release/scripts/presets/render/DVCPRO_HD_1080p.py
index 27a2233909e..f97b389795e 100644
--- a/release/scripts/presets/render/DVCPRO_HD_1080p.py
+++ b/release/scripts/presets/render/DVCPRO_HD_1080p.py
@@ -1,3 +1,4 @@
+import bpy
bpy.context.scene.render.resolution_x = 1280
bpy.context.scene.render.resolution_y = 1080
bpy.context.scene.render.resolution_percentage = 100
diff --git a/release/scripts/presets/render/DVCPRO_HD_720p.py b/release/scripts/presets/render/DVCPRO_HD_720p.py
index e3ababa6c5f..dbe4c9243d8 100644
--- a/release/scripts/presets/render/DVCPRO_HD_720p.py
+++ b/release/scripts/presets/render/DVCPRO_HD_720p.py
@@ -1,3 +1,4 @@
+import bpy
bpy.context.scene.render.resolution_x = 960
bpy.context.scene.render.resolution_y = 720
bpy.context.scene.render.resolution_percentage = 100
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
index 8ac369f14a6..7637648e53a 100644
--- a/release/scripts/presets/render/HDV_1080p.py
+++ b/release/scripts/presets/render/HDV_1080p.py
@@ -1,3 +1,4 @@
+import bpy
bpy.context.scene.render.resolution_x = 1440
bpy.context.scene.render.resolution_y = 1080
bpy.context.scene.render.resolution_percentage = 100
diff --git a/release/scripts/presets/render/TV_NTSC_16_colon_9.py b/release/scripts/presets/render/TV_NTSC_16_colon_9.py
index 26833ba0c09..12ecaab4800 100644
--- a/release/scripts/presets/render/TV_NTSC_16_colon_9.py
+++ b/release/scripts/presets/render/TV_NTSC_16_colon_9.py
@@ -1,3 +1,4 @@
+import bpy
bpy.context.scene.render.resolution_x = 720
bpy.context.scene.render.resolution_y = 480
bpy.context.scene.render.resolution_percentage = 100
diff --git a/release/scripts/presets/render/TV_NTSC_4_colon_3.py b/release/scripts/presets/render/TV_NTSC_4_colon_3.py
index 219e9b0506d..471c45b04d7 100644
--- a/release/scripts/presets/render/TV_NTSC_4_colon_3.py
+++ b/release/scripts/presets/render/TV_NTSC_4_colon_3.py
@@ -1,3 +1,4 @@
+import bpy
bpy.context.scene.render.resolution_x = 720
bpy.context.scene.render.resolution_y = 486
bpy.context.scene.render.resolution_percentage = 100
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 c8aa6616bb0..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,3 +1,4 @@
+import bpy
bpy.context.scene.render.resolution_x = 720
bpy.context.scene.render.resolution_y = 576
bpy.context.scene.render.resolution_percentage = 100
diff --git a/release/scripts/presets/render/TV_PAL_4_colon_3.py b/release/scripts/presets/render/TV_PAL_4_colon_3.py
index 45eaaf47e44..92cb794558e 100644
--- a/release/scripts/presets/render/TV_PAL_4_colon_3.py
+++ b/release/scripts/presets/render/TV_PAL_4_colon_3.py
@@ -1,3 +1,4 @@
+import bpy
bpy.context.scene.render.resolution_x = 720
bpy.context.scene.render.resolution_y = 576
bpy.context.scene.render.resolution_percentage = 100
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..21a901c091b 100644
--- a/release/scripts/templates/gamelogic.py
+++ b/release/scripts/templates/gamelogic.py
@@ -6,8 +6,8 @@
# for keyboard event comparison
# import GameKeys
-# support for Vector(), Matrix() types and advanced functions like ScaleMatrix(...) and RotationMatrix(...)
-# import Mathutils
+# support for Vector(), Matrix() types and advanced functions like Matrix.Scale(...) and Matrix.Rotation(...)
+# 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..5a525784b51 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.")),
@@ -24,16 +23,17 @@ class ExportSomeData(bpy.types.Operator):
description="Choose between two items",
default='OPT_A')
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.active_object != None
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'}
@@ -55,12 +55,9 @@ class ExportSomeData(bpy.types.Operator):
return self.execute(context)
-
-bpy.types.register(ExportSomeData)
-
# Only needed if you want to add into a dynamic menu
menu_func = lambda self, context: self.layout.operator("export.some_data", text="Example Exporter...")
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..0c5db47674b 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):
@@ -33,7 +34,5 @@ class ModalOperator(bpy.types.Operator):
return {'CANCELLED'}
-bpy.types.register(ModalOperator)
-
if __name__ == "__main__":
bpy.ops.object.modal_operator()
diff --git a/release/scripts/templates/operator_modal_draw.py b/release/scripts/templates/operator_modal_draw.py
index 3c7c4409f50..56ffb95f555 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)
@@ -61,15 +64,3 @@ class ModalDrawOperator(bpy.types.Operator):
else:
self.report({'WARNING'}, "View3D not found, cannot run operator")
return {'CANCELLED'}
-
-
-def register():
- bpy.types.register(ModalDrawOperator)
-
-
-def unregister():
- bpy.types.unregister(ModalDrawOperator)
-
-
-if __name__ == "__main__":
- 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..9b49fd947ad
--- /dev/null
+++ b/release/scripts/templates/operator_modal_view3d.py
@@ -0,0 +1,53 @@
+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'}
diff --git a/release/scripts/templates/operator_simple.py b/release/scripts/templates/operator_simple.py
index c62d3720d96..853bfa666eb 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:
@@ -8,14 +9,14 @@ class SimpleOperator(bpy.types.Operator):
bl_idname = "object.simple_operator"
bl_label = "Simple Object Operator"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.active_object != None
def execute(self, context):
main(context)
return {'FINISHED'}
-bpy.types.register(SimpleOperator)
if __name__ == "__main__":
bpy.ops.object.simple_operator()
diff --git a/release/scripts/templates/operator_uv.py b/release/scripts/templates/operator_uv.py
index 36d8333d49d..305496e31ce 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
@@ -8,27 +9,29 @@ def main(context):
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
- if not mesh.active_uv_texture:
- bpy.ops.mesh.uv_texture_add()
+ if not mesh.uv_textures:
+ uvtex = bpy.ops.mesh.uv_texture_add()
# adjust UVs
- for i, uv in enumerate(mesh.active_uv_texture.data):
+ for i, uv in enumerate(uvtex.data):
uvs = uv.uv1, uv.uv2, uv.uv3, uv.uv4
- for j, v_idx in enumerate(mesh.faces[i].verts):
- if uv.uv_selected[j]:
+ for j, v_idx in enumerate(mesh.faces[i].vertices):
+ if uv.select_uv[j]:
# apply the location of the vertex as a UV
- uvs[j][:] = mesh.verts[v_idx].co.xy
+ uvs[j][:] = mesh.vertices[v_idx].co.xy
if is_editmode:
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
+
class UvOperator(bpy.types.Operator):
- ''''''
+ '''UV Operator description'''
bl_idname = "uv.simple_operator"
bl_label = "Simple UV Operator"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
obj = context.active_object
return (obj and obj.type == 'MESH')
@@ -36,7 +39,6 @@ class UvOperator(bpy.types.Operator):
main(context)
return {'FINISHED'}
-bpy.types.register(UvOperator)
if __name__ == "__main__":
bpy.ops.uv.simple_operator()
diff --git a/release/scripts/templates/panel_simple.py b/release/scripts/templates/panel_simple.py
index aac4b6e715e..7c73e58a3e5 100644
--- a/release/scripts/templates/panel_simple.py
+++ b/release/scripts/templates/panel_simple.py
@@ -18,5 +18,3 @@ class OBJECT_PT_hello(bpy.types.Panel):
row.label(text="Active object is: " + obj.name)
row = layout.row()
row.prop(obj, "name")
-
-bpy.types.register(OBJECT_PT_hello)
diff --git a/release/scripts/ui/properties_animviz.py b/release/scripts/ui/properties_animviz.py
index 311a8b119cf..2a463331ac7 100644
--- a/release/scripts/ui/properties_animviz.py
+++ b/release/scripts/ui/properties_animviz.py
@@ -19,35 +19,30 @@
# <pep8 compliant>
import bpy
-narrowui = 180
-################################################
# Generic Panels (Independent of DataType)
-class MotionPathButtonsPanel(bpy.types.Panel):
+class MotionPathButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_label = "Motion Paths"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def draw_settings(self, context, avs, wide_ui, bones=False):
+ def draw_settings(self, context, avs, bones=False):
layout = self.layout
- mps = avs.motion_paths
+ mps = avs.motion_path
- if wide_ui:
- layout.prop(mps, "type", expand=True)
- else:
- layout.prop(mps, "type", text="")
+ layout.prop(mps, "type", expand=True)
split = layout.split()
col = split.column()
sub = col.column(align=True)
if (mps.type == 'CURRENT_FRAME'):
- sub.prop(mps, "before_current", text="Before")
- sub.prop(mps, "after_current", text="After")
+ sub.prop(mps, "frame_before", text="Before")
+ sub.prop(mps, "frame_after", text="After")
elif (mps.type == 'RANGE'):
sub.prop(mps, "frame_start", text="Start")
sub.prop(mps, "frame_end", text="End")
@@ -56,31 +51,28 @@ class MotionPathButtonsPanel(bpy.types.Panel):
if bones:
col.row().prop(mps, "bake_location", expand=True)
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Display:")
col.prop(mps, "show_frame_numbers", text="Frame Numbers")
- col.prop(mps, "highlight_keyframes", text="Keyframes")
+ col.prop(mps, "show_keyframe_highlight", text="Keyframes")
+ if bones:
+ col.prop(mps, "show_keyframe_action_all", text="+ Non-Grouped Keyframes")
col.prop(mps, "show_keyframe_numbers", text="Keyframe Numbers")
# FIXME: this panel still needs to be ported so that it will work correctly with animviz
-class OnionSkinButtonsPanel(bpy.types.Panel):
+class OnionSkinButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_label = "Onion Skinning"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
layout = self.layout
arm = context.armature
- wide_ui = context.region.width > narrowui
- if wide_ui:
- layout.prop(arm, "ghost_type", expand=True)
- else:
- layout.prop(arm, "ghost_type", text="")
+ layout.prop(arm, "ghost_type", expand=True)
split = layout.split()
@@ -95,124 +87,23 @@ class OnionSkinButtonsPanel(bpy.types.Panel):
sub.prop(arm, "ghost_step", text="Range")
sub.prop(arm, "ghost_size", text="Step")
- if wide_ui:
- col = split.column()
- col.label(text="Display:")
- col.prop(arm, "ghost_only_selected", text="Selected Only")
-
-################################################
-# Specific Panels for DataTypes
-
-
-class OBJECT_PT_motion_paths(MotionPathButtonsPanel):
- #bl_label = "Object Motion Paths"
- bl_context = "object"
-
- def poll(self, context):
- return (context.object)
-
- def draw(self, context):
- layout = self.layout
-
- ob = context.object
- wide_ui = context.region.width > narrowui
-
- self.draw_settings(context, ob.animation_visualisation, wide_ui)
-
- layout.separator()
-
- split = layout.split()
-
- col = split.column()
- col.operator("object.paths_calculate", text="Calculate Paths")
-
- if wide_ui:
- 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
-
- ob = context.object
- wide_ui = context.region.width > narrowui
-
- self.draw_settings(context, ob.animation_visualisation, wide_ui)
-
-
-class DATA_PT_motion_paths(MotionPathButtonsPanel):
- #bl_label = "Bones Motion Paths"
- bl_context = "data"
-
- def poll(self, context):
- # XXX: include posemode check?
- return (context.object) and (context.armature)
-
- def draw(self, context):
- layout = self.layout
-
- ob = context.object
- wide_ui = context.region.width > narrowui
-
- self.draw_settings(context, ob.pose.animation_visualisation, wide_ui, bones=True)
-
- layout.separator()
-
- split = layout.split()
-
col = split.column()
- col.operator("pose.paths_calculate", text="Calculate Paths")
-
- if wide_ui:
- 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"
-
- def poll(self, context):
- # XXX: include posemode check?
- return (context.object) and (context.armature)
-
- def draw(self, context):
- layout = self.layout
+ col.label(text="Display:")
+ col.prop(arm, "show_only_ghost_selected", text="Selected Only")
- ob = context.object
- wide_ui = context.region.width > narrowui
- self.draw_settings(context, ob.pose.animation_visualisation, wide_ui, bones=True)
# 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
-# it easier to maintain these scripts.
-classes = []
+# The specialised panel types are derived in their respective UI modules
+
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_data_armature.py b/release/scripts/ui/properties_data_armature.py
index 976c2ad78d5..17186378cb0 100644
--- a/release/scripts/ui/properties_data_armature.py
+++ b/release/scripts/ui/properties_data_armature.py
@@ -20,21 +20,20 @@
import bpy
from rna_prop_ui import PropertyPanel
-narrowui = 180
-
-class DataButtonsPanel(bpy.types.Panel):
+class ArmatureButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "data"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.armature
-class DATA_PT_context_arm(DataButtonsPanel):
+class DATA_PT_context_arm(ArmatureButtonsPanel, bpy.types.Panel):
bl_label = ""
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
def draw(self, context):
layout = self.layout
@@ -42,32 +41,23 @@ class DATA_PT_context_arm(DataButtonsPanel):
ob = context.object
arm = context.armature
space = context.space_data
- wide_ui = context.region.width > narrowui
-
- if wide_ui:
- split = layout.split(percentage=0.65)
- if ob:
- split.template_ID(ob, "data")
- split.separator()
- elif arm:
- split.template_ID(space, "pin_id")
- split.separator()
- else:
- layout.template_ID(ob, "data")
-
-class DATA_PT_custom_props_arm(DataButtonsPanel, PropertyPanel):
- _context_path = "object.data"
+ split = layout.split(percentage=0.65)
+ if ob:
+ split.template_ID(ob, "data")
+ split.separator()
+ elif arm:
+ split.template_ID(space, "pin_id")
+ split.separator()
-class DATA_PT_skeleton(DataButtonsPanel):
+class DATA_PT_skeleton(ArmatureButtonsPanel, bpy.types.Panel):
bl_label = "Skeleton"
def draw(self, context):
layout = self.layout
arm = context.armature
- wide_ui = context.region.width > narrowui
layout.prop(arm, "pose_position", expand=True)
@@ -75,20 +65,23 @@ class DATA_PT_skeleton(DataButtonsPanel):
col = split.column()
col.label(text="Layers:")
- col.prop(arm, "layer", text="")
+ col.prop(arm, "layers", text="")
col.label(text="Protected Layers:")
- col.prop(arm, "layer_protection", text="")
+ col.prop(arm, "layers_protected", text="")
- if wide_ui:
- col = split.column()
col.label(text="Deform:")
- col.prop(arm, "deform_vertexgroups", text="Vertex Groups")
- col.prop(arm, "deform_envelope", text="Envelopes")
- col.prop(arm, "deform_quaternion", text="Quaternion")
- col.prop(arm, "deform_bbone_rest", text="B-Bones Rest")
+
+ split = layout.split()
+
+ col = split.column()
+ col.prop(arm, "use_deform_vertex_groups", text="Vertex Groups")
+ col.prop(arm, "use_deform_envelopes", text="Envelopes")
+
+ col = split.column()
+ col.prop(arm, "use_deform_preserve_volume", text="Quaternion")
-class DATA_PT_display(DataButtonsPanel):
+class DATA_PT_display(ArmatureButtonsPanel, bpy.types.Panel):
bl_label = "Display"
def draw(self, context):
@@ -96,31 +89,27 @@ class DATA_PT_display(DataButtonsPanel):
ob = context.object
arm = context.armature
- wide_ui = context.region.width > narrowui
- if wide_ui:
- layout.row().prop(arm, "drawtype", expand=True)
- else:
- layout.row().prop(arm, "drawtype", text="")
+ layout.row().prop(arm, "draw_type", expand=True)
split = layout.split()
col = split.column()
- col.prop(arm, "draw_names", text="Names")
- col.prop(arm, "draw_axes", text="Axes")
- col.prop(arm, "draw_custom_bone_shapes", text="Shapes")
+ col.prop(arm, "show_names", text="Names")
+ col.prop(arm, "show_axes", text="Axes")
+ col.prop(arm, "show_bone_custom_shapes", text="Shapes")
- if wide_ui:
- 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)")
+ col = split.column()
+ col.prop(arm, "show_group_colors", text="Colors")
+ col.prop(ob, "show_x_ray", text="X-Ray")
+ col.prop(arm, "use_deform_delay", text="Delay Refresh")
-class DATA_PT_bone_groups(DataButtonsPanel):
+class DATA_PT_bone_groups(ArmatureButtonsPanel, bpy.types.Panel):
bl_label = "Bone Groups"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return (context.object and context.object.type == 'ARMATURE' and context.object.pose)
def draw(self, context):
@@ -128,17 +117,16 @@ class DATA_PT_bone_groups(DataButtonsPanel):
ob = context.object
pose = ob.pose
- wide_ui = context.region.width > narrowui
row = layout.row()
- row.template_list(pose, "bone_groups", pose, "active_bone_group_index", rows=2)
+ row.template_list(pose, "bone_groups", pose.bone_groups, "active_index", rows=2)
col = row.column(align=True)
col.active = (ob.proxy is None)
col.operator("pose.group_add", icon='ZOOMIN', text="")
col.operator("pose.group_remove", icon='ZOOMOUT', text="")
- group = pose.active_bone_group
+ group = pose.bone_groups.active
if group:
col = layout.column()
col.active = (ob.proxy is None)
@@ -150,35 +138,34 @@ class DATA_PT_bone_groups(DataButtonsPanel):
col = split.column()
col.prop(group, "color_set")
if group.color_set:
- if wide_ui:
- col = split.column()
- col.template_triColorSet(group, "colors")
+ col = split.column()
+ subrow = col.row(align=True)
+ subrow.prop(group.colors, "normal", text="")
+ subrow.prop(group.colors, "select", text="")
+ subrow.prop(group.colors, "active", text="")
- 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")
-
-# TODO: this panel will soon be depreceated too
+ sub = row.row(align=True)
+ sub.operator("pose.group_select", text="Select")
+ sub.operator("pose.group_deselect", text="Deselect")
-class DATA_PT_ghost(DataButtonsPanel):
+# TODO: this panel will soon be depreceated too
+class DATA_PT_ghost(ArmatureButtonsPanel, bpy.types.Panel):
bl_label = "Ghost"
def draw(self, context):
layout = self.layout
arm = context.armature
- wide_ui = context.region.width > narrowui
- if wide_ui:
- layout.prop(arm, "ghost_type", expand=True)
- else:
- layout.prop(arm, "ghost_type", text="")
+ layout.prop(arm, "ghost_type", expand=True)
split = layout.split()
@@ -193,17 +180,17 @@ class DATA_PT_ghost(DataButtonsPanel):
sub.prop(arm, "ghost_step", text="Range")
sub.prop(arm, "ghost_size", text="Step")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Display:")
- col.prop(arm, "ghost_only_selected", text="Selected Only")
+ col.prop(arm, "show_only_ghost_selected", text="Selected Only")
-class DATA_PT_iksolver_itasc(DataButtonsPanel):
+class DATA_PT_iksolver_itasc(ArmatureButtonsPanel, bpy.types.Panel):
bl_label = "iTaSC parameters"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
ob = context.object
return (ob and ob.pose)
@@ -213,7 +200,6 @@ class DATA_PT_iksolver_itasc(DataButtonsPanel):
ob = context.object
itasc = ob.pose.ik_param
- wide_ui = (context.region.width > narrowui)
row = layout.row()
row.prop(ob.pose, "ik_solver")
@@ -223,63 +209,91 @@ class DATA_PT_iksolver_itasc(DataButtonsPanel):
simulation = (itasc.mode == 'SIMULATION')
if simulation:
layout.label(text="Reiteration:")
- layout.prop(itasc, "reiteration", expand=True)
+ layout.prop(itasc, "reiteration_method", expand=True)
split = layout.split()
- split.active = not simulation or itasc.reiteration != 'NEVER'
+ split.active = not simulation or itasc.reiteration_method != 'NEVER'
col = split.column()
col.prop(itasc, "precision")
- if wide_ui:
- col = split.column()
- col.prop(itasc, "num_iter")
+ col = split.column()
+ col.prop(itasc, "iterations")
if simulation:
- layout.prop(itasc, "auto_step")
+ layout.prop(itasc, "use_auto_step")
row = layout.row()
- if itasc.auto_step:
- row.prop(itasc, "min_step", text="Min")
- row.prop(itasc, "max_step", text="Max")
+ if itasc.use_auto_step:
+ row.prop(itasc, "step_min", text="Min")
+ row.prop(itasc, "step_max", text="Max")
else:
- row.prop(itasc, "num_step")
+ row.prop(itasc, "step_count")
layout.prop(itasc, "solver")
if simulation:
layout.prop(itasc, "feedback")
- layout.prop(itasc, "max_velocity")
+ layout.prop(itasc, "velocity_max")
if itasc.solver == 'DLS':
row = layout.row()
- row.prop(itasc, "dampmax", text="Damp", slider=True)
- row.prop(itasc, "dampeps", text="Eps", slider=True)
+ row.prop(itasc, "damping_max", text="Damp", slider=True)
+ row.prop(itasc, "damping_epsilon", text="Eps", slider=True)
-# import generic panels from other files
-from properties_animviz import DATA_PT_motion_paths, DATA_PT_onion_skinning
+from properties_animviz import MotionPathButtonsPanel, OnionSkinButtonsPanel
-classes = [
- DATA_PT_context_arm,
- DATA_PT_skeleton,
- DATA_PT_display,
- DATA_PT_bone_groups,
- DATA_PT_ghost,
- DATA_PT_iksolver_itasc,
+class DATA_PT_motion_paths(MotionPathButtonsPanel, bpy.types.Panel):
+ #bl_label = "Bones Motion Paths"
+ bl_context = "data"
- DATA_PT_motion_paths,
- #DATA_PT_onion_skinning,
+ @classmethod
+ def poll(cls, context):
+ # XXX: include posemode check?
+ return (context.object) and (context.armature)
+
+ def draw(self, context):
+ layout = self.layout
+
+ ob = context.object
+
+ self.draw_settings(context, ob.pose.animation_visualisation, bones=True)
+
+ layout.separator()
+
+ split = layout.split()
+
+ col = split.column()
+ col.operator("pose.paths_calculate", text="Calculate Paths")
+
+ col = split.column()
+ col.operator("pose.paths_clear", text="Clear Paths")
- DATA_PT_custom_props_arm]
+class DATA_PT_onion_skinning(OnionSkinButtonsPanel): #, bpy.types.Panel): # inherit from panel when ready
+ #bl_label = "Bones Onion Skinning"
+ bl_context = "data"
+
+ @classmethod
+ def poll(cls, context):
+ # XXX: include posemode check?
+ return (context.object) and (context.armature)
+
+ def draw(self, context):
+ layout = self.layout
+
+ ob = context.object
+
+ self.draw_settings(context, ob.pose.animation_visualisation, bones=True)
+
+
+class DATA_PT_custom_props_arm(ArmatureButtonsPanel, PropertyPanel, bpy.types.Panel):
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+ _context_path = "object.data"
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_data_armature_rigify.py b/release/scripts/ui/properties_data_armature_rigify.py
index ba012368def..5903e433a4e 100644
--- a/release/scripts/ui/properties_data_armature_rigify.py
+++ b/release/scripts/ui/properties_data_armature_rigify.py
@@ -19,8 +19,6 @@
# <pep8 compliant>
import bpy
-narrowui = 180
-
class PoseTemplateSettings(bpy.types.IDPropertyGroup):
pass
@@ -40,11 +38,12 @@ class DATA_PT_template(bpy.types.Panel):
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "data"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
templates = []
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
if not context.armature:
return False
obj = context.object
@@ -85,7 +84,7 @@ class DATA_PT_template(bpy.types.Panel):
row.operator("pose.metarig_validate", text="Check")
row.operator("pose.metarig_graph", text="Graph")
row = layout.row()
- row.prop(pose_templates, "generate_def_rig")
+ row.prop(pose_templates, "use_generate_deform_rig")
row = layout.row()
col = row.column()
@@ -96,12 +95,13 @@ class DATA_PT_template(bpy.types.Panel):
subsubrow.operator("pose.metarig_assign", text="Assign")
subsubrow.operator("pose.metarig_clear", text="Clear")
- subsubrow = subrow.split(percentage=0.8)
- subsubrow.operator("pose.metarig_sample_add", text="Sample").metarig_type = self.templates[pose_templates.active_template_index]
- subsubrow.operator("pose.metarig_sample_add", text="All").metarig_type = "" # self.templates[pose_templates.active_template_index]
+ if self.templates:
+ subsubrow = subrow.split(percentage=0.8)
+ subsubrow.operator("pose.metarig_sample_add", text="Sample").metarig_type = self.templates[pose_templates.active_template_index]
+ subsubrow.operator("pose.metarig_sample_add", text="All").metarig_type = "" # self.templates[pose_templates.active_template_index]
- sub = row.column(align=True)
- sub.operator("pose.metarig_reload", icon="FILE_REFRESH", text="")
+ sub = row.column(align=True)
+ sub.operator("pose.metarig_reload", icon="FILE_REFRESH", text="")
# operators
@@ -151,7 +151,7 @@ class Generate(bpy.types.Operator):
import rigify
reload(rigify)
- meta_def = context.scene.pose_templates.generate_def_rig
+ meta_def = context.scene.pose_templates.use_generate_deform_rig
try:
rigify.generate_rig(context, context.object, META_DEF=meta_def)
@@ -212,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.path.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)
@@ -232,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()
@@ -249,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.path.clean_name(obj.name) + ".py"
wm = context.manager
wm.add_fileselect(self)
return {'RUNNING_MODAL'}
@@ -262,7 +262,8 @@ class ActiveAssign(bpy.types.Operator):
bl_idname = "pose.metarig_assign"
bl_label = "Assign to the active posebone"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
bone = context.active_pose_bone
return bool(bone and bone.id_data.mode == 'POSE')
@@ -280,7 +281,8 @@ class ActiveClear(bpy.types.Operator):
bl_idname = "pose.metarig_clear"
bl_label = "Metarig Clear Type"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
bone = context.active_pose_bone
return bool(bone and bone.id_data.mode == 'POSE')
@@ -304,36 +306,14 @@ class INFO_MT_armature_metarig_add(bpy.types.Menu):
layout.operator_context = 'INVOKE_REGION_WIN'
for submodule_type in rigify.get_submodule_types():
- text = bpy.utils.display_name(submodule_type)
+ text = bpy.path.display_name(submodule_type)
layout.operator("pose.metarig_sample_add", text=text, icon='OUTLINER_OB_ARMATURE').metarig_type = submodule_type
-classes = [
- DATA_PT_template,
-
- PoseTemplateSettings,
- PoseTemplate,
-
- Reload,
- Generate,
- Validate,
- Sample,
- Graph,
- AsScript,
-
- ActiveAssign,
- ActiveClear,
-
- INFO_MT_armature_metarig_add]
-
menu_func = (lambda self, context: self.layout.menu("INFO_MT_armature_metarig_add", icon='OUTLINER_OB_ARMATURE'))
import space_info # ensure the menu is loaded first
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
-
PoseTemplate.StringProperty(attr="name",
name="Name of the slave",
description="",
@@ -349,7 +329,7 @@ def register():
min=-1,
max=65535)
- PoseTemplateSettings.BoolProperty(attr="generate_def_rig",
+ PoseTemplateSettings.BoolProperty(attr="use_generate_deform_rig",
name="Create Deform Rig",
description="Create a copy of the metarig, constrainted by the generated rig",
default=False)
@@ -360,11 +340,8 @@ def register():
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
-
- bpy.types.INFO_MT_armature_add.remove(menu_func)
+ bpy.types.Scene.RemoveProperty("pose_templates")
+ space_info.INFO_MT_armature_add.remove(menu_func)
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_data_bone.py b/release/scripts/ui/properties_data_bone.py
index 982572b62a3..ee1c33daee7 100644
--- a/release/scripts/ui/properties_data_bone.py
+++ b/release/scripts/ui/properties_data_bone.py
@@ -20,21 +20,20 @@
import bpy
from rna_prop_ui import PropertyPanel
-narrowui = 180
-
-class BoneButtonsPanel(bpy.types.Panel):
+class BoneButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "bone"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return (context.bone or context.edit_bone)
-class BONE_PT_context_bone(BoneButtonsPanel):
+class BONE_PT_context_bone(BoneButtonsPanel, bpy.types.Panel):
bl_label = ""
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
def draw(self, context):
layout = self.layout
@@ -48,18 +47,7 @@ class BONE_PT_context_bone(BoneButtonsPanel):
row.prop(bone, "name", text="")
-class BONE_PT_custom_props(BoneButtonsPanel, PropertyPanel):
-
- @property
- def _context_path(self):
- obj = bpy.context.object
- if obj and obj.mode == 'POSE':
- return "active_pose_bone"
- else:
- return "active_bone"
-
-
-class BONE_PT_transform(BoneButtonsPanel):
+class BONE_PT_transform(BoneButtonsPanel, bpy.types.Panel):
bl_label = "Transform"
def draw(self, context):
@@ -67,72 +55,50 @@ class BONE_PT_transform(BoneButtonsPanel):
ob = context.object
bone = context.bone
- wide_ui = context.region.width > narrowui
if not bone:
bone = context.edit_bone
- if wide_ui:
- row = layout.row()
- row.column().prop(bone, "head")
- row.column().prop(bone, "tail")
-
- col = row.column()
- sub = col.column(align=True)
- sub.label(text="Roll:")
- sub.prop(bone, "roll", text="")
- sub.label()
- sub.prop(bone, "locked")
- else:
- col = layout.column()
- col.prop(bone, "head")
- col.prop(bone, "tail")
- col.prop(bone, "roll")
- col.prop(bone, "locked")
+ row = layout.row()
+ row.column().prop(bone, "head")
+ row.column().prop(bone, "tail")
+
+ col = row.column()
+ sub = col.column(align=True)
+ sub.label(text="Roll:")
+ sub.prop(bone, "roll", text="")
+ sub.label()
+ sub.prop(bone, "lock")
else:
pchan = ob.pose.bones[context.bone.name]
- if wide_ui:
- row = layout.row()
- col = row.column()
- col.prop(pchan, "location")
- col.active = not (bone.parent and bone.connected)
-
- col = row.column()
- if pchan.rotation_mode == 'QUATERNION':
- col.prop(pchan, "rotation_quaternion", text="Rotation")
- elif pchan.rotation_mode == 'AXIS_ANGLE':
- #col.label(text="Rotation")
- #col.prop(pchan, "rotation_angle", text="Angle")
- #col.prop(pchan, "rotation_axis", text="Axis")
- col.prop(pchan, "rotation_axis_angle", text="Rotation")
- else:
- col.prop(pchan, "rotation_euler", text="Rotation")
-
- row.column().prop(pchan, "scale")
-
- layout.prop(pchan, "rotation_mode")
+ row = layout.row()
+ col = row.column()
+ col.prop(pchan, "location")
+ col.active = not (bone.parent and bone.use_connect)
+
+ col = row.column()
+ if pchan.rotation_mode == 'QUATERNION':
+ col.prop(pchan, "rotation_quaternion", text="Rotation")
+ elif pchan.rotation_mode == 'AXIS_ANGLE':
+ #col.label(text="Rotation")
+ #col.prop(pchan, "rotation_angle", text="Angle")
+ #col.prop(pchan, "rotation_axis", text="Axis")
+ col.prop(pchan, "rotation_axis_angle", text="Rotation")
else:
- col = layout.column()
- sub = col.column()
- sub.active = not (bone.parent and bone.connected)
- sub.prop(pchan, "location")
- col.label(text="Rotation:")
- col.prop(pchan, "rotation_mode", text="")
- if pchan.rotation_mode == 'QUATERNION':
- col.prop(pchan, "rotation_quaternion", text="")
- elif pchan.rotation_mode == 'AXIS_ANGLE':
- col.prop(pchan, "rotation_axis_angle", text="")
- else:
- col.prop(pchan, "rotation_euler", text="")
- col.prop(pchan, "scale")
-
-
-class BONE_PT_transform_locks(BoneButtonsPanel):
+ col.prop(pchan, "rotation_euler", text="Rotation")
+
+ row.column().prop(pchan, "scale")
+
+ layout.prop(pchan, "rotation_mode")
+
+
+class BONE_PT_transform_locks(BoneButtonsPanel, bpy.types.Panel):
bl_label = "Transform Locks"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.bone
def draw(self, context):
@@ -145,7 +111,7 @@ class BONE_PT_transform_locks(BoneButtonsPanel):
row = layout.row()
col = row.column()
col.prop(pchan, "lock_location")
- col.active = not (bone.parent and bone.connected)
+ col.active = not (bone.parent and bone.use_connect)
col = row.column()
if pchan.rotation_mode in ('QUATERNION', 'AXIS_ANGLE'):
@@ -159,7 +125,7 @@ class BONE_PT_transform_locks(BoneButtonsPanel):
row.column().prop(pchan, "lock_scale")
-class BONE_PT_relations(BoneButtonsPanel):
+class BONE_PT_relations(BoneButtonsPanel, bpy.types.Panel):
bl_label = "Relations"
def draw(self, context):
@@ -168,7 +134,6 @@ class BONE_PT_relations(BoneButtonsPanel):
ob = context.object
bone = context.bone
arm = context.armature
- wide_ui = context.region.width > narrowui
if not bone:
bone = context.edit_bone
@@ -180,36 +145,36 @@ class BONE_PT_relations(BoneButtonsPanel):
col = split.column()
col.label(text="Layers:")
- col.prop(bone, "layer", text="")
+ col.prop(bone, "layers", text="")
col.separator()
if ob and pchan:
col.label(text="Bone Group:")
- col.prop_object(pchan, "bone_group", ob.pose, "bone_groups", text="")
+ col.prop_search(pchan, "bone_group", ob.pose, "bone_groups", text="")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Parent:")
if context.bone:
col.prop(bone, "parent", text="")
else:
- col.prop_object(bone, "parent", arm, "edit_bones", text="")
+ col.prop_search(bone, "parent", arm, "edit_bones", text="")
sub = col.column()
sub.active = (bone.parent is not None)
- sub.prop(bone, "connected")
- sub.prop(bone, "hinge", text="Inherit Rotation")
- sub.prop(bone, "inherit_scale", text="Inherit Scale")
+ sub.prop(bone, "use_connect")
+ sub.prop(bone, "use_hinge", text="Inherit Rotation")
+ sub.prop(bone, "use_inherit_scale", text="Inherit Scale")
sub = col.column()
- sub.active = (not bone.parent or not bone.connected)
- sub.prop(bone, "local_location", text="Local Location")
+ sub.active = (not bone.parent or not bone.use_connect)
+ sub.prop(bone, "use_local_location", text="Local Location")
-class BONE_PT_display(BoneButtonsPanel):
+class BONE_PT_display(BoneButtonsPanel, bpy.types.Panel):
bl_label = "Display"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.bone
def draw(self, context):
@@ -217,7 +182,6 @@ class BONE_PT_display(BoneButtonsPanel):
ob = context.object
bone = context.bone
- wide_ui = context.region.width > narrowui
if not bone:
bone = context.edit_bone
@@ -230,23 +194,23 @@ class BONE_PT_display(BoneButtonsPanel):
split = layout.split()
col = split.column()
- col.prop(bone, "draw_wire", text="Wireframe")
- col.prop(bone, "hidden", text="Hide")
+ col.prop(bone, "show_wire", text="Wireframe")
+ col.prop(bone, "hide", text="Hide")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Custom Shape:")
col.prop(pchan, "custom_shape", text="")
if pchan.custom_shape:
- col.prop_object(pchan, "custom_shape_transform", ob.pose, "bones", text="At")
+ col.prop_search(pchan, "custom_shape_transform", ob.pose, "bones", text="At")
-class BONE_PT_inverse_kinematics(BoneButtonsPanel):
+class BONE_PT_inverse_kinematics(BoneButtonsPanel, bpy.types.Panel):
bl_label = "Inverse Kinematics"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.active_pose_bone
def draw(self, context):
@@ -255,94 +219,85 @@ class BONE_PT_inverse_kinematics(BoneButtonsPanel):
ob = context.object
bone = context.bone
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
+ split.prop(pchan, "lock_ik_x", icon='LOCKED' if pchan.lock_ik_x else 'UNLOCKED', text="X")
+ split.active = pchan.is_in_ik_chain
row = split.row()
row.prop(pchan, "ik_stiffness_x", text="Stiffness", slider=True)
- row.active = pchan.ik_dof_x and pchan.has_ik
+ row.active = pchan.lock_ik_x == False and pchan.is_in_ik_chain
- if wide_ui:
- split = layout.split(percentage=0.25)
- sub = split.row()
- else:
- sub = layout.column(align=True)
- sub.prop(pchan, "ik_limit_x", text="Limit")
- sub.active = pchan.ik_dof_x and pchan.has_ik
- if wide_ui:
- sub = split.row(align=True)
+ split = layout.split(percentage=0.25)
+ sub = split.row()
+
+ sub.prop(pchan, "use_ik_limit_x", text="Limit")
+ sub.active = pchan.lock_ik_x == False and pchan.is_in_ik_chain
+ sub = split.row(align=True)
sub.prop(pchan, "ik_min_x", text="")
sub.prop(pchan, "ik_max_x", text="")
- sub.active = pchan.ik_dof_x and pchan.ik_limit_x and pchan.has_ik
+ sub.active = pchan.lock_ik_x == False and pchan.use_ik_limit_x and pchan.is_in_ik_chain
split = layout.split(percentage=0.25)
- split.prop(pchan, "ik_dof_y", text="Y")
- split.active = pchan.has_ik and pchan.has_ik
+ split.prop(pchan, "lock_ik_y", icon='LOCKED' if pchan.lock_ik_y else 'UNLOCKED', text="Y")
+ split.active = pchan.is_in_ik_chain
row = split.row()
row.prop(pchan, "ik_stiffness_y", text="Stiffness", slider=True)
- row.active = pchan.ik_dof_y and pchan.has_ik
+ row.active = pchan.lock_ik_y == False and pchan.is_in_ik_chain
- if wide_ui:
- split = layout.split(percentage=0.25)
- sub = split.row()
- else:
- sub = layout.column(align=True)
- sub.prop(pchan, "ik_limit_y", text="Limit")
- sub.active = pchan.ik_dof_y and pchan.has_ik
- if wide_ui:
- sub = split.row(align=True)
+ split = layout.split(percentage=0.25)
+ sub = split.row()
+
+ sub.prop(pchan, "use_ik_limit_y", text="Limit")
+ sub.active = pchan.lock_ik_y == False and pchan.is_in_ik_chain
+
+ sub = split.row(align=True)
sub.prop(pchan, "ik_min_y", text="")
sub.prop(pchan, "ik_max_y", text="")
- sub.active = pchan.ik_dof_y and pchan.ik_limit_y and pchan.has_ik
+ sub.active = pchan.lock_ik_y == False and pchan.use_ik_limit_y and pchan.is_in_ik_chain
split = layout.split(percentage=0.25)
- split.prop(pchan, "ik_dof_z", text="Z")
- split.active = pchan.has_ik and pchan.has_ik
+ split.prop(pchan, "lock_ik_z", icon='LOCKED' if pchan.lock_ik_z else 'UNLOCKED', text="Z")
+ split.active = pchan.is_in_ik_chain
sub = split.row()
sub.prop(pchan, "ik_stiffness_z", text="Stiffness", slider=True)
- sub.active = pchan.ik_dof_z and pchan.has_ik
+ sub.active = pchan.lock_ik_z == False and pchan.is_in_ik_chain
- if wide_ui:
- split = layout.split(percentage=0.25)
- sub = split.row()
- else:
- sub = layout.column(align=True)
- sub.prop(pchan, "ik_limit_z", text="Limit")
- sub.active = pchan.ik_dof_z and pchan.has_ik
- if wide_ui:
- sub = split.row(align=True)
+ split = layout.split(percentage=0.25)
+ sub = split.row()
+
+ sub.prop(pchan, "use_ik_limit_z", text="Limit")
+ sub.active = pchan.lock_ik_z == False and pchan.is_in_ik_chain
+ sub = split.row(align=True)
sub.prop(pchan, "ik_min_z", text="")
sub.prop(pchan, "ik_max_z", text="")
- sub.active = pchan.ik_dof_z and pchan.ik_limit_z and pchan.has_ik
- split = layout.split()
- split.prop(pchan, "ik_stretch", text="Stretch", slider=True)
- if wide_ui:
- split.label()
- split.active = pchan.has_ik
+ sub.active = pchan.lock_ik_z == False and pchan.use_ik_limit_z and pchan.is_in_ik_chain
+
+ split = layout.split(percentage=0.25)
+ split.label(text="Stretch:")
+ sub = split.row()
+ sub.prop(pchan, "ik_stretch", text="", slider=True)
+ sub.active = pchan.is_in_ik_chain
if ob.pose.ik_solver == 'ITASC':
split = layout.split()
col = split.column()
- col.prop(pchan, "ik_rot_control", text="Control Rotation")
- col.active = pchan.has_ik
- if wide_ui:
- col = split.column()
- col.prop(pchan, "ik_rot_weight", text="Weight", slider=True)
- col.active = pchan.has_ik
+ col.prop(pchan, "use_ik_rotation_control", text="Control Rotation")
+ col.active = pchan.is_in_ik_chain
+ col = split.column()
+ col.prop(pchan, "ik_rotation_weight", text="Weight", slider=True)
+ col.active = pchan.is_in_ik_chain
# not supported yet
#row = layout.row()
- #row.prop(pchan, "ik_lin_control", text="Joint Size")
- #row.prop(pchan, "ik_lin_weight", text="Weight", slider=True)
+ #row.prop(pchan, "use_ik_linear_control", text="Joint Size")
+ #row.prop(pchan, "ik_linear_weight", text="Weight", slider=True)
-class BONE_PT_deform(BoneButtonsPanel):
+class BONE_PT_deform(BoneButtonsPanel, bpy.types.Panel):
bl_label = "Deform"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
def draw_header(self, context):
bone = context.bone
@@ -350,18 +305,17 @@ class BONE_PT_deform(BoneButtonsPanel):
if not bone:
bone = context.edit_bone
- self.layout.prop(bone, "deform", text="")
+ self.layout.prop(bone, "use_deform", text="")
def draw(self, context):
layout = self.layout
bone = context.bone
- wide_ui = context.region.width > narrowui
if not bone:
bone = context.edit_bone
- layout.active = bone.deform
+ layout.active = bone.use_deform
split = layout.split()
@@ -371,15 +325,14 @@ class BONE_PT_deform(BoneButtonsPanel):
sub = col.column(align=True)
sub.prop(bone, "envelope_distance", text="Distance")
sub.prop(bone, "envelope_weight", text="Weight")
- col.prop(bone, "multiply_vertexgroup_with_envelope", text="Multiply")
+ col.prop(bone, "use_envelope_multiply", text="Multiply")
sub = col.column(align=True)
sub.label(text="Radius:")
sub.prop(bone, "head_radius", text="Head")
sub.prop(bone, "tail_radius", text="Tail")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Curved Bones:")
sub = col.column(align=True)
@@ -388,30 +341,27 @@ class BONE_PT_deform(BoneButtonsPanel):
sub.prop(bone, "bbone_out", text="Ease Out")
col.label(text="Offset:")
- col.prop(bone, "cyclic_offset")
+ col.prop(bone, "use_cyclic_offset")
-classes = [
- BONE_PT_context_bone,
- BONE_PT_transform,
- BONE_PT_transform_locks,
- BONE_PT_relations,
- BONE_PT_display,
- BONE_PT_inverse_kinematics,
- BONE_PT_deform,
- BONE_PT_custom_props]
+class BONE_PT_custom_props(BoneButtonsPanel, PropertyPanel, bpy.types.Panel):
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+
+ @property
+ def _context_path(self):
+ obj = bpy.context.object
+ if obj and obj.mode == 'POSE':
+ return "active_pose_bone"
+ else:
+ return "active_bone"
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_data_camera.py b/release/scripts/ui/properties_data_camera.py
index be0a4f84145..f7a7ec6b7a9 100644
--- a/release/scripts/ui/properties_data_camera.py
+++ b/release/scripts/ui/properties_data_camera.py
@@ -20,21 +20,22 @@
import bpy
from rna_prop_ui import PropertyPanel
-narrowui = 180
-
-class DataButtonsPanel(bpy.types.Panel):
+class CameraButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "data"
- def poll(self, context):
- return context.camera
+ @classmethod
+ def poll(cls, context):
+ engine = context.scene.render.engine
+ return context.camera and (engine in cls.COMPAT_ENGINES)
-class DATA_PT_context_camera(DataButtonsPanel):
+class DATA_PT_context_camera(CameraButtonsPanel, bpy.types.Panel):
bl_label = ""
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
@@ -42,40 +43,26 @@ class DATA_PT_context_camera(DataButtonsPanel):
ob = context.object
cam = context.camera
space = context.space_data
- wide_ui = context.region.width > narrowui
-
- if wide_ui:
- split = layout.split(percentage=0.65)
- if ob:
- split.template_ID(ob, "data")
- split.separator()
- elif cam:
- split.template_ID(space, "pin_id")
- split.separator()
- else:
- if ob:
- layout.template_ID(ob, "data")
- elif cam:
- layout.template_ID(space, "pin_id")
-
-
-class DATA_PT_custom_props_camera(DataButtonsPanel, PropertyPanel):
- _context_path = "object.data"
+
+ split = layout.split(percentage=0.65)
+ if ob:
+ split.template_ID(ob, "data")
+ split.separator()
+ elif cam:
+ split.template_ID(space, "pin_id")
+ split.separator()
-class DATA_PT_camera(DataButtonsPanel):
+class DATA_PT_camera(CameraButtonsPanel, bpy.types.Panel):
bl_label = "Lens"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
cam = context.camera
- wide_ui = context.region.width > narrowui
- if wide_ui:
- layout.prop(cam, "type", expand=True)
- else:
- layout.prop(cam, "type", text="")
+ layout.prop(cam, "type", expand=True)
split = layout.split()
@@ -85,14 +72,13 @@ class DATA_PT_camera(DataButtonsPanel):
col.prop(cam, "lens", text="Angle")
elif cam.lens_unit == 'DEGREES':
col.prop(cam, "angle")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(cam, "lens_unit", text="")
elif cam.type == 'ORTHO':
col.prop(cam, "ortho_scale")
- layout.prop(cam, "panorama")
+ layout.prop(cam, "use_panorama")
split = layout.split()
@@ -101,8 +87,7 @@ class DATA_PT_camera(DataButtonsPanel):
col.prop(cam, "shift_x", text="X")
col.prop(cam, "shift_y", text="Y")
- if wide_ui:
- col = split.column(align=True)
+ col = split.column(align=True)
col.label(text="Clipping:")
col.prop(cam, "clip_start", text="Start")
col.prop(cam, "clip_end", text="End")
@@ -114,23 +99,21 @@ class DATA_PT_camera(DataButtonsPanel):
col = split.column()
col.prop(cam, "dof_object", text="")
- if wide_ui:
- col = split.column()
- else:
- col = col.column()
+ col = split.column()
+
if cam.dof_object != None:
col.enabled = False
col.prop(cam, "dof_distance", text="Distance")
-class DATA_PT_camera_display(DataButtonsPanel):
+class DATA_PT_camera_display(CameraButtonsPanel, bpy.types.Panel):
bl_label = "Display"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
cam = context.camera
- wide_ui = context.region.width > narrowui
split = layout.split()
@@ -140,8 +123,7 @@ class DATA_PT_camera_display(DataButtonsPanel):
col.prop(cam, "show_title_safe", text="Title Safe")
col.prop(cam, "show_name", text="Name")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(cam, "draw_size", text="Size")
col.separator()
col.prop(cam, "show_passepartout", text="Passepartout")
@@ -150,24 +132,17 @@ class DATA_PT_camera_display(DataButtonsPanel):
sub.prop(cam, "passepartout_alpha", text="Alpha", slider=True)
-classes = [
- DATA_PT_context_camera,
- DATA_PT_camera,
- DATA_PT_camera_display,
-
- DATA_PT_custom_props_camera]
+class DATA_PT_custom_props_camera(CameraButtonsPanel, PropertyPanel, bpy.types.Panel):
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+ _context_path = "object.data"
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_data_curve.py b/release/scripts/ui/properties_data_curve.py
index 62c81df2ece..375136a335f 100644
--- a/release/scripts/ui/properties_data_curve.py
+++ b/release/scripts/ui/properties_data_curve.py
@@ -20,36 +20,37 @@
import bpy
from rna_prop_ui import PropertyPanel
-narrowui = 180
-
-class DataButtonsPanel(bpy.types.Panel):
+class CurveButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "data"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return (context.object and context.object.type in ('CURVE', 'SURFACE', 'TEXT') and context.curve)
-class DataButtonsPanelCurve(DataButtonsPanel):
+class CurveButtonsPanelCurve(CurveButtonsPanel):
'''Same as above but for curves only'''
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return (context.object and context.object.type == 'CURVE' and context.curve)
-class DataButtonsPanelActive(DataButtonsPanel):
+class CurveButtonsPanelActive(CurveButtonsPanel):
'''Same as above but for curves only'''
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
curve = context.curve
- return (curve and curve.splines.active)
+ return (curve and type(curve) is not bpy.types.TextCurve and curve.splines.active)
-class DATA_PT_context_curve(DataButtonsPanel):
+class DATA_PT_context_curve(CurveButtonsPanel, bpy.types.Panel):
bl_label = ""
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
def draw(self, context):
layout = self.layout
@@ -57,27 +58,18 @@ class DATA_PT_context_curve(DataButtonsPanel):
ob = context.object
curve = context.curve
space = context.space_data
- wide_ui = context.region.width > narrowui
-
-
- if wide_ui:
- split = layout.split(percentage=0.65)
-
- if ob:
- split.template_ID(ob, "data")
- split.separator()
- elif curve:
- split.template_ID(space, "pin_id")
- split.separator()
- else:
- layout.template_ID(ob, "data")
+ split = layout.split(percentage=0.65)
-class DATA_PT_custom_props_curve(DataButtonsPanel, PropertyPanel):
- _context_path = "object.data"
+ if ob:
+ split.template_ID(ob, "data")
+ split.separator()
+ elif curve:
+ split.template_ID(space, "pin_id")
+ split.separator()
-class DATA_PT_shape_curve(DataButtonsPanel):
+class DATA_PT_shape_curve(CurveButtonsPanel, bpy.types.Panel):
bl_label = "Shape"
def draw(self, context):
@@ -85,7 +77,6 @@ class DATA_PT_shape_curve(DataButtonsPanel):
ob = context.object
curve = context.curve
- wide_ui = context.region.width > narrowui
is_surf = (ob.type == 'SURFACE')
is_curve = (ob.type == 'CURVE')
is_text = (ob.type == 'TEXT')
@@ -107,10 +98,9 @@ class DATA_PT_shape_curve(DataButtonsPanel):
col.prop(curve, "twist_smooth", text="Smooth")
if is_text:
col.label(text="Display:")
- col.prop(curve, "fast", text="Fast Editing")
+ col.prop(curve, "use_fast_edit", text="Fast Editing")
- if wide_ui:
- col = split.column()
+ col = split.column()
if is_surf:
sub = col.column(align=True)
@@ -121,19 +111,20 @@ class DATA_PT_shape_curve(DataButtonsPanel):
if is_curve or is_text:
sub = col.column()
sub.label(text="Caps:")
- sub.prop(curve, "front")
- sub.prop(curve, "back")
- sub.prop(curve, "use_deform_fill")
+ sub.prop(curve, "use_fill_front")
+ sub.prop(curve, "use_fill_back")
+ sub.prop(curve, "use_fill_deform")
col.label(text="Textures:")
-# col.prop(curve, "uv_orco")
- col.prop(curve, "auto_texspace")
+ col.prop(curve, "use_map_on_length")
+ col.prop(curve, "use_auto_texspace")
-class DATA_PT_geometry_curve(DataButtonsPanel):
+class DATA_PT_geometry_curve(CurveButtonsPanel, bpy.types.Panel):
bl_label = "Geometry"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
obj = context.object
if obj and obj.type == 'SURFACE':
return False
@@ -144,19 +135,17 @@ class DATA_PT_geometry_curve(DataButtonsPanel):
layout = self.layout
curve = context.curve
- wide_ui = context.region.width > narrowui
split = layout.split()
col = split.column()
col.label(text="Modification:")
- col.prop(curve, "width")
+ col.prop(curve, "offset")
col.prop(curve, "extrude")
col.label(text="Taper Object:")
col.prop(curve, "taper_object", text="")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Bevel:")
col.prop(curve, "bevel_depth", text="Depth")
col.prop(curve, "bevel_resolution", text="Resolution")
@@ -164,7 +153,7 @@ class DATA_PT_geometry_curve(DataButtonsPanel):
col.prop(curve, "bevel_object", text="")
-class DATA_PT_pathanim(DataButtonsPanelCurve):
+class DATA_PT_pathanim(CurveButtonsPanelCurve, bpy.types.Panel):
bl_label = "Path Animation"
def draw_header(self, context):
@@ -176,12 +165,11 @@ class DATA_PT_pathanim(DataButtonsPanelCurve):
layout = self.layout
curve = context.curve
- wide_ui = context.region.width > narrowui
layout.active = curve.use_path
col = layout.column()
- layout.prop(curve, "path_length", text="Frames")
+ layout.prop(curve, "path_duration", text="Frames")
layout.prop(curve, "eval_time")
split = layout.split()
@@ -189,14 +177,14 @@ class DATA_PT_pathanim(DataButtonsPanelCurve):
col = split.column()
col.prop(curve, "use_path_follow")
col.prop(curve, "use_stretch")
+ col.prop(curve, "use_deform_bounds")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(curve, "use_radius")
col.prop(curve, "use_time_offset", text="Offset Children")
-class DATA_PT_active_spline(DataButtonsPanelActive):
+class DATA_PT_active_spline(CurveButtonsPanelActive, bpy.types.Panel):
bl_label = "Active Spline"
def draw(self, context):
@@ -215,9 +203,9 @@ class DATA_PT_active_spline(DataButtonsPanelActive):
# poly's set aside since they use so few settings
col = split.column()
col.label(text="Cyclic:")
- col.prop(act_spline, "smooth")
+ col.prop(act_spline, "use_smooth")
col = split.column()
- col.prop(act_spline, "cyclic_u", text="U")
+ col.prop(act_spline, "use_cyclic_u", text="U")
else:
col = split.column()
@@ -230,13 +218,13 @@ class DATA_PT_active_spline(DataButtonsPanelActive):
col.label(text="Resolution:")
col = split.column()
- col.prop(act_spline, "cyclic_u", text="U")
+ col.prop(act_spline, "use_cyclic_u", text="U")
if act_spline.type == 'NURBS':
sub = col.column()
- # sub.active = (not act_spline.cyclic_u)
- sub.prop(act_spline, "bezier_u", text="U")
- sub.prop(act_spline, "endpoint_u", text="U")
+ # sub.active = (not act_spline.use_cyclic_u)
+ sub.prop(act_spline, "use_bezier_u", text="U")
+ sub.prop(act_spline, "use_endpoint_u", text="U")
sub = col.column()
sub.prop(act_spline, "order_u", text="U")
@@ -244,13 +232,13 @@ class DATA_PT_active_spline(DataButtonsPanelActive):
if is_surf:
col = split.column()
- col.prop(act_spline, "cyclic_v", text="V")
+ col.prop(act_spline, "use_cyclic_v", text="V")
# its a surface, assume its a nurb.
sub = col.column()
- sub.active = (not act_spline.cyclic_v)
- sub.prop(act_spline, "bezier_v", text="V")
- sub.prop(act_spline, "endpoint_v", text="V")
+ sub.active = (not act_spline.use_cyclic_v)
+ sub.prop(act_spline, "use_bezier_v", text="V")
+ sub.prop(act_spline, "use_endpoint_v", text="V")
sub = col.column()
sub.prop(act_spline, "order_v", text="V")
sub.prop(act_spline, "resolution_v", text="V")
@@ -264,13 +252,14 @@ class DATA_PT_active_spline(DataButtonsPanelActive):
col.prop(act_spline, "tilt_interpolation", text="Tilt")
col.prop(act_spline, "radius_interpolation", text="Radius")
- layout.prop(act_spline, "smooth")
+ layout.prop(act_spline, "use_smooth")
-class DATA_PT_font(DataButtonsPanel):
+class DATA_PT_font(CurveButtonsPanel, bpy.types.Panel):
bl_label = "Font"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return (context.object and context.object.type == 'TEXT' and context.curve)
def draw(self, context):
@@ -278,21 +267,16 @@ class DATA_PT_font(DataButtonsPanel):
text = context.curve
char = context.curve.edit_format
- wide_ui = context.region.width > narrowui
layout.template_ID(text, "font", open="font.open", unlink="font.unlink")
- #if wide_ui:
- # layout.prop(text, "font")
- #else:
- # layout.prop(text, "font", text="")
+ #layout.prop(text, "font")
split = layout.split()
col = split.column()
- col.prop(text, "text_size", text="Size")
- if wide_ui:
- col = split.column()
+ col.prop(text, "size", text="Size")
+ col = split.column()
col.prop(text, "shear")
split = layout.split()
@@ -301,111 +285,112 @@ class DATA_PT_font(DataButtonsPanel):
col.label(text="Object Font:")
col.prop(text, "family", text="")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Text on Curve:")
- col.prop(text, "text_on_curve", text="")
+ col.prop(text, "follow_curve", text="")
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, "underline_position", text="Position")
+ colsub.prop(text, "underline_height", text="Thickness")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Character:")
- col.prop(char, "bold")
- col.prop(char, "italic")
- col.prop(char, "underline")
-# col.prop(char, "style")
-# col.prop(char, "wrap")
+ col.prop(char, "use_bold")
+ col.prop(char, "use_italic")
+ col.prop(char, "use_underline")
+
+ 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):
+class DATA_PT_paragraph(CurveButtonsPanel, bpy.types.Panel):
bl_label = "Paragraph"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return (context.object and context.object.type == 'TEXT' and context.curve)
def draw(self, context):
layout = self.layout
text = context.curve
- wide_ui = context.region.width > narrowui
layout.label(text="Align:")
- if wide_ui:
- layout.prop(text, "spacemode", expand=True)
- else:
- layout.prop(text, "spacemode", text="")
+ layout.prop(text, "align", expand=True)
split = layout.split()
col = split.column(align=True)
col.label(text="Spacing:")
- col.prop(text, "spacing", text="Character")
- col.prop(text, "word_spacing", text="Word")
- col.prop(text, "line_dist", text="Line")
+ col.prop(text, "space_character", text="Character")
+ col.prop(text, "space_word", text="Word")
+ col.prop(text, "space_line", text="Line")
- if wide_ui:
- col = split.column(align=True)
+ col = split.column(align=True)
col.label(text="Offset:")
col.prop(text, "offset_x", text="X")
col.prop(text, "offset_y", text="Y")
-class DATA_PT_textboxes(DataButtonsPanel):
+class DATA_PT_textboxes(CurveButtonsPanel, bpy.types.Panel):
bl_label = "Text Boxes"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return (context.object and context.object.type == 'TEXT' and context.curve)
def draw(self, context):
layout = self.layout
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')
+ col = split.column()
+
+ for i, box in enumerate(text.text_boxes):
+
+ 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 = 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,
- DATA_PT_shape_curve,
- DATA_PT_geometry_curve,
- DATA_PT_pathanim,
- DATA_PT_active_spline,
- DATA_PT_font,
- DATA_PT_paragraph,
- DATA_PT_textboxes,
- DATA_PT_custom_props_curve]
+class DATA_PT_custom_props_curve(CurveButtonsPanel, PropertyPanel, bpy.types.Panel):
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+ _context_path = "object.data"
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_data_empty.py b/release/scripts/ui/properties_data_empty.py
index a0999fb9d4a..bf2f3b3d0ba 100644
--- a/release/scripts/ui/properties_data_empty.py
+++ b/release/scripts/ui/properties_data_empty.py
@@ -19,49 +19,37 @@
# <pep8 compliant>
import bpy
-narrowui = 180
-
-class DataButtonsPanel(bpy.types.Panel):
+class DataButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "data"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return (context.object and context.object.type == 'EMPTY')
-class DATA_PT_empty(DataButtonsPanel):
+class DATA_PT_empty(DataButtonsPanel, bpy.types.Panel):
bl_label = "Empty"
def draw(self, context):
layout = self.layout
ob = context.object
- wide_ui = context.region.width > narrowui
- if wide_ui:
- layout.prop(ob, "empty_draw_type", text="Display")
- else:
- layout.prop(ob, "empty_draw_type", text="")
+ layout.prop(ob, "empty_draw_type", text="Display")
layout.prop(ob, "empty_draw_size", text="Size")
-classes = [
- DATA_PT_empty]
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_data_lamp.py b/release/scripts/ui/properties_data_lamp.py
index ceafb121c09..e43b3379aca 100644
--- a/release/scripts/ui/properties_data_lamp.py
+++ b/release/scripts/ui/properties_data_lamp.py
@@ -20,38 +20,29 @@
import bpy
from rna_prop_ui import PropertyPanel
-narrowui = 180
-
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
-class DataButtonsPanel(bpy.types.Panel):
+class DataButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "data"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
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)
+ return context.lamp and (engine in cls.COMPAT_ENGINES)
-class DATA_PT_context_lamp(DataButtonsPanel):
+class DATA_PT_context_lamp(DataButtonsPanel, bpy.types.Panel):
bl_label = ""
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
@@ -60,29 +51,26 @@ class DATA_PT_context_lamp(DataButtonsPanel):
ob = context.object
lamp = context.lamp
space = context.space_data
- wide_ui = context.region.width > narrowui
-
- if wide_ui:
- split = layout.split(percentage=0.65)
- if ob:
- split.template_ID(ob, "data")
- split.separator()
- elif lamp:
- split.template_ID(space, "pin_id")
- split.separator()
- else:
- if ob:
- layout.template_ID(ob, "data")
- elif lamp:
- layout.template_ID(space, "pin_id")
-
-
-class DATA_PT_custom_props_lamp(DataButtonsPanel, PropertyPanel):
- _context_path = "object.data"
+
+ split = layout.split(percentage=0.65)
+
+ if ob:
+ split.template_ID(ob, "data")
+ split.separator()
+ elif lamp:
+ split.template_ID(space, "pin_id")
+ split.separator()
+
+
+class DATA_PT_preview(DataButtonsPanel, bpy.types.Panel):
+ bl_label = "Preview"
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+ def draw(self, context):
+ self.layout.template_preview(context.lamp)
-class DATA_PT_lamp(DataButtonsPanel):
+
+class DATA_PT_lamp(DataButtonsPanel, bpy.types.Panel):
bl_label = "Lamp"
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
@@ -90,12 +78,8 @@ class DATA_PT_lamp(DataButtonsPanel):
layout = self.layout
lamp = context.lamp
- wide_ui = context.region.width > narrowui
- if wide_ui:
- layout.prop(lamp, "type", expand=True)
- else:
- layout.prop(lamp, "type", text="")
+ layout.prop(lamp, "type", expand=True)
split = layout.split()
@@ -115,39 +99,38 @@ class DATA_PT_lamp(DataButtonsPanel):
sub.prop(lamp, "linear_attenuation", slider=True, text="Linear")
sub.prop(lamp, "quadratic_attenuation", slider=True, text="Quadratic")
- col.prop(lamp, "sphere")
+ col.prop(lamp, "use_sphere")
if lamp.type == 'AREA':
col.prop(lamp, "distance")
col.prop(lamp, "gamma")
- if wide_ui:
- col = split.column()
- col.prop(lamp, "negative")
- col.prop(lamp, "layer", text="This Layer Only")
- col.prop(lamp, "specular")
- col.prop(lamp, "diffuse")
+ col = split.column()
+ col.prop(lamp, "use_negative")
+ col.prop(lamp, "use_own_layer", text="This Layer Only")
+ col.prop(lamp, "use_specular")
+ col.prop(lamp, "use_diffuse")
-class DATA_PT_sunsky(DataButtonsPanel):
+class DATA_PT_sunsky(DataButtonsPanel, bpy.types.Panel):
bl_label = "Sky & Atmosphere"
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
lamp = context.lamp
engine = context.scene.render.engine
- return (lamp and lamp.type == 'SUN') and (engine in self.COMPAT_ENGINES)
+ return (lamp and lamp.type == 'SUN') and (engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
lamp = context.lamp.sky
- wide_ui = context.region.width > narrowui
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
@@ -167,8 +150,7 @@ class DATA_PT_sunsky(DataButtonsPanel):
sub.row().prop(lamp, "sky_color_space", expand=True)
sub.prop(lamp, "sky_exposure", text="Exposure")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.active = lamp.use_sky
col.label(text="Horizon:")
sub = col.column()
@@ -193,8 +175,7 @@ class DATA_PT_sunsky(DataButtonsPanel):
col.prop(lamp, "sun_intensity", text="Sun")
col.prop(lamp, "atmosphere_distance_factor", text="Distance")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.active = lamp.use_atmosphere
col.label(text="Scattering:")
sub = col.column(align=True)
@@ -202,25 +183,36 @@ class DATA_PT_sunsky(DataButtonsPanel):
sub.prop(lamp, "atmosphere_extinction", slider=True, text="Extinction")
-class DATA_PT_shadow(DataButtonsPanel):
+class DATA_PT_shadow(DataButtonsPanel, bpy.types.Panel):
bl_label = "Shadow"
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
lamp = context.lamp
engine = context.scene.render.engine
- return (lamp and lamp.type in ('POINT', 'SUN', 'SPOT', 'AREA')) and (engine in self.COMPAT_ENGINES)
+ return (lamp and lamp.type in ('POINT', 'SUN', 'SPOT', 'AREA')) and (engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
lamp = context.lamp
- wide_ui = context.region.width > narrowui
- if wide_ui:
- layout.prop(lamp, "shadow_method", expand=True)
- else:
- layout.prop(lamp, "shadow_method", text="")
+ layout.prop(lamp, "shadow_method", expand=True)
+
+ if lamp.shadow_method == 'NOSHADOW' and lamp.type == 'AREA':
+ split = layout.split()
+
+ col= split.column()
+ col.label(text="Form factor sampling:")
+
+ sub=col.row(align=True)
+
+ if lamp.shape == 'SQUARE':
+ sub.prop(lamp, "shadow_ray_samples_x", text="Samples")
+ elif lamp.shape == 'RECTANGLE':
+ sub.prop(lamp, "shadow_ray_samples_x", text="Samples X")
+ sub.prop(lamp, "shadow_ray_samples_y", text="Samples Y")
if lamp.shadow_method != 'NOSHADOW':
split = layout.split()
@@ -228,65 +220,51 @@ class DATA_PT_shadow(DataButtonsPanel):
col = split.column()
col.prop(lamp, "shadow_color", text="")
- if wide_ui:
- col = split.column()
- col.prop(lamp, "shadow_layer", text="This Layer Only")
- col.prop(lamp, "only_shadow")
+ col = split.column()
+ col.prop(lamp, "use_shadow_layer", text="This Layer Only")
+ col.prop(lamp, "use_only_shadow")
if lamp.shadow_method == 'RAY_SHADOW':
- col = layout.column()
+ split = layout.split()
+
+ col = split.column()
col.label(text="Sampling:")
- if wide_ui:
- col.row().prop(lamp, "shadow_ray_sampling_method", expand=True)
- else:
- col.prop(lamp, "shadow_ray_sampling_method", text="")
-
+
if lamp.type in ('POINT', 'SUN', 'SPOT'):
- split = layout.split()
-
- col = split.column()
- col.prop(lamp, "shadow_soft_size", text="Soft Size")
-
- col.prop(lamp, "shadow_ray_samples", text="Samples")
- if lamp.shadow_ray_sampling_method == 'ADAPTIVE_QMC':
- col.prop(lamp, "shadow_adaptive_threshold", text="Threshold")
- if wide_ui:
- col = split.column()
-
+ sub = col.row()
+
+ sub.prop(lamp, "shadow_ray_samples", text="Samples")
+ sub.prop(lamp, "shadow_soft_size", text="Soft Size")
+
elif lamp.type == 'AREA':
- split = layout.split()
-
- col = split.column()
-
+ sub = col.row(align=True)
+
if lamp.shape == 'SQUARE':
- col.prop(lamp, "shadow_ray_samples_x", text="Samples")
+ sub.prop(lamp, "shadow_ray_samples_x", text="Samples")
elif lamp.shape == 'RECTANGLE':
- col.prop(lamp, "shadow_ray_samples_x", text="Samples X")
- col.prop(lamp, "shadow_ray_samples_y", text="Samples Y")
-
- if lamp.shadow_ray_sampling_method == 'ADAPTIVE_QMC':
- col.prop(lamp, "shadow_adaptive_threshold", text="Threshold")
- if wide_ui:
- col = split.column()
+ sub.prop(lamp, "shadow_ray_samples_x", text="Samples X")
+ sub.prop(lamp, "shadow_ray_samples_y", text="Samples Y")
- elif lamp.shadow_ray_sampling_method == 'CONSTANT_JITTERED':
- if wide_ui:
- col = split.column()
- col.prop(lamp, "umbra")
- col.prop(lamp, "dither")
- col.prop(lamp, "jitter")
- else:
- if wide_ui:
- col = split.column()
+ col.row().prop(lamp, "shadow_ray_sample_method", expand=True)
+ split = layout.split()
+ col = split.column()
+
+ if lamp.shadow_ray_sample_method == 'ADAPTIVE_QMC':
+ col.prop(lamp, "shadow_adaptive_threshold", text="Threshold")
+ col = split.column()
+
+ if lamp.type == 'AREA' and lamp.shadow_ray_sample_method == 'CONSTANT_JITTERED':
+ col = split.column()
+ col = split.column()
+ col.prop(lamp, "use_umbra")
+ col.prop(lamp, "use_dither")
+ col.prop(lamp, "use_jitter")
elif lamp.shadow_method == 'BUFFER_SHADOW':
col = layout.column()
col.label(text="Buffer Type:")
- if wide_ui:
- col.row().prop(lamp, "shadow_buffer_type", expand=True)
- else:
- col.row().prop(lamp, "shadow_buffer_type", text="")
+ col.row().prop(lamp, "shadow_buffer_type", expand=True)
if lamp.shadow_buffer_type in ('REGULAR', 'HALFWAY', 'DEEP'):
split = layout.split()
@@ -298,8 +276,7 @@ class DATA_PT_shadow(DataButtonsPanel):
sub.prop(lamp, "shadow_buffer_soft", text="Soft")
sub.prop(lamp, "shadow_buffer_bias", text="Bias")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Sample Buffers:")
col.prop(lamp, "shadow_sample_buffers", text="")
sub = col.column(align=True)
@@ -314,39 +291,39 @@ class DATA_PT_shadow(DataButtonsPanel):
split = layout.split()
col = split.column()
- col.prop(lamp, "auto_clip_start", text="Autoclip Start")
+ col.prop(lamp, "use_auto_clip_start", text="Autoclip Start")
sub = col.column()
- sub.active = not lamp.auto_clip_start
+ sub.active = not lamp.use_auto_clip_start
sub.prop(lamp, "shadow_buffer_clip_start", text="Clip Start")
- if wide_ui:
- col = split.column()
- col.prop(lamp, "auto_clip_end", text="Autoclip End")
+ col = split.column()
+ col.prop(lamp, "use_auto_clip_end", text="Autoclip End")
sub = col.column()
- sub.active = not lamp.auto_clip_end
+ sub.active = not lamp.use_auto_clip_end
sub.prop(lamp, "shadow_buffer_clip_end", text=" Clip End")
-class DATA_PT_area(DataButtonsPanel):
+class DATA_PT_area(DataButtonsPanel, bpy.types.Panel):
bl_label = "Area Shape"
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
lamp = context.lamp
engine = context.scene.render.engine
- return (lamp and lamp.type == 'AREA') and (engine in self.COMPAT_ENGINES)
+ return (lamp and lamp.type == 'AREA') and (engine in cls.COMPAT_ENGINES)
def draw(self, context):
- layout = self.layout
-
lamp = context.lamp
+ layout = self.layout
split = layout.split()
col = split.column()
+
col.row().prop(lamp, "shape", expand=True)
+ sub = col.row(align=True)
- sub = col.column(align=True)
if (lamp.shape == 'SQUARE'):
sub.prop(lamp, "size")
elif (lamp.shape == 'RECTANGLE'):
@@ -354,20 +331,20 @@ class DATA_PT_area(DataButtonsPanel):
sub.prop(lamp, "size_y", text="Size Y")
-class DATA_PT_spot(DataButtonsPanel):
+class DATA_PT_spot(DataButtonsPanel, bpy.types.Panel):
bl_label = "Spot Shape"
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
lamp = context.lamp
engine = context.scene.render.engine
- return (lamp and lamp.type == 'SPOT') and (engine in self.COMPAT_ENGINES)
+ return (lamp and lamp.type == 'SPOT') and (engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
lamp = context.lamp
- wide_ui = context.region.width > narrowui
split = layout.split()
@@ -375,31 +352,30 @@ class DATA_PT_spot(DataButtonsPanel):
sub = col.column()
sub.prop(lamp, "spot_size", text="Size")
sub.prop(lamp, "spot_blend", text="Blend", slider=True)
- col.prop(lamp, "square")
+ col.prop(lamp, "use_square")
col.prop(lamp, "show_cone")
- if wide_ui:
- col = split.column()
- else:
- col.separator()
- col.prop(lamp, "halo")
+ col = split.column()
+
+ col.prop(lamp, "use_halo")
sub = col.column(align=True)
- sub.active = lamp.halo
+ sub.active = lamp.use_halo
sub.prop(lamp, "halo_intensity", text="Intensity")
if lamp.shadow_method == 'BUFFER_SHADOW':
sub.prop(lamp, "halo_step", text="Step")
-class DATA_PT_falloff_curve(DataButtonsPanel):
+class DATA_PT_falloff_curve(DataButtonsPanel, bpy.types.Panel):
bl_label = "Falloff Curve"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
lamp = context.lamp
engine = context.scene.render.engine
- return (lamp and lamp.type in ('POINT', 'SPOT') and lamp.falloff_type == 'CUSTOM_CURVE') and (engine in self.COMPAT_ENGINES)
+ return (lamp and lamp.type in ('POINT', 'SPOT') and lamp.falloff_type == 'CUSTOM_CURVE') and (engine in cls.COMPAT_ENGINES)
def draw(self, context):
lamp = context.lamp
@@ -407,31 +383,17 @@ class DATA_PT_falloff_curve(DataButtonsPanel):
self.layout.template_curve_mapping(lamp, "falloff_curve")
-classes = [
- LAMP_MT_sunsky_presets,
-
- DATA_PT_context_lamp,
- DATA_PT_preview,
- DATA_PT_lamp,
- DATA_PT_falloff_curve,
- DATA_PT_area,
- DATA_PT_spot,
- DATA_PT_shadow,
- DATA_PT_sunsky,
-
- DATA_PT_custom_props_lamp]
+class DATA_PT_custom_props_lamp(DataButtonsPanel, PropertyPanel, bpy.types.Panel):
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+ _context_path = "object.data"
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_data_lattice.py b/release/scripts/ui/properties_data_lattice.py
index 0c1f9d8001c..05b331ea0a2 100644
--- a/release/scripts/ui/properties_data_lattice.py
+++ b/release/scripts/ui/properties_data_lattice.py
@@ -20,21 +20,20 @@
import bpy
from rna_prop_ui import PropertyPanel
-narrowui = 180
-
-class DataButtonsPanel(bpy.types.Panel):
+class DataButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "data"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.lattice
-class DATA_PT_context_lattice(DataButtonsPanel):
+class DATA_PT_context_lattice(DataButtonsPanel, bpy.types.Panel):
bl_label = ""
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
def draw(self, context):
layout = self.layout
@@ -42,77 +41,58 @@ class DATA_PT_context_lattice(DataButtonsPanel):
ob = context.object
lat = context.lattice
space = context.space_data
- wide_ui = context.region.width > narrowui
-
- if wide_ui:
- split = layout.split(percentage=0.65)
- if ob:
- split.template_ID(ob, "data")
- split.separator()
- elif lat:
- split.template_ID(space, "pin_id")
- split.separator()
- else:
- if ob:
- layout.template_ID(ob, "data")
- elif lat:
- layout.template_ID(space, "pin_id")
-
-
-class DATA_PT_custom_props_lattice(DataButtonsPanel, PropertyPanel):
- _context_path = "object.data"
+
+ split = layout.split(percentage=0.65)
+ if ob:
+ split.template_ID(ob, "data")
+ split.separator()
+ elif lat:
+ split.template_ID(space, "pin_id")
+ split.separator()
-class DATA_PT_lattice(DataButtonsPanel):
+class DATA_PT_lattice(DataButtonsPanel, bpy.types.Panel):
bl_label = "Lattice"
def draw(self, context):
layout = self.layout
lat = context.lattice
- wide_ui = context.region.width > narrowui
split = layout.split()
col = split.column()
col.prop(lat, "points_u")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(lat, "interpolation_type_u", text="")
split = layout.split()
col = split.column()
col.prop(lat, "points_v")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(lat, "interpolation_type_v", text="")
split = layout.split()
col = split.column()
col.prop(lat, "points_w")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(lat, "interpolation_type_w", text="")
- layout.prop(lat, "outside")
-
+ row = layout.row()
+ row.prop(lat, "use_outside")
+ row.prop_search(lat, "vertex_group", context.object, "vertex_groups", text="")
+
-classes = [
- DATA_PT_context_lattice,
- DATA_PT_lattice,
-
- DATA_PT_custom_props_lattice]
+class DATA_PT_custom_props_lattice(DataButtonsPanel, PropertyPanel, bpy.types.Panel):
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+ _context_path = "object.data"
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_data_mesh.py b/release/scripts/ui/properties_data_mesh.py
index d48d2ec8046..e3b222e71b7 100644
--- a/release/scripts/ui/properties_data_mesh.py
+++ b/release/scripts/ui/properties_data_mesh.py
@@ -20,11 +20,10 @@
import bpy
from rna_prop_ui import PropertyPanel
-narrowui = 180
-
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 +37,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
@@ -47,18 +47,21 @@ class MESH_MT_shape_key_specials(bpy.types.Menu):
layout.operator("object.shape_key_mirror", icon='ARROW_LEFTRIGHT')
-class DataButtonsPanel(bpy.types.Panel):
+class MeshButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "data"
- def poll(self, context):
- return context.mesh
+ @classmethod
+ def poll(cls, context):
+ engine = context.scene.render.engine
+ return context.mesh and (engine in cls.COMPAT_ENGINES)
-class DATA_PT_context_mesh(DataButtonsPanel):
+class DATA_PT_context_mesh(MeshButtonsPanel, bpy.types.Panel):
bl_label = ""
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
@@ -66,54 +69,41 @@ class DATA_PT_context_mesh(DataButtonsPanel):
ob = context.object
mesh = context.mesh
space = context.space_data
- wide_ui = context.region.width > narrowui
-
- if wide_ui:
- split = layout.split(percentage=0.65)
- if ob:
- split.template_ID(ob, "data")
- split.separator()
- elif mesh:
- split.template_ID(space, "pin_id")
- split.separator()
- else:
- if ob:
- layout.template_ID(ob, "data")
- elif mesh:
- layout.template_ID(space, "pin_id")
+ split = layout.split(percentage=0.65)
+ if ob:
+ split.template_ID(ob, "data")
+ split.separator()
+ elif mesh:
+ split.template_ID(space, "pin_id")
+ split.separator()
-class DATA_PT_custom_props_mesh(DataButtonsPanel, PropertyPanel):
- _context_path = "object.data"
-
-class DATA_PT_normals(DataButtonsPanel):
+class DATA_PT_normals(MeshButtonsPanel, bpy.types.Panel):
bl_label = "Normals"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
mesh = context.mesh
- wide_ui = context.region.width > narrowui
split = layout.split()
col = split.column()
- col.prop(mesh, "autosmooth")
+ col.prop(mesh, "use_auto_smooth")
sub = col.column()
- sub.active = mesh.autosmooth
- sub.prop(mesh, "autosmooth_angle", text="Angle")
+ sub.active = mesh.use_auto_smooth
+ sub.prop(mesh, "auto_smooth_angle", text="Angle")
- if wide_ui:
- col = split.column()
- else:
- col.separator()
- col.prop(mesh, "vertex_normal_flip")
- col.prop(mesh, "double_sided")
+ col = split.column()
+
+ col.prop(mesh, "show_double_sided")
-class DATA_PT_settings(DataButtonsPanel):
+class DATA_PT_settings(MeshButtonsPanel, bpy.types.Panel):
bl_label = "Settings"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
@@ -123,29 +113,36 @@ class DATA_PT_settings(DataButtonsPanel):
layout.prop(mesh, "texture_mesh")
-class DATA_PT_vertex_groups(DataButtonsPanel):
+class DATA_PT_vertex_groups(MeshButtonsPanel, bpy.types.Panel):
bl_label = "Vertex Groups"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
- def poll(self, context):
- return (context.object and context.object.type in ('MESH', 'LATTICE'))
+ @classmethod
+ def poll(cls, context):
+ engine = context.scene.render.engine
+ obj = context.object
+ return (obj and obj.type in ('MESH', 'LATTICE') and (engine in cls.COMPAT_ENGINES))
def draw(self, context):
layout = self.layout
ob = context.object
- group = ob.active_vertex_group
+ group = ob.vertex_groups.active
rows = 2
if group:
rows = 5
row = layout.row()
- row.template_list(ob, "vertex_groups", ob, "active_vertex_group_index", rows=rows)
+ row.template_list(ob, "vertex_groups", ob.vertex_groups, "active_index", rows=rows)
col = row.column(align=True)
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()
@@ -165,11 +162,15 @@ class DATA_PT_vertex_groups(DataButtonsPanel):
layout.prop(context.tool_settings, "vertex_group_weight", text="Weight")
-class DATA_PT_shape_keys(DataButtonsPanel):
+class DATA_PT_shape_keys(MeshButtonsPanel, bpy.types.Panel):
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'))
+ @classmethod
+ def poll(cls, context):
+ engine = context.scene.render.engine
+ obj = context.object
+ return (obj and obj.type in ('MESH', 'LATTICE', 'CURVE', 'SURFACE') and (engine in cls.COMPAT_ENGINES))
def draw(self, context):
layout = self.layout
@@ -177,13 +178,12 @@ class DATA_PT_shape_keys(DataButtonsPanel):
ob = context.object
key = ob.data.shape_keys
kb = ob.active_shape_key
- wide_ui = context.region.width > narrowui
enable_edit = ob.mode != 'EDIT'
enable_edit_value = False
- if ob.shape_key_lock is False:
- if enable_edit or (ob.type == 'MESH' and ob.shape_key_edit_mode):
+ if ob.show_shape_key is False:
+ if enable_edit or (ob.type == 'MESH' and ob.use_shape_key_edit_mode):
enable_edit_value = True
row = layout.row()
@@ -210,23 +210,17 @@ class DATA_PT_shape_keys(DataButtonsPanel):
split = layout.split(percentage=0.4)
row = split.row()
row.enabled = enable_edit
- if wide_ui:
- row.prop(key, "relative")
+ row.prop(key, "use_relative")
row = split.row()
row.alignment = 'RIGHT'
- if not wide_ui:
- layout.prop(key, "relative")
- row = layout.row()
-
-
sub = row.row(align=True)
subsub = sub.row(align=True)
subsub.active = enable_edit_value
- subsub.prop(ob, "shape_key_lock", text="")
+ subsub.prop(ob, "show_shape_key", text="")
subsub.prop(kb, "mute", text="")
- sub.prop(ob, "shape_key_edit_mode", text="")
+ sub.prop(ob, "use_shape_key_edit_mode", text="")
sub = row.row()
sub.operator("object.shape_key_clear", icon='X', text="")
@@ -234,7 +228,7 @@ class DATA_PT_shape_keys(DataButtonsPanel):
row = layout.row()
row.prop(kb, "name")
- if key.relative:
+ if key.use_relative:
if ob.active_shape_key_index != 0:
row = layout.row()
row.active = enable_edit_value
@@ -248,12 +242,11 @@ class DATA_PT_shape_keys(DataButtonsPanel):
col.prop(kb, "slider_min", text="Min")
col.prop(kb, "slider_max", text="Max")
- if wide_ui:
- col = split.column(align=True)
+ col = split.column(align=True)
col.active = enable_edit_value
col.label(text="Blend:")
- col.prop_object(kb, "vertex_group", ob, "vertex_groups", text="")
- col.prop_object(kb, "relative_key", key, "keys", text="")
+ col.prop_search(kb, "vertex_group", ob, "vertex_groups", text="")
+ col.prop_search(kb, "relative_key", key, "keys", text="")
else:
row = layout.row()
@@ -261,8 +254,9 @@ class DATA_PT_shape_keys(DataButtonsPanel):
row.prop(key, "slurph")
-class DATA_PT_uv_texture(DataButtonsPanel):
+class DATA_PT_uv_texture(MeshButtonsPanel, bpy.types.Panel):
bl_label = "UV Texture"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
@@ -272,19 +266,65 @@ class DATA_PT_uv_texture(DataButtonsPanel):
row = layout.row()
col = row.column()
- col.template_list(me, "uv_textures", me, "active_uv_texture_index", rows=2)
+ col.template_list(me, "uv_textures", me.uv_textures, "active_index", rows=2)
col = row.column(align=True)
col.operator("mesh.uv_texture_add", icon='ZOOMIN', text="")
col.operator("mesh.uv_texture_remove", icon='ZOOMOUT', text="")
- lay = me.active_uv_texture
+ lay = me.uv_textures.active
if lay:
layout.prop(lay, "name")
-class DATA_PT_vertex_colors(DataButtonsPanel):
+class DATA_PT_texface(MeshButtonsPanel, bpy.types.Panel):
+ bl_label = "Texture Face"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+
+ @classmethod
+ def poll(cls, 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()
+
+ me = context.mesh
+
+ tf = me.faces.active_tface
+
+ if tf:
+ split = layout.split()
+ col = split.column()
+
+ col.prop(tf, "use_light")
+ col.prop(tf, "hide")
+ col.prop(tf, "use_collision")
+
+ col.prop(tf, "use_blend_shared")
+ col.prop(tf, "use_twoside")
+ col.prop(tf, "use_object_color")
+
+ col = split.column()
+
+ col.prop(tf, "use_halo")
+ col.prop(tf, "use_billboard")
+ col.prop(tf, "use_shadow_cast")
+ col.prop(tf, "use_bitmap_text")
+ col.prop(tf, "use_alpha_sort")
+
+ col = layout.column()
+ col.prop(tf, "blend_type")
+ else:
+ col.label(text="No UV Texture")
+
+
+class DATA_PT_vertex_colors(MeshButtonsPanel, bpy.types.Panel):
bl_label = "Vertex Colors"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
@@ -294,42 +334,28 @@ class DATA_PT_vertex_colors(DataButtonsPanel):
row = layout.row()
col = row.column()
- col.template_list(me, "vertex_colors", me, "active_vertex_color_index", rows=2)
+ col.template_list(me, "vertex_colors", me.vertex_colors, "active_index", rows=2)
col = row.column(align=True)
col.operator("mesh.vertex_color_add", icon='ZOOMIN', text="")
col.operator("mesh.vertex_color_remove", icon='ZOOMOUT', text="")
- lay = me.active_vertex_color
+ lay = me.vertex_colors.active
if lay:
layout.prop(lay, "name")
-classes = [
- MESH_MT_vertex_group_specials,
- MESH_MT_shape_key_specials,
-
- DATA_PT_context_mesh,
- DATA_PT_normals,
- DATA_PT_settings,
- DATA_PT_vertex_groups,
- DATA_PT_shape_keys,
- DATA_PT_uv_texture,
- DATA_PT_vertex_colors,
-
- DATA_PT_custom_props_mesh]
+class DATA_PT_custom_props_mesh(MeshButtonsPanel, PropertyPanel, bpy.types.Panel):
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+ _context_path = "object.data"
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_data_metaball.py b/release/scripts/ui/properties_data_metaball.py
index b751a9f9059..b4bf8dc5d70 100644
--- a/release/scripts/ui/properties_data_metaball.py
+++ b/release/scripts/ui/properties_data_metaball.py
@@ -20,21 +20,20 @@
import bpy
from rna_prop_ui import PropertyPanel
-narrowui = 180
-
-class DataButtonsPanel(bpy.types.Panel):
+class DataButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "data"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.meta_ball
-class DATA_PT_context_metaball(DataButtonsPanel):
+class DATA_PT_context_metaball(DataButtonsPanel, bpy.types.Panel):
bl_label = ""
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
def draw(self, context):
layout = self.layout
@@ -42,83 +41,63 @@ class DATA_PT_context_metaball(DataButtonsPanel):
ob = context.object
mball = context.meta_ball
space = context.space_data
- wide_ui = context.region.width > narrowui
-
- if wide_ui:
- split = layout.split(percentage=0.65)
- if ob:
- split.template_ID(ob, "data")
- split.separator()
- elif mball:
- split.template_ID(space, "pin_id")
- split.separator()
- else:
- if ob:
- layout.template_ID(ob, "data")
- elif mball:
- layout.template_ID(space, "pin_id")
-
-
-class DATA_PT_custom_props_metaball(DataButtonsPanel, PropertyPanel):
- _context_path = "object.data"
+ split = layout.split(percentage=0.65)
+ if ob:
+ split.template_ID(ob, "data")
+ split.separator()
+ elif mball:
+ split.template_ID(space, "pin_id")
+ split.separator()
-class DATA_PT_metaball(DataButtonsPanel):
+
+class DATA_PT_metaball(DataButtonsPanel, bpy.types.Panel):
bl_label = "Metaball"
def draw(self, context):
layout = self.layout
mball = context.meta_ball
- wide_ui = context.region.width > narrowui
split = layout.split()
col = split.column()
col.label(text="Resolution:")
sub = col.column(align=True)
- sub.prop(mball, "wire_size", text="View")
- sub.prop(mball, "render_size", text="Render")
+ sub.prop(mball, "resolution", text="View")
+ sub.prop(mball, "render_resolution", text="Render")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Settings:")
col.prop(mball, "threshold", text="Threshold")
layout.label(text="Update:")
- if wide_ui:
- layout.prop(mball, "flag", expand=True)
- else:
- layout.prop(mball, "flag", text="")
+ layout.prop(mball, "update_method", expand=True)
-class DATA_PT_metaball_element(DataButtonsPanel):
+class DATA_PT_metaball_element(DataButtonsPanel, bpy.types.Panel):
bl_label = "Active Element"
- def poll(self, context):
- return (context.meta_ball and context.meta_ball.active_element)
+ @classmethod
+ def poll(cls, context):
+ return (context.meta_ball and context.meta_ball.elements.active)
def draw(self, context):
layout = self.layout
- metaelem = context.meta_ball.active_element
- wide_ui = context.region.width > narrowui
+ metaelem = context.meta_ball.elements.active
- if wide_ui:
- layout.prop(metaelem, "type")
- else:
- layout.prop(metaelem, "type", text="")
+ layout.prop(metaelem, "type")
split = layout.split()
col = split.column(align=True)
col.label(text="Settings:")
col.prop(metaelem, "stiffness", text="Stiffness")
- col.prop(metaelem, "negative", text="Negative")
+ col.prop(metaelem, "use_negative", text="Negative")
col.prop(metaelem, "hide", text="Hide")
- if wide_ui:
- col = split.column(align=True)
+ col = split.column(align=True)
if metaelem.type in ('CUBE', 'ELLIPSOID'):
col.label(text="Size:")
@@ -136,24 +115,17 @@ class DATA_PT_metaball_element(DataButtonsPanel):
col.prop(metaelem, "size_y", text="Y")
-classes = [
- DATA_PT_context_metaball,
- DATA_PT_metaball,
- DATA_PT_metaball_element,
-
- DATA_PT_custom_props_metaball]
+class DATA_PT_custom_props_metaball(DataButtonsPanel, PropertyPanel, bpy.types.Panel):
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+ _context_path = "object.data"
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_data_modifier.py b/release/scripts/ui/properties_data_modifier.py
index 5ae971bce6f..8950a017022 100644
--- a/release/scripts/ui/properties_data_modifier.py
+++ b/release/scripts/ui/properties_data_modifier.py
@@ -19,52 +19,46 @@
# <pep8 compliant>
import bpy
-narrowui = 180
-narrowmod = 260
-
-class DataButtonsPanel(bpy.types.Panel):
+class ModifierButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "modifier"
-class DATA_PT_modifiers(DataButtonsPanel):
+class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel):
bl_label = "Modifiers"
def draw(self, context):
layout = self.layout
ob = context.object
- wide_ui = context.region.width > narrowui
- compact_mod = context.region.width < narrowmod
layout.operator_menu_enum("object.modifier_add", "type")
for md in ob.modifiers:
- box = layout.template_modifier(md, compact=compact_mod)
+ box = layout.template_modifier(md)
if box:
# match enum type to our functions, avoids a lookup table.
- getattr(self, md.type)(box, ob, md, wide_ui)
+ getattr(self, md.type)(box, ob, md)
# the mt.type enum is (ab)used for a lookup on function names
# ...to avoid lengthy if statements
# so each type must have a function here.
- def ARMATURE(self, layout, ob, md, wide_ui):
+ def ARMATURE(self, layout, ob, md):
split = layout.split()
col = split.column()
col.label(text="Object:")
col.prop(md, "object", text="")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Vertex Group::")
- col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
+ col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
sub = col.column()
sub.active = bool(md.vertex_group)
- sub.prop(md, "invert")
+ sub.prop(md, "invert_vertex_group")
split = layout.split()
@@ -73,23 +67,18 @@ class DATA_PT_modifiers(DataButtonsPanel):
col.prop(md, "use_vertex_groups", text="Vertex Groups")
col.prop(md, "use_bone_envelopes", text="Bone Envelopes")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Deformation:")
- col.prop(md, "quaternion")
- col.prop(md, "multi_modifier")
-
- def ARRAY(self, layout, ob, md, wide_ui):
- if wide_ui:
- layout.prop(md, "fit_type")
- else:
- layout.prop(md, "fit_type", text="")
+ col.prop(md, "use_deform_preserve_volume")
+ col.prop(md, "use_multi_modifier")
+ def ARRAY(self, layout, ob, md):
+ layout.prop(md, "fit_type")
if md.fit_type == 'FIXED_COUNT':
layout.prop(md, "count")
elif md.fit_type == 'FIT_LENGTH':
- layout.prop(md, "length")
+ layout.prop(md, "fit_length")
elif md.fit_type == 'FIT_CURVE':
layout.prop(md, "curve")
@@ -98,31 +87,30 @@ class DATA_PT_modifiers(DataButtonsPanel):
split = layout.split()
col = split.column()
- col.prop(md, "constant_offset")
+ col.prop(md, "use_constant_offset")
sub = col.column()
- sub.active = md.constant_offset
- sub.prop(md, "constant_offset_displacement", text="")
+ sub.active = md.use_constant_offset
+ sub.prop(md, "constant_offset_displace", text="")
col.separator()
- col.prop(md, "merge_adjacent_vertices", text="Merge")
+ col.prop(md, "use_merge_vertices", text="Merge")
sub = col.column()
- sub.active = md.merge_adjacent_vertices
- sub.prop(md, "merge_end_vertices", text="First Last")
- sub.prop(md, "merge_distance", text="Distance")
+ sub.active = md.use_merge_vertices
+ sub.prop(md, "use_merge_vertices_cap", text="First Last")
+ sub.prop(md, "merge_threshold", text="Distance")
- if wide_ui:
- col = split.column()
- col.prop(md, "relative_offset")
+ col = split.column()
+ col.prop(md, "use_relative_offset")
sub = col.column()
- sub.active = md.relative_offset
- sub.prop(md, "relative_offset_displacement", text="")
+ sub.active = md.use_relative_offset
+ sub.prop(md, "relative_offset_displace", text="")
col.separator()
- col.prop(md, "add_offset_object")
+ col.prop(md, "use_object_offset")
sub = col.column()
- sub.active = md.add_offset_object
+ sub.active = md.use_object_offset
sub.prop(md, "offset_object", text="")
layout.separator()
@@ -131,138 +119,128 @@ class DATA_PT_modifiers(DataButtonsPanel):
col.prop(md, "start_cap")
col.prop(md, "end_cap")
- def BEVEL(self, layout, ob, md, wide_ui):
+ def BEVEL(self, layout, ob, md):
split = layout.split()
col = split.column()
col.prop(md, "width")
- if wide_ui:
- col = split.column()
- col.prop(md, "only_vertices")
+ col = split.column()
+ col.prop(md, "use_only_vertices")
layout.label(text="Limit Method:")
layout.row().prop(md, "limit_method", expand=True)
if md.limit_method == 'ANGLE':
- layout.prop(md, "angle")
+ layout.prop(md, "angle_limit")
elif md.limit_method == 'WEIGHT':
layout.row().prop(md, "edge_weight_method", expand=True)
- def BOOLEAN(self, layout, ob, md, wide_ui):
+ def BOOLEAN(self, layout, ob, md):
split = layout.split()
col = split.column()
col.label(text="Operation:")
col.prop(md, "operation", text="")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Object:")
col.prop(md, "object", text="")
- def BUILD(self, layout, ob, md, wide_ui):
+ def BUILD(self, layout, ob, md):
split = layout.split()
col = split.column()
- col.prop(md, "start")
- col.prop(md, "length")
+ col.prop(md, "frame_start")
+ col.prop(md, "frame_duration")
- if wide_ui:
- col = split.column()
- col.prop(md, "randomize")
+ col = split.column()
+ col.prop(md, "use_random_order")
sub = col.column()
- sub.active = md.randomize
+ sub.active = md.use_random_order
sub.prop(md, "seed")
- def CAST(self, layout, ob, md, wide_ui):
+ def CAST(self, layout, ob, md):
split = layout.split(percentage=0.25)
- if wide_ui:
- split.label(text="Cast Type:")
- split.prop(md, "cast_type", text="")
- else:
- layout.prop(md, "cast_type", text="")
+ split.label(text="Cast Type:")
+ split.prop(md, "cast_type", text="")
split = layout.split(percentage=0.25)
col = split.column()
- col.prop(md, "x")
- col.prop(md, "y")
- col.prop(md, "z")
+ col.prop(md, "use_x")
+ col.prop(md, "use_y")
+ col.prop(md, "use_z")
col = split.column()
col.prop(md, "factor")
col.prop(md, "radius")
col.prop(md, "size")
- col.prop(md, "from_radius")
+ col.prop(md, "use_radius_as_size")
split = layout.split()
col = split.column()
col.label(text="Vertex Group:")
- col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
- if wide_ui:
- col = split.column()
+ col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+ col = split.column()
col.label(text="Control Object:")
col.prop(md, "object", text="")
if md.object:
col.prop(md, "use_transform")
- def CLOTH(self, layout, ob, md, wide_ui):
+ def CLOTH(self, layout, ob, md):
layout.label(text="See Cloth panel.")
- def COLLISION(self, layout, ob, md, wide_ui):
+ def COLLISION(self, layout, ob, md):
layout.label(text="See Collision panel.")
- def CURVE(self, layout, ob, md, wide_ui):
+ def CURVE(self, layout, ob, md):
split = layout.split()
col = split.column()
col.label(text="Object:")
col.prop(md, "object", text="")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Vertex Group:")
- col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
+ col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
layout.label(text="Deformation Axis:")
layout.row().prop(md, "deform_axis", expand=True)
- def DECIMATE(self, layout, ob, md, wide_ui):
+ def DECIMATE(self, layout, ob, md):
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):
+ def DISPLACE(self, layout, ob, md):
split = layout.split()
col = split.column()
col.label(text="Texture:")
col.prop(md, "texture", text="")
col.label(text="Vertex Group:")
- col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
+ col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Direction:")
col.prop(md, "direction", text="")
col.label(text="Texture Coordinates:")
- col.prop(md, "texture_coordinates", text="")
- if md.texture_coordinates == 'OBJECT':
+ col.prop(md, "texture_coords", text="")
+ if md.texture_coords == 'OBJECT':
layout.prop(md, "texture_coordinate_object", text="Object")
- elif md.texture_coordinates == 'UV' and ob.type == 'MESH':
- layout.prop_object(md, "uv_layer", ob.data, "uv_textures")
+ elif md.texture_coords == 'UV' and ob.type == 'MESH':
+ layout.prop_search(md, "uv_layer", ob.data, "uv_textures")
layout.separator()
split = layout.split()
col = split.column()
- col.prop(md, "midlevel")
+ col.prop(md, "mid_level")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(md, "strength")
- def EDGE_SPLIT(self, layout, ob, md, wide_ui):
+ def EDGE_SPLIT(self, layout, ob, md):
split = layout.split()
col = split.column()
@@ -271,33 +249,32 @@ class DATA_PT_modifiers(DataButtonsPanel):
sub.active = md.use_edge_angle
sub.prop(md, "split_angle")
- if wide_ui:
- col = split.column()
- col.prop(md, "use_sharp", text="Sharp Edges")
+ col = split.column()
+ col.prop(md, "use_edge_sharp", text="Sharp Edges")
- def EXPLODE(self, layout, ob, md, wide_ui):
+ def EXPLODE(self, layout, ob, md):
split = layout.split()
col = split.column()
col.label(text="Vertex group:")
- col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
+ col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
sub = col.column()
sub.active = bool(md.vertex_group)
sub.prop(md, "protect")
- if wide_ui:
- col = split.column()
- col.prop(md, "split_edges")
- col.prop(md, "unborn")
- col.prop(md, "alive")
- col.prop(md, "dead")
+ col = split.column()
+ col.prop(md, "use_edge_split")
+ col.prop(md, "show_unborn")
+ col.prop(md, "show_alive")
+ col.prop(md, "show_dead")
+ col.prop(md, "use_size")
layout.operator("object.explode_refresh", text="Refresh")
- def FLUID_SIMULATION(self, layout, ob, md, wide_ui):
+ def FLUID_SIMULATION(self, layout, ob, md):
layout.label(text="See Fluid panel.")
- def HOOK(self, layout, ob, md, wide_ui):
+ def HOOK(self, layout, ob, md):
split = layout.split()
col = split.column()
@@ -305,11 +282,10 @@ class DATA_PT_modifiers(DataButtonsPanel):
col.prop(md, "object", text="")
if md.object and md.object.type == 'ARMATURE':
col.label(text="Bone:")
- col.prop_object(md, "subtarget", md.object.data, "bones", text="")
- if wide_ui:
- col = split.column()
+ col.prop_search(md, "subtarget", md.object.data, "bones", text="")
+ col = split.column()
col.label(text="Vertex Group:")
- col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
+ col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
layout.separator()
@@ -318,10 +294,8 @@ class DATA_PT_modifiers(DataButtonsPanel):
col = split.column()
col.prop(md, "falloff")
col.prop(md, "force", slider=True)
- if wide_ui:
- col = split.column()
- else:
- col.separator()
+
+ col = split.column()
col.operator("object.hook_reset", text="Reset")
col.operator("object.hook_recenter", text="Recenter")
@@ -331,52 +305,49 @@ class DATA_PT_modifiers(DataButtonsPanel):
row.operator("object.hook_select", text="Select")
row.operator("object.hook_assign", text="Assign")
- def LATTICE(self, layout, ob, md, wide_ui):
+ def LATTICE(self, layout, ob, md):
split = layout.split()
col = split.column()
col.label(text="Object:")
col.prop(md, "object", text="")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Vertex Group:")
- col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
+ col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- def MASK(self, layout, ob, md, wide_ui):
+ def MASK(self, layout, ob, md):
split = layout.split()
col = split.column()
col.label(text="Mode:")
col.prop(md, "mode", text="")
- if wide_ui:
- col = split.column()
+ col = split.column()
if md.mode == 'ARMATURE':
col.label(text="Armature:")
col.prop(md, "armature", text="")
elif md.mode == 'VERTEX_GROUP':
col.label(text="Vertex Group:")
- col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
+ col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
sub = col.column()
sub.active = bool(md.vertex_group)
- sub.prop(md, "invert")
+ sub.prop(md, "invert_vertex_group")
- def MESH_DEFORM(self, layout, ob, md, wide_ui):
+ def MESH_DEFORM(self, layout, ob, md):
split = layout.split()
col = split.column()
sub = col.column()
sub.label(text="Object:")
sub.prop(md, "object", text="")
sub.active = not md.is_bound
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Vertex Group:")
- col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
+ col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
sub = col.column()
sub.active = bool(md.vertex_group)
- sub.prop(md, "invert")
+ sub.prop(md, "invert_vertex_group")
layout.separator()
@@ -390,46 +361,35 @@ class DATA_PT_modifiers(DataButtonsPanel):
col = split.column()
col.prop(md, "precision")
- if wide_ui:
- col = split.column()
- col.prop(md, "dynamic")
+ col = split.column()
+ col.prop(md, "use_dynamic_bind")
- def MIRROR(self, layout, ob, md, wide_ui):
- layout.prop(md, "merge_limit")
- if wide_ui:
- split = layout.split(percentage=0.25)
- else:
- split = layout.split(percentage=0.4)
+ def MIRROR(self, layout, ob, md):
+ layout.prop(md, "merge_threshold")
+ split = layout.split(percentage=0.25)
col = split.column()
col.label(text="Axis:")
- col.prop(md, "x")
- col.prop(md, "y")
- col.prop(md, "z")
+ col.prop(md, "use_x")
+ col.prop(md, "use_y")
+ col.prop(md, "use_z")
- if wide_ui:
- col = split.column()
- else:
- subsplit = layout.split()
- col = subsplit.column()
+ col = split.column()
col.label(text="Options:")
- col.prop(md, "clip", text="Clipping")
- col.prop(md, "mirror_vertex_groups", text="Vertex Groups")
+ col.prop(md, "use_clip", text="Clipping")
+ col.prop(md, "use_mirror_vertex_groups", text="Vertex Groups")
col = split.column()
col.label(text="Textures:")
- col.prop(md, "mirror_u", text="U")
- col.prop(md, "mirror_v", text="V")
+ col.prop(md, "use_mirror_u", text="U")
+ col.prop(md, "use_mirror_v", text="V")
col = layout.column()
col.label(text="Mirror Object:")
col.prop(md, "mirror_object", text="")
- def MULTIRES(self, layout, ob, md, wide_ui):
- if wide_ui:
- layout.row().prop(md, "subdivision_type", expand=True)
- else:
- layout.row().prop(md, "subdivision_type", text="")
+ def MULTIRES(self, layout, ob, md):
+ layout.row().prop(md, "subdivision_type", expand=True)
split = layout.split()
col = split.column()
@@ -437,65 +397,62 @@ class DATA_PT_modifiers(DataButtonsPanel):
col.prop(md, "sculpt_levels", text="Sculpt")
col.prop(md, "render_levels", text="Render")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.enabled = ob.mode != 'EDIT'
col.operator("object.multires_subdivide", text="Subdivide")
col.operator("object.multires_higher_levels_delete", text="Delete Higher")
col.operator("object.multires_reshape", text="Reshape")
- col.prop(md, "optimal_display")
+ col.prop(md, "show_only_control_edges")
layout.separator()
col = layout.column()
row = col.row()
- if md.external:
- row.operator("object.multires_pack_external", text="Pack External")
+ if md.is_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):
+ def PARTICLE_INSTANCE(self, layout, ob, md):
layout.prop(md, "object")
- layout.prop(md, "particle_system_number", text="Particle System")
+ layout.prop(md, "particle_system_index", text="Particle System")
split = layout.split()
col = split.column()
col.label(text="Create From:")
- col.prop(md, "normal")
- col.prop(md, "children")
- col.prop(md, "size")
+ col.prop(md, "use_normal")
+ col.prop(md, "use_children")
+ col.prop(md, "use_size")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Show Particles When:")
- col.prop(md, "alive")
- col.prop(md, "unborn")
- col.prop(md, "dead")
+ col.prop(md, "show_alive")
+ col.prop(md, "show_unborn")
+ col.prop(md, "show_dead")
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")
+ col.prop(md, "use_preserve_shape")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(md, "position", slider=True)
col.prop(md, "random_position", text="Random", slider=True)
- def PARTICLE_SYSTEM(self, layout, ob, md, wide_ui):
+ def PARTICLE_SYSTEM(self, layout, ob, md):
layout.label(text="See Particle panel.")
- def SCREW(self, layout, ob, md, wide_ui):
+ def SCREW(self, layout, ob, md):
split = layout.split()
col = split.column()
@@ -505,8 +462,7 @@ class DATA_PT_modifiers(DataButtonsPanel):
col.prop(md, "steps")
col.prop(md, "render_steps")
- if wide_ui:
- col = split.column()
+ col = split.column()
row = col.row()
row.active = (md.object is None or md.use_object_screw_offset == False)
row.prop(md, "screw_offset")
@@ -517,15 +473,14 @@ class DATA_PT_modifiers(DataButtonsPanel):
col.prop(md, "use_normal_flip")
col.prop(md, "iterations")
- def SHRINKWRAP(self, layout, ob, md, wide_ui):
+ def SHRINKWRAP(self, layout, ob, md):
split = layout.split()
col = split.column()
col.label(text="Target:")
col.prop(md, "target", text="")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Vertex Group:")
- col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
+ col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
split = layout.split()
@@ -533,54 +488,47 @@ class DATA_PT_modifiers(DataButtonsPanel):
col.prop(md, "offset")
col.prop(md, "subsurf_levels")
- if wide_ui:
- col = split.column()
- col.label(text="Mode:")
- col.prop(md, "mode", text="")
+ col = split.column()
+ col.label(text="Mode:")
+ col.prop(md, "wrap_method", text="")
+
+ split = layout.split(percentage=0.25)
- if wide_ui:
- split = layout.split(percentage=0.25)
- else:
- split = layout.split(percentage=0.35)
col = split.column()
- if md.mode == 'PROJECT':
+ if md.wrap_method == 'PROJECT':
col.label(text="Axis:")
- col.prop(md, "x")
- col.prop(md, "y")
- col.prop(md, "z")
+ col.prop(md, "use_project_x")
+ col.prop(md, "use_project_y")
+ col.prop(md, "use_project_z")
col = split.column()
col.label(text="Direction:")
- col.prop(md, "negative")
- col.prop(md, "positive")
-
- if wide_ui:
- col = split.column()
- else:
- subsplit = layout.split()
- col = subsplit.column()
+ col.prop(md, "use_negative_direction")
+ col.prop(md, "use_positive_direction")
+
+ col = split.column()
+
col.label(text="Cull Faces:")
- col.prop(md, "cull_front_faces", text="Front")
- col.prop(md, "cull_back_faces", text="Back")
+ col.prop(md, "use_cull_front_faces", text="Front")
+ col.prop(md, "use_cull_back_faces", text="Back")
layout.label(text="Auxiliary Target:")
layout.prop(md, "auxiliary_target", text="")
- elif md.mode == 'NEAREST_SURFACEPOINT':
- layout.prop(md, "keep_above_surface")
+ elif md.wrap_method == 'NEAREST_SURFACEPOINT':
+ layout.prop(md, "use_keep_above_surface")
- def SIMPLE_DEFORM(self, layout, ob, md, wide_ui):
+ def SIMPLE_DEFORM(self, layout, ob, md):
split = layout.split()
col = split.column()
col.label(text="Mode:")
- col.prop(md, "mode", text="")
+ col.prop(md, "deform_method", text="")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Vertex Group:")
- col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
+ col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
split = layout.split()
@@ -588,76 +536,68 @@ class DATA_PT_modifiers(DataButtonsPanel):
col.label(text="Origin:")
col.prop(md, "origin", text="")
sub = col.column()
- sub.active = (md.origin != "")
- sub.prop(md, "relative")
+ sub.active = (md.origin is not None)
+ sub.prop(md, "use_relative")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Deform:")
col.prop(md, "factor")
col.prop(md, "limits", slider=True)
- if md.mode in ('TAPER', 'STRETCH'):
- col.prop(md, "lock_x_axis")
- col.prop(md, "lock_y_axis")
+ if md.deform_method in ('TAPER', 'STRETCH'):
+ col.prop(md, "lock_x")
+ col.prop(md, "lock_y")
- def SMOKE(self, layout, ob, md, wide_ui):
+ def SMOKE(self, layout, ob, md):
layout.label(text="See Smoke panel.")
- def SMOOTH(self, layout, ob, md, wide_ui):
+ def SMOOTH(self, layout, ob, md):
split = layout.split(percentage=0.25)
col = split.column()
col.label(text="Axis:")
- col.prop(md, "x")
- col.prop(md, "y")
- col.prop(md, "z")
+ col.prop(md, "use_x")
+ col.prop(md, "use_y")
+ col.prop(md, "use_z")
col = split.column()
col.prop(md, "factor")
- col.prop(md, "repeat")
+ col.prop(md, "iterations")
col.label(text="Vertex Group:")
- col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
+ col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- def SOFT_BODY(self, layout, ob, md, wide_ui):
+ def SOFT_BODY(self, layout, ob, md):
layout.label(text="See Soft Body panel.")
- def SOLIDIFY(self, layout, ob, md, wide_ui):
+ def SOLIDIFY(self, layout, ob, md):
split = layout.split()
col = split.column()
col.prop(md, "thickness")
- col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
+ col.prop_search(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")
col.prop(md, "edge_crease_rim", text="Rim")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(md, "offset")
colsub = col.column()
- colsub.active = (md.vertex_group is not "")
- colsub.prop(md, "invert", text="Invert")
+ colsub.active = bool(md.vertex_group)
+ colsub.prop(md, "invert_vertex_group", text="Invert")
- if wide_ui:
- col.label(text="")
-
- col.prop(md, "use_rim")
col.prop(md, "use_even_offset")
col.prop(md, "use_quality_normals")
- # col = layout.column()
- # col.label(text="Vertex Group:")
- # col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
+ col.prop(md, "use_rim")
+ colsub = col.column()
+ colsub.active = md.use_rim
+ colsub.prop(md, "use_rim_material")
- def SUBSURF(self, layout, ob, md, wide_ui):
- if wide_ui:
- layout.row().prop(md, "subdivision_type", expand=True)
- else:
- layout.row().prop(md, "subdivision_type", text="")
+ def SUBSURF(self, layout, ob, md):
+ layout.row().prop(md, "subdivision_type", expand=True)
split = layout.split()
col = split.column()
@@ -665,16 +605,15 @@ class DATA_PT_modifiers(DataButtonsPanel):
col.prop(md, "levels", text="View")
col.prop(md, "render_levels", text="Render")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Options:")
- col.prop(md, "subsurf_uv")
- col.prop(md, "optimal_display")
+ col.prop(md, "use_subsurf_uv")
+ col.prop(md, "show_only_control_edges")
- def SURFACE(self, layout, ob, md, wide_ui):
+ def SURFACE(self, layout, ob, md):
layout.label(text="See Fields panel.")
- def UV_PROJECT(self, layout, ob, md, wide_ui):
+ def UV_PROJECT(self, layout, ob, md):
if ob.type == 'MESH':
split = layout.split()
@@ -682,20 +621,18 @@ class DATA_PT_modifiers(DataButtonsPanel):
col.label(text="Image:")
col.prop(md, "image", text="")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="UV Layer:")
- col.prop_object(md, "uv_layer", ob.data, "uv_textures", text="")
+ col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="")
split = layout.split()
col = split.column()
- col.prop(md, "override_image")
- col.prop(md, "num_projectors", text="Projectors")
+ col.prop(md, "use_image_override")
+ col.prop(md, "projector_count", text="Projectors")
for proj in md.projectors:
col.prop(proj, "object", text="")
- if wide_ui:
- col = split.column()
+ col = split.column()
sub = col.column(align=True)
sub.prop(md, "aspect_x", text="Aspect X")
sub.prop(md, "aspect_y", text="Aspect Y")
@@ -704,23 +641,22 @@ class DATA_PT_modifiers(DataButtonsPanel):
sub.prop(md, "scale_x", text="Scale X")
sub.prop(md, "scale_y", text="Scale Y")
- def WAVE(self, layout, ob, md, wide_ui):
+ def WAVE(self, layout, ob, md):
split = layout.split()
col = split.column()
col.label(text="Motion:")
- col.prop(md, "x")
- col.prop(md, "y")
- col.prop(md, "cyclic")
+ col.prop(md, "use_x")
+ col.prop(md, "use_y")
+ col.prop(md, "use_cyclic")
- if wide_ui:
- col = split.column()
- col.prop(md, "normals")
+ col = split.column()
+ col.prop(md, "use_normal")
sub = col.column()
- sub.active = md.normals
- sub.prop(md, "x_normal", text="X")
- sub.prop(md, "y_normal", text="Y")
- sub.prop(md, "z_normal", text="Z")
+ sub.active = md.use_normal
+ sub.prop(md, "use_normal_x", text="X")
+ sub.prop(md, "use_normal_y", text="Y")
+ sub.prop(md, "use_normal_z", text="Z")
split = layout.split()
@@ -731,8 +667,7 @@ class DATA_PT_modifiers(DataButtonsPanel):
sub.prop(md, "lifetime", text="Life")
col.prop(md, "damping_time", text="Damping")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Position:")
sub = col.column(align=True)
sub.prop(md, "start_position_x", text="X")
@@ -742,13 +677,13 @@ class DATA_PT_modifiers(DataButtonsPanel):
layout.separator()
layout.prop(md, "start_position_object")
- layout.prop_object(md, "vertex_group", ob, "vertex_groups")
+ layout.prop_search(md, "vertex_group", ob, "vertex_groups")
layout.prop(md, "texture")
- layout.prop(md, "texture_coordinates")
- if md.texture_coordinates == 'MAP_UV' and ob.type == 'MESH':
- layout.prop_object(md, "uv_layer", ob.data, "uv_textures")
- elif md.texture_coordinates == 'OBJECT':
- layout.prop(md, "texture_coordinates_object")
+ layout.prop(md, "texture_coords")
+ if md.texture_coords == 'MAP_UV' and ob.type == 'MESH':
+ layout.prop_search(md, "uv_layer", ob.data, "uv_textures")
+ elif md.texture_coords == 'OBJECT':
+ layout.prop(md, "texture_coords_object")
layout.separator()
@@ -758,26 +693,17 @@ class DATA_PT_modifiers(DataButtonsPanel):
col.prop(md, "speed", slider=True)
col.prop(md, "height", slider=True)
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(md, "width", slider=True)
col.prop(md, "narrowness", slider=True)
-classes = [
- DATA_PT_modifiers]
-
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_game.py b/release/scripts/ui/properties_game.py
index 41af955d9ec..e703f4a9812 100644
--- a/release/scripts/ui/properties_game.py
+++ b/release/scripts/ui/properties_game.py
@@ -19,22 +19,22 @@
# <pep8 compliant>
import bpy
-narrowui = 180
-
-class PhysicsButtonsPanel(bpy.types.Panel):
+class PhysicsButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "physics"
- def poll(self, context):
- ob = context.active_object
- rd = context.scene.render
- return ob and ob.game and (rd.engine == 'BLENDER_GAME')
-
-class PHYSICS_PT_game_physics(PhysicsButtonsPanel):
+class PHYSICS_PT_game_physics(PhysicsButtonsPanel, bpy.types.Panel):
bl_label = "Physics"
+ COMPAT_ENGINES = {'BLENDER_GAME'}
+
+ @classmethod
+ def poll(cls, context):
+ ob = context.active_object
+ rd = context.scene.render
+ return ob and ob.game and (rd.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
@@ -42,12 +42,8 @@ class PHYSICS_PT_game_physics(PhysicsButtonsPanel):
ob = context.active_object
game = ob.game
soft = ob.game.soft_body
- wide_ui = context.region.width > narrowui
- if wide_ui:
- layout.prop(game, "physics_type")
- else:
- layout.prop(game, "physics_type", text="")
+ layout.prop(game, "physics_type")
layout.separator()
#if game.physics_type == 'DYNAMIC':
@@ -55,15 +51,14 @@ class PHYSICS_PT_game_physics(PhysicsButtonsPanel):
split = layout.split()
col = split.column()
- col.prop(game, "actor")
- col.prop(game, "ghost")
- col.prop(ob, "restrict_render", text="Invisible") # out of place but useful
+ col.prop(game, "use_actor")
+ col.prop(game, "use_ghost")
+ col.prop(ob, "hide_render", text="Invisible") # out of place but useful
- if wide_ui:
- col = split.column()
- col.prop(game, "material_physics")
- col.prop(game, "rotate_from_normal")
- col.prop(game, "no_sleeping")
+ col = split.column()
+ col.prop(game, "use_material_physics")
+ col.prop(game, "use_rotate_from_normal")
+ col.prop(game, "use_sleep")
layout.separator()
@@ -75,13 +70,12 @@ class PHYSICS_PT_game_physics(PhysicsButtonsPanel):
col.prop(game, "radius")
col.prop(game, "form_factor")
- if wide_ui:
- col = split.column()
+ col = split.column()
sub = col.column()
sub.active = (game.physics_type == 'RIGID_BODY')
- sub.prop(game, "anisotropic_friction")
+ sub.prop(game, "use_anisotropic_friction")
subsub = sub.column()
- subsub.active = game.anisotropic_friction
+ subsub.active = game.use_anisotropic_friction
subsub.prop(game, "friction_coefficients", text="", slider=True)
split = layout.split()
@@ -89,11 +83,10 @@ class PHYSICS_PT_game_physics(PhysicsButtonsPanel):
col = split.column()
col.label(text="Velocity:")
sub = col.column(align=True)
- sub.prop(game, "minimum_velocity", text="Minimum")
- sub.prop(game, "maximum_velocity", text="Maximum")
+ sub.prop(game, "velocity_min", text="Minimum")
+ sub.prop(game, "velocity_max", text="Maximum")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Damping:")
sub = col.column(align=True)
sub.prop(game, "damping", text="Translation", slider=True)
@@ -105,21 +98,21 @@ class PHYSICS_PT_game_physics(PhysicsButtonsPanel):
col = split.column()
col.label(text="Lock Translation:")
- col.prop(game, "lock_x_axis", text="X")
- col.prop(game, "lock_y_axis", text="Y")
- col.prop(game, "lock_z_axis", text="Z")
+ col.prop(game, "lock_location_x", text="X")
+ col.prop(game, "lock_location_y", text="Y")
+ col.prop(game, "lock_location_z", text="Z")
col = split.column()
col.label(text="Lock Rotation:")
- col.prop(game, "lock_x_rot_axis", text="X")
- col.prop(game, "lock_y_rot_axis", text="Y")
- col.prop(game, "lock_z_rot_axis", text="Z")
+ col.prop(game, "lock_rotation_x", text="X")
+ col.prop(game, "lock_rotation_y", text="Y")
+ col.prop(game, "lock_rotation_z", text="Z")
elif game.physics_type == 'SOFT_BODY':
col = layout.column()
- col.prop(game, "actor")
- col.prop(game, "ghost")
- col.prop(ob, "restrict_render", text="Invisible")
+ col.prop(game, "use_actor")
+ col.prop(game, "use_ghost")
+ col.prop(ob, "hide_render", text="Invisible")
layout.separator()
@@ -128,46 +121,47 @@ class PHYSICS_PT_game_physics(PhysicsButtonsPanel):
col = split.column()
col.label(text="Attributes:")
col.prop(game, "mass")
- col.prop(soft, "welding")
- col.prop(soft, "position_iterations")
- col.prop(soft, "linstiff", slider=True)
+ col.prop(soft, "weld_threshold")
+ col.prop(soft, "location_iterations")
+ col.prop(soft, "linear_stiffness", slider=True)
col.prop(soft, "dynamic_friction", slider=True)
- col.prop(soft, "margin", slider=True)
- col.prop(soft, "bending_const", text="Bending Constraints")
+ col.prop(soft, "collision_margin", slider=True)
+ col.prop(soft, "use_bending_constraints", text="Bending Constraints")
- if wide_ui:
- col = split.column()
- col.prop(soft, "shape_match")
+ col = split.column()
+ col.prop(soft, "use_shape_match")
sub = col.column()
- sub.active = soft.shape_match
- sub.prop(soft, "threshold", slider=True)
+ sub.active = soft.use_shape_match
+ sub.prop(soft, "shape_threshold", slider=True)
col.separator()
col.label(text="Cluster Collision:")
- col.prop(soft, "cluster_rigid_to_softbody")
- col.prop(soft, "cluster_soft_to_softbody")
+ col.prop(soft, "use_cluster_rigid_to_softbody")
+ col.prop(soft, "use_cluster_soft_to_softbody")
sub = col.column()
- sub.active = (soft.cluster_rigid_to_softbody or soft.cluster_soft_to_softbody)
+ sub.active = (soft.use_cluster_rigid_to_softbody or soft.use_cluster_soft_to_softbody)
sub.prop(soft, "cluster_iterations", text="Iterations")
elif game.physics_type == 'STATIC':
col = layout.column()
- col.prop(game, "actor")
- col.prop(game, "ghost")
- col.prop(ob, "restrict_render", text="Invisible")
+ col.prop(game, "use_actor")
+ col.prop(game, "use_ghost")
+ col.prop(ob, "hide_render", text="Invisible")
elif game.physics_type in ('SENSOR', 'INVISIBLE', 'NO_COLLISION', 'OCCLUDE'):
- layout.prop(ob, "restrict_render", text="Invisible")
+ layout.prop(ob, "hide_render", text="Invisible")
-class PHYSICS_PT_game_collision_bounds(PhysicsButtonsPanel):
+class PHYSICS_PT_game_collision_bounds(PhysicsButtonsPanel, bpy.types.Panel):
bl_label = "Collision Bounds"
+ COMPAT_ENGINES = {'BLENDER_GAME'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, 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 cls.COMPAT_ENGINES)
def draw_header(self, context):
game = context.active_object.game
@@ -178,36 +172,33 @@ class PHYSICS_PT_game_collision_bounds(PhysicsButtonsPanel):
layout = self.layout
game = context.active_object.game
- wide_ui = context.region.width > narrowui
layout.active = game.use_collision_bounds
- if wide_ui:
- layout.prop(game, "collision_bounds", text="Bounds")
- else:
- layout.prop(game, "collision_bounds", text="")
+ layout.prop(game, "collision_bounds_type", text="Bounds")
split = layout.split()
col = split.column()
col.prop(game, "collision_margin", text="Margin", slider=True)
- if wide_ui:
- col = split.column()
- col.prop(game, "collision_compound", text="Compound")
+ col = split.column()
+ col.prop(game, "use_collision_compound", text="Compound")
-class RenderButtonsPanel(bpy.types.Panel):
+class RenderButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "render"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
rd = context.scene.render
- return (rd.engine == 'BLENDER_GAME')
+ return (rd.engine in cls.COMPAT_ENGINES)
-class RENDER_PT_game(RenderButtonsPanel):
+class RENDER_PT_game(RenderButtonsPanel, bpy.types.Panel):
bl_label = "Game"
+ COMPAT_ENGINES = {'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
@@ -217,16 +208,16 @@ class RENDER_PT_game(RenderButtonsPanel):
row.label()
-class RENDER_PT_game_player(RenderButtonsPanel):
+class RENDER_PT_game_player(RenderButtonsPanel, bpy.types.Panel):
bl_label = "Standalone Player"
+ COMPAT_ENGINES = {'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
- gs = context.scene.game_data
- wide_ui = context.region.width > narrowui
+ gs = context.scene.game_settings
- layout.prop(gs, "fullscreen")
+ layout.prop(gs, "show_fullscreen")
split = layout.split()
@@ -236,8 +227,7 @@ class RENDER_PT_game_player(RenderButtonsPanel):
sub.prop(gs, "resolution_x", slider=False, text="X")
sub.prop(gs, "resolution_y", slider=False, text="Y")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Quality:")
sub = col.column(align=True)
sub.prop(gs, "depth", text="Bit Depth", slider=False)
@@ -246,23 +236,20 @@ class RENDER_PT_game_player(RenderButtonsPanel):
# framing:
col = layout.column()
col.label(text="Framing:")
- if wide_ui:
- col.row().prop(gs, "framing_type", expand=True)
- else:
- col.prop(gs, "framing_type", text="")
- if gs.framing_type == 'LETTERBOX':
- col.prop(gs, "framing_color", text="")
+ col.row().prop(gs, "frame_type", expand=True)
+ if gs.frame_type == 'LETTERBOX':
+ col.prop(gs, "frame_color", text="")
-class RENDER_PT_game_stereo(RenderButtonsPanel):
+class RENDER_PT_game_stereo(RenderButtonsPanel, bpy.types.Panel):
bl_label = "Stereo"
+ COMPAT_ENGINES = {'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
- gs = context.scene.game_data
+ gs = context.scene.game_settings
stereo_mode = gs.stereo
- wide_ui = context.region.width > narrowui
# stereo options:
layout.prop(gs, "stereo", expand=True)
@@ -270,14 +257,11 @@ class RENDER_PT_game_stereo(RenderButtonsPanel):
# stereo:
if stereo_mode == 'STEREO':
layout.prop(gs, "stereo_mode")
- layout.prop(gs, "eye_separation")
+ layout.prop(gs, "stereo_eye_separation")
# dome:
elif stereo_mode == 'DOME':
- if wide_ui:
- layout.prop(gs, "dome_mode", text="Dome Type")
- else:
- layout.prop(gs, "dome_mode", text="")
+ layout.prop(gs, "dome_mode", text="Dome Type")
dome_type = gs.dome_mode
@@ -291,8 +275,7 @@ class RENDER_PT_game_stereo(RenderButtonsPanel):
col.prop(gs, "dome_buffer_resolution", text="Resolution", slider=True)
col.prop(gs, "dome_angle", slider=True)
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(gs, "dome_tesselation", text="Tesselation")
col.prop(gs, "dome_tilt")
@@ -300,55 +283,51 @@ class RENDER_PT_game_stereo(RenderButtonsPanel):
col = split.column()
col.prop(gs, "dome_buffer_resolution", text="Resolution", slider=True)
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(gs, "dome_tesselation", text="Tesselation")
else: # cube map
col = split.column()
col.prop(gs, "dome_buffer_resolution", text="Resolution", slider=True)
- if wide_ui:
- col = split.column()
+
+ col = split.column()
layout.prop(gs, "dome_text")
-class RENDER_PT_game_shading(RenderButtonsPanel):
+class RENDER_PT_game_shading(RenderButtonsPanel, bpy.types.Panel):
bl_label = "Shading"
+ COMPAT_ENGINES = {'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
- gs = context.scene.game_data
- wide_ui = context.region.width > narrowui
+ gs = context.scene.game_settings
- if wide_ui:
- layout.prop(gs, "material_mode", expand=True)
- else:
- layout.prop(gs, "material_mode", text="")
+ layout.prop(gs, "material_mode", expand=True)
if gs.material_mode == 'GLSL':
split = layout.split()
col = split.column()
- col.prop(gs, "glsl_lights", text="Lights")
- col.prop(gs, "glsl_shaders", text="Shaders")
- col.prop(gs, "glsl_shadows", text="Shadows")
+ col.prop(gs, "use_glsl_lights", text="Lights")
+ col.prop(gs, "use_glsl_shaders", text="Shaders")
+ col.prop(gs, "use_glsl_shadows", text="Shadows")
col = split.column()
- col.prop(gs, "glsl_ramps", text="Ramps")
- col.prop(gs, "glsl_nodes", text="Nodes")
- col.prop(gs, "glsl_extra_textures", text="Extra Textures")
+ col.prop(gs, "use_glsl_ramps", text="Ramps")
+ col.prop(gs, "use_glsl_nodes", text="Nodes")
+ col.prop(gs, "use_glsl_extra_textures", text="Extra Textures")
-class RENDER_PT_game_performance(RenderButtonsPanel):
+class RENDER_PT_game_performance(RenderButtonsPanel, bpy.types.Panel):
bl_label = "Performance"
+ COMPAT_ENGINES = {'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
- gs = context.scene.game_data
- wide_ui = context.region.width > narrowui
+ gs = context.scene.game_settings
split = layout.split()
@@ -359,45 +338,41 @@ class RENDER_PT_game_performance(RenderButtonsPanel):
col.prop(gs, "show_physics_visualization", text="Physics Visualization")
col.prop(gs, "use_deprecation_warnings")
- if wide_ui:
- col = split.column()
+ col = split.column()
+
col.label(text="Render:")
col.prop(gs, "use_frame_rate")
col.prop(gs, "use_display_lists")
-class RENDER_PT_game_sound(RenderButtonsPanel):
+class RENDER_PT_game_sound(RenderButtonsPanel, bpy.types.Panel):
bl_label = "Sound"
+ COMPAT_ENGINES = {'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
scene = context.scene
- wide_ui = context.region.width > narrowui
- if wide_ui:
- layout.prop(scene, "distance_model")
- else:
- layout.prop(scene, "distance_model", text="")
- layout.prop(scene, "speed_of_sound", text="Speed")
- layout.prop(scene, "doppler_factor")
+ layout.prop(scene, "audio_distance_model")
+
+ layout.prop(scene, "audio_doppler_speed", text="Speed")
+ layout.prop(scene, "audio_doppler_factor")
-class WorldButtonsPanel(bpy.types.Panel):
+class WorldButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "world"
- def poll(self, context):
- scene = context.scene
- return (scene.render.engine == 'BLENDER_GAME') and (scene.world is not None)
-
-class WORLD_PT_game_context_world(WorldButtonsPanel):
+class WORLD_PT_game_context_world(WorldButtonsPanel, bpy.types.Panel):
bl_label = ""
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
+ COMPAT_ENGINES = {'BLENDER_GAME'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
rd = context.scene.render
return (context.scene) and (rd.use_game_engine)
@@ -407,73 +382,79 @@ class WORLD_PT_game_context_world(WorldButtonsPanel):
scene = context.scene
world = context.world
space = context.space_data
- wide_ui = context.region.width > narrowui
-
- if wide_ui:
- split = layout.split(percentage=0.65)
- if scene:
- split.template_ID(scene, "world", new="world.new")
- elif world:
- split.template_ID(space, "pin_id")
- else:
- if scene:
- layout.template_ID(scene, "world", new="world.new")
- elif world:
- layout.template_ID(space, "pin_id")
+
+ split = layout.split(percentage=0.65)
+ if scene:
+ split.template_ID(scene, "world", new="world.new")
+ elif world:
+ split.template_ID(space, "pin_id")
-class WORLD_PT_game_world(WorldButtonsPanel):
+class WORLD_PT_game_world(WorldButtonsPanel, bpy.types.Panel):
bl_label = "World"
+ COMPAT_ENGINES = {'BLENDER_GAME'}
+
+ @classmethod
+ def poll(cls, context):
+ scene = context.scene
+ return (scene.world and scene.render.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
world = context.world
- wide_ui = context.region.width > narrowui
split = layout.split()
col = split.column()
col.prop(world, "horizon_color")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(world, "ambient_color")
-class WORLD_PT_game_mist(WorldButtonsPanel):
+class WORLD_PT_game_mist(WorldButtonsPanel, bpy.types.Panel):
bl_label = "Mist"
+ COMPAT_ENGINES = {'BLENDER_GAME'}
+
+ @classmethod
+ def poll(cls, context):
+ scene = context.scene
+ return (scene.world and scene.render.engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
world = context.world
- self.layout.prop(world.mist, "enabled", text="")
+ self.layout.prop(world.mist_settings, "use_mist", text="")
def draw(self, context):
layout = self.layout
world = context.world
- wide_ui = context.region.width > narrowui
- layout.active = world.mist.enabled
+ layout.active = world.mist_settings.use_mist
split = layout.split()
col = split.column()
- col.prop(world.mist, "start")
+ col.prop(world.mist_settings, "start")
- if wide_ui:
- col = split.column()
- col.prop(world.mist, "depth")
+ col = split.column()
+ col.prop(world.mist_settings, "depth")
-class WORLD_PT_game_physics(WorldButtonsPanel):
+class WORLD_PT_game_physics(WorldButtonsPanel, bpy.types.Panel):
bl_label = "Physics"
+ COMPAT_ENGINES = {'BLENDER_GAME'}
+
+ @classmethod
+ def poll(cls, context):
+ scene = context.scene
+ return (scene.world and scene.render.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
- gs = context.scene.game_data
- wide_ui = context.region.width > narrowui
+ gs = context.scene.game_settings
layout.prop(gs, "physics_engine")
if gs.physics_engine != 'NONE':
@@ -488,8 +469,7 @@ class WORLD_PT_game_physics(WorldButtonsPanel):
sub.prop(gs, "physics_step_sub", text="Substeps")
col.prop(gs, "fps", text="FPS")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Logic Steps:")
col.prop(gs, "logic_step_max", text="Max")
@@ -511,33 +491,12 @@ class WORLD_PT_game_physics(WorldButtonsPanel):
col.prop(gs, "logic_step_max", text="Max")
-classes = [
- PHYSICS_PT_game_physics,
- PHYSICS_PT_game_collision_bounds,
-
- RENDER_PT_game,
- RENDER_PT_game_player,
- RENDER_PT_game_stereo,
- RENDER_PT_game_shading,
- RENDER_PT_game_performance,
- RENDER_PT_game_sound,
-
- WORLD_PT_game_context_world,
- WORLD_PT_game_world,
- WORLD_PT_game_mist,
- WORLD_PT_game_physics]
-
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_material.py b/release/scripts/ui/properties_material.py
index 13bfd7a7f5d..a71700706f7 100644
--- a/release/scripts/ui/properties_material.py
+++ b/release/scripts/ui/properties_material.py
@@ -20,13 +20,11 @@
import bpy
from rna_prop_ui import PropertyPanel
-narrowui = 180
-
def active_node_mat(mat):
# TODO, 2.4x has a pipeline section, for 2.5 we need to communicate
# which settings from node-materials are used
- if mat:
+ if mat is not None:
mat_node = mat.active_node_material
if mat_node:
return mat_node
@@ -39,7 +37,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
@@ -54,37 +52,29 @@ class MATERIAL_MT_specials(bpy.types.Menu):
layout.operator("material.paste", icon='PASTEDOWN')
-class MaterialButtonsPanel(bpy.types.Panel):
+class MaterialButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "material"
# COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here
- def poll(self, context):
- mat = context.material
- engine = context.scene.render.engine
- return mat and (engine in self.COMPAT_ENGINES)
-
+ @classmethod
+ def poll(cls, context):
+ return context.material and (context.scene.render.engine in cls.COMPAT_ENGINES)
-class MATERIAL_PT_preview(MaterialButtonsPanel):
- bl_label = "Preview"
- COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
- def draw(self, context):
- self.layout.template_preview(context.material)
-
-
-class MATERIAL_PT_context_material(MaterialButtonsPanel):
+class MATERIAL_PT_context_material(MaterialButtonsPanel, bpy.types.Panel):
bl_label = ""
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
# An exception, dont call the parent poll func because
# this manages materials for all engine types
engine = context.scene.render.engine
- return (context.material or context.object) and (engine in self.COMPAT_ENGINES)
+ return (context.material or context.object) and (engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
@@ -93,7 +83,6 @@ class MATERIAL_PT_context_material(MaterialButtonsPanel):
ob = context.object
slot = context.material_slot
space = context.space_data
- wide_ui = context.region.width > narrowui
if ob:
row = layout.row()
@@ -112,262 +101,64 @@ class MATERIAL_PT_context_material(MaterialButtonsPanel):
row.operator("object.material_slot_select", text="Select")
row.operator("object.material_slot_deselect", text="Deselect")
- if wide_ui:
- split = layout.split(percentage=0.65)
-
- if ob:
- split.template_ID(ob, "active_material", new="material.new")
- row = split.row()
- if slot:
- row.prop(slot, "link", text="")
- else:
- row.label()
- elif mat:
- split.template_ID(space, "pin_id")
- split.separator()
- else:
- if ob:
- layout.template_ID(ob, "active_material", new="material.new")
- elif mat:
- layout.template_ID(space, "pin_id")
-
- if mat:
- if wide_ui:
- layout.prop(mat, "type", expand=True)
- else:
- layout.prop(mat, "type", text="")
-
-
-class MATERIAL_PT_custom_props(MaterialButtonsPanel, PropertyPanel):
- COMPAT_ENGINES = {'BLENDER_RENDER'}
- _context_path = "material"
-
-
-class MATERIAL_PT_shading(MaterialButtonsPanel):
- bl_label = "Shading"
- COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
-
- def poll(self, context):
- mat = active_node_mat(context.material)
- engine = context.scene.render.engine
- return mat and (mat.type in ('SURFACE', 'WIRE', 'HALO')) and (engine in self.COMPAT_ENGINES)
-
- def draw(self, context):
- layout = self.layout
-
- mat = active_node_mat(context.material)
- wide_ui = context.region.width > narrowui
-
- if mat.type in ('SURFACE', 'WIRE'):
- split = layout.split()
-
- col = split.column()
- sub = col.column()
- sub.active = not mat.shadeless
- sub.prop(mat, "emit")
- sub.prop(mat, "ambient")
- sub = col.column()
- sub.prop(mat, "translucency")
-
- if wide_ui:
- col = split.column()
- col.prop(mat, "shadeless")
- sub = col.column()
- sub.active = not mat.shadeless
- sub.prop(mat, "tangent_shading")
- sub.prop(mat, "cubic")
-
- elif mat.type == 'HALO':
- layout.prop(mat, "alpha")
-
-
-class MATERIAL_PT_strand(MaterialButtonsPanel):
- bl_label = "Strand"
- bl_default_closed = True
- COMPAT_ENGINES = {'BLENDER_RENDER'}
-
- def poll(self, context):
- mat = context.material
- engine = context.scene.render.engine
- return mat and (mat.type in ('SURFACE', 'WIRE', 'HALO')) and (engine in self.COMPAT_ENGINES)
-
- def draw(self, context):
- layout = self.layout
-
- mat = context.material # dont use node material
- tan = mat.strand
- wide_ui = context.region.width > narrowui
-
- split = layout.split()
-
- col = split.column()
- sub = col.column(align=True)
- sub.label(text="Size:")
- sub.prop(tan, "root_size", text="Root")
- sub.prop(tan, "tip_size", text="Tip")
- sub.prop(tan, "min_size", text="Minimum")
- sub.prop(tan, "blender_units")
- sub = col.column()
- sub.active = (not mat.shadeless)
- sub.prop(tan, "tangent_shading")
- col.prop(tan, "shape")
-
- if wide_ui:
- col = split.column()
- col.label(text="Shading:")
- col.prop(tan, "width_fade")
- ob = context.object
- if ob and ob.type == 'MESH':
- col.prop_object(tan, "uv_layer", ob.data, "uv_textures", text="")
- else:
- col.prop(tan, "uv_layer", text="")
- col.separator()
- sub = col.column()
- sub.active = (not mat.shadeless)
- sub.prop(tan, "surface_diffuse")
- sub = col.column()
- sub.active = tan.surface_diffuse
- sub.prop(tan, "blend_distance", text="Distance")
-
-
-class MATERIAL_PT_physics(MaterialButtonsPanel):
- bl_label = "Physics"
- COMPAT_ENGINES = {'BLENDER_GAME'}
-
- def draw(self, context):
- layout = self.layout
-
- phys = context.material.physics # dont use node material
- wide_ui = context.region.width > narrowui
-
- split = layout.split()
-
- col = split.column()
- col.prop(phys, "distance")
- col.prop(phys, "friction")
- col.prop(phys, "align_to_normal")
+ split = layout.split(percentage=0.65)
- if wide_ui:
- col = split.column()
- col.prop(phys, "force", slider=True)
- col.prop(phys, "elasticity", slider=True)
- col.prop(phys, "damp", slider=True)
-
-
-class MATERIAL_PT_options(MaterialButtonsPanel):
- bl_label = "Options"
- COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
-
- def poll(self, context):
- mat = active_node_mat(context.material)
- engine = context.scene.render.engine
- return mat and (mat.type in ('SURFACE', 'WIRE', 'HALO')) and (engine in self.COMPAT_ENGINES)
-
- 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, "use_sky")
- col.prop(mat, "exclude_mist")
- col.prop(mat, "invert_z")
- sub = col.row()
- sub.prop(mat, "z_offset")
- sub.active = mat.transparency and mat.transparency_method == 'Z_TRANSPARENCY'
- sub = col.column(align=True)
- sub.label(text="Light Group:")
- sub.prop(mat, "light_group", text="")
- row = sub.row()
- row.active = bool(mat.light_group)
- row.prop(mat, "light_group_exclusive", text="Exclusive")
+ if ob:
+ split.template_ID(ob, "active_material", new="material.new")
+ row = split.row()
+ if mat:
+ row.prop(mat, "use_nodes", icon="NODETREE", text="")
- if wide_ui:
- col = split.column()
- col.prop(mat, "face_texture")
- sub = col.column()
- sub.active = mat.face_texture
- sub.prop(mat, "face_texture_alpha")
- col.separator()
- col.prop(mat, "vertex_color_paint")
- col.prop(mat, "vertex_color_light")
- col.prop(mat, "object_color")
+ if slot:
+ row.prop(slot, "link", text="")
+ else:
+ row.label()
+ elif mat:
+ split.template_ID(space, "pin_id")
+ split.separator()
+ if mat:
+ layout.prop(mat, "type", expand=True)
+
-class MATERIAL_PT_shadow(MaterialButtonsPanel):
- bl_label = "Shadow"
- bl_default_closed = True
+class MATERIAL_PT_preview(MaterialButtonsPanel, bpy.types.Panel):
+ bl_label = "Preview"
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
- def poll(self, context):
- mat = active_node_mat(context.material)
- engine = context.scene.render.engine
- return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in self.COMPAT_ENGINES)
-
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, "shadows", text="Receive")
- col.prop(mat, "receive_transparent_shadows", text="Receive Transparent")
- col.prop(mat, "only_shadow", text="Shadows Only")
- col.prop(mat, "cast_shadows_only", text="Cast Only")
- col.prop(mat, "shadow_casting_alpha", text="Casting Alpha")
-
- if wide_ui:
- col = split.column()
- col.prop(mat, "cast_buffer_shadows")
- sub = col.column()
- sub.active = mat.cast_buffer_shadows
- sub.prop(mat, "shadow_buffer_bias", text="Buffer Bias")
- col.prop(mat, "ray_shadow_bias", text="Auto Ray Bias")
- sub = col.column()
- sub.active = (not mat.ray_shadow_bias)
- sub.prop(mat, "shadow_ray_bias", text="Ray Bias")
- col.prop(mat, "cast_approximate")
+ self.layout.template_preview(context.material)
-class MATERIAL_PT_diffuse(MaterialButtonsPanel):
+class MATERIAL_PT_diffuse(MaterialButtonsPanel, bpy.types.Panel):
bl_label = "Diffuse"
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
mat = active_node_mat(context.material)
engine = context.scene.render.engine
- return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in self.COMPAT_ENGINES)
+ return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
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, "diffuse_color", text="")
sub = col.column()
- sub.active = (not mat.shadeless)
+ sub.active = (not mat.use_shadeless)
sub.prop(mat, "diffuse_intensity", text="Intensity")
- if wide_ui:
- col = split.column()
- col.active = (not mat.shadeless)
+ col = split.column()
+ col.active = (not mat.use_shadeless)
col.prop(mat, "diffuse_shader", text="")
col.prop(mat, "use_diffuse_ramp", text="Ramp")
col = layout.column()
- col.active = (not mat.shadeless)
+ col.active = (not mat.use_shadeless)
if mat.diffuse_shader == 'OREN_NAYAR':
col.prop(mat, "roughness")
elif mat.diffuse_shader == 'MINNAERT':
@@ -378,8 +169,7 @@ class MATERIAL_PT_diffuse(MaterialButtonsPanel):
col = split.column()
col.prop(mat, "diffuse_toon_size", text="Size")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(mat, "diffuse_toon_smooth", text="Smooth")
elif mat.diffuse_shader == 'FRESNEL':
split = col.split()
@@ -387,8 +177,7 @@ class MATERIAL_PT_diffuse(MaterialButtonsPanel):
col = split.column()
col.prop(mat, "diffuse_fresnel", text="Fresnel")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(mat, "diffuse_fresnel_factor", text="Factor")
if mat.use_diffuse_ramp:
@@ -401,29 +190,28 @@ class MATERIAL_PT_diffuse(MaterialButtonsPanel):
col = split.column()
col.prop(mat, "diffuse_ramp_input", text="Input")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(mat, "diffuse_ramp_blend", text="Blend")
row = layout.row()
row.prop(mat, "diffuse_ramp_factor", text="Factor")
-class MATERIAL_PT_specular(MaterialButtonsPanel):
+class MATERIAL_PT_specular(MaterialButtonsPanel, bpy.types.Panel):
bl_label = "Specular"
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
mat = active_node_mat(context.material)
engine = context.scene.render.engine
- return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in self.COMPAT_ENGINES)
+ return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
mat = active_node_mat(context.material)
- wide_ui = context.region.width > narrowui
- layout.active = (not mat.shadeless)
+ layout.active = (not mat.use_shadeless)
split = layout.split()
@@ -431,8 +219,7 @@ class MATERIAL_PT_specular(MaterialButtonsPanel):
col.prop(mat, "specular_color", text="")
col.prop(mat, "specular_intensity", text="Intensity")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(mat, "specular_shader", text="")
col.prop(mat, "use_specular_ramp", text="Ramp")
@@ -445,8 +232,7 @@ class MATERIAL_PT_specular(MaterialButtonsPanel):
col = split.column()
col.prop(mat, "specular_hardness", text="Hardness")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(mat, "specular_ior", text="IOR")
elif mat.specular_shader == 'WARDISO':
col.prop(mat, "specular_slope", text="Slope")
@@ -456,8 +242,7 @@ class MATERIAL_PT_specular(MaterialButtonsPanel):
col = split.column()
col.prop(mat, "specular_toon_size", text="Size")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(mat, "specular_toon_smooth", text="Smooth")
if mat.use_specular_ramp:
@@ -469,89 +254,135 @@ class MATERIAL_PT_specular(MaterialButtonsPanel):
col = split.column()
col.prop(mat, "specular_ramp_input", text="Input")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(mat, "specular_ramp_blend", text="Blend")
row = layout.row()
row.prop(mat, "specular_ramp_factor", text="Factor")
-class MATERIAL_PT_sss(MaterialButtonsPanel):
- bl_label = "Subsurface Scattering"
- bl_default_closed = True
+class MATERIAL_PT_shading(MaterialButtonsPanel, bpy.types.Panel):
+ bl_label = "Shading"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+
+ @classmethod
+ def poll(cls, context):
+ mat = active_node_mat(context.material)
+ engine = context.scene.render.engine
+ return mat and (mat.type in ('SURFACE', 'WIRE', 'HALO')) and (engine in cls.COMPAT_ENGINES)
+
+ def draw(self, context):
+ layout = self.layout
+
+ mat = active_node_mat(context.material)
+
+ if mat.type in ('SURFACE', 'WIRE'):
+ split = layout.split()
+
+ col = split.column()
+ sub = col.column()
+ sub.active = not mat.use_shadeless
+ sub.prop(mat, "emit")
+ sub.prop(mat, "ambient")
+ sub = col.column()
+ sub.prop(mat, "translucency")
+
+ col = split.column()
+ col.prop(mat, "use_shadeless")
+ sub = col.column()
+ sub.active = not mat.use_shadeless
+ sub.prop(mat, "use_tangent_shading")
+ sub.prop(mat, "use_cubic")
+
+ elif mat.type == 'HALO':
+ layout.prop(mat, "alpha")
+
+
+class MATERIAL_PT_transp(MaterialButtonsPanel, bpy.types.Panel):
+ bl_label = "Transparency"
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
mat = active_node_mat(context.material)
engine = context.scene.render.engine
- return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in self.COMPAT_ENGINES)
+ return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
mat = active_node_mat(context.material)
- sss = mat.subsurface_scattering
- self.layout.active = (not mat.shadeless)
- self.layout.prop(sss, "enabled", text="")
+ self.layout.prop(mat, "use_transparency", text="")
def draw(self, context):
layout = self.layout
mat = active_node_mat(context.material)
- sss = mat.subsurface_scattering
- wide_ui = context.region.width > narrowui
-
- layout.active = (sss.enabled) and (not mat.shadeless)
+ rayt = mat.raytrace_transparency
- 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")
+ row = layout.row()
+ row.active = mat.use_transparency and (not mat.use_shadeless)
+ row.prop(mat, "transparency_method", expand=True)
split = layout.split()
col = split.column()
- col.prop(sss, "ior")
- col.prop(sss, "scale")
- col.prop(sss, "color", text="")
- col.prop(sss, "radius", text="RGB Radius", expand=True)
+ col.prop(mat, "alpha")
+ row = col.row()
+ row.active = mat.use_transparency and (not mat.use_shadeless)
+ row.prop(mat, "specular_alpha", text="Specular")
+
+ col = split.column()
+ col.active = (not mat.use_shadeless)
+ col.prop(rayt, "fresnel")
+ sub = col.column()
+ sub.active = rayt.fresnel > 0
+ sub.prop(rayt, "fresnel_factor", text="Blend")
+
+ if mat.transparency_method == 'RAYTRACE':
+ layout.separator()
+ split = layout.split()
+ split.active = mat.use_transparency
- if wide_ui:
col = split.column()
- sub = col.column(align=True)
- sub.label(text="Blend:")
- sub.prop(sss, "color_factor", text="Color")
- sub.prop(sss, "texture_factor", text="Texture")
- sub.label(text="Scattering Weight:")
- sub.prop(sss, "front")
- sub.prop(sss, "back")
- col.separator()
- col.prop(sss, "error_tolerance", text="Error")
+ col.prop(rayt, "ior")
+ col.prop(rayt, "filter")
+ col.prop(rayt, "falloff")
+ col.prop(rayt, "depth_max")
+ col.prop(rayt, "depth")
+ col = split.column()
+ col.label(text="Gloss:")
+ col.prop(rayt, "gloss_factor", text="Amount")
+ sub = col.column()
+ sub.active = rayt.gloss_factor < 1.0
+ sub.prop(rayt, "gloss_threshold", text="Threshold")
+ sub.prop(rayt, "gloss_samples", text="Samples")
-class MATERIAL_PT_mirror(MaterialButtonsPanel):
+
+class MATERIAL_PT_mirror(MaterialButtonsPanel, bpy.types.Panel):
bl_label = "Mirror"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
mat = active_node_mat(context.material)
engine = context.scene.render.engine
- return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in self.COMPAT_ENGINES)
+ return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
raym = active_node_mat(context.material).raytrace_mirror
- self.layout.prop(raym, "enabled", text="")
+ self.layout.prop(raym, "use", text="")
def draw(self, context):
layout = self.layout
mat = active_node_mat(context.material)
raym = mat.raytrace_mirror
- wide_ui = context.region.width > narrowui
- layout.active = raym.enabled
+ layout.active = raym.use
split = layout.split()
@@ -559,8 +390,7 @@ class MATERIAL_PT_mirror(MaterialButtonsPanel):
col.prop(raym, "reflect_factor")
col.prop(mat, "mirror_color", text="")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(raym, "fresnel")
sub = col.column()
sub.active = raym.fresnel > 0
@@ -570,15 +400,15 @@ 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="")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Gloss:")
col.prop(raym, "gloss_factor", text="Amount")
sub = col.column()
@@ -588,123 +418,72 @@ class MATERIAL_PT_mirror(MaterialButtonsPanel):
sub.prop(raym, "gloss_anisotropic", text="Anisotropic")
-class MATERIAL_PT_transp(MaterialButtonsPanel):
- bl_label = "Transparency"
- bl_default_closed = True
+class MATERIAL_PT_sss(MaterialButtonsPanel, bpy.types.Panel):
+ bl_label = "Subsurface Scattering"
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
mat = active_node_mat(context.material)
engine = context.scene.render.engine
- return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in self.COMPAT_ENGINES)
+ return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
mat = active_node_mat(context.material)
+ sss = mat.subsurface_scattering
- self.layout.prop(mat, "transparency", text="")
+ self.layout.active = (not mat.use_shadeless)
+ self.layout.prop(sss, "use", text="")
def draw(self, context):
layout = self.layout
mat = active_node_mat(context.material)
- rayt = mat.raytrace_transparency
- wide_ui = context.region.width > narrowui
+ sss = mat.subsurface_scattering
- row = layout.row()
- row.active = mat.transparency and (not mat.shadeless)
- if wide_ui:
- row.prop(mat, "transparency_method", expand=True)
- else:
- row.prop(mat, "transparency_method", text="")
+ layout.active = (sss.use) and (not mat.use_shadeless)
+
+ row = layout.row().split()
+ sub = row.row(align=True).split(percentage=0.75)
+ 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()
col = split.column()
- col.prop(mat, "alpha")
- row = col.row()
- row.active = mat.transparency and (not mat.shadeless)
- row.prop(mat, "specular_alpha", text="Specular")
-
- if wide_ui:
- col = split.column()
- col.active = (not mat.shadeless)
- col.prop(rayt, "fresnel")
- sub = col.column()
- sub.active = rayt.fresnel > 0
- sub.prop(rayt, "fresnel_factor", text="Blend")
-
- if mat.transparency_method == 'RAYTRACE':
- layout.separator()
- split = layout.split()
- split.active = mat.transparency
-
- col = split.column()
- col.prop(rayt, "ior")
- col.prop(rayt, "filter")
- col.prop(rayt, "falloff")
- col.prop(rayt, "limit")
- col.prop(rayt, "depth")
-
- if wide_ui:
- col = split.column()
- col.label(text="Gloss:")
- col.prop(rayt, "gloss_factor", text="Amount")
- sub = col.column()
- sub.active = rayt.gloss_factor < 1.0
- sub.prop(rayt, "gloss_threshold", text="Threshold")
- sub.prop(rayt, "gloss_samples", text="Samples")
-
-
-class MATERIAL_PT_transp_game(MaterialButtonsPanel):
- bl_label = "Transparency"
- bl_default_closed = True
- COMPAT_ENGINES = {'BLENDER_GAME'}
-
- def poll(self, context):
- mat = active_node_mat(context.material)
- engine = context.scene.render.engine
- return mat and (engine in self.COMPAT_ENGINES)
-
- def draw_header(self, context):
- mat = active_node_mat(context.material)
-
- self.layout.prop(mat, "transparency", text="")
-
- def draw(self, context):
- layout = self.layout
-
- mat = active_node_mat(context.material)
- rayt = mat.raytrace_transparency
- wide_ui = context.region.width > narrowui
-
- row = layout.row()
- row.active = mat.transparency and (not mat.shadeless)
- if wide_ui:
- row.prop(mat, "transparency_method", expand=True)
- else:
- row.prop(mat, "transparency_method", text="")
-
- split = layout.split()
+ col.prop(sss, "ior")
+ col.prop(sss, "scale")
+ col.prop(sss, "color", text="")
+ col.prop(sss, "radius", text="RGB Radius", expand=True)
col = split.column()
- col.prop(mat, "alpha")
+ sub = col.column(align=True)
+ sub.label(text="Blend:")
+ sub.prop(sss, "color_factor", text="Color")
+ sub.prop(sss, "texture_factor", text="Texture")
+ sub.label(text="Scattering Weight:")
+ sub.prop(sss, "front")
+ sub.prop(sss, "back")
+ col.separator()
+ col.prop(sss, "error_threshold", text="Error")
-class MATERIAL_PT_halo(MaterialButtonsPanel):
+class MATERIAL_PT_halo(MaterialButtonsPanel, bpy.types.Panel):
bl_label = "Halo"
COMPAT_ENGINES = {'BLENDER_RENDER'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
mat = context.material
engine = context.scene.render.engine
- return mat and (mat.type == 'HALO') and (engine in self.COMPAT_ENGINES)
+ return mat and (mat.type == 'HALO') and (engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
mat = context.material # dont use node material
halo = mat.halo
- wide_ui = context.region.width > narrowui
split = layout.split()
@@ -714,54 +493,53 @@ class MATERIAL_PT_halo(MaterialButtonsPanel):
col.prop(halo, "hardness")
col.prop(halo, "add")
col.label(text="Options:")
- col.prop(halo, "texture")
- col.prop(halo, "vertex_normal")
- col.prop(halo, "xalpha")
- col.prop(halo, "shaded")
- col.prop(halo, "soft")
+ col.prop(halo, "use_texture")
+ col.prop(halo, "use_vertex_normal")
+ col.prop(halo, "use_extreme_alpha")
+ col.prop(halo, "use_shaded")
+ col.prop(halo, "use_soft")
- if wide_ui:
- col = split.column()
- col.prop(halo, "ring")
+ col = split.column()
+ col.prop(halo, "use_ring")
sub = col.column()
- sub.active = halo.ring
- sub.prop(halo, "rings")
+ sub.active = halo.use_ring
+ sub.prop(halo, "ring_count")
sub.prop(mat, "mirror_color", text="")
col.separator()
- col.prop(halo, "lines")
+ col.prop(halo, "use_lines")
sub = col.column()
- sub.active = halo.lines
- sub.prop(halo, "line_number", text="Lines")
+ sub.active = halo.use_lines
+ sub.prop(halo, "line_count", text="Lines")
sub.prop(mat, "specular_color", text="")
col.separator()
- col.prop(halo, "star")
+ col.prop(halo, "use_star")
sub = col.column()
- sub.active = halo.star
- sub.prop(halo, "star_tips")
+ sub.active = halo.use_star
+ sub.prop(halo, "star_tip_count")
-class MATERIAL_PT_flare(MaterialButtonsPanel):
+class MATERIAL_PT_flare(MaterialButtonsPanel, bpy.types.Panel):
bl_label = "Flare"
COMPAT_ENGINES = {'BLENDER_RENDER'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
mat = context.material
engine = context.scene.render.engine
- return mat and (mat.type == 'HALO') and (engine in self.COMPAT_ENGINES)
+ return mat and (mat.type == 'HALO') and (engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
halo = context.material.halo
- self.layout.prop(halo, "flare_mode", text="")
+ self.layout.prop(halo, "use_flare_mode", text="")
def draw(self, context):
layout = self.layout
mat = context.material # dont use node material
halo = mat.halo
- wide_ui = context.region.width > narrowui
- layout.active = halo.flare_mode
+ layout.active = halo.use_flare_mode
split = layout.split()
@@ -769,24 +547,213 @@ class MATERIAL_PT_flare(MaterialButtonsPanel):
col.prop(halo, "flare_size", text="Size")
col.prop(halo, "flare_boost", text="Boost")
col.prop(halo, "flare_seed", text="Seed")
- if wide_ui:
- col = split.column()
- col.prop(halo, "flares_sub", text="Subflares")
- col.prop(halo, "flare_subsize", text="Subsize")
+
+ col = split.column()
+ col.prop(halo, "flare_subflare_count", text="Subflares")
+ col.prop(halo, "flare_subflare_size", text="Subsize")
+
+
+class MATERIAL_PT_physics(MaterialButtonsPanel, bpy.types.Panel):
+ bl_label = "Physics"
+ COMPAT_ENGINES = {'BLENDER_GAME'}
+
+ @classmethod
+ def poll(cls, context):
+ return context.material and (context.scene.render.engine in cls.COMPAT_ENGINES)
+
+ def draw(self, context):
+ layout = self.layout
+
+ phys = context.material.physics # dont use node material
+
+ split = layout.split()
+
+ col = split.column()
+ col.prop(phys, "distance")
+ col.prop(phys, "friction")
+ col.prop(phys, "use_normal_align")
+
+ col = split.column()
+ col.prop(phys, "force", slider=True)
+ col.prop(phys, "elasticity", slider=True)
+ col.prop(phys, "damping", slider=True)
+
+
+class MATERIAL_PT_strand(MaterialButtonsPanel, bpy.types.Panel):
+ bl_label = "Strand"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
+
+ @classmethod
+ def poll(cls, context):
+ mat = context.material
+ engine = context.scene.render.engine
+ return mat and (mat.type in ('SURFACE', 'WIRE', 'HALO')) and (engine in cls.COMPAT_ENGINES)
+
+ def draw(self, context):
+ layout = self.layout
+
+ mat = context.material # dont use node material
+ tan = mat.strand
+
+ split = layout.split()
+
+ col = split.column()
+ sub = col.column(align=True)
+ sub.label(text="Size:")
+ sub.prop(tan, "root_size", text="Root")
+ sub.prop(tan, "tip_size", text="Tip")
+ sub.prop(tan, "size_min", text="Minimum")
+ sub.prop(tan, "use_blender_units")
+ sub = col.column()
+ sub.active = (not mat.use_shadeless)
+ sub.prop(tan, "use_tangent_shading")
+ col.prop(tan, "shape")
+
+ col = split.column()
+ col.label(text="Shading:")
+ col.prop(tan, "width_fade")
+ ob = context.object
+ if ob and ob.type == 'MESH':
+ col.prop_search(tan, "uv_layer", ob.data, "uv_textures", text="")
+ else:
+ col.prop(tan, "uv_layer", text="")
+ col.separator()
+ sub = col.column()
+ sub.active = (not mat.use_shadeless)
+ sub.prop(tan, "use_surface_diffuse")
+ sub = col.column()
+ sub.active = tan.use_surface_diffuse
+ sub.prop(tan, "blend_distance", text="Distance")
+
+
+class MATERIAL_PT_options(MaterialButtonsPanel, bpy.types.Panel):
+ bl_label = "Options"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+
+ @classmethod
+ def poll(cls, context):
+ mat = active_node_mat(context.material)
+ engine = context.scene.render.engine
+ return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
+
+ def draw(self, context):
+ layout = self.layout
+
+ mat = active_node_mat(context.material)
+
+ split = layout.split()
+
+ col = split.column()
+ col.prop(mat, "use_raytrace")
+ col.prop(mat, "use_full_oversampling")
+ col.prop(mat, "use_sky")
+ col.prop(mat, "use_mist")
+ col.prop(mat, "invert_z")
+ sub = col.row()
+ sub.prop(mat, "offset_z")
+ sub.active = mat.use_transparency and mat.transparency_method == 'Z_TRANSPARENCY'
+ sub = col.column(align=True)
+ sub.label(text="Light Group:")
+ sub.prop(mat, "light_group", text="")
+ row = sub.row()
+ row.active = bool(mat.light_group)
+ row.prop(mat, "use_light_group_exclusive", text="Exclusive")
+
+ col = split.column()
+ col.prop(mat, "use_face_texture")
+ sub = col.column()
+ sub.active = mat.use_face_texture
+ sub.prop(mat, "use_face_texture_alpha")
+ col.separator()
+ col.prop(mat, "use_vertex_color_paint")
+ col.prop(mat, "use_vertex_color_light")
+ col.prop(mat, "use_object_color")
+
+
+class MATERIAL_PT_shadow(MaterialButtonsPanel, bpy.types.Panel):
+ bl_label = "Shadow"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+
+ @classmethod
+ def poll(cls, context):
+ mat = active_node_mat(context.material)
+ engine = context.scene.render.engine
+ return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
+
+ def draw(self, context):
+ layout = self.layout
+
+ mat = active_node_mat(context.material)
+
+ split = layout.split()
+
+ col = split.column()
+ col.prop(mat, "use_shadows", text="Receive")
+ col.prop(mat, "use_transparent_shadows", text="Receive Transparent")
+ col.prop(mat, "use_only_shadow", text="Shadows Only")
+ col.prop(mat, "use_cast_shadows_only", text="Cast Only")
+ col.prop(mat, "shadow_cast_alpha", text="Casting Alpha")
+
+ col = split.column()
+ col.prop(mat, "use_cast_buffer_shadows")
+ sub = col.column()
+ sub.active = mat.use_cast_buffer_shadows
+ sub.prop(mat, "shadow_buffer_bias", text="Buffer Bias")
+ col.prop(mat, "use_ray_shadow_bias", text="Auto Ray Bias")
+ sub = col.column()
+ sub.active = (not mat.use_ray_shadow_bias)
+ sub.prop(mat, "shadow_ray_bias", text="Ray Bias")
+ col.prop(mat, "use_cast_approximate")
+
+
+class MATERIAL_PT_transp_game(MaterialButtonsPanel, bpy.types.Panel):
+ bl_label = "Transparency"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_GAME'}
+
+ @classmethod
+ def poll(cls, context):
+ mat = active_node_mat(context.material)
+ engine = context.scene.render.engine
+ return mat and (engine in cls.COMPAT_ENGINES)
+
+ def draw_header(self, context):
+ mat = active_node_mat(context.material)
+
+ self.layout.prop(mat, "use_transparency", text="")
+
+ def draw(self, context):
+ layout = self.layout
+
+ mat = active_node_mat(context.material)
+ rayt = mat.raytrace_transparency
+
+ row = layout.row()
+ row.active = mat.use_transparency and (not mat.use_shadeless)
+ row.prop(mat, "transparency_method", expand=True)
+
+ split = layout.split()
+
+ col = split.column()
+ col.prop(mat, "alpha")
-class VolumeButtonsPanel(bpy.types.Panel):
+class VolumeButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "material"
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
mat = context.material
engine = context.scene.render.engine
- return mat and (mat.type == 'VOLUME') and (engine in self.COMPAT_ENGINES)
+ return mat and (mat.type == 'VOLUME') and (engine in cls.COMPAT_ENGINES)
-class MATERIAL_PT_volume_density(VolumeButtonsPanel):
+class MATERIAL_PT_volume_density(VolumeButtonsPanel, bpy.types.Panel):
bl_label = "Density"
bl_default_closed = False
COMPAT_ENGINES = {'BLENDER_RENDER'}
@@ -795,18 +762,16 @@ class MATERIAL_PT_volume_density(VolumeButtonsPanel):
layout = self.layout
vol = context.material.volume # dont use node material
- wide_ui = context.region.width > narrowui
split = layout.split()
col = split.column()
col.prop(vol, "density")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(vol, "density_scale")
-class MATERIAL_PT_volume_shading(VolumeButtonsPanel):
+class MATERIAL_PT_volume_shading(VolumeButtonsPanel, bpy.types.Panel):
bl_label = "Shading"
bl_default_closed = False
COMPAT_ENGINES = {'BLENDER_RENDER'}
@@ -815,7 +780,6 @@ class MATERIAL_PT_volume_shading(VolumeButtonsPanel):
layout = self.layout
vol = context.material.volume # dont use node material
- wide_ui = context.region.width > narrowui
split = layout.split()
@@ -824,8 +788,7 @@ class MATERIAL_PT_volume_shading(VolumeButtonsPanel):
col.prop(vol, "asymmetry")
col.prop(vol, "transmission_color")
- if wide_ui:
- col = split.column()
+ col = split.column()
sub = col.column(align=True)
sub.prop(vol, "emission")
sub.prop(vol, "emission_color", text="")
@@ -834,7 +797,7 @@ class MATERIAL_PT_volume_shading(VolumeButtonsPanel):
sub.prop(vol, "reflection_color", text="")
-class MATERIAL_PT_volume_lighting(VolumeButtonsPanel):
+class MATERIAL_PT_volume_lighting(VolumeButtonsPanel, bpy.types.Panel):
bl_label = "Lighting"
bl_default_closed = False
COMPAT_ENGINES = {'BLENDER_RENDER'}
@@ -843,27 +806,25 @@ class MATERIAL_PT_volume_lighting(VolumeButtonsPanel):
layout = self.layout
vol = context.material.volume # dont use node material
- wide_ui = context.region.width > narrowui
split = layout.split()
col = split.column()
- col.prop(vol, "lighting_mode", text="")
+ col.prop(vol, "light_method", text="")
- if wide_ui:
- col = split.column()
+ col = split.column()
- if vol.lighting_mode == 'SHADED':
- col.prop(vol, "external_shadows")
- col.prop(vol, "light_cache")
+ if vol.light_method == 'SHADED':
+ col.prop(vol, "use_external_shadows")
+ col.prop(vol, "use_light_cache")
sub = col.column()
- sub.active = vol.light_cache
+ sub.active = vol.use_light_cache
sub.prop(vol, "cache_resolution")
- elif vol.lighting_mode in ('MULTIPLE_SCATTERING', 'SHADED_PLUS_MULTIPLE_SCATTERING'):
+ elif vol.light_method in ('MULTIPLE_SCATTERING', 'SHADED_PLUS_MULTIPLE_SCATTERING'):
sub = col.column()
sub.enabled = True
sub.active = False
- sub.prop(vol, "light_cache")
+ sub.prop(vol, "use_light_cache")
col.prop(vol, "cache_resolution")
sub = col.column(align=True)
@@ -872,7 +833,7 @@ class MATERIAL_PT_volume_lighting(VolumeButtonsPanel):
sub.prop(vol, "ms_intensity")
-class MATERIAL_PT_volume_transp(VolumeButtonsPanel):
+class MATERIAL_PT_volume_transp(VolumeButtonsPanel, bpy.types.Panel):
bl_label = "Transparency"
COMPAT_ENGINES = {'BLENDER_RENDER'}
@@ -880,15 +841,11 @@ class MATERIAL_PT_volume_transp(VolumeButtonsPanel):
layout = self.layout
mat = context.material # dont use node material
- wide_ui = context.region.width > narrowui
- if wide_ui:
- layout.prop(mat, "transparency_method", expand=True)
- else:
- layout.prop(mat, "transparency_method", text="")
+ layout.prop(mat, "transparency_method", expand=True)
-class MATERIAL_PT_volume_integration(VolumeButtonsPanel):
+class MATERIAL_PT_volume_integration(VolumeButtonsPanel, bpy.types.Panel):
bl_label = "Integration"
bl_default_closed = False
COMPAT_ENGINES = {'BLENDER_RENDER'}
@@ -897,62 +854,56 @@ class MATERIAL_PT_volume_integration(VolumeButtonsPanel):
layout = self.layout
vol = context.material.volume # dont use node material
- wide_ui = context.region.width > narrowui
split = layout.split()
col = split.column()
col.label(text="Step Calculation:")
- col.prop(vol, "step_calculation", text="")
+ col.prop(vol, "step_method", text="")
col = col.column(align=True)
col.prop(vol, "step_size")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label()
- col.prop(vol, "depth_cutoff")
+ col.prop(vol, "depth_threshold")
-classes = [
- MATERIAL_PT_context_material,
- MATERIAL_PT_preview,
- MATERIAL_PT_diffuse,
- MATERIAL_PT_specular,
- MATERIAL_PT_shading,
- MATERIAL_PT_transp,
- MATERIAL_PT_mirror,
- MATERIAL_PT_sss,
- MATERIAL_PT_halo,
- MATERIAL_PT_flare,
- MATERIAL_PT_physics,
- MATERIAL_PT_strand,
- MATERIAL_PT_options,
- MATERIAL_PT_shadow,
- MATERIAL_PT_transp_game,
+class MATERIAL_PT_volume_options(VolumeButtonsPanel, bpy.types.Panel):
+ bl_label = "Options"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+ bl_options = {'DEFAULT_CLOSED'}
+
+ def draw(self, context):
+ layout = self.layout
+
+ mat = active_node_mat(context.material)
+
+ split = layout.split()
- MATERIAL_MT_sss_presets,
- MATERIAL_MT_specials,
+ col = split.column()
+ col.prop(mat, "use_raytrace")
+ col.prop(mat, "use_full_oversampling")
+ col.prop(mat, "use_mist")
- MATERIAL_PT_volume_density,
- MATERIAL_PT_volume_shading,
- MATERIAL_PT_volume_lighting,
- MATERIAL_PT_volume_transp,
+ 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, "use_light_group_exclusive", text="Exclusive")
- MATERIAL_PT_volume_integration,
- MATERIAL_PT_custom_props]
+class MATERIAL_PT_custom_props(MaterialButtonsPanel, PropertyPanel, bpy.types.Panel):
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+ _context_path = "material"
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_object.py b/release/scripts/ui/properties_object.py
index 7169d936904..35037b10216 100644
--- a/release/scripts/ui/properties_object.py
+++ b/release/scripts/ui/properties_object.py
@@ -20,18 +20,16 @@
import bpy
from rna_prop_ui import PropertyPanel
-narrowui = 180
-
-class ObjectButtonsPanel(bpy.types.Panel):
+class ObjectButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "object"
-class OBJECT_PT_context_object(ObjectButtonsPanel):
+class OBJECT_PT_context_object(ObjectButtonsPanel, bpy.types.Panel):
bl_label = ""
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
def draw(self, context):
layout = self.layout
@@ -46,59 +44,40 @@ class OBJECT_PT_context_object(ObjectButtonsPanel):
row.prop(ob, "name", text="")
-class OBJECT_PT_custom_props(ObjectButtonsPanel, PropertyPanel):
- _context_path = "object"
-
-
-class OBJECT_PT_transform(ObjectButtonsPanel):
+class OBJECT_PT_transform(ObjectButtonsPanel, bpy.types.Panel):
bl_label = "Transform"
def draw(self, context):
layout = self.layout
ob = context.object
- wide_ui = context.region.width > narrowui
- if wide_ui:
- row = layout.row()
+ row = layout.row()
- row.column().prop(ob, "location")
- if ob.rotation_mode == 'QUATERNION':
- row.column().prop(ob, "rotation_quaternion", text="Rotation")
- elif ob.rotation_mode == 'AXIS_ANGLE':
- #row.column().label(text="Rotation")
- #row.column().prop(pchan, "rotation_angle", text="Angle")
- #row.column().prop(pchan, "rotation_axis", text="Axis")
- row.column().prop(ob, "rotation_axis_angle", text="Rotation")
- else:
- row.column().prop(ob, "rotation_euler", text="Rotation")
+ row.column().prop(ob, "location")
+ if ob.rotation_mode == 'QUATERNION':
+ row.column().prop(ob, "rotation_quaternion", text="Rotation")
+ elif ob.rotation_mode == 'AXIS_ANGLE':
+ #row.column().label(text="Rotation")
+ #row.column().prop(pchan, "rotation_angle", text="Angle")
+ #row.column().prop(pchan, "rotation_axis", text="Axis")
+ row.column().prop(ob, "rotation_axis_angle", text="Rotation")
+ else:
+ row.column().prop(ob, "rotation_euler", text="Rotation")
- row.column().prop(ob, "scale")
+ row.column().prop(ob, "scale")
- layout.prop(ob, "rotation_mode")
- else:
- col = layout.column()
- col.prop(ob, "location")
- col.label(text="Rotation:")
- col.prop(ob, "rotation_mode", text="")
- if ob.rotation_mode == 'QUATERNION':
- col.prop(ob, "rotation_quaternion", text="")
- elif ob.rotation_mode == 'AXIS_ANGLE':
- col.prop(ob, "rotation_axis_angle", text="")
- else:
- col.prop(ob, "rotation_euler", text="")
- col.prop(ob, "scale")
-
-
-class OBJECT_PT_transform_locks(ObjectButtonsPanel):
+ layout.prop(ob, "rotation_mode")
+
+
+class OBJECT_PT_transform_locks(ObjectButtonsPanel, bpy.types.Panel):
bl_label = "Transform Locks"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
layout = self.layout
ob = context.object
- # wide_ui = context.region.width > narrowui
row = layout.row()
@@ -117,14 +96,13 @@ class OBJECT_PT_transform_locks(ObjectButtonsPanel):
row.column().prop(ob, "lock_scale", text="Scale")
-class OBJECT_PT_relations(ObjectButtonsPanel):
+class OBJECT_PT_relations(ObjectButtonsPanel, bpy.types.Panel):
bl_label = "Relations"
def draw(self, context):
layout = self.layout
ob = context.object
- wide_ui = context.region.width > narrowui
split = layout.split()
@@ -133,8 +111,7 @@ class OBJECT_PT_relations(ObjectButtonsPanel):
col.separator()
col.prop(ob, "pass_index")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Parent:")
col.prop(ob, "parent", text="")
@@ -142,26 +119,23 @@ class OBJECT_PT_relations(ObjectButtonsPanel):
sub.prop(ob, "parent_type", text="")
parent = ob.parent
if parent and ob.parent_type == 'BONE' and parent.type == 'ARMATURE':
- sub.prop_object(ob, "parent_bone", parent.data, "bones", text="")
+ sub.prop_search(ob, "parent_bone", parent.data, "bones", text="")
sub.active = (parent is not None)
-class OBJECT_PT_groups(ObjectButtonsPanel):
+class OBJECT_PT_groups(ObjectButtonsPanel, bpy.types.Panel):
bl_label = "Groups"
def draw(self, context):
layout = self.layout
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:
@@ -172,71 +146,64 @@ 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()
col = split.column()
- col.prop(group, "layer", text="Dupli")
+ col.prop(group, "layers", text="Dupli")
- if wide_ui:
- col = split.column()
+ col = split.column()
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
-class OBJECT_PT_display(ObjectButtonsPanel):
+class OBJECT_PT_display(ObjectButtonsPanel, bpy.types.Panel):
bl_label = "Display"
def draw(self, context):
layout = self.layout
ob = context.object
- wide_ui = context.region.width > narrowui
split = layout.split()
col = split.column()
- col.prop(ob, "max_draw_type", text="Type")
+ col.prop(ob, "draw_type", text="Type")
- if wide_ui:
- col = split.column()
+ col = split.column()
row = col.row()
- row.prop(ob, "draw_bounds", text="Bounds")
+ row.prop(ob, "show_bounds", text="Bounds")
sub = row.row()
- sub.active = ob.draw_bounds
+ sub.active = ob.show_bounds
sub.prop(ob, "draw_bounds_type", text="")
split = layout.split()
col = split.column()
- col.prop(ob, "draw_name", text="Name")
- col.prop(ob, "draw_axis", text="Axis")
- col.prop(ob, "draw_wire", text="Wire")
+ col.prop(ob, "show_name", text="Name")
+ col.prop(ob, "show_axis", text="Axis")
+ col.prop(ob, "show_wire", text="Wire")
+ col.prop(ob, "color", text="Object Color")
- if wide_ui:
- col = split.column()
- col.prop(ob, "draw_texture_space", text="Texture Space")
- col.prop(ob, "x_ray", text="X-Ray")
- col.prop(ob, "draw_transparent", text="Transparency")
+ col = split.column()
+ col.prop(ob, "show_texture_space", text="Texture Space")
+ col.prop(ob, "show_x_ray", text="X-Ray")
+ col.prop(ob, "show_transparent", text="Transparency")
-class OBJECT_PT_duplication(ObjectButtonsPanel):
+class OBJECT_PT_duplication(ObjectButtonsPanel, bpy.types.Panel):
bl_label = "Duplication"
def draw(self, context):
layout = self.layout
ob = context.object
- wide_ui = context.region.width > narrowui
- if wide_ui:
- layout.prop(ob, "dupli_type", expand=True)
- else:
- layout.prop(ob, "dupli_type", text="")
+ layout.prop(ob, "dupli_type", expand=True)
if ob.dupli_type == 'FRAMES':
split = layout.split()
@@ -245,15 +212,14 @@ class OBJECT_PT_duplication(ObjectButtonsPanel):
col.prop(ob, "dupli_frames_start", text="Start")
col.prop(ob, "dupli_frames_end", text="End")
- if wide_ui:
- col = split.column(align=True)
+ col = split.column(align=True)
col.prop(ob, "dupli_frames_on", text="On")
col.prop(ob, "dupli_frames_off", text="Off")
layout.prop(ob, "use_dupli_frames_speed", text="Speed")
elif ob.dupli_type == 'VERTS':
- layout.prop(ob, "use_dupli_verts_rotation", text="Rotation")
+ layout.prop(ob, "use_dupli_vertices_rotation", text="Rotation")
elif ob.dupli_type == 'FACES':
split = layout.split()
@@ -261,82 +227,102 @@ class OBJECT_PT_duplication(ObjectButtonsPanel):
col = split.column()
col.prop(ob, "use_dupli_faces_scale", text="Scale")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(ob, "dupli_faces_scale", text="Inherit Scale")
elif ob.dupli_type == 'GROUP':
- if wide_ui:
- layout.prop(ob, "dupli_group", text="Group")
- else:
- layout.prop(ob, "dupli_group", text="")
+ layout.prop(ob, "dupli_group", text="Group")
-# XXX: the following options are all quite buggy, ancient hacks that should be dropped
+# XXX: the following options are all quite buggy, ancient hacks that should be dropped
-class OBJECT_PT_animation(ObjectButtonsPanel):
+class OBJECT_PT_animation(ObjectButtonsPanel, bpy.types.Panel):
bl_label = "Animation Hacks"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
layout = self.layout
ob = context.object
- wide_ui = context.region.width > narrowui
split = layout.split()
col = split.column()
col.label(text="Time Offset:")
- col.prop(ob, "time_offset_edit", text="Edit")
+ col.prop(ob, "use_time_offset_edit", text="Edit")
row = col.row()
- row.prop(ob, "time_offset_particle", text="Particle")
- row.active = len(ob.particle_systems) != 0
+ row.prop(ob, "use_time_offset_particle", text="Particle")
+ row.active = bool(ob.particle_systems)
row = col.row()
- row.prop(ob, "time_offset_parent", text="Parent")
+ row.prop(ob, "use_time_offset_parent", text="Parent")
row.active = (ob.parent is not None)
row = col.row()
- row.prop(ob, "slow_parent")
+ row.prop(ob, "use_slow_parent")
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 = split.column()
col.label(text="Tracking Axes:")
col.prop(ob, "track_axis", text="Axis")
col.prop(ob, "up_axis", text="Up Axis")
+from properties_animviz import MotionPathButtonsPanel, OnionSkinButtonsPanel
-# import generic panels from other files
-from properties_animviz import OBJECT_PT_motion_paths, OBJECT_PT_onion_skinning
-classes = [
- OBJECT_PT_context_object,
- OBJECT_PT_transform,
- OBJECT_PT_transform_locks,
- OBJECT_PT_relations,
- OBJECT_PT_groups,
- OBJECT_PT_display,
- OBJECT_PT_duplication,
- OBJECT_PT_animation, # XXX: panel of old hacks pending to be removed...
+class OBJECT_PT_motion_paths(MotionPathButtonsPanel, bpy.types.Panel):
+ #bl_label = "Object Motion Paths"
+ bl_context = "object"
+
+ @classmethod
+ def poll(cls, context):
+ return (context.object)
+
+ def draw(self, context):
+ layout = self.layout
+
+ ob = context.object
+
+ self.draw_settings(context, ob.animation_visualisation)
+
+ layout.separator()
+
+ split = layout.split()
+
+ col = split.column()
+ col.operator("object.paths_calculate", text="Calculate Paths")
- OBJECT_PT_motion_paths,
- #OBJECT_PT_onion_skinning,
+ col = split.column()
+ col.operator("object.paths_clear", text="Clear Paths")
+
+
+class OBJECT_PT_onion_skinning(OnionSkinButtonsPanel): #, bpy.types.Panel): # inherit from panel when ready
+ #bl_label = "Object Onion Skinning"
+ bl_context = "object"
- OBJECT_PT_custom_props]
+ @classmethod
+ def poll(cls, context):
+ return (context.object)
+
+ def draw(self, context):
+ layout = self.layout
+
+ ob = context.object
+
+ self.draw_settings(context, ob.animation_visualisation)
+
+
+class OBJECT_PT_custom_props(bpy.types.Panel, PropertyPanel, ObjectButtonsPanel):
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+ _context_path = "object"
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_object_constraint.py b/release/scripts/ui/properties_object_constraint.py
index 481da716e02..a2350155ed5 100644
--- a/release/scripts/ui/properties_object_constraint.py
+++ b/release/scripts/ui/properties_object_constraint.py
@@ -19,10 +19,8 @@
# <pep8 compliant>
import bpy
-narrowui = 180
-
-class ConstraintButtonsPanel(bpy.types.Panel):
+class ConstraintButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "constraint"
@@ -31,64 +29,51 @@ class ConstraintButtonsPanel(bpy.types.Panel):
layout = self.layout
box = layout.template_constraint(con)
- wide_ui = context.region.width > narrowui
if box:
# match enum type to our functions, avoids a lookup table.
- getattr(self, con.type)(context, box, con, wide_ui)
+ getattr(self, con.type)(context, box, con)
- 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):
+ def space_template(self, layout, con, target=True, owner=True):
if target or owner:
split = layout.split(percentage=0.2)
- if wide_ui:
- split.label(text="Space:")
- row = split.row()
- else:
- row = layout.row()
-
+ split.label(text="Space:")
+ row = split.row()
if target:
row.prop(con, "target_space", text="")
- if wide_ui:
- if target and owner:
- row.label(icon='ARROW_LEFTRIGHT')
- else:
- row = layout.row()
+ if target and owner:
+ row.label(icon='ARROW_LEFTRIGHT')
+
if owner:
row.prop(con, "owner_space", text="")
- def target_template(self, layout, con, wide_ui, subtargets=True):
- if wide_ui:
- layout.prop(con, "target") # XXX limiting settings for only 'curves' or some type of object
- else:
- layout.prop(con, "target", text="")
+ def target_template(self, layout, con, subtargets=True):
+ layout.prop(con, "target") # XXX limiting settings for only 'curves' or some type of object
if con.target and subtargets:
if con.target.type == 'ARMATURE':
- if wide_ui:
- layout.prop_object(con, "subtarget", con.target.data, "bones", text="Bone")
- else:
- layout.prop_object(con, "subtarget", con.target.data, "bones", text="")
+ layout.prop_search(con, "subtarget", con.target.data, "bones", text="Bone")
- 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="")
elif con.target.type in ('MESH', 'LATTICE'):
- layout.prop_object(con, "subtarget", con.target, "vertex_groups", text="Vertex Group")
+ layout.prop_search(con, "subtarget", con.target, "vertex_groups", text="Vertex Group")
- def ik_template(self, layout, con, wide_ui):
+ def ik_template(self, layout, con):
# only used for iTaSC
layout.prop(con, "pole_target")
if con.pole_target and con.pole_target.type == 'ARMATURE':
- layout.prop_object(con, "pole_subtarget", con.pole_target.data, "bones", text="Bone")
+ layout.prop_search(con, "pole_subtarget", con.pole_target.data, "bones", text="Bone")
if con.pole_target:
row = layout.row()
@@ -101,11 +86,11 @@ class ConstraintButtonsPanel(bpy.types.Panel):
col.prop(con, "use_stretch")
col = split.column()
- col.prop(con, "chain_length")
+ col.prop(con, "chain_count")
col.prop(con, "use_target")
- def CHILD_OF(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
+ def CHILD_OF(self, context, layout, con):
+ self.target_template(layout, con)
split = layout.split()
@@ -132,56 +117,47 @@ class ConstraintButtonsPanel(bpy.types.Panel):
col = split.column()
col.operator("constraint.childof_set_inverse")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.operator("constraint.childof_clear_inverse")
- def TRACK_TO(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
+ def TRACK_TO(self, context, layout, con):
+ self.target_template(layout, con)
row = layout.row()
- if wide_ui:
- row.label(text="To:")
- row.prop(con, "track", expand=True)
+ row.label(text="To:")
+ row.prop(con, "track_axis", expand=True)
split = layout.split()
col = split.column()
- col.prop(con, "up", text="Up")
+ col.prop(con, "up_axis", text="Up")
- if wide_ui:
- col = split.column()
- col.prop(con, "target_z")
+ col = split.column()
+ col.prop(con, "use_target_z")
- self.space_template(layout, con, wide_ui)
+ self.space_template(layout, con)
- def IK(self, context, layout, con, wide_ui):
+ def IK(self, context, layout, con):
if context.object.pose.ik_solver == "ITASC":
layout.prop(con, "ik_type")
- getattr(self, 'IK_' + con.ik_type)(context, layout, con, wide_ui)
+ getattr(self, 'IK_' + con.ik_type)(context, layout, con)
else:
# Legacy IK constraint
- self.target_template(layout, con, wide_ui)
- if wide_ui:
- layout.prop(con, "pole_target")
- else:
- layout.prop(con, "pole_target", text="")
+ self.target_template(layout, con)
+ layout.prop(con, "pole_target")
+
if con.pole_target and con.pole_target.type == 'ARMATURE':
- if wide_ui:
- layout.prop_object(con, "pole_subtarget", con.pole_target.data, "bones", text="Bone")
- else:
- layout.prop_object(con, "pole_subtarget", con.pole_target.data, "bones", text="")
+ layout.prop_search(con, "pole_subtarget", con.pole_target.data, "bones", text="Bone")
if con.pole_target:
row = layout.row()
row.prop(con, "pole_angle")
- if wide_ui:
- row.label()
+ row.label()
split = layout.split()
col = split.column()
col.prop(con, "iterations")
- col.prop(con, "chain_length")
+ col.prop(con, "chain_count")
col.label(text="Weight:")
col.prop(con, "weight", text="Position", slider=True)
@@ -189,34 +165,33 @@ class ConstraintButtonsPanel(bpy.types.Panel):
sub.active = con.use_rotation
sub.prop(con, "orient_weight", text="Rotation", slider=True)
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(con, "use_tail")
col.prop(con, "use_stretch")
col.separator()
col.prop(con, "use_target")
col.prop(con, "use_rotation")
- def IK_COPY_POSE(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
- self.ik_template(layout, con, wide_ui)
+ def IK_COPY_POSE(self, context, layout, con):
+ self.target_template(layout, con)
+ self.ik_template(layout, con)
row = layout.row()
row.label(text="Axis Ref:")
- row.prop(con, "axis_reference", expand=True)
+ row.prop(con, "reference_axis", expand=True)
split = layout.split(percentage=0.33)
- split.row().prop(con, "use_position")
+ split.row().prop(con, "use_location")
row = split.row()
row.prop(con, "weight", text="Weight", slider=True)
- row.active = con.use_position
+ row.active = con.use_location
split = layout.split(percentage=0.33)
row = split.row()
row.label(text="Lock:")
row = split.row()
- row.prop(con, "pos_lock_x", text="X")
- row.prop(con, "pos_lock_y", text="Y")
- row.prop(con, "pos_lock_z", text="Z")
- split.active = con.use_position
+ row.prop(con, "lock_location_x", text="X")
+ row.prop(con, "lock_location_y", text="Y")
+ row.prop(con, "lock_location_z", text="Z")
+ split.active = con.use_location
split = layout.split(percentage=0.33)
split.row().prop(con, "use_rotation")
@@ -227,22 +202,22 @@ class ConstraintButtonsPanel(bpy.types.Panel):
row = split.row()
row.label(text="Lock:")
row = split.row()
- row.prop(con, "rot_lock_x", text="X")
- row.prop(con, "rot_lock_y", text="Y")
- row.prop(con, "rot_lock_z", text="Z")
+ row.prop(con, "lock_rotation_x", text="X")
+ row.prop(con, "lock_rotation_y", text="Y")
+ row.prop(con, "lock_rotation_z", text="Z")
split.active = con.use_rotation
- def IK_DISTANCE(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
- self.ik_template(layout, con, wide_ui)
+ def IK_DISTANCE(self, context, layout, con):
+ self.target_template(layout, con)
+ self.ik_template(layout, con)
layout.prop(con, "limit_mode")
row = layout.row()
row.prop(con, "weight", text="Weight", slider=True)
row.prop(con, "distance", text="Distance", slider=True)
- def FOLLOW_PATH(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
+ def FOLLOW_PATH(self, context, layout, con):
+ self.target_template(layout, con)
split = layout.split()
@@ -250,25 +225,22 @@ class ConstraintButtonsPanel(bpy.types.Panel):
col.prop(con, "use_curve_follow")
col.prop(con, "use_curve_radius")
- if wide_ui:
- col = split.column()
- col.prop(con, "use_fixed_position")
- if con.use_fixed_position:
+ col = split.column()
+ col.prop(con, "use_fixed_location")
+ if con.use_fixed_location:
col.prop(con, "offset_factor", text="Offset")
else:
col.prop(con, "offset")
row = layout.row()
- if wide_ui:
- row.label(text="Forward:")
- row.prop(con, "forward", expand=True)
+ row.label(text="Forward:")
+ row.prop(con, "forward_axis", expand=True)
row = layout.row()
- row.prop(con, "up", text="Up")
- if wide_ui:
- row.label()
+ row.prop(con, "up_axis", text="Up")
+ row.label()
- def LIMIT_ROTATION(self, context, layout, con, wide_ui):
+ def LIMIT_ROTATION(self, context, layout, con):
split = layout.split()
@@ -276,127 +248,115 @@ class ConstraintButtonsPanel(bpy.types.Panel):
col.prop(con, "use_limit_x")
sub = col.column()
sub.active = con.use_limit_x
- sub.prop(con, "minimum_x", text="Min")
- sub.prop(con, "maximum_x", text="Max")
+ sub.prop(con, "min_x", text="Min")
+ sub.prop(con, "max_x", text="Max")
- if wide_ui:
- col = split.column(align=True)
+ col = split.column(align=True)
col.prop(con, "use_limit_y")
sub = col.column()
sub.active = con.use_limit_y
- sub.prop(con, "minimum_y", text="Min")
- sub.prop(con, "maximum_y", text="Max")
+ sub.prop(con, "min_y", text="Min")
+ sub.prop(con, "max_y", text="Max")
- if wide_ui:
- col = split.column(align=True)
+ col = split.column(align=True)
col.prop(con, "use_limit_z")
sub = col.column()
sub.active = con.use_limit_z
- sub.prop(con, "minimum_z", text="Min")
- sub.prop(con, "maximum_z", text="Max")
+ sub.prop(con, "min_z", text="Min")
+ sub.prop(con, "max_z", text="Max")
row = layout.row()
- row.prop(con, "limit_transform")
- if wide_ui:
- row.label()
+ row.prop(con, "use_transform_limit")
+ row.label()
row = layout.row()
- if wide_ui:
- row.label(text="Convert:")
+ row.label(text="Convert:")
row.prop(con, "owner_space", text="")
- def LIMIT_LOCATION(self, context, layout, con, wide_ui):
+ def LIMIT_LOCATION(self, context, layout, con):
split = layout.split()
col = split.column()
- col.prop(con, "use_minimum_x")
+ col.prop(con, "use_min_x")
sub = col.column()
- sub.active = con.use_minimum_x
- sub.prop(con, "minimum_x", text="")
- col.prop(con, "use_maximum_x")
+ sub.active = con.use_min_x
+ sub.prop(con, "min_x", text="")
+ col.prop(con, "use_max_x")
sub = col.column()
- sub.active = con.use_maximum_x
- sub.prop(con, "maximum_x", text="")
+ sub.active = con.use_max_x
+ sub.prop(con, "max_x", text="")
- if wide_ui:
- col = split.column()
- col.prop(con, "use_minimum_y")
+ col = split.column()
+ col.prop(con, "use_min_y")
sub = col.column()
- sub.active = con.use_minimum_y
- sub.prop(con, "minimum_y", text="")
- col.prop(con, "use_maximum_y")
+ sub.active = con.use_min_y
+ sub.prop(con, "min_y", text="")
+ col.prop(con, "use_max_y")
sub = col.column()
- sub.active = con.use_maximum_y
- sub.prop(con, "maximum_y", text="")
+ sub.active = con.use_max_y
+ sub.prop(con, "max_y", text="")
- if wide_ui:
- col = split.column()
- col.prop(con, "use_minimum_z")
+ col = split.column()
+ col.prop(con, "use_min_z")
sub = col.column()
- sub.active = con.use_minimum_z
- sub.prop(con, "minimum_z", text="")
- col.prop(con, "use_maximum_z")
+ sub.active = con.use_min_z
+ sub.prop(con, "min_z", text="")
+ col.prop(con, "use_max_z")
sub = col.column()
- sub.active = con.use_maximum_z
- sub.prop(con, "maximum_z", text="")
+ sub.active = con.use_max_z
+ sub.prop(con, "max_z", text="")
row = layout.row()
- row.prop(con, "limit_transform")
- if wide_ui:
- row.label()
+ row.prop(con, "use_transform_limit")
+ row.label()
row = layout.row()
- if wide_ui:
- row.label(text="Convert:")
+ row.label(text="Convert:")
row.prop(con, "owner_space", text="")
- def LIMIT_SCALE(self, context, layout, con, wide_ui):
+ def LIMIT_SCALE(self, context, layout, con):
split = layout.split()
col = split.column()
- col.prop(con, "use_minimum_x")
+ col.prop(con, "use_min_x")
sub = col.column()
- sub.active = con.use_minimum_x
- sub.prop(con, "minimum_x", text="")
- col.prop(con, "use_maximum_x")
+ sub.active = con.use_min_x
+ sub.prop(con, "min_x", text="")
+ col.prop(con, "use_max_x")
sub = col.column()
- sub.active = con.use_maximum_x
- sub.prop(con, "maximum_x", text="")
+ sub.active = con.use_max_x
+ sub.prop(con, "max_x", text="")
- if wide_ui:
- col = split.column()
- col.prop(con, "use_minimum_y")
+ col = split.column()
+ col.prop(con, "use_min_y")
sub = col.column()
- sub.active = con.use_minimum_y
- sub.prop(con, "minimum_y", text="")
- col.prop(con, "use_maximum_y")
+ sub.active = con.use_min_y
+ sub.prop(con, "min_y", text="")
+ col.prop(con, "use_max_y")
sub = col.column()
- sub.active = con.use_maximum_y
- sub.prop(con, "maximum_y", text="")
+ sub.active = con.use_max_y
+ sub.prop(con, "max_y", text="")
- if wide_ui:
- col = split.column()
- col.prop(con, "use_minimum_z")
+ col = split.column()
+ col.prop(con, "use_min_z")
sub = col.column()
- sub.active = con.use_minimum_z
- sub.prop(con, "minimum_z", text="")
- col.prop(con, "use_maximum_z")
+ sub.active = con.use_min_z
+ sub.prop(con, "min_z", text="")
+ col.prop(con, "use_max_z")
sub = col.column()
- sub.active = con.use_maximum_z
- sub.prop(con, "maximum_z", text="")
+ sub.active = con.use_max_z
+ sub.prop(con, "max_z", text="")
row = layout.row()
- row.prop(con, "limit_transform")
- if wide_ui:
- row.label()
+ row.prop(con, "use_transform_limit")
+ row.label()
row = layout.row()
- if wide_ui:
- row.label(text="Convert:")
+ row.label(text="Convert:")
row.prop(con, "owner_space", text="")
- def COPY_ROTATION(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
+ def COPY_ROTATION(self, context, layout, con):
+ self.target_template(layout, con)
split = layout.split()
@@ -420,10 +380,10 @@ class ConstraintButtonsPanel(bpy.types.Panel):
layout.prop(con, "use_offset")
- self.space_template(layout, con, wide_ui)
+ self.space_template(layout, con)
- def COPY_LOCATION(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
+ def COPY_LOCATION(self, context, layout, con):
+ self.target_template(layout, con)
split = layout.split()
@@ -447,10 +407,10 @@ class ConstraintButtonsPanel(bpy.types.Panel):
layout.prop(con, "use_offset")
- self.space_template(layout, con, wide_ui)
+ self.space_template(layout, con)
- def COPY_SCALE(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
+ def COPY_SCALE(self, context, layout, con):
+ self.target_template(layout, con)
row = layout.row(align=True)
row.prop(con, "use_x", text="X")
@@ -459,38 +419,31 @@ class ConstraintButtonsPanel(bpy.types.Panel):
layout.prop(con, "use_offset")
- self.space_template(layout, con, wide_ui)
+ self.space_template(layout, con)
- def MAINTAIN_VOLUME(self, context, layout, con, wide_ui):
+ def MAINTAIN_VOLUME(self, context, layout, con):
row = layout.row()
- if wide_ui:
- row.label(text="Free:")
- row.prop(con, "axis", expand=True)
+ row.label(text="Free:")
+ row.prop(con, "free_axis", expand=True)
layout.prop(con, "volume")
- self.space_template(layout, con, wide_ui)
+ self.space_template(layout, con)
- def COPY_TRANSFORMS(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
+ def COPY_TRANSFORMS(self, context, layout, con):
+ self.target_template(layout, con)
- self.space_template(layout, con, wide_ui)
+ self.space_template(layout, con)
#def SCRIPT(self, context, layout, con):
- def ACTION(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
+ def ACTION(self, context, layout, con):
+ self.target_template(layout, con)
- if wide_ui:
- layout.prop(con, "action")
- else:
- layout.prop(con, "action", text="")
+ layout.prop(con, "action")
- if wide_ui:
- layout.prop(con, "transform_channel")
- else:
- layout.prop(con, "transform_channel", text="")
+ layout.prop(con, "transform_channel")
split = layout.split()
@@ -499,32 +452,28 @@ class ConstraintButtonsPanel(bpy.types.Panel):
col.prop(con, "frame_start", text="Start")
col.prop(con, "frame_end", text="End")
- if wide_ui:
- col = split.column(align=True)
+ col = split.column(align=True)
col.label(text="Target Range:")
- col.prop(con, "minimum", text="Min")
- col.prop(con, "maximum", text="Max")
+ col.prop(con, "min", text="Min")
+ col.prop(con, "max", text="Max")
row = layout.row()
- if wide_ui:
- row.label(text="Convert:")
+ row.label(text="Convert:")
row.prop(con, "target_space", text="")
- def LOCKED_TRACK(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
+ def LOCKED_TRACK(self, context, layout, con):
+ self.target_template(layout, con)
row = layout.row()
- if wide_ui:
- row.label(text="To:")
- row.prop(con, "track", expand=True)
+ row.label(text="To:")
+ row.prop(con, "track_axis", expand=True)
row = layout.row()
- if wide_ui:
- row.label(text="Lock:")
- row.prop(con, "locked", expand=True)
+ row.label(text="Lock:")
+ row.prop(con, "lock_axis", expand=True)
- def LIMIT_DISTANCE(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
+ def LIMIT_DISTANCE(self, context, layout, con):
+ self.target_template(layout, con)
col = layout.column(align=True)
col.prop(con, "distance")
@@ -534,71 +483,59 @@ class ConstraintButtonsPanel(bpy.types.Panel):
row.label(text="Clamp Region:")
row.prop(con, "limit_mode", text="")
- def STRETCH_TO(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
+ def STRETCH_TO(self, context, layout, con):
+ self.target_template(layout, con)
split = layout.split()
col = split.column()
- col.prop(con, "original_length", text="Rest Length")
+ col.prop(con, "rest_length", text="Rest Length")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.operator("constraint.stretchto_reset", text="Reset")
col = layout.column()
col.prop(con, "bulge", text="Volume Variation")
row = layout.row()
- if wide_ui:
- row.label(text="Volume:")
+ row.label(text="Volume:")
row.prop(con, "volume", expand=True)
- if not wide_ui:
- row = layout.row()
+
row.label(text="Plane:")
row.prop(con, "keep_axis", expand=True)
- def FLOOR(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
+ def FLOOR(self, context, layout, con):
+ self.target_template(layout, con)
split = layout.split()
col = split.column()
- col.prop(con, "sticky")
+ col.prop(con, "use_sticky")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(con, "use_rotation")
layout.prop(con, "offset")
row = layout.row()
- if wide_ui:
- row.label(text="Min/Max:")
+ row.label(text="Min/Max:")
row.prop(con, "floor_location", expand=True)
- self.space_template(layout, con, wide_ui)
+ self.space_template(layout, con)
- def RIGID_BODY_JOINT(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
+ def RIGID_BODY_JOINT(self, context, layout, con):
+ self.target_template(layout, con, subtargets=False)
- if wide_ui:
- layout.prop(con, "pivot_type")
- else:
- layout.prop(con, "pivot_type", text="")
- if wide_ui:
- layout.prop(con, "child")
- else:
- layout.prop(con, "child", text="")
+ layout.prop(con, "pivot_type")
+ layout.prop(con, "child")
split = layout.split()
col = split.column()
- col.prop(con, "disable_linked_collision", text="No Collision")
+ col.prop(con, "use_linked_collision", text="Linked Collision")
- if wide_ui:
- col = split.column()
- col.prop(con, "draw_pivot", text="Display Pivot")
+ col = split.column()
+ col.prop(con, "show_pivot", text="Display Pivot")
split = layout.split()
@@ -608,8 +545,7 @@ class ConstraintButtonsPanel(bpy.types.Panel):
col.prop(con, "pivot_y", text="Y")
col.prop(con, "pivot_z", text="Z")
- if wide_ui:
- col = split.column(align=True)
+ col = split.column(align=True)
col.label(text="Axis:")
col.prop(con, "axis_x", text="X")
col.prop(con, "axis_y", text="Y")
@@ -617,21 +553,20 @@ class ConstraintButtonsPanel(bpy.types.Panel):
#Missing: Limit arrays (not wrapped in RNA yet)
- def CLAMP_TO(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
+ def CLAMP_TO(self, context, layout, con):
+ self.target_template(layout, con)
row = layout.row()
- if wide_ui:
- row.label(text="Main Axis:")
+ row.label(text="Main Axis:")
row.prop(con, "main_axis", expand=True)
row = layout.row()
- row.prop(con, "cyclic")
+ row.prop(con, "use_cyclic")
- def TRANSFORM(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
+ def TRANSFORM(self, context, layout, con):
+ self.target_template(layout, con)
- layout.prop(con, "extrapolate_motion", text="Extrapolate")
+ layout.prop(con, "use_motion_extrapolate", text="Extrapolate")
col = layout.column()
col.row().label(text="Source:")
@@ -644,14 +579,12 @@ class ConstraintButtonsPanel(bpy.types.Panel):
sub.prop(con, "from_min_x", text="Min")
sub.prop(con, "from_max_x", text="Max")
- if wide_ui:
- sub = split.column(align=True)
+ sub = split.column(align=True)
sub.label(text="Y:")
sub.prop(con, "from_min_y", text="Min")
sub.prop(con, "from_max_y", text="Max")
- if wide_ui:
- sub = split.column(align=True)
+ sub = split.column(align=True)
sub.label(text="Z:")
sub.prop(con, "from_min_z", text="Min")
sub.prop(con, "from_max_z", text="Max")
@@ -672,8 +605,7 @@ class ConstraintButtonsPanel(bpy.types.Panel):
sub.prop(con, "to_min_x", text="Min")
sub.prop(con, "to_max_x", text="Max")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Y:")
col.row().prop(con, "map_to_y_from", expand=True)
@@ -681,8 +613,7 @@ class ConstraintButtonsPanel(bpy.types.Panel):
sub.prop(con, "to_min_y", text="Min")
sub.prop(con, "to_max_y", text="Max")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Z:")
col.row().prop(con, "map_to_z_from", expand=True)
@@ -690,10 +621,10 @@ class ConstraintButtonsPanel(bpy.types.Panel):
sub.prop(con, "to_min_z", text="Min")
sub.prop(con, "to_max_z", text="Max")
- self.space_template(layout, con, wide_ui)
+ self.space_template(layout, con)
- def SHRINKWRAP(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
+ def SHRINKWRAP(self, context, layout, con):
+ self.target_template(layout, con)
layout.prop(con, "distance")
layout.prop(con, "shrinkwrap_type")
@@ -704,38 +635,55 @@ class ConstraintButtonsPanel(bpy.types.Panel):
row.prop(con, "use_y")
row.prop(con, "use_z")
- def DAMPED_TRACK(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
+ def DAMPED_TRACK(self, context, layout, con):
+ self.target_template(layout, con)
row = layout.row()
- if wide_ui:
- row.label(text="To:")
- row.prop(con, "track", expand=True)
+ row.label(text="To:")
+ row.prop(con, "track_axis", expand=True)
- def SPLINE_IK(self, context, layout, con, wide_ui):
- self.target_template(layout, con, wide_ui)
+ def SPLINE_IK(self, context, layout, con):
+ self.target_template(layout, con)
col = layout.column()
col.label(text="Spline Fitting:")
- col.prop(con, "chain_length")
- col.prop(con, "even_divisions")
- col.prop(con, "chain_offset")
+ col.prop(con, "chain_count")
+ col.prop(con, "use_even_divisions")
+ col.prop(con, "use_chain_offset")
col = layout.column()
col.label(text="Chain Scaling:")
- col.prop(con, "y_stretch")
- if wide_ui:
- col.prop(con, "xz_scaling_mode")
- else:
- col.prop(con, "xz_scaling_mode", text="")
+ col.prop(con, "use_y_stretch")
+ col.prop(con, "xz_scale_mode")
col.prop(con, "use_curve_radius")
+ def PIVOT(self, context, layout, con):
+ self.target_template(layout, con)
-class OBJECT_PT_constraints(ConstraintButtonsPanel):
+ if con.target:
+ col = layout.column()
+ col.prop(con, "offset", text="Pivot Offset")
+ else:
+ col = layout.column()
+ col.prop(con, "use_relative_location")
+ if con.use_relative_location:
+ col.prop(con, "offset", text="Relative Pivot Point")
+ else:
+ col.prop(con, "offset", text="Absolute Pivot Point")
+
+ col = layout.column()
+ col.prop(con, "rotation_range", text="Pivot When")
+
+ def SCRIPT(self, context, layout, con):
+ layout.label("blender 2.5 has no py-constraints")
+
+
+class OBJECT_PT_constraints(ConstraintButtonsPanel, bpy.types.Panel):
bl_label = "Object Constraints"
bl_context = "constraint"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return (context.object)
def draw(self, context):
@@ -749,11 +697,12 @@ class OBJECT_PT_constraints(ConstraintButtonsPanel):
self.draw_constraint(context, con)
-class BONE_PT_constraints(ConstraintButtonsPanel):
+class BONE_PT_constraints(ConstraintButtonsPanel, bpy.types.Panel):
bl_label = "Bone Constraints"
bl_context = "bone_constraint"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return (context.pose_bone)
def draw(self, context):
@@ -765,21 +714,12 @@ class BONE_PT_constraints(ConstraintButtonsPanel):
self.draw_constraint(context, con)
-classes = [
- OBJECT_PT_constraints,
- BONE_PT_constraints]
-
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_particle.py b/release/scripts/ui/properties_particle.py
index 54ddb6da8a6..fbcc83240f1 100644
--- a/release/scripts/ui/properties_particle.py
+++ b/release/scripts/ui/properties_particle.py
@@ -27,33 +27,38 @@ from properties_physics_common import basic_force_field_falloff_ui
def particle_panel_enabled(context, psys):
- return (psys.point_cache.baked is False) and (not psys.edited) and (not context.particle_system_editable)
+ return (psys.point_cache.is_baked is False) and (not psys.is_edited) and (not context.particle_system_editable)
-def particle_panel_poll(context):
+def particle_panel_poll(cls, 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 cls.COMPAT_ENGINES)
-class ParticleButtonsPanel(bpy.types.Panel):
+class ParticleButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "particle"
- def poll(self, context):
- return particle_panel_poll(context)
+ @classmethod
+ def poll(cls, context):
+ return particle_panel_poll(cls, context)
-class PARTICLE_PT_context_particles(ParticleButtonsPanel):
+class PARTICLE_PT_context_particles(ParticleButtonsPanel, bpy.types.Panel):
bl_label = ""
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
- def poll(self, context):
- return (context.particle_system or context.object)
+ @classmethod
+ def poll(cls, context):
+ engine = context.scene.render.engine
+ return (context.particle_system or context.object) and (engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
@@ -64,7 +69,7 @@ class PARTICLE_PT_context_particles(ParticleButtonsPanel):
if ob:
row = layout.row()
- row.template_list(ob, "particle_systems", ob, "active_particle_system_index", rows=2)
+ row.template_list(ob, "particle_systems", ob.particle_systems, "active_index", rows=2)
col = row.column(align=True)
col.operator("object.particle_system_add", icon='ZOOMIN', text="")
@@ -111,15 +116,15 @@ class PARTICLE_PT_context_particles(ParticleButtonsPanel):
split = layout.split(percentage=0.65)
if part.type == 'HAIR':
- if psys.edited:
+ if psys.is_edited:
split.operator("particle.edited_clear", text="Free Edit")
else:
split.label(text="")
row = split.row()
row.enabled = particle_panel_enabled(context, psys)
row.prop(part, "hair_step")
- if psys.edited:
- if psys.global_hair:
+ if psys.is_edited:
+ if psys.is_global_hair:
layout.operator("particle.connect_hair")
layout.label(text="Hair is disconnected.")
else:
@@ -131,16 +136,14 @@ class PARTICLE_PT_context_particles(ParticleButtonsPanel):
split.prop(psys, "reactor_target_particle_system", text="Particle System")
-class PARTICLE_PT_custom_props(ParticleButtonsPanel, PropertyPanel):
- _context_path = "particle_system.settings"
-
-
-class PARTICLE_PT_emission(ParticleButtonsPanel):
+class PARTICLE_PT_emission(ParticleButtonsPanel, bpy.types.Panel):
bl_label = "Emission"
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
- def poll(self, context):
- if particle_panel_poll(context):
- return not context.particle_system.point_cache.external
+ @classmethod
+ def poll(cls, context):
+ if particle_panel_poll(PARTICLE_PT_emission, context):
+ return not context.particle_system.point_cache.use_external
else:
return False
@@ -150,34 +153,36 @@ class PARTICLE_PT_emission(ParticleButtonsPanel):
psys = context.particle_system
part = psys.settings
- layout.enabled = particle_panel_enabled(context, psys) and not psys.multiple_caches
+ layout.enabled = particle_panel_enabled(context, psys) and not psys.has_multiple_caches
row = layout.row()
row.active = part.distribution != 'GRID'
- row.prop(part, "amount")
+ row.prop(part, "count")
if part.type != 'HAIR':
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")
- col.prop(part, "random_lifetime", slider=True)
+ col.prop(part, "lifetime_random", slider=True)
layout.row().label(text="Emit From:")
row = layout.row()
row.prop(part, "emit_from", expand=True)
+
row = layout.row()
- row.prop(part, "trand")
+ row.prop(part, "use_emit_random")
if part.distribution != 'GRID':
- row.prop(part, "even_distribution")
+ row.prop(part, "use_even_distribution")
if part.emit_from == 'FACE' or part.emit_from == 'VOLUME':
row = layout.row()
+
row.prop(part, "distribution", expand=True)
row = layout.row()
@@ -189,25 +194,28 @@ class PARTICLE_PT_emission(ParticleButtonsPanel):
row.prop(part, "grid_resolution")
-class PARTICLE_PT_hair_dynamics(ParticleButtonsPanel):
+class PARTICLE_PT_hair_dynamics(ParticleButtonsPanel, bpy.types.Panel):
bl_label = "Hair dynamics"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, 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 cls.COMPAT_ENGINES)
def draw_header(self, context):
#cloth = context.cloth.collision_settings
#self.layout.active = cloth_panel_enabled(context.cloth)
- #self.layout.prop(cloth, "enable_collision", text="")
+ #self.layout.prop(cloth, "use_collision", text="")
psys = context.particle_system
- self.layout.prop(psys, "hair_dynamics", text="")
+ self.layout.prop(psys, "use_hair_dynamics", text="")
def draw(self, context):
layout = self.layout
@@ -220,7 +228,7 @@ class PARTICLE_PT_hair_dynamics(ParticleButtonsPanel):
#part = psys.settings
cloth = psys.cloth.settings
- layout.enabled = psys.hair_dynamics
+ layout.enabled = psys.use_hair_dynamics
split = layout.split()
@@ -244,12 +252,15 @@ class PARTICLE_PT_hair_dynamics(ParticleButtonsPanel):
col.prop(cloth, "quality", text="Steps", slider=True)
-class PARTICLE_PT_cache(ParticleButtonsPanel):
+class PARTICLE_PT_cache(ParticleButtonsPanel, bpy.types.Panel):
bl_label = "Cache"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
psys = context.particle_system
+ engine = context.scene.render.engine
if psys is None:
return False
if psys.settings is None:
@@ -257,22 +268,23 @@ 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.use_hair_dynamics)) and engine in cls.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.use_hair_dynamics else 'PSYS')
-class PARTICLE_PT_velocity(ParticleButtonsPanel):
+class PARTICLE_PT_velocity(ParticleButtonsPanel, bpy.types.Panel):
bl_label = "Velocity"
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
- def poll(self, context):
- if particle_panel_poll(context):
+ @classmethod
+ def poll(cls, context):
+ if particle_panel_poll(PARTICLE_PT_velocity, context):
psys = context.particle_system
- return psys.settings.physics_type != 'BOIDS' and not psys.point_cache.external
+ return psys.settings.physics_type != 'BOIDS' and not psys.point_cache.use_external
else:
return False
@@ -295,7 +307,7 @@ class PARTICLE_PT_velocity(ParticleButtonsPanel):
sub = split.column()
sub.label(text="Emitter Object")
- sub.prop(part, "object_aligned_factor", text="")
+ sub.prop(part, "object_align_factor", text="")
layout.row().label(text="Other:")
split = layout.split()
@@ -305,20 +317,22 @@ class PARTICLE_PT_velocity(ParticleButtonsPanel):
else:
sub.prop(part, "object_factor", slider=True)
sub = split.column()
- sub.prop(part, "random_factor")
+ sub.prop(part, "factor_random")
#if part.type=='REACTOR':
# sub.prop(part, "reactor_factor")
# sub.prop(part, "reaction_shape", slider=True)
-class PARTICLE_PT_rotation(ParticleButtonsPanel):
+class PARTICLE_PT_rotation(ParticleButtonsPanel, bpy.types.Panel):
bl_label = "Rotation"
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
- def poll(self, context):
- if particle_panel_poll(context):
+ @classmethod
+ def poll(cls, context):
+ if particle_panel_poll(PARTICLE_PT_rotation, context):
psys = context.particle_system
- return psys.settings.physics_type != 'BOIDS' and not psys.point_cache.external
+ return psys.settings.physics_type != 'BOIDS' and not psys.point_cache.use_external
else:
return False
@@ -332,16 +346,16 @@ class PARTICLE_PT_rotation(ParticleButtonsPanel):
split = layout.split()
split.label(text="Initial Rotation:")
- split.prop(part, "rotation_dynamic")
+ split.prop(part, "use_dynamic_rotation")
split = layout.split()
sub = split.column(align=True)
sub.prop(part, "rotation_mode", text="")
- sub.prop(part, "random_rotation_factor", slider=True, text="Random")
+ sub.prop(part, "rotation_factor_random", slider=True, text="Random")
sub = split.column(align=True)
sub.prop(part, "phase_factor", slider=True)
- sub.prop(part, "random_phase_factor", text="Random", slider=True)
+ sub.prop(part, "phase_factor_random", text="Random", slider=True)
layout.row().label(text="Angular Velocity:")
layout.row().prop(part, "angular_velocity_mode", expand=True)
@@ -353,12 +367,14 @@ class PARTICLE_PT_rotation(ParticleButtonsPanel):
sub.prop(part, "angular_velocity_factor", text="")
-class PARTICLE_PT_physics(ParticleButtonsPanel):
+class PARTICLE_PT_physics(ParticleButtonsPanel, bpy.types.Panel):
bl_label = "Physics"
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
- def poll(self, context):
- if particle_panel_poll(context):
- return not context.particle_system.point_cache.external
+ @classmethod
+ def poll(cls, context):
+ if particle_panel_poll(PARTICLE_PT_physics, context):
+ return not context.particle_system.point_cache.use_external
else:
return False
@@ -372,14 +388,16 @@ class PARTICLE_PT_physics(ParticleButtonsPanel):
row = layout.row()
row.prop(part, "physics_type", expand=True)
+
+ row = layout.row()
+ col = row.column(align=True)
+ col.prop(part, "particle_size")
+ col.prop(part, "size_random", slider=True)
+
if part.physics_type != 'NO':
- row = layout.row()
- col = row.column(align=True)
- col.prop(part, "particle_size")
- col.prop(part, "random_size", slider=True)
col = row.column(align=True)
col.prop(part, "mass")
- col.prop(part, "sizemass", text="Multiply mass with size")
+ col.prop(part, "use_multiply_size_mass", text="Multiply mass with size")
if part.physics_type == 'NEWTON':
split = layout.split()
@@ -388,12 +406,15 @@ class PARTICLE_PT_physics(ParticleButtonsPanel):
sub.label(text="Forces:")
sub.prop(part, "brownian_factor")
sub.prop(part, "drag_factor", slider=True)
- sub.prop(part, "damp_factor", slider=True)
+ sub.prop(part, "damping", slider=True)
sub = split.column()
- sub.prop(part, "size_deflect")
- sub.prop(part, "die_on_collision")
- sub.prop(part, "integrator")
+ sub.label(text="Integration:")
+ sub.prop(part, "integrator", text="")
sub.prop(part, "time_tweak")
+ sub.prop(part, "subframes")
+ sub = layout.row()
+ sub.prop(part, "use_size_deflect")
+ sub.prop(part, "use_die_on_collision")
elif part.physics_type == 'FLUID':
fluid = part.fluid
@@ -403,19 +424,22 @@ class PARTICLE_PT_physics(ParticleButtonsPanel):
sub.label(text="Forces:")
sub.prop(part, "brownian_factor")
sub.prop(part, "drag_factor", slider=True)
- sub.prop(part, "damp_factor", slider=True)
+ sub.prop(part, "damping", slider=True)
sub = split.column()
- sub.prop(part, "size_deflect")
- sub.prop(part, "die_on_collision")
- sub.prop(part, "integrator")
+ sub.label(text="Integration:")
+ sub.prop(part, "integrator", text="")
sub.prop(part, "time_tweak")
+ sub.prop(part, "subframes")
+ sub = layout.row()
+ sub.prop(part, "use_size_deflect")
+ sub.prop(part, "use_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, "stiffness")
+ sub.prop(fluid, "stiffness_near")
sub.prop(fluid, "rest_density")
sub.label(text="Viscosity:")
@@ -425,7 +449,7 @@ class PARTICLE_PT_physics(ParticleButtonsPanel):
sub = split.column()
sub.label(text="Springs:")
- sub.prop(fluid, "spring_k", text="Force", slider=True)
+ sub.prop(fluid, "spring_force", text="Force", slider=True)
sub.prop(fluid, "rest_length", slider=True)
layout.label(text="Multiple fluids interactions:")
@@ -438,9 +462,9 @@ class PARTICLE_PT_physics(ParticleButtonsPanel):
row = layout.row()
col = row.column()
- col.active = not psys.keyed_timing
+ col.active = not psys.use_keyed_timing
col.prop(part, "keyed_loops", text="Loops")
- row.prop(psys, "keyed_timing", text="Use Timing")
+ row.prop(psys, "use_keyed_timing", text="Use Timing")
layout.label(text="Keys:")
elif part.physics_type == 'BOIDS':
@@ -448,31 +472,31 @@ class PARTICLE_PT_physics(ParticleButtonsPanel):
row = layout.row()
- row.prop(boids, "allow_flight")
- row.prop(boids, "allow_land")
- row.prop(boids, "allow_climb")
+ row.prop(boids, "use_flight")
+ row.prop(boids, "use_land")
+ row.prop(boids, "use_climb")
split = layout.split()
sub = split.column()
col = sub.column(align=True)
- col.active = boids.allow_flight
- col.prop(boids, "air_max_speed")
- col.prop(boids, "air_min_speed", slider=True)
- col.prop(boids, "air_max_acc", slider=True)
- col.prop(boids, "air_max_ave", slider=True)
+ col.active = boids.use_flight
+ col.prop(boids, "air_speed_max")
+ col.prop(boids, "air_speed_min", slider=True)
+ col.prop(boids, "air_acc_max", slider=True)
+ col.prop(boids, "air_ave_max", slider=True)
col.prop(boids, "air_personal_space")
row = col.row()
- row.active = (boids.allow_land or boids.allow_climb) and boids.allow_flight
- row.prop(boids, "landing_smoothness")
+ row.active = (boids.use_land or boids.allow_climb) and boids.allow_flight
+ row.prop(boids, "land_smooth")
sub = split.column()
col = sub.column(align=True)
- col.active = boids.allow_land or boids.allow_climb
- col.prop(boids, "land_max_speed")
+ col.active = boids.use_land or boids.allow_climb
+ col.prop(boids, "land_speed_max")
col.prop(boids, "land_jump_speed")
- col.prop(boids, "land_max_acc", slider=True)
- col.prop(boids, "land_max_ave", slider=True)
+ col.prop(boids, "land_acc_max", slider=True)
+ col.prop(boids, "land_ave_max", slider=True)
col.prop(boids, "land_personal_space")
col.prop(boids, "land_stick_force")
@@ -488,7 +512,7 @@ class PARTICLE_PT_physics(ParticleButtonsPanel):
col = row.column()
col.label(text="Misc:")
- col.prop(boids, "banking", slider=True)
+ col.prop(boids, "bank", slider=True)
col.prop(boids, "height", slider=True)
if part.physics_type == 'KEYED' or part.physics_type == 'BOIDS' or part.physics_type == 'FLUID':
@@ -518,7 +542,7 @@ class PARTICLE_PT_physics(ParticleButtonsPanel):
col.prop(key, "object", text="")
col.prop(key, "system", text="System")
col = row.column()
- col.active = psys.keyed_timing
+ col.active = psys.use_keyed_timing
col.prop(key, "time")
col.prop(key, "duration")
elif part.physics_type == 'BOIDS':
@@ -528,7 +552,7 @@ class PARTICLE_PT_physics(ParticleButtonsPanel):
sub.prop(key, "object", text="")
sub.prop(key, "system", text="System")
- layout.prop(key, "mode", expand=True)
+ layout.prop(key, "alliance", expand=True)
elif part.physics_type == 'FLUID':
sub = row.row()
#doesn't work yet
@@ -537,18 +561,21 @@ class PARTICLE_PT_physics(ParticleButtonsPanel):
sub.prop(key, "system", text="System")
-class PARTICLE_PT_boidbrain(ParticleButtonsPanel):
+class PARTICLE_PT_boidbrain(ParticleButtonsPanel, bpy.types.Panel):
bl_label = "Boid Brain"
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, 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:
+ if psys.point_cache.use_external:
return False
- return psys.settings.physics_type == 'BOIDS'
+ return psys.settings.physics_type == 'BOIDS' and engine in cls.COMPAT_ENGINES
def draw(self, context):
layout = self.layout
@@ -575,7 +602,7 @@ class PARTICLE_PT_boidbrain(ParticleButtonsPanel):
row = layout.row()
row.prop(state, "ruleset_type")
if state.ruleset_type == 'FUZZY':
- row.prop(state, "rule_fuzziness", slider=True)
+ row.prop(state, "rule_fuzzy", slider=True)
else:
row.label(text="")
@@ -598,34 +625,34 @@ class PARTICLE_PT_boidbrain(ParticleButtonsPanel):
row = layout.row()
row.prop(rule, "name", text="")
#somebody make nice icons for boids here please! -jahka
- row.prop(rule, "in_air", icon='MOVE_UP_VEC', text="")
- row.prop(rule, "on_land", icon='MOVE_DOWN_VEC', text="")
+ row.prop(rule, "use_in_air", icon='MOVE_UP_VEC', text="")
+ row.prop(rule, "use_on_land", icon='MOVE_DOWN_VEC', text="")
row = layout.row()
if rule.type == 'GOAL':
row.prop(rule, "object")
row = layout.row()
- row.prop(rule, "predict")
+ row.prop(rule, "use_predict")
elif rule.type == 'AVOID':
row.prop(rule, "object")
row = layout.row()
- row.prop(rule, "predict")
+ row.prop(rule, "use_predict")
row.prop(rule, "fear_factor")
elif rule.type == 'FOLLOW_PATH':
row.label(text="Not yet functional.")
elif rule.type == 'AVOID_COLLISION':
- row.prop(rule, "boids")
- row.prop(rule, "deflectors")
+ row.prop(rule, "use_avoid")
+ row.prop(rule, "use_avoid_collision")
row.prop(rule, "look_ahead")
elif rule.type == 'FOLLOW_LEADER':
row.prop(rule, "object", text="")
row.prop(rule, "distance")
row = layout.row()
- row.prop(rule, "line")
+ row.prop(rule, "use_line")
sub = row.row()
sub.active = rule.line
- sub.prop(rule, "queue_size")
+ sub.prop(rule, "queue_count")
elif rule.type == 'AVERAGE_SPEED':
row.prop(rule, "speed", slider=True)
row.prop(rule, "wander", slider=True)
@@ -635,16 +662,19 @@ class PARTICLE_PT_boidbrain(ParticleButtonsPanel):
row.prop(rule, "flee_distance")
-class PARTICLE_PT_render(ParticleButtonsPanel):
+class PARTICLE_PT_render(ParticleButtonsPanel, bpy.types.Panel):
bl_label = "Render"
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, 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 cls.COMPAT_ENGINES
def draw(self, context):
layout = self.layout
@@ -659,88 +689,82 @@ class PARTICLE_PT_render(ParticleButtonsPanel):
split = layout.split()
sub = split.column()
- sub.prop(part, "emitter")
- sub.prop(part, "parent")
+ sub.prop(part, "use_render_emitter")
+ sub.prop(part, "use_parent_particles")
sub = split.column()
- sub.prop(part, "unborn")
- sub.prop(part, "died")
+ sub.prop(part, "show_unborn")
+ sub.prop(part, "use_dead")
row = layout.row()
- row.prop(part, "ren_as", expand=True)
+ row.prop(part, "render_type", expand=True)
split = layout.split()
sub = split.column()
- if part.ren_as == 'LINE':
+ if part.render_type == 'LINE':
sub.prop(part, "line_length_tail")
sub.prop(part, "line_length_head")
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")
+ sub.prop(part, "use_velocity_length")
+ elif part.render_type == 'PATH':
+ sub.prop(part, "use_strand_primitive")
subsub = sub.column()
- subsub.active = (part.render_strand is False)
- subsub.prop(part, "render_adaptive")
+ subsub.active = (part.use_strand_primitive is False)
+ subsub.prop(part, "use_render_adaptive")
subsub = sub.column()
- subsub.active = part.render_adaptive or part.render_strand == True
+ subsub.active = part.use_render_adaptive or part.use_strand_primitive == True
subsub.prop(part, "adaptive_angle")
subsub = sub.column()
- subsub.active = (part.render_adaptive is True and part.render_strand is False)
- subsub.prop(part, "adaptive_pix")
- sub.prop(part, "hair_bspline")
+ subsub.active = (part.use_render_adaptive is True and part.use_strand_primitive is False)
+ subsub.prop(part, "adaptive_pixel")
+ sub.prop(part, "use_hair_bspline")
sub.prop(part, "render_step", text="Steps")
sub = split.column()
sub.label(text="Timing:")
- sub.prop(part, "abs_path_time")
- sub.prop(part, "path_start", text="Start", slider=not part.abs_path_time)
- sub.prop(part, "path_end", text="End", slider=not part.abs_path_time)
- sub.prop(part, "random_length", text="Random", slider=True)
+ sub.prop(part, "use_absolute_path_time")
+ sub.prop(part, "path_start", text="Start", slider=not part.use_absolute_path_time)
+ sub.prop(part, "path_end", text="End", slider=not part.use_absolute_path_time)
+ sub.prop(part, "length_random", text="Random", slider=True)
row = layout.row()
col = row.column()
- if part.type == 'HAIR' and part.render_strand == True and part.child_type == 'FACES':
- layout.prop(part, "enable_simplify")
- if part.enable_simplify == True:
+ if part.type == 'HAIR' and part.use_strand_primitive == True and part.child_type == 'FACES':
+ layout.prop(part, "use_simplify")
+ if part.use_simplify == True:
row = layout.row()
row.prop(part, "simplify_refsize")
row.prop(part, "simplify_rate")
row.prop(part, "simplify_transition")
row = layout.row()
- row.prop(part, "viewport")
+ row.prop(part, "use_simplify_viewport")
sub = row.row()
sub.active = part.viewport == True
sub.prop(part, "simplify_viewport")
- elif part.ren_as == 'OBJECT':
+ elif part.render_type == 'OBJECT':
sub.prop(part, "dupli_object")
sub.prop(part, "use_global_dupli")
- elif part.ren_as == 'GROUP':
+ elif part.render_type == 'GROUP':
sub.prop(part, "dupli_group")
split = layout.split()
sub = split.column()
- sub.prop(part, "whole_group")
+ sub.prop(part, "use_whole_group")
subsub = sub.column()
- subsub.active = (part.whole_group is False)
+ subsub.active = (part.use_whole_group is False)
subsub.prop(part, "use_group_count")
sub = split.column()
subsub = sub.column()
- subsub.active = (part.whole_group is False)
+ subsub.active = (part.use_whole_group is False)
subsub.prop(part, "use_global_dupli")
- subsub.prop(part, "rand_group")
+ subsub.prop(part, "use_group_pick_random")
- if part.use_group_count and not part.whole_group:
+ if part.use_group_count and not part.use_whole_group:
row = layout.row()
- row.template_list(part, "dupliweights", part, "active_dupliweight_index")
+ row.template_list(part, "dupli_weights", part, "active_dupliweight_index")
col = row.column()
sub = col.row()
@@ -755,12 +779,12 @@ class PARTICLE_PT_render(ParticleButtonsPanel):
row = layout.row()
row.prop(weight, "count")
- elif part.ren_as == 'BILLBOARD':
+ elif part.render_type == 'BILLBOARD':
sub.label(text="Align:")
row = layout.row()
row.prop(part, "billboard_align", expand=True)
- row.prop(part, "billboard_lock", text="Lock")
+ row.prop(part, "lock_billboard", text="Lock")
row = layout.row()
row.prop(part, "billboard_object")
@@ -768,7 +792,7 @@ class PARTICLE_PT_render(ParticleButtonsPanel):
col = row.column(align=True)
col.label(text="Tilt:")
col.prop(part, "billboard_tilt", text="Angle", slider=True)
- col.prop(part, "billboard_random_tilt", slider=True)
+ col.prop(part, "billboard_tilt_random", slider=True)
col = row.column()
col.prop(part, "billboard_offset")
@@ -784,35 +808,38 @@ 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_offset_split", text="")
- if part.ren_as == 'HALO' or part.ren_as == 'LINE' or part.ren_as == 'BILLBOARD':
+ if part.render_type == 'HALO' or part.render_type == 'LINE' or part.render_type == 'BILLBOARD':
row = layout.row()
col = row.column()
col.prop(part, "trail_count")
if part.trail_count > 1:
- col.prop(part, "abs_path_time", text="Length in frames")
+ col.prop(part, "use_absolute_path_time", text="Length in frames")
col = row.column()
- col.prop(part, "path_end", text="Length", slider=not part.abs_path_time)
- col.prop(part, "random_length", text="Random", slider=True)
+ col.prop(part, "path_end", text="Length", slider=not part.use_absolute_path_time)
+ col.prop(part, "length_random", text="Random", slider=True)
else:
col = row.column()
col.label(text="")
-class PARTICLE_PT_draw(ParticleButtonsPanel):
+class PARTICLE_PT_draw(ParticleButtonsPanel, bpy.types.Panel):
bl_label = "Display"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, 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 cls.COMPAT_ENGINES
def draw(self, context):
layout = self.layout
@@ -821,21 +848,16 @@ class PARTICLE_PT_draw(ParticleButtonsPanel):
part = psys.settings
row = layout.row()
- row.prop(part, "draw_as", expand=True)
+ row.prop(part, "draw_method", expand=True)
- if part.draw_as == 'NONE' or (part.ren_as == 'NONE' and part.draw_as == 'RENDER'):
+ if part.draw_method == 'NONE' or (part.render_type == 'NONE' and part.draw_method == '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
+ path = (part.render_type == 'PATH' and part.draw_method == 'RENDER') or part.draw_method == 'PATH'
row = layout.row()
- row.prop(part, "display", slider=True)
- if part.draw_as != 'RENDER' or part.ren_as == 'HALO':
+ row.prop(part, "draw_percentage", slider=True)
+ if part.draw_method != 'RENDER' or part.render_type == 'HALO':
row.prop(part, "draw_size")
else:
row.label(text="")
@@ -843,26 +865,31 @@ class PARTICLE_PT_draw(ParticleButtonsPanel):
row = layout.row()
col = row.column()
col.prop(part, "show_size")
- col.prop(part, "velocity")
- col.prop(part, "num")
+ col.prop(part, "show_velocity")
+ col.prop(part, "show_number")
if part.physics_type == 'BOIDS':
- col.prop(part, "draw_health")
+ col.prop(part, "show_health")
col = row.column()
- col.prop(part, "material_color", text="Use material color")
+ col.prop(part, "show_material_color", text="Use material color")
if (path):
col.prop(part, "draw_step")
else:
sub = col.column()
- sub.active = (part.material_color is False)
+ sub.active = (part.show_material_color is False)
#sub.label(text="color")
#sub.label(text="Override material color")
-class PARTICLE_PT_children(ParticleButtonsPanel):
+class PARTICLE_PT_children(ParticleButtonsPanel, bpy.types.Panel):
bl_label = "Children"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
+
+ @classmethod
+ def poll(cls, context):
+ return particle_panel_poll(cls, context)
def draw(self, context):
layout = self.layout
@@ -879,7 +906,7 @@ class PARTICLE_PT_children(ParticleButtonsPanel):
col = row.column(align=True)
col.prop(part, "child_nbr", text="Display")
- col.prop(part, "rendered_child_nbr", text="Render")
+ col.prop(part, "rendered_child_count", text="Render")
col = row.column(align=True)
@@ -891,7 +918,7 @@ class PARTICLE_PT_children(ParticleButtonsPanel):
col = row.column(align=True)
col.prop(part, "child_size", text="Size")
- col.prop(part, "child_random_size", text="Random")
+ col.prop(part, "child_size_random", text="Random")
layout.row().label(text="Effects:")
@@ -899,27 +926,27 @@ class PARTICLE_PT_children(ParticleButtonsPanel):
col = row.column(align=True)
col.prop(part, "clump_factor", slider=True)
- col.prop(part, "clumppow", slider=True)
+ col.prop(part, "clump_shape", slider=True)
col = row.column(align=True)
- col.prop(part, "rough_endpoint")
- col.prop(part, "rough_end_shape")
+ col.prop(part, "roughness_endpoint")
+ col.prop(part, "roughness_end_shape")
row = layout.row()
col = row.column(align=True)
- col.prop(part, "rough1")
- col.prop(part, "rough1_size")
+ col.prop(part, "roughness_1")
+ col.prop(part, "roughness_1_size")
col = row.column(align=True)
- col.prop(part, "rough2")
- col.prop(part, "rough2_size")
- col.prop(part, "rough2_thres", slider=True)
+ col.prop(part, "roughness_2")
+ col.prop(part, "roughness_2_size")
+ col.prop(part, "roughness_2_threshold", slider=True)
row = layout.row()
col = row.column(align=True)
col.prop(part, "child_length", slider=True)
- col.prop(part, "child_length_thres", slider=True)
+ col.prop(part, "child_length_threshold", slider=True)
col = row.column(align=True)
col.label(text="Space reserved for")
@@ -937,28 +964,30 @@ class PARTICLE_PT_children(ParticleButtonsPanel):
col.prop(part, "kink_shape", slider=True)
-class PARTICLE_PT_field_weights(ParticleButtonsPanel):
+class PARTICLE_PT_field_weights(ParticleButtonsPanel, bpy.types.Panel):
bl_label = "Field Weights"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
def draw(self, context):
part = context.particle_system.settings
effector_weights_ui(self, context, part.effector_weights)
if part.type == 'HAIR':
- self.layout.prop(part.effector_weights, "do_growing_hair")
+ self.layout.prop(part.effector_weights, "apply_to_hair_growing")
-class PARTICLE_PT_force_fields(ParticleButtonsPanel):
+class PARTICLE_PT_force_fields(ParticleButtonsPanel, bpy.types.Panel):
bl_label = "Force Field Settings"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
def draw(self, context):
layout = self.layout
part = context.particle_system.settings
- layout.prop(part, "self_effect")
+ layout.prop(part, "use_self_effect")
split = layout.split(percentage=0.2)
split.label(text="Type 1:")
@@ -976,9 +1005,10 @@ class PARTICLE_PT_force_fields(ParticleButtonsPanel):
basic_force_field_falloff_ui(self, context, part.force_field_2)
-class PARTICLE_PT_vertexgroups(ParticleButtonsPanel):
+class PARTICLE_PT_vertexgroups(ParticleButtonsPanel, bpy.types.Panel):
bl_label = "Vertexgroups"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
def draw(self, context):
layout = self.layout
@@ -995,83 +1025,65 @@ class PARTICLE_PT_vertexgroups(ParticleButtonsPanel):
row = layout.row()
- row.prop_object(psys, "vertex_group_density", ob, "vertex_groups", text="Density")
- row.prop(psys, "vertex_group_density_negate", text="")
+ row.prop_search(psys, "vertex_group_density", ob, "vertex_groups", text="Density")
+ row.prop(psys, "invert_vertex_group_density", text="")
row = layout.row()
- row.prop_object(psys, "vertex_group_velocity", ob, "vertex_groups", text="Velocity")
- row.prop(psys, "vertex_group_velocity_negate", text="")
+ row.prop_search(psys, "vertex_group_velocity", ob, "vertex_groups", text="Velocity")
+ row.prop(psys, "invert_vertex_group_velocity", text="")
row = layout.row()
- row.prop_object(psys, "vertex_group_length", ob, "vertex_groups", text="Length")
- row.prop(psys, "vertex_group_length_negate", text="")
+ row.prop_search(psys, "vertex_group_length", ob, "vertex_groups", text="Length")
+ row.prop(psys, "invert_vertex_group_length", text="")
row = layout.row()
- row.prop_object(psys, "vertex_group_clump", ob, "vertex_groups", text="Clump")
- row.prop(psys, "vertex_group_clump_negate", text="")
+ row.prop_search(psys, "vertex_group_clump", ob, "vertex_groups", text="Clump")
+ row.prop(psys, "invert_vertex_group_clump", text="")
row = layout.row()
- row.prop_object(psys, "vertex_group_kink", ob, "vertex_groups", text="Kink")
- row.prop(psys, "vertex_group_kink_negate", text="")
+ row.prop_search(psys, "vertex_group_kink", ob, "vertex_groups", text="Kink")
+ row.prop(psys, "invert_vertex_group_kink", text="")
row = layout.row()
- row.prop_object(psys, "vertex_group_roughness1", ob, "vertex_groups", text="Roughness 1")
- row.prop(psys, "vertex_group_roughness1_negate", text="")
+ row.prop_search(psys, "vertex_group_roughness_1", ob, "vertex_groups", text="Roughness 1")
+ row.prop(psys, "invert_vertex_group_roughness_1", text="")
row = layout.row()
- row.prop_object(psys, "vertex_group_roughness2", ob, "vertex_groups", text="Roughness 2")
- row.prop(psys, "vertex_group_roughness2_negate", text="")
+ row.prop_search(psys, "vertex_group_roughness_2", ob, "vertex_groups", text="Roughness 2")
+ row.prop(psys, "invert_vertex_group_roughness_2", text="")
row = layout.row()
- row.prop_object(psys, "vertex_group_roughness_end", ob, "vertex_groups", text="Roughness End")
- row.prop(psys, "vertex_group_roughness_end_negate", text="")
+ row.prop_search(psys, "vertex_group_roughness_end", ob, "vertex_groups", text="Roughness End")
+ row.prop(psys, "invert_vertex_group_roughness_end", text="")
row = layout.row()
- row.prop_object(psys, "vertex_group_size", ob, "vertex_groups", text="Size")
- row.prop(psys, "vertex_group_size_negate", text="")
+ row.prop_search(psys, "vertex_group_size", ob, "vertex_groups", text="Size")
+ row.prop(psys, "invert_vertex_group_size", text="")
row = layout.row()
- row.prop_object(psys, "vertex_group_tangent", ob, "vertex_groups", text="Tangent")
- row.prop(psys, "vertex_group_tangent_negate", text="")
+ row.prop_search(psys, "vertex_group_tangent", ob, "vertex_groups", text="Tangent")
+ row.prop(psys, "invert_vertex_group_tangent", text="")
row = layout.row()
- row.prop_object(psys, "vertex_group_rotation", ob, "vertex_groups", text="Rotation")
- row.prop(psys, "vertex_group_rotation_negate", text="")
+ row.prop_search(psys, "vertex_group_rotation", ob, "vertex_groups", text="Rotation")
+ row.prop(psys, "invert_vertex_group_rotation", text="")
row = layout.row()
- row.prop_object(psys, "vertex_group_field", ob, "vertex_groups", text="Field")
- row.prop(psys, "vertex_group_field_negate", text="")
+ row.prop_search(psys, "vertex_group_field", ob, "vertex_groups", text="Field")
+ row.prop(psys, "invert_vertex_group_field", text="")
-classes = [
- PARTICLE_PT_context_particles,
- PARTICLE_PT_hair_dynamics,
- PARTICLE_PT_cache,
- PARTICLE_PT_emission,
- PARTICLE_PT_velocity,
- PARTICLE_PT_rotation,
- PARTICLE_PT_physics,
- PARTICLE_PT_boidbrain,
- PARTICLE_PT_render,
- PARTICLE_PT_draw,
- PARTICLE_PT_children,
- PARTICLE_PT_field_weights,
- PARTICLE_PT_force_fields,
- PARTICLE_PT_vertexgroups,
-
- PARTICLE_PT_custom_props]
+class PARTICLE_PT_custom_props(ParticleButtonsPanel, PropertyPanel, bpy.types.Panel):
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
+ _context_path = "particle_system.settings"
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_physics_cloth.py b/release/scripts/ui/properties_physics_cloth.py
index 8761e8a38c0..099711f6dec 100644
--- a/release/scripts/ui/properties_physics_cloth.py
+++ b/release/scripts/ui/properties_physics_cloth.py
@@ -19,15 +19,13 @@
# <pep8 compliant>
import bpy
-narrowui = 180
-
from properties_physics_common import point_cache_ui
from properties_physics_common import effector_weights_ui
def cloth_panel_enabled(md):
- return md.point_cache.baked is False
+ return md.point_cache.is_baked is False
class CLOTH_MT_presets(bpy.types.Menu):
@@ -36,22 +34,23 @@ 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
-class PhysicButtonsPanel(bpy.types.Panel):
+class PhysicButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "physics"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
ob = context.object
rd = context.scene.render
return (ob and ob.type == 'MESH') and (not rd.use_game_engine)
-class PHYSICS_PT_cloth(PhysicButtonsPanel):
+class PHYSICS_PT_cloth(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Cloth"
def draw(self, context):
@@ -59,10 +58,8 @@ class PHYSICS_PT_cloth(PhysicButtonsPanel):
md = context.cloth
ob = context.object
- wide_ui = context.region.width > narrowui
split = layout.split()
- split.operator_context = 'EXEC_DEFAULT'
if md:
# remove modifier + settings
@@ -70,15 +67,12 @@ class PHYSICS_PT_cloth(PhysicButtonsPanel):
split.operator("object.modifier_remove", text="Remove")
row = split.row(align=True)
- row.prop(md, "render", text="")
- row.prop(md, "realtime", text="")
+ row.prop(md, "show_render", text="")
+ row.prop(md, "show_viewport", text="")
else:
# 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 +84,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)
@@ -102,17 +96,16 @@ class PHYSICS_PT_cloth(PhysicButtonsPanel):
col.prop(cloth, "structural_stiffness", text="Structural")
col.prop(cloth, "bending_stiffness", text="Bending")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Damping:")
col.prop(cloth, "spring_damping", text="Spring")
col.prop(cloth, "air_damping", text="Air")
- col.prop(cloth, "pin_cloth", text="Pinning")
+ col.prop(cloth, "use_pin_cloth", text="Pinning")
sub = col.column()
- sub.active = cloth.pin_cloth
- sub.prop_object(cloth, "mass_vertex_group", ob, "vertex_groups", text="")
+ sub.active = cloth.use_pin_cloth
+ sub.prop_search(cloth, "mass_vertex_group", ob, "vertex_groups", text="")
sub.prop(cloth, "pin_stiffness", text="Stiffness")
col.label(text="Pre roll:")
@@ -133,73 +126,74 @@ class PHYSICS_PT_cloth(PhysicButtonsPanel):
if key:
col.label(text="Rest Shape Key:")
- col.prop_object(cloth, "rest_shape_key", key, "keys", text="")
+ col.prop_search(cloth, "rest_shape_key", key, "keys", text="")
-class PHYSICS_PT_cloth_cache(PhysicButtonsPanel):
+class PHYSICS_PT_cloth_cache(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Cloth Cache"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.cloth
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):
+class PHYSICS_PT_cloth_collision(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Cloth Collision"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.cloth
def draw_header(self, context):
cloth = context.cloth.collision_settings
self.layout.active = cloth_panel_enabled(context.cloth)
- self.layout.prop(cloth, "enable_collision", text="")
+ self.layout.prop(cloth, "use_collision", text="")
def draw(self, context):
layout = self.layout
cloth = context.cloth.collision_settings
md = context.cloth
- wide_ui = context.region.width > narrowui
- layout.active = cloth.enable_collision and cloth_panel_enabled(md)
+ layout.active = cloth.use_collision and cloth_panel_enabled(md)
split = layout.split()
col = split.column()
col.prop(cloth, "collision_quality", slider=True, text="Quality")
- col.prop(cloth, "min_distance", slider=True, text="Distance")
+ col.prop(cloth, "distance_min", slider=True, text="Distance")
col.prop(cloth, "friction")
- if wide_ui:
- col = split.column()
- col.prop(cloth, "enable_self_collision", text="Self Collision")
+ col = split.column()
+ col.prop(cloth, "use_self_collision", text="Self Collision")
sub = col.column()
- sub.active = cloth.enable_self_collision
+ sub.active = cloth.use_self_collision
sub.prop(cloth, "self_collision_quality", slider=True, text="Quality")
- sub.prop(cloth, "self_min_distance", slider=True, text="Distance")
+ sub.prop(cloth, "self_distance_min", slider=True, text="Distance")
layout.prop(cloth, "group")
-class PHYSICS_PT_cloth_stiffness(PhysicButtonsPanel):
+class PHYSICS_PT_cloth_stiffness(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Cloth Stiffness Scaling"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.cloth
def draw_header(self, context):
cloth = context.cloth.settings
self.layout.active = cloth_panel_enabled(context.cloth)
- self.layout.prop(cloth, "stiffness_scaling", text="")
+ self.layout.prop(cloth, "use_stiffness_scale", text="")
def draw(self, context):
layout = self.layout
@@ -207,29 +201,28 @@ class PHYSICS_PT_cloth_stiffness(PhysicButtonsPanel):
md = context.cloth
ob = context.object
cloth = context.cloth.settings
- wide_ui = context.region.width > narrowui
- layout.active = cloth.stiffness_scaling and cloth_panel_enabled(md)
+ layout.active = cloth.use_stiffness_scale and cloth_panel_enabled(md)
split = layout.split()
col = split.column()
col.label(text="Structural Stiffness:")
- col.prop_object(cloth, "structural_stiffness_vertex_group", ob, "vertex_groups", text="")
+ col.prop_search(cloth, "structural_stiffness_vertex_group", ob, "vertex_groups", text="")
col.prop(cloth, "structural_stiffness_max", text="Max")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Bending Stiffness:")
- col.prop_object(cloth, "bending_vertex_group", ob, "vertex_groups", text="")
+ col.prop_search(cloth, "bending_vertex_group", ob, "vertex_groups", text="")
col.prop(cloth, "bending_stiffness_max", text="Max")
-class PHYSICS_PT_cloth_field_weights(PhysicButtonsPanel):
+class PHYSICS_PT_cloth_field_weights(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Cloth Field Weights"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return (context.cloth)
def draw(self, context):
@@ -237,26 +230,12 @@ class PHYSICS_PT_cloth_field_weights(PhysicButtonsPanel):
effector_weights_ui(self, context, cloth.effector_weights)
-classes = [
- CLOTH_MT_presets,
-
- PHYSICS_PT_cloth,
- PHYSICS_PT_cloth_cache,
- PHYSICS_PT_cloth_collision,
- PHYSICS_PT_cloth_stiffness,
- PHYSICS_PT_cloth_field_weights]
-
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_physics_common.py b/release/scripts/ui/properties_physics_common.py
index 372509773ef..c4692635ee7 100644
--- a/release/scripts/ui/properties_physics_common.py
+++ b/release/scripts/ui/properties_physics_common.py
@@ -18,82 +18,95 @@
# <pep8 compliant>
-narrowui = 180
+import bpy
+#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)
+ row.template_list(cache, "point_caches", cache.point_caches, "active_index", rows=2)
col = row.column(align=True)
col.operator("ptcache.add", icon='ZOOMIN', text="")
col.operator("ptcache.remove", icon='ZOOMOUT', text="")
row = layout.row()
- row.label(text="File Name:")
- if particles:
- row.prop(cache, "external")
+ if cachetype in ('PSYS', 'HAIR', 'SMOKE'):
+ row.prop(cache, "use_external")
- if cache.external:
+ if cache.use_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, "frame_start")
- row.prop(cache, "frame_end")
-
- row = layout.row()
+ split = layout.split()
+ col = split.column(align=True)
- if cache.baked == True:
- row.operator("ptcache.free_bake", text="Free Bake")
- else:
- row.operator("ptcache.bake", text="Bake").bake = True
+ if cachetype != 'PSYS':
+ col.enabled = enabled
+ col.prop(cache, "frame_start")
+ col.prop(cache, "frame_end")
+ if cachetype != 'SMOKE':
+ col.prop(cache, "frame_step")
- sub = row.row()
- sub.enabled = (cache.frames_skipped or cache.outdated) and enabled
- sub.operator("ptcache.bake", text="Calculate to Current Frame").bake = False
+ col = split.column()
- 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")
+ sub.prop(cache, "use_quick_cache")
- layout.label(text=cache.info)
+ sub = col.column()
+ sub.enabled = (not bpy.data.is_dirty)
+ sub.prop(cache, "use_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", text="Update All Dynamics to current frame").bake = False
+ split = layout.split()
+
+ col = split.column()
+
+ if cache.is_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.is_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")
+
+
+ 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):
layout = self.layout
- wide_ui = context.region.width > narrowui
layout.prop(weights, "group")
@@ -102,8 +115,7 @@ def effector_weights_ui(self, context, weights):
col = split.column()
col.prop(weights, "gravity", slider=True)
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(weights, "all", slider=True)
layout.separator()
@@ -115,11 +127,10 @@ def effector_weights_ui(self, context, weights):
col.prop(weights, "vortex", slider=True)
col.prop(weights, "magnetic", slider=True)
col.prop(weights, "wind", slider=True)
- col.prop(weights, "curveguide", slider=True)
+ col.prop(weights, "curve_guide", slider=True)
col.prop(weights, "texture", slider=True)
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(weights, "harmonic", slider=True)
col.prop(weights, "charge", slider=True)
col.prop(weights, "lennardjones", slider=True)
@@ -131,7 +142,6 @@ def effector_weights_ui(self, context, weights):
def basic_force_field_settings_ui(self, context, field):
layout = self.layout
- wide_ui = context.region.width > narrowui
split = layout.split()
@@ -158,37 +168,32 @@ def basic_force_field_settings_ui(self, context, field):
else:
col.prop(field, "flow")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(field, "noise")
col.prop(field, "seed")
if field.type == 'TURBULENCE':
- col.prop(field, "global_coordinates", text="Global")
+ col.prop(field, "use_global_coords", text="Global")
elif field.type == 'HARMONIC':
- col.prop(field, "multiple_springs")
+ col.prop(field, "use_multiple_springs")
split = layout.split()
col = split.column()
col.label(text="Effect point:")
- col.prop(field, "do_location")
- col.prop(field, "do_rotation")
+ col.prop(field, "apply_to_location")
+ col.prop(field, "apply_to_rotation")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Collision:")
- col.prop(field, "do_absorption")
+ col.prop(field, "use_absorption")
def basic_force_field_falloff_ui(self, context, field):
layout = self.layout
- wide_ui = context.region.width > narrowui
# XXX: This doesn't update for some reason.
- #if wide_ui:
- # split = layout.split()
- #else:
+ #split = layout.split()
split = layout.split(percentage=0.35)
if not field or field.type == 'NONE':
@@ -199,17 +204,16 @@ def basic_force_field_falloff_ui(self, context, field):
col.prop(field, "use_min_distance", text="Use Minimum")
col.prop(field, "use_max_distance", text="Use Maximum")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(field, "falloff_power", text="Power")
sub = col.column()
sub.active = field.use_min_distance
- sub.prop(field, "minimum_distance", text="Distance")
+ sub.prop(field, "distance_min", text="Distance")
sub = col.column()
sub.active = field.use_max_distance
- sub.prop(field, "maximum_distance", text="Distance")
+ sub.prop(field, "distance_max", text="Distance")
def register():
diff --git a/release/scripts/ui/properties_physics_field.py b/release/scripts/ui/properties_physics_field.py
index e0be01d4c1c..07d748e8c28 100644
--- a/release/scripts/ui/properties_physics_field.py
+++ b/release/scripts/ui/properties_physics_field.py
@@ -19,24 +19,23 @@
# <pep8 compliant>
import bpy
-narrowui = 180
-
from properties_physics_common import basic_force_field_settings_ui
from properties_physics_common import basic_force_field_falloff_ui
-class PhysicButtonsPanel(bpy.types.Panel):
+class PhysicButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "physics"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
rd = context.scene.render
return (context.object) and (not rd.use_game_engine)
-class PHYSICS_PT_field(PhysicButtonsPanel):
+class PHYSICS_PT_field(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Force Fields"
def draw(self, context):
@@ -44,22 +43,15 @@ class PHYSICS_PT_field(PhysicButtonsPanel):
ob = context.object
field = ob.field
- wide_ui = context.region.width > narrowui
- if wide_ui:
- split = layout.split(percentage=0.2)
- split.label(text="Type:")
- else:
- split = layout.split()
+ split = layout.split(percentage=0.2)
+ split.label(text="Type:")
split.prop(field, "type", text="")
if field.type not in ('NONE', 'GUIDE', 'TEXTURE'):
- if wide_ui:
- split = layout.split(percentage=0.2)
- split.label(text="Shape:")
- else:
- split = layout.split()
+ split = layout.split(percentage=0.2)
+ split.label(text="Shape:")
split.prop(field, "shape", text="")
split = layout.split()
@@ -71,10 +63,10 @@ class PHYSICS_PT_field(PhysicButtonsPanel):
col.prop(field, "guide_minimum")
col.prop(field, "guide_free")
col.prop(field, "falloff_power")
- col.prop(field, "guide_path_add")
+ col.prop(field, "use_guide_path_add")
+ col.prop(field, "use_guide_path_weight")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Clumping:")
col.prop(field, "guide_clump_amount")
col.prop(field, "guide_clump_shape")
@@ -83,7 +75,7 @@ class PHYSICS_PT_field(PhysicButtonsPanel):
row.prop(field, "use_max_distance")
sub = row.row()
sub.active = field.use_max_distance
- sub.prop(field, "maximum_distance")
+ sub.prop(field, "distance_max")
layout.separator()
@@ -97,8 +89,7 @@ class PHYSICS_PT_field(PhysicButtonsPanel):
col.prop(field, "guide_kink_frequency")
col.prop(field, "guide_kink_shape")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(field, "guide_kink_amplitude")
elif field.type == 'TEXTURE':
@@ -108,11 +99,10 @@ class PHYSICS_PT_field(PhysicButtonsPanel):
col.prop(field, "texture_mode", text="")
col.prop(field, "texture_nabla")
- if wide_ui:
- col = split.column()
- col.prop(field, "use_coordinates")
- col.prop(field, "root_coordinates")
- col.prop(field, "force_2d")
+ col = split.column()
+ col.prop(field, "use_object_coords")
+ col.prop(field, "use_root_coords")
+ col.prop(field, "use_2d_force")
else:
basic_force_field_settings_ui(self, context, field)
@@ -133,17 +123,16 @@ class PHYSICS_PT_field(PhysicButtonsPanel):
col.prop(field, "use_radial_min", text="Use Minimum")
col.prop(field, "use_radial_max", text="Use Maximum")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(field, "radial_falloff", text="Power")
sub = col.column()
sub.active = field.use_radial_min
- sub.prop(field, "radial_minimum", text="Angle")
+ sub.prop(field, "radial_min", text="Angle")
sub = col.column()
sub.active = field.use_radial_max
- sub.prop(field, "radial_maximum", text="Angle")
+ sub.prop(field, "radial_max", text="Angle")
elif field.falloff_type == 'TUBE':
layout.separator()
@@ -155,24 +144,24 @@ class PHYSICS_PT_field(PhysicButtonsPanel):
col.prop(field, "use_radial_min", text="Use Minimum")
col.prop(field, "use_radial_max", text="Use Maximum")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(field, "radial_falloff", text="Power")
sub = col.column()
sub.active = field.use_radial_min
- sub.prop(field, "radial_minimum", text="Distance")
+ sub.prop(field, "radial_min", text="Distance")
sub = col.column()
sub.active = field.use_radial_max
- sub.prop(field, "radial_maximum", text="Distance")
+ sub.prop(field, "radial_max", text="Distance")
-class PHYSICS_PT_collision(PhysicButtonsPanel):
+class PHYSICS_PT_collision(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Collision"
- #bl_default_closed = True
+ #bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
ob = context.object
rd = context.scene.render
return (ob and ob.type == 'MESH') and (not rd.use_game_engine)
@@ -181,36 +170,32 @@ class PHYSICS_PT_collision(PhysicButtonsPanel):
layout = self.layout
md = context.collision
- wide_ui = context.region.width > narrowui
split = layout.split()
- split.operator_context = 'EXEC_DEFAULT'
if md:
# remove modifier + settings
split.set_context_pointer("modifier", md)
split.operator("object.modifier_remove", text="Remove")
- if wide_ui:
- col = split.column()
+ col = split.column()
#row = split.row(align=True)
- #row.prop(md, "render", text="")
- #row.prop(md, "realtime", text="")
+ #row.prop(md, "show_render", text="")
+ #row.prop(md, "show_viewport", text="")
coll = md.settings
else:
# add modifier
split.operator("object.modifier_add", text="Add").type = 'COLLISION'
- if wide_ui:
- split.label()
+ split.label()
coll = None
if coll:
settings = context.object.collision
- layout.active = settings.enabled
+ layout.active = settings.use
split = layout.split()
@@ -218,23 +203,22 @@ class PHYSICS_PT_collision(PhysicButtonsPanel):
col.label(text="Particle:")
col.prop(settings, "permeability", slider=True)
col.prop(settings, "stickness")
- col.prop(settings, "kill_particles")
+ col.prop(settings, "use_particle_kill")
col.label(text="Particle Damping:")
sub = col.column(align=True)
sub.prop(settings, "damping_factor", text="Factor", slider=True)
- sub.prop(settings, "random_damping", text="Random", slider=True)
+ sub.prop(settings, "damping_random", text="Random", slider=True)
col.label(text="Particle Friction:")
sub = col.column(align=True)
sub.prop(settings, "friction_factor", text="Factor", slider=True)
- sub.prop(settings, "random_friction", text="Random", slider=True)
+ sub.prop(settings, "friction_random", text="Random", slider=True)
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Soft Body and Cloth:")
sub = col.column(align=True)
- sub.prop(settings, "outer_thickness", text="Outer", slider=True)
- sub.prop(settings, "inner_thickness", text="Inner", slider=True)
+ sub.prop(settings, "thickness_outer", text="Outer", slider=True)
+ sub.prop(settings, "thickness_inner", text="Inner", slider=True)
col.label(text="Soft Body Damping:")
col.prop(settings, "damping", text="Factor", slider=True)
@@ -243,21 +227,12 @@ class PHYSICS_PT_collision(PhysicButtonsPanel):
col.prop(settings, "absorption", text="Absorption")
-classes = [
- PHYSICS_PT_field,
- PHYSICS_PT_collision]
-
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_physics_fluid.py b/release/scripts/ui/properties_physics_fluid.py
index c033b6b6870..9973141653b 100644
--- a/release/scripts/ui/properties_physics_fluid.py
+++ b/release/scripts/ui/properties_physics_fluid.py
@@ -19,31 +19,28 @@
# <pep8 compliant>
import bpy
-narrowui = 180
-
-class PhysicButtonsPanel(bpy.types.Panel):
+class PhysicButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "physics"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
ob = context.object
rd = context.scene.render
return (ob and ob.type == 'MESH') and (not rd.use_game_engine)
-class PHYSICS_PT_fluid(PhysicButtonsPanel):
+class PHYSICS_PT_fluid(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Fluid"
def draw(self, context):
layout = self.layout
md = context.fluid
- wide_ui = context.region.width > narrowui
- split = layout.split(percentage=0.5)
- split.operator_context = 'EXEC_DEFAULT'
+ split = layout.split()
if md:
# remove modifier + settings
@@ -51,34 +48,28 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel):
split.operator("object.modifier_remove", text="Remove")
row = split.row(align=True)
- row.prop(md, "render", text="")
- row.prop(md, "realtime", text="")
+ row.prop(md, "show_render", text="")
+ row.prop(md, "show_viewport", text="")
fluid = md.settings
else:
# add modifier
split.operator("object.modifier_add", text="Add").type = 'FLUID_SIMULATION'
- if wide_ui:
- split.label()
+ split.label()
fluid = None
if fluid:
- if wide_ui:
- 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="")
+ row = layout.row()
+ row.prop(fluid, "type")
+ if fluid.type not in ('NONE', 'DOMAIN', 'PARTICLE'):
+ row.prop(fluid, "use", text="")
layout = layout.column()
if fluid.type not in ('NONE', 'DOMAIN', 'PARTICLE'):
- layout.active = fluid.active
+ layout.active = fluid.use
if fluid.type == 'DOMAIN':
layout.operator("fluid.bake", text="Bake Fluid Simulation", icon='MOD_FLUIDSIM')
@@ -90,8 +81,7 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel):
col.label(text="Render Display:")
col.prop(fluid, "render_display_mode", text="")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Required Memory: " + fluid.memory_estimate)
col.prop(fluid, "preview_resolution", text="Preview")
col.label(text="Viewport Display:")
@@ -105,13 +95,12 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel):
sub.prop(fluid, "start_time", text="Start")
sub.prop(fluid, "end_time", text="End")
- if wide_ui:
- col = split.column()
- col.label()
- col.prop(fluid, "generate_speed_vectors")
- col.prop(fluid, "reverse_frames")
+ col = split.column()
+ col.label()
+ col.prop(fluid, "use_speed_vectors")
+ col.prop(fluid, "use_reverse_frames")
- layout.prop(fluid, "path", text="")
+ layout.prop(fluid, "filepath", text="")
elif fluid.type == 'FLUID':
split = layout.split()
@@ -119,10 +108,9 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel):
col = split.column()
col.label(text="Volume Initialization:")
col.prop(fluid, "volume_initialization", text="")
- col.prop(fluid, "export_animated_mesh")
+ col.prop(fluid, "use_animated_mesh")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Initial Velocity:")
col.prop(fluid, "initial_velocity", text="")
@@ -132,10 +120,9 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel):
col = split.column()
col.label(text="Volume Initialization:")
col.prop(fluid, "volume_initialization", text="")
- col.prop(fluid, "export_animated_mesh")
+ col.prop(fluid, "use_animated_mesh")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Slip Type:")
col.prop(fluid, "slip_type", text="")
if fluid.slip_type == 'PARTIALSLIP':
@@ -150,11 +137,10 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel):
col = split.column()
col.label(text="Volume Initialization:")
col.prop(fluid, "volume_initialization", text="")
- col.prop(fluid, "export_animated_mesh")
- col.prop(fluid, "local_coordinates")
+ col.prop(fluid, "use_animated_mesh")
+ col.prop(fluid, "use_local_coords")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Inflow Velocity:")
col.prop(fluid, "inflow_velocity", text="")
@@ -164,10 +150,9 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel):
col = split.column()
col.label(text="Volume Initialization:")
col.prop(fluid, "volume_initialization", text="")
- col.prop(fluid, "export_animated_mesh")
+ col.prop(fluid, "use_animated_mesh")
- if wide_ui:
- split.column()
+ split.column()
elif fluid.type == 'PARTICLE':
split = layout.split()
@@ -177,14 +162,13 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel):
col.prop(fluid, "particle_influence", text="Size")
col.prop(fluid, "alpha_influence", text="Alpha")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Type:")
- col.prop(fluid, "drops")
- col.prop(fluid, "floats")
- col.prop(fluid, "tracer")
+ col.prop(fluid, "use_drops")
+ col.prop(fluid, "use_floats")
+ col.prop(fluid, "show_tracer")
- layout.prop(fluid, "path", text="")
+ layout.prop(fluid, "filepath", text="")
elif fluid.type == 'CONTROL':
split = layout.split()
@@ -192,10 +176,9 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel):
col = split.column()
col.label(text="")
col.prop(fluid, "quality", slider=True)
- col.prop(fluid, "reverse_frames")
+ col.prop(fluid, "use_reverse_frames")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Time:")
sub = col.column(align=True)
sub.prop(fluid, "start_time", text="Start")
@@ -209,28 +192,27 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel):
sub.prop(fluid, "attraction_strength", text="Strength")
sub.prop(fluid, "attraction_radius", text="Radius")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Velocity Force:")
sub = col.column(align=True)
sub.prop(fluid, "velocity_strength", text="Strength")
sub.prop(fluid, "velocity_radius", text="Radius")
-class PHYSICS_PT_domain_gravity(PhysicButtonsPanel):
+class PHYSICS_PT_domain_gravity(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Domain World"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
md = context.fluid
- return md and (md.settings.type == 'DOMAIN')
+ return md and md.settings and (md.settings.type == 'DOMAIN')
def draw(self, context):
layout = self.layout
fluid = context.fluid.settings
scene = context.scene
- wide_ui = context.region.width > narrowui
split = layout.split()
@@ -248,13 +230,12 @@ class PHYSICS_PT_domain_gravity(PhysicButtonsPanel):
col.label(text="Using Scene Size Units", icon="SCENE_DATA")
sub = col.column()
sub.enabled = False
- sub.prop(fluid, "real_world_size", text="Metres")
+ sub.prop(fluid, "simulation_scale", text="Metres")
else:
col.label(text="Real World Size:")
- col.prop(fluid, "real_world_size", text="Metres")
+ col.prop(fluid, "simulation_scale", text="Metres")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Viscosity Presets:")
sub = col.column(align=True)
sub.prop(fluid, "viscosity_preset", text="")
@@ -268,19 +249,19 @@ class PHYSICS_PT_domain_gravity(PhysicButtonsPanel):
col.prop(fluid, "compressibility", slider=True)
-class PHYSICS_PT_domain_boundary(PhysicButtonsPanel):
+class PHYSICS_PT_domain_boundary(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Domain Boundary"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
md = context.fluid
- return md and (md.settings.type == 'DOMAIN')
+ return md and md.settings and (md.settings.type == 'DOMAIN')
def draw(self, context):
layout = self.layout
fluid = context.fluid.settings
- wide_ui = context.region.width > narrowui
split = layout.split()
@@ -290,20 +271,20 @@ class PHYSICS_PT_domain_boundary(PhysicButtonsPanel):
if fluid.slip_type == 'PARTIALSLIP':
col.prop(fluid, "partial_slip_factor", slider=True, text="Amount")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Surface:")
- col.prop(fluid, "surface_smoothing", text="Smoothing")
+ col.prop(fluid, "surface_smooth", text="Smoothing")
col.prop(fluid, "surface_subdivisions", text="Subdivisions")
-class PHYSICS_PT_domain_particles(PhysicButtonsPanel):
+class PHYSICS_PT_domain_particles(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Domain Particles"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
md = context.fluid
- return md and (md.settings.type == 'DOMAIN')
+ return md and md.settings and (md.settings.type == 'DOMAIN')
def draw(self, context):
layout = self.layout
@@ -315,23 +296,12 @@ class PHYSICS_PT_domain_particles(PhysicButtonsPanel):
col.prop(fluid, "generate_particles")
-classes = [
- PHYSICS_PT_fluid,
- PHYSICS_PT_domain_gravity,
- PHYSICS_PT_domain_boundary,
- PHYSICS_PT_domain_particles]
-
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_physics_smoke.py b/release/scripts/ui/properties_physics_smoke.py
index 1f91b761e1a..cf91705318e 100644
--- a/release/scripts/ui/properties_physics_smoke.py
+++ b/release/scripts/ui/properties_physics_smoke.py
@@ -19,25 +19,24 @@
# <pep8 compliant>
import bpy
-narrowui = 180
-
from properties_physics_common import point_cache_ui
from properties_physics_common import effector_weights_ui
-class PhysicButtonsPanel(bpy.types.Panel):
+class PhysicButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "physics"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
ob = context.object
rd = context.scene.render
return (ob and ob.type == 'MESH') and (not rd.use_game_engine)
-class PHYSICS_PT_smoke(PhysicButtonsPanel):
+class PHYSICS_PT_smoke(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Smoke"
def draw(self, context):
@@ -45,10 +44,8 @@ class PHYSICS_PT_smoke(PhysicButtonsPanel):
md = context.smoke
ob = context.object
- wide_ui = context.region.width > narrowui
split = layout.split()
- split.operator_context = 'EXEC_DEFAULT'
if md:
# remove modifier + settings
@@ -56,82 +53,85 @@ class PHYSICS_PT_smoke(PhysicButtonsPanel):
split.operator("object.modifier_remove", text="Remove")
row = split.row(align=True)
- row.prop(md, "render", text="")
- row.prop(md, "realtime", text="")
+ row.prop(md, "show_render", text="")
+ row.prop(md, "show_viewport", text="")
else:
# add modifier
split.operator("object.modifier_add", text="Add").type = 'SMOKE'
- if wide_ui:
- split.label()
+ split.label()
if md:
- if wide_ui:
- layout.prop(md, "smoke_type", expand=True)
- else:
- layout.prop(md, "smoke_type", text="")
-
- if md.smoke_type == 'TYPE_DOMAIN':
+ layout.prop(md, "smoke_type", expand=True)
+ if md.smoke_type == 'DOMAIN':
domain = md.domain_settings
split = layout.split()
col = split.column()
col.label(text="Resolution:")
- col.prop(domain, "maxres", text="Divisions")
- col.label(text="Particle:")
- col.prop(domain, "initial_velocity", text="Initial Velocity")
+ col.prop(domain, "resolution_max", text="Divisions")
+ col.label(text="Time:")
+ col.prop(domain, "time_scale", text="Scale")
+ col.label(text="Border Collisions:")
+ col.prop(domain, "collision_extents", text="")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Behavior:")
col.prop(domain, "alpha")
col.prop(domain, "beta")
- col.prop(domain, "dissolve_smoke", text="Dissolve")
+ col.prop(domain, "vorticity")
+ col.prop(domain, "use_dissolve_smoke", text="Dissolve")
sub = col.column()
- sub.active = domain.dissolve_smoke
+ sub.active = domain.use_dissolve_smoke
sub.prop(domain, "dissolve_speed", text="Time")
- sub.prop(domain, "dissolve_smoke_log", text="Slow")
-
- elif md.smoke_type == 'TYPE_FLOW':
+ sub.prop(domain, "use_dissolve_smoke_log", text="Slow")
+ elif md.smoke_type == 'FLOW':
+
flow = md.flow_settings
split = layout.split()
col = split.column()
- col.prop(flow, "outflow")
+ col.prop(flow, "use_outflow")
col.label(text="Particle System:")
- col.prop_object(flow, "psys", ob, "particle_systems", text="")
-
- if md.flow_settings.outflow:
- if wide_ui:
- col = split.column()
- else:
- if wide_ui:
- col = split.column()
- col.label(text="Behavior:")
- col.prop(flow, "temperature")
- col.prop(flow, "density")
-
- #elif md.smoke_type == 'TYPE_COLL':
+ col.prop_search(flow, "particle_system", ob, "particle_systems", text="")
+
+ sub = col.column()
+ sub.active = not md.flow_settings.use_outflow
+
+ sub.prop(flow, "initial_velocity", text="Initial Velocity")
+ sub = sub.column()
+ sub.active = flow.initial_velocity
+ sub.prop(flow, "velocity_factor", text="Multiplier")
+
+
+ sub = split.column()
+ sub.active = not md.flow_settings.use_outflow
+ sub.label(text="Behavior:")
+ sub.prop(flow, "temperature")
+ sub.prop(flow, "density")
+ sub.prop(flow, "use_absolute")
+
+ #elif md.smoke_type == 'COLLISION':
# layout.separator()
-class PHYSICS_PT_smoke_groups(PhysicButtonsPanel):
+class PHYSICS_PT_smoke_groups(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Smoke Groups"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, 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
group = context.smoke.domain_settings
- wide_ui = context.region.width > narrowui
split = layout.split()
@@ -140,124 +140,110 @@ class PHYSICS_PT_smoke_groups(PhysicButtonsPanel):
col.prop(group, "fluid_group", text="")
#col.label(text="Effector Group:")
- #col.prop(group, "eff_group", text="")
+ #col.prop(group, "effector_group", text="")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Collision Group:")
- col.prop(group, "coll_group", text="")
+ col.prop(group, "collision_group", text="")
-class PHYSICS_PT_smoke_cache(PhysicButtonsPanel):
+class PHYSICS_PT_smoke_cache(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Smoke Cache"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, 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, "point_cache_compress_type", expand=True)
+
+ point_cache_ui(self, context, cache, (cache.is_baked is False), 'SMOKE')
-class PHYSICS_PT_smoke_highres(PhysicButtonsPanel):
+class PHYSICS_PT_smoke_highres(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Smoke High Resolution"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, 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, "use_high_resolution", text="")
def draw(self, context):
layout = self.layout
md = context.smoke.domain_settings
- wide_ui = context.region.width > narrowui
+
+ layout.active = md.use_high_resolution
split = layout.split()
col = split.column()
col.label(text="Resolution:")
col.prop(md, "amplify", text="Divisions")
- col.prop(md, "viewhighres")
+ col.prop(md, "smooth_emitter")
+ col.prop(md, "show_high_resolution")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Noise Method:")
col.row().prop(md, "noise_type", text="")
col.prop(md, "strength")
-class PHYSICS_PT_smoke_cache_highres(PhysicButtonsPanel):
+class PHYSICS_PT_smoke_cache_highres(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Smoke High Resolution Cache"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, 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.use_high_resolution
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, "point_cache_compress_high_type", expand=True)
+ point_cache_ui(self, context, cache, (cache.is_baked is False), 'SMOKE')
-class PHYSICS_PT_smoke_field_weights(PhysicButtonsPanel):
+
+class PHYSICS_PT_smoke_field_weights(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Smoke Field Weights"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, 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
effector_weights_ui(self, context, domain.effector_weights)
-classes = [
- PHYSICS_PT_smoke,
- PHYSICS_PT_smoke_field_weights,
- PHYSICS_PT_smoke_cache,
- PHYSICS_PT_smoke_highres,
- PHYSICS_PT_smoke_groups,
- PHYSICS_PT_smoke_cache_highres]
-
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_physics_softbody.py b/release/scripts/ui/properties_physics_softbody.py
index a582bfa520b..2411f460f4b 100644
--- a/release/scripts/ui/properties_physics_softbody.py
+++ b/release/scripts/ui/properties_physics_softbody.py
@@ -19,23 +19,22 @@
# <pep8 compliant>
import bpy
-narrowui = 180
-
from properties_physics_common import point_cache_ui
from properties_physics_common import effector_weights_ui
def softbody_panel_enabled(md):
- return (md.point_cache.baked is False)
+ return (md.point_cache.is_baked is False)
-class PhysicButtonsPanel(bpy.types.Panel):
+class PhysicButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "physics"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
ob = context.object
rd = context.scene.render
# return (ob and ob.type == 'MESH') and (not rd.use_game_engine)
@@ -43,7 +42,7 @@ class PhysicButtonsPanel(bpy.types.Panel):
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):
+class PHYSICS_PT_softbody(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Soft Body"
def draw(self, context):
@@ -51,10 +50,8 @@ class PHYSICS_PT_softbody(PhysicButtonsPanel):
md = context.soft_body
ob = context.object
- wide_ui = context.region.width > narrowui
split = layout.split()
- split.operator_context = 'EXEC_DEFAULT'
if md:
# remove modifier + settings
@@ -62,13 +59,12 @@ class PHYSICS_PT_softbody(PhysicButtonsPanel):
split.operator("object.modifier_remove", text="Remove")
row = split.row(align=True)
- row.prop(md, "render", text="")
- row.prop(md, "realtime", text="")
+ row.prop(md, "show_render", text="")
+ row.prop(md, "show_viewport", text="")
else:
# add modifier
split.operator("object.modifier_add", text="Add").type = 'SOFT_BODY'
- if wide_ui:
- split.column()
+ split.column()
if md:
softbody = md.settings
@@ -81,31 +77,32 @@ class PHYSICS_PT_softbody(PhysicButtonsPanel):
col.label(text="Object:")
col.prop(softbody, "friction")
col.prop(softbody, "mass")
- col.prop_object(softbody, "mass_vertex_group", ob, "vertex_groups", text="Mass:")
+ col.prop_search(softbody, "mass_vertex_group", ob, "vertex_groups", text="Mass:")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Simulation:")
col.prop(softbody, "speed")
-class PHYSICS_PT_softbody_cache(PhysicButtonsPanel):
+class PHYSICS_PT_softbody_cache(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Soft Body Cache"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.soft_body
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):
+class PHYSICS_PT_softbody_goal(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Soft Body Goal"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.soft_body
def draw_header(self, context):
@@ -120,7 +117,6 @@ class PHYSICS_PT_softbody_goal(PhysicButtonsPanel):
md = context.soft_body
softbody = md.settings
ob = context.object
- wide_ui = context.region.width > narrowui
layout.active = softbody.use_goal and softbody_panel_enabled(md)
@@ -136,20 +132,20 @@ class PHYSICS_PT_softbody_goal(PhysicButtonsPanel):
sub.prop(softbody, "goal_min", text="Minimum")
sub.prop(softbody, "goal_max", text="Maximum")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Goal Settings:")
col.prop(softbody, "goal_spring", text="Stiffness")
col.prop(softbody, "goal_friction", text="Damping")
- layout.prop_object(softbody, "goal_vertex_group", ob, "vertex_groups", text="Vertex Group")
+ layout.prop_search(softbody, "goal_vertex_group", ob, "vertex_groups", text="Vertex Group")
-class PHYSICS_PT_softbody_edge(PhysicButtonsPanel):
+class PHYSICS_PT_softbody_edge(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Soft Body Edges"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.soft_body
def draw_header(self, context):
@@ -164,7 +160,6 @@ class PHYSICS_PT_softbody_edge(PhysicButtonsPanel):
md = context.soft_body
softbody = md.settings
ob = context.object
- wide_ui = context.region.width > narrowui
layout.active = softbody.use_edges and softbody_panel_enabled(md)
@@ -174,56 +169,55 @@ class PHYSICS_PT_softbody_edge(PhysicButtonsPanel):
col.label(text="Springs:")
col.prop(softbody, "pull")
col.prop(softbody, "push")
- col.prop(softbody, "damp")
+ col.prop(softbody, "damping")
col.prop(softbody, "plastic")
- col.prop(softbody, "bending")
+ col.prop(softbody, "bend")
col.prop(softbody, "spring_length", text="Length")
- col.prop_object(softbody, "spring_vertex_group", ob, "vertex_groups", text="Springs:")
+ col.prop_search(softbody, "spring_vertex_group", ob, "vertex_groups", text="Springs:")
- if wide_ui:
- col = split.column()
- col.prop(softbody, "stiff_quads")
+ col = split.column()
+ col.prop(softbody, "use_stiff_quads")
sub = col.column()
- sub.active = softbody.stiff_quads
+ sub.active = softbody.use_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")
- col.prop(softbody, "face_collision", text="Face")
+ col.prop(softbody, "use_edge_collision", text="Edge")
+ col.prop(softbody, "use_face_collision", text="Face")
-class PHYSICS_PT_softbody_collision(PhysicButtonsPanel):
- bl_label = "Soft Body Collision"
- bl_default_closed = True
+class PHYSICS_PT_softbody_collision(PhysicButtonsPanel, bpy.types.Panel):
+ bl_label = "Soft Body Self Collision"
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.soft_body
def draw_header(self, context):
softbody = context.soft_body.settings
self.layout.active = softbody_panel_enabled(context.soft_body)
- self.layout.prop(softbody, "self_collision", text="")
+ self.layout.prop(softbody, "use_self_collision", text="")
def draw(self, context):
layout = self.layout
md = context.soft_body
softbody = md.settings
- wide_ui = context.region.width > narrowui
- layout.active = softbody.self_collision and softbody_panel_enabled(md)
+ layout.active = softbody.use_self_collision and softbody_panel_enabled(md)
- layout.label(text="Collision Type:")
- if wide_ui:
- layout.prop(softbody, "collision_type", expand=True)
- else:
- layout.prop(softbody, "collision_type", text="")
+ layout.label(text="Collision Ball Size Calculation:")
+ layout.prop(softbody, "collision_type", expand=True)
col = layout.column(align=True)
col.label(text="Ball:")
@@ -232,11 +226,12 @@ class PHYSICS_PT_softbody_collision(PhysicButtonsPanel):
col.prop(softbody, "ball_damp", text="Dampening")
-class PHYSICS_PT_softbody_solver(PhysicButtonsPanel):
+class PHYSICS_PT_softbody_solver(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Soft Body Solver"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.soft_body
def draw(self, context):
@@ -244,7 +239,6 @@ class PHYSICS_PT_softbody_solver(PhysicButtonsPanel):
md = context.soft_body
softbody = md.settings
- wide_ui = context.region.width > narrowui
layout.active = softbody_panel_enabled(md)
@@ -253,27 +247,27 @@ class PHYSICS_PT_softbody_solver(PhysicButtonsPanel):
col = split.column(align=True)
col.label(text="Step Size:")
- col.prop(softbody, "minstep")
- col.prop(softbody, "maxstep")
- col.prop(softbody, "auto_step", text="Auto-Step")
+ col.prop(softbody, "step_min")
+ col.prop(softbody, "step_max")
+ col.prop(softbody, "use_auto_step", text="Auto-Step")
- if wide_ui:
- col = split.column()
- col.prop(softbody, "error_limit")
+ col = split.column()
+ col.prop(softbody, "error_threshold")
col.label(text="Helpers:")
col.prop(softbody, "choke")
col.prop(softbody, "fuzzy")
layout.label(text="Diagnostics:")
- layout.prop(softbody, "diagnose")
- layout.prop(softbody, "estimate_matrix")
+ layout.prop(softbody, "use_diagnose")
+ layout.prop(softbody, "use_estimate_matrix")
-class PHYSICS_PT_softbody_field_weights(PhysicButtonsPanel):
+class PHYSICS_PT_softbody_field_weights(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Soft Body Field Weights"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return (context.soft_body)
def draw(self, context):
@@ -283,26 +277,12 @@ class PHYSICS_PT_softbody_field_weights(PhysicButtonsPanel):
effector_weights_ui(self, context, softbody.effector_weights)
-classes = [
- PHYSICS_PT_softbody,
- PHYSICS_PT_softbody_cache,
- PHYSICS_PT_softbody_goal,
- PHYSICS_PT_softbody_edge,
- PHYSICS_PT_softbody_collision,
- PHYSICS_PT_softbody_solver,
- PHYSICS_PT_softbody_field_weights]
-
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_render.py b/release/scripts/ui/properties_render.py
index 2d20a948278..aef95056391 100644
--- a/release/scripts/ui/properties_render.py
+++ b/release/scripts/ui/properties_render.py
@@ -19,13 +19,11 @@
# <pep8 compliant>
import bpy
-narrowui = 180
-
class RENDER_MT_presets(bpy.types.Menu):
bl_label = "Render Presets"
preset_subdir = "render"
- preset_operator = "script.python_file_run"
+ preset_operator = "script.execute_preset"
draw = bpy.types.Menu.draw_preset
@@ -36,18 +34,19 @@ class RENDER_MT_ffmpeg_presets(bpy.types.Menu):
draw = bpy.types.Menu.draw_preset
-class RenderButtonsPanel(bpy.types.Panel):
+class RenderButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "render"
# COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
rd = context.scene.render
- return (context.scene and rd.use_game_engine is False) and (rd.engine in self.COMPAT_ENGINES)
+ return (context.scene and rd.use_game_engine is False) and (rd.engine in cls.COMPAT_ENGINES)
-class RENDER_PT_render(RenderButtonsPanel):
+class RENDER_PT_render(RenderButtonsPanel, bpy.types.Panel):
bl_label = "Render"
COMPAT_ENGINES = {'BLENDER_RENDER'}
@@ -55,23 +54,21 @@ class RENDER_PT_render(RenderButtonsPanel):
layout = self.layout
rd = context.scene.render
- wide_ui = context.region.width > narrowui
split = layout.split()
col = split.column()
col.operator("render.render", text="Image", icon='RENDER_STILL')
- if wide_ui:
- col = split.column()
+ col = split.column()
col.operator("render.render", text="Animation", icon='RENDER_ANIMATION').animation = True
layout.prop(rd, "display_mode", text="Display")
-class RENDER_PT_layers(RenderButtonsPanel):
+class RENDER_PT_layers(RenderButtonsPanel, bpy.types.Panel):
bl_label = "Layers"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER'}
def draw(self, context):
@@ -79,16 +76,15 @@ class RENDER_PT_layers(RenderButtonsPanel):
scene = context.scene
rd = scene.render
- wide_ui = context.region.width > narrowui
row = layout.row()
- row.template_list(rd, "layers", rd, "active_layer_index", rows=2)
+ row.template_list(rd, "layers", rd.layers, "active_index", rows=2)
col = row.column(align=True)
col.operator("scene.render_layer_add", icon='ZOOMIN', text="")
col.operator("scene.render_layer_remove", icon='ZOOMOUT', text="")
- rl = rd.layers[rd.active_layer_index]
+ rl = rd.layers.active
if rl:
layout.prop(rl, "name")
@@ -96,13 +92,16 @@ class RENDER_PT_layers(RenderButtonsPanel):
split = layout.split()
col = split.column()
- col.prop(scene, "visible_layers", text="Scene")
- if wide_ui:
- col = split.column()
- col.prop(rl, "visible_layers", text="Layer")
+ col.prop(scene, "layers", text="Scene")
+ col.label(text="")
+ col.prop(rl, "light_override", text="Light")
+ col.prop(rl, "material_override", text="Material")
+
+ col = split.column()
+ col.prop(rl, "layers", text="Layer")
+ col.label(text="Mask Layers:")
+ col.prop(rl, "layers_zmask", text="")
- layout.prop(rl, "light_override", text="Light")
- layout.prop(rl, "material_override", text="Material")
layout.separator()
layout.label(text="Include:")
@@ -110,26 +109,21 @@ class RENDER_PT_layers(RenderButtonsPanel):
split = layout.split()
col = split.column()
- col.prop(rl, "zmask")
+ col.prop(rl, "use_zmask")
row = col.row()
- row.prop(rl, "zmask_negate", text="Negate")
- row.active = rl.zmask
- col.prop(rl, "all_z")
+ row.prop(rl, "invert_zmask", text="Negate")
+ row.active = rl.use_zmask
+ col.prop(rl, "use_all_z")
col = split.column()
- col.prop(rl, "solid")
- col.prop(rl, "halo")
- col.prop(rl, "ztransp")
+ col.prop(rl, "use_solid")
+ col.prop(rl, "use_halo")
+ col.prop(rl, "use_ztransp")
col = split.column()
- col.prop(rl, "sky")
- 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="")
+ col.prop(rl, "use_sky")
+ col.prop(rl, "use_edge_enhance")
+ col.prop(rl, "use_strand")
layout.separator()
@@ -137,46 +131,45 @@ class RENDER_PT_layers(RenderButtonsPanel):
col = split.column()
col.label(text="Passes:")
- col.prop(rl, "pass_combined")
- col.prop(rl, "pass_z")
- col.prop(rl, "pass_vector")
- col.prop(rl, "pass_normal")
- col.prop(rl, "pass_uv")
- col.prop(rl, "pass_mist")
- col.prop(rl, "pass_object_index")
- col.prop(rl, "pass_color")
-
- if wide_ui:
- col = split.column()
+ col.prop(rl, "use_pass_combined")
+ col.prop(rl, "use_pass_z")
+ col.prop(rl, "use_pass_vector")
+ col.prop(rl, "use_pass_normal")
+ col.prop(rl, "use_pass_uv")
+ col.prop(rl, "use_pass_mist")
+ col.prop(rl, "use_pass_object_index")
+ col.prop(rl, "use_pass_color")
+
+ col = split.column()
col.label()
- col.prop(rl, "pass_diffuse")
+ col.prop(rl, "use_pass_diffuse")
row = col.row()
- row.prop(rl, "pass_specular")
- row.prop(rl, "pass_specular_exclude", text="", icon='X')
+ row.prop(rl, "use_pass_specular")
+ row.prop(rl, "exclude_specular", text="")
row = col.row()
- row.prop(rl, "pass_shadow")
- row.prop(rl, "pass_shadow_exclude", text="", icon='X')
+ row.prop(rl, "use_pass_shadow")
+ row.prop(rl, "exclude_shadow", text="")
row = col.row()
- row.prop(rl, "pass_emit")
- row.prop(rl, "pass_emit_exclude", text="", icon='X')
+ row.prop(rl, "use_pass_emit")
+ row.prop(rl, "exclude_emit", text="")
row = col.row()
- row.prop(rl, "pass_ao")
- row.prop(rl, "pass_ao_exclude", text="", icon='X')
+ row.prop(rl, "use_pass_ambient_occlusion")
+ row.prop(rl, "exclude_ambient_occlusion", text="")
row = col.row()
- row.prop(rl, "pass_environment")
- row.prop(rl, "pass_environment_exclude", text="", icon='X')
+ row.prop(rl, "use_pass_environment")
+ row.prop(rl, "exclude_environment", text="")
row = col.row()
- row.prop(rl, "pass_indirect")
- row.prop(rl, "pass_indirect_exclude", text="", icon='X')
+ row.prop(rl, "use_pass_indirect")
+ row.prop(rl, "exclude_indirect", text="")
row = col.row()
- row.prop(rl, "pass_reflection")
- row.prop(rl, "pass_reflection_exclude", text="", icon='X')
+ row.prop(rl, "use_pass_reflection")
+ row.prop(rl, "exclude_reflection", text="")
row = col.row()
- row.prop(rl, "pass_refraction")
- row.prop(rl, "pass_refraction_exclude", text="", icon='X')
+ row.prop(rl, "use_pass_refraction")
+ row.prop(rl, "exclude_refraction", text="")
-class RENDER_PT_shading(RenderButtonsPanel):
+class RENDER_PT_shading(RenderButtonsPanel, bpy.types.Panel):
bl_label = "Shading"
COMPAT_ENGINES = {'BLENDER_RENDER'}
@@ -184,33 +177,30 @@ class RENDER_PT_shading(RenderButtonsPanel):
layout = self.layout
rd = context.scene.render
- wide_ui = context.region.width > narrowui
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, "color_management")
+ col = split.column()
+ col.prop(rd, "use_raytrace", text="Ray Tracing")
+ col.prop(rd, "use_color_management")
col.prop(rd, "alpha_mode", text="Alpha")
-class RENDER_PT_performance(RenderButtonsPanel):
+class RENDER_PT_performance(RenderButtonsPanel, bpy.types.Panel):
bl_label = "Performance"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER'}
def draw(self, context):
layout = self.layout
rd = context.scene.render
- wide_ui = context.region.width > narrowui
split = layout.split()
@@ -225,36 +215,34 @@ class RENDER_PT_performance(RenderButtonsPanel):
sub.prop(rd, "parts_x", text="X")
sub.prop(rd, "parts_y", text="Y")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Memory:")
sub = col.column()
- sub.enabled = not (rd.use_border or rd.full_sample)
- sub.prop(rd, "save_buffers")
+ sub.enabled = not (rd.use_border or rd.use_full_sample)
+ sub.prop(rd, "use_save_buffers")
sub = col.column()
sub.active = rd.use_compositing
- sub.prop(rd, "free_image_textures")
+ sub.prop(rd, "use_free_image_textures")
sub = col.column()
- sub.active = rd.render_raytracing
+ sub.active = rd.use_raytrace
sub.label(text="Acceleration structure:")
- sub.prop(rd, "raytrace_structure", text="")
- if rd.raytrace_structure == 'OCTREE':
+ sub.prop(rd, "raytrace_method", text="")
+ if rd.raytrace_method == 'OCTREE':
sub.prop(rd, "octree_resolution", text="Resolution")
else:
sub.prop(rd, "use_instances", text="Instances")
sub.prop(rd, "use_local_coords", text="Local Coordinates")
-class RENDER_PT_post_processing(RenderButtonsPanel):
+class RENDER_PT_post_processing(RenderButtonsPanel, bpy.types.Panel):
bl_label = "Post Processing"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER'}
def draw(self, context):
layout = self.layout
rd = context.scene.render
- wide_ui = context.region.width > narrowui
split = layout.split()
@@ -262,8 +250,7 @@ class RENDER_PT_post_processing(RenderButtonsPanel):
col.prop(rd, "use_compositing")
col.prop(rd, "use_sequencer")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(rd, "dither_intensity", text="Dither", slider=True)
layout.separator()
@@ -271,25 +258,22 @@ class RENDER_PT_post_processing(RenderButtonsPanel):
split = layout.split()
col = split.column()
- col.prop(rd, "fields", text="Fields")
+ col.prop(rd, "use_fields", text="Fields")
sub = col.column()
- sub.active = rd.fields
+ sub.active = rd.use_fields
sub.row().prop(rd, "field_order", expand=True)
- sub.prop(rd, "fields_still", text="Still")
+ sub.prop(rd, "use_fields_still", text="Still")
- if wide_ui:
- col = split.column()
- else:
- col.separator()
- col.prop(rd, "edge")
+ col = split.column()
+ col.prop(rd, "use_edge_enhance")
sub = col.column()
- sub.active = rd.edge
+ sub.active = rd.use_edge_enhance
sub.prop(rd, "edge_threshold", text="Threshold", slider=True)
sub.prop(rd, "edge_color", text="")
-class RENDER_PT_output(RenderButtonsPanel):
+class RENDER_PT_output(RenderButtonsPanel, bpy.types.Panel):
bl_label = "Output"
COMPAT_ENGINES = {'BLENDER_RENDER'}
@@ -297,86 +281,119 @@ class RENDER_PT_output(RenderButtonsPanel):
layout = self.layout
rd = context.scene.render
- wide_ui = context.region.width > narrowui
+ file_format = rd.file_format
- layout.prop(rd, "output_path", text="")
+ layout.prop(rd, "filepath", text="")
split = layout.split()
col = split.column()
col.prop(rd, "file_format", text="")
col.row().prop(rd, "color_mode", text="Color", expand=True)
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(rd, "use_file_extension")
col.prop(rd, "use_overwrite")
col.prop(rd, "use_placeholder")
- if rd.file_format in ('AVI_JPEG', 'JPEG'):
+ if file_format in ('AVI_JPEG', 'JPEG'):
split = layout.split()
split.prop(rd, "file_quality", slider=True)
+
+ if file_format == 'PNG':
+ split = layout.split()
+ split.prop(rd, "file_quality", slider=True, text="Compression")
- elif rd.file_format == 'OPEN_EXR':
+ elif file_format == 'MULTILAYER':
split = layout.split()
col = split.column()
col.label(text="Codec:")
col.prop(rd, "exr_codec", text="")
+ col = split.column()
- if wide_ui:
- subsplit = split.split()
- col = subsplit.column()
- col.prop(rd, "exr_half")
+ elif file_format == 'OPEN_EXR':
+ split = layout.split()
+
+ col = split.column()
+ col.label(text="Codec:")
+ col.prop(rd, "exr_codec", text="")
+
+ subsplit = split.split()
+ col = subsplit.column()
+ col.prop(rd, "use_exr_half")
col.prop(rd, "exr_zbuf")
- if wide_ui:
- col = subsplit.column()
+ col = subsplit.column()
col.prop(rd, "exr_preview")
- elif rd.file_format == 'JPEG2000':
+ elif file_format == 'JPEG2000':
split = layout.split()
col = split.column()
col.label(text="Depth:")
col.row().prop(rd, "jpeg2k_depth", expand=True)
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(rd, "jpeg2k_preset", text="")
col.prop(rd, "jpeg2k_ycc")
- elif rd.file_format in ('CINEON', 'DPX'):
+ elif file_format in ('CINEON', 'DPX'):
split = layout.split()
col = split.column()
- col.prop(rd, "cineon_log", text="Convert to Log")
+ col.prop(rd, "use_cineon_log", text="Convert to Log")
- if wide_ui:
- col = split.column(align=True)
- col.active = rd.cineon_log
+ col = split.column(align=True)
+ col.active = rd.use_cineon_log
col.prop(rd, "cineon_black", text="Black")
col.prop(rd, "cineon_white", text="White")
col.prop(rd, "cineon_gamma", text="Gamma")
- elif rd.file_format == 'TIFF':
+ elif file_format == 'TIFF':
split = layout.split()
- split.prop(rd, "tiff_bit")
+ split.prop(rd, "use_tiff_16bit")
- elif rd.file_format == 'QUICKTIME_CARBON':
+ elif 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':
+ elif 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="")
+
+ col = split.column()
+ col.prop(rd, "quicktime_audio_samplerate", text="")
-class RENDER_PT_encoding(RenderButtonsPanel):
+ split = layout.split()
+ col = split.column()
+ if rd.quicktime_audiocodec_type == 'AAC':
+ col.prop(rd, "quicktime_audio_bitrate")
+
+ subsplit = split.split()
+ col = subsplit.column()
+
+ if rd.quicktime_audiocodec_type == 'AAC':
+ col.prop(rd, "quicktime_audio_codec_isvbr")
+
+ col = subsplit.column()
+ col.prop(rd, "quicktime_audio_resampling_hq")
+
+
+class RENDER_PT_encoding(RenderButtonsPanel, bpy.types.Panel):
bl_label = "Encoding"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
rd = context.scene.render
return rd.file_format in ('FFMPEG', 'XVID', 'H264', 'THEORA')
@@ -384,7 +401,6 @@ class RENDER_PT_encoding(RenderButtonsPanel):
layout = self.layout
rd = context.scene.render
- wide_ui = context.region.width > narrowui
layout.menu("RENDER_MT_ffmpeg_presets", text="Presets")
@@ -393,19 +409,17 @@ class RENDER_PT_encoding(RenderButtonsPanel):
col = split.column()
col.prop(rd, "ffmpeg_format")
if rd.ffmpeg_format in ('AVI', 'QUICKTIME', 'MKV', 'OGG'):
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(rd, "ffmpeg_codec")
else:
- if wide_ui:
- split.label()
+ split.label()
split = layout.split()
col = split.column()
col.prop(rd, "ffmpeg_video_bitrate")
- if wide_ui:
- col = split.column()
+
+ col = split.column()
col.prop(rd, "ffmpeg_gopsize")
split = layout.split()
@@ -416,8 +430,7 @@ class RENDER_PT_encoding(RenderButtonsPanel):
col.prop(rd, "ffmpeg_maxrate", text="Maximum")
col.prop(rd, "ffmpeg_buffersize", text="Buffer")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(rd, "ffmpeg_autosplit")
col.label(text="Mux:")
@@ -427,7 +440,7 @@ class RENDER_PT_encoding(RenderButtonsPanel):
# Audio:
sub = layout.column()
- if rd.ffmpeg_format not in ('MP3'):
+ if rd.ffmpeg_format not in ('MP3', ):
sub.prop(rd, "ffmpeg_audio_codec", text="Audio Codec")
sub.separator()
@@ -438,26 +451,24 @@ class RENDER_PT_encoding(RenderButtonsPanel):
col.prop(rd, "ffmpeg_audio_bitrate")
col.prop(rd, "ffmpeg_audio_mixrate")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(rd, "ffmpeg_audio_volume", slider=True)
-class RENDER_PT_antialiasing(RenderButtonsPanel):
+class RENDER_PT_antialiasing(RenderButtonsPanel, bpy.types.Panel):
bl_label = "Anti-Aliasing"
COMPAT_ENGINES = {'BLENDER_RENDER'}
def draw_header(self, context):
rd = context.scene.render
- self.layout.prop(rd, "antialiasing", text="")
+ self.layout.prop(rd, "use_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.use_antialiasing
split = layout.split()
@@ -465,35 +476,34 @@ class RENDER_PT_antialiasing(RenderButtonsPanel):
col.row().prop(rd, "antialiasing_samples", expand=True)
sub = col.row()
sub.enabled = not rd.use_border
- sub.prop(rd, "full_sample")
+ sub.prop(rd, "use_full_sample")
- if wide_ui:
- col = split.column()
- col.prop(rd, "pixel_filter", text="")
+ col = split.column()
+ col.prop(rd, "pixel_filter_type", text="")
col.prop(rd, "filter_size", text="Size")
-class RENDER_PT_motion_blur(RenderButtonsPanel):
+class RENDER_PT_motion_blur(RenderButtonsPanel, bpy.types.Panel):
bl_label = "Full Sample Motion Blur"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER'}
def draw_header(self, context):
rd = context.scene.render
- self.layout.prop(rd, "motion_blur", text="")
+ self.layout.prop(rd, "use_motion_blur", text="")
def draw(self, context):
layout = self.layout
rd = context.scene.render
- layout.active = rd.motion_blur
+ layout.active = rd.use_motion_blur
row = layout.row()
row.prop(rd, "motion_blur_samples")
+ row.prop(rd, "motion_blur_shutter")
-
-class RENDER_PT_dimensions(RenderButtonsPanel):
+class RENDER_PT_dimensions(RenderButtonsPanel, bpy.types.Panel):
bl_label = "Dimensions"
COMPAT_ENGINES = {'BLENDER_RENDER'}
@@ -502,12 +512,10 @@ class RENDER_PT_dimensions(RenderButtonsPanel):
scene = context.scene
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()
@@ -526,10 +534,9 @@ class RENDER_PT_dimensions(RenderButtonsPanel):
row.prop(rd, "use_border", text="Border")
sub = row.row()
sub.active = rd.use_border
- sub.prop(rd, "crop_to_border", text="Crop")
+ sub.prop(rd, "use_crop_to_border", text="Crop")
- if wide_ui:
- col = split.column()
+ col = split.column()
sub = col.column(align=True)
sub.label(text="Frame Range:")
sub.prop(scene, "frame_start", text="Start")
@@ -541,126 +548,95 @@ class RENDER_PT_dimensions(RenderButtonsPanel):
sub.prop(rd, "fps_base", text="/")
-class RENDER_PT_stamp(RenderButtonsPanel):
+class RENDER_PT_stamp(RenderButtonsPanel, bpy.types.Panel):
bl_label = "Stamp"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER'}
def draw_header(self, context):
rd = context.scene.render
- self.layout.prop(rd, "render_stamp", text="")
+ self.layout.prop(rd, "use_stamp", text="")
def draw(self, context):
layout = self.layout
rd = context.scene.render
- wide_ui = context.region.width > narrowui
- layout.active = rd.render_stamp
+ layout.active = rd.use_stamp
split = layout.split()
col = split.column()
- col.prop(rd, "stamp_time", text="Time")
- col.prop(rd, "stamp_date", text="Date")
- col.prop(rd, "stamp_render_time", text="RenderTime")
- col.prop(rd, "stamp_frame", text="Frame")
- col.prop(rd, "stamp_scene", text="Scene")
- col.prop(rd, "stamp_camera", text="Camera")
- col.prop(rd, "stamp_filename", text="Filename")
- col.prop(rd, "stamp_marker", text="Marker")
- col.prop(rd, "stamp_sequencer_strip", text="Seq. Strip")
+ col.prop(rd, "use_stamp_time", text="Time")
+ col.prop(rd, "use_stamp_date", text="Date")
+ col.prop(rd, "use_stamp_render_time", text="RenderTime")
+ col.prop(rd, "use_stamp_frame", text="Frame")
+ col.prop(rd, "use_stamp_scene", text="Scene")
+ col.prop(rd, "use_stamp_camera", text="Camera")
+ col.prop(rd, "use_stamp_filename", text="Filename")
+ col.prop(rd, "use_stamp_marker", text="Marker")
+ col.prop(rd, "use_stamp_sequencer_strip", text="Seq. Strip")
- if wide_ui:
- col = split.column()
- col.active = rd.render_stamp
+ col = split.column()
+ col.active = rd.use_stamp
col.prop(rd, "stamp_foreground", slider=True)
col.prop(rd, "stamp_background", slider=True)
col.separator()
col.prop(rd, "stamp_font_size", text="Font Size")
row = layout.split(percentage=0.2)
- row.prop(rd, "stamp_note", text="Note")
+ row.prop(rd, "use_stamp_note", text="Note")
sub = row.row()
- sub.active = rd.stamp_note
+ sub.active = rd.use_stamp_note
sub.prop(rd, "stamp_note_text", text="")
-class RENDER_PT_bake(RenderButtonsPanel):
+class RENDER_PT_bake(RenderButtonsPanel, bpy.types.Panel):
bl_label = "Bake"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER'}
def draw(self, context):
layout = self.layout
rd = context.scene.render
- wide_ui = context.region.width > narrowui
layout.operator("object.bake_image", icon='RENDER_STILL')
- if wide_ui:
- layout.prop(rd, "bake_type")
- else:
- layout.prop(rd, "bake_type", text="")
+ layout.prop(rd, "bake_type")
if rd.bake_type == 'NORMALS':
- if wide_ui:
- layout.prop(rd, "bake_normal_space")
- else:
- layout.prop(rd, "bake_normal_space", text="")
+ layout.prop(rd, "bake_normal_space")
elif rd.bake_type in ('DISPLACEMENT', 'AO'):
- layout.prop(rd, "bake_normalized")
+ layout.prop(rd, "use_bake_normalize")
# col.prop(rd, "bake_aa_mode")
- # col.prop(rd, "bake_enable_aa")
+ # col.prop(rd, "use_bake_antialiasing")
layout.separator()
split = layout.split()
col = split.column()
- col.prop(rd, "bake_clear")
+ col.prop(rd, "use_bake_clear")
col.prop(rd, "bake_margin")
col.prop(rd, "bake_quad_split", text="Split")
- if wide_ui:
- col = split.column()
- col.prop(rd, "bake_active")
+ col = split.column()
+ col.prop(rd, "use_bake_selected_to_active")
sub = col.column()
- sub.active = rd.bake_active
+ sub.active = rd.use_bake_selected_to_active
sub.prop(rd, "bake_distance")
sub.prop(rd, "bake_bias")
-classes = [
- RENDER_MT_presets,
- RENDER_MT_ffmpeg_presets,
- RENDER_PT_render,
- RENDER_PT_layers,
- RENDER_PT_dimensions,
- RENDER_PT_antialiasing,
- RENDER_PT_motion_blur,
- RENDER_PT_shading,
- RENDER_PT_output,
- RENDER_PT_encoding,
- RENDER_PT_performance,
- RENDER_PT_post_processing,
- RENDER_PT_stamp,
- RENDER_PT_bake]
-
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_scene.py b/release/scripts/ui/properties_scene.py
index 119988f8fa3..f5cf54fa315 100644
--- a/release/scripts/ui/properties_scene.py
+++ b/release/scripts/ui/properties_scene.py
@@ -20,46 +20,35 @@
import bpy
from rna_prop_ui import PropertyPanel
-narrowui = 180
-
-class SceneButtonsPanel(bpy.types.Panel):
+class SceneButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "scene"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.scene
-class SCENE_PT_scene(SceneButtonsPanel):
+class SCENE_PT_scene(SceneButtonsPanel, bpy.types.Panel):
bl_label = "Scene"
COMPAT_ENGINES = {'BLENDER_RENDER'}
def draw(self, context):
layout = self.layout
- wide_ui = context.region.width > narrowui
scene = context.scene
- if wide_ui:
- layout.prop(scene, "camera")
- layout.prop(scene, "set", text="Background")
- else:
- layout.prop(scene, "camera", text="")
- layout.prop(scene, "set", text="")
-
-
-class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel):
- _context_path = "scene"
+ layout.prop(scene, "camera")
+ layout.prop(scene, "background_set", text="Background")
-class SCENE_PT_unit(SceneButtonsPanel):
+class SCENE_PT_unit(SceneButtonsPanel, bpy.types.Panel):
bl_label = "Units"
COMPAT_ENGINES = {'BLENDER_RENDER'}
def draw(self, context):
layout = self.layout
- wide_ui = context.region.width > narrowui
unit = context.scene.unit_settings
col = layout.column()
@@ -71,33 +60,30 @@ class SCENE_PT_unit(SceneButtonsPanel):
col = split.column()
col.prop(unit, "scale_length", text="Scale")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(unit, "use_separate")
layout.column().prop(unit, "rotation_units")
-class SCENE_PT_keying_sets(SceneButtonsPanel):
+class SCENE_PT_keying_sets(SceneButtonsPanel, bpy.types.Panel):
bl_label = "Keying Sets"
def draw(self, context):
layout = self.layout
scene = context.scene
- wide_ui = context.region.width > narrowui
row = layout.row()
col = row.column()
- # XXX: this fails because index is not what this expects...
- col.template_list(scene, "keying_sets", scene, "active_keying_set_index", rows=2)
+ col.template_list(scene, "keying_sets", scene.keying_sets, "active_index", rows=2)
col = row.column(align=True)
col.operator("anim.keying_set_add", icon='ZOOMIN', text="")
col.operator("anim.keying_set_remove", icon='ZOOMOUT', text="")
- ks = scene.active_keying_set
- if ks and ks.absolute:
+ ks = scene.keying_sets.active
+ if ks and ks.is_path_absolute:
row = layout.row()
col = row.column()
@@ -106,28 +92,28 @@ class SCENE_PT_keying_sets(SceneButtonsPanel):
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()
+ col = row.column()
col.label(text="Keyframing Settings:")
- col.prop(ks, "insertkey_needed", text="Needed")
- col.prop(ks, "insertkey_visual", text="Visual")
- col.prop(ks, "insertkey_xyz_to_rgb", text="XYZ to RGB")
+ col.prop(ks, "use_insertkey_needed", text="Needed")
+ col.prop(ks, "use_insertkey_visual", text="Visual")
+ col.prop(ks, "use_insertkey_xyz_to_rgb", text="XYZ to RGB")
-class SCENE_PT_keying_set_paths(SceneButtonsPanel):
+class SCENE_PT_keying_set_paths(SceneButtonsPanel, bpy.types.Panel):
bl_label = "Active Keying Set"
- def poll(self, context):
- return (context.scene.active_keying_set and context.scene.active_keying_set.absolute)
+ @classmethod
+ def poll(cls, context):
+ ks = context.scene.keying_sets.active
+ return (ks and ks.is_path_absolute)
def draw(self, context):
layout = self.layout
scene = context.scene
- ks = scene.active_keying_set
- wide_ui = context.region.width > narrowui
+ ks = scene.keying_sets.active
row = layout.row()
row.label(text="Paths:")
@@ -135,13 +121,13 @@ class SCENE_PT_keying_set_paths(SceneButtonsPanel):
row = layout.row()
col = row.column()
- col.template_list(ks, "paths", ks, "active_path_index", rows=2)
+ col.template_list(ks, "paths", ks.paths, "active_index", rows=2)
col = row.column(align=True)
col.operator("anim.keying_set_path_add", icon='ZOOMIN', text="")
col.operator("anim.keying_set_path_remove", icon='ZOOMOUT', text="")
- ksp = ks.active_path
+ ksp = ks.paths.active
if ksp:
col = layout.column()
col.label(text="Target:")
@@ -153,24 +139,23 @@ class SCENE_PT_keying_set_paths(SceneButtonsPanel):
col = row.column()
col.label(text="Array Target:")
- col.prop(ksp, "entire_array")
- if ksp.entire_array is False:
+ col.prop(ksp, "use_entire_array")
+ if ksp.use_entire_array is False:
col.prop(ksp, "array_index")
- if wide_ui:
- col = row.column()
+ col = row.column()
col.label(text="F-Curve Grouping:")
- col.prop(ksp, "grouping")
- if ksp.grouping == 'NAMED':
+ col.prop(ksp, "group_method")
+ if ksp.group_method == '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")
+ col.prop(ksp, "use_insertkey_needed", text="Needed")
+ col.prop(ksp, "use_insertkey_visual", text="Visual")
+ col.prop(ksp, "use_insertkey_xyz_to_rgb", text="XYZ to RGB")
-class SCENE_PT_physics(SceneButtonsPanel):
+class SCENE_PT_physics(SceneButtonsPanel, bpy.types.Panel):
bl_label = "Gravity"
COMPAT_ENGINES = {'BLENDER_RENDER'}
@@ -181,17 +166,13 @@ class SCENE_PT_physics(SceneButtonsPanel):
layout = self.layout
scene = context.scene
- wide_ui = context.region.width > narrowui
layout.active = scene.use_gravity
- if wide_ui:
- layout.prop(scene, "gravity", text="")
- else:
- layout.column().prop(scene, "gravity", text="")
+ layout.prop(scene, "gravity", text="")
-class SCENE_PT_simplify(SceneButtonsPanel):
+class SCENE_PT_simplify(SceneButtonsPanel, bpy.types.Panel):
bl_label = "Simplify"
COMPAT_ENGINES = {'BLENDER_RENDER'}
@@ -204,7 +185,6 @@ class SCENE_PT_simplify(SceneButtonsPanel):
layout = self.layout
scene = context.scene
rd = scene.render
- wide_ui = context.region.width > narrowui
layout.active = rd.use_simplify
@@ -214,14 +194,18 @@ class SCENE_PT_simplify(SceneButtonsPanel):
col.prop(rd, "simplify_subdivision", text="Subdivision")
col.prop(rd, "simplify_child_particles", text="Child Particles")
- col.prop(rd, "simplify_triangulate")
+ col.prop(rd, "use_simplify_triangulate")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(rd, "simplify_shadow_samples", text="Shadow Samples")
col.prop(rd, "simplify_ao_sss", text="AO and SSS")
+class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel, bpy.types.Panel):
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+ _context_path = "scene"
+
+
from bpy.props import *
@@ -230,23 +214,21 @@ 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.")
scene = context.scene
- ks = scene.active_keying_set
+ ks = scene.keying_sets.active
f.write("# Keying Set: %s\n" % ks.name)
@@ -258,13 +240,13 @@ class ANIM_OT_keying_set_export(bpy.types.Operator):
f.write("# Keying Set Level declarations\n")
f.write("ks= scene.add_keying_set(name=\"%s\")\n" % ks.name)
- if ks.absolute is False:
- f.write("ks.absolute = False\n")
+ if not ks.is_path_absolute:
+ f.write("ks.is_path_absolute = False\n")
f.write("\n")
- f.write("ks.insertkey_needed = %s\n" % ks.insertkey_needed)
- f.write("ks.insertkey_visual = %s\n" % ks.insertkey_visual)
- f.write("ks.insertkey_xyz_to_rgb = %s\n" % ks.insertkey_xyz_to_rgb)
+ f.write("ks.use_insertkey_needed = %s\n" % ks.use_insertkey_needed)
+ f.write("ks.use_insertkey_visual = %s\n" % ks.use_insertkey_visual)
+ f.write("ks.use_insertkey_xyz_to_rgb = %s\n" % ks.use_insertkey_xyz_to_rgb)
f.write("\n")
@@ -302,7 +284,7 @@ class ANIM_OT_keying_set_export(bpy.types.Operator):
for ksp in ks.paths:
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]
@@ -311,17 +293,17 @@ 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:
+ if ksp.use_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
- if ksp.grouping == 'NAMED':
- f.write(", grouping_method='%s', group_name=\"%s\"" % (ksp.grouping, ksp.group))
- elif ksp.grouping != 'KEYINGSET':
- f.write(", grouping_method='%s'" % ksp.grouping)
+ if ksp.group_method == 'NAMED':
+ f.write(", group_method='%s', group_name=\"%s\"" % (ksp.group_method, ksp.group))
+ elif ksp.group_method != 'KEYINGSET':
+ f.write(", group_method='%s'" % ksp.group_method)
# finish off
f.write(")\n")
@@ -337,29 +319,12 @@ class ANIM_OT_keying_set_export(bpy.types.Operator):
return {'RUNNING_MODAL'}
-classes = [
- SCENE_PT_scene,
- SCENE_PT_unit,
- SCENE_PT_keying_sets,
- SCENE_PT_keying_set_paths,
- SCENE_PT_physics,
- SCENE_PT_simplify,
-
- SCENE_PT_custom_props,
-
- ANIM_OT_keying_set_export]
-
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_texture.py b/release/scripts/ui/properties_texture.py
index 7a2213c719c..5f44f573a25 100644
--- a/release/scripts/ui/properties_texture.py
+++ b/release/scripts/ui/properties_texture.py
@@ -20,11 +20,10 @@
import bpy
from rna_prop_ui import PropertyPanel
-narrowui = 180
-
class TEXTURE_MT_specials(bpy.types.Menu):
bl_label = "Texture Specials"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
@@ -35,6 +34,7 @@ class TEXTURE_MT_specials(bpy.types.Menu):
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
@@ -43,11 +43,13 @@ class TEXTURE_MT_envmap_specials(bpy.types.Menu):
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 = context.material
if idblock:
- return idblock
+ return active_node_mat(idblock)
idblock = context.lamp
if idblock:
@@ -61,39 +63,29 @@ def context_tex_datablock(context):
return idblock
-class TextureButtonsPanel(bpy.types.Panel):
+class TextureButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "texture"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
tex = context.texture
- return (tex and (tex.type != 'NONE' or tex.use_nodes))
+ return tex and (tex.type != 'NONE' or tex.use_nodes) and (context.scene.render.engine in cls.COMPAT_ENGINES)
-class TEXTURE_PT_preview(TextureButtonsPanel):
- bl_label = "Preview"
-
- def draw(self, context):
- layout = self.layout
-
- tex = context.texture
- slot = context.texture_slot
-
- idblock = context_tex_datablock(context)
-
- if idblock:
- layout.template_preview(tex, parent=idblock, slot=slot)
- else:
- layout.template_preview(tex, slot=slot)
-
-
-class TEXTURE_PT_context_texture(TextureButtonsPanel):
+class TEXTURE_PT_context_texture(TextureButtonsPanel, bpy.types.Panel):
bl_label = ""
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
+ 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)
+ @classmethod
+ def poll(cls, context):
+ 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 cls.COMPAT_ENGINES))
def draw(self, context):
layout = self.layout
@@ -101,7 +93,6 @@ class TEXTURE_PT_context_texture(TextureButtonsPanel):
node = context.texture_node
space = context.space_data
tex = context.texture
- wide_ui = context.region.width > narrowui
idblock = context_tex_datablock(context)
tex_collection = space.pin_id == None and type(idblock) != bpy.types.Brush and not node
@@ -115,11 +106,8 @@ class TEXTURE_PT_context_texture(TextureButtonsPanel):
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)
- col = split.column()
- else:
- col = layout.column()
+ split = layout.split(percentage=0.65)
+ col = split.column()
if tex_collection:
col.template_ID(idblock, "active_texture", new="texture.new")
@@ -131,11 +119,10 @@ class TEXTURE_PT_context_texture(TextureButtonsPanel):
if space.pin_id:
col.template_ID(space, "pin_id")
- if wide_ui:
- col = split.column()
+ col = split.column()
if not space.pin_id:
- col.prop(space, "brush_texture", text="Brush", toggle=True)
+ col.prop(space, "show_brush_texture", text="Brush", toggle=True)
if tex:
split = layout.split(percentage=0.2)
@@ -147,29 +134,36 @@ class TEXTURE_PT_context_texture(TextureButtonsPanel):
split.prop(slot, "output_node", text="")
else:
- if wide_ui:
- split.label(text="Type:")
- split.prop(tex, "type", text="")
- else:
- layout.prop(tex, "type", text="")
+ split.label(text="Type:")
+ split.prop(tex, "type", text="")
-class TEXTURE_PT_custom_props(TextureButtonsPanel, PropertyPanel):
- _context_path = "texture"
+class TEXTURE_PT_preview(TextureButtonsPanel, bpy.types.Panel):
+ bl_label = "Preview"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
- def poll(self, context): # use alternate poll since NONE texture type is ok
- return context.texture
+ def draw(self, context):
+ layout = self.layout
+ tex = context.texture
+ slot = getattr(context, "texture_slot", None)
+ idblock = context_tex_datablock(context)
-class TEXTURE_PT_colors(TextureButtonsPanel):
+ if idblock:
+ layout.template_preview(tex, parent=idblock, slot=slot)
+ else:
+ layout.template_preview(tex, slot=slot)
+
+
+class TEXTURE_PT_colors(TextureButtonsPanel, bpy.types.Panel):
bl_label = "Colors"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
tex = context.texture
- wide_ui = context.region.width > narrowui
layout.prop(tex, "use_color_ramp", text="Ramp")
if tex.use_color_ramp:
@@ -184,24 +178,42 @@ class TEXTURE_PT_colors(TextureButtonsPanel):
sub.prop(tex, "factor_green", text="G")
sub.prop(tex, "factor_blue", text="B")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Adjust:")
- col.prop(tex, "brightness")
+ col.prop(tex, "intensity")
col.prop(tex, "contrast")
+ col.prop(tex, "saturation")
# Texture Slot Panels #
class TextureSlotPanel(TextureButtonsPanel):
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+
+ @classmethod
+ def poll(cls, context):
+ if not hasattr(context, "texture_slot"):
+ return False
- def poll(self, context):
- return (context.texture_slot and
- TextureButtonsPanel.poll(self, context))
+ engine = context.scene.render.engine
+ return TextureButtonsPanel.poll(self, context) and (engine in cls.COMPAT_ENGINES)
-class TEXTURE_PT_mapping(TextureSlotPanel):
+class TEXTURE_PT_mapping(TextureSlotPanel, bpy.types.Panel):
bl_label = "Mapping"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+
+ @classmethod
+ def poll(cls, 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 cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
@@ -210,16 +222,15 @@ class TEXTURE_PT_mapping(TextureSlotPanel):
tex = context.texture_slot
# textype = context.texture
- wide_ui = context.region.width > narrowui
if type(idblock) != bpy.types.Brush:
split = layout.split(percentage=0.3)
col = split.column()
col.label(text="Coordinates:")
col = split.column()
- col.prop(tex, "texture_coordinates", text="")
+ col.prop(tex, "texture_coords", text="")
- if tex.texture_coordinates == 'ORCO':
+ if tex.texture_coords == 'ORCO':
"""
ob = context.object
if ob and ob.type == 'MESH':
@@ -227,30 +238,28 @@ class TEXTURE_PT_mapping(TextureSlotPanel):
split.label(text="Mesh:")
split.prop(ob.data, "texco_mesh", text="")
"""
- elif tex.texture_coordinates == 'UV':
+ elif tex.texture_coords == 'UV':
split = layout.split(percentage=0.3)
split.label(text="Layer:")
ob = context.object
if ob and ob.type == 'MESH':
- split.prop_object(tex, "uv_layer", ob.data, "uv_textures", text="")
+ split.prop_search(tex, "uv_layer", ob.data, "uv_textures", text="")
else:
split.prop(tex, "uv_layer", text="")
- elif tex.texture_coordinates == 'OBJECT':
+ elif tex.texture_coords == 'OBJECT':
split = layout.split(percentage=0.3)
split.label(text="Object:")
split.prop(tex, "object", text="")
if type(idblock) == bpy.types.Brush:
- layout.prop(tex, "map_mode", expand=True)
-
- row = layout.row()
- row.active = tex.map_mode in ('FIXED', 'TILED')
- row.prop(tex, "angle")
+ 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 ('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)
@@ -260,40 +269,44 @@ class TEXTURE_PT_mapping(TextureSlotPanel):
split = layout.split()
col = split.column()
- if tex.texture_coordinates in ('ORCO', 'UV'):
- col.prop(tex, "from_dupli")
- elif tex.texture_coordinates == 'OBJECT':
- col.prop(tex, "from_original")
- elif wide_ui:
+ if tex.texture_coords in ('ORCO', 'UV'):
+ col.prop(tex, "use_from_dupli")
+ elif tex.texture_coords == 'OBJECT':
+ col.prop(tex, "use_from_original")
+ else:
col.label()
- if wide_ui:
- col = split.column()
+ col = split.column()
row = col.row()
- row.prop(tex, "x_mapping", text="")
- row.prop(tex, "y_mapping", text="")
- row.prop(tex, "z_mapping", text="")
+ row.prop(tex, "mapping_x", text="")
+ row.prop(tex, "mapping_y", text="")
+ row.prop(tex, "mapping_z", text="")
- # any non brush
- split = layout.split()
+ split = layout.split()
- col = split.column()
- col.prop(tex, "offset")
+ col = split.column()
+ col.prop(tex, "offset")
- if wide_ui:
- col = split.column()
- col.prop(tex, "size")
+ col = split.column()
+
+ col.prop(tex, "scale")
-class TEXTURE_PT_influence(TextureSlotPanel):
+class TEXTURE_PT_influence(TextureSlotPanel, bpy.types.Panel):
bl_label = "Influence"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, 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 cls.COMPAT_ENGINES)
def draw(self, context):
@@ -303,7 +316,6 @@ class TEXTURE_PT_influence(TextureSlotPanel):
# textype = context.texture
tex = context.texture_slot
- wide_ui = context.region.width > narrowui
def factor_but(layout, active, toggle, factor, name):
row = layout.row(align=True)
@@ -318,69 +330,66 @@ class TEXTURE_PT_influence(TextureSlotPanel):
col = split.column()
col.label(text="Diffuse:")
- factor_but(col, tex.map_diffuse, "map_diffuse", "diffuse_factor", "Intensity")
- factor_but(col, tex.map_colordiff, "map_colordiff", "colordiff_factor", "Color")
- factor_but(col, tex.map_alpha, "map_alpha", "alpha_factor", "Alpha")
- factor_but(col, tex.map_translucency, "map_translucency", "translucency_factor", "Translucency")
+ factor_but(col, tex.use_map_diffuse, "use_map_diffuse", "diffuse_factor", "Intensity")
+ factor_but(col, tex.use_map_color_diffuse, "use_map_color_diffuse", "diffuse_color_factor", "Color")
+ factor_but(col, tex.use_map_alpha, "use_map_alpha", "alpha_factor", "Alpha")
+ factor_but(col, tex.use_map_translucency, "use_map_translucency", "translucency_factor", "Translucency")
col.label(text="Specular:")
- factor_but(col, tex.map_specular, "map_specular", "specular_factor", "Intensity")
- factor_but(col, tex.map_colorspec, "map_colorspec", "colorspec_factor", "Color")
- factor_but(col, tex.map_hardness, "map_hardness", "hardness_factor", "Hardness")
+ factor_but(col, tex.use_map_specular, "use_map_specular", "specular_factor", "Intensity")
+ factor_but(col, tex.use_map_color_spec, "use_map_color_spec", "specular_color_factor", "Color")
+ factor_but(col, tex.use_map_hardness, "use_map_hardness", "hardness_factor", "Hardness")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Shading:")
- factor_but(col, tex.map_ambient, "map_ambient", "ambient_factor", "Ambient")
- factor_but(col, tex.map_emit, "map_emit", "emit_factor", "Emit")
- factor_but(col, tex.map_mirror, "map_mirror", "mirror_factor", "Mirror")
- factor_but(col, tex.map_raymir, "map_raymir", "raymir_factor", "Ray Mirror")
+ factor_but(col, tex.use_map_ambient, "use_map_ambient", "ambient_factor", "Ambient")
+ factor_but(col, tex.use_map_emit, "use_map_emit", "emit_factor", "Emit")
+ factor_but(col, tex.use_map_mirror, "use_map_mirror", "mirror_factor", "Mirror")
+ factor_but(col, tex.use_map_raymir, "use_map_raymir", "raymir_factor", "Ray Mirror")
col.label(text="Geometry:")
- factor_but(col, tex.map_normal, "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")
+ # XXX replace 'or' when displacement is fixed to not rely on normal influence value.
+ factor_but(col, (tex.use_map_normal or tex.use_map_displacement), "use_map_normal", "normal_factor", "Normal")
+ factor_but(col, tex.use_map_warp, "use_map_warp", "warp_factor", "Warp")
+ factor_but(col, tex.use_map_displacement, "use_map_displacement", "displacement_factor", "Displace")
#sub = col.column()
- #sub.active = tex.map_translucency or tex.map_emit or tex.map_alpha or tex.map_raymir or tex.map_hardness or tex.map_ambient or tex.map_specularity or tex.map_reflection or tex.map_mirror
+ #sub.active = tex.use_map_translucency or tex.map_emit or tex.map_alpha or tex.map_raymir or tex.map_hardness or tex.map_ambient or tex.map_specularity or tex.map_reflection or tex.map_mirror
#sub.prop(tex, "default_value", text="Amount", slider=True)
elif idblock.type == 'VOLUME':
split = layout.split()
col = split.column()
- factor_but(col, tex.map_density, "map_density", "density_factor", "Density")
- factor_but(col, tex.map_emission, "map_emission", "emission_factor", "Emission")
- factor_but(col, tex.map_scattering, "map_scattering", "scattering_factor", "Scattering")
- factor_but(col, tex.map_reflection, "map_reflection", "reflection_factor", "Reflection")
-
- if wide_ui:
- col = split.column()
- col.label(text=" ")
- 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")
+ factor_but(col, tex.use_map_density, "use_map_density", "density_factor", "Density")
+ factor_but(col, tex.use_map_emission, "use_map_emission", "emission_factor", "Emission")
+ factor_but(col, tex.use_map_scatter, "use_map_scattering", "scattering_factor", "Scattering")
+ factor_but(col, tex.use_map_reflect, "use_map_reflection", "reflection_factor", "Reflection")
+
+ col = split.column()
+ col.label(text=" ")
+ factor_but(col, tex.use_map_color_emission, "use_map_color_emission", "emission_color_factor", "Emission Color")
+ factor_but(col, tex.use_map_color_transmission, "use_map_color_transmission", "transmission_color_factor", "Transmission Color")
+ factor_but(col, tex.use_map_color_reflection, "use_map_color_reflection", "reflection_color_factor", "Reflection Color")
elif type(idblock) == bpy.types.Lamp:
split = layout.split()
col = split.column()
- factor_but(col, tex.map_color, "map_color", "color_factor", "Color")
+ factor_but(col, tex.use_map_color, "map_color", "color_factor", "Color")
- if wide_ui:
- col = split.column()
- factor_but(col, tex.map_shadow, "map_shadow", "shadow_factor", "Shadow")
+ col = split.column()
+ factor_but(col, tex.use_map_shadow, "map_shadow", "shadow_factor", "Shadow")
elif type(idblock) == bpy.types.World:
split = layout.split()
col = split.column()
- factor_but(col, tex.map_blend, "map_blend", "blend_factor", "Blend")
- factor_but(col, tex.map_horizon, "map_horizon", "horizon_factor", "Horizon")
+ factor_but(col, tex.use_map_blend, "use_map_blend", "blend_factor", "Blend")
+ factor_but(col, tex.use_map_horizon, "use_map_horizon", "horizon_factor", "Horizon")
- if wide_ui:
- col = split.column()
- factor_but(col, tex.map_zenith_up, "map_zenith_up", "zenith_up_factor", "Zenith Up")
- factor_but(col, tex.map_zenith_down, "map_zenith_down", "zenith_down_factor", "Zenith Down")
+ col = split.column()
+ factor_but(col, tex.use_map_zenith_up, "use_map_zenith_up", "zenith_up_factor", "Zenith Up")
+ factor_but(col, tex.use_map_zenith_down, "use_map_zenith_down", "zenith_down_factor", "Zenith Down")
layout.separator()
@@ -388,15 +397,14 @@ class TEXTURE_PT_influence(TextureSlotPanel):
col = split.column()
col.prop(tex, "blend_type", text="Blend")
- col.prop(tex, "rgb_to_intensity")
+ col.prop(tex, "use_rgb_to_intensity")
sub = col.column()
- sub.active = tex.rgb_to_intensity
+ sub.active = tex.use_rgb_to_intensity
sub.prop(tex, "color", text="")
- if wide_ui:
- col = split.column()
- col.prop(tex, "negate", text="Negative")
- col.prop(tex, "stencil")
+ col = split.column()
+ col.prop(tex, "invert", text="Negative")
+ col.prop(tex, "use_stencil")
if type(idblock) in (bpy.types.Material, bpy.types.World):
col.prop(tex, "default_value", text="DVar", slider=True)
@@ -406,179 +414,160 @@ class TEXTURE_PT_influence(TextureSlotPanel):
class TextureTypePanel(TextureButtonsPanel):
- def poll(self, context):
+ @classmethod
+ def poll(cls, 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 == cls.tex_type and not tex.use_nodes) and (engine in cls.COMPAT_ENGINES))
-class TEXTURE_PT_clouds(TextureTypePanel):
+class TEXTURE_PT_clouds(TextureTypePanel, bpy.types.Panel):
bl_label = "Clouds"
tex_type = 'CLOUDS'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
tex = context.texture
- wide_ui = context.region.width > narrowui
- layout.prop(tex, "stype", expand=True)
+ layout.prop(tex, "cloud_type", expand=True)
layout.label(text="Noise:")
layout.prop(tex, "noise_type", text="Type", expand=True)
- if wide_ui:
- layout.prop(tex, "noise_basis", text="Basis")
- else:
- layout.prop(tex, "noise_basis", text="")
+ layout.prop(tex, "noise_basis", text="Basis")
split = layout.split()
col = split.column()
- col.prop(tex, "noise_size", text="Size")
+ col.prop(tex, "noise_scale", text="Size")
col.prop(tex, "noise_depth", text="Depth")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(tex, "nabla", text="Nabla")
-class TEXTURE_PT_wood(TextureTypePanel):
+class TEXTURE_PT_wood(TextureTypePanel, bpy.types.Panel):
bl_label = "Wood"
tex_type = 'WOOD'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
tex = context.texture
- wide_ui = context.region.width > narrowui
- layout.prop(tex, "noisebasis2", expand=True)
- if wide_ui:
- layout.prop(tex, "stype", expand=True)
- else:
- layout.prop(tex, "stype", text="")
+ layout.prop(tex, "noisebasis_2", expand=True)
+ layout.prop(tex, "wood_type", expand=True)
col = layout.column()
- col.active = tex.stype in ('RINGNOISE', 'BANDNOISE')
+ col.active = tex.wood_type in ('RINGNOISE', 'BANDNOISE')
col.label(text="Noise:")
col.row().prop(tex, "noise_type", text="Type", expand=True)
- if wide_ui:
- layout.prop(tex, "noise_basis", text="Basis")
- else:
- layout.prop(tex, "noise_basis", text="")
+ layout.prop(tex, "noise_basis", text="Basis")
split = layout.split()
- split.active = tex.stype in ('RINGNOISE', 'BANDNOISE')
+ split.active = tex.wood_type in ('RINGNOISE', 'BANDNOISE')
col = split.column()
- col.prop(tex, "noise_size", text="Size")
+ col.prop(tex, "noise_scale", text="Size")
col.prop(tex, "turbulence")
col = split.column()
col.prop(tex, "nabla")
-class TEXTURE_PT_marble(TextureTypePanel):
+class TEXTURE_PT_marble(TextureTypePanel, bpy.types.Panel):
bl_label = "Marble"
tex_type = 'MARBLE'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
tex = context.texture
- wide_ui = context.region.width > narrowui
- layout.prop(tex, "stype", expand=True)
- layout.prop(tex, "noisebasis2", expand=True)
+ layout.prop(tex, "marble_type", expand=True)
+ layout.prop(tex, "noisebasis_2", expand=True)
layout.label(text="Noise:")
layout.prop(tex, "noise_type", text="Type", expand=True)
- if wide_ui:
- layout.prop(tex, "noise_basis", text="Basis")
- else:
- layout.prop(tex, "noise_basis", text="")
+ layout.prop(tex, "noise_basis", text="Basis")
split = layout.split()
col = split.column()
- col.prop(tex, "noise_size", text="Size")
+ col.prop(tex, "noise_scale", text="Size")
col.prop(tex, "noise_depth", text="Depth")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(tex, "turbulence")
col.prop(tex, "nabla")
-class TEXTURE_PT_magic(TextureTypePanel):
+class TEXTURE_PT_magic(TextureTypePanel, bpy.types.Panel):
bl_label = "Magic"
tex_type = 'MAGIC'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
tex = context.texture
- wide_ui = context.region.width > narrowui
split = layout.split()
col = split.column()
col.prop(tex, "noise_depth", text="Depth")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(tex, "turbulence")
-class TEXTURE_PT_blend(TextureTypePanel):
+class TEXTURE_PT_blend(TextureTypePanel, bpy.types.Panel):
bl_label = "Blend"
tex_type = 'BLEND'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
tex = context.texture
- wide_ui = context.region.width > narrowui
- if wide_ui:
- layout.prop(tex, "progression")
- else:
- layout.prop(tex, "progression", text="")
+ layout.prop(tex, "progression")
sub = layout.row()
sub.active = (tex.progression in ('LINEAR', 'QUADRATIC', 'EASING', 'RADIAL'))
- sub.prop(tex, "flip_axis", expand=True)
+ sub.prop(tex, "use_flip_axis", expand=True)
-class TEXTURE_PT_stucci(TextureTypePanel):
+class TEXTURE_PT_stucci(TextureTypePanel, bpy.types.Panel):
bl_label = "Stucci"
tex_type = 'STUCCI'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
tex = context.texture
- wide_ui = context.region.width > narrowui
- layout.prop(tex, "stype", expand=True)
+ layout.prop(tex, "stucci_type", expand=True)
layout.label(text="Noise:")
layout.prop(tex, "noise_type", text="Type", expand=True)
- if wide_ui:
- layout.prop(tex, "noise_basis", text="Basis")
- else:
- layout.prop(tex, "noise_basis", text="")
+ layout.prop(tex, "noise_basis", text="Basis")
split = layout.split()
col = split.column()
- col.prop(tex, "noise_size", text="Size")
+ col.prop(tex, "noise_scale", text="Size")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(tex, "turbulence")
-class TEXTURE_PT_image(TextureTypePanel):
+class TEXTURE_PT_image(TextureTypePanel, bpy.types.Panel):
bl_label = "Image"
tex_type = 'IMAGE'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
@@ -590,72 +579,67 @@ class TEXTURE_PT_image(TextureTypePanel):
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_type", text="")
+ if tex.use_mipmap and tex.filter_type in ('AREA', 'EWA', 'FELINE'):
+ if tex.filter_type == '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")
+ layout.prop(tex, "use_filter_size_min")
-class TEXTURE_PT_image_sampling(TextureTypePanel):
+class TEXTURE_PT_image_sampling(TextureTypePanel, bpy.types.Panel):
bl_label = "Image Sampling"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
tex_type = 'IMAGE'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
tex = context.texture
# slot = context.texture_slot
- wide_ui = context.region.width > narrowui
split = layout.split()
col = split.column()
col.label(text="Alpha:")
col.prop(tex, "use_alpha", text="Use")
- col.prop(tex, "calculate_alpha", text="Calculate")
+ col.prop(tex, "use_calculate_alpha", text="Calculate")
col.prop(tex, "invert_alpha", text="Invert")
col.separator()
- col.prop(tex, "flip_axis", text="Flip X/Y Axis")
+ col.prop(tex, "use_flip_axis", text="Flip X/Y Axis")
- if wide_ui:
- col = split.column()
- else:
- col.separator()
- col.prop(tex, "normal_map")
+ col = split.column()
+
+ col.prop(tex, "use_normal_map")
row = col.row()
- row.active = tex.normal_map
+ row.active = tex.use_normal_map
row.prop(tex, "normal_space", text="")
- col.prop(tex, "mipmap")
+ col.prop(tex, "use_mipmap")
row = col.row()
- row.active = tex.mipmap
- row.prop(tex, "mipmap_gauss")
- col.prop(tex, "interpolation")
+ row.active = tex.use_mipmap
+ row.prop(tex, "use_mipmap_gauss")
+ col.prop(tex, "use_interpolation")
texture_filter_common(tex, col)
-class TEXTURE_PT_image_mapping(TextureTypePanel):
+class TEXTURE_PT_image_mapping(TextureTypePanel, bpy.types.Panel):
bl_label = "Image Mapping"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
tex_type = 'IMAGE'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
tex = context.texture
- wide_ui = context.region.width > narrowui
- if wide_ui:
- layout.prop(tex, "extension")
- else:
- layout.prop(tex, "extension", text="")
+ layout.prop(tex, "extension")
split = layout.split()
@@ -665,21 +649,19 @@ class TEXTURE_PT_image_mapping(TextureTypePanel):
col.prop(tex, "repeat_x", text="X")
col.prop(tex, "repeat_y", text="Y")
- if wide_ui:
- col = split.column(align=True)
+ col = split.column(align=True)
col.label(text="Mirror:")
- col.prop(tex, "mirror_x", text="X")
- col.prop(tex, "mirror_y", text="Y")
+ col.prop(tex, "use_mirror_x", text="X")
+ col.prop(tex, "use_mirror_y", text="Y")
layout.separator()
elif tex.extension == 'CHECKER':
col = split.column(align=True)
row = col.row()
- row.prop(tex, "checker_even", text="Even")
- row.prop(tex, "checker_odd", text="Odd")
+ row.prop(tex, "use_checker_even", text="Even")
+ row.prop(tex, "use_checker_odd", text="Odd")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(tex, "checker_distance", text="Distance")
layout.separator()
@@ -692,28 +674,16 @@ class TEXTURE_PT_image_mapping(TextureTypePanel):
col.prop(tex, "crop_min_x", text="X")
col.prop(tex, "crop_min_y", text="Y")
- if wide_ui:
- col = split.column(align=True)
+ col = split.column(align=True)
col.label(text="Crop Maximum:")
col.prop(tex, "crop_max_x", text="X")
col.prop(tex, "crop_max_y", text="Y")
-class TEXTURE_PT_plugin(TextureTypePanel):
- bl_label = "Plugin"
- tex_type = 'PLUGIN'
-
- def draw(self, context):
- layout = self.layout
-
- # tex = context.texture
-
- layout.label(text="Nothing yet")
-
-
-class TEXTURE_PT_envmap(TextureTypePanel):
+class TEXTURE_PT_envmap(TextureTypePanel, bpy.types.Panel):
bl_label = "Environment Map"
tex_type = 'ENVIRONMENT_MAP'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
@@ -721,7 +691,6 @@ class TEXTURE_PT_envmap(TextureTypePanel):
tex = context.texture
env = tex.environment_map
- wide_ui = context.region.width > narrowui
row = layout.row()
row.prop(env, "source", expand=True)
@@ -739,22 +708,22 @@ class TEXTURE_PT_envmap(TextureTypePanel):
split = layout.split()
col = split.column()
- col.prop(env, "ignore_layers")
+ col.prop(env, "layers_ignore")
col.prop(env, "resolution")
col.prop(env, "depth")
- if wide_ui:
- col = split.column(align=True)
+ 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):
+class TEXTURE_PT_envmap_sampling(TextureTypePanel, bpy.types.Panel):
bl_label = "Environment Map Sampling"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
tex_type = 'ENVIRONMENT_MAP'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
@@ -764,30 +733,26 @@ class TEXTURE_PT_envmap_sampling(TextureTypePanel):
texture_filter_common(tex, layout)
-class TEXTURE_PT_musgrave(TextureTypePanel):
+class TEXTURE_PT_musgrave(TextureTypePanel, bpy.types.Panel):
bl_label = "Musgrave"
tex_type = 'MUSGRAVE'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
tex = context.texture
- wide_ui = context.region.width > narrowui
- if wide_ui:
- layout.prop(tex, "musgrave_type")
- else:
- layout.prop(tex, "musgrave_type", text="")
+ layout.prop(tex, "musgrave_type")
split = layout.split()
col = split.column()
- col.prop(tex, "highest_dimension", text="Dimension")
+ col.prop(tex, "dimension_max", text="Dimension")
col.prop(tex, "lacunarity")
col.prop(tex, "octaves")
- if wide_ui:
- col = split.column()
+ col = split.column()
if (tex.musgrave_type in ('HETERO_TERRAIN', 'RIDGED_MULTIFRACTAL', 'HYBRID_MULTIFRACTAL')):
col.prop(tex, "offset")
if (tex.musgrave_type in ('RIDGED_MULTIFRACTAL', 'HYBRID_MULTIFRACTAL')):
@@ -796,30 +761,26 @@ class TEXTURE_PT_musgrave(TextureTypePanel):
layout.label(text="Noise:")
- if wide_ui:
- layout.prop(tex, "noise_basis", text="Basis")
- else:
- layout.prop(tex, "noise_basis", text="")
+ layout.prop(tex, "noise_basis", text="Basis")
split = layout.split()
col = split.column()
- col.prop(tex, "noise_size", text="Size")
+ col.prop(tex, "noise_scale", text="Size")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(tex, "nabla")
-class TEXTURE_PT_voronoi(TextureTypePanel):
+class TEXTURE_PT_voronoi(TextureTypePanel, bpy.types.Panel):
bl_label = "Voronoi"
tex_type = 'VORONOI'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
tex = context.texture
- wide_ui = context.region.width > narrowui
split = layout.split()
@@ -830,11 +791,10 @@ class TEXTURE_PT_voronoi(TextureTypePanel):
sub.active = tex.distance_metric == 'MINKOVSKY'
sub.prop(tex, "minkovsky_exponent", text="Exponent")
col.label(text="Coloring:")
- col.prop(tex, "coloring", text="")
+ col.prop(tex, "color_mode", text="")
col.prop(tex, "noise_intensity", text="Intensity")
- if wide_ui:
- col = split.column()
+ col = split.column()
sub = col.column(align=True)
sub.label(text="Feature Weights:")
sub.prop(tex, "weight_1", text="1", slider=True)
@@ -847,93 +807,91 @@ class TEXTURE_PT_voronoi(TextureTypePanel):
split = layout.split()
col = split.column()
- col.prop(tex, "noise_size", text="Size")
+ col.prop(tex, "noise_scale", text="Size")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(tex, "nabla")
-class TEXTURE_PT_distortednoise(TextureTypePanel):
+class TEXTURE_PT_distortednoise(TextureTypePanel, bpy.types.Panel):
bl_label = "Distorted Noise"
tex_type = 'DISTORTED_NOISE'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
tex = context.texture
- wide_ui = context.region.width > narrowui
- if wide_ui:
- layout.prop(tex, "noise_distortion")
- layout.prop(tex, "noise_basis", text="Basis")
- else:
- layout.prop(tex, "noise_distortion", text="")
- layout.prop(tex, "noise_basis", text="")
+ layout.prop(tex, "noise_distortion")
+ layout.prop(tex, "noise_basis", text="Basis")
split = layout.split()
col = split.column()
col.prop(tex, "distortion", text="Distortion")
- col.prop(tex, "noise_size", text="Size")
+ col.prop(tex, "noise_scale", text="Size")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.prop(tex, "nabla")
-class TEXTURE_PT_voxeldata(TextureButtonsPanel):
+class TEXTURE_PT_voxeldata(TextureButtonsPanel, bpy.types.Panel):
bl_label = "Voxel Data"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, 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 cls.COMPAT_ENGINES))
def draw(self, context):
layout = self.layout
tex = context.texture
- vd = tex.voxeldata
+ vd = tex.voxel_data
layout.prop(vd, "file_format")
- if vd.file_format in ['BLENDER_VOXEL', 'RAW_8BIT']:
- layout.prop(vd, "source_path")
+ if vd.file_format in ('BLENDER_VOXEL', 'RAW_8BIT'):
+ layout.prop(vd, "filepath")
if vd.file_format == 'RAW_8BIT':
layout.prop(vd, "resolution")
elif vd.file_format == 'SMOKE':
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, "frame_duration")
- layout.prop(vd, "still")
+ layout.prop(vd, "use_still_frame")
row = layout.row()
- row.active = vd.still
- row.prop(vd, "still_frame_number")
+ row.active = vd.use_still_frame
+ row.prop(vd, "still_frame")
layout.prop(vd, "interpolation")
layout.prop(vd, "extension")
layout.prop(vd, "intensity")
-class TEXTURE_PT_pointdensity(TextureButtonsPanel):
+class TEXTURE_PT_pointdensity(TextureButtonsPanel, bpy.types.Panel):
bl_label = "Point Density"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, 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 cls.COMPAT_ENGINES))
def draw(self, context):
layout = self.layout
tex = context.texture
- pd = tex.pointdensity
- wide_ui = context.region.width > narrowui
+ pd = tex.point_density
- if wide_ui:
- layout.prop(pd, "point_source", expand=True)
- else:
- layout.prop(pd, "point_source", text="")
+ layout.prop(pd, "point_source", expand=True)
split = layout.split()
@@ -946,14 +904,14 @@ class TEXTURE_PT_pointdensity(TextureButtonsPanel):
sub.enabled = bool(pd.object)
if pd.object:
sub.label(text="System:")
- sub.prop_object(pd, "particle_system", pd.object, "particle_systems", text="")
+ sub.prop_search(pd, "particle_system", pd.object, "particle_systems", text="")
sub.label(text="Cache:")
- sub.prop(pd, "particle_cache", text="")
+ sub.prop(pd, "particle_cache_space", text="")
else:
col.label(text="Object:")
col.prop(pd, "object", text="")
col.label(text="Cache:")
- col.prop(pd, "vertices_cache", text="")
+ col.prop(pd, "vertex_cache_space", text="")
col.separator()
@@ -964,38 +922,39 @@ class TEXTURE_PT_pointdensity(TextureButtonsPanel):
if pd.color_source in ('PARTICLE_SPEED', 'PARTICLE_AGE'):
layout.template_color_ramp(pd, "color_ramp", expand=True)
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label()
col.prop(pd, "radius")
col.label(text="Falloff:")
col.prop(pd, "falloff", text="")
if pd.falloff == 'SOFT':
- col.prop(pd, "falloff_softness")
+ col.prop(pd, "falloff_soft")
-class TEXTURE_PT_pointdensity_turbulence(TextureButtonsPanel):
+class TEXTURE_PT_pointdensity_turbulence(TextureButtonsPanel, bpy.types.Panel):
bl_label = "Turbulence"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, 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 cls.COMPAT_ENGINES))
def draw_header(self, context):
layout = self.layout
tex = context.texture
- pd = tex.pointdensity
+ pd = tex.point_density
- layout.prop(pd, "turbulence", text="")
+ layout.prop(pd, "use_turbulence", text="")
def draw(self, context):
layout = self.layout
tex = context.texture
- pd = tex.pointdensity
- layout.active = pd.turbulence
- wide_ui = context.region.width > narrowui
+ pd = tex.point_density
+ layout.active = pd.use_turbulence
split = layout.split()
@@ -1005,57 +964,24 @@ class TEXTURE_PT_pointdensity_turbulence(TextureButtonsPanel):
col.label(text="Noise Basis:")
col.prop(pd, "noise_basis", text="")
- if wide_ui:
- col = split.column()
- col.label()
- col.prop(pd, "turbulence_size")
+ col = split.column()
+ col.label()
+ col.prop(pd, "turbulence_scale")
col.prop(pd, "turbulence_depth")
col.prop(pd, "turbulence_strength")
-classes = [
- TEXTURE_MT_specials,
- TEXTURE_MT_envmap_specials,
-
- TEXTURE_PT_context_texture,
- TEXTURE_PT_preview,
-
- TEXTURE_PT_clouds, # Texture Type Panels
- TEXTURE_PT_wood,
- TEXTURE_PT_marble,
- TEXTURE_PT_magic,
- TEXTURE_PT_blend,
- TEXTURE_PT_stucci,
- TEXTURE_PT_image,
- TEXTURE_PT_image_sampling,
- TEXTURE_PT_image_mapping,
- TEXTURE_PT_plugin,
- TEXTURE_PT_envmap,
- TEXTURE_PT_envmap_sampling,
- TEXTURE_PT_musgrave,
- TEXTURE_PT_voronoi,
- TEXTURE_PT_distortednoise,
- TEXTURE_PT_voxeldata,
- TEXTURE_PT_pointdensity,
- TEXTURE_PT_pointdensity_turbulence,
-
- TEXTURE_PT_colors,
- TEXTURE_PT_mapping,
- TEXTURE_PT_influence,
-
- TEXTURE_PT_custom_props]
+class TEXTURE_PT_custom_props(TextureButtonsPanel, PropertyPanel, bpy.types.Panel):
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+ _context_path = "texture"
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/properties_world.py b/release/scripts/ui/properties_world.py
index 1ee47e942a0..9f93137252e 100644
--- a/release/scripts/ui/properties_world.py
+++ b/release/scripts/ui/properties_world.py
@@ -20,36 +20,29 @@
import bpy
from rna_prop_ui import PropertyPanel
-narrowui = 180
+# TODO, "color_range" not in the UI
-class WorldButtonsPanel(bpy.types.Panel):
+class WorldButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "world"
# COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here
- def poll(self, context):
- rd = context.scene.render
- return (context.world) and (not rd.use_game_engine) and (rd.engine in self.COMPAT_ENGINES)
-
-
-class WORLD_PT_preview(WorldButtonsPanel):
- bl_label = "Preview"
- COMPAT_ENGINES = {'BLENDER_RENDER'}
-
- def draw(self, context):
- self.layout.template_preview(context.world)
+ @classmethod
+ def poll(cls, context):
+ return (context.world and context.scene.render.engine in cls.COMPAT_ENGINES)
-class WORLD_PT_context_world(WorldButtonsPanel):
+class WORLD_PT_context_world(WorldButtonsPanel, bpy.types.Panel):
bl_label = ""
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
COMPAT_ENGINES = {'BLENDER_RENDER'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
rd = context.scene.render
- return (not rd.use_game_engine) and (rd.engine in self.COMPAT_ENGINES)
+ return (not rd.use_game_engine) and (rd.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
@@ -57,178 +50,119 @@ class WORLD_PT_context_world(WorldButtonsPanel):
scene = context.scene
world = context.world
space = context.space_data
- wide_ui = context.region.width > narrowui
-
- if wide_ui:
- split = layout.split(percentage=0.65)
- if scene:
- split.template_ID(scene, "world", new="world.new")
- elif world:
- split.template_ID(space, "pin_id")
- else:
- layout.template_ID(scene, "world", new="world.new")
+ split = layout.split(percentage=0.65)
+ if scene:
+ split.template_ID(scene, "world", new="world.new")
+ elif world:
+ split.template_ID(space, "pin_id")
-class WORLD_PT_custom_props(WorldButtonsPanel, PropertyPanel):
+class WORLD_PT_preview(WorldButtonsPanel, bpy.types.Panel):
+ bl_label = "Preview"
COMPAT_ENGINES = {'BLENDER_RENDER'}
- _context_path = "world"
+
+ @classmethod
+ def poll(cls, context):
+ rd = context.scene.render
+ return (context.world) and (not rd.use_game_engine) and (rd.engine in cls.COMPAT_ENGINES)
+
+ def draw(self, context):
+ self.layout.template_preview(context.world)
-class WORLD_PT_world(WorldButtonsPanel):
+class WORLD_PT_world(WorldButtonsPanel, bpy.types.Panel):
bl_label = "World"
COMPAT_ENGINES = {'BLENDER_RENDER'}
def draw(self, context):
layout = self.layout
- wide_ui = context.region.width > narrowui
world = context.world
- if wide_ui:
- row = layout.row()
- row.prop(world, "paper_sky")
- row.prop(world, "blend_sky")
- row.prop(world, "real_sky")
- else:
- col = layout.column()
- col.prop(world, "paper_sky")
- col.prop(world, "blend_sky")
- col.prop(world, "real_sky")
+ row = layout.row()
+ row.prop(world, "use_sky_paper")
+ row.prop(world, "use_sky_blend")
+ row.prop(world, "use_sky_real")
row = layout.row()
row.column().prop(world, "horizon_color")
col = row.column()
col.prop(world, "zenith_color")
- col.active = world.blend_sky
+ col.active = world.use_sky_blend
row.column().prop(world, "ambient_color")
-class WORLD_PT_mist(WorldButtonsPanel):
- bl_label = "Mist"
- bl_default_closed = True
- COMPAT_ENGINES = {'BLENDER_RENDER'}
-
- def draw_header(self, context):
- world = context.world
-
- self.layout.prop(world.mist, "enabled", text="")
-
- def draw(self, context):
- layout = self.layout
- wide_ui = context.region.width > narrowui
- world = context.world
-
- layout.active = world.mist.enabled
-
- split = layout.split()
-
- col = split.column()
- col.prop(world.mist, "intensity", slider=True)
- col.prop(world.mist, "start")
-
- if wide_ui:
- col = split.column()
- col.prop(world.mist, "depth")
- col.prop(world.mist, "height")
-
- layout.prop(world.mist, "falloff")
-
-
-class WORLD_PT_stars(WorldButtonsPanel):
- bl_label = "Stars"
- bl_default_closed = True
- COMPAT_ENGINES = {'BLENDER_RENDER'}
-
- def draw_header(self, context):
- world = context.world
-
- self.layout.prop(world.stars, "enabled", text="")
-
- def draw(self, context):
- layout = self.layout
- wide_ui = context.region.width > narrowui
- world = context.world
-
- layout.active = world.stars.enabled
-
- split = layout.split()
-
- col = split.column()
- col.prop(world.stars, "size")
- col.prop(world.stars, "color_randomization", text="Colors")
-
- if wide_ui:
- col = split.column()
- col.prop(world.stars, "min_distance", text="Min. Dist")
- col.prop(world.stars, "average_separation", text="Separation")
-
-
-class WORLD_PT_ambient_occlusion(WorldButtonsPanel):
+class WORLD_PT_ambient_occlusion(WorldButtonsPanel, bpy.types.Panel):
bl_label = "Ambient Occlusion"
COMPAT_ENGINES = {'BLENDER_RENDER'}
def draw_header(self, context):
- light = context.world.lighting
+ light = context.world.light_settings
self.layout.prop(light, "use_ambient_occlusion", text="")
def draw(self, context):
layout = self.layout
- light = context.world.lighting
+ light = context.world.light_settings
layout.active = light.use_ambient_occlusion
split = layout.split()
split.prop(light, "ao_factor", text="Factor")
- split.prop(light, "ao_blend_mode", text="")
+ split.prop(light, "ao_blend_type", text="")
-class WORLD_PT_environment_lighting(WorldButtonsPanel):
+class WORLD_PT_environment_lighting(WorldButtonsPanel, bpy.types.Panel):
bl_label = "Environment Lighting"
COMPAT_ENGINES = {'BLENDER_RENDER'}
def draw_header(self, context):
- light = context.world.lighting
- self.layout.prop(light, "use_environment_lighting", text="")
+ light = context.world.light_settings
+ self.layout.prop(light, "use_environment_light", text="")
def draw(self, context):
layout = self.layout
- light = context.world.lighting
+ light = context.world.light_settings
- layout.active = light.use_environment_lighting
+ layout.active = light.use_environment_light
split = layout.split()
split.prop(light, "environment_energy", text="Energy")
split.prop(light, "environment_color", text="")
-class WORLD_PT_indirect_lighting(WorldButtonsPanel):
+class WORLD_PT_indirect_lighting(WorldButtonsPanel, bpy.types.Panel):
bl_label = "Indirect Lighting"
COMPAT_ENGINES = {'BLENDER_RENDER'}
+ @classmethod
+ def poll(cls, context):
+ light = getattr(context.world, "light_settings", None)
+ return light and light.gather_method == 'APPROXIMATE'
+
def draw_header(self, context):
- light = context.world.lighting
- self.layout.prop(light, "use_indirect_lighting", text="")
+ light = context.world.light_settings
+ self.layout.prop(light, "use_indirect_light", text="")
def draw(self, context):
layout = self.layout
- light = context.world.lighting
+ light = context.world.light_settings
- layout.active = light.use_indirect_lighting
+ layout.active = light.use_indirect_light
split = layout.split()
split.prop(light, "indirect_factor", text="Factor")
split.prop(light, "indirect_bounces", text="Bounces")
-class WORLD_PT_gather(WorldButtonsPanel):
+class WORLD_PT_gather(WorldButtonsPanel, bpy.types.Panel):
bl_label = "Gather"
COMPAT_ENGINES = {'BLENDER_RENDER'}
def draw(self, context):
layout = self.layout
- light = context.world.lighting
+ light = context.world.light_settings
- layout.active = light.use_ambient_occlusion or light.use_environment_lighting or light.use_indirect_lighting
+ layout.active = light.use_ambient_occlusion or light.use_environment_light or light.use_indirect_light
layout.prop(light, "gather_method", expand=True)
@@ -238,9 +172,9 @@ class WORLD_PT_gather(WorldButtonsPanel):
col.label(text="Attenuation:")
if light.gather_method == 'RAYTRACE':
col.prop(light, "distance")
- col.prop(light, "falloff")
+ col.prop(light, "use_falloff")
sub = col.row()
- sub.active = light.falloff
+ sub.active = light.use_falloff
sub.prop(light, "falloff_strength", text="Strength")
if light.gather_method == 'RAYTRACE':
@@ -263,35 +197,78 @@ class WORLD_PT_gather(WorldButtonsPanel):
col.label(text="Sampling:")
col.prop(light, "passes")
- col.prop(light, "error_tolerance", text="Error")
- col.prop(light, "pixel_cache")
+ col.prop(light, "error_threshold", text="Error")
+ col.prop(light, "use_cache")
col.prop(light, "correction")
-classes = [
- WORLD_PT_context_world,
- WORLD_PT_preview,
- WORLD_PT_world,
- WORLD_PT_ambient_occlusion,
- WORLD_PT_environment_lighting,
- WORLD_PT_indirect_lighting,
- WORLD_PT_gather,
- WORLD_PT_mist,
- WORLD_PT_stars,
+class WORLD_PT_mist(WorldButtonsPanel, bpy.types.Panel):
+ bl_label = "Mist"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
+
+ def draw_header(self, context):
+ world = context.world
+
+ self.layout.prop(world.mist_settings, "use_mist", text="")
+
+ def draw(self, context):
+ layout = self.layout
+ world = context.world
+
+ layout.active = world.mist_settings.use_mist
+
+ split = layout.split()
+
+ col = split.column()
+ col.prop(world.mist_settings, "intensity", slider=True)
+ col.prop(world.mist_settings, "start")
+
+ col = split.column()
+ col.prop(world.mist_settings, "depth")
+ col.prop(world.mist_settings, "height")
+
+ layout.prop(world.mist_settings, "falloff")
+
+
+class WORLD_PT_stars(WorldButtonsPanel, bpy.types.Panel):
+ bl_label = "Stars"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
+
+ def draw_header(self, context):
+ world = context.world
+
+ self.layout.prop(world.star_settings, "use_stars", text="")
+
+ def draw(self, context):
+ layout = self.layout
+ world = context.world
+
+ layout.active = world.star_settings.use_stars
+
+ split = layout.split()
- WORLD_PT_custom_props]
+ col = split.column()
+ col.prop(world.star_settings, "size")
+ col.prop(world.star_settings, "color_random", text="Colors")
+
+ col = split.column()
+ col.prop(world.star_settings, "distance_min", text="Min. Dist")
+ col.prop(world.star_settings, "average_separation", text="Separation")
+
+
+class WORLD_PT_custom_props(WorldButtonsPanel, PropertyPanel, bpy.types.Panel):
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+ _context_path = "world"
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/space_buttons.py b/release/scripts/ui/space_buttons.py
deleted file mode 100644
index 9fc30a8189b..00000000000
--- a/release/scripts/ui/space_buttons.py
+++ /dev/null
@@ -1,72 +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.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-# <pep8 compliant>
-import bpy
-
-
-class Buttons_HT_header(bpy.types.Header):
- bl_space_type = 'PROPERTIES'
-
- def draw(self, context):
- layout = self.layout
-
- so = context.space_data
- scene = context.scene
-
- row = layout.row(align=True)
- row.template_header()
-
- if context.area.show_menus:
- sub = row.row(align=True)
- sub.menu("Buttons_MT_view", text="View")
-
- row = layout.row()
- row.prop(so, "buttons_context", expand=True, text="")
- row.prop(scene, "frame_current")
-
-
-class Buttons_MT_view(bpy.types.Menu):
- bl_label = "View"
-
- def draw(self, context):
- layout = self.layout
- so = context.space_data
-
- col = layout.column()
- col.prop(so, "panel_alignment", expand=True)
-
-
-classes = [
- Buttons_HT_header,
- Buttons_MT_view]
-
-
-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_console.py b/release/scripts/ui/space_console.py
index 512af350a47..f2264a5c926 100644
--- a/release/scripts/ui/space_console.py
+++ b/release/scripts/ui/space_console.py
@@ -48,7 +48,7 @@ class CONSOLE_HT_header(bpy.types.Header):
row.prop(sc, "show_report_debug", text="Debug")
row.prop(sc, "show_report_info", text="Info")
row.prop(sc, "show_report_operator", text="Operators")
- row.prop(sc, "show_report_warn", text="Warnings")
+ row.prop(sc, "show_report_warning", text="Warnings")
row.prop(sc, "show_report_error", text="Errors")
row = layout.row()
@@ -138,7 +138,8 @@ class ConsoleAutocomplete(bpy.types.Operator):
bl_idname = "console.autocomplete"
bl_label = "Console Autocomplete"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return context.space_data.console_type != 'REPORT'
def execute(self, context):
@@ -196,31 +197,12 @@ class ConsoleLanguage(bpy.types.Operator):
return {'FINISHED'}
-classes = [
- CONSOLE_HT_header,
- CONSOLE_MT_console,
- CONSOLE_MT_report,
- CONSOLE_MT_language,
-
- # Stubs that call the language operators
- ConsoleExec,
- ConsoleAutocomplete,
- ConsoleBanner,
-
- # Set the language and call the banner
- ConsoleLanguage]
-
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/space_dopesheet.py b/release/scripts/ui/space_dopesheet.py
index 41917acd997..d4d613e05b9 100644
--- a/release/scripts/ui/space_dopesheet.py
+++ b/release/scripts/ui/space_dopesheet.py
@@ -21,6 +21,53 @@
import bpy
+def dopesheet_filter(layout, context):
+ dopesheet = context.space_data.dopesheet
+ is_nla = context.area.type == 'NLA_EDITOR'
+
+ row = layout.row(align=True)
+ row.prop(dopesheet, "show_only_selected", text="")
+ row.prop(dopesheet, "show_hidden", text="")
+
+ row = layout.row(align=True)
+ row.prop(dopesheet, "show_transforms", text="")
+
+ if is_nla:
+ row.prop(dopesheet, "show_missing_nla", text="")
+
+ row = layout.row(align=True)
+ row.prop(dopesheet, "show_scenes", text="")
+ row.prop(dopesheet, "show_worlds", text="")
+ row.prop(dopesheet, "show_nodes", text="")
+
+ if bpy.data.meshes:
+ row.prop(dopesheet, "show_meshes", text="")
+ if bpy.data.shape_keys:
+ row.prop(dopesheet, "show_shapekeys", text="")
+ if bpy.data.materials:
+ row.prop(dopesheet, "show_materials", text="")
+ if bpy.data.lamps:
+ row.prop(dopesheet, "show_lamps", text="")
+ if bpy.data.textures:
+ row.prop(dopesheet, "show_textures", text="")
+ if bpy.data.cameras:
+ row.prop(dopesheet, "show_cameras", text="")
+ if bpy.data.curves:
+ row.prop(dopesheet, "show_curves", text="")
+ if bpy.data.metaballs:
+ row.prop(dopesheet, "show_metaballs", text="")
+ if bpy.data.armatures:
+ row.prop(dopesheet, "show_armatures", text="")
+ if bpy.data.particles:
+ row.prop(dopesheet, "show_particles", text="")
+
+ if bpy.data.groups:
+ row = layout.row(align=True)
+ row.prop(dopesheet, "show_only_group_objects", text="")
+ if dopesheet.show_only_group_objects:
+ row.prop(dopesheet, "filter_group", text="")
+
+
class DOPESHEET_HT_header(bpy.types.Header):
bl_space_type = 'DOPESHEET_EDITOR'
@@ -48,15 +95,16 @@ class DOPESHEET_HT_header(bpy.types.Header):
sub.menu("DOPESHEET_MT_key")
layout.prop(st, "mode", text="")
- layout.prop(st.dopesheet, "display_summary", text="Summary")
+ layout.prop(st.dopesheet, "show_summary", text="Summary")
if st.mode == 'DOPESHEET':
- layout.template_dopesheet_filter(st.dopesheet)
+ dopesheet_filter(layout, context)
+
elif st.mode == 'ACTION':
layout.template_ID(st, "action", new="action.new")
if st.mode != 'GPENCIL':
- layout.prop(st, "autosnap", text="")
+ layout.prop(st, "auto_snap", text="")
row = layout.row(align=True)
row.operator("action.copy", text="", icon='COPYDOWN')
@@ -73,10 +121,10 @@ class DOPESHEET_MT_view(bpy.types.Menu):
layout.column()
- layout.prop(st, "realtime_updates")
- layout.prop(st, "show_cframe_indicator")
+ layout.prop(st, "use_realtime_update")
+ layout.prop(st, "show_frame_indicator")
layout.prop(st, "show_sliders")
- layout.prop(st, "automerge_keyframes")
+ layout.prop(st, "use_auto_merge_keyframes")
layout.prop(st, "use_marker_sync")
if st.show_seconds:
@@ -196,25 +244,12 @@ class DOPESHEET_MT_key_transform(bpy.types.Menu):
layout.operator("transform.transform", text="Scale").mode = 'TIME_SCALE'
-classes = [
- DOPESHEET_HT_header, # header/menu classes
- DOPESHEET_MT_view,
- DOPESHEET_MT_select,
- DOPESHEET_MT_channel,
- DOPESHEET_MT_key,
- DOPESHEET_MT_key_transform]
-
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/space_filebrowser.py b/release/scripts/ui/space_filebrowser.py
index 39bae6ca59b..b3ac0068c06 100644
--- a/release/scripts/ui/space_filebrowser.py
+++ b/release/scripts/ui/space_filebrowser.py
@@ -46,39 +46,31 @@ class FILEBROWSER_HT_header(bpy.types.Header):
row = layout.row(align=True)
row.operator("file.directory_new", text="", icon='NEWFOLDER')
- layout.prop(params, "display", expand=True, text="")
- layout.prop(params, "sort", expand=True, text="")
+ layout.prop(params, "display_type", expand=True, text="")
+ layout.prop(params, "sort_method", expand=True, text="")
- layout.prop(params, "hide_dot", text="Hide Invisible")
- layout.prop(params, "do_filter", text="", icon='FILTER')
+ layout.prop(params, "show_hidden")
+ layout.prop(params, "use_filter", text="", icon='FILTER')
row = layout.row(align=True)
- row.active = params.do_filter
+ row.active = params.use_filter
- row.prop(params, "filter_folder", text="")
- row.prop(params, "filter_blender", text="")
- row.prop(params, "filter_image", text="")
- row.prop(params, "filter_movie", text="")
- row.prop(params, "filter_script", text="")
- row.prop(params, "filter_font", text="")
- row.prop(params, "filter_sound", text="")
- row.prop(params, "filter_text", text="")
-
-
-classes = [
- FILEBROWSER_HT_header]
+ row.prop(params, "use_filter_folder", text="")
+ row.prop(params, "use_filter_blender", text="")
+ row.prop(params, "use_filter_image", text="")
+ row.prop(params, "use_filter_movie", text="")
+ row.prop(params, "use_filter_script", text="")
+ row.prop(params, "use_filter_font", text="")
+ row.prop(params, "use_filter_sound", text="")
+ row.prop(params, "use_filter_text", text="")
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/space_graph.py b/release/scripts/ui/space_graph.py
index b2a430eb7cd..9b08da801c9 100644
--- a/release/scripts/ui/space_graph.py
+++ b/release/scripts/ui/space_graph.py
@@ -25,6 +25,8 @@ class GRAPH_HT_header(bpy.types.Header):
bl_space_type = 'GRAPH_EDITOR'
def draw(self, context):
+ from space_dopesheet import dopesheet_filter
+
layout = self.layout
st = context.space_data
@@ -42,9 +44,9 @@ class GRAPH_HT_header(bpy.types.Header):
layout.prop(st, "mode", text="")
- layout.template_dopesheet_filter(st.dopesheet)
+ dopesheet_filter(layout, context)
- layout.prop(st, "autosnap", text="")
+ layout.prop(st, "auto_snap", text="")
layout.prop(st, "pivot_point", text="", icon_only=True)
row = layout.row(align=True)
@@ -71,19 +73,19 @@ class GRAPH_MT_view(bpy.types.Menu):
layout.operator("graph.properties", icon='MENU_PANEL')
layout.separator()
- layout.prop(st, "realtime_updates")
- layout.prop(st, "show_cframe_indicator")
+ layout.prop(st, "use_realtime_update")
+ layout.prop(st, "show_frame_indicator")
layout.prop(st, "show_cursor")
layout.prop(st, "show_sliders")
- layout.prop(st, "automerge_keyframes")
+ layout.prop(st, "use_auto_merge_keyframes")
layout.separator()
if st.show_handles:
layout.operator("graph.handles_view_toggle", icon='CHECKBOX_HLT', text="Show All Handles")
else:
layout.operator("graph.handles_view_toggle", icon='CHECKBOX_DEHLT', text="Show All Handles")
- layout.prop(st, "only_selected_curves_handles")
- layout.prop(st, "only_selected_keyframe_handles")
+ layout.prop(st, "use_only_selected_curves_handles")
+ layout.prop(st, "use_only_selected_keyframe_handles")
layout.operator("anim.time_toggle")
layout.separator()
@@ -126,7 +128,7 @@ class GRAPH_MT_select(bpy.types.Menu):
layout.separator()
layout.operator("graph.select_more")
layout.operator("graph.select_less")
-
+
layout.separator()
layout.operator("graph.select_linked")
@@ -204,25 +206,12 @@ class GRAPH_MT_key_transform(bpy.types.Menu):
layout.operator("transform.resize", text="Scale")
-classes = [
- GRAPH_HT_header, # header/menu classes
- GRAPH_MT_view,
- GRAPH_MT_select,
- GRAPH_MT_channel,
- GRAPH_MT_key,
- GRAPH_MT_key_transform]
-
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/space_image.py b/release/scripts/ui/space_image.py
index 1c48b99939d..bd59aaa42fa 100644
--- a/release/scripts/ui/space_image.py
+++ b/release/scripts/ui/space_image.py
@@ -19,7 +19,16 @@
# <pep8 compliant>
import bpy
-narrowui = 180
+
+class BrushButtonsPanel():
+ bl_space_type = 'IMAGE_EDITOR'
+ bl_region_type = 'UI'
+
+ @classmethod
+ def poll(cls, context):
+ sima = context.space_data
+ toolsettings = context.tool_settings.image_paint
+ return sima.show_paint and toolsettings.brush
class IMAGE_MT_view(bpy.types.Menu):
@@ -29,7 +38,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
@@ -39,9 +48,10 @@ class IMAGE_MT_view(bpy.types.Menu):
layout.separator()
- layout.prop(sima, "update_automatically")
+ layout.prop(sima, "use_realtime_update")
if show_uvedit:
- layout.prop(toolsettings, "uv_local_view") # Numpad /
+ layout.prop(toolsettings, "show_uv_local_view") # Numpad /
+ layout.prop(uv, "show_other_objects")
layout.separator()
@@ -111,6 +121,7 @@ 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")
@@ -127,13 +138,13 @@ class IMAGE_MT_image(bpy.types.Menu):
# only for dirty && specific image types, perhaps
# this could be done in operator poll too
- if ima.dirty:
+ if ima.is_dirty:
if ima.source in ('FILE', 'GENERATED') and ima.type != 'MULTILAYER':
layout.operator("image.pack", text="Pack As PNG").as_png = True
layout.separator()
- layout.prop(sima, "image_painting")
+ layout.prop(sima, "use_image_paint")
class IMAGE_MT_uvs_showhide(bpy.types.Menu):
@@ -143,8 +154,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):
@@ -206,12 +217,12 @@ class IMAGE_MT_uvs(bpy.types.Menu):
uv = sima.uv_editor
toolsettings = context.tool_settings
- layout.prop(uv, "snap_to_pixels")
- layout.prop(uv, "constrain_to_image_bounds")
+ layout.prop(uv, "use_snap_to_pixels")
+ layout.prop(uv, "lock_bounds")
layout.separator()
- layout.prop(uv, "live_unwrap")
+ layout.prop(uv, "use_live_unwrap")
layout.operator("uv.unwrap")
layout.operator("uv.pin", text="Unpin").clear = True
layout.operator("uv.pin")
@@ -233,8 +244,8 @@ class IMAGE_MT_uvs(bpy.types.Menu):
layout.separator()
- layout.prop_menu_enum(toolsettings, "proportional_editing")
- layout.prop_menu_enum(toolsettings, "proportional_editing_falloff")
+ layout.prop_menu_enum(toolsettings, "proportional_edit")
+ layout.prop_menu_enum(toolsettings, "proportional_edit_falloff")
layout.separator()
@@ -267,7 +278,7 @@ class IMAGE_HT_header(bpy.types.Header):
if show_uvedit:
sub.menu("IMAGE_MT_select")
- if ima and ima.dirty:
+ if ima and ima.is_dirty:
sub.menu("IMAGE_MT_image", text="Image*")
else:
sub.menu("IMAGE_MT_image", text="Image")
@@ -277,42 +288,42 @@ class IMAGE_HT_header(bpy.types.Header):
layout.template_ID(sima, "image", new="image.new")
if not show_render:
- layout.prop(sima, "image_pin", text="")
+ layout.prop(sima, "use_image_pin", text="")
# uv editing
if show_uvedit:
uvedit = sima.uv_editor
- layout.prop(uvedit, "pivot", text="", icon_only=True)
- layout.prop(toolsettings, "uv_sync_selection", text="")
+ layout.prop(uvedit, "pivot_point", text="", icon_only=True)
+ layout.prop(toolsettings, "use_uv_select_sync", text="")
- if toolsettings.uv_sync_selection:
+ if toolsettings.use_uv_select_sync:
row = layout.row(align=True)
- row.prop(toolsettings, "mesh_selection_mode", text="", index=0, icon='VERTEXSEL')
- row.prop(toolsettings, "mesh_selection_mode", text="", index=1, icon='EDGESEL')
- row.prop(toolsettings, "mesh_selection_mode", text="", index=2, icon='FACESEL')
+ row.prop(toolsettings, "mesh_select_mode", text="", index=0, icon='VERTEXSEL')
+ row.prop(toolsettings, "mesh_select_mode", text="", index=1, icon='EDGESEL')
+ row.prop(toolsettings, "mesh_select_mode", text="", index=2, icon='FACESEL')
else:
- layout.prop(toolsettings, "uv_selection_mode", text="", expand=True)
- layout.prop(uvedit, "sticky_selection_mode", text="", icon_only=True)
+ layout.prop(toolsettings, "uv_select_mode", text="", expand=True)
+ layout.prop(uvedit, "sticky_select_mode", text="", icon_only=True)
row = layout.row(align=True)
- row.prop(toolsettings, "proportional_editing", text="", icon_only=True)
- if toolsettings.proportional_editing != 'DISABLED':
- row.prop(toolsettings, "proportional_editing_falloff", text="", icon_only=True)
+ row.prop(toolsettings, "proportional_edit", text="", icon_only=True)
+ if toolsettings.proportional_edit != 'DISABLED':
+ row.prop(toolsettings, "proportional_edit_falloff", text="", icon_only=True)
row = layout.row(align=True)
- row.prop(toolsettings, "snap", text="")
+ row.prop(toolsettings, "use_snap", text="")
row.prop(toolsettings, "snap_element", text="", icon_only=True)
# mesh = context.edit_object.data
- # row.prop_object(mesh, "active_uv_layer", mesh, "uv_textures")
+ # row.prop_search(mesh.uv_textures, "active", mesh, "uv_textures")
if ima:
# layers
layout.template_image_layers(ima, iuser)
# painting
- layout.prop(sima, "image_painting", text="")
+ layout.prop(sima, "use_image_paint", text="")
# draw options
row = layout.row(align=True)
@@ -324,8 +335,8 @@ class IMAGE_HT_header(bpy.types.Header):
if ima.type == 'COMPOSITE' and ima.source in ('MOVIE', 'SEQUENCE'):
row.operator("image.play_composite", icon='PLAY')
- if show_uvedit or sima.image_painting:
- layout.prop(sima, "update_automatically", text="", icon_only=True, icon='LOCKED')
+ if show_uvedit or sima.use_image_paint:
+ layout.prop(sima, "use_realtime_update", text="", icon_only=True, icon='LOCKED')
class IMAGE_PT_image_properties(bpy.types.Panel):
@@ -333,7 +344,8 @@ class IMAGE_PT_image_properties(bpy.types.Panel):
bl_region_type = 'UI'
bl_label = "Image"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
sima = context.space_data
return (sima.image)
@@ -352,7 +364,8 @@ class IMAGE_PT_game_properties(bpy.types.Panel):
bl_region_type = 'UI'
bl_label = "Game Properties"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
rd = context.scene.render
sima = context.space_data
return (sima and sima.image) and (rd.engine == 'BLENDER_GAME')
@@ -362,32 +375,30 @@ class IMAGE_PT_game_properties(bpy.types.Panel):
sima = context.space_data
ima = sima.image
- wide_ui = context.region.width > narrowui
split = layout.split()
col = split.column()
sub = col.column(align=True)
- sub.prop(ima, "animated")
+ sub.prop(ima, "use_animation")
subsub = sub.column()
- subsub.active = ima.animated
- subsub.prop(ima, "animation_start", text="Start")
- subsub.prop(ima, "animation_end", text="End")
- subsub.prop(ima, "animation_speed", text="Speed")
+ subsub.active = ima.use_animation
+ subsub.prop(ima, "frame_start", text="Start")
+ subsub.prop(ima, "frame_end", text="End")
+ subsub.prop(ima, "fps", text="Speed")
- col.prop(ima, "tiles")
+ col.prop(ima, "use_tiles")
sub = col.column(align=True)
- sub.active = ima.tiles or ima.animated
+ sub.active = ima.tiles or ima.use_animation
sub.prop(ima, "tiles_x", text="X")
sub.prop(ima, "tiles_y", text="Y")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Clamp:")
- col.prop(ima, "clamp_x", text="X")
- col.prop(ima, "clamp_y", text="Y")
+ col.prop(ima, "use_clamp_x", text="X")
+ col.prop(ima, "use_clamp_y", text="Y")
col.separator()
col.prop(ima, "mapping", expand=True)
@@ -397,7 +408,8 @@ class IMAGE_PT_view_histogram(bpy.types.Panel):
bl_region_type = 'PREVIEW'
bl_label = "Histogram"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
sima = context.space_data
return (sima and sima.image)
@@ -406,7 +418,46 @@ 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"
+
+ @classmethod
+ def poll(cls, 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"
+
+ @classmethod
+ def poll(cls, 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):
@@ -414,7 +465,8 @@ class IMAGE_PT_sample_line(bpy.types.Panel):
bl_region_type = 'PREVIEW'
bl_label = "Sample Line"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
sima = context.space_data
return (sima and sima.image)
@@ -423,6 +475,28 @@ class IMAGE_PT_sample_line(bpy.types.Panel):
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"
+
+ @classmethod
+ def poll(cls, 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):
@@ -430,7 +504,8 @@ class IMAGE_PT_view_properties(bpy.types.Panel):
bl_region_type = 'UI'
bl_label = "Display"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
sima = context.space_data
return (sima and (sima.image or sima.show_uvedit))
@@ -441,7 +516,6 @@ class IMAGE_PT_view_properties(bpy.types.Panel):
ima = sima.image
show_uvedit = sima.show_uvedit
uvedit = sima.uv_editor
- wide_ui = context.region.width > narrowui
split = layout.split()
@@ -449,16 +523,15 @@ class IMAGE_PT_view_properties(bpy.types.Panel):
if ima:
col.prop(ima, "display_aspect", text="Aspect Ratio")
- if wide_ui:
- col = split.column()
+ col = split.column()
col.label(text="Coordinates:")
- col.prop(sima, "draw_repeated", text="Repeat")
+ col.prop(sima, "show_repeat", text="Repeat")
if show_uvedit:
- col.prop(uvedit, "normalized_coordinates", text="Normalized")
+ col.prop(uvedit, "show_normalized_coords", text="Normalized")
elif show_uvedit:
col.label(text="Coordinates:")
- col.prop(uvedit, "normalized_coordinates", text="Normalized")
+ col.prop(uvedit, "show_normalized_coords", text="Normalized")
if show_uvedit:
@@ -468,23 +541,19 @@ class IMAGE_PT_view_properties(bpy.types.Panel):
col = layout.column()
col.label(text="UVs:")
row = col.row()
- if wide_ui:
- row.prop(uvedit, "edge_draw_type", expand=True)
- else:
- row.prop(uvedit, "edge_draw_type", text="")
+ row.prop(uvedit, "edge_draw_type", expand=True)
split = layout.split()
col = split.column()
- col.prop(uvedit, "draw_smooth_edges", text="Smooth")
- col.prop(uvedit, "draw_modified_edges", text="Modified")
- #col.prop(uvedit, "draw_edges")
- #col.prop(uvedit, "draw_faces")
-
- if wide_ui:
- col = split.column()
- col.prop(uvedit, "draw_stretch", text="Stretch")
+ col.prop(uvedit, "show_smooth_edges", text="Smooth")
+ col.prop(uvedit, "show_modified_edges", text="Modified")
+ #col.prop(uvedit, "show_edges")
+ #col.prop(uvedit, "show_faces")
+
+ col = split.column()
+ col.prop(uvedit, "show_stretch", text="Stretch")
sub = col.column()
- sub.active = uvedit.draw_stretch
+ sub.active = uvedit.show_stretch
sub.row().prop(uvedit, "draw_stretch_type", expand=True)
@@ -493,7 +562,8 @@ class IMAGE_PT_paint(bpy.types.Panel):
bl_region_type = 'UI'
bl_label = "Paint"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
sima = context.space_data
return sima.show_paint
@@ -502,22 +572,10 @@ class IMAGE_PT_paint(bpy.types.Panel):
toolsettings = context.tool_settings.image_paint
brush = toolsettings.brush
- wide_ui = context.region.width > narrowui
col = layout.split().column()
row = col.row()
- row.template_list(toolsettings, "brushes", toolsettings, "active_brush_index", rows=2)
-
- col.template_ID(toolsettings, "brush", new="brush.add")
-
- if wide_ui:
- sub = layout.row(align=True)
- else:
- sub = layout.column(align=True)
- sub.prop_enum(brush, "imagepaint_tool", 'DRAW')
- sub.prop_enum(brush, "imagepaint_tool", 'SOFTEN')
- sub.prop_enum(brush, "imagepaint_tool", 'CLONE')
- sub.prop_enum(brush, "imagepaint_tool", 'SMEAR')
+ col.template_ID_preview(toolsettings, "brush", new="brush.add", rows=3, cols=8)
if brush:
col = layout.column()
@@ -526,15 +584,15 @@ class IMAGE_PT_paint(bpy.types.Panel):
row = col.row(align=True)
row.prop(brush, "size", slider=True)
- row.prop(brush, "use_size_pressure", toggle=True, text="")
+ row.prop(brush, "use_pressure_size", toggle=True, text="")
row = col.row(align=True)
row.prop(brush, "strength", slider=True)
- row.prop(brush, "use_strength_pressure", toggle=True, text="")
+ row.prop(brush, "use_pressure_strength", toggle=True, text="")
row = col.row(align=True)
row.prop(brush, "jitter", slider=True)
- row.prop(brush, "use_jitter_pressure", toggle=True, text="")
+ row.prop(brush, "use_pressure_jitter", toggle=True, text="")
col.prop(brush, "blend", text="Blend")
@@ -544,16 +602,26 @@ class IMAGE_PT_paint(bpy.types.Panel):
col.prop(brush, "clone_alpha", text="Alpha")
-class IMAGE_PT_paint_stroke(bpy.types.Panel):
- bl_space_type = 'IMAGE_EDITOR'
- bl_region_type = 'UI'
- bl_label = "Paint Stroke"
- bl_default_closed = True
+class IMAGE_PT_tools_brush_texture(BrushButtonsPanel, bpy.types.Panel):
+ bl_label = "Texture"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ def draw(self, context):
+ layout = self.layout
- def poll(self, context):
- sima = context.space_data
toolsettings = context.tool_settings.image_paint
- return sima.show_paint and toolsettings.brush
+ brush = toolsettings.brush
+
+# tex_slot = brush.texture_slot
+
+ col = layout.column()
+
+ col.template_ID_preview(brush, "texture", new="texture.new", rows=3, cols=8)
+
+
+class IMAGE_PT_paint_stroke(BrushButtonsPanel, bpy.types.Panel):
+ bl_label = "Paint Stroke"
+ bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
layout = self.layout
@@ -570,21 +638,14 @@ class IMAGE_PT_paint_stroke(bpy.types.Panel):
row = layout.row(align=True)
row.active = brush.use_space
row.prop(brush, "spacing", text="Distance", slider=True)
- row.prop(brush, "use_spacing_pressure", toggle=True, text="")
+ row.prop(brush, "use_pressure_spacing", toggle=True, text="")
layout.prop(brush, "use_wrap")
-class IMAGE_PT_paint_curve(bpy.types.Panel):
- bl_space_type = 'IMAGE_EDITOR'
- bl_region_type = 'UI'
+class IMAGE_PT_paint_curve(BrushButtonsPanel, bpy.types.Panel):
bl_label = "Paint Curve"
- bl_default_closed = True
-
- def poll(self, context):
- sima = context.space_data
- toolsettings = context.tool_settings.image_paint
- return sima.show_paint and toolsettings.brush
+ bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
layout = self.layout
@@ -593,40 +654,21 @@ class IMAGE_PT_paint_curve(bpy.types.Panel):
brush = toolsettings.brush
layout.template_curve_mapping(brush, "curve")
- layout.operator_menu_enum("brush.curve_preset", "shape")
-
-
-classes = [
- IMAGE_MT_view,
- IMAGE_MT_select,
- IMAGE_MT_image,
- IMAGE_MT_uvs_showhide,
- IMAGE_MT_uvs_transform,
- IMAGE_MT_uvs_snap,
- IMAGE_MT_uvs_mirror,
- IMAGE_MT_uvs_weldalign,
- IMAGE_MT_uvs,
- IMAGE_HT_header,
- IMAGE_PT_image_properties,
- IMAGE_PT_paint,
- IMAGE_PT_paint_stroke,
- IMAGE_PT_paint_curve,
- IMAGE_PT_game_properties,
- IMAGE_PT_view_properties,
- IMAGE_PT_view_histogram,
- IMAGE_PT_sample_line]
+ 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'
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/space_info.py b/release/scripts/ui/space_info.py
index 0683a3cb763..13045d5de6d 100644
--- a/release/scripts/ui/space_info.py
+++ b/release/scripts/ui/space_info.py
@@ -27,10 +27,6 @@ class INFO_HT_header(bpy.types.Header):
layout = self.layout
wm = context.manager
- if wm and len(wm.operators):
- last_op = wm.operators[-1]
- else:
- last_op = None
window = context.window
scene = context.scene
rd = scene.render
@@ -48,7 +44,7 @@ class INFO_HT_header(bpy.types.Header):
sub.menu("INFO_MT_render")
sub.menu("INFO_MT_help")
- if window.screen.fullscreen:
+ if window.screen.show_fullscreen:
layout.operator("screen.back_to_previous", icon='SCREEN_BACK', text="Back to Previous")
layout.separator()
else:
@@ -58,17 +54,16 @@ class INFO_HT_header(bpy.types.Header):
layout.separator()
- if rd.multiple_engines:
+ if rd.has_multiple_engines:
layout.prop(rd, "engine", text="")
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 +80,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()
@@ -94,6 +89,8 @@ class INFO_MT_file(bpy.types.Menu):
layout.operator("wm.save_mainfile", text="Save", icon='FILE_TICK').check_existing = False
layout.operator_context = 'INVOKE_AREA'
layout.operator("wm.save_as_mainfile", text="Save As...")
+ layout.operator_context = 'INVOKE_AREA'
+ layout.operator("wm.save_as_mainfile", text="Save Copy...").copy = True
layout.separator()
@@ -106,7 +103,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,33 +122,12 @@ 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"
def draw(self, context):
- if "collada_import" in dir(bpy.ops.wm):
+ if hasattr(bpy.types, "WM_OT_collada_import"):
self.layout.operator("wm.collada_import", text="COLLADA (.dae)")
@@ -158,7 +136,7 @@ class INFO_MT_file_export(bpy.types.Menu):
bl_label = "Export"
def draw(self, context):
- if "collada_export" in dir(bpy.ops.wm):
+ if hasattr(bpy.types, "WM_OT_collada_export"):
self.layout.operator("wm.collada_export", text="COLLADA (.dae)")
@@ -198,6 +176,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,8 +226,10 @@ 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.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()
@@ -243,7 +252,7 @@ class INFO_MT_add(bpy.types.Menu):
layout.operator_context = 'INVOKE_DEFAULT'
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):
@@ -252,7 +261,7 @@ class INFO_MT_game(bpy.types.Menu):
def draw(self, context):
layout = self.layout
- gs = context.scene.game_data
+ gs = context.scene.game_settings
layout.operator("view3d.game_start")
@@ -264,7 +273,7 @@ class INFO_MT_game(bpy.types.Menu):
layout.prop(gs, "use_deprecation_warnings")
layout.prop(gs, "use_animation_record")
layout.separator()
- layout.prop(gs, "auto_start")
+ layout.prop(gs, "use_auto_start")
class INFO_MT_render(bpy.types.Menu):
@@ -295,19 +304,19 @@ 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")
@@ -316,73 +325,9 @@ class INFO_MT_help(bpy.types.Menu):
# 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.blender.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 = []
@@ -405,41 +350,13 @@ class HELP_OT_operator_cheat_sheet(bpy.types.Operator):
return {'FINISHED'}
-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_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]
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/space_logic.py b/release/scripts/ui/space_logic.py
index 07b26fdc862..1272a5db9d1 100644
--- a/release/scripts/ui/space_logic.py
+++ b/release/scripts/ui/space_logic.py
@@ -25,7 +25,8 @@ class LOGIC_PT_properties(bpy.types.Panel):
bl_region_type = 'UI'
bl_label = "Properties"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
ob = context.active_object
return ob and ob.game
@@ -35,32 +36,65 @@ 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.prop(prop, "show_debug", text="", toggle=True, icon='INFO')
+ row.operator("object.game_property_remove", text="", icon='X', emboss=False).index = i
-classes = [
- LOGIC_PT_properties]
+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")
+
+
+class LOGIC_HT_header(bpy.types.Header):
+ bl_space_type = 'LOGIC_EDITOR'
+
+ def draw(self, context):
+ layout = self.layout
+
+ st = context.space_data
+
+ row = layout.row(align=True)
+ row.template_header()
+
+ if context.area.show_menus:
+ sub = row.row(align=True)
+ sub.menu("LOGIC_MT_view")
+ #sub.menu("LOGIC_MT_select")
+ #sub.menu("LOGIC_MT_add")
+
+
+class LOGIC_MT_view(bpy.types.Menu):
+ bl_label = "View"
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.column()
+
+ layout.operator("logic.properties", icon='MENU_PANEL')
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/space_nla.py b/release/scripts/ui/space_nla.py
index 0eb342d4b15..3b187d707ec 100644
--- a/release/scripts/ui/space_nla.py
+++ b/release/scripts/ui/space_nla.py
@@ -25,6 +25,8 @@ class NLA_HT_header(bpy.types.Header):
bl_space_type = 'NLA_EDITOR'
def draw(self, context):
+ from space_dopesheet import dopesheet_filter
+
layout = self.layout
st = context.space_data
@@ -40,9 +42,9 @@ class NLA_HT_header(bpy.types.Header):
sub.menu("NLA_MT_edit")
sub.menu("NLA_MT_add")
- layout.template_dopesheet_filter(st.dopesheet)
+ dopesheet_filter(layout, context)
- layout.prop(st, "autosnap", text="")
+ layout.prop(st, "auto_snap", text="")
class NLA_MT_view(bpy.types.Menu):
@@ -59,8 +61,8 @@ class NLA_MT_view(bpy.types.Menu):
layout.separator()
- layout.prop(st, "realtime_updates")
- layout.prop(st, "show_cframe_indicator")
+ layout.prop(st, "use_realtime_update")
+ layout.prop(st, "show_frame_indicator")
layout.operator("anim.time_toggle", text="Show Frames" if st.show_seconds else "Show Seconds")
@@ -122,7 +124,7 @@ class NLA_MT_edit(bpy.types.Menu):
layout.separator()
# TODO: names of these tools for 'tweakmode' need changing?
- if scene.nla_tweakmode_on:
+ if scene.is_nla_tweakmode:
layout.operator("nla.tweakmode_exit", text="Stop Tweaking Strip Actions")
else:
layout.operator("nla.tweakmode_enter", text="Start Tweaking Strip Actions")
@@ -159,25 +161,12 @@ class NLA_MT_edit_transform(bpy.types.Menu):
layout.operator("transform.resize", text="Scale")
-classes = [
- NLA_HT_header, # header/menu classes
- NLA_MT_view,
- NLA_MT_select,
- NLA_MT_edit,
- NLA_MT_add,
- NLA_MT_edit_transform]
-
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/space_node.py b/release/scripts/ui/space_node.py
index 9f6b127347b..cd1425ee122 100644
--- a/release/scripts/ui/space_node.py
+++ b/release/scripts/ui/space_node.py
@@ -66,8 +66,12 @@ class NODE_HT_header(bpy.types.Header):
scene = snode.id
layout.prop(scene, "use_nodes")
- layout.prop(scene.render, "free_unused_nodes", text="Free Unused")
- layout.prop(snode, "backdrop")
+ layout.prop(scene.render, "use_free_unused_nodes", text="Free Unused")
+ layout.prop(snode, "show_backdrop")
+
+ layout.separator()
+
+ layout.template_running_jobs()
class NODE_MT_view(bpy.types.Menu):
@@ -86,6 +90,13 @@ class NODE_MT_view(bpy.types.Menu):
layout.operator("node.view_all")
+ if context.space_data.show_backdrop:
+ layout.separator()
+
+ layout.operator("node.backimage_move",text = "Backdrop move")
+ layout.operator("node.backimage_zoom",text = "Backdrop zoom in").factor = 1.2
+ layout.operator("node.backimage_zoom",text = "Backdrop zoom out").factor = 0.833
+
layout.separator()
layout.operator("screen.area_dupli")
@@ -104,6 +115,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):
@@ -124,6 +138,7 @@ class NODE_MT_node(bpy.types.Menu):
layout.separator()
layout.operator("node.link_make")
layout.operator("node.link_make", text="Make and Replace Links").replace = True
+ layout.operator("node.links_cut")
layout.separator()
layout.operator("node.group_edit")
@@ -132,8 +147,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")
@@ -143,23 +160,12 @@ class NODE_MT_node(bpy.types.Menu):
layout.operator("node.show_cyclic_dependencies")
-classes = [
- NODE_HT_header,
- NODE_MT_view,
- NODE_MT_select,
- NODE_MT_node]
-
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/space_outliner.py b/release/scripts/ui/space_outliner.py
index d5bb35baa6c..38e749c4a75 100644
--- a/release/scripts/ui/space_outliner.py
+++ b/release/scripts/ui/space_outliner.py
@@ -28,7 +28,7 @@ class OUTLINER_HT_header(bpy.types.Header):
space = context.space_data
scene = context.scene
- ks = context.scene.active_keying_set
+ ks = context.scene.keying_sets.active
row = layout.row(align=True)
row.template_header()
@@ -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, "filter_text", icon='VIEWZOOM', text="")
+
layout.separator()
if space.display_mode == 'DATABLOCKS':
@@ -50,7 +53,7 @@ class OUTLINER_HT_header(bpy.types.Header):
if ks:
row = layout.row(align=False)
- row.prop_object(scene, "active_keying_set", scene, "keying_sets", text="")
+ row.prop_search(scene.keying_sets, "active", scene, "keying_sets", text="")
row = layout.row(align=True)
row.operator("anim.keyframe_insert", text="", icon='KEY_HLT')
@@ -70,7 +73,7 @@ class OUTLINER_MT_view(bpy.types.Menu):
col = layout.column()
if space.display_mode not in ('DATABLOCKS', 'USER_PREFERENCES', 'KEYMAPS'):
- col.prop(space, "show_restriction_columns")
+ col.prop(space, "show_restrict_columns")
col.separator()
col.operator("outliner.show_active")
@@ -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, "use_filter_case_sensitive")
+ col.prop(space, "use_filter_complete")
+
+
class OUTLINER_MT_edit_datablocks(bpy.types.Menu):
bl_label = "Edit"
@@ -100,22 +117,12 @@ class OUTLINER_MT_edit_datablocks(bpy.types.Menu):
col.operator("outliner.drivers_delete_selected")
-classes = [
- OUTLINER_HT_header,
- OUTLINER_MT_view,
- OUTLINER_MT_edit_datablocks]
-
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/space_sequencer.py b/release/scripts/ui/space_sequencer.py
index 4680c5c1d19..ec607629757 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"
@@ -90,6 +98,10 @@ class SEQUENCER_MT_view(bpy.types.Menu):
st = context.space_data
layout.column()
+
+ layout.operator("sequencer.properties", icon='MENU_PANEL')
+
+ layout.separator()
"""
uiBlock *block= uiBeginBlock(C, ar, "seq_viewmenu", UI_EMBOSSP);
@@ -119,21 +131,24 @@ class SEQUENCER_MT_view(bpy.types.Menu):
menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
"""
- layout.separator()
if (st.view_type == 'SEQUENCER') or (st.view_type == 'SEQUENCER_PREVIEW'):
layout.operator("sequencer.view_all", text='View all Sequences')
if (st.view_type == 'PREVIEW') or (st.view_type == 'SEQUENCER_PREVIEW'):
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")
- layout.prop(st, "show_cframe_indicator")
+ layout.prop(st, "show_frames")
+ layout.prop(st, "show_frame_indicator")
if st.display_mode == 'IMAGE':
- layout.prop(st, "draw_safe_margin")
+ layout.prop(st, "show_safe_margin")
if st.display_mode == 'WAVEFORM':
- layout.prop(st, "separate_color_preview")
+ layout.prop(st, "show_separate_color")
layout.separator()
layout.prop(st, "use_marker_sync")
@@ -217,6 +232,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):
@@ -236,6 +252,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")
@@ -245,7 +262,7 @@ class SEQUENCER_MT_strip(bpy.types.Menu):
if strip:
stype = strip.type
-
+
# XXX note strip.type is never equal to 'EFFECT', look at seq_type_items within rna_sequencer.c
if stype == 'EFFECT':
pass
@@ -277,6 +294,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")
@@ -289,35 +307,45 @@ 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):
+class SequencerButtonsPanel():
bl_space_type = 'SEQUENCE_EDITOR'
bl_region_type = 'UI'
- def has_sequencer(self, context):
+ @staticmethod
+ def has_sequencer(context):
return (context.space_data.view_type == 'SEQUENCER') or (context.space_data.view_type == 'SEQUENCER_PREVIEW')
- def poll(self, context):
- return self.has_sequencer(context) and (act_strip(context) is not None)
+ @classmethod
+ def poll(cls, context):
+ return cls.has_sequencer(context) and (act_strip(context) is not None)
-class SequencerButtonsPanel_Output(bpy.types.Panel):
+class SequencerButtonsPanel_Output():
bl_space_type = 'SEQUENCE_EDITOR'
bl_region_type = 'UI'
- def has_preview(self, context):
+ @staticmethod
+ def has_preview(context):
return (context.space_data.view_type == 'PREVIEW') or (context.space_data.view_type == 'SEQUENCER_PREVIEW')
- def poll(self, context):
- return self.has_preview(context)
+ @classmethod
+ def poll(cls, context):
+ return cls.has_preview(context)
-class SEQUENCER_PT_edit(SequencerButtonsPanel):
+class SEQUENCER_PT_edit(SequencerButtonsPanel, bpy.types.Panel):
bl_label = "Edit Strip"
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)
@@ -330,69 +358,39 @@ class SEQUENCER_PT_edit(SequencerButtonsPanel):
split = layout.split(percentage=0.3)
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="")
+ split.prop(strip, "blend_type", 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.prop(strip, "blend_alpha", text="Opacity", slider=True)
+ 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, "frame_start")
- subrow = col.split(percentage=0.66)
- subrow.prop(strip, "length")
- subrow.label(text="%.2f sec" % (strip.length / (render.fps / render.fps_base)))
-
- col = layout.column(align=True)
- col.label(text="Offset:")
- col.prop(strip, "frame_offset_start", text="Start")
- col.prop(strip, "frame_offset_end", text="End")
+ sub = col.column()
+ sub.enabled = not strip.lock
+ sub.prop(strip, "channel")
+ sub.prop(strip, "frame_start")
+ sub.prop(strip, "frame_final_duration")
col = layout.column(align=True)
- col.label(text="Still:")
- col.prop(strip, "frame_still_start", text="Start")
- col.prop(strip, "frame_still_end", text="End")
+ row = col.row()
+ row.label(text="Final Length: %s" % bpy.utils.smpte_from_frame(strip.frame_final_duration))
+ row = col.row()
+ row.active = (frame_current >= strip.frame_start and frame_current <= strip.frame_start + strip.frame_duration)
+ row.label(text="Playhead: %d" % (frame_current - strip.frame_start))
+ 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):
+class SEQUENCER_PT_effect(SequencerButtonsPanel, bpy.types.Panel):
bl_label = "Effect Strip"
- def poll(self, context):
- if not self.has_sequencer(context):
+ @classmethod
+ def poll(cls, context):
+ if not cls.has_sequencer(context):
return False
strip = act_strip(context)
@@ -402,7 +400,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
@@ -429,31 +428,58 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel):
flow.prop(strip, "threshold", slider=True)
flow.prop(strip, "clamp", slider=True)
flow.prop(strip, "boost_factor")
- flow.prop(strip, "blur_distance")
+ flow.prop(strip, "blur_radius")
row = layout.row()
row.prop(strip, "quality", slider=True)
- row.prop(strip, "only_boost")
+ row.prop(strip, "use_only_boost")
elif strip.type == 'SPEED':
layout.prop(strip, "global_speed")
flow = layout.column_flow()
- flow.prop(strip, "curve_velocity")
- flow.prop(strip, "curve_compress_y")
- flow.prop(strip, "frame_blending")
+ flow.prop(strip, "use_curve_velocity")
+ flow.prop(strip, "use_curve_compress_y")
+ flow.prop(strip, "use_frame_blend")
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
+
+ sub.operator("screen.animation_play", text="", icon='PAUSE' if context.screen.is_animation_playing else 'PLAY')
+
+ 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':
col.prop(strip, "speed_fader", text="Speed fader")
elif strip.type in ('CROSS', 'GAMMA_CROSS', 'PLUGIN', 'WIPE'):
- col.prop(strip, "use_effect_default_fade", "Default fade")
- if not strip.use_effect_default_fade:
+ col.prop(strip, "use_default_fade", "Default fade")
+ if not strip.use_default_fade:
col.prop(strip, "effect_fader", text="Effect fader")
+
+ layout.prop(strip, "use_translation", text="Image Offset:")
+ if strip.use_translation:
+ col = layout.column(align=True)
+ 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.use_crop:
+ col = layout.column(align=True)
+ col.prop(strip.crop, "max_y")
+ col.prop(strip.crop, "min_x")
+ col.prop(strip.crop, "min_y")
+ col.prop(strip.crop, "max_x")
def draw_panel_transform(self, strip):
layout = self.layout
@@ -469,8 +495,8 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel):
layout.separator()
col = layout.column(align=True)
- col.prop(strip, "uniform_scale")
- if (strip.uniform_scale):
+ col.prop(strip, "use_uniform_scale")
+ if (strip.use_uniform_scale):
col = layout.column(align=True)
col.prop(strip, "scale_start_x", text="Scale")
else:
@@ -486,116 +512,87 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel):
col.prop(strip, "rotation_start", text="Rotation")
-class SEQUENCER_PT_input(SequencerButtonsPanel):
+class SEQUENCER_PT_input(SequencerButtonsPanel, bpy.types.Panel):
bl_label = "Strip Input"
- def poll(self, context):
- if not self.has_sequencer(context):
+ @classmethod
+ def poll(cls, context):
+ if not cls.has_sequencer(context):
return False
strip = act_strip(context)
if not strip:
return False
- return strip.type in ('MOVIE', 'IMAGE')
-
- def draw_filename(self, context):
- pass
+ 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
strip = act_strip(context)
- self.draw_filename(context)
+ seq_type = strip.type
+
+ # draw a filename if we have one
+ if seq_type == 'IMAGE':
+ split = layout.split(percentage=0.2)
+ col = split.column()
+ col.label(text="Path:")
+ col = split.column()
+ col.prop(strip, "directory", text="")
+
+ # Current element for the filename
+
+ elem = strip.getStripElem(context.scene.frame_current)
+ if elem:
+ split = layout.split(percentage=0.2)
+ col = split.column()
+ col.label(text="File:")
+ col = split.column()
+ col.prop(elem, "filename", text="") # strip.elements[0] could be a fallback
+
+ elif seq_type == 'MOVIE':
+ split = layout.split(percentage=0.2)
+ col = split.column()
+ col.label(text="Path:")
+ col = split.column()
+ col.prop(strip, "filepath", text="")
+ col.prop(strip, "mpeg_preseek", text="MPEG Preseek")
+ # TODO, sound???
+ # end drawing filename
+
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")
- col.prop(strip.crop, "right")
+ col.prop(strip.crop, "max_y")
+ col.prop(strip.crop, "min_x")
+ col.prop(strip.crop, "min_y")
+ col.prop(strip.crop, "max_x")
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_input_movie(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 == 'MOVIE'
-
- def draw_filename(self, context):
- layout = self.layout
-
- strip = act_strip(context)
-
- split = layout.split(percentage=0.2)
- col = split.column()
- col.label(text="Path:")
- col = split.column()
- col.prop(strip, "filepath", text="")
-
-
-class SEQUENCER_PT_input_image(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 == 'IMAGE'
-
- def draw_filename(self, context):
- layout = self.layout
-
- strip = act_strip(context)
-
- split = layout.split(percentage=0.2)
- col = split.column()
- col.label(text="Path:")
- col = split.column()
- col.prop(strip, "directory", text="")
-
- # Current element for the filename
-
- elem = strip.getStripElem(context.scene.frame_current)
- if elem:
- split = layout.split(percentage=0.2)
- col = split.column()
- col.label(text="File:")
- col = split.column()
- col.prop(elem, "filename", text="") # strip.elements[0] could be a fallback
+ col.prop(strip, "frame_offset_start", text="Start")
+ col.prop(strip, "frame_offset_end", text="End")
-class SEQUENCER_PT_sound(SequencerButtonsPanel):
+class SEQUENCER_PT_sound(SequencerButtonsPanel, bpy.types.Panel):
bl_label = "Sound"
- def poll(self, context):
- if not self.has_sequencer(context):
+ @classmethod
+ def poll(cls, context):
+ if not cls.has_sequencer(context):
return False
strip = act_strip(context)
@@ -620,16 +617,23 @@ class SEQUENCER_PT_sound(SequencerButtonsPanel):
else:
row.operator("sound.pack", icon='UGLYPACKAGE', text="Pack")
- row.prop(strip.sound, "caching")
+ row.prop(strip.sound, "use_memory_cache")
layout.prop(strip, "volume")
+ layout.prop(strip, "attenuation")
+
+ col = layout.column(align=True)
+ col.label(text="Trim Duration:")
+ col.prop(strip, "animation_offset_start", text="Start")
+ col.prop(strip, "animation_offset_end", text="End")
-class SEQUENCER_PT_scene(SequencerButtonsPanel):
+class SEQUENCER_PT_scene(SequencerButtonsPanel, bpy.types.Panel):
bl_label = "Scene"
- def poll(self, context):
- if not self.has_sequencer(context):
+ @classmethod
+ def poll(cls, context):
+ if not cls.has_sequencer(context):
return False
strip = act_strip(context)
@@ -649,18 +653,24 @@ class SEQUENCER_PT_scene(SequencerButtonsPanel):
layout.template_ID(strip, "scene_camera")
-class SEQUENCER_PT_filter(SequencerButtonsPanel):
+class SEQUENCER_PT_filter(SequencerButtonsPanel, bpy.types.Panel):
bl_label = "Filter"
- def poll(self, context):
- if not self.has_sequencer(context):
+ @classmethod
+ def poll(cls, context):
+ if not cls.has_sequencer(context):
return False
strip = act_strip(context)
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
@@ -670,50 +680,54 @@ class SEQUENCER_PT_filter(SequencerButtonsPanel):
col = layout.column()
col.label(text="Video:")
col.prop(strip, "strobe")
- col.prop(strip, "de_interlace")
+
+ row = layout.row()
+ row.label(text="Flip:")
+ row.prop(strip, "use_flip_x", text="X")
+ row.prop(strip, "use_flip_y", text="Y")
col = layout.column()
- col.label(text="Colors:")
- col.prop(strip, "multiply_colors", text="Multiply")
- col.prop(strip, "premultiply")
- col.prop(strip, "convert_float")
+ col.prop(strip, "use_reverse_frames", text="Backwards")
+ col.prop(strip, "use_deinterlace")
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")
+ col.label(text="Colors:")
+ col.prop(strip, "color_saturation", text="Saturation")
+ col.prop(strip, "color_multiply", text="Multiply")
+ col.prop(strip, "use_premultiply")
+ col.prop(strip, "use_float")
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.prop(strip.color_balance, "invert_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.prop(strip.color_balance, "invert_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")
+ col.prop(strip.color_balance, "invert_gain", text="Inverse")
-class SEQUENCER_PT_proxy(SequencerButtonsPanel):
+class SEQUENCER_PT_proxy(SequencerButtonsPanel, bpy.types.Panel):
bl_label = "Proxy"
- def poll(self, context):
- if not self.has_sequencer(context):
+ @classmethod
+ def poll(cls, context):
+ if not cls.has_sequencer(context):
return False
strip = act_strip(context)
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)
@@ -726,58 +740,61 @@ class SEQUENCER_PT_proxy(SequencerButtonsPanel):
strip = act_strip(context)
flow = layout.column_flow()
- flow.prop(strip, "proxy_custom_directory")
+ flow.prop(strip, "use_proxy_custom_directory")
+ flow.prop(strip, "use_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.use_proxy_custom_file:
+ flow.prop(strip.proxy, "directory")
+ if strip.use_proxy_custom_file:
+ flow.prop(strip.proxy, "filepath")
-class SEQUENCER_PT_view(SequencerButtonsPanel_Output):
- bl_label = "View Settings"
+class SEQUENCER_PT_preview(SequencerButtonsPanel_Output, 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
- st = context.space_data
+ 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.prop(st, "draw_overexposed") # text="Zebra"
- col.prop(st, "draw_safe_margin")
+ col.active = render.use_sequencer_gl_render
+ col.prop(render, "sequencer_gl_render", text="")
+ '''
-classes = [
- SEQUENCER_HT_header, # header/menu classes
- SEQUENCER_MT_view,
- SEQUENCER_MT_view_toggle,
- SEQUENCER_MT_select,
- SEQUENCER_MT_marker,
- SEQUENCER_MT_add,
- SEQUENCER_MT_add_effect,
- SEQUENCER_MT_strip,
+class SEQUENCER_PT_view(SequencerButtonsPanel_Output, bpy.types.Panel):
+ bl_label = "View Settings"
- SEQUENCER_PT_edit, # sequencer panels
- SEQUENCER_PT_preview,
- SEQUENCER_PT_effect,
- SEQUENCER_PT_input_movie,
- SEQUENCER_PT_input_image,
- SEQUENCER_PT_sound,
- SEQUENCER_PT_scene,
- SEQUENCER_PT_filter,
- SEQUENCER_PT_proxy,
+ def draw(self, context):
+ layout = self.layout
- SEQUENCER_PT_view] # view panels
+ st = context.space_data
+ col = layout.column()
+ if st.display_mode == 'IMAGE':
+ col.prop(st, "draw_overexposed") # text="Zebra"
+ col.prop(st, "show_safe_margin")
+ if st.display_mode == 'WAVEFORM':
+ col.prop(st, "show_separate_color")
+ col.prop(st, "proxy_render_size")
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/space_text.py b/release/scripts/ui/space_text.py
index 9f52ae25121..0b7e215dc37 100644
--- a/release/scripts/ui/space_text.py
+++ b/release/scripts/ui/space_text.py
@@ -34,12 +34,13 @@ class TEXT_HT_header(bpy.types.Header):
if context.area.show_menus:
sub = row.row(align=True)
+ sub.menu("TEXT_MT_view")
sub.menu("TEXT_MT_text")
if text:
sub.menu("TEXT_MT_edit")
sub.menu("TEXT_MT_format")
- if text and text.modified:
+ if text and text.is_modified:
row = layout.row()
# row.color(redalert)
row.operator("text.resolve_conflict", text="", icon='HELP')
@@ -47,26 +48,26 @@ class TEXT_HT_header(bpy.types.Header):
layout.template_ID(st, "text", new="text.new", unlink="text.unlink")
row = layout.row(align=True)
- row.prop(st, "line_numbers", text="")
- row.prop(st, "word_wrap", text="")
- row.prop(st, "syntax_highlight", text="")
+ row.prop(st, "show_line_numbers", text="")
+ row.prop(st, "show_word_wrap", text="")
+ row.prop(st, "show_syntax_highlight", text="")
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.dirty:
- row.label(text="File: *%s (unsaved)" % text.filename)
+ if text.filepath:
+ if text.is_dirty:
+ 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):
@@ -80,10 +81,11 @@ class TEXT_PT_properties(bpy.types.Panel):
st = context.space_data
flow = layout.column_flow()
- flow.prop(st, "line_numbers")
- flow.prop(st, "word_wrap")
- flow.prop(st, "syntax_highlight")
- flow.prop(st, "live_edit")
+ flow.prop(st, "show_line_numbers")
+ flow.prop(st, "show_word_wrap")
+ flow.prop(st, "show_syntax_highlight")
+ flow.prop(st, "show_line_highlight")
+ flow.prop(st, "use_live_edit")
flow = layout.column_flow()
flow.prop(st, "font_size")
@@ -91,7 +93,7 @@ class TEXT_PT_properties(bpy.types.Panel):
text = st.text
if text:
- flow.prop(text, "tabs_as_spaces")
+ flow.prop(text, "use_tabs_as_spaces")
class TEXT_PT_find(bpy.types.Panel):
@@ -123,10 +125,29 @@ class TEXT_PT_find(bpy.types.Panel):
# settings
row = layout.row()
- row.prop(st, "find_wrap", text="Wrap")
- row.prop(st, "find_all", text="All")
+ row.prop(st, "use_find_wrap", text="Wrap")
+ row.prop(st, "use_find_all", text="All")
+class TEXT_MT_view(bpy.types.Menu):
+ bl_label = "View"
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.operator("text.properties", icon='MENU_PANEL')
+
+ layout.separator()
+
+ layout.operator("screen.area_dupli")
+ layout.operator("screen.screen_full_area")
+
+ layout.separator()
+
+ layout.operator("text.move", text="Top of File").type = 'FILE_TOP'
+ layout.operator("text.move", text="Bottom of File").type = 'FILE_BOTTOM'
+
+
class TEXT_MT_text(bpy.types.Menu):
bl_label = "Text"
@@ -147,7 +168,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()
@@ -160,15 +181,8 @@ class TEXT_MT_text(bpy.types.Menu):
layout.separator()
- layout.operator("text.properties", icon='MENU_PANEL')
-
layout.menu("TEXT_MT_templates")
- layout.separator()
-
- layout.operator("screen.area_dupli")
- layout.operator("screen.screen_full_area")
-
class TEXT_MT_templates(bpy.types.Menu):
'''
@@ -180,16 +194,6 @@ class TEXT_MT_templates(bpy.types.Menu):
self.path_menu(bpy.utils.script_paths("templates"), "text.open", {"internal": True})
-class TEXT_MT_edit_view(bpy.types.Menu):
- bl_label = "View"
-
- def draw(self, context):
- layout = self.layout
-
- layout.operator("text.move", text="Top of File").type = 'FILE_TOP'
- layout.operator("text.move", text="Bottom of File").type = 'FILE_BOTTOM'
-
-
class TEXT_MT_edit_select(bpy.types.Menu):
bl_label = "Select"
@@ -243,7 +247,8 @@ class TEXT_MT_edit_to3d(bpy.types.Menu):
class TEXT_MT_edit(bpy.types.Menu):
bl_label = "Edit"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return (context.space_data.text)
def draw(self, context):
@@ -260,7 +265,6 @@ class TEXT_MT_edit(bpy.types.Menu):
layout.separator()
- layout.menu("TEXT_MT_edit_view")
layout.menu("TEXT_MT_edit_select")
layout.menu("TEXT_MT_edit_markers")
@@ -274,30 +278,27 @@ class TEXT_MT_edit(bpy.types.Menu):
layout.menu("TEXT_MT_edit_to3d")
-classes = [
- TEXT_HT_header,
- TEXT_PT_properties,
- TEXT_PT_find,
- TEXT_MT_text,
- TEXT_MT_templates,
- TEXT_MT_format,
- TEXT_MT_edit,
- TEXT_MT_edit_view,
- TEXT_MT_edit_select,
- TEXT_MT_edit_markers,
- 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")
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/space_time.py b/release/scripts/ui/space_time.py
index 7417b9659b2..168e6f63c55 100644
--- a/release/scripts/ui/space_time.py
+++ b/release/scripts/ui/space_time.py
@@ -39,15 +39,15 @@ 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, "frame_start", text="Start")
row.prop(scene, "frame_end", text="End")
else:
- row.prop(scene, "preview_range_frame_start", text="Start")
- row.prop(scene, "preview_range_frame_end", text="End")
+ row.prop(scene, "frame_preview_start", text="Start")
+ row.prop(scene, "frame_preview_end", text="End")
layout.prop(scene, "frame_current", text="")
@@ -56,7 +56,7 @@ class TIME_HT_header(bpy.types.Header):
row = layout.row(align=True)
row.operator("screen.frame_jump", text="", icon='REW').end = False
row.operator("screen.keyframe_jump", text="", icon='PREV_KEYFRAME').next = False
- if not screen.animation_playing:
+ if not screen.is_animation_playing:
row.operator("screen.animation_play", text="", icon='PLAY_REVERSE').reverse = True
row.operator("screen.animation_play", text="", icon='PLAY')
else:
@@ -67,17 +67,17 @@ 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')
- if screen.animation_playing and tools.use_auto_keying:
+ row.prop(tools, "use_keyframe_insert_auto", text="", toggle=True)
+ if screen.is_animation_playing and tools.use_keyframe_insert_auto:
subsub = row.row()
- subsub.prop(tools, "record_with_nla", toggle=True)
+ subsub.prop(tools, "use_record_with_nla", toggle=True)
layout.prop(scene, "sync_mode", text="")
layout.separator()
row = layout.row(align=True)
- row.prop_object(scene, "active_keying_set", scene, "all_keying_sets", text="")
+ row.prop_search(scene.keying_sets_all, "active", scene, "keying_sets_all", text="")
row.operator("anim.keyframe_insert", text="", icon='KEY_HLT')
row.operator("anim.keyframe_delete", text="", icon='KEY_DEHLT')
@@ -95,14 +95,38 @@ class TIME_MT_view(bpy.types.Menu):
layout.separator()
- layout.prop(st, "show_cframe_indicator")
- layout.prop(st, "only_selected")
+ layout.prop(st, "show_frame_indicator")
+ layout.prop(st, "show_only_selected")
+
+ 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"
@@ -117,7 +141,7 @@ class TIME_MT_frame(bpy.types.Menu):
# it was ok for riscos... ok TODO, operator
for marker in context.scene.timeline_markers:
- if marker.selected:
+ if marker.select:
layout.separator()
layout.prop(marker, "name", text="", icon='MARKER_HLT')
break
@@ -142,20 +166,20 @@ class TIME_MT_playback(bpy.types.Menu):
st = context.space_data
scene = context.scene
- layout.prop(st, "play_top_left")
- layout.prop(st, "play_all_3d")
- layout.prop(st, "play_anim")
- layout.prop(st, "play_buttons")
- layout.prop(st, "play_image")
- layout.prop(st, "play_sequencer")
- layout.prop(st, "play_nodes")
+ layout.prop(st, "use_play_top_left_3d_editor")
+ layout.prop(st, "use_play_3d_editors")
+ layout.prop(st, "use_play_animation_editors")
+ layout.prop(st, "use_play_properties_editors")
+ layout.prop(st, "use_play_image_editors")
+ layout.prop(st, "use_play_sequence_editors")
+ layout.prop(st, "use_play_node_editors")
layout.separator()
- layout.prop(scene, "frame_drop", text="Frame Dropping")
- layout.prop(scene, "sync_audio", text="AV-sync", icon='SPEAKER')
- layout.prop(scene, "mute_audio")
- layout.prop(scene, "scrub_audio")
+ layout.prop(scene, "use_frame_drop", text="Frame Dropping")
+ layout.prop(scene, "use_audio_sync", text="AV-sync", icon='SPEAKER')
+ layout.prop(scene, "use_audio")
+ layout.prop(scene, "use_audio_scrub")
class TIME_MT_autokey(bpy.types.Menu):
@@ -165,27 +189,15 @@ class TIME_MT_autokey(bpy.types.Menu):
layout = self.layout
tools = context.tool_settings
- layout.prop_enum(tools, "autokey_mode", 'ADD_REPLACE_KEYS')
- layout.prop_enum(tools, "autokey_mode", 'REPLACE_KEYS')
-
-classes = [
- TIME_HT_header,
- TIME_MT_view,
- TIME_MT_frame,
- TIME_MT_autokey,
- TIME_MT_playback]
-
+ layout.prop_enum(tools, "auto_keying_mode", 'ADD_REPLACE_KEYS')
+ layout.prop_enum(tools, "auto_keying_mode", 'REPLACE_KEYS')
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/space_userpref.py b/release/scripts/ui/space_userpref.py
index 83693ed2dff..1c878d1cdbf 100644
--- a/release/scripts/ui/space_userpref.py
+++ b/release/scripts/ui/space_userpref.py
@@ -19,27 +19,35 @@
# <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)
- subsub.active = context.shaded
+
+ 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, "show_shaded")
+ subsub = colsub.column(align=True)
+ subsub.active = context.show_shaded
subsub.prop(context, "shadetop")
subsub.prop(context, "shadedown")
@@ -49,13 +57,10 @@ def ui_items_general(col, context):
def opengl_lamp_buttons(column, lamp):
split = column.split(percentage=0.1)
- if lamp.enabled == True:
- split.prop(lamp, "enabled", text="", icon='OUTLINER_OB_LAMP')
- else:
- split.prop(lamp, "enabled", text="", icon='LAMP_DATA')
+ split.prop(lamp, "use", text="", icon='OUTLINER_OB_LAMP' if lamp.use else 'LAMP_DATA')
col = split.column()
- col.active = lamp.enabled
+ col.active = lamp.use
row = col.row()
row.label(text="Diffuse:")
row.prop(lamp, "diffuse_color", text="")
@@ -64,94 +69,9 @@ def opengl_lamp_buttons(column, lamp):
row.prop(lamp, "specular_color", text="")
col = split.column()
- col.active = lamp.enabled
+ col.active = lamp.use
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'
@@ -168,22 +88,19 @@ class USERPREF_HT_header(bpy.types.Header):
layout.operator_context = 'INVOKE_DEFAULT'
if userpref.active_section == 'INPUT':
- op = layout.operator("wm.keyconfig_export")
- op.path = "keymap.py"
- op = layout.operator("wm.keyconfig_import")
- op.path = "keymap.py"
+ layout.operator("wm.keyconfig_export")
+ layout.operator("wm.keyconfig_import")
elif userpref.active_section == 'ADDONS':
- op = layout.operator("wm.addon_install")
- op.path = "*.py"
+ layout.operator("wm.addon_install")
elif userpref.active_section == 'THEMES':
- op = layout.operator("ui.reset_default_theme")
+ layout.operator("ui.reset_default_theme")
class USERPREF_PT_tabs(bpy.types.Panel):
bl_label = ""
bl_space_type = 'USER_PREFERENCES'
bl_region_type = 'WINDOW'
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
def draw(self, context):
layout = self.layout
@@ -193,13 +110,34 @@ 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"
bl_region_type = 'WINDOW'
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
userpref = context.user_preferences
return (userpref.active_section == 'INTERFACE')
@@ -213,13 +151,12 @@ class USERPREF_PT_interface(bpy.types.Panel):
col = row.column()
col.label(text="Display:")
- col.prop(view, "tooltips")
- col.prop(view, "display_object_info", text="Object Info")
- col.prop(view, "use_large_cursors")
+ col.prop(view, "show_tooltips")
+ col.prop(view, "show_object_info", text="Object Info")
+ col.prop(view, "show_large_cursors")
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, "use_global_scene")
col.prop(view, "object_origin_size")
col.separator()
@@ -228,23 +165,24 @@ class USERPREF_PT_interface(bpy.types.Panel):
col.prop(view, "show_mini_axis", text="Display Mini Axis")
sub = col.column()
- sub.enabled = view.show_mini_axis
+ sub.active = view.show_mini_axis
sub.prop(view, "mini_axis_size", text="Size")
sub.prop(view, "mini_axis_brightness", text="Brightness")
+ col.separator()
row.separator()
row.separator()
col = row.column()
col.label(text="View Manipulation:")
- col.prop(view, "auto_depth")
- col.prop(view, "zoom_to_mouse")
- col.prop(view, "rotate_around_selection")
- col.prop(view, "global_pivot")
+ col.prop(view, "use_mouse_auto_depth")
+ col.prop(view, "use_zoom_to_mouse")
+ col.prop(view, "use_rotate_around_active")
+ col.prop(view, "use_global_pivot")
col.separator()
- col.prop(view, "auto_perspective")
+ col.prop(view, "use_auto_perspective")
col.prop(view, "smooth_view")
col.prop(view, "rotation_angle")
@@ -252,7 +190,7 @@ class USERPREF_PT_interface(bpy.types.Panel):
col.separator()
col.label(text="2D Viewports:")
- col.prop(view, "view2d_grid_minimum_spacing", text="Minimum Grid Spacing")
+ col.prop(view, "view2d_grid_spacing_min", text="Minimum Grid Spacing")
col.prop(view, "timecode_style")
row.separator()
@@ -261,13 +199,13 @@ class USERPREF_PT_interface(bpy.types.Panel):
col = row.column()
#Toolbox doesn't exist yet
#col.label(text="Toolbox:")
- #col.prop(view, "use_column_layout")
+ #col.prop(view, "show_column_layout")
#col.label(text="Open Toolbox Delay:")
#col.prop(view, "open_left_mouse_delay", text="Hold LMB")
#col.prop(view, "open_right_mouse_delay", text="Hold RMB")
- col.prop(view, "use_manipulator")
+ col.prop(view, "show_manipulator")
sub = col.column()
- sub.enabled = view.use_manipulator
+ sub.active = view.show_manipulator
sub.prop(view, "manipulator_size", text="Size")
sub.prop(view, "manipulator_handle_size", text="Handle Size")
sub.prop(view, "manipulator_hotspot", text="Hotspot")
@@ -277,7 +215,7 @@ class USERPREF_PT_interface(bpy.types.Panel):
col.separator()
col.label(text="Menus:")
- col.prop(view, "open_mouse_over")
+ col.prop(view, "use_mouse_over_open")
col.label(text="Menu Open Delay:")
col.prop(view, "open_toplevel_delay", text="Top Level")
col.prop(view, "open_sublevel_delay", text="Sub Level")
@@ -291,9 +229,10 @@ class USERPREF_PT_edit(bpy.types.Panel):
bl_space_type = 'USER_PREFERENCES'
bl_label = "Edit"
bl_region_type = 'WINDOW'
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
userpref = context.user_preferences
return (userpref.active_section == 'EDITING')
@@ -314,7 +253,7 @@ class USERPREF_PT_edit(bpy.types.Panel):
col.separator()
col.label(text="New Objects:")
- col.prop(edit, "enter_edit_mode")
+ col.prop(edit, "use_enter_edit_mode")
col.label(text="Align To:")
col.prop(edit, "object_align", text="")
@@ -323,7 +262,7 @@ class USERPREF_PT_edit(bpy.types.Panel):
col.separator()
col.label(text="Undo:")
- col.prop(edit, "global_undo")
+ col.prop(edit, "use_global_undo")
col.prop(edit, "undo_steps", text="Steps")
col.prop(edit, "undo_memory_limit", text="Memory Limit")
@@ -331,19 +270,12 @@ 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")
- #col.prop(edit, "grease_pencil_simplify_stroke", text="Simplify Stroke")
+ #col.prop(edit, "use_grease_pencil_simplify_stroke", text="Simplify Stroke")
col.prop(edit, "grease_pencil_eraser_radius", text="Eraser Radius")
- col.prop(edit, "grease_pencil_smooth_stroke", text="Smooth Stroke")
+ col.prop(edit, "use_grease_pencil_smooth_stroke", text="Smooth Stroke")
col.separator()
col.separator()
col.separator()
@@ -356,7 +288,7 @@ class USERPREF_PT_edit(bpy.types.Panel):
col = row.column()
col.label(text="Keyframing:")
col.prop(edit, "use_visual_keying")
- col.prop(edit, "keyframe_insert_needed", text="Only Insert Needed")
+ col.prop(edit, "use_keyframe_insert_needed", text="Only Insert Needed")
col.separator()
@@ -364,50 +296,58 @@ class USERPREF_PT_edit(bpy.types.Panel):
sub = col.column()
- # sub.active = edit.use_auto_keying # incorrect, timeline can enable
- sub.prop(edit, "auto_keyframe_insert_keyingset", text="Only Insert for Keying Set")
- sub.prop(edit, "auto_keyframe_insert_available", text="Only Insert Available")
+ # sub.active = edit.use_keyframe_insert_auto # incorrect, timeline can enable
+ sub.prop(edit, "use_keyframe_insert_keyingset", text="Only Insert for Keying Set")
+ sub.prop(edit, "use_keyframe_insert_available", text="Only Insert Available")
col.separator()
col.label(text="New F-Curve Defaults:")
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.prop(edit, "use_insertkey_xyz_to_rgb", text="XYZ to RGB")
col.separator()
col.separator()
col.separator()
col.label(text="Transform:")
- col.prop(edit, "drag_immediately")
+ col.prop(edit, "use_drag_immediately")
row.separator()
row.separator()
col = row.column()
+ row = col.row(align=True)
+ row.prop(edit, "sculpt_paint_overlay_color", text="Sculpt Overlay Color")
+
+ 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")
- col.prop(edit, "duplicate_curve", text="Curve")
- col.prop(edit, "duplicate_text", text="Text")
- col.prop(edit, "duplicate_metaball", text="Metaball")
- col.prop(edit, "duplicate_armature", text="Armature")
- col.prop(edit, "duplicate_lamp", text="Lamp")
- col.prop(edit, "duplicate_material", text="Material")
- col.prop(edit, "duplicate_texture", text="Texture")
- col.prop(edit, "duplicate_fcurve", text="F-Curve")
- col.prop(edit, "duplicate_action", text="Action")
- col.prop(edit, "duplicate_particle", text="Particle")
+ col.prop(edit, "use_duplicate_mesh", text="Mesh")
+ col.prop(edit, "use_duplicate_surface", text="Surface")
+ col.prop(edit, "use_duplicate_curve", text="Curve")
+ col.prop(edit, "use_duplicate_text", text="Text")
+ col.prop(edit, "use_duplicate_metaball", text="Metaball")
+ col.prop(edit, "use_duplicate_armature", text="Armature")
+ col.prop(edit, "use_duplicate_lamp", text="Lamp")
+ col.prop(edit, "use_duplicate_material", text="Material")
+ col.prop(edit, "use_duplicate_texture", text="Texture")
+ #col.prop(edit, "use_duplicate_fcurve", text="F-Curve")
+ col.prop(edit, "use_duplicate_action", text="Action")
+ col.prop(edit, "use_duplicate_particle", text="Particle")
class USERPREF_PT_system(bpy.types.Panel):
bl_space_type = 'USER_PREFERENCES'
bl_label = "System"
bl_region_type = 'WINDOW'
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
userpref = context.user_preferences
return (userpref.active_section == 'SYSTEM')
@@ -429,8 +369,9 @@ class USERPREF_PT_system(bpy.types.Panel):
col.prop(system, "dpi")
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.prop(system, "author", text="Author")
+ col.prop(system, "use_scripts_auto_execute")
+ col.prop(system, "use_tabs_as_spaces")
col.separator()
col.separator()
@@ -440,7 +381,7 @@ class USERPREF_PT_system(bpy.types.Panel):
col.row().prop(system, "audio_device", expand=True)
sub = col.column()
sub.active = system.audio_device != 'NONE'
- #sub.prop(system, "enable_all_codecs")
+ #sub.prop(system, "use_preview_images")
sub.prop(system, "audio_channels", text="Channels")
sub.prop(system, "audio_mixing_buffer", text="Mixing Buffer")
sub.prop(system, "audio_sample_rate", text="Sample Rate")
@@ -463,9 +404,9 @@ class USERPREF_PT_system(bpy.types.Panel):
# No translation in 2.5 yet
#col.prop(system, "language")
#col.label(text="Translate:")
- #col.prop(system, "translate_tooltips", text="Tooltips")
- #col.prop(system, "translate_buttons", text="Labels")
- #col.prop(system, "translate_toolbox", text="Toolbox")
+ #col.prop(system, "use_translate_tooltips", text="Tooltips")
+ #col.prop(system, "use_translate_buttons", text="Labels")
+ #col.prop(system, "use_translate_toolbox", text="Toolbox")
#col.separator()
@@ -478,9 +419,9 @@ class USERPREF_PT_system(bpy.types.Panel):
col = colsplit.column()
col.label(text="OpenGL:")
- col.prop(system, "clip_alpha", slider=True)
+ col.prop(system, "gl_clip_alpha", slider=True)
col.prop(system, "use_mipmaps")
- col.prop(system, "use_vbos")
+ col.prop(system, "use_vertex_buffer_objects")
#Anti-aliasing is disabled as it breaks broder/lasso select
#col.prop(system, "use_antialiasing")
col.label(text="Window Draw Method:")
@@ -539,9 +480,40 @@ class USERPREF_PT_theme(bpy.types.Panel):
bl_space_type = 'USER_PREFERENCES'
bl_label = "Themes"
bl_region_type = 'WINDOW'
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
+
+ @staticmethod
+ def _theme_generic(split, themedata):
+
+ row = split.row()
+
+ subsplit = row.split(percentage=0.95)
- def poll(self, context):
+ 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)
+
+ @classmethod
+ def poll(cls, context):
userpref = context.user_preferences
return (userpref.active_section == 'THEMES')
@@ -553,6 +525,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':
@@ -614,6 +592,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)
@@ -622,393 +604,49 @@ 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")
-
- ui = theme.user_interface
- col.separator()
- col.separator()
- col.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)
+ subsplit = row.split(percentage=0.95)
- 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.prop(v3d, "nurb_uline")
- col.prop(v3d, "nurb_vline")
- col.prop(v3d, "nurb_sel_uline")
- col.prop(v3d, "nurb_sel_vline")
- col.prop(v3d, "handle_free")
- col.prop(v3d, "handle_auto")
- col.prop(v3d, "handle_vect")
- col.prop(v3d, "handle_align")
- col.prop(v3d, "handle_sel_free")
- col.prop(v3d, "handle_sel_auto")
- col.prop(v3d, "handle_sel_vect")
- col.prop(v3d, "handle_sel_align")
- col.prop(v3d, "act_spline")
+ 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")
- 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_seam")
- #col.prop(v3d, "edge") Doesn't seem to work
-
- elif theme.theme_area == 'GRAPH_EDITOR':
- graph = theme.graph_editor
+ subsplit = row.split(percentage=0.85)
- col = split.column()
- col.prop(graph, "back")
- col.prop(graph, "button")
- col.prop(graph, "button_title")
- col.prop(graph, "button_text")
+ 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")
- 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, "frame_current")
-
- col = split.column()
- col.prop(graph, "vertex")
- col.prop(graph, "handle_vertex")
- col.prop(graph, "handle_vertex_select")
- col.separator()
- col.prop(graph, "handle_vertex_size")
+ ui = theme.user_interface
col.separator()
col.separator()
- col.prop(graph, "handle_free")
- col.prop(graph, "handle_auto")
- col.prop(graph, "handle_vect")
- col.prop(graph, "handle_align")
- col.prop(graph, "handle_sel_free")
- col.prop(graph, "handle_sel_auto")
- col.prop(graph, "handle_sel_vect")
- col.prop(graph, "handle_sel_align")
-
- 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, "frame_current")
-
- 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, "frame_current")
- 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, "frame_current")
- 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, "frame_current")
-
- 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")
+ split = col.split(percentage=0.93)
+ split.prop(ui, "icon_file")
- 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")
+ layout.separator()
+ layout.separator()
- 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):
bl_space_type = 'USER_PREFERENCES'
bl_label = "Files"
bl_region_type = 'WINDOW'
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
userpref = context.user_preferences
return (userpref.active_section == 'FILES')
@@ -1039,13 +677,13 @@ class USERPREF_PT_file(bpy.types.Panel):
sub.label(text="Animation Player:")
sub = col1.column()
- sub.prop(paths, "fonts_directory", text="")
- sub.prop(paths, "textures_directory", text="")
+ sub.prop(paths, "font_directory", text="")
+ sub.prop(paths, "texture_directory", text="")
sub.prop(paths, "texture_plugin_directory", text="")
sub.prop(paths, "sequence_plugin_directory", text="")
sub.prop(paths, "render_output_directory", text="")
- sub.prop(paths, "python_scripts_directory", text="")
- sub.prop(paths, "sounds_directory", text="")
+ sub.prop(paths, "script_directory", text="")
+ sub.prop(paths, "sound_directory", text="")
sub.prop(paths, "temporary_directory", text="")
sub.prop(paths, "image_editor", text="")
subsplit = sub.split(percentage=0.3)
@@ -1055,10 +693,10 @@ class USERPREF_PT_file(bpy.types.Panel):
col = split.column()
col.label(text="Save & Load:")
col.prop(paths, "use_relative_paths")
- col.prop(paths, "compress_file")
- col.prop(paths, "load_ui")
- col.prop(paths, "filter_file_extensions")
- col.prop(paths, "hide_dot_files_datablocks")
+ col.prop(paths, "use_file_compression")
+ col.prop(paths, "use_load_ui")
+ col.prop(paths, "use_filter_files")
+ col.prop(paths, "show_hidden_files_datablocks")
col.separator()
col.separator()
@@ -1066,242 +704,71 @@ class USERPREF_PT_file(bpy.types.Panel):
col.label(text="Auto Save:")
col.prop(paths, "save_version")
col.prop(paths, "recent_files")
- col.prop(paths, "save_preview_images")
- col.prop(paths, "auto_save_temporary_files")
+ col.prop(paths, "use_save_preview_images")
+ col.prop(paths, "use_auto_save_temporary_files")
sub = col.column()
- sub.enabled = paths.auto_save_temporary_files
+ sub.active = paths.use_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):
+ @classmethod
+ def poll(cls, 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.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(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')
- sub1.prop(inputs, "emulate_3_button_mouse")
- sub.prop(inputs, "continuous_mouse")
+ sub1.active = (inputs.select_mouse == 'RIGHT')
+ sub1.prop(inputs, "use_mouse_emulate_3_button")
+ sub.prop(inputs, "use_mouse_continuous")
sub.label(text="Select With:")
sub.row().prop(inputs, "select_mouse", expand=True)
sub = col.column()
sub.label(text="Double Click:")
- sub.prop(inputs, "double_click_time", text="Speed")
+ sub.prop(inputs, "mouse_double_click_time", text="Speed")
sub.separator()
- sub.prop(inputs, "emulate_numpad")
+ sub.prop(inputs, "use_emulate_numpad")
sub.separator()
sub.label(text="Orbit Style:")
- sub.row().prop(inputs, "view_rotation", expand=True)
+ sub.row().prop(inputs, "view_rotate_method", expand=True)
sub.label(text="Zoom Style:")
- 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")
+ sub.row().prop(inputs, "view_zoom_method", text="")
+ if inputs.view_zoom_method == 'DOLLY':
+ sub.row().prop(inputs, "view_zoom_axis", expand=True)
+ sub.prop(inputs, "invert_mouse_wheel_zoom")
- #sub.prop(inputs, "use_middle_mouse_paste")
+ #sub.prop(inputs, "use_mouse_mmb_paste")
#col.separator()
- #sub = col.column()
- #sub.label(text="Mouse Wheel:")
+ sub = col.column()
+ sub.label(text="Mouse Wheel:")
+ sub.prop(inputs, "invert_zoom_wheel", text="Invert Wheel Zoom Direction")
#sub.prop(view, "wheel_scroll_lines", text="Scroll Lines")
col.separator()
@@ -1314,42 +781,6 @@ class USERPREF_PT_input(bpy.types.Panel):
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.enabled = 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
@@ -1368,28 +799,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)
@@ -1398,24 +808,113 @@ class USERPREF_PT_addons(bpy.types.Panel):
bl_space_type = 'USER_PREFERENCES'
bl_label = "Addons"
bl_region_type = 'WINDOW'
- bl_show_header = False
+ bl_options = {'HIDE_HEADER'}
+
+ _addons_fake_modules = {}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
userpref = context.user_preferences
return (userpref.active_section == 'ADDONS')
- def _addon_list(self):
+ @staticmethod
+ def module_get(mod_name):
+ return USERPREF_PT_addons._addons_fake_modules[mod_name]
+
+ @staticmethod
+ def _addon_list():
+ import os
import sys
+ import time
+
modules = []
loaded_modules = set()
paths = bpy.utils.script_paths("addons")
- # sys.path.insert(0, None)
- for path in paths:
- # sys.path[0] = path
- modules.extend(bpy.utils.modules_from_path(path, loaded_modules))
+ # if folder addons_contrib/ exists, scripts in there will be loaded
+ paths += bpy.utils.script_paths("addons_contrib")
+
+ if bpy.app.debug:
+ t_main = time.time()
+
+ # fake module importing
+ def fake_module(mod_name, mod_path, speedy=True):
+ if bpy.app.debug:
+ print("fake_module", mod_name, mod_path)
+ import ast
+ ModuleType = type(ast)
+ if speedy:
+ lines = []
+ line_iter = iter(open(mod_path, "r"))
+ l = ""
+ while not l.startswith("bl_addon_info"):
+ l = line_iter.readline()
+ if len(l) == 0:
+ break
+ while l.rstrip():
+ lines.append(l)
+ l = line_iter.readline()
+ del line_iter
+ data = "".join(lines)
+
+ else:
+ data = open(mod_path, "r").read()
+
+ ast_data = ast.parse(data, filename=mod_path)
+ body_info = None
+ for body in ast_data.body:
+ if body.__class__ == ast.Assign:
+ if len(body.targets) == 1:
+ if getattr(body.targets[0], "id", "") == "bl_addon_info":
+ body_info = body
+ break
+
+ if body_info:
+ mod = ModuleType(mod_name)
+ mod.bl_addon_info = ast.literal_eval(body.value)
+ mod.__file__ = mod_path
+ mod.__time__ = os.path.getmtime(mod_path)
+ return mod
+ else:
+ return None
- # del sys.path[0]
- return modules
+ modules_stale = set(USERPREF_PT_addons._addons_fake_modules.keys())
+
+ for path in paths:
+ for f in sorted(os.listdir(path)):
+ if f.endswith(".py"):
+ mod_name = f[0:-3]
+ mod_path = os.path.join(path, f)
+ elif ("." not in f) and (os.path.isfile(os.path.join(path, f, "__init__.py"))):
+ mod_name = f
+ mod_path = os.path.join(path, f, "__init__.py")
+ else:
+ mod_name = ""
+ mod_path = ""
+
+ if mod_name:
+ if mod_name in modules_stale:
+ modules_stale.remove(mod_name)
+ mod = USERPREF_PT_addons._addons_fake_modules.get(mod_name)
+ if mod:
+ if mod.__time__ != os.path.getmtime(mod_path):
+ print("Reloading", mod_name)
+ del USERPREF_PT_addons._addons_fake_modules[mod_name]
+ mod = None
+
+ if mod is None:
+ mod = fake_module(mod_name, mod_path)
+ if mod:
+ USERPREF_PT_addons._addons_fake_modules[mod_name] = mod
+
+
+ # just incase we get stale modules, not likely
+ for mod_stale in modules_stale:
+ del USERPREF_PT_addons._addons_fake_modules[mod_stale]
+ del modules_stale
+
+ mod_list = list(USERPREF_PT_addons._addons_fake_modules.values())
+ mod_list.sort(key=lambda mod: (mod.bl_addon_info['category'], mod.bl_addon_info['name']))
+ return mod_list
def draw(self, context):
layout = self.layout
@@ -1429,17 +928,19 @@ class USERPREF_PT_addons(bpy.types.Panel):
cats = {info["category"] for mod, info in addons}
cats.discard("")
- cats = ['All', 'Disabled', 'Enabled'] + sorted(cats)
+ cats = ["All", "Enabled", "Disabled"] + sorted(cats)
- bpy.types.Scene.EnumProperty(items=[(cats[i], cats[i], str(i)) for i in range(len(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")
- row = layout.row()
- row.prop(context.scene, "addon_filter", text="Filter")
- row.prop(context.scene, "addon_search", text="Search", icon='VIEWZOOM')
- layout.separator()
+ 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()
@@ -1447,64 +948,73 @@ class USERPREF_PT_addons(bpy.types.Panel):
for mod, info in addons:
module_name = mod.__name__
+ is_enabled = module_name in used_ext
+
# check if add-on should be visible with current filters
- if filter != "All" and \
- filter != info["category"] and \
- not (module_name not in used_ext and filter == "Disabled"):
+ if (filter == "All") or \
+ (filter == info["category"]) or \
+ (filter == "Enabled" and is_enabled) or \
+ (filter == "Disabled" and not is_enabled):
- continue
- if search and search not in info["name"].lower():
- if info["author"]:
- if search not in info["author"].lower():
+ 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["show_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:
- continue
-
- # Addon UI Code
- box = layout.column().box()
- column = box.column()
- row = column.row()
-
- # Arrow #
- # If there are Infos or UI is expanded
- if info["expanded"]:
- row.operator("wm.addon_expand", icon="TRIA_DOWN").module = module_name
- elif info["author"] or info["version"] or info["url"] or info["location"]:
- row.operator("wm.addon_expand", icon="TRIA_RIGHT").module = module_name
- else:
- # Else, block UI
- arrow = row.column()
- arrow.enabled = False
- arrow.operator("wm.addon_expand", icon="TRIA_RIGHT").module = module_name
-
- row.label(text=info["name"])
- row.operator("wm.addon_disable" if module_name in used_ext else "wm.addon_enable").module = module_name
-
- # Expanded UI (only if additional infos are available)
- if info["expanded"]:
- if info["author"]:
- split = column.row().split(percentage=0.15)
- split.label(text='Author:')
- split.label(text=info["author"])
- if info["version"]:
- split = column.row().split(percentage=0.15)
- split.label(text='Version:')
- split.label(text=info["version"])
- if info["location"]:
- split = column.row().split(percentage=0.15)
- split.label(text='Location:')
- split.label(text=info["location"])
- if info["description"]:
- split = column.row().split(percentage=0.15)
- split.label(text='Description:')
- split.label(text=info["description"])
- if info["url"]:
- split = column.row().split(percentage=0.15)
- split.label(text="Internet:")
- split.operator("wm.addon_links", text="Link to the Wiki").link = info["url"]
- split.separator()
- split.separator()
+ row.operator("wm.addon_enable", icon='CHECKBOX_DEHLT', text="", emboss=False).module = module_name
+
+ # Expanded UI (only if additional infos are available)
+ if info["show_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.
@@ -1512,23 +1022,23 @@ class USERPREF_PT_addons(bpy.types.Panel):
missing_modules = {ext for ext in used_ext if ext not in module_names}
if missing_modules and filter in ("All", "Enabled"):
- layout.column().separator()
- layout.column().label(text="Missing script files")
+ 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 = layout.column().box()
- column = box.column()
- row = column.row()
+ box = col.column().box()
+ colsub = box.column()
+ row = colsub.row()
- row.label(text=ext, icon="ERROR")
+ 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": "", "url": "", "category": "", "expanded": False}):
+def addon_info_get(mod, info_basis={"name": "", "author": "", "version": "", "blender": "", "location": "", "description": "", "wiki_url": "", "tracker_url": "", "category": "", "warning": "", "show_expanded": False}):
addon_info = getattr(mod, "bl_addon_info", {})
# avoid re-initializing
@@ -1558,8 +1068,13 @@ class WM_OT_addon_enable(bpy.types.Operator):
def execute(self, context):
module_name = self.properties.module
+ # note, this still gets added to _bpy_types.TypeMap
+ import bpy_types as _bpy_types
+ _bpy_types._register_immediate = False
+
try:
mod = __import__(module_name)
+ _bpy_types._register_module(module_name)
mod.register()
except:
import traceback
@@ -1574,7 +1089,9 @@ class WM_OT_addon_enable(bpy.types.Operator):
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.")
-
+
+ _bpy_types._register_immediate = True
+
return {'FINISHED'}
@@ -1586,13 +1103,15 @@ class WM_OT_addon_disable(bpy.types.Operator):
module = StringProperty(name="Module", description="Module name of the addon to disable")
def execute(self, context):
- import traceback
+ import bpy_types as _bpy_types
module_name = self.properties.module
try:
mod = __import__(module_name)
+ _bpy_types._unregister_module(module_name, free=False) # dont free because we may want to enable again.
mod.unregister()
except:
+ import traceback
traceback.print_exc()
addons = context.user_preferences.addons
@@ -1615,16 +1134,14 @@ class WM_OT_addon_install(bpy.types.Operator):
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]
@@ -1680,449 +1197,25 @@ class WM_OT_addon_expand(bpy.types.Operator):
def execute(self, context):
module_name = self.properties.module
- # unlikely to fail, module should have alredy been imported
+ # unlikely to fail, module should have already been imported
try:
- mod = __import__(module_name)
+ # mod = __import__(module_name)
+ mod = USERPREF_PT_addons.module_get(module_name)
except:
import traceback
traceback.print_exc()
return {'CANCELLED'}
info = addon_info_get(mod)
- info["expanded"] = not info["expanded"]
- return {'FINISHED'}
-
-
-class WM_OT_addon_links(bpy.types.Operator):
- "Open the Blender Wiki in the Webbrowser"
- bl_idname = "wm.addon_links"
- bl_label = ""
-
- link = StringProperty(name="Link", description="Link to open")
-
- def execute(self, context):
- import webbrowser
- webbrowser.open(self.properties.link)
- return {'FINISHED'}
-
-
-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..."
-
- 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)
-
- 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'}
-
-
-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.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 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 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)
+ info["show_expanded"] = not info["show_expanded"]
return {'FINISHED'}
-classes = [
- USERPREF_HT_header,
- USERPREF_PT_tabs,
- USERPREF_PT_interface,
- USERPREF_PT_theme,
- USERPREF_PT_edit,
- USERPREF_PT_system,
- USERPREF_PT_file,
- USERPREF_PT_input,
- USERPREF_PT_addons,
-
- WM_OT_addon_enable,
- WM_OT_addon_disable,
- WM_OT_addon_install,
- WM_OT_addon_expand,
- WM_OT_addon_links,
-
- 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)
-
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
- register()
+ register() \ No newline at end of file
diff --git a/release/scripts/ui/space_userpref_keymap.py b/release/scripts/ui/space_userpref_keymap.py
new file mode 100644
index 00000000000..6805646ded4
--- /dev/null
+++ b/release/scripts/ui/space_userpref_keymap.py
@@ -0,0 +1,800 @@
+# ##### 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
+
+
+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_options = {'HIDE_HEADER'}
+
+ 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, "show_expanded_children", text="", emboss=False)
+ row.label(text=km.name)
+
+ row.label()
+ row.label()
+
+ if km.is_modal:
+ row.label(text="", icon='LINKED')
+ if km.is_user_defined:
+ op = row.operator("wm.keymap_restore", text="Restore")
+ else:
+ op = row.operator("wm.keymap_edit", text="Edit")
+
+ if km.show_expanded_children:
+ 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, "show_expanded_items", text="", emboss=False)
+ subrow.label(text="%s (Global)" % km.name)
+ else:
+ km.show_expanded_items = True
+
+ # Key Map items
+ if km.show_expanded_items:
+ 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.is_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.is_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, "show_expanded", text="", emboss=False)
+
+ row = split.row()
+ row.enabled = km.is_user_defined
+ row.prop(kmi, "active", text="", emboss=False)
+
+ if km.is_modal:
+ row.prop(kmi, "propvalue", text="")
+ else:
+ row.label(text=kmi.name)
+
+ row = split.row()
+ row.enabled = km.is_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.show_expanded:
+ box = col.box()
+
+ box.enabled = km.is_user_defined
+
+ if map_type not in ('TEXTINPUT', 'TIMER'):
+ split = box.split(percentage=0.4)
+ sub = split.row()
+
+ if km.is_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, value in properties.items():
+ if not properties.is_property_hidden(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.is_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_text, 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_text 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.is_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.is_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.keyconfigs.active
+ defkc = wm.keyconfigs.default
+
+ col = layout.column()
+ sub = col.column()
+
+ subsplit = sub.split()
+ subcol = subsplit.column()
+
+ row = subcol.row()
+ row.prop_search(wm.keyconfigs, "active", wm, "keyconfigs", text="Key Config:")
+ layout.set_context_pointer("keyconfig", wm.keyconfigs.active)
+ row.operator("wm.keyconfig_remove", text="", icon='X')
+
+ row.prop(context.space_data, "filter_text", icon="VIEWZOOM")
+
+ col.separator()
+
+ display_keymaps = _merge_keymaps(kc, defkc)
+ if context.space_data.filter_text != "":
+ filter_text = context.space_data.filter_text.lower()
+ self.draw_filtered(display_keymaps, filter_text, col)
+ else:
+ self.draw_hierarchy(display_keymaps, col)
+
+
+from bpy.props import *
+
+
+def export_properties(prefix, properties, lines=None):
+ if lines is None:
+ lines = []
+
+ for value, pname in properties.items():
+ if not properties.is_property_hidden(pname):
+ if isinstance(value, bpy.types.OperatorProperties):
+ export_properties(prefix + "." + pname, value, lines)
+ elif properties.is_property_set(pname):
+ value = _string_value(value)
+ if value != "":
+ lines.append("%s.%s = %s\n" % (prefix, pname, value))
+ return lines
+
+
+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.is_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")
+
+ props = kmi.properties
+
+ if props is not None:
+ export_properties("kmi.properties", props, s)
+
+ 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.keyconfigs.default
+
+ 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", default="keymap.py")
+ 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):
+ import shutil
+ if not self.properties.is_property_set("filepath"):
+ raise Exception("Filepath not set")
+
+ f = open(self.properties.filepath, "r")
+ if not f:
+ raise Exception("Could not open file")
+
+ config_name = None
+ for line in f:
+ if line.startswith("kc = wm.add_keyconfig("):
+ config_name = line[23:-3]
+ break
+
+ if config_name is None:
+ raise Exception("config name not found")
+
+ path = os.path.join(__file__, "..", "..", "cfg") # remove ui/space_userpref.py
+ path = os.path.normpath(path)
+ print(path)
+
+ # 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)
+
+ # sneaky way to check we're actually running the code.
+ wm = context.manager
+ while config_name in wm.keyconfigs:
+ wm.remove_keyconfig(wm.keyconfigs[config_name])
+
+ wm = context.manager
+ totmap = len(wm.keyconfigs)
+ mod = __import__(config_name)
+ if totmap == len(wm.keyconfigs):
+ reload(mod)
+
+ wm = bpy.context.manager
+ wm.keyconfigs.active = 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", default="keymap.py")
+ 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.is_property_set("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.keyconfigs.active
+
+ 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.keyconfigs.default:
+ 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.is_modal))
+ for kmi in km.items:
+ if km.is_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")
+
+ props = kmi.properties
+
+ if props is not None:
+ f.write("".join(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.keyconfigs.default.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.keyconfigs.default
+
+ if km.is_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_text != "":
+ context.space_data.filter_text = ""
+ km.show_expanded_items = True
+ km.show_expanded_children = 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"
+
+ @classmethod
+ def poll(cls, context):
+ wm = context.manager
+ return wm.keyconfigs.active.is_user_defined
+
+ def execute(self, context):
+ import sys
+ wm = context.manager
+
+ keyconfig = wm.keyconfigs.active
+
+ module = sys.modules.get(keyconfig.name)
+
+ if module:
+ path = module.__file__
+ if os.path.exists(path):
+ os.remove(path)
+
+ path = module.__file__ + "c" # for .pyc
+
+ if os.path.exists(path):
+ os.remove(path)
+
+ wm.remove_keyconfig(keyconfig)
+ return {'FINISHED'}
+
+def register():
+ pass
+
+def unregister():
+ pass
+
+if __name__ == "__main__":
+ register()
diff --git a/release/scripts/ui/space_view3d.py b/release/scripts/ui/space_view3d.py
index fa0c5029416..fa2cd753e86 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,45 +53,51 @@ 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.
'''
if obj and obj.mode == 'EDIT' and obj.type == 'MESH':
row_sub = row.row(align=True)
- row_sub.prop(toolsettings, "mesh_selection_mode", text="", index=0, icon='VERTEXSEL')
- row_sub.prop(toolsettings, "mesh_selection_mode", text="", index=1, icon='EDGESEL')
- row_sub.prop(toolsettings, "mesh_selection_mode", text="", index=2, icon='FACESEL')
+ row_sub.prop(toolsettings, "mesh_select_mode", text="", index=0, icon='VERTEXSEL')
+ row_sub.prop(toolsettings, "mesh_select_mode", text="", index=1, icon='EDGESEL')
+ row_sub.prop(toolsettings, "mesh_select_mode", text="", index=2, icon='FACESEL')
'''
if obj:
# Particle edit
if obj.mode == 'PARTICLE_EDIT':
- row.prop(toolsettings.particle_edit, "selection_mode", text="", expand=True, toggle=True)
+ row.prop(toolsettings.particle_edit, "select_mode", text="", expand=True, toggle=True)
# Occlude geometry
- if view.viewport_shading in ('SOLID', 'SHADED', 'TEXTURED') and (obj.mode == 'PARTICLE_EDIT' or (obj.mode == 'EDIT' and obj.type == 'MESH')):
- row.prop(view, "occlude_geometry", text="")
+ if view.viewport_shade in ('SOLID', 'SHADED', 'TEXTURED') and (obj.mode == 'PARTICLE_EDIT' or (obj.mode == 'EDIT' and obj.type == 'MESH')):
+ row.prop(view, "use_occlude_geometry", text="")
# Proportional editing
- if obj.mode in ('OBJECT', 'EDIT', 'PARTICLE_EDIT'):
+ if obj.mode in ('EDIT', 'PARTICLE_EDIT'):
row = layout.row(align=True)
- row.prop(toolsettings, "proportional_editing", text="", icon_only=True)
- if toolsettings.proportional_editing != 'DISABLED':
- row.prop(toolsettings, "proportional_editing_falloff", text="", icon_only=True)
+ row.prop(toolsettings, "proportional_edit", text="", icon_only=True)
+ if toolsettings.proportional_edit != 'DISABLED':
+ row.prop(toolsettings, "proportional_edit_falloff", text="", icon_only=True)
+ elif obj.mode == 'OBJECT':
+ row = layout.row(align=True)
+ row.prop(toolsettings, "use_proportional_edit_objects", text="", icon_only=True)
+ if toolsettings.use_proportional_edit_objects:
+ row.prop(toolsettings, "proportional_edit_falloff", text="", icon_only=True)
# Snap
row = layout.row(align=True)
- row.prop(toolsettings, "snap", text="")
+ row.prop(toolsettings, "use_snap", text="")
row.prop(toolsettings, "snap_element", text="", icon_only=True)
if toolsettings.snap_element != 'INCREMENT':
row.prop(toolsettings, "snap_target", text="")
if obj and obj.mode == 'OBJECT':
- row.prop(toolsettings, "snap_align_rotation", text="")
+ row.prop(toolsettings, "use_snap_align_rotation", text="")
if toolsettings.snap_element == 'VOLUME':
- row.prop(toolsettings, "snap_peel_object", text="")
+ row.prop(toolsettings, "use_snap_peel_object", text="")
elif toolsettings.snap_element == 'FACE':
- row.prop(toolsettings, "snap_project", text="")
+ row.prop(toolsettings, "use_snap_project", text="")
# OpenGL render
row = layout.row(align=True)
@@ -114,7 +119,7 @@ class VIEW3D_HT_header(bpy.types.Header):
# ********** Utilities **********
-class VIEW3D_MT_showhide(bpy.types.Menu):
+class ShowHideMenu():
bl_label = "Show/Hide"
_operator_name = ""
@@ -145,7 +150,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:
@@ -207,7 +212,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()
@@ -454,8 +458,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):
@@ -485,7 +489,7 @@ 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:
+ if context.scene.tool_settings.mesh_select_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")
@@ -524,7 +528,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()
@@ -553,7 +557,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()
@@ -679,6 +683,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,38 +714,90 @@ class VIEW3D_MT_object_clear(bpy.types.Menu):
class VIEW3D_MT_object_specials(bpy.types.Menu):
bl_label = "Specials"
- def poll(self, context):
+ @classmethod
+ def poll(cls, 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 = 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
+
+ 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
+
+ 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="Distance")
- props.path_iter = "selected_editable_objects"
- props.path_item = "data.distance"
- props.input_scale = 0.1
+ props = layout.operator("wm.context_modal_mouse", text="Width Size")
+ props.data_path_iter = "selected_editable_objects"
+ props.data_path_item = "data.offset"
+ 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.path_iter = "selected_editable_objects"
- props.path_item = "data.shadow_buffer_clip_start"
- props.input_scale = 0.05
+ 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.path_iter = "selected_editable_objects"
- props.path_item = "data.shadow_buffer_clip_end"
- 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")
+ props = layout.operator("object.hide_render_clear_all")
class VIEW3D_MT_object_apply(bpy.types.Menu):
bl_label = "Apply"
@@ -794,6 +855,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")
@@ -803,9 +865,9 @@ class VIEW3D_MT_object_showhide(bpy.types.Menu):
def draw(self, context):
layout = self.layout
- layout.operator("object.restrictview_clear", text="Show Hidden")
- layout.operator("object.restrictview_set", text="Hide Selected")
- layout.operator("object.restrictview_set", text="Hide Unselected").unselected = True
+ layout.operator("object.hide_view_clear", text="Show Hidden")
+ layout.operator("object.hide_view_set", text="Hide Selected")
+ layout.operator("object.hide_view_set", text="Hide Unselected").unselected = True
class VIEW3D_MT_make_single_user(bpy.types.Menu):
@@ -836,11 +898,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_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 **********
@@ -851,6 +934,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):
@@ -882,14 +966,14 @@ class VIEW3D_MT_vertex_group(bpy.types.Menu):
ob = context.active_object
if ob.mode == 'EDIT':
- if ob.vertex_groups and ob.active_vertex_group:
+ if ob.vertex_groups.active:
layout.separator()
layout.operator("object.vertex_group_assign", text="Assign to Active Group")
layout.operator("object.vertex_group_remove_from", text="Remove from Active Group")
layout.operator("object.vertex_group_remove_from", text="Remove from All").all = True
layout.separator()
- if ob.vertex_groups and ob.active_vertex_group:
+ if ob.vertex_groups.active:
layout.operator_menu_enum("object.vertex_group_set_active", "group", text="Set Active Group")
layout.operator("object.vertex_group_remove", text="Remove Active Group")
layout.operator("object.vertex_group_remove", text="Remove All Groups").all = True
@@ -923,12 +1007,13 @@ class VIEW3D_MT_sculpt(bpy.types.Menu):
def draw(self, context):
layout = self.layout
- sculpt = context.tool_settings.sculpt
- brush = context.tool_settings.sculpt.brush
+ tool_settings = context.tool_settings
+ sculpt = tool_settings.sculpt
+ brush = tool_settings.sculpt.brush
- layout.prop(sculpt, "symmetry_x")
- layout.prop(sculpt, "symmetry_y")
- layout.prop(sculpt, "symmetry_z")
+ layout.prop(sculpt, "use_symmetry_x")
+ layout.prop(sculpt, "use_symmetry_y")
+ layout.prop(sculpt, "use_symmetry_z")
layout.separator()
layout.prop(sculpt, "lock_x")
layout.prop(sculpt, "lock_y")
@@ -946,12 +1031,20 @@ class VIEW3D_MT_sculpt(bpy.types.Menu):
layout.prop(brush, "use_anchor")
if sculpt_tool in ('DRAW', 'PINCH', 'INFLATE', 'LAYER', 'CLAY'):
- layout.prop(brush, "flip_direction")
+ layout.prop_menu_enum(brush, "direction")
if sculpt_tool == 'LAYER':
layout.prop(brush, "use_persistent")
layout.operator("sculpt.set_persistent_base")
+ layout.separator()
+ layout.prop(sculpt, "use_threaded", text="Threaded Sculpt")
+ layout.prop(sculpt, "show_brush")
+
+ # TODO, make availabel from paint menu!
+ layout.prop(tool_settings, "sculpt_paint_use_unified_size", text="Unify Size")
+ layout.prop(tool_settings, "sculpt_paint_use_unified_strength", text="Unify Strength")
+
# ********** Particle menu **********
@@ -970,7 +1063,7 @@ class VIEW3D_MT_particle(bpy.types.Menu):
layout.operator("particle.remove_doubles")
layout.operator("particle.delete")
- if particle_edit.selection_mode == 'POINT':
+ if particle_edit.select_mode == 'POINT':
layout.operator("particle.subdivide")
layout.operator("particle.rekey")
@@ -991,15 +1084,15 @@ class VIEW3D_MT_particle_specials(bpy.types.Menu):
layout.operator("particle.rekey")
layout.separator()
- if particle_edit.selection_mode == 'POINT':
+ if particle_edit.select_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")
-class VIEW3D_MT_particle_showhide(VIEW3D_MT_showhide):
+class VIEW3D_MT_particle_showhide(ShowHideMenu, bpy.types.Menu):
_operator_name = "particle"
# ********** Pose Menu **********
@@ -1015,7 +1108,7 @@ class VIEW3D_MT_pose(bpy.types.Menu):
layout.menu("VIEW3D_MT_transform")
layout.menu("VIEW3D_MT_snap")
- if arm.drawtype in ('BBONE', 'ENVELOPE'):
+ if arm.draw_type in ('BBONE', 'ENVELOPE'):
layout.operator("transform.transform", text="Scale Envelope Distance").mode = 'BONESIZE'
layout.menu("VIEW3D_MT_pose_transform")
@@ -1048,6 +1141,7 @@ class VIEW3D_MT_pose(bpy.types.Menu):
layout.separator()
+ layout.menu("VIEW3D_MT_object_parent")
layout.menu("VIEW3D_MT_pose_ik")
layout.menu("VIEW3D_MT_pose_constraints")
@@ -1145,10 +1239,11 @@ 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")
-class VIEW3D_MT_pose_showhide(VIEW3D_MT_showhide):
+class VIEW3D_MT_pose_showhide(ShowHideMenu, bpy.types.Menu):
_operator_name = "pose"
@@ -1202,9 +1297,9 @@ class VIEW3D_MT_edit_mesh(bpy.types.Menu):
layout.separator()
- layout.prop(settings, "automerge_editing")
- layout.prop_menu_enum(settings, "proportional_editing")
- layout.prop_menu_enum(settings, "proportional_editing_falloff")
+ layout.prop(settings, "use_mesh_automerge")
+ layout.prop_menu_enum(settings, "proportional_edit")
+ layout.prop_menu_enum(settings, "proportional_edit_falloff")
layout.separator()
@@ -1246,15 +1341,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_select_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_select_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_select_mode"
class VIEW3D_MT_edit_mesh_extrude(bpy.types.Menu):
@@ -1263,7 +1358,7 @@ class VIEW3D_MT_edit_mesh_extrude(bpy.types.Menu):
@staticmethod
def extrude_options(context):
mesh = context.object.data
- selection_mode = context.tool_settings.mesh_selection_mode
+ selection_mode = context.tool_settings.mesh_select_mode
totface = mesh.total_face_sel
totedge = mesh.total_edge_sel
@@ -1345,7 +1440,7 @@ class VIEW3D_OT_edit_mesh_extrude_individual_move(bpy.types.Operator):
def execute(self, context):
mesh = context.object.data
- selection_mode = context.tool_settings.mesh_selection_mode
+ selection_mode = context.tool_settings.mesh_select_mode
totface = mesh.total_face_sel
totedge = mesh.total_edge_sel
@@ -1465,12 +1560,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()
@@ -1512,7 +1609,7 @@ class VIEW3D_MT_edit_mesh_normals(bpy.types.Menu):
layout.operator("mesh.flip_normals")
-class VIEW3D_MT_edit_mesh_showhide(VIEW3D_MT_showhide):
+class VIEW3D_MT_edit_mesh_showhide(ShowHideMenu, bpy.types.Menu):
_operator_name = "mesh"
# Edit Curve
@@ -1544,8 +1641,8 @@ def draw_curve(self, context):
layout.separator()
- layout.prop_menu_enum(settings, "proportional_editing")
- layout.prop_menu_enum(settings, "proportional_editing_falloff")
+ layout.prop_menu_enum(settings, "proportional_edit")
+ layout.prop_menu_enum(settings, "proportional_edit_falloff")
layout.separator()
@@ -1604,7 +1701,7 @@ class VIEW3D_MT_edit_curve_specials(bpy.types.Menu):
layout.operator("curve.smooth_radius")
-class VIEW3D_MT_edit_curve_showhide(VIEW3D_MT_showhide):
+class VIEW3D_MT_edit_curve_showhide(ShowHideMenu, bpy.types.Menu):
_operator_name = "curve"
@@ -1626,6 +1723,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"
@@ -1685,8 +1789,8 @@ class VIEW3D_MT_edit_meta(bpy.types.Menu):
layout.separator()
- layout.prop_menu_enum(settings, "proportional_editing")
- layout.prop_menu_enum(settings, "proportional_editing_falloff")
+ layout.prop_menu_enum(settings, "proportional_edit")
+ layout.prop_menu_enum(settings, "proportional_edit_falloff")
layout.separator()
@@ -1722,8 +1826,8 @@ class VIEW3D_MT_edit_lattice(bpy.types.Menu):
layout.separator()
- layout.prop_menu_enum(settings, "proportional_editing")
- layout.prop_menu_enum(settings, "proportional_editing_falloff")
+ layout.prop_menu_enum(settings, "proportional_edit")
+ layout.prop_menu_enum(settings, "proportional_edit_falloff")
class VIEW3D_MT_edit_armature(bpy.types.Menu):
@@ -1740,7 +1844,7 @@ class VIEW3D_MT_edit_armature(bpy.types.Menu):
layout.menu("VIEW3D_MT_snap")
layout.menu("VIEW3D_MT_edit_armature_roll")
- if arm.drawtype == 'ENVELOPE':
+ if arm.draw_type == 'ENVELOPE':
layout.operator("transform.transform", text="Scale Envelope Distance").mode = 'BONESIZE'
else:
layout.operator("transform.transform", text="Scale B-Bone Width").mode = 'BONESIZE'
@@ -1749,7 +1853,7 @@ class VIEW3D_MT_edit_armature(bpy.types.Menu):
layout.operator("armature.extrude_move")
- if arm.x_axis_mirror:
+ if arm.use_mirror_x:
layout.operator("armature.extrude_forked")
layout.operator("armature.duplicate_move")
@@ -1822,8 +1926,8 @@ class VIEW3D_MT_edit_armature_roll(bpy.types.Menu):
def draw(self, context):
layout = self.layout
- layout.operator("armature.calculate_roll", text="Clear Roll (Z-Axis Up)").type = 'GLOBALUP'
- layout.operator("armature.calculate_roll", text="Roll to Cursor").type = 'CURSOR'
+ layout.operator("armature.calculate_roll", text="Recalculate with Z-Axis Up").type = 'GLOBALUP'
+ layout.operator("armature.calculate_roll", text="Recalculate with Z-Axis to Cursor").type = 'CURSOR'
layout.separator()
@@ -1832,12 +1936,13 @@ 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"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
view = context.space_data
return (view)
@@ -1848,28 +1953,33 @@ 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="")
if view.lock_object and view.lock_object.type == 'ARMATURE':
- col.prop_object(view, "lock_bone", view.lock_object.data, "bones", text="")
+ col.prop_search(view, "lock_bone", view.lock_object.data, "bones", text="")
col = layout.column(align=True)
col.label(text="Clip:")
col.prop(view, "clip_start", text="Start")
col.prop(view, "clip_end", text="End")
+ 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"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return (context.space_data and context.active_object)
def draw(self, context):
@@ -1888,13 +1998,14 @@ 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"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
view = context.space_data
return (view)
@@ -1902,34 +2013,34 @@ class VIEW3D_PT_3dview_display(bpy.types.Panel):
layout = self.layout
view = context.space_data
- gs = context.scene.game_data
+ gs = context.scene.game_settings
ob = context.object
col = layout.column()
- col.prop(view, "display_render_override")
+ col.prop(view, "show_only_render")
col = layout.column()
- display_all = not view.display_render_override
+ display_all = not view.show_only_render
col.active = display_all
- col.prop(view, "outline_selected")
- col.prop(view, "all_object_origins")
- col.prop(view, "relationship_lines")
+ col.prop(view, "show_outline_selected")
+ col.prop(view, "show_all_objects_origin")
+ col.prop(view, "show_relationship_lines")
if ob and ob.type == 'MESH':
mesh = ob.data
- col.prop(mesh, "all_edges")
+ col.prop(mesh, "show_all_edges")
col = layout.column()
col.active = display_all
split = col.split(percentage=0.55)
- split.prop(view, "display_floor", text="Grid Floor")
+ split.prop(view, "show_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)
+ row.prop(view, "show_axis_x", text="X", toggle=True)
+ row.prop(view, "show_axis_y", text="Y", toggle=True)
+ row.prop(view, "show_axis_z", text="Z", toggle=True)
sub = col.column(align=True)
- sub.active = (display_all and view.display_floor)
+ sub.active = (display_all and view.show_floor)
sub.prop(view, "grid_lines", text="Lines")
sub.prop(view, "grid_spacing", text="Spacing")
sub.prop(view, "grid_subdivisions", text="Subdivisions")
@@ -1937,7 +2048,7 @@ class VIEW3D_PT_3dview_display(bpy.types.Panel):
col = layout.column()
col.label(text="Shading:")
col.prop(gs, "material_mode", text="")
- col.prop(view, "textured_solid")
+ col.prop(view, "show_textured_solid")
layout.separator()
@@ -1950,18 +2061,19 @@ class VIEW3D_PT_3dview_display(bpy.types.Panel):
col.prop(region, "lock_rotation")
row = col.row()
row.enabled = region.lock_rotation
- row.prop(region, "box_preview")
+ row.prop(region, "show_sync_view")
row = col.row()
- row.enabled = region.lock_rotation and region.box_preview
- row.prop(region, "box_clip")
+ row.enabled = region.lock_rotation and region.show_sync_view
+ row.prop(region, "use_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"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
# The active object check is needed because of localmode
return (context.active_object and (context.mode == 'EDIT_MESH'))
@@ -1972,32 +2084,33 @@ class VIEW3D_PT_3dview_meshdisplay(bpy.types.Panel):
col = layout.column()
col.label(text="Overlays:")
- col.prop(mesh, "draw_edges", text="Edges")
- col.prop(mesh, "draw_faces", text="Faces")
- col.prop(mesh, "draw_creases", text="Creases")
- col.prop(mesh, "draw_bevel_weights", text="Bevel Weights")
- col.prop(mesh, "draw_seams", text="Seams")
- col.prop(mesh, "draw_sharp", text="Sharp")
+ col.prop(mesh, "show_edges", text="Edges")
+ col.prop(mesh, "show_faces", text="Faces")
+ col.prop(mesh, "show_edge_crease", text="Creases")
+ col.prop(mesh, "show_edge_bevel_weight", text="Bevel Weights")
+ col.prop(mesh, "show_edge_seams", text="Seams")
+ col.prop(mesh, "show_edge_sharp", text="Sharp")
col.separator()
col.label(text="Normals:")
- col.prop(mesh, "draw_normals", text="Face")
- col.prop(mesh, "draw_vertex_normals", text="Vertex")
+ col.prop(mesh, "show_normal_face", text="Face")
+ col.prop(mesh, "show_normal_vertex", text="Vertex")
col.prop(context.scene.tool_settings, "normal_size", text="Normal Size")
col.separator()
col.label(text="Numerics:")
- col.prop(mesh, "draw_edge_lenght")
- col.prop(mesh, "draw_edge_angle")
- col.prop(mesh, "draw_face_area")
+ col.prop(mesh, "show_extra_edge_length")
+ col.prop(mesh, "show_extra_edge_angle")
+ col.prop(mesh, "show_extra_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"
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
editmesh = context.mode == 'EDIT_CURVE'
return (editmesh)
@@ -2008,8 +2121,8 @@ class VIEW3D_PT_3dview_curvedisplay(bpy.types.Panel):
col = layout.column()
col.label(text="Overlays:")
- col.prop(curve, "draw_handles", text="Handles")
- col.prop(curve, "draw_normals", text="Normals")
+ col.prop(curve, "show_handles", text="Handles")
+ col.prop(curve, "show_normal_face", text="Normals")
col.prop(context.scene.tool_settings, "normal_size", text="Normal Size")
@@ -2017,9 +2130,10 @@ class VIEW3D_PT_background_image(bpy.types.Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_label = "Background Images"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
view = context.space_data
# bg = context.space_data.background_image
return (view)
@@ -2028,7 +2142,7 @@ class VIEW3D_PT_background_image(bpy.types.Panel):
layout = self.layout
view = context.space_data
- layout.prop(view, "display_background_images", text="")
+ layout.prop(view, "show_background_images", text="")
def draw(self, context):
layout = self.layout
@@ -2039,10 +2153,10 @@ class VIEW3D_PT_background_image(bpy.types.Panel):
col.operator("view3d.add_background_image", text="Add Image")
for i, bg in enumerate(view.background_images):
- layout.active = view.display_background_images
+ layout.active = view.show_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
@@ -2055,19 +2169,21 @@ class VIEW3D_PT_background_image(bpy.types.Panel):
box.template_image(bg, "image", bg.image_user, compact=True)
box.prop(bg, "transparency", slider=True)
- box.prop(bg, "size")
- row = box.row(align=True)
- row.prop(bg, "offset_x", text="X")
- row.prop(bg, "offset_y", text="Y")
+ if bg.view_axis != 'CAMERA':
+ box.prop(bg, "size")
+ row = box.row(align=True)
+ row.prop(bg, "offset_x", text="X")
+ row.prop(bg, "offset_y", text="Y")
class VIEW3D_PT_transform_orientations(bpy.types.Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_label = "Transform Orientations"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
view = context.space_data
return (view)
@@ -2092,9 +2208,10 @@ class VIEW3D_PT_etch_a_ton(bpy.types.Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_label = "Skeleton Sketching"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
scene = context.space_data
ob = context.active_object
return scene and ob and ob.type == 'ARMATURE' and ob.mode == 'EDIT'
@@ -2103,7 +2220,7 @@ class VIEW3D_PT_etch_a_ton(bpy.types.Panel):
layout = self.layout
toolsettings = context.scene.tool_settings
- layout.prop(toolsettings, "bone_sketching", text="")
+ layout.prop(toolsettings, "use_bone_sketching", text="")
def draw(self, context):
layout = self.layout
@@ -2111,8 +2228,8 @@ class VIEW3D_PT_etch_a_ton(bpy.types.Panel):
col = layout.column()
- col.prop(toolsettings, "etch_quick")
- col.prop(toolsettings, "etch_overdraw")
+ col.prop(toolsettings, "use_etch_quick")
+ col.prop(toolsettings, "use_etch_overdraw")
col.prop(toolsettings, "etch_convert_mode")
@@ -2125,18 +2242,19 @@ class VIEW3D_PT_etch_a_ton(bpy.types.Panel):
elif toolsettings.etch_convert_mode == 'RETARGET':
col.prop(toolsettings, "etch_template")
col.prop(toolsettings, "etch_roll_mode")
- col.prop(toolsettings, "etch_autoname")
+ col.prop(toolsettings, "use_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):
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_label = "Properties"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def _active_context_member(self, context):
+ def _active_context_member(context):
obj = context.object
if obj:
mode = obj.mode
@@ -2149,8 +2267,9 @@ class VIEW3D_PT_context_properties(bpy.types.Panel):
return ""
- def poll(self, context):
- member = self._active_context_member(context)
+ @classmethod
+ def poll(cls, context):
+ member = cls._active_context_member(context)
if member:
context_member = getattr(context, member)
return context_member and context_member.keys()
@@ -2160,127 +2279,19 @@ class VIEW3D_PT_context_properties(bpy.types.Panel):
def draw(self, context):
import rna_prop_ui
# reload(rna_prop_ui)
- member = self._active_context_member(context)
+ member = __class__._active_context_member(context)
if member:
# Draw with no edit button
rna_prop_ui.draw(self.layout, context, member, False)
-classes = [
- VIEW3D_OT_edit_mesh_extrude_move, # detects constraints setup and extrude region
- VIEW3D_OT_edit_mesh_extrude_individual_move,
-
- VIEW3D_HT_header, # Header
-
- VIEW3D_MT_view, #View Menus
- VIEW3D_MT_view_navigation,
- VIEW3D_MT_view_align,
- VIEW3D_MT_view_align_selected,
- VIEW3D_MT_view_cameras,
-
- VIEW3D_MT_select_object, # Select Menus
- VIEW3D_MT_select_pose,
- VIEW3D_MT_select_particle,
- VIEW3D_MT_select_edit_mesh,
- VIEW3D_MT_select_edit_curve,
- VIEW3D_MT_select_edit_surface,
- VIEW3D_MT_select_edit_metaball,
- VIEW3D_MT_select_edit_lattice,
- VIEW3D_MT_select_edit_armature,
- VIEW3D_MT_select_face, # XXX todo
-
- VIEW3D_MT_transform, # Object/Edit Menus
- VIEW3D_MT_mirror, # Object/Edit Menus
- VIEW3D_MT_snap, # Object/Edit Menus
- VIEW3D_MT_uv_map, # Edit Menus
-
- VIEW3D_MT_object, # Object Menu
- VIEW3D_MT_object_specials,
- VIEW3D_MT_object_apply,
- VIEW3D_MT_object_clear,
- VIEW3D_MT_object_parent,
- VIEW3D_MT_object_track,
- VIEW3D_MT_object_group,
- VIEW3D_MT_object_constraints,
- VIEW3D_MT_object_showhide,
- VIEW3D_MT_make_single_user,
- VIEW3D_MT_make_links,
-
- VIEW3D_MT_hook,
- VIEW3D_MT_vertex_group,
-
- VIEW3D_MT_sculpt, # Sculpt Menu
- VIEW3D_MT_paint_vertex,
- VIEW3D_MT_paint_weight,
-
- VIEW3D_MT_particle, # Particle Menu
- VIEW3D_MT_particle_specials,
- VIEW3D_MT_particle_showhide,
-
- VIEW3D_MT_pose, # POSE Menu
- VIEW3D_MT_pose_transform,
- VIEW3D_MT_pose_pose,
- VIEW3D_MT_pose_motion,
- VIEW3D_MT_pose_group,
- VIEW3D_MT_pose_ik,
- VIEW3D_MT_pose_constraints,
- VIEW3D_MT_pose_showhide,
- VIEW3D_MT_pose_apply,
-
- VIEW3D_MT_edit_mesh,
- VIEW3D_MT_edit_mesh_specials, # Only as a menu for keybindings
- VIEW3D_MT_edit_mesh_selection_mode, # Only as a menu for keybindings
- VIEW3D_MT_edit_mesh_vertices,
- VIEW3D_MT_edit_mesh_edges,
- VIEW3D_MT_edit_mesh_faces,
- VIEW3D_MT_edit_mesh_normals,
- VIEW3D_MT_edit_mesh_showhide,
- VIEW3D_MT_edit_mesh_extrude, # use with VIEW3D_OT_edit_mesh_extrude_menu
-
- VIEW3D_MT_edit_curve,
- VIEW3D_MT_edit_curve_ctrlpoints,
- VIEW3D_MT_edit_curve_segments,
- VIEW3D_MT_edit_curve_specials,
- VIEW3D_MT_edit_curve_showhide,
-
- VIEW3D_MT_edit_surface,
-
- VIEW3D_MT_edit_text,
- VIEW3D_MT_edit_text_chars,
-
- VIEW3D_MT_edit_meta,
- VIEW3D_MT_edit_meta_showhide,
-
- VIEW3D_MT_edit_lattice,
-
- VIEW3D_MT_edit_armature,
- VIEW3D_MT_edit_armature_parent,
- VIEW3D_MT_edit_armature_roll,
-
- 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_background_image,
- VIEW3D_PT_transform_orientations,
- VIEW3D_PT_etch_a_ton,
- VIEW3D_PT_context_properties]
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/scripts/ui/space_view3d_toolbar.py b/release/scripts/ui/space_view3d_toolbar.py
index 099e7944784..712f06c8fe3 100644
--- a/release/scripts/ui/space_view3d_toolbar.py
+++ b/release/scripts/ui/space_view3d_toolbar.py
@@ -20,7 +20,7 @@
import bpy
-class View3DPanel(bpy.types.Panel):
+class View3DPanel():
bl_space_type = 'VIEW_3D'
bl_region_type = 'TOOLS'
@@ -28,7 +28,7 @@ class View3DPanel(bpy.types.Panel):
# ********** default tools for objectmode ****************
-class VIEW3D_PT_tools_objectmode(View3DPanel):
+class VIEW3D_PT_tools_objectmode(View3DPanel, bpy.types.Panel):
bl_context = "objectmode"
bl_label = "Object Tools"
@@ -42,6 +42,9 @@ class VIEW3D_PT_tools_objectmode(View3DPanel):
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")
col.operator("object.delete")
@@ -75,7 +78,7 @@ class VIEW3D_PT_tools_objectmode(View3DPanel):
# ********** default tools for editmode_mesh ****************
-class VIEW3D_PT_tools_meshedit(View3DPanel):
+class VIEW3D_PT_tools_meshedit(View3DPanel, bpy.types.Panel):
bl_context = "mesh_edit"
bl_label = "Mesh Tools"
@@ -143,7 +146,7 @@ class VIEW3D_PT_tools_meshedit(View3DPanel):
row.operator("gpencil.draw", text="Erase").mode = 'ERASER'
-class VIEW3D_PT_tools_meshedit_options(View3DPanel):
+class VIEW3D_PT_tools_meshedit_options(View3DPanel, bpy.types.Panel):
bl_context = "mesh_edit"
bl_label = "Mesh Options"
@@ -162,7 +165,7 @@ class VIEW3D_PT_tools_meshedit_options(View3DPanel):
# ********** default tools for editmode_curve ****************
-class VIEW3D_PT_tools_curveedit(View3DPanel):
+class VIEW3D_PT_tools_curveedit(View3DPanel, bpy.types.Panel):
bl_context = "curve_edit"
bl_label = "Curve Tools"
@@ -216,7 +219,7 @@ class VIEW3D_PT_tools_curveedit(View3DPanel):
# ********** default tools for editmode_surface ****************
-class VIEW3D_PT_tools_surfaceedit(View3DPanel):
+class VIEW3D_PT_tools_surfaceedit(View3DPanel, bpy.types.Panel):
bl_context = "surface_edit"
bl_label = "Surface Tools"
@@ -256,7 +259,7 @@ class VIEW3D_PT_tools_surfaceedit(View3DPanel):
# ********** default tools for editmode_text ****************
-class VIEW3D_PT_tools_textedit(View3DPanel):
+class VIEW3D_PT_tools_textedit(View3DPanel, bpy.types.Panel):
bl_context = "text_edit"
bl_label = "Text Tools"
@@ -289,7 +292,7 @@ class VIEW3D_PT_tools_textedit(View3DPanel):
# ********** default tools for editmode_armature ****************
-class VIEW3D_PT_tools_armatureedit(View3DPanel):
+class VIEW3D_PT_tools_armatureedit(View3DPanel, bpy.types.Panel):
bl_context = "armature_edit"
bl_label = "Armature Tools"
@@ -326,7 +329,7 @@ class VIEW3D_PT_tools_armatureedit(View3DPanel):
row.operator("gpencil.draw", text="Erase").mode = 'ERASER'
-class VIEW3D_PT_tools_armatureedit_options(View3DPanel):
+class VIEW3D_PT_tools_armatureedit_options(View3DPanel, bpy.types.Panel):
bl_context = "armature_edit"
bl_label = "Armature Options"
@@ -336,12 +339,12 @@ class VIEW3D_PT_tools_armatureedit_options(View3DPanel):
arm = context.active_object.data
col = layout.column(align=True)
- col.prop(arm, "x_axis_mirror")
+ col.prop(arm, "use_mirror_x")
# ********** default tools for editmode_mball ****************
-class VIEW3D_PT_tools_mballedit(View3DPanel):
+class VIEW3D_PT_tools_mballedit(View3DPanel, bpy.types.Panel):
bl_context = "mball_edit"
bl_label = "Meta Tools"
@@ -369,7 +372,7 @@ class VIEW3D_PT_tools_mballedit(View3DPanel):
# ********** default tools for editmode_lattice ****************
-class VIEW3D_PT_tools_latticeedit(View3DPanel):
+class VIEW3D_PT_tools_latticeedit(View3DPanel, bpy.types.Panel):
bl_context = "lattice_edit"
bl_label = "Lattice Tools"
@@ -401,7 +404,7 @@ class VIEW3D_PT_tools_latticeedit(View3DPanel):
# ********** default tools for posemode ****************
-class VIEW3D_PT_tools_posemode(View3DPanel):
+class VIEW3D_PT_tools_posemode(View3DPanel, bpy.types.Panel):
bl_context = "posemode"
bl_label = "Pose Tools"
@@ -449,7 +452,7 @@ class VIEW3D_PT_tools_posemode(View3DPanel):
row.operator("gpencil.draw", text="Erase").mode = 'ERASER'
-class VIEW3D_PT_tools_posemode_options(View3DPanel):
+class VIEW3D_PT_tools_posemode_options(View3DPanel, bpy.types.Panel):
bl_context = "posemode"
bl_label = "Pose Options"
@@ -459,17 +462,18 @@ class VIEW3D_PT_tools_posemode_options(View3DPanel):
arm = context.active_object.data
col = layout.column(align=True)
- col.prop(arm, "x_axis_mirror")
- col.prop(arm, "auto_ik")
+ col.prop(arm, "use_mirror_x")
+ col.prop(arm, "use_auto_ik")
# ********** default tools for paint modes ****************
-class PaintPanel(bpy.types.Panel):
+class PaintPanel():
bl_space_type = 'VIEW_3D'
bl_region_type = 'TOOLS'
- def paint_settings(self, context):
+ @staticmethod
+ def paint_settings(context):
ts = context.tool_settings
if context.sculpt_object:
@@ -483,35 +487,25 @@ class PaintPanel(bpy.types.Panel):
elif context.particle_edit_object:
return ts.particle_edit
- return False
+ return None
-class VIEW3D_PT_tools_brush(PaintPanel):
+class VIEW3D_PT_tools_brush(PaintPanel, bpy.types.Panel):
bl_label = "Brush"
- def poll(self, context):
- return self.paint_settings(context)
+ @classmethod
+ def poll(cls, context):
+ return cls.paint_settings(context)
def draw(self, context):
layout = self.layout
- settings = self.paint_settings(context)
+ settings = __class__.paint_settings(context)
brush = settings.brush
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
- else:
- defaultbrushes = 7
-
- row.template_list(settings, "brushes", settings, "active_brush_index", rows=2, maxrows=defaultbrushes)
-
- col.template_ID(settings, "brush", new="brush.add")
+ col.template_ID_preview(settings, "brush", new="brush.add", rows=3, cols=8)
# Particle Mode #
@@ -529,11 +523,11 @@ class VIEW3D_PT_tools_brush(PaintPanel):
if settings.tool == 'ADD':
col.prop(brush, "count")
col = layout.column()
- col.prop(settings, "add_interpolate")
+ col.prop(settings, "use_default_interpolate")
sub = col.column(align=True)
- sub.active = settings.add_interpolate
+ sub.active = settings.use_default_interpolate
sub.prop(brush, "steps", slider=True)
- sub.prop(settings, "add_keys", slider=True)
+ sub.prop(settings, "default_key_count", slider=True)
elif settings.tool == 'LENGTH':
layout.prop(brush, "length_mode", expand=True)
elif settings.tool == 'PUFF':
@@ -543,44 +537,118 @@ class VIEW3D_PT_tools_brush(PaintPanel):
# Sculpt Mode #
elif context.sculpt_object and brush:
+
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 brush.use_locked_size:
+ row.prop(brush, "use_locked_size", toggle=True, text="", icon='LOCKED')
+ row.prop(brush, "unprojected_radius", text="Radius", slider=True)
+ else:
+ row.prop(brush, "use_locked_size", toggle=True, text="", icon='UNLOCKED')
+ row.prop(brush, "size", text="Radius", slider=True)
+
+ row.prop(brush, "use_pressure_size", 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)
- 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="")
+ 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')
- col = layout.column()
+ row.prop(brush, "strength", text="Strength", slider=True)
+ row.prop(brush, "use_pressure_strength", text="")
+
+
+
+ if brush.sculpt_tool not in ('SMOOTH'):
+ col.separator()
+
+ row = col.row(align=True)
+ row.prop(brush, "auto_smooth_factor", slider=True)
+ row.prop(brush, "use_inverse_smooth_pressure", toggle=True, text="")
+
+
+
+ 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")
+
+ col.separator()
+ col.row().prop(brush, "direction", expand=True)
+
+ if brush.sculpt_tool in ('DRAW', 'CREASE', 'BLOB', 'INFLATE', 'LAYER', 'CLAY'):
+ col.separator()
+
+ col.prop(brush, "use_accumulate")
- if brush.sculpt_tool in ('DRAW', 'PINCH', 'INFLATE', 'LAYER', 'CLAY'):
- col.row().prop(brush, "direction", expand=True)
- if brush.sculpt_tool in ('DRAW', 'INFLATE', 'LAYER'):
- col.prop(brush, "use_accumulate")
- if brush.sculpt_tool == 'LAYER':
- ob = context.sculpt_object
- do_persistent = True
+ if brush.sculpt_tool == 'LAYER':
+ col.separator()
- # not supported yet for this case
- for md in ob.modifiers:
- if md.type == 'MULTIRES':
- do_persistent = False
+ ob = context.sculpt_object
+ do_persistent = True
- if do_persistent:
- col.prop(brush, "use_persistent")
- col.operator("sculpt.set_persistent_base")
+ # 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")
# Texture Paint Mode #
@@ -590,16 +658,16 @@ class VIEW3D_PT_tools_brush(PaintPanel):
col.prop(brush, "color", text="")
row = col.row(align=True)
- row.prop(brush, "size", slider=True)
- row.prop(brush, "use_size_pressure", toggle=True, text="")
+ row.prop(brush, "size", text="Radius", slider=True)
+ row.prop(brush, "use_pressure_size", toggle=True, text="")
row = col.row(align=True)
- row.prop(brush, "strength", slider=True)
- row.prop(brush, "use_strength_pressure", toggle=True, text="")
+ row.prop(brush, "strength", text="Strength", slider=True)
+ row.prop(brush, "use_pressure_strength", toggle=True, text="")
row = col.row(align=True)
row.prop(brush, "jitter", slider=True)
- row.prop(brush, "use_jitter_pressure", toggle=True, text="")
+ row.prop(brush, "use_pressure_jitter", toggle=True, text="")
col.prop(brush, "blend", text="Blend")
@@ -612,20 +680,21 @@ class VIEW3D_PT_tools_brush(PaintPanel):
elif context.weight_paint_object and brush:
layout.prop(context.tool_settings, "vertex_group_weight", text="Weight", slider=True)
- layout.prop(context.tool_settings, "auto_normalize", text="Auto Normalize")
+ layout.prop(context.tool_settings, "use_auto_normalize", text="Auto Normalize")
col = layout.column()
+
row = col.row(align=True)
- row.prop(brush, "size", slider=True)
- row.prop(brush, "use_size_pressure", toggle=True, text="")
+ row.prop(brush, "size", text="Radius", slider=True)
+ row.prop(brush, "use_pressure_size", toggle=True, text="")
row = col.row(align=True)
- row.prop(brush, "strength", slider=True)
- row.prop(brush, "use_strength_pressure", toggle=True, text="")
+ row.prop(brush, "strength", text="Strength", slider=True)
+ row.prop(brush, "use_pressure_strength", toggle=True, text="")
row = col.row(align=True)
row.prop(brush, "jitter", slider=True)
- row.prop(brush, "use_jitter_pressure", toggle=True, text="")
+ row.prop(brush, "use_pressure_jitter", toggle=True, text="")
# Vertex Paint Mode #
@@ -635,48 +704,125 @@ class VIEW3D_PT_tools_brush(PaintPanel):
col.prop(brush, "color", text="")
row = col.row(align=True)
- row.prop(brush, "size", slider=True)
- row.prop(brush, "use_size_pressure", toggle=True, text="")
+ row.prop(brush, "size", text="Radius", slider=True)
+ row.prop(brush, "use_pressure_size", toggle=True, text="")
row = col.row(align=True)
- row.prop(brush, "strength", slider=True)
- row.prop(brush, "use_strength_pressure", toggle=True, text="")
+ row.prop(brush, "strength", text="Strength", slider=True)
+ row.prop(brush, "use_pressure_strength", toggle=True, text="")
# XXX - TODO
#row = col.row(align=True)
#row.prop(brush, "jitter", slider=True)
- #row.prop(brush, "use_jitter_pressure", toggle=True, text="")
+ #row.prop(brush, "use_pressure_jitter", toggle=True, text="")
-class VIEW3D_PT_tools_brush_texture(PaintPanel):
+class VIEW3D_PT_tools_brush_texture(PaintPanel, bpy.types.Panel):
bl_label = "Texture"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
- settings = self.paint_settings(context)
+ @classmethod
+ def poll(cls, context):
+ settings = cls.paint_settings(context)
return (settings and settings.brush and (context.sculpt_object or
context.texture_paint_object))
def draw(self, context):
layout = self.layout
- settings = self.paint_settings(context)
+ settings = __class__.paint_settings(context)
brush = settings.brush
tex_slot = brush.texture_slot
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)
+
+ if context.sculpt_object:
+ #XXX duplicated from properties_texture.py
+
+
+
+ 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_random", 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")
- col.row().prop(tex_slot, "map_mode", expand=True)
+ col = split.column()
+ col.prop(tex_slot, "size")
-class VIEW3D_PT_tools_brush_tool(PaintPanel):
+ 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, bpy.types.Panel):
bl_label = "Tool"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
- settings = self.paint_settings(context)
+ @classmethod
+ def poll(cls, context):
+ settings = cls.paint_settings(context)
return (settings and settings.brush and
(context.sculpt_object or context.texture_paint_object or
context.vertex_paint_object or context.weight_paint_object))
@@ -684,7 +830,7 @@ class VIEW3D_PT_tools_brush_tool(PaintPanel):
def draw(self, context):
layout = self.layout
- settings = self.paint_settings(context)
+ settings = __class__.paint_settings(context)
brush = settings.brush
texture_paint = context.texture_paint_object
sculpt = context.sculpt_object
@@ -692,23 +838,27 @@ 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="")
+ col.operator("brush.reset")
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="")
+
+ row = layout.row(align=True)
+ row.prop(brush, "use_paint_sculpt", text="", icon='SCULPTMODE_HLT')
+ row.prop(brush, "use_paint_vertex", text="", icon='VPAINT_HLT')
+ row.prop(brush, "use_paint_weight", text="", icon='WPAINT_HLT')
+ row.prop(brush, "use_paint_texture", text="", icon='TPAINT_HLT')
-class VIEW3D_PT_tools_brush_stroke(PaintPanel):
+class VIEW3D_PT_tools_brush_stroke(PaintPanel, bpy.types.Panel):
bl_label = "Stroke"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
- settings = self.paint_settings(context)
+ @classmethod
+ def poll(cls, context):
+ settings = cls.paint_settings(context)
return (settings and settings.brush and (context.sculpt_object or
context.vertex_paint_object or
context.weight_paint_object or
@@ -717,90 +867,230 @@ class VIEW3D_PT_tools_brush_stroke(PaintPanel):
def draw(self, context):
layout = self.layout
- settings = self.paint_settings(context)
+ settings = __class__.paint_settings(context)
brush = settings.brush
texture_paint = context.texture_paint_object
+ col = layout.column()
+
if context.sculpt_object:
- if brush.sculpt_tool != 'LAYER':
- layout.prop(brush, "use_anchor")
- layout.prop(brush, "use_rake")
+ col.label(text="Stroke Method:")
+ col.prop(brush, "stroke_method", text="")
+
+ if brush.use_anchor:
+ col.separator()
+ row = col.row()
+ row.prop(brush, "use_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.use_restore_mesh):
+ col = layout.column()
+ col.separator()
- layout.prop(brush, "use_airbrush")
- col = layout.column()
- col.active = brush.use_airbrush
- col.prop(brush, "rate", slider=True)
+ 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_pressure_jitter", 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()
- if not texture_paint:
- layout.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.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()
-class VIEW3D_PT_tools_brush_curve(PaintPanel):
+ #if texture_paint:
+ # row.prop(brush, "use_pressure_spacing", toggle=True, text="")
+
+
+class VIEW3D_PT_tools_brush_curve(PaintPanel, bpy.types.Panel):
bl_label = "Curve"
- bl_default_closed = True
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
- settings = self.paint_settings(context)
+ @classmethod
+ def poll(cls, context):
+ settings = cls.paint_settings(context)
return (settings and settings.brush and settings.brush.curve)
def draw(self, context):
layout = self.layout
settings = self.paint_settings(context)
+
brush = settings.brush
layout.template_curve_mapping(brush, "curve", brush=True)
row = layout.row(align=True)
- row.operator("brush.curve_preset", text="Sharp").shape = 'SHARP'
- row.operator("brush.curve_preset", text="Smooth").shape = 'SMOOTH'
- row.operator("brush.curve_preset", text="Max").shape = 'MAX'
+ 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'
-class VIEW3D_PT_sculpt_options(PaintPanel):
+class VIEW3D_PT_sculpt_options(PaintPanel, bpy.types.Panel):
bl_label = "Options"
+ bl_options = {'DEFAULT_CLOSED'}
- def poll(self, context):
+ @classmethod
+ def poll(cls, context):
return (context.sculpt_object and context.tool_settings.sculpt)
def draw(self, context):
layout = self.layout
- sculpt = context.tool_settings.sculpt
- col = layout.column()
- col.prop(sculpt, "show_brush")
- col.prop(sculpt, "fast_navigate")
+ tool_settings = context.tool_settings
+ sculpt = tool_settings.sculpt
+ settings = __class__.paint_settings(context)
+ brush = settings.brush
- split = self.layout.split()
+ split = layout.split()
col = split.column()
- col.label(text="Symmetry:")
- col.prop(sculpt, "symmetry_x", text="X")
- col.prop(sculpt, "symmetry_y", text="Y")
- col.prop(sculpt, "symmetry_z", text="Z")
+
+ col.prop(sculpt, "use_threaded", text="Threaded Sculpt")
+ col.prop(sculpt, "show_low_resolution")
+ col.prop(sculpt, "show_brush")
+
+ col.label(text="Unified Settings:")
+ col.prop(tool_settings, "sculpt_paint_use_unified_size", text="Size")
+ col.prop(tool_settings, "sculpt_paint_use_unified_strength", text="Strength")
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")
+ 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, bpy.types.Panel):
+ bl_label = "Symmetry"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ return (context.sculpt_object and context.tool_settings.sculpt)
+
+ def draw(self, context):
+
+ layout = self.layout
+
+ sculpt = context.tool_settings.sculpt
+ settings = __class__.paint_settings(context)
+ brush = settings.brush
+
+ split = layout.split()
+
+ col = split.column()
+
+ col.label(text="Mirror:")
+ col.prop(sculpt, "use_symmetry_x", text="X")
+ col.prop(sculpt, "use_symmetry_y", text="Y")
+ col.prop(sculpt, "use_symmetry_z", text="Z")
+
+ col = split.column()
+
+ col.prop(sculpt, "radial_symmetry", text="Radial")
+
+ col = layout.column()
+
+ col.separator()
+
+ col.prop(sculpt, "use_symmetry_feather", text="Feather")
+
+class VIEW3D_PT_tools_brush_appearance(PaintPanel, bpy.types.Panel):
+ bl_label = "Appearance"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, 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 = __class__.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', 'PINCH', 'CREASE', 'BLOB', 'FLATTEN', 'FILL', 'SCRAPE', 'CLAY_TUBES'):
+ if brush.sculpt_tool in ('DRAW', 'INFLATE', 'CLAY', 'PINCH', 'CREASE', 'BLOB', 'FLATTEN', 'FILL', 'SCRAPE'):
+ col.prop(brush, "cursor_color_add", text="Add Color")
+ col.prop(brush, "cursor_color_subtract", text="Subtract Color")
+ else:
+ col.prop(brush, "cursor_color_add", text="Color")
+ else:
+ col.prop(brush, "cursor_color_add", text="Color")
+
+ col = layout.column()
+ col.label(text="Icon:")
+
+ row = col.row(align=True)
+ row.prop(brush, "use_custom_icon")
+ if brush.use_custom_icon:
+ row = col.row(align=True)
+ row.prop(brush, "icon_filepath", text="")
# ********** default tools for weightpaint ****************
-class VIEW3D_PT_tools_weightpaint(View3DPanel):
+class VIEW3D_PT_tools_weightpaint(View3DPanel, bpy.types.Panel):
bl_context = "weightpaint"
bl_label = "Weight Tools"
@@ -815,19 +1105,20 @@ class VIEW3D_PT_tools_weightpaint(View3DPanel):
col.operator("object.vertex_group_levels", text="Levels")
-class VIEW3D_PT_tools_weightpaint_options(View3DPanel):
+class VIEW3D_PT_tools_weightpaint_options(View3DPanel, bpy.types.Panel):
bl_context = "weightpaint"
bl_label = "Options"
def draw(self, context):
layout = self.layout
- wpaint = context.tool_settings.weight_paint
+ tool_settings = context.tool_settings
+ wpaint = tool_settings.weight_paint
col = layout.column()
- col.prop(wpaint, "all_faces")
- col.prop(wpaint, "normals")
- col.prop(wpaint, "spray")
+ col.prop(wpaint, "use_all_faces")
+ col.prop(wpaint, "use_normal")
+ col.prop(wpaint, "use_spray")
obj = context.weight_paint_object
if obj.type == 'MESH':
@@ -835,6 +1126,10 @@ class VIEW3D_PT_tools_weightpaint_options(View3DPanel):
col.prop(mesh, "use_mirror_x")
col.prop(mesh, "use_mirror_topology")
+ col.label(text="Unified Settings:")
+ col.prop(tool_settings, "sculpt_paint_use_unified_size", text="Size")
+ col.prop(tool_settings, "sculpt_paint_use_unified_strength", text="Strength")
+
# Commented out because the Apply button isn't an operator yet, making these settings useless
# col.label(text="Gamma:")
# col.prop(wpaint, "gamma", text="")
@@ -847,20 +1142,25 @@ class VIEW3D_PT_tools_weightpaint_options(View3DPanel):
# ********** default tools for vertexpaint ****************
-class VIEW3D_PT_tools_vertexpaint(View3DPanel):
+class VIEW3D_PT_tools_vertexpaint(View3DPanel, bpy.types.Panel):
bl_context = "vertexpaint"
bl_label = "Options"
def draw(self, context):
layout = self.layout
- vpaint = context.tool_settings.vertex_paint
+ tool_settings = context.tool_settings
+ vpaint = tool_settings.vertex_paint
col = layout.column()
#col.prop(vpaint, "mode", text="")
- col.prop(vpaint, "all_faces")
- col.prop(vpaint, "normals")
- col.prop(vpaint, "spray")
+ col.prop(vpaint, "use_all_faces")
+ col.prop(vpaint, "use_normal")
+ col.prop(vpaint, "use_spray")
+
+ col.label(text="Unified Settings:")
+ col.prop(tool_settings, "sculpt_paint_use_unified_size", text="Size")
+ col.prop(tool_settings, "sculpt_paint_use_unified_strength", text="Strength")
# Commented out because the Apply button isn't an operator yet, making these settings useless
# col.label(text="Gamma:")
@@ -871,12 +1171,14 @@ class VIEW3D_PT_tools_vertexpaint(View3DPanel):
# ********** default tools for texturepaint ****************
-class VIEW3D_PT_tools_projectpaint(View3DPanel):
+class VIEW3D_PT_tools_projectpaint(View3DPanel, bpy.types.Panel):
bl_context = "texturepaint"
bl_label = "Project Paint"
- def poll(self, context):
- return context.tool_settings.image_paint.brush.imagepaint_tool != 'SMEAR'
+ @classmethod
+ def poll(cls, context):
+ brush = context.tool_settings.image_paint.brush
+ return (brush and brush.imagepaint_tool != 'SMEAR')
def draw_header(self, context):
ipaint = context.tool_settings.image_paint
@@ -894,7 +1196,7 @@ class VIEW3D_PT_tools_projectpaint(View3DPanel):
sub = col.column()
sub.active = use_projection
sub.prop(ipaint, "use_occlude")
- sub.prop(ipaint, "use_backface_cull")
+ sub.prop(ipaint, "use_backface_culling")
split = layout.split()
@@ -940,6 +1242,24 @@ class VIEW3D_PT_tools_projectpaint(View3DPanel):
sub.operator("image.save_dirty", text="Save All Edited")
+class VIEW3D_PT_imagepaint_options(PaintPanel):
+ bl_label = "Options"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ return (context.texture_paint_object and context.tool_settings.image_paint)
+
+ def draw(self, context):
+ layout = self.layout
+
+ col = layout.column()
+
+ tool_settings = context.tool_settings
+ col.label(text="Unified Settings:")
+ col.prop(tool_settings, "sculpt_paint_use_unified_size", text="Size")
+ col.prop(tool_settings, "sculpt_paint_use_unified_strength", text="Strength")
+
class VIEW3D_MT_tools_projectpaint_clone(bpy.types.Menu):
bl_label = "Clone Layer"
@@ -947,7 +1267,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
@@ -958,11 +1278,11 @@ 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
-class VIEW3D_PT_tools_particlemode(View3DPanel):
+class VIEW3D_PT_tools_particlemode(View3DPanel, bpy.types.Panel):
'''default tools for particle mode'''
bl_context = "particlemode"
bl_label = "Options"
@@ -980,95 +1300,61 @@ class VIEW3D_PT_tools_particlemode(View3DPanel):
if pe.type == 'PARTICLES':
if ob.particle_systems:
if len(ob.particle_systems) > 1:
- layout.template_list(ob, "particle_systems", ob, "active_particle_system_index", type='ICONS')
+ layout.template_list(ob, "particle_systems", ob.particle_systems, "active_index", type='ICONS')
- ptcache = ob.particle_systems[ob.active_particle_system_index].point_cache
+ ptcache = ob.particle_systems.active.point_cache
else:
for md in ob.modifiers:
if md.type == pe.type:
ptcache = md.point_cache
- if ptcache and len(ptcache.point_cache_list) > 1:
- layout.template_list(ptcache, "point_cache_list", ptcache, "active_point_cache_index", type='ICONS')
+ if ptcache and len(ptcache.point_caches) > 1:
+ layout.template_list(ptcache, "point_caches", ptcache.point_caches, "active_index", type='ICONS')
- if not pe.editable:
+ if not pe.is_editable:
layout.label(text="Point cache must be baked")
layout.label(text="to enable editing!")
col = layout.column(align=True)
- if pe.hair:
- col.active = pe.editable
- col.prop(pe, "emitter_deflect", text="Deflect emitter")
+ if pe.is_hair:
+ col.active = pe.is_editable
+ col.prop(pe, "use_emitter_deflect", text="Deflect emitter")
sub = col.row()
- sub.active = pe.emitter_deflect
+ sub.active = pe.use_emitter_deflect
sub.prop(pe, "emitter_distance", text="Distance")
col = layout.column(align=True)
- col.active = pe.editable
+ col.active = pe.is_editable
col.label(text="Keep:")
- col.prop(pe, "keep_lengths", text="Lenghts")
- col.prop(pe, "keep_root", text="Root")
- if not pe.hair:
+ col.prop(pe, "use_preserve_length", text="Lengths")
+ col.prop(pe, "use_preserve_root", text="Root")
+ if not pe.is_hair:
col.label(text="Correct:")
- col.prop(pe, "auto_velocity", text="Velocity")
+ col.prop(pe, "use_auto_velocity", text="Velocity")
col.prop(ob.data, "use_mirror_x")
col = layout.column(align=True)
- col.active = pe.editable
+ col.active = pe.is_editable
col.label(text="Draw:")
col.prop(pe, "draw_step", text="Path Steps")
- if pe.hair:
- col.prop(pe, "draw_particles", text="Children")
+ if pe.is_hair:
+ col.prop(pe, "show_particles", text="Children")
else:
if pe.type == 'PARTICLES':
- col.prop(pe, "draw_particles", text="Particles")
- col.prop(pe, "fade_time")
+ col.prop(pe, "show_particles", text="Particles")
+ col.prop(pe, "use_fade_time")
sub = col.row()
- sub.active = pe.fade_time
+ sub.active = pe.use_fade_time
sub.prop(pe, "fade_frames", slider=True)
-classes = [
- VIEW3D_PT_tools_weightpaint,
- VIEW3D_PT_tools_objectmode,
- VIEW3D_PT_tools_meshedit,
- VIEW3D_PT_tools_meshedit_options,
- VIEW3D_PT_tools_curveedit,
- VIEW3D_PT_tools_surfaceedit,
- VIEW3D_PT_tools_textedit,
- VIEW3D_PT_tools_armatureedit,
- VIEW3D_PT_tools_armatureedit_options,
- VIEW3D_PT_tools_mballedit,
- VIEW3D_PT_tools_latticeedit,
- VIEW3D_PT_tools_posemode,
- 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_sculpt_options,
- VIEW3D_PT_tools_vertexpaint,
- VIEW3D_PT_tools_weightpaint_options,
-
- VIEW3D_PT_tools_projectpaint,
- VIEW3D_MT_tools_projectpaint_clone,
- VIEW3D_MT_tools_projectpaint_stencil,
-
- VIEW3D_PT_tools_particlemode]
-
-
def register():
- register = bpy.types.register
- for cls in classes:
- register(cls)
+ pass
def unregister():
- unregister = bpy.types.unregister
- for cls in classes:
- unregister(cls)
+ pass
if __name__ == "__main__":
register()
diff --git a/release/text/copyright.txt b/release/text/copyright.txt
index 9f49dd4587a..207d6f54ea8 100644
--- a/release/text/copyright.txt
+++ b/release/text/copyright.txt
@@ -1,6 +1,6 @@
This version of Blender has been originally released at www.blender.org.
- It is subject to the GPL license, which is part of this download.
+ It is subject to the GNU GPL license, which is part of this download.
For more information please review the Blender source code distribution,
which should be available at the same location as where you obtained
this version.
@@ -14,14 +14,12 @@
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.
+ bound by the terms of this License Agreement.
1. Grant of License
- Subject to the provisions of this License Agreement, BF grants You a
- limited, non-exclusive, personal, non-sublicenseable, non-transferable
- license to use the Software at any computer You own or use.
+ Subject to the provisions of the GNU GPL license, BF grants You a
+ non-exclusive right to use the Software at any computer You own or use.
Artwork you create with the Software - whether it is images, movies,
scripts, exported 3d files or the .blend files themselves - is your sole
property, and can be licensed or sold under any conditions you prefer.
@@ -76,25 +74,8 @@
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.
-
- 6. 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.
-
- 7. Entire Agreement
-
- This License Agreement is the entire agreement between BF 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 BF and You
- relating to the subject matter of this License Agreement.
-
- 8. Enforceability
+
+ 6. Enforceability
If any provision of this License Agreement is held to be unenforceable
by a court of competent jurisdiction for any reason, such provision
@@ -102,7 +83,7 @@
enforceable, and the remainder of the License Agreement shall remain in
effect.
- 9. Governing law and disputes
+ 7. 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
diff --git a/release/text/readme.html b/release/text/readme.html
index 1da4b62a73e..1b14c63e14a 100644
--- a/release/text/readme.html
+++ b/release/text/readme.html
@@ -12,23 +12,23 @@
</style>
</head>
<body>
-<p class="title"><b>Blender 2.5 Alpha 2</b></p>
+<p class="title"><b>Blender 2.5 Beta</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 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="header"><b>2.5 Beta</b></p>
+<p class="body">The Blender Foundation and online developer community is proud to present Blender 2.5 Beta. 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>
-<p class="body"> • Bugs - We've fixed a lot lately, but there are still quite a few bugs. This is alpha software, we're still working on it!</p>
+<p class="body"> • Bugs - We've fixed a lot lately, but there are still quite a few bugs. This is beta software, we're still working on it!</p>
<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 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 class="body">Blender 2.5 Beta 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/installer/00.checked.bmp b/release/windows/installer/00.checked.bmp
new file mode 100644
index 00000000000..6c2e98d361c
--- /dev/null
+++ b/release/windows/installer/00.checked.bmp
Binary files differ
diff --git a/release/windows/inno/header.bmp b/release/windows/installer/00.header.bmp
index b631ba73933..b631ba73933 100644
--- a/release/windows/inno/header.bmp
+++ b/release/windows/installer/00.header.bmp
Binary files differ
diff --git a/release/windows/inno/installer.ico b/release/windows/installer/00.installer.ico
index 922c9d472d9..922c9d472d9 100644
--- a/release/windows/inno/installer.ico
+++ b/release/windows/installer/00.installer.ico
Binary files differ
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/release/windows/inno/installer.bmp b/release/windows/installer/01.installer.bmp
index 10fb01454a4..10fb01454a4 100644
--- a/release/windows/inno/installer.bmp
+++ b/release/windows/installer/01.installer.bmp
Binary files differ
diff --git a/source/Makefile b/source/Makefile
index fde4af16d91..1055c2a94e9 100644
--- a/source/Makefile
+++ b/source/Makefile
@@ -17,7 +17,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.
@@ -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
@@ -108,37 +109,37 @@ COMLIB += $(NAN_JPEG)/lib/libjpeg.a
COMLIB += $(OCGDIR)/blender/gpu/$(DEBUG_DIR)libgpu.a
COMLIB += $(NAN_GLEW)/lib/$(DEBUG_DIR)libglew.a
COMLIB += $(OCGDIR)/blender/blenfont/$(DEBUG_DIR)libblenfont.a
+COMLIB += $(OCGDIR)/blender/python/$(DEBUG_DIR)libpython.a
+COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaudaspace.a
+COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_python.a
COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaudaspace.a
COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_src.a
COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_fx.a
COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_sdl.a
-COMLIB += $(NAN_SAMPLERATE)/lib/$(DEBUG_DIR)libsamplerate.a
-COMLIB += $(NAN_LZO)/lib/$(DEBUG_DIR)libminilzo.a
-COMLIB += $(NAN_LZMA)/lib/$(DEBUG_DIR)liblzma.a
-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
-
ifeq ($(WITH_FFMPEG),true)
COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_ffmpeg.a
endif
-
ifeq ($(WITH_OPENAL),true)
COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_openal.a
endif
-
ifeq ($(WITH_JACK),true)
COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_jack.a
endif
-
ifeq ($(WITH_SNDFILE),true)
COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_sndfile.a
endif
-
ifeq ($(WITH_FFTW3),true)
COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_fftw.a
endif
+COMLIB += $(NAN_SAMPLERATE)/lib/$(DEBUG_DIR)libsamplerate.a
+COMLIB += $(NAN_LZO)/lib/$(DEBUG_DIR)libminilzo.a
+COMLIB += $(NAN_LZMA)/lib/$(DEBUG_DIR)liblzma.a
+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
+
ifneq ($(NAN_NO_KETSJI),true)
COMLIB += $(OCGDIR)/gameengine/bloutines/$(DEBUG_DIR)libbloutines.a
@@ -202,7 +203,9 @@ ifeq ($(WITH_OPENJPEG), true)
endif
endif
-COMLIB += $(OCGDIR)/blender/imbuf/cineon/$(DEBUG_DIR)libcineon.a
+ifeq ($(WITH_CINEON), true)
+ COMLIB += $(OCGDIR)/blender/imbuf/cineon/$(DEBUG_DIR)libcineon.a
+endif
ifeq ($(WITH_DDS), true)
COMLIB += $(OCGDIR)/blender/imbuf/dds/$(DEBUG_DIR)libdds.a
@@ -416,7 +419,7 @@ ifeq ($(WITH_JACK),true)
endif
ifeq ($(WITH_SNDFILE),true)
- ifeq ($(OS),$(findstring $(OS), "linux"))
+ ifeq ($(OS),$(findstring $(OS), "linux darwin"))
NAN_SND_LIBS += $(NAN_SNDFILELIBS)
endif
endif
@@ -477,7 +480,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 6263261ae1c..96d1ce3e8b2 100644
--- a/source/blender/CMakeLists.txt
+++ b/source/blender/CMakeLists.txt
@@ -29,11 +29,11 @@ ADD_SUBDIRECTORY(editors)
ADD_SUBDIRECTORY(avi)
ADD_SUBDIRECTORY(nodes)
ADD_SUBDIRECTORY(blenkernel)
+ADD_SUBDIRECTORY(modifiers)
ADD_SUBDIRECTORY(blenlib)
ADD_SUBDIRECTORY(blenloader)
ADD_SUBDIRECTORY(blenpluginapi)
ADD_SUBDIRECTORY(imbuf)
-ADD_SUBDIRECTORY(imbuf/intern/cineon)
ADD_SUBDIRECTORY(gpu)
ADD_SUBDIRECTORY(makesdna)
ADD_SUBDIRECTORY(makesrna)
@@ -42,13 +42,17 @@ ADD_SUBDIRECTORY(render)
ADD_SUBDIRECTORY(blenfont)
ADD_SUBDIRECTORY(ikplugin)
-IF(WITH_OPENEXR)
+IF(WITH_IMAGE_OPENEXR)
ADD_SUBDIRECTORY(imbuf/intern/openexr)
-ENDIF(WITH_OPENEXR)
+ENDIF(WITH_IMAGE_OPENEXR)
-IF(WITH_DDS)
+IF(WITH_IMAGE_DDS)
ADD_SUBDIRECTORY(imbuf/intern/dds)
-ENDIF(WITH_DDS)
+ENDIF(WITH_IMAGE_DDS)
+
+IF(WITH_IMAGE_CINEON)
+ ADD_SUBDIRECTORY(imbuf/intern/cineon)
+ENDIF(WITH_IMAGE_CINEON)
IF(WITH_QUICKTIME)
ADD_SUBDIRECTORY(quicktime)
diff --git a/source/blender/Makefile b/source/blender/Makefile
index 1c4ff6935b9..8052c175f8e 100644
--- a/source/blender/Makefile
+++ b/source/blender/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.
@@ -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 9910db1902f..549725a57a0 100644
--- a/source/blender/SConscript
+++ b/source/blender/SConscript
@@ -10,12 +10,12 @@ SConscript(['avi/SConscript',
'gpu/SConscript',
'editors/SConscript',
'imbuf/SConscript',
- 'imbuf/intern/cineon/SConscript',
'makesdna/SConscript',
'makesrna/SConscript',
'readblenfile/SConscript',
'render/SConscript',
'nodes/SConscript',
+ 'modifiers/SConscript',
'ikplugin/SConscript',
'windowmanager/SConscript',
'blenfont/SConscript'])
@@ -28,6 +28,9 @@ if env['WITH_BF_PYTHON']:
if env['WITH_BF_DDS']:
SConscript (['imbuf/intern/dds/SConscript'])
+if env['WITH_BF_CINEON']:
+ SConscript (['imbuf/intern/cineon/SConscript'])
+
if env['WITH_BF_OPENEXR']:
SConscript (['imbuf/intern/openexr/SConscript'])
diff --git a/source/blender/avi/AVI_avi.h b/source/blender/avi/AVI_avi.h
index a3115e0543b..2e71bd98309 100644
--- a/source/blender/avi/AVI_avi.h
+++ b/source/blender/avi/AVI_avi.h
@@ -163,7 +163,7 @@ typedef struct _AviIndex {
typedef enum {
AVI_FORMAT_RGB24, /* The most basic of forms, 3 bytes per pixel, 1 per r, g, b */
AVI_FORMAT_RGB32, /* The second most basic of forms, 4 bytes per pixel, 1 per r, g, b, alpha */
- AVI_FORMAT_AVI_RGB, /* Same as above, but is in the wierd AVI order (bottom to top, left to right) */
+ AVI_FORMAT_AVI_RGB, /* Same as above, but is in the weird AVI order (bottom to top, left to right) */
AVI_FORMAT_MJPEG /* Motion-JPEG */
} AviFormat;
diff --git a/source/blender/avi/CMakeLists.txt b/source/blender/avi/CMakeLists.txt
index 0e5e152e5c1..5ef37f5951b 100644
--- a/source/blender/avi/CMakeLists.txt
+++ b/source/blender/avi/CMakeLists.txt
@@ -32,4 +32,3 @@ SET(INC
)
BLENDERLIB(bf_avi "${SRC}" "${INC}")
-#env.BlenderLib ('bf_avi', sources, Split(incs), [], libtype=['core','player'], priority = [90, 50] )
diff --git a/source/blender/avi/Makefile b/source/blender/avi/Makefile
index c8ab5fe0aca..96a6573cc67 100644
--- a/source/blender/avi/Makefile
+++ b/source/blender/avi/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/avi/intern/Makefile b/source/blender/avi/intern/Makefile
index 30f225c8031..8d1af9adb28 100644
--- a/source/blender/avi/intern/Makefile
+++ b/source/blender/avi/intern/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/avi/intern/avi.c b/source/blender/avi/intern/avi.c
index a73dec57a55..5f0d36e17e2 100644
--- a/source/blender/avi/intern/avi.c
+++ b/source/blender/avi/intern/avi.c
@@ -38,6 +38,8 @@
#include <stdio.h>
#include <ctype.h>
+#include "MEM_guardedalloc.h"
+
#include "AVI_avi.h"
#include "avi_intern.h"
diff --git a/source/blender/avi/intern/avi_intern.h b/source/blender/avi/intern/avi_intern.h
index 1ea304213ca..20de67530fd 100644
--- a/source/blender/avi/intern/avi_intern.h
+++ b/source/blender/avi/intern/avi_intern.h
@@ -31,8 +31,6 @@
#include <stdio.h> /* for FILE */
-#include "MEM_guardedalloc.h"
-
unsigned int GET_FCC (FILE *fp);
unsigned int GET_TCC (FILE *fp);
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 4ebcb216012..c66de231b3f 100644
--- a/source/blender/avi/intern/codecs.c
+++ b/source/blender/avi/intern/codecs.c
@@ -38,10 +38,6 @@
#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;
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 d7212e710e9..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);
diff --git a/source/blender/avi/intern/options.c b/source/blender/avi/intern/options.c
index 7b194b86ab6..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) {
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 c898820b949..933d287bcff 100644
--- a/source/blender/blenfont/BLF_api.h
+++ b/source/blender/blenfont/BLF_api.h
@@ -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);
-/* Attach a file with metrics information from memory. */
-void BLF_metrics_attach(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);
-/*
- * Set/Get the current font.
- */
-void BLF_set(int fontid);
-int BLF_get(void);
+/* Attach a file with metrics information from memory. */
+void BLF_metrics_attach(int fontid, unsigned char *mem, int mem_size);
-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_rotation_default(float angle);
+
+/*
+ * Enable/disable options to the default font.
*/
-void BLF_default_rotation(float angle);
+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
--- /dev/null
+++ b/source/blender/blenfont/BLF_types.h
diff --git a/source/blender/blenfont/Makefile b/source/blender/blenfont/Makefile
index 9f34d458126..df1bbb72110 100644
--- a/source/blender/blenfont/Makefile
+++ b/source/blender/blenfont/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) 2009 Blender Foundation
# All rights reserved.
diff --git a/source/blender/blenfont/intern/Makefile b/source/blender/blenfont/intern/Makefile
index 38e76d03cad..d3a6e656028 100644
--- a/source/blender/blenfont/intern/Makefile
+++ b/source/blender/blenfont/intern/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) 2008 Blender Foundation.
# All rights reserved.
@@ -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 9a65b15200f..f6b7c5f71e6 100644
--- a/source/blender/blenfont/intern/blf.c
+++ b/source/blender/blenfont/intern/blf.c
@@ -61,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;
@@ -149,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);
+ }
- font= global_font[global_font_cur];
+ 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= BLF_get(fontid);
if (font)
blf_font_attach_from_mem(font, mem, mem_size);
}
@@ -194,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);
+}
+
+void BLF_enable(int fontid, int option)
+{
+ FontBLF *font;
+
+ font= BLF_get(fontid);
+ if (font)
+ font->flags |= option;
}
-int BLF_get(void)
+void BLF_disable(int fontid, int option)
{
- return(global_font_cur);
+ FontBLF *font;
+
+ font= BLF_get(fontid);
+ if (font)
+ font->flags &= ~option;
}
-void BLF_enable(int option)
+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(int option)
+void BLF_disable_default(int option)
{
FontBLF *font;
- font= global_font[global_font_cur];
+ font= BLF_get(global_font_default);
if (font)
font->flags &= ~option;
}
-void BLF_aspect(float aspect)
+void BLF_aspect(int fontid, float aspect)
{
FontBLF *font;
- font= global_font[global_font_cur];
+ 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) {
@@ -261,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;
@@ -295,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;
@@ -334,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);
@@ -355,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);
@@ -395,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");
@@ -407,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);
@@ -438,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");
@@ -450,39 +494,38 @@ 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= BLF_get(fontid);
+ if (font) {
+ font->clip_rec.xmin= xmin;
+ font->clip_rec.ymin= ymin;
+ font->clip_rec.xmax= xmax;
+ font->clip_rec.ymax= ymax;
+ }
+}
+
+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;
@@ -491,11 +534,11 @@ 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_shadow(int fontid, int level, float r, float g, float b, float a)
{
FontBLF *font;
- font= global_font[global_font_cur];
+ font= BLF_get(fontid);
if (font) {
font->shadow= level;
font->shadow_col[0]= r;
@@ -505,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;
@@ -530,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;
@@ -543,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_font.c b/source/blender/blenfont/intern/blf_font.c
index f7c5531f0ac..a932682b027 100644
--- a/source/blender/blenfont/intern/blf_font.c
+++ b/source/blender/blenfont/intern/blf_font.c
@@ -38,10 +38,8 @@
#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 */
diff --git a/source/blender/blenfont/intern/blf_lang.c b/source/blender/blenfont/intern/blf_lang.c
index bc2de70222d..7054d955faf 100644
--- a/source/blender/blenfont/intern/blf_lang.c
+++ b/source/blender/blenfont/intern/blf_lang.c
@@ -34,7 +34,6 @@
#include <locale.h>
#include "libintl.h"
-#include "MEM_guardedalloc.h"
#include "DNA_listBase.h"
#include "DNA_vec_types.h"
@@ -59,65 +58,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 */
-{
- 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 */
+void BLF_lang_init(void)
{
- 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/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 965bad31991..33852a1b923 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -456,7 +456,7 @@ void DM_interp_face_data(struct DerivedMesh *source, struct DerivedMesh *dest,
float *weights, FaceVertWeight *vert_weights,
int count, int dest_index);
-void DM_swap_face_data(struct DerivedMesh *dm, int index, int *corner_indices);
+void DM_swap_face_data(struct DerivedMesh *dm, int index, const int *corner_indices);
/* Temporary? A function to give a colorband to derivedmesh for vertexcolor ranges */
void vDM_ColorBand_store(struct ColorBand *coba);
diff --git a/source/blender/blenkernel/BKE_anim.h b/source/blender/blenkernel/BKE_anim.h
index 79b4d50586a..e82eb0ed0c9 100644
--- a/source/blender/blenkernel/BKE_anim.h
+++ b/source/blender/blenkernel/BKE_anim.h
@@ -31,8 +31,6 @@
#ifndef BKE_ANIM_H
#define BKE_ANIM_H
-#define MAX_DUPLI_RECUR 8
-
struct Path;
struct Object;
struct PartEff;
@@ -42,8 +40,6 @@ struct bAnimVizSettings;
struct bMotionPath;
struct bPoseChannel;
-#include "DNA_object_types.h"
-
/* ---------------------------------------------------- */
/* Animation Visualisation */
@@ -54,7 +50,7 @@ void animviz_free_motionpath(struct bMotionPath *mpath);
struct bMotionPath *animviz_verify_motionpaths(struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan);
-void animviz_get_object_motionpaths(Object *ob, ListBase *targets);
+void animviz_get_object_motionpaths(struct Object *ob, ListBase *targets);
void animviz_calc_motionpaths(struct Scene *scene, ListBase *targets);
/* ---------------------------------------------------- */
@@ -63,7 +59,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_armature.h b/source/blender/blenkernel/BKE_armature.h
index 7e3d7f2a2ce..242de4d788b 100644
--- a/source/blender/blenkernel/BKE_armature.h
+++ b/source/blender/blenkernel/BKE_armature.h
@@ -80,8 +80,7 @@ void free_armature(struct bArmature *arm);
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 64c5823f06f..189cd61d5a8 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 4
+
+#define BLENDER_VERSION 253
+#define BLENDER_SUBVERSION 1
#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 aff102f2e09..18db68a93af 100644
--- a/source/blender/blenkernel/BKE_bmesh.h
+++ b/source/blender/blenkernel/BKE_bmesh.h
@@ -58,7 +58,7 @@ struct BME_Loop;
-Remove the eflags completely, they are mostly not used
-Remove the selection/vis/bevel weight flag/values ect and move them to custom data
-Remove EID member and move to custom data
- -Add a radial cycle length, disk cycle length and loop cycle lenght attributes to custom data and have eulers maintain/use them if present.
+ -Add a radial cycle length, disk cycle length and loop cycle length attributes to custom data and have eulers maintain/use them if present.
-Move data such as vertex coordinates/normals to custom data and leave pointers in structures to active layer data.
-Remove BME_CycleNode structure?
*/
diff --git a/source/blender/blenkernel/BKE_brush.h b/source/blender/blenkernel/BKE_brush.h
index fcc636215c9..0e406a16d0c 100644
--- a/source/blender/blenkernel/BKE_brush.h
+++ b/source/blender/blenkernel/BKE_brush.h
@@ -44,11 +44,13 @@ struct Brush *copy_brush(struct Brush *brush);
void make_local_brush(struct Brush *brush);
void free_brush(struct Brush *brush);
+void brush_reset_sculpt(struct Brush *brush);
+
+/* image icon function */
+struct ImBuf *get_brush_icon(struct Brush *brush);
+
/* brush library operations used by different paint panels */
-int brush_set_nr(struct Brush **current_brush, int nr, const char *name);
int brush_delete(struct Brush **current_brush);
-void brush_check_exists(struct Brush **brush, const char *name);
-void brush_toggled_fake_user(struct Brush *brush);
int brush_texture_set_nr(struct Brush *brush, int nr);
int brush_texture_delete(struct Brush *brush);
int brush_clone_image_set_nr(struct Brush *brush, int nr);
@@ -84,5 +86,25 @@ 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 brush_size(struct Brush *brush);
+void brush_set_size(struct Brush *brush, int value);
+
+int brush_use_locked_size(struct Brush *brush);
+void brush_set_use_locked_size(struct Brush *brush, int value);
+
+int brush_use_alpha_pressure(struct Brush *brush);
+void brush_set_use_alpha_pressure(struct Brush *brush, int value);
+
+int brush_use_size_pressure(struct Brush *brush);
+void brush_set_use_size_pressure(struct Brush *brush, int value);
+
+float brush_unprojected_radius(struct Brush *brush);
+void brush_set_unprojected_radius(struct Brush *brush, float value);
+
+float brush_alpha(struct Brush *brush);
+void brush_set_alpha(struct Brush *brush, float value);
+
#endif
diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h
index d8b3fcfd0bb..034bedbb07d 100644
--- a/source/blender/blenkernel/BKE_cloth.h
+++ b/source/blender/blenkernel/BKE_cloth.h
@@ -33,24 +33,8 @@
#include <float.h>
-#include "BLI_linklist.h"
-#include "BKE_customdata.h"
-#include "BKE_DerivedMesh.h"
-
-#include "BLI_blenlib.h"
-#include "BLI_math.h"
-#include "BLI_edgehash.h"
-
-#include "DNA_cloth_types.h"
-#include "DNA_customdata_types.h"
-#include "DNA_meshdata_types.h"
-#include "DNA_modifier_types.h"
-#include "DNA_object_types.h"
-#include "DNA_scene_types.h"
-
-#include "BKE_collision.h"
-
struct Object;
+struct ListBase;
struct Scene;
struct MFace;
struct DerivedMesh;
@@ -210,7 +194,7 @@ typedef enum
////////////////////////////////////////////////
// needed for implicit.c
-int cloth_bvh_objcollision (Object *ob, ClothModifierData * clmd, float step, float dt );
+int cloth_bvh_objcollision (struct Object *ob, struct ClothModifierData * clmd, float step, float dt );
////////////////////////////////////////////////
@@ -220,10 +204,10 @@ int cloth_bvh_objcollision (Object *ob, ClothModifierData * clmd, float step, fl
////////////////////////////////////////////////
// needed for cloth.c
-int implicit_init ( Object *ob, ClothModifierData *clmd );
-int implicit_free ( ClothModifierData *clmd );
-int implicit_solver ( Object *ob, float frame, ClothModifierData *clmd, ListBase *effectors );
-void implicit_set_positions ( ClothModifierData *clmd );
+int implicit_init ( struct Object *ob, struct ClothModifierData *clmd );
+int implicit_free ( struct ClothModifierData *clmd );
+int implicit_solver ( struct Object *ob, float frame, struct ClothModifierData *clmd, struct ListBase *effectors );
+void implicit_set_positions ( struct ClothModifierData *clmd );
// globally needed
void clmdSetInterruptCallBack ( int ( *f ) ( void ) );
@@ -235,23 +219,23 @@ void clmdSetInterruptCallBack ( int ( *f ) ( void ) );
////////////////////////////////////////////////
// needed for modifier.c
-void cloth_free_modifier_extern ( ClothModifierData *clmd );
-void cloth_free_modifier ( Object *ob, ClothModifierData *clmd );
-void cloth_init ( ClothModifierData *clmd );
-DerivedMesh *clothModifier_do ( ClothModifierData *clmd, struct Scene *scene, Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc );
+void cloth_free_modifier_extern ( struct ClothModifierData *clmd );
+void cloth_free_modifier ( struct Object *ob, struct ClothModifierData *clmd );
+void cloth_init ( struct ClothModifierData *clmd );
+struct DerivedMesh *clothModifier_do ( struct ClothModifierData *clmd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, int useRenderParams, int isFinalCalc );
-void cloth_update_normals ( ClothVertex *verts, int nVerts, MFace *face, int totface );
-int cloth_uses_vgroup(ClothModifierData *clmd);
+void cloth_update_normals ( ClothVertex *verts, int nVerts, struct MFace *face, int totface );
+int cloth_uses_vgroup(struct ClothModifierData *clmd);
// needed for collision.c
-void bvhtree_update_from_cloth ( ClothModifierData *clmd, int moving );
-void bvhselftree_update_from_cloth ( ClothModifierData *clmd, int moving );
+void bvhtree_update_from_cloth ( struct ClothModifierData *clmd, int moving );
+void bvhselftree_update_from_cloth ( struct ClothModifierData *clmd, int moving );
// needed for button_object.c
-void cloth_clear_cache ( Object *ob, ClothModifierData *clmd, float framenr );
+void cloth_clear_cache ( struct Object *ob, struct ClothModifierData *clmd, float framenr );
// needed for cloth.c
-int cloth_add_spring ( ClothModifierData *clmd, unsigned int indexA, unsigned int indexB, float restlength, int spring_type);
+int cloth_add_spring ( struct ClothModifierData *clmd, unsigned int indexA, unsigned int indexB, float restlength, int spring_type);
////////////////////////////////////////////////
@@ -270,9 +254,9 @@ typedef struct
{
char *name;
CM_SOLVER_ID id;
- int ( *init ) ( Object *ob, ClothModifierData *clmd );
- int ( *solver ) ( Object *ob, float framenr, ClothModifierData *clmd, ListBase *effectors );
- int ( *free ) ( ClothModifierData *clmd );
+ int ( *init ) ( struct Object *ob, struct ClothModifierData *clmd );
+ int ( *solver ) ( struct Object *ob, float framenr, struct ClothModifierData *clmd, struct ListBase *effectors );
+ int ( *free ) ( struct ClothModifierData *clmd );
}
CM_SOLVER_DEF;
diff --git a/source/blender/blenkernel/BKE_collision.h b/source/blender/blenkernel/BKE_collision.h
index 91c5eb4afee..d7ae7df9342 100644
--- a/source/blender/blenkernel/BKE_collision.h
+++ b/source/blender/blenkernel/BKE_collision.h
@@ -37,25 +37,21 @@
#include <string.h>
/* types */
-#include "BLI_linklist.h"
#include "BKE_collision.h"
-#include "BKE_customdata.h"
-#include "BKE_DerivedMesh.h"
#include "DNA_cloth_types.h"
-#include "DNA_customdata_types.h"
-#include "DNA_meshdata_types.h"
-#include "DNA_modifier_types.h"
-#include "DNA_object_types.h"
#include "BLI_kdopbvh.h"
struct Cloth;
struct ClothModifierData;
+struct CollisionModifierData;
struct DerivedMesh;
struct Group;
struct MFace;
+struct MVert;
struct Object;
struct Scene;
+struct LinkNode;
////////////////////////////////////////
// used for collisions in collision.c
@@ -122,16 +118,16 @@ FaceCollPair;
// used in modifier.c from collision.c
/////////////////////////////////////////////////
-BVHTree *bvhtree_build_from_mvert ( MFace *mfaces, unsigned int numfaces, MVert *x, unsigned int numverts, float epsilon );
-void bvhtree_update_from_mvert ( BVHTree * bvhtree, MFace *faces, int numfaces, MVert *x, MVert *xnew, int numverts, int moving );
+BVHTree *bvhtree_build_from_mvert ( struct MFace *mfaces, unsigned int numfaces, struct MVert *x, unsigned int numverts, float epsilon );
+void bvhtree_update_from_mvert ( BVHTree * bvhtree, struct MFace *faces, int numfaces, struct MVert *x, struct MVert *xnew, int numverts, int moving );
/////////////////////////////////////////////////
-LinkNode *BLI_linklist_append_fast ( LinkNode **listp, void *ptr );
+struct LinkNode *BLI_linklist_append_fast ( struct LinkNode **listp, void *ptr );
// move Collision modifier object inter-frame with step = [0,1]
// defined in collisions.c
-void collision_move_object ( CollisionModifierData *collmd, float step, float prevstep );
+void collision_move_object ( struct CollisionModifierData *collmd, float step, float prevstep );
// interface for collision functions
void collisions_compute_barycentric ( float pv[3], float p1[3], float p2[3], float p3[3], float *w1, float *w2, float *w3 );
diff --git a/source/blender/blenkernel/BKE_colortools.h b/source/blender/blenkernel/BKE_colortools.h
index dca8ccb6dbf..e0ebedb320b 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;
@@ -53,9 +53,11 @@ void curvemapping_free(struct CurveMapping *cumap);
struct CurveMapping *curvemapping_copy(struct CurveMapping *cumap);
void curvemapping_set_black_white(struct CurveMapping *cumap, float *black, float *white);
+#define CURVEMAP_SLOPE_NEGATIVE 0
+#define CURVEMAP_SLOPE_POSITIVE 1
+void curvemap_reset(struct CurveMap *cuma, struct rctf *clipr, int preset, int slope);
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, int preset);
void curvemap_sethandle(struct CurveMap *cuma, int type);
void curvemapping_changed(struct CurveMapping *cumap, int rem_doubles);
@@ -74,7 +76,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..d6e0075df1e 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,12 +130,12 @@ 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);
int remove_constraint(ListBase *list, struct bConstraint *con);
-int remove_constraint_index(ListBase *list, int index);
void remove_constraints_type(ListBase *list, short type, short last_only);
/* Constraints + Proxies function prototypes */
diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h
index 48e2dbf4fec..f6d41190c5a 100644
--- a/source/blender/blenkernel/BKE_context.h
+++ b/source/blender/blenkernel/BKE_context.h
@@ -170,11 +170,17 @@ void CTX_wm_menu_set(bContext *C, struct ARegion *menu);
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 a3232ac91d6..db6d995aa74 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -40,15 +40,15 @@ struct ListBase;
struct BezTriple;
struct BevList;
-#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) )
+#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_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)
+#define CU_DO_RADIUS(cu, nu) ((CU_DO_TILT(cu, nu) || ((cu)->flag & CU_PATH_RADIUS) || (cu)->bevobj || (cu)->ext1!=0.0 || (cu)->ext2!=0.0) ? 1:0)
void unlink_curve( struct Curve *cu);
@@ -72,7 +72,7 @@ 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);
@@ -105,5 +105,11 @@ int check_valid_nurb_v( struct Nurb *nu);
int clamp_nurb_order_u( struct Nurb *nu);
int clamp_nurb_order_v( struct Nurb *nu);
+ListBase *BKE_curve_nurbs(struct Curve *cu);
+
+int minmax_curve(struct Curve *cu, float min[3], float max[3]);
+int curve_center_median(struct Curve *cu, float cent[3]);
+int curve_center_bounds(struct Curve *cu, float cent[3]);
+void curve_translate(struct Curve *cu, float offset[3], int do_keys);
#endif
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index c07b26fd372..84eb8ef5300 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -88,7 +88,7 @@ void *CustomData_add_layer(struct CustomData *data, int type, int alloctype,
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, const 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
@@ -174,7 +174,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
@@ -292,6 +292,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_deform.h b/source/blender/blenkernel/BKE_deform.h
index 702cb100e18..53f474aa972 100644
--- a/source/blender/blenkernel/BKE_deform.h
+++ b/source/blender/blenkernel/BKE_deform.h
@@ -42,7 +42,7 @@ struct MDeformVert;
void defgroup_copy_list(struct ListBase *lb1, struct ListBase *lb2);
struct bDeformGroup *defgroup_duplicate(struct bDeformGroup *ingroup);
-struct bDeformGroup *defgroup_find_name(struct Object *ob, char *name);
+struct bDeformGroup *defgroup_find_name(struct Object *ob, const char *name);
int defgroup_find_index(struct Object *ob, struct bDeformGroup *dg);
int *defgroup_flip_map(struct Object *ob, int use_default);
int defgroup_flip_index(struct Object *ob, int index, int use_default);
diff --git a/source/blender/blenkernel/BKE_depsgraph.h b/source/blender/blenkernel/BKE_depsgraph.h
index 6a44051806e..0b78a1206fe 100644
--- a/source/blender/blenkernel/BKE_depsgraph.h
+++ b/source/blender/blenkernel/BKE_depsgraph.h
@@ -70,7 +70,7 @@ int queue_count(struct DagNodeQueue *queue);
void queue_delete(struct DagNodeQueue *queue);
// queries
-struct DagForest *build_dag(struct Scene *sce, short mask);
+struct DagForest *build_dag(struct Main *bmain, struct Scene *sce, short mask);
void free_forest(struct DagForest *Dag);
// note :
@@ -97,14 +97,14 @@ void draw_all_deps(void);
/* Note that the DAG never executes changes in Objects, only sets flags in Objects */
/* (re)-create dependency graph for scene */
-void DAG_scene_sort(struct Scene *sce);
+void DAG_scene_sort(struct Main *bmain, struct Scene *sce);
/* flag all objects that need recalc because they're animated */
-void DAG_scene_update_flags(struct Scene *sce, unsigned int lay);
+void DAG_scene_update_flags(struct Main *bmain, struct Scene *sce, unsigned int lay);
/* flushes all recalc flags in objects down the dependency tree */
-void DAG_scene_flush_update(struct Scene *sce, unsigned int lay, int time);
+void DAG_scene_flush_update(struct Main *bmain, struct Scene *sce, unsigned int lay, int time);
/* tag objects for update on file load */
-void DAG_on_load_update(void);
+void DAG_on_load_update(struct Main *bmain);
/* flag all IDs that need recalc because they're animated, influencing
this ID only. only for objects currently */
@@ -113,7 +113,7 @@ void DAG_id_update_flags(struct ID *id);
but note the DAG only supports objects and object data currently */
void DAG_id_flush_update(struct ID *id, short flag);
/* when setting manual RECALC flags, call this afterwards */
-void DAG_ids_flush_update(int time);
+void DAG_ids_flush_update(struct Main *bmain, int time);
/* (re)-create dependency graph for armature pose */
void DAG_pose_sort(struct Object *ob);
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index febe0a11ae6..01d3de1b94f 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -83,7 +83,7 @@ extern void copy_displist(struct ListBase *lbn, struct ListBase *lb);
extern void free_disp_elem(DispList *dl);
extern DispList *find_displist_create(struct ListBase *lb, int type);
extern DispList *find_displist(struct ListBase *lb, int type);
-extern void addnormalsDispList(struct Object *ob, struct ListBase *lb);
+extern void addnormalsDispList(struct ListBase *lb);
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);
@@ -93,13 +93,14 @@ extern void makeDispListCurveTypes(struct Scene *scene, struct Object *ob, int f
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);
diff --git a/source/blender/blenkernel/BKE_effect.h b/source/blender/blenkernel/BKE_effect.h
index 837fede3c8a..99f55200eac 100644
--- a/source/blender/blenkernel/BKE_effect.h
+++ b/source/blender/blenkernel/BKE_effect.h
@@ -31,7 +31,6 @@
#ifndef BKE_EFFECT_H
#define BKE_EFFECT_H
-#include "DNA_object_types.h"
#include "DNA_modifier_types.h"
struct Object;
diff --git a/source/blender/blenkernel/BKE_fcurve.h b/source/blender/blenkernel/BKE_fcurve.h
index c4d74f86284..95e0cfc3a91 100644
--- a/source/blender/blenkernel/BKE_fcurve.h
+++ b/source/blender/blenkernel/BKE_fcurve.h
@@ -143,7 +143,7 @@ typedef enum eFMI_Action_Types {
typedef enum eFMI_Requirement_Flags {
/* modifier requires original data-points (kindof beats the purpose of a modifier stack?) */
FMI_REQUIRES_ORIGINAL_DATA = (1<<0),
- /* modifier doesn't require on any preceeding data (i.e. it will generate a curve).
+ /* modifier doesn't require on any preceding data (i.e. it will generate a curve).
* Use in conjunction with FMI_TYPE_GENRATE_CURVE
*/
FMI_REQUIRES_NOTHING = (1<<1),
@@ -161,7 +161,6 @@ 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);
void free_fmodifiers(ListBase *modifiers);
struct FModifier *find_active_fmodifier(ListBase *modifiers);
@@ -187,6 +186,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 291deb5ea70..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;
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/imbuf/intern/IMB_png.h b/source/blender/blenkernel/BKE_idcode.h
index 28e3adb2722..b624e34e1cb 100644
--- a/source/blender/imbuf/intern/IMB_png.h
+++ b/source/blender/blenkernel/BKE_idcode.h
@@ -1,6 +1,4 @@
-/*
- * IMB_png.h
- *
+/**
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,21 +26,50 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+#ifndef BKE_ID_INFO_H
+#define BKE_ID_INFO_H
+
/**
- * \file IMB_png.h
- * \ingroup imbuf
- * \brief Function declarations for png.c
+ * Convert an idcode into a name.
+ *
+ * @param code The code to convert.
+ * @return A static string representing the name of
+ * the code.
*/
+const char *BKE_idcode_to_name(int code);
-#ifndef IMB_PNG_H
-#define IMB_PNG_H
+/**
+ * Convert an idcode into a name (plural).
+ *
+ * @param code The code to convert.
+ * @return A static string representing the name of
+ * the code.
+ */
+const char *BKE_idcode_to_name_plural(int code);
-struct ImBuf;
+/**
+ * Convert a name into an idcode (ie. ID_SCE)
+ *
+ * @param name The name to convert.
+ * @return The code for the name, or 0 if invalid.
+ */
+int BKE_idcode_from_name(const char *name);
-int imb_is_a_png(void *buf);
-struct ImBuf *imb_loadpng(unsigned char *mem, int size, int flags);
+/**
+ * Return non-zero when an ID type is linkable.
+ *
+ * @param code The code to check.
+ * @return Boolean, 0 when non linkable.
+ */
+int BKE_idcode_is_linkable(int code);
-short imb_savepng(struct ImBuf *ibuf, char *name, int flags);
+/**
+ * Return if the ID code is a valid ID code.
+ *
+ * @param code The code to check.
+ * @return Boolean, 0 when invalid.
+ */
+int BKE_idcode_is_valid(int code);
#endif
-
diff --git a/source/blender/blenkernel/BKE_idprop.h b/source/blender/blenkernel/BKE_idprop.h
index e33239293a8..0e0d76f4284 100644
--- a/source/blender/blenkernel/BKE_idprop.h
+++ b/source/blender/blenkernel/BKE_idprop.h
@@ -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);
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index 2f506559ae6..3a4288ca1db 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -56,7 +56,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);
@@ -117,7 +116,7 @@ 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);
@@ -161,7 +160,7 @@ void BKE_image_memorypack(struct Image *ima);
void BKE_image_print_memlist(void);
/* empty image block, of similar type and filename */
-struct Image *BKE_image_copy(struct Image *ima);
+struct Image *copy_image(struct Image *ima);
/* merge source into dest, and free source */
void BKE_image_merge(struct Image *dest, struct Image *source);
diff --git a/source/blender/blenkernel/BKE_key.h b/source/blender/blenkernel/BKE_key.h
index 6b8f18e9e17..31e920406c0 100644
--- a/source/blender/blenkernel/BKE_key.h
+++ b/source/blender/blenkernel/BKE_key.h
@@ -75,6 +75,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 f35dff53cd5..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,
diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index cb61a08f3ba..e25c379ded1 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -55,7 +55,7 @@ int new_id(struct ListBase *lb, struct ID *id, const char *name);
struct ListBase *which_libbase(struct Main *mainlib, short type);
-#define MAX_LIBARRAY 40
+#define MAX_LIBARRAY 39
int set_listbasepointers(struct Main *main, struct ListBase **lb);
void free_libblock(struct ListBase *lb, void *idv);
@@ -63,8 +63,9 @@ void free_libblock_us(struct ListBase *lb, void *idv);
void free_main(struct Main *mainvar);
void tag_main(struct Main *mainvar, int tag);
-void splitIDname(char *name, char *left, int *nr);
+int splitIDname(char *name, char *left, int *nr);
void rename_id(struct ID *id, char *name);
+void name_uiprefix_id(char *name, struct ID *id);
void test_idbutton(char *name);
void text_idbutton(struct ID *id, char *text);
void all_local(struct Library *lib, int untagged_only);
@@ -85,4 +86,3 @@ void set_free_windowmanager_cb(void (*func)(struct bContext *, struct wmWindowMa
#define ID_FALLBACK_NAME "Untitled"
#endif
-
diff --git a/source/blender/blenkernel/BKE_main.h b/source/blender/blenkernel/BKE_main.h
index d4d76b2e6e1..60c2d51571f 100644
--- a/source/blender/blenkernel/BKE_main.h
+++ b/source/blender/blenkernel/BKE_main.h
@@ -58,7 +58,6 @@ typedef struct Main {
ListBase mat;
ListBase tex;
ListBase image;
- ListBase wave;
ListBase latt;
ListBase lamp;
ListBase camera;
diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h
index 07ca5a1c0ee..a220153523e 100644
--- a/source/blender/blenkernel/BKE_material.h
+++ b/source/blender/blenkernel/BKE_material.h
@@ -35,6 +35,7 @@
extern "C" {
#endif
+struct Main;
struct Material;
struct ID;
struct Object;
@@ -69,9 +70,9 @@ int object_remove_material_slot(struct Object *ob);
/* rendering */
void init_render_material(struct Material *, int, float *);
-void init_render_materials(int, float *);
+void init_render_materials(struct Main *, int, float *);
void end_render_material(struct Material *);
-void end_render_materials(void);
+void end_render_materials(struct Main *);
int material_in_material(struct Material *parmat, struct Material *mat);
diff --git a/source/blender/blenkernel/BKE_mball.h b/source/blender/blenkernel/BKE_mball.h
index e28e2c4d86e..7fa4fc1a05e 100644
--- a/source/blender/blenkernel/BKE_mball.h
+++ b/source/blender/blenkernel/BKE_mball.h
@@ -162,12 +162,14 @@ void free_mball(struct MetaBall *mb);
struct MetaBall *add_mball(char *name);
struct MetaBall *copy_mball(struct MetaBall *mb);
void make_local_mball(struct MetaBall *mb);
+struct MetaElem *add_metaball_element(struct MetaBall *mb, const int type);
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 3b6cf8803d8..e80c266ff70 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -140,7 +140,12 @@ int mesh_layers_menu_charlen(struct CustomData *data, int type); /* use this to
void mesh_layers_menu_concat(struct CustomData *data, int type, char *str);
int mesh_layers_menu(struct CustomData *data, int type);
+/* vertex level transformations & checks (no derived mesh) */
+int minmax_mesh(struct Mesh *me, float min[3], float max[3]);
+int mesh_center_median(struct Mesh *me, float cent[3]);
+int mesh_center_bounds(struct Mesh *me, float cent[3]);
+void mesh_translate(struct Mesh *me, float offset[3], int do_keys);
#ifdef __cplusplus
}
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index 6db610f4d8d..d6ab99d6534 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -292,6 +292,7 @@ void modifiers_foreachIDLink(struct Object *ob,
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_);
@@ -320,5 +321,8 @@ struct LinkNode *modifiers_calcDataMasks(struct Scene *scene,
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_node.h b/source/blender/blenkernel/BKE_node.h
index 0e5ad8e3ee9..4bd4cc3792f 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -36,24 +36,26 @@
/* not very important, but the stack solver likes to know a maximum */
#define MAX_SOCKET 64
-struct ID;
-struct bNodeTree;
+struct bContext;
struct bNode;
struct bNodeLink;
struct bNodeSocket;
struct bNodeStack;
-struct uiLayout;
-struct rctf;
-struct ListBase;
-struct RenderData;
-struct Scene;
-struct Main;
-struct Tex;
+struct bNodeTree;
struct GPUMaterial;
struct GPUNode;
struct GPUNodeStack;
+struct ID;
+struct ListBase;
+struct Main;
+struct MTex;
struct PointerRNA;
-struct bContext;
+struct rctf;
+struct RenderData;
+struct Scene;
+struct Tex;
+struct uiLayout;
+
/* ************** NODE TYPE DEFINITIONS ***** */
@@ -134,6 +136,7 @@ void ntreeMakeOwnType(struct bNodeTree *ntree);
void ntreeUpdateType(struct bNodeTree *ntree, struct bNodeType *ntype);
void ntreeFreeTree(struct bNodeTree *ntree);
struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree, int internal_select);
+void ntreeSwitchID(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sce_to);
void ntreeMakeLocal(struct bNodeTree *ntree);
void ntreeSocketUseFlags(struct bNodeTree *ntree);
@@ -383,6 +386,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 84995b60f4b..2a7ba4f98c9 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -46,6 +46,7 @@ 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);
@@ -76,12 +77,12 @@ 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);
void free_camera(struct Camera *ca);
void free_lamp(struct Lamp *la);
-void *add_wave(void);
struct Object *add_only_object(int type, char *name);
struct Object *add_object(struct Scene *scene, int type);
diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index 81fb724b3a5..20742033a2e 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;
@@ -45,13 +47,11 @@ extern const char PAINT_CURSOR_TEXTURE_PAINT[3];
void paint_init(struct Paint *p, const char col[3]);
void free_paint(struct Paint *p);
-void copy_paint(struct Paint *orig, struct Paint *new);
+void copy_paint(struct Paint *src, struct Paint *tar);
struct Paint *paint_get_active(struct Scene *sce);
struct Brush *paint_brush(struct Paint *paint);
void paint_brush_set(struct Paint *paint, struct Brush *br);
-void paint_brush_slot_add(struct Paint *p);
-void paint_brush_slot_remove(struct Paint *p);
/* testing face select mode
* Texture paint could be removed since selected faces are not used
@@ -70,7 +70,7 @@ typedef struct SculptSession {
int totvert, totface;
float *face_normals;
struct Object *ob;
- struct KeyBlock *kb, *refkb;
+ struct KeyBlock *kb;
/* Mesh connectivity */
struct ListBase *fmap;
@@ -94,6 +94,10 @@ typedef struct SculptSession {
struct StrokeCache *cache;
struct GPUDrawObject *drawobject;
+
+ int modifiers_active;
+
+ rcti previous_r;
} SculptSession;
void free_sculptsession(struct Object *ob);
diff --git a/source/blender/blenkernel/BKE_pointcache.h b/source/blender/blenkernel/BKE_pointcache.h
index 170965a223a..52536e10e56 100644
--- a/source/blender/blenkernel/BKE_pointcache.h
+++ b/source/blender/blenkernel/BKE_pointcache.h
@@ -33,8 +33,6 @@
#include "DNA_object_force.h"
#include "DNA_boid_types.h"
-#include "MEM_guardedalloc.h"
-
/* Point cache clearing option, for BKE_ptcache_id_clear, before
* and after are non inclusive (they wont remove the cfra) */
#define PTCACHE_CLEAR_ALL 0
@@ -70,15 +68,16 @@
#define PTCACHE_READ_OLD 3
/* Structs */
+struct ClothModifierData;
+struct ListBase;
+struct Main;
struct Object;
-struct Scene;
-struct SoftBody;
-struct ParticleSystem;
struct ParticleKey;
-struct ClothModifierData;
-struct SmokeModifierData;
+struct ParticleSystem;
struct PointCache;
-struct ListBase;
+struct Scene;
+struct SmokeModifierData;
+struct SoftBody;
/* temp structure for read/write */
typedef struct PTCacheData {
@@ -143,6 +142,7 @@ typedef struct PTCacheID {
} PTCacheID;
typedef struct PTCacheBaker {
+ struct Main *main;
struct Scene *scene;
int bake;
int render;
@@ -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);
@@ -272,7 +273,7 @@ int BKE_ptcache_read_cache(PTCacheID *pid, float cfra, float frs_sec);
int BKE_ptcache_write_cache(PTCacheID *pid, int cfra);
/****************** Continue physics ***************/
-void BKE_ptcache_set_continue_physics(struct Scene *scene, int enable);
+void BKE_ptcache_set_continue_physics(struct Main *bmain, struct Scene *scene, int enable);
int BKE_ptcache_get_continue_physics(void);
/******************* Allocate & free ***************/
@@ -285,7 +286,7 @@ struct PointCache *BKE_ptcache_copy_list(struct ListBase *ptcaches_new, struct L
/********************** Baking *********************/
/* Bakes cache with cache_step sized jumps in time, not accurate but very fast. */
-void BKE_ptcache_quick_cache_all(struct Scene *scene);
+void BKE_ptcache_quick_cache_all(struct Main *bmain, struct Scene *scene);
/* Bake cache or simulate to current frame with settings defined in the baker. */
void BKE_ptcache_make_cache(struct PTCacheBaker* baker);
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..6cafb7ef104 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, struct Object *ob, int move_up);
+void sca_move_controller(struct bController *cont_to_move, struct Object *ob, int move_up);
+void sca_move_actuator(struct bActuator *act_to_move, struct Object *ob, int move_up);
+
#endif
diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index 090979b33e9..96ef8d44cf4 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -31,16 +31,16 @@
#ifndef BKE_SCENE_H
#define BKE_SCENE_H
+struct AviCodecData;
+struct Base;
struct bglMats;
-struct Scene;
+struct Main;
struct Object;
-struct Base;
-struct Text;
-struct AviCodecData;
struct QuicktimeCodecData;
struct RenderData;
+struct Scene;
+struct Text;
struct Text;
-struct Main;
#define SCE_COPY_EMPTY 0
#define SCE_COPY_LINK_OB 1
@@ -57,13 +57,13 @@ void free_scene(struct Scene *sce);
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);
+void set_scene_bg(struct Main *bmain, struct Scene *sce);
+struct Scene *set_scene_name(struct Main *bmain, 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_camera_switch_find(struct Scene *scene); // DURIAN_CAMERA_SWITCH
int scene_camera_switch_update(struct Scene *scene);
@@ -78,10 +78,12 @@ void scene_deselect_all(struct Scene *sce);
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);
+int scene_check_setscene(struct Main *bmain, 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);
+void scene_update_tagged(struct Main *bmain, struct Scene *sce);
+void scene_update_for_newframe(struct Main *bmain, struct Scene *sce, unsigned int lay);
void scene_add_render_layer(struct Scene *sce);
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 40168882dcb..0766012b4a5 100644
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@ -31,13 +31,14 @@
#ifndef BKE_SEQUENCER_H
#define BKE_SEQUENCER_H
+struct bContext;
struct Editing;
+struct ImBuf;
+struct Main;
+struct Scene;
struct Sequence;
struct Strip;
struct StripElem;
-struct ImBuf;
-struct Scene;
-struct bContext;
#define MAXSEQ 32
@@ -107,27 +108,28 @@ struct SeqEffectHandle {
0: no early out,
1: out = ibuf1,
2: out = ibuf2 */
- int (*early_out)(struct Sequence *seq,
- float facf0, float facf1);
+ int (*early_out)(struct Sequence *seq, float facf0, float facf1);
/* 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);
+ void (*get_default_fac)(struct Sequence *seq, float cfra,
+ 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);
+ struct ImBuf* (*execute)(
+ struct Main *bmain,
+ struct Scene *scene, struct Sequence *seq, float cfra,
+ float facf0, float facf1,
+ int x, int y, int preview_render_size,
+ struct ImBuf *ibuf1, struct ImBuf *ibuf2,
+ struct ImBuf *ibuf3);
};
/* ********************* prototypes *************** */
@@ -136,8 +138,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);
@@ -146,14 +148,15 @@ void seq_free_editing(struct Scene *scene);
void seq_free_clipboard(void);
struct Editing *seq_give_editing(struct Scene *scene, int alloc);
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_seq(struct Main *bmain, struct Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size);
+struct ImBuf *give_ibuf_seq_threaded(struct Main *bmain, struct Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size);
+struct ImBuf *give_ibuf_seq_direct(struct Main *bmain, struct Scene *scene, int rectx, int recty, int cfra, int render_size, struct Sequence *seq);
+struct ImBuf *give_ibuf_seqbase(struct Main *bmain, 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 Main *bmain, 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));
@@ -163,6 +166,32 @@ struct StripElem *give_stripelem(struct Sequence *seq, int cfra);
// intern?
void update_changed_seq_and_deps(struct Scene *scene, struct Sequence *changed_seq, int len_change, int ibuf_change);
+int input_have_to_preprocess(
+ struct Scene *scene, struct Sequence * seq,
+ float cfra, int seqrectx, int seqrecty);
+
+/* seqcache.c */
+
+typedef enum {
+ SEQ_STRIPELEM_IBUF,
+ SEQ_STRIPELEM_IBUF_COMP,
+ SEQ_STRIPELEM_IBUF_STARTSTILL,
+ SEQ_STRIPELEM_IBUF_ENDSTILL
+} seq_stripelem_ibuf_t;
+
+void seq_stripelem_cache_init();
+void seq_stripelem_cache_destruct();
+
+void seq_stripelem_cache_cleanup();
+
+struct ImBuf * seq_stripelem_cache_get(
+ struct Sequence * seq, int rectx, int recty,
+ float cfra, seq_stripelem_ibuf_t type);
+void seq_stripelem_cache_put(
+ struct Sequence * seq, int rectx, int recty,
+ float cfra, seq_stripelem_ibuf_t type, struct ImBuf * nval);
+
+
/* seqeffects.c */
// intern?
struct SeqEffectHandle get_sequence_blend(struct Sequence *seq);
@@ -186,21 +215,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);
+void free_imbuf_seq(struct Scene *scene, struct ListBase * seqbasep, int check_mem_usage, int keep_file_handles);
+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_sound_reload(struct Scene *scene, ListBase *seqbase);
void seqbase_unique_name_recursive(ListBase *seqbasep, struct Sequence *seq);
-void clear_scene_in_allseqs(struct Scene *sce);
+void seqbase_dupli_recursive(struct Scene *scene, ListBase *nseqbase, ListBase *seqbase, int dupe_flag);
+
+void clear_scene_in_allseqs(struct Main *bmain, 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 +257,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 *);
@@ -234,7 +276,7 @@ struct Sequence *sequencer_add_sound_strip(struct bContext *C, ListBase *seqbase
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);
+typedef struct ImBuf *(*SequencerDrawView)(struct Scene *, int, int, unsigned int, int);
extern SequencerDrawView sequencer_view3d_cb;
/* copy/paste */
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 ef7fa473ad0..738fe7dde82 100644
--- a/source/blender/blenkernel/BKE_softbody.h
+++ b/source/blender/blenkernel/BKE_softbody.h
@@ -1,6 +1,6 @@
/**
- * BKE_softbody.h
- *
+ * BKE_softbody.h
+ *
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -43,7 +43,7 @@ typedef struct BodyPoint {
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 b89767d2586..190b0400aff 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();
@@ -92,6 +94,6 @@ float sound_sync_scene(struct Scene *scene);
int sound_scene_playing(struct Scene *scene);
-int sound_read_sound_buffer(struct bSound* sound, float* buffer, int length);
+int sound_read_sound_buffer(struct bSound* sound, float* buffer, int length, float start, float end);
#endif
diff --git a/source/blender/blenkernel/BKE_subsurf.h b/source/blender/blenkernel/BKE_subsurf.h
index 853fd99aa86..940a0027d0b 100644
--- a/source/blender/blenkernel/BKE_subsurf.h
+++ b/source/blender/blenkernel/BKE_subsurf.h
@@ -52,7 +52,7 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
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 *****************************/
@@ -72,6 +72,7 @@ typedef struct CCGDerivedMesh {
char *faceFlags;
struct PBVH *pbvh;
+ int pbvh_draw;
struct ListBase *fmap;
struct IndexNode *fmap_mem;
@@ -87,7 +88,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_text.h b/source/blender/blenkernel/BKE_text.h
index 244fffa06ea..bcda86fdae4 100644
--- a/source/blender/blenkernel/BKE_text.h
+++ b/source/blender/blenkernel/BKE_text.h
@@ -92,7 +92,7 @@ void unindent (struct Text *text);
void comment (struct Text *text);
void indent (struct Text *text);
void uncomment (struct Text *text);
-int setcurr_tab (struct Text *text);
+int setcurr_tab_spaces (struct Text *text, int space);
void txt_add_marker (struct Text *text, struct TextLine *line, int start, int end, char color[4], int group, int flags);
short txt_clear_marker_region (struct Text *text, struct TextLine *line, int start, int end, int group, int flags);
diff --git a/source/blender/blenkernel/BKE_texture.h b/source/blender/blenkernel/BKE_texture.h
index ace352395d2..380672dae04 100644
--- a/source/blender/blenkernel/BKE_texture.h
+++ b/source/blender/blenkernel/BKE_texture.h
@@ -61,9 +61,13 @@ void init_colorband(struct ColorBand *coba, int rangetype);
struct ColorBand *add_colorband(int rangetype);
int do_colorband(struct ColorBand *coba, float in, float out[4]);
void colorband_table_RGBA(struct ColorBand *coba, float **array, int *size);
+int vergcband(const void *a1, const void *a2);
+struct CBData *colorband_element_add(struct ColorBand *coba, float position);
+int colorband_element_remove(struct ColorBand *coba, int index);
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 43ae66a0bfc..925b1d7171a 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 *****
*
@@ -39,6 +38,9 @@
#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
@@ -106,6 +108,7 @@
#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);}
@@ -163,7 +166,7 @@
#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 da5e73bbb45..fbd75a79fd7 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -27,7 +27,7 @@
FILE(GLOB SRC intern/*.c)
SET(INC
- . ../../../intern/guardedalloc ../../../intern/memutil ../editors/include ../blenlib ../makesdna
+ . ../../../intern/guardedalloc ../../../intern/memutil ../editors/include ../blenlib ../makesdna ../modifiers
../render/extern/include ../../../intern/decimation/extern
../imbuf ../avi ../../../intern/elbeem/extern ../../../intern/opennl/extern
../../../intern/iksolver/extern ../blenloader ../ikplugin
@@ -38,6 +38,7 @@ SET(INC
${ZLIB_INC}
)
+
ADD_DEFINITIONS(-DGLEW_STATIC)
IF(WITH_BULLET)
@@ -45,17 +46,29 @@ IF(WITH_BULLET)
ADD_DEFINITIONS(-DUSE_BULLET)
ENDIF(WITH_BULLET)
-IF(WITH_OPENEXR)
+IF(WITH_IMAGE_OPENEXR)
ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_OPENEXR)
+ENDIF(WITH_IMAGE_OPENEXR)
+
+IF(WITH_IMAGE_TIFF)
+ ADD_DEFINITIONS(-DWITH_TIFF)
+ENDIF(WITH_IMAGE_TIFF)
-IF(WITH_OPENJPEG)
+IF(WITH_IMAGE_OPENJPEG)
ADD_DEFINITIONS(-DWITH_OPENJPEG)
-ENDIF(WITH_OPENJPEG)
+ENDIF(WITH_IMAGE_OPENJPEG)
-IF(WITH_DDS)
+IF(WITH_IMAGE_DDS)
ADD_DEFINITIONS(-DWITH_DDS)
-ENDIF(WITH_DDS)
+ENDIF(WITH_IMAGE_DDS)
+
+IF(WITH_IMAGE_CINEON)
+ ADD_DEFINITIONS(-DWITH_CINEON)
+ENDIF(WITH_IMAGE_CINEON)
+
+IF(WITH_IMAGE_HDR)
+ ADD_DEFINITIONS(-DWITH_HDR)
+ENDIF(WITH_IMAGE_HDR)
IF(WITH_QUICKTIME)
SET(INC ${INC} ../quicktime ${QUICKTIME_INC})
@@ -67,6 +80,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)
@@ -77,9 +95,9 @@ IF(WITH_OPENMP)
ADD_DEFINITIONS(-DPARALLEL=1)
ENDIF(WITH_OPENMP)
-IF(NOT WITH_ELBEEM)
+IF(NOT WITH_FLUID)
ADD_DEFINITIONS(-DDISABLE_ELBEEM)
-ENDIF(NOT WITH_ELBEEM)
+ENDIF(NOT WITH_FLUID)
IF(WITH_LZO)
SET(INC ${INC} ../../../extern/lzo/minilzo)
diff --git a/source/blender/blenkernel/Makefile b/source/blender/blenkernel/Makefile
index f0476bbf026..dc5f0a91da6 100644
--- a/source/blender/blenkernel/Makefile
+++ b/source/blender/blenkernel/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/blenkernel/SConscript b/source/blender/blenkernel/SConscript
index 37a63be6389..9f5027f801d 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'
@@ -38,12 +38,21 @@ 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')
if env['WITH_BF_DDS']:
defs.append('WITH_DDS')
+if env['WITH_BF_CINEON']:
+ defs.append('WITH_CINEON')
+
+if env['WITH_BF_HDR']:
+ defs.append('WITH_HDR')
+
if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
incs += ' ' + env['BF_FFMPEG_INC']
@@ -64,6 +73,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 d8a6b66d5bb..1087b3a873c 100644
--- a/source/blender/blenkernel/intern/BME_Customdata.c
+++ b/source/blender/blenkernel/intern/BME_Customdata.c
@@ -36,9 +36,9 @@
#include <string.h>
+#include "MEM_guardedalloc.h"
#include "BKE_bmeshCustomData.h"
#include "bmesh_private.h"
-#include "MEM_guardedalloc.h"
/********************* Layer type information **********************/
typedef struct BME_LayerTypeInfo {
diff --git a/source/blender/blenkernel/intern/BME_conversions.c b/source/blender/blenkernel/intern/BME_conversions.c
index d6a00450e4a..341eb38b388 100644
--- a/source/blender/blenkernel/intern/BME_conversions.c
+++ b/source/blender/blenkernel/intern/BME_conversions.c
@@ -391,9 +391,9 @@ void BME_bmesh_to_editmesh(BME_Mesh *bm, BME_TransData_Head *td, EditMesh *em) {
if(e->flag & SELECT) eed->f |= SELECT;
//XXX if(e->flag & ME_FGON) eed->h= EM_FGON; // 2 different defines!
if(e->flag & ME_HIDE) eed->h |= 1;
- if(em->selectmode==SCE_SELECT_EDGE)
+ if(em->selectmode==SCE_SELECT_EDGE) {
; //XXX EM_select_edge(eed, eed->f & SELECT);
-
+ }
CustomData_em_copy_data(&bm->edata, &em->edata, e->data, &eed->data);
}
}
@@ -531,6 +531,7 @@ DerivedMesh *BME_bmesh_to_derivedmesh(BME_Mesh *bm, DerivedMesh *dm)
MFace *mface, *mf;
MEdge *medge, *me;
MVert *mvert, *mv;
+ int *origindex;
int totface,totedge,totvert,i,bmeshok,len, numTex, numCol;
BME_Vert *v1=NULL;
@@ -577,13 +578,16 @@ DerivedMesh *BME_bmesh_to_derivedmesh(BME_Mesh *bm, DerivedMesh *dm)
/*Make Verts*/
mvert = CDDM_get_verts(result);
+ origindex = result->getVertDataArray(result, CD_ORIGINDEX);
for(i=0,v1=bm->verts.first,mv=mvert;v1;v1=v1->next,i++,mv++){
VECCOPY(mv->co,v1->co);
mv->flag = (unsigned char)v1->flag;
mv->bweight = (char)(255.0*v1->bweight);
CustomData_from_bmesh_block(&bm->vdata, &result->vertData, &v1->data, i);
+ origindex[i] = ORIGINDEX_NONE;
}
medge = CDDM_get_edges(result);
+ origindex = result->getEdgeDataArray(result, CD_ORIGINDEX);
i=0;
for(e=bm->edges.first,me=medge;e;e=e->next){
if(e->tflag2){
@@ -600,12 +604,14 @@ DerivedMesh *BME_bmesh_to_derivedmesh(BME_Mesh *bm, DerivedMesh *dm)
me->bweight = (char)(255.0*e->bweight);
me->flag = e->flag;
CustomData_from_bmesh_block(&bm->edata, &result->edgeData, &e->data, i);
+ origindex[i] = ORIGINDEX_NONE;
me++;
i++;
}
}
if(totface){
mface = CDDM_get_faces(result);
+ origindex = result->getFaceDataArray(result, CD_ORIGINDEX);
/*make faces*/
for(i=0,f=bm->polys.first;f;f=f->next){
mf = &mface[i];
@@ -625,6 +631,7 @@ DerivedMesh *BME_bmesh_to_derivedmesh(BME_Mesh *bm, DerivedMesh *dm)
mf->flag = (unsigned char)f->flag;
CustomData_from_bmesh_block(&bm->pdata, &result->faceData, &f->data, i);
BME_DMloops_to_corners(bm, &result->faceData, i, f,numCol,numTex);
+ origindex[i] = ORIGINDEX_NONE;
i++;
}
}
diff --git a/source/blender/blenkernel/intern/BME_tools.c b/source/blender/blenkernel/intern/BME_tools.c
index 9753ad47488..7d9c9a431f8 100644
--- a/source/blender/blenkernel/intern/BME_tools.c
+++ b/source/blender/blenkernel/intern/BME_tools.c
@@ -49,8 +49,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 6778c9eb8ad..bbd68fb797b 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -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 f4e3a60803e..de7b962e38a 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -29,10 +29,6 @@
#include <string.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "MEM_guardedalloc.h"
@@ -63,7 +59,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"
@@ -251,8 +247,8 @@ void DM_to_mesh(DerivedMesh *dm, Mesh *me)
/* if the number of verts has changed, remove invalid data */
if(tmp.totvert != me->totvert) {
- if(me->key) me->key->id.us--;
- me->key = NULL;
+ if(tmp.key) tmp.key->id.us--;
+ tmp.key = NULL;
}
*me = tmp;
@@ -416,7 +412,7 @@ void DM_interp_face_data(DerivedMesh *source, DerivedMesh *dest,
weights, (float*)vert_weights, count, dest_index);
}
-void DM_swap_face_data(DerivedMesh *dm, int index, int *corner_indices)
+void DM_swap_face_data(DerivedMesh *dm, int index, const int *corner_indices)
{
CustomData_swap(&dm->faceData, index, corner_indices);
}
@@ -587,14 +583,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) {
@@ -1081,6 +1077,21 @@ static int emDM_getNumFaces(DerivedMesh *dm)
return BLI_countlist(&emdm->em->faces);
}
+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;
@@ -1178,10 +1189,15 @@ static void emDM_getFace(DerivedMesh *dm, int index, MFace *face_r)
static void emDM_copyVertArray(DerivedMesh *dm, MVert *vert_r)
{
- EditVert *ev = ((EditMeshDerivedMesh *)dm)->em->verts.first;
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+ EditVert *ev = emdm->em->verts.first;
+ int i;
- for( ; ev; ev = ev->next, ++vert_r) {
- VECCOPY(vert_r->co, ev->co);
+ for(i=0; ev; ev = ev->next, ++vert_r, ++i) {
+ if(emdm->vertexCos)
+ copy_v3_v3(vert_r->co, emdm->vertexCos[i]);
+ else
+ copy_v3_v3(vert_r->co, ev->co);
vert_r->no[0] = ev->no[0] * 32767.0;
vert_r->no[1] = ev->no[1] * 32767.0;
@@ -1313,6 +1329,8 @@ static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em, Object *ob,
emdm->dm.getNumEdges = emDM_getNumEdges;
emdm->dm.getNumFaces = emDM_getNumFaces;
+ emdm->dm.getVertCos = emDM_getVertCos;
+
emdm->dm.getVert = emDM_getVert;
emdm->dm.getEdge = emDM_getEdge;
emdm->dm.getFace = emDM_getFace;
@@ -1373,15 +1391,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) {
@@ -1389,8 +1407,7 @@ static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em, Object *ob,
/* following Mesh convention; we use vertex coordinate itself
* for normal in this case */
if (normalize_v3(no)==0.0) {
- VECCOPY(no, vertexCos[i]);
- normalize_v3(no);
+ normalize_v3_v3(no, vertexCos[i]);
}
}
}
@@ -1745,7 +1762,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) {
@@ -1871,7 +1887,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
}
}
}
-
+
/* grab modifiers until index i */
if((index >= 0) && (modifiers_indexInObject(ob, md) >= index))
break;
@@ -2021,7 +2037,9 @@ static void editmesh_calc_modifiers(Scene *scene, Object *ob, EditMesh *em, Deri
}
}
- 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;
@@ -2057,7 +2075,11 @@ static void editmesh_calc_modifiers(Scene *scene, Object *ob, EditMesh *em, Deri
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 */
@@ -2073,7 +2095,10 @@ static void editmesh_calc_modifiers(Scene *scene, Object *ob, EditMesh *em, Deri
if(!CustomData_has_layer(&dm->faceData, CD_ORIGSPACE))
DM_add_face_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)
@@ -2489,7 +2514,7 @@ void DM_add_tangent_layer(DerivedMesh *dm)
tangent= DM_get_face_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");
@@ -2564,9 +2589,7 @@ void DM_add_tangent_layer(DerivedMesh *dm)
for(j=0; j<len; j++) {
vtang= find_vertex_tangent(vtangents[mf_vi[j]], mtface ? tf->uv[j] : uv[j]);
-
- VECCOPY(tangent[j], vtang);
- normalize_v3(tangent[j]);
+ normalize_v3_v3(tangent[j], vtang);
}
}
diff --git a/source/blender/blenkernel/intern/Makefile b/source/blender/blenkernel/intern/Makefile
index 70e1a785787..53a9999758c 100644
--- a/source/blender/blenkernel/intern/Makefile
+++ b/source/blender/blenkernel/intern/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.
@@ -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,8 +132,25 @@ ifeq ($(WITH_QUICKTIME), true)
CPPFLAGS += -DWITH_QUICKTIME
endif
+ifeq ($(WITH_TIFF), true)
+ CPPFLAGS += -DWITH_TIFF
+endif
+
+ifeq ($(WITH_CINEON), true)
+ CPPFLAGS += -DWITH_CINEON
+endif
+
+ifeq ($(WITH_HDR), true)
+ CPPFLAGS += -DWITH_HDR
+endif
+
ifeq ($(OS), darwin)
ifeq ($(WITH_BF_OPENMP), true)
CPPFLAGS += -DPARALLEL=1
endif
endif
+
+ifeq ($(WITH_LCMS), true)
+ CPPFLAGS += -DWITH_LCMS
+ CPPFLAGS += -I$(BF_LCMS_INC)
+endif
diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c
index 365ac2371b8..90a3a6ce664 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>
@@ -41,6 +37,7 @@
#include "DNA_armature_types.h"
#include "DNA_constraint_types.h"
#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
#include "BKE_animsys.h"
#include "BKE_action.h"
@@ -305,7 +302,7 @@ void action_groups_add_channel (bAction *act, bActionGroup *agrp, FCurve *fcurve
/* firstly, link this F-Curve to the group */
agrp->channels.first = agrp->channels.last = fcurve;
- /* step through the groups preceeding this one, finding the F-Curve there to attach this one after */
+ /* step through the groups preceding this one, finding the F-Curve there to attach this one after */
for (grp= agrp->prev; grp; grp= grp->prev) {
/* if this group has F-Curves, we want weave the given one in right after the last channel there,
* but via the Action's list not this group's list
@@ -371,20 +368,12 @@ void action_groups_remove_channel (bAction *act, FCurve *fcu)
/* Find a group with the given name */
bActionGroup *action_groups_find_named (bAction *act, const char name[])
{
- bActionGroup *grp;
-
/* sanity checks */
if (ELEM3(NULL, act, act->groups.first, name) || (name[0] == 0))
return NULL;
/* do string comparisons */
- for (grp= act->groups.first; grp; grp= grp->next) {
- if (strcmp(grp->name, name) == 0)
- return grp;
- }
-
- /* not found */
- return NULL;
+ return BLI_findstring(&act->groups, name, offsetof(bActionGroup, name));
}
/* *************** Pose channels *************** */
@@ -396,7 +385,7 @@ bPoseChannel *get_pose_channel(const bPose *pose, const char *name)
return NULL;
if(pose->chanhash)
- return BLI_ghash_lookup(pose->chanhash, name);
+ return BLI_ghash_lookup(pose->chanhash, (void *)name);
return BLI_findstring(&((bPose *)pose)->chanbase, name, offsetof(bPoseChannel, name));
}
@@ -497,7 +486,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... */
@@ -553,7 +542,7 @@ void make_pose_channels_hash(bPose *pose)
if(!pose->chanhash) {
bPoseChannel *pchan;
- pose->chanhash= BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp);
+ 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);
}
@@ -671,7 +660,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) {
@@ -1255,12 +1244,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.
@@ -1422,7 +1411,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) {
@@ -1620,7 +1609,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 b687062fe15..e27e3b2cd3f 100644
--- a/source/blender/blenkernel/intern/anim.c
+++ b/source/blender/blenkernel/intern/anim.c
@@ -40,7 +40,6 @@
#include "BLI_math.h"
#include "BLI_rand.h"
-
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
#include "DNA_group_types.h"
@@ -49,9 +48,9 @@
#include "DNA_scene_types.h"
#include "DNA_vfont_types.h"
-#include "BKE_anim.h"
#include "BKE_curve.h"
#include "BKE_DerivedMesh.h"
+#include "BKE_depsgraph.h"
#include "BKE_font.h"
#include "BKE_group.h"
#include "BKE_global.h"
@@ -63,10 +62,8 @@
#include "BKE_particle.h"
#include "BKE_scene.h"
#include "BKE_utildefines.h"
+#include "BKE_depsgraph.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
// XXX bad level call...
@@ -191,6 +188,8 @@ 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");
@@ -254,6 +253,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(G.main, 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(G.main, 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(G.main, 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)
{
@@ -315,7 +391,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);
@@ -323,14 +399,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);
@@ -338,7 +414,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) {
@@ -381,24 +457,24 @@ void calc_curvepath(Object *ob)
float *fp, *dist, *maxdist, xyz[3];
float fac, d=0, fac1, fac2;
int a, tot, cycl=0;
+ ListBase *nurbs;
/* in a path vertices are with equal differences: path->len = number of verts */
/* NOW WITH BEVELCURVE!!! */
if(ob==NULL || ob->type != OB_CURVE) return;
cu= ob->data;
- if(cu->editnurb)
- nu= cu->editnurb->first;
- else
- nu= cu->nurb.first;
-
+
+ nurbs= BKE_curve_nurbs(cu);
+ nu= nurbs->first;
+
if(cu->path) free_path(cu->path);
cu->path= NULL;
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);
@@ -464,6 +540,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);
@@ -495,7 +572,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;
@@ -591,6 +668,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;
}
@@ -646,11 +726,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);
}
}
@@ -717,10 +807,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);
@@ -980,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);
@@ -1003,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;
@@ -1098,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) {
@@ -1116,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 */
@@ -1430,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 9fb442f8600..10c2c1801cb 100644
--- a/source/blender/blenkernel/intern/anim_sys.c
+++ b/source/blender/blenkernel/intern/anim_sys.c
@@ -339,6 +339,19 @@ static void fcurves_path_rename_fix (ID *owner_id, char *prefix, char *oldName,
/* 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, 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) {
@@ -352,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, verify_paths);
+ 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
}
@@ -398,11 +412,12 @@ void BKE_animdata_fix_paths_rename (ID *owner_id, AnimData *adt, char *prefix, c
if (ELEM(NULL, owner_id, adt))
return;
- if (oldName != NULL && newName != NULL) {
+ 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 {
+ }
+ else {
oldN= BLI_sprintfN("[%d]", oldSubscript);
newN= BLI_sprintfN("[%d]", newSubscript);
}
@@ -414,7 +429,7 @@ void BKE_animdata_fix_paths_rename (ID *owner_id, AnimData *adt, char *prefix, c
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, verify_paths);
+ 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)
@@ -1805,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 c1998d705ad..41821f34ba8 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -45,6 +45,7 @@
#include "DNA_meshdata_types.h"
#include "DNA_nla_types.h"
#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
#include "BKE_animsys.h"
#include "BKE_armature.h"
@@ -54,6 +55,7 @@
#include "BKE_curve.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"
@@ -65,10 +67,6 @@
#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)
@@ -248,131 +246,20 @@ Bone *get_named_bone (bArmature *arm, const char *name)
return bone;
}
-
-#define IS_SEPARATOR(a) (a=='.' || a==' ' || a=='-' || a=='_')
-
-/* finds the best possible flipped name. For renaming; check for unique names afterwards */
-/* if strip_number: removes number extensions */
-void bone_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 occurrence
- 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);
-
- /* 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);
- }
- }
- }
-
- sprintf (name, "%s%s%s%s", prefix, replace, suffix, number);
-}
-
/* Finds the best possible extension to the name on a particular axis. (For renaming, check for unique names afterwards)
* This assumes that bone names are at most 32 chars long!
* strip_number: removes number extensions (TODO: not used)
* 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:
@@ -466,9 +353,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 ******************* */
@@ -684,11 +577,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];
@@ -715,10 +608,7 @@ static void pchan_b_bone_defmats(bPoseChannel *pchan, int use_quaternion, int re
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);
@@ -847,9 +737,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);
@@ -917,12 +806,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;
@@ -944,7 +832,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++];
@@ -954,26 +842,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))
@@ -1105,9 +995,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);
@@ -1393,9 +1283,8 @@ void vec_roll_to_mat3(float *vec, float roll, float mat[][3])
float nor[3], axis[3], target[3]={0,1,0};
float theta;
float rMatrix[3][3], bMatrix[3][3];
-
- VECCOPY (nor, vec);
- normalize_v3(nor);
+
+ normalize_v3_v3(nor, vec);
/* Find Axis & Amount for bone matrix*/
cross_v3_v3v3(axis,target,nor);
@@ -1564,9 +1453,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 */
@@ -1695,6 +1586,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);
}
@@ -1769,20 +1662,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)
@@ -1940,7 +1826,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)
*/
@@ -1956,7 +1842,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)
*/
@@ -2005,6 +1891,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
*/
@@ -2051,7 +1942,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;
@@ -2072,13 +1963,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 */
@@ -2110,8 +2014,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);
@@ -2261,7 +2163,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]);
@@ -2277,7 +2179,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);
@@ -2380,7 +2282,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 d7f8d73e31f..052c1851343 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -43,6 +43,7 @@
#include <stdlib.h>
#include <stdio.h>
+#include <stddef.h>
#include <string.h>
#include <fcntl.h> // for open
@@ -52,9 +53,11 @@
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_sequence_types.h"
+#include "DNA_sound_types.h"
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_path_util.h"
#include "IMB_imbuf.h"
@@ -64,8 +67,8 @@
#include "BKE_displist.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_report.h"
@@ -100,7 +103,8 @@ void free_blender(void)
BKE_spacetypes_free(); /* after free main, it uses space callbacks */
- IMB_freeImBufdata(); /* imbuf lib */
+ IMB_exit();
+ seq_stripelem_cache_destruct();
free_nodesystem();
}
@@ -130,6 +134,8 @@ void initglobals(void)
G.charstart = 0x0000;
G.charmin = 0x0000;
G.charmax = 0xffff;
+
+ G.f |= G_SCRIPT_AUTOEXEC;
}
/***/
@@ -276,6 +282,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;
@@ -283,14 +291,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)
@@ -299,9 +315,7 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename)
BLI_strncpy(G.main->name, filename, FILE_MAX); /* is guaranteed current file */
/* baseflags, groups, make depsgraph, etc */
- set_scene_bg(CTX_data_scene(C));
-
- DAG_on_load_update();
+ set_scene_bg(G.main, CTX_data_scene(C));
MEM_freeN(bfd);
}
@@ -356,7 +370,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);
@@ -446,13 +460,16 @@ static UndoElem *curundo= NULL;
static int read_undosave(bContext *C, UndoElem *uel)
{
- char scestr[FILE_MAXDIR+FILE_MAXFILE];
+ char scestr[FILE_MAXDIR+FILE_MAXFILE]; /* we should eventually just use G.main->name */
+ char mainstr[FILE_MAXDIR+FILE_MAXFILE];
int success=0, fileflags;
/* This is needed so undoing/redoing doesnt crash with threaded previews going */
WM_jobs_stop_all(CTX_wm_manager(C));
strcpy(scestr, G.sce); /* temporal store */
+ strcpy(mainstr, G.main->name); /* temporal store */
+
fileflags= G.fileflags;
G.fileflags |= G_FILE_NO_UI;
@@ -462,9 +479,13 @@ static int read_undosave(bContext *C, UndoElem *uel)
success= BKE_read_file_from_memfile(C, &uel->memfile, NULL);
/* restore */
- strcpy(G.sce, scestr);
+ strcpy(G.sce, scestr); /* restore */
+ strcpy(G.main->name, mainstr); /* restore */
G.fileflags= fileflags;
+ if(success)
+ DAG_on_load_update(G.main);
+
return success;
}
@@ -523,7 +544,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);
}
@@ -625,11 +646,11 @@ void BKE_undo_number(bContext *C, int nr)
void BKE_undo_name(bContext *C, const char *name)
{
UndoElem *uel;
-
- for(uel= undobase.last; uel; uel= uel->prev) {
+
+ for(uel= undobase.last; uel; uel= uel->prev)
if(strcmp(name, uel->name)==0)
break;
- }
+
if(uel && uel->prev) {
curundo= uel->prev;
BKE_undo_step(C, 0);
diff --git a/source/blender/blenkernel/intern/bmfont.c b/source/blender/blenkernel/intern/bmfont.c
index 5f6a4278549..e2a6c04450b 100644
--- a/source/blender/blenkernel/intern/bmfont.c
+++ b/source/blender/blenkernel/intern/bmfont.c
@@ -56,10 +56,6 @@
#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);
@@ -178,7 +174,7 @@ void detectBitmapFont(ImBuf *ibuf)
unsigned short version;
int i;
- if (ibuf != NULL) {
+ 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)));
diff --git a/source/blender/blenkernel/intern/boids.c b/source/blender/blenkernel/intern/boids.c
index 25c42dfbf49..7ae65d0113a 100644
--- a/source/blender/blenkernel/intern/boids.c
+++ b/source/blender/blenkernel/intern/boids.c
@@ -141,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);
}
@@ -355,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;
@@ -372,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;
@@ -393,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;
@@ -567,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 {
@@ -590,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);
}
}
@@ -659,9 +659,9 @@ static int rule_fight(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, Parti
/* attack if in range */
if(closest_dist <= bbd->part->boids->range + pa->size + enemy_pa->size) {
float damage = BLI_frand();
- float enemy_dir[3] = {bbd->wanted_co[0],bbd->wanted_co[1],bbd->wanted_co[2]};
+ float enemy_dir[3];
- normalize_v3(enemy_dir);
+ normalize_v3_v3(enemy_dir, bbd->wanted_co);
/* fight mode */
bbd->wanted_speed = 0.0f;
@@ -748,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);
@@ -765,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;
@@ -786,8 +786,7 @@ static Object *boid_find_ground(BoidBrainData *bbd, ParticleData *pa, float *gro
if(hit.index>=0) {
t = hit.dist/col.ray_len;
interp_v3_v3v3(ground_co, col.co1, col.co2, t);
- VECCOPY(ground_nor, col.nor);
- normalize_v3(ground_nor);
+ normalize_v3_v3(ground_nor, col.nor);
return col.hit_ob;
}
else {
@@ -956,7 +955,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;
@@ -1115,8 +1114,7 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa)
}
VECCOPY(old_dir, pa->prev_state.ave);
- VECCOPY(wanted_dir, bbd->wanted_co);
- new_speed = normalize_v3(wanted_dir);
+ new_speed = normalize_v3_v3(wanted_dir, bbd->wanted_co);
/* first check if we have valid direction we want to go towards */
if(new_speed == 0.0f) {
@@ -1205,7 +1203,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);
@@ -1222,8 +1220,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);
@@ -1356,8 +1354,7 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa)
/* save direction to state.ave unless the boid is falling */
/* (boids can't effect their direction when falling) */
if(bpa->data.mode!=eBoidMode_Falling && len_v3(pa->state.vel) > 0.1*pa->size) {
- VECCOPY(pa->state.ave, pa->state.vel);
- normalize_v3(pa->state.ave);
+ normalize_v3_v3(pa->state.ave, pa->state.vel);
}
/* apply damping */
diff --git a/source/blender/blenkernel/intern/booleanops_mesh.c b/source/blender/blenkernel/intern/booleanops_mesh.c
index 431e51cf149..dd595fc98b6 100644
--- a/source/blender/blenkernel/intern/booleanops_mesh.c
+++ b/source/blender/blenkernel/intern/booleanops_mesh.c
@@ -30,7 +30,6 @@
*/
#include "CSG_BooleanOps.h"
-#include "MEM_guardedalloc.h"
diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c
index 4b8c3a2a0f4..71a43994363 100644
--- a/source/blender/blenkernel/intern/brush.c
+++ b/source/blender/blenkernel/intern/brush.c
@@ -35,6 +35,7 @@
#include "DNA_brush_types.h"
#include "DNA_color_types.h"
#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
#include "DNA_windowmanager_types.h"
#include "WM_types.h"
@@ -53,8 +54,7 @@
#include "BKE_main.h"
#include "BKE_paint.h"
#include "BKE_texture.h"
-
-
+#include "BKE_icons.h"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -62,6 +62,58 @@
#include "RE_render_ext.h" /* externtex */
#include "RE_shader_ext.h"
+static void brush_set_defaults(Brush *brush)
+{
+ brush->blend = 0;
+ brush->flag = 0;
+
+ brush->ob_mode = (OB_MODE_SCULPT|OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT);
+
+ /* BRUSH SCULPT TOOL SETTINGS */
+ 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_AREA;
+ 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->flag |= BRUSH_ALPHA_PRESSURE;
+
+ /* 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 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->texture_overlay_alpha= 33;
+
+ /* brush appearance */
+
+ 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;
+}
+
/* Datablock add/copy/free/make_local */
Brush *add_brush(const char *name)
@@ -70,29 +122,17 @@ Brush *add_brush(const char *name)
brush= alloc_libblock(&G.main->brush, ID_BR, name);
- brush->rgb[0]= 1.0f;
- 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;
+ /* enable fake user by default */
+ brush->id.flag |= LIB_FAKEUSER;
+ brush_set_defaults(brush);
+
+ brush->sculpt_tool = SCULPT_TOOL_DRAW; /* sculpting defaults to the draw tool for new brushes */
+
+ /* the default alpha falloff curve */
brush_curve_preset(brush, CURVE_PRESET_SMOOTH);
-
- default_mtex(&brush->mtex);
- /* enable fake user by default */
- brush->id.flag |= LIB_FAKEUSER;
- brush_toggled_fake_user(brush);
-
- return brush;
+ return brush;
}
Brush *copy_brush(Brush *brush)
@@ -101,14 +141,18 @@ Brush *copy_brush(Brush *brush)
brushn= copy_libblock(brush);
- if(brush->mtex.tex) id_us_plus((ID*)brush->mtex.tex);
-
+ if (brush->mtex.tex)
+ id_us_plus((ID*)brush->mtex.tex);
+
+ if (brush->icon_imbuf)
+ brushn->icon_imbuf= IMB_dupImBuf(brush->icon_imbuf);
+
brushn->curve= curvemapping_copy(brush->curve);
/* enable fake user by default */
if (!(brushn->id.flag & LIB_FAKEUSER)) {
brushn->id.flag |= LIB_FAKEUSER;
- brush_toggled_fake_user(brushn);
+ brushn->id.us++;
}
return brushn;
@@ -117,8 +161,14 @@ Brush *copy_brush(Brush *brush)
/* not brush itself */
void free_brush(Brush *brush)
{
- if(brush->mtex.tex) brush->mtex.tex->id.us--;
-
+ if (brush->mtex.tex)
+ brush->mtex.tex->id.us--;
+
+ if (brush->icon_imbuf)
+ IMB_freeImBuf(brush->icon_imbuf);
+
+ BKE_previewimg_free(&(brush->preview));
+
curvemapping_free(brush->curve);
}
@@ -147,7 +197,7 @@ void make_local_brush(Brush *brush)
if(scene->id.lib) lib= 1;
else local= 1;
}
-
+
if(local && lib==0) {
brush->id.lib= 0;
brush->id.flag= LIB_LOCAL;
@@ -156,7 +206,7 @@ void make_local_brush(Brush *brush)
/* enable fake user by default */
if (!(brush->id.flag & LIB_FAKEUSER)) {
brush->id.flag |= LIB_FAKEUSER;
- brush_toggled_fake_user(brush);
+ brush->id.us++;
}
}
else if(local && lib) {
@@ -174,55 +224,176 @@ void make_local_brush(Brush *brush)
}
}
-/* Library Operations */
-
-int brush_set_nr(Brush **current_brush, int nr, const char *name)
+void brush_debug_print_state(Brush *br)
{
- ID *idtest, *id;
+ Brush def;
+
+ /* create a fake brush and set it to the defaults */
+ memset(&def, 0, sizeof(Brush));
+ brush_set_defaults(&def);
- id= (ID*)(*current_brush);
- idtest= (ID*)BLI_findlink(&G.main->brush, nr-1);
+#define BR_TEST(field, t) \
+ if(br->field != def.field) \
+ printf("br->" #field " = %" #t ";\n", br->field)
+
+#define BR_TEST_FLAG(_f) \
+ if((br->flag & _f) && !(def.flag & _f)) \
+ printf("br->flag |= " #_f ";\n"); \
+ else if(!(br->flag & _f) && (def.flag & _f)) \
+ printf("br->flag &= ~" #_f ";\n")
- if(idtest==0) { /* new brush */
- if(id) idtest= (ID *)copy_brush((Brush *)id);
- else idtest= (ID *)add_brush(name);
- idtest->us--;
- }
- if(idtest!=id) {
- brush_delete(current_brush);
- *current_brush= (Brush *)idtest;
- id_us_plus(idtest);
-
- return 1;
- }
-
- return 0;
-}
-int brush_delete(Brush **current_brush)
-{
- if (*current_brush) {
- (*current_brush)->id.us--;
- *current_brush= NULL;
-
- return 1;
- }
-
- return 0;
+ /* print out any non-default brush state */
+ BR_TEST(normal_weight, f);
+
+ BR_TEST(blend, d);
+ BR_TEST(size, d);
+
+ /* br->flag */
+ BR_TEST_FLAG(BRUSH_AIRBRUSH);
+ BR_TEST_FLAG(BRUSH_TORUS);
+ BR_TEST_FLAG(BRUSH_ALPHA_PRESSURE);
+ BR_TEST_FLAG(BRUSH_SIZE_PRESSURE);
+ BR_TEST_FLAG(BRUSH_JITTER_PRESSURE);
+ BR_TEST_FLAG(BRUSH_SPACING_PRESSURE);
+ BR_TEST_FLAG(BRUSH_FIXED_TEX);
+ BR_TEST_FLAG(BRUSH_RAKE);
+ BR_TEST_FLAG(BRUSH_ANCHORED);
+ BR_TEST_FLAG(BRUSH_DIR_IN);
+ BR_TEST_FLAG(BRUSH_SPACE);
+ BR_TEST_FLAG(BRUSH_SMOOTH_STROKE);
+ BR_TEST_FLAG(BRUSH_PERSISTENT);
+ BR_TEST_FLAG(BRUSH_ACCUMULATE);
+ BR_TEST_FLAG(BRUSH_LOCK_ALPHA);
+ BR_TEST_FLAG(BRUSH_ORIGINAL_NORMAL);
+ BR_TEST_FLAG(BRUSH_OFFSET_PRESSURE);
+ BR_TEST_FLAG(BRUSH_SPACE_ATTEN);
+ BR_TEST_FLAG(BRUSH_ADAPTIVE_SPACE);
+ BR_TEST_FLAG(BRUSH_LOCK_SIZE);
+ BR_TEST_FLAG(BRUSH_TEXTURE_OVERLAY);
+ BR_TEST_FLAG(BRUSH_EDGE_TO_EDGE);
+ BR_TEST_FLAG(BRUSH_RESTORE_MESH);
+ BR_TEST_FLAG(BRUSH_INVERSE_SMOOTH_PRESSURE);
+ BR_TEST_FLAG(BRUSH_RANDOM_ROTATION);
+ BR_TEST_FLAG(BRUSH_PLANE_TRIM);
+ BR_TEST_FLAG(BRUSH_FRONTFACE);
+ BR_TEST_FLAG(BRUSH_CUSTOM_ICON);
+
+ BR_TEST(jitter, f);
+ BR_TEST(spacing, d);
+ BR_TEST(smooth_stroke_radius, d);
+ BR_TEST(smooth_stroke_factor, f);
+ BR_TEST(rate, f);
+
+ BR_TEST(alpha, f);
+
+ BR_TEST(sculpt_plane, d);
+
+ BR_TEST(plane_offset, f);
+
+ BR_TEST(autosmooth_factor, f);
+
+ BR_TEST(crease_pinch_factor, f);
+
+ BR_TEST(plane_trim, f);
+
+ BR_TEST(texture_sample_bias, f);
+ BR_TEST(texture_overlay_alpha, d);
+
+ BR_TEST(add_col[0], f);
+ BR_TEST(add_col[1], f);
+ BR_TEST(add_col[2], f);
+ BR_TEST(sub_col[0], f);
+ BR_TEST(sub_col[1], f);
+ BR_TEST(sub_col[2], f);
+
+ printf("\n");
+
+#undef BR_TEST
+#undef BR_TEST_FLAG
}
-void brush_toggled_fake_user(Brush *brush)
+void brush_reset_sculpt(Brush *br)
{
- ID *id= (ID*)brush;
- if(id) {
- if(id->flag & LIB_FAKEUSER) {
- id_us_plus(id);
- } else {
- id->us--;
- }
+ /* enable this to see any non-default
+ settings used by a brush:
+
+ brush_debug_print_state(br);
+ */
+
+ brush_set_defaults(br);
+ brush_curve_preset(br, CURVE_PRESET_SMOOTH);
+
+ switch(br->sculpt_tool) {
+ case SCULPT_TOOL_CLAY:
+ br->flag |= BRUSH_FRONTFACE;
+ break;
+ case SCULPT_TOOL_CREASE:
+ br->flag |= BRUSH_DIR_IN;
+ br->alpha = 0.25;
+ break;
+ case SCULPT_TOOL_FILL:
+ br->add_col[1] = 1;
+ br->sub_col[0] = 0.25;
+ br->sub_col[1] = 1;
+ break;
+ case SCULPT_TOOL_FLATTEN:
+ br->add_col[1] = 1;
+ br->sub_col[0] = 0.25;
+ br->sub_col[1] = 1;
+ break;
+ case SCULPT_TOOL_INFLATE:
+ br->add_col[0] = 0.750000;
+ br->add_col[1] = 0.750000;
+ br->add_col[2] = 0.750000;
+ br->sub_col[0] = 0.250000;
+ br->sub_col[1] = 0.250000;
+ br->sub_col[2] = 0.250000;
+ break;
+ case SCULPT_TOOL_NUDGE:
+ br->add_col[0] = 0.250000;
+ br->add_col[1] = 1.000000;
+ br->add_col[2] = 0.250000;
+ break;
+ case SCULPT_TOOL_PINCH:
+ br->add_col[0] = 0.750000;
+ br->add_col[1] = 0.750000;
+ br->add_col[2] = 0.750000;
+ br->sub_col[0] = 0.250000;
+ br->sub_col[1] = 0.250000;
+ br->sub_col[2] = 0.250000;
+ break;
+ case SCULPT_TOOL_SCRAPE:
+ br->add_col[1] = 1.000000;
+ br->sub_col[0] = 0.250000;
+ br->sub_col[1] = 1.000000;
+ break;
+ case SCULPT_TOOL_ROTATE:
+ break;
+ case SCULPT_TOOL_SMOOTH:
+ br->flag &= ~BRUSH_SPACE_ATTEN;
+ br->spacing = 5;
+ br->add_col[0] = 0.750000;
+ br->add_col[1] = 0.750000;
+ br->add_col[2] = 0.750000;
+ break;
+ case SCULPT_TOOL_GRAB:
+ case SCULPT_TOOL_SNAKE_HOOK:
+ case SCULPT_TOOL_THUMB:
+ br->size = 75;
+ br->flag &= ~BRUSH_ALPHA_PRESSURE;
+ br->flag &= ~BRUSH_SPACE;
+ br->flag &= ~BRUSH_SPACE_ATTEN;
+ br->add_col[0] = 0.250000;
+ br->add_col[1] = 1.000000;
+ br->add_col[2] = 0.250000;
+ break;
+ default:
+ break;
}
}
+/* Library Operations */
void brush_curve_preset(Brush *b, /*CurveMappingPreset*/int preset)
{
CurveMap *cm = NULL;
@@ -234,7 +405,7 @@ void brush_curve_preset(Brush *b, /*CurveMappingPreset*/int preset)
cm->flag &= ~CUMA_EXTEND_EXTRAPOLATE;
b->curve->preset = preset;
- curvemap_reset(cm, &b->curve->clipr, b->curve->preset);
+ curvemap_reset(cm, &b->curve->clipr, b->curve->preset, CURVEMAP_SLOPE_NEGATIVE);
curvemapping_changed(b->curve, 0);
}
@@ -306,12 +477,6 @@ int brush_clone_image_delete(Brush *brush)
return 0;
}
-void brush_check_exists(Brush **brush, const char *name)
-{
- if(*brush==NULL)
- brush_set_nr(brush, 1, name);
-}
-
/* Brush Sampling */
void brush_sample_tex(Brush *brush, float *xy, float *rgba)
{
@@ -320,9 +485,10 @@ void brush_sample_tex(Brush *brush, float *xy, float *rgba)
if (mtex && mtex->tex) {
float co[3], tin, tr, tg, tb, ta;
int hasrgb;
-
- co[0]= xy[0]/(brush->size >> 1);
- co[1]= xy[1]/(brush->size >> 1);
+ const int radius= brush_size(brush);
+
+ co[0]= xy[0]/radius;
+ co[1]= xy[1]/radius;
co[2]= 0.0f;
hasrgb= externtex(mtex, co, &tin, &tr, &tg, &tb, &ta);
@@ -345,23 +511,24 @@ void brush_sample_tex(Brush *brush, float *xy, float *rgba)
}
-void brush_imbuf_new(Brush *brush, short flt, short texfall, int size, ImBuf **outbuf)
+void brush_imbuf_new(Brush *brush, short flt, short texfall, int bufsize, ImBuf **outbuf)
{
ImBuf *ibuf;
float xy[2], dist, rgba[4], *dstf;
int x, y, rowbytes, xoff, yoff, imbflag;
- int maxsize = brush->size >> 1;
+ const int radius= brush_size(brush);
char *dst, crgb[3];
+ const float alpha= brush_alpha(brush);
imbflag= (flt)? IB_rectfloat: IB_rect;
- xoff = -size/2.0f + 0.5f;
- yoff = -size/2.0f + 0.5f;
- rowbytes= size*4;
+ xoff = -bufsize/2.0f + 0.5f;
+ yoff = -bufsize/2.0f + 0.5f;
+ rowbytes= bufsize*4;
if (*outbuf)
ibuf= *outbuf;
else
- ibuf= IMB_allocImBuf(size, size, 32, imbflag, 0);
+ ibuf= IMB_allocImBuf(bufsize, bufsize, 32, imbflag, 0);
if (flt) {
for (y=0; y < ibuf->y; y++) {
@@ -375,7 +542,7 @@ void brush_imbuf_new(Brush *brush, short flt, short texfall, int size, ImBuf **o
dist = sqrt(xy[0]*xy[0] + xy[1]*xy[1]);
VECCOPY(dstf, brush->rgb);
- dstf[3]= brush->alpha*brush_curve_strength_clamp(brush, dist, maxsize);
+ dstf[3]= alpha*brush_curve_strength_clamp(brush, dist, radius);
}
else if (texfall == 1) {
brush_sample_tex(brush, xy, dstf);
@@ -388,7 +555,7 @@ void brush_imbuf_new(Brush *brush, short flt, short texfall, int size, ImBuf **o
dstf[0] = rgba[0]*brush->rgb[0];
dstf[1] = rgba[1]*brush->rgb[1];
dstf[2] = rgba[2]*brush->rgb[2];
- dstf[3] = rgba[3]*brush->alpha*brush_curve_strength_clamp(brush, dist, maxsize);
+ dstf[3] = rgba[3]*alpha*brush_curve_strength_clamp(brush, dist, radius);
}
}
}
@@ -411,7 +578,7 @@ void brush_imbuf_new(Brush *brush, short flt, short texfall, int size, ImBuf **o
dst[0]= crgb[0];
dst[1]= crgb[1];
dst[2]= crgb[2];
- dst[3]= FTOCHAR(brush->alpha*brush_curve_strength(brush, dist, maxsize));
+ dst[3]= FTOCHAR(alpha*brush_curve_strength(brush, dist, radius));
}
else if (texfall == 1) {
brush_sample_tex(brush, xy, rgba);
@@ -427,7 +594,7 @@ void brush_imbuf_new(Brush *brush, short flt, short texfall, int size, ImBuf **o
dst[0] = FTOCHAR(rgba[0]*brush->rgb[0]);
dst[1] = FTOCHAR(rgba[1]*brush->rgb[1]);
dst[2] = FTOCHAR(rgba[2]*brush->rgb[2]);
- dst[3] = FTOCHAR(rgba[3]*brush->alpha*brush_curve_strength_clamp(brush, dist, maxsize));
+ dst[3] = FTOCHAR(rgba[3]*alpha*brush_curve_strength_clamp(brush, dist, radius));
}
}
}
@@ -441,7 +608,7 @@ void brush_imbuf_new(Brush *brush, short flt, short texfall, int size, ImBuf **o
typedef struct BrushPainterCache {
short enabled;
- int size; /* size override, if 0 uses brush->size */
+ int size; /* size override, if 0 uses 2*brush_size(brush) */
short flt; /* need float imbuf? */
short texonly; /* no alpha, color or fallof, only texture in imbuf */
@@ -486,8 +653,8 @@ BrushPainter *brush_painter_new(Brush *brush)
painter->firsttouch= 1;
painter->cache.lastsize= -1; /* force ibuf create in refresh */
- painter->startsize = brush->size;
- painter->startalpha = brush->alpha;
+ painter->startsize = brush_size(brush);
+ painter->startalpha = brush_alpha(brush);
painter->startjitter = brush->jitter;
painter->startspacing = brush->spacing;
@@ -520,8 +687,8 @@ void brush_painter_free(BrushPainter *painter)
{
Brush *brush = painter->brush;
- brush->size = painter->startsize;
- brush->alpha = painter->startalpha;
+ brush_set_size(brush, painter->startsize);
+ brush_set_alpha(brush, painter->startalpha);
brush->jitter = painter->startjitter;
brush->spacing = painter->startspacing;
@@ -538,9 +705,10 @@ static void brush_painter_do_partial(BrushPainter *painter, ImBuf *oldtexibuf, i
float *bf, *mf, *tf, *otf=NULL, xoff, yoff, xy[2], rgba[4];
char *b, *m, *t, *ot= NULL;
int dotexold, origx= x, origy= y;
+ const int radius= brush_size(brush);
- xoff = -brush->size/2.0f + 0.5f;
- yoff = -brush->size/2.0f + 0.5f;
+ xoff = -radius + 0.5f;
+ yoff = -radius + 0.5f;
xoff += (int)pos[0] - (int)painter->startpaintpos[0];
yoff += (int)pos[1] - (int)painter->startpaintpos[1];
@@ -622,14 +790,15 @@ static void brush_painter_fixed_tex_partial_update(BrushPainter *painter, float
BrushPainterCache *cache= &painter->cache;
ImBuf *oldtexibuf, *ibuf;
int imbflag, destx, desty, srcx, srcy, w, h, x1, y1, x2, y2;
+ const int diameter= 2*brush_size(brush);
imbflag= (cache->flt)? IB_rectfloat: IB_rect;
if (!cache->ibuf)
- cache->ibuf= IMB_allocImBuf(brush->size, brush->size, 32, imbflag, 0);
+ cache->ibuf= IMB_allocImBuf(diameter, diameter, 32, imbflag, 0);
ibuf= cache->ibuf;
oldtexibuf= cache->texibuf;
- cache->texibuf= IMB_allocImBuf(brush->size, brush->size, 32, imbflag, 0);
+ cache->texibuf= IMB_allocImBuf(diameter, diameter, 32, imbflag, 0);
if (oldtexibuf) {
srcx= srcy= 0;
@@ -676,9 +845,13 @@ static void brush_painter_refresh_cache(BrushPainter *painter, float *pos)
MTex *mtex= &brush->mtex;
int size;
short flt;
+ const int diameter= 2*brush_size(brush);
+ const float alpha= brush_alpha(brush);
- if ((brush->size != cache->lastsize) || (brush->alpha != cache->lastalpha)
- || (brush->jitter != cache->lastjitter)) {
+ if (diameter != cache->lastsize ||
+ alpha != cache->lastalpha ||
+ brush->jitter != cache->lastjitter)
+ {
if (cache->ibuf) {
IMB_freeImBuf(cache->ibuf);
cache->ibuf= NULL;
@@ -689,7 +862,7 @@ static void brush_painter_refresh_cache(BrushPainter *painter, float *pos)
}
flt= cache->flt;
- size= (cache->size)? cache->size: brush->size;
+ size= (cache->size)? cache->size: diameter;
if (!(mtex && mtex->tex) || (mtex->tex->type==0)) {
brush_imbuf_new(brush, flt, 0, size, &cache->ibuf);
@@ -701,8 +874,8 @@ static void brush_painter_refresh_cache(BrushPainter *painter, float *pos)
else
brush_imbuf_new(brush, flt, 2, size, &cache->ibuf);
- cache->lastsize= brush->size;
- cache->lastalpha= brush->alpha;
+ cache->lastsize= diameter;
+ cache->lastalpha= alpha;
cache->lastjitter= brush->jitter;
}
else if ((brush->flag & BRUSH_FIXED_TEX) && mtex && mtex->tex) {
@@ -721,21 +894,31 @@ void brush_painter_break_stroke(BrushPainter *painter)
static void brush_apply_pressure(BrushPainter *painter, Brush *brush, float pressure)
{
- if (brush->flag & BRUSH_ALPHA_PRESSURE)
- brush->alpha = MAX2(0.0, painter->startalpha*pressure);
- if (brush->flag & BRUSH_SIZE_PRESSURE)
- brush->size = MAX2(1.0, painter->startsize*pressure);
+ if (brush_use_alpha_pressure(brush))
+ brush_set_alpha(brush, MAX2(0.0, painter->startalpha*pressure));
+ if (brush_use_size_pressure(brush))
+ brush_set_size(brush, MAX2(1.0, painter->startsize*pressure));
if (brush->flag & BRUSH_JITTER_PRESSURE)
brush->jitter = MAX2(0.0, painter->startjitter*pressure);
if (brush->flag & BRUSH_SPACING_PRESSURE)
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];
+ const int radius= brush_size(brush);
+ const int diameter= 2*radius;
+
+ // 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]*diameter*brush->jitter;
+ jitterpos[1] = pos[1] + 2*rand_pos[1]*diameter*brush->jitter;
}
else {
VECCOPY2D(jitterpos, pos);
@@ -774,7 +957,7 @@ int brush_painter_paint(BrushPainter *painter, BrushFunc func, float *pos, doubl
double starttime, curtime= time;
/* compute brush spacing adapted to brush size */
- spacing= brush->rate; //brush->size*brush->spacing*0.01f;
+ spacing= brush->rate; //radius*brush->spacing*0.01f;
/* setup starting time, direction vector and accumulated time */
starttime= painter->accumtime;
@@ -805,11 +988,12 @@ int brush_painter_paint(BrushPainter *painter, BrushFunc func, float *pos, doubl
else {
float startdistance, spacing, step, paintpos[2], dmousepos[2], finalpos[2];
float t, len, press;
+ const int radius= brush_size(brush);
- /* compute brush spacing adapted to brush size, spacing may depend
+ /* compute brush spacing adapted to brush radius, spacing may depend
on pressure, so update it */
brush_apply_pressure(painter, brush, painter->lastpressure);
- spacing= MAX2(1.0f, brush->size)*brush->spacing*0.01f;
+ spacing= MAX2(1.0f, radius)*brush->spacing*0.01f;
/* setup starting distance, direction vector and accumulated distance */
startdistance= painter->accumdistance;
@@ -826,7 +1010,7 @@ int brush_painter_paint(BrushPainter *painter, BrushFunc func, float *pos, doubl
t = step/len;
press= (1.0f-t)*painter->lastpressure + t*pressure;
brush_apply_pressure(painter, brush, press);
- spacing= MAX2(1.0f, brush->size)*brush->spacing*0.01f;
+ spacing= MAX2(1.0f, radius)*brush->spacing*0.01f;
brush_jitter_pos(brush, paintpos, finalpos);
@@ -876,8 +1060,8 @@ int brush_painter_paint(BrushPainter *painter, BrushFunc func, float *pos, doubl
painter->lastmousepos[1]= pos[1];
painter->lastpressure= pressure;
- brush->alpha = painter->startalpha;
- brush->size = painter->startsize;
+ brush_set_alpha(brush, painter->startalpha);
+ brush_set_size(brush, painter->startsize);
brush->jitter = painter->startjitter;
brush->spacing = painter->startspacing;
@@ -887,7 +1071,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);
@@ -899,9 +1083,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? */
@@ -915,7 +1102,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");
@@ -930,7 +1117,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).
@@ -993,9 +1180,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 = brush_size(br) * size_weight;
else if(mode == WM_RADIALCONTROL_STRENGTH)
- original_value = br->alpha;
+ original_value = brush_alpha(br);
else if(mode == WM_RADIALCONTROL_ANGLE) {
MTex *mtex = brush_active_texture(br);
if(mtex)
@@ -1013,9 +1200,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 (brush_use_locked_size(br)) {
+ float initial_value = RNA_float_get(op->ptr, "initial_value");
+ const float unprojected_radius = brush_unprojected_radius(br);
+ brush_set_unprojected_radius(br, unprojected_radius * new_value/initial_value * size_weight);
+ }
+ else
+ brush_set_size(br, new_value * size_weight);
else if(mode == WM_RADIALCONTROL_STRENGTH)
- br->alpha = new_value;
+ brush_set_alpha(br, new_value);
else if(mode == WM_RADIALCONTROL_ANGLE) {
MTex *mtex = brush_active_texture(br);
if(mtex)
@@ -1024,3 +1217,248 @@ int brush_radial_control_exec(wmOperator *op, Brush *br, float size_weight)
return OPERATOR_FINISHED;
}
+
+/* Unified Size and Strength */
+
+static void set_unified_settings(Brush *brush, short flag, int value)
+{
+ Scene *sce;
+ for (sce= G.main->scene.first; sce; sce= sce->id.next) {
+ if (sce->toolsettings &&
+ ELEM4(brush,
+ paint_brush(&(sce->toolsettings->imapaint.paint)),
+ paint_brush(&(sce->toolsettings->vpaint->paint)),
+ paint_brush(&(sce->toolsettings->wpaint->paint)),
+ paint_brush(&(sce->toolsettings->sculpt->paint))))
+ {
+ if (value)
+ sce->toolsettings->sculpt_paint_settings |= flag;
+ else
+ sce->toolsettings->sculpt_paint_settings &= ~flag;
+ }
+ }
+}
+
+static short unified_settings(Brush *brush)
+{
+ Scene *sce;
+ for (sce= G.main->scene.first; sce; sce= sce->id.next) {
+ if (sce->toolsettings &&
+ ELEM4(brush,
+ paint_brush(&(sce->toolsettings->imapaint.paint)),
+ paint_brush(&(sce->toolsettings->vpaint->paint)),
+ paint_brush(&(sce->toolsettings->wpaint->paint)),
+ paint_brush(&(sce->toolsettings->sculpt->paint))))
+ {
+ return sce->toolsettings->sculpt_paint_settings;
+ }
+ }
+
+ return 0;
+}
+
+static void set_unified_size(Brush *brush, int value)
+{
+ Scene *sce;
+ for (sce= G.main->scene.first; sce; sce= sce->id.next) {
+ if (sce->toolsettings &&
+ ELEM4(brush,
+ paint_brush(&(sce->toolsettings->imapaint.paint)),
+ paint_brush(&(sce->toolsettings->vpaint->paint)),
+ paint_brush(&(sce->toolsettings->wpaint->paint)),
+ paint_brush(&(sce->toolsettings->sculpt->paint))))
+ {
+ sce->toolsettings->sculpt_paint_unified_size= value;
+ }
+ }
+}
+
+static int unified_size(Brush *brush)
+{
+ Scene *sce;
+ for (sce= G.main->scene.first; sce; sce= sce->id.next) {
+ if (sce->toolsettings &&
+ ELEM4(brush,
+ paint_brush(&(sce->toolsettings->imapaint.paint)),
+ paint_brush(&(sce->toolsettings->vpaint->paint)),
+ paint_brush(&(sce->toolsettings->wpaint->paint)),
+ paint_brush(&(sce->toolsettings->sculpt->paint))))
+ {
+ return sce->toolsettings->sculpt_paint_unified_size;
+ }
+ }
+
+ return 35; // XXX magic number
+}
+
+static void set_unified_alpha(Brush *brush, float value)
+{
+ Scene *sce;
+ for (sce= G.main->scene.first; sce; sce= sce->id.next) {
+ if (sce->toolsettings &&
+ ELEM4(brush,
+ paint_brush(&(sce->toolsettings->imapaint.paint)),
+ paint_brush(&(sce->toolsettings->vpaint->paint)),
+ paint_brush(&(sce->toolsettings->wpaint->paint)),
+ paint_brush(&(sce->toolsettings->sculpt->paint))))
+ {
+ sce->toolsettings->sculpt_paint_unified_alpha= value;
+ }
+ }
+}
+
+static float unified_alpha(Brush *brush)
+{
+ Scene *sce;
+ for (sce= G.main->scene.first; sce; sce= sce->id.next) {
+ if (sce->toolsettings &&
+ ELEM4(brush,
+ paint_brush(&(sce->toolsettings->imapaint.paint)),
+ paint_brush(&(sce->toolsettings->vpaint->paint)),
+ paint_brush(&(sce->toolsettings->wpaint->paint)),
+ paint_brush(&(sce->toolsettings->sculpt->paint))))
+ {
+ return sce->toolsettings->sculpt_paint_unified_alpha;
+ }
+ }
+
+ return 0.5f; // XXX magic number
+}
+
+static void set_unified_unprojected_radius(Brush *brush, float value)
+{
+ Scene *sce;
+ for (sce= G.main->scene.first; sce; sce= sce->id.next) {
+ if (sce->toolsettings &&
+ ELEM4(brush,
+ paint_brush(&(sce->toolsettings->imapaint.paint)),
+ paint_brush(&(sce->toolsettings->vpaint->paint)),
+ paint_brush(&(sce->toolsettings->wpaint->paint)),
+ paint_brush(&(sce->toolsettings->sculpt->paint))))
+ {
+ sce->toolsettings->sculpt_paint_unified_unprojected_radius= value;
+ }
+ }
+}
+
+static float unified_unprojected_radius(Brush *brush)
+{
+ Scene *sce;
+ for (sce= G.main->scene.first; sce; sce= sce->id.next) {
+ if (sce->toolsettings &&
+ ELEM4(brush,
+ paint_brush(&(sce->toolsettings->imapaint.paint)),
+ paint_brush(&(sce->toolsettings->vpaint->paint)),
+ paint_brush(&(sce->toolsettings->wpaint->paint)),
+ paint_brush(&(sce->toolsettings->sculpt->paint))))
+ {
+ return sce->toolsettings->sculpt_paint_unified_unprojected_radius;
+ }
+ }
+
+ return 0.125f; // XXX magic number
+}
+void brush_set_size(Brush *brush, int size)
+{
+ if (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_SIZE)
+ set_unified_size(brush, size);
+ else
+ brush->size= size;
+
+ //WM_main_add_notifier(NC_BRUSH|NA_EDITED, brush);
+}
+
+int brush_size(Brush *brush)
+{
+ return (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_SIZE) ? unified_size(brush) : brush->size;
+}
+
+void brush_set_use_locked_size(Brush *brush, int value)
+{
+ if (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_SIZE) {
+ set_unified_settings(brush, SCULPT_PAINT_UNIFIED_LOCK_BRUSH_SIZE, value);
+ }
+ else {
+ if (value)
+ brush->flag |= BRUSH_LOCK_SIZE;
+ else
+ brush->flag &= ~BRUSH_LOCK_SIZE;
+ }
+
+ //WM_main_add_notifier(NC_BRUSH|NA_EDITED, brush);
+}
+
+int brush_use_locked_size(Brush *brush)
+{
+ return (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_SIZE) ? (unified_settings(brush) & SCULPT_PAINT_UNIFIED_LOCK_BRUSH_SIZE) : (brush->flag & BRUSH_LOCK_SIZE);
+}
+
+void brush_set_use_size_pressure(Brush *brush, int value)
+{
+ if (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_SIZE) {
+ set_unified_settings(brush, SCULPT_PAINT_UNIFIED_SIZE_PRESSURE, value);
+ }
+ else {
+ if (value)
+ brush->flag |= BRUSH_SIZE_PRESSURE;
+ else
+ brush->flag &= ~BRUSH_SIZE_PRESSURE;
+ }
+
+ //WM_main_add_notifier(NC_BRUSH|NA_EDITED, brush);
+}
+
+int brush_use_size_pressure(Brush *brush)
+{
+ return (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_SIZE) ? (unified_settings(brush) & SCULPT_PAINT_UNIFIED_SIZE_PRESSURE) : (brush->flag & BRUSH_SIZE_PRESSURE);
+}
+
+void brush_set_use_alpha_pressure(Brush *brush, int value)
+{
+ if (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_ALPHA) {
+ set_unified_settings(brush, SCULPT_PAINT_UNIFIED_ALPHA_PRESSURE, value);
+ }
+ else {
+ if (value)
+ brush->flag |= BRUSH_ALPHA_PRESSURE;
+ else
+ brush->flag &= ~BRUSH_ALPHA_PRESSURE;
+ }
+
+ //WM_main_add_notifier(NC_BRUSH|NA_EDITED, brush);
+}
+
+int brush_use_alpha_pressure(Brush *brush)
+{
+ return (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_ALPHA) ? (unified_settings(brush) & SCULPT_PAINT_UNIFIED_ALPHA_PRESSURE) : (brush->flag & BRUSH_ALPHA_PRESSURE);
+}
+
+void brush_set_unprojected_radius(Brush *brush, float unprojected_radius)
+{
+ if (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_SIZE)
+ set_unified_unprojected_radius(brush, unprojected_radius);
+ else
+ brush->unprojected_radius= unprojected_radius;
+
+ //WM_main_add_notifier(NC_BRUSH|NA_EDITED, brush);
+}
+
+float brush_unprojected_radius(Brush *brush)
+{
+ return (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_SIZE) ? unified_unprojected_radius(brush) : brush->unprojected_radius;
+}
+
+void brush_set_alpha(Brush *brush, float alpha)
+{
+ if (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_ALPHA)
+ set_unified_alpha(brush, alpha);
+ else
+ brush->alpha= alpha;
+
+ //WM_main_add_notifier(NC_BRUSH|NA_EDITED, brush);
+}
+
+float brush_alpha(Brush *brush)
+{
+ return (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_ALPHA) ? unified_alpha(brush) : brush->alpha;
+}
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index b3e702ceee9..ca81e216006 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -54,7 +54,7 @@
#include "MEM_guardedalloc.h"
-#include "gpu_buffers.h"
+#include "GPU_buffers.h"
#include "GPU_draw.h"
#include "GPU_extensions.h"
#include "GPU_material.h"
@@ -74,6 +74,7 @@ typedef struct {
/* Cached */
struct PBVH *pbvh;
+ int pbvh_draw;
/* Mesh connectivity */
struct ListBase *fmap;
struct IndexNode *fmap_mem;
@@ -185,9 +186,20 @@ static ListBase *cdDM_getFaceMap(Object *ob, DerivedMesh *dm)
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;
@@ -196,13 +208,17 @@ static struct PBVH *cdDM_getPBVH(Object *ob, DerivedMesh *dm)
if(!ob->sculpt)
return NULL;
- if(ob->sculpt->pbvh)
+ 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);
}
@@ -225,7 +241,8 @@ static void cdDM_drawVerts(DerivedMesh *dm)
else { /* use OpenGL VBOs or Vertex Arrays instead for better, faster rendering */
GPU_vertex_setup(dm);
if( !GPU_buffer_legacy(dm) ) {
- glDrawArrays(GL_POINTS,0,dm->drawObject->nelements);
+ if(dm->drawObject->nelements) glDrawArrays(GL_POINTS,0, dm->drawObject->nelements);
+ else glDrawArrays(GL_POINTS,0, dm->drawObject->nlooseverts);
}
GPU_buffer_unbind();
}
@@ -417,7 +434,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);
@@ -728,7 +745,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);
@@ -741,7 +758,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);
@@ -847,47 +864,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;
- }
- 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;
+
+ 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;
}
- prevstate = state;
- }
- if(state==1) {
- glDrawArrays(GL_TRIANGLES,prevstart*3,dm->drawObject->nelements-prevstart*3);
}
glShadeModel(GL_FLAT);
}
@@ -1347,12 +1358,12 @@ static void cdDM_foreachMappedFaceCenter(
orig = i;
VECCOPY(cent, mv[mf->v1].co);
- add_v3_v3v3(cent, cent, mv[mf->v2].co);
- add_v3_v3v3(cent, cent, mv[mf->v3].co);
+ add_v3_v3(cent, mv[mf->v2].co);
+ add_v3_v3(cent, mv[mf->v3].co);
if (mf->v4) {
normal_quad_v3( no,mv[mf->v1].co, mv[mf->v2].co, mv[mf->v3].co, mv[mf->v4].co);
- add_v3_v3v3(cent, cent, mv[mf->v4].co);
+ add_v3_v3(cent, mv[mf->v4].co);
mul_v3_fl(cent, 0.25f);
} else {
normal_tri_v3( no,mv[mf->v1].co, mv[mf->v2].co, mv[mf->v3].co);
@@ -1663,6 +1674,11 @@ DerivedMesh *CDDM_from_template(DerivedMesh *source,
CDDerivedMesh *cddm = cdDM_create("CDDM_from_template dest");
DerivedMesh *dm = &cddm->dm;
+ /* ensure these are created if they are made on demand */
+ source->getVertDataArray(source, CD_ORIGINDEX);
+ source->getEdgeDataArray(source, CD_ORIGINDEX);
+ source->getFaceDataArray(source, CD_ORIGINDEX);
+
/* this does a copy of all non mvert/medge/mface layers */
DM_from_template(dm, source, DM_TYPE_CDDM, numVerts, numEdges, numFaces);
@@ -1750,25 +1766,21 @@ void CDDM_calc_normals(DerivedMesh *dm)
else
normal_tri_v3( f_no,mv[mf->v1].co, mv[mf->v2].co, mv[mf->v3].co);
- add_v3_v3v3(temp_nors[mf->v1], temp_nors[mf->v1], f_no);
- add_v3_v3v3(temp_nors[mf->v2], temp_nors[mf->v2], f_no);
- add_v3_v3v3(temp_nors[mf->v3], temp_nors[mf->v3], f_no);
+ add_v3_v3(temp_nors[mf->v1], f_no);
+ add_v3_v3(temp_nors[mf->v2], f_no);
+ add_v3_v3(temp_nors[mf->v3], f_no);
if(mf->v4)
- add_v3_v3v3(temp_nors[mf->v4], temp_nors[mf->v4], f_no);
+ add_v3_v3(temp_nors[mf->v4], f_no);
}
/* normalize vertex normals and assign */
for(i = 0; i < numVerts; i++, mv++) {
float *no = temp_nors[i];
- if (normalize_v3(no) == 0.0) {
- VECCOPY(no, mv->co);
- normalize_v3(no);
- }
+ if (normalize_v3(no) == 0.0)
+ normalize_v3_v3(no, mv->co);
- mv->no[0] = (short)(no[0] * 32767.0);
- mv->no[1] = (short)(no[1] * 32767.0);
- mv->no[2] = (short)(no[2] * 32767.0);
+ normal_float_to_short_v3(mv->no, no);
}
MEM_freeN(temp_nors);
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index 2b11c4bdfa0..bebfa4af88e 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -27,16 +27,21 @@
#include "MEM_guardedalloc.h"
-#include "BKE_cloth.h"
+#include "DNA_cloth_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "BLI_math.h"
+#include "BLI_edgehash.h"
#include "BKE_cdderivedmesh.h"
+#include "BKE_cloth.h"
#include "BKE_effect.h"
#include "BKE_global.h"
#include "BKE_modifier.h"
-#include "BKE_utildefines.h"
-
#include "BKE_pointcache.h"
-
+#include "BKE_utildefines.h"
#ifdef _WIN32
void tstart ( void )
@@ -147,6 +152,9 @@ void cloth_init ( ClothModifierData *clmd )
if(!clmd->sim_parms->effector_weights)
clmd->sim_parms->effector_weights = BKE_add_effector_weights(NULL);
+
+ if(clmd->point_cache)
+ clmd->point_cache->step = 1;
}
static BVHTree *bvhselftree_build_from_cloth (ClothModifierData *clmd, float epsilon)
diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c
index ffd504f5945..af12d23b2c2 100644
--- a/source/blender/blenkernel/intern/collision.c
+++ b/source/blender/blenkernel/intern/collision.c
@@ -37,9 +37,15 @@
#include "DNA_object_types.h"
#include "DNA_object_force.h"
#include "DNA_scene_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_math.h"
+#include "BLI_edgehash.h"
#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 +65,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 +75,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 +534,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 +572,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 )
@@ -587,7 +596,7 @@ int cloth_collision_response_static ( ClothModifierData *clmd, CollisionModifier
return result;
}
-//Determines collisions on overlap, collisions are writen to collpair[i] and collision+number_collision_found is returned
+//Determines collisions on overlap, collisions are written to collpair[i] and collision+number_collision_found is returned
CollPair* cloth_collision ( ModifierData *md1, ModifierData *md2, BVHTreeOverlap *overlap, CollPair *collpair )
{
ClothModifierData *clmd = ( ClothModifierData * ) md1;
@@ -682,8 +691,7 @@ CollPair* cloth_collision ( ModifierData *md1, ModifierData *md2, BVHTreeOverlap
if ( distance <= ( epsilon1 + epsilon2 + ALMOST_ZERO ) )
{
- VECCOPY ( collpair->normal, collpair->vector );
- normalize_v3( collpair->normal );
+ normalize_v3_v3( collpair->normal, collpair->vector );
collpair->distance = distance;
collpair->flag = 0;
@@ -1350,10 +1358,13 @@ Object **get_collisionobjects(Scene *scene, Object *self, Group *group, int *num
add_collision_object(&objs, &numobj, &maxobj, go->ob, self, 0);
}
else {
+ Scene *sce; /* for SETLOOPER macro */
/* add objects in same layer in scene */
- for(base = scene->base.first; base; base = base->next)
- if(base->lay & self->lay)
+ for(SETLOOPER(scene, base)) {
+ if(base->lay & self->lay)
add_collision_object(&objs, &numobj, &maxobj, base->object, self, 0);
+
+ }
}
*numcollobj= numobj;
@@ -1397,7 +1408,6 @@ static void add_collider_cache_object(ListBase **objs, Object *ob, Object *self,
ListBase *get_collider_cache(Scene *scene, Object *self, Group *group)
{
- Base *base;
GroupObject *go;
ListBase *objs= NULL;
@@ -1407,9 +1417,15 @@ ListBase *get_collider_cache(Scene *scene, Object *self, Group *group)
add_collider_cache_object(&objs, go->ob, self, 0);
}
else {
- for(base = scene->base.first; base; base = base->next)
- if(!self || (base->lay & self->lay))
+ 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;
@@ -1541,20 +1557,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;
- }
-
- /* 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( 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;
+ }
+
if ( overlap )
MEM_freeN ( overlap );
}
diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c
index 4c0c10c127a..90ffa39c88f 100644
--- a/source/blender/blenkernel/intern/colortools.c
+++ b/source/blender/blenkernel/intern/colortools.c
@@ -126,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;
}
@@ -233,17 +236,19 @@ void curvemap_insert(CurveMap *cuma, float x, float y)
cuma->curve= cmp;
}
-void curvemap_reset(CurveMap *cuma, rctf *clipr, int preset)
+void curvemap_reset(CurveMap *cuma, rctf *clipr, int preset, int slope)
{
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;
+ 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");
@@ -251,27 +256,29 @@ void curvemap_reset(CurveMap *cuma, rctf *clipr, int 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;
@@ -290,6 +297,41 @@ void curvemap_reset(CurveMap *cuma, rctf *clipr, int preset)
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;
+ }
+
+ /* mirror curve in x direction to have positive slope
+ * rather than default negative slope */
+ if (slope == CURVEMAP_SLOPE_POSITIVE) {
+ int i, last=cuma->totpoint-1;
+ CurveMapPoint *newpoints= MEM_dupallocN(cuma->curve);
+
+ for (i=0; i<cuma->totpoint; i++) {
+ newpoints[i].y = cuma->curve[last-i].y;
+ }
+
+ MEM_freeN(cuma->curve);
+ cuma->curve = newpoints;
}
if(cuma->table) {
@@ -467,7 +509,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);
@@ -484,7 +526,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);
@@ -619,7 +661,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++) {
@@ -701,7 +745,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);
}
@@ -738,36 +782,55 @@ void curvemapping_evaluate_premulRGBF(CurveMapping *cumap, float *vecout, const
vecout[2]= curvemap_evaluateF(cumap->cm+2, fac);
}
+
+#ifdef WITH_LCMS
+/* basic error handler, if we dont do this blender will exit */
+static int ErrorReportingFunction(int ErrorCode, const char *ErrorText)
+{
+ fprintf(stderr, "%s:%d\n", ErrorText, ErrorCode);
+ return 1;
+}
+#endif
+
void colorcorrection_do_ibuf(ImBuf *ibuf, const char *profile)
{
+#ifdef WITH_LCMS
if (ibuf->crect == NULL)
{
-#ifdef WITH_LCMS
- cmsHPROFILE imageProfile, proofingProfile;
- cmsHTRANSFORM hTransform;
+ cmsHPROFILE proofingProfile;
- ibuf->crect = MEM_mallocN(ibuf->x*ibuf->y*sizeof(int), "imbuf crect");
-
- imageProfile = cmsCreate_sRGBProfile();
- proofingProfile = cmsOpenProfileFromFile(profile, "r");
+ /* TODO, move to initialization area of code */
+ //cmsSetLogErrorHandler(ErrorReportingFunction);
+ cmsSetErrorHandler(ErrorReportingFunction);
+ /* will return NULL if the file isn't fount */
+ proofingProfile = cmsOpenProfileFromFile(profile, "r");
+
cmsErrorAction(LCMS_ERROR_SHOW);
-
- hTransform = cmsCreateProofingTransform(imageProfile, TYPE_RGBA_8, imageProfile, TYPE_RGBA_8,
- proofingProfile,
- INTENT_ABSOLUTE_COLORIMETRIC,
- INTENT_ABSOLUTE_COLORIMETRIC,
- cmsFLAGS_SOFTPROOFING);
-
- cmsDoTransform(hTransform, ibuf->rect, ibuf->crect, ibuf->x * ibuf->y);
-
- cmsDeleteTransform(hTransform);
- cmsCloseProfile(imageProfile);
- cmsCloseProfile(proofingProfile);
-#else
- ibuf->crect = ibuf->rect;
-#endif
+
+ if(proofingProfile) {
+ cmsHPROFILE imageProfile;
+ cmsHTRANSFORM hTransform;
+
+ ibuf->crect = MEM_mallocN(ibuf->x*ibuf->y*sizeof(int), "imbuf crect");
+
+ imageProfile = cmsCreate_sRGBProfile();
+
+
+ hTransform = cmsCreateProofingTransform(imageProfile, TYPE_RGBA_8, imageProfile, TYPE_RGBA_8,
+ proofingProfile,
+ INTENT_ABSOLUTE_COLORIMETRIC,
+ INTENT_ABSOLUTE_COLORIMETRIC,
+ cmsFLAGS_SOFTPROOFING);
+
+ cmsDoTransform(hTransform, ibuf->rect, ibuf->crect, ibuf->x * ibuf->y);
+
+ cmsDeleteTransform(hTransform);
+ cmsCloseProfile(imageProfile);
+ cmsCloseProfile(proofingProfile);
+ }
}
+#endif
}
/* only used for image editor curves */
@@ -885,6 +948,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);
@@ -897,59 +962,176 @@ DO_INLINE int get_bin_float(float f)
return bin;
}
+DO_INLINE void save_sample_line(Scopes *scopes, const int idx, const float fx, float *rgb, float *ycc)
+{
+ 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 histogram_update(Histogram *hist, ImBuf *ibuf)
+void scopes_update(Scopes *scopes, ImBuf *ibuf, int use_color_management)
{
- 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;
-
+ 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 */
- 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;
- }
- }
+ 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;
}
- else if (ibuf->rect) {
- hist->x_resolution = 256;
-
+
+ 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;
+ 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];
@@ -957,17 +1139,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 0441e9c9d00..57e5630da19 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"
@@ -73,10 +74,6 @@
#include "BPY_extern.h"
#endif
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
@@ -259,7 +256,7 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
/* construct offs_bone the same way it is done in armature.c */
copy_m4_m3(offs_bone, pchan->bone->bone_mat);
- VECCOPY(offs_bone[3], pchan->bone->head);
+ copy_v3_v3(offs_bone[3], pchan->bone->head);
offs_bone[3][1]+= pchan->bone->parent->length;
if (pchan->bone->flag & BONE_HINGE) {
@@ -270,7 +267,7 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
copy_m4_m4(tmat, pchan->bone->parent->arm_mat);
/* the location of actual parent transform */
- VECCOPY(tmat[3], offs_bone[3]);
+ copy_v3_v3(tmat[3], offs_bone[3]);
offs_bone[3][0]= offs_bone[3][1]= offs_bone[3][2]= 0.0f;
mul_m4_v3(pchan->parent->pose_mat, tmat[3]);
@@ -312,7 +309,7 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
/* construct offs_bone the same way it is done in armature.c */
copy_m4_m3(offs_bone, pchan->bone->bone_mat);
- VECCOPY(offs_bone[3], pchan->bone->head);
+ copy_v3_v3(offs_bone[3], pchan->bone->head);
offs_bone[3][1]+= pchan->bone->parent->length;
if (pchan->bone->flag & BONE_HINGE) {
@@ -323,8 +320,8 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
copy_m4_m4(tmat, pchan->bone->parent->arm_mat);
/* the location of actual parent transform */
- VECCOPY(tmat[3], offs_bone[3]);
- offs_bone[3][0]= offs_bone[3][1]= offs_bone[3][2]= 0.0f;
+ copy_v3_v3(tmat[3], offs_bone[3]);
+ zero_v3(offs_bone[3]);
mul_m4_v3(pchan->parent->pose_mat, tmat[3]);
mul_m4_m4m4(diff_mat, offs_bone, tmat);
@@ -403,7 +400,7 @@ static void contarget_get_mesh_mat (Scene *scene, Object *ob, char *substring, f
DerivedMesh *dm = NULL;
Mesh *me= ob->data;
EditMesh *em = BKE_mesh_get_editmesh(me);
- float vec[3] = {0.0f, 0.0f, 0.0f}, tvec[3];
+ float vec[3] = {0.0f, 0.0f, 0.0f};
float normal[3] = {0.0f, 0.0f, 0.0f}, plane[3];
float imat[3][3], tmat[3][3];
int dgroup;
@@ -451,8 +448,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;
}
@@ -480,9 +477,9 @@ static void contarget_get_mesh_mat (Scene *scene, Object *ob, char *substring, f
mul_m3_v3(tmat, normal);
normalize_v3(normal);
- VECCOPY(plane, tmat[1]);
+ copy_v3_v3(plane, tmat[1]);
- VECCOPY(tmat[2], normal);
+ copy_v3_v3(tmat[2], normal);
cross_v3_v3v3(tmat[0], normal, plane);
cross_v3_v3v3(tmat[1], tmat[2], tmat[0]);
@@ -491,8 +488,7 @@ static void contarget_get_mesh_mat (Scene *scene, Object *ob, char *substring, f
/* apply the average coordinate as the new location */
- mul_v3_m4v3(tvec, ob->obmat, vec);
- VECCOPY(mat[3], tvec);
+ mul_v3_m4v3(mat[3], ob->obmat, vec);
}
}
@@ -539,7 +535,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;
@@ -557,7 +553,7 @@ static void contarget_get_lattice_mat (Object *ob, char *substring, float mat[][
mul_v3_m4v3(tvec, ob->obmat, vec);
/* copy new location to matrix */
- VECCOPY(mat[3], tvec);
+ copy_v3_v3(mat[3], tvec);
}
/* generic function to get the appropriate matrix for most target cases */
@@ -822,13 +818,13 @@ static void childof_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta
copy_m4_m4(invmat, data->invmat);
/* extract components of both matrices */
- VECCOPY(loc, ct->matrix[3]);
- mat4_to_eulO( eul, ct->rotOrder,ct->matrix);
- mat4_to_size( size,ct->matrix);
+ copy_v3_v3(loc, ct->matrix[3]);
+ 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);
+ copy_v3_v3(loco, invmat[3]);
+ 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;
@@ -943,9 +939,8 @@ static void vectomat (float *vec, float *target_up, short axis, short upflag, sh
float right[3];
float neg = -1;
int right_index;
-
- copy_v3_v3(n, vec);
- if (normalize_v3(n) == 0.0) {
+
+ if (normalize_v3_v3(n, vec) == 0.0) {
n[0] = 0.0;
n[1] = 0.0;
n[2] = 1.0;
@@ -956,9 +951,7 @@ static void vectomat (float *vec, float *target_up, short axis, short upflag, sh
/* n specifies the transformation of the track axis */
if (flags & TARGET_Z_UP) {
/* target Z axis is the global up axis */
- u[0] = target_up[0];
- u[1] = target_up[1];
- u[2] = target_up[2];
+ copy_v3_v3(u, target_up);
}
else {
/* world Z axis is the global up axis */
@@ -991,20 +984,13 @@ static void vectomat (float *vec, float *target_up, short axis, short upflag, sh
m[right_index][1] = neg * right[1];
m[right_index][2] = neg * right[2];
- m[upflag][0] = proj[0];
- m[upflag][1] = proj[1];
- m[upflag][2] = proj[2];
+ copy_v3_v3(m[upflag], proj);
- m[axis][0] = n[0];
- m[axis][1] = n[1];
- m[axis][2] = n[2];
+ copy_v3_v3(m[axis], n);
}
/* identity matrix - don't do anything if the two axes are the same */
else {
- m[0][0]= m[1][1]= m[2][2]= 1.0;
- m[0][1]= m[0][2]= 0.0;
- m[1][0]= m[1][2]= 0.0;
- m[2][0]= m[2][1]= 0.0;
+ unit_m3(m);
}
}
@@ -1020,7 +1006,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];
@@ -1130,10 +1116,9 @@ static void kinematic_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstra
else {
float vec[3];
/* move grabtarget into world space */
- VECCOPY(vec, data->grabtarget);
- mul_m4_v3(ob->obmat, vec);
+ mul_v3_m4v3(vec, ob->obmat, data->grabtarget);
copy_m4_m4(ct->matrix, ob->obmat);
- VECCOPY(ct->matrix[3], vec);
+ copy_v3_v3(ct->matrix[3], vec);
}
}
else
@@ -1246,7 +1231,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);
@@ -1268,7 +1253,7 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
copy_m4_m4(totmat, rmat);
}
- VECCOPY(totmat[3], vec);
+ copy_v3_v3(totmat[3], vec);
mul_serie_m4(ct->matrix, ct->tar->obmat, totmat, NULL, NULL, NULL, NULL, NULL, NULL);
}
@@ -1387,10 +1372,10 @@ static void rotlimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *t
float eul[3];
float size[3];
- VECCOPY(loc, cob->matrix[3]);
- mat4_to_size( size,cob->matrix);
+ copy_v3_v3(loc, cob->matrix[3]);
+ 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 */
@@ -1548,7 +1533,7 @@ static void loclike_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta
float offset[3] = {0.0f, 0.0f, 0.0f};
if (data->flag & LOCLIKE_OFFSET)
- VECCOPY(offset, cob->matrix[3]);
+ copy_v3_v3(offset, cob->matrix[3]);
if (data->flag & LOCLIKE_X) {
cob->matrix[3][0] = ct->matrix[3][0];
@@ -1640,18 +1625,18 @@ static void rotlike_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta
float eul[3], obeul[3];
float size[3];
- VECCOPY(loc, cob->matrix[3]);
- mat4_to_size( size,cob->matrix);
+ copy_v3_v3(loc, cob->matrix[3]);
+ 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;
@@ -1661,7 +1646,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;
@@ -1671,7 +1656,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;
@@ -1871,29 +1856,29 @@ static void samevolume_evaluate (bConstraint *con, bConstraintOb *cob, ListBase
{
bSameVolumeConstraint *data= con->data;
+ float volume = data->volume;
+ float fac = 1.0f;
float obsize[3];
- float volume=data->volume;
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:
- if (obsize[0]!=0) {
- mul_v3_fl(cob->matrix[1], sqrt(volume/obsize[0])/obsize[0]);
- mul_v3_fl(cob->matrix[2], sqrt(volume/obsize[0])/obsize[0]);
- }
+ mul_v3_fl(cob->matrix[1], fac);
+ mul_v3_fl(cob->matrix[2], fac);
break;
case SAMEVOL_Y:
- if (obsize[1]!=0) {
- mul_v3_fl(cob->matrix[0], sqrt(volume/obsize[1])/obsize[1]);
- mul_v3_fl(cob->matrix[2], sqrt(volume/obsize[1])/obsize[1]);
- }
+ mul_v3_fl(cob->matrix[0], fac);
+ mul_v3_fl(cob->matrix[2], fac);
break;
case SAMEVOL_Z:
- if (obsize[2]!=0) {
- mul_v3_fl(cob->matrix[0], sqrt(volume/obsize[2])/obsize[2]);
- mul_v3_fl(cob->matrix[1], sqrt(volume/obsize[2])/obsize[2]);
- }
+ mul_v3_fl(cob->matrix[0], fac);
+ mul_v3_fl(cob->matrix[1], fac);
break;
}
}
@@ -1983,8 +1968,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) {
@@ -2140,7 +2127,7 @@ static void actcon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraint
}
else {
/* extract location */
- VECCOPY(vec, tempmat[3]);
+ copy_v3_v3(vec, tempmat[3]);
axis= data->type - 20;
}
@@ -2296,10 +2283,7 @@ static void locktrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
normalize_v3(totmat[1]);
/* the x axis is fixed */
- totmat[0][0] = cob->matrix[0][0];
- totmat[0][1] = cob->matrix[0][1];
- totmat[0][2] = cob->matrix[0][2];
- normalize_v3(totmat[0]);
+ normalize_v3_v3(totmat[0], cob->matrix[0]);
/* the z axis gets mapped onto a third orthogonal vector */
cross_v3_v3v3(totmat[2], totmat[0], totmat[1]);
@@ -2313,10 +2297,7 @@ static void locktrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
normalize_v3(totmat[2]);
/* the x axis is fixed */
- totmat[0][0] = cob->matrix[0][0];
- totmat[0][1] = cob->matrix[0][1];
- totmat[0][2] = cob->matrix[0][2];
- normalize_v3(totmat[0]);
+ normalize_v3_v3(totmat[0], cob->matrix[0]);
/* the z axis gets mapped onto a third orthogonal vector */
cross_v3_v3v3(totmat[1], totmat[2], totmat[0]);
@@ -2331,10 +2312,7 @@ static void locktrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
negate_v3(totmat[1]);
/* the x axis is fixed */
- totmat[0][0] = cob->matrix[0][0];
- totmat[0][1] = cob->matrix[0][1];
- totmat[0][2] = cob->matrix[0][2];
- normalize_v3(totmat[0]);
+ normalize_v3_v3(totmat[0], cob->matrix[0]);
/* the z axis gets mapped onto a third orthogonal vector */
cross_v3_v3v3(totmat[2], totmat[0], totmat[1]);
@@ -2349,10 +2327,7 @@ static void locktrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
negate_v3(totmat[2]);
/* the x axis is fixed */
- totmat[0][0] = cob->matrix[0][0];
- totmat[0][1] = cob->matrix[0][1];
- totmat[0][2] = cob->matrix[0][2];
- normalize_v3(totmat[0]);
+ normalize_v3_v3(totmat[0], cob->matrix[0]);
/* the z axis gets mapped onto a third orthogonal vector */
cross_v3_v3v3(totmat[1], totmat[2], totmat[0]);
@@ -2360,9 +2335,7 @@ static void locktrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
break;
default:
{
- totmat[0][0] = 1;totmat[0][1] = 0;totmat[0][2] = 0;
- totmat[1][0] = 0;totmat[1][1] = 1;totmat[1][2] = 0;
- totmat[2][0] = 0;totmat[2][1] = 0;totmat[2][2] = 1;
+ unit_m3(totmat);
}
break;
}
@@ -2379,11 +2352,8 @@ static void locktrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
normalize_v3(totmat[0]);
/* the y axis is fixed */
- totmat[1][0] = cob->matrix[1][0];
- totmat[1][1] = cob->matrix[1][1];
- totmat[1][2] = cob->matrix[1][2];
- normalize_v3(totmat[1]);
-
+ normalize_v3_v3(totmat[1], cob->matrix[1]);
+
/* the z axis gets mapped onto a third orthogonal vector */
cross_v3_v3v3(totmat[2], totmat[0], totmat[1]);
}
@@ -2396,10 +2366,7 @@ static void locktrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
normalize_v3(totmat[2]);
/* the y axis is fixed */
- totmat[1][0] = cob->matrix[1][0];
- totmat[1][1] = cob->matrix[1][1];
- totmat[1][2] = cob->matrix[1][2];
- normalize_v3(totmat[1]);
+ normalize_v3_v3(totmat[1], cob->matrix[1]);
/* the z axis gets mapped onto a third orthogonal vector */
cross_v3_v3v3(totmat[0], totmat[1], totmat[2]);
@@ -2414,10 +2381,7 @@ static void locktrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
negate_v3(totmat[0]);
/* the y axis is fixed */
- totmat[1][0] = cob->matrix[1][0];
- totmat[1][1] = cob->matrix[1][1];
- totmat[1][2] = cob->matrix[1][2];
- normalize_v3(totmat[1]);
+ normalize_v3_v3(totmat[1], cob->matrix[1]);
/* the z axis gets mapped onto a third orthogonal vector */
cross_v3_v3v3(totmat[2], totmat[0], totmat[1]);
@@ -2432,10 +2396,7 @@ static void locktrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
negate_v3(totmat[2]);
/* the y axis is fixed */
- totmat[1][0] = cob->matrix[1][0];
- totmat[1][1] = cob->matrix[1][1];
- totmat[1][2] = cob->matrix[1][2];
- normalize_v3(totmat[1]);
+ normalize_v3_v3(totmat[1], cob->matrix[1]);
/* the z axis gets mapped onto a third orthogonal vector */
cross_v3_v3v3(totmat[0], totmat[1], totmat[2]);
@@ -2443,9 +2404,7 @@ static void locktrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
break;
default:
{
- totmat[0][0] = 1;totmat[0][1] = 0;totmat[0][2] = 0;
- totmat[1][0] = 0;totmat[1][1] = 1;totmat[1][2] = 0;
- totmat[2][0] = 0;totmat[2][1] = 0;totmat[2][2] = 1;
+ unit_m3(totmat);
}
break;
}
@@ -2462,10 +2421,7 @@ static void locktrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
normalize_v3(totmat[0]);
/* the z axis is fixed */
- totmat[2][0] = cob->matrix[2][0];
- totmat[2][1] = cob->matrix[2][1];
- totmat[2][2] = cob->matrix[2][2];
- normalize_v3(totmat[2]);
+ normalize_v3_v3(totmat[2], cob->matrix[2]);
/* the x axis gets mapped onto a third orthogonal vector */
cross_v3_v3v3(totmat[1], totmat[2], totmat[0]);
@@ -2479,10 +2435,7 @@ static void locktrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
normalize_v3(totmat[1]);
/* the z axis is fixed */
- totmat[2][0] = cob->matrix[2][0];
- totmat[2][1] = cob->matrix[2][1];
- totmat[2][2] = cob->matrix[2][2];
- normalize_v3(totmat[2]);
+ normalize_v3_v3(totmat[2], cob->matrix[2]);
/* the x axis gets mapped onto a third orthogonal vector */
cross_v3_v3v3(totmat[0], totmat[1], totmat[2]);
@@ -2497,10 +2450,7 @@ static void locktrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
negate_v3(totmat[0]);
/* the z axis is fixed */
- totmat[2][0] = cob->matrix[2][0];
- totmat[2][1] = cob->matrix[2][1];
- totmat[2][2] = cob->matrix[2][2];
- normalize_v3(totmat[2]);
+ normalize_v3_v3(totmat[2], cob->matrix[2]);
/* the x axis gets mapped onto a third orthogonal vector */
cross_v3_v3v3(totmat[1], totmat[2], totmat[0]);
@@ -2515,10 +2465,7 @@ static void locktrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
negate_v3(totmat[1]);
/* the z axis is fixed */
- totmat[2][0] = cob->matrix[2][0];
- totmat[2][1] = cob->matrix[2][1];
- totmat[2][2] = cob->matrix[2][2];
- normalize_v3(totmat[2]);
+ normalize_v3_v3(totmat[2], cob->matrix[2]);
/* the x axis gets mapped onto a third orthogonal vector */
cross_v3_v3v3(totmat[0], totmat[1], totmat[2]);
@@ -2526,9 +2473,7 @@ static void locktrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
break;
default:
{
- totmat[0][0] = 1;totmat[0][1] = 0;totmat[0][2] = 0;
- totmat[1][0] = 0;totmat[1][1] = 1;totmat[1][2] = 0;
- totmat[2][0] = 0;totmat[2][1] = 0;totmat[2][2] = 1;
+ unit_m3(totmat);
}
break;
}
@@ -2536,19 +2481,13 @@ static void locktrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
break;
default:
{
- totmat[0][0] = 1;totmat[0][1] = 0;totmat[0][2] = 0;
- totmat[1][0] = 0;totmat[1][1] = 1;totmat[1][2] = 0;
- totmat[2][0] = 0;totmat[2][1] = 0;totmat[2][2] = 1;
+ unit_m3(totmat);
}
break;
}
/* Block to keep matrix heading */
- tmpmat[0][0] = cob->matrix[0][0];tmpmat[0][1] = cob->matrix[0][1];tmpmat[0][2] = cob->matrix[0][2];
- tmpmat[1][0] = cob->matrix[1][0];tmpmat[1][1] = cob->matrix[1][1];tmpmat[1][2] = cob->matrix[1][2];
- tmpmat[2][0] = cob->matrix[2][0];tmpmat[2][1] = cob->matrix[2][1];tmpmat[2][2] = cob->matrix[2][2];
- normalize_v3(tmpmat[0]);
- normalize_v3(tmpmat[1]);
- normalize_v3(tmpmat[2]);
+ copy_m3_m4(tmpmat, cob->matrix);
+ normalize_m3(tmpmat);
invert_m3_m3(invmat, tmpmat);
mul_m3_m3m3(tmpmat, totmat, invmat);
totmat[0][0] = tmpmat[0][0];totmat[0][1] = tmpmat[0][1];totmat[0][2] = tmpmat[0][2];
@@ -2561,9 +2500,7 @@ static void locktrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
totmat[1][0],totmat[1][1],totmat[1][2],
totmat[2][0],totmat[2][1],totmat[2][2]);
if (mdet==0) {
- totmat[0][0] = 1;totmat[0][1] = 0;totmat[0][2] = 0;
- totmat[1][0] = 0;totmat[1][1] = 1;totmat[1][2] = 0;
- totmat[2][0] = 0;totmat[2][1] = 0;totmat[2][2] = 1;
+ unit_m3(totmat);
}
/* apply out transformaton to the object */
@@ -2691,7 +2628,7 @@ static void distlimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
interp_v3_v3v3(dvec, ct->matrix[3], cob->matrix[3], sfac);
/* copy new vector onto owner */
- VECCOPY(cob->matrix[3], dvec);
+ copy_v3_v3(cob->matrix[3], dvec);
}
}
}
@@ -2771,19 +2708,13 @@ 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];
- xx[1] = cob->matrix[0][1];
- xx[2] = cob->matrix[0][2];
- normalize_v3(xx);
+ normalize_v3_v3(xx, cob->matrix[0]);
/* store Z orientation before destroying obmat */
- zz[0] = cob->matrix[2][0];
- zz[1] = cob->matrix[2][1];
- zz[2] = cob->matrix[2][2];
- normalize_v3(zz);
+ normalize_v3_v3(zz, cob->matrix[2]);
sub_v3_v3v3(vec, cob->matrix[3], ct->matrix[3]);
vec[0] /= size[0];
@@ -2838,9 +2769,7 @@ static void stretchto_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
normalize_v3(vec);
/* new Y aligns object target connection*/
- totmat[1][0] = -vec[0];
- totmat[1][1] = -vec[1];
- totmat[1][2] = -vec[2];
+ negate_v3_v3(totmat[1], vec);
switch (data->plane) {
case PLANE_X:
/* build new Z vector */
@@ -2849,16 +2778,11 @@ static void stretchto_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
normalize_v3(orth);
/* new Z*/
- totmat[2][0] = orth[0];
- totmat[2][1] = orth[1];
- totmat[2][2] = orth[2];
+ copy_v3_v3(totmat[2], orth);
/* we decided to keep X plane*/
cross_v3_v3v3(xx, orth, vec);
- normalize_v3(xx);
- totmat[0][0] = xx[0];
- totmat[0][1] = xx[1];
- totmat[0][2] = xx[2];
+ normalize_v3_v3(totmat[0], xx);
break;
case PLANE_Z:
/* build new X vector */
@@ -2867,16 +2791,11 @@ static void stretchto_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
normalize_v3(orth);
/* new X */
- totmat[0][0] = -orth[0];
- totmat[0][1] = -orth[1];
- totmat[0][2] = -orth[2];
+ negate_v3_v3(totmat[0], orth);
/* we decided to keep Z */
cross_v3_v3v3(zz, orth, vec);
- normalize_v3(zz);
- totmat[2][0] = zz[0];
- totmat[2][1] = zz[1];
- totmat[2][2] = zz[2];
+ normalize_v3_v3(totmat[2], zz);
break;
} /* switch (data->plane) */
@@ -3008,10 +2927,10 @@ static void minmax_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *tar
obmat[3][index] = tarmat[3][index] + data->offset;
if (data->flag & MINMAX_STICKY) {
if (data->flag & MINMAX_STUCK) {
- VECCOPY(obmat[3], data->cache);
+ copy_v3_v3(obmat[3], data->cache);
}
else {
- VECCOPY(data->cache, obmat[3]);
+ copy_v3_v3(data->cache, obmat[3]);
data->flag |= MINMAX_STUCK;
}
}
@@ -3021,7 +2940,7 @@ static void minmax_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *tar
copy_m4_m4(cob->matrix, tmat);
}
else {
- VECCOPY(cob->matrix[3], obmat[3]);
+ copy_v3_v3(cob->matrix[3], obmat[3]);
}
}
else {
@@ -3176,7 +3095,7 @@ static void clampto_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta
copy_m4_m4(obmat, cob->matrix);
unit_m4(targetMatrix);
- VECCOPY(ownLoc, obmat[3]);
+ copy_v3_v3(ownLoc, obmat[3]);
INIT_MINMAX(curveMin, curveMax)
minmax_object(ct->tar, curveMin, curveMax);
@@ -3263,16 +3182,16 @@ 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);
+ copy_v3_v3(totmat[3], vec);
mul_serie_m4(targetMatrix, ct->tar->obmat, totmat, NULL, NULL, NULL, NULL, NULL, NULL);
}
}
/* obtain final object position */
- VECCOPY(cob->matrix[3], targetMatrix[3]);
+ copy_v3_v3(cob->matrix[3], targetMatrix[3]);
}
}
@@ -3354,7 +3273,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;
@@ -3364,9 +3283,9 @@ 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);
+ copy_v3_v3(loc, cob->matrix[3]);
+ mat4_to_eulO(eul, cob->rotOrder, cob->matrix);
+ mat4_to_size(size, cob->matrix);
/* determine where in range current transforms lie */
if (data->expo) {
@@ -3486,95 +3405,95 @@ 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;
break;
}
- VECCOPY(co, hit.co);
+ copy_v3_v3(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);
- VECCOPY(ct->matrix[3], co);
+ mul_m4_v3(cob->matrix, co);
+ copy_v3_v3(ct->matrix[3], co);
}
}
}
@@ -3586,7 +3505,7 @@ static void shrinkwrap_evaluate (bConstraint *con, bConstraintOb *cob, ListBase
/* only evaluate if there is a target */
if (VALID_CONS_TARGET(ct))
{
- VECCOPY(cob->matrix[3], ct->matrix[3]);
+ copy_v3_v3(cob->matrix[3], ct->matrix[3]);
}
}
@@ -3670,23 +3589,23 @@ static void damptrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
* - the normalisation step at the end should take care of any unwanted scaling
* left over in the 3x3 matrix we used
*/
- VECCOPY(obvec, track_dir_vecs[data->trackflag]);
+ copy_v3_v3(obvec, track_dir_vecs[data->trackflag]);
mul_mat3_m4_v3(cob->matrix, obvec);
if (normalize_v3(obvec) == 0.0f) {
/* exceptional case - just use the track vector as appropriate */
- VECCOPY(obvec, track_dir_vecs[data->trackflag]);
+ copy_v3_v3(obvec, track_dir_vecs[data->trackflag]);
}
/* find the (unit) direction vector going from the owner to the target */
- VECCOPY(obloc, cob->matrix[3]);
+ copy_v3_v3(obloc, cob->matrix[3]);
sub_v3_v3v3(tarvec, ct->matrix[3], obloc);
if (normalize_v3(tarvec) == 0.0f) {
/* the target is sitting on the owner, so just make them use the same direction vectors */
// FIXME: or would it be better to use the pure direction vector?
- VECCOPY(tarvec, obvec);
- //VECCOPY(tarvec, track_dir_vecs[data->trackflag]);
+ copy_v3_v3(tarvec, obvec);
+ //copy_v3_v3(tarvec, track_dir_vecs[data->trackflag]);
}
/* determine the axis-angle rotation, which represents the smallest possible rotation
@@ -3705,7 +3624,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
@@ -3714,7 +3633,7 @@ static void damptrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
mul_m4_m3m4(tmat, rmat, cob->matrix); // m1, m3, m2
copy_m4_m4(cob->matrix, tmat);
- VECCOPY(cob->matrix[3], obloc);
+ copy_v3_v3(cob->matrix[3], obloc);
}
}
@@ -3754,6 +3673,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;
@@ -3818,13 +3744,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 */
+ copy_v3_v3(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.
@@ -3861,6 +3899,7 @@ static void constraints_init_typeinfo () {
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
@@ -3948,17 +3987,6 @@ int remove_constraint (ListBase *list, bConstraint *con)
return 0;
}
-/* Remove the nth constraint from the given constraint stack */
-int remove_constraint_index (ListBase *list, int index)
-{
- bConstraint *con= BLI_findlink(list, index);
-
- if (con)
- return remove_constraint(list, con);
- else
- return 0;
-}
-
/* Remove all the constraints of the specified type from the given constraint stack */
void remove_constraints_type (ListBase *list, short type, short last_only)
{
@@ -4125,7 +4153,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;
@@ -4144,15 +4172,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 e8f73a92ad5..24dcb4c5846 100644
--- a/source/blender/blenkernel/intern/context.c
+++ b/source/blender/blenkernel/intern/context.c
@@ -25,6 +25,9 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <string.h>
+#include <stddef.h>
+
#include "MEM_guardedalloc.h"
#include "DNA_scene_types.h"
@@ -47,8 +50,6 @@
#include "BPY_extern.h"
#endif
-#include <string.h>
-
/* struct */
struct bContext {
@@ -404,6 +405,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)
@@ -548,7 +550,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);
@@ -556,10 +558,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;
@@ -568,13 +572,12 @@ int CTX_data_get(const bContext *C, const char *member, PointerRNA *r_ptr, ListB
static void data_dir_add(ListBase *lb, const char *member)
{
LinkData *link;
-
+
if(strcmp(member, "scene") == 0) /* exception */
return;
- for(link=lb->first; link; link=link->next)
- if(strcmp(link->data, member) == 0)
- return;
+ if(BLI_findstring(lb, member, offsetof(LinkData, data)))
+ return;
link= MEM_callocN(sizeof(LinkData), "LinkData");
link->data= (void*)member;
@@ -682,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 c87495d499e..358dd1914e7 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -34,10 +34,6 @@
#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"
@@ -49,6 +45,7 @@
#include "DNA_key_types.h"
#include "DNA_scene_types.h"
#include "DNA_vfont_types.h"
+#include "DNA_object_types.h"
#include "BKE_animsys.h"
#include "BKE_anim.h"
@@ -62,6 +59,8 @@
#include "BKE_object.h"
#include "BKE_utildefines.h" // VECCOPY
+#include "ED_curve.h"
+
/* globals */
/* local */
@@ -108,13 +107,8 @@ void free_curve(Curve *cu)
BLI_freelistN(&cu->bev);
freedisplist(&cu->disp);
BKE_free_editfont(cu);
-
- if(cu->editnurb) {
- freeNurblist(cu->editnurb);
- MEM_freeN(cu->editnurb);
- cu->editnurb= NULL;
- }
+ free_curve_editNurb(cu);
unlink_curve(cu);
BKE_free_animdata((ID *)cu);
@@ -133,7 +127,7 @@ Curve *add_curve(char *name, int type)
cu= alloc_libblock(&G.main->curve, ID_CU, name);
cu->size[0]= cu->size[1]= cu->size[2]= 1.0;
- cu->flag= CU_FRONT|CU_BACK|CU_PATH_RADIUS;
+ cu->flag= CU_FRONT|CU_BACK|CU_DEFORM_BOUNDS_OFF|CU_PATH_RADIUS;
cu->pathlen= 100;
cu->resolu= cu->resolv= 12;
cu->width= 1.0;
@@ -142,6 +136,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();
@@ -151,7 +146,7 @@ Curve *add_curve(char *name, int type)
cu->vfont->id.us+=4;
cu->str= MEM_mallocN(12, "str");
strcpy(cu->str, "Text");
- cu->pos= 4;
+ cu->len= cu->pos= 4;
cu->strinfo= MEM_callocN(12*sizeof(CharInfo), "strinfo new");
cu->totbox= cu->actbox= 1;
cu->tb= MEM_callocN(MAXTEXTBOX*sizeof(TextBox), "textbox");
@@ -282,7 +277,7 @@ void tex_space_curve(Curve *cu)
{
DispList *dl;
BoundBox *bb;
- float *fp, min[3], max[3], loc[3], size[3];
+ float *fp, min[3], max[3];
int tot, doit= 0;
if(cu->bb==NULL) cu->bb= MEM_callocN(sizeof(BoundBox), "boundbox");
@@ -309,20 +304,15 @@ void tex_space_curve(Curve *cu)
min[0] = min[1] = min[2] = -1.0f;
max[0] = max[1] = max[2] = 1.0f;
}
-
- loc[0]= (min[0]+max[0])/2.0f;
- loc[1]= (min[1]+max[1])/2.0f;
- loc[2]= (min[2]+max[2])/2.0f;
-
- size[0]= (max[0]-min[0])/2.0f;
- size[1]= (max[1]-min[1])/2.0f;
- size[2]= (max[2]-min[2])/2.0f;
boundbox_set_from_min_max(bb, min, max);
if(cu->texflag & CU_AUTOSPACE) {
- VECCOPY(cu->loc, loc);
- VECCOPY(cu->size, size);
+ mid_v3_v3v3(cu->loc, min, max);
+ cu->size[0]= (max[0]-min[0])/2.0f;
+ cu->size[1]= (max[1]-min[1])/2.0f;
+ cu->size[2]= (max[2]-min[2])/2.0f;
+
cu->rot[0]= cu->rot[1]= cu->rot[2]= 0.0;
if(cu->size[0]==0.0) cu->size[0]= 1.0;
@@ -891,14 +881,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;
@@ -971,6 +961,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;
}
}
@@ -979,6 +972,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;
}
@@ -1228,6 +1222,8 @@ void makebevelcurve(Scene *scene, Object *ob, ListBase *disp, int forRender)
// XXX if( ob == obedit && ob->type == OB_FONT ) return;
if(cu->bevobj) {
+ if (cu->bevobj->type!=OB_CURVE) return;
+
bevcu= cu->bevobj->data;
if(bevcu->ext1==0.0 && bevcu->ext2==0.0) {
ListBase bevdisp= {NULL, NULL};
@@ -1317,30 +1313,33 @@ void makebevelcurve(Scene *scene, Object *ob, ListBase *disp, int forRender)
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 */
@@ -1373,30 +1372,32 @@ void makebevelcurve(Scene *scene, Object *ob, ListBase *disp, int forRender)
}
}
- /* 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;
+ }
}
}
}
@@ -1542,7 +1543,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];
@@ -1572,7 +1573,7 @@ static void alfa_bezpart(BezTriple *prevbezt, BezTriple *bezt, Nurb *nu, float *
for(a=0; a<resolu; a++, fac+= dfac) {
if (tilt_array) {
- if (nu->tilt_interp==3) { /* May as well support for tilt also 2.47 ease interp */
+ if (nu->tilt_interp==KEY_CU_EASE) { /* May as well support for tilt also 2.47 ease interp */
*tilt_array = prevbezt->alfa + (bezt->alfa - prevbezt->alfa)*(3.0f*fac*fac - 2.0f*fac*fac*fac);
} else {
key_curve_position_weights(fac, t, nu->tilt_interp);
@@ -1583,7 +1584,7 @@ static void alfa_bezpart(BezTriple *prevbezt, BezTriple *bezt, Nurb *nu, float *
}
if (radius_array) {
- if (nu->radius_interp==3) {
+ if (nu->radius_interp==KEY_CU_EASE) {
/* Support 2.47 ease interp
* Note! - this only takes the 2 points into account,
* giving much more localized results to changes in radius, sometimes you want that */
@@ -1599,6 +1600,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);
+ }
}
}
@@ -1984,7 +1992,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;
@@ -1995,14 +2003,17 @@ void makeBevelList(Object *ob)
/* STEP 1: MAKE POLYS */
BLI_freelistN(&(cu->bev));
- if(cu->editnurb && ob->type!=OB_FONT) nu= cu->editnurb->first;
- else nu= cu->nurb.first;
+ if(cu->editnurb && ob->type!=OB_FONT) {
+ ListBase *nurbs= ED_curve_editnurbs(cu);
+ nu= nurbs->first;
+ } else nu= cu->nurb.first;
while(nu) {
/* 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 */
@@ -2032,6 +2043,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++;
@@ -2064,6 +2076,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++;
@@ -2085,6 +2098,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));
@@ -2114,6 +2128,7 @@ void makeBevelList(Object *ob)
VECCOPY(bevp->vec, prevbezt->vec[1]);
bevp->alfa= prevbezt->alfa;
bevp->radius= prevbezt->radius;
+ bevp->weight= prevbezt->weight;
bl->nr++;
}
}
@@ -2132,6 +2147,7 @@ void makeBevelList(Object *ob)
makeNurbcurve( nu, &bevp->vec[0],
do_tilt ? &bevp->alfa : NULL,
do_radius ? &bevp->radius : NULL,
+ do_weight ? &bevp->weight : NULL,
resolu, sizeof(BevPoint));
}
}
@@ -2980,7 +2996,7 @@ float (*curve_getKeyVertexCos(Curve *cu, ListBase *lb, float *key))[3]
VECCOPY(co, key); co+=3; key+=3;
VECCOPY(co, key); co+=3; key+=3;
VECCOPY(co, key); co+=3; key+=3;
- key++; /* skip tilt */
+ key+=3; /* skip tilt */
}
}
else {
@@ -3059,7 +3075,7 @@ int clamp_nurb_order_u( struct Nurb *nu )
nu->orderu= nu->pntsu;
change= 1;
}
- if(((nu->flag & CU_NURB_CYCLIC)==0) && (nu->flagu & CU_NURB_BEZIER)) {
+ if(((nu->flagu & CU_NURB_CYCLIC)==0) && (nu->flagu & CU_NURB_BEZIER)) {
CLAMP(nu->orderu, 3,4);
change= 1;
}
@@ -3073,12 +3089,117 @@ int clamp_nurb_order_v( struct Nurb *nu)
nu->orderv= nu->pntsv;
change= 1;
}
- if(((nu->flag & CU_NURB_CYCLIC)==0) && (nu->flagv & CU_NURB_BEZIER)) {
+ if(((nu->flagv & CU_NURB_CYCLIC)==0) && (nu->flagv & CU_NURB_BEZIER)) {
CLAMP(nu->orderv, 3,4);
change= 1;
}
return change;
}
+/* Get edit nurbs or normal nurbs list */
+ListBase *BKE_curve_nurbs(Curve *cu)
+{
+ if (cu->editnurb) {
+ return ED_curve_editnurbs(cu);
+ }
+
+ return &cu->nurb;
+}
+
+
+/* basic vertex data functions */
+int minmax_curve(Curve *cu, float min[3], float max[3])
+{
+ ListBase *nurb_lb= BKE_curve_nurbs(cu);
+ Nurb *nu;
+
+ for(nu= nurb_lb->first; nu; nu= nu->next)
+ minmaxNurb(nu, min, max);
+
+ return (nurb_lb->first != NULL);
+}
+
+int curve_center_median(Curve *cu, float cent[3])
+{
+ ListBase *nurb_lb= BKE_curve_nurbs(cu);
+ Nurb *nu;
+ int total= 0;
+
+ zero_v3(cent);
+
+ for(nu= nurb_lb->first; nu; nu= nu->next) {
+ int i;
+ if(nu->type == CU_BEZIER) {
+ BezTriple *bezt;
+ i= nu->pntsu;
+ total += i * 3;
+ for(bezt= nu->bezt; i--; bezt++) {
+ add_v3_v3(cent, bezt->vec[0]);
+ add_v3_v3(cent, bezt->vec[1]);
+ add_v3_v3(cent, bezt->vec[2]);
+ }
+ }
+ else {
+ BPoint *bp;
+ i= nu->pntsu*nu->pntsv;
+ total += i;
+ for(bp= nu->bp; i--; bp++) {
+ add_v3_v3(cent, bp->vec);
+ }
+ }
+ }
+ mul_v3_fl(cent, 1.0f/(float)total);
+
+ return (total != 0);
+}
+
+int curve_center_bounds(Curve *cu, float cent[3])
+{
+ float min[3], max[3];
+ INIT_MINMAX(min, max);
+ if(minmax_curve(cu, min, max)) {
+ mid_v3_v3v3(cent, min, max);
+ return 1;
+ }
+
+ return 0;
+}
+
+void curve_translate(Curve *cu, float offset[3], int do_keys)
+{
+ ListBase *nurb_lb= BKE_curve_nurbs(cu);
+ Nurb *nu;
+ int i;
+
+ for(nu= nurb_lb->first; nu; nu= nu->next) {
+ BezTriple *bezt;
+ BPoint *bp;
+
+ if(nu->type == CU_BEZIER) {
+ i= nu->pntsu;
+ for(bezt= nu->bezt; i--; bezt++) {
+ add_v3_v3(bezt->vec[0], offset);
+ add_v3_v3(bezt->vec[1], offset);
+ add_v3_v3(bezt->vec[2], offset);
+ }
+ }
+ else {
+ i= nu->pntsu*nu->pntsv;
+ for(bp= nu->bp; i--; bp++) {
+ add_v3_v3(bp->vec, offset);
+ }
+ }
+ }
+
+ if (do_keys && cu->key) {
+ KeyBlock *kb;
+ for (kb=cu->key->block.first; kb; kb=kb->next) {
+ float *fp= kb->data;
+ for (i= kb->totelem; i--; fp+=3) {
+ add_v3_v3(fp, offset);
+ }
+ }
+ }
+}
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 0afb9a450dd..1f4b0f303f7 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -85,7 +85,7 @@ typedef struct LayerTypeInfo {
int count, void *dest);
/* a function to swap the data in corners of the element */
- void (*swap)(void *data, int *corner_indices);
+ void (*swap)(void *data, const int *corner_indices);
/* a function to set a layer's data to default values. if NULL, the
default is assumed to be all zeros */
@@ -273,7 +273,7 @@ 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];
@@ -368,7 +368,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];
@@ -445,7 +445,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;
@@ -559,7 +559,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;
}
}
@@ -574,7 +574,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;
}
}
@@ -735,7 +735,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];
@@ -798,10 +798,12 @@ const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
};
const char *LAYERTYPENAMES[CD_NUMTYPES] = {
- "CDMVert", "CDMSticky", "CDMDeformVert", "CDMEdge", "CDMFace", "CDMTFace",
- "CDMCol", "CDOrigIndex", "CDNormal", "CDFlags","CDMFloatProperty",
- "CDMIntProperty","CDMStringProperty", "CDOrigSpace", "CDOrco", "CDMTexPoly", "CDMLoopUV",
- "CDMloopCol", "CDTangent", "CDMDisps", "CDWeightMCol", "CDClothOrco"};
+ /* 0-4 */ "CDMVert", "CDMSticky", "CDMDeformVert", "CDMEdge", "CDMFace",
+ /* 5-9 */ "CDMTFace", "CDMCol", "CDOrigIndex", "CDNormal", "CDFlags",
+ /* 10-14 */ "CDMFloatProperty", "CDMIntProperty","CDMStringProperty", "CDOrigSpace", "CDOrco",
+ /* 15-19 */ "CDMTexPoly", "CDMLoopUV", "CDMloopCol", "CDTangent", "CDMDisps",
+ /* 20-23 */"CDWeightMCol", "CDIDMCol", "CDTextureMCol", "CDClothOrco"
+};
const CustomDataMask CD_MASK_BAREMESH =
CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE;
@@ -1211,7 +1213,7 @@ static CustomDataLayer *customData_add_layer__internal(CustomData *data,
data->layers[index].flag = flag;
data->layers[index].data = newlayerdata;
- if(name) {
+ if(name || (name=typeInfo->defaultname)) {
strcpy(data->layers[index].name, name);
CustomData_set_layer_unique_name(data, index);
}
@@ -1252,7 +1254,7 @@ 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, const char *name)
{
CustomDataLayer *layer;
@@ -1533,7 +1535,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;
@@ -2314,12 +2316,31 @@ 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_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)
{
CustomDataExternal *external= data->external;
@@ -2487,9 +2508,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 0ae8169cc67..91584b6236f 100644
--- a/source/blender/blenkernel/intern/deform.c
+++ b/source/blender/blenkernel/intern/deform.c
@@ -45,10 +45,6 @@
#include "BLI_blenlib.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
void defgroup_copy_list (ListBase *outbase, ListBase *inbase)
{
@@ -180,7 +176,7 @@ void defvert_flip (MDeformVert *dvert, int *flip_map)
}
-bDeformGroup *defgroup_find_name (Object *ob, char *name)
+bDeformGroup *defgroup_find_name (Object *ob, const char *name)
{
/* return a pointer to the deform group with this name
* or return NULL otherwise.
@@ -205,7 +201,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;
@@ -368,10 +364,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 86cafa733ff..382c0690ae3 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -41,6 +41,8 @@
#include "DNA_screen_types.h"
#include "DNA_windowmanager_types.h"
+#include "MEM_guardedalloc.h"
+
#include "BLI_ghash.h"
#include "BKE_animsys.h"
@@ -59,13 +61,7 @@
#include "BKE_scene.h"
#include "BKE_screen.h"
-#include "MEM_guardedalloc.h"
-
-#ifndef DISABLE_PYTHON
-#include "BPY_extern.h"
-#endif
-
- #include "depsgraph_private.h"
+#include "depsgraph_private.h"
/* Queue and stack operations for dag traversal
*
@@ -658,7 +654,7 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Scene *scene, O
dag_add_relation(dag,scenenode,node,DAG_RL_SCENE, "Scene Relation");
}
-struct DagForest *build_dag(struct Scene *sce, short mask)
+struct DagForest *build_dag(Main *bmain, Scene *sce, short mask)
{
Base *base;
Object *ob;
@@ -695,7 +691,7 @@ struct DagForest *build_dag(struct Scene *sce, short mask)
}
/* add groups used in current scene objects */
- for(group= G.main->group.first; group; group= group->id.next) {
+ for(group= bmain->group.first; group; group= group->id.next) {
if(group->id.flag & LIB_DOIT) {
for(go= group->gobject.first; go; go= go->next) {
build_dag_object(dag, scenenode, sce, go->ob, mask);
@@ -803,7 +799,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);
}
@@ -1605,7 +1601,7 @@ static void dag_editors_update(Main *bmain, ID *id)
}
/* groups with objects in this scene need to be put in the right order as well */
-static void scene_sort_groups(Scene *sce)
+static void scene_sort_groups(Main *bmain, Scene *sce)
{
Base *base;
Group *group;
@@ -1613,14 +1609,14 @@ static void scene_sort_groups(Scene *sce)
Object *ob;
/* test; are group objects all in this scene? */
- for(ob= G.main->object.first; ob; ob= ob->id.next) {
+ for(ob= bmain->object.first; ob; ob= ob->id.next) {
ob->id.flag &= ~LIB_DOIT;
ob->id.newid= NULL; /* newid abuse for GroupObject */
}
for(base = sce->base.first; base; base= base->next)
base->object->id.flag |= LIB_DOIT;
- for(group= G.main->group.first; group; group= group->id.next) {
+ for(group= bmain->group.first; group; group= group->id.next) {
for(go= group->gobject.first; go; go= go->next) {
if((go->ob->id.flag & LIB_DOIT)==0)
break;
@@ -1649,7 +1645,7 @@ static void scene_sort_groups(Scene *sce)
}
/* sort the base list on dependency order */
-void DAG_scene_sort(struct Scene *sce)
+void DAG_scene_sort(Main *bmain, Scene *sce)
{
DagNode *node;
DagNodeQueue *nqueue;
@@ -1661,7 +1657,7 @@ void DAG_scene_sort(struct Scene *sce)
tempbase.first= tempbase.last= NULL;
- build_dag(sce, DAG_RL_ALL_BUT_DATA);
+ build_dag(bmain, sce, DAG_RL_ALL_BUT_DATA);
dag_check_cycle(sce->theDag);
@@ -1731,7 +1727,7 @@ void DAG_scene_sort(struct Scene *sce)
queue_delete(nqueue);
/* all groups with objects in this scene gets resorted too */
- scene_sort_groups(sce);
+ scene_sort_groups(bmain, sce);
if(G.f & G_DEBUG) {
printf("\nordered\n");
@@ -1754,7 +1750,7 @@ static void flush_update_node(DagNode *node, unsigned int layer, int curtime)
node->lasttime= curtime;
ob= node->ob;
- if(ob && (ob->recalc & OB_RECALC)) {
+ if(ob && (ob->recalc & OB_RECALC_ALL)) {
all_layer= node->scelay;
/* got an object node that changes, now check relations */
@@ -1797,7 +1793,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;
}
}
@@ -1810,7 +1806,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);
@@ -1864,7 +1860,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;
@@ -1877,26 +1873,19 @@ static void flush_pointcache_reset(Scene *scene, DagNode *node, int curtime, int
}
}
-/* flushes all recalc flags in objects down the dependency tree */
-void DAG_scene_flush_update(Scene *sce, unsigned int lay, int time)
+/* flush layer flags to dependencies */
+static void dag_scene_flush_layers(Scene *sce, int lay)
{
- DagNode *firstnode, *node;
+ DagNode *node, *firstnode;
DagAdjList *itA;
- Object *ob;
Base *base;
int lasttime;
-
- if(sce->theDag==NULL) {
- printf("DAG zero... not allowed to happen!\n");
- DAG_scene_sort(sce);
- }
-
+
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;
@@ -1930,7 +1919,26 @@ void DAG_scene_flush_update(Scene *sce, unsigned int lay, int time)
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(Main *bmain, Scene *sce, unsigned int lay, int time)
+{
+ DagNode *firstnode;
+ DagAdjList *itA;
+ Object *ob;
+ int lasttime;
+
+ if(sce->theDag==NULL) {
+ printf("DAG zero... not allowed to happen!\n");
+ DAG_scene_sort(bmain, sce);
+ }
+ firstnode= sce->theDag->DagNode.first; // always scene node
+
+ /* first we flush the layer flags */
+ dag_scene_flush_layers(sce, lay);
+
/* 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;
@@ -1946,7 +1954,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;
@@ -1962,11 +1970,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;
}
@@ -2026,14 +2053,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;
}
@@ -2104,7 +2131,7 @@ static void dag_object_time_update_flags(Object *ob)
}
}
/* flag all objects that need recalc, for changes in time for example */
-void DAG_scene_update_flags(Scene *scene, unsigned int lay)
+void DAG_scene_update_flags(Main *bmain, Scene *scene, unsigned int lay)
{
Base *base;
Object *ob;
@@ -2126,7 +2153,7 @@ void DAG_scene_update_flags(Scene *scene, unsigned int lay)
}
/* we do groups each once */
- for(group= G.main->group.first; group; group= group->id.next) {
+ for(group= bmain->group.first; group; group= group->id.next) {
if(group->id.flag & LIB_DOIT) {
for(go= group->gobject.first; go; go= go->next) {
dag_object_time_update_flags(go->ob);
@@ -2135,7 +2162,7 @@ void DAG_scene_update_flags(Scene *scene, unsigned int lay)
}
for(sce= scene; sce; sce= sce->set)
- DAG_scene_flush_update(sce, lay, 1);
+ DAG_scene_flush_update(bmain, sce, lay, 1);
/* test: set time flag, to disable baked systems to update */
for(SETLOOPER(scene, base)) {
@@ -2149,7 +2176,7 @@ void DAG_scene_update_flags(Scene *scene, unsigned int lay)
dag_object_time_update_flags(scene->camera);
/* and store the info in groupobject */
- for(group= G.main->group.first; group; group= group->id.next) {
+ for(group= bmain->group.first; group; group= group->id.next) {
if(group->id.flag & LIB_DOIT) {
for(go= group->gobject.first; go; go= go->next) {
go->recalc= go->ob->recalc;
@@ -2186,45 +2213,48 @@ 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? */
}
}
-void DAG_ids_flush_update(int time)
+void DAG_ids_flush_update(Main *bmain, int time)
{
- Main *bmain= G.main;
Scene *sce;
unsigned int lay;
dag_current_scene_layers(bmain, &sce, &lay);
if(sce)
- DAG_scene_flush_update(sce, lay, time);
+ DAG_scene_flush_update(bmain, sce, lay, time);
}
-void DAG_on_load_update(void)
+void DAG_on_load_update(Main *bmain)
{
- Main *bmain= G.main;
Scene *scene, *sce;
Base *base;
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)
@@ -2232,11 +2262,13 @@ void DAG_on_load_update(void)
}
}
- for(group= G.main->group.first; group; group= group->id.next) {
+ for(group= bmain->group.first; group; group= group->id.next) {
if(group->id.flag & LIB_DOIT) {
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;
@@ -2244,7 +2276,17 @@ void DAG_on_load_update(void)
}
/* now tag update flags, to ensure deformers get calculated on redraw */
- DAG_scene_update_flags(scene, lay);
+ DAG_scene_update_flags(bmain, scene, lay);
+ }
+}
+
+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;
}
}
@@ -2264,7 +2306,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) {
@@ -2272,15 +2314,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;
+ }
}
}
@@ -2289,25 +2326,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);
}
}
@@ -2320,7 +2376,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);
}
}
@@ -2332,7 +2388,7 @@ void DAG_id_flush_update(ID *id, short flag)
}
/* flush to other objects that depend on this one */
- DAG_scene_flush_update(sce, lay, 0);
+ DAG_scene_flush_update(bmain, sce, lay, 0);
}
/* recursively descends tree, each node only checked once */
@@ -2400,7 +2456,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 {
@@ -2415,7 +2471,7 @@ void DAG_id_update_flags(ID *id)
}
/* set recalcs and flushes */
- DAG_scene_update_flags(sce, lay);
+ DAG_scene_update_flags(bmain, sce, lay);
/* now we clear recalcs, unless color is set */
for(node = sce->theDag->DagNode.first; node; node= node->next) {
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index c65fac7d474..a44c5ace298 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -39,6 +39,7 @@
#include "DNA_curve_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
#include "DNA_material_types.h"
#include "BLI_blenlib.h"
@@ -63,6 +64,7 @@
#include "BLO_sys_types.h" // for intptr_t support
+#include "ED_curve.h" /* for BKE_curve_nurbs */
static void boundbox_displist(Object *ob);
@@ -152,7 +154,7 @@ void copy_displist(ListBase *lbn, ListBase *lb)
}
}
-void addnormalsDispList(Object *ob, ListBase *lb)
+void addnormalsDispList(ListBase *lb)
{
DispList *dl = NULL;
float *vdata, *ndata, nor[3];
@@ -196,10 +198,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;
@@ -575,9 +577,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];
@@ -688,8 +690,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);
@@ -704,8 +705,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];
@@ -742,8 +742,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];
@@ -895,7 +894,7 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase)
data= dl->verts;
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;
@@ -925,7 +924,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;
@@ -1019,6 +1018,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;
@@ -1095,13 +1097,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);
}
@@ -1113,7 +1115,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);
}
}
@@ -1127,7 +1129,7 @@ float calc_taper(Scene *scene, Object *taperobj, int cur, int tot)
Curve *cu;
DispList *dl;
- if(taperobj==NULL) return 1.0;
+ if(taperobj==NULL || taperobj->type!=OB_CURVE) return 1.0;
cu= taperobj->data;
dl= cu->disp.first;
@@ -1169,20 +1171,30 @@ 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);
}
+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);
@@ -1211,7 +1223,7 @@ static void curve_calc_modifiers_pre(Scene *scene, Object *ob, int forRender, fl
ModifierData *md = modifiers_getVirtualModifierList(ob);
ModifierData *preTesselatePoint;
Curve *cu= ob->data;
- ListBase *nurb= cu->editnurb?cu->editnurb:&cu->nurb;
+ ListBase *nurb= BKE_curve_nurbs(cu);
int numVerts = 0;
int editmode = (!forRender && cu->editnurb);
float (*originalVerts)[3] = NULL;
@@ -1274,19 +1286,51 @@ static void curve_calc_modifiers_pre(Scene *scene, Object *ob, int forRender, fl
*numVerts_r = numVerts;
}
+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;
+ ListBase *nurb= BKE_curve_nurbs(cu);
+ int required_mode = 0, totvert = 0;
int editmode = (!forRender && cu->editnurb);
DerivedMesh *dm= NULL, *ndm;
- float (*dmDeformedVerts)[3] = NULL;
- int numVerts;
+ float (*vertCos)[3] = NULL;
if(forRender) required_mode = eModifierMode_Render;
else required_mode = eModifierMode_Realtime;
@@ -1311,47 +1355,22 @@ static void curve_calc_modifiers_post(Scene *scene, Object *ob, ListBase *dispba
if ((md->mode & required_mode) != required_mode) continue;
if (mti->isDisabled && mti->isDisabled(md, forRender)) continue;
- if(md->type==eModifierType_Curve && !dm) {
- /* need to put all verts in 1 block for curve deform */
- float *allverts = NULL, *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;
- }
-
- mti->deformVerts(md, ob, NULL, (float(*)[3]) allverts, totvert, forRender, editmode);
-
- if (allverts) {
- 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;
- }
- MEM_freeN(allverts);
- }
- } else if (mti->type == eModifierTypeType_OnlyDeform ||
+ if (mti->type == eModifierTypeType_OnlyDeform ||
(mti->type == eModifierTypeType_DeformOrConstruct && !dm)) {
if (dm) {
- if (!dmDeformedVerts) {
- numVerts = dm->getNumVerts(dm);
- dmDeformedVerts =
- MEM_mallocN(sizeof(*dmDeformedVerts) * numVerts, "dfmv");
- dm->getVertCos(dm, dmDeformedVerts);
+ if (!vertCos) {
+ totvert = dm->getNumVerts(dm);
+ vertCos = MEM_mallocN(sizeof(*vertCos) * totvert, "dfmv");
+ dm->getVertCos(dm, vertCos);
}
- mti->deformVerts(md, ob, dm, dmDeformedVerts, numVerts, forRender, editmode);
+ mti->deformVerts(md, ob, dm, vertCos, totvert, forRender, editmode);
} else {
- for (dl=dispbase->first; dl; dl=dl->next) {
- mti->deformVerts(md, ob, dm, (float(*)[3]) dl->verts, (dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr, forRender, editmode);
+ if (!vertCos) {
+ vertCos= displist_get_allverts(dispbase, &totvert);
}
+
+ mti->deformVerts(md, ob, NULL, vertCos, totvert, forRender, editmode);
}
} else {
if (!derivedFinal) {
@@ -1362,29 +1381,34 @@ static void curve_calc_modifiers_post(Scene *scene, Object *ob, ListBase *dispba
}
if (dm) {
- if (dmDeformedVerts) {
+ if (vertCos) {
DerivedMesh *tdm = CDDM_copy(dm);
dm->release(dm);
dm = tdm;
- CDDM_apply_vert_coords(dm, dmDeformedVerts);
+ 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);
- if(dmDeformedVerts) {
- CDDM_apply_vert_coords(dm, dmDeformedVerts);
- CDDM_calc_normals(dm);
- }
-
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) {
@@ -1393,23 +1417,24 @@ static void curve_calc_modifiers_post(Scene *scene, Object *ob, ListBase *dispba
if (dm && dm != ndm) /* Modifier */
dm->release (dm);
dm = ndm;
-
- if (dmDeformedVerts) {
- MEM_freeN(dmDeformedVerts);
- dmDeformedVerts= NULL;
- }
}
}
}
- if(dm && dmDeformedVerts) {
- DerivedMesh *tdm = CDDM_copy(dm);
- dm->release(dm);
- dm = tdm;
+ if (vertCos) {
+ if (dm) {
+ DerivedMesh *tdm = CDDM_copy(dm);
+ dm->release(dm);
+ dm = tdm;
- CDDM_apply_vert_coords(dm, dmDeformedVerts);
- CDDM_calc_normals(dm);
- MEM_freeN(dmDeformedVerts);
+ 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) {
@@ -1567,9 +1592,9 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase,
int numVerts;
float (*originalVerts)[3];
float (*deformedVerts)[3];
-
+
if(!forRender && cu->editnurb)
- nubase= cu->editnurb;
+ nubase= ED_curve_editnurbs(cu);
else
nubase= &cu->nurb;
@@ -1598,7 +1623,7 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase,
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);
@@ -1657,19 +1682,7 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
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;
+ nubase= BKE_curve_nurbs(cu);
BLI_freelistN(&(cu->bev));
@@ -1842,6 +1855,12 @@ void makeDispListCurveTypes(Scene *scene, Object *ob, int forOrco)
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;
+ }
}
}
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index 118f4885af4..6f6d405dd90 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);
}
@@ -433,9 +433,8 @@ static float eff_calc_visibility(ListBase *colliders, EffectorCache *eff, Effect
if(!colls)
return visibility;
-
- VECCOPY(norm, efd->vec_to_point);
- negate_v3(norm);
+
+ negate_v3_v3(norm, efd->vec_to_point);
len = normalize_v3(norm);
// check all collision objects
@@ -576,10 +575,10 @@ int closest_point_on_surface(SurfaceModifierData *surmd, float *co, float *surfa
MFace *mface = CDDM_get_face(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 +599,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);
@@ -663,8 +662,7 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
where_is_object_time(eff->scene, ob, cfra);
/* use z-axis as normal*/
- VECCOPY(efd->nor, ob->obmat[2]);
- normalize_v3(efd->nor);
+ normalize_v3_v3(efd->nor, ob->obmat[2]);
/* for vortex the shape chooses between old / new force */
if(eff->pd && eff->pd->shape == PFIELD_SHAPE_PLANE) {
@@ -708,8 +706,7 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
else {
/* for some effectors we need the object center every time */
sub_v3_v3v3(efd->vec_to_point2, point->loc, eff->ob->obmat[3]);
- VECCOPY(efd->nor2, eff->ob->obmat[2]);
- normalize_v3(efd->nor2);
+ normalize_v3_v3(efd->nor2, eff->ob->obmat[2]);
}
}
@@ -777,10 +774,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 +788,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 +824,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 +871,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 +890,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,7 +947,7 @@ 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);
}
}
diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c
index 91c5a633ff6..cdefbb54ecf 100644
--- a/source/blender/blenkernel/intern/exotic.c
+++ b/source/blender/blenkernel/intern/exotic.c
@@ -4071,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 5bfef86b7c6..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"
@@ -234,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.
@@ -1401,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 118a44507c9..04ce6c39694 100644
--- a/source/blender/blenkernel/intern/fluidsim.c
+++ b/source/blender/blenkernel/intern/fluidsim.c
@@ -50,7 +50,6 @@
#include "BKE_global.h"
#include "BKE_modifier.h"
#include "BKE_mesh.h"
-#include "BKE_pointcache.h"
#include "BKE_utildefines.h"
// headers for fluidsim bobj meshes
@@ -62,556 +61,15 @@
/* ************************* 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 |= 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;
-}
-
-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);
-
- 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);
-
- 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_faces(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_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_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->getFaceArray(orgdm);
- mat_nr = mface[0].mat_nr;
- flag = mface[0].flag;
-
- mface = dm->getFaceArray(dm);
- numfaces = dm->getNumFaces(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,
+void initElbeemMesh(struct Scene *scene, struct Object *ob,
+ int *numVertices, float **vertices,
int *numTriangles, int **triangles,
- int useGlobalCoords, int modifierIndex)
+ int useGlobalCoords, int modifierIndex)
{
DerivedMesh *dm = NULL;
MVert *mvert;
@@ -650,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++;
}
}
@@ -665,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 d4a5b5b2531..f63b58fe489 100644
--- a/source/blender/blenkernel/intern/fmodifier.c
+++ b/source/blender/blenkernel/intern/fmodifier.c
@@ -32,10 +32,6 @@
#include <string.h>
#include <float.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "MEM_guardedalloc.h"
#include "DNA_anim_types.h"
@@ -47,10 +43,6 @@
#include "BKE_idprop.h"
#include "BKE_utildefines.h"
-#ifndef DISABLE_PYTHON
-#include "BPY_extern.h" /* for BPY_pydriver_eval() */
-#endif
-
#define SMALL -1.0e-10
#define SELECT 1
@@ -1095,13 +1087,6 @@ int remove_fmodifier (ListBase *modifiers, FModifier *fcm)
}
}
-/* Remove and free the nth F-Modifier from the given stack */
-int remove_fmodifier_index (ListBase *modifiers, int index)
-{
- FModifier *fcm= BLI_findlink(modifiers, index);
- return remove_fmodifier(modifiers, fcm);
-}
-
/* Remove all of a given F-Curve's modifiers */
void free_fmodifiers (ListBase *modifiers)
{
@@ -1197,7 +1182,7 @@ short list_has_suitable_fmodifier (ListBase *modifiers, int mtype, short acttype
* - this step acts as an optimisation to prevent the F-Curve stack being evaluated
* several times by modifiers requesting the time be modified, as the final result
* would have required using the modified time
- * - modifiers only ever recieve the unmodified time, as subsequent modifiers should be
+ * - modifiers only ever receive the unmodified time, as subsequent modifiers should be
* working on the 'global' result of the modified curve, not some localised segment,
* so nevaltime gets set to whatever the last time-modifying modifier likes...
* - we start from the end of the stack, as only the last one matters for now
diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c
index 9b8c05ac88c..39b74be3d40 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"
@@ -49,6 +46,7 @@
#include "DNA_curve_types.h"
#include "DNA_vfont_types.h"
#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
#include "BKE_utildefines.h"
@@ -125,8 +123,8 @@ wcsleninu8(wchar_t *src)
return len;
}
-int
-static utf8slen(char *src)
+static int
+utf8slen(char *src)
{
int size = 0, index = 0;
unsigned char c;
@@ -430,12 +428,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);
@@ -453,6 +451,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;
@@ -527,14 +536,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)
@@ -601,9 +603,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;
@@ -639,6 +655,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;
@@ -720,7 +750,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;
@@ -733,18 +763,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
@@ -756,12 +789,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) {
@@ -784,14 +812,10 @@ 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) {
+ if((tb->w != 0.0) && (ct->dobreak==0) && ((xof-(tb->x/cu->fsize)+twidth)*cu->fsize) > tb->w + cu->xof*cu->fsize) {
// fprintf(stderr, "linewidth exceeded: %c%c%c...\n", mem[i], mem[i+1], mem[i+2]);
for (j=i; j && (mem[j] != '\n') && (mem[j] != '\r') && (chartransdata[j].dobreak==0); j--) {
if (mem[j]==' ' || mem[j]=='-') {
@@ -802,13 +826,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--;
@@ -832,7 +856,7 @@ 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))) &&
+ ((-(yof-(tb->y/cu->fsize))) > ((tb->h/cu->fsize)-(linedist*cu->fsize)) - cu->yof) &&
(cu->totbox > (curbox+1)) ) {
maxlen= 0;
tb++;
@@ -885,10 +909,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;
@@ -1019,19 +1040,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? */
@@ -1041,8 +1053,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);
@@ -1155,24 +1167,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,
@@ -1188,18 +1195,14 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
ascii = mem[i];
info = &(custrinfo[i]);
if (cu->sepchar == (i+1)) {
- float vecyo[3];
+ float vecyo[3]= {ct->xof, ct->yof, 0.0f};
mem[0] = ascii;
mem[1] = 0;
custrinfo[0]= *info;
cu->pos = 1;
cu->len = 1;
- vecyo[0] = ct->xof;
- vecyo[1] = ct->yof;
- vecyo[2] = 0;
- mul_m4_v3(ob->obmat, vecyo);
- VECCOPY(ob->loc, vecyo);
+ mul_v3_m4v3(ob->loc, ob->obmat, vecyo);
outta = 1;
cu->sepchar = 0;
}
diff --git a/source/blender/blenkernel/intern/group.c b/source/blender/blenkernel/intern/group.c
index 5f35ab87cb2..bdf203119c3 100644
--- a/source/blender/blenkernel/intern/group.c
+++ b/source/blender/blenkernel/intern/group.c
@@ -29,6 +29,7 @@
#include <stdio.h>
#include <string.h>
+#include <math.h>
#include "MEM_guardedalloc.h"
@@ -48,10 +49,6 @@
#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);
@@ -72,21 +69,22 @@ void free_group_objects(Group *group)
void unlink_group(Group *group)
{
+ Main *bmain= G.main;
Material *ma;
Object *ob;
Scene *sce;
SceneRenderLayer *srl;
ParticleSystem *psys;
- for(ma= G.main->mat.first; ma; ma= ma->id.next) {
+ for(ma= bmain->mat.first; ma; ma= ma->id.next) {
if(ma->group==group)
ma->group= NULL;
}
- for(ma= G.main->mat.first; ma; ma= ma->id.next) {
+ for(ma= bmain->mat.first; ma; ma= ma->id.next) {
if(ma->group==group)
ma->group= NULL;
}
- for (sce= G.main->scene.first; sce; sce= sce->id.next) {
+ for (sce= bmain->scene.first; sce; sce= sce->id.next) {
Base *base= sce->base.first;
/* ensure objects are not in this group */
@@ -103,7 +101,7 @@ void unlink_group(Group *group)
}
}
- for(ob= G.main->object.first; ob; ob= ob->id.next) {
+ for(ob= bmain->object.first; ob; ob= ob->id.next) {
bActionStrip *strip;
if(ob->dup_group==group) {
@@ -283,6 +281,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)
@@ -322,6 +321,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 */
@@ -331,13 +331,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) {
@@ -356,7 +361,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 5580c73099e..78306705d6b 100644
--- a/source/blender/blenkernel/intern/icons.c
+++ b/source/blender/blenkernel/intern/icons.c
@@ -32,16 +32,13 @@
#include <stdlib.h>
#include <string.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "MEM_guardedalloc.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"
@@ -105,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()
@@ -124,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;
}
@@ -179,6 +177,9 @@ void BKE_previewimg_free_id(ID *id)
} else if (GS(id->name) == ID_IM) {
Image *img = (Image*)id;
BKE_previewimg_free(&img->preview);
+ } else if (GS(id->name) == ID_BR) {
+ Brush *br = (Brush*)id;
+ BKE_previewimg_free(&br->preview);
}
}
@@ -206,7 +207,11 @@ PreviewImage* BKE_previewimg_get(ID *id)
Image *img = (Image*)id;
if (!img->preview) img->preview = BKE_previewimg_create();
prv_img = img->preview;
- }
+ } else if (GS(id->name) == ID_BR) {
+ Brush *br = (Brush*)id;
+ if (!br->preview) br->preview = BKE_previewimg_create();
+ prv_img = br->preview;
+ }
return prv_img;
}
@@ -228,6 +233,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/idcode.c b/source/blender/blenkernel/intern/idcode.c
new file mode 100644
index 00000000000..6411959e655
--- /dev/null
+++ b/source/blender/blenkernel/intern/idcode.c
@@ -0,0 +1,128 @@
+/**
+ * $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 *****
+ * return info about ID types
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "DNA_ID.h"
+
+typedef struct {
+ unsigned short code;
+ 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", "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", "grease_pencil",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},
+};
+static int nidtypes= sizeof(idtypes)/sizeof(idtypes[0]);
+
+static IDType *idtype_from_name(const char *str)
+{
+ int i= nidtypes;
+
+ while (i--)
+ if (strcmp(str, idtypes[i].name)==0)
+ return &idtypes[i];
+
+ return NULL;
+}
+static IDType *idtype_from_code(int code)
+{
+ int i= nidtypes;
+
+ while (i--)
+ if (code==idtypes[i].code)
+ return &idtypes[i];
+
+ return NULL;
+}
+
+int BKE_idcode_is_valid(int code)
+{
+ return idtype_from_code(code)?1:0;
+}
+
+int BKE_idcode_is_linkable(int code) {
+ IDType *idt= idtype_from_code(code);
+ return idt?(idt->flags&IDTYPE_FLAGS_ISLINKABLE):0;
+}
+
+const char *BKE_idcode_to_name(int code)
+{
+ IDType *idt= idtype_from_code(code);
+
+ return idt?idt->name:NULL;
+}
+
+int BKE_idcode_from_name(const char *name)
+{
+ IDType *idt= idtype_from_name(name);
+
+ return idt?idt->code:0;
+}
+
+const char *BKE_idcode_to_name_plural(int code)
+{
+ IDType *idt= idtype_from_code(code);
+
+ return idt?idt->plural:NULL;
+}
diff --git a/source/blender/blenkernel/intern/idprop.c b/source/blender/blenkernel/intern/idprop.c
index 98b3522059c..a0df73d6c42 100644
--- a/source/blender/blenkernel/intern/idprop.c
+++ b/source/blender/blenkernel/intern/idprop.c
@@ -27,6 +27,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <stddef.h>
#include <string.h>
#include "BKE_idprop.h"
@@ -299,6 +300,34 @@ IDProperty *IDP_CopyArray(IDProperty *prop)
/* ---------- 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);
@@ -312,14 +341,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)
@@ -458,47 +492,41 @@ void IDP_ReplaceGroupInGroup(IDProperty *dest, IDProperty *src)
void IDP_ReplaceInGroup(IDProperty *group, IDProperty *prop)
{
IDProperty *loop;
- for (loop=group->data.group.first; loop; loop=loop->next) {
- if (BSTR_EQ(loop->name, prop->name)) {
- BLI_insertlink(&group->data.group, loop, prop);
-
- BLI_remlink(&group->data.group, loop);
- IDP_FreeProperty(loop);
- MEM_freeN(loop);
- return;
- }
+ if((loop= IDP_GetPropertyFromGroup(group, prop->name))) {
+ BLI_insertlink(&group->data.group, loop, prop);
+
+ BLI_remlink(&group->data.group, loop);
+ IDP_FreeProperty(loop);
+ MEM_freeN(loop);
+ }
+ else {
+ group->len++;
+ BLI_addtail(&group->data.group, prop);
}
-
- group->len++;
- BLI_addtail(&group->data.group, prop);
}
/*returns 0 if an id property with the same name exists and it failed,
or 1 if it succeeded in adding to the group.*/
int IDP_AddToGroup(IDProperty *group, IDProperty *prop)
{
- IDProperty *loop;
- for (loop=group->data.group.first; loop; loop=loop->next) {
- if (BSTR_EQ(loop->name, prop->name)) return 0;
+ if(IDP_GetPropertyFromGroup(group, prop->name) == NULL) {
+ group->len++;
+ BLI_addtail(&group->data.group, prop);
+ return 1;
}
- group->len++;
- BLI_addtail(&group->data.group, prop);
-
- return 1;
+ return 0;
}
int IDP_InsertToGroup(IDProperty *group, IDProperty *previous, IDProperty *pnew)
{
- IDProperty *loop;
- for (loop=group->data.group.first; loop; loop=loop->next) {
- if (BSTR_EQ(loop->name, pnew->name)) return 0;
+ if(IDP_GetPropertyFromGroup(group, pnew->name) == NULL) {
+ group->len++;
+ BLI_insertlink(&group->data.group, previous, pnew);
+ return 1;
}
-
- group->len++;
- BLI_insertlink(&group->data.group, previous, pnew);
- return 1;
+ return 0;
}
void IDP_RemFromGroup(IDProperty *group, IDProperty *prop)
@@ -509,11 +537,7 @@ void IDP_RemFromGroup(IDProperty *group, IDProperty *prop)
IDProperty *IDP_GetPropertyFromGroup(IDProperty *prop, const char *name)
{
- IDProperty *loop;
- for (loop=prop->data.group.first; loop; loop=loop->next) {
- if (strcmp(loop->name, name)==0) return loop;
- }
- return NULL;
+ return (IDProperty *)BLI_findstring(&prop->data.group, name, offsetof(IDProperty, name));
}
typedef struct IDPIter {
@@ -709,9 +733,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 55dcc38ebcf..0e282aa6449 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -1,4 +1,4 @@
-/* image.c
+/* image.c
*
* $Id$
*
@@ -92,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;
@@ -252,9 +200,9 @@ void free_image(Image *ima)
}
BKE_icon_delete(&ima->id);
ima->id.icon_id = 0;
- if (ima->preview) {
- BKE_previewimg_free(&ima->preview);
- }
+
+ BKE_previewimg_free(&ima->preview);
+
for(a=0; a<IMA_MAX_RENDER_SLOT; a++) {
if(ima->renders[a]) {
RE_FreeRenderResult(ima->renders[a]);
@@ -339,17 +287,25 @@ static void image_assign_ibuf(Image *ima, ImBuf *ibuf, int index, int frame)
}
/* empty image block, of similar type and filename */
-Image *BKE_image_copy(Image *ima)
+Image *copy_image(Image *ima)
{
- Image *new= image_alloc(ima->id.name+2, ima->source, ima->type);
+ Image *nima= image_alloc(ima->id.name+2, ima->source, ima->type);
- BLI_strncpy(new->name, ima->name, sizeof(ima->name));
-
- new->gen_x= ima->gen_x;
- new->gen_y= ima->gen_y;
- new->gen_type= ima->gen_type;
+ BLI_strncpy(nima->name, ima->name, sizeof(ima->name));
+
+ nima->flag= ima->flag;
+ nima->tpageflag= ima->tpageflag;
- return new;
+ nima->gen_x= ima->gen_x;
+ nima->gen_y= ima->gen_y;
+ nima->gen_type= ima->gen_type;
+
+ nima->animspeed= ima->animspeed;
+
+ nima->aspx= ima->aspx;
+ nima->aspy= ima->aspy;
+
+ return nima;
}
void BKE_image_merge(Image *dest, Image *source)
@@ -380,13 +336,6 @@ 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_path_abs(str, G.sce);
@@ -432,18 +381,18 @@ 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;
unsigned char *rect= NULL;
float *rect_float= NULL;
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;
}
@@ -465,7 +414,7 @@ static ImBuf *add_ibuf_size(int width, int height, char *name, int floatbuf, sho
}
/* 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])
{
/* on save, type is changed to FILE in editsima.c */
Image *ima= image_alloc(name, IMA_SRC_GENERATED, IMA_TYPE_UV_TEST);
@@ -478,7 +427,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;
@@ -492,10 +441,8 @@ Image *BKE_add_image_imbuf(ImBuf *ibuf)
{
/* on save, type is changed to FILE in editsima.c */
Image *ima;
- char filename[sizeof(ibuf->name)];
- BLI_split_dirfile(ibuf->name, NULL, filename);
- ima= image_alloc(filename, IMA_SRC_FILE, IMA_TYPE_IMAGE);
+ ima= image_alloc(BLI_path_basename(ibuf->name), IMA_SRC_FILE, IMA_TYPE_IMAGE);
if (ima) {
BLI_strncpy(ima->name, ibuf->name, FILE_MAX);
@@ -713,8 +660,10 @@ int BKE_imtype_to_ftype(int imtype)
return TGA;
else if(imtype== R_IRIS)
return IMAGIC;
+#ifdef WITH_HDR
else if (imtype==R_RADHDR)
return RADHDR;
+#endif
else if (imtype==R_PNG)
return PNG;
#ifdef WITH_DDS
@@ -723,20 +672,22 @@ int BKE_imtype_to_ftype(int imtype)
#endif
else if (imtype==R_BMP)
return BMP;
+#ifdef WITH_TIFF
else if (imtype==R_TIFF)
return TIF;
+#endif
else if (imtype==R_OPENEXR || imtype==R_MULTILAYER)
return OPENEXR;
+#ifdef WITH_CINEON
else if (imtype==R_CINEON)
return CINEON;
else if (imtype==R_DPX)
return DPX;
+#endif
else if (imtype==R_TARGA)
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;
@@ -751,8 +702,10 @@ int BKE_ftype_to_imtype(int ftype)
return TGA;
else if(ftype == IMAGIC)
return R_IRIS;
+#ifdef WITH_HDR
else if (ftype & RADHDR)
return R_RADHDR;
+#endif
else if (ftype & PNG)
return R_PNG;
#ifdef WITH_DDS
@@ -761,20 +714,22 @@ int BKE_ftype_to_imtype(int ftype)
#endif
else if (ftype & BMP)
return R_BMP;
+#ifdef WITH_TIFF
else if (ftype & TIF)
return R_TIFF;
+#endif
else if (ftype & OPENEXR)
return R_OPENEXR;
+#ifdef WITH_CINEON
else if (ftype & CINEON)
return R_CINEON;
else if (ftype & DPX)
return R_DPX;
+#endif
else if (ftype & TGA)
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;
@@ -787,7 +742,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:
@@ -814,10 +768,12 @@ void BKE_add_image_extension(char *string, int imtype)
if(!BLI_testextensie(string, ".rgb"))
extension= ".rgb";
}
+#ifdef WITH_HDR
else if(imtype==R_RADHDR) {
if(!BLI_testextensie(string, ".hdr"))
extension= ".hdr";
}
+#endif
else if (ELEM5(imtype, R_PNG, R_FFMPEG, R_H264, R_THEORA, R_XVID)) {
if(!BLI_testextensie(string, ".png"))
extension= ".png";
@@ -836,16 +792,19 @@ 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"))
extension= ".exr";
}
#endif
+#ifdef WITH_CINEON
else if(imtype==R_CINEON){
if (!BLI_testextensie(string, ".cin"))
extension= ".cin";
@@ -854,6 +813,7 @@ void BKE_add_image_extension(char *string, int imtype)
if (!BLI_testextensie(string, ".dpx"))
extension= ".dpx";
}
+#endif
else if(imtype==R_TARGA) {
if(!BLI_testextensie(string, ".tga"))
extension= ".tga";
@@ -864,7 +824,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";
}
@@ -1019,17 +979,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
-void stamp_font_begin(int size)
-{
- static int mono= -1;
+// XXX - copied from text_font_begin ! Change all the BLF_* here
+static int mono= -1;
+int stamp_font_begin(int size)
+{
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)
@@ -1037,6 +997,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;
@@ -1049,24 +1010,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;
@@ -1074,14 +1043,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;
@@ -1089,14 +1058,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;
@@ -1104,14 +1073,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;
@@ -1119,14 +1088,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;
@@ -1134,73 +1103,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)
@@ -1212,29 +1180,39 @@ 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)
{
int ok;
- if(imtype==0);
- else if(imtype== R_IRIS)
+ if(imtype==0) {
+ /* pass */
+ }
+ else if(imtype== R_IRIS) {
ibuf->ftype= IMAGIC;
+ }
+#ifdef WITH_HDR
else if ((imtype==R_RADHDR)) {
ibuf->ftype= RADHDR;
}
+#endif
else if (ELEM5(imtype, R_PNG, R_FFMPEG, R_H264, R_THEORA, R_XVID)) {
ibuf->ftype= PNG;
+
+ if(imtype==R_PNG)
+ ibuf->ftype |= quality; /* quality is actually compression 0-100 --> 0-9 */
+
}
#ifdef WITH_DDS
else if ((imtype==R_DDS)) {
@@ -1244,12 +1222,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;
@@ -1262,21 +1242,20 @@ int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, char *name, int imtype, int subimt
}
#endif
+#ifdef WITH_CINEON
else if (imtype==R_CINEON) {
ibuf->ftype = CINEON;
}
else if (imtype==R_DPX) {
ibuf->ftype = DPX;
}
+#endif
else if (imtype==R_TARGA) {
ibuf->ftype= TGA;
}
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;
@@ -1300,7 +1279,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 */
@@ -1596,6 +1575,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)
@@ -1608,12 +1588,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_path_abs(name, ima->id.lib->filename);
+ BLI_path_abs(name, ima->id.lib->filepath);
else
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) {
@@ -1633,10 +1617,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;
@@ -1715,11 +1695,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_path_abs(str, ima->id.lib->filename);
+ BLI_path_abs(str, ima->id.lib->filepath);
else
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)
@@ -1750,33 +1730,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_path_abs(str, ima->id.lib->filename);
+ BLI_path_abs(str, ima->id.lib->filepath);
else
BLI_path_abs(str, G.sce);
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) {
@@ -1798,9 +1785,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;
@@ -1878,10 +1862,13 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
layer= (iuser)? iuser->layer: 0;
pass= (iuser)? iuser->pass: 0;
- if(from_render)
+ if(from_render) {
RE_AcquireResultImage(re, &rres);
- else if(ima->renders[ima->render_slot])
+ }
+ 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));
@@ -1903,10 +1890,10 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
rectz= rres.rectz;
dither= iuser->scene->r.dither_intensity;
- /* get compo/seq result by default */
- if(rres.compo_seq && layer==0);
+ /* 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.compo_seq?1:0));
+ RenderLayer *rl= BLI_findlink(&rres.layers, layer-(rres.have_combined?1:0));
if(rl) {
RenderPass *rpass;
@@ -1929,9 +1916,6 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
}
}
- if(!(rectf || rect))
- return NULL;
-
ibuf= image_get_ibuf(ima, IMA_NO_INDEX, 0);
/* make ibuf if needed, and initialize it */
@@ -1949,11 +1933,25 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
if(rect)
ibuf->rect= rect;
- ibuf->rect_float= rectf;
- ibuf->flags |= IB_rectfloat;
- ibuf->channels= channels;
- ibuf->zbuf_float= rectz;
- ibuf->flags |= IB_zbuffloat;
+ if(rectf) {
+ ibuf->rect_float= rectf;
+ ibuf->flags |= IB_rectfloat;
+ ibuf->channels= channels;
+ }
+ else {
+ ibuf->rect_float= NULL;
+ ibuf->flags &= ~IB_rectfloat;
+ }
+
+ 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;
@@ -1981,8 +1979,14 @@ static ImBuf *image_get_ibuf_threadsafe(Image *ima, ImageUser *iuser, int *frame
ibuf= image_get_ibuf(ima, 0, frame);
/* XXX temp stuff? */
- if(ima->lastframe != frame)
+ if(ima->lastframe != frame) {
ima->tpageflag |= IMA_TPAGE_REFRESH;
+ if(ibuf) {
+ /* without this the image name only updates
+ * on first load which is quite confusing */
+ BLI_strncpy(ima->name, ibuf->name, sizeof(ima->name));
+ }
+ }
ima->lastframe = frame;
}
else if(ima->type==IMA_TYPE_MULTILAYER) {
@@ -2108,7 +2112,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;
}
diff --git a/source/blender/blenkernel/intern/image_gen.c b/source/blender/blenkernel/intern/image_gen.c
index eb256e3775b..9248ce69280 100644
--- a/source/blender/blenkernel/intern/image_gen.c
+++ b/source/blender/blenkernel/intern/image_gen.c
@@ -24,6 +24,7 @@
*/
#include <math.h>
+#include <stdlib.h>
#include "BLI_math_color.h"
#include "BLF_api.h"
@@ -297,17 +298,17 @@ static void checker_board_grid_fill(unsigned char *rect, float *rect_float, int
}
/* defined in image.c */
-extern void stamp_font_begin(int size);
+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;
+ int x, y, mono;
int pen_x, pen_y;
char text[3]= {'A', '1', '\0'};
/* hard coded size! */
- stamp_font_begin(54);
- BLF_buffer(rect_float, rect, width, height, 4);
+ mono= stamp_font_begin(54);
+ BLF_buffer(mono, rect_float, rect, width, height, 4);
for(y= 0; y < height; y+=step)
{
@@ -320,29 +321,29 @@ static void checker_board_text(unsigned char *rect, float *rect_float, int width
pen_y = y + 44;
/* terribly crappy outline font! */
- BLF_buffer_col(1.0, 1.0, 1.0, 1.0);
-
- BLF_position(pen_x-outline, pen_y, 0.0);
- BLF_draw_buffer(text);
- BLF_position(pen_x+outline, pen_y, 0.0);
- BLF_draw_buffer(text);
- BLF_position(pen_x, pen_y-outline, 0.0);
- BLF_draw_buffer(text);
- BLF_position(pen_x, pen_y+outline, 0.0);
- BLF_draw_buffer(text);
+ 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(pen_x-outline, pen_y-outline, 0.0);
- BLF_draw_buffer(text);
- BLF_position(pen_x+outline, pen_y+outline, 0.0);
- BLF_draw_buffer(text);
- BLF_position(pen_x-outline, pen_y+outline, 0.0);
- BLF_draw_buffer(text);
- BLF_position(pen_x+outline, pen_y-outline, 0.0);
- BLF_draw_buffer(text);
-
- BLF_buffer_col(0.0, 0.0, 0.0, 1.0);
- BLF_position(pen_x, pen_y, 0.0);
- BLF_draw_buffer(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]++;
}
@@ -350,8 +351,7 @@ static void checker_board_text(unsigned char *rect, float *rect_float, int width
}
/* cleanup the buffer. */
- BLF_buffer(0, 0, 0, 0, 0);
-
+ 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)
diff --git a/source/blender/blenkernel/intern/implicit.c b/source/blender/blenkernel/intern/implicit.c
index c625fb28840..158f964a846 100644
--- a/source/blender/blenkernel/intern/implicit.c
+++ b/source/blender/blenkernel/intern/implicit.c
@@ -29,14 +29,23 @@
#include "MEM_guardedalloc.h"
-#include "BKE_cloth.h"
-
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
#include "DNA_object_force.h"
+#include "DNA_meshdata_types.h"
+#include "BLI_threads.h"
+#include "BLI_math.h"
+#include "BLI_linklist.h"
+
+#include "BKE_cloth.h"
+#include "BKE_collision.h"
#include "BKE_effect.h"
#include "BKE_global.h"
#include "BKE_utildefines.h"
+#define CLOTH_OPENMP_LIMIT 25
+
#ifdef _WIN32
#include <windows.h>
static LARGE_INTEGER _itstart, _itend;
@@ -230,8 +239,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]);
@@ -577,11 +589,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
{
@@ -962,7 +975,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
@@ -1460,6 +1473,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];
@@ -1523,6 +1538,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]);
@@ -1537,6 +1554,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 */
@@ -1608,9 +1626,8 @@ static void cloth_calc_force(ClothModifierData *clmd, float frame, lfVector *lF,
CalcFloat4(lX[mfaces[i].v1],lX[mfaces[i].v2],lX[mfaces[i].v3],lX[mfaces[i].v4],triunnormal);
else
CalcFloat(lX[mfaces[i].v1],lX[mfaces[i].v2],lX[mfaces[i].v3],triunnormal);
-
- VECCOPY(trinormal, triunnormal);
- normalize_v3(trinormal);
+
+ normalize_v3_v3(trinormal, triunnormal);
// add wind from v1
VECCOPY(tmp, trinormal);
@@ -1731,9 +1748,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++)
@@ -1778,60 +1796,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);
@@ -1851,7 +1859,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 cd3326857c7..a24f37bf73a 100644
--- a/source/blender/blenkernel/intern/ipo.c
+++ b/source/blender/blenkernel/intern/ipo.c
@@ -41,10 +41,6 @@
#include <string.h>
#include <stddef.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "MEM_guardedalloc.h"
#include "DNA_anim_types.h"
@@ -58,6 +54,7 @@
#include "DNA_sequence_types.h"
#include "DNA_scene_types.h"
#include "DNA_world_types.h"
+#include "DNA_object_types.h"
#include "BLI_math.h" /* windows needs for M_PI */
#include "BLI_blenlib.h"
@@ -71,7 +68,7 @@
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_nla.h"
-
+#include "BKE_sequencer.h"
/* *************************************************** */
@@ -796,12 +793,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;
@@ -853,19 +850,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) {
@@ -910,7 +907,7 @@ static char *get_rna_access (int blocktype, int adrcode, char actname[], char co
*array_index= dummy_index;
}
- /* append preceeding bits to path */
+ /* append preceding bits to path */
if ((actname && actname[0]) && (constname && constname[0])) {
/* Constraint in Pose-Channel */
sprintf(buf, "pose.bones[\"%s\"].constraints[\"%s\"]", actname, constname);
@@ -923,6 +920,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);
@@ -1067,7 +1069,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;
@@ -1083,8 +1085,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);
@@ -1096,9 +1098,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;
@@ -1115,8 +1117,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;
@@ -1239,7 +1242,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;
@@ -1281,6 +1284,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
@@ -1297,6 +1314,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) {
@@ -1316,7 +1351,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;
@@ -1347,7 +1382,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);
@@ -1355,7 +1390,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... */
@@ -1386,7 +1421,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;
@@ -1407,7 +1442,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;
}
@@ -1419,7 +1454,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;
}
@@ -1440,7 +1475,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};
@@ -1455,8 +1490,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));
}
@@ -1464,7 +1499,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) {
@@ -1506,7 +1541,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);
}
/* ------------------------- */
@@ -1530,7 +1565,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 */
{
@@ -1609,7 +1644,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");
@@ -1617,13 +1651,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 -------------- */
@@ -1643,7 +1676,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;
@@ -1677,7 +1710,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;
}
@@ -1697,7 +1730,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;
}
@@ -1717,7 +1750,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;
}
@@ -1737,7 +1770,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;
}
@@ -1763,7 +1796,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;
}
@@ -1781,7 +1814,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;
}
@@ -1799,27 +1832,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;
}
@@ -1828,24 +1864,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
}
}
@@ -1862,7 +1899,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;
}
@@ -1880,7 +1917,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;
}
@@ -1898,12 +1935,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
@@ -1922,7 +1977,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 */
@@ -1937,7 +1992,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 */
@@ -1948,6 +2003,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 31b0a809ebe..708403ab1f7 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
+#include "BLI_math_vector.h"
#include "DNA_anim_types.h"
#include "DNA_key_types.h"
@@ -49,6 +50,7 @@
#include "BKE_animsys.h"
#include "BKE_curve.h"
#include "BKE_customdata.h"
+#include "BKE_deform.h"
#include "BKE_global.h"
#include "BKE_key.h"
#include "BKE_lattice.h"
@@ -60,10 +62,6 @@
#include "RNA_access.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#define KEY_BPOINT 1
#define KEY_BEZTRIPLE 2
@@ -545,11 +543,15 @@ static void cp_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
poinsize= ofs[0];
}
else if( GS(key->from->name)==ID_CU ) {
- if(mode==KEY_BPOINT) ofs[0]= sizeof(float)*4;
- else ofs[0]= sizeof(float)*10;
-
+ if(mode==KEY_BPOINT) {
+ ofs[0]= sizeof(float)*4;
+ poinsize= ofs[0];
+ }else {
+ ofs[0]= sizeof(float)*12;
+ poinsize= ofs[0]/3;
+ }
+
ofs[1]= 0;
- poinsize= ofs[0];
}
if(end>tot) end= tot;
@@ -615,7 +617,7 @@ static void cp_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
memcpy(poin, k1, sizeof(float)*4);
break;
case IPO_BEZTRIPLE:
- memcpy(poin, k1, sizeof(float)*10);
+ memcpy(poin, k1, sizeof(float)*12);
break;
}
@@ -647,28 +649,25 @@ static void cp_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
static void cp_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock *kb, int start, int end, char *out, int tot)
{
Nurb *nu;
- char *poin;
int a, step, a1, a2;
for(a=0, nu=cu->nurb.first; nu; nu=nu->next, a+=step) {
if(nu->bp) {
step= nu->pntsu*nu->pntsv;
-
- /* exception because keys prefer to work with complete blocks */
- poin= out - a*sizeof(float)*4;
+
a1= MAX2(a, start);
a2= MIN2(a+step, end);
-
- if(a1<a2) cp_key(a1, a2, tot, poin, key, actkb, kb, NULL, KEY_BPOINT);
+
+ if(a1<a2) cp_key(a1, a2, tot, out, key, actkb, kb, NULL, KEY_BPOINT);
}
else if(nu->bezt) {
step= 3*nu->pntsu;
-
- poin= out - a*sizeof(float)*10;
+
+ /* exception because keys prefer to work with complete blocks */
a1= MAX2(a, start);
a2= MIN2(a+step, end);
- if(a1<a2) cp_key(a1, a2, tot, poin, key, actkb, kb, NULL, KEY_BEZTRIPLE);
+ if(a1<a2) cp_key(a1, a2, tot, out, key, actkb, kb, NULL, KEY_BEZTRIPLE);
}
else
step= 0;
@@ -682,26 +681,34 @@ void do_rel_key(int start, int end, int tot, char *basispoin, Key *key, KeyBlock
int *ofsp, ofs[3], elemsize, b;
char *cp, *poin, *reffrom, *from, elemstr[8];
char *freefrom, *freereffrom;
-
+ int poinsize= 0;
+
if(key->from==NULL) return;
-
+
if( GS(key->from->name)==ID_ME ) {
ofs[0]= sizeof(float)*3;
ofs[1]= 0;
+ poinsize= ofs[0];
}
else if( GS(key->from->name)==ID_LT ) {
ofs[0]= sizeof(float)*3;
ofs[1]= 0;
+ poinsize= ofs[0];
}
else if( GS(key->from->name)==ID_CU ) {
- if(mode==KEY_BPOINT) ofs[0]= sizeof(float)*4;
- else ofs[0]= sizeof(float)*10;
-
+ if(mode==KEY_BPOINT) {
+ ofs[0]= sizeof(float)*4;
+ poinsize= ofs[0];
+ } else {
+ ofs[0]= sizeof(float)*12;
+ poinsize= ofs[0] / 3;
+ }
+
ofs[1]= 0;
}
-
+
if(end>tot) end= tot;
-
+
/* in case of beztriple */
elemstr[0]= 1; /* nr of ipofloats */
elemstr[1]= IPO_BEZTRIPLE;
@@ -733,7 +740,7 @@ void do_rel_key(int start, int end, int tot, char *basispoin, Key *key, KeyBlock
from= key_block_get_data(key, actkb, kb, &freefrom);
reffrom= key_block_get_data(key, actkb, refb, &freereffrom);
- poin+= start*ofs[0];
+ poin+= start*poinsize;
reffrom+= key->elemsize*start; // key elemsize yes!
from+= key->elemsize*start;
@@ -759,7 +766,7 @@ void do_rel_key(int start, int end, int tot, char *basispoin, Key *key, KeyBlock
rel_flerp(4, (float *)poin, (float *)reffrom, (float *)from, weight);
break;
case IPO_BEZTRIPLE:
- rel_flerp(10, (float *)poin, (float *)reffrom, (float *)from, weight);
+ rel_flerp(12, (float *)poin, (float *)reffrom, (float *)from, weight);
break;
}
@@ -806,11 +813,15 @@ static void do_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
poinsize= ofs[0];
}
else if( GS(key->from->name)==ID_CU ) {
- if(mode==KEY_BPOINT) ofs[0]= sizeof(float)*4;
- else ofs[0]= sizeof(float)*10;
-
+ if(mode==KEY_BPOINT) {
+ ofs[0]= sizeof(float)*4;
+ poinsize= ofs[0];
+ } else {
+ ofs[0]= sizeof(float)*12;
+ poinsize= ofs[0] / 3;
+ }
+
ofs[1]= 0;
- poinsize= ofs[0];
}
if(end>tot) end= tot;
@@ -932,7 +943,7 @@ static void do_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
flerp(4, (float *)poin, (float *)k1, (float *)k2, (float *)k3, (float *)k4, t);
break;
case IPO_BEZTRIPLE:
- flerp(10, (void *)poin, (void *)k1, (void *)k2, (void *)k3, (void *)k4, t);
+ flerp(12, (void *)poin, (void *)k1, (void *)k2, (void *)k3, (void *)k4, t);
break;
}
@@ -993,7 +1004,6 @@ static void do_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
static float *get_weights_array(Object *ob, char *vgroup)
{
- bDeformGroup *curdef;
MDeformVert *dvert= NULL;
EditMesh *em= NULL;
EditVert *eve;
@@ -1020,11 +1030,8 @@ static float *get_weights_array(Object *ob, char *vgroup)
if(dvert==NULL) return NULL;
/* find the group (weak loop-in-loop) */
- for (curdef = ob->defbase.first; curdef; curdef=curdef->next, index++)
- if (!strcmp(curdef->name, vgroup))
- break;
-
- if(curdef) {
+ index= defgroup_name_index(ob, vgroup);
+ if(index >= 0) {
float *weights;
int i, j;
@@ -1140,19 +1147,16 @@ static void do_mesh_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
static void do_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock **k, float *t, char *out, int tot)
{
Nurb *nu;
- char *poin;
int a, step;
for(a=0, nu=cu->nurb.first; nu; nu=nu->next, a+=step) {
if(nu->bp) {
step= nu->pntsu*nu->pntsv;
- poin= out - a*sizeof(float)*4;
- do_key(a, a+step, tot, poin, key, actkb, k, t, KEY_BPOINT);
+ do_key(a, a+step, tot, out, key, actkb, k, t, KEY_BPOINT);
}
else if(nu->bezt) {
step= 3*nu->pntsu;
- poin= out - a*sizeof(float)*10;
- do_key(a, a+step, tot, poin, key, actkb, k, t, KEY_BEZTRIPLE);
+ do_key(a, a+step, tot, out, key, actkb, k, t, KEY_BEZTRIPLE);
}
else
step= 0;
@@ -1162,19 +1166,16 @@ static void do_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock **k, float
static void do_rel_cu_key(Curve *cu, Key *key, KeyBlock *actkb, float ctime, char *out, int tot)
{
Nurb *nu;
- char *poin;
int a, step;
for(a=0, nu=cu->nurb.first; nu; nu=nu->next, a+=step) {
if(nu->bp) {
step= nu->pntsu*nu->pntsv;
- poin= out - a*sizeof(float)*3;
do_rel_key(a, a+step, tot, out, key, actkb, KEY_BPOINT);
}
else if(nu->bezt) {
step= 3*nu->pntsu;
- poin= out - a*sizeof(float)*10;
- do_rel_key(a, a+step, tot, poin, key, actkb, KEY_BEZTRIPLE);
+ do_rel_key(a, a+step, tot, out, key, actkb, KEY_BEZTRIPLE);
}
else
step= 0;
@@ -1187,35 +1188,61 @@ static void do_curve_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
KeyBlock *k[4], *actkb= ob_get_keyblock(ob);
float cfra, ctime, t[4], delta;
int a, flag = 0, step = 0;
-
- if(key->slurph) {
- delta= key->slurph;
- delta/= tot;
-
+
+ if(key->slurph && key->type!=KEY_RELATIVE) {
+ Nurb *nu;
+ int mode, i= 0, remain= 0, estep, count;
+
+ delta= (float)key->slurph / tot;
+
step= 1;
if(tot>100 && slurph_opt) {
step= tot/50;
delta*= step;
/* in do_key and cp_key the case a>tot has been handled */
}
-
+
cfra= (float)scene->r.cfra;
-
- for(a=0; a<tot; a+=step, cfra+= delta) {
- ctime= bsystem_time(scene, 0, cfra, 0.0f); // XXX old cruft
-#if 0 // XXX old animation system
- if(calc_ipo_spec(key->ipo, KEY_SPEED, &ctime)==0) {
- ctime /= 100.0;
- CLAMP(ctime, 0.0, 1.0);
+
+ for(nu=cu->nurb.first; nu; nu=nu->next) {
+ if(nu->bp) {
+ mode= KEY_BPOINT;
+ estep= nu->pntsu*nu->pntsv;
+ }
+ else if(nu->bezt) {
+ mode= KEY_BEZTRIPLE;
+ estep= 3*nu->pntsu;
}
-#endif // XXX old animation system
-
- flag= setkeys(ctime, &key->block, k, t, 0);
-
- if(flag==0)
- do_key(a, a+step, tot, (char *)out, key, actkb, k, t, 0);
else
- cp_key(a, a+step, tot, (char *)out, key, actkb, k[2], NULL, 0);
+ step= 0;
+
+ a= 0;
+ while (a < estep) {
+ if (remain <= 0) {
+ cfra+= delta;
+ ctime= bsystem_time(scene, 0, cfra, 0.0f); // XXX old cruft
+
+ ctime /= 100.0f;
+ CLAMP(ctime, 0.0f, 1.0f); // XXX for compat, we use this, but this clamping was confusing
+ flag= setkeys(ctime, &key->block, k, t, 0);
+
+ remain= step;
+ }
+
+ count= MIN2(remain, estep);
+ if (mode == KEY_BEZTRIPLE) {
+ count += 3 - count % 3;
+ }
+
+ if(flag==0)
+ do_key(i, i+count, tot, (char *)out, key, actkb, k, t, mode);
+ else
+ cp_key(i, i+count, tot, (char *)out, key, actkb, k[2], NULL, mode);
+
+ a += count;
+ i += count;
+ remain -= count;
+ }
}
}
else {
@@ -1339,11 +1366,11 @@ float *do_ob_key(Scene *scene, Object *ob)
for(nu=cu->nurb.first; nu; nu=nu->next) {
if(nu->bezt) {
tot += 3*nu->pntsu;
- size += nu->pntsu*10*sizeof(float);
+ size += nu->pntsu*12*sizeof(float);
}
else if(nu->bp) {
tot += nu->pntsu*nu->pntsv;
- size += nu->pntsu*nu->pntsv*10*sizeof(float);
+ size += nu->pntsu*nu->pntsv*12*sizeof(float);
}
}
}
@@ -1509,14 +1536,8 @@ KeyBlock *key_get_keyblock(Key *key, int index)
/* get the appropriate KeyBlock given a name to search for */
KeyBlock *key_get_named_keyblock(Key *key, const char name[])
{
- KeyBlock *kb;
-
- if (key && name) {
- for (kb= key->block.first; kb; kb= kb->next) {
- if (strcmp(name, kb->name)==0)
- return kb;
- }
- }
+ if (key && name)
+ return BLI_findstring(&key->block, name, offsetof(KeyBlock, name));
return NULL;
}
@@ -1723,3 +1744,205 @@ 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);
+ }
+
+ if (tot == 0) {
+ kb->data= NULL;
+ return;
+ }
+
+ fp= kb->data= MEM_callocN(tot*elemsize, "key_to_vertcos vertCos");
+
+ /* 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 b7003f45626..1390f0dbd56 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -44,6 +44,7 @@
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
#include "DNA_lattice_types.h"
#include "DNA_curve_types.h"
#include "DNA_key_types.h"
@@ -59,6 +60,7 @@
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_utildefines.h"
+#include "BKE_deform.h"
//XXX #include "BIF_editdeform.h"
@@ -173,7 +175,7 @@ void resizelattice(Lattice *lt, int uNew, int vNew, int wNew, Object *ltOb)
bp= lt->def;
for (i=0; i<lt->pntsu*lt->pntsv*lt->pntsw; i++,bp++) {
- VECCOPY(bp->vec, vertexCos[i]);
+ copy_v3_v3(bp->vec, vertexCos[i]);
}
MEM_freeN(vertexCos);
@@ -223,8 +225,12 @@ void free_lattice(Lattice *lt)
if(lt->def) MEM_freeN(lt->def);
if(lt->dvert) free_dverts(lt->dvert, lt->pntsu*lt->pntsv*lt->pntsw);
if(lt->editlatt) {
- if(lt->editlatt->def) MEM_freeN(lt->editlatt->def);
- if(lt->editlatt->dvert) free_dverts(lt->editlatt->dvert, lt->pntsu*lt->pntsv*lt->pntsw);
+ Lattice *editlt= lt->editlatt->latt;
+
+ if(editlt->def) MEM_freeN(editlt->def);
+ if(editlt->dvert) free_dverts(editlt->dvert, lt->pntsu*lt->pntsv*lt->pntsw);
+
+ MEM_freeN(editlt);
MEM_freeN(lt->editlatt);
}
}
@@ -293,7 +299,7 @@ void init_latt_deform(Object *oblatt, Object *ob)
float fu, fv, fw;
int u, v, w;
- if(lt->editlatt) lt= lt->editlatt;
+ if(lt->editlatt) lt= lt->editlatt->latt;
bp = lt->def;
fp= lt->latticedata= MEM_mallocN(sizeof(float)*3*lt->pntsu*lt->pntsv*lt->pntsw, "latticedata");
@@ -338,19 +344,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;
-
- if(lt->editlatt) lt= lt->editlatt;
+
+ /* 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->latt;
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);
@@ -361,7 +377,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);
@@ -372,7 +388,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);
@@ -383,53 +399,58 @@ 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, &lt->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)
{
Lattice *lt= ob->data;
- if(lt->editlatt) lt= lt->editlatt;
+ if(lt->editlatt) lt= lt->editlatt->latt;
if(lt->latticedata)
MEM_freeN(lt->latticedata);
@@ -457,7 +478,9 @@ static void init_curve_deform(Object *par, Object *ob, CurveDeform *cd, int dloc
invert_m4_m4(par->imat, par->obmat);
mul_v3_m4v3(cd->dloc, par->imat, ob->obmat[3]);
}
- else cd->dloc[0]=cd->dloc[1]=cd->dloc[2]= 0.0f;
+ else {
+ cd->dloc[0]=cd->dloc[1]=cd->dloc[2]= 0.0f;
+ }
cd->no_rot_axis= 0;
}
@@ -481,7 +504,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;
@@ -490,16 +513,17 @@ static int where_on_path_deform(Object *ob, float ctime, float *vec, float *dir,
if(ctime < 0.0) {
sub_v3_v3v3(dvec, path->data[1].vec, path->data[0].vec);
mul_v3_fl(dvec, ctime*(float)path->len);
- VECADD(vec, vec, dvec);
- if(quat) QUATCOPY(quat, path->data[0].quat);
+ add_v3_v3(vec, dvec);
+ if(quat) copy_qt_qt(quat, path->data[0].quat);
if(radius) *radius= path->data[0].radius;
}
else if(ctime > 1.0) {
sub_v3_v3v3(dvec, path->data[path->len-1].vec, path->data[path->len-2].vec);
mul_v3_fl(dvec, (ctime-1.0)*(float)path->len);
- VECADD(vec, vec, dvec);
- if(quat) QUATCOPY(quat, path->data[path->len-1].quat);
+ add_v3_v3(vec, dvec);
+ if(quat) copy_qt_qt(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;
@@ -590,7 +614,7 @@ static int calc_curve_deform(Scene *scene, Object *par, float *co, short axis, C
/* this is not exactly the same as 2.4x, since the axis is having rotation removed rather then
* changing the axis before calculating the tilt but serves much the same purpose */
float dir_flat[3]={0,0,0}, q[4];
- VECCOPY(dir_flat, dir);
+ copy_v3_v3(dir_flat, dir);
dir_flat[cd->no_rot_axis-1]= 0.0f;
normalize_v3(dir);
@@ -668,11 +692,11 @@ static int calc_curve_deform(Scene *scene, Object *par, float *co, short axis, C
mul_qt_v3(quat, cent);
/* translation */
- VECADD(co, cent, loc);
+ add_v3_v3v3(co, cent, loc);
if(quatp)
- QUATCOPY(quatp, quat);
-
+ copy_qt_qt(quatp, quat);
+
return 1;
}
return 0;
@@ -693,7 +717,18 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object *target, DerivedMesh
cu->flag |= (CU_PATH|CU_FOLLOW); // needed for path & bevlist
init_curve_deform(cuOb, target, &cd, (cu->flag & CU_STRETCH)==0);
-
+
+ /* dummy bounds, keep if CU_DEFORM_BOUNDS_OFF is set */
+ if(defaxis < 3) {
+ cd.dmin[0]= cd.dmin[1]= cd.dmin[2]= 0.0f;
+ cd.dmax[0]= cd.dmax[1]= cd.dmax[2]= 1.0f;
+ }
+ else {
+ /* negative, these bounds give a good rest position */
+ cd.dmin[0]= cd.dmin[1]= cd.dmin[2]= -1.0f;
+ cd.dmax[0]= cd.dmax[1]= cd.dmax[2]= 0.0f;
+ }
+
/* check whether to use vertex groups (only possible if target is a Mesh)
* we want either a Mesh with no derived data, or derived data with
* deformverts
@@ -708,62 +743,84 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object *target, DerivedMesh
use_vgroups = 0;
if(vgroup && vgroup[0] && use_vgroups) {
- bDeformGroup *curdef;
Mesh *me= target->data;
- int index;
-
- /* find the group (weak loop-in-loop) */
- for(index = 0, curdef = target->defbase.first; curdef;
- curdef = curdef->next, index++)
- if (!strcmp(curdef->name, vgroup))
- break;
+ int index= defgroup_name_index(target, vgroup);
- if(curdef && (me->dvert || dm)) {
+ if(index != -1 && (me->dvert || dm)) {
MDeformVert *dvert = me->dvert;
float vec[3];
- int j;
-
- INIT_MINMAX(cd.dmin, cd.dmax);
-
- for(a = 0; a < numVerts; a++, dvert++) {
- if(dm) dvert = dm->getVertData(dm, a, CD_MDEFORMVERT);
+ float weight;
+
- for(j = 0; j < dvert->totweight; j++) {
- if(dvert->dw[j].def_nr == index) {
+ if(cu->flag & CU_DEFORM_BOUNDS_OFF) {
+ /* dummy bounds */
+ cd.dmin[0]= cd.dmin[1]= cd.dmin[2]= 0.0f;
+ cd.dmax[0]= cd.dmax[1]= cd.dmax[2]= 1.0f;
+
+ dvert = me->dvert;
+ for(a = 0; a < numVerts; a++, dvert++) {
+ if(dm) dvert = dm->getVertData(dm, a, CD_MDEFORMVERT);
+ weight= defvert_find_weight(dvert, index);
+
+ if(weight > 0.0f) {
mul_m4_v3(cd.curvespace, vertexCos[a]);
- DO_MINMAX(vertexCos[a], cd.dmin, cd.dmax);
- break;
+ copy_v3_v3(vec, vertexCos[a]);
+ calc_curve_deform(scene, cuOb, vec, defaxis, &cd, NULL);
+ interp_v3_v3v3(vertexCos[a], vertexCos[a], vec, weight);
+ mul_m4_v3(cd.objectspace, vertexCos[a]);
}
}
}
-
- dvert = me->dvert;
- 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) {
- VECCOPY(vec, vertexCos[a]);
+ else {
+ /* set mesh min/max bounds */
+ INIT_MINMAX(cd.dmin, cd.dmax);
+
+ for(a = 0; a < numVerts; a++, dvert++) {
+ if(dm) dvert = dm->getVertData(dm, a, CD_MDEFORMVERT);
+
+ if(defvert_find_weight(dvert, index) > 0.0f) {
+ mul_m4_v3(cd.curvespace, vertexCos[a]);
+ DO_MINMAX(vertexCos[a], cd.dmin, cd.dmax);
+ }
+ }
+
+ dvert = me->dvert;
+ for(a = 0; a < numVerts; a++, dvert++) {
+ if(dm) dvert = dm->getVertData(dm, a, CD_MDEFORMVERT);
+
+ weight= defvert_find_weight(dvert, index);
+
+ if(weight > 0.0f) {
+ copy_v3_v3(vec, vertexCos[a]);
calc_curve_deform(scene, cuOb, vec, defaxis, &cd, NULL);
- interp_v3_v3v3(vertexCos[a], vertexCos[a], vec,
- dvert->dw[j].weight);
+ interp_v3_v3v3(vertexCos[a], vertexCos[a], vec, weight);
mul_m4_v3(cd.objectspace, vertexCos[a]);
- break;
}
}
}
}
- } else {
- INIT_MINMAX(cd.dmin, cd.dmax);
-
- for(a = 0; a < numVerts; a++) {
- mul_m4_v3(cd.curvespace, vertexCos[a]);
- DO_MINMAX(vertexCos[a], cd.dmin, cd.dmax);
+ }
+ else {
+ if(cu->flag & CU_DEFORM_BOUNDS_OFF) {
+ for(a = 0; a < numVerts; a++) {
+ mul_m4_v3(cd.curvespace, vertexCos[a]);
+ calc_curve_deform(scene, cuOb, vertexCos[a], defaxis, &cd, NULL);
+ mul_m4_v3(cd.objectspace, vertexCos[a]);
+ }
}
-
- for(a = 0; a < numVerts; a++) {
- calc_curve_deform(scene, cuOb, vertexCos[a], defaxis, &cd, NULL);
- mul_m4_v3(cd.objectspace, vertexCos[a]);
+ else {
+ /* set mesh min max bounds */
+ INIT_MINMAX(cd.dmin, cd.dmax);
+
+ for(a = 0; a < numVerts; a++) {
+ mul_m4_v3(cd.curvespace, vertexCos[a]);
+ DO_MINMAX(vertexCos[a], cd.dmin, cd.dmax);
+ }
+
+ for(a = 0; a < numVerts; a++) {
+ calc_curve_deform(scene, cuOb, vertexCos[a], defaxis, &cd, NULL);
+ mul_m4_v3(cd.objectspace, vertexCos[a]);
+ }
}
}
cu->flag = flag;
@@ -785,8 +842,8 @@ void curve_deform_vector(Scene *scene, Object *cuOb, Object *target, float *orco
init_curve_deform(cuOb, target, &cd, 0); /* 0 no dloc */
cd.no_rot_axis= no_rot_axis; /* option to only rotate for XY, for example */
- VECCOPY(cd.dmin, orco);
- VECCOPY(cd.dmax, orco);
+ copy_v3_v3(cd.dmin, orco);
+ copy_v3_v3(cd.dmax, orco);
mul_m4_v3(cd.curvespace, vec);
@@ -828,26 +885,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 {
@@ -858,12 +909,12 @@ 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);
}
@@ -955,13 +1006,13 @@ float (*lattice_getVertexCos(struct Object *ob, int *numVerts_r))[3]
int i, numVerts;
float (*vertexCos)[3];
- if(lt->editlatt) lt= lt->editlatt;
+ if(lt->editlatt) lt= lt->editlatt->latt;
numVerts = *numVerts_r = lt->pntsu*lt->pntsv*lt->pntsw;
vertexCos = MEM_mallocN(sizeof(*vertexCos)*numVerts,"lt_vcos");
for (i=0; i<numVerts; i++) {
- VECCOPY(vertexCos[i], lt->def[i].vec);
+ copy_v3_v3(vertexCos[i], lt->def[i].vec);
}
return vertexCos;
@@ -973,7 +1024,7 @@ void lattice_applyVertexCos(struct Object *ob, float (*vertexCos)[3])
int i, numVerts = lt->pntsu*lt->pntsv*lt->pntsw;
for (i=0; i<numVerts; i++) {
- VECCOPY(lt->def[i].vec, vertexCos[i]);
+ copy_v3_v3(lt->def[i].vec, vertexCos[i]);
}
}
@@ -1019,7 +1070,7 @@ struct MDeformVert* lattice_get_deform_verts(struct Object *oblatt)
if(oblatt->type == OB_LATTICE)
{
Lattice *lt = (Lattice*)oblatt->data;
- if(lt->editlatt) lt= lt->editlatt;
+ if(lt->editlatt) lt= lt->editlatt->latt;
return lt->dvert;
}
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 8605cf51b68..8c8e4bb034f 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -40,34 +40,32 @@
#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_scene_types.h"
-#include "DNA_mesh_types.h"
-#include "DNA_lattice_types.h"
-#include "DNA_meta_types.h"
-#include "DNA_material_types.h"
-#include "DNA_wave_types.h"
-#include "DNA_lamp_types.h"
+#include "DNA_anim_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_brush_types.h"
#include "DNA_camera_types.h"
+#include "DNA_group_types.h"
#include "DNA_ipo_types.h"
#include "DNA_key_types.h"
-#include "DNA_world_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_nla_types.h"
+#include "DNA_node_types.h"
+#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
-#include "DNA_vfont_types.h"
-#include "DNA_text_types.h"
#include "DNA_sound_types.h"
-#include "DNA_group_types.h"
-#include "DNA_armature_types.h"
-#include "DNA_node_types.h"
-#include "DNA_nla_types.h"
+#include "DNA_text_types.h"
+#include "DNA_vfont_types.h"
#include "DNA_windowmanager_types.h"
-#include "DNA_anim_types.h"
+#include "DNA_world_types.h"
+#include "DNA_gpencil_types.h"
+
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
@@ -178,8 +176,6 @@ int id_make_local(ID *id, int test)
return 1;
case ID_IM:
return 0; /* not implemented */
- case ID_WV:
- return 0; /* deprecated */
case ID_LT:
if(!test) {
make_local_lattice((Lattice*)id);
@@ -266,9 +262,8 @@ int id_copy(ID *id, ID **newid, int test)
if(!test) *newid= (ID*)copy_texture((Tex*)id);
return 1;
case ID_IM:
- return 0; /* not implemented */
- case ID_WV:
- return 0; /* deprecated */
+ if(!test) *newid= (ID*)copy_image((Image*)id);
+ return 1;
case ID_LT:
if(!test) *newid= (ID*)copy_lattice((Lattice*)id);
return 1;
@@ -377,8 +372,6 @@ ListBase *which_libbase(Main *mainlib, short type)
return &(mainlib->tex);
case ID_IM:
return &(mainlib->image);
- case ID_WV:
- return &(mainlib->wave);
case ID_LT:
return &(mainlib->latt);
case ID_LA:
@@ -449,7 +442,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 */
@@ -478,7 +471,6 @@ int set_listbasepointers(Main *main, ListBase **lb)
lb[a++]= &(main->curve);
lb[a++]= &(main->mball);
- lb[a++]= &(main->wave);
lb[a++]= &(main->latt);
lb[a++]= &(main->lamp);
lb[a++]= &(main->camera);
@@ -545,9 +537,6 @@ static ID *alloc_libblock_notest(short type)
case ID_IM:
id= MEM_callocN(sizeof(Image), "image");
break;
- case ID_WV:
- id= MEM_callocN(sizeof(Wave), "wave");
- break;
case ID_LT:
id= MEM_callocN(sizeof(Lattice), "latt");
break;
@@ -654,7 +643,7 @@ void *copy_libblock(void *rt)
ID *idn, *id;
ListBase *lb;
char *cp, *cpn;
- int idn_len;
+ size_t idn_len;
id= rt;
@@ -749,9 +738,6 @@ void free_libblock(ListBase *lb, void *idv)
case ID_IM:
free_image((Image *)id);
break;
- case ID_WV:
- /* free_wave(id); */
- break;
case ID_LT:
free_lattice((Lattice *)id);
break;
@@ -999,7 +985,7 @@ void IMAnames_to_pupstring(char **str, char *title, char *extraops, ListBase *lb
/* used by buttons.c library.c mball.c */
-void splitIDname(char *name, char *left, int *nr)
+int splitIDname(char *name, char *left, int *nr)
{
int a;
@@ -1007,19 +993,23 @@ void splitIDname(char *name, char *left, int *nr)
strncpy(left, name, 21);
a= strlen(name);
- if(a>1 && name[a-1]=='.') return;
+ if(a>1 && name[a-1]=='.') return a;
while(a--) {
if( name[a]=='.' ) {
left[a]= 0;
*nr= atol(name+a+1);
- return;
+ return a;
}
if( isdigit(name[a])==0 ) break;
left[a]= 0;
}
- strcpy(left, name);
+
+ for(a= 0; name[a]; a++)
+ left[a]= name[a];
+
+ return a;
}
static void sort_alpha_id(ListBase *lb, ID *id)
@@ -1081,8 +1071,7 @@ static ID *is_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;
+ int nr= 0, nrtest, a, left_len;
char left[32], leftest[32], in_use[32];
/* make sure input name is terminated properly */
@@ -1099,31 +1088,37 @@ static int check_for_dupid(ListBase *lb, ID *id, char *name)
/* we have a dup; need to make a new name */
/* quick check so we can reuse one of first 32 ids if vacant */
- memset(in_use, 0, maxtest);
+ memset(in_use, 0, sizeof(in_use));
/* get name portion, number portion ("name.number") */
- splitIDname( name, left, &nr);
+ left_len= splitIDname(name, left, &nr);
/* if new name will be too long, truncate it */
- if(nr>999 && strlen(left)>16) left[16]= 0;
- else if(strlen(left)>17) left[17]= 0;
-
- for( idtest = lb->first; idtest; idtest = idtest->next ) {
- if( id != idtest && idtest->lib == NULL ) {
- splitIDname(idtest->name+2, leftest, &nrtest);
- /* if base names match... */
- /* optimized */
- if( *left == *leftest && strcmp(left, leftest)==0 ) {
- if(nrtest < maxtest)
- in_use[nrtest]= 1; /* mark as used */
- if(nr <= nrtest)
- nr= nrtest+1; /* track largest unused */
- }
+ if(nr > 999 && left_len > 16) {
+ left[16]= 0;
+ left_len= 16;
+ }
+ else if(left_len > 17) {
+ left[17]= 0;
+ left_len= 17;
+ }
+
+ for(idtest= lb->first; idtest; idtest= idtest->next) {
+ if( (id != idtest) &&
+ (idtest->lib == NULL) &&
+ (*name == *(idtest->name+2)) &&
+ (strncmp(name, idtest->name+2, left_len)==0) &&
+ (splitIDname(idtest->name+2, leftest, &nrtest) == left_len)
+ ) {
+ if(nrtest < sizeof(in_use))
+ in_use[nrtest]= 1; /* mark as used */
+ if(nr <= nrtest)
+ nr= nrtest+1; /* track largest unused */
}
}
/* decide which value of nr to use */
- for(a=0; a<maxtest; a++) {
+ for(a=0; a < sizeof(in_use); a++) {
if(a>=nr) break; /* stop when we've check up to biggest */
if( in_use[a]==0 ) { /* found an unused value */
nr = a;
@@ -1133,9 +1128,10 @@ static int check_for_dupid(ListBase *lb, ID *id, char *name)
/* If the original name has no numeric suffix,
* rather than just chopping and adding numbers,
- * shave off the end chars until we have a unique name */
- if (nr==0) {
- int len = strlen(name)-1;
+ * shave off the end chars until we have a unique name.
+ * Check the null terminators match as well so we dont get Cube.000 -> Cube.00 */
+ if (nr==0 && name[left_len]== '\0') {
+ int len = left_len-1;
idtest= is_dupid(lb, id, name);
while (idtest && len> 1) {
@@ -1146,10 +1142,11 @@ static int check_for_dupid(ListBase *lb, ID *id, char *name)
/* otherwise just continue and use a number suffix */
}
- if(nr > 999 && strlen(left) > 16) {
+ if(nr > 999 && left_len > 16) {
/* this would overflow name buffer */
left[16] = 0;
- strcpy( name, left );
+ /* left_len = 16; */ /* for now this isnt used again */
+ memcpy(name, left, sizeof(char) * 16);
continue;
}
/* this format specifier is from hell... */
@@ -1229,7 +1226,7 @@ static void image_fix_relative_path(Image *ima)
{
if(ima->id.lib==NULL) return;
if(strncmp(ima->name, "//", 2)==0) {
- BLI_path_abs(ima->name, ima->id.lib->filename);
+ BLI_path_abs(ima->name, ima->id.lib->filepath);
BLI_path_rel(ima->name, G.sce);
}
}
@@ -1307,7 +1304,7 @@ void all_local(Library *lib, int untagged_only)
/* The check on the second line (LIB_PRE_EXISTING) is done so its
* possible to tag data you dont want to be made local, used for
- * appending data, so any libdata alredy linked wont become local
+ * appending data, so any libdata already linked wont become local
* (very nasty to discover all your links are lost after appending)
* */
if(id->flag & (LIB_EXTERN|LIB_INDIRECT|LIB_NEW) &&
@@ -1394,3 +1391,11 @@ void rename_id(ID *id, char *name)
new_id(lb, id, name);
}
+void name_uiprefix_id(char *name, ID *id)
+{
+ name[0] = id->lib ? 'L':' ';
+ name[1] = id->flag & LIB_FAKEUSER ? 'F':' ';
+ name[2] = ' ';
+
+ strcpy(name+3, id->name+2);
+}
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 3b17ac1db1a..9774e97f69b 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -56,10 +56,6 @@
#include "BKE_node.h"
#include "BKE_utildefines.h"
-#ifndef DISABLE_PYTHON
-#include "BPY_extern.h"
-#endif
-
#include "GPU_material.h"
/* used in UI and render */
@@ -210,7 +206,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]) {
@@ -236,6 +232,7 @@ Material *copy_material(Material *ma)
void make_local_material(Material *ma)
{
+ Main *bmain= G.main;
Object *ob;
Mesh *me;
Curve *cu;
@@ -261,7 +258,7 @@ void make_local_material(Material *ma)
}
/* test objects */
- ob= G.main->object.first;
+ ob= bmain->object.first;
while(ob) {
if(ob->mat) {
for(a=0; a<ob->totcol; a++) {
@@ -274,7 +271,7 @@ void make_local_material(Material *ma)
ob= ob->id.next;
}
/* test meshes */
- me= G.main->mesh.first;
+ me= bmain->mesh.first;
while(me) {
if(me->mat) {
for(a=0; a<me->totcol; a++) {
@@ -287,7 +284,7 @@ void make_local_material(Material *ma)
me= me->id.next;
}
/* test curves */
- cu= G.main->curve.first;
+ cu= bmain->curve.first;
while(cu) {
if(cu->mat) {
for(a=0; a<cu->totcol; a++) {
@@ -300,7 +297,7 @@ void make_local_material(Material *ma)
cu= cu->id.next;
}
/* test mballs */
- mb= G.main->mball.first;
+ mb= bmain->mball.first;
while(mb) {
if(mb->mat) {
for(a=0; a<mb->totcol; a++) {
@@ -329,7 +326,7 @@ void make_local_material(Material *ma)
man->id.us= 0;
/* do objects */
- ob= G.main->object.first;
+ ob= bmain->object.first;
while(ob) {
if(ob->mat) {
for(a=0; a<ob->totcol; a++) {
@@ -345,7 +342,7 @@ void make_local_material(Material *ma)
ob= ob->id.next;
}
/* do meshes */
- me= G.main->mesh.first;
+ me= bmain->mesh.first;
while(me) {
if(me->mat) {
for(a=0; a<me->totcol; a++) {
@@ -361,7 +358,7 @@ void make_local_material(Material *ma)
me= me->id.next;
}
/* do curves */
- cu= G.main->curve.first;
+ cu= bmain->curve.first;
while(cu) {
if(cu->mat) {
for(a=0; a<cu->totcol; a++) {
@@ -377,7 +374,7 @@ void make_local_material(Material *ma)
cu= cu->id.next;
}
/* do mballs */
- mb= G.main->mball.first;
+ mb= bmain->mball.first;
while(mb) {
if(mb->mat) {
for(a=0; a<mb->totcol; a++) {
@@ -451,7 +448,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 */
@@ -730,7 +727,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;
}
@@ -783,14 +780,14 @@ void init_render_material(Material *mat, int r_mode, float *amb)
}
}
-void init_render_materials(int r_mode, float *amb)
+void init_render_materials(Main *bmain, int r_mode, float *amb)
{
Material *ma;
/* clear these flags before going over materials, to make sure they
* are cleared only once, otherwise node materials contained in other
* node materials can go wrong */
- for(ma= G.main->mat.first; ma; ma= ma->id.next) {
+ for(ma= bmain->mat.first; ma; ma= ma->id.next) {
if(ma->id.us) {
ma->texco= 0;
ma->mapto= 0;
@@ -798,7 +795,7 @@ void init_render_materials(int r_mode, float *amb)
}
/* two steps, first initialize, then or the flags for layers */
- for(ma= G.main->mat.first; ma; ma= ma->id.next) {
+ for(ma= bmain->mat.first; ma; ma= ma->id.next) {
/* is_used flag comes back in convertblender.c */
ma->flag &= ~MA_IS_USED;
if(ma->id.us)
@@ -815,10 +812,10 @@ void end_render_material(Material *mat)
ntreeEndExecTree(mat->nodetree); /* has internal flag to detect it only does it once */
}
-void end_render_materials(void)
+void end_render_materials(Main *bmain)
{
Material *ma;
- for(ma= G.main->mat.first; ma; ma= ma->id.next)
+ for(ma= bmain->mat.first; ma; ma= ma->id.next)
if(ma->id.us)
end_render_material(ma);
}
diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c
index 98578312766..e6f38e04d76 100644
--- a/source/blender/blenkernel/intern/mball.c
+++ b/source/blender/blenkernel/intern/mball.c
@@ -62,10 +62,6 @@
#include "BKE_mball.h"
#include "BKE_object.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
/* Global variables */
static float thresh= 0.6f;
@@ -180,6 +176,55 @@ void make_local_mball(MetaBall *mb)
}
}
}
+
+/* most simple meta-element adding function
+ * dont do context menipulation here (rna uses) */
+MetaElem *add_metaball_element(MetaBall *mb, const int type)
+{
+ MetaElem *ml= MEM_callocN(sizeof(MetaElem), "metaelem");
+
+ unit_qt(ml->quat);
+
+ ml->rad= 2.0;
+ ml->s= 2.0;
+ ml->flag= MB_SCALE_RAD;
+
+ switch(type) {
+ 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;
+ }
+
+ BLI_addtail(&mb->elems, ml);
+
+ return ml;
+}
/** Compute bounding box of all MetaElems/MetaBalls.
*
* Bounding box is computed from polygonized surface. Object *ob is
@@ -230,7 +275,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;
@@ -247,7 +292,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;
@@ -279,6 +324,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
@@ -287,6 +345,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;
@@ -296,10 +355,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);
@@ -329,6 +388,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;
@@ -339,10 +399,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){
@@ -1498,6 +1558,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;
@@ -1514,9 +1575,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;
@@ -2079,21 +2139,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;
@@ -2117,13 +2176,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;
}
}
@@ -2156,9 +2224,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 9e8767406b1..94131fdbe9d 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>
@@ -269,6 +265,7 @@ void make_local_tface(Mesh *me)
void make_local_mesh(Mesh *me)
{
+ Main *bmain= G.main;
Object *ob;
Mesh *men;
int local=0, lib=0;
@@ -289,7 +286,7 @@ void make_local_mesh(Mesh *me)
return;
}
- ob= G.main->object.first;
+ ob= bmain->object.first;
while(ob) {
if( me==get_mesh(ob) ) {
if(ob->id.lib) lib= 1;
@@ -310,7 +307,7 @@ void make_local_mesh(Mesh *me)
men= copy_mesh(me);
men->id.us= 0;
- ob= G.main->object.first;
+ ob= bmain->object.first;
while(ob) {
if( me==get_mesh(ob) ) {
if(ob->id.lib==0) {
@@ -324,33 +321,23 @@ void make_local_mesh(Mesh *me)
void boundbox_mesh(Mesh *me, float *loc, float *size)
{
- MVert *mvert;
BoundBox *bb;
float min[3], max[3];
float mloc[3], msize[3];
- int a;
if(me->bb==0) me->bb= MEM_callocN(sizeof(BoundBox), "boundbox");
bb= me->bb;
-
- INIT_MINMAX(min, max);
if (!loc) loc= mloc;
if (!size) size= msize;
- mvert= me->mvert;
- for(a=0; a<me->totvert; a++, mvert++) {
- DO_MINMAX(mvert->co, min, max);
- }
-
- if(!me->totvert) {
+ INIT_MINMAX(min, max);
+ if(!minmax_mesh(me, min, max)) {
min[0] = min[1] = min[2] = -1.0f;
max[0] = max[1] = max[2] = 1.0f;
}
- loc[0]= (min[0]+max[0])/2.0f;
- loc[1]= (min[1]+max[1])/2.0f;
- loc[2]= (min[2]+max[2])/2.0f;
+ mid_v3_v3v3(loc, min, max);
size[0]= (max[0]-min[0])/2.0f;
size[1]= (max[1]-min[1])/2.0f;
@@ -373,9 +360,9 @@ void tex_space_mesh(Mesh *me)
else if(size[a]<0.0 && size[a]> -0.00001) size[a]= -0.00001;
}
- VECCOPY(me->loc, loc);
- VECCOPY(me->size, size);
- me->rot[0]= me->rot[1]= me->rot[2]= 0.0;
+ copy_v3_v3(me->loc, loc);
+ copy_v3_v3(me->size, size);
+ zero_v3(me->rot);
}
}
@@ -417,9 +404,7 @@ float *get_mesh_orco_verts(Object *ob)
totvert = MIN2(tme->totvert, me->totvert);
for(a=0; a<totvert; a++, mvert++) {
- vcos[a][0]= mvert->co[0];
- vcos[a][1]= mvert->co[1];
- vcos[a][2]= mvert->co[2];
+ copy_v3_v3(vcos[a], mvert->co);
}
return (float*)vcos;
@@ -435,9 +420,7 @@ void transform_mesh_orco_verts(Mesh *me, float (*orco)[3], int totvert, int inve
if(invert) {
for(a=0; a<totvert; a++) {
float *co = orco[a];
- co[0] = co[0]*size[0] + loc[0];
- co[1] = co[1]*size[1] + loc[1];
- co[2] = co[2]*size[2] + loc[2];
+ madd_v3_v3v3v3(co, loc, co, size);
}
}
else {
@@ -701,7 +684,6 @@ void mball_to_mesh(ListBase *lb, Mesh *me)
if(dl==0) return;
if(dl->type==DL_INDEX4) {
- me->flag= ME_NOPUNOFLIP;
me->totvert= dl->nr;
me->totface= dl->parts;
@@ -944,6 +926,7 @@ int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int
/* this may fail replacing ob->data, be sure to check ob->type */
void nurbs_to_mesh(Object *ob)
{
+ Main *bmain= G.main;
Object *ob1;
DerivedMesh *dm= ob->derivedFinal;
Mesh *me;
@@ -986,13 +969,13 @@ void nurbs_to_mesh(Object *ob)
cu->totcol= 0;
if(ob->data) {
- free_libblock(&G.main->curve, ob->data);
+ free_libblock(&bmain->curve, ob->data);
}
ob->data= me;
ob->type= OB_MESH;
/* other users */
- ob1= G.main->object.first;
+ ob1= bmain->object.first;
while(ob1) {
if(ob1->data==cu) {
ob1->type= OB_MESH;
@@ -1190,6 +1173,12 @@ void mesh_to_curve(Scene *scene, Object *ob)
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;
+ }
}
}
@@ -1237,24 +1226,20 @@ 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];
float *no= tnorms[i];
- if (normalize_v3(no)==0.0) {
- VECCOPY(no, mv->co);
- normalize_v3(no);
- }
+ if (normalize_v3(no)==0.0)
+ normalize_v3_v3(no, mv->co);
- mv->no[0]= (short)(no[0]*32767.0);
- mv->no[1]= (short)(no[1]*32767.0);
- mv->no[2]= (short)(no[2]*32767.0);
+ normal_float_to_short_v3(mv->no, no);
}
MEM_freeN(tnorms);
@@ -1496,3 +1481,59 @@ void mesh_pmv_off(Object *ob, Mesh *me)
me->pv= NULL;
}
}
+
+/* basic vertex data functions */
+int minmax_mesh(Mesh *me, float min[3], float max[3])
+{
+ int i= me->totvert;
+ MVert *mvert;
+ for(mvert= me->mvert; i--; mvert++) {
+ DO_MINMAX(mvert->co, min, max);
+ }
+
+ return (me->totvert != 0);
+}
+
+int mesh_center_median(Mesh *me, float cent[3])
+{
+ int i= me->totvert;
+ MVert *mvert;
+ zero_v3(cent);
+ for(mvert= me->mvert; i--; mvert++) {
+ add_v3_v3(cent, mvert->co);
+ }
+ mul_v3_fl(cent, 1.0f/(float)me->totvert);
+
+ return (me->totvert != 0);
+}
+
+int mesh_center_bounds(Mesh *me, float cent[3])
+{
+ float min[3], max[3];
+ INIT_MINMAX(min, max);
+ if(minmax_mesh(me, min, max)) {
+ mid_v3_v3v3(cent, min, max);
+ return 1;
+ }
+
+ return 0;
+}
+
+void mesh_translate(Mesh *me, float offset[3], int do_keys)
+{
+ int i= me->totvert;
+ MVert *mvert;
+ for(mvert= me->mvert; i--; mvert++) {
+ add_v3_v3(mvert->co, offset);
+ }
+
+ if (do_keys && me->key) {
+ KeyBlock *kb;
+ for (kb=me->key->block.first; kb; kb=kb->next) {
+ float *fp= kb->data;
+ for (i= kb->totelem; i--; fp+=3) {
+ add_v3_v3(fp, offset);
+ }
+ }
+ }
+}
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index 76e49c0726b..63f0f1fa091 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -34,9852 +34,39 @@
*
*/
-#include "stddef.h"
-#include "string.h"
-#include "stdarg.h"
-#include "math.h"
-#include "float.h"
-
-#include "BLI_kdtree.h"
-#include "BLI_rand.h"
-#include "BLI_uvproject.h"
-
-#include "MEM_guardedalloc.h"
+#include <stddef.h>
+#include <string.h>
+#include <stdarg.h>
+#include <math.h>
+#include <float.h>
#include "DNA_armature_types.h"
-#include "DNA_camera_types.h"
-#include "DNA_curve_types.h"
-#include "DNA_key_types.h"
-#include "DNA_material_types.h"
-#include "DNA_object_fluidsim.h"
+#include "DNA_object_types.h"
+#include "DNA_meshdata_types.h"
+#include "MEM_guardedalloc.h"
-#include "BKE_action.h"
#include "BKE_bmesh.h"
-#include "BKE_booleanops.h"
#include "BKE_cloth.h"
-#include "BKE_cdderivedmesh.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_material.h"
-#include "BKE_mesh.h"
-#include "BKE_modifier.h"
-#include "BKE_object.h"
-#include "BKE_paint.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 "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, 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((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)) {
- if(is_last_displist(ob)) {
- dm= CDDM_from_curve(ob);
- }
- }
-
- return dm;
-}
-
-/* returns a cdderivedmesh if dm == NULL or is another type of derivedmesh */
-static DerivedMesh *get_cddm(Scene *scene, Object *ob, 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);
- 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, EditMesh *editData,
- DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
-{
- DerivedMesh *dm = derivedData;
-
- if(!derivedData) dm = CDDM_from_editmesh(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, EditMesh *editData,
- DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
-{
- DerivedMesh *dm = derivedData;
-
- if(!derivedData) dm = CDDM_from_editmesh(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);
- result->release(result);
- result= cddm;
- }
-
- return result;
-}
-
-static DerivedMesh *subsurfModifier_applyModifierEM(
- ModifierData *md, Object *ob, EditMesh *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->getNumFaces(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->getNumFaces(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->getFace(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);
-
- /* 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->getFace(dm, faceMap[i], &source);
- dest = CDDM_get_face(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);
-
- 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->getNumFaces(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->getFace(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);
-
-
- /* 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->getFace(dm, oldIndex, &source);
- dest = CDDM_get_face(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 */
- 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);
- }
-}
-
-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->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);
- }
- result = CDDM_from_template(dm, finalVerts, finalEdges, finalFaces);
-
- /* 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->getNumFaces(dm);
- mface = CDDM_get_faces(result);
- for (i=0; i < maxFaces; i++) {
- MFace inMF;
- MFace *mf = &mface[numFaces];
-
- dm->getFace(dm, i, &inMF);
-
- DM_copy_face_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_face_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->getNumFaces(start_cap);
- cap_mvert = start_cap->getVertArray(start_cap);
- cap_medge = start_cap->getEdgeArray(start_cap);
- cap_mface = start_cap->getFaceArray(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->getFaceDataArray(result, CD_ORIGINDEX);
- for(i = 0; i < capFaces; i++) {
- DM_copy_face_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->getNumFaces(end_cap);
- cap_mvert = end_cap->getVertArray(end_cap);
- cap_medge = end_cap->getEdgeArray(end_cap);
- cap_mface = end_cap->getFaceArray(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->getFaceDataArray(result, CD_ORIGINDEX);
- for(i = 0; i < capFaces; i++) {
- DM_copy_face_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);
-
- 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, EditMesh *editData,
- DerivedMesh *derivedData)
-{
- return arrayModifier_applyModifier(md, ob, derivedData, 0, 1);
-}
-
-/* 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");
- }
-}
-
-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->getNumFaces(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);
-
-
- 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_face(result, numFaces);
-
- dm->getFace(dm, i, &inMF);
-
- DM_copy_face_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_face(result, numFaces);
- static int corner_indices[4] = {2, 1, 0, 3};
-
- DM_copy_face_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->getFaceData(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_face_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);
-
- 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 *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, EditMesh *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)
-*/
-#if 0
-#define EDGESPLIT_DEBUG_3
-#define EDGESPLIT_DEBUG_2
-#define EDGESPLIT_DEBUG_1
-#define EDGESPLIT_DEBUG_0
-#endif
-
-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;
-}
-
-/* Mesh data for edgesplit operation */
-typedef struct SmoothVert {
- LinkNode *faces; /* all faces which use this vert */
- int oldIndex; /* the index of the original DerivedMesh vert */
- int newIndex; /* the index of the new DerivedMesh vert */
-} SmoothVert;
-
-#define SMOOTHEDGE_NUM_VERTS 2
-
-typedef struct SmoothEdge {
- SmoothVert *verts[SMOOTHEDGE_NUM_VERTS]; /* the verts used by this edge */
- LinkNode *faces; /* all faces which use this edge */
- int oldIndex; /* the index of the original DerivedMesh edge */
- int newIndex; /* the index of the new DerivedMesh edge */
- short flag; /* the flags from the original DerivedMesh edge */
-} SmoothEdge;
-
-#define SMOOTHFACE_MAX_EDGES 4
-
-typedef struct SmoothFace {
- SmoothEdge *edges[SMOOTHFACE_MAX_EDGES]; /* nonexistent edges == NULL */
- int flip[SMOOTHFACE_MAX_EDGES]; /* 1 = flip edge dir, 0 = don't flip */
- float normal[3]; /* the normal of this face */
- int oldIndex; /* the index of the original DerivedMesh face */
- int newIndex; /* the index of the new DerivedMesh face */
-} SmoothFace;
-
-typedef struct SmoothMesh {
- SmoothVert *verts;
- SmoothEdge *edges;
- SmoothFace *faces;
- int num_verts, num_edges, num_faces;
- int max_verts, max_edges, max_faces;
- DerivedMesh *dm;
- float threshold; /* the cosine of the smoothing angle */
- int flags;
- MemArena *arena;
- ListBase propagatestack, reusestack;
-} SmoothMesh;
-
-static SmoothVert *smoothvert_copy(SmoothVert *vert, SmoothMesh *mesh)
-{
- SmoothVert *copy = &mesh->verts[mesh->num_verts];
-
- if(mesh->num_verts >= mesh->max_verts) {
- printf("Attempted to add a SmoothMesh vert beyond end of array\n");
- return NULL;
- }
-
- *copy = *vert;
- copy->faces = NULL;
- copy->newIndex = mesh->num_verts;
- ++mesh->num_verts;
-
-#ifdef EDGESPLIT_DEBUG_2
- printf("copied vert %4d to vert %4d\n", vert->newIndex, copy->newIndex);
-#endif
- return copy;
-}
-
-static SmoothEdge *smoothedge_copy(SmoothEdge *edge, SmoothMesh *mesh)
-{
- SmoothEdge *copy = &mesh->edges[mesh->num_edges];
-
- if(mesh->num_edges >= mesh->max_edges) {
- printf("Attempted to add a SmoothMesh edge beyond end of array\n");
- return NULL;
- }
-
- *copy = *edge;
- copy->faces = NULL;
- copy->newIndex = mesh->num_edges;
- ++mesh->num_edges;
-
-#ifdef EDGESPLIT_DEBUG_2
- printf("copied edge %4d to edge %4d\n", edge->newIndex, copy->newIndex);
-#endif
- return copy;
-}
-
-static int smoothedge_has_vert(SmoothEdge *edge, SmoothVert *vert)
-{
- int i;
- for(i = 0; i < SMOOTHEDGE_NUM_VERTS; i++)
- if(edge->verts[i] == vert) return 1;
-
- return 0;
-}
-
-static SmoothMesh *smoothmesh_new(int num_verts, int num_edges, int num_faces,
- int max_verts, int max_edges, int max_faces)
-{
- SmoothMesh *mesh = MEM_callocN(sizeof(*mesh), "smoothmesh");
- mesh->verts = MEM_callocN(sizeof(*mesh->verts) * max_verts,
- "SmoothMesh.verts");
- mesh->edges = MEM_callocN(sizeof(*mesh->edges) * max_edges,
- "SmoothMesh.edges");
- mesh->faces = MEM_callocN(sizeof(*mesh->faces) * max_faces,
- "SmoothMesh.faces");
-
- mesh->num_verts = num_verts;
- mesh->num_edges = num_edges;
- mesh->num_faces = num_faces;
-
- mesh->max_verts = max_verts;
- mesh->max_edges = max_edges;
- mesh->max_faces = max_faces;
-
- return mesh;
-}
-
-static void smoothmesh_free(SmoothMesh *mesh)
-{
- int i;
-
- for(i = 0; i < mesh->num_verts; ++i)
- BLI_linklist_free(mesh->verts[i].faces, NULL);
-
- for(i = 0; i < mesh->num_edges; ++i)
- BLI_linklist_free(mesh->edges[i].faces, NULL);
-
- if(mesh->arena)
- BLI_memarena_free(mesh->arena);
-
- MEM_freeN(mesh->verts);
- MEM_freeN(mesh->edges);
- MEM_freeN(mesh->faces);
- MEM_freeN(mesh);
-}
-
-static void smoothmesh_resize_verts(SmoothMesh *mesh, int max_verts)
-{
- int i;
- SmoothVert *tmp;
-
- if(max_verts <= mesh->max_verts) return;
-
- tmp = MEM_callocN(sizeof(*tmp) * max_verts, "SmoothMesh.verts");
-
- memcpy(tmp, mesh->verts, sizeof(*tmp) * mesh->num_verts);
-
- /* remap vert pointers in edges */
- for(i = 0; i < mesh->num_edges; ++i) {
- int j;
- SmoothEdge *edge = &mesh->edges[i];
-
- for(j = 0; j < SMOOTHEDGE_NUM_VERTS; ++j)
- /* pointer arithmetic to get vert array index */
- edge->verts[j] = &tmp[edge->verts[j] - mesh->verts];
- }
-
- MEM_freeN(mesh->verts);
- mesh->verts = tmp;
- mesh->max_verts = max_verts;
-}
-
-static void smoothmesh_resize_edges(SmoothMesh *mesh, int max_edges)
-{
- int i;
- SmoothEdge *tmp;
-
- if(max_edges <= mesh->max_edges) return;
-
- tmp = MEM_callocN(sizeof(*tmp) * max_edges, "SmoothMesh.edges");
-
- memcpy(tmp, mesh->edges, sizeof(*tmp) * mesh->num_edges);
-
- /* remap edge pointers in faces */
- for(i = 0; i < mesh->num_faces; ++i) {
- int j;
- SmoothFace *face = &mesh->faces[i];
-
- for(j = 0; j < SMOOTHFACE_MAX_EDGES; ++j)
- if(face->edges[j])
- /* pointer arithmetic to get edge array index */
- face->edges[j] = &tmp[face->edges[j] - mesh->edges];
- }
-
- MEM_freeN(mesh->edges);
- mesh->edges = tmp;
- mesh->max_edges = max_edges;
-}
-
-#ifdef EDGESPLIT_DEBUG_0
-static void smoothmesh_print(SmoothMesh *mesh)
-{
- int i, j;
- DerivedMesh *dm = mesh->dm;
-
- printf("--- SmoothMesh ---\n");
- printf("--- Vertices ---\n");
- for(i = 0; i < mesh->num_verts; i++) {
- SmoothVert *vert = &mesh->verts[i];
- LinkNode *node;
- MVert mv;
-
- dm->getVert(dm, vert->oldIndex, &mv);
-
- printf("%3d: ind={%3d, %3d}, pos={% 5.1f, % 5.1f, % 5.1f}",
- i, vert->oldIndex, vert->newIndex,
- mv.co[0], mv.co[1], mv.co[2]);
- printf(", faces={");
- for(node = vert->faces; node != NULL; node = node->next) {
- printf(" %d", ((SmoothFace *)node->link)->newIndex);
- }
- printf("}\n");
- }
-
- printf("\n--- Edges ---\n");
- for(i = 0; i < mesh->num_edges; i++) {
- SmoothEdge *edge = &mesh->edges[i];
- LinkNode *node;
-
- printf("%4d: indices={%4d, %4d}, verts={%4d, %4d}",
- i,
- edge->oldIndex, edge->newIndex,
- edge->verts[0]->newIndex, edge->verts[1]->newIndex);
- if(edge->verts[0] == edge->verts[1]) printf(" <- DUPLICATE VERTEX");
- printf(", faces={");
- for(node = edge->faces; node != NULL; node = node->next) {
- printf(" %d", ((SmoothFace *)node->link)->newIndex);
- }
- printf("}\n");
- }
-
- printf("\n--- Faces ---\n");
- for(i = 0; i < mesh->num_faces; i++) {
- SmoothFace *face = &mesh->faces[i];
-
- printf("%4d: indices={%4d, %4d}, edges={", i,
- face->oldIndex, face->newIndex);
- for(j = 0; j < SMOOTHFACE_MAX_EDGES && face->edges[j]; j++) {
- if(face->flip[j])
- printf(" -%-2d", face->edges[j]->newIndex);
- else
- printf(" %-2d", face->edges[j]->newIndex);
- }
- printf("}, verts={");
- for(j = 0; j < SMOOTHFACE_MAX_EDGES && face->edges[j]; j++) {
- printf(" %d", face->edges[j]->verts[face->flip[j]]->newIndex);
- }
- printf("}\n");
- }
-}
-#endif
-
-static SmoothMesh *smoothmesh_from_derivedmesh(DerivedMesh *dm)
-{
- SmoothMesh *mesh;
- EdgeHash *edges = BLI_edgehash_new();
- int i;
- int totvert, totedge, totface;
-
- totvert = dm->getNumVerts(dm);
- totedge = dm->getNumEdges(dm);
- totface = dm->getNumFaces(dm);
-
- mesh = smoothmesh_new(totvert, totedge, totface,
- totvert, totedge, totface);
-
- mesh->dm = dm;
-
- for(i = 0; i < totvert; i++) {
- SmoothVert *vert = &mesh->verts[i];
-
- vert->oldIndex = vert->newIndex = i;
- }
-
- for(i = 0; i < totedge; i++) {
- SmoothEdge *edge = &mesh->edges[i];
- MEdge med;
-
- dm->getEdge(dm, i, &med);
- edge->verts[0] = &mesh->verts[med.v1];
- edge->verts[1] = &mesh->verts[med.v2];
- edge->oldIndex = edge->newIndex = i;
- edge->flag = med.flag;
-
- BLI_edgehash_insert(edges, med.v1, med.v2, edge);
- }
-
- for(i = 0; i < totface; i++) {
- SmoothFace *face = &mesh->faces[i];
- MFace mf;
- MVert v1, v2, v3;
- int j;
-
- dm->getFace(dm, i, &mf);
-
- dm->getVert(dm, mf.v1, &v1);
- dm->getVert(dm, mf.v2, &v2);
- dm->getVert(dm, mf.v3, &v3);
- face->edges[0] = BLI_edgehash_lookup(edges, mf.v1, mf.v2);
- if(face->edges[0]->verts[1]->oldIndex == mf.v1) face->flip[0] = 1;
- face->edges[1] = BLI_edgehash_lookup(edges, mf.v2, mf.v3);
- if(face->edges[1]->verts[1]->oldIndex == mf.v2) face->flip[1] = 1;
- if(mf.v4) {
- MVert v4;
- dm->getVert(dm, mf.v4, &v4);
- face->edges[2] = BLI_edgehash_lookup(edges, mf.v3, mf.v4);
- if(face->edges[2]->verts[1]->oldIndex == mf.v3) face->flip[2] = 1;
- face->edges[3] = BLI_edgehash_lookup(edges, mf.v4, mf.v1);
- if(face->edges[3]->verts[1]->oldIndex == mf.v4) face->flip[3] = 1;
- normal_quad_v3( face->normal,v1.co, v2.co, v3.co, v4.co);
- } else {
- face->edges[2] = BLI_edgehash_lookup(edges, mf.v3, mf.v1);
- if(face->edges[2]->verts[1]->oldIndex == mf.v3) face->flip[2] = 1;
- face->edges[3] = NULL;
- normal_tri_v3( face->normal,v1.co, v2.co, v3.co);
- }
-
- for(j = 0; j < SMOOTHFACE_MAX_EDGES && face->edges[j]; j++) {
- SmoothEdge *edge = face->edges[j];
- BLI_linklist_prepend(&edge->faces, face);
- BLI_linklist_prepend(&edge->verts[face->flip[j]]->faces, face);
- }
-
- face->oldIndex = face->newIndex = i;
- }
-
- BLI_edgehash_free(edges, NULL);
-
- return mesh;
-}
-
-static DerivedMesh *CDDM_from_smoothmesh(SmoothMesh *mesh)
-{
- DerivedMesh *result = CDDM_from_template(mesh->dm,
- mesh->num_verts,
- mesh->num_edges,
- mesh->num_faces);
- MVert *new_verts = CDDM_get_verts(result);
- MEdge *new_edges = CDDM_get_edges(result);
- MFace *new_faces = CDDM_get_faces(result);
- int i;
-
- for(i = 0; i < mesh->num_verts; ++i) {
- SmoothVert *vert = &mesh->verts[i];
- MVert *newMV = &new_verts[vert->newIndex];
-
- DM_copy_vert_data(mesh->dm, result,
- vert->oldIndex, vert->newIndex, 1);
- mesh->dm->getVert(mesh->dm, vert->oldIndex, newMV);
- }
-
- for(i = 0; i < mesh->num_edges; ++i) {
- SmoothEdge *edge = &mesh->edges[i];
- MEdge *newME = &new_edges[edge->newIndex];
-
- DM_copy_edge_data(mesh->dm, result,
- edge->oldIndex, edge->newIndex, 1);
- mesh->dm->getEdge(mesh->dm, edge->oldIndex, newME);
- newME->v1 = edge->verts[0]->newIndex;
- newME->v2 = edge->verts[1]->newIndex;
- }
-
- for(i = 0; i < mesh->num_faces; ++i) {
- SmoothFace *face = &mesh->faces[i];
- MFace *newMF = &new_faces[face->newIndex];
-
- DM_copy_face_data(mesh->dm, result,
- face->oldIndex, face->newIndex, 1);
- mesh->dm->getFace(mesh->dm, face->oldIndex, newMF);
-
- newMF->v1 = face->edges[0]->verts[face->flip[0]]->newIndex;
- newMF->v2 = face->edges[1]->verts[face->flip[1]]->newIndex;
- newMF->v3 = face->edges[2]->verts[face->flip[2]]->newIndex;
-
- if(face->edges[3]) {
- newMF->v4 = face->edges[3]->verts[face->flip[3]]->newIndex;
- } else {
- newMF->v4 = 0;
- }
- }
-
- return result;
-}
-
-/* returns the other vert in the given edge
- */
-static SmoothVert *other_vert(SmoothEdge *edge, SmoothVert *vert)
-{
- if(edge->verts[0] == vert) return edge->verts[1];
- else return edge->verts[0];
-}
-
-/* returns the other edge in the given face that uses the given vert
- * returns NULL if no other edge in the given face uses the given vert
- * (this should never happen)
- */
-static SmoothEdge *other_edge(SmoothFace *face, SmoothVert *vert,
- SmoothEdge *edge)
-{
- int i,j;
- for(i = 0; i < SMOOTHFACE_MAX_EDGES && face->edges[i]; i++) {
- SmoothEdge *tmp_edge = face->edges[i];
- if(tmp_edge == edge) continue;
-
- for(j = 0; j < SMOOTHEDGE_NUM_VERTS; j++)
- if(tmp_edge->verts[j] == vert) return tmp_edge;
- }
-
- /* if we get to here, something's wrong (there should always be 2 edges
- * which use the same vert in a face)
- */
- return NULL;
-}
-
-/* returns a face attached to the given edge which is not the given face.
- * returns NULL if no other faces use this edge.
- */
-static SmoothFace *other_face(SmoothEdge *edge, SmoothFace *face)
-{
- LinkNode *node;
-
- for(node = edge->faces; node != NULL; node = node->next)
- if(node->link != face) return node->link;
-
- return NULL;
-}
-
-#if 0
-/* copies source list to target, overwriting target (target is not freed)
- * nodes in the copy will be in the same order as in source
- */
-static void linklist_copy(LinkNode **target, LinkNode *source)
-{
- LinkNode *node = NULL;
- *target = NULL;
-
- for(; source; source = source->next) {
- if(node) {
- node->next = MEM_mallocN(sizeof(*node->next), "nlink_copy");
- node = node->next;
-} else {
- node = *target = MEM_mallocN(sizeof(**target), "nlink_copy");
-}
- node->link = source->link;
- node->next = NULL;
-}
-}
-#endif
-
- /* appends source to target if it's not already in target */
- static void linklist_append_unique(LinkNode **target, void *source)
-{
- LinkNode *node;
- LinkNode *prev = NULL;
-
- /* check if source value is already in the list */
- for(node = *target; node; prev = node, node = node->next)
- if(node->link == source) return;
-
- node = MEM_mallocN(sizeof(*node), "nlink");
- node->next = NULL;
- node->link = source;
-
- if(prev) prev->next = node;
- else *target = node;
-}
-
-/* appends elements of source which aren't already in target to target */
-static void linklist_append_list_unique(LinkNode **target, LinkNode *source)
-{
- for(; source; source = source->next)
- linklist_append_unique(target, source->link);
-}
-
-#if 0 /* this is no longer used, it should possibly be removed */
-/* prepends prepend to list - doesn't copy nodes, just joins the lists */
-static void linklist_prepend_linklist(LinkNode **list, LinkNode *prepend)
-{
- if(prepend) {
- LinkNode *node = prepend;
- while(node->next) node = node->next;
-
- node->next = *list;
- *list = prepend;
-}
-}
-#endif
-
-/* returns 1 if the linked list contains the given pointer, 0 otherwise
- */
-static int linklist_contains(LinkNode *list, void *ptr)
-{
- LinkNode *node;
-
- for(node = list; node; node = node->next)
- if(node->link == ptr) return 1;
-
- return 0;
-}
-
-/* returns 1 if the first linked list is a subset of the second (comparing
- * pointer values), 0 if not
- */
-static int linklist_subset(LinkNode *list1, LinkNode *list2)
-{
- for(; list1; list1 = list1->next)
- if(!linklist_contains(list2, list1->link))
- return 0;
-
- return 1;
-}
-
-#if 0
-/* empties the linked list
- * frees pointers with freefunc if freefunc is not NULL
- */
-static void linklist_empty(LinkNode **list, LinkNodeFreeFP freefunc)
-{
- BLI_linklist_free(*list, freefunc);
- *list = NULL;
-}
-#endif
-
-/* removes the first instance of value from the linked list
- * frees the pointer with freefunc if freefunc is not NULL
- */
-static void linklist_remove_first(LinkNode **list, void *value,
- LinkNodeFreeFP freefunc)
-{
- LinkNode *node = *list;
- LinkNode *prev = NULL;
-
- while(node && node->link != value) {
- prev = node;
- node = node->next;
- }
-
- if(node) {
- if(prev)
- prev->next = node->next;
- else
- *list = node->next;
-
- if(freefunc)
- freefunc(node->link);
-
- MEM_freeN(node);
- }
-}
-
-/* removes all elements in source from target */
-static void linklist_remove_list(LinkNode **target, LinkNode *source,
- LinkNodeFreeFP freefunc)
-{
- for(; source; source = source->next)
- linklist_remove_first(target, source->link, freefunc);
-}
-
-#ifdef EDGESPLIT_DEBUG_0
-static void print_ptr(void *ptr)
-{
- printf("%p\n", ptr);
-}
-
-static void print_edge(void *ptr)
-{
- SmoothEdge *edge = ptr;
- printf(" %4d", edge->newIndex);
-}
-
-static void print_face(void *ptr)
-{
- SmoothFace *face = ptr;
- printf(" %4d", face->newIndex);
-}
-#endif
-
-typedef struct ReplaceData {
- void *find;
- void *replace;
-} ReplaceData;
-
-static void edge_replace_vert(void *ptr, void *userdata)
-{
- SmoothEdge *edge = ptr;
- SmoothVert *find = ((ReplaceData *)userdata)->find;
- SmoothVert *replace = ((ReplaceData *)userdata)->replace;
- int i;
-
-#ifdef EDGESPLIT_DEBUG_3
- printf("replacing vert %4d with %4d in edge %4d",
- find->newIndex, replace->newIndex, edge->newIndex);
- printf(": {%4d, %4d}", edge->verts[0]->newIndex, edge->verts[1]->newIndex);
-#endif
-
- for(i = 0; i < SMOOTHEDGE_NUM_VERTS; i++) {
- if(edge->verts[i] == find) {
- linklist_append_list_unique(&replace->faces, edge->faces);
- linklist_remove_list(&find->faces, edge->faces, NULL);
-
- edge->verts[i] = replace;
- }
- }
-
-#ifdef EDGESPLIT_DEBUG_3
- printf(" -> {%4d, %4d}\n", edge->verts[0]->newIndex, edge->verts[1]->newIndex);
-#endif
-}
-
-static void face_replace_vert(void *ptr, void *userdata)
-{
- SmoothFace *face = ptr;
- int i;
-
- for(i = 0; i < SMOOTHFACE_MAX_EDGES && face->edges[i]; i++)
- edge_replace_vert(face->edges[i], userdata);
-}
-
-static void face_replace_edge(void *ptr, void *userdata)
-{
- SmoothFace *face = ptr;
- SmoothEdge *find = ((ReplaceData *)userdata)->find;
- SmoothEdge *replace = ((ReplaceData *)userdata)->replace;
- int i;
-
-#ifdef EDGESPLIT_DEBUG_3
- printf("replacing edge %4d with %4d in face %4d",
- find->newIndex, replace->newIndex, face->newIndex);
- if(face->edges[3])
- printf(": {%2d %2d %2d %2d}",
- face->edges[0]->newIndex, face->edges[1]->newIndex,
- face->edges[2]->newIndex, face->edges[3]->newIndex);
- else
- printf(": {%2d %2d %2d}",
- face->edges[0]->newIndex, face->edges[1]->newIndex,
- face->edges[2]->newIndex);
-#endif
-
- for(i = 0; i < SMOOTHFACE_MAX_EDGES && face->edges[i]; i++) {
- if(face->edges[i] == find) {
- linklist_remove_first(&face->edges[i]->faces, face, NULL);
- BLI_linklist_prepend(&replace->faces, face);
- face->edges[i] = replace;
- }
- }
-
-#ifdef EDGESPLIT_DEBUG_3
- if(face->edges[3])
- printf(" -> {%2d %2d %2d %2d}\n",
- face->edges[0]->newIndex, face->edges[1]->newIndex,
- face->edges[2]->newIndex, face->edges[3]->newIndex);
- else
- printf(" -> {%2d %2d %2d}\n",
- face->edges[0]->newIndex, face->edges[1]->newIndex,
- face->edges[2]->newIndex);
-#endif
-}
-
-static int edge_is_loose(SmoothEdge *edge)
-{
- return !(edge->faces && edge->faces->next);
-}
-
-static int edge_is_sharp(SmoothEdge *edge, int flags,
- float threshold)
-{
-#ifdef EDGESPLIT_DEBUG_1
- printf("edge %d: ", edge->newIndex);
-#endif
- if(edge->flag & ME_SHARP) {
- /* edge can only be sharp if it has at least 2 faces */
- if(!edge_is_loose(edge)) {
-#ifdef EDGESPLIT_DEBUG_1
- printf("sharp\n");
-#endif
- return 1;
- } else {
- /* edge is loose, so it can't be sharp */
- edge->flag &= ~ME_SHARP;
- }
- }
-
-#ifdef EDGESPLIT_DEBUG_1
- printf("not sharp\n");
-#endif
- return 0;
-}
-
-/* finds another sharp edge which uses vert, by traversing faces around the
- * vert until it does one of the following:
- * - hits a loose edge (the edge is returned)
- * - hits a sharp edge (the edge is returned)
- * - returns to the start edge (NULL is returned)
- */
-static SmoothEdge *find_other_sharp_edge(SmoothVert *vert, SmoothEdge *edge,
- LinkNode **visited_faces, float threshold, int flags)
-{
- SmoothFace *face = NULL;
- SmoothEdge *edge2 = NULL;
- /* holds the edges we've seen so we can avoid looping indefinitely */
- LinkNode *visited_edges = NULL;
-#ifdef EDGESPLIT_DEBUG_1
- printf("=== START === find_other_sharp_edge(edge = %4d, vert = %4d)\n",
- edge->newIndex, vert->newIndex);
-#endif
-
- /* get a face on which to start */
- if(edge->faces) face = edge->faces->link;
- else return NULL;
-
- /* record this edge as visited */
- BLI_linklist_prepend(&visited_edges, edge);
-
- /* get the next edge */
- edge2 = other_edge(face, vert, edge);
-
- /* record this face as visited */
- if(visited_faces)
- BLI_linklist_prepend(visited_faces, face);
-
- /* search until we hit a loose edge or a sharp edge or an edge we've
- * seen before
- */
- while(face && !edge_is_sharp(edge2, flags, threshold)
- && !linklist_contains(visited_edges, edge2)) {
-#ifdef EDGESPLIT_DEBUG_3
- printf("current face %4d; current edge %4d\n", face->newIndex,
- edge2->newIndex);
-#endif
- /* get the next face */
- face = other_face(edge2, face);
-
- /* if face == NULL, edge2 is a loose edge */
- if(face) {
- /* record this face as visited */
- if(visited_faces)
- BLI_linklist_prepend(visited_faces, face);
-
- /* record this edge as visited */
- BLI_linklist_prepend(&visited_edges, edge2);
-
- /* get the next edge */
- edge2 = other_edge(face, vert, edge2);
-#ifdef EDGESPLIT_DEBUG_3
- printf("next face %4d; next edge %4d\n",
- face->newIndex, edge2->newIndex);
- } else {
- printf("loose edge: %4d\n", edge2->newIndex);
-#endif
- }
- }
-
- /* either we came back to the start edge or we found a sharp/loose edge */
- if(linklist_contains(visited_edges, edge2))
- /* we came back to the start edge */
- edge2 = NULL;
-
- BLI_linklist_free(visited_edges, NULL);
-
-#ifdef EDGESPLIT_DEBUG_1
- printf("=== END === find_other_sharp_edge(edge = %4d, vert = %4d), "
- "returning edge %d\n",
- edge->newIndex, vert->newIndex, edge2 ? edge2->newIndex : -1);
-#endif
- return edge2;
-}
-
-static void split_single_vert(SmoothVert *vert, SmoothFace *face,
- SmoothMesh *mesh)
-{
- SmoothVert *copy_vert;
- ReplaceData repdata;
-
- copy_vert = smoothvert_copy(vert, mesh);
-
- repdata.find = vert;
- repdata.replace = copy_vert;
- face_replace_vert(face, &repdata);
-}
-
-typedef struct PropagateEdge {
- struct PropagateEdge *next, *prev;
- SmoothEdge *edge;
- SmoothVert *vert;
-} PropagateEdge;
-
-static void push_propagate_stack(SmoothEdge *edge, SmoothVert *vert, SmoothMesh *mesh)
-{
- PropagateEdge *pedge = mesh->reusestack.first;
-
- if(pedge) {
- BLI_remlink(&mesh->reusestack, pedge);
- }
- else {
- if(!mesh->arena) {
- mesh->arena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE);
- BLI_memarena_use_calloc(mesh->arena);
- }
-
- pedge = BLI_memarena_alloc(mesh->arena, sizeof(PropagateEdge));
- }
-
- pedge->edge = edge;
- pedge->vert = vert;
- BLI_addhead(&mesh->propagatestack, pedge);
-}
-
-static void pop_propagate_stack(SmoothEdge **edge, SmoothVert **vert, SmoothMesh *mesh)
-{
- PropagateEdge *pedge = mesh->propagatestack.first;
-
- if(pedge) {
- *edge = pedge->edge;
- *vert = pedge->vert;
- BLI_remlink(&mesh->propagatestack, pedge);
- BLI_addhead(&mesh->reusestack, pedge);
- }
- else {
- *edge = NULL;
- *vert = NULL;
- }
-}
-
-static void split_edge(SmoothEdge *edge, SmoothVert *vert, SmoothMesh *mesh);
-
-static void propagate_split(SmoothEdge *edge, SmoothVert *vert,
- SmoothMesh *mesh)
-{
- SmoothEdge *edge2;
- LinkNode *visited_faces = NULL;
-#ifdef EDGESPLIT_DEBUG_1
- printf("=== START === propagate_split(edge = %4d, vert = %4d)\n",
- edge->newIndex, vert->newIndex);
-#endif
-
- edge2 = find_other_sharp_edge(vert, edge, &visited_faces,
- mesh->threshold, mesh->flags);
-
- if(!edge2) {
- /* didn't find a sharp or loose edge, so we've hit a dead end */
- } else if(!edge_is_loose(edge2)) {
- /* edge2 is not loose, so it must be sharp */
- if(edge_is_loose(edge)) {
- /* edge is loose, so we can split edge2 at this vert */
- split_edge(edge2, vert, mesh);
- } else if(edge_is_sharp(edge, mesh->flags, mesh->threshold)) {
- /* both edges are sharp, so we can split the pair at vert */
- split_edge(edge, vert, mesh);
- } else {
- /* edge is not sharp, so try to split edge2 at its other vert */
- split_edge(edge2, other_vert(edge2, vert), mesh);
- }
- } else { /* edge2 is loose */
- if(edge_is_loose(edge)) {
- SmoothVert *vert2;
- ReplaceData repdata;
-
- /* can't split edge, what should we do with vert? */
- if(linklist_subset(vert->faces, visited_faces)) {
- /* vert has only one fan of faces attached; don't split it */
- } else {
- /* vert has more than one fan of faces attached; split it */
- vert2 = smoothvert_copy(vert, mesh);
-
- /* replace vert with its copy in visited_faces */
- repdata.find = vert;
- repdata.replace = vert2;
- BLI_linklist_apply(visited_faces, face_replace_vert, &repdata);
- }
- } else {
- /* edge is not loose, so it must be sharp; split it */
- split_edge(edge, vert, mesh);
- }
- }
-
- BLI_linklist_free(visited_faces, NULL);
-#ifdef EDGESPLIT_DEBUG_1
- printf("=== END === propagate_split(edge = %4d, vert = %4d)\n",
- edge->newIndex, vert->newIndex);
-#endif
-}
-
-static void split_edge(SmoothEdge *edge, SmoothVert *vert, SmoothMesh *mesh)
-{
- SmoothEdge *edge2;
- SmoothVert *vert2;
- ReplaceData repdata;
- /* the list of faces traversed while looking for a sharp edge */
- LinkNode *visited_faces = NULL;
-#ifdef EDGESPLIT_DEBUG_1
- printf("=== START === split_edge(edge = %4d, vert = %4d)\n",
- edge->newIndex, vert->newIndex);
-#endif
-
- edge2 = find_other_sharp_edge(vert, edge, &visited_faces,
- mesh->threshold, mesh->flags);
-
- if(!edge2) {
- /* didn't find a sharp or loose edge, so try the other vert */
- vert2 = other_vert(edge, vert);
- push_propagate_stack(edge, vert2, mesh);
- } else if(!edge_is_loose(edge2)) {
- /* edge2 is not loose, so it must be sharp */
- SmoothEdge *copy_edge = smoothedge_copy(edge, mesh);
- SmoothEdge *copy_edge2 = smoothedge_copy(edge2, mesh);
- SmoothVert *vert2;
-
- /* replace edge with its copy in visited_faces */
- repdata.find = edge;
- repdata.replace = copy_edge;
- BLI_linklist_apply(visited_faces, face_replace_edge, &repdata);
-
- /* replace edge2 with its copy in visited_faces */
- repdata.find = edge2;
- repdata.replace = copy_edge2;
- BLI_linklist_apply(visited_faces, face_replace_edge, &repdata);
-
- vert2 = smoothvert_copy(vert, mesh);
-
- /* replace vert with its copy in visited_faces (must be done after
- * edge replacement so edges have correct vertices)
- */
- repdata.find = vert;
- repdata.replace = vert2;
- BLI_linklist_apply(visited_faces, face_replace_vert, &repdata);
-
- /* all copying and replacing is done; the mesh should be consistent.
- * now propagate the split to the vertices at either end
- */
- push_propagate_stack(copy_edge, other_vert(copy_edge, vert2), mesh);
- push_propagate_stack(copy_edge2, other_vert(copy_edge2, vert2), mesh);
-
- if(smoothedge_has_vert(edge, vert))
- push_propagate_stack(edge, vert, mesh);
- } else {
- /* edge2 is loose */
- SmoothEdge *copy_edge = smoothedge_copy(edge, mesh);
- SmoothVert *vert2;
-
- /* replace edge with its copy in visited_faces */
- repdata.find = edge;
- repdata.replace = copy_edge;
- BLI_linklist_apply(visited_faces, face_replace_edge, &repdata);
-
- vert2 = smoothvert_copy(vert, mesh);
-
- /* replace vert with its copy in visited_faces (must be done after
- * edge replacement so edges have correct vertices)
- */
- repdata.find = vert;
- repdata.replace = vert2;
- BLI_linklist_apply(visited_faces, face_replace_vert, &repdata);
-
- /* copying and replacing is done; the mesh should be consistent.
- * now propagate the split to the vertex at the other end
- */
- push_propagate_stack(copy_edge, other_vert(copy_edge, vert2), mesh);
-
- if(smoothedge_has_vert(edge, vert))
- push_propagate_stack(edge, vert, mesh);
- }
-
- BLI_linklist_free(visited_faces, NULL);
-#ifdef EDGESPLIT_DEBUG_1
- printf("=== END === split_edge(edge = %4d, vert = %4d)\n",
- edge->newIndex, vert->newIndex);
-#endif
-}
-
-static void tag_and_count_extra_edges(SmoothMesh *mesh, float split_angle,
- int flags, int *extra_edges)
-{
- /* if normal1 dot normal2 < threshold, angle is greater, so split */
- /* FIXME not sure if this always works */
- /* 0.00001 added for floating-point rounding */
- float threshold = cos((split_angle + 0.00001) * M_PI / 180.0);
- int i;
-
- *extra_edges = 0;
-
- /* loop through edges, counting potential new ones */
- for(i = 0; i < mesh->num_edges; i++) {
- SmoothEdge *edge = &mesh->edges[i];
- int sharp = 0;
-
- /* treat all non-manifold edges (3 or more faces) as sharp */
- if(edge->faces && edge->faces->next && edge->faces->next->next) {
- LinkNode *node;
-
- /* this edge is sharp */
- sharp = 1;
-
- /* add an extra edge for every face beyond the first */
- *extra_edges += 2;
- for(node = edge->faces->next->next->next; node; node = node->next)
- (*extra_edges)++;
- } else if((flags & (MOD_EDGESPLIT_FROMANGLE | MOD_EDGESPLIT_FROMFLAG))
- && !edge_is_loose(edge)) {
- /* (the edge can only be sharp if we're checking angle or flag,
- * and it has at least 2 faces) */
-
- /* if we're checking the sharp flag and it's set, good */
- if((flags & MOD_EDGESPLIT_FROMFLAG) && (edge->flag & ME_SHARP)) {
- /* this edge is sharp */
- sharp = 1;
-
- (*extra_edges)++;
- } else if(flags & MOD_EDGESPLIT_FROMANGLE) {
- /* we know the edge has 2 faces, so check the angle */
- SmoothFace *face1 = edge->faces->link;
- SmoothFace *face2 = edge->faces->next->link;
- float edge_angle_cos = dot_v3v3(face1->normal,
- face2->normal);
-
- if(edge_angle_cos < threshold) {
- /* this edge is sharp */
- sharp = 1;
-
- (*extra_edges)++;
- }
- }
- }
-
- /* set/clear sharp flag appropriately */
- if(sharp) edge->flag |= ME_SHARP;
- else edge->flag &= ~ME_SHARP;
- }
-}
-
-static void split_sharp_edges(SmoothMesh *mesh, float split_angle, int flags)
-{
- SmoothVert *vert;
- int i;
- /* if normal1 dot normal2 < threshold, angle is greater, so split */
- /* FIXME not sure if this always works */
- /* 0.00001 added for floating-point rounding */
- mesh->threshold = cos((split_angle + 0.00001) * M_PI / 180.0);
- mesh->flags = flags;
-
- /* loop through edges, splitting sharp ones */
- /* can't use an iterator here, because we'll be adding edges */
- for(i = 0; i < mesh->num_edges; i++) {
- SmoothEdge *edge = &mesh->edges[i];
-
- if(edge_is_sharp(edge, flags, mesh->threshold)) {
- split_edge(edge, edge->verts[0], mesh);
-
- do {
- pop_propagate_stack(&edge, &vert, mesh);
- if(edge && smoothedge_has_vert(edge, vert))
- propagate_split(edge, vert, mesh);
- } while(edge);
- }
- }
-}
-
-static int count_bridge_verts(SmoothMesh *mesh)
-{
- int i, j, count = 0;
-
- for(i = 0; i < mesh->num_faces; i++) {
- SmoothFace *face = &mesh->faces[i];
-
- for(j = 0; j < SMOOTHFACE_MAX_EDGES && face->edges[j]; j++) {
- SmoothEdge *edge = face->edges[j];
- SmoothEdge *next_edge;
- SmoothVert *vert = edge->verts[1 - face->flip[j]];
- int next = (j + 1) % SMOOTHFACE_MAX_EDGES;
-
- /* wrap next around if at last edge */
- if(!face->edges[next]) next = 0;
-
- next_edge = face->edges[next];
-
- /* if there are other faces sharing this vertex but not
- * these edges, the vertex will be split, so count it
- */
- /* vert has to have at least one face (this one), so faces != 0 */
- if(!edge->faces->next && !next_edge->faces->next
- && vert->faces->next) {
- count++;
- }
- }
- }
-
- /* each bridge vert will be counted once per face that uses it,
- * so count is too high, but it's ok for now
- */
- return count;
-}
-
-static void split_bridge_verts(SmoothMesh *mesh)
-{
- int i,j;
-
- for(i = 0; i < mesh->num_faces; i++) {
- SmoothFace *face = &mesh->faces[i];
-
- for(j = 0; j < SMOOTHFACE_MAX_EDGES && face->edges[j]; j++) {
- SmoothEdge *edge = face->edges[j];
- SmoothEdge *next_edge;
- SmoothVert *vert = edge->verts[1 - face->flip[j]];
- int next = (j + 1) % SMOOTHFACE_MAX_EDGES;
-
- /* wrap next around if at last edge */
- if(!face->edges[next]) next = 0;
-
- next_edge = face->edges[next];
-
- /* if there are other faces sharing this vertex but not
- * these edges, split the vertex
- */
- /* vert has to have at least one face (this one), so faces != 0 */
- if(!edge->faces->next && !next_edge->faces->next
- && vert->faces->next)
- /* FIXME this needs to find all faces that share edges with
- * this one and split off together
- */
- split_single_vert(vert, face, mesh);
- }
- }
-}
-
-static DerivedMesh *edgesplitModifier_do(EdgeSplitModifierData *emd,
- Object *ob, DerivedMesh *dm)
-{
- SmoothMesh *mesh;
- DerivedMesh *result;
- int max_verts, max_edges;
-
- if(!(emd->flags & (MOD_EDGESPLIT_FROMANGLE | MOD_EDGESPLIT_FROMFLAG)))
- return dm;
-
- /* 1. make smoothmesh with initial number of elements */
- mesh = smoothmesh_from_derivedmesh(dm);
-
- /* 2. count max number of elements to add */
- tag_and_count_extra_edges(mesh, emd->split_angle, emd->flags, &max_edges);
- max_verts = max_edges * 2 + mesh->max_verts;
- max_verts += count_bridge_verts(mesh);
- max_edges += mesh->max_edges;
-
- /* 3. reallocate smoothmesh arrays & copy elements across */
- /* 4. remap copied elements' pointers to point into the new arrays */
- smoothmesh_resize_verts(mesh, max_verts);
- smoothmesh_resize_edges(mesh, max_edges);
-
-#ifdef EDGESPLIT_DEBUG_1
- printf("********** Pre-split **********\n");
- smoothmesh_print(mesh);
-#endif
-
- split_sharp_edges(mesh, emd->split_angle, emd->flags);
-#ifdef EDGESPLIT_DEBUG_1
- printf("********** Post-edge-split **********\n");
- smoothmesh_print(mesh);
-#endif
-
- split_bridge_verts(mesh);
-
-#ifdef EDGESPLIT_DEBUG_1
- printf("********** Post-vert-split **********\n");
- smoothmesh_print(mesh);
-#endif
-
-#ifdef EDGESPLIT_DEBUG_0
- printf("Edgesplit: Estimated %d verts & %d edges, "
- "found %d verts & %d edges\n", max_verts, max_edges,
- mesh->num_verts, mesh->num_edges);
-#endif
-
- result = CDDM_from_smoothmesh(mesh);
- smoothmesh_free(mesh);
-
- return result;
-}
-
-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, EditMesh *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);
-
- return result;
-}
-
-static DerivedMesh *bevelModifier_applyModifierEM(
- ModifierData *md, Object *ob, EditMesh *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->getFaceArray(dm);
- MFace *mf;
- char *done = MEM_callocN(sizeof(*done) * numVerts,
- "get_texture_coords done");
- int numFaces = dm->getNumFaces(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, 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;
-}
-
-/* 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, 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);
-}
-
-/* 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;
- umd->scalex = umd->scaley = 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;
- tumd->scalex = umd->scalex;
- tumd->scaley = umd->scaley;
-}
-
-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 */
- 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);
- free_uci= 1;
- }
- else 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 (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->getFaceArray(dm);
- numFaces = dm->getNumFaces(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);
-
- if(scax != 1.0f) {
- tface->uv[0][0] = ((tface->uv[0][0] - 0.5f) * scax) + 0.5f;
- tface->uv[1][0] = ((tface->uv[1][0] - 0.5f) * scax) + 0.5f;
- tface->uv[2][0] = ((tface->uv[2][0] - 0.5f) * scax) + 0.5f;
- if(mf->v3)
- tface->uv[3][0] = ((tface->uv[3][0] - 0.5f) * scax) + 0.5f;
- }
-
- if(scay != 1.0f) {
- tface->uv[0][1] = ((tface->uv[0][1] - 0.5f) * scay) + 0.5f;
- tface->uv[1][1] = ((tface->uv[1][1] - 0.5f) * scay) + 0.5f;
- tface->uv[2][1] = ((tface->uv[2][1] - 0.5f) * scay) + 0.5f;
- if(mf->v3)
- tface->uv[3][1] = ((tface->uv[3][1] - 0.5f) * scay) + 0.5f;
- }
- }
- 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;
-
- 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];
- }
- }
-
- 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 *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, EditMesh *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->getFaceArray(dm);
- totvert = dm->getNumVerts(dm);
- totface = dm->getNumFaces(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);
- dmd->faceCount = lod.face_num;
- }
- else
- result = CDDM_new(lod.vertex_num, 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_faces(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);
- }
- 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, 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);
-}
-
-/* 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;
+#include "MOD_modifiertypes.h"
- 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;
-
- 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, 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) {
- 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->getFaceArray(dm);
- MFace *mf;
- char *done = MEM_callocN(sizeof(*done) * numVerts,
- "get_texture_coords done");
- int numFaces = dm->getNumFaces(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, 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);
-}
-
-/* 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, 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 armatureModifier_deformMatricesEM(
- ModifierData *md, Object *ob, 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);
-}
-
-/* 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, EditMesh *editData,
- DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
-{
- DerivedMesh *dm = derivedData;
-
- if(!derivedData) dm = CDDM_from_editmesh(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->getFaceArray(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->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 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;
-
- 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_index= -1;
- int defgrp_invert = ((smd->flag & MOD_SOLIDIFY_VGROUP_INV) != 0);
-
- defgrp_index= defgroup_name_index(ob, smd->defgrp_name);
-
- if (defgrp_index >= 0)
- dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
-
- orig_mface = dm->getFaceArray(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) { \
- 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; 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);
-
- mface = result->getFaceArray(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_face_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;
- 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; i<numVerts; i++, mv++) {
- if(dv) {
- if(defgrp_invert) scalar_short_vgroup = scalar_short * (1.0f - defvert_find_weight(dv, defgrp_index));
- else scalar_short_vgroup = scalar_short * defvert_find_weight(dv, defgrp_index);
- dv++;
- }
- VECADDFAC(mv->co, 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; i<numVerts; i++, mv++) {
- if(dv) {
- if(defgrp_invert) scalar_short_vgroup = scalar_short * (1.0f - defvert_find_weight(dv, defgrp_index));
- else scalar_short_vgroup = scalar_short * defvert_find_weight(dv, defgrp_index);
- dv++;
- }
- VECADDFAC(mv->co, 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; 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];
- }
- }
-
- /* vertex group support */
- if(dvert) {
- dv= dvert;
- if(defgrp_invert) {
- for(i=0; i<numVerts; i++, dv++) {
- vert_angles[i] *= (1.0f - defvert_find_weight(dv, defgrp_index));
- }
- }
- else {
- for(i=0; i<numVerts; i++, dv++) {
- vert_angles[i] *= defvert_find_weight(dv, defgrp_index);
- }
- }
- }
-
- if(ofs_new) {
- mv= mvert + ((ofs_new >= ofs_orig) ? 0 : numVerts);
-
- for(i=0; i<numVerts; i++, mv++) {
- if(vert_accum[i]) { /* zero if unselected */
- madd_v3_v3fl(mv->co, 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; i<numVerts; i++, mv++) {
- if(vert_accum[i]) { /* zero if unselected */
- madd_v3_v3fl(mv->co, vert_nors[i], ofs_orig * (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_face_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_face_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);
- }
-
- return result;
-}
-
-static DerivedMesh *solidifyModifier_applyModifierEM(ModifierData *md,
- Object *ob,
- EditMesh *editData,
- DerivedMesh *derivedData)
-{
- return solidifyModifier_applyModifier(md, ob, derivedData, 0, 1);
-}
-
-/* Screw */
-
-/* Screw modifier: revolves the edges about an axis
-*/
-
-/* 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 screwModifier_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 screwModifier_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 *screwModifier_applyModifier(ModifierData *md, Object *ob,
- DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+ModifierTypeInfo *modifierType_getInfo(ModifierType type)
{
- 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, 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);
-
- 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;
- case 2:
- 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= 'X' + ltmd->axis;
+ static ModifierTypeInfo *types[NUM_MODIFIER_TYPES];
+ static int types_init = 1;
- /* useful to be able to use the axis vec in some cases still */
- zero_v3(axis_vec);
- axis_vec[ltmd->axis]= 1.0f;
+ if (types_init) {
+ modifier_type_init(types, type); /* MOD_utils.c */
+ types_init= 0;
}
- /* 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;
+ if(type >= 0 && type < NUM_MODIFIER_TYPES &&
+ types[type]->name[0] != '\0') {
+ return types[type];
}
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);
-
- /* copy verts from mesh */
- mvert_orig = dm->getVertArray(dm);
- medge_orig = dm->getEdgeArray(dm);
-
- mvert_new = result->getVertArray(result);
- mface_new = result->getFaceArray(result);
- medge_new = result->getEdgeArray(result);
-
- origindex= result->getFaceDataArray(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; i<totedge; i++, med_new++) {
- vc= &vert_connect[med_new->v1];
-
- 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_v3v3(tmp_vec1, 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; j<totvert; j++, mv_new_base++, mv_new++) {
- /* set normal */
- if(vert_connect) {
- mul_v3_m3v3(no_tx, mat3, vert_connect[j].no);
-
- /* set the normal now its transformed */
- normal_float_to_short_v3(mv_new->no, 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; i<totvert; i++) {
- med_new->v1= 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);
- }
-
- return result;
-}
-
-
-static void screwModifier_updateDepgraph(
- ModifierData *md, DagForest *forest,
- 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 screwModifier_foreachObjectLink(
- ModifierData *md, Object *ob,
- void (*walk)(void *userData, Object *ob, Object **obpoin),
- void *userData)
-{
- ScrewModifierData *ltmd= (ScrewModifierData*) md;
-
- walk(userData, ob, &ltmd->ob_axis);
-}
-
-/* This dosnt work with material*/
-static DerivedMesh *screwModifier_applyModifierEM(
- ModifierData *md, Object *ob, EditMesh *editData,
- DerivedMesh *derivedData)
-{
- return screwModifier_applyModifier(md, ob, derivedData, 0, 1);
-}
-
-static int screwModifier_dependsOnTime(ModifierData *md)
-{
- return 0;
-}
-
-
-/* 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;
- 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 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);
- 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->dupFaceArray(dm);
- collmd->numfaces = dm->getNumFaces(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);
- 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->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 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);
- 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->getNumFaces(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->getNumFaces(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, EditMesh *editData,
- DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
-{
- DerivedMesh *dm = derivedData;
-
- if(!derivedData) dm = CDDM_from_editmesh(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->getNumFaces(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);
-
- 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->getFaceArray(result);
- orig_mface=dm->getFaceArray(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_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);
-
- return result;
-}
-static DerivedMesh *particleInstanceModifier_applyModifierEM(
- ModifierData *md, Object *ob, EditMesh *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->getFaceArray(dm);
- totface= dm->getNumFaces(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){
- int defgrp_index= emd->vgroup-1;
- for(i=0; i<totvert; i++, dvert++){
- val = BLI_frand();
- val = (1.0f-emd->protect)*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; 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_faces(dm);
- MVert *dupve, *mv;
- EdgeHash *edgehash;
- EdgeHashIterator *ehi;
- int totvert=dm->getNumVerts(dm);
- int totface=dm->getNumFaces(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->getFaceData(dm,i,CD_MFACE);//CDDM_get_face(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);
-
- /* 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->getFace(dm, i, &source);
- dest = CDDM_get_face(splitdm, i);
-
- DM_copy_face_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_face(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_face(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_face(splitdm,curdupface);
- DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
- *df1=*mf;
- curdupface++;
-
- df2=CDDM_get_face(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_face(splitdm,curdupface);
- DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
- *df1=*mf;
- curdupface++;
-
- df2=CDDM_get_face(splitdm,curdupface);
- DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
- *df2=*mf;
- curdupface++;
-
- df3=CDDM_get_face(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_face(splitdm,curdupface);
- DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
- *df1=*mf;
- curdupface++;
-
- df2=CDDM_get_face(splitdm,curdupface);
- DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
- *df2=*mf;
- curdupface++;
-
- df3=CDDM_get_face(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_face(splitdm,curdupface);
- DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
- *df1=*mf;
- curdupface++;
-
- df2=CDDM_get_face(splitdm,curdupface);
- DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
- *df2=*mf;
- curdupface++;
-
- df3=CDDM_get_face(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);
-
- 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->getNumFaces(dm);
- totvert= dm->getNumVerts(dm);
- mface= dm->getFaceArray(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= &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);
- /*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->getFace(dm,i,&source);
- mf=CDDM_get_face(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;
- }
-
- 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->getNumFaces(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;
- EditMesh *em = (me)? BKE_mesh_get_editmesh(me): NULL;
- 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(em) {
- tmpdm= editmesh_get_derived_cage_and_final(md->scene, ob, em, &cagedm, 0);
- if(tmpdm)
- tmpdm->release(tmpdm);
- BKE_mesh_end_editmesh(me, em);
- }
- 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, EditMesh *editData,
- DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
-{
- DerivedMesh *dm;
-
- if(!derivedData && ob->type == OB_MESH)
- dm = CDDM_from_editmesh(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);
- result->release(result);
- result= cddm;
- }
- else if((ob->mode & OB_MODE_SCULPT) && ob->sculpt) {
- /* would be created on the fly too, just nicer this
- way on first stroke after e.g. switching levels */
- ob->sculpt->pbvh= 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, EditMesh *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, EditMesh *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;
-
-ModifierTypeInfo *modifierType_getInfo(ModifierType type)
-{
- if (typeArrInit) {
- ModifierTypeInfo *mti;
-
- 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
- | eModifierTypeFlag_AcceptsCVs;
- 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 |
- eModifierTypeFlag_AcceptsCVs;
- 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
- | eModifierTypeFlag_AcceptsCVs;
- 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
- | eModifierTypeFlag_AcceptsCVs;
- 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_AcceptsCVs
- | 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_AcceptsCVs
- | eModifierTypeFlag_SupportsMapping
- | eModifierTypeFlag_SupportsEditmode
- | eModifierTypeFlag_EnableInEditmode;
- mti->initData = solidifyModifier_initData;
- mti->copyData = solidifyModifier_copyData;
- mti->applyModifier = solidifyModifier_applyModifier;
- mti->applyModifierEM = solidifyModifier_applyModifierEM;
- typeArrInit = 0;
-
- mti = INIT_TYPE(Screw);
- mti->type = eModifierTypeType_Constructive;
- mti->flags = eModifierTypeFlag_AcceptsMesh
- | eModifierTypeFlag_SupportsEditmode
- | eModifierTypeFlag_EnableInEditmode
- | eModifierTypeFlag_AcceptsCVs;
-
- mti->initData = screwModifier_initData;
- mti->copyData = screwModifier_copyData;
- mti->foreachObjectLink = screwModifier_foreachObjectLink;
- mti->dependsOnTime = screwModifier_dependsOnTime;
- mti->updateDepgraph = screwModifier_updateDepgraph;
- mti->applyModifier = screwModifier_applyModifier;
- mti->applyModifierEM = screwModifier_applyModifierEM;
-
-#undef INIT_TYPE
- }
-
- if (type>=0 && type<NUM_MODIFIER_TYPES && typeArr[type].name[0]!='\0') {
- return &typeArr[type];
- } else {
return NULL;
}
}
@@ -9951,6 +138,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;
@@ -10005,7 +197,7 @@ void modifier_copyData(ModifierData *md, ModifierData *target)
mti->copyData(md, target);
}
-int modifier_couldBeCage(Scene *scene, ModifierData *md)
+int modifier_couldBeCage(struct Scene *scene, ModifierData *md)
{
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
@@ -10045,7 +237,7 @@ void modifier_setError(ModifierData *md, char *format, ...)
* also used in transform_conversion.c, to detect CrazySpace [tm] (2nd arg
* then is NULL)
*/
-int modifiers_getCageIndex(Scene *scene, Object *ob, int *lastPossibleCageIndex_r, int virtual_)
+int modifiers_getCageIndex(struct Scene *scene, Object *ob, int *lastPossibleCageIndex_r, int virtual_)
{
ModifierData *md = (virtual_)? modifiers_getVirtualModifierList(ob): ob->modifiers.first;
int i, cageIndex = -1;
@@ -10095,7 +287,7 @@ int modifiers_isParticleEnabled(Object *ob)
return (md && md->mode & (eModifierMode_Realtime | eModifierMode_Render));
}
-int modifier_isEnabled(Scene *scene, ModifierData *md, int required_mode)
+int modifier_isEnabled(struct Scene *scene, ModifierData *md, int required_mode)
{
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
@@ -10110,7 +302,7 @@ int modifier_isEnabled(Scene *scene, ModifierData *md, int required_mode)
return 1;
}
-LinkNode *modifiers_calcDataMasks(Scene *scene, Object *ob, ModifierData *md, CustomDataMask dataMask, int required_mode)
+LinkNode *modifiers_calcDataMasks(struct Scene *scene, Object *ob, ModifierData *md, CustomDataMask dataMask, int required_mode)
{
LinkNode *dataMasks = NULL;
LinkNode *curr, *prev;
@@ -10299,7 +491,7 @@ int modifier_isCorrectableDeformed(ModifierData *md)
return 0;
}
-int modifiers_isCorrectableDeformed(Scene *scene, Object *ob)
+int modifiers_isCorrectableDeformed(struct Scene *scene, Object *ob)
{
ModifierData *md = modifiers_getVirtualModifierList(ob);
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index c70d12bcb75..56d517f1e13 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -60,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);
+ }
+
+ 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)
@@ -123,6 +137,14 @@ void multires_force_update(Object *ob)
}
}
+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))
@@ -191,24 +213,101 @@ 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);
+ 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->fdata, CD_MDISPS);
+ int i;
+
+ if(mdisps) {
+ for(i = 0; i < me->totface; i++) {
+ if(mdisps[i].totdisp == 0) {
+ int nvert = (me->mface[i].v4)? 4: 3;
+ mdisps[i].totdisp = multires_grid_tot[lvl]*nvert;
+ }
+ }
+ }
+}
+
+static void multires_reallocate_mdisps(Mesh *me, MDisps *mdisps, int lvl)
+{
+ int i;
+
+ /* reallocate displacements to be filled in */
+ for(i = 0; i < me->totface; ++i) {
+ int nvert = (me->mface[i].v4)? 4: 3;
+ int totdisp = multires_grid_tot[lvl]*nvert;
+ 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);
@@ -264,6 +363,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->fdata, &me->id, CD_MASK_MDISPS, me->totface);
mdisps= CustomData_get_layer(&me->fdata, CD_MDISPS);
@@ -337,24 +437,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->totface; ++i) {
- int nvert = (me->mface[i].v4)? 4: 3;
- int totdisp = multires_grid_tot[lvl]*nvert;
- 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 +462,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 */
@@ -481,7 +564,7 @@ static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, int invert, int
dGridSize = multires_side_tot[totlvl];
dSkip = (dGridSize-1)/(gridSize-1);
- #pragma omp parallel for private(i) schedule(static)
+ #pragma omp parallel for private(i) if(me->totface*gridSize*gridSize*4 >= CCG_OMP_LIMIT)
for(i = 0; i < me->totface; ++i) {
const int numVerts = mface[i].v4 ? 4 : 3;
MDisps *mdisp = &mdisps[i];
@@ -559,6 +642,7 @@ 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->fdata, &me->id, CD_MASK_MDISPS, me->totface);
mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS);
@@ -574,7 +658,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);
+ 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 */
@@ -625,7 +712,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);
+ 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);
@@ -694,6 +784,7 @@ 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->fdata, &me->id, CD_MASK_MDISPS, me->totface);
multiresModifier_disp_run(result, ob->data, 0, 0, subGridData, mmd->totlvl);
@@ -1201,6 +1292,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 */
@@ -1246,6 +1338,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 ab2a6f713cb..b053d615756 100644
--- a/source/blender/blenkernel/intern/nla.c
+++ b/source/blender/blenkernel/intern/nla.c
@@ -52,10 +52,6 @@
#include "nla_private.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
/* *************************************************** */
/* Data Management */
@@ -1247,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) {
@@ -1269,13 +1265,13 @@ void BKE_nlastrip_validate_name (AnimData *adt, NlaStrip *strip)
char *dot;
/* Strip off the suffix */
- dot = strchr(strip->name, '.');
+ dot = strrchr(strip->name, '.');
if (dot) *dot=0;
/* Try different possibilities */
for (number = 1; number <= 999; number++) {
/* assemble alternative name */
- BLI_snprintf(tempname, 128, "%s%c%03d", strip->name, ".", number);
+ BLI_snprintf(tempname, 128, "%s.%03d", strip->name, number);
/* if hash doesn't have this, set it */
if (BLI_ghash_haskey(gh, tempname) == 0) {
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 9ff7f1f2982..5af2c64da18 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -45,7 +45,6 @@
#include "PIL_time.h"
-#include "MEM_guardedalloc.h"
#include "CMP_node.h"
#include "intern/CMP_util.h" /* stupid include path... */
@@ -114,7 +113,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);
}
@@ -734,13 +734,7 @@ void nodeGroupSocketUseFlags(bNodeTree *ngroup)
/* finds a node based on its name */
bNode *nodeFindNodebyName(bNodeTree *ntree, const char *name)
{
- bNode *node=NULL;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if (strcmp(name, node->name) == 0)
- break;
- }
- return node;
+ return BLI_findstring(&ntree->nodes, name, offsetof(bNode, name));
}
/* finds a node based on given socket */
@@ -1063,6 +1057,7 @@ bNodeTree *ntreeAddTree(int type)
* - internal_select is only 1 when used for duplicating selected nodes (i.e. Shift-D duplicate operator)
* - this gets called when executing compositing updates (for threaded previews)
* - when the nodetree datablock needs to be copied (i.e. when users get copied)
+ * - for scene duplication use ntreeSwapID() after so we dont have stale pointers.
*/
bNodeTree *ntreeCopyTree(bNodeTree *ntree, int internal_select)
{
@@ -1141,6 +1136,18 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree, int internal_select)
return newtree;
}
+/* use when duplicating scenes */
+void ntreeSwitchID(bNodeTree *ntree, ID *id_from, ID *id_to)
+{
+ bNode *node;
+ /* for scene duplication only */
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->id==id_from) {
+ node->id= id_to;
+ }
+ }
+}
+
/* *************** preview *********** */
/* if node->preview, then we assume the rect to exist */
@@ -1841,9 +1848,8 @@ static void node_group_execute(bNodeStack *stack, void *data, bNode *gnode, bNod
/* for groups, only execute outputs for edited group */
if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
- if(gnode->flag & NODE_GROUP_EDIT)
- if(node->flag & NODE_DO_OUTPUT)
- node->typeinfo->execfunc(data, node, nsin, nsout);
+ if(node->type==CMP_NODE_OUTPUT_FILE || (gnode->flag & NODE_GROUP_EDIT))
+ node->typeinfo->execfunc(data, node, nsin, nsout);
}
else
node->typeinfo->execfunc(data, node, nsin, nsout);
@@ -2433,7 +2439,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;
@@ -2454,7 +2460,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);
@@ -2464,14 +2470,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;
@@ -2564,7 +2570,7 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree)
if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
if(node->id) {
if(node->flag & NODE_DO_OUTPUT)
- node->new_node->id= (ID *)BKE_image_copy((Image *)node->id);
+ node->new_node->id= (ID *)copy_image((Image *)node->id);
else
node->new_node->id= NULL;
}
@@ -2650,8 +2656,9 @@ void ntreeLocalMerge(bNodeTree *localtree, bNodeTree *ntree)
for(lsock= lnode->outputs.first; lsock; lsock= lsock->next) {
if(outsocket_exists(lnode->new_node, lsock->new_sock)) {
lsock->new_sock->ns.data= lsock->ns.data;
+ compbuf_set_node(lsock->new_sock->ns.data, lnode->new_node);
lsock->ns.data= NULL;
- lsock->new_sock= NULL;
+ lsock->new_sock= NULL;
}
}
}
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index ac679adb9c1..b43cf72b94b 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -33,10 +33,6 @@
#include <math.h>
#include <stdio.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "MEM_guardedalloc.h"
#include "DNA_anim_types.h"
@@ -287,8 +283,7 @@ 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->gpd) ((ID *)ob->gpd)->us--;
if(ob->defbase.first)
BLI_freelistN(&ob->defbase);
if(ob->pose)
@@ -321,11 +316,13 @@ 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)
{
+ Main *bmain= G.main;
Object *obt;
Material *mat;
World *wrld;
@@ -338,14 +335,16 @@ 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);
/* check all objects: parents en bevels and fields, also from libraries */
// FIXME: need to check all animation blocks (drivers)
- obt= G.main->object.first;
+ obt= bmain->object.first;
while(obt) {
if(obt->proxy==ob)
obt->proxy= NULL;
@@ -358,7 +357,7 @@ void unlink_object(Scene *scene, Object *ob)
if(obt->parent==ob) {
obt->parent= NULL;
- obt->recalc |= OB_RECALC;
+ obt->recalc |= OB_RECALC_ALL;
}
modifiers_foreachObjectLink(obt, unlink_object__unlinkModifierLinks, ob);
@@ -368,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) {
@@ -405,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);
@@ -516,7 +518,7 @@ void unlink_object(Scene *scene, Object *ob)
}
/* materials */
- mat= G.main->mat.first;
+ mat= bmain->mat.first;
while(mat) {
for(a=0; a<MAX_MTEX; a++) {
@@ -530,22 +532,16 @@ void unlink_object(Scene *scene, Object *ob)
}
/* textures */
- tex= G.main->tex.first;
+ tex= bmain->tex.first;
while(tex) {
if(tex->env) {
if(tex->env->object == ob) tex->env->object= NULL;
}
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;
+ wrld= bmain->world.first;
while(wrld) {
if(wrld->id.lib==NULL) {
for(a=0; a<MAX_MTEX; a++) {
@@ -558,7 +554,7 @@ void unlink_object(Scene *scene, Object *ob)
}
/* scenes */
- sce= G.main->scene.first;
+ sce= bmain->scene.first;
while(sce) {
if(sce->id.lib==NULL) {
if(sce->camera==ob) sce->camera= NULL;
@@ -590,7 +586,7 @@ void unlink_object(Scene *scene, Object *ob)
#if 0 // XXX old animation system
/* ipos */
- ipo= G.main->ipo.first;
+ ipo= bmain->ipo.first;
while(ipo) {
if(ipo->id.lib==NULL) {
IpoCurve *icu;
@@ -604,7 +600,7 @@ void unlink_object(Scene *scene, Object *ob)
#endif // XXX old animation system
/* screens */
- sc= G.main->screen.first;
+ sc= bmain->screen.first;
while(sc) {
ScrArea *sa= sc->areabase.first;
while(sa) {
@@ -614,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) {
@@ -634,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;
@@ -642,14 +665,14 @@ void unlink_object(Scene *scene, Object *ob)
}
/* groups */
- group= G.main->group.first;
+ group= bmain->group.first;
while(group) {
rem_from_group(group, ob, NULL, NULL);
group= group->id.next;
}
/* cameras */
- camera= G.main->camera.first;
+ camera= bmain->camera.first;
while(camera) {
if (camera->dof_ob==ob) {
camera->dof_ob = NULL;
@@ -679,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;
}
@@ -704,6 +726,7 @@ Camera *copy_camera(Camera *cam)
void make_local_camera(Camera *cam)
{
+ Main *bmain= G.main;
Object *ob;
Camera *camn;
int local=0, lib=0;
@@ -721,7 +744,7 @@ void make_local_camera(Camera *cam)
return;
}
- ob= G.main->object.first;
+ ob= bmain->object.first;
while(ob) {
if(ob->data==cam) {
if(ob->id.lib) lib= 1;
@@ -739,7 +762,7 @@ void make_local_camera(Camera *cam)
camn= copy_camera(cam);
camn->id.us= 0;
- ob= G.main->object.first;
+ ob= bmain->object.first;
while(ob) {
if(ob->data==cam) {
@@ -852,6 +875,7 @@ Lamp *copy_lamp(Lamp *la)
void make_local_lamp(Lamp *la)
{
+ Main *bmain= G.main;
Object *ob;
Lamp *lan;
int local=0, lib=0;
@@ -869,7 +893,7 @@ void make_local_lamp(Lamp *la)
return;
}
- ob= G.main->object.first;
+ ob= bmain->object.first;
while(ob) {
if(ob->data==la) {
if(ob->id.lib) lib= 1;
@@ -887,7 +911,7 @@ void make_local_lamp(Lamp *la)
lan= copy_lamp(la);
lan->id.us= 0;
- ob= G.main->object.first;
+ ob= bmain->object.first;
while(ob) {
if(ob->data==la) {
@@ -927,12 +951,6 @@ void free_lamp(Lamp *la)
la->id.icon_id = 0;
}
-void *add_wave()
-{
- return 0;
-}
-
-
/* *************************************************** */
static void *add_obdata_from_type(int type)
@@ -946,7 +964,6 @@ static void *add_obdata_from_type(int type)
case OB_CAMERA: return add_camera("Camera");
case OB_LAMP: return add_lamp("Lamp");
case OB_LATTICE: return add_lattice("Lattice");
- case OB_WAVE: return add_wave();
case OB_ARMATURE: return add_armature("Armature");
case OB_EMPTY: return NULL;
default:
@@ -961,12 +978,11 @@ 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";
case OB_LATTICE: return "Lattice";
- case OB_WAVE: return "Wave";
case OB_ARMATURE: return "Armature";
case OB_EMPTY: return "Empty";
default:
@@ -1031,6 +1047,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.;
@@ -1063,7 +1081,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;
}
@@ -1145,12 +1163,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;
@@ -1269,6 +1288,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);
}
@@ -1287,14 +1307,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]);
@@ -1349,6 +1369,7 @@ void expand_local_object(Object *ob)
void make_local_object(Object *ob)
{
+ Main *bmain= G.main;
Object *obn;
Scene *sce;
Base *base;
@@ -1370,7 +1391,7 @@ void make_local_object(Object *ob)
}
else {
- sce= G.main->scene.first;
+ sce= bmain->scene.first;
while(sce) {
base= sce->base.first;
while(base) {
@@ -1393,7 +1414,7 @@ void make_local_object(Object *ob)
obn= copy_object(ob);
obn->id.us= 0;
- sce= G.main->scene.first;
+ sce= bmain->scene.first;
while(sce) {
if(sce->id.lib==0) {
base= sce->base.first;
@@ -1474,10 +1495,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
}
@@ -1501,7 +1528,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) {
@@ -1570,20 +1597,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;
@@ -1593,11 +1608,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;
@@ -1618,10 +1631,7 @@ float bsystem_time(struct Scene *scene, Object *ob, float cfra, float ofs)
void object_scale_to_mat3(Object *ob, float mat[][3])
{
float vec[3];
-
- vec[0]= ob->size[0]+ob->dsize[0];
- vec[1]= ob->size[1]+ob->dsize[1];
- vec[2]= ob->size[2]+ob->dsize[2];
+ add_v3_v3v3(vec, ob->size, ob->dsize);
size_to_mat3( mat,vec);
}
@@ -1679,7 +1689,7 @@ void object_mat3_to_rot(Object *ob, float mat[][3], int use_compat)
void object_apply_mat4(Object *ob, float mat[][4])
{
float mat3[3][3];
- VECCOPY(ob->loc, mat[3]);
+ copy_v3_v3(ob->loc, mat[3]);
mat4_to_size(ob->size, mat);
copy_m3_m4(mat3, mat);
object_mat3_to_rot(ob, mat3, 0);
@@ -1706,10 +1716,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;
@@ -1765,7 +1773,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);
@@ -1789,7 +1797,7 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4])
copy_m4_m4(mat, rmat);
}
- VECCOPY(mat[3], vec);
+ copy_v3_v3(mat[3], vec);
}
}
@@ -1816,9 +1824,9 @@ static void ob_parbone(Object *ob, Object *par, float mat[][4])
copy_m4_m4(mat, pchan->pose_mat);
/* but for backwards compatibility, the child has to move to the tail */
- VECCOPY(vec, mat[1]);
+ copy_v3_v3(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)
@@ -1830,47 +1838,38 @@ static void give_parvert(Object *par, int nr, float *vec)
if(par->type==OB_MESH) {
Mesh *me= par->data;
- em = BKE_mesh_get_editmesh(me);
+ DerivedMesh *dm;
- if(em) {
- EditVert *eve;
+ em = BKE_mesh_get_editmesh(me);
+ dm = (em)? em->derivedFinal: par->derivedFinal;
- for(eve= em->verts.first; eve; eve= eve->next) {
- if(eve->keyindex==nr) {
- memcpy(vec, eve->co, sizeof(float)*3);
- break;
+ if(dm) {
+ MVert *mvert= dm->getVertArray(dm);
+ int *index = (int *)dm->getVertDataArray(dm, CD_ORIGINDEX);
+ int i, count = 0, vindex, numVerts = dm->getNumVerts(dm);
+
+ /* get the average of all verts with (original index == nr) */
+ for(i = 0; i < numVerts; i++) {
+ vindex= (index)? index[i]: i;
+
+ if(vindex == nr) {
+ add_v3_v3(vec, mvert[i].co);
+ count++;
}
}
- BKE_mesh_end_editmesh(me, em);
- }
- else {
- DerivedMesh *dm = par->derivedFinal;
-
- if(dm) {
- MVert *mvert= dm->getVertArray(dm);
- int *index = (int *)dm->getVertDataArray(dm, CD_ORIGINDEX);
- int i, count = 0, vindex, numVerts = dm->getNumVerts(dm);
-
- /* get the average of all verts with (original index == nr) */
- for(i = 0; i < numVerts; i++) {
- vindex= (index)? index[i]: i;
-
- if(vindex == nr) {
- add_v3_v3v3(vec, vec, mvert[i].co);
- count++;
- }
- }
- if (count==0) {
- /* keep as 0,0,0 */
- } else if(count > 0) {
- mul_v3_fl(vec, 1.0f / count);
- } else {
- /* use first index if its out of range */
- dm->getVertCo(dm, 0, vec);
- }
+ if (count==0) {
+ /* keep as 0,0,0 */
+ } else if(count > 0) {
+ mul_v3_fl(vec, 1.0f / count);
+ } else {
+ /* use first index if its out of range */
+ dm->getVertCo(dm, 0, vec);
}
}
+
+ if(em)
+ BKE_mesh_end_editmesh(me, em);
}
else if (ELEM(par->type, OB_CURVE, OB_SURF)) {
Nurb *nu;
@@ -1878,13 +1877,12 @@ static void give_parvert(Object *par, int nr, float *vec)
BPoint *bp;
BezTriple *bezt;
int found= 0;
-
+ ListBase *nurbs;
+
cu= par->data;
- if(cu->editnurb)
- nu= cu->editnurb->first;
- else
- nu= cu->nurb.first;
-
+ nurbs= BKE_curve_nurbs(cu);
+ nu= nurbs->first;
+
count= 0;
while(nu && !found) {
if(nu->type == CU_BEZIER) {
@@ -1923,7 +1921,7 @@ static void give_parvert(Object *par, int nr, float *vec)
DispList *dl = find_displist(&par->disp, DL_VERTS);
float *co = dl?dl->verts:NULL;
- if(latt->editlatt) latt= latt->editlatt;
+ if(latt->editlatt) latt= latt->editlatt->latt;
a= latt->pntsu*latt->pntsv*latt->pntsw;
count= 0;
@@ -1965,7 +1963,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);
}
}
@@ -2318,11 +2316,9 @@ void minmax_object(Object *ob, float *min, float *max)
if(ob->pose) {
bPoseChannel *pchan;
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- VECCOPY(vec, pchan->pose_head);
- mul_m4_v3(ob->obmat, vec);
+ mul_v3_m4v3(vec, ob->obmat, pchan->pose_head);
DO_MINMAX(vec, min, max);
- VECCOPY(vec, pchan->pose_tail);
- mul_m4_v3(ob->obmat, vec);
+ mul_v3_m4v3(vec, ob->obmat, pchan->pose_tail);
DO_MINMAX(vec, min, max);
}
break;
@@ -2346,12 +2342,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;
}
@@ -2458,14 +2454,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);
@@ -2489,13 +2497,15 @@ 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);
/* includes all keys and modifiers */
if(ob->type==OB_MESH) {
- EditMesh *em = BKE_mesh_get_editmesh(ob->data);
+ EditMesh *em = (ob == scene->obedit)? BKE_mesh_get_editmesh(ob->data): NULL;
/* evaluate drivers */
// XXX: should we push this to derivedmesh instead?
@@ -2522,11 +2532,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);
@@ -2577,6 +2582,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 */
@@ -2587,7 +2610,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 */
@@ -2712,7 +2735,7 @@ void object_camera_matrix(
float pixsize;
float shiftx=0.0, shifty=0.0, winside, viewfac;
- rd->mode &= ~R_ORTHO;
+ rd->mode &= ~(R_ORTHO|R_PANORAMA);
/* question mark */
(*ycor)= rd->yasp / rd->xasp;
@@ -2857,15 +2880,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;
}
@@ -2885,16 +2911,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;
@@ -2905,7 +2935,7 @@ static KeyBlock *insert_curvekey(Scene *scene, Object *ob, char *name, int from_
Curve *cu= ob->data;
Key *key= cu->key;
KeyBlock *kb;
- ListBase *lb= (cu->editnurb)? cu->editnurb: &cu->nurb;
+ ListBase *lb= BKE_curve_nurbs(cu);
int newkey= 0;
if(key==NULL) {
@@ -2914,16 +2944,23 @@ 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 */
- curve_to_key(cu, kb, lb);
+ kb= add_keyblock(key, name);
+ if (!newkey) {
+ KeyBlock *basekb= (KeyBlock *)key->block.first;
+ kb->data= MEM_dupallocN(basekb->data);
+ kb->totelem= basekb->totelem;
+ } else 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 b62f856e1f3..919a724d1ec 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
@@ -190,7 +186,7 @@ PackedFile *newPackedFile(ReportList *reports, char *filename)
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);
@@ -220,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 && strcmp(vf->name, "<builtin>") != 0)
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);
}
@@ -268,7 +264,7 @@ 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_path_abs(name, G.sce);
@@ -312,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);
}
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index cf5deb95258..ffb99c10c40 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -25,11 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "MEM_guardedalloc.h"
#include "DNA_object_types.h"
#include "DNA_mesh_types.h"
#include "DNA_scene_types.h"
+#include "DNA_brush_types.h"
#include "BKE_brush.h"
#include "BKE_library.h"
@@ -70,91 +70,13 @@ Paint *paint_get_active(Scene *sce)
Brush *paint_brush(Paint *p)
{
- return p && p->brushes ? p->brushes[p->active_brush_index] : NULL;
+ return p ? p->brush : NULL;
}
void paint_brush_set(Paint *p, Brush *br)
{
- if(p && !br) {
- /* Setting to NULL removes the current slot */
- paint_brush_slot_remove(p);
- }
- else if(p) {
- int found = 0;
-
- if(p->brushes) {
- int i;
-
- /* See if there's already a slot with the brush */
- for(i = 0; i < p->brush_count; ++i) {
- if(p->brushes[i] == br) {
- p->active_brush_index = i;
- found = 1;
- break;
- }
- }
-
- }
-
- if(!found) {
- paint_brush_slot_add(p);
- id_us_plus(&br->id);
- }
-
- /* Make sure the current slot is the new brush */
- p->brushes[p->active_brush_index] = br;
- }
-}
-
-static void paint_brush_slots_alloc(Paint *p, const int count)
-{
- p->brush_count = count;
- if(count == 0)
- p->brushes = NULL;
- else
- p->brushes = MEM_callocN(sizeof(Brush*) * count, "Brush slots");
-}
-
-void paint_brush_slot_add(Paint *p)
-{
- if(p) {
- Brush **orig = p->brushes;
- int orig_count = p->brushes ? p->brush_count : 0;
-
- /* Increase size of brush slot array */
- paint_brush_slots_alloc(p, orig_count + 1);
- if(orig) {
- memcpy(p->brushes, orig, sizeof(Brush*) * orig_count);
- MEM_freeN(orig);
- }
-
- p->active_brush_index = orig_count;
- }
-}
-
-void paint_brush_slot_remove(Paint *p)
-{
- if(p && p->brushes) {
- Brush **orig = p->brushes;
- int src, dst;
-
- /* Decrease size of brush slot array */
- paint_brush_slots_alloc(p, p->brush_count - 1);
- if(p->brushes) {
- for(src = 0, dst = 0; dst < p->brush_count; ++src) {
- if(src != p->active_brush_index) {
- p->brushes[dst] = orig[src];
- ++dst;
- }
- }
- }
- MEM_freeN(orig);
-
- if(p->active_brush_index >= p->brush_count)
- p->active_brush_index = p->brush_count - 1;
- if(p->active_brush_index < 0)
- p->active_brush_index = 0;
- }
+ if(p)
+ p->brush= br;
}
int paint_facesel_test(Object *ob)
@@ -168,7 +90,8 @@ void paint_init(Paint *p, const char col[3])
/* If there's no brush, create one */
brush = paint_brush(p);
- brush_check_exists(&brush, "Brush");
+ if(brush == NULL)
+ brush= add_brush("Brush");
paint_brush_set(p, brush);
memcpy(p->paint_cursor_col, col, 3);
@@ -179,16 +102,10 @@ void paint_init(Paint *p, const char col[3])
void free_paint(Paint *paint)
{
- if(paint->brushes)
- MEM_freeN(paint->brushes);
+ /* nothing */
}
-void copy_paint(Paint *orig, Paint *new)
+void copy_paint(Paint *src, Paint *tar)
{
- if(orig->brushes) {
- int i;
- new->brushes = MEM_dupallocN(orig->brushes);
- for(i = 0; i < orig->brush_count; ++i)
- id_us_plus((ID *)new->brushes[i]);
- }
+ tar->brush= src->brush;
}
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 7ad65820bbe..681c48b0cf8 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -40,12 +40,16 @@
#include "DNA_key_types.h"
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
#include "DNA_particle_types.h"
#include "DNA_smoke_types.h"
+#include "DNA_scene_types.h"
+#include "BLI_blenlib.h"
#include "BLI_kdtree.h"
#include "BLI_rand.h"
#include "BLI_threads.h"
+#include "BLI_math.h"
#include "BKE_anim.h"
#include "BKE_animsys.h"
@@ -396,7 +400,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);
@@ -620,8 +624,7 @@ static float psys_render_projected_area(ParticleSystem *psys, float *center, flo
mul_m4_v4(data->viewmat, co);
/* compute two vectors orthogonal to view vector */
- VECCOPY(view, co);
- normalize_v3(view);
+ normalize_v3_v3(view, co);
ortho_basis_v3v3_v3( ortho1, ortho2,view);
/* compute on screen minification */
@@ -1037,6 +1040,7 @@ typedef struct ParticleInterpolationData {
ParticleKey *kkey[2];
PointCache *cache;
+ PTCacheMem *pm;
PTCacheEditPoint *epoint;
PTCacheEditKey *ekey[2];
@@ -1045,31 +1049,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;
+
+ pm = *cur;
BKE_ptcache_make_particle_key(key2, pm->index_array ? pm->index_array[index] - 1 : index, pm->data, (float)pm->frame);
- BKE_ptcache_make_particle_key(key1, pm->prev->index_array ? pm->prev->index_array[index] - 1 : index, pm->prev->data, (float)pm->prev->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] - 1 : 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)
{
@@ -1091,10 +1138,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;
@@ -1137,6 +1189,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)
@@ -1221,7 +1276,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]);
@@ -1867,8 +1922,7 @@ static void do_prekink(ParticleKey *state, ParticleKey *par, float *par_rot, flo
mul_qt_v3(q2,z_vec);
VECSUB(vec_from_par,state->co,par->co);
- VECCOPY(vec_one,vec_from_par);
- radius=normalize_v3(vec_one);
+ radius= normalize_v3_v3(vec_one, vec_from_par);
inp_y=dot_v3v3(y_vec,vec_one);
inp_z=dot_v3v3(z_vec,vec_one);
@@ -1985,7 +2039,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) {
@@ -2007,11 +2061,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;
}
@@ -2051,10 +2105,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){
@@ -2122,7 +2180,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);
@@ -2731,12 +2789,12 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra)
int steps = (int)pow(2.0, (double)(psys->renderdata ? part->ren_step : part->draw_step));
int totpart = psys->totpart;
float length, vec[3];
- float *vg_effector= NULL, effector=0.0f;
+ float *vg_effector= NULL;
float *vg_length= NULL, pa_length=1.0f;
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))
@@ -2746,7 +2804,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);
@@ -2833,85 +2891,83 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra)
/*--modify paths and calculate rotation & velocity--*/
- sub_v3_v3v3(vec,(cache[p]+1)->co,cache[p]->co);
- length = len_v3(vec);
+ if(!(psys->flag & PSYS_GLOBAL_HAIR)) {
+ /* apply effectors */
+ if((psys->part->flag & PART_CHILD_EFFECT) == 0) {
+ float effector= 1.0f;
+ if(vg_effector)
+ effector*= psys_particle_value_from_verts(psmd->dm,psys->part->from,pa,vg_effector);
- effector= 1.0f;
- if(vg_effector)
- effector*= psys_particle_value_from_verts(psmd->dm,psys->part->from,pa,vg_effector);
+ sub_v3_v3v3(vec,(cache[p]+1)->co,cache[p]->co);
+ length = len_v3(vec);
- for(k=0, ca=cache[p]; k<=steps; k++, ca++) {
- if(!(psys->flag & PSYS_GLOBAL_HAIR)) {
- /* apply effectors */
- if(!(psys->part->flag & PART_CHILD_EFFECT) && k)
+ for(k=1, ca=cache[p]+1; k<=steps; k++, ca++)
do_path_effectors(sim, p, ca, k, steps, cache[p]->co, effector, dfra, cfra, &length, vec);
+ }
- /* apply guide curves to path data */
- if(sim->psys->effectors && (psys->part->flag & PART_CHILD_EFFECT)==0)
+ /* apply guide curves to path data */
+ if(sim->psys->effectors && (psys->part->flag & PART_CHILD_EFFECT)==0) {
+ for(k=0, ca=cache[p]; k<=steps; k++, ca++)
/* ca is safe to cast, since only co and vel are used */
do_guides(sim->psys->effectors, (ParticleKey*)ca, p, (float)k/(float)steps);
+ }
- /* apply lattice */
- if(psys->lattice)
+ /* lattices have to be calculated separately to avoid mixups between effector calculations */
+ if(psys->lattice) {
+ for(k=0, ca=cache[p]; k<=steps; k++, ca++)
calc_latt_deform(psys->lattice, ca->co, 1.0f);
+ }
+ }
- /* figure out rotation */
-
- if(k) {
- float cosangle, angle, tangent[3], normal[3], q[4];
-
- if(k == 1) {
- /* calculate initial tangent for incremental rotations */
- VECSUB(tangent, ca->co, (ca - 1)->co);
- VECCOPY(prev_tangent, tangent);
- normalize_v3(prev_tangent);
-
- /* First rotation is based on emitting face orientation. */
- /* This is way better than having flipping rotations resulting */
- /* from using a global axis as a rotation pole (vec_to_quat()). */
- /* It's not an ideal solution though since it disregards the */
- /* initial tangent, but taking that in to account will allow */
- /* the possibility of flipping again. -jahka */
- mat3_to_quat_is_ok( (ca-1)->rot,rotmat);
- }
- else {
- VECSUB(tangent, ca->co, (ca - 1)->co);
- normalize_v3(tangent);
-
- cosangle= dot_v3v3(tangent, prev_tangent);
-
- /* note we do the comparison on cosangle instead of
- * angle, since floating point accuracy makes it give
- * different results across platforms */
- if(cosangle > 0.999999f) {
- QUATCOPY((ca - 1)->rot, (ca - 2)->rot);
- }
- else {
- angle= saacos(cosangle);
- cross_v3_v3v3(normal, prev_tangent, tangent);
- axis_angle_to_quat( q,normal, angle);
- mul_qt_qtqt((ca - 1)->rot, q, (ca - 2)->rot);
- }
+ /* finally do rotation & velocity */
+ for(k=1, ca=cache[p]+1; k<=steps; k++, ca++) {
+ /* figure out rotation */
+ float cosangle, angle, tangent[3], normal[3], q[4];
+
+ if(k == 1) {
+ /* calculate initial tangent for incremental rotations */
+ VECSUB(tangent, ca->co, (ca - 1)->co);
+ normalize_v3_v3(prev_tangent, tangent);
+
+ /* First rotation is based on emitting face orientation. */
+ /* This is way better than having flipping rotations resulting */
+ /* from using a global axis as a rotation pole (vec_to_quat()). */
+ /* It's not an ideal solution though since it disregards the */
+ /* initial tangent, but taking that in to account will allow */
+ /* the possibility of flipping again. -jahka */
+ mat3_to_quat_is_ok( (ca-1)->rot,rotmat);
+ }
+ else {
+ VECSUB(tangent, ca->co, (ca - 1)->co);
+ normalize_v3(tangent);
- VECCOPY(prev_tangent, tangent);
- }
+ cosangle= dot_v3v3(tangent, prev_tangent);
- if(k == steps)
- QUATCOPY(ca->rot, (ca - 1)->rot);
+ /* note we do the comparison on cosangle instead of
+ * angle, since floating point accuracy makes it give
+ * different results across platforms */
+ if(cosangle > 0.999999f) {
+ QUATCOPY((ca - 1)->rot, (ca - 2)->rot);
+ }
+ else {
+ angle= saacos(cosangle);
+ cross_v3_v3v3(normal, prev_tangent, tangent);
+ axis_angle_to_quat( q,normal, angle);
+ mul_qt_qtqt((ca - 1)->rot, q, (ca - 2)->rot);
}
+ VECCOPY(prev_tangent, tangent);
}
-
- /* set velocity */
- if(k){
- VECSUB(ca->vel, ca->co, (ca-1)->co);
+ if(k == steps)
+ QUATCOPY(ca->rot, (ca - 1)->rot);
+
- if(k==1) {
- VECCOPY((ca-1)->vel, ca->vel);
- }
+ /* set velocity */
+ VECSUB(ca->vel, ca->co, (ca-1)->co);
- }
+ if(k==1)
+ VECCOPY((ca-1)->vel, ca->vel);
}
}
@@ -2946,7 +3002,7 @@ 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, recalc_set=0;
float sel_col[3];
@@ -3047,8 +3103,7 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf
if(k == 1) {
/* calculate initial tangent for incremental rotations */
VECSUB(tangent, ca->co, (ca - 1)->co);
- VECCOPY(prev_tangent, tangent);
- normalize_v3(prev_tangent);
+ normalize_v3_v3(prev_tangent, tangent);
/* First rotation is based on emitting face orientation. */
/* This is way better than having flipping rotations resulting */
@@ -3093,17 +3148,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){
@@ -3132,7 +3196,7 @@ 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);
}
@@ -3331,7 +3395,7 @@ ModifierData *object_add_particle_system(Scene *scene, Object *ob, char *name)
psys->flag = PSYS_ENABLED|PSYS_CURRENT;
psys->cfra=bsystem_time(scene,ob,scene->r.cfra+1,0.0);
- DAG_scene_sort(scene);
+ DAG_scene_sort(G.main, scene);
DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
return md;
@@ -3368,7 +3432,7 @@ void object_remove_particle_system(Scene *scene, Object *ob)
else
ob->mode &= ~OB_MODE_PARTICLE_EDIT;
- DAG_scene_sort(scene);
+ DAG_scene_sort(G.main, scene);
DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
static void default_particle_settings(ParticleSettings *part)
@@ -3471,6 +3535,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);
@@ -4191,8 +4256,13 @@ void psys_get_dupli_texture(Object *ob, ParticleSettings *part, ParticleSystemMo
num= pa->num_dmcache;
if(num == DMCACHE_NOTFOUND)
- if(pa->num < psmd->dm->getNumFaces(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->getFaceData(psmd->dm, num, CD_MFACE);
@@ -4215,18 +4285,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];
@@ -4239,6 +4302,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) {
@@ -4272,24 +4346,35 @@ 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;
if(bb->lock && (bb->align == PART_BB_VIEW)) {
- VECCOPY(xvec, bb->ob->obmat[0]);
- normalize_v3(xvec);
-
- VECCOPY(yvec, bb->ob->obmat[1]);
- normalize_v3(yvec);
-
- VECCOPY(zvec, bb->ob->obmat[2]);
- normalize_v3(zvec);
+ normalize_v3_v3(xvec, bb->ob->obmat[0]);
+ normalize_v3_v3(yvec, bb->ob->obmat[1]);
+ normalize_v3_v3(zvec, bb->ob->obmat[2]);
}
else if(bb->align == PART_BB_VEL) {
float temp[3];
- VECCOPY(temp, bb->vel);
- normalize_v3(temp);
+ normalize_v3_v3(temp, bb->vel);
VECSUB(zvec, bb->ob->obmat[3], bb->vec);
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 0a202e8166e..cfbab609f37 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -62,7 +62,6 @@
#include "BLI_listbase.h"
#include "BLI_threads.h"
-#include "BKE_anim.h"
#include "BKE_animsys.h"
#include "BKE_boids.h"
#include "BKE_cdderivedmesh.h"
@@ -182,7 +181,7 @@ static void realloc_particles(ParticleSimulationData *sim, int new_totpart)
else
totpart=new_totpart;
- if(totpart && totpart != psys->totpart) {
+ if(totpart != psys->totpart) {
if(psys->edit && psys->free_edit) {
psys->free_edit(psys->edit);
psys->edit = NULL;
@@ -617,6 +616,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)
@@ -632,6 +635,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 */
@@ -669,6 +673,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;
}
@@ -720,7 +726,7 @@ static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData
pa->foffset=0.0;
else switch(distr){
case PART_DISTR_JIT:
- pa->foffset*= ctx->jit[2*(int)ctx->jitoff[i]];
+ pa->foffset*= ctx->jit[p%(2*ctx->jitlevel)];
break;
case PART_DISTR_RAND:
pa->foffset*=BLI_frand();
@@ -751,6 +757,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];
@@ -859,6 +867,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)
@@ -875,12 +886,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 {
@@ -1718,8 +1729,7 @@ void reset_particle(ParticleSimulationData *sim, ParticleData *pa, float dtime,
mul_qt_v3(rot, vtan);
mul_qt_v3(rot, utan);
- VECCOPY(p_vel, state.vel);
- speed=normalize_v3(p_vel);
+ speed= normalize_v3_v3(p_vel, state.vel);
mul_v3_fl(p_vel, dot_v3v3(r_vel, p_vel));
VECSUB(p_vel, r_vel, p_vel);
normalize_v3(p_vel);
@@ -1860,18 +1870,15 @@ void reset_particle(ParticleSimulationData *sim, ParticleData *pa, float dtime,
/* *emitter object orientation */
if(part->ob_vel[0]!=0.0) {
- VECCOPY(vec, ob->obmat[0]);
- normalize_v3(vec);
+ normalize_v3_v3(vec, ob->obmat[0]);
VECADDFAC(vel, vel, vec, part->ob_vel[0]);
}
if(part->ob_vel[1]!=0.0) {
- VECCOPY(vec, ob->obmat[1]);
- normalize_v3(vec);
+ normalize_v3_v3(vec, ob->obmat[1]);
VECADDFAC(vel, vel, vec, part->ob_vel[1]);
}
if(part->ob_vel[2]!=0.0) {
- VECCOPY(vec, ob->obmat[2]);
- normalize_v3(vec);
+ normalize_v3_v3(vec, ob->obmat[2]);
VECADDFAC(vel, vel, vec, part->ob_vel[2]);
}
@@ -2308,8 +2315,7 @@ void particle_fluidsim(ParticleSystem *psys, ParticleData *pa, ParticleSettings
VECCOPY(start, pa->prev_state.co);
VECCOPY(end, pa->state.co);
- sub_v3_v3v3(v, end, start);
- mul_v3_fl(v, 1.f/dtime);
+ VECCOPY(v, pa->state.vel);
neighbours = BLI_kdtree_range_search(tree, radius, start, NULL, &ptn);
@@ -2386,7 +2392,7 @@ void particle_fluidsim(ParticleSystem *psys, ParticleData *pa, ParticleSettings
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 dtime = dfra*psys_get_timestep(sim);
float particle_mass = part->mass;
particle_fluidsim(psys, pa, part, sim, dfra, cfra, particle_mass);
@@ -3118,7 +3124,7 @@ static void psys_update_path_cache(ParticleSimulationData *sim, float cfra)
if(part->childtype) {
if(!psys->totchild)
skip = 1;
- else if((psys->part->type == PART_HAIR && psys->flag & PSYS_HAIR_DONE)==0)
+ else if(psys->part->type == PART_HAIR && (psys->flag & PSYS_HAIR_DONE)==0)
skip = 1;
if(!skip)
@@ -3267,8 +3273,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;
@@ -3688,8 +3694,8 @@ static void system_step(ParticleSimulationData *sim, float cfra)
PTCacheID pid, *use_cache = NULL;
PARTICLE_P;
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;
+ 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;
@@ -3732,7 +3738,7 @@ static void system_step(ParticleSimulationData *sim, float cfra)
oldtotpart = psys->totpart;
emit = emit_particles(sim, use_cache, cfra);
- if(emit > 0)
+ if(use_cache && emit > 0)
BKE_ptcache_id_clear(&pid, PTCACHE_CLEAR_ALL, cfra);
init = emit*emit + (psys->recalc & PSYS_RECALC_RESET);
@@ -3790,18 +3796,23 @@ 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;
+ }
}
+
}
/* 4. only write cache starting from second frame */
@@ -3959,7 +3970,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 */
@@ -4022,12 +4033,21 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys)
case PART_PHYS_NO:
case PART_PHYS_KEYED:
{
+ PARTICLE_P;
+
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);
+
+ LOOP_EXISTING_PARTICLES {
+ pa->size = part->size;
+ if(part->randsize > 0.0)
+ pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1);
+
+ reset_particle(&sim, pa, 0.0, cfra);
+ }
if(part->phystype == PART_PHYS_KEYED) {
psys_count_keyed_targets(&sim);
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index 807e25955a7..a35e40d7cf7 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -43,6 +43,7 @@
#include "BLI_blenlib.h"
#include "BLI_threads.h"
+#include "BLI_math.h"
#include "PIL_time.h"
@@ -802,31 +803,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));
@@ -1035,11 +1042,13 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int dup
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");
+ if(dob->ob != ob) { /* avoids recursive loops with dupliframes: bug 22988 */
+ 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 */
@@ -1061,20 +1070,20 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int dup
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(blendfilename, NULL, file);
i = strlen(file);
@@ -1328,7 +1337,7 @@ void BKE_ptcache_mem_incr_pointers(PTCacheMem *pm)
pm->cur[i] = (char*)pm->cur[i] + ptcache_data_size[i];
}
}
-static int BKE_ptcache_mem_seek_pointers(int point_index, PTCacheMem *pm)
+int BKE_ptcache_mem_seek_pointers(int point_index, PTCacheMem *pm)
{
int data_types = pm->data_types;
int i, index = pm->index_array ? pm->index_array[point_index] - 1 : point_index;
@@ -1377,7 +1386,9 @@ 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]);
}
}
@@ -1704,14 +1715,13 @@ int BKE_ptcache_write_cache(PTCacheID *pid, int cfra)
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=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) {
@@ -1923,7 +1933,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 {
@@ -1955,7 +1965,8 @@ 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);
BLI_freelistN(&pid->cache->mem_cache);
@@ -2229,7 +2240,7 @@ void BKE_ptcache_remove(void)
static int CONTINUE_PHYSICS = 0;
-void BKE_ptcache_set_continue_physics(Scene *scene, int enable)
+void BKE_ptcache_set_continue_physics(Main *bmain, Scene *scene, int enable)
{
Object *ob;
@@ -2237,7 +2248,7 @@ void BKE_ptcache_set_continue_physics(Scene *scene, int enable)
CONTINUE_PHYSICS = enable;
if(CONTINUE_PHYSICS == 0) {
- for(ob=G.main->object.first; ob; ob=ob->id.next)
+ for(ob=bmain->object.first; ob; ob=ob->id.next)
if(BKE_ptcache_object_reset(scene, ob, PTCACHE_RESET_OUTDATED))
DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
@@ -2325,40 +2336,7 @@ PointCache *BKE_ptcache_copy_list(ListBase *ptcaches_new, ListBase *ptcaches_old
/* Baking */
-static int count_quick_cache(Scene *scene, int *quick_step)
-{
- Base *base;
- PTCacheID *pid;
- ListBase pidlist;
- int autocache_count= 0;
- Scene *sce; /* for macro only */
-
- for(SETLOOPER(scene, base)) {
- if(base->object) {
- BKE_ptcache_ids_from_object(&pidlist, base->object, 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) {
- 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)
+void BKE_ptcache_quick_cache_all(Main *bmain, Scene *scene)
{
PTCacheBaker baker;
@@ -2371,10 +2349,11 @@ void BKE_ptcache_quick_cache_all(Scene *scene)
baker.progresscontext=NULL;
baker.render=0;
baker.anim_init = 0;
+ baker.main=bmain;
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
@@ -2385,14 +2364,19 @@ typedef struct {
int endframe;
int step;
int *cfra_ptr;
+ Main *main;
Scene *scene;
} ptcache_make_cache_data;
static void *ptcache_make_cache_thread(void *ptr) {
ptcache_make_cache_data *data = (ptcache_make_cache_data*)ptr;
- for(; (*data->cfra_ptr <= data->endframe) && !data->break_operation; *data->cfra_ptr+=data->step)
- scene_update_for_newframe(data->scene, data->scene->lay);
+ for(; (*data->cfra_ptr <= data->endframe) && !data->break_operation; *data->cfra_ptr+=data->step) {
+ scene_update_for_newframe(data->main, 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;
@@ -2401,6 +2385,7 @@ static void *ptcache_make_cache_thread(void *ptr) {
/* if bake is not given run simulations to current frame */
void BKE_ptcache_make_cache(PTCacheBaker* baker)
{
+ Main *bmain = baker->main;
Scene *scene = baker->scene;
Scene *sce; /* SETLOOPER macro only */
Base *base;
@@ -2420,6 +2405,7 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
thread_data.step = baker->quick_step;
thread_data.cfra_ptr = &CFRA;
thread_data.scene = baker->scene;
+ thread_data.main = baker->main;
G.afbreek = 0;
@@ -2428,8 +2414,13 @@ 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;
@@ -2467,7 +2458,7 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
cache->flag &= ~PTCACHE_BAKED;
}
}
- for(SETLOOPER(scene, base)) {
+ else for(SETLOOPER(scene, base)) {
/* cache/bake everything in the scene */
BKE_ptcache_ids_from_object(&pidlist, base->object, scene, MAX_DUPLI_RECUR);
@@ -2509,36 +2500,40 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
thread_data.thread_ended = FALSE;
old_progress = -1;
- BLI_init_threads(&threads, ptcache_make_cache_thread, 1);
- BLI_insert_thread(&threads, (void*)&thread_data);
-
- while (thread_data.thread_ended == FALSE) {
+ 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);
- if(bake)
- progress = (int)(100.0f * (float)(CFRA - startframe)/(float)(thread_data.endframe-startframe));
- else
- progress = CFRA;
+ while (thread_data.thread_ended == FALSE) {
- /* 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);
+ 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);
+ /* 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);
@@ -2580,7 +2575,7 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
CFRA = cfrao;
if(bake) /* already on cfra unless baking */
- scene_update_for_newframe(scene, scene->lay);
+ scene_update_for_newframe(bmain, scene, scene->lay);
if (thread_data.break_operation)
WM_cursor_wait(0);
@@ -2676,7 +2671,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);
@@ -2686,7 +2682,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);
@@ -2702,7 +2699,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)
@@ -2712,7 +2710,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;
}
@@ -2896,6 +2895,6 @@ void BKE_ptcache_invalidate(PointCache *cache)
{
cache->flag &= ~PTCACHE_SIMULATION_VALID;
cache->simframe = 0;
- cache->last_exact = 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 1129cc9d736..d8001572b4f 100644
--- a/source/blender/blenkernel/intern/property.c
+++ b/source/blender/blenkernel/intern/property.c
@@ -32,13 +32,10 @@
#include <stdio.h>
#include <stdlib.h>
+#include <stddef.h>
#include <string.h>
#include <ctype.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "MEM_guardedalloc.h"
#include "DNA_property_types.h"
@@ -184,14 +181,7 @@ void unique_property(bProperty *first, bProperty *prop, int force)
bProperty *get_ob_property(Object *ob, char *name)
{
- bProperty *prop;
-
- prop= ob->prop.first;
- while(prop) {
- if( strcmp(prop->name, name)==0 ) return prop;
- prop= prop->next;
- }
- return NULL;
+ return BLI_findstring(&ob->prop, name, offsetof(bProperty, name));
}
void set_ob_property(Object *ob, bProperty *propc)
diff --git a/source/blender/blenkernel/intern/report.c b/source/blender/blenkernel/intern/report.c
index a7800ddc12a..173c6c136f2 100644
--- a/source/blender/blenkernel/intern/report.c
+++ b/source/blender/blenkernel/intern/report.c
@@ -31,6 +31,8 @@
#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>
@@ -65,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;
}
@@ -93,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 */
@@ -257,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 e32f5aac517..f5ca7ee3cef 100644
--- a/source/blender/blenkernel/intern/sca.c
+++ b/source/blender/blenkernel/intern/sca.c
@@ -29,10 +29,6 @@
* 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>
@@ -48,6 +44,8 @@
#include "BKE_utildefines.h"
#include "BKE_global.h"
#include "BKE_main.h"
+#include "BKE_library.h"
+#include "BKE_sca.h"
/* ******************* SENSORS ************************ */
@@ -102,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;
@@ -149,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 */
@@ -184,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;
@@ -308,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;
@@ -344,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);
}
@@ -361,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;
@@ -368,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;
}
@@ -387,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);
@@ -421,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");
@@ -436,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");
@@ -481,7 +487,6 @@ bActuator *new_actuator(int type)
}
/* ******************** GENERAL ******************* */
-
void clear_sca_new_poins_ob(Object *ob)
{
bSensor *sens;
@@ -652,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 fc6b7e7d789..8793c412d7d 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -33,21 +33,20 @@
#include <stdio.h>
#include <string.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#ifndef WIN32
#include <unistd.h>
#else
#include <io.h>
#endif
-#include "MEM_guardedalloc.h"
#include "DNA_anim_types.h"
#include "DNA_group_types.h"
+#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
+#include "DNA_sequence_types.h"
+
+#include "MEM_guardedalloc.h"
#include "BKE_anim.h"
#include "BKE_animsys.h"
@@ -70,10 +69,6 @@
//XXX #include "BIF_previewrender.h"
//XXX #include "BIF_editseq.h"
-#ifndef DISABLE_PYTHON
-#include "BPY_extern.h"
-#endif
-
#include "BLI_math.h"
#include "BLI_blenlib.h"
@@ -174,9 +169,12 @@ Scene *copy_scene(Main *bmain, Scene *sce, int type)
BLI_duplicatelist(&(scen->transform_spaces), &(sce->transform_spaces));
BLI_duplicatelist(&(scen->r.layers), &(sce->r.layers));
BKE_keyingsets_copy(&(scen->keyingsets), &(sce->keyingsets));
-
- scen->nodetree= ntreeCopyTree(sce->nodetree, 0);
-
+
+ if(sce->nodetree) {
+ scen->nodetree= ntreeCopyTree(sce->nodetree, 0);
+ ntreeSwitchID(scen->nodetree, &sce->id, &scen->id);
+ }
+
obase= sce->base.first;
base= scen->base.first;
while(base) {
@@ -201,6 +199,10 @@ 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! */
@@ -215,6 +217,12 @@ Scene *copy_scene(Main *bmain, Scene *sce, int type)
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);
@@ -309,12 +317,13 @@ void free_scene(Scene *sce)
Scene *add_scene(char *name)
{
+ Main *bmain= G.main;
Scene *sce;
ParticleEditSettings *pset;
int a;
- sce= alloc_libblock(&G.main->scene, ID_SCE, name);
- sce->lay= 1;
+ sce= alloc_libblock(&bmain->scene, ID_SCE, name);
+ sce->lay= sce->layact= 1;
sce->r.mode= R_GAMMA|R_OSA|R_SHADOW|R_SSS|R_ENVMAP|R_RAYTRACE;
sce->r.cfra= 1;
@@ -388,6 +397,7 @@ Scene *add_scene(char *name)
sce->toolsettings->jointrilimit = 0.8f;
sce->toolsettings->selectmode= SCE_SELECT_VERTEX;
+ sce->toolsettings->uv_selectmode= UV_SELECT_VERTEX;
sce->toolsettings->normalsize= 0.1;
sce->toolsettings->autokey_mode= U.autokey_mode;
@@ -493,7 +503,7 @@ Base *object_in_scene(Object *ob, Scene *sce)
return NULL;
}
-void set_scene_bg(Scene *scene)
+void set_scene_bg(Main *bmain, Scene *scene)
{
Scene *sce;
Base *base;
@@ -503,14 +513,18 @@ void set_scene_bg(Scene *scene)
int flag;
/* check for cyclic sets, for reading old files but also for definite security (py?) */
- scene_check_setscene(scene);
+ scene_check_setscene(bmain, scene);
+ /* can happen when switching modes in other scenes */
+ if(scene->obedit && !(scene->obedit->mode & OB_MODE_EDIT))
+ scene->obedit= NULL;
+
/* deselect objects (for dataselect) */
- for(ob= G.main->object.first; ob; ob= ob->id.next)
+ for(ob= bmain->object.first; ob; ob= ob->id.next)
ob->flag &= ~(SELECT|OB_FROMGROUP);
/* group flags again */
- for(group= G.main->group.first; group; group= group->id.next) {
+ for(group= bmain->group.first; group; group= group->id.next) {
go= group->gobject.first;
while(go) {
if(go->ob) go->ob->flag |= OB_FROMGROUP;
@@ -519,12 +533,12 @@ void set_scene_bg(Scene *scene)
}
/* sort baselist */
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
/* ensure dags are built for sets */
for(sce= scene->set; sce; sce= sce->set)
if(sce->theDag==NULL)
- DAG_scene_sort(sce);
+ DAG_scene_sort(bmain, sce);
/* copy layers and flags from bases to objects */
for(base= scene->base.first; base; base= base->next) {
@@ -546,18 +560,17 @@ void set_scene_bg(Scene *scene)
}
/* called from creator.c */
-void set_scene_name(char *name)
+Scene *set_scene_name(Main *bmain, 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(bmain, 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)
@@ -571,7 +584,7 @@ void unlink_scene(Main *bmain, Scene *sce, Scene *newsce)
sce1->set= NULL;
/* check all sequences */
- clear_scene_in_allseqs(sce);
+ clear_scene_in_allseqs(bmain, sce);
/* check render layer nodes in other scenes */
clear_scene_in_nodes(bmain, sce);
@@ -587,7 +600,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;
@@ -616,17 +629,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;
+ while((*scene)->set) {
+ (*scene)= (*scene)->set;
+ if((*scene)->base.first) {
+ *base= (*scene)->base.first;
+ *ob= (*base)->object;
+ fase= F_SCENE;
+ break;
+ }
}
}
}
@@ -636,11 +653,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;
+ }
}
}
}
@@ -655,7 +675,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;
@@ -691,6 +711,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;
@@ -849,7 +873,7 @@ void scene_select_base(Scene *sce, Base *selbase)
}
/* checks for cycle, returns 1 if it's all OK */
-int scene_check_setscene(Scene *sce)
+int scene_check_setscene(Main *bmain, Scene *sce)
{
Scene *scene;
int a, totscene;
@@ -857,7 +881,7 @@ int scene_check_setscene(Scene *sce)
if(sce->set==NULL) return 1;
totscene= 0;
- for(scene= G.main->scene.first; scene; scene= scene->id.next)
+ for(scene= bmain->scene.first; scene; scene= scene->id.next)
totscene++;
for(a=0, scene=sce; scene->set; scene=scene->set, a++) {
@@ -872,102 +896,71 @@ 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 *scene, int cfra, unsigned int lay)
+static void scene_update_tagged_recursive(Main *bmain, Scene *scene, Scene *scene_parent)
{
Base *base;
- Object *ob;
- int cfra_back= scene->r.cfra;
- scene->r.cfra= cfra;
-
+
+ /* 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(bmain, scene->set, scene_parent);
+
for(base= scene->base.first; base; base= base->next) {
- ob= base->object;
-
- object_handle_update(scene, ob); // bke_object.h
+ Object *ob= base->object;
+
+ object_handle_update(scene_parent, ob);
if(ob->dup_group && (ob->transflag & OB_DUPLIGROUP))
- group_handle_recalc_and_update(scene, ob, ob->dup_group);
-
- /* only update layer when an ipo */
- // XXX old animation system
- //if(ob->ipo && has_ipo_code(ob->ipo, OB_LAY) ) {
- // base->lay= ob->lay;
- //}
+ group_handle_recalc_and_update(scene_parent, ob, ob->dup_group);
+
+ /* always update layer, so that animating layers works */
+ base->lay= ob->lay;
}
-
- scene->r.cfra= cfra_back;
}
/* this is called in main loop, doing tagged updates before redraw */
-void scene_update_tagged(Scene *scene)
+void scene_update_tagged(Main *bmain, Scene *scene)
{
- Scene *sce;
- Base *base;
- Object *ob;
- 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)) {
- ob= base->object;
-
- object_handle_update(scene, ob);
-
- if(ob->dup_group && (ob->transflag & OB_DUPLIGROUP))
- group_handle_recalc_and_update(scene, ob, ob->dup_group);
- }
- }
-
- for(base= scene->base.first; base; base= base->next) {
- ob= base->object;
-
- object_handle_update(scene, ob);
-
- if(ob->dup_group && (ob->transflag & OB_DUPLIGROUP))
- group_handle_recalc_and_update(scene, ob, ob->dup_group);
- }
+ scene_update_tagged_recursive(bmain, 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);
}
- /* XXX - this is called far to often, should be made apart of the depgraph */
- BKE_ptcache_quick_cache_all(scene);
+ if(scene->physics_settings.quick_cache_step)
+ BKE_ptcache_quick_cache_all(bmain, scene);
/* in the future this should handle updates for all datablocks, not
only objects and scenes. - brecht */
}
/* applies changes right away, does all sets too */
-void scene_update_for_newframe(Scene *sce, unsigned int lay)
+void scene_update_for_newframe(Main *bmain, 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 */
@@ -975,13 +968,13 @@ void scene_update_for_newframe(Scene *sce, unsigned int lay)
for(sce_iter= sce; sce_iter; sce_iter= sce_iter->set) {
if(sce_iter->theDag==NULL)
- DAG_scene_sort(sce_iter);
+ DAG_scene_sort(bmain, sce_iter);
}
/* Following 2 functions are recursive
- * so dont call within 'scene_update_newframe' */
- DAG_scene_update_flags(sce, lay); // only stuff that moves or needs display still
+ * so dont call within 'scene_update_tagged_recursive' */
+ DAG_scene_update_flags(bmain, sce, lay); // only stuff that moves or needs display still
/* All 'standard' (i.e. without any dependencies) animation is handled here,
* with an 'local' to 'macro' order of evaluation. This should ensure that
@@ -989,16 +982,11 @@ void scene_update_for_newframe(Scene *sce, unsigned int lay)
* can be overridden by settings from Scene, which owns the Texture through a hierarchy
* such as Scene->World->MTex/Texture) can still get correctly overridden.
*/
- BKE_animsys_evaluate_all_animation(G.main, ctime);
+ BKE_animsys_evaluate_all_animation(bmain, 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, sce->r.cfra, lay);
- }
-
- scene_update_newframe(sce, sce->r.cfra, lay);
+ /* object_handle_update() on all objects, groups and sets */
+ scene_update_tagged_recursive(bmain, sce, sce);
}
/* return default layer, also used to patch old files */
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 59a8bd74910..6f1d32898f9 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -42,10 +42,6 @@
#include "BKE_screen.h"
-#ifndef DISABLE_PYTHON
-#include "BPY_extern.h"
-#endif
-
/* ************ Spacetype/regiontype handling ************** */
/* keep global; this has to be accessible outside of windowmanager */
@@ -235,27 +231,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)
{
@@ -351,3 +326,67 @@ 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/seqcache.c b/source/blender/blenkernel/intern/seqcache.c
new file mode 100644
index 00000000000..4d58ec8212a
--- /dev/null
+++ b/source/blender/blenkernel/intern/seqcache.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.
+ *
+ * Peter Schlaile <peter [at] schlaile [dot] de> 2010
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "MEM_guardedalloc.h"
+#include "MEM_CacheLimiterC-Api.h"
+
+#include "DNA_sequence_types.h"
+#include "BKE_sequencer.h"
+#include "BLI_ghash.h"
+#include "BLI_mempool.h"
+#include <pthread.h>
+
+#include "IMB_imbuf.h"
+#include "IMB_imbuf_types.h"
+
+typedef struct seqCacheKey
+{
+ struct Sequence * seq;
+ int rectx;
+ int recty;
+ float cfra;
+ seq_stripelem_ibuf_t type;
+} seqCacheKey;
+
+typedef struct seqCacheEntry
+{
+ ImBuf * ibuf;
+ MEM_CacheLimiterHandleC * c_handle;
+} seqCacheEntry;
+
+static GHash * hash = 0;
+static MEM_CacheLimiterC * limitor = 0;
+static struct BLI_mempool * entrypool = 0;
+static struct BLI_mempool * keypool = 0;
+static int ibufs_in = 0;
+static int ibufs_rem = 0;
+
+static unsigned int HashHash(void *key_)
+{
+ seqCacheKey * key = (seqCacheKey*) key_;
+ unsigned int rval = key->rectx + key->recty;
+
+ rval ^= *(unsigned int*) &key->cfra;
+ rval += key->type;
+ rval ^= ((unsigned int) key->seq) << 6;
+
+ return rval;
+}
+
+static int HashCmp(void *a_, void *b_)
+{
+ seqCacheKey * a = (seqCacheKey*) a_;
+ seqCacheKey * b = (seqCacheKey*) b_;
+
+ if (a->seq < b->seq) {
+ return -1;
+ }
+ if (a->seq > b->seq) {
+ return 1;
+ }
+
+ if (a->cfra < b->cfra) {
+ return -1;
+ }
+ if (a->cfra > b->cfra) {
+ return 1;
+ }
+
+ if (a->type < b->type) {
+ return -1;
+ }
+ if (a->type > b->type) {
+ return 1;
+ }
+
+ if (a->rectx < b->rectx) {
+ return -1;
+ }
+ if (a->rectx > b->rectx) {
+ return 1;
+ }
+
+ if (a->recty < b->recty) {
+ return -1;
+ }
+ if (a->recty > b->recty) {
+ return 1;
+ }
+
+ return 0;
+}
+
+static void HashKeyFree(void *key)
+{
+ BLI_mempool_free(keypool, key);
+}
+
+static void HashValFree(void *val)
+{
+ seqCacheEntry* e = (seqCacheEntry*) val;
+
+ if (e->ibuf) {
+ /* fprintf(stderr, "Removing: %p, cnt: %d\n", e->ibuf,
+ e->ibuf->refcounter); */
+ IMB_freeImBuf(e->ibuf);
+ MEM_CacheLimiter_unmanage(e->c_handle);
+ ibufs_rem++;
+ }
+
+ e->ibuf = 0;
+ e->c_handle = 0;
+
+ BLI_mempool_free(entrypool, e);
+}
+
+static void IMB_seq_cache_destructor(void * p)
+{
+ seqCacheEntry* e = (seqCacheEntry*) p;
+
+ if (e && e->ibuf) {
+ /* fprintf(stderr, "Removing: %p, cnt: %d\n", e->ibuf,
+ e->ibuf->refcounter); */
+ IMB_freeImBuf(e->ibuf);
+ ibufs_rem++;
+
+ e->ibuf = 0;
+ e->c_handle = 0;
+ }
+}
+
+void seq_stripelem_cache_init()
+{
+ hash = BLI_ghash_new(HashHash, HashCmp, "seq stripelem cache hash");
+ limitor = new_MEM_CacheLimiter( IMB_seq_cache_destructor );
+
+ entrypool = BLI_mempool_create(sizeof(seqCacheEntry), 64, 64, 0);
+ keypool = BLI_mempool_create(sizeof(seqCacheKey), 64, 64, 0);
+}
+
+void seq_stripelem_cache_destruct()
+{
+ if (!entrypool) {
+ return;
+ }
+ BLI_ghash_free(hash, HashKeyFree, HashValFree);
+ delete_MEM_CacheLimiter(limitor);
+ BLI_mempool_destroy(entrypool);
+ BLI_mempool_destroy(keypool);
+}
+
+void seq_stripelem_cache_cleanup()
+{
+ if (!entrypool) {
+ seq_stripelem_cache_init();
+ }
+
+ /* fprintf(stderr, "Stats before cleanup: in: %d rem: %d\n",
+ ibufs_in, ibufs_rem); */
+
+ BLI_ghash_free(hash, HashKeyFree, HashValFree);
+ hash = BLI_ghash_new(HashHash, HashCmp, "seq stripelem cache hash");
+
+ /* fprintf(stderr, "Stats after cleanup: in: %d rem: %d\n",
+ ibufs_in, ibufs_rem); */
+
+}
+
+struct ImBuf * seq_stripelem_cache_get(
+ struct Sequence * seq, int rectx, int recty,
+ float cfra, seq_stripelem_ibuf_t type)
+{
+ seqCacheKey key;
+ seqCacheEntry * e;
+
+ if (!seq) {
+ return 0;
+ }
+
+ if (!entrypool) {
+ seq_stripelem_cache_init();
+ }
+
+ key.seq = seq;
+ key.rectx = rectx;
+ key.recty = recty;
+ key.cfra = cfra - seq->start;
+ key.type = type;
+
+ e = (seqCacheEntry*) BLI_ghash_lookup(hash, &key);
+
+ if (e && e->ibuf) {
+ IMB_refImBuf(e->ibuf);
+
+ MEM_CacheLimiter_touch(e->c_handle);
+ return e->ibuf;
+ }
+ return 0;
+}
+
+void seq_stripelem_cache_put(
+ struct Sequence * seq, int rectx, int recty,
+ float cfra, seq_stripelem_ibuf_t type, struct ImBuf * i)
+{
+ seqCacheKey * key;
+ seqCacheEntry * e;
+
+ if (!i) {
+ return;
+ }
+
+ ibufs_in++;
+
+ if (!entrypool) {
+ seq_stripelem_cache_init();
+ }
+
+ key = (seqCacheKey*) BLI_mempool_alloc(keypool);
+
+ key->seq = seq;
+ key->rectx = rectx;
+ key->recty = recty;
+ key->cfra = cfra - seq->start;
+ key->type = type;
+
+ /* we want our own version */
+ IMB_refImBuf(i);
+
+ e = (seqCacheEntry*) BLI_mempool_alloc(entrypool);
+
+ e->ibuf = i;
+ e->c_handle = 0;
+
+ BLI_ghash_remove(hash, key, HashKeyFree, HashValFree);
+ BLI_ghash_insert(hash, key, e);
+
+ e->c_handle = MEM_CacheLimiter_insert(limitor, e);
+
+ MEM_CacheLimiter_ref(e->c_handle);
+ MEM_CacheLimiter_enforce_limits(limitor);
+ MEM_CacheLimiter_unref(e->c_handle);
+}
diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c
index 33c90d1a94e..461cb075bb0 100644
--- a/source/blender/blenkernel/intern/seqeffects.c
+++ b/source/blender/blenkernel/intern/seqeffects.c
@@ -41,6 +41,7 @@
#include "DNA_anim_types.h"
#include "BKE_fcurve.h"
+#include "BKE_main.h"
#include "BKE_plugin_types.h"
#include "BKE_sequencer.h"
#include "BKE_texture.h"
@@ -52,7 +53,7 @@
#include "RNA_access.h"
/* **** XXX **** */
-static void error() {}
+static void error(const char *error, ...) {}
#define INT 96
#define FLO 128
@@ -67,6 +68,48 @@ enum {
GlowA=3
};
+static struct ImBuf * prepare_effect_imbufs(
+ int x, int y,
+ struct ImBuf *ibuf1, struct ImBuf *ibuf2,
+ struct ImBuf *ibuf3)
+{
+ struct ImBuf * out;
+
+ if (!ibuf1 && !ibuf2 && !ibuf3) {
+ /* hmmm, global float option ? */
+ out = IMB_allocImBuf((short)x, (short)y, 32, IB_rect, 0);
+ } else if ((ibuf1 && ibuf1->rect_float) ||
+ (ibuf2 && ibuf2->rect_float) ||
+ (ibuf3 && ibuf3->rect_float)) {
+ /* if any inputs are rectfloat, output is float too */
+
+ out = IMB_allocImBuf((short)x, (short)y, 32, IB_rectfloat, 0);
+ } else {
+ out = IMB_allocImBuf((short)x, (short)y, 32, IB_rect, 0);
+ }
+
+ if (ibuf1 && !ibuf1->rect_float && out->rect_float) {
+ IMB_float_from_rect_simple(ibuf1);
+ }
+ if (ibuf2 && !ibuf2->rect_float && out->rect_float) {
+ IMB_float_from_rect_simple(ibuf2);
+ }
+ if (ibuf3 && !ibuf3->rect_float && out->rect_float) {
+ IMB_float_from_rect_simple(ibuf3);
+ }
+
+ if (ibuf1 && !ibuf1->rect && !out->rect_float) {
+ IMB_rect_from_float(ibuf1);
+ }
+ if (ibuf2 && !ibuf2->rect && !out->rect_float) {
+ IMB_rect_from_float(ibuf2);
+ }
+ if (ibuf3 && !ibuf3->rect && !out->rect_float) {
+ IMB_rect_from_float(ibuf3);
+ }
+
+ return out;
+}
/* **********************************************************************
PLUGINS
@@ -229,10 +272,12 @@ static ImBuf * IMB_cast_away_list(ImBuf * i)
return (ImBuf*) (((void**) i) + 2);
}
-static void do_plugin_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)
+static struct ImBuf * do_plugin_effect(
+ Main *bmain, Scene *scene, Sequence *seq, float cfra,
+ float facf0, float facf1, int x, int y,
+ int preview_render_size,
+ struct ImBuf *ibuf1, struct ImBuf *ibuf2,
+ struct ImBuf *ibuf3)
{
char *cp;
int float_rendering;
@@ -240,6 +285,8 @@ static void do_plugin_effect(Scene *scene, Sequence *seq, int cfra,
old plugins) do very bad stuff
with imbuf-internals */
+ struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
if(seq->plugin && seq->plugin->doit) {
if(seq->plugin->cfra)
@@ -311,7 +358,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) {
@@ -320,6 +367,7 @@ static void do_plugin_effect(Scene *scene, Sequence *seq, int cfra,
if (ibuf3) IMB_freeImBuf(ibuf3);
}
}
+ return out;
}
static int do_plugin_early_out(struct Sequence *seq,
@@ -475,11 +523,15 @@ 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,
- struct ImBuf *ibuf1, struct ImBuf *ibuf2,
- struct ImBuf *ibuf3, struct ImBuf *out)
+static struct ImBuf * do_alphaover_effect(
+ Main *bmain, Scene *scene, Sequence *seq, float 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 = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
if (out->rect_float) {
do_alphaover_effect_float(
facf0, facf1, x, y,
@@ -491,6 +543,7 @@ static void do_alphaover_effect(Scene *scene, Sequence *seq, int cfra,
(char*) ibuf1->rect, (char*) ibuf2->rect,
(char*) out->rect);
}
+ return out;
}
@@ -642,11 +695,15 @@ 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,
- struct ImBuf *ibuf1, struct ImBuf *ibuf2,
- struct ImBuf *ibuf3, struct ImBuf *out)
+static struct ImBuf* do_alphaunder_effect(
+ Main *bmain, Scene *scene, Sequence *seq, float 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 = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
if (out->rect_float) {
do_alphaunder_effect_float(
facf0, facf1, x, y,
@@ -658,6 +715,7 @@ static void do_alphaunder_effect(Scene *scene, Sequence *seq, int cfra,
(char*) ibuf1->rect, (char*) ibuf2->rect,
(char*) out->rect);
}
+ return out;
}
@@ -762,11 +820,15 @@ void do_cross_effect_float(float facf0, float facf1, int x, int y,
/* carefull: also used by speed effect! */
-static void do_cross_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)
+static struct ImBuf* do_cross_effect(
+ Main *bmain, Scene *scene, Sequence *seq, float 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 = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
if (out->rect_float) {
do_cross_effect_float(
facf0, facf1, x, y,
@@ -778,6 +840,7 @@ static void do_cross_effect(Scene *scene, Sequence *seq, int cfra,
(char*) ibuf1->rect, (char*) ibuf2->rect,
(char*) out->rect);
}
+ return out;
}
@@ -823,7 +886,7 @@ static void makeGammaTables(float gamma)
/* The end of the table should match 1.0 carefully. In order to avoid */
/* rounding errors, we just set this explicitly. The last segment may */
- /* have a different lenght than the other segments, but our */
+ /* have a different length than the other segments, but our */
/* interpolation is insensitive to that. */
color_domain_table[RE_GAMMA_TABLE_SIZE] = 1.0;
gamma_range_table[RE_GAMMA_TABLE_SIZE] = 1.0;
@@ -1024,11 +1087,15 @@ 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,
- struct ImBuf *ibuf1, struct ImBuf *ibuf2,
- struct ImBuf *ibuf3, struct ImBuf *out)
+static struct ImBuf * do_gammacross_effect(
+ Main *bmain, Scene *scene, Sequence *seq, float 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 = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
build_gammatabs();
if (out->rect_float) {
@@ -1042,6 +1109,7 @@ static void do_gammacross_effect(Scene *scene, Sequence *seq, int cfra,
(unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect,
(unsigned char*) out->rect);
}
+ return out;
}
@@ -1138,11 +1206,14 @@ 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,
- struct ImBuf *ibuf1, struct ImBuf *ibuf2,
- struct ImBuf *ibuf3, struct ImBuf *out)
+static struct ImBuf * do_add_effect(Main *bmain, Scene *scene, Sequence *seq, float 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 = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
if (out->rect_float) {
do_add_effect_float(
facf0, facf1, x, y,
@@ -1154,6 +1225,7 @@ static void do_add_effect(Scene *scene, Sequence *seq, int cfra,
(unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect,
(unsigned char*) out->rect);
}
+ return out;
}
@@ -1250,11 +1322,15 @@ 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,
- struct ImBuf *ibuf1, struct ImBuf *ibuf2,
- struct ImBuf *ibuf3, struct ImBuf *out)
+static struct ImBuf * do_sub_effect(
+ Main *bmain, Scene *scene, Sequence *seq, float 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 = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
if (out->rect_float) {
do_sub_effect_float(
facf0, facf1, x, y,
@@ -1266,6 +1342,7 @@ static void do_sub_effect(Scene *scene, Sequence *seq, int cfra,
(char*) ibuf1->rect, (char*) ibuf2->rect,
(char*) out->rect);
}
+ return out;
}
/* **********************************************************************
@@ -1277,8 +1354,8 @@ static void do_sub_effect(Scene *scene, Sequence *seq, int cfra,
#define YOFF 8
static void do_drop_effect_byte(float facf0, float facf1, int x, int y,
- unsigned char *rect2i, unsigned char *rect1i,
- unsigned char *outi)
+ char *rect2i, char *rect1i,
+ char *outi)
{
int height, width, temp, fac, fac1, fac2;
char *rt1, *rt2, *out;
@@ -1357,26 +1434,6 @@ static void do_drop_effect_float(float facf0, float facf1, int x, int y,
memcpy(out, rt1, 4 * sizeof(float)*YOFF*width);
}
-
-static void do_drop_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)
-{
- if (out->rect_float) {
- do_drop_effect_float(
- facf0, facf1, x, y,
- ibuf1->rect_float, ibuf2->rect_float,
- out->rect_float);
- } else {
- do_drop_effect_byte(
- facf0, facf1, x, y,
- (unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect,
- (unsigned char*) out->rect);
- }
-}
-
/* **********************************************************************
MUL
********************************************************************** */
@@ -1479,11 +1536,15 @@ 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,
- struct ImBuf *ibuf1, struct ImBuf *ibuf2,
- struct ImBuf *ibuf3, struct ImBuf *out)
+static struct ImBuf * do_mul_effect(
+ Main *bmain, Scene *scene, Sequence *seq, float 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 = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
if (out->rect_float) {
do_mul_effect_float(
facf0, facf1, x, y,
@@ -1495,6 +1556,8 @@ static void do_mul_effect(Scene *scene, Sequence *seq, int cfra,
(unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect,
(unsigned char*) out->rect);
}
+
+ return out;
}
/* **********************************************************************
@@ -1929,11 +1992,15 @@ 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,
- struct ImBuf *ibuf1, struct ImBuf *ibuf2,
- struct ImBuf *ibuf3, struct ImBuf *out)
+static struct ImBuf * do_wipe_effect(
+ Main *bmain, Scene *scene, Sequence *seq, float 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 = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
if (out->rect_float) {
do_wipe_effect_float(seq,
facf0, facf1, x, y,
@@ -1945,6 +2012,8 @@ static void do_wipe_effect(Scene *scene, Sequence *seq, int cfra,
(unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect,
(unsigned char*) out->rect);
}
+
+ return out;
}
/* **********************************************************************
TRANSFORM
@@ -2074,12 +2143,18 @@ 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)
+static struct ImBuf * do_transform_effect(
+ Main *bmain, Scene *scene, Sequence *seq,float 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 = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
do_transform(scene, seq, facf0, x, y, ibuf1, out);
+
+ return out;
}
@@ -2586,11 +2661,15 @@ static void do_glow_effect_float(Sequence *seq, float facf0, float facf1,
RVAddBitmaps_float (inbuf , outbuf, outbuf, x, y);
}
-static void do_glow_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)
+static struct ImBuf * do_glow_effect(
+ Main *bmain, Scene *scene, Sequence *seq, float 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 = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
if (out->rect_float) {
do_glow_effect_float(seq,
facf0, facf1, x, y,
@@ -2602,6 +2681,8 @@ static void do_glow_effect(Scene *scene, Sequence *seq, int cfra,
(char*) ibuf1->rect, (char*) ibuf2->rect,
(char*) out->rect);
}
+
+ return out;
}
/* **********************************************************************
@@ -2641,11 +2722,15 @@ static int early_out_color(struct Sequence *seq,
return -1;
}
-static void do_solid_color(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)
+static struct ImBuf * do_solid_color(
+ Main *bmain, Scene *scene, Sequence *seq, float 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 = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
SolidColorVars *cv = (SolidColorVars *)seq->effectdata;
unsigned char *rect;
@@ -2715,6 +2800,63 @@ static void do_solid_color(Scene *scene, Sequence *seq, int cfra,
}
}
}
+ return out;
+}
+
+/* **********************************************************************
+ 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 struct ImBuf * do_multicam(
+ Main *bmain, Scene *scene, Sequence *seq, float cfra,
+ float facf0, float facf1, int x, int y,
+ int preview_render_size,
+ struct ImBuf *ibuf1, struct ImBuf *ibuf2,
+ struct ImBuf *ibuf3)
+{
+ struct ImBuf * i;
+ struct ImBuf * out;
+ Editing * ed;
+ ListBase * seqbasep;
+
+ if (seq->multicam_source == 0 || seq->multicam_source >= seq->machine) {
+ return 0;
+ }
+
+ ed = scene->ed;
+ if (!ed) {
+ return 0;
+ }
+ seqbasep = seq_seqbase(&ed->seqbase, seq);
+ if (!seqbasep) {
+ return 0;
+ }
+
+ i = give_ibuf_seqbase(bmain, scene, x, y, cfra, seq->multicam_source,
+ preview_render_size, seqbasep);
+ if (!i) {
+ return 0;
+ }
+
+ if (input_have_to_preprocess(scene, seq, cfra, x, y)) {
+ out = IMB_dupImBuf(i);
+ IMB_freeImBuf(i);
+ } else {
+ out = i;
+ }
+
+ return out;
}
/* **********************************************************************
@@ -2731,7 +2873,7 @@ static void init_speed_effect(Sequence *seq)
v = (SpeedControlVars *)seq->effectdata;
v->globalSpeed = 1.0;
v->frameMap = 0;
- v->flags = SEQ_SPEED_COMPRESS_IPO_Y;
+ v->flags = 0;
v->length = 0;
}
@@ -2827,22 +2969,11 @@ void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force)
fallback_fac = 1.0;
- /* if there is no IPO, try to make retiming easy by stretching the
+ /* if there is no fcurve, try to make retiming easy by stretching the
strip */
- // XXX old animation system - seq
if (!fcu && seq->seq1->enddisp != seq->seq1->start && seq->seq1->len != 0) {
fallback_fac = (float) seq->seq1->len /
(float) (seq->seq1->enddisp - seq->seq1->start);
- /* FIXME: this strip stretching gets screwed by stripdata
- handling one layer up.
-
- So it currently works by enlarging, never by shrinking!
-
- (IPOs still work, if used correctly)
- */
- if (fallback_fac > 1.0) {
- fallback_fac = 1.0;
- }
}
if ((v->flags & SEQ_SPEED_INTEGRATE) != 0) {
@@ -2854,16 +2985,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;
}
@@ -2871,8 +2996,8 @@ void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force)
cursor += facf;
- if (cursor >= v->length) {
- v->frameMap[cfra] = v->length - 1;
+ if (cursor >= seq->seq1->len) {
+ v->frameMap[cfra] = seq->seq1->len - 1;
} else {
v->frameMap[cfra] = cursor;
v->lastValidFrame = cfra;
@@ -2885,27 +3010,21 @@ 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) {
facf = (float) cfra * fallback_fac;
}
facf *= v->globalSpeed;
- if (facf >= v->length) {
- facf = v->length - 1;
+ if (facf >= seq->seq1->len) {
+ facf = seq->seq1->len - 1;
} else {
v->lastValidFrame = cfra;
}
@@ -2989,13 +3108,13 @@ static void store_icu_yrange_noop(struct Sequence * seq,
/* defaults are fine */
}
-static void get_default_fac_noop(struct Sequence *seq, int cfra,
+static void get_default_fac_noop(struct Sequence *seq, float cfra,
float * facf0, float * facf1)
{
*facf0 = *facf1 = 1.0;
}
-static void get_default_fac_fade(struct Sequence *seq, int cfra,
+static void get_default_fac_fade(struct Sequence *seq, float cfra,
float * facf0, float * facf1)
{
*facf0 = (float)(cfra - seq->startdisp);
@@ -3004,17 +3123,38 @@ static void get_default_fac_fade(struct Sequence *seq, int cfra,
*facf1 /= seq->len;
}
-static void do_overdrop_effect(Scene *scene, Sequence *seq, int cfra,
- float fac, float facf,
- int x, int y, struct ImBuf * ibuf1,
- struct ImBuf * ibuf2,
- struct ImBuf * ibuf3,
- struct ImBuf * out)
+static struct ImBuf * do_overdrop_effect(Main *bmain, Scene *scene, Sequence *seq, float cfra,
+ float facf0, float facf1,
+ int x, int y,
+ int preview_render_size,
+ struct ImBuf * ibuf1,
+ struct ImBuf * ibuf2,
+ struct ImBuf * ibuf3)
{
- do_drop_effect(scene, seq, cfra, fac, facf, x, y,
- ibuf1, ibuf2, ibuf3, out);
- do_alphaover_effect(scene, seq, cfra, fac, facf, x, y,
- ibuf1, ibuf2, ibuf3, out);
+ struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+
+ if (out->rect_float) {
+ do_drop_effect_float(
+ facf0, facf1, x, y,
+ ibuf1->rect_float, ibuf2->rect_float,
+ out->rect_float);
+ do_alphaover_effect_float(
+ facf0, facf1, x, y,
+ ibuf1->rect_float, ibuf2->rect_float,
+ out->rect_float);
+ } else {
+ do_drop_effect_byte(
+ facf0, facf1, x, y,
+ (char*) ibuf1->rect,
+ (char*) ibuf2->rect,
+ (char*) out->rect);
+ do_alphaover_effect_byte(
+ facf0, facf1, x, y,
+ (char*) ibuf1->rect, (char*) ibuf2->rect,
+ (char*) out->rect);
+ }
+
+ return out;
}
static struct SeqEffectHandle get_sequence_effect_impl(int seq_type)
@@ -3121,6 +3261,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 790087334c6..b6bb5c3a51b 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -39,7 +39,9 @@
#include "DNA_scene_types.h"
#include "DNA_anim_types.h"
#include "DNA_object_types.h"
+#include "DNA_sound_types.h"
+#include "BKE_animsys.h"
#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_main.h"
@@ -49,10 +51,12 @@
#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"
@@ -69,8 +73,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;}
@@ -88,71 +90,38 @@ 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;
}
/* **********************************************************************
alloc / free functions
********************************************************************** */
-static void free_tstripdata(int len, TStripElem *se)
-{
- TStripElem *seo;
- int a;
-
- seo= se;
- if (!se)
- return;
-
- for(a=0; a<len; a++, se++) {
- if(se->ibuf) {
- IMB_freeImBuf(se->ibuf);
- se->ibuf = 0;
- }
- if(se->ibuf_comp) {
- IMB_freeImBuf(se->ibuf_comp);
- se->ibuf_comp = 0;
- }
- }
-
- MEM_freeN(seo);
-}
void new_tstripdata(Sequence *seq)
{
if(seq->strip) {
- free_tstripdata(seq->strip->len, seq->strip->tstripdata);
- free_tstripdata(seq->strip->endstill,
- seq->strip->tstripdata_endstill);
- free_tstripdata(seq->strip->startstill,
- seq->strip->tstripdata_startstill);
-
- seq->strip->tstripdata= 0;
- seq->strip->tstripdata_endstill= 0;
- seq->strip->tstripdata_startstill= 0;
-
- if(seq->strip->ibuf_startstill) {
- IMB_freeImBuf(seq->strip->ibuf_startstill);
- seq->strip->ibuf_startstill = 0;
- }
-
- if(seq->strip->ibuf_endstill) {
- IMB_freeImBuf(seq->strip->ibuf_endstill);
- seq->strip->ibuf_endstill = 0;
- }
-
seq->strip->len= seq->len;
}
}
@@ -198,23 +167,11 @@ void seq_free_strip(Strip *strip)
MEM_freeN(strip->color_balance);
}
- free_tstripdata(strip->len, strip->tstripdata);
- free_tstripdata(strip->endstill, strip->tstripdata_endstill);
- free_tstripdata(strip->startstill, strip->tstripdata_startstill);
-
- if(strip->ibuf_startstill) {
- IMB_freeImBuf(strip->ibuf_startstill);
- strip->ibuf_startstill = 0;
- }
-
- if(strip->ibuf_endstill) {
- IMB_freeImBuf(strip->ibuf_endstill);
- strip->ibuf_endstill = 0;
- }
-
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);
@@ -236,6 +193,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);
@@ -504,6 +463,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;
@@ -547,8 +531,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;
@@ -563,14 +547,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(Main *bmain, 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 ||
@@ -578,6 +566,14 @@ 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 &&
@@ -588,7 +584,8 @@ void reload_sequence_new_file(Scene *scene, Sequence * seq)
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;
@@ -623,7 +620,8 @@ void reload_sequence_new_file(Scene *scene, Sequence * seq)
}
seq->strip->len = seq->len;
} else if (seq->type == SEQ_SCENE) {
- Scene * sce = G.main->scene.first;
+ /* 'seq->scenenr' should be replaced with something more reliable */
+ Scene * sce = bmain->scene.first;
int nr = 1;
while(sce) {
@@ -639,9 +637,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;
@@ -654,6 +649,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);
}
@@ -709,12 +710,12 @@ static int clear_scene_in_allseqs_cb(Sequence *seq, void *arg_pt)
return 1;
}
-void clear_scene_in_allseqs(Scene *scene)
+void clear_scene_in_allseqs(Main *bmain, Scene *scene)
{
Scene *scene_iter;
/* when a scene is deleted: test all seqs */
- for(scene_iter= G.main->scene.first; scene_iter; scene_iter= scene_iter->id.next) {
+ for(scene_iter= bmain->scene.first; scene_iter; scene_iter= scene_iter->id.next) {
if(scene_iter != scene && scene_iter->ed) {
seqbase_recursive_apply(&scene_iter->ed->seqbase, clear_scene_in_allseqs_cb, scene);
}
@@ -740,7 +741,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 */
}
}
@@ -761,12 +762,17 @@ void seqbase_unique_name_recursive(ListBase *seqbasep, struct Sequence *seq)
strcpy(sui.name_src, seq->name+2);
strcpy(sui.name_dest, seq->name+2);
+ sui.count= 1;
+ sui.match= 1; /* assume the worst to start the loop */
+
/* Strip off the suffix */
- if ((dot=strrchr(sui.name_src, '.')))
+ if ((dot=strrchr(sui.name_src, '.'))) {
*dot= '\0';
+ dot++;
- sui.count= 1;
- sui.match= 1; /* assume the worst to start the loop */
+ if(*dot)
+ sui.count= atoi(dot) + 1;
+ }
while(sui.match) {
sui.match= 0;
@@ -797,6 +803,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;
@@ -888,143 +895,16 @@ static void multibuf(ImBuf *ibuf, float fmul)
}
}
-static void do_effect(Scene *scene, int cfra, Sequence *seq, TStripElem * se)
+static float give_stripelem_index(Sequence *seq, float cfra)
{
- TStripElem *se1, *se2, *se3;
- float fac, facf;
- int x, y;
- int early_out;
- struct SeqEffectHandle sh = get_sequence_effect(seq);
- FCurve *fcu= NULL;
-
- if (!sh.execute) { /* effect not supported in this version... */
- make_black_ibuf(se->ibuf);
- return;
- }
-
- if ((seq->flag & SEQ_USE_EFFECT_DEFAULT_FADE) != 0) {
- sh.get_default_fac(seq, cfra, &fac, &facf);
- if( scene->r.mode & R_FIELDS ); else facf= fac;
- } else {
- fcu = id_data_find_fcurve(&scene->id, seq, &RNA_Sequence,
- "effect_fader", 0);
- if (fcu) {
- fac = facf = evaluate_fcurve(fcu, cfra);
- if( scene->r.mode & R_FIELDS ) {
- facf = evaluate_fcurve(fcu, cfra + 0.5);
- }
- } else {
- fac = facf = seq->effect_fader;
- }
- }
-
- early_out = sh.early_out(seq, fac, facf);
+ float nr;
- if (early_out == -1) { /* no input needed */
- sh.execute(scene, seq, cfra, fac, facf,
- se->ibuf->x, se->ibuf->y,
- 0, 0, 0, se->ibuf);
- return;
- }
-
- switch (early_out) {
- case 0:
- if (se->se1==0 || se->se2==0 || se->se3==0) {
- make_black_ibuf(se->ibuf);
- return;
- }
-
- se1= se->se1;
- se2= se->se2;
- se3= se->se3;
-
- if ( (se1==0 || se2==0 || se3==0)
- || (se1->ibuf==0 || se2->ibuf==0 || se3->ibuf==0)) {
- make_black_ibuf(se->ibuf);
- return;
- }
-
- break;
- case 1:
- if (se->se1 == 0) {
- make_black_ibuf(se->ibuf);
- return;
- }
-
- se1= se->se1;
-
- if (se1 == 0 || se1->ibuf == 0) {
- make_black_ibuf(se->ibuf);
- return;
- }
-
- if (se->ibuf != se1->ibuf) {
- IMB_freeImBuf(se->ibuf);
- se->ibuf = se1->ibuf;
- IMB_refImBuf(se->ibuf);
- }
- return;
- case 2:
- if (se->se2 == 0) {
- make_black_ibuf(se->ibuf);
- return;
- }
-
- se2= se->se2;
-
- if (se2 == 0 || se2->ibuf == 0) {
- make_black_ibuf(se->ibuf);
- return;
- }
- if (se->ibuf != se2->ibuf) {
- IMB_freeImBuf(se->ibuf);
- se->ibuf = se2->ibuf;
- IMB_refImBuf(se->ibuf);
- }
- return;
- default:
- make_black_ibuf(se->ibuf);
- return;
- }
-
- x= se2->ibuf->x;
- y= se2->ibuf->y;
-
- if (!se1->ibuf->rect_float && se->ibuf->rect_float) {
- IMB_float_from_rect(se1->ibuf);
- }
- if (!se2->ibuf->rect_float && se->ibuf->rect_float) {
- IMB_float_from_rect(se2->ibuf);
- }
- if (!se3->ibuf->rect_float && se->ibuf->rect_float) {
- IMB_float_from_rect(se3->ibuf);
- }
-
- if (!se1->ibuf->rect && !se->ibuf->rect_float) {
- IMB_rect_from_float(se1->ibuf);
- }
- if (!se2->ibuf->rect && !se->ibuf->rect_float) {
- IMB_rect_from_float(se2->ibuf);
- }
- if (!se3->ibuf->rect && !se->ibuf->rect_float) {
- IMB_rect_from_float(se3->ibuf);
- }
-
- sh.execute(scene, seq, cfra, fac, facf, x, y, se1->ibuf, se2->ibuf, se3->ibuf,
- se->ibuf);
-}
-
-static int give_stripelem_index(Sequence *seq, int cfra)
-{
- int nr;
-
- if(seq->startdisp >cfra || seq->enddisp <= cfra) return -1;
if(seq->len == 0) return -1;
if(seq->flag&SEQ_REVERSE_FRAMES) {
/*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;
@@ -1032,93 +912,12 @@ static int give_stripelem_index(Sequence *seq, int cfra)
}
if (seq->strobe < 1.0) seq->strobe = 1.0;
if (seq->strobe > 1.0) {
- nr -= (int)fmod((double)nr, (double)seq->strobe);
+ nr -= fmod((double)nr, (double)seq->strobe);
}
return nr;
}
-static TStripElem* alloc_tstripdata(int len, const char * name)
-{
- int i;
- TStripElem *se = MEM_callocN(len * sizeof(TStripElem), name);
- for (i = 0; i < len; i++) {
- se[i].ok = STRIPELEM_OK;
- }
- return se;
-}
-
-static TStripElem *give_tstripelem(Sequence *seq, int cfra)
-{
- TStripElem *se;
- int nr;
-
- se = seq->strip->tstripdata;
- if (se == 0 && seq->len > 0) {
- se = seq->strip->tstripdata = alloc_tstripdata(seq->len,
- "tstripelems");
- }
- nr = give_stripelem_index(seq, cfra);
-
- if (nr == -1) return 0;
- if (se == 0) return 0;
-
- se += nr;
-
- /* if there are IPOs with blend modes active, one has to watch out
- for startstill + endstill area: we can't use the same tstripelem
- here for all ibufs, since then, blending with IPOs won't work!
-
- Rather common case, if you use a single image and try to fade
- it in and out... or want to use your strip as a watermark in
- alpha over mode...
- */
- if (seq->blend_mode != SEQ_BLEND_REPLACE ||
- (/*seq->ipo && seq->ipo->curve.first &&*/
- (!(seq->type & SEQ_EFFECT) || !seq->seq1))) {
- Strip * s = seq->strip;
- if (cfra < seq->start) {
- se = s->tstripdata_startstill;
- if (seq->startstill > s->startstill) {
- free_tstripdata(s->startstill,
- s->tstripdata_startstill);
- se = 0;
- }
-
- if (se == 0) {
- s->startstill = seq->startstill;
- se = seq->strip->tstripdata_startstill
- = alloc_tstripdata(
- s->startstill,
- "tstripelems_startstill");
- }
- se += seq->start - cfra - 1;
-
- } else if (cfra > seq->start + seq->len-1) {
- se = s->tstripdata_endstill;
- if (seq->endstill > s->endstill) {
- free_tstripdata(s->endstill,
- s->tstripdata_endstill);
- se = 0;
- }
-
- if (se == 0) {
- s->endstill = seq->endstill;
- se = seq->strip->tstripdata_endstill
- = alloc_tstripdata(
- s->endstill,
- "tstripelems_endstill");
- }
- se += cfra - (seq->start + seq->len-1) - 1;
- }
- }
-
-
- se->nr= nr;
-
- return se;
-}
-
StripElem *give_stripelem(Sequence *seq, int cfra)
{
StripElem *se= seq->strip->stripdata;
@@ -1127,7 +926,7 @@ StripElem *give_stripelem(Sequence *seq, int cfra)
/* use the first */
}
else {
- int nr = give_stripelem_index(seq, cfra);
+ int nr = (int) give_stripelem_index(seq, cfra);
if (nr == -1) return 0;
if (se == 0) return 0;
@@ -1231,7 +1030,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) {
@@ -1257,17 +1057,15 @@ static int seq_proxy_get_fname(Scene *scene, Sequence * seq, int cfra, char * na
dir, render_size, se->name);
frameno = 1;
} else if (seq->type == SEQ_MOVIE) {
- TStripElem * tse = give_tstripelem(seq, cfra);
-
- frameno = tse->nr + seq->anim_startofs;
+ frameno = (int) give_stripelem_index(seq, cfra)
+ + seq->anim_startofs;
snprintf(name, PROXY_MAXFILE, "%s/%s/%d/####", dir,
seq->strip->stripdata->name,
render_size);
} else {
- TStripElem * tse = give_tstripelem(seq, cfra);
-
- frameno = tse->nr + seq->anim_startofs;
+ frameno = (int) give_stripelem_index(seq, cfra)
+ + seq->anim_startofs;
snprintf(name, PROXY_MAXFILE, "%s/proxy_misc/%d/####", dir,
render_size);
@@ -1296,10 +1094,11 @@ static struct ImBuf * seq_proxy_fetch(Scene *scene, Sequence * seq, int cfra, in
}
if (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) {
- TStripElem * tse = give_tstripelem(seq, cfra);
- int frameno = tse->nr + seq->anim_startofs;
+ int frameno = (int) give_stripelem_index(seq, cfra)
+ + seq->anim_startofs;
if (!seq->strip->proxy->anim) {
- if (!seq_proxy_get_fname(scene, seq, cfra, name, render_size)) {
+ if (!seq_proxy_get_fname(
+ scene, seq, cfra, name, render_size)) {
return 0;
}
@@ -1327,7 +1126,7 @@ static struct ImBuf * seq_proxy_fetch(Scene *scene, Sequence * seq, int cfra, in
static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int cfra,
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;
@@ -1364,7 +1163,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;
@@ -1398,7 +1198,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;
@@ -1430,7 +1231,8 @@ static void seq_proxy_rebuild(Scene *scene, Sequence * seq)
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()) {
@@ -1444,7 +1246,8 @@ static void seq_proxy_rebuild(Scene *scene, Sequence * seq)
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()) {
@@ -1466,15 +1269,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] = 1.0 - cb.lift[c];
- }
- } else {
+ 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]);
+ /* 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) {
@@ -1498,25 +1307,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)
{
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,
@@ -1525,21 +1336,17 @@ 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;
}
}
-static void color_balance_byte_byte(Sequence * seq, TStripElem* se, float mul)
+static void color_balance_byte_byte(Sequence * seq, ImBuf* ibuf, float mul)
{
unsigned char cb_tab[3][256];
int c;
- unsigned char * p = (unsigned char*) se->ibuf->rect;
- unsigned char * e = p + se->ibuf->x * 4 * se->ibuf->y;
+ unsigned char * p = (unsigned char*) ibuf->rect;
+ unsigned char * e = p + ibuf->x * 4 * ibuf->y;
StripColorBalance cb = calc_cb(seq->strip->color_balance);
@@ -1557,24 +1364,24 @@ static void color_balance_byte_byte(Sequence * seq, TStripElem* se, float mul)
}
}
-static void color_balance_byte_float(Sequence * seq, TStripElem* se, float mul)
+static void color_balance_byte_float(Sequence * seq, ImBuf* ibuf, float mul)
{
float cb_tab[4][256];
int c,i;
- unsigned char * p = (unsigned char*) se->ibuf->rect;
- unsigned char * e = p + se->ibuf->x * 4 * se->ibuf->y;
+ unsigned char * p = (unsigned char*) ibuf->rect;
+ unsigned char * e = p + ibuf->x * 4 * ibuf->y;
float * o;
StripColorBalance cb;
- imb_addrectfloatImBuf(se->ibuf);
+ imb_addrectfloatImBuf(ibuf);
- o = se->ibuf->rect_float;
+ o = ibuf->rect_float;
cb = calc_cb(seq->strip->color_balance);
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++) {
@@ -1591,30 +1398,29 @@ static void color_balance_byte_float(Sequence * seq, TStripElem* se, float mul)
}
}
-static void color_balance_float_float(Sequence * seq, TStripElem* se, float mul)
+static void color_balance_float_float(Sequence * seq, ImBuf* ibuf, float mul)
{
- float * p = se->ibuf->rect_float;
- float * e = se->ibuf->rect_float + se->ibuf->x * 4* se->ibuf->y;
+ float * p = ibuf->rect_float;
+ float * e = ibuf->rect_float + ibuf->x * 4* ibuf->y;
StripColorBalance cb = calc_cb(seq->strip->color_balance);
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;
}
}
-static void color_balance(Sequence * seq, TStripElem* se, float mul)
+static void color_balance(Sequence * seq, ImBuf* ibuf, float mul)
{
- if (se->ibuf->rect_float) {
- color_balance_float_float(seq, se, mul);
+ if (ibuf->rect_float) {
+ color_balance_float_float(seq, ibuf, mul);
} else if(seq->flag & SEQ_MAKE_FLOAT) {
- color_balance_byte_float(seq, se, mul);
+ color_balance_byte_float(seq, ibuf, mul);
} else {
- color_balance_byte_byte(seq, se, mul);
+ color_balance_byte_byte(seq, ibuf, mul);
}
}
@@ -1637,44 +1443,49 @@ static void color_balance(Sequence * seq, TStripElem* se, float mul)
*/
-static int input_have_to_preprocess(Scene *scene, Sequence * seq, TStripElem* se, int cfra)
+int input_have_to_preprocess(
+ Scene *scene, Sequence * seq, float 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)) {
return TRUE;
}
mul = seq->mul;
- if(seq->blend_mode == SEQ_BLEND_REPLACE &&
- !(seq->type & SEQ_EFFECT)) {
+ if(seq->blend_mode == SEQ_BLEND_REPLACE) {
mul *= seq->blend_opacity / 100.0;
}
if (mul != 1.0) {
return TRUE;
}
+
+ if (seq->sat != 1.0) {
+ return TRUE;
+ }
return FALSE;
}
-static void input_preprocess(Scene *scene, Sequence *seq, TStripElem *se, int cfra)
+static ImBuf * input_preprocess(
+ Scene *scene, Sequence *seq, float cfra, int seqrectx, int seqrecty,
+ ImBuf * ibuf)
{
float mul;
- seq->strip->orx= se->ibuf->x;
- seq->strip->ory= se->ibuf->y;
+ seq->strip->orx= ibuf->x;
+ seq->strip->ory= ibuf->y;
if((seq->flag & SEQ_FILTERY) && seq->type != SEQ_MOVIE) {
- IMB_filtery(se->ibuf);
+ IMB_filtery(ibuf);
}
if(seq->flag & SEQ_USE_CROP || seq->flag & SEQ_USE_TRANSFORM) {
@@ -1692,8 +1503,8 @@ static void input_preprocess(Scene *scene, Sequence *seq, TStripElem *se, int cf
t = *seq->strip->transform;
}
- sx = se->ibuf->x - c.left - c.right;
- sy = se->ibuf->y - c.top - c.bottom;
+ sx = ibuf->x - c.left - c.right;
+ sy = ibuf->y - c.top - c.bottom;
dx = sx;
dy = sy;
@@ -1702,39 +1513,62 @@ static void input_preprocess(Scene *scene, Sequence *seq, TStripElem *se, int cf
dy = scene->r.ysch;
}
- if (c.top + c.bottom >= se->ibuf->y ||
- c.left + c.right >= se->ibuf->x ||
+ if (c.top + c.bottom >= ibuf->y ||
+ c.left + c.right >= ibuf->x ||
t.xofs >= dx || t.yofs >= dy) {
- make_black_ibuf(se->ibuf);
+ make_black_ibuf(ibuf);
} else {
ImBuf * i;
- if (se->ibuf->rect_float) {
+ if (ibuf->rect_float) {
i = IMB_allocImBuf(dx, dy,32, IB_rectfloat, 0);
} else {
i = IMB_allocImBuf(dx, dy,32, IB_rect, 0);
}
- IMB_rectcpy(i, se->ibuf,
- t.xofs, t.yofs,
- c.left, c.bottom,
- sx, sy);
-
- IMB_freeImBuf(se->ibuf);
+ IMB_rectcpy(i, ibuf,
+ t.xofs, t.yofs,
+ c.left, c.bottom,
+ sx, sy);
+
+ IMB_freeImBuf(ibuf);
- se->ibuf = i;
+ ibuf = i;
}
}
if(seq->flag & SEQ_FLIPX) {
- IMB_flipx(se->ibuf);
+ IMB_flipx(ibuf);
}
+
if(seq->flag & SEQ_FLIPY) {
- IMB_flipy(se->ibuf);
+ IMB_flipy(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 *)ibuf->rect;
+ float *rctf= ibuf->rect_float;
+ const float sat= seq->sat;
+ float hsv[3];
+
+ if(rct) {
+ float rgb[3];
+ for (i = ibuf->x * 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 = ibuf->x * 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;
@@ -1744,708 +1578,520 @@ static void input_preprocess(Scene *scene, Sequence *seq, TStripElem *se, int cf
}
if(seq->flag & SEQ_USE_COLOR_BALANCE && seq->strip->color_balance) {
- color_balance(seq, se, mul);
+ color_balance(seq, ibuf, mul);
mul = 1.0;
}
if(seq->flag & SEQ_MAKE_FLOAT) {
- if (!se->ibuf->rect_float) {
- int profile = IB_PROFILE_NONE;
-
- /* no color management:
- * don't disturb the existing profiles */
- SWAP(int, se->ibuf->profile, profile);
+ if (!ibuf->rect_float)
+ IMB_float_from_rect_simple(ibuf);
- IMB_float_from_rect(se->ibuf);
-
- SWAP(int, se->ibuf->profile, profile);
- }
- if (se->ibuf->rect) {
- imb_freerectImBuf(se->ibuf);
+ if (ibuf->rect) {
+ imb_freerectImBuf(ibuf);
}
}
if(mul != 1.0) {
- multibuf(se->ibuf, mul);
+ multibuf(ibuf, mul);
}
if(seq->flag & SEQ_MAKE_PREMUL) {
- if(se->ibuf->depth == 32 && se->ibuf->zbuf == 0) {
- converttopremul(se->ibuf);
+ if(ibuf->depth == 32 && ibuf->zbuf == 0) {
+ IMB_premultiply_alpha(ibuf);
}
}
- if(se->ibuf->x != seqrectx || se->ibuf->y != seqrecty ) {
+ if(ibuf->x != seqrectx || ibuf->y != seqrecty ) {
if(scene->r.mode & R_OSA) {
- IMB_scaleImBuf(se->ibuf,
- (short)seqrectx, (short)seqrecty);
+ IMB_scaleImBuf(ibuf,
+ (short)seqrectx, (short)seqrecty);
} else {
- IMB_scalefastImBuf(se->ibuf,
+ IMB_scalefastImBuf(ibuf,
(short)seqrectx, (short)seqrecty);
}
}
+ return ibuf;
}
-/* test if image too small or discarded from cache: reload */
-
-static void test_and_auto_discard_ibuf(TStripElem * se)
+static ImBuf * copy_from_ibuf_still(Sequence * seq, float nr,
+ int seqrectx, int seqrecty)
{
- if (se->ibuf) {
- if(se->ibuf->x != seqrectx || se->ibuf->y != seqrecty
- || !(se->ibuf->rect || se->ibuf->rect_float)) {
- IMB_freeImBuf(se->ibuf);
+ ImBuf * rval = 0;
+ ImBuf * ibuf = 0;
- se->ibuf= 0;
- se->ok= STRIPELEM_OK;
- }
+ if (nr == 0) {
+ ibuf = seq_stripelem_cache_get(
+ seq, seqrectx, seqrecty, seq->start,
+ SEQ_STRIPELEM_IBUF_STARTSTILL);
+ }
+ if (nr == seq->len - 1) {
+ ibuf = seq_stripelem_cache_get(
+ seq, seqrectx, seqrecty, seq->start,
+ SEQ_STRIPELEM_IBUF_ENDSTILL);
}
- if (se->ibuf_comp) {
- if(se->ibuf_comp->x != seqrectx || se->ibuf_comp->y != seqrecty
- || !(se->ibuf_comp->rect || se->ibuf_comp->rect_float)) {
- IMB_freeImBuf(se->ibuf_comp);
- se->ibuf_comp = 0;
- }
+ if (ibuf) {
+ rval = IMB_dupImBuf(ibuf);
+ IMB_freeImBuf(ibuf);
}
+
+ return rval;
}
-static void test_and_auto_discard_ibuf_stills(Strip * strip)
+static void copy_to_ibuf_still(Sequence * seq, float nr,
+ ImBuf * ibuf)
{
- if (strip->ibuf_startstill) {
- if (!strip->ibuf_startstill->rect &&
- !strip->ibuf_startstill->rect_float) {
- IMB_freeImBuf(strip->ibuf_startstill);
- strip->ibuf_startstill = 0;
- }
+ if (nr == 0) {
+ seq_stripelem_cache_put(
+ seq, 0, 0, seq->start,
+ SEQ_STRIPELEM_IBUF_STARTSTILL, ibuf);
}
- if (strip->ibuf_endstill) {
- if (!strip->ibuf_endstill->rect &&
- !strip->ibuf_endstill->rect_float) {
- IMB_freeImBuf(strip->ibuf_endstill);
- strip->ibuf_endstill = 0;
- }
+ if (nr == seq->len - 1) {
+ seq_stripelem_cache_put(
+ seq, 0, 0, seq->start,
+ SEQ_STRIPELEM_IBUF_ENDSTILL, ibuf);
}
}
-static void copy_from_ibuf_still(Sequence * seq, TStripElem * se)
-{
- if (!se->ibuf) {
- if (se->nr == 0 && seq->strip->ibuf_startstill) {
- IMB_cache_limiter_touch(seq->strip->ibuf_startstill);
-
- se->ibuf = IMB_dupImBuf(seq->strip->ibuf_startstill);
- }
- if (se->nr == seq->len - 1
- && (seq->len != 1)
- && seq->strip->ibuf_endstill) {
- IMB_cache_limiter_touch(seq->strip->ibuf_endstill);
-
- se->ibuf = IMB_dupImBuf(seq->strip->ibuf_endstill);
- }
- }
-}
+/* **********************************************************************
+ strip rendering functions
+ ********************************************************************** */
-static void copy_to_ibuf_still(Sequence * seq, TStripElem * se)
-{
- if (se->ibuf) {
- if (se->nr == 0) {
- seq->strip->ibuf_startstill = IMB_dupImBuf(se->ibuf);
+static ImBuf* seq_render_strip_stack(
+ Main *bmain, Scene *scene,
+ ListBase *seqbasep, float cfra, int chanshown, int render_size,
+ int seqrectx, int seqrecty);
- IMB_cache_limiter_insert(seq->strip->ibuf_startstill);
- IMB_cache_limiter_touch(seq->strip->ibuf_startstill);
- }
- if (se->nr == seq->len - 1 && seq->len != 1) {
- seq->strip->ibuf_endstill = IMB_dupImBuf(se->ibuf);
+static ImBuf * seq_render_strip(Main *bmain, Scene *scene, Sequence * seq, float cfra,
+ int render_size,
+ int seqrectx, int seqrecty);
- IMB_cache_limiter_insert(seq->strip->ibuf_endstill);
- IMB_cache_limiter_touch(seq->strip->ibuf_endstill);
- }
- }
-}
-static void free_metastrip_imbufs(ListBase *seqbasep, int cfra, int chanshown)
+static ImBuf* seq_render_effect_strip_impl(
+ Main *bmain, Scene *scene, float cfra, Sequence *seq, int render_size,
+ int seqrectx, int seqrecty)
{
- Sequence* seq_arr[MAXSEQ+1];
+ float fac, facf;
+ int early_out;
int i;
- TStripElem* se = 0;
+ int must_preprocess = FALSE;
- evaluate_seq_frame_gen(seq_arr, seqbasep, cfra);
-
- for (i = 0; i < MAXSEQ; i++) {
- if (!video_seq_is_rendered(seq_arr[i])) {
- continue;
- }
- se = give_tstripelem(seq_arr[i], cfra);
- if (se) {
- if (se->ibuf) {
- IMB_freeImBuf(se->ibuf);
-
- se->ibuf= 0;
- se->ok= STRIPELEM_OK;
- }
+ struct SeqEffectHandle sh = get_sequence_effect(seq);
+ FCurve *fcu= NULL;
+ ImBuf * ibuf[3];
+ ImBuf * out = 0;
- if (se->ibuf_comp) {
- IMB_freeImBuf(se->ibuf_comp);
+ ibuf[0] = ibuf[1] = ibuf[2] = 0;
- se->ibuf_comp = 0;
- }
- }
+ if (!sh.execute) { /* effect not supported in this version... */
+ goto finish;
}
-
-}
-static void check_limiter_refcount(const char * func, TStripElem *se)
-{
- if (se && se->ibuf) {
- int refcount = IMB_cache_limiter_get_refcount(se->ibuf);
- if (refcount != 1) {
- /* can happen on complex pipelines */
- if (refcount > 1 && (G.f & G_DEBUG) == 0) {
- return;
- }
-
- fprintf(stderr,
- "sequencer: (ibuf) %s: "
- "suspicious memcache "
- "limiter refcount: %d\n", func, refcount);
- }
- }
-}
-
-static void check_limiter_refcount_comp(const char * func, TStripElem *se)
-{
- if (se && se->ibuf_comp) {
- int refcount = IMB_cache_limiter_get_refcount(se->ibuf_comp);
- if (refcount != 1) {
- /* can happen on complex pipelines */
- if (refcount > 1 && (G.f & G_DEBUG) == 0) {
- return;
+ if ((seq->flag & SEQ_USE_EFFECT_DEFAULT_FADE) != 0) {
+ sh.get_default_fac(seq, cfra, &fac, &facf);
+ if( scene->r.mode & R_FIELDS ); else facf= fac;
+ } else {
+ fcu = id_data_find_fcurve(&scene->id, seq, &RNA_Sequence,
+ "effect_fader", 0);
+ if (fcu) {
+ fac = facf = evaluate_fcurve(fcu, cfra);
+ if( scene->r.mode & R_FIELDS ) {
+ facf = evaluate_fcurve(fcu, cfra + 0.5);
}
- fprintf(stderr,
- "sequencer: (ibuf comp) %s: "
- "suspicious memcache "
- "limiter refcount: %d\n", func, refcount);
+ } else {
+ fac = facf = seq->effect_fader;
}
}
-}
-
-static TStripElem* do_build_seq_array_recursively(Scene *scene,
- ListBase *seqbasep, int cfra, int chanshown, int render_size);
-
-static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int cfra,
- int build_proxy_run, int render_size)
-{
- char name[FILE_MAXDIR+FILE_MAXFILE];
- int use_limiter = TRUE;
-
- test_and_auto_discard_ibuf(se);
- test_and_auto_discard_ibuf_stills(seq->strip);
-
- if(seq->type == SEQ_META) {
- TStripElem * meta_se = 0;
- int use_preprocess = FALSE;
- use_limiter = FALSE;
-
- if (!build_proxy_run && se->ibuf == 0) {
- se->ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
- if (se->ibuf) {
- use_limiter = TRUE;
- use_preprocess = TRUE;
- }
- }
- if(!se->ibuf && seq->seqbase.first) {
- meta_se = do_build_seq_array_recursively(scene,
- &seq->seqbase, seq->start + se->nr, 0,
- render_size);
-
- check_limiter_refcount("do_build_seq_ibuf: for META", meta_se);
- }
-
- se->ok = STRIPELEM_OK;
-
- 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)) {
- IMB_refImBuf(se->ibuf);
- if (build_proxy_run) {
- IMB_cache_limiter_unref(se->ibuf);
- }
- } else if (se->ibuf) {
- struct ImBuf * i = IMB_dupImBuf(se->ibuf);
+ early_out = sh.early_out(seq, fac, facf);
- IMB_cache_limiter_unref(se->ibuf);
+ if (early_out == -1) { /* no input needed */
+ out = sh.execute(bmain, scene, seq, cfra, fac, facf,
+ seqrectx, seqrecty, render_size,
+ 0, 0, 0);
+ goto finish;
+ }
- se->ibuf = i;
- use_limiter = TRUE;
- use_preprocess = TRUE;
- }
- } else if (se->ibuf) {
- use_limiter = TRUE;
- }
- if (meta_se) {
- free_metastrip_imbufs(
- &seq->seqbase, seq->start + se->nr, 0);
- }
+ must_preprocess = input_have_to_preprocess(
+ scene, seq, cfra, seqrectx, seqrecty);
- if (use_preprocess) {
- input_preprocess(scene, seq, se, cfra);
- }
- } else if(seq->type & SEQ_EFFECT) {
- int use_preprocess = FALSE;
- /* should the effect be recalculated? */
-
- if (!build_proxy_run && se->ibuf == 0) {
- se->ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
- if (se->ibuf) {
- use_preprocess = TRUE;
- }
+ switch (early_out) {
+ case 0:
+ break;
+ case 1:
+ if (seq->seq1) {
+ ibuf[0] = seq_render_strip(bmain, scene, seq->seq1, cfra,
+ render_size,
+ seqrectx, seqrecty);
}
-
- if(se->ibuf == 0) {
- /* if any inputs are rectfloat, output is float too */
- if((se->se1 && se->se1->ibuf && se->se1->ibuf->rect_float) ||
- (se->se2 && se->se2->ibuf && se->se2->ibuf->rect_float) ||
- (se->se3 && se->se3->ibuf && se->se3->ibuf->rect_float))
- se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0);
- 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) {
- if ((se->se1 && (se->ibuf == se->se1->ibuf)) ||
- (se->se2 && (se->ibuf == se->se2->ibuf))) {
- struct ImBuf * i
- = IMB_dupImBuf(se->ibuf);
-
- IMB_freeImBuf(se->ibuf);
-
- se->ibuf = i;
- }
- use_preprocess = TRUE;
+ if (ibuf[0]) {
+ if (must_preprocess) {
+ out = IMB_dupImBuf(ibuf[0]);
+ } else {
+ out = ibuf[0];
+ IMB_refImBuf(out);
}
}
- if (use_preprocess) {
- input_preprocess(scene, seq, se, cfra);
- }
- } 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_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);
- /* we don't need both (speed reasons)! */
- if (se->ibuf &&
- se->ibuf->rect_float && se->ibuf->rect) {
- imb_freerectImBuf(se->ibuf);
- }
-
- copy_to_ibuf_still(seq, se);
- }
-
- if(se->ibuf == 0) {
- se->ok = STRIPELEM_FAILED;
- } else if (!build_proxy_run) {
- input_preprocess(scene, seq, se, cfra);
+ goto finish;
+ case 2:
+ if (seq->seq2) {
+ ibuf[1] = seq_render_strip(bmain, scene, seq->seq2, cfra,
+ render_size,
+ seqrectx, seqrecty);
+ }
+ if (ibuf[1]) {
+ if (must_preprocess) {
+ out = IMB_dupImBuf(ibuf[1]);
+ } else {
+ out = ibuf[1];
+ IMB_refImBuf(out);
}
}
- } else if(seq->type == SEQ_MOVIE) {
- if(se->ok == STRIPELEM_OK && se->ibuf==0) {
- if(!build_proxy_run) {
- se->ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
- }
- copy_from_ibuf_still(seq, se);
+ goto finish;
+ default:
+ goto finish;
+ }
- if (se->ibuf == 0) {
- if(seq->anim==0) {
- BLI_join_dirfile(name, seq->strip->dir, seq->strip->stripdata->name);
- BLI_path_abs(name, G.sce);
-
- seq->anim = openanim(
- name, IB_rect |
- ((seq->flag & SEQ_FILTERY)
- ? IB_animdeinterlace : 0));
- }
- if(seq->anim) {
- IMB_anim_set_preseek(seq->anim, seq->anim_preseek);
- 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) {
- imb_freerectImBuf(se->ibuf);
- }
+ if (seq->seq1) {
+ ibuf[0] = seq_render_strip(bmain, scene, seq->seq1, cfra,
+ render_size,
+ seqrectx, seqrecty);
+ }
- }
- copy_to_ibuf_still(seq, se);
- }
-
- if(se->ibuf == 0) {
- se->ok = STRIPELEM_FAILED;
- } else if (!build_proxy_run) {
- input_preprocess(scene, seq, se, cfra);
- }
- }
- } else if(seq->type == SEQ_SCENE) { // scene can be NULL after deletions
- Scene *sce= seq->scene;// *oldsce= scene;
- int have_seq= FALSE;
- int sce_valid= FALSE;
+ if (seq->seq2) {
+ ibuf[1] = seq_render_strip(bmain, scene, seq->seq2, cfra,
+ render_size,
+ seqrectx, seqrecty);
+ }
- if(sce) {
- have_seq= (sce->r.scemode & R_DOSEQ) && sce->ed && sce->ed->seqbase.first;
- sce_valid= (sce->camera || have_seq);
- }
+ if (seq->seq3) {
+ ibuf[2] = seq_render_strip(bmain, scene, seq->seq3, cfra,
+ render_size,
+ seqrectx, seqrecty);
+ }
- 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);
- }
- }
+ if (!ibuf[0] || !ibuf[1]) {
+ goto finish;
+ }
- if (se->ibuf == NULL && sce_valid) {
- copy_from_ibuf_still(seq, se);
- if (se->ibuf) {
- input_preprocess(scene, seq, se, cfra);
- }
- }
-
- if (!sce_valid) {
- se->ok = STRIPELEM_FAILED;
- }
- 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,
- 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
-
- 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 doseq;
- int doseq_gl= G.rendering ? (scene->r.seq_flag & R_SEQ_GL_REND) : (scene->r.seq_flag & R_SEQ_GL_PREV);
-
- /* prevent eternal loop */
- doseq= scene->r.scemode & R_DOSEQ;
- scene->r.scemode &= ~R_DOSEQ;
-
- seq->scene->r.cfra= frame;
- if(seq->scene_camera) seq->scene->camera= seq->scene_camera;
- else scene_camera_switch_update(seq->scene);
+ out = sh.execute(bmain, scene, seq, cfra, fac, facf, seqrectx, seqrecty,
+ render_size,
+ ibuf[0], ibuf[1], ibuf[2]);
-#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
+finish:
+ for (i = 0; i < 3; i++) {
+ IMB_freeImBuf(ibuf[i]);
+ }
- if(sequencer_view3d_cb && doseq_gl && (seq->scene == scene || have_seq==0)) {
- /* 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 (!out) {
+ out = IMB_allocImBuf(
+ (short)seqrectx, (short)seqrecty, 32, IB_rect, 0);
+ }
- if(rendering)
- re= RE_NewRender(" do_build_seq_ibuf");
- else
- re= RE_NewRender(sce->id.name);
+ return out;
+}
- RE_BlenderFrame(re, sce, NULL, sce->lay, frame);
- RE_AcquireResultImage(re, &rres);
+static ImBuf * seq_render_scene_strip_impl(
+ Main *bmain, Scene * scene, Sequence * seq, float nr, int seqrectx, int seqrecty)
+{
+ ImBuf * ibuf = 0;
+ float frame= seq->sfra + nr + seq->anim_startofs;
+ float oldcfra;
+ Object *oldcamera;
+ 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,
+ 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
+
+ Hmm, don't see, why we can't do that all the time,
+ and since G.rendering is uhm, gone... (Peter)
+ */
- 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);
- }
+ 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);
+ int have_seq= FALSE;
+ Scene *sce= seq->scene; /* dont refer to seq->scene above this point!, it can be NULL */
+ int sce_valid= FALSE;
- RE_ReleaseResultImage(re);
+ if(sce) {
+ have_seq= (sce->r.scemode & R_DOSEQ) && sce->ed && sce->ed->seqbase.first;
+ sce_valid= (sce->camera || have_seq);
+ }
- // BIF_end_render_callbacks();
- }
-
- /* restore */
- scene->r.scemode |= doseq;
+ if (!sce_valid)
+ return NULL;
- seq->scene->r.cfra = oldcfra;
- seq->scene->camera= oldcamera;
+ oldcfra= seq->scene->r.cfra;
+ oldcamera= seq->scene->camera;
+ /* prevent eternal loop */
+ doseq= scene->r.scemode & R_DOSEQ;
+ scene->r.scemode &= ~R_DOSEQ;
+
+ 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 :( */
- seq->scene->markers= oldmarkers;
+ /* stooping to new low's in hackyness :( */
+ oldmarkers= seq->scene->markers;
+ seq->scene->markers.first= seq->scene->markers.last= NULL;
#endif
-
- copy_to_ibuf_still(seq, se);
-
- if (!build_proxy_run) {
- if(se->ibuf == NULL) {
- se->ok = STRIPELEM_FAILED;
- } else {
- input_preprocess(scene, seq, se, cfra);
- }
+
+ if(sequencer_view3d_cb && BLI_thread_is_main() && doseq_gl && (seq->scene == scene || have_seq==0) && seq->scene->camera) {
+ /* opengl offscreen render */
+ scene_update_for_newframe(bmain, seq->scene, seq->scene->lay);
+ ibuf= sequencer_view3d_cb(seq->scene, seqrectx, seqrecty, IB_rect,
+ 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, bmain, sce, NULL, sce->lay, frame);
+
+ RE_AcquireResultImage(re, &rres);
+
+ if(rres.rectf) {
+ ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, IB_rectfloat, 0);
+ memcpy(ibuf->rect_float, rres.rectf, 4*sizeof(float)*rres.rectx*rres.recty);
+ if(rres.rectz) {
+ addzbuffloatImBuf(ibuf);
+ memcpy(ibuf->zbuf_float, rres.rectz, sizeof(float)*rres.rectx*rres.recty);
}
+ /* float buffers in the sequencer are not linear */
+ ibuf->profile= IB_PROFILE_LINEAR_RGB;
+ IMB_convert_profile(ibuf, IB_PROFILE_SRGB);
}
- }
- if (!build_proxy_run) {
- if (se->ibuf && use_limiter) {
- IMB_cache_limiter_insert(se->ibuf);
- IMB_cache_limiter_ref(se->ibuf);
- IMB_cache_limiter_touch(se->ibuf);
+ else if (rres.rect32) {
+ ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, IB_rect, 0);
+ memcpy(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
-static TStripElem* do_build_seq_recursively(Scene *scene, Sequence *seq, int cfra, int render_size);
+ return ibuf;
+}
-static void do_effect_seq_recursively(Scene *scene, Sequence *seq, TStripElem *se, int cfra, int render_size)
+static ImBuf * seq_render_strip(Main *bmain, Scene *scene, Sequence * seq, float cfra,
+ int render_size,
+ int seqrectx, int seqrecty)
{
- float fac, facf;
- struct SeqEffectHandle sh = get_sequence_effect(seq);
- int early_out;
- FCurve *fcu= NULL;
-
- se->se1 = 0;
- se->se2 = 0;
- se->se3 = 0;
-
- if ((seq->flag & SEQ_USE_EFFECT_DEFAULT_FADE) != 0) {
- sh.get_default_fac(seq, cfra, &fac, &facf);
- if( scene->r.mode & R_FIELDS ); else facf= fac;
- } else {
- fcu = id_data_find_fcurve(&scene->id, seq, &RNA_Sequence,
- "effect_fader", 0);
- if (fcu) {
- fac = facf = evaluate_fcurve(fcu, cfra);
- if( scene->r.mode & R_FIELDS ) {
- facf = evaluate_fcurve(fcu, cfra + 0.5);
- }
- } else {
- fac = facf = seq->effect_fader;
- }
- }
+ char name[FILE_MAXDIR+FILE_MAXFILE];
+ int use_preprocess = input_have_to_preprocess(
+ scene, seq, cfra, seqrectx, seqrecty);
+ ImBuf * ibuf = seq_stripelem_cache_get(
+ seq, seqrectx, seqrecty, cfra, SEQ_STRIPELEM_IBUF);
+ float nr = give_stripelem_index(seq, cfra);
- early_out = sh.early_out(seq, fac, facf);
- switch (early_out) {
- case -1:
- /* 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);
- if (seq->seq3) {
- se->se3 = do_build_seq_recursively(scene, seq->seq3, cfra, render_size);
- }
- break;
- case 1:
- se->se1 = do_build_seq_recursively(scene, seq->seq1, cfra, render_size);
- break;
- case 2:
- se->se2 = do_build_seq_recursively(scene, seq->seq2, cfra, render_size);
- break;
+ /* currently, we cache preprocessed images */
+ if (ibuf) {
+ use_preprocess = FALSE;
}
+ if(seq->type == SEQ_META) {
+ ImBuf * meta_ibuf = 0;
- do_build_seq_ibuf(scene, seq, se, cfra, FALSE, render_size);
+ if (ibuf == 0) {
+ ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
+ }
- /* children are not needed anymore ... */
+ if(!ibuf && seq->seqbase.first) {
+ meta_ibuf = seq_render_strip_stack(
+ bmain, scene,
+ &seq->seqbase, seq->start + nr, 0,
+ render_size, seqrectx, seqrecty);
+ }
- if (se->se1 && se->se1->ibuf) {
- IMB_cache_limiter_unref(se->se1->ibuf);
- }
- if (se->se2 && se->se2->ibuf) {
- IMB_cache_limiter_unref(se->se2->ibuf);
- }
- if (se->se3 && se->se3->ibuf) {
- IMB_cache_limiter_unref(se->se3->ibuf);
- }
- check_limiter_refcount("do_effect_seq_recursively", se);
-}
+ if(!ibuf && meta_ibuf) {
+ ibuf = meta_ibuf;
+ if(ibuf && use_preprocess) {
+ struct ImBuf * i = IMB_dupImBuf(ibuf);
-static TStripElem* do_build_seq_recursively_impl(Scene *scene, Sequence * seq, int cfra, int render_size)
-{
- TStripElem *se;
+ IMB_freeImBuf(ibuf);
- se = give_tstripelem(seq, cfra);
+ ibuf = i;
+ }
+ }
+ } else if(seq->type == SEQ_SPEED) {
+ ImBuf * child_ibuf = 0;
- if(se) {
- if (seq->type & SEQ_EFFECT) {
- do_effect_seq_recursively(scene, seq, se, cfra, render_size);
- } else {
- do_build_seq_ibuf(scene, seq, se, cfra, FALSE, render_size);
+ if (ibuf == 0) {
+ ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
}
- }
- return se;
-}
-/* FIXME:
-
-If cfra was float throughout blender (especially in the render
-pipeline) one could even _render_ with subframe precision
-instead of faking using the blend code below...
+ if (ibuf == 0) {
+ float f_cfra;
+ SpeedControlVars * s
+ = (SpeedControlVars *)seq->effectdata;
-*/
+ sequence_effect_speed_rebuild_map(scene, seq, 0);
-static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra, int render_size)
-{
- SpeedControlVars * s = (SpeedControlVars *)seq->effectdata;
- int nr = cfra - seq->start;
- float f_cfra;
- int cfra_left;
- int cfra_right;
- TStripElem * se = 0;
- TStripElem * se1 = 0;
- TStripElem * se2 = 0;
-
- sequence_effect_speed_rebuild_map(scene, seq, 0);
-
- f_cfra = seq->start + s->frameMap[nr];
-
- cfra_left = (int) floor(f_cfra);
- cfra_right = (int) ceil(f_cfra);
+ /* weeek! */
+ f_cfra = seq->start + s->frameMap[(int) nr];
- se = give_tstripelem(seq, cfra);
+ child_ibuf = seq_render_strip(bmain, scene, seq->seq1, f_cfra,
+ render_size,
+ seqrectx, seqrecty);
+ }
- if (!se) {
- return se;
- }
+ if (!ibuf && child_ibuf) {
+ ibuf = child_ibuf;
+ if(ibuf && use_preprocess) {
+ struct ImBuf * i = IMB_dupImBuf(ibuf);
- if (cfra_left == cfra_right ||
- (s->flags & SEQ_SPEED_BLEND) == 0) {
- test_and_auto_discard_ibuf(se);
+ IMB_freeImBuf(ibuf);
- if (se->ibuf == NULL) {
- se1 = do_build_seq_recursively_impl(scene, seq->seq1, cfra_left, render_size);
+ ibuf = i;
+ }
+ }
+ } else if(seq->type & SEQ_EFFECT) {
+ /* should the effect be recalculated? */
+
+ if (ibuf == 0) {
+ ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
+ }
- if((se1 && se1->ibuf && se1->ibuf->rect_float))
- se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0);
- else
- se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rect, 0);
+ if(ibuf == 0) {
+ ibuf = seq_render_effect_strip_impl(
+ bmain, scene, cfra, seq, render_size,
+ seqrectx, seqrecty);
+ }
+ } else if(seq->type == SEQ_IMAGE) {
+ StripElem * s_elem = give_stripelem(seq, cfra);
- if (se1 == 0 || se1->ibuf == 0) {
- make_black_ibuf(se->ibuf);
- } else {
- if (se->ibuf != se1->ibuf) {
- if (se->ibuf) {
- IMB_freeImBuf(se->ibuf);
- }
+ if(ibuf == 0 && s_elem) {
+ BLI_join_dirfile(name, seq->strip->dir, s_elem->name);
+ BLI_path_abs(name, G.sce);
- se->ibuf = se1->ibuf;
- IMB_refImBuf(se->ibuf);
- }
- }
+ ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
}
- } else {
- struct SeqEffectHandle sh;
- if(se->ibuf) {
- if(se->ibuf->x < seqrectx || se->ibuf->y < seqrecty
- || !(se->ibuf->rect || se->ibuf->rect_float)) {
- IMB_freeImBuf(se->ibuf);
- se->ibuf= 0;
- }
+ if (ibuf == 0) {
+ ibuf = copy_from_ibuf_still(seq,nr,seqrectx,seqrecty);
}
- 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);
+ if (ibuf == 0 && s_elem &&
+ (ibuf = IMB_loadiffname(name, IB_rect))) {
+ /* we don't need both (speed reasons)! */
+ if (ibuf->rect_float && ibuf->rect)
+ imb_freerectImBuf(ibuf);
+
+ /* all sequencer color is done in SRGB space, linear gives odd crossfades */
+ if(ibuf->profile == IB_PROFILE_LINEAR_RGB)
+ IMB_convert_profile(ibuf, IB_PROFILE_NONE);
- if((se1 && se1->ibuf && se1->ibuf->rect_float))
- se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0);
- else
- se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rect, 0);
+ copy_to_ibuf_still(seq, nr, ibuf);
+ }
+ } else if(seq->type == SEQ_MOVIE) {
+ if(ibuf == 0) {
+ ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
- if (!se1 || !se2) {
- make_black_ibuf(se->ibuf);
- } else {
- sh = get_sequence_effect(seq);
+ }
+
+ if (ibuf == 0) {
+ ibuf = copy_from_ibuf_still(seq, nr,seqrectx,seqrecty);
+ }
+
+ if (ibuf == 0) {
+ if(seq->anim==0) {
+ BLI_join_dirfile(name,
+ seq->strip->dir,
+ seq->strip->stripdata->name);
+ BLI_path_abs(name, G.sce);
+
+ seq->anim = openanim(
+ name, IB_rect |
+ ((seq->flag & SEQ_FILTERY)
+ ? IB_animdeinterlace : 0));
+ }
+ if(seq->anim) {
+ IMB_anim_set_preseek(seq->anim,
+ seq->anim_preseek);
+ ibuf = IMB_anim_absolute(seq->anim,
+ nr
+ + seq->anim_startofs);
+ /* we don't need both (speed reasons)! */
+ if (ibuf && ibuf->rect_float
+ && ibuf->rect) {
+ imb_freerectImBuf(ibuf);
+ }
- sh.execute(scene, seq, cfra,
- f_cfra - (float) cfra_left,
- f_cfra - (float) cfra_left,
- se->ibuf->x, se->ibuf->y,
- se1->ibuf, se2->ibuf, 0, se->ibuf);
}
+ copy_to_ibuf_still(seq, nr, ibuf);
}
+
+ } else if(seq->type == SEQ_SCENE) { // scene can be NULL after deletions
+ if (ibuf == 0) {
+ ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
+ }
+ if (ibuf == 0) {
+ ibuf = copy_from_ibuf_still(seq, nr,seqrectx,seqrecty);
+ }
+
+ if (ibuf == 0) {
+ ibuf = seq_render_scene_strip_impl(bmain, scene, seq, nr,
+ seqrectx, seqrecty);
+ copy_to_ibuf_still(seq, nr, ibuf);
+ }
}
- /* caller expects this to be referenced, so do it! */
- if (se->ibuf) {
- IMB_cache_limiter_insert(se->ibuf);
- IMB_cache_limiter_ref(se->ibuf);
- IMB_cache_limiter_touch(se->ibuf);
+ if (!ibuf) {
+ ibuf = IMB_allocImBuf(
+ (short)seqrectx, (short)seqrecty, 32, IB_rect, 0);
}
- /* children are no longer needed */
- if (se1 && se1->ibuf)
- IMB_cache_limiter_unref(se1->ibuf);
- if (se2 && se2->ibuf)
- IMB_cache_limiter_unref(se2->ibuf);
-
- check_limiter_refcount("do_handle_speed_effect", se);
-
- return se;
-}
-
-/*
- * build all ibufs recursively
- *
- * if successfull, the returned TStripElem contains the (referenced!) imbuf
- * that means: you _must_ call
- *
- * IMB_cache_limiter_unref(rval);
- *
- * if rval != 0
- *
- */
+ if (ibuf->x != seqrectx || ibuf->y != seqrecty) {
+ use_preprocess = TRUE;
+ }
-static TStripElem* do_build_seq_recursively(Scene *scene, Sequence * seq, int cfra, int render_size)
-{
- TStripElem *se;
- if (seq->type == SEQ_SPEED) {
- se = do_handle_speed_effect(scene, seq, cfra, render_size);
- } else {
- se = do_build_seq_recursively_impl(scene, seq, cfra, render_size);
+ if (use_preprocess) {
+ ibuf = input_preprocess(scene, seq, cfra, seqrectx,
+ seqrecty, ibuf);
}
- check_limiter_refcount("do_build_seq_recursively", se);
+ seq_stripelem_cache_put(
+ seq, seqrectx, seqrecty, cfra, SEQ_STRIPELEM_IBUF, ibuf);
- return se;
+ return ibuf;
}
+/* **********************************************************************
+ strip stack rendering functions
+ ********************************************************************** */
+
static int seq_must_swap_input_in_blend_mode(Sequence * seq)
{
int swap_input = FALSE;
@@ -2482,45 +2128,48 @@ static int seq_get_early_out_for_blend_mode(Sequence * seq)
return early_out;
}
-static TStripElem* do_build_seq_array_recursively(Scene *scene,
- ListBase *seqbasep, int cfra, int chanshown, int render_size)
+static ImBuf* seq_render_strip_stack(
+ Main *bmain, Scene *scene, ListBase *seqbasep, float cfra, int chanshown,
+ int render_size, int seqrectx, int seqrecty)
{
Sequence* seq_arr[MAXSEQ+1];
int count;
int i;
- TStripElem* se = 0;
+ ImBuf* out = 0;
count = get_shown_sequences(seqbasep, cfra, chanshown,
- (Sequence **)&seq_arr);
+ (Sequence **)&seq_arr);
if (!count) {
return 0;
}
- se = give_tstripelem(seq_arr[count - 1], cfra);
-
- if (!se) {
- return 0;
+#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);
+ out = seq_stripelem_cache_get(
+ seq_arr[count - 1],
+ seqrectx, seqrecty, cfra, SEQ_STRIPELEM_IBUF_COMP);
- if (se->ibuf_comp != 0) {
- IMB_cache_limiter_insert(se->ibuf_comp);
- IMB_cache_limiter_ref(se->ibuf_comp);
- IMB_cache_limiter_touch(se->ibuf_comp);
- return se;
+ if (out) {
+ return out;
}
-
if(count == 1) {
- se = do_build_seq_recursively(scene, seq_arr[0],
- cfra, render_size);
- if (se->ibuf) {
- se->ibuf_comp = se->ibuf;
- IMB_refImBuf(se->ibuf_comp);
- }
- return se;
+ out = seq_render_strip(bmain, scene, seq_arr[0],
+ cfra, render_size,
+ seqrectx, seqrecty);
+ seq_stripelem_cache_put(
+ seq_arr[0],
+ seqrectx, seqrecty, cfra,
+ SEQ_STRIPELEM_IBUF_COMP, out);
+
+ return out;
}
@@ -2528,28 +2177,17 @@ static TStripElem* do_build_seq_array_recursively(Scene *scene,
int early_out;
Sequence * seq = seq_arr[i];
- se = give_tstripelem(seq, cfra);
-
- test_and_auto_discard_ibuf(se);
+ out = seq_stripelem_cache_get(
+ seq,
+ seqrectx, seqrecty, cfra, SEQ_STRIPELEM_IBUF_COMP);
- if (se->ibuf_comp != 0) {
+ if (out) {
break;
}
if (seq->blend_mode == SEQ_BLEND_REPLACE) {
- do_build_seq_recursively(
- scene, seq, cfra, render_size);
-
- if (se->ibuf) {
- se->ibuf_comp = se->ibuf;
- IMB_refImBuf(se->ibuf);
- } else {
- se->ibuf_comp = IMB_allocImBuf(
- (short)seqrectx, (short)seqrecty,
- 32, IB_rect, 0);
- IMB_cache_limiter_insert(se->ibuf_comp);
- IMB_cache_limiter_ref(se->ibuf_comp);
- IMB_cache_limiter_touch(se->ibuf_comp);
- }
+ out = seq_render_strip(bmain, scene, seq, cfra,
+ render_size,
+ seqrectx, seqrecty);
break;
}
@@ -2558,152 +2196,87 @@ static TStripElem* do_build_seq_array_recursively(Scene *scene,
switch (early_out) {
case -1:
case 2:
- do_build_seq_recursively(
- scene, seq, cfra, render_size);
-
- if (se->ibuf) {
- se->ibuf_comp = se->ibuf;
- IMB_refImBuf(se->ibuf_comp);
- } else {
- se->ibuf_comp = IMB_allocImBuf(
- (short)seqrectx, (short)seqrecty,
- 32, IB_rect, 0);
- IMB_cache_limiter_insert(se->ibuf_comp);
- IMB_cache_limiter_ref(se->ibuf_comp);
- IMB_cache_limiter_touch(se->ibuf_comp);
- }
+ out = seq_render_strip(bmain, scene, seq, cfra,
+ render_size,
+ seqrectx, seqrecty);
break;
case 1:
if (i == 0) {
- se->ibuf_comp = IMB_allocImBuf(
+ out = IMB_allocImBuf(
(short)seqrectx, (short)seqrecty,
32, IB_rect, 0);
- IMB_cache_limiter_insert(se->ibuf_comp);
- IMB_cache_limiter_ref(se->ibuf_comp);
- IMB_cache_limiter_touch(se->ibuf_comp);
}
break;
case 0:
- do_build_seq_recursively(
- scene, seq, cfra, render_size);
-
- if (!se->ibuf) {
- se->ibuf = IMB_allocImBuf(
- (short)seqrectx, (short)seqrecty,
- 32, IB_rect, 0);
- IMB_cache_limiter_insert(se->ibuf);
- IMB_cache_limiter_ref(se->ibuf);
- IMB_cache_limiter_touch(se->ibuf);
- }
if (i == 0) {
- se->ibuf_comp = se->ibuf;
- IMB_refImBuf(se->ibuf_comp);
+ out = seq_render_strip(bmain, scene, seq, cfra,
+ render_size,
+ seqrectx, seqrecty);
}
+
break;
}
-
- if (se->ibuf_comp) {
+ if (out) {
break;
}
}
+ seq_stripelem_cache_put(
+ seq_arr[i], seqrectx, seqrecty, cfra,
+ SEQ_STRIPELEM_IBUF_COMP, out);
+
+
i++;
for (; i < count; i++) {
Sequence * seq = seq_arr[i];
- struct SeqEffectHandle sh = get_sequence_blend(seq);
- TStripElem* se1 = give_tstripelem(seq_arr[i-1], cfra);
- TStripElem* se2 = give_tstripelem(seq_arr[i], cfra);
-
- float facf = seq->blend_opacity / 100.0;
- 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;
+ if (seq_get_early_out_for_blend_mode(seq) == 0) {
+ struct SeqEffectHandle sh = get_sequence_blend(seq);
+ ImBuf * ibuf1 = out;
+ ImBuf * ibuf2 = seq_render_strip(bmain, scene, seq, cfra,
+ render_size,
+ seqrectx, seqrecty);
- if(se1->ibuf_comp == NULL)
- continue;
+ float facf = seq->blend_opacity / 100.0;
+ int swap_input
+ = seq_must_swap_input_in_blend_mode(seq);
- if (se1->ibuf_comp->rect_float ||
- se2->ibuf->rect_float) {
- se2->ibuf_comp = IMB_allocImBuf(
- (short)seqrectx, (short)seqrecty,
- 32, IB_rectfloat, 0);
- } else {
- se2->ibuf_comp = IMB_allocImBuf(
- (short)seqrectx, (short)seqrecty,
- 32, IB_rect, 0);
- }
+ int x= seqrectx;
+ int y= seqrecty;
-
- if (!se1->ibuf_comp->rect_float &&
- se2->ibuf_comp->rect_float) {
- IMB_float_from_rect(se1->ibuf_comp);
- }
- if (!se2->ibuf->rect_float &&
- se2->ibuf_comp->rect_float) {
- IMB_float_from_rect(se2->ibuf);
- }
-
- if (!se1->ibuf_comp->rect &&
- !se2->ibuf_comp->rect_float) {
- IMB_rect_from_float(se1->ibuf_comp);
- }
- if (!se2->ibuf->rect &&
- !se2->ibuf_comp->rect_float) {
- IMB_rect_from_float(se2->ibuf);
- }
-
if (swap_input) {
- sh.execute(scene, seq, cfra,
- facf, facf, x, y,
- se2->ibuf, se1->ibuf_comp, 0,
- se2->ibuf_comp);
+ out = sh.execute(bmain, scene, seq, cfra,
+ facf, facf, x, y, render_size,
+ ibuf2, ibuf1, 0);
} else {
- sh.execute(scene, seq, cfra,
- facf, facf, x, y,
- se1->ibuf_comp, se2->ibuf, 0,
- se2->ibuf_comp);
+ out = sh.execute(bmain, scene, seq, cfra,
+ facf, facf, x, y, render_size,
+ ibuf1, ibuf2, 0);
}
-
- IMB_cache_limiter_insert(se2->ibuf_comp);
- IMB_cache_limiter_ref(se2->ibuf_comp);
- IMB_cache_limiter_touch(se2->ibuf_comp);
-
- IMB_cache_limiter_unref(se1->ibuf_comp);
- IMB_cache_limiter_unref(se2->ibuf);
-
- break;
+
+ IMB_freeImBuf(ibuf1);
+ IMB_freeImBuf(ibuf2);
}
- case 1: {
- se2->ibuf_comp = se1->ibuf_comp;
- if(se2->ibuf_comp)
- IMB_refImBuf(se2->ibuf_comp);
- break;
- }
- }
- se = se2;
+ seq_stripelem_cache_put(
+ seq_arr[i], seqrectx, seqrecty, cfra,
+ SEQ_STRIPELEM_IBUF_COMP, out);
}
- return se;
+ return out;
}
/*
* returned ImBuf is refed!
- * you have to unref after usage!
+ * you have to free after usage!
*/
-static ImBuf *give_ibuf_seq_impl(Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size)
+ImBuf *give_ibuf_seq(Main *bmain, Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size)
{
Editing *ed= seq_give_editing(scene, FALSE);
int count;
ListBase *seqbasep;
- TStripElem *se;
-
if(ed==NULL) return NULL;
@@ -2715,50 +2288,19 @@ 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);
-
- if(!se) {
- return 0;
- }
-
- check_limiter_refcount_comp("give_ibuf_seq_impl", se);
-
- return se->ibuf_comp;
+ return seq_render_strip_stack(
+ bmain, scene, seqbasep, cfra, chanshown, render_size, rectx, recty);
}
-ImBuf *give_ibuf_seq_direct(Scene *scene, int rectx, int recty, int cfra, int render_size, Sequence *seq)
+ImBuf *give_ibuf_seqbase(Main *bmain, Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size, ListBase *seqbasep)
{
- TStripElem* se;
-
- seqrectx= rectx; /* bad bad global! */
- seqrecty= recty;
-
- se = do_build_seq_recursively(scene, seq, cfra, render_size);
-
- if(!se) {
- return 0;
- }
-
- check_limiter_refcount("give_ibuf_seq_direct", se);
-
- if (se->ibuf) {
- IMB_cache_limiter_unref(se->ibuf);
- }
-
- return se->ibuf;
+ return seq_render_strip_stack(bmain, scene, seqbasep, cfra, chanshown, render_size, rectx, recty);
}
-ImBuf *give_ibuf_seq(Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size)
-{
- ImBuf* i = give_ibuf_seq_impl(scene, rectx, recty, cfra, chanshown, render_size);
- if (i) {
- IMB_cache_limiter_unref(i);
- }
- return i;
+ImBuf *give_ibuf_seq_direct(Main *bmain, Scene *scene, int rectx, int recty, int cfra, int render_size, Sequence *seq)
+{
+ return seq_render_strip(bmain, scene, seq, cfra, render_size, rectx, recty);
}
#if 0
@@ -2789,7 +2331,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;
@@ -3024,13 +2566,13 @@ static void seq_wait_for_prefetch_ready()
}
#endif
-ImBuf *give_ibuf_seq_threaded(Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size)
+ImBuf *give_ibuf_seq_threaded(Main *bmain, Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size)
{
PrefetchQueueElem *e = NULL;
int found_something = FALSE;
if (seq_thread_shutdown) {
- return give_ibuf_seq(scene, rectx, recty, cfra, chanshown, render_size);
+ return give_ibuf_seq(bmain, scene, rectx, recty, cfra, chanshown, render_size);
}
while (!e) {
@@ -3107,20 +2649,6 @@ ImBuf *give_ibuf_seq_threaded(Scene *scene, int rectx, int recty, int cfra, int
/* Functions to free imbuf and anim data on changes */
-static void free_imbuf_strip_elem(TStripElem *se)
-{
- if(se->ibuf) {
- IMB_freeImBuf(se->ibuf);
- }
- if(se->ibuf_comp) {
- IMB_freeImBuf(se->ibuf_comp);
- }
- se->ibuf_comp = 0;
- se->ibuf= 0;
- se->ok= STRIPELEM_OK;
- se->se1= se->se2= se->se3= 0;
-}
-
static void free_anim_seq(Sequence *seq)
{
if(seq->anim) {
@@ -3129,63 +2657,10 @@ static void free_anim_seq(Sequence *seq)
}
}
-#if 0
-static void free_imbuf_seq_except(Scene *scene, int cfra)
-{
- Editing *ed= seq_give_editing(scene, FALSE);
- Sequence *seq;
- TStripElem *se;
- int a;
-
- if(ed==NULL) return;
-
- SEQ_BEGIN(ed, seq) {
- if(seq->strip) {
- TStripElem * curelem = give_tstripelem(seq, cfra);
-
- for(a = 0, se = seq->strip->tstripdata;
- 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++) {
- if(se != curelem) {
- free_imbuf_strip_elem(se);
- }
- }
- for(a = 0, se = seq->strip->tstripdata_endstill;
- a < seq->strip->endstill && se; a++, se++) {
- if(se != curelem) {
- free_imbuf_strip_elem(se);
- }
- }
- if(seq->strip->ibuf_startstill) {
- IMB_freeImBuf(seq->strip->ibuf_startstill);
- seq->strip->ibuf_startstill = 0;
- }
-
- if(seq->strip->ibuf_endstill) {
- IMB_freeImBuf(seq->strip->ibuf_endstill);
- seq->strip->ibuf_endstill = 0;
- }
-
- if(seq->type==SEQ_MOVIE)
- if(seq->startdisp > cfra || seq->enddisp < cfra)
- free_anim_seq(seq);
- free_proxy_seq(seq);
- }
- }
- SEQ_END
-}
-#endif
-
-void free_imbuf_seq(Scene *scene, ListBase * seqbase, int check_mem_usage)
+void free_imbuf_seq(Scene *scene, ListBase * seqbase, int check_mem_usage,
+ int keep_file_handles)
{
Sequence *seq;
- TStripElem *se;
- int a;
if (check_mem_usage) {
/* Let the cache limitor take care of this (schlaile) */
@@ -3211,39 +2686,19 @@ void free_imbuf_seq(Scene *scene, ListBase * seqbase, int check_mem_usage)
}
}
+ seq_stripelem_cache_cleanup();
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++) {
- free_imbuf_strip_elem(se);
- }
- for(a = 0, se = seq->strip->tstripdata_startstill;
- 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++) {
- free_imbuf_strip_elem(se);
- }
- if(seq->strip->ibuf_startstill) {
- IMB_freeImBuf(seq->strip->ibuf_startstill);
- seq->strip->ibuf_startstill = 0;
- }
-
- if(seq->strip->ibuf_endstill) {
- IMB_freeImBuf(seq->strip->ibuf_endstill);
- seq->strip->ibuf_endstill = 0;
- }
-
- if(seq->type==SEQ_MOVIE)
+ if(seq->type==SEQ_MOVIE && !keep_file_handles)
free_anim_seq(seq);
if(seq->type==SEQ_SPEED) {
sequence_effect_speed_rebuild_map(scene, seq, 1);
}
}
if(seq->type==SEQ_META) {
- free_imbuf_seq(scene, &seq->seqbase, FALSE);
+ free_imbuf_seq(scene, &seq->seqbase, FALSE,
+ keep_file_handles);
}
if(seq->type==SEQ_SCENE) {
/* FIXME: recurs downwards,
@@ -3256,8 +2711,7 @@ void free_imbuf_seq(Scene *scene, ListBase * seqbase, int check_mem_usage)
static int update_changed_seq_recurs(Scene *scene, Sequence *seq, Sequence *changed_seq, int len_change, int ibuf_change)
{
Sequence *subseq;
- int a, free_imbuf = 0;
- TStripElem *se;
+ int free_imbuf = 0;
/* recurs downwards to see if this seq depends on the changed seq */
@@ -3283,12 +2737,6 @@ static int update_changed_seq_recurs(Scene *scene, Sequence *seq, Sequence *chan
if(free_imbuf) {
if(ibuf_change) {
- se= seq->strip->tstripdata;
- if (se) {
- for(a=0; a<seq->len; a++, se++)
- free_imbuf_strip_elem(se);
- }
-
if(seq->type == SEQ_MOVIE)
free_anim_seq(seq);
if(seq->type == SEQ_SPEED) {
@@ -3314,39 +2762,6 @@ void update_changed_seq_and_deps(Scene *scene, Sequence *changed_seq, int len_ch
update_changed_seq_recurs(scene, seq, changed_seq, len_change, ibuf_change);
}
-#if 0 // XXX from 2.4x, needs updating
-void free_imbuf_seq()
-{
- Scene * sce = G.main->scene.first;
- while(sce) {
- free_imbuf_seq_editing(sce->ed);
- sce= sce->id.next;
- }
-}
-#endif
-
-#if 0 // XXX old animation system
-static void free_imbuf_seq_with_ipo(Scene *scene, struct Ipo *ipo)
-{
- /* force update of all sequences with this ipo, on ipo changes */
- Editing *ed= seq_give_editing(scene, FALSE);
- Sequence *seq;
-
- if(ed==NULL) return;
-
- SEQ_BEGIN(ed, seq) {
- if(seq->ipo == ipo) {
- update_changed_seq_and_deps(scene, seq, 0, 1);
- if(seq->type == SEQ_SPEED) {
- sequence_effect_speed_rebuild_map(seq, 1);
- }
- free_proxy_seq(seq);
- }
- }
- SEQ_END
-}
-#endif
-
/* seq funcs's for transforming internally
notice the difference between start/end and left/right.
@@ -3407,7 +2822,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;
@@ -3730,6 +3146,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)
{
@@ -3754,6 +3221,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)
{
@@ -3772,14 +3295,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;
@@ -3787,12 +3310,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) {
@@ -3801,7 +3353,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) {
@@ -3829,6 +3381,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;
@@ -3846,8 +3399,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");
@@ -3855,8 +3407,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(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;
@@ -3874,7 +3426,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)
@@ -3922,6 +3474,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;
@@ -3929,14 +3482,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);
@@ -3964,8 +3521,136 @@ 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?
+
+ 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 574ec848291..01652aaa713 100644
--- a/source/blender/blenkernel/intern/shrinkwrap.c
+++ b/source/blender/blenkernel/intern/shrinkwrap.c
@@ -51,7 +51,6 @@
#include "BLI_math.h"
#include "BLI_editVert.h"
-#include "MEM_guardedalloc.h"
/* Util macros */
@@ -355,11 +354,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..7e39cdd1196 100644
--- a/source/blender/blenkernel/intern/sketch.c
+++ b/source/blender/blenkernel/intern/sketch.c
@@ -72,8 +72,7 @@ void sk_initPoint(SK_Point *pt, SK_DrawData *dd, float *no)
{
if (no)
{
- VECCOPY(pt->no, no);
- normalize_v3(pt->no);
+ normalize_v3_v3(pt->no, no);
}
else
{
@@ -260,7 +259,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 +335,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 aa513ab0fb7..11012843131 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -37,8 +37,8 @@
#include <float.h>
#include <math.h>
-#include "stdio.h"
-#include "string.h" /* memset */
+#include <stdio.h>
+#include <string.h> /* memset */
#include "BLI_linklist.h"
#include "BLI_rand.h"
@@ -220,7 +220,7 @@ int smokeModifier_init (SmokeModifierData *smd, Object *ob, Scene *scene, Derive
// printf("res[0]: %d, res[1]: %d, res[2]: %d\n", smd->domain->res[0], smd->domain->res[1], smd->domain->res[2]);
// dt max is 0.1
- smd->domain->fluid = smoke_init(smd->domain->res, smd->domain->p0, 0.1);
+ smd->domain->fluid = smoke_init(smd->domain->res, smd->domain->p0);
smd->time = scene->r.cfra;
if(smd->domain->flags & MOD_SMOKE_HIGHRES)
@@ -237,7 +237,7 @@ int smokeModifier_init (SmokeModifierData *smd, Object *ob, Scene *scene, Derive
if(!smd->domain->shadow)
smd->domain->shadow = MEM_callocN(sizeof(float) * smd->domain->res[0] * smd->domain->res[1] * smd->domain->res[2], "SmokeDomainShadow");
- smoke_initBlenderRNA(smd->domain->fluid, &(smd->domain->alpha), &(smd->domain->beta));
+ smoke_initBlenderRNA(smd->domain->fluid, &(smd->domain->alpha), &(smd->domain->beta), &(smd->domain->time_scale), &(smd->domain->vorticity), &(smd->domain->border_collisions));
if(smd->domain->wt)
{
@@ -296,7 +296,7 @@ int smokeModifier_init (SmokeModifierData *smd, Object *ob, Scene *scene, Derive
return 1;
}
- return 1;
+ return 2;
}
static void fill_scs_points(Object *ob, DerivedMesh *dm, SmokeCollSettings *scs)
@@ -713,12 +713,16 @@ void smokeModifier_createType(struct SmokeModifierData *smd)
smd->domain->omega = 1.0;
smd->domain->alpha = -0.001;
smd->domain->beta = 0.1;
- smd->domain->flags = MOD_SMOKE_DISSOLVE_LOG;
+ smd->domain->time_scale = 1.0;
+ smd->domain->vorticity = 2.0;
+ smd->domain->border_collisions = 1; // vertically non-colliding
+ smd->domain->flags = MOD_SMOKE_DISSOLVE_LOG | MOD_SMOKE_HIGH_SMOOTH;
smd->domain->strength = 2.0;
smd->domain->noise = MOD_SMOKE_NOISEWAVE;
smd->domain->diss_speed = 5;
// init 3dview buffer
- smd->domain->viewsettings = 0;
+
+ smd->domain->viewsettings = MOD_SMOKE_VIEW_SHOWBIG;
smd->domain->effector_weights = BKE_add_effector_weights(NULL);
}
else if(smd->type & MOD_SMOKE_TYPE_FLOW)
@@ -733,6 +737,8 @@ void smokeModifier_createType(struct SmokeModifierData *smd)
/* set some standard values */
smd->flow->density = 1.0;
smd->flow->temp = 1.0;
+ smd->flow->flags = MOD_SMOKE_FLOW_ABSOLUTE;
+ smd->flow->vel_multi = 1.0;
smd->flow->psys = NULL;
@@ -753,6 +759,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);
@@ -827,7 +868,7 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
{
ParticleSystem *psys = sfs->psys;
ParticleSettings *part=psys->part;
- ParticleData *pa = NULL;
+ ParticleData *pa = NULL;
int p = 0;
float *density = smoke_get_density(sds->fluid);
float *bigdensity = smoke_turbulence_get_density(sds->wt);
@@ -836,7 +877,27 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
float *velocity_y = smoke_get_velocity_y(sds->fluid);
float *velocity_z = smoke_get_velocity_z(sds->fluid);
unsigned char *obstacle = smoke_get_obstacle(sds->fluid);
- int bigres[3];
+ int bigres[3];
+ short absolute_flow = (sfs->flags & MOD_SMOKE_FLOW_ABSOLUTE);
+ short high_emission_smoothing = bigdensity ? (smd->domain->flags & MOD_SMOKE_HIGH_SMOOTH) : 0;
+
+ /*
+ * A temporary volume map used to store whole emissive
+ * area to be added to smoke density and interpolated
+ * for high resolution smoke.
+ */
+ float *temp_emission_map = NULL;
+
+ // initialize temp emission map
+ if(!(sfs->type & MOD_SMOKE_FLOW_TYPE_OUTFLOW))
+ {
+ int i;
+ temp_emission_map = MEM_callocN(sizeof(float) * sds->res[0]*sds->res[1]*sds->res[2], "SmokeTempEmission");
+ // set whole volume to 0.0f
+ for (i=0; i<sds->res[0]*sds->res[1]*sds->res[2]; i++) {
+ temp_emission_map[i] = 0.0f;
+ }
+ }
// mostly copied from particle code
for(p=0, pa=psys->particles; p<psys->totpart; p++, pa++)
@@ -870,33 +931,17 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
// heat[index] += sfs->temp * 0.1;
// density[index] += sfs->density * 0.1;
heat[index] = sfs->temp;
- density[index] = sfs->density;
-
+
+ // Add emitter density to temp emission map
+ temp_emission_map[index] = sfs->density;
// Uses particle velocity as initial velocity for smoke
- if(smd->domain->flags & MOD_SMOKE_INITVELOCITY) {
- velocity_x[index] = pa->state.vel[0];
- velocity_y[index] = pa->state.vel[1];
- velocity_z[index] = pa->state.vel[2];
- }
-
- // obstacle[index] |= 2;
- // we need different handling for the high-res feature
- if(bigdensity)
+ if(sfs->flags & MOD_SMOKE_FLOW_INITVELOCITY && (psys->part->phystype != PART_PHYS_NO))
{
- // init all surrounding cells according to amplification, too
- int i, j, k;
-
- smoke_turbulence_get_res(smd->domain->wt, bigres);
-
- for(i = 0; i < smd->domain->amplify + 1; i++)
- for(j = 0; j < smd->domain->amplify + 1; j++)
- for(k = 0; k < smd->domain->amplify + 1; k++)
- {
- index = smoke_get_index((smd->domain->amplify + 1)* cell[0] + i, bigres[0], (smd->domain->amplify + 1)* cell[1] + j, bigres[1], (smd->domain->amplify + 1)* cell[2] + k);
- bigdensity[index] = sfs->density;
- }
- }
+ velocity_x[index] = pa->state.vel[0]*sfs->vel_multi;
+ velocity_y[index] = pa->state.vel[1]*sfs->vel_multi;
+ velocity_z[index] = pa->state.vel[2]*sfs->vel_multi;
+ }
}
else if(sfs->type & MOD_SMOKE_FLOW_TYPE_OUTFLOW) // outflow
{
@@ -919,9 +964,136 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
index = smoke_get_index((smd->domain->amplify + 1)* cell[0] + i, bigres[0], (smd->domain->amplify + 1)* cell[1] + j, bigres[1], (smd->domain->amplify + 1)* cell[2] + k);
bigdensity[index] = 0.f;
}
- }
- } // particles loop
- }
+ }
+ }
+ } // particles loop
+
+
+ // apply emission values
+ if(!(sfs->type & MOD_SMOKE_FLOW_TYPE_OUTFLOW)) {
+
+ // initialize variables
+ int ii, jj, kk, x, y, z, block_size;
+ size_t index, index_big;
+
+ smoke_turbulence_get_res(smd->domain->wt, bigres);
+ block_size = smd->domain->amplify + 1; // high res block size
+
+
+ // loop through every low res cell
+ for(x = 0; x < sds->res[0]; x++)
+ for(y = 0; y < sds->res[1]; y++)
+ for(z = 0; z < sds->res[2]; z++)
+ {
+
+ // neighbour cell emission densities (for high resolution smoke smooth interpolation)
+ float c000, c001, c010, c011, c100, c101, c110, c111;
+
+ c000 = (x>0 && y>0 && z>0) ? temp_emission_map[smoke_get_index(x-1, sds->res[0], y-1, sds->res[1], z-1)] : 0;
+ c001 = (x>0 && y>0) ? temp_emission_map[smoke_get_index(x-1, sds->res[0], y-1, sds->res[1], z)] : 0;
+ c010 = (x>0 && z>0) ? temp_emission_map[smoke_get_index(x-1, sds->res[0], y, sds->res[1], z-1)] : 0;
+ c011 = (x>0) ? temp_emission_map[smoke_get_index(x-1, sds->res[0], y, sds->res[1], z)] : 0;
+
+ c100 = (y>0 && z>0) ? temp_emission_map[smoke_get_index(x, sds->res[0], y-1, sds->res[1], z-1)] : 0;
+ c101 = (y>0) ? temp_emission_map[smoke_get_index(x, sds->res[0], y-1, sds->res[1], z)] : 0;
+ c110 = (z>0) ? temp_emission_map[smoke_get_index(x, sds->res[0], y, sds->res[1], z-1)] : 0;
+ c111 = temp_emission_map[smoke_get_index(x, sds->res[0], y, sds->res[1], z)]; // this cell
+
+
+
+ // get cell index
+ index = smoke_get_index(x, sds->res[0], y, sds->res[1], z);
+
+ // add emission to low resolution density
+ if (absolute_flow) {if (temp_emission_map[index]>0) density[index] = temp_emission_map[index];}
+ else {
+ density[index] += temp_emission_map[index];
+ if (density[index]>1) density[index]=1.0f;
+ }
+
+ smoke_turbulence_get_res(smd->domain->wt, bigres);
+
+
+
+ /*
+ loop through high res blocks if high res enabled
+ */
+ if (bigdensity)
+ for(ii = 0; ii < block_size; ii++)
+ for(jj = 0; jj < block_size; jj++)
+ for(kk = 0; kk < block_size; kk++)
+ {
+
+ float fx,fy,fz, interpolated_value;
+ int shift_x, shift_y, shift_z;
+
+
+ /*
+ * Do volume interpolation if emitter smoothing
+ * is enabled
+ */
+ if (high_emission_smoothing) {
+ // convert block position to relative
+ // for interpolation smoothing
+ fx = (float)ii/block_size + 0.5f/block_size;
+ fy = (float)jj/block_size + 0.5f/block_size;
+ fz = (float)kk/block_size + 0.5f/block_size;
+
+ // calculate trilinear interpolation
+ interpolated_value = c000 * (1-fx) * (1-fy) * (1-fz) +
+ c100 * fx * (1-fy) * (1-fz) +
+ c010 * (1-fx) * fy * (1-fz) +
+ c001 * (1-fx) * (1-fy) * fz +
+ c101 * fx * (1-fy) * fz +
+ c011 * (1-fx) * fy * fz +
+ c110 * fx * fy * (1-fz) +
+ c111 * fx * fy * fz;
+
+
+ // add some contrast / sharpness
+ // depending on hi-res block size
+
+ interpolated_value = (interpolated_value-0.4f*sfs->density)*(block_size/2) + 0.4f*sfs->density;
+ if (interpolated_value<0.0f) interpolated_value = 0.0f;
+ if (interpolated_value>1.0f) interpolated_value = 1.0f;
+
+ // shift smoke block index
+ // (because pixel center is actually
+ // in halfway of the low res block)
+ shift_x = (x < 1) ? 0 : block_size/2;
+ shift_y = (y < 1) ? 0 : block_size/2;
+ shift_z = (z < 1) ? 0 : block_size/2;
+ }
+ else {
+ // without interpolation use same low resolution
+ // block value for all hi-res blocks
+ interpolated_value = c111;
+ shift_x = 0;
+ shift_y = 0;
+ shift_z = 0;
+ }
+
+ // get shifted index for current high resolution block
+ index_big = smoke_get_index(block_size * x + ii - shift_x, bigres[0], block_size * y + jj - shift_y, bigres[1], block_size * z + kk - shift_z);
+
+ // add emission data to high resolution density
+ if (absolute_flow) {if (interpolated_value > 0) bigdensity[index_big] = interpolated_value;}
+ else {
+ bigdensity[index_big] += interpolated_value;
+ if (bigdensity[index_big]>1) bigdensity[index_big]=1.0f;
+ }
+
+ } // end of hires loop
+
+ } // end of low res loop
+
+ // free temporary emission map
+ if (temp_emission_map) MEM_freeN(temp_emission_map);
+
+ } // end emission
+
+
+
}
else
{
@@ -935,7 +1107,7 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
BLI_bvhtree_find_nearest(sfs->bvh->tree, pco, &nearest, sfs->bvh->nearest_callback, sfs->bvh);
}*/
- }
+ }
}
}
if(sds->fluid_group)
@@ -1153,6 +1325,7 @@ void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedM
int startframe, endframe, framenr;
float timescale;
int cache_result = 0, cache_result_wt = 0;
+ int did_init = 0;
framenr = scene->r.cfra;
@@ -1182,7 +1355,7 @@ void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedM
// printf("startframe: %d, framenr: %d\n", startframe, framenr);
- if(!smokeModifier_init(smd, ob, scene, dm))
+ if(!(did_init = smokeModifier_init(smd, ob, scene, dm)))
{
printf("bad smokeModifier_init\n");
return;
@@ -1237,10 +1410,20 @@ void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedM
{
if(sds->flags & MOD_SMOKE_DISSOLVE)
smoke_dissolve(sds->fluid, sds->diss_speed, sds->flags & MOD_SMOKE_DISSOLVE_LOG);
- smoke_step(sds->fluid, smd->time);
+ smoke_step(sds->fluid, smd->time, scene->r.frs_sec / scene->r.frs_sec_base);
+ }
+ else
+ {
+ /* Smoke did not load cache and was not reset but we're on startframe */
+ /* So now reinit the smoke since it was not done yet */
+ if(did_init == 2)
+ {
+ smokeModifier_reset(smd);
+ smokeModifier_init(smd, ob, scene, dm);
+ }
}
- // create shadows before writing cache so we get nice shadows for sstartframe, too
+ // create shadows before writing cache so we get nice shadows for startframe, too
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);
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index e6f500aab15..98a50eee146 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
*****
*/
@@ -55,11 +55,12 @@ variables on the UI for now
#include "MEM_guardedalloc.h"
/* types */
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_lattice_types.h"
#include "DNA_curve_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
-#include "DNA_lattice_types.h"
-#include "DNA_scene_types.h"
#include "BLI_math.h"
#include "BLI_ghash.h"
@@ -83,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;
@@ -136,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
*/
@@ -149,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 */
@@ -187,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)
@@ -206,10 +211,10 @@ static float sb_time_scale(Object *ob)
/* 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 ..
+ 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
+ We DO linear interpolation for goals .. and i think we should do on animated properties as well
*/
/* animate sb->maxgoal,sb->mingoal */
@@ -221,7 +226,7 @@ static float _final_goal(Object *ob,BodyPoint *bp)/*jow_go_for2_5 */
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 = sb->mingoal + bp->goal*ABS(sb->maxgoal - sb->mingoal);
f = pow(f, 4.0f);
return (f);
}
@@ -247,15 +252,15 @@ static float _final_mass(Object *ob,BodyPoint *bp)
/********************
for each target object/face the axis aligned bounding box (AABB) is stored
-faces paralell to global axes
+faces parallel 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;
@@ -285,11 +290,11 @@ static ccd_Mesh *ccd_mesh_make(Object *ob, DerivedMesh *dm)
MFace *mface=NULL;
float v[3],hull;
int i;
-
+
/* first some paranoia checks */
if (!dm) return NULL;
if (!dm->getNumVerts(dm) || !dm->getNumFaces(dm)) return NULL;
-
+
pccd_M = MEM_mallocN(sizeof(ccd_Mesh),"ccd_Mesh");
pccd_M->totvert = dm->getNumVerts(dm);
pccd_M->totface = dm->getNumFaces(dm);
@@ -297,32 +302,32 @@ 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 */
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 */
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->dupFaceArray(dm);
-
+
/* OBBs for idea1 */
pccd_M->mima = MEM_mallocN(sizeof(ccdf_minmax)*pccd_M->totface,"ccd_Mesh_Faces_mima");
mima = pccd_M->mima;
@@ -333,7 +338,7 @@ 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);
mima->minx = MIN2(mima->minx,v[0]-hull);
mima->miny = MIN2(mima->miny,v[1]-hull);
@@ -341,7 +346,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);
-
+
VECCOPY(v,pccd_M->mvert[mface->v2].co);
mima->minx = MIN2(mima->minx,v[0]-hull);
mima->miny = MIN2(mima->miny,v[1]-hull);
@@ -349,7 +354,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);
-
+
VECCOPY(v,pccd_M->mvert[mface->v3].co);
mima->minx = MIN2(mima->minx,v[0]-hull);
mima->miny = MIN2(mima->miny,v[1]-hull);
@@ -357,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);
@@ -368,10 +373,10 @@ static ccd_Mesh *ccd_mesh_make(Object *ob, DerivedMesh *dm)
mima->maxz = MAX2(mima->maxz,v[2]+hull);
}
-
+
mima++;
mface++;
-
+
}
return pccd_M;
}
@@ -381,7 +386,7 @@ static void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M, DerivedMesh *dm)
MFace *mface=NULL;
float v[3],hull;
int i;
-
+
/* first some paranoia checks */
if (!dm) return ;
if (!dm->getNumVerts(dm) || !dm->getNumFaces(dm)) return ;
@@ -391,27 +396,27 @@ 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 */
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;
/* 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 */
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);
@@ -421,13 +426,13 @@ static void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M, DerivedMesh *dm)
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;
@@ -436,7 +441,7 @@ 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);
mima->minx = MIN2(mima->minx,v[0]-hull);
mima->miny = MIN2(mima->miny,v[1]-hull);
@@ -444,7 +449,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);
-
+
VECCOPY(v,pccd_M->mvert[mface->v2].co);
mima->minx = MIN2(mima->minx,v[0]-hull);
mima->miny = MIN2(mima->miny,v[1]-hull);
@@ -452,7 +457,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);
-
+
VECCOPY(v,pccd_M->mvert[mface->v3].co);
mima->minx = MIN2(mima->minx,v[0]-hull);
mima->miny = MIN2(mima->miny,v[1]-hull);
@@ -460,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);
@@ -479,7 +484,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);
-
+
VECCOPY(v,pccd_M->mprevvert[mface->v2].co);
mima->minx = MIN2(mima->minx,v[0]-hull);
mima->miny = MIN2(mima->miny,v[1]-hull);
@@ -487,7 +492,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);
-
+
VECCOPY(v,pccd_M->mprevvert[mface->v3].co);
mima->minx = MIN2(mima->minx,v[0]-hull);
mima->miny = MIN2(mima->miny,v[1]-hull);
@@ -495,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);
@@ -506,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 ;
}
@@ -537,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;
}
@@ -557,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) */
}
@@ -576,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 {
@@ -601,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) */
}
@@ -616,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;
}
@@ -632,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;
@@ -662,11 +667,11 @@ static void add_mesh_quad_diag_springs(Object *ob)
bs->v2= mface->v4;
bs->springtype =SB_STIFFQUAD;
bs++;
-
+
}
- }
+ }
}
-
+
/* now we can announce new springs */
ob->soft->totspring += nofquads *2;
}
@@ -677,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 :) */
@@ -692,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;
}
@@ -700,7 +705,7 @@ 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 */
@@ -726,9 +731,9 @@ static void add_2nd_order_roller(Object *ob,float stiffness,int *counter, int ad
}
}
-
+
}
-
+
}
/*scan for neighborhood done*/
}
@@ -740,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 ;
}
@@ -759,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;
@@ -781,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;
@@ -850,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;
@@ -864,38 +869,38 @@ 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 */
+ /* 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 = 1.0f;
}
@@ -912,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;
}
@@ -934,7 +939,7 @@ static void free_scratch(SoftBody *sb)
MEM_freeN(sb->scratch);
sb->scratch = NULL;
}
-
+
}
/* only frees internal data */
@@ -943,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;
@@ -968,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
*/
@@ -1006,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;
}
}
@@ -1055,17 +1060,17 @@ 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 */
@@ -1076,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;
@@ -1124,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);
@@ -1182,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;
@@ -1221,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++;
@@ -1260,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){
@@ -1269,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*/
@@ -1288,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) ){
@@ -1299,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) ||
@@ -1313,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;
}
@@ -1329,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);
@@ -1353,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);
@@ -1369,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);
@@ -1380,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);
@@ -1402,7 +1407,7 @@ static void scan_for_ext_face_forces(Object *ob,float timenow)
if (bf->v4){
sb->bpoint[bf->v2].choke2=MAX2(sb->bpoint[bf->v2].choke2,choke);
}
- }
+ }
}
}
}
@@ -1412,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;
@@ -1449,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++;
@@ -1488,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){
@@ -1497,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*/
@@ -1535,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;
@@ -1552,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;
@@ -1580,7 +1585,7 @@ 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;
@@ -1590,10 +1595,10 @@ static void _scan_for_ext_spring_forces(Scene *scene, Object *ob, float timenow,
/* ---- 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;
@@ -1604,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{
@@ -1614,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);
@@ -1624,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
}
}
@@ -1638,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);
@@ -1652,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;
@@ -1680,16 +1685,16 @@ 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].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
@@ -1709,7 +1714,7 @@ static void sb_sfesf_threads_run(Scene *scene, struct Object *ob, float timenow,
exec_scan_for_ext_spring_forces(&sb_threads[0]);
/* clean up */
MEM_freeN(sb_threads);
-
+
pdEndEffectors(&do_effector);
}
@@ -1733,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);
}
@@ -1751,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,
@@ -1782,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 */
@@ -1819,12 +1824,12 @@ static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3],
/* 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++;
@@ -1833,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){
@@ -1842,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
@@ -1867,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);
@@ -1881,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)
@@ -1905,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);
@@ -1948,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);
@@ -1957,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);
@@ -1966,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);
@@ -1975,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);
@@ -1984,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 () */
@@ -2026,11 +2031,10 @@ 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){
- VECCOPY(facenormal,force);
- normalize_v3(facenormal);
+ if (deflected){
+ normalize_v3_v3(facenormal, force);
}
- return deflected;
+ return deflected;
}
@@ -2038,7 +2042,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);
@@ -2047,7 +2051,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){
@@ -2069,13 +2073,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);
}
@@ -2125,13 +2129,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;
@@ -2153,12 +2158,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
@@ -2177,7 +2182,7 @@ 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 */
@@ -2200,7 +2205,7 @@ 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;
@@ -2209,7 +2214,7 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo
if(do_selfcollision){
int attached;
BodyPoint *obp;
- BodySpring *bs;
+ BodySpring *bs;
int c,b;
float velcenter[3],dvel[3],def[3];
float distance;
@@ -2217,7 +2222,7 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo
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 */
@@ -2255,7 +2260,7 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo
/* naive ball self collision done */
if(_final_goal(ob,bp) < SOFTGOALSNAP){ /* ommit this bp when it snaps */
- float auxvect[3];
+ float auxvect[3];
float velgoal[3];
/* do goal stuff */
@@ -2272,7 +2277,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]);
@@ -2285,15 +2290,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)*_final_mass(ob,bp)*sb->effector_weights->global_gravity); /* individual mass of node here */
- add_v3_v3v3(bp->force, bp->force, gravity);
+ add_v3_v3(bp->force, gravity);
}
-
+
/* particle field & vortex */
if(do_effector) {
EffectedPoint epoint;
@@ -2303,22 +2308,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;
@@ -2328,22 +2333,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);
}
}
@@ -2354,19 +2359,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(ob,ilast-bb,bs,iks,forcetime,0);
}/* loop springs */
- }/* existing spring list */
+ }/* existing spring list */
}/*any edges*/
/* ---springs */
}/*omit on snap */
@@ -2379,7 +2384,7 @@ 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);
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)
{
@@ -2406,16 +2411,16 @@ 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].ifirst = 0;
sb_threads[i].do_effector = do_effector;
sb_threads[i].do_deflector = do_deflector;
sb_threads[i].fieldfactor = fieldfactor;
@@ -2441,30 +2446,30 @@ static void sb_cf_threads_run(Scene *scene, Object *ob, float forcetime, float t
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);
@@ -2477,7 +2482,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);
}
@@ -2497,20 +2502,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;
@@ -2525,10 +2530,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);
@@ -2554,7 +2559,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);
@@ -2586,7 +2591,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 */
@@ -2630,11 +2635,11 @@ 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 */
@@ -2652,7 +2657,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa
/* naive ball self collision done */
if(_final_goal(ob,bp) < SOFTGOALSNAP){ /* ommit this bp when it snaps */
- float auxvect[3];
+ float auxvect[3];
float velgoal[3];
/* do goal stuff */
@@ -2667,7 +2672,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);
}
@@ -2684,7 +2689,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);
}
@@ -2712,11 +2717,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);
@@ -2725,7 +2730,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;
@@ -2733,7 +2738,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);
@@ -2744,7 +2749,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;
@@ -2752,15 +2757,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);
}
@@ -2772,7 +2777,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{
@@ -2799,16 +2804,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 */
@@ -2833,7 +2838,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();
}
@@ -2905,7 +2910,7 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float *
int a,fuzzy=0;
forcetime *= sb_time_scale(ob);
-
+
aabbmin[0]=aabbmin[1]=aabbmin[2] = 1e20f;
aabbmax[0]=aabbmax[1]=aabbmax[2] = -1e20f;
@@ -2915,7 +2920,7 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float *
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 */
@@ -2926,14 +2931,14 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float *
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);
@@ -2957,7 +2962,7 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float *
/* 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 */
@@ -2975,7 +2980,7 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float *
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]);
@@ -2984,9 +2989,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));
@@ -3005,7 +3010,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);
@@ -3013,7 +3018,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);
@@ -3032,7 +3037,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);
@@ -3045,7 +3050,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);
@@ -3060,12 +3065,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;
}
@@ -3078,12 +3083,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;
}
@@ -3097,17 +3102,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;
}
}
@@ -3116,8 +3121,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)
@@ -3125,12 +3130,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 (_final_goal(ob,bp) >= SOFTGOALSNAP){
VECCOPY(bp->prevpos,bp->pos);
VECCOPY(bp->pos,bp->origT);
- }
+ }
}
}
@@ -3165,20 +3170,20 @@ 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]);
+
+ 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];
}
}
-
+
}
@@ -3191,13 +3196,13 @@ static void interpolate_exciter(Object *ob, int timescale, int time)
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;
@@ -3218,10 +3223,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 length are caculted from'raw' mesh vertices that are NOT altered by modifier stack. */
static void springs_from_mesh(Object *ob)
{
SoftBody *sb;
@@ -3229,21 +3234,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 */
@@ -3271,21 +3276,21 @@ static void mesh_to_softbody(Scene *scene, Object *ob)
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;
-
+
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
- */
-
+ 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]) */
@@ -3300,9 +3305,9 @@ static void mesh_to_softbody(Scene *scene, Object *ob)
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;}
+ if(ob->softflag & OB_SB_GOAL){bp->goal =sb->defgoal;}
}
-
+
/* to proove the concept
this enables per vertex *mass painting*
*/
@@ -3324,7 +3329,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);
@@ -3332,7 +3337,7 @@ static void mesh_to_softbody(Scene *scene, Object *ob)
}
}
-
+
}
/* but we only optionally add body edge springs */
@@ -3344,37 +3349,37 @@ 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) {
add_2nd_order_springs(ob,sb->secondspring); /* exploits the the first run of build_bps_springlist(ob);*/
build_bps_springlist(ob); /* yes we need to do it again*/
}
- springs_from_mesh(ob); /* write the 'rest'-lenght of the springs */
+ springs_from_mesh(ob); /* write the 'rest'-length of the springs */
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;
@@ -3384,13 +3389,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};
@@ -3411,14 +3416,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);
@@ -3428,16 +3433,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;
@@ -3459,7 +3464,7 @@ static void makelatticesprings(Lattice *lt, BodySpring *bs, int dostiff,Object *
bs->len= globallen((bpu)->vec, bp->vec,ob);
bs++;
}
-
+
if (dostiff) {
if(w){
@@ -3469,14 +3474,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){
@@ -3486,14 +3491,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;
@@ -3514,19 +3519,19 @@ 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
+ 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 */
@@ -3539,8 +3544,8 @@ static void lattice_to_softbody(Scene *scene, Object *ob)
for(a=0; a<totvert; a++, bp++, bpnt++) {
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);
@@ -3560,57 +3565,64 @@ static void curve_surf_to_softbody(Scene *scene, Object *ob)
BPoint *bpnt;
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 */
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= 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++;
}
@@ -3631,7 +3643,7 @@ static void curve_surf_to_softbody(Scene *scene, Object *ob)
}
}
}
-
+
if(totspring)
{
build_bps_springlist(ob); /* link bps to springs */
@@ -3652,7 +3664,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 */
}
}
@@ -3663,13 +3675,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 *************** */
@@ -3679,26 +3691,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;
@@ -3750,7 +3762,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;
@@ -3763,7 +3775,7 @@ static int object_has_edges(Object *ob)
}
}
-/* SB global visible functions */
+/* SB global visible functions */
void sbSetInterruptCallBack(int (*f)(void))
{
SB_localInterruptCallBack = f;
@@ -3778,7 +3790,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]);
@@ -3786,7 +3798,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);
}
}
@@ -3800,7 +3812,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
@@ -3821,10 +3833,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);
@@ -3834,7 +3846,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);
}
@@ -3857,9 +3869,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
*/
@@ -3873,7 +3885,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);
@@ -3906,15 +3918,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){
@@ -3924,7 +3936,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;
@@ -3934,21 +3946,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);
@@ -3960,9 +3972,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);
@@ -3974,7 +3986,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;
@@ -3990,7 +4002,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++;
@@ -3998,20 +4010,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 */
diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c
index 7308146ef92..26392132038 100644
--- a/source/blender/blenkernel/intern/sound.c
+++ b/source/blender/blenkernel/intern/sound.c
@@ -16,6 +16,7 @@
#include "DNA_sequence_types.h"
#include "DNA_packedFile_types.h"
#include "DNA_screen_types.h"
+#include "DNA_sound_types.h"
#include "AUD_C-API.h"
@@ -30,10 +31,6 @@
#include "BKE_animsys.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
static int force_device = -1;
#ifdef WITH_JACK
@@ -77,6 +74,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;
@@ -121,10 +123,15 @@ struct bSound* sound_new_file(struct Main *bmain, char* filename)
bSound* sound = NULL;
char str[FILE_MAX];
+ char *path;
+
int len;
strcpy(str, filename);
- BLI_path_abs(str, bmain->name);
+
+ path = /*bmain ? bmain->name :*/ G.sce;
+
+ BLI_path_abs(str, path);
len = strlen(filename);
while(len > 0 && filename[len-1] != '/' && filename[len-1] != '\\')
@@ -255,9 +262,9 @@ 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;
+ path = /*bmain ? bmain->name :*/ G.sce;
BLI_path_abs(fullpath, path);
@@ -375,10 +382,8 @@ void sound_move_scene_sound(struct Scene *scene, void* handle, int startframe, i
void sound_start_play_scene(struct Scene *scene)
{
- AUD_Sound* sound;
- sound = AUD_loopSound(scene->sound_scene);
- scene->sound_scene_handle = AUD_play(sound, 1);
- AUD_unload(sound);
+ scene->sound_scene_handle = AUD_play(scene->sound_scene, 1);
+ AUD_setLoop(scene->sound_scene_handle, -1);
}
void sound_play_scene(struct Scene *scene)
@@ -391,8 +396,6 @@ void sound_play_scene(struct Scene *scene)
if(status == AUD_STATUS_INVALID)
sound_start_play_scene(scene);
- AUD_setLoop(scene->sound_scene_handle, -1, -1);
-
if(status != AUD_STATUS_PLAYING)
{
AUD_seek(scene->sound_scene_handle, CFRA / FPS);
@@ -430,12 +433,16 @@ void sound_seek_scene(struct bContext *C)
if(scene->audio.flag & AUDIO_SCRUB && !CTX_wm_screen(C)->animtimer)
{
- AUD_setLoop(scene->sound_scene_handle, -1, 1 / FPS);
+ // AUD_XXX TODO: fix scrubbing, it currently doesn't stop playing
if(scene->audio.flag & AUDIO_SYNC)
AUD_seekSequencer(scene->sound_scene_handle, CFRA / FPS);
else
AUD_seek(scene->sound_scene_handle, CFRA / FPS);
AUD_resume(scene->sound_scene_handle);
+ if(AUD_getStatus(scene->sound_scrub_handle) != AUD_STATUS_INVALID)
+ AUD_seek(scene->sound_scrub_handle, 0);
+ else
+ scene->sound_scrub_handle = AUD_pauseAfter(scene->sound_scene_handle, 1 / FPS);
}
else
{
@@ -467,7 +474,9 @@ int sound_scene_playing(struct Scene *scene)
return -1;
}
-int sound_read_sound_buffer(struct bSound* sound, float* buffer, int length)
+int sound_read_sound_buffer(struct bSound* sound, float* buffer, int length, float start, float end)
{
- return AUD_readSound(sound->cache, buffer, length);
+ AUD_Sound* limiter = AUD_limitSound(sound->cache, start, end);
+ return AUD_readSound(limiter, buffer, length);
+ AUD_unload(limiter);
}
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 3972355d302..4c85656dd91 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -44,6 +44,7 @@
#include "BKE_cdderivedmesh.h"
#include "BKE_global.h"
#include "BKE_mesh.h"
+#include "BKE_modifier.h"
#include "BKE_paint.h"
#include "BKE_scene.h"
#include "BKE_subsurf.h"
@@ -68,6 +69,8 @@ static int ccgDM_getVertMapIndex(CCGSubSurf *ss, CCGVert *v);
static int ccgDM_getEdgeMapIndex(CCGSubSurf *ss, CCGEdge *e);
static int ccgDM_getFaceMapIndex(CCGSubSurf *ss, CCGFace *f);
+static int ccgDM_use_grid_pbvh(CCGDerivedMesh *ccgdm);
+
///
static void *arena_alloc(CCGAllocatorHDL a, int numBytes) {
@@ -117,7 +120,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;
@@ -844,6 +847,7 @@ static void ccgDM_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);
}
}
@@ -1247,7 +1251,7 @@ static void ccgDM_glNormalFast(float *a, float *b, float *c, float *d)
static void ccgdm_pbvh_update(CCGDerivedMesh *ccgdm)
{
- if(ccgdm->pbvh && ccgdm->multires.mmd) {
+ if(ccgdm->pbvh && ccgDM_use_grid_pbvh(ccgdm)) {
CCGFace **faces;
int totface;
@@ -2228,10 +2232,28 @@ static ListBase *ccgDM_getFaceMap(Object *ob, DerivedMesh *dm)
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 *ccgdm= (CCGDerivedMesh*)dm;
- int gridSize, numGrids;
+ int gridSize, numGrids, grid_pbvh;
if(!ob) {
ccgdm->pbvh= NULL;
@@ -2240,13 +2262,30 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm)
if(!ob->sculpt)
return NULL;
- if(ob->sculpt->pbvh)
- ccgdm->pbvh= ob->sculpt->pbvh;
+
+ 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;
- if(ccgdm->multires.mmd) {
+ /* 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);
@@ -2255,6 +2294,7 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm)
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;
@@ -2262,6 +2302,7 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm)
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 ccgdm->pbvh;
@@ -2289,6 +2330,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
int gridInternalEdges;
MEdge *medge = NULL;
MFace *mface = NULL;
+ int *orig_indices;
FaceVertWeight *qweight, *tweight;
DM_from_template(&ccgdm->dm, dm, DM_TYPE_CCGDM,
@@ -2398,6 +2440,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
faceFlags = ccgdm->faceFlags = MEM_callocN(sizeof(char)*2*totface, "faceFlags");
+ orig_indices = (int*)ccgdm->dm.getFaceDataArray(&ccgdm->dm, CD_ORIGINDEX);
for(index = 0; index < totface; ++index) {
CCGFace *f = ccgdm->faceMap[index].face;
int numVerts = ccgSubSurf_getFaceNumVerts(f);
@@ -2411,6 +2454,9 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
ccgdm->faceMap[index].startEdge = edgeNum;
ccgdm->faceMap[index].startFace = faceNum;
+ if(orig_indices)
+ orig_indices[faceNum] = origIndex;
+
/* set the face base vert */
*((int*)ccgSubSurf_getFaceUserData(ss, f)) = vertNum;
@@ -2679,7 +2725,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/text.c b/source/blender/blenkernel/intern/text.c
index 98ff0b2da1a..19bc853276a 100644
--- a/source/blender/blenkernel/intern/text.c
+++ b/source/blender/blenkernel/intern/text.c
@@ -43,6 +43,8 @@
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_text_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_object_types.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h"
@@ -55,10 +57,6 @@
#include "BPY_extern.h"
#endif
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
/***************/ /*
How Texts should work
@@ -176,10 +174,11 @@ void free_text(Text *text)
Text *add_empty_text(char *name)
{
+ Main *bmain= G.main;
Text *ta;
TextLine *tmp;
- ta= alloc_libblock(&G.main->text, ID_TXT, name);
+ ta= alloc_libblock(&bmain->text, ID_TXT, name);
ta->id.us= 1;
ta->name= NULL;
@@ -236,7 +235,6 @@ 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;
@@ -244,7 +242,6 @@ int reopen_text(Text *text)
BLI_strncpy(str, text->name, FILE_MAXDIR+FILE_MAXFILE);
BLI_path_abs(str, G.sce);
- BLI_split_dirfile(str, NULL, sfile);
fp= fopen(str, "r");
if(fp==NULL) return 0;
@@ -330,24 +327,23 @@ int reopen_text(Text *text)
Text *add_text(char *file, const char *relpath)
{
+ Main *bmain= G.main;
FILE *fp;
int i, llen, len, res;
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_path_abs(str, relpath);
- BLI_split_dirfile(str, NULL, sfile);
fp= fopen(str, "r");
if(fp==NULL) return NULL;
- ta= alloc_libblock(&G.main->text, ID_TXT, sfile);
+ ta= alloc_libblock(&bmain->text, ID_TXT, BLI_path_basename(str));
ta->id.us= 1;
ta->lines.first= ta->lines.last= NULL;
@@ -487,7 +483,7 @@ void unlink_text(Main *bmain, Text *text)
for(scene=bmain->scene.first; scene; scene=scene->id.next)
if(scene->r.dometext == text)
scene->r.dometext = NULL;
-
+
for(ob=bmain->object.first; ob; ob=ob->id.next) {
/* game controllers */
for(cont=ob->controllers.first; cont; cont=cont->next) {
@@ -2691,19 +2687,20 @@ void uncomment(Text *text)
}
}
-int setcurr_tab (Text *text)
+int setcurr_tab_spaces (Text *text, int space)
{
int i = 0;
int test = 0;
- char *word = ":";
- char *comm = "#";
- char back_words[4][7] = {"return", "break", "pass", "yield"};
+ const char *word = ":";
+ const char *comm = "#";
+ const char indent= (text->flags & TXT_TABSTOSPACES) ? ' ' : '\t';
+ static char *back_words[]= {"return", "break", "continue", "pass", "yield", NULL};
if (!text) return 0;
if (!text->curl) return 0;
-
- while (text->curl->line[i] == '\t')
+
+ while (text->curl->line[i] == indent)
{
- //we only count thos tabs that are before any text or before the curs;
+ //we only count those tabs/spaces that are before any text or before the curs;
if (i == text->curc)
{
return i;
@@ -2726,18 +2723,18 @@ int setcurr_tab (Text *text)
}
}
if (indent) {
- i++;
+ i += space;
}
}
- for(test=0; test < 4; test++)
+ for(test=0; back_words[test]; test++)
{
- //if there are these 4 key words then remove a tab because we are done with the block
+ /* if there are these key words then remove a tab because we are done with the block */
if(strstr(text->curl->line, back_words[test]) && i > 0)
{
if(strcspn(text->curl->line, back_words[test]) < strcspn(text->curl->line, comm))
{
- i--;
+ i -= space;
}
}
}
diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c
index 48f819a7091..9075c64d286 100644
--- a/source/blender/blenkernel/intern/texture.c
+++ b/source/blender/blenkernel/intern/texture.c
@@ -169,8 +169,8 @@ PluginTex *add_plugin_tex(char *str)
open_plugin_tex(pit);
if(pit->doit==0) {
- if(pit->handle==0); //XXX error("no plugin: %s", str);
- else ; //XXX error("in plugin: %s", str);
+ if(pit->handle==0) {;} //XXX error("no plugin: %s", str);
+ else {;} //XXX error("in plugin: %s", str);
MEM_freeN(pit);
return NULL;
}
@@ -245,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;
@@ -403,6 +403,73 @@ void colorband_table_RGBA(ColorBand *coba, float **array, int *size)
do_colorband(coba, (float)a/(float)CM_TABLE, &(*array)[a*4]);
}
+int vergcband(const void *a1, const void *a2)
+{
+ const CBData *x1=a1, *x2=a2;
+
+ if( x1->pos > x2->pos ) return 1;
+ else if( x1->pos < x2->pos) return -1;
+ return 0;
+}
+
+CBData *colorband_element_add(struct ColorBand *coba, float position)
+{
+ int a;
+
+ if(coba->tot==MAXCOLORBAND) {
+ return NULL;
+ }
+ else if(coba->tot > 0) {
+ CBData *xnew;
+ float col[4];
+
+ do_colorband(coba, position, col);
+
+ xnew = &coba->data[coba->tot];
+ xnew->pos = position;
+
+ xnew->r = col[0];
+ xnew->g = col[1];
+ xnew->b = col[2];
+ xnew->a = col[3];
+ }
+
+ coba->tot++;
+ coba->cur = coba->tot-1;
+
+ for(a = 0; a < coba->tot; a++)
+ coba->data[a].cur = a;
+
+ qsort(coba->data, coba->tot, sizeof(CBData), vergcband);
+
+ for(a = 0; a < coba->tot; a++) {
+ if(coba->data[a].cur == coba->cur) {
+ coba->cur = a;
+ break;
+ }
+ }
+
+ return coba->data + coba->cur;
+}
+
+int colorband_element_remove(struct ColorBand *coba, int index)
+{
+ int a;
+
+ if(coba->tot < 2)
+ return 0;
+
+ if(index < 0 || index >= coba->tot)
+ return 0;
+
+ for(a = index; a < coba->tot; a++) {
+ coba->data[a] = coba->data[a + 1];
+ }
+ if(coba->cur) coba->cur--;
+ coba->tot--;
+ return 1;
+}
+
/* ******************* TEX ************************ */
void free_texture(Tex *tex)
@@ -451,6 +518,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;
@@ -509,13 +577,35 @@ 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)
{
+ Main *bmain= G.main;
Tex *tex;
- tex= alloc_libblock(&G.main->tex, ID_TE, name);
+ tex= alloc_libblock(&bmain->tex, ID_TE, name);
default_tex(tex);
@@ -620,6 +710,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);
@@ -635,6 +727,7 @@ Tex *copy_texture(Tex *tex)
void make_local_texture(Tex *tex)
{
+ Main *bmain= G.main;
Tex *texn;
Material *ma;
World *wrld;
@@ -664,7 +757,7 @@ void make_local_texture(Tex *tex)
return;
}
- ma= G.main->mat.first;
+ ma= bmain->mat.first;
while(ma) {
for(a=0; a<MAX_MTEX; a++) {
if(ma->mtex[a] && ma->mtex[a]->tex==tex) {
@@ -674,7 +767,7 @@ void make_local_texture(Tex *tex)
}
ma= ma->id.next;
}
- la= G.main->lamp.first;
+ la= bmain->lamp.first;
while(la) {
for(a=0; a<MAX_MTEX; a++) {
if(la->mtex[a] && la->mtex[a]->tex==tex) {
@@ -684,7 +777,7 @@ void make_local_texture(Tex *tex)
}
la= la->id.next;
}
- wrld= G.main->world.first;
+ wrld= bmain->world.first;
while(wrld) {
for(a=0; a<MAX_MTEX; a++) {
if(wrld->mtex[a] && wrld->mtex[a]->tex==tex) {
@@ -694,7 +787,7 @@ void make_local_texture(Tex *tex)
}
wrld= wrld->id.next;
}
- br= G.main->brush.first;
+ br= bmain->brush.first;
while(br) {
if(br->mtex.tex==tex) {
if(br->id.lib) lib= 1;
@@ -712,7 +805,7 @@ void make_local_texture(Tex *tex)
texn= copy_texture(tex);
texn->id.us= 0;
- ma= G.main->mat.first;
+ ma= bmain->mat.first;
while(ma) {
for(a=0; a<MAX_MTEX; a++) {
if(ma->mtex[a] && ma->mtex[a]->tex==tex) {
@@ -725,7 +818,7 @@ void make_local_texture(Tex *tex)
}
ma= ma->id.next;
}
- la= G.main->lamp.first;
+ la= bmain->lamp.first;
while(la) {
for(a=0; a<MAX_MTEX; a++) {
if(la->mtex[a] && la->mtex[a]->tex==tex) {
@@ -738,7 +831,7 @@ void make_local_texture(Tex *tex)
}
la= la->id.next;
}
- wrld= G.main->world.first;
+ wrld= bmain->world.first;
while(wrld) {
for(a=0; a<MAX_MTEX; a++) {
if(wrld->mtex[a] && wrld->mtex[a]->tex==tex) {
@@ -751,7 +844,7 @@ void make_local_texture(Tex *tex)
}
wrld= wrld->id.next;
}
- br= G.main->brush.first;
+ br= bmain->brush.first;
while(br) {
if(br->mtex.tex==tex) {
if(br->id.lib==0) {
@@ -769,6 +862,7 @@ void make_local_texture(Tex *tex)
void autotexname(Tex *tex)
{
+ Main *bmain= G.main;
char texstr[20][15]= {"None" , "Clouds" , "Wood", "Marble", "Magic" , "Blend",
"Stucci", "Noise" , "Image", "Plugin", "EnvMap" , "Musgrave",
"Voronoi", "DistNoise", "Point Density", "Voxel Data", "", "", "", ""};
@@ -777,7 +871,7 @@ void autotexname(Tex *tex)
if(tex) {
if(tex->use_nodes) {
- new_id(&G.main->tex, (ID *)tex, "Noddy");
+ new_id(&bmain->tex, (ID *)tex, "Noddy");
}
else
if(tex->type==TEX_IMAGE) {
@@ -787,12 +881,12 @@ void autotexname(Tex *tex)
BLI_splitdirstring(di, fi);
strcpy(di, "I.");
strcat(di, fi);
- new_id(&G.main->tex, (ID *)tex, di);
+ new_id(&bmain->tex, (ID *)tex, di);
}
- else new_id(&G.main->tex, (ID *)tex, texstr[tex->type]);
+ else new_id(&bmain->tex, (ID *)tex, texstr[tex->type]);
}
- else if(tex->type==TEX_PLUGIN && tex->plugin) new_id(&G.main->tex, (ID *)tex, tex->plugin->pname);
- else new_id(&G.main->tex, (ID *)tex, texstr[tex->type]);
+ else if(tex->type==TEX_PLUGIN && tex->plugin) new_id(&bmain->tex, (ID *)tex, tex->plugin->pname);
+ else new_id(&bmain->tex, (ID *)tex, texstr[tex->type]);
}
}
@@ -877,9 +971,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) {
@@ -1103,6 +1203,7 @@ PointDensity *BKE_add_pointdensity(void)
pd->totpoints = 0;
pd->object = NULL;
pd->psys = 0;
+ pd->psys_cache_space= TEX_PD_WORLDSPACE;
return pd;
}
@@ -1141,7 +1242,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;
}
@@ -1165,6 +1267,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/world.c b/source/blender/blenkernel/intern/world.c
index 1e1e41a07e7..42df92443f3 100644
--- a/source/blender/blenkernel/intern/world.c
+++ b/source/blender/blenkernel/intern/world.c
@@ -36,6 +36,7 @@
#include "DNA_world_types.h"
#include "DNA_scene_types.h"
+#include "DNA_texture_types.h"
#include "BKE_library.h"
#include "BKE_animsys.h"
@@ -43,14 +44,6 @@
#include "BKE_main.h"
#include "BKE_icons.h"
-#ifndef DISABLE_PYTHON
-#include "BPY_extern.h"
-#endif
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
void free_world(World *wrld)
{
MTex *mtex;
@@ -72,16 +65,17 @@ void free_world(World *wrld)
World *add_world(char *name)
{
+ Main *bmain= G.main;
World *wrld;
- wrld= alloc_libblock(&G.main->world, ID_WO, name);
+ wrld= alloc_libblock(&bmain->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;
@@ -100,6 +94,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;
}
@@ -130,6 +126,7 @@ World *copy_world(World *wrld)
void make_local_world(World *wrld)
{
+ Main *bmain= G.main;
Scene *sce;
World *wrldn;
int local=0, lib=0;
@@ -147,7 +144,7 @@ void make_local_world(World *wrld)
return;
}
- sce= G.main->scene.first;
+ sce= bmain->scene.first;
while(sce) {
if(sce->world==wrld) {
if(sce->id.lib) lib= 1;
@@ -165,7 +162,7 @@ void make_local_world(World *wrld)
wrldn= copy_world(wrld);
wrldn->id.us= 0;
- sce= G.main->scene.first;
+ sce= bmain->scene.first;
while(sce) {
if(sce->world==wrld) {
if(sce->id.lib==0) {
diff --git a/source/blender/blenkernel/intern/writeavi.c b/source/blender/blenkernel/intern/writeavi.c
index f4bcb6d412f..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;
diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c
index ff6ebcc487f..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;
@@ -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, ':');
@@ -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")
@@ -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++;
diff --git a/source/blender/blenkernel/intern/writeframeserver.c b/source/blender/blenkernel/intern/writeframeserver.c
index a7b6bcf3a09..b0c05c31fa1 100644
--- a/source/blender/blenkernel/intern/writeframeserver.c
+++ b/source/blender/blenkernel/intern/writeframeserver.c
@@ -45,7 +45,6 @@
#include <stdlib.h>
-#include "MEM_guardedalloc.h"
#include "DNA_userdef_types.h"
#include "BKE_global.h"
@@ -54,10 +53,6 @@
#include "DNA_scene_types.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
static int sock;
static int connsock;
static int write_ppm;
diff --git a/source/blender/blenlib/BLI_args.h b/source/blender/blenlib/BLI_args.h
index 61f83ccf6f9..cc4d65980c9 100644
--- a/source/blender/blenlib/BLI_args.h
+++ b/source/blender/blenlib/BLI_args.h
@@ -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_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
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
-struct ImBuf;
+#ifndef BLI_CPU_H
+#define BLI_CPU_H
-void imb_checkncols(struct ImBuf *ibuf);
+int BLI_cpu_support_sse2(void);
#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 ca4347f2c6d..0e985184f7a 100644
--- a/source/blender/blenlib/BLI_ghash.h
+++ b/source/blender/blenlib/BLI_ghash.h
@@ -36,12 +36,11 @@
extern "C" {
#endif
-#include "stdio.h"
-#include "stdlib.h"
-#include "string.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#include "BKE_utildefines.h"
-#include "MEM_guardedalloc.h"
#include "BLI_mempool.h"
#include "BLI_blenlib.h"
@@ -72,7 +71,7 @@ typedef struct GHashIterator {
struct Entry *curEntry;
} GHashIterator;
-GHash* BLI_ghash_new (GHashHashFP hashfp, GHashCmpFP cmpfp);
+GHash* BLI_ghash_new (GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info);
void BLI_ghash_free (GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp);
//BM_INLINE void BLI_ghash_insert (GHash *gh, void *key, void *val);
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 <float.h>
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 599487354c3..c4dc0894f80 100644
--- a/source/blender/blenlib/BLI_listbase.h
+++ b/source/blender/blenlib/BLI_listbase.h
@@ -45,6 +45,7 @@ void BLI_insertlink(struct ListBase *listbase, void *vprevlink, void *vnewlink);
void *BLI_findlink(struct ListBase *listbase, int number);
int BLI_findindex(struct ListBase *listbase, void *vlink);
void *BLI_findstring(struct ListBase *listbase, const char *id, int offset);
+void *BLI_findstring_ptr(struct ListBase *listbase, const char *id, int offset);
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);
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 72724c1c0f7..a297878ec20 100644
--- a/source/blender/blenlib/BLI_math_color.h
+++ b/source/blender/blenlib/BLI_math_color.h
@@ -75,6 +75,12 @@ float srgb_to_linearrgb(float c);
float linearrgb_to_srgb(float c);
void srgb_to_linearrgb_v3_v3(float *col_to, float *col_from);
void linearrgb_to_srgb_v3_v3(float *col_to, float *col_from);
+
+/* rgba buffer convenience functions */
+void srgb_to_linearrgb_rgba_buf(float *col, int tot);
+void linearrgb_to_srgb_rgba_buf(float *col, int tot);
+void srgb_to_linearrgb_rgba_rgba_buf(float *col_to, float *col_from, int tot);
+void linearrgb_to_srgb_rgba_rgba_buf(float *col_to, float *col_from, int tot);
/************************** Other *************************/
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]);
+
+/****************************** 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 *******************************/
-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 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..ac8ed041ebc 100644
--- a/source/blender/blenlib/BLI_math_rotation.h
+++ b/source/blender/blenlib/BLI_math_rotation.h
@@ -40,17 +40,18 @@ extern "C" {
/* init */
void unit_qt(float q[4]);
-void copy_qt_qt(float q[4], float a[4]);
+void copy_qt_qt(float q[4], const float a[4]);
/* arithmetic */
-void mul_qt_qtqt(float q[4], float a[4], float b[4]);
-void mul_qt_v3(float q[4], float r[3]);
-void mul_qt_fl(float q[4], float f);
-void mul_fac_qt_fl(float q[4], float f);
+void mul_qt_qtqt(float q[4], const float a[4], const float b[4]);
+void mul_qt_v3(const float q[4], float r[3]);
+void mul_qt_fl(float q[4], const float f);
+void mul_fac_qt_fl(float q[4], const float f);
void sub_qt_qtqt(float q[4], float a[4], float b[4]);
void invert_qt(float q[4]);
+void invert_qt_qt(float *q1, const float *q2);
void conjugate_qt(float q[4]);
float dot_qtqt(float a[4], float b[4]);
void normalize_qt(float q[4]);
@@ -72,6 +73,7 @@ void tri_to_quat(float q[4], float a[3], float b[3], float c[3]);
void vec_to_quat(float q[4], float vec[3], short axis, short upflag);
/* note: v1 and v2 must be normalized */
void rotation_between_vecs_to_quat(float q[4], const float v1[3], const float v2[3]);
+void rotation_between_quats_to_quat(float q[4], const float q1[4], const float q2[4]);
/* TODO: don't what this is, but it's not the same as mat3_to_quat */
void mat3_to_quat_is_ok(float q[4], float mat[3][3]);
@@ -166,6 +168,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 3ed8169f260..c6902d01059 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"
#endif
@@ -69,12 +71,14 @@ 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], 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], 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]);
@@ -93,6 +97,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]);
@@ -107,6 +112,7 @@ void interp_v3_v3v3(float r[3], const float a[3], const float b[3], const float
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]);
@@ -120,6 +126,7 @@ MINLINE int compare_v3v3(float a[3], float b[3], float limit);
MINLINE int compare_len_v3v3(float a[3], float b[3], float limit);
MINLINE int compare_v4v4(float a[4], float b[4], float limit);
+MINLINE int equals_v4v4(float a[4], float b[4]);
/********************************** Angles ***********************************/
/* - angle with 2 arguments is angle between vector */
@@ -144,9 +151,9 @@ void bisect_v3_v3v3v3(float r[3], float a[3], float b[3], float c[3]);
/*********************************** Other ***********************************/
-void print_v2(char *str, float a[2]);
-void print_v3(char *str, float a[3]);
-void print_v4(char *str, float a[4]);
+void print_v2(const char *str, const float a[2]);
+void print_v3(const char *str, const float a[3]);
+void print_v4(const char *str, const float a[4]);
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]);
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 91e0bbb138b..b8c886d95a9 100644
--- a/source/blender/blenlib/BLI_path_util.h
+++ b/source/blender/blenlib/BLI_path_util.h
@@ -30,25 +30,62 @@
*
* ***** 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;
-char *BLI_gethome(void);
-char *BLI_gethome_folder(char *folder_name, int flag);
-
-/* BLI_gethome_folder flag */
-#define BLI_GETHOME_LOCAL 1<<1 /* relative location for portable binaries */
-#define BLI_GETHOME_SYSTEM 1<<2 /* system location, or set from the BLENDERPATH env variable (UNIX only) */
-#define BLI_GETHOME_USER 1<<3 /* home folder ~/.blender */
-#define BLI_GETHOME_ALL (BLI_GETHOME_SYSTEM|BLI_GETHOME_LOCAL|BLI_GETHOME_USER)
+char *BLI_getDefaultDocumentFolder(void);
+
+char *BLI_get_folder(int folder_id, char *subfolder);
+char *BLI_get_folder_create(int folder_id, char *subfolder);
+
+/* folder_id */
+
+/* general, will find based 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
+#define BLENDER_USER_AUTOSAVE 35
+
+/* 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);
@@ -58,13 +95,16 @@ void BLI_make_exist(char *dir);
void BLI_make_existing_file(char *name);
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_testextensie_array(const char *str, const char **ext_array);
+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 */
@@ -138,18 +178,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 0da5b8529bb..4797aeb2364 100644
--- a/source/blender/blenlib/BLI_pbvh.h
+++ b/source/blender/blenlib/BLI_pbvh.h
@@ -36,12 +36,17 @@ 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 */
@@ -70,7 +75,7 @@ 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,
+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);
@@ -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); \
@@ -214,6 +237,13 @@ typedef struct PBVHVertexIter {
} \
}
+void BLI_pbvh_node_get_proxies(PBVHNode* node, PBVHProxyNode** proxies, int* proxy_count);
+void BLI_pbvh_node_free_proxies(PBVHNode* node);
+PBVHProxyNode* BLI_pbvh_node_add_proxy(PBVH* bvh, PBVHNode* node);
+void BLI_pbvh_gather_proxies(PBVH* pbvh, PBVHNode*** nodes, int* totnode);
+
+//void BLI_pbvh_node_BB_reset(PBVHNode* node);
+//void BLI_pbvh_node_BB_expand(PBVHNode* node, float co[3]);
#endif /* BLI_PBVH_H */
diff --git a/source/blender/blenlib/BLI_rand.h b/source/blender/blenlib/BLI_rand.h
index b089d7e052f..eab9f92d7e8 100644
--- a/source/blender/blenlib/BLI_rand.h
+++ b/source/blender/blenlib/BLI_rand.h
@@ -83,15 +83,15 @@ void BLI_array_randomize (void *data, int elemSize, int numElems, unsigned int s
/** Better seed for the random number generator, using noise.c hash[] */
- /** Allows up to 16 threads to address */
+ /** Allows up to BLENDER_MAX_THREADS threads to address */
void BLI_thread_srandom (int thread, unsigned int seed);
/** Return a pseudo-random number N where 0<=N<(2^31) */
- /** Allows up to 16 threads to address */
+ /** Allows up to BLENDER_MAX_THREADS threads to address */
int BLI_thread_rand (int thread);
/** Return a pseudo-random number N where 0.0f<=N<1.0f */
- /** Allows up to 16 threads to address */
+ /** Allows up to BLENDER_MAX_THREADS threads to address */
float BLI_thread_frand (int thread);
diff --git a/source/blender/blenlib/BLI_rect.h b/source/blender/blenlib/BLI_rect.h
index 52f645705cc..13b12fc4e1e 100644
--- a/source/blender/blenlib/BLI_rect.h
+++ b/source/blender/blenlib/BLI_rect.h
@@ -52,13 +52,18 @@ void BLI_init_rctf(struct rctf *rect, float xmin, float xmax, float ymin, float
void BLI_init_rcti(struct rcti *rect, int xmin, int xmax, int ymin, int ymax);
void BLI_translate_rctf(struct rctf *rect, float x, float y);
void BLI_translate_rcti(struct rcti *rect, int x, int y);
+void BLI_resize_rcti(struct rcti *rect, int x, int y);
+void BLI_resize_rctf(struct rctf *rect, float x, float y);
int BLI_in_rcti(struct rcti *rect, int x, int y);
int BLI_in_rctf(struct rctf *rect, float x, float y);
int BLI_isect_rctf(struct rctf *src1, struct rctf *src2, struct rctf *dest);
int BLI_isect_rcti(struct rcti *src1, struct rcti *src2, struct rcti *dest);
void BLI_union_rctf(struct rctf *rcta, struct rctf *rctb);
void BLI_union_rcti(struct rcti *rcti1, struct rcti *rcti2);
+void BLI_copy_rcti_rctf(struct rcti *tar, const struct rctf *src);
+void print_rctf(const char *str, struct rctf *rect);
+void print_rcti(const char *str, struct rcti *rect);
#ifdef __cplusplus
}
diff --git a/source/blender/blenlib/BLI_storage.h b/source/blender/blenlib/BLI_storage.h
index 61f175cb772..0d9db40fc97 100644
--- a/source/blender/blenlib/BLI_storage.h
+++ b/source/blender/blenlib/BLI_storage.h
@@ -76,5 +76,8 @@ struct LinkNode *BLI_read_file_as_lines(char *name);
*/
void BLI_free_file_lines(struct LinkNode *lines);
+ /* Compare if one was last modified before the other */
+int BLI_file_older(const char *file1, const char *file2);
+
#endif /* BLI_STORAGE_H */
diff --git a/source/blender/blenlib/BLI_storage_types.h b/source/blender/blenlib/BLI_storage_types.h
index f8ebc3938a1..bc3584db03e 100644
--- a/source/blender/blenlib/BLI_storage_types.h
+++ b/source/blender/blenlib/BLI_storage_types.h
@@ -58,6 +58,8 @@ struct direntry{
char *path;
#if (defined(WIN32) || defined(WIN64)) && (_MSC_VER>=1500)
struct _stat64 s;
+#elif defined(__MINGW32__)
+ struct _stati64 s;
#else
struct stat s;
#endif
diff --git a/source/blender/blenlib/BLI_threads.h b/source/blender/blenlib/BLI_threads.h
index eda0e830736..6a0a711404c 100644
--- a/source/blender/blenlib/BLI_threads.h
+++ b/source/blender/blenlib/BLI_threads.h
@@ -40,6 +40,9 @@ struct ListBase;
/* Threading API */
+/*this is run once at startup*/
+void BLI_threadapi_init(void);
+
void BLI_init_threads (struct ListBase *threadbase, void *(*do_thread)(void *), int tot);
int BLI_available_threads(struct ListBase *threadbase);
int BLI_available_thread_index(struct ListBase *threadbase);
@@ -48,6 +51,7 @@ void BLI_remove_thread (struct ListBase *threadbase, void *callerdata);
void BLI_remove_thread_index(struct ListBase *threadbase, int index);
void BLI_remove_threads(struct ListBase *threadbase);
void BLI_end_threads (struct ListBase *threadbase);
+int BLI_thread_is_main(void);
/* System Information */
@@ -61,6 +65,8 @@ int BLI_system_thread_count(void); /* gets the number of threads the system can
#define LOCK_PREVIEW 1
#define LOCK_VIEWER 2
#define LOCK_CUSTOM1 3
+#define LOCK_RCACHE 4
+#define LOCK_OPENGL 5
void BLI_lock_thread(int type);
void BLI_unlock_thread(int type);
@@ -68,6 +74,7 @@ void BLI_unlock_thread(int type);
/* Mutex Lock */
typedef pthread_mutex_t ThreadMutex;
+#define BLI_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
void BLI_mutex_init(ThreadMutex *mutex);
void BLI_mutex_lock(ThreadMutex *mutex);
diff --git a/source/blender/blenlib/BLI_uvproject.h b/source/blender/blenlib/BLI_uvproject.h
index a77ca60fc15..cf8bb7cd4b8 100644
--- a/source/blender/blenlib/BLI_uvproject.h
+++ b/source/blender/blenlib/BLI_uvproject.h
@@ -37,4 +37,7 @@ void project_from_view(float target[2], float source[3], float persmat[4][4], fl
/* apply ortho uv's */
void project_from_view_ortho(float target[2], float source[3], float rotmat[4][4]);
+/* so we can adjust scale with keeping the struct private */
+void project_camera_info_scale(struct UvCameraInfo *uci, float scale_x, float scale_y);
+
#endif
diff --git a/source/blender/blenlib/BLI_winstuff.h b/source/blender/blenlib/BLI_winstuff.h
index 957fdb2b017..e8689895735 100644
--- a/source/blender/blenlib/BLI_winstuff.h
+++ b/source/blender/blenlib/BLI_winstuff.h
@@ -74,10 +74,10 @@ extern "C" {
#define MAXPATHLEN MAX_PATH
#ifndef S_ISREG
-#define S_ISREG(x) ((x&S_IFMT) == S_IFREG)
+#define S_ISREG(x) (((x)&_S_IFREG) == _S_IFREG)
#endif
#ifndef S_ISDIR
-#define S_ISDIR(x) ((x&S_IFMT) == S_IFDIR)
+#define S_ISDIR(x) (((x)&_S_IFDIR) == _S_IFDIR)
#endif
/* defines for using ISO C++ conformant names */
diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt
index 628c2dc43a5..ab1dc3fe909 100644
--- a/source/blender/blenlib/CMakeLists.txt
+++ b/source/blender/blenlib/CMakeLists.txt
@@ -49,7 +49,3 @@ IF(WITH_OPENMP)
ENDIF(WITH_OPENMP)
BLENDERLIB(bf_blenlib "${SRC}" "${INC}")
-#if env['OURPLATFORM'] == 'linux2':
-# cflags='-pthread'
-#
-#env.BlenderLib ( 'bf_blenlib', sources, Split(incs), Split(defs), libtype=['core','player'], priority = [85,195], compileflags =cflags )
diff --git a/source/blender/blenlib/Makefile b/source/blender/blenlib/Makefile
index ae8a5afd0ba..d4dcfaeeabf 100644
--- a/source/blender/blenlib/Makefile
+++ b/source/blender/blenlib/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/blenlib/intern/BLI_args.c b/source/blender/blenlib/intern/BLI_args.c
index 1a677499d1f..8d72311f80b 100644
--- a/source/blender/blenlib/intern/BLI_args.c
+++ b/source/blender/blenlib/intern/BLI_args.c
@@ -33,10 +33,22 @@
#include "MEM_guardedalloc.h"
+#include "BLI_listbase.h"
#include "BLI_string.h"
#include "BLI_args.h"
#include "BLI_ghash.h"
+char NO_DOCS[] = "NO DOCUMENTATION SPECIFIED";
+
+struct bArgDoc;
+typedef struct bArgDoc {
+ struct bArgDoc *next, *prev;
+ char *short_arg;
+ char *long_arg;
+ char *documentation;
+ int done;
+} bArgDoc;
+
typedef struct bAKey {
char *arg;
uintptr_t pass; /* cast easier */
@@ -47,9 +59,11 @@ typedef struct bArgument {
bAKey *key;
BA_ArgCallback func;
void *data;
+ bArgDoc *doc;
} bArgument;
struct bArgs {
+ ListBase docs;
GHash *items;
int argc;
char **argv;
@@ -70,7 +84,7 @@ static unsigned int case_strhash(void *ptr) {
static unsigned int keyhash(void *ptr)
{
bAKey *k = ptr;
- return case_strhash(k->arg) ^ 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,30 +191,73 @@ 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)
+{
+ 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_argsAdd(struct bArgs *ba, int pass, char *short_arg, char *long_arg, char *doc, BA_ArgCallback cb, void *data)
{
- internalAdd(ba, arg, pass, 0, cb, data);
+ BLI_argsAddCase(ba, pass, short_arg, 0, long_arg, 0, doc, cb, data);
}
-void BLI_argsAddCase(struct bArgs *ba, char *arg, int pass, BA_ArgCallback cb, void *data)
+static void internalDocPrint(bArgDoc *d)
{
- internalAdd(ba, arg, pass, 1, cb, data);
+ 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)
{
int i = 0;
for( i = 1; i < ba->argc; i++) { /* skip argv[0] */
- /* stop on -- */
- if (BLI_streq(ba->argv[i], "--"))
- break;
-
if (ba->passes[i] == 0) {
/* -1 signal what side of the comparison it is */
bArgument *a = lookUp(ba, ba->argv[i], pass, -1);
@@ -207,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 b5dd764d6c6..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 <io.h>
#include "BLI_winstuff.h"
+ static char* find_in_pathlist(char* filename, char* pathlist);
#endif
#include <sys/types.h>
#include <sys/stat.h>
@@ -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;
}
@@ -171,12 +203,15 @@ ssize_t BLI_bfile_read(BFILE *f, void *buf, size_t count) {
size_t BLI_bfile_fwrite(const void *ptr, size_t size, size_t nmemb,
- BFILE *f)
+ BFILE *f)
{
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,197 +268,9 @@ 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_ghash.c b/source/blender/blenlib/intern/BLI_ghash.c
index 82241ad2cfb..6daa2928716 100644
--- a/source/blender/blenlib/intern/BLI_ghash.c
+++ b/source/blender/blenlib/intern/BLI_ghash.c
@@ -28,14 +28,10 @@
* A general (pointer -> pointer) hash table ADT
*/
+#include "MEM_guardedalloc.h"
#include "BLI_ghash.h"
#include "BLO_sys_types.h" // for intptr_t support
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
/***/
unsigned int hashsizes[]= {
@@ -49,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, 0);
diff --git a/source/blender/blenlib/intern/BLI_heap.c b/source/blender/blenlib/intern/BLI_heap.c
index 6c4e568c380..f6616ecb06b 100644
--- a/source/blender/blenlib/intern/BLI_heap.c
+++ b/source/blender/blenlib/intern/BLI_heap.c
@@ -69,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_linklist.c b/source/blender/blenlib/intern/BLI_linklist.c
index 62d6f6b936c..c903e66057e 100644
--- a/source/blender/blenlib/intern/BLI_linklist.c
+++ b/source/blender/blenlib/intern/BLI_linklist.c
@@ -32,10 +32,6 @@
#include "BLI_linklist.h"
#include "BLI_memarena.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
int BLI_linklist_length(LinkNode *list) {
if (0) {
return list?(1+BLI_linklist_length(list->next)):0;
@@ -49,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;
@@ -109,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 07e22b30fcc..de2a73e065f 100644
--- a/source/blender/blenlib/intern/BLI_memarena.c
+++ b/source/blender/blenlib/intern/BLI_memarena.c
@@ -34,13 +34,10 @@
#include "BLI_memarena.h"
#include "BLI_linklist.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
struct MemArena {
unsigned char *curbuf;
int bufsize, cursize;
+ const char *name;
int use_calloc;
int align;
@@ -48,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;
}
@@ -94,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/Makefile b/source/blender/blenlib/intern/Makefile
index 7ef44aff881..018fd3477df 100644
--- a/source/blender/blenlib/intern/Makefile
+++ b/source/blender/blenlib/intern/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/blenlib/intern/bpath.c b/source/blender/blenlib/intern/bpath.c
index 2367af470fe..d1a8de14181 100644
--- a/source/blender/blenlib/intern/bpath.c
+++ b/source/blender/blenlib/intern/bpath.c
@@ -43,6 +43,8 @@
#include "DNA_mesh_types.h"
#include "DNA_scene_types.h" /* to get the current frame */
+#include "DNA_image_types.h"
+#include "DNA_sound_types.h"
#include "DNA_sequence_types.h"
#include "DNA_vfont_types.h"
#include "DNA_windowmanager_types.h"
@@ -62,9 +64,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
@@ -132,6 +131,7 @@ void BLI_bpathIterator_getPathExpanded( struct BPathIterator *bpi, char *path_ex
} else { /* local data, use the blend files 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;
@@ -261,7 +261,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! */
@@ -280,7 +280,7 @@ 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) {
+ if (ELEM3(seq->type, SEQ_IMAGE, SEQ_MOVIE, SEQ_SOUND)) {
BLI_split_dirfile(path, seq->strip->dir, seq->strip->stripdata->name);
} else {
/* simple case */
@@ -334,7 +334,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);
@@ -355,7 +355,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);
@@ -376,7 +376,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);
@@ -423,7 +423,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);
@@ -622,7 +622,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);
@@ -660,7 +660,7 @@ 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 );
@@ -685,9 +685,8 @@ void findMissingFiles(char *basepath, char *str) {
/* can the dir be opened? */
filesize = -1;
recur_depth = 0;
- BLI_split_dirfile(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;
diff --git a/source/blender/imbuf/intern/IMB_dpxcineon.h b/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"
+
+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
-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);
+ return 0;
+}
-#endif /*_IMB_DPX_CINEON_H*/
diff --git a/source/blender/blenlib/intern/dynlib.c b/source/blender/blenlib/intern/dynlib.c
index cc681a4c7c7..f42b342e326 100644
--- a/source/blender/blenlib/intern/dynlib.c
+++ b/source/blender/blenlib/intern/dynlib.c
@@ -31,10 +31,6 @@
#include "../PIL_dynlib.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#if !defined(CHAR_MAX)
#define CHAR_MAX 255
#endif
diff --git a/source/blender/blenlib/intern/fileops.c b/source/blender/blenlib/intern/fileops.c
index 73434c548a0..fde770c238c 100644
--- a/source/blender/blenlib/intern/fileops.c
+++ b/source/blender/blenlib/intern/fileops.c
@@ -80,32 +80,7 @@ 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 */
+/* adds a slash if there isnt one there already */
int BLI_add_slash(char *string) {
int len = strlen(string);
#ifdef WIN32
@@ -230,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];
@@ -307,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];
@@ -351,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!
* */
@@ -399,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 a78f9ad7585..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 <config.h>
-#endif
-
/* Enable GNU extensions in fnmatch.h. */
#ifndef _GNU_SOURCE
# define _GNU_SOURCE 1
diff --git a/source/blender/blenlib/intern/graph.c b/source/blender/blenlib/intern/graph.c
index 808dc743d44..b1ea058eda1 100644
--- a/source/blender/blenlib/intern/graph.c
+++ b/source/blender/blenlib/intern/graph.c
@@ -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 <config.h>
-#endif
-
typedef struct _GSQueueElem GSQueueElem;
struct _GSQueueElem {
GSQueueElem *next;
diff --git a/source/blender/blenlib/intern/listbase.c b/source/blender/blenlib/intern/listbase.c
index 0a6831558d1..776f2d085df 100644
--- a/source/blender/blenlib/intern/listbase.c
+++ b/source/blender/blenlib/intern/listbase.c
@@ -374,6 +374,27 @@ void *BLI_findstring(ListBase *listbase, const char *id, int offset)
return NULL;
}
+void *BLI_findstring_ptr(ListBase *listbase, const char *id, int offset)
+{
+ Link *link= NULL;
+ const char *id_iter;
+
+ if (listbase == NULL) return NULL;
+
+ link= listbase->first;
+ while (link) {
+ /* exact copy of BLI_findstring(), except for this line */
+ id_iter= *((const char **)(((const char *)link) + offset));
+
+ if(id[0] == id_iter[0] && strcmp(id, id_iter)==0)
+ return link;
+
+ link= link->next;
+ }
+
+ return NULL;
+}
+
int BLI_findstringindex(ListBase *listbase, const char *id, int offset)
{
Link *link= NULL;
diff --git a/source/blender/blenlib/intern/math_color.c b/source/blender/blenlib/intern/math_color.c
index 6aa85d14084..693fd885b50 100644
--- a/source/blender/blenlib/intern/math_color.c
+++ b/source/blender/blenlib/intern/math_color.c
@@ -33,17 +33,14 @@ void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b)
int i;
float f, p, q, t;
- h *= 360.0f;
-
if(s==0.0f) {
*r = v;
*g = v;
*b = v;
}
else {
- if(h== 360.0f) h = 0.0f;
-
- h /= 60.0f;
+ h= (h - floor(h))*6.0f;
+
i = (int)floor(h);
f = h - i;
p = v*(1.0f-s);
@@ -110,7 +107,7 @@ void yuv_to_rgb(float y, float u, float v, float *lr, float *lg, float *lb)
}
/* 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 exepect with JFIF_0_255 where the range is 0-255 */
+/* 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;
@@ -132,7 +129,7 @@ void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr, in
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)+16.0f;
+ 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;
@@ -375,6 +372,40 @@ void linearrgb_to_srgb_v3_v3(float *col_to, float *col_from)
col_to[2] = linearrgb_to_srgb(col_from[2]);
}
+/* todo, should these be moved elsewhere?, they dont belong in imbuf */
+void srgb_to_linearrgb_rgba_buf(float *col, int tot)
+{
+ while(tot--) {
+ srgb_to_linearrgb_v3_v3(col, col);
+ col += 4;
+ }
+}
+
+void linearrgb_to_srgb_rgba_buf(float *col, int tot)
+{
+ while(tot--) {
+ linearrgb_to_srgb_v3_v3(col, col);
+ col += 4;
+ }
+}
+
+void srgb_to_linearrgb_rgba_rgba_buf(float *col_to, float *col_from, int tot)
+{
+ while(tot--) {
+ srgb_to_linearrgb_v3_v3(col_to, col_from);
+ col_to += 4;
+ col_from += 4;
+ }
+}
+
+void linearrgb_to_srgb_rgba_rgba_buf(float *col_to, float *col_from, int tot)
+{
+ while(tot--) {
+ linearrgb_to_srgb_v3_v3(col_to, col_from);
+ col_to += 4;
+ col_from += 4;
+ }
+}
void minmax_rgb(short c[])
{
diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c
index 27f36752f80..68b1feea632 100644
--- a/source/blender/blenlib/intern/math_geom.c
+++ b/source/blender/blenlib/intern/math_geom.c
@@ -26,9 +26,12 @@
* */
+#include "MEM_guardedalloc.h"
+
#include "BLI_math.h"
#include "BLI_memarena.h"
-#include "MEM_guardedalloc.h"
+
+#include "BKE_utildefines.h"
/********************************** Polygons *********************************/
@@ -59,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);
}
@@ -121,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;
@@ -317,7 +317,7 @@ static short IsectLLPt2Df(float x0,float y0,float x1,float y1,
return -1; /*m2 = (float) 1e+10;*/ // close enough to infinity
if (fabs(m1-m2) < 0.000001)
- return -1; /* paralelle lines */
+ return -1; /* parallel lines */
// compute constants
@@ -402,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;
@@ -441,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;
}
@@ -461,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)
@@ -720,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;
}
}
@@ -744,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;
}
}
@@ -773,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;
}
}
@@ -839,10 +841,8 @@ int isect_line_line_v3(float v1[3], float v2[3], float v3[3], float v4[3], float
sub_v3_v3v3(a, v2, v1);
sub_v3_v3v3(b, v4, v3);
- copy_v3_v3(dir1, a);
- normalize_v3(dir1);
- copy_v3_v3(dir2, b);
- normalize_v3(dir2);
+ normalize_v3_v3(dir1, a);
+ normalize_v3_v3(dir2, b);
d = dot_v3v3(dir1, dir2);
if (d == 1.0f || d == -1.0f) {
/* colinear */
@@ -906,10 +906,8 @@ int isect_line_line_strict_v3(float v1[3], float v2[3], float v3[3], float v4[3]
sub_v3_v3v3(a, v2, v1);
sub_v3_v3v3(b, v4, v3);
- copy_v3_v3(dir1, a);
- normalize_v3(dir1);
- copy_v3_v3(dir2, b);
- normalize_v3(dir2);
+ normalize_v3_v3(dir1, a);
+ normalize_v3_v3(dir2, b);
d = dot_v3v3(dir1, dir2);
if (d == 1.0f || d == -1.0f || d == 0) {
/* colinear or one vector is zero-length*/
@@ -991,14 +989,14 @@ void isect_point_quad_uv_v2(float v0[2], float v1[2], float v2[2], float v3[2],
{
float x0,y0, x1,y1, wtot, v2d[2], w1, w2;
- /* used for paralelle lines */
+ /* used for parallel lines */
float pt3d[3], l1[3], l2[3], pt_on_line[3];
/* compute 2 edges of the quad intersection point */
if (IsectLLPt2Df(v0[0],v0[1],v1[0],v1[1], v2[0],v2[1],v3[0],v3[1], &x0,&y0) == 1) {
/* the intersection point between the quad-edge intersection and the point in the quad we want the uv's for */
/* should never be paralle !! */
- /*printf("\tnot paralelle 1\n");*/
+ /*printf("\tnot parallel 1\n");*/
IsectLLPt2Df(pt[0],pt[1],x0,y0, v0[0],v0[1],v3[0],v3[1], &x1,&y1);
/* Get the weights from the new intersection point, to each edge */
@@ -1014,8 +1012,8 @@ void isect_point_quad_uv_v2(float v0[2], float v1[2], float v2[2], float v3[2],
/*w2 = w2/wtot;*/
uv[0] = w1/wtot;
} else {
- /* lines are paralelle, lambda_cp_line_ex is 3d grrr */
- /*printf("\tparalelle1\n");*/
+ /* lines are parallel, lambda_cp_line_ex is 3d grrr */
+ /*printf("\tparallel1\n");*/
pt3d[0] = pt[0];
pt3d[1] = pt[1];
pt3d[2] = l1[2] = l2[2] = 0.0f;
@@ -1041,7 +1039,7 @@ void isect_point_quad_uv_v2(float v0[2], float v1[2], float v2[2], float v3[2],
if (IsectLLPt2Df(v0[0],v0[1],v3[0],v3[1], v1[0],v1[1],v2[0],v2[1], &x0,&y0) == 1) { /* was v0,v1 v2,v3 now v0,v3 v1,v2*/
/* never paralle if above was not */
- /*printf("\tnot paralelle2\n");*/
+ /*printf("\tnot parallel2\n");*/
IsectLLPt2Df(pt[0],pt[1],x0,y0, v0[0],v0[1],v1[0],v1[1], &x1,&y1);/* was v0,v3 now v0,v1*/
v2d[0] = x1-v0[0];
@@ -1054,8 +1052,8 @@ void isect_point_quad_uv_v2(float v0[2], float v1[2], float v2[2], float v3[2],
wtot = w1+w2;
uv[1] = w1/wtot;
} else {
- /* lines are paralelle, lambda_cp_line_ex is 3d grrr */
- /*printf("\tparalelle2\n");*/
+ /* lines are parallel, lambda_cp_line_ex is 3d grrr */
+ /*printf("\tparallel2\n");*/
pt3d[0] = pt[0];
pt3d[1] = pt[1];
pt3d[2] = l1[2] = l2[2] = 0.0f;
@@ -1223,7 +1221,7 @@ static int point_in_slice_as(float p[3],float origin[3],float normal[3])
return 1;
}
-/*mama (knowing the squared lenght of the normal)*/
+/*mama (knowing the squared length of the normal)*/
static int point_in_slice_m(float p[3],float origin[3],float normal[3],float lns)
{
float h,rp[3];
@@ -1670,9 +1668,9 @@ void polarview_m4(float Vm[][4],float dist, float azimuth, float incidence, floa
unit_m4(Vm);
translate_m4(Vm,0.0, 0.0, -dist);
- rotate_m4(Vm,'z',-twist);
- rotate_m4(Vm,'x',-incidence);
- rotate_m4(Vm,'z',-azimuth);
+ rotate_m4(Vm,'Z',-twist);
+ rotate_m4(Vm,'X',-incidence);
+ rotate_m4(Vm,'Z',-azimuth);
}
void lookat_m4(float mat[][4],float vx, float vy, float vz, float px, float py, float pz, float twist)
@@ -1683,7 +1681,7 @@ void lookat_m4(float mat[][4],float vx, float vy, float vz, float px, float py,
unit_m4(mat);
unit_m4(mat1);
- rotate_m4(mat,'z',-twist);
+ rotate_m4(mat, 'Z', -twist);
dx = px - vx;
dy = py - vy;
@@ -1763,6 +1761,27 @@ int box_clip_bounds_m4(float boundbox[2][3], float bounds[4], float winmat[4][4]
return flag;
}
+void box_minmax_bounds_m4(float min[3], float max[3], float boundbox[2][3], float mat[4][4])
+{
+ float mn[3], mx[3], vec[3];
+ int a;
+
+ copy_v3_v3(mn, min);
+ copy_v3_v3(mx, max);
+
+ for(a=0; a<8; a++) {
+ vec[0]= (a & 1)? boundbox[0][0]: boundbox[1][0];
+ vec[1]= (a & 2)? boundbox[0][1]: boundbox[1][1];
+ vec[2]= (a & 4)? boundbox[0][2]: boundbox[1][2];
+
+ mul_m4_v3(mat, vec);
+ DO_MINMAX(vec, mn, mx);
+ }
+
+ copy_v3_v3(min, mn);
+ copy_v3_v3(max, mx);
+}
+
/********************************** Mapping **********************************/
void map_to_tube(float *u, float *v,float x, float y, float z)
@@ -1794,9 +1813,7 @@ void map_to_sphere(float *u, float *v,float x, float y, float z)
}
}
-/********************************************************/
-
-/* Tangents */
+/********************************* Tangents **********************************/
/* For normal map tangents we need to detect uv boundaries, and only average
* tangents in case the uvs are connected. Alternative would be to store 1
@@ -1814,7 +1831,7 @@ void sum_or_add_vertex_tangent(void *arena, VertexTangent **vtang, float *tang,
/* find a tangent with connected uvs */
for(vt= *vtang; vt; vt=vt->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;
}
}
@@ -1875,7 +1892,7 @@ 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,
@@ -1934,19 +1951,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){
@@ -2034,3 +2051,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 <Accelerate/Accelerate.h>
+
+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 <xmmintrin.h>
+
+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..f2d8e27cbd5
--- /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., 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: 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 fca8cf445d1..64c3e746982 100644
--- a/source/blender/blenlib/intern/math_matrix.c
+++ b/source/blender/blenlib/intern/math_matrix.c
@@ -125,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];
@@ -151,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];
+
+ /* 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[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[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_m4m3(float (*m1)[4], float (*m3)[4], float (*m2)[3])
@@ -298,6 +309,7 @@ void mul_v3_m4v3(float *in, float mat[][4], float *vec)
in[2]= x*mat[0][2] + y*mat[1][2] + mat[2][2]*vec[2] + mat[3][2];
}
+/* same as mul_m4_v3() but doesnt apply translation component */
void mul_mat3_m4_v3(float mat[][4], float *vec)
{
float x,y;
@@ -321,17 +333,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])
@@ -577,9 +595,7 @@ void transpose_m4(float mat[][4])
void orthogonalize_m3(float mat[][3], int axis)
{
float size[3];
- size[0] = len_v3(mat[0]);
- size[1] = len_v3(mat[1]);
- size[2] = len_v3(mat[2]);
+ mat3_to_size(size, mat);
normalize_v3(mat[axis]);
switch(axis)
{
@@ -640,9 +656,7 @@ void orthogonalize_m3(float mat[][3], int axis)
void orthogonalize_m4(float mat[][4], int axis)
{
float size[3];
- size[0] = len_v3(mat[0]);
- size[1] = len_v3(mat[1]);
- size[2] = len_v3(mat[2]);
+ mat4_to_size(size, mat);
normalize_v3(mat[axis]);
switch(axis)
{
@@ -1132,3 +1146,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<p
+ // kase = 2 if s(k) is negligible and k<p
+ // kase = 3 if e[k-1] is negligible, k<p, and
+ // s(k), ..., s(p) are not negligible (qr step).
+ // kase = 4 if e(p-1) is negligible (convergence).
+
+ for (k = p-2; 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 4af0a3a4248..f72269f6d7b 100644
--- a/source/blender/blenlib/intern/math_rotation.c
+++ b/source/blender/blenlib/intern/math_rotation.c
@@ -36,7 +36,7 @@ void unit_qt(float *q)
q[1]= q[2]= q[3]= 0.0f;
}
-void copy_qt_qt(float *q1, float *q2)
+void copy_qt_qt(float *q1, const float *q2)
{
q1[0]= q2[0];
q1[1]= q2[1];
@@ -49,7 +49,7 @@ int is_zero_qt(float *q)
return (q[0] == 0 && q[1] == 0 && q[2] == 0 && q[3] == 0);
}
-void mul_qt_qtqt(float *q, float *q1, float *q2)
+void mul_qt_qtqt(float *q, const float *q1, const float *q2)
{
float t0,t1,t2;
@@ -63,7 +63,7 @@ void mul_qt_qtqt(float *q, float *q1, float *q2)
}
/* Assumes a unit quaternion */
-void mul_qt_v3(float *q, float *v)
+void mul_qt_v3(const float *q, float *v)
{
float t0, t1, t2;
@@ -104,8 +104,14 @@ void invert_qt(float *q)
mul_qt_fl(q, 1.0f/f);
}
+void invert_qt_qt(float *q1, const float *q2)
+{
+ copy_qt_qt(q1, q2);
+ invert_qt(q1);
+}
+
/* simple mult */
-void mul_qt_fl(float *q, float f)
+void mul_qt_fl(float *q, const float f)
{
q[0] *= f;
q[1] *= f;
@@ -121,7 +127,7 @@ void sub_qt_qtqt(float *q, float *q1, float *q2)
}
/* angular mult factor */
-void mul_fac_qt_fl(float *q, float fac)
+void mul_fac_qt_fl(float *q, const float fac)
{
float angle= fac*saacos(q[0]); /* quat[0]= cos(0.5*angle), but now the 0.5 and 2.0 rule out */
@@ -129,10 +135,7 @@ void mul_fac_qt_fl(float *q, float fac)
float si= (float)sin(angle);
q[0]= co;
normalize_v3(q+1);
- q[1]*= si;
- q[2]*= si;
- q[3]*= si;
-
+ mul_v3_fl(q+1, si);
}
void quat_to_mat3(float m[][3], float *q)
@@ -336,6 +339,23 @@ void rotation_between_vecs_to_quat(float *q, const float v1[3], const float v2[3
axis_angle_to_quat(q, axis, angle);
}
+void rotation_between_quats_to_quat(float *q, const float q1[4], const float q2[4])
+{
+ float tquat[4];
+ double dot = 0.0f;
+ int x;
+
+ copy_qt_qt(tquat, q1);
+ conjugate_qt(tquat);
+ dot = 1.0f / dot_qtqt(tquat, tquat);
+
+ for(x = 0; x < 4; x++)
+ tquat[x] *= dot;
+
+ mul_qt_qtqt(q, tquat, q2);
+}
+
+
void vec_to_quat(float *q,float *vec, short axis, short upflag)
{
float q2[4], nor[3], *fp, mat[3][3], angle, si, co, x2, y2, z2, len1;
@@ -572,9 +592,8 @@ void axis_angle_to_quat(float q[4], float axis[3], float angle)
{
float nor[3];
float si;
-
- copy_v3_v3(nor, axis);
- normalize_v3(nor);
+
+ normalize_v3_v3(nor, axis);
angle /= 2;
si = (float)sin(angle);
@@ -631,8 +650,7 @@ void axis_angle_to_mat3(float mat[3][3],float axis[3], float angle)
float nor[3], nsi[3], co, si, ico;
/* normalise the axis first (to remove unwanted scaling) */
- copy_v3_v3(nor, axis);
- normalize_v3(nor);
+ normalize_v3_v3(nor, axis);
/* now convert this to a 3x3 matrix */
co= (float)cos(angle);
@@ -919,8 +937,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);
@@ -1238,9 +1256,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;
@@ -1503,3 +1521,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 8032cd64de5..6d908ddb1cd 100644
--- a/source/blender/blenlib/intern/math_vector.c
+++ b/source/blender/blenlib/intern/math_vector.c
@@ -83,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]);
@@ -112,10 +120,8 @@ float angle_v3v3(float *v1, float *v2)
{
float vec1[3], vec2[3];
- copy_v3_v3(vec1, v1);
- copy_v3_v3(vec2, v2);
- normalize_v3(vec1);
- normalize_v3(vec2);
+ normalize_v3_v3(vec1, v1);
+ normalize_v3_v3(vec2, v2);
return angle_normalized_v3v3(vec1, vec2);
}
@@ -292,17 +298,17 @@ void ortho_basis_v3v3_v3(float *v1, float *v2, float *v)
/*********************************** Other ***********************************/
-void print_v2(char *str, float v[2])
+void print_v2(const char *str, const float v[2])
{
printf("%s: %.3f %.3f\n", str, v[0], v[1]);
}
-void print_v3(char *str, float v[3])
+void print_v3(const char *str, const float v[3])
{
printf("%s: %.3f %.3f %.3f\n", str, v[0], v[1], v[2]);
}
-void print_v4(char *str, float v[4])
+void print_v4(const char *str, const float v[4])
{
printf("%s: %.3f %.3f %.3f %.3f\n", str, v[0], v[1], v[2], v[3]);
}
diff --git a/source/blender/blenlib/intern/math_vector_inline.c b/source/blender/blenlib/intern/math_vector_inline.c
index f82daaa8af6..84d96d1d22a 100644
--- a/source/blender/blenlib/intern/math_vector_inline.c
+++ b/source/blender/blenlib/intern/math_vector_inline.c
@@ -188,6 +188,20 @@ MINLINE void mul_v3_v3(float r[3], const float a[3])
r[2] *= a[2];
}
+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;
@@ -222,6 +236,14 @@ MINLINE void madd_v3_v3v3v3(float r[3], const float a[3], const float b[3], cons
r[2] = a[2] + b[2]*c[2];
}
+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];
@@ -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);
@@ -379,6 +409,11 @@ MINLINE int equals_v3v3(float *v1, float *v2)
return ((v1[0]==v2[0]) && (v1[1]==v2[1]) && (v1[2]==v2[2]));
}
+MINLINE int equals_v4v4(float *v1, float *v2)
+{
+ return ((v1[0]==v2[0]) && (v1[1]==v2[1]) && (v1[2]==v2[2]) && (v1[3]==v2[3]));
+}
+
MINLINE int compare_v3v3(float *v1, float *v2, float limit)
{
if(fabs(v1[0]-v2[0])<limit)
diff --git a/source/blender/blenlib/intern/noise.c b/source/blender/blenlib/intern/noise.c
index 44429eca3b1..141e5438bc9 100644
--- a/source/blender/blenlib/intern/noise.c
+++ b/source/blender/blenlib/intern/noise.c
@@ -36,10 +36,6 @@
#include <math.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
/* local */
static float noise3_perlin(float vec[3]);
//static float turbulence_perlin(float *point, float lofreq, float hifreq);
@@ -203,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)
{
diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c
index 1fe847636bd..cf773d575e5 100644
--- a/source/blender/blenlib/intern/path_util.c
+++ b/source/blender/blenlib/intern/path_util.c
@@ -44,13 +44,9 @@
#include "BLI_storage_types.h"
#include "BKE_utildefines.h"
+#include "BKE_blender.h" // BLENDER_VERSION
-
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
+#include "GHOST_Path-api.h"
#ifdef WIN32
@@ -67,11 +63,6 @@
#else /* non windows */
-#ifdef __APPLE__
-#include <sys/param.h>
-#include <CoreFoundation/CoreFoundation.h>
-#endif
-
#ifdef __linux__
#include "binreloc.h"
#endif
@@ -81,10 +72,11 @@
/* 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;
@@ -111,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;
@@ -120,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);
}
@@ -358,8 +350,6 @@ void BLI_cleanup_file(const char *relabase, char *dir)
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];
@@ -374,7 +364,7 @@ void BLI_path_rel(char *file, const char *relfile)
if (strlen(relfile) > 2 && relfile[1] != ':') {
char* ptemp;
/* fix missing volume name in relative base,
- can happen with old .Blog files */
+ can happen with old recent-files.txt files */
get_default_root(temp);
ptemp = &temp[2];
if (relfile[0] != '\\' && relfile[0] != '/') {
@@ -407,11 +397,18 @@ void BLI_path_rel(char *file, const char *relfile)
{
/* 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
*/
@@ -589,7 +586,7 @@ int BLI_path_abs(char *path, const char *basepath)
BLI_strncpy(tmp, path, FILE_MAX);
}
#else
- BLI_strncpy(tmp, path, FILE_MAX);
+ BLI_strncpy(tmp, path, sizeof(tmp));
/* Check for loading a windows path on a posix system
* in this case, there is no use in trying C:/ since it
@@ -606,7 +603,7 @@ int BLI_path_abs(char *path, const char *basepath)
#endif
- BLI_strncpy(base, basepath, FILE_MAX);
+ BLI_strncpy(base, basepath, sizeof(base));
BLI_cleanup_file(NULL, base);
@@ -625,21 +622,23 @@ int BLI_path_abs(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);
- strcpy(tmp+baselen, path);
- strcpy(path, tmp);
+ BLI_strncpy(tmp+baselen, path, sizeof(tmp)-baselen);
+ BLI_strncpy(path, tmp, FILE_MAX);
} else {
- strcpy(path, tmp+2);
+ BLI_strncpy(path, tmp+2, FILE_MAX);
}
} else {
- strcpy(path, tmp);
+ BLI_strncpy(path, tmp, FILE_MAX);
}
if (path[0]!='\0') {
if ( path[strlen(path)-1]=='/') {
+ /* remove the '/' so we avoid BLI_cleanup_dir adding an extra \ in WIN32 */
+ path[strlen(path)-1] = '\0';
BLI_cleanup_dir(NULL, path);
} else {
BLI_cleanup_file(NULL, path);
@@ -702,7 +701,7 @@ int BLI_path_cwd(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);
@@ -735,180 +734,333 @@ void BLI_getlastdir(const char* dir, char *last, int maxlen)
}
}
-char *BLI_gethome(void) {
+/* This is now only used to really get the user's default document folder */
+/* On Windows I chose the 'Users/<MyUserName>/Documents' since it's used
+ as default location to save documents */
+char *BLI_getDefaultDocumentFolder(void) {
#if !defined(WIN32)
return getenv("HOME");
#else /* Windows */
char * ret;
- static char dir[512];
- static char appdatapath[MAXPATHLEN];
+ static char documentfolder[MAXPATHLEN];
HRESULT hResult;
/* Check for %HOME% env var */
ret = getenv("HOME");
if(ret) {
- sprintf(dir, "%s\\.blender", ret);
- if (BLI_exists(dir)) return dir;
- }
-
- /* else, check install dir (path containing blender.exe) */
-
- BLI_getInstallationDir(dir);
-
- if (BLI_exists(dir))
- {
- strcat(dir,"\\.blender");
- if (BLI_exists(dir)) return(dir);
+ if (BLI_is_dir(ret)) return ret;
}
-
- /* add user profile support for WIN 2K / NT */
- hResult = SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, appdatapath);
+ /* 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_PERSONAL, NULL, SHGFP_TYPE_CURRENT, documentfolder);
if (hResult == S_OK)
{
- if (BLI_exists(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);
- }
- }
- hResult = SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, SHGFP_TYPE_CURRENT, appdatapath);
- if (hResult == S_OK)
- {
- if (BLI_exists(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(documentfolder)) return documentfolder;
}
- return "C:\\Temp"; /* sheesh! bad, bad, bad! (aphex) */
+ return NULL;
#endif
}
-/* this function returns the path to a blender folder, if it exists
- * utility functions for BLI_gethome_folder */
+/* NEW stuff, to be cleaned up when fully migrated */
+/* ************************************************************* */
+/* ************************************************************* */
+
+// #define PATH_DEBUG2
-/* #define PATH_DEBUG */ /* for testing paths that are checked */
+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_data_path(char *targetpath, char *path_base, char *path_sep, char *folder_name)
+static int test_path(char *targetpath, char *path_base, char *path_sep, char *folder_name)
{
- char tmppath[FILE_MAXDIR];
+ 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_exists(targetpath)) {
-#ifdef PATH_DEBUG
+ if (BLI_is_dir(targetpath)) {
+#ifdef PATH_DEBUG2
printf("\tpath found: %s\n", targetpath);
#endif
return 1;
}
else {
-#ifdef PATH_DEBUG
+#ifdef PATH_DEBUG2
printf("\tpath missing: %s\n", targetpath);
#endif
- targetpath[0] = '\0';
+ //targetpath[0] = '\0';
return 0;
}
}
-static int gethome_path_local(char *targetpath, char *folder_name)
+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, char *subfolder_name)
{
extern char bprogname[]; /* argv[0] from creator.c */
- char bprogdir[FILE_MAXDIR];
- char cwd[FILE_MAXDIR];
+ char bprogdir[FILE_MAX];
+ char relfolder[FILE_MAX];
+ char cwd[FILE_MAX];
char *s;
int i;
-#ifdef PATH_DEBUG
- printf("gethome_path_local...\n");
+#ifdef PATH_DEBUG2
+ printf("get_path_local...\n");
#endif
- /* try release/folder_name (binary relative) */
+ if (subfolder_name) {
+ BLI_join_dirfile(relfolder, folder_name, subfolder_name);
+ } else {
+ BLI_strncpy(relfolder, folder_name, FILE_MAX);
+ }
+
/* 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 release/folder_name (CWD relative) */
- if(test_data_path(targetpath, BLI_getwdN(cwd), "release", folder_name))
+
+ /* try EXECUTABLE_DIR/folder_name */
+ if(test_path(targetpath, bprogdir, "", relfolder))
return 1;
-
- if(test_data_path(targetpath, bprogdir, "release", folder_name))
+
+ /* try CWD/release/folder_name */
+ if(test_path(targetpath, BLI_getwdN(cwd), "release", relfolder))
return 1;
-
- /* try ./.blender/folder_name */
- if(test_data_path(targetpath, bprogdir, ".blender", folder_name))
+
+ /* try EXECUTABLE_DIR/release/folder_name */
+ if(test_path(targetpath, bprogdir, "release", relfolder))
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(), relfolder))
+ return 1;
+
+ /* try ./.blender/folder_name -- DEPRECATED, need to update build systems */
+ if(test_path(targetpath, bprogdir, ".blender", relfolder))
+ return 1;
+
return 0;
}
-static int gethome_path_user(char *targetpath, char *folder_name)
+static int get_path_user(char *targetpath, char *folder_name, char *subfolder_name, char *envvar)
{
- char *home_path= BLI_gethome();
+ char user_path[FILE_MAX];
+ const char *user_base_path;
+
+ user_path[0] = '\0';
-#ifdef PATH_DEBUG
- printf("gethome_path_user...\n");
+ if (test_env_path(user_path, envvar)) {
+ if (subfolder_name) {
+ return test_path(targetpath, user_path, NULL, subfolder_name);
+ } else {
+ BLI_strncpy(targetpath, user_path, FILE_MAX);
+ 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_data_path(targetpath, home_path, ".blender", folder_name);
+ if (subfolder_name) {
+ /* try $HOME/folder_name/subfolder_name */
+ return test_path(targetpath, user_path, folder_name, subfolder_name);
+ } else {
+ /* try $HOME/folder_name */
+ return test_path(targetpath, user_path, NULL, folder_name);
+ }
}
-static int gethome_path_system(char *targetpath, char *folder_name)
+static int get_path_system(char *targetpath, char *folder_name, char *subfolder_name, char *envvar)
{
- extern char blender_path[]; /* unix prefix eg. /usr/share/blender/2.5 creator.c */
+ char system_path[FILE_MAX];
+ const char *system_base_path;
+
+ system_path[0] = '\0';
+
+ if (test_env_path(system_path, envvar)) {
+ if (subfolder_name) {
+ return test_path(targetpath, system_path, NULL, subfolder_name);
+ } else {
+ BLI_strncpy(targetpath, system_path, FILE_MAX);
+ 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(!blender_path[0])
+ if(!system_path[0])
return 0;
-#ifdef PATH_DEBUG
- printf("gethome_path_system...\n");
+#ifdef PATH_DEBUG2
+ printf("get_path_system: %s\n", system_path);
#endif
- /* try $BLENDERPATH/folder_name */
- return test_data_path(targetpath, blender_path, NULL, folder_name);
+ if (subfolder_name) {
+ /* try $BLENDERPATH/folder_name/subfolder_name */
+ return test_path(targetpath, system_path, folder_name, subfolder_name);
+ } else {
+ /* try $BLENDERPATH/folder_name */
+ return test_path(targetpath, system_path, NULL, folder_name);
+ }
}
-char *BLI_gethome_folder(char *folder_name, int flag)
+/* 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 fulldir[FILE_MAXDIR] = "";
+ static char path[FILE_MAX] = "";
- /* first check if this is a redistributable bundle */
- if(flag & BLI_GETHOME_LOCAL) {
- if (gethome_path_local(fulldir, folder_name))
- return fulldir;
+ switch (folder_id) {
+ case BLENDER_DATAFILES: /* general case */
+ if (get_path_local(path, "datafiles", subfolder)) break;
+ if (get_path_user(path, "datafiles", subfolder, "BLENDER_USER_DATAFILES")) break;
+ if (get_path_system(path, "datafiles", subfolder, "BLENDER_SYSTEM_DATAFILES")) break;
+ return NULL;
+
+ case BLENDER_USER_DATAFILES:
+ if (get_path_local(path, "datafiles", subfolder)) break;
+ if (get_path_user(path, "datafiles", subfolder, "BLENDER_USER_DATAFILES")) break;
+ return NULL;
+
+ case BLENDER_SYSTEM_DATAFILES:
+ if (get_path_local(path, "datafiles", subfolder)) break;
+ if (get_path_system(path, "datafiles", subfolder, "BLENDER_SYSTEM_DATAFILES")) break;
+ return NULL;
+
+ case BLENDER_USER_AUTOSAVE:
+ if (get_path_local(path, "autosave", subfolder)) break;
+ if (get_path_user(path, "autosave", subfolder, "BLENDER_USER_DATAFILES")) break;
+ return NULL;
+
+ case BLENDER_CONFIG: /* general case */
+ if (get_path_local(path, "config", subfolder)) break;
+ if (get_path_user(path, "config", subfolder, "BLENDER_USER_CONFIG")) break;
+ if (get_path_system(path, "config", subfolder, "BLENDER_SYSTEM_CONFIG")) break;
+ return NULL;
+
+ case BLENDER_USER_CONFIG:
+ if (get_path_local(path, "config", subfolder)) break;
+ if (get_path_user(path, "config", subfolder, "BLENDER_USER_CONFIG")) break;
+ return NULL;
+
+ case BLENDER_SYSTEM_CONFIG:
+ if (get_path_local(path, "config", subfolder)) break;
+ if (get_path_system(path, "config", subfolder, "BLENDER_SYSTEM_CONFIG")) break;
+ return NULL;
+
+ case BLENDER_SCRIPTS: /* general case */
+ if (get_path_local(path, "scripts", subfolder)) break;
+ if (get_path_user(path, "scripts", subfolder, "BLENDER_USER_SCRIPTS")) break;
+ if (get_path_system(path, "scripts", subfolder, "BLENDER_SYSTEM_SCRIPTS")) break;
+ return NULL;
+
+ case BLENDER_USER_SCRIPTS:
+ if (get_path_local(path, "scripts", subfolder)) break;
+ if (get_path_user(path, "scripts", subfolder, "BLENDER_USER_SCRIPTS")) break;
+ return NULL;
+
+ case BLENDER_SYSTEM_SCRIPTS:
+ if (get_path_local(path, "scripts", subfolder)) break;
+ if (get_path_system(path, "scripts", subfolder, "BLENDER_SYSTEM_SCRIPTS")) break;
+ return NULL;
+
+ case BLENDER_PYTHON: /* general case */
+ if (get_path_local(path, "python", subfolder)) break;
+ if (get_path_system(path, "python", subfolder, "BLENDER_SYSTEM_PYTHON")) break;
+ return NULL;
+
+ case BLENDER_SYSTEM_PYTHON:
+ if (get_path_local(path, "python", subfolder)) break;
+ if (get_path_system(path, "python", subfolder, "BLENDER_SYSTEM_PYTHON")) break;
+ return NULL;
}
+
+ return path;
+}
- /* then check if the OS has blender data files installed in a global location */
- if(flag & BLI_GETHOME_SYSTEM) {
- if (gethome_path_system(fulldir, folder_name))
- return fulldir;
+static char *BLI_get_user_folder_notest(int folder_id, char *subfolder)
+{
+ static char path[FILE_MAX] = "";
+
+ switch (folder_id) {
+ case BLENDER_USER_DATAFILES:
+ get_path_user(path, "datafiles", subfolder, "BLENDER_USER_DATAFILES");
+ break;
+ case BLENDER_USER_CONFIG:
+ get_path_user(path, "config", subfolder, "BLENDER_USER_CONFIG");
+ break;
+ case BLENDER_USER_AUTOSAVE:
+ get_path_user(path, "autosave", subfolder, "BLENDER_USER_AUTOSAVE");
+ 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 (!ELEM3(folder_id, BLENDER_USER_DATAFILES, BLENDER_USER_CONFIG, BLENDER_USER_AUTOSAVE))
+ return NULL;
+
+ path = BLI_get_folder(folder_id, subfolder);
- /* now check the users home dir for data files */
- if(flag & BLI_GETHOME_USER) {
- if (gethome_path_user(fulldir, folder_name))
- return fulldir;
+ if (!path) {
+ path = BLI_get_user_folder_notest(folder_id, subfolder);
+ if (path) BLI_recurdir_fileops(path);
}
- return NULL;
+ return path;
}
+
+/* End new stuff */
+/* ************************************************************* */
+/* ************************************************************* */
+
+
+
#ifdef PATH_DEBUG
#undef PATH_DEBUG
#endif
@@ -977,7 +1129,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--;
@@ -991,7 +1143,7 @@ void BLI_make_exist(char *dir) {
}
}
#else
- while(BLI_exist(dir) == 0){
+ while(BLI_is_dir(dir) == 0){
a --;
while(dir[a] != '/'){
a--;
@@ -1008,9 +1160,9 @@ void BLI_make_exist(char *dir) {
void BLI_make_existing_file(char *name)
{
- char di[FILE_MAXDIR], fi[FILE_MAXFILE];
-
- strcpy(di, name);
+ char di[FILE_MAXDIR+FILE_MAXFILE], fi[FILE_MAXFILE];
+
+ BLI_strncpy(di, name, sizeof(di));
BLI_splitdirstring(di, fi);
/* test exist */
@@ -1113,10 +1265,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_testextensie_array(const char *str, const char **ext_array)
+{
+ int i=0;
+ while(ext_array[i]) {
+ if(BLI_testextensie(str, ext_array[i])) {
+ return 1;
+ }
+
+ i++;
+ }
+ return 0;
+}
+
+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.
@@ -1124,14 +1304,12 @@ int BLI_testextensie(const char *str, const char *ext)
* */
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';
}
@@ -1149,6 +1327,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);
@@ -1157,6 +1338,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.
@@ -1316,7 +1503,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;
}
@@ -1392,7 +1579,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);
}
@@ -1400,7 +1587,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);
}
}
@@ -1408,14 +1595,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);
}
}
@@ -1450,26 +1637,6 @@ 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
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 67b75e95cf4..bd721871f0a 100644
--- a/source/blender/blenlib/intern/pbvh.c
+++ b/source/blender/blenlib/intern/pbvh.c
@@ -24,13 +24,17 @@
#include "DNA_meshdata_types.h"
+#include "MEM_guardedalloc.h"
+
#include "BLI_math.h"
#include "BLI_ghash.h"
#include "BLI_pbvh.h"
#include "BKE_DerivedMesh.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
@@ -90,6 +94,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 {
@@ -120,6 +129,9 @@ struct PBVH {
#ifdef PERFCNTRS
int perf_modified;
#endif
+
+ /* flag are verts/faces deformed */
+ int deformed;
};
#define STACK_FIXED_DEPTH 100
@@ -222,6 +234,17 @@ 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,
@@ -303,7 +326,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;
@@ -346,12 +369,14 @@ 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;
@@ -360,10 +385,11 @@ static void build_mesh_leaf_node(PBVH *bvh, PBVHNode *node)
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;
}
@@ -576,6 +602,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);
@@ -624,13 +659,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;
@@ -645,10 +679,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) {
@@ -668,6 +699,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)
@@ -719,12 +778,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);
@@ -968,9 +1120,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);
@@ -1069,6 +1222,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 {
@@ -1083,16 +1248,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];
@@ -1102,8 +1264,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;
@@ -1112,20 +1276,20 @@ static int ray_aabb_intersect(PBVHNode *node, void *data_v)
if((tmin > tzmax) || (tzmin > tmax))
return 0;
-
- return 1;
- /* XXX: Not sure about this?
- if(tzmin > tmin)
- tmin = tzmin;
- if(tzmax < tmax)
- tmax = tzmax;
- return ((tmin < t1) && (tmax > t0));
- */
+ 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;
}
-void BLI_pbvh_raycast(PBVH *bvh, BLI_pbvh_HitCallback cb, void *data,
+void BLI_pbvh_raycast(PBVH *bvh, BLI_pbvh_HitOccludedCallback cb, void *data,
float ray_start[3], float ray_normal[3], int original)
{
RaycastData rcd;
@@ -1139,37 +1303,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;
-
- 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;
+ float dist;
+
+ 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],
@@ -1214,6 +1365,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) {
@@ -1321,3 +1474,145 @@ void BLI_pbvh_draw(PBVH *bvh, float (*planes)[4], float (*face_nors)[3], int smo
}
}
+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; a<pbvh->totvert; 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 <config.h>
-#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 4506115cd8c..aa424c1c2bb 100644
--- a/source/blender/blenlib/intern/rct.c
+++ b/source/blender/blenlib/intern/rct.c
@@ -36,10 +36,8 @@
*/
#include "DNA_vec_types.h"
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
+#include <stdio.h>
+#include <math.h>
int BLI_rcti_is_empty(rcti * rect)
{
@@ -146,6 +144,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;
@@ -205,3 +224,21 @@ int BLI_isect_rcti(rcti *src1, rcti *src2, rcti *dest)
return 0;
}
}
+
+void BLI_copy_rcti_rctf(rcti *tar, const rctf *src)
+{
+ tar->xmin= floor(src->xmin + 0.5);
+ tar->xmax= floor((src->xmax - src->xmin) + 0.5);
+ tar->ymin= floor(src->ymin + 0.5);
+ tar->ymax= floor((src->ymax - src->ymin) + 0.5);
+}
+
+void print_rctf(const char *str, rctf *rect)
+{
+ printf("%s: xmin %.3f, xmax %.3f, ymin %.3f, ymax %.3f\n", str, rect->xmin, rect->xmax, rect->ymin, rect->ymax);
+}
+
+void print_rcti(const char *str, rcti *rect)
+{
+ printf("%s: xmin %d, xmax %d, ymin %d, ymax %d\n", str, rect->xmin, rect->xmax, rect->ymin, rect->ymax);
+}
diff --git a/source/blender/blenlib/intern/scanfill.c b/source/blender/blenlib/intern/scanfill.c
index 3329562f3a2..7896ebdd263 100644
--- a/source/blender/blenlib/intern/scanfill.c
+++ b/source/blender/blenlib/intern/scanfill.c
@@ -35,10 +35,6 @@
#include "BLI_listbase.h"
#include "BLI_math.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
/* callbacks for errors and interrupts and some goo */
static void (*BLI_localErrorCallBack)(char*) = NULL;
static int (*BLI_localInterruptCallBack)(void) = NULL;
@@ -142,7 +138,7 @@ struct mem_elements {
static void *new_mem_element(int size)
{
int blocksize= 16384;
- static int offs= 0; /* the current free adress */
+ static int offs= 0; /* the current free address */
static struct mem_elements *cur= 0;
static ListBase lb= {0, 0};
void *adr;
diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c
index d9fea2483b9..80310b1ef8a 100644
--- a/source/blender/blenlib/intern/storage.c
+++ b/source/blender/blenlib/intern/storage.c
@@ -76,7 +76,6 @@
#endif
#ifdef WIN32
-#include <sys/types.h>
#include <io.h>
#include <direct.h>
#include "BLI_winstuff.h"
@@ -238,8 +237,19 @@ void BLI_builddir(char *dirname, char *relname)
if (newnum){
- if (files) files=(struct direntry *)realloc(files,(totnum+newnum) * sizeof(struct direntry));
- else files=(struct direntry *)malloc(newnum * sizeof(struct direntry));
+ if(files) {
+ void *tmp= realloc(files, (totnum+newnum) * sizeof(struct direntry));
+ if(tmp) {
+ files= (struct direntry *)tmp;
+ }
+ else { /* realloc fail */
+ free(files);
+ files= NULL;
+ }
+ }
+
+ if(files==NULL)
+ files=(struct direntry *)malloc(newnum * sizeof(struct direntry));
if (files){
dlink = (struct dirlink *) dirbase->first;
@@ -251,6 +261,8 @@ void BLI_builddir(char *dirname, char *relname)
// Excluding other than current MSVC compiler until able to test.
#if (defined(WIN32) || defined(WIN64)) && (_MSC_VER>=1500)
_stat64(dlink->name,&files[actnum].s);
+#elif defined(__MINGW32__)
+ _stati64(dlink->name,&files[actnum].s);
#else
stat(dlink->name,&files[actnum].s);
#endif
@@ -433,18 +445,29 @@ int BLI_filepathsize(const char *path)
int BLI_exist(char *name)
{
- struct stat st;
-#ifdef WIN32
+#if defined(WIN32) && !defined(__MINGW32__)
+ 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';
+ res = _stat(tmp, &st);
+ if (res == -1) return(0);
+#elif defined(__MINGW32__)
+ struct _stati64 st;
+ char tmp[FILE_MAXDIR+FILE_MAXFILE];
+ 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 = _stati64(tmp, &st);
+ if (res) return(0);
#else
+ struct stat st;
if (stat(name,&st)) return(0);
#endif
return(st.st_mode);
@@ -500,3 +523,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/threads.c b/source/blender/blenlib/intern/threads.c
index 351e0be1102..726ed817f8b 100644
--- a/source/blender/blenlib/intern/threads.c
+++ b/source/blender/blenlib/intern/threads.c
@@ -29,6 +29,7 @@
*/
#include <errno.h>
+#include <string.h>
#include "MEM_guardedalloc.h"
@@ -106,6 +107,9 @@ 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 */
@@ -129,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!
*/
@@ -136,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;
@@ -149,20 +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);
+ }
+
+ 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);
+ /* 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++;
}
+
+ thread_levels++;
}
/* amount of available threads */
@@ -204,6 +213,10 @@ static void *tslot_thread_start(void *tslot_p)
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)
{
ThreadSlot *tslot;
@@ -274,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 */
@@ -327,6 +340,10 @@ void BLI_lock_thread(int type)
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)
@@ -339,6 +356,10 @@ void BLI_unlock_thread(int type)
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 304884ba8ca..0992e08b28f 100644
--- a/source/blender/blenlib/intern/time.c
+++ b/source/blender/blenlib/intern/time.c
@@ -27,10 +27,6 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#ifdef WIN32
#include "PIL_time.h"
#include <windows.h>
diff --git a/source/blender/blenlib/intern/uvproject.c b/source/blender/blenlib/intern/uvproject.c
index 0e7c36886ce..cc115d52928 100644
--- a/source/blender/blenlib/intern/uvproject.c
+++ b/source/blender/blenlib/intern/uvproject.c
@@ -135,8 +135,8 @@ UvCameraInfo *project_camera_info(Object *ob, float (*rotmat)[4], float winx, fl
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;
+ 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;
@@ -182,3 +182,10 @@ void project_from_view_ortho(float target[2], float source[3], float rotmat[4][4
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 31ed116c40a..2b04a49e848 100644
--- a/source/blender/blenlib/intern/voxel.c
+++ b/source/blender/blenlib/intern/voxel.c
@@ -30,12 +30,7 @@
#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);
@@ -57,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);
@@ -65,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);
}
diff --git a/source/blender/blenlib/intern/winstuff.c b/source/blender/blenlib/intern/winstuff.c
index 0463e6ea00b..81a635205f9 100644
--- a/source/blender/blenlib/intern/winstuff.c
+++ b/source/blender/blenlib/intern/winstuff.c
@@ -28,16 +28,11 @@
* Windows-posix compatibility layer, windows-specific functions.
*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#ifdef WIN32
#include <stdlib.h>
#include <stdio.h>
-#include "MEM_guardedalloc.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
diff --git a/source/blender/blenloader/BLO_readfile.h b/source/blender/blenloader/BLO_readfile.h
index df7cd25a6db..eeced13b57b 100644
--- a/source/blender/blenloader/BLO_readfile.h
+++ b/source/blender/blenloader/BLO_readfile.h
@@ -111,27 +111,6 @@ BlendFileData *BLO_read_from_memfile(struct Main *oldmain, const char *filename,
void
BLO_blendfiledata_free(
BlendFileData *bfd);
-
-/**
- * Convert an idcode into a name.
- *
- * @param code The code to convert.
- * @return A static string representing the name of
- * the code.
- */
- char*
-BLO_idcode_to_name(
- int code);
-
-/**
- * Convert a name into an idcode (ie. ID_SCE)
- *
- * @param name The name to convert.
- * @return The code for the name, or 0 if invalid.
- */
- int
-BLO_idcode_from_name(
- char *name);
/**
* Open a blendhandle from a file path.
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/Makefile b/source/blender/blenloader/Makefile
index 4ffc558f889..069bad4d371 100644
--- a/source/blender/blenloader/Makefile
+++ b/source/blender/blenloader/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/blenloader/intern/Makefile b/source/blender/blenloader/intern/Makefile
index f4690fcc066..fe178ea2610 100644
--- a/source/blender/blenloader/intern/Makefile
+++ b/source/blender/blenloader/intern/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/blenloader/intern/readblenentry.c b/source/blender/blenloader/intern/readblenentry.c
index b7321c2c995..d66d802c8ee 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 <config.h>
-#endif
-
#include "BLI_storage.h" /* _LARGEFILE_SOURCE */
#include <stdlib.h>
@@ -50,6 +46,7 @@
#include "BKE_main.h"
#include "BKE_library.h" // for free_main
+#include "BKE_idcode.h"
#include "BKE_report.h"
#include "BLO_readfile.h"
@@ -65,102 +62,9 @@
#include "BLI_winstuff.h"
#endif
- /**
- * IDType stuff, I plan to move this
- * out into its own file + prefix, and
- * make sure all IDType handling goes through
- * these routines.
- */
-
-typedef struct {
- unsigned short code;
- char *name;
-
- int flags;
-#define IDTYPE_FLAGS_ISLINKABLE (1<<0)
-} IDType;
-
-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},
-};
-static int nidtypes= sizeof(idtypes)/sizeof(idtypes[0]);
-
/* local prototypes --------------------- */
void BLO_blendhandle_print_sizes(BlendHandle *, void *);
-
-static IDType *idtype_from_name(char *str)
-{
- int i= nidtypes;
-
- while (i--)
- if (BLI_streq(str, idtypes[i].name))
- return &idtypes[i];
-
- return NULL;
-}
-static IDType *idtype_from_code(int code)
-{
- int i= nidtypes;
-
- while (i--)
- if (code==idtypes[i].code)
- return &idtypes[i];
-
- return NULL;
-}
-
-static int bheadcode_is_idcode(int code)
-{
- return idtype_from_code(code)?1:0;
-}
-
-static int idcode_is_linkable(int code) {
- IDType *idt= idtype_from_code(code);
- return idt?(idt->flags&IDTYPE_FLAGS_ISLINKABLE):0;
-}
-
-char *BLO_idcode_to_name(int code)
-{
- IDType *idt= idtype_from_code(code);
-
- return idt?idt->name:NULL;
-}
-
-int BLO_idcode_from_name(char *name)
-{
- IDType *idt= idtype_from_name(name);
-
- return idt?idt->code:0;
-}
-
/* Access routines used by filesel. */
BlendHandle *BLO_blendhandle_from_file(char *file)
@@ -233,10 +137,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) {
@@ -287,20 +200,20 @@ 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;
for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) {
if (bhead->code==ENDB) {
break;
- } else if (bheadcode_is_idcode(bhead->code)) {
- if (idcode_is_linkable(bhead->code)) {
- char *str= BLO_idcode_to_name(bhead->code);
+ } else if (BKE_idcode_is_valid(bhead->code)) {
+ if (BKE_idcode_is_linkable(bhead->code)) {
+ const char *str= BKE_idcode_to_name(bhead->code);
- if (!BLI_ghash_haskey(gathered, str)) {
+ if (!BLI_ghash_haskey(gathered, (void *)str)) {
BLI_linklist_prepend(&names, strdup(str));
- BLI_ghash_insert(gathered, str, NULL);
+ BLI_ghash_insert(gathered, (void *)str, NULL);
}
}
}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index dcd7d9d0dab..cbc4c8890a6 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -47,26 +47,19 @@
#endif
#include "DNA_anim_types.h"
-#include "DNA_action_types.h"
#include "DNA_armature_types.h"
-#include "DNA_ID.h"
#include "DNA_actuator_types.h"
-#include "DNA_boid_types.h"
#include "DNA_brush_types.h"
#include "DNA_camera_types.h"
#include "DNA_cloth_types.h"
-#include "DNA_color_types.h"
#include "DNA_controller_types.h"
#include "DNA_constraint_types.h"
-#include "DNA_curve_types.h"
-#include "DNA_customdata_types.h"
#include "DNA_effect_types.h"
#include "DNA_fileglobal_types.h"
#include "DNA_genfile.h"
#include "DNA_group_types.h"
#include "DNA_gpencil_types.h"
#include "DNA_ipo_types.h"
-#include "DNA_image_types.h"
#include "DNA_key_types.h"
#include "DNA_lattice_types.h"
#include "DNA_lamp_types.h"
@@ -74,16 +67,10 @@
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_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_object_fluidsim.h" // NT
-#include "DNA_outliner_types.h"
-#include "DNA_object_force.h"
#include "DNA_packedFile_types.h"
-#include "DNA_particle_types.h"
#include "DNA_property_types.h"
#include "DNA_text_types.h"
#include "DNA_view3d_types.h"
@@ -95,13 +82,11 @@
#include "DNA_smoke_types.h"
#include "DNA_sound_types.h"
#include "DNA_space_types.h"
-#include "DNA_texture_types.h"
-#include "DNA_userdef_types.h"
#include "DNA_vfont_types.h"
#include "DNA_world_types.h"
-#include "DNA_windowmanager_types.h"
#include "MEM_guardedalloc.h"
+
#include "BLI_blenlib.h"
#include "BLI_math.h"
@@ -121,6 +106,7 @@
#include "BKE_image.h"
#include "BKE_lattice.h"
#include "BKE_library.h" // for which_libbase
+#include "BKE_idcode.h"
#include "BKE_main.h" // for Main
#include "BKE_mesh.h" // for ME_ defines (patching)
#include "BKE_modifier.h"
@@ -138,7 +124,6 @@
#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_sound.h"
//XXX #include "BIF_butspace.h" // badlevel, for do_versions, patching event codes
@@ -155,7 +140,7 @@
#include <errno.h>
/*
- Remark: still a weak point is the newadress() function, that doesnt solve reading from
+ Remark: still a weak point is the newaddress() function, that doesnt solve reading from
multiple files at the same time
(added remark: oh, i thought that was solved? will look at that... (ton)
@@ -174,7 +159,7 @@ READ
- read associated 'direct data'
- link direct data (internal and to LibBlock)
- read FileGlobal
-- read USER data, only when indicated (file is ~/.B.blend or .B25.blend)
+- read USER data, only when indicated (file is ~/X.XX/startup.blend)
- free file
- per Library (per Main)
- read file
@@ -507,7 +492,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);
@@ -520,7 +505,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;
@@ -959,11 +944,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();
@@ -996,7 +981,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 <memory>");
return NULL;
} else {
FileData *fd= filedata_new();
@@ -1357,7 +1342,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
@@ -1553,6 +1539,9 @@ static void direct_link_brush(FileData *fd, Brush *brush)
direct_link_curvemapping(fd, brush->curve);
else
brush_curve_preset(brush, CURVE_PRESET_SHARP);
+
+ brush->preview= NULL;
+ brush->icon_imbuf= NULL;
}
static void direct_link_script(FileData *fd, Script *script)
@@ -2081,7 +2070,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);
@@ -2220,6 +2209,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);
@@ -2237,7 +2232,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;
}
}
@@ -2753,7 +2748,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;
@@ -2832,6 +2827,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);
@@ -3066,6 +3062,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) {
@@ -3135,7 +3132,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) {
@@ -3286,6 +3283,7 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh)
mesh->msticky= newdataadr(fd, mesh->msticky);
mesh->dvert= newdataadr(fd, mesh->dvert);
+ /* animdata */
mesh->adt= newdataadr(fd, mesh->adt);
direct_link_animdata(fd, mesh->adt);
@@ -3449,7 +3447,7 @@ static void lib_link_object(FileData *fd, Main *main)
/* 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);
@@ -3852,24 +3850,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; a<mmd->totvert+1; a++)
+ SWITCH_INT(mmd->bindoffsets[a])
+ if(mmd->bindcagecos)
+ for(a=0; a<mmd->totcagevert*3; a++)
+ SWITCH_INT(mmd->bindcagecos[a])
+ if(mmd->dynverts)
+ for(a=0; a<mmd->totvert; a++)
+ SWITCH_INT(mmd->dynverts[a])
+
if(mmd->bindweights)
for(a=0; a<mmd->totcagevert*mmd->totvert; a++)
SWITCH_INT(mmd->bindweights[a])
if(mmd->bindcos)
for(a=0; a<mmd->totcagevert*3; a++)
SWITCH_INT(mmd->bindcos[a])
- if(mmd->dynverts)
- for(a=0; a<mmd->totvert; a++)
- SWITCH_INT(mmd->dynverts[a])
}
}
}
@@ -3886,9 +3895,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;
@@ -4097,10 +4108,9 @@ static void composite_patch(bNodeTree *ntree, Scene *scene)
static void link_paint(FileData *fd, Scene *sce, Paint *p)
{
- if(p && p->brushes) {
- int i;
- for(i = 0; i < p->brush_count; ++i)
- p->brushes[i]= newlibadr_us(fd, sce->id.lib, p->brushes[i]);
+ if(p) {
+ p->brush= newlibadr_us(fd, sce->id.lib, p->brush);
+ p->paint_cursor= NULL;
}
}
@@ -4142,8 +4152,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);
@@ -4154,7 +4164,7 @@ static void lib_link_scene(FileData *fd, Main *main)
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);
- seq->scene_sound = sound_scene_add_scene_sound(sce, seq, seq->startdisp, seq->enddisp, seq->startofs);
+ 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) {
@@ -4165,7 +4175,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;
@@ -4193,8 +4203,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;
}
@@ -4217,13 +4226,8 @@ static void link_recurs_seq(FileData *fd, ListBase *lb)
static void direct_link_paint(FileData *fd, Paint **paint)
{
Paint *p;
-
+/* TODO. is this needed */
p= (*paint)= newdataadr(fd, (*paint));
- if(p) {
- p->paint_cursor= NULL;
- p->brushes= newdataadr(fd, p->brushes);
- test_pointer_array(fd, (void**)&p->brushes);
- }
}
static void direct_link_scene(FileData *fd, Scene *sce)
@@ -4259,9 +4263,6 @@ static void direct_link_scene(FileData *fd, Scene *sce)
direct_link_paint(fd, (Paint**)&sce->toolsettings->vpaint);
direct_link_paint(fd, (Paint**)&sce->toolsettings->wpaint);
- sce->toolsettings->imapaint.paint.brushes= newdataadr(fd, sce->toolsettings->imapaint.paint.brushes);
- test_pointer_array(fd, (void**)&sce->toolsettings->imapaint.paint.brushes);
-
sce->toolsettings->imapaint.paintcursor= NULL;
sce->toolsettings->particle.paintcursor= NULL;
}
@@ -4286,18 +4287,17 @@ 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);
if(seq->strip && seq->strip->done==0) {
seq->strip->done= 1;
- seq->strip->tstripdata = 0;
- seq->strip->tstripdata_startstill = 0;
- seq->strip->tstripdata_endstill = 0;
- seq->strip->ibuf_startstill = 0;
- seq->strip->ibuf_endstill = 0;
if(seq->type == SEQ_IMAGE ||
seq->type == SEQ_MOVIE ||
@@ -4534,6 +4534,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) {
@@ -4757,7 +4758,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);
@@ -4833,6 +4837,12 @@ 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...
@@ -5069,7 +5079,9 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
direct_link_gpencil(fd, v3d->gpd);
}
v3d->localvd= newdataadr(fd, v3d->localvd);
- v3d->afterdraw.first= v3d->afterdraw.last= NULL;
+ v3d->afterdraw_transp.first= v3d->afterdraw_transp.last= NULL;
+ v3d->afterdraw_xray.first= v3d->afterdraw_xray.last= NULL;
+ v3d->afterdraw_xraytransp.first= v3d->afterdraw_xraytransp.last= NULL;
v3d->properties_storage= NULL;
view3d_split_250(v3d, &sl->regionbase);
@@ -5105,6 +5117,11 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
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!
@@ -5122,6 +5139,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;
@@ -5143,7 +5164,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);
@@ -5151,9 +5172,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;
@@ -5187,8 +5216,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);
@@ -5203,8 +5232,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);
@@ -5237,7 +5266,7 @@ 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));
+ strncpy(lib->name, lib->filepath, sizeof(lib->name));
BLI_path_rel(lib->name, basepath);
}
}
@@ -6429,6 +6458,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;
@@ -6476,6 +6529,21 @@ static void do_version_old_trackto_to_constraints(Object *ob)
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 */
@@ -7801,7 +7869,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);
@@ -8368,8 +8436,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;
@@ -8424,12 +8490,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) {
@@ -9201,7 +9262,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
idproperties_fix_group_lengths(main->mat);
idproperties_fix_group_lengths(main->tex);
idproperties_fix_group_lengths(main->image);
- idproperties_fix_group_lengths(main->wave);
idproperties_fix_group_lengths(main->latt);
idproperties_fix_group_lengths(main->lamp);
idproperties_fix_group_lengths(main->camera);
@@ -9600,7 +9660,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;
@@ -9635,6 +9695,17 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
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);
+ }
}
}
}
@@ -9644,11 +9715,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.
*/
@@ -10139,22 +10205,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;
}
}
@@ -10663,6 +10723,27 @@ 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;
@@ -10726,8 +10807,294 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
do_version_old_trackto_to_constraints(ob);
}
- /* put 2.50 compatibility code here until next subversion bump */
+ 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);
+ }
+ }
+ }
+ }
+ }
+
+
+ if (main->versionfile < 253)
+ {
+ Object *ob;
+ Scene *scene;
+ bScreen *sc;
+ Tex *tex;
+ Brush *brush;
+
+ 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<<i)) {
+ scene->layact= 1<<i;
+ break;
+ }
+ }
+ }
+
+ for(tex= main->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) {
+ if(seq->sat==0.0f) {
+ seq->sat= 1.0f;
+ }
+ }
+ SEQ_END
+ }
+ }
+
+ /* GSOC 2010 Sculpt - New settings for 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;
+ }
+ }
+ }
+ }
+
+ /* GSOC Sculpt 2010 - Sanity check on Sculpt/Paint settings */
+ if (main->versionfile < 253) {
+ Scene *sce;
+ for (sce= main->scene.first; sce; sce= sce->id.next) {
+ if (sce->toolsettings->sculpt_paint_unified_alpha == 0)
+ sce->toolsettings->sculpt_paint_unified_alpha = 0.5f;
+
+ if (sce->toolsettings->sculpt_paint_unified_unprojected_radius == 0)
+ sce->toolsettings->sculpt_paint_unified_unprojected_radius = 0.125f;
+
+ if (sce->toolsettings->sculpt_paint_unified_size == 0)
+ sce->toolsettings->sculpt_paint_unified_size = 35;
+ }
+ }
+
+ if (main->versionfile < 253 || (main->versionfile == 253 && main->subversionfile < 1))
+ {
+ Object *ob;
+
+ 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_Smoke) {
+ SmokeModifierData *smd = (SmokeModifierData *)md;
+
+ if((smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain)
+ {
+ smd->domain->vorticity = 2.0f;
+ smd->domain->time_scale = 1.0f;
+
+ if(!(smd->domain->flags & (1<<4)))
+ continue;
+
+ /* delete old MOD_SMOKE_INITVELOCITY flag */
+ smd->domain->flags &= ~(1<<4);
+
+ /* for now just add it to all flow objects in the scene */
+ {
+ Object *ob2;
+ for(ob2 = main->object.first; ob2; ob2 = ob2->id.next) {
+ ModifierData *md2;
+ for(md2= ob2->modifiers.first; md2; md2= md2->next) {
+ if (md2->type == eModifierType_Smoke) {
+ SmokeModifierData *smd2 = (SmokeModifierData *)md2;
+
+ if((smd2->type & MOD_SMOKE_TYPE_FLOW) && smd2->flow)
+ {
+ smd2->flow->flags |= MOD_SMOKE_FLOW_INITVELOCITY;
+ }
+ }
+ }
+ }
+ }
+
+ }
+ else if((smd->type & MOD_SMOKE_TYPE_FLOW) && smd->flow)
+ {
+ smd->flow->vel_multi = 1.0f;
+ }
+
+ }
+ }
+ }
+ }
+
+ /* put compatibility code here until next subversion bump */
{
+ Brush *br;
+ for(br= main->brush.first; br; br= br->id.next) {
+ if(br->ob_mode==0)
+ br->ob_mode= (OB_MODE_SCULPT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT|OB_MODE_VERTEX_PAINT);
+ }
}
@@ -10737,6 +11104,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);
@@ -10829,7 +11205,7 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filename)
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;
@@ -10883,6 +11259,7 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filename)
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 */
@@ -11011,7 +11388,7 @@ static void expand_doit(FileData *fd, Main *mainvar, void *old)
else {
/* The line below was commented by Ton (I assume), when Hos did the merge from the orange branch. rev 6568
* This line is NEEDED, the case is that you have 3 blend files...
- * user.blend, lib.blend and lib_indirect.blend - if user.blend alredy references a "tree" from
+ * user.blend, lib.blend and lib_indirect.blend - if user.blend already references a "tree" from
* lib_indirect.blend but lib.blend does too, linking in a Scene or Group from lib.blend can result in an
* empty without the dupli group referenced. Once you save and reload the group would appier. - Campbell */
/* This crashes files, must look further into it */
@@ -11333,6 +11710,9 @@ static void expand_mesh(FileData *fd, Main *mainvar, Mesh *me)
TFace *tf;
int a, i;
+ if(me->adt)
+ expand_animdata(fd, mainvar, me->adt);
+
for(a=0; a<me->totcol; a++) {
expand_doit(fd, mainvar, me->mat[a]);
}
@@ -11476,7 +11856,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) {
@@ -11796,7 +12175,7 @@ static void give_base_to_objects(Main *mainvar, Scene *sce, Library *lib, int is
/* IF below is quite confusing!
if we are appending, but this object wasnt just added allong with a group,
- then this is alredy used indirectly in the scene somewhere else and we didnt just append it.
+ then this is already used indirectly in the scene somewhere else and we didnt just append it.
(ob->id.flag & LIB_PRE_EXISTING)==0 means that this is a newly appended object - Campbell */
if (is_group_append==0 || (ob->id.flag & LIB_PRE_EXISTING)==0) {
@@ -11844,7 +12223,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 */
@@ -11903,6 +12282,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++;
@@ -11960,7 +12340,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;
}
@@ -12002,9 +12384,7 @@ static void append_do_cursor(Scene *scene, Library *curlib, short flag)
return;
/* move from the center of the appended objects to cursor */
- centerloc[0]= (min[0]+max[0])/2;
- centerloc[1]= (min[1]+max[1])/2;
- centerloc[2]= (min[2]+max[2])/2;
+ mid_v3_v3v3(centerloc, min, max);
curs = scene->cursor;
VECSUB(centerloc,curs,centerloc);
@@ -12036,7 +12416,7 @@ static void library_append_end(const bContext *C, Main *mainl, FileData **fd, in
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_path_rel(mainl->curlib->name, G.sce);
@@ -12051,7 +12431,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 {
@@ -12104,7 +12487,7 @@ void BLO_script_library_append(BlendHandle **bh, char *dir, char *name,
/* do we need to do this? */
if(scene)
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
*bh= (BlendHandle*)fd;
}
@@ -12150,10 +12533,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', '%s'\n", mainptr->curlib->filename, mainptr->curlib->name);
- BKE_reportf(basefd->reports, RPT_INFO, "read library: '%s', '%s'\n", mainptr->curlib->filename, 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->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);
- fd= blo_openblenderfile(mainptr->curlib->filename, basefd->reports);
+ if(fd) {
+ printf("found: '%s', party on macuno!\n", mainptr->curlib->filepath);
+ }
+ }
+ }
+ }
if (fd) {
fd->reports= basefd->reports;
@@ -12172,8 +12579,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) {
@@ -12190,8 +12597,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", BKE_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", BKE_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
}
change_idid_adr(mainlist, basefd, id, realid);
@@ -12226,9 +12633,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", BKE_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", BKE_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/undofile.c b/source/blender/blenloader/intern/undofile.c
index f9d51e946a0..9cdf8613011 100644
--- a/source/blender/blenloader/intern/undofile.c
+++ b/source/blender/blenloader/intern/undofile.c
@@ -28,10 +28,6 @@
* .blend file reading entry point
*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
@@ -40,10 +36,7 @@
#include "MEM_guardedalloc.h"
#include "DNA_listBase.h"
-#include "DNA_userdef_types.h"
-#include "BKE_utildefines.h"
-#include "BKE_global.h"
#include "BLO_undofile.h"
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 2b32bbdf0c1..f9f66ed8504 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
+- write USER if filename is ~/X.XX/config/startup.blend
*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include <math.h>
#include <fcntl.h>
#include <stdio.h>
@@ -91,38 +88,26 @@ Any case: direct data is ALWAYS after the lib block
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
-#include "DNA_action_types.h"
#include "DNA_actuator_types.h"
-#include "DNA_boid_types.h"
#include "DNA_brush_types.h"
#include "DNA_camera_types.h"
#include "DNA_cloth_types.h"
-#include "DNA_color_types.h"
#include "DNA_constraint_types.h"
#include "DNA_controller_types.h"
-#include "DNA_curve_types.h"
-#include "DNA_customdata_types.h"
-#include "DNA_effect_types.h"
#include "DNA_genfile.h"
#include "DNA_group_types.h"
#include "DNA_gpencil_types.h"
-#include "DNA_image_types.h"
-#include "DNA_ipo_types.h" // XXX depreceated - animsys
#include "DNA_fileglobal_types.h"
#include "DNA_key_types.h"
#include "DNA_lattice_types.h"
-#include "DNA_listBase.h" /* for Listbase, the type of samples, ...*/
#include "DNA_lamp_types.h"
#include "DNA_meta_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_material_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_outliner_types.h"
#include "DNA_packedFile_types.h"
#include "DNA_particle_types.h"
#include "DNA_property_types.h"
@@ -134,11 +119,9 @@ Any case: direct data is ALWAYS after the lib block
#include "DNA_space_types.h"
#include "DNA_screen_types.h"
#include "DNA_sound_types.h"
-#include "DNA_texture_types.h"
#include "DNA_text_types.h"
#include "DNA_view3d_types.h"
#include "DNA_vfont_types.h"
-#include "DNA_userdef_types.h"
#include "DNA_world_types.h"
#include "DNA_windowmanager_types.h"
@@ -149,23 +132,16 @@ Any case: direct data is ALWAYS after the lib block
#include "BKE_action.h"
#include "BKE_blender.h"
-#include "BKE_cloth.h"
#include "BKE_curve.h"
-#include "BKE_customdata.h"
#include "BKE_constraint.h"
#include "BKE_global.h" // for G
#include "BKE_library.h" // for set_listbasepointers
#include "BKE_main.h"
#include "BKE_node.h"
-#include "BKE_packedFile.h" // for packAll
-#include "BKE_pointcache.h"
#include "BKE_report.h"
-#include "BKE_screen.h" // for waitcursor
#include "BKE_sequencer.h"
-#include "BKE_sound.h" /* ... and for samples */
#include "BKE_utildefines.h" // for defines
#include "BKE_modifier.h"
-#include "BKE_idprop.h"
#include "BKE_fcurve.h"
#include "BLO_writefile.h"
@@ -1235,10 +1211,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);
@@ -1270,6 +1246,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);
@@ -1418,7 +1402,7 @@ static void write_curves(WriteData *wd, ListBase *idbase)
if(cu->vfont) {
writedata(wd, DATA, amount_of_chars(cu->str)+1, cu->str);
- writestruct(wd, DATA, "CharInfo", cu->len, cu->strinfo);
+ writestruct(wd, DATA, "CharInfo", cu->len+1, cu->strinfo);
writestruct(wd, DATA, "TextBox", cu->totbox, cu->tb);
}
else {
@@ -1533,6 +1517,7 @@ static void write_meshs(WriteData *wd, ListBase *idbase)
/* direct data */
if (mesh->id.properties) IDP_WriteProperty(mesh->id.properties, wd);
+ if (mesh->adt) write_animdata(wd, mesh->adt);
writedata(wd, DATA, sizeof(void *)*mesh->totcol, mesh->mat);
@@ -1764,11 +1749,6 @@ static void write_lamps(WriteData *wd, ListBase *idbase)
}
}
-static void write_paint(WriteData *wd, Paint *p)
-{
- if(p && p->brushes)
- writedata(wd, DATA, p->brush_count * sizeof(Brush*), p->brushes);
-}
static void write_scenes(WriteData *wd, ListBase *scebase)
{
@@ -1803,18 +1783,15 @@ static void write_scenes(WriteData *wd, ListBase *scebase)
writestruct(wd, DATA, "ToolSettings", 1, tos);
if(tos->vpaint) {
writestruct(wd, DATA, "VPaint", 1, tos->vpaint);
- write_paint(wd, &tos->vpaint->paint);
}
if(tos->wpaint) {
writestruct(wd, DATA, "VPaint", 1, tos->wpaint);
- write_paint(wd, &tos->wpaint->paint);
}
if(tos->sculpt) {
writestruct(wd, DATA, "Sculpt", 1, tos->sculpt);
- write_paint(wd, &tos->sculpt->paint);
}
- write_paint(wd, &tos->imapaint.paint);
+ // write_paint(wd, &tos->imapaint.paint);
ed= sce->ed;
if(ed) {
@@ -2112,7 +2089,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);
@@ -2378,9 +2363,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;
@@ -2395,6 +2390,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 */
@@ -2446,7 +2442,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];
@@ -2457,7 +2453,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;
}
@@ -2478,14 +2474,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 */
@@ -2538,7 +2534,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;
@@ -2634,7 +2630,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.");
@@ -2720,7 +2716,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/CMakeLists.txt b/source/blender/blenpluginapi/CMakeLists.txt
index 589c97d2bb6..2699b3b7c3b 100644
--- a/source/blender/blenpluginapi/CMakeLists.txt
+++ b/source/blender/blenpluginapi/CMakeLists.txt
@@ -40,4 +40,3 @@ IF(WITH_QUICKTIME)
ENDIF(WITH_QUICKTIME)
BLENDERLIB(bf_blenpluginapi "${SRC}" "${INC}")
-#env.BlenderLib ( libname = 'bf_blenpluginapi', sources = sources, includes = Split(incs), defines = defs, libtype=['core', 'player'], priority = [75, 35] )
diff --git a/source/blender/blenpluginapi/Makefile b/source/blender/blenpluginapi/Makefile
index 83678309b45..c91161d8cfd 100644
--- a/source/blender/blenpluginapi/Makefile
+++ b/source/blender/blenpluginapi/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/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)
-
-#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;
+struct ImMetaData;
+
+#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/Makefile b/source/blender/blenpluginapi/intern/Makefile
index 20a61e9a25c..696462f3f46 100644
--- a/source/blender/blenpluginapi/intern/Makefile
+++ b/source/blender/blenpluginapi/intern/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/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/collada/CMakeLists.txt b/source/blender/collada/CMakeLists.txt
index 420650a6ff7..fa582673746 100644
--- a/source/blender/collada/CMakeLists.txt
+++ b/source/blender/collada/CMakeLists.txt
@@ -61,4 +61,8 @@ SET(INC
ENDIF(APPLE)
-BLENDERLIB(bf_collada "${SRC}" "${INC}")
+IF(WITH_BUILDINFO)
+ ADD_DEFINITIONS(-DNAN_BUILDINFO)
+ENDIF(WITH_BUILDINFO)
+
+BLENDERLIB(bf_collada "${SRC}" "${INC}") \ No newline at end of file
diff --git a/source/blender/collada/DocumentExporter.cpp b/source/blender/collada/DocumentExporter.cpp
index 30e977b02df..54ce17e7408 100644
--- a/source/blender/collada/DocumentExporter.cpp
+++ b/source/blender/collada/DocumentExporter.cpp
@@ -48,10 +48,14 @@ extern "C"
#include "BLI_path_util.h"
#include "BLI_fileops.h"
#include "ED_keyframing.h"
+#ifdef NAN_BUILDINFO
+extern char build_rev[];
+#endif
}
#include "MEM_guardedalloc.h"
+#include "BKE_blender.h" // version info
#include "BKE_scene.h"
#include "BKE_global.h"
#include "BKE_main.h"
@@ -1296,7 +1300,7 @@ private:
int offset = 0;
input.push_back(COLLADASW::Input(COLLADASW::JOINT, // constant declared in COLLADASWInputList.h
COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, joints_source_id), offset++));
- input.push_back(COLLADASW::Input(COLLADASW::WEIGHT,
+ input.push_back(COLLADASW::Input(COLLADASW::WEIGHT,
COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, weights_source_id), offset++));
weights.setCount(me->totvert);
@@ -1719,7 +1723,7 @@ public:
// most widespread de-facto standard.
texture.setProfileName("FCOLLADA");
texture.setChildElementName("bump");
- ep.setExtraTechniqueColorOrTexture(COLLADASW::ColorOrTexture(texture));
+ ep.addExtraTechniqueColorOrTexture(COLLADASW::ColorOrTexture(texture));
}
}
// performs the actual writing
@@ -1731,9 +1735,8 @@ public:
twoSided = true;
}
if (twoSided)
- ep.addExtraTechniqueParameter("GOOGLEEARTH", "double_sided", 1);
+ ep.addExtraTechniqueParameter("GOOGLEEARTH", "show_double_sided", 1);
ep.addExtraTechniques(mSW);
-
ep.closeProfile();
if (twoSided)
mSW->appendTextBlock("<extra><technique profile=\"MAX3D\"><double_sided>1</double_sided></technique></extra>");
@@ -1770,6 +1773,7 @@ public:
for (int a = 0; a < MAX_MTEX; a++) {
if (ma->mtex[a] &&
+ ma->mtex[a]->tex &&
ma->mtex[a]->tex->type == TEX_IMAGE &&
ma->mtex[a]->texco == TEXCO_UV){
indices.push_back(a);
@@ -2531,6 +2535,15 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename)
// XXX ask blender devs about this?
asset.setUnit("decimetre", 0.1);
asset.setUpAxisType(COLLADASW::Asset::Z_UP);
+ // TODO: need an Author field in userpref
+ asset.getContributor().mAuthor = "Blender User";
+#ifdef NAN_BUILDINFO
+ char version_buf[128];
+ sprintf(version_buf, "Blender %d.%02d.%d r%s", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION, build_rev);
+ asset.getContributor().mAuthoringTool = version_buf;
+#else
+ asset.getContributor().mAuthoringTool = "Blender 2.5x";
+#endif
asset.add();
// <library_cameras>
@@ -2591,4 +2604,3 @@ NOTES:
* AnimationExporter::sample_animation enables all curves on armature, this is undesirable for a user
*/
-
diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp
index f9c2b253614..2a3df69f0db 100644
--- a/source/blender/collada/DocumentImporter.cpp
+++ b/source/blender/collada/DocumentImporter.cpp
@@ -217,6 +217,7 @@ static int set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space
return false;
Object workob;
+ Main *bmain = CTX_data_main(C);
Scene *sce = CTX_data_scene(C);
ob->parent = par;
@@ -244,8 +245,8 @@ static int set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space
ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA;
par->recalc |= OB_RECALC_OB;
- DAG_scene_sort(sce);
- DAG_ids_flush_update(0);
+ DAG_scene_sort(bmain, sce);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
return true;
@@ -612,9 +613,10 @@ private:
void link_armature(bContext *C, Object *ob, std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& joint_by_uid,
TransformReader *tm)
{
+ Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
- ModifierData *md = ED_object_modifier_add(NULL, scene, ob, NULL, eModifierType_Armature);
+ ModifierData *md = ED_object_modifier_add(NULL, bmain, scene, ob, NULL, eModifierType_Armature);
((ArmatureModifierData *)md)->object = ob_arm;
copy_m4_m4(ob->obmat, bind_shape_matrix);
@@ -631,8 +633,8 @@ private:
ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA;
- DAG_scene_sort(scene);
- DAG_ids_flush_update(0);
+ DAG_scene_sort(bmain, scene);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
#endif
@@ -1329,7 +1331,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:
@@ -1380,7 +1382,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];
@@ -1395,12 +1397,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];
@@ -1415,11 +1417,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) {
@@ -1544,7 +1546,7 @@ private:
vert += 3;
}
- filldisplist(&dispbase, &dispbase);
+ filldisplist(&dispbase, &dispbase, 0);
int tottri = 0;
dl= (DispList*)dispbase.first;
@@ -1619,6 +1621,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++) {
if (mesh->getUVCoords().getLength(i) == 0) {
totuvset = 0;
@@ -1682,6 +1691,7 @@ private:
set_face_indices(mface, indices, false);
indices += 3;
+#if 0
for (k = 0; k < totuvset; k++) {
if (!index_list_array.empty() && index_list_array[k]) {
// get mtface by face index and uv set index
@@ -1689,6 +1699,15 @@ private:
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);
@@ -1720,6 +1739,7 @@ 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++) {
if (!index_list_array.empty() && index_list_array[k]) {
// get mtface by face index and uv set index
@@ -1727,6 +1747,15 @@ private:
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);
@@ -1762,6 +1791,7 @@ private:
set_face_indices(mface, tri_indices, false);
+#if 0
for (unsigned int l = 0; l < totuvset; l++) {
if (!index_list_array.empty() && index_list_array[l]) {
// get mtface by face index and uv set index
@@ -1769,6 +1799,16 @@ private:
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);
@@ -3102,7 +3142,7 @@ public:
where_is_object(scene, job);
// after parenting and layer change
- DAG_scene_sort(scene);
+ DAG_scene_sort(CTX_data_main(C), scene);
joint_objects[node->getUniqueId()] = job;
}
@@ -3243,7 +3283,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)
@@ -3308,8 +3348,8 @@ public:
}
libnode_ob.clear();
- DAG_scene_sort(sce);
- DAG_ids_flush_update(0);
+ DAG_scene_sort(CTX_data_main(mContext), sce);
+ DAG_ids_flush_update(CTX_data_main(mContext), 0);
}
}
@@ -3399,7 +3439,7 @@ public:
Object *create_instance_node(Object *source_ob, COLLADAFW::Node *source_node, COLLADAFW::Node *instance_node, Scene *sce, bool is_library_node)
{
Object *obn = copy_object(source_ob);
- obn->recalc |= OB_RECALC;
+ obn->recalc |= OB_RECALC_ALL;
scene_add_base(sce, obn);
if (instance_node)
@@ -3407,8 +3447,8 @@ public:
else
anim_importer.read_node_transform(source_node, obn);
- DAG_scene_sort(sce);
- DAG_ids_flush_update(0);
+ DAG_scene_sort(CTX_data_main(mContext), sce);
+ DAG_ids_flush_update(CTX_data_main(mContext), 0);
COLLADAFW::NodePointerArray &children = source_node->getChildNodes();
if (children.getCount()) {
@@ -3501,10 +3541,6 @@ public:
anim_importer.read_node_transform(node, ob);
- // if (ob->type == OB_MESH) {
- // create_instance_node(ob, node, sce);
- // }
-
if (!is_joint) {
// if par was given make this object child of the previous
if (par && ob)
diff --git a/source/blender/collada/Makefile b/source/blender/collada/Makefile
index f2fed004a25..d4cc18d22b6 100644
--- a/source/blender/collada/Makefile
+++ b/source/blender/collada/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) 2008 Blender Foundation.
# All rights reserved.
@@ -37,6 +37,6 @@ CPPFLAGS += -I../makesdna -I../blenlib -I../blenkernel -I../editors/include
CPPFLAGS += -I../windowmanager -I../makesrna
CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
CPPFLAGS += -I$(BF_OPENCOLLADA)/include/COLLADABaseUtils
-CPPFLAGS += -I$(BF_OPENCOLLADA)/include/COLLADAFrameWork
+CPPFLAGS += -I$(BF_OPENCOLLADA)/include/COLLADAFramework
CPPFLAGS += -I$(BF_OPENCOLLADA)/include/COLLADAStreamWriter
CPPFLAGS += -I$(BF_OPENCOLLADA)/include/COLLADASaxFrameworkLoader
diff --git a/source/blender/collada/SConscript b/source/blender/collada/SConscript
index b86e7312698..09402dcda64 100644
--- a/source/blender/collada/SConscript
+++ b/source/blender/collada/SConscript
@@ -14,7 +14,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) 2006, Blender Foundation
# All rights reserved.
@@ -28,6 +28,7 @@
Import ('env')
sources = env.Glob('*.cpp')
+defs = []
# relative paths to include dirs, space-separated, string
if env['OURPLATFORM']=='darwin':
@@ -35,5 +36,7 @@ if env['OURPLATFORM']=='darwin':
else:
incs = '../blenlib ../blenkernel ../windowmanager ../makesdna ../makesrna ../editors/include ../../../intern/guardedalloc [OPENCOLLADA]/COLLADAStreamWriter/include [OPENCOLLADA]/COLLADABaseUtils/include [OPENCOLLADA]/COLLADAFramework/include [OPENCOLLADA]/COLLADASaxFrameworkLoader/include '.replace('[OPENCOLLADA]', env['BF_OPENCOLLADA_INC'])
-env.BlenderLib ('bf_collada', sources, Split(incs), [], libtype='core', priority=200 )
+if env['BF_BUILDINFO']:
+ defs.append('NAN_BUILDINFO')
+env.BlenderLib ('bf_collada', sources, Split(incs), defs, libtype='core', priority=200 )
diff --git a/source/blender/editors/CMakeLists.txt b/source/blender/editors/CMakeLists.txt
index 86085aa0573..5d3cee9a7a5 100644
--- a/source/blender/editors/CMakeLists.txt
+++ b/source/blender/editors/CMakeLists.txt
@@ -15,83 +15,43 @@
# 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
- ../../../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_NOLIST(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/Makefile b/source/blender/editors/Makefile
index e259168a4ef..168d919e6de 100644
--- a/source/blender/editors/Makefile
+++ b/source/blender/editors/Makefile
@@ -17,7 +17,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) Blender Foundation.
# All rights reserved.
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/Makefile b/source/blender/editors/animation/Makefile
index a7f36aa58ac..f120091e917 100644
--- a/source/blender/editors/animation/Makefile
+++ b/source/blender/editors/animation/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/animation/anim_channels_defines.c b/source/blender/editors/animation/anim_channels_defines.c
index 1ce66ecf602..09fbdf2d70d 100644
--- a/source/blender/editors/animation/anim_channels_defines.c
+++ b/source/blender/editors/animation/anim_channels_defines.c
@@ -27,10 +27,6 @@
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
@@ -596,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 */
@@ -2338,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;
@@ -2840,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 */
@@ -2854,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)
@@ -2918,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);
}
}
@@ -2960,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 */
@@ -3188,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 4f8e09d3df9..e229de42006 100644
--- a/source/blender/editors/animation/anim_channels_edit.c
+++ b/source/blender/editors/animation/anim_channels_edit.c
@@ -25,10 +25,6 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
@@ -37,6 +33,7 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_key_types.h"
+#include "DNA_gpencil_types.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -846,7 +843,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;
}
@@ -943,7 +940,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 */
@@ -982,7 +979,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 */
@@ -1002,7 +999,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;
}
@@ -1042,7 +1039,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) {
@@ -1058,7 +1055,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) {
@@ -1079,7 +1076,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;
}
@@ -1117,11 +1114,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 */
@@ -1152,7 +1149,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;
}
@@ -1219,7 +1216,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);
@@ -1282,7 +1280,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;
}
@@ -1416,7 +1414,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;
}
@@ -1458,7 +1456,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;
}
@@ -1498,7 +1496,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;
}
@@ -1600,7 +1598,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;
}
@@ -1679,7 +1677,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:
@@ -1718,7 +1716,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;
@@ -1754,7 +1752,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;
@@ -1789,7 +1787,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:
@@ -1811,7 +1809,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:
@@ -1829,7 +1827,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:
@@ -1839,7 +1837,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:
diff --git a/source/blender/editors/animation/anim_deps.c b/source/blender/editors/animation/anim_deps.c
index 82575cf58fa..5312e97c604 100644
--- a/source/blender/editors/animation/anim_deps.c
+++ b/source/blender/editors/animation/anim_deps.c
@@ -90,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?
}
}
@@ -106,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 62f421de71c..f5f50e10bcb 100644
--- a/source/blender/editors/animation/anim_draw.c
+++ b/source/blender/editors/animation/anim_draw.c
@@ -232,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();
+ }
}
}
diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c
index 4f421e8e84b..0ff75c1cded 100644
--- a/source/blender/editors/animation/anim_filter.c
+++ b/source/blender/editors/animation/anim_filter.c
@@ -49,7 +49,6 @@
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
-#include "DNA_constraint_types.h"
#include "DNA_camera_types.h"
#include "DNA_lamp_types.h"
#include "DNA_lattice_types.h"
@@ -64,10 +63,13 @@
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_world_types.h"
+#include "DNA_gpencil_types.h"
+#include "DNA_object_types.h"
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_ghash.h"
#include "BKE_animsys.h"
#include "BKE_action.h"
@@ -79,7 +81,6 @@
#include "BKE_material.h"
#include "BKE_node.h"
#include "BKE_sequencer.h"
-#include "BKE_utildefines.h"
#include "ED_anim_api.h"
@@ -796,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;
@@ -813,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)
@@ -886,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;
}
@@ -945,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) {
@@ -1707,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? */
@@ -2104,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;
@@ -2512,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
@@ -2527,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 */
@@ -2572,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_markers.c b/source/blender/editors/animation/anim_markers.c
index d1c1fa64ad2..719b46738d3 100644
--- a/source/blender/editors/animation/anim_markers.c
+++ b/source/blender/editors/animation/anim_markers.c
@@ -1069,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) {
@@ -1110,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;
}
diff --git a/source/blender/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c
index 88d6051b23b..9570fd64433 100644
--- a/source/blender/editors/animation/anim_ops.c
+++ b/source/blender/editors/animation/anim_ops.c
@@ -69,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);
@@ -162,7 +163,7 @@ void ANIM_OT_change_frame(wmOperatorType *ot)
ot->poll= change_frame_poll;
/* flags */
- ot->flag= OPTYPE_BLOCKING;
+ ot->flag= OPTYPE_BLOCKING|OPTYPE_UNDO;
/* rna */
RNA_def_int(ot->srna, "frame", 0, MINAFRAME, MAXFRAME, "Frame", "", MINAFRAME, MAXFRAME);
diff --git a/source/blender/editors/animation/drivers.c b/source/blender/editors/animation/drivers.c
index 5024ca39970..9edcf637cdc 100644
--- a/source/blender/editors/animation/drivers.c
+++ b/source/blender/editors/animation/drivers.c
@@ -197,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;
}
/* ************************************************** */
@@ -374,7 +389,7 @@ static int add_driver_button_exec (bContext *C, wmOperator *op)
if (success) {
/* send updates */
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(CTX_data_main(C), 0);
WM_event_add_notifier(C, NC_ANIMATION|ND_FCURVES_ORDER, NULL); // XXX
}
@@ -408,36 +423,24 @@ 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<length; a++)
- success+= ANIM_remove_driver(ptr.id.data, path, index+a, 0);
-
- MEM_freeN(path);
- }
+ success= ANIM_remove_driver(ptr.id.data, path, index, 0);
+ MEM_freeN(path);
}
-
if (success) {
/* send updates */
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(CTX_data_main(C), 0);
WM_event_add_notifier(C, NC_ANIMATION|ND_FCURVES_ORDER, NULL); // XXX
}
diff --git a/source/blender/editors/animation/fmodifier_ui.c b/source/blender/editors/animation/fmodifier_ui.c
index 3bd8b50c889..191316711f4 100644
--- a/source/blender/editors/animation/fmodifier_ui.c
+++ b/source/blender/editors/animation/fmodifier_ui.c
@@ -95,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);
}
/* --------------- */
@@ -119,7 +119,7 @@ static void draw_modifier__generator(uiLayout *layout, ID *id, FModifier *fcm, s
but= uiDefButR(block, MENU, B_FMODIFIER_REDRAW, NULL, 0, 0, width-30, UI_UNIT_Y, &ptr, "mode", -1, 0, 0, -1, -1, NULL);
uiButSetFunc(but, validate_fmodifier_cb, fcm, NULL);
- uiDefButR(block, TOG, B_FMODIFIER_REDRAW, NULL, 0, 0, width-30, UI_UNIT_Y, &ptr, "additive", -1, 0, 0, -1, -1, NULL);
+ uiDefButR(block, TOG, B_FMODIFIER_REDRAW, NULL, 0, 0, width-30, UI_UNIT_Y, &ptr, "use_additive", -1, 0, 0, -1, -1, NULL);
uiBlockEndAlign(block);
/* now add settings for individual modes */
@@ -226,7 +226,7 @@ static void draw_modifier__fn_generator(uiLayout *layout, ID *id, FModifier *fcm
/* add the settings */
col= uiLayoutColumn(layout, 1);
uiItemR(col, &ptr, "function_type", 0, "", 0);
- uiItemR(col, &ptr, "additive", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(col, &ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, 0);
col= uiLayoutColumn(layout, 0); // no grouping for now
uiItemR(col, &ptr, "amplitude", 0, NULL, 0);
@@ -254,14 +254,14 @@ static void draw_modifier__cycles(uiLayout *layout, ID *id, FModifier *fcm, shor
/* before range */
col= uiLayoutColumn(split, 1);
uiItemL(col, "Before:", 0);
- uiItemR(col, &ptr, "before_mode", 0, "", 0);
- uiItemR(col, &ptr, "before_cycles", 0, NULL, 0);
+ uiItemR(col, &ptr, "mode_before", 0, "", 0);
+ uiItemR(col, &ptr, "cycles_before", 0, NULL, 0);
/* after range */
col= uiLayoutColumn(split, 1);
uiItemL(col, "After:", 0);
- uiItemR(col, &ptr, "after_mode", 0, "", 0);
- uiItemR(col, &ptr, "after_cycles", 0, NULL, 0);
+ uiItemR(col, &ptr, "mode_after", 0, "", 0);
+ uiItemR(col, &ptr, "cycles_after", 0, NULL, 0);
}
/* --------------- */
@@ -276,14 +276,14 @@ static void draw_modifier__noise(uiLayout *layout, ID *id, FModifier *fcm, short
RNA_pointer_create(id, &RNA_FModifierNoise, fcm, &ptr);
/* blending mode */
- uiItemR(layout, &ptr, "modification", 0, NULL, 0);
+ uiItemR(layout, &ptr, "blend_type", 0, NULL, 0);
/* split into 2 columns */
split= uiLayoutSplit(layout, 0.5f, 0);
/* col 1 */
col= uiLayoutColumn(split, 0);
- uiItemR(col, &ptr, "size", 0, NULL, 0);
+ uiItemR(col, &ptr, "scale", 0, NULL, 0);
uiItemR(col, &ptr, "strength", 0, NULL, 0);
/* col 2 */
@@ -473,8 +473,8 @@ static void draw_modifier__envelope(uiLayout *layout, ID *id, FModifier *fcm, sh
uiItemR(col, &ptr, "reference_value", 0, NULL, 0);
row= uiLayoutRow(col, 1);
- uiItemR(row, &ptr, "default_minimum", 0, "Min", 0);
- uiItemR(row, &ptr, "default_maximum", 0, "Max", 0);
+ uiItemR(row, &ptr, "default_min", 0, "Min", 0);
+ uiItemR(row, &ptr, "default_max", 0, "Max", 0);
/* control points header */
// TODO: move this control-point control stuff to using the new special widgets for lists
@@ -526,13 +526,13 @@ static void draw_modifier__limits(uiLayout *layout, ID *id, FModifier *fcm, shor
/* x-minimum */
col= uiLayoutColumn(split, 1);
- uiItemR(col, &ptr, "use_minimum_x", 0, NULL, 0);
- uiItemR(col, &ptr, "minimum_x", 0, NULL, 0);
+ uiItemR(col, &ptr, "use_min_x", 0, NULL, 0);
+ uiItemR(col, &ptr, "min_x", 0, NULL, 0);
/* y-minimum*/
col= uiLayoutColumn(split, 1);
- uiItemR(col, &ptr, "use_minimum_y", 0, NULL, 0);
- uiItemR(col, &ptr, "minimum_y", 0, NULL, 0);
+ uiItemR(col, &ptr, "use_min_y", 0, NULL, 0);
+ uiItemR(col, &ptr, "min_y", 0, NULL, 0);
}
/* row 2: maximum */
@@ -544,13 +544,13 @@ static void draw_modifier__limits(uiLayout *layout, ID *id, FModifier *fcm, shor
/* x-minimum */
col= uiLayoutColumn(split, 1);
- uiItemR(col, &ptr, "use_maximum_x", 0, NULL, 0);
- uiItemR(col, &ptr, "maximum_x", 0, NULL, 0);
+ uiItemR(col, &ptr, "use_max_x", 0, NULL, 0);
+ uiItemR(col, &ptr, "max_x", 0, NULL, 0);
/* y-minimum*/
col= uiLayoutColumn(split, 1);
- uiItemR(col, &ptr, "use_maximum_y", 0, NULL, 0);
- uiItemR(col, &ptr, "maximum_y", 0, NULL, 0);
+ uiItemR(col, &ptr, "use_max_y", 0, NULL, 0);
+ uiItemR(col, &ptr, "max_y", 0, NULL, 0);
}
}
@@ -567,8 +567,8 @@ static void draw_modifier__stepped(uiLayout *layout, ID *id, FModifier *fcm, sho
/* block 1: "stepping" settings */
col= uiLayoutColumn(layout, 0);
- uiItemR(col, &ptr, "step_size", 0, NULL, 0);
- uiItemR(col, &ptr, "offset", 0, NULL, 0);
+ uiItemR(col, &ptr, "frame_step", 0, NULL, 0);
+ uiItemR(col, &ptr, "frame_offset", 0, NULL, 0);
/* block 2: start range settings */
col= uiLayoutColumn(layout, 1);
@@ -616,7 +616,7 @@ void ANIM_uiTemplate_fmodifier_draw (uiLayout *layout, ID *id, ListBase *modifie
uiBlockSetEmboss(block, UI_EMBOSSN);
/* expand */
- uiItemR(subrow, &ptr, "expanded", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(subrow, &ptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", 0);
/* checkbox for 'active' status (for now) */
uiItemR(subrow, &ptr, "active", UI_ITEM_R_ICON_ONLY, "", 0);
@@ -633,7 +633,7 @@ void ANIM_uiTemplate_fmodifier_draw (uiLayout *layout, ID *id, ListBase *modifie
/* 'mute' button */
- uiItemR(subrow, &ptr, "muted", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(subrow, &ptr, "mute", UI_ITEM_R_ICON_ONLY, "", 0);
uiBlockSetEmboss(block, UI_EMBOSSN);
diff --git a/source/blender/editors/animation/keyframes_draw.c b/source/blender/editors/animation/keyframes_draw.c
index 32e5e0b2bdb..02e141a7a69 100644
--- a/source/blender/editors/animation/keyframes_draw.c
+++ b/source/blender/editors/animation/keyframes_draw.c
@@ -34,10 +34,6 @@
#include <string.h>
#include <float.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
@@ -57,19 +53,14 @@
#include "DNA_node_types.h"
#include "DNA_particle_types.h"
#include "DNA_world_types.h"
+#include "DNA_gpencil_types.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_global.h" // XXX remove me!
-#include "BKE_context.h"
#include "BKE_utildefines.h"
#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "UI_resources.h"
#include "UI_view2d.h"
@@ -244,7 +235,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 {
@@ -287,7 +278,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 3175e9e34a7..17d674784f8 100644
--- a/source/blender/editors/animation/keyframes_edit.c
+++ b/source/blender/editors/animation/keyframes_edit.c
@@ -48,7 +48,6 @@
#include "DNA_scene_types.h"
#include "DNA_world_types.h"
-#include "BKE_action.h"
#include "BKE_fcurve.h"
#include "BKE_key.h"
#include "BKE_material.h"
diff --git a/source/blender/editors/animation/keyframes_general.c b/source/blender/editors/animation/keyframes_general.c
index abced485769..5073cfe08b8 100644
--- a/source/blender/editors/animation/keyframes_general.c
+++ b/source/blender/editors/animation/keyframes_general.c
@@ -40,9 +40,7 @@
#include "DNA_scene_types.h"
-#include "BKE_action.h"
#include "BKE_fcurve.h"
-#include "BKE_key.h"
#include "BKE_utildefines.h"
#include "ED_anim_api.h"
diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c
index 669a1042998..fc5649be869 100644
--- a/source/blender/editors/animation/keyframing.c
+++ b/source/blender/editors/animation/keyframing.c
@@ -45,15 +45,16 @@
#include "DNA_key_types.h"
#include "DNA_material_types.h"
#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_constraint.h"
#include "BKE_depsgraph.h"
#include "BKE_fcurve.h"
+#include "BKE_main.h"
#include "BKE_nla.h"
#include "BKE_global.h"
-#include "BKE_utildefines.h"
#include "BKE_context.h"
#include "BKE_report.h"
#include "BKE_key.h"
@@ -130,8 +131,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;
@@ -814,15 +818,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 : "<Missing ID-Block>", rna_path);
return 0;
}
@@ -919,7 +929,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);
@@ -1033,9 +1043,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 */
@@ -1047,6 +1061,7 @@ static int modify_key_op_poll(bContext *C)
static int insert_key_exec (bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
KeyingSet *ks= NULL;
int type= RNA_int_get(op->ptr, "type");
@@ -1087,19 +1102,21 @@ static int insert_key_exec (bContext *C, wmOperator *op)
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");
/* send updates */
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 0);
return OPERATOR_FINISHED;
}
void ANIM_OT_keyframe_insert (wmOperatorType *ot)
{
+ PropertyRNA *prop;
+
/* identifiers */
ot->name= "Insert Keyframe";
ot->idname= "ANIM_OT_keyframe_insert";
@@ -1115,11 +1132,13 @@ 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) ------------------------ */
@@ -1148,6 +1167,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";
@@ -1163,23 +1184,27 @@ 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)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
KeyingSet *ks= NULL;
int type= RNA_int_get(op->ptr, "type");
@@ -1220,13 +1245,13 @@ static int delete_key_exec (bContext *C, wmOperator *op)
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");
/* send updates */
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 0);
return OPERATOR_FINISHED;
}
@@ -1265,6 +1290,7 @@ void ANIM_OT_keyframe_delete (wmOperatorType *ot)
static int delete_key_v3d_exec (bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
float cfra= (float)CFRA; // XXX for now, don't bother about all the yucky offset crap
@@ -1293,7 +1319,7 @@ static int delete_key_v3d_exec (bContext *C, wmOperator *op)
CTX_DATA_END;
/* send updates */
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, NULL);
@@ -1321,6 +1347,7 @@ void ANIM_OT_keyframe_delete_v3d (wmOperatorType *ot)
static int insert_key_button_exec (bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
PointerRNA ptr;
PropertyRNA *prop= NULL;
@@ -1378,10 +1405,10 @@ static int insert_key_button_exec (bContext *C, wmOperator *op)
if (success) {
/* send updates */
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 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;
@@ -1408,6 +1435,7 @@ void ANIM_OT_keyframe_insert_button (wmOperatorType *ot)
static int delete_key_button_exec (bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
PointerRNA ptr;
PropertyRNA *prop= NULL;
@@ -1448,10 +1476,10 @@ static int delete_key_button_exec (bContext *C, wmOperator *op)
if (success) {
/* send updates */
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 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 f0f35b852bb..ab236de9ac5 100644
--- a/source/blender/editors/animation/keyingsets.c
+++ b/source/blender/editors/animation/keyingsets.c
@@ -40,20 +40,14 @@
#include "BLI_dynstr.h"
#include "DNA_anim_types.h"
-#include "DNA_constraint_types.h"
#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+#include "BKE_main.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"
-#include "BKE_utildefines.h"
-#include "BKE_context.h"
#include "BKE_report.h"
-#include "BKE_key.h"
-#include "BKE_material.h"
#include "ED_keyframing.h"
#include "ED_screen.h"
@@ -164,6 +158,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);
@@ -284,6 +282,7 @@ void ANIM_OT_keying_set_path_remove (wmOperatorType *ot)
static int add_keyingset_button_exec (bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
KeyingSet *ks = NULL;
PropertyRNA *prop= NULL;
@@ -315,6 +314,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);
@@ -350,7 +353,7 @@ static int add_keyingset_button_exec (bContext *C, wmOperator *op)
if (success) {
/* send updates */
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 0);
/* for now, only send ND_KEYS for KeyingSets */
WM_event_add_notifier(C, NC_SCENE|ND_KEYINGSET, NULL);
@@ -380,6 +383,7 @@ void ANIM_OT_keyingset_button_add (wmOperatorType *ot)
static int remove_keyingset_button_exec (bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
KeyingSet *ks = NULL;
PropertyRNA *prop= NULL;
@@ -396,6 +400,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);
@@ -428,7 +436,7 @@ static int remove_keyingset_button_exec (bContext *C, wmOperator *op)
if (success) {
/* send updates */
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 0);
/* for now, only send ND_KEYS for KeyingSets */
WM_event_add_notifier(C, NC_SCENE|ND_KEYINGSET, NULL);
@@ -514,20 +522,12 @@ ListBase builtin_keyingsets = {NULL, NULL};
/* Find KeyingSet type info given a name */
KeyingSetInfo *ANIM_keyingset_info_find_named (const char name[])
{
- KeyingSetInfo *ksi;
-
/* 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;
+ return BLI_findstring(&keyingset_type_infos, name, offsetof(KeyingSetInfo, idname));
}
/* Find builtin KeyingSet by name */
@@ -577,7 +577,7 @@ void ANIM_keyingset_info_register (const bContext *C, KeyingSetInfo *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);
+ Main *bmain= CTX_data_main(C);
KeyingSet *ks, *ksn;
/* find relevant builtin KeyingSets which use this, and remove them */
@@ -588,8 +588,14 @@ void ANIM_keyingset_info_unregister (const bContext *C, KeyingSetInfo *ksi)
/* remove if matching typeinfo name */
if (strcmp(ks->typeinfo, ksi->idname) == 0) {
+ Scene *scene;
BKE_keyingset_free(ks);
- BLI_freelinkN(&scene->keyingsets, ks);
+ BLI_remlink(&builtin_keyingsets, ks);
+
+ for(scene= bmain->scene.first; scene; scene= scene->id.next)
+ BLI_remlink_safe(&scene->keyingsets, ks);
+
+ MEM_freeN(ks);
}
}
@@ -906,13 +912,13 @@ int ANIM_apply_keyingset (bContext *C, ListBase *dsources, bAction *act, KeyingS
{
Object *ob= (Object *)ksp->id;
- ob->recalc |= OB_RECALC;
+ ob->recalc |= OB_RECALC_ALL; // XXX: only object transforms only?
}
break;
}
/* send notifiers for updates (this doesn't require context to work!) */
- WM_main_add_notifier(NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
+ 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..707ceb55246 100644
--- a/source/blender/editors/armature/Makefile
+++ b/source/blender/editors/armature/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) 2007 Blender Foundation
# All rights reserved.
@@ -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/SConscript b/source/blender/editors/armature/SConscript
index fd4b885b730..33e237a14db 100644
--- a/source/blender/editors/armature/SConscript
+++ b/source/blender/editors/armature/SConscript
@@ -5,7 +5,6 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
-incs += ' ../../render/extern/include'
incs += ' ../../gpu ../../makesrna #/intern/opennl/extern'
if env['OURPLATFORM'] == 'linux2':
diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h
index 099cfeddad7..fadb4f234d9 100644
--- a/source/blender/editors/armature/armature_intern.h
+++ b/source/blender/editors/armature/armature_intern.h
@@ -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 4384e2c5f98..d5bd09cc8f1 100644
--- a/source/blender/editors/armature/armature_ops.c
+++ b/source/blender/editors/armature/armature_ops.c
@@ -29,15 +29,11 @@
#include <stdlib.h>
#include <math.h>
-#include "MEM_guardedalloc.h"
#include "BLI_math.h"
#include "BLI_blenlib.h"
-#include "BKE_context.h"
-#include "BKE_global.h"
-#include "BKE_utildefines.h"
#include "RNA_access.h"
@@ -96,6 +92,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 */
@@ -125,6 +122,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);
@@ -189,14 +188,15 @@ 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_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);
@@ -256,7 +256,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);
@@ -277,9 +277,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);
@@ -333,10 +333,10 @@ 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);
diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c
index 5f0c2e3d4be..174aadab687 100644
--- a/source/blender/editors/armature/editarmature.c
+++ b/source/blender/editors/armature/editarmature.c
@@ -27,11 +27,11 @@
#include <ctype.h>
#include <stdlib.h>
+#include <stddef.h>
#include <string.h>
#include <math.h>
#include <float.h>
-#include "MEM_guardedalloc.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -39,6 +39,8 @@
#include "DNA_meshdata_types.h"
#include "DNA_scene_types.h"
+#include "MEM_guardedalloc.h"
+
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_editVert.h"
@@ -58,11 +60,10 @@
#include "BKE_object.h"
#include "BKE_report.h"
#include "BKE_subsurf.h"
-#include "BKE_utildefines.h"
#include "BKE_modifier.h"
+#include "DNA_object_types.h"
#include "BIF_gl.h"
-#include "BIF_generate.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -88,7 +89,6 @@
#endif
/* ************* XXX *************** */
-static int okee() {return 0;}
static void BIF_undo_push(const char *msg) {}
/* ************* XXX *************** */
@@ -140,7 +140,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;
@@ -422,81 +422,81 @@ void ED_armature_apply_transform(Object *ob, float mat[4][4])
/* exported for use in editors/object/ */
/* 0 == do center, 1 == center new, 2 == center cursor */
-void docenter_armature (Scene *scene, View3D *v3d, Object *ob, int centermode)
+void docenter_armature (Scene *scene, Object *ob, float cursor[3], int centermode, int around)
{
Object *obedit= scene->obedit; // XXX get from context
EditBone *ebone;
bArmature *arm= ob->data;
- float cent[3] = {0.0f, 0.0f, 0.0f};
- float min[3], max[3];
- float omat[3][3];
+ float cent[3];
/* Put the armature into editmode */
- if(ob!=obedit)
+ if(ob != obedit) {
ED_armature_to_edit(ob);
+ obedit= NULL; /* we cant use this so behave as if there is no obedit */
+ }
/* Find the centerpoint */
if (centermode == 2) {
- float *fp= give_cursor(scene, v3d);
- VECCOPY(cent, fp);
+ copy_v3_v3(cent, cursor);
invert_m4_m4(ob->imat, ob->obmat);
mul_m4_v3(ob->imat, cent);
}
else {
- INIT_MINMAX(min, max);
-
- for (ebone= arm->edbo->first; ebone; ebone=ebone->next) {
- DO_MINMAX(ebone->head, min, max);
- DO_MINMAX(ebone->tail, min, max);
+ if(around==V3D_CENTROID) {
+ int total= 0;
+ zero_v3(cent);
+ for (ebone= arm->edbo->first; ebone; ebone=ebone->next) {
+ total+=2;
+ add_v3_v3(cent, ebone->head);
+ add_v3_v3(cent, ebone->tail);
+ }
+ mul_v3_fl(cent, 1.0f/(float)total);
+ }
+ else {
+ float min[3], max[3];
+ INIT_MINMAX(min, max);
+ for (ebone= arm->edbo->first; ebone; ebone=ebone->next) {
+ DO_MINMAX(ebone->head, min, max);
+ DO_MINMAX(ebone->tail, min, max);
+ }
+ mid_v3_v3v3(cent, min, max);
}
-
- cent[0]= (min[0] + max[0]) / 2.0f;
- cent[1]= (min[1] + max[1]) / 2.0f;
- cent[2]= (min[2] + max[2]) / 2.0f;
}
/* 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 */
- ED_armature_from_edit(ob);
-
+ if(obedit==NULL) {
+ ED_armature_from_edit(ob);
+ ED_armature_edit_free(ob);
+ }
+
/* Adjust object location for new centerpoint */
if(centermode && obedit==NULL) {
- 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];
+ mul_mat3_m4_v3(ob->obmat, cent); /* ommit translation part */
+ add_v3_v3(ob->loc, cent);
}
- else
- ED_armature_edit_free(ob);
}
/* ---------------------- */
-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;
-
- for (eBone=edbo->first; eBone; eBone=eBone->next) {
- if (!strcmp(name, eBone->name))
- return eBone;
- }
- return NULL;
+ return BLI_findstring(edbo, name, offsetof(EditBone, name));
}
/* note: there's a unique_bone_name() too! */
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);
@@ -804,6 +804,7 @@ static void joined_armature_fix_links(Object *tarArm, Object *srcArm, bPoseChann
/* join armature exec is exported for use in object->join objects operator... */
int join_armature_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
bArmature *arm= (ob)? ob->data: NULL;
@@ -896,12 +897,12 @@ int join_armature_exec(bContext *C, wmOperator *op)
free_pose_channels_hash(pose);
}
- ED_base_object_free_and_unlink(scene, base);
+ ED_base_object_free_and_unlink(bmain, scene, base);
}
}
CTX_DATA_END;
- DAG_scene_sort(scene); // because we removed object(s)
+ DAG_scene_sort(bmain, scene); // because we removed object(s)
ED_armature_from_edit(ob);
ED_armature_edit_free(ob);
@@ -1113,6 +1114,7 @@ static void separate_armature_bones (Scene *scene, Object *ob, short sel)
/* separate selected bones into their armature */
static int separate_armature_exec (bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
Object *oldob, *newob;
@@ -1153,7 +1155,7 @@ static int separate_armature_exec (bContext *C, wmOperator *op)
ED_armature_edit_free(obedit);
/* 2) duplicate base */
- newbase= ED_object_add_duplicate(scene, oldbase, USER_DUP_ARM); /* only duplicate linked armature */
+ newbase= ED_object_add_duplicate(bmain, scene, oldbase, USER_DUP_ARM); /* only duplicate linked armature */
newob= newbase->object;
newbase->flag &= ~SELECT;
@@ -1754,9 +1756,8 @@ EditBone *ED_armature_bone_get_mirrored(ListBase *edbo, EditBone *ebo)
if (ebo == NULL)
return NULL;
-
- BLI_strncpy(name, ebo->name, sizeof(name));
- bone_flip_name(name, 0); // 0 = don't strip off number extensions
+
+ flip_side_name(name, ebo->name, FALSE);
for (eboflip= edbo->first; eboflip; eboflip=eboflip->next) {
if (ebo != eboflip) {
@@ -1927,10 +1928,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");
- }
}
@@ -2029,21 +2026,11 @@ void ED_armature_edit_free(struct Object *ob)
BLI_freelistN(arm->edbo);
}
-
MEM_freeN(arm->edbo);
arm->edbo= NULL;
}
}
-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)
{
@@ -2343,12 +2330,10 @@ void add_primitive_bone(Scene *scene, View3D *v3d, RegionView3D *rv3d)
Object *obedit= scene->obedit; // XXX get from context
float obmat[3][3], curs[3], viewmat[3][3], totmat[3][3], imat[3][3];
EditBone *bone;
-
- VECCOPY(curs, give_cursor(scene, v3d));
/* Get inverse point for head and orientation for tail */
invert_m4_m4(obedit->imat, obedit->obmat);
- mul_m4_v3(obedit->imat, curs);
+ mul_v3_m4v3(curs, obedit->imat, give_cursor(scene, v3d));
if (rv3d && (U.flag & USER_ADD_VIEWALIGNED))
copy_m3_m4(obmat, rv3d->viewmat);
@@ -2363,7 +2348,7 @@ void add_primitive_bone(Scene *scene, View3D *v3d, RegionView3D *rv3d)
/* Create a bone */
bone= ED_armature_edit_bone_add(obedit->data, "Bone");
- VECCOPY(bone->head, curs);
+ copy_v3_v3(bone->head, curs);
if (rv3d && (U.flag & USER_ADD_VIEWALIGNED))
add_v3_v3v3(bone->tail, bone->head, imat[1]); // bone with unit length 1
@@ -2956,17 +2941,14 @@ static int armature_fill_bones_exec (bContext *C, wmOperator *op)
}
else if (count == 1) {
EditBonePoint *ebp;
- float *fp, curs[3];
+ float curs[3];
/* Get Points - selected joint */
ebp= (EditBonePoint *)points.first;
/* Get points - cursor (tail) */
- fp= give_cursor(scene, v3d);
- VECCOPY (curs, fp);
-
invert_m4_m4(obedit->imat, obedit->obmat);
- mul_m4_v3(obedit->imat, curs);
+ mul_v3_m4v3(curs, obedit->imat, give_cursor(scene, v3d));
/* Create a bone */
newbone= add_points_bone(obedit, ebp->vec, curs);
@@ -2994,15 +2976,13 @@ static int armature_fill_bones_exec (bContext *C, wmOperator *op)
/* find which one should be the 'head' */
if ((ebp->head_owner && ebp2->head_owner) || (ebp->tail_owner && ebp2->tail_owner)) {
/* rule: whichever one is closer to 3d-cursor */
- float curs[3], *fp= give_cursor(scene, v3d);
+ float curs[3];
float vecA[3], vecB[3];
float distA, distB;
/* get cursor location */
- VECCOPY(curs, fp);
-
invert_m4_m4(obedit->imat, obedit->obmat);
- mul_m4_v3(obedit->imat, curs);
+ mul_v3_m4v3(curs, obedit->imat, give_cursor(scene, v3d));
/* get distances */
sub_v3_v3v3(vecA, ebp->vec, curs);
@@ -3022,12 +3002,12 @@ static int armature_fill_bones_exec (bContext *C, wmOperator *op)
/* assign head/tail combinations */
if (headtail == 2) {
- VECCOPY(head, ebp->vec);
- VECCOPY(tail, ebp2->vec);
+ copy_v3_v3(head, ebp->vec);
+ copy_v3_v3(tail, ebp2->vec);
}
else if (headtail == 1) {
- VECCOPY(head, ebp2->vec);
- VECCOPY(tail, ebp->vec);
+ copy_v3_v3(head, ebp2->vec);
+ copy_v3_v3(tail, ebp->vec);
}
/* add new bone and parent it to the appropriate end */
@@ -3110,16 +3090,16 @@ static void bones_merge(Object *obedit, EditBone *start, EditBone *end, EditBone
* - parent = parent of start
*/
if ((start->flag & BONE_TIPSEL) && ((start->flag & BONE_SELECTED) || start==arm->act_edbone)==0) {
- VECCOPY(head, start->tail);
+ copy_v3_v3(head, start->tail);
}
else {
- VECCOPY(head, start->head);
+ copy_v3_v3(head, start->head);
}
if ((end->flag & BONE_ROOTSEL) && ((end->flag & BONE_SELECTED) || end==arm->act_edbone)==0) {
- VECCOPY(tail, end->head);
+ copy_v3_v3(tail, end->head);
}
else {
- VECCOPY(tail, end->tail);
+ copy_v3_v3(tail, end->tail);
}
newbone= add_points_bone(obedit, head, tail);
newbone->parent = start->parent;
@@ -3391,8 +3371,8 @@ static int armature_extrude_exec(bContext *C, wmOperator *op)
newbone = MEM_callocN(sizeof(EditBone), "extrudebone");
if (do_extrude==1) {
- VECCOPY (newbone->head, ebone->tail);
- VECCOPY (newbone->tail, newbone->head);
+ copy_v3_v3(newbone->head, ebone->tail);
+ copy_v3_v3(newbone->tail, newbone->head);
newbone->parent = ebone;
newbone->flag = ebone->flag & BONE_TIPSEL; // copies it, in case mirrored bone
@@ -3400,8 +3380,8 @@ static int armature_extrude_exec(bContext *C, wmOperator *op)
if (newbone->parent) newbone->flag |= BONE_CONNECTED;
}
else {
- VECCOPY(newbone->head, ebone->head);
- VECCOPY(newbone->tail, ebone->head);
+ copy_v3_v3(newbone->head, ebone->head);
+ copy_v3_v3(newbone->tail, ebone->head);
newbone->parent= ebone->parent;
newbone->flag= BONE_TIPSEL;
@@ -3491,7 +3471,7 @@ static int armature_bone_primitive_add_exec(bContext *C, wmOperator *op)
RNA_string_get(op->ptr, "name", name);
- VECCOPY(curs, give_cursor(CTX_data_scene(C),CTX_wm_view3d(C)));
+ copy_v3_v3(curs, give_cursor(CTX_data_scene(C),CTX_wm_view3d(C)));
/* Get inverse point for head and orientation for tail */
invert_m4_m4(obedit->imat, obedit->obmat);
@@ -3510,7 +3490,7 @@ static int armature_bone_primitive_add_exec(bContext *C, wmOperator *op)
/* Create a bone */
bone= ED_armature_edit_bone_add(obedit->data, name);
- VECCOPY(bone->head, curs);
+ copy_v3_v3(bone->head, curs);
if(rv3d && (U.flag & USER_ADD_VIEWALIGNED))
add_v3_v3v3(bone->tail, bone->head, imat[1]); // bone with unit length 1
@@ -3580,17 +3560,17 @@ static int armature_subdivide_exec(bContext *C, wmOperator *op)
BLI_addtail(arm->edbo, newbone);
/* calculate location of newbone->head */
- VECCOPY(val1, ebone->head);
- VECCOPY(val2, ebone->tail);
- VECCOPY(val3, newbone->head);
+ copy_v3_v3(val1, ebone->head);
+ copy_v3_v3(val2, ebone->tail);
+ copy_v3_v3(val3, newbone->head);
val3[0]= val1[0]*cutratio + val2[0]*cutratioI;
val3[1]= val1[1]*cutratio + val2[1]*cutratioI;
val3[2]= val1[2]*cutratio + val2[2]*cutratioI;
- VECCOPY(newbone->head, val3);
- VECCOPY(newbone->tail, ebone->tail);
- VECCOPY(ebone->tail, newbone->head);
+ copy_v3_v3(newbone->head, val3);
+ copy_v3_v3(newbone->tail, ebone->tail);
+ copy_v3_v3(ebone->tail, newbone->head);
newbone->rad_head= 0.5f * (ebone->rad_head + ebone->rad_tail);
ebone->rad_tail= newbone->rad_head;
@@ -3808,7 +3788,7 @@ void ARMATURE_OT_switch_direction(wmOperatorType *ot)
static void bone_connect_to_existing_parent(EditBone *bone)
{
bone->flag |= BONE_CONNECTED;
- VECCOPY(bone->head, bone->parent->tail);
+ copy_v3_v3(bone->head, bone->parent->tail);
bone->rad_head = bone->parent->rad_tail;
}
@@ -3836,10 +3816,10 @@ static void bone_connect_to_new_parent(ListBase *edbo, EditBone *selbone, EditBo
selbone->flag |= BONE_CONNECTED;
sub_v3_v3v3(offset, actbone->tail, selbone->head);
- VECCOPY(selbone->head, actbone->tail);
+ copy_v3_v3(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) {
@@ -3847,8 +3827,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;
}
}
@@ -4110,7 +4090,7 @@ void ARMATURE_OT_select_all(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "deselect all editbone";
+ ot->name= "Select or Deselect All";
ot->idname= "ARMATURE_OT_select_all";
/* api callbacks */
@@ -4218,8 +4198,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;
}
@@ -4609,7 +4589,7 @@ static void add_vgroups__mapFunc(void *userData, int index, float *co, float *no
/* DerivedMesh mapFunc for getting final coords in weight paint mode */
float (*verts)[3] = userData;
- VECCOPY(verts[index], co);
+ copy_v3_v3(verts[index], co);
}
static void envelope_bone_weighting(Object *ob, Mesh *mesh, float (*verts)[3], int numbones, Bone **bonelist, bDeformGroup **dgrouplist, bDeformGroup **dgroupflip, float (*root)[3], float (*tip)[3], int *selected, float scale)
@@ -4672,7 +4652,7 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
bArmature *arm= par->data;
Bone **bonelist, *bone;
bDeformGroup **dgrouplist, **dgroupflip;
- bDeformGroup *dgroup, *curdg;
+ bDeformGroup *dgroup;
bPoseChannel *pchan;
Mesh *mesh;
Mat4 *bbone = NULL;
@@ -4736,18 +4716,17 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
/* compute root and tip */
if (bbone) {
- VECCOPY(root[j], bbone[segments].mat[3]);
- mul_m4_v3(bone->arm_mat, root[j]);
+ mul_v3_m4v3(root[j], bone->arm_mat, bbone[segments].mat[3]);
if ((segments+1) < bone->segments) {
- VECCOPY(tip[j], bbone[segments+1].mat[3])
- mul_m4_v3(bone->arm_mat, tip[j]);
+ mul_v3_m4v3(tip[j], bone->arm_mat, bbone[segments+1].mat[3]);
+ }
+ else {
+ copy_v3_v3(tip[j], bone->arm_tail);
}
- else
- VECCOPY(tip[j], bone->arm_tail)
}
else {
- VECCOPY(root[j], bone->arm_head);
- VECCOPY(tip[j], bone->arm_tail);
+ copy_v3_v3(root[j], bone->arm_head);
+ copy_v3_v3(tip[j], bone->arm_tail);
}
mul_m4_v3(par->obmat, root[j]);
@@ -4764,17 +4743,10 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
/* find flipped group */
if (dgroup && mirror) {
char name[32];
-
- BLI_strncpy(name, dgroup->name, 32);
+
// 0 = don't strip off number extensions
- bone_flip_name(name, 0);
-
- for (curdg = ob->defbase.first; curdg; curdg=curdg->next) {
- if (!strcmp(curdg->name, name))
- break;
- }
-
- dgroupflip[j] = curdg;
+ flip_side_name(name, dgroup->name, FALSE);
+ dgroupflip[j] = defgroup_find_name(ob, name);
}
}
@@ -4804,7 +4776,7 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
/* transform verts to global space */
for (i=0; i < mesh->totvert; i++) {
if (!vertsfilled)
- VECCOPY(verts[i], mesh->mvert[i].co)
+ copy_v3_v3(verts[i], mesh->mvert[i].co);
mul_m4_v3(ob->obmat, verts[i]);
}
@@ -5042,14 +5014,14 @@ static int pose_clear_rot_exec(bContext *C, wmOperator *op)
float eul[3], oldeul[3], quat1[4] = {0};
if (pchan->rotmode == ROT_MODE_QUAT) {
- QUATCOPY(quat1, pchan->quat);
+ copy_qt_qt(quat1, pchan->quat);
quat_to_eul( oldeul,pchan->quat);
}
else if (pchan->rotmode == ROT_MODE_AXISANGLE) {
axis_angle_to_eulO( oldeul, EULER_ORDER_DEFAULT,pchan->rotAxis, pchan->rotAngle);
}
else {
- VECCOPY(oldeul, pchan->eul);
+ copy_v3_v3(oldeul, pchan->eul);
}
eul[0]= eul[1]= eul[2]= 0.0f;
@@ -5072,10 +5044,10 @@ static int pose_clear_rot_exec(bContext *C, wmOperator *op)
eulO_to_axis_angle( pchan->rotAxis, &pchan->rotAngle,eul, EULER_ORDER_DEFAULT);
}
else {
- VECCOPY(pchan->eul, eul);
+ copy_v3_v3(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;
@@ -5228,7 +5200,7 @@ void POSE_OT_select_all(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "deselect all bones";
+ ot->name= "Select or Deselect All";
ot->idname= "POSE_OT_select_all";
/* api callbacks */
@@ -5292,6 +5264,7 @@ static int hide_selected_pose_bone(Object *ob, Bone *bone, void *ptr)
if (arm->layer & bone->layer) {
if (bone->flag & BONE_SELECTED) {
bone->flag |= BONE_HIDDEN_P;
+ bone->flag &= ~BONE_SELECTED;
if(arm->act_bone==bone)
arm->act_bone= NULL;
}
@@ -5494,8 +5467,17 @@ void ED_armature_bone_rename(bArmature *arm, char *oldnamep, char *newnamep)
/* Rename the pose channel, if it exists */
if (ob->pose) {
bPoseChannel *pchan = get_pose_channel(ob->pose, oldname);
- if (pchan)
+ if (pchan) {
BLI_strncpy(pchan->name, newname, MAXBONENAME);
+
+ if (ob->pose->chanhash) {
+ GHash *gh = ob->pose->chanhash;
+
+ /* remove the old hash entry, and replace with the new name */
+ BLI_ghash_remove(gh, oldname, NULL, NULL);
+ BLI_ghash_insert(gh, pchan->name, pchan);
+ }
+ }
}
/* Update any object constraints to use the new bone name */
@@ -5521,11 +5503,9 @@ void ED_armature_bone_rename(bArmature *arm, char *oldnamep, char *newnamep)
}
if (modifiers_usesArmature(ob, arm)) {
- bDeformGroup *dg;
- /* bone name in defgroup */
- for (dg=ob->defbase.first; dg; dg=dg->next) {
- if (!strcmp(dg->name, oldname))
- BLI_strncpy(dg->name, newname, MAXBONENAME);
+ bDeformGroup *dg= defgroup_find_name(ob, oldname);
+ if(dg) {
+ BLI_strncpy(dg->name, newname, MAXBONENAME);
}
}
@@ -5554,8 +5534,7 @@ static int armature_flip_names_exec (bContext *C, wmOperator *op)
/* loop through selected bones, auto-naming them */
CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones)
{
- BLI_strncpy(newname, ebone->name, sizeof(newname));
- bone_flip_name(newname, 1); // 1 = do strip off number extensions
+ flip_side_name(newname, ebone->name, TRUE); // 1 = do strip off number extensions
ED_armature_bone_rename(arm, ebone->name, newname);
}
CTX_DATA_END;
@@ -5601,8 +5580,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;
@@ -5885,7 +5864,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 a7f79bb6ff3..1c9024f6f91 100644
--- a/source/blender/editors/armature/editarmature_generate.c
+++ b/source/blender/editors/armature/editarmature_generate.c
@@ -32,7 +32,6 @@
#include <math.h>
#include <float.h>
-#include "MEM_guardedalloc.h"
#include "DNA_scene_types.h"
#include "DNA_armature_types.h"
@@ -42,8 +41,6 @@
#include "BLI_graph.h"
#include "BKE_utildefines.h"
-#include "BKE_global.h"
-#include "BKE_context.h"
#include "ED_armature.h"
#include "armature_intern.h"
@@ -60,7 +57,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);
@@ -102,7 +99,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;
@@ -249,7 +246,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
{
@@ -265,7 +262,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 57224428476..637c6076314 100644
--- a/source/blender/editors/armature/editarmature_retarget.c
+++ b/source/blender/editors/armature/editarmature_retarget.c
@@ -29,10 +29,6 @@
#include <math.h>
#include <float.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "MEM_guardedalloc.h"
#include "PIL_time.h"
@@ -40,6 +36,7 @@
#include "DNA_armature_types.h"
#include "DNA_constraint_types.h"
#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
@@ -51,8 +48,6 @@
//#include "BDR_editobject.h"
-#include "BKE_global.h"
-#include "BKE_utildefines.h"
#include "BKE_constraint.h"
#include "BKE_armature.h"
#include "BKE_context.h"
@@ -320,8 +315,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;
@@ -565,7 +560,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 e9ad91c19e3..241301b8ee1 100644
--- a/source/blender/editors/armature/editarmature_sketch.c
+++ b/source/blender/editors/armature/editarmature_sketch.c
@@ -26,6 +26,7 @@
#include "MEM_guardedalloc.h"
+#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_armature_types.h"
@@ -37,11 +38,6 @@
#include "BLI_graph.h"
#include "BLI_ghash.h"
-#include "BKE_utildefines.h"
-#include "BKE_global.h"
-#include "BKE_DerivedMesh.h"
-#include "BKE_object.h"
-#include "BKE_anim.h"
#include "BKE_context.h"
#include "BKE_sketch.h"
@@ -168,7 +164,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 )
@@ -568,8 +564,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++)
@@ -607,7 +603,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);
}
}
@@ -1005,7 +1001,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 ;
}
@@ -1628,7 +1624,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);
@@ -2154,7 +2150,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;
@@ -2199,7 +2195,10 @@ void sk_selectStroke(bContext *C, SK_Sketch *sketch, short mval[2], int extend)
}
+ return 1;
}
+
+ return 0;
}
void sk_queueRedrawSketch(SK_Sketch *sketch)
@@ -2301,7 +2300,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] = {
@@ -2471,7 +2470,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));
}
}
@@ -2558,6 +2558,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);
@@ -2590,8 +2601,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;
@@ -2664,6 +2675,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);
@@ -2859,6 +2871,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 c5e96dd5fd4..84b02b4796a 100644
--- a/source/blender/editors/armature/meshlaplacian.c
+++ b/source/blender/editors/armature/meshlaplacian.c
@@ -36,7 +36,6 @@
#include "DNA_object_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
-#include "DNA_modifier_types.h"
#include "DNA_scene_types.h"
#include "BLI_math.h"
@@ -44,6 +43,7 @@
#include "BLI_memarena.h"
#include "BKE_DerivedMesh.h"
+#include "BKE_modifier.h"
#include "BKE_utildefines.h"
#ifdef RIGID_DEFORM
@@ -51,8 +51,6 @@
#include "BLI_polardecomp.h"
#endif
-#include "RE_raytrace.h"
-
#include "ONL_opennl.h"
#include "BLO_sys_types.h" // for intptr_t support
@@ -64,7 +62,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); }
@@ -106,8 +104,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;
@@ -395,29 +392,65 @@ float laplacian_system_get_solution(int v)
#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; a<totface; a++) {
-
MFace *mf = mface+a;
- RayFace *rayface = sys->heat.faces+a;
-
- 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);
+ float bb[6];
+
+ 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;
@@ -425,12 +458,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;
@@ -439,27 +474,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);
+
+ /* pass normalized vec + distance to bvh */
+ hit.index = -1;
+ hit.dist = normalize_v3(data.vec);
- visible= !RE_rayobject_raycast(sys->heat.raytree, &isec);
+ visible= BLI_bvhtree_ray_cast(sys->heat.bvhtree, data.start, data.vec, 0.0f, &hit, bvh_callback, (void*)&data) == -1;
return visible;
}
@@ -523,10 +555,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;
@@ -548,9 +578,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; a<sys->totvert; a++)
@@ -588,9 +618,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);
@@ -827,7 +856,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)
@@ -1051,11 +1080,19 @@ 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
@@ -1118,63 +1155,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; a<mdb->totcagevert; a++)
- DO_MINMAX(mdb->cagecos[a], min, max)
-
- MESHDEFORM_BIND= mdb;
-
- mface= mdb->cagedm->getFaceArray(mdb->cagedm);
- totface= mdb->cagedm->getNumFaces(mdb->cagedm);
-
- mdb->raytree= RE_ray_tree_create(64, totface, min, max,
- meshdeform_ray_coords_func, meshdeform_ray_check_func);
-
- for(a=0; a<totface; a++, mface++)
- RE_ray_tree_add_face(mdb->raytree, 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];
@@ -1213,7 +1194,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;
}
@@ -1226,7 +1207,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];
@@ -1234,21 +1215,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));
@@ -1766,7 +1741,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
@@ -1791,11 +1766,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; a<mdb->totvert; a++) {
copy_v3_v3(vec, mdb->vertexcos[a]);
@@ -1806,7 +1776,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; a<mdb->size3; a++)
@@ -1818,11 +1788,6 @@ static void harmonic_coordinates_bind(Scene *scene, MeshDeformModifierData *mmd,
for(x=0; x<mdb->size; 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);
@@ -1956,7 +1921,7 @@ static void heat_weighting_bind(Scene *scene, DerivedMesh *dm, MeshDeformModifie
}
#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;
@@ -1993,19 +1958,22 @@ void mesh_deform_bind(Scene *scene, DerivedMesh *dm, MeshDeformModifierData *mmd
#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; a<mdb.totcagevert; a++)
- mul_m4_v3(mmd->object->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 21b99bc10c0..8d8f1bf24ee 100644
--- a/source/blender/editors/armature/poseSlide.c
+++ b/source/blender/editors/armature/poseSlide.c
@@ -44,17 +44,10 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
-#include "BKE_animsys.h"
-#include "BKE_action.h"
-#include "BKE_armature.h"
-#include "BKE_depsgraph.h"
#include "BKE_fcurve.h"
-#include "BKE_object.h"
-#include "BKE_global.h"
#include "BKE_context.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -63,7 +56,6 @@
#include "WM_types.h"
-#include "BIF_gl.h"
#include "ED_armature.h"
#include "ED_keyframes_draw.h"
diff --git a/source/blender/editors/armature/poseUtils.c b/source/blender/editors/armature/poseUtils.c
index c9a80318050..b8b9c354d9a 100644
--- a/source/blender/editors/armature/poseUtils.c
+++ b/source/blender/editors/armature/poseUtils.c
@@ -44,17 +44,11 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
-#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_armature.h"
#include "BKE_depsgraph.h"
-#include "BKE_fcurve.h"
-#include "BKE_object.h"
-#include "BKE_global.h"
#include "BKE_context.h"
-#include "BKE_report.h"
-#include "BKE_utildefines.h"
#include "RNA_access.h"
@@ -62,7 +56,6 @@
#include "WM_types.h"
-#include "BIF_gl.h"
#include "ED_armature.h"
#include "ED_keyframing.h"
diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c
index e2ceb534066..f490158424c 100644
--- a/source/blender/editors/armature/poselib.c
+++ b/source/blender/editors/armature/poselib.c
@@ -48,13 +48,9 @@
#include "BKE_action.h"
#include "BKE_armature.h"
#include "BKE_depsgraph.h"
-#include "BKE_modifier.h"
-#include "BKE_object.h"
-#include "BKE_global.h"
#include "BKE_context.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -282,8 +278,16 @@ static void poselib_add_menu_invoke__replacemenu (bContext *C, uiLayout *layout,
uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
/* add each marker to this menu */
- for (marker= act->markers.first; marker; marker= marker->next)
- uiItemIntO(layout, marker->name, ICON_ARMATURE_DATA, "POSELIB_OT_pose_add", "frame", marker->frame);
+ for (marker= act->markers.first; marker; marker= marker->next) {
+ PointerRNA props_ptr;
+
+ props_ptr = uiItemFullO(layout, "POSELIB_OT_pose_add",
+ marker->name, ICON_ARMATURE_DATA, NULL,
+ WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+
+ RNA_int_set(&props_ptr, "frame", marker->frame);
+ RNA_string_set(&props_ptr, "name", marker->name);
+ }
}
static int poselib_add_menu_invoke (bContext *C, wmOperator *op, wmEvent *evt)
@@ -769,12 +773,19 @@ static void poselib_keytag_pose (bContext *C, Scene *scene, tPoseLib_PreviewData
if (pchan) {
if (autokeyframe_cfra_can_key(scene, &pld->ob->id)) {
ListBase dsources = {NULL, NULL};
+ KeyingSet *ks = NULL;
- /* get KeyingSet to use */
- // TODO: for getting the KeyingSet used, we should really check which channels were affected
- // TODO: this should get modified so that custom props are taken into account too!
+ /* 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 (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");
/* now insert the keyframe(s) using the Keying Set
* 1) add datasource override for the PoseChannel
@@ -782,7 +793,7 @@ static void poselib_keytag_pose (bContext *C, Scene *scene, tPoseLib_PreviewData
* 3) free the extra info
*/
ANIM_relative_keyingset_add_source(&dsources, &pld->ob->id, &RNA_PoseBone, pchan);
- ANIM_apply_keyingset(C, &dsources, NULL, poselib_ks_locrotscale, MODIFYKEY_MODE_INSERT, (float)CFRA);
+ ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
BLI_freelistN(&dsources);
/* clear any unkeyed tags */
@@ -799,7 +810,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 */
@@ -847,7 +858,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);
@@ -1483,6 +1494,8 @@ void POSELIB_OT_browse_interactive (wmOperatorType *ot)
/* properties */
// TODO: make the pose_index into a proper enum instead of a cryptic int...
ot->prop= RNA_def_int(ot->srna, "pose_index", -1, -2, INT_MAX, "Pose", "Index of the pose to apply (-2 for no change to pose, -1 for poselib active pose)", 0, INT_MAX);
- // XXX: percentage vs factor?
- RNA_def_float_factor(ot->srna, "blend_factor", 1.0f, 0.0f, 1.0f, "Blend Factor", "Amount that the pose is applied on top of the existing poses", 0.0f, 1.0f);
+
+ // XXX: percentage vs factor?
+ /* not used yet */
+ /* RNA_def_float_factor(ot->srna, "blend_factor", 1.0f, 0.0f, 1.0f, "Blend Factor", "Amount that the pose is applied on top of the existing poses", 0.0f, 1.0f); */
}
diff --git a/source/blender/editors/armature/poseobject.c b/source/blender/editors/armature/poseobject.c
index 102fbe2eafd..3bbbb271bda 100644
--- a/source/blender/editors/armature/poseobject.c
+++ b/source/blender/editors/armature/poseobject.c
@@ -41,26 +41,19 @@
#include "DNA_armature_types.h"
#include "DNA_constraint_types.h"
#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
#include "BKE_anim.h"
#include "BKE_idprop.h"
-#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_armature.h"
-#include "BKE_blender.h"
#include "BKE_context.h"
#include "BKE_constraint.h"
#include "BKE_deform.h"
#include "BKE_depsgraph.h"
-#include "BKE_displist.h"
-#include "BKE_fcurve.h"
-#include "BKE_global.h"
#include "BKE_modifier.h"
-#include "BKE_object.h"
-#include "BKE_utildefines.h"
#include "BKE_report.h"
-#include "BIF_gl.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -78,9 +71,9 @@
#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 */
@@ -691,7 +684,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;
@@ -800,7 +793,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;
@@ -892,15 +885,11 @@ 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 */
-
static int pose_paste_exec (bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
bPoseChannel *chan, *pchan;
- char name[32];
int flip= RNA_boolean_get(op->ptr, "flipped");
/* sanity checks */
@@ -916,10 +905,12 @@ static int pose_paste_exec (bContext *C, wmOperator *op)
for (chan= g_posebuf->chanbase.first; chan; chan=chan->next) {
if (chan->flag & POSE_KEY) {
/* get the name - if flipping, we must flip this first */
- BLI_strncpy(name, chan->name, sizeof(name));
+ char name[32];
if (flip)
- bone_flip_name(name, 0); /* 0 = don't strip off number extensions */
-
+ flip_side_name(name, chan->name, 0); /* 0 = don't strip off number extensions */
+ else
+ BLI_strncpy(name, chan->name, sizeof(name));
+
/* only copy when channel exists, poses are not meant to add random channels to anymore */
pchan= get_pose_channel(ob->pose, name);
@@ -937,6 +928,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);
}
@@ -979,13 +974,6 @@ static int pose_paste_exec (bContext *C, wmOperator *op)
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
}
else {
float eul[3];
@@ -997,25 +985,36 @@ static int pose_paste_exec (bContext *C, wmOperator *op)
}
}
- /* ID property */
- if (pchan->prop) {
- IDP_FreeProperty(pchan->prop);
- MEM_freeN(pchan->prop);
- pchan->prop= NULL;
+ /* 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);
}
- if (chan->prop)
- pchan->prop= IDP_CopyProperty(chan->prop);
-
/* keyframing tagging */
- if (autokeyframe_cfra_can_key(scene, &ob->id)) {
+ if (autokeyframe_cfra_can_key(scene, &ob->id)) {
ListBase dsources = {NULL, NULL};
+ KeyingSet *ks = NULL;
- /* get KeyingSet to use */
- // TODO: for getting the KeyingSet used, we should really check which channels were affected
- // TODO: this should get modified so that custom props are taken into account too!
- if (posePaste_ks_locrotscale == NULL)
- posePaste_ks_locrotscale= ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
+ /* 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
@@ -1023,7 +1022,7 @@ static int pose_paste_exec (bContext *C, wmOperator *op)
* 3) free the extra info
*/
ANIM_relative_keyingset_add_source(&dsources, &ob->id, &RNA_PoseBone, pchan);
- ANIM_apply_keyingset(C, &dsources, NULL, posePaste_ks_locrotscale, MODIFYKEY_MODE_INSERT, (float)CFRA);
+ ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
BLI_freelistN(&dsources);
/* clear any unkeyed tags */
@@ -1041,17 +1040,7 @@ static int pose_paste_exec (bContext *C, wmOperator *op)
/* Update event for pose and deformation children */
DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
-
- if (IS_AUTOKEY_ON(scene)) {
-// XXX remake_action_ipos(ob->action);
- }
- 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);
@@ -1242,8 +1231,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;
}
@@ -1285,7 +1274,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 */
@@ -1301,20 +1289,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);
@@ -1341,13 +1323,108 @@ 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)
{
Object *ob= CTX_data_active_object(C);
bArmature *arm;
- char newname[32];
/* paranoia checks */
if (ELEM(NULL, ob, ob->pose))
@@ -1357,8 +1434,8 @@ static int pose_flip_names_exec (bContext *C, wmOperator *op)
/* loop through selected bones, auto-naming them */
CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones)
{
- BLI_strncpy(newname, pchan->name, sizeof(newname));
- bone_flip_name(newname, 1); // 1 = do strip off number extensions
+ char newname[32];
+ flip_side_name(newname, pchan->name, TRUE);
ED_armature_bone_rename(arm, pchan->name, newname);
}
CTX_DATA_END;
@@ -1405,8 +1482,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;
@@ -1454,7 +1531,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)) {
@@ -1462,10 +1539,8 @@ void pose_activate_flipped_bone(Scene *scene)
if(arm->act_bone) {
char name[32];
-
- BLI_strncpy(name, arm->act_bone->name, 32);
- bone_flip_name(name, 1); // 0 = do not strip off number extensions
-
+ flip_side_name(name, arm->act_bone->name, TRUE);
+
pchanf= get_pose_channel(ob->pose, name);
if(pchanf && pchanf->bone != arm->act_bone) {
arm->act_bone->flag &= ~BONE_SELECTED;
@@ -1503,7 +1578,7 @@ static int pose_armature_layers_invoke (bContext *C, wmOperator *op, wmEvent *ev
/* get RNA pointer to armature data to use that to retrieve the layers as ints to init the operator */
RNA_id_pointer_create((ID *)arm, &ptr);
- RNA_boolean_get_array(&ptr, "layer", layers);
+ RNA_boolean_get_array(&ptr, "layers", layers);
RNA_boolean_set_array(op->ptr, "layers", layers);
/* part to sync with other similar operators... */
@@ -1523,7 +1598,7 @@ static int pose_armature_layers_exec (bContext *C, wmOperator *op)
/* get pointer for armature, and write data there... */
RNA_id_pointer_create((ID *)arm, &ptr);
- RNA_boolean_set_array(&ptr, "layer", layers);
+ RNA_boolean_set_array(&ptr, "layers", layers);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
@@ -1615,7 +1690,7 @@ static int pose_bone_layers_exec (bContext *C, wmOperator *op)
{
/* get pointer for pchan, and write flags this way */
RNA_pointer_create((ID *)arm, &RNA_Bone, pchan->bone, &ptr);
- RNA_boolean_set_array(&ptr, "layer", layers);
+ RNA_boolean_set_array(&ptr, "layers", layers);
}
CTX_DATA_END;
@@ -1689,7 +1764,7 @@ static int armature_bone_layers_exec (bContext *C, wmOperator *op)
{
/* get pointer for pchan, and write flags this way */
RNA_pointer_create((ID *)arm, &RNA_EditBone, ebone, &ptr);
- RNA_boolean_set_array(&ptr, "layer", layers);
+ RNA_boolean_set_array(&ptr, "layers", layers);
}
CTX_DATA_END;
diff --git a/source/blender/editors/armature/reeb.c b/source/blender/editors/armature/reeb.c
index 04bf5bce553..9602d80575a 100644
--- a/source/blender/editors/armature/reeb.c
+++ b/source/blender/editors/armature/reeb.c
@@ -31,14 +31,13 @@
#include <stdlib.h> // for qsort
#include <float.h>
-
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
-#include "BKE_context.h"
-
#include "MEM_guardedalloc.h"
+#include "BKE_context.h"
+
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_editVert.h"
@@ -51,11 +50,7 @@
//#include "BIF_interface.h"
//#include "BIF_toolbox.h"
//#include "BIF_graphics.h"
-#include "BIF_gl.h"
-#include "BKE_global.h"
-#include "BKE_utildefines.h"
-#include "BKE_customdata.h"
//#include "blendef.h"
@@ -348,7 +343,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 */
@@ -491,11 +486,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);
}
}
}
@@ -632,7 +627,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);
}
@@ -1103,7 +1098,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 */
@@ -1821,7 +1816,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
}
@@ -2440,7 +2435,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/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/Makefile b/source/blender/editors/curve/Makefile
index 6449700e50b..d9c51c7420e 100644
--- a/source/blender/editors/curve/Makefile
+++ b/source/blender/editors/curve/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/curve/curve_intern.h b/source/blender/editors/curve/curve_intern.h
index b423a53ce35..10c1bd84262 100644
--- a/source/blender/editors/curve/curve_intern.h
+++ b/source/blender/editors/curve/curve_intern.h
@@ -33,7 +33,7 @@
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 };
@@ -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 a72b7f68dab..b5b6ee4e6da 100644
--- a/source/blender/editors/curve/curve_ops.c
+++ b/source/blender/editors/curve/curve_ops.c
@@ -29,16 +29,12 @@
#include <stdlib.h>
#include <math.h>
-#include "MEM_guardedalloc.h"
#include "DNA_curve_types.h"
#include "BLI_math.h"
#include "BLI_blenlib.h"
-#include "BKE_context.h"
-#include "BKE_global.h"
-#include "BKE_utildefines.h"
#include "RNA_access.h"
@@ -81,6 +77,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);
@@ -96,7 +95,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);
@@ -111,7 +123,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);
@@ -131,9 +143,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);
@@ -179,8 +192,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);
@@ -216,6 +229,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, 2);
+ ED_object_generic_keymap(keyconf, keymap, 3);
}
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 2d3e1a295fa..44d3fdb2189 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -36,16 +36,18 @@
#include <io.h>
#endif
#include <stdlib.h>
+
+#include "DNA_key_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_dynstr.h"
#include "BLI_rand.h"
-
-#include "DNA_key_types.h"
-#include "DNA_object_types.h"
-#include "DNA_scene_types.h"
+#include "BLI_ghash.h"
#include "BKE_context.h"
#include "BKE_curve.h"
@@ -55,9 +57,7 @@
#include "BKE_key.h"
#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_object.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -69,12 +69,26 @@
#include "ED_types.h"
#include "ED_util.h"
#include "ED_view3d.h"
+#include "ED_curve.h"
#include "UI_interface.h"
#include "RNA_access.h"
#include "RNA_define.h"
+/* Undo stuff */
+typedef struct {
+ ListBase nubase;
+ void *lastsel;
+ GHash *undoIndex;
+} UndoCurve;
+
+/* Definitions needed for shape keys */
+typedef struct {
+ void *origNode;
+ int index;
+} NodeKeyIndex;
+
void selectend_nurb(Object *obedit, short selfirst, short doswap, short selstatus);
static void select_adjacent_cp(ListBase *editnurb, short next, short cont, short selstatus);
@@ -90,7 +104,7 @@ ListBase *curve_get_editcurve(Object *ob)
{
if(ob && ELEM(ob->type, OB_CURVE, OB_SURF)) {
Curve *cu= ob->data;
- return cu->editnurb;
+ return &cu->editnurb->nurbs;
}
return NULL;
}
@@ -102,15 +116,18 @@ void set_actNurb(Object *obedit, Nurb *nu)
if(nu==NULL)
cu->actnu = -1;
- else
- cu->actnu = BLI_findindex(cu->editnurb, nu);
+ else {
+ ListBase *nurbs= ED_curve_editnurbs(cu);
+ cu->actnu = BLI_findindex(nurbs, nu);
+ }
}
Nurb *get_actNurb(Object *obedit)
{
Curve *cu= obedit->data;
-
- return BLI_findlink(cu->editnurb, cu->actnu);
+ ListBase *nurbs= ED_curve_editnurbs(cu);
+
+ return BLI_findlink(nurbs, cu->actnu);
}
/* ******************* SELECTION FUNCTIONS ********************* */
@@ -252,6 +269,692 @@ void printknots(Object *obedit)
}
}
+/* ********************* Shape keys *************** */
+
+static NodeKeyIndex *init_nodeKeyIndex(void *node, int index)
+{
+ NodeKeyIndex *nodeIndex = MEM_callocN(sizeof(NodeKeyIndex), "init_nodeKeyIndex");
+
+ nodeIndex->origNode= node;
+ nodeIndex->index= index;
+
+ return nodeIndex;
+}
+
+static void free_nodeKeyIndex(NodeKeyIndex *pointIndex)
+{
+ MEM_freeN(pointIndex);
+}
+
+static void init_editNurb_keyIndex(EditNurb *editnurb, ListBase *origBase)
+{
+ Nurb *nu= editnurb->nurbs.first;
+ Nurb *orignu= origBase->first;
+ GHash *gh;
+ BezTriple *bezt, *origbezt;
+ BPoint *bp, *origbp;
+ int a, keyindex= 0;
+
+ gh= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "editNurb keyIndex");
+
+ while (orignu) {
+ if (orignu->bezt) {
+ a= orignu->pntsu;
+ bezt= nu->bezt;
+ origbezt= orignu->bezt;
+ while (a--) {
+ BLI_ghash_insert(gh, bezt, init_nodeKeyIndex(origbezt, keyindex));
+ keyindex+= 12;
+ bezt++;
+ origbezt++;
+ }
+ } else {
+ a= orignu->pntsu * orignu->pntsv;
+ bp= nu->bp;
+ origbp= orignu->bp;
+ while (a--) {
+ BLI_ghash_insert(gh, bp, init_nodeKeyIndex(origbp, keyindex));
+ keyindex+= 4;
+ bp++;
+ origbp++;
+ }
+ }
+
+ nu= nu->next;
+ orignu= orignu->next;
+ }
+
+ editnurb->keyindex= gh;
+}
+
+static void free_editNurb_keyIndex(EditNurb *editnurb)
+{
+ if (!editnurb->keyindex) {
+ return;
+ }
+ BLI_ghash_free(editnurb->keyindex, NULL, (GHashValFreeFP)free_nodeKeyIndex);
+}
+
+static NodeKeyIndex *getNodeKeyIndex(EditNurb *editnurb, void *node)
+{
+ return BLI_ghash_lookup(editnurb->keyindex, node);
+}
+
+static BezTriple *getKeyIndexOrig_bezt(EditNurb *editnurb, void *node)
+{
+ NodeKeyIndex *index= getNodeKeyIndex(editnurb, node);
+
+ if (!index) {
+ return NULL;
+ }
+
+ return (BezTriple*)index->origNode;
+}
+
+static BPoint *getKeyIndexOrig_bp(EditNurb *editnurb, void *node)
+{
+ NodeKeyIndex *index= getNodeKeyIndex(editnurb, node);
+
+ if (!index) {
+ return NULL;
+ }
+
+ return (BPoint*)index->origNode;
+}
+
+static int getKeyIndexOrig_index(EditNurb *editnurb, void *node)
+{
+ NodeKeyIndex *index= getNodeKeyIndex(editnurb, node);
+
+ if (!index) {
+ return -1;
+ }
+
+ return index->index;
+}
+
+static void keyIndex_delNode(EditNurb *editnurb, void *node)
+{
+ if (!editnurb->keyindex) {
+ return;
+ }
+
+ BLI_ghash_remove(editnurb->keyindex, node, NULL, (GHashValFreeFP)free_nodeKeyIndex);
+}
+
+static void keyIndex_delBezt(EditNurb *editnurb, BezTriple *bezt)
+{
+ keyIndex_delNode(editnurb, bezt);
+}
+
+static void keyIndex_delBP(EditNurb *editnurb, BPoint *bp)
+{
+ keyIndex_delNode(editnurb, bp);
+}
+
+static void keyIndex_delNurb(EditNurb *editnurb, Nurb *nu)
+{
+ int a;
+
+ if (!editnurb->keyindex) {
+ return;
+ }
+
+ if (nu->bezt) {
+ BezTriple *bezt= nu->bezt;
+ a= nu->pntsu;
+
+ while (a--) {
+ BLI_ghash_remove(editnurb->keyindex, bezt, NULL, (GHashValFreeFP)free_nodeKeyIndex);
+ ++bezt;
+ }
+ } else {
+ BPoint *bp= nu->bp;
+ a= nu->pntsu * nu->pntsv;
+
+ while (a--) {
+ BLI_ghash_remove(editnurb->keyindex, bp, NULL, (GHashValFreeFP)free_nodeKeyIndex);
+ ++bp;
+ }
+ }
+}
+
+static void keyIndex_delNurbList(EditNurb *editnurb, ListBase *nubase)
+{
+ Nurb *nu= nubase->first;
+
+ while (nu) {
+ keyIndex_delNurb(editnurb, nu);
+
+ nu= nu->next;
+ }
+}
+
+static void keyIndex_updateNode(EditNurb *editnurb, char *node,
+ char *newnode, int count, int size, int search)
+{
+ int i;
+ NodeKeyIndex *index;
+
+ if (editnurb->keyindex == NULL) {
+ /* No shape keys - updating not needed */
+ return;
+ }
+
+ for (i = 0; i < count; i++) {
+ for (;;) {
+ index= getNodeKeyIndex(editnurb, node);
+ if (!search || index) {
+ break;
+ }
+ node += size;
+ }
+
+ BLI_ghash_remove(editnurb->keyindex, node, NULL, NULL);
+
+ if (index) {
+ BLI_ghash_insert(editnurb->keyindex, newnode, index);
+ }
+
+ newnode += size;
+ node += size;
+ }
+}
+
+static void keyIndex_updateBezt(EditNurb *editnurb, BezTriple *bezt,
+ BezTriple *newbezt, int count, int search)
+{
+ keyIndex_updateNode(editnurb, (char*)bezt, (char*)newbezt, count, sizeof(BezTriple), search);
+}
+
+static void keyIndex_updateBP(EditNurb *editnurb, BPoint *bp,
+ BPoint *newbp, int count, int search)
+{
+ keyIndex_updateNode(editnurb, (char*)bp, (char*)newbp, count, sizeof(BPoint), search);
+}
+
+static void keyIndex_updateNurb(EditNurb *editnurb, Nurb *nu, Nurb *newnu)
+{
+ if (nu->bezt) {
+ keyIndex_updateBezt(editnurb, nu->bezt, newnu->bezt, newnu->pntsu, 0);
+ } else {
+ keyIndex_updateBP(editnurb, nu->bp, newnu->bp, newnu->pntsu * newnu->pntsv, 0);
+ }
+}
+
+static void keyIndex_swap(EditNurb *editnurb, void *a, void *b)
+{
+ NodeKeyIndex *index1= getNodeKeyIndex(editnurb, a);
+ NodeKeyIndex *index2= getNodeKeyIndex(editnurb, b);
+
+ BLI_ghash_remove(editnurb->keyindex, a, NULL, NULL);
+ BLI_ghash_remove(editnurb->keyindex, b, NULL, NULL);
+
+ BLI_ghash_insert(editnurb->keyindex, a, index2);
+ BLI_ghash_insert(editnurb->keyindex, b, index1);
+}
+
+static void keyIndex_switchDirection(EditNurb *editnurb, Nurb *nu)
+{
+ int a;
+
+ if (nu->bezt) {
+ BezTriple *bezt1, *bezt2;
+
+ a= nu->pntsu;
+
+ bezt1= nu->bezt;
+ bezt2= bezt1+(a-1);
+
+ if (a & 1) ++a;
+
+ a/=2;
+
+ while (a--) {
+ if (bezt1 != bezt2) {
+ keyIndex_swap(editnurb, bezt1, bezt2);
+ }
+
+ bezt1++;
+ bezt2--;
+ }
+ } else {
+ BPoint *bp1, *bp2;
+
+ if (nu->pntsv == 1) {
+ a= nu->pntsu;
+ bp1= nu->bp;
+ bp2= bp1+(a-1);
+ a/= 2;
+ while(bp1!=bp2 && a>0) {
+ if (bp1 != bp2) {
+ keyIndex_swap(editnurb, bp1, bp2);
+ }
+
+ a--;
+ bp1++;
+ bp2--;
+ }
+ } else {
+ int b;
+
+ for(b=0; b<nu->pntsv; b++) {
+
+ bp1= nu->bp+b*nu->pntsu;
+ a= nu->pntsu;
+ bp2= bp1+(a-1);
+ a/= 2;
+
+ while(bp1!=bp2 && a>0) {
+ if (bp1 != bp2) {
+ keyIndex_swap(editnurb, bp1, bp2);
+ }
+
+ a--;
+ bp1++;
+ bp2--;
+ }
+ }
+
+ }
+ }
+}
+
+static void switch_keys_direction(Curve *cu, Nurb *actnu)
+{
+ KeyBlock *currkey;
+ ListBase *nubase= &cu->editnurb->nurbs;
+ Nurb *nu;
+ float *fp;
+ int a;
+
+ currkey = cu->key->block.first;
+ while(currkey) {
+ fp= currkey->data;
+
+ nu= nubase->first;
+ while (nu) {
+ if (nu->bezt) {
+ a= nu->pntsu;
+ if (nu == actnu) {
+ while (a--) {
+ swap_v3_v3(fp, fp + 6);
+ *(fp+9) = -*(fp+9);
+ fp += 12;
+ }
+ } else fp += a * 12;
+ } else {
+ a= nu->pntsu * nu->pntsv;
+ if (nu == actnu) {
+ while (a--) {
+ *(fp+3) = -*(fp+3);
+ fp += 4;
+ }
+ } else fp += a * 4;
+ }
+
+ nu= nu->next;
+ }
+
+ currkey= currkey->next;
+ }
+}
+
+static void keyData_switchDirectionNurb(Curve *cu, Nurb *nu)
+{
+ EditNurb *editnurb= cu->editnurb;
+
+ if (!editnurb->keyindex) {
+ /* no shape keys - nothing to do */
+ return;
+ }
+
+ keyIndex_switchDirection(editnurb, nu);
+ switch_keys_direction(cu, nu);
+}
+
+static GHash *dupli_keyIndexHash(GHash *keyindex)
+{
+ GHash *gh;
+ GHashIterator *hashIter;
+
+ gh= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "dupli_keyIndex gh");
+
+ for(hashIter = BLI_ghashIterator_new(keyindex);
+ !BLI_ghashIterator_isDone(hashIter);
+ BLI_ghashIterator_step(hashIter)) {
+ void *node = BLI_ghashIterator_getKey(hashIter);
+ NodeKeyIndex *index = BLI_ghashIterator_getValue(hashIter);
+ NodeKeyIndex *newIndex = MEM_callocN(sizeof(NodeKeyIndex), "dupli_keyIndexHash index");
+
+ memcpy(newIndex, index, sizeof(NodeKeyIndex));
+
+ BLI_ghash_insert(gh, node, newIndex);
+ }
+
+ BLI_ghashIterator_free(hashIter);
+
+ return gh;
+}
+
+static void key_to_bezt(float *key, BezTriple *basebezt, BezTriple *bezt)
+{
+ memcpy(bezt, basebezt, sizeof(BezTriple));
+ memcpy(bezt->vec, key, sizeof(float) * 9);
+ bezt->alfa= key[9];
+}
+
+static void bezt_to_key(BezTriple *bezt, float *key)
+{
+ memcpy(key, bezt->vec, sizeof(float) * 9);
+ key[9] = bezt->alfa;
+}
+
+static void calc_keyHandles(ListBase *nurb, float *key)
+{
+ Nurb *nu;
+ int a;
+ float *fp= key;
+ BezTriple *bezt;
+
+ nu= nurb->first;
+ while (nu) {
+ if (nu->bezt) {
+ BezTriple *prevp, *nextp;
+ BezTriple cur, prev, next;
+ float *startfp, *prevfp, *nextfp;
+
+ bezt= nu->bezt;
+ a= nu->pntsu;
+ startfp= fp;
+
+ if(nu->flagu & CU_NURB_CYCLIC) {
+ prevp= bezt+(a-1);
+ prevfp= fp+(12 * (a-1));
+ } else {
+ prevp= NULL;
+ prevfp= NULL;
+ }
+
+ nextp= bezt + 1;
+ nextfp= fp + 12;
+
+ while (a--) {
+ key_to_bezt(fp, bezt, &cur);
+
+ if (nextp) key_to_bezt(nextfp, nextp, &next);
+ if (prevp) key_to_bezt(prevfp, prevp, &prev);
+
+ calchandleNurb(&cur, prevp ? &prev : NULL, nextp ? &next : NULL, 0);
+ bezt_to_key(&cur, fp);
+
+ prevp= bezt;
+ prevfp= fp;
+ if(a==1) {
+ if(nu->flagu & CU_NURB_CYCLIC) {
+ nextp= nu->bezt;
+ nextfp= startfp;
+ } else {
+ nextp= NULL;
+ nextfp= NULL;
+ }
+ }
+ else {
+ ++nextp;
+ nextfp += 12;;
+ }
+
+ ++bezt;
+ fp += 12;
+ }
+ } else {
+ a= nu->pntsu * nu->pntsv;
+ fp += a * 4;
+ }
+
+ nu= nu->next;
+ }
+}
+
+static void calc_shapeKeys(Object *obedit)
+{
+ Curve *cu= (Curve*)obedit->data;
+
+ /* are there keys? */
+ if(cu->key) {
+ int a, i, j;
+ EditNurb *editnurb= cu->editnurb;
+ KeyBlock *currkey;
+ KeyBlock *actkey= BLI_findlink(&cu->key->block, editnurb->shapenr-1);
+ BezTriple *bezt, *oldbezt;
+ BPoint *bp, *oldbp;
+ Nurb *nu;
+ int totvert= count_curveverts(&editnurb->nurbs);
+
+ float (*ofs)[3] = NULL;
+ float *oldkey, *newkey, *fp, *ofp;
+
+ /* editing the base key should update others */
+ if(cu->key->type==KEY_RELATIVE) {
+ int act_is_basis = 0;
+ /* find if this key is a basis for any others */
+ for(currkey = cu->key->block.first; currkey; currkey= currkey->next) {
+ if(editnurb->shapenr-1 == currkey->relative) {
+ act_is_basis = 1;
+ break;
+ }
+ }
+
+ if(act_is_basis) { /* active key is a base */
+ int j;
+ int totvec= 0;
+
+ /* Calculate needed memory to store offset */
+ nu= editnurb->nurbs.first;
+ while(nu) {
+ if (nu->bezt) {
+ /* Three vects to store handles and one for alfa */
+ totvec+= nu->pntsu * 4;
+ } else {
+ totvec+= 2 * nu->pntsu * nu->pntsv;
+ }
+
+ nu= nu->next;
+ }
+
+ ofs= MEM_callocN(sizeof(float) * 3 * totvec, "currkey->data");
+ nu= editnurb->nurbs.first;
+ i= 0;
+ while(nu) {
+ if(nu->bezt) {
+ bezt= nu->bezt;
+ a= nu->pntsu;
+ while(a--) {
+ oldbezt= getKeyIndexOrig_bezt(editnurb, bezt);
+
+ if (oldbezt) {
+ for (j= 0; j < 3; ++j) {
+ VECSUB(ofs[i], bezt->vec[j], oldbezt->vec[j]);
+ i++;
+ fp+= 3;
+ }
+ ofs[i++][0]= bezt->alfa - oldbezt->alfa;
+ } else {
+ i += 4;
+ }
+ bezt++;
+ }
+ }
+ else {
+ bp= nu->bp;
+ a= nu->pntsu*nu->pntsv;
+ while(a--) {
+ oldbp= getKeyIndexOrig_bp(editnurb, bp);
+ if (oldbp) {
+ VECSUB(ofs[i], bp->vec, oldbp->vec);
+ ofs[i+1][0]= bp->alfa - oldbp->alfa;
+ }
+ i += 2;
+ ++bp;
+ fp += 4;
+ }
+ }
+
+ nu= nu->next;
+ }
+ }
+ }
+
+ currkey = cu->key->block.first;
+ while(currkey) {
+ int apply_offset = (ofs && (currkey != actkey) && (editnurb->shapenr-1 == currkey->relative));
+
+ fp= newkey= MEM_callocN(cu->key->elemsize * totvert, "currkey->data");
+ ofp= oldkey = currkey->data;
+
+ nu= editnurb->nurbs.first;
+ i = 0;
+ while(nu) {
+ if(currkey == actkey) {
+ int restore= actkey != cu->key->refkey;
+
+ if(nu->bezt) {
+ bezt= nu->bezt;
+ a= nu->pntsu;
+ while(a--) {
+ oldbezt= getKeyIndexOrig_bezt(editnurb, bezt);
+
+ for (j= 0; j < 3; ++j, ++i) {
+ VECCOPY(fp, bezt->vec[j]);
+
+ if (restore && oldbezt) {
+ VECCOPY(bezt->vec[j], oldbezt->vec[j]);
+ }
+
+ fp+= 3;
+ }
+ fp[0]= bezt->alfa;
+
+ if(restore && oldbezt) {
+ bezt->alfa= oldbezt->alfa;
+ }
+
+ fp+= 3; ++i;/* alphas */
+ ++bezt;
+ }
+ }
+ else {
+ bp= nu->bp;
+ a= nu->pntsu*nu->pntsv;
+ while(a--) {
+ oldbp= getKeyIndexOrig_bp(editnurb, bp);
+
+ VECCOPY(fp, bp->vec);
+
+ fp[3]= bp->alfa;
+
+ if(restore && oldbp) {
+ VECCOPY(bp->vec, oldbp->vec);
+ bp->alfa= oldbp->alfa;
+ }
+
+ fp+= 4;
+ ++bp;
+ i+=2;
+ }
+ }
+ }
+ else {
+ int index;
+ float *curofp;
+
+ if(oldkey) {
+ if(nu->bezt) {
+ bezt= nu->bezt;
+ a= nu->pntsu;
+
+ while(a--) {
+ index= getKeyIndexOrig_index(editnurb, bezt);
+ if (index >= 0) {
+ curofp= ofp + index;
+
+ for (j= 0; j < 3; ++j, ++i) {
+ VECCOPY(fp, curofp);
+
+ if(apply_offset) {
+ VECADD(fp, fp, ofs[i]);
+ }
+
+ fp+= 3; curofp+= 3;
+ }
+ fp[0]= curofp[0];
+
+ if(apply_offset) {
+ /* apply alfa offsets */
+ VECADD(fp, fp, ofs[i]);
+ ++i;
+ }
+
+ fp+= 3; curofp+= 3; /* alphas */
+ } else {
+ for (j= 0; j < 3; ++j, ++i) {
+ VECCOPY(fp, bezt->vec[j]);
+ fp+= 3;
+ }
+ fp[0]= bezt->alfa;
+
+ fp+= 3; /* alphas */
+ }
+ ++bezt;
+ }
+ }
+ else {
+ bp= nu->bp;
+ a= nu->pntsu*nu->pntsv;
+ while(a--) {
+ index= getKeyIndexOrig_index(editnurb, bp);
+
+ if (index >= 0) {
+ curofp= ofp + index;
+ VECCOPY(fp, curofp);
+ fp[3]= curofp[3];
+
+ if(apply_offset) {
+ VECADD(fp, fp, ofs[i]);
+ fp[3]+=ofs[i+1][0];
+ }
+ } else {
+ VECCOPY(fp, bp->vec);
+ fp[3]= bp->alfa;
+ }
+
+ fp+= 4;
+ ++bp;
+ i+=2;
+ }
+ }
+ }
+ }
+
+ nu= nu->next;
+ }
+
+ if (apply_offset) {
+ /* handles could become malicious after offsets applying */
+ calc_keyHandles(&editnurb->nurbs, newkey);
+ }
+
+ currkey->totelem= totvert;
+ if(currkey->data) MEM_freeN(currkey->data);
+ currkey->data = newkey;
+
+ currkey= currkey->next;
+ }
+
+ if(ofs) MEM_freeN(ofs);
+ }
+}
+
/* ********************* LOAD and MAKE *************** */
/* load editNurb in object */
@@ -266,48 +969,32 @@ void load_editNurb(Object *obedit)
if (ELEM(obedit->type, OB_CURVE, OB_SURF)) {
Curve *cu= obedit->data;
Nurb *nu, *newnu;
- KeyBlock *actkey;
- int totvert= count_curveverts(editnurb);
+ ListBase newnurb= {NULL, NULL}, oldnurb= cu->nurb;
- /* are there keys? */
- actkey = ob_get_keyblock(obedit);
- if(actkey) {
- /* active key: the vertices */
-
- if(totvert) {
- if(actkey->data) MEM_freeN(actkey->data);
-
- actkey->data= MEM_callocN(cu->key->elemsize*totvert, "actkey->data");
- actkey->totelem= totvert;
-
- curve_to_key(cu, actkey, editnurb);
- }
- }
-
- if(cu->key && actkey!=cu->key->refkey) {
- ;
- }
- else {
- freeNurblist(&(cu->nurb));
-
- for(nu= editnurb->first; nu; nu= nu->next) {
- newnu= duplicateNurb(nu);
- BLI_addtail(&(cu->nurb), newnu);
-
- if(nu->type == CU_NURBS) {
- clamp_nurb_order_u(nu);
- }
+ for(nu= editnurb->first; nu; nu= nu->next) {
+ newnu= duplicateNurb(nu);
+ BLI_addtail(&newnurb, newnu);
+
+ if(nu->type == CU_NURBS) {
+ clamp_nurb_order_u(nu);
}
}
+
+ cu->nurb= newnurb;
+
+ calc_shapeKeys(obedit);
+
+ freeNurblist(&oldnurb);
}
-
+
set_actNurb(obedit, NULL);
}
/* make copy in cu->editnurb */
void make_editNurb(Object *obedit)
{
- ListBase *editnurb= curve_get_editcurve(obedit);
+ Curve *cu= (Curve*)obedit->data;
+ EditNurb *editnurb= cu->editnurb;
Nurb *nu, *newnu, *nu_act= NULL;
KeyBlock *actkey;
@@ -316,20 +1003,29 @@ void make_editNurb(Object *obedit)
set_actNurb(obedit, NULL);
if (ELEM(obedit->type, OB_CURVE, OB_SURF)) {
- Curve *cu= obedit->data;
-
- if(editnurb)
- freeNurblist(editnurb);
- else
- editnurb= cu->editnurb= MEM_callocN(sizeof(ListBase), "editnurb");
-
+ actkey = ob_get_keyblock(obedit);
+ if(actkey) {
+ // XXX strcpy(G.editModeTitleExtra, "(Key) ");
+ undo_editmode_clear();
+ key_to_curve(actkey, cu, &cu->nurb);
+ }
+
+ if(editnurb) {
+ freeNurblist(&editnurb->nurbs);
+ free_editNurb_keyIndex(editnurb);
+ editnurb->keyindex= NULL;
+ } else {
+ editnurb= MEM_callocN(sizeof(EditNurb), "editnurb");
+ cu->editnurb= editnurb;
+ }
+
nu= cu->nurb.first;
- cu->lastselbp= NULL; /* for select row */
-
+ cu->lastsel= NULL; /* for select row */
+
while(nu) {
newnu= duplicateNurb(nu);
test2DNurb(newnu); // after join, or any other creation of curve
- BLI_addtail(editnurb, newnu);
+ BLI_addtail(&editnurb->nurbs, newnu);
if (nu_act == NULL && isNurbsel(nu)) {
nu_act= newnu;
@@ -338,26 +1034,31 @@ void make_editNurb(Object *obedit)
nu= nu->next;
}
-
- actkey = ob_get_keyblock(obedit);
+
if(actkey) {
- // XXX strcpy(G.editModeTitleExtra, "(Key) ");
- key_to_curve(actkey, cu, editnurb);
+ editnurb->shapenr= obedit->shapenr;
+ init_editNurb_keyIndex(editnurb, &cu->nurb);
}
}
}
-void free_editNurb(Object *obedit)
+void free_curve_editNurb (Curve *cu)
{
- Curve *cu= obedit->data;
-
if(cu->editnurb) {
- freeNurblist(cu->editnurb);
+ freeNurblist(&cu->editnurb->nurbs);
+ free_editNurb_keyIndex(cu->editnurb);
MEM_freeN(cu->editnurb);
cu->editnurb= NULL;
}
}
+void free_editNurb(Object *obedit)
+{
+ Curve *cu= obedit->data;
+
+ free_curve_editNurb(cu);
+}
+
void CU_deselect_all(Object *obedit)
{
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -389,6 +1090,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;
@@ -420,12 +1123,13 @@ void CU_select_swap(Object *obedit)
static int separate_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Nurb *nu, *nu1;
Object *oldob, *newob;
Base *oldbase, *newbase;
Curve *oldcu, *newcu;
- ListBase *oldedit, *newedit;
+ EditNurb *oldedit, *newedit;
oldbase= CTX_data_active_base(C);
oldob= oldbase->object;
@@ -440,7 +1144,7 @@ static int separate_exec(bContext *C, wmOperator *op)
WM_cursor_wait(1);
/* 1. duplicate the object and data */
- newbase= ED_object_add_duplicate(scene, oldbase, 0); /* 0 = fully linked */
+ newbase= ED_object_add_duplicate(bmain, scene, oldbase, 0); /* 0 = fully linked */
ED_base_object_select(newbase, BA_DESELECT);
newob= newbase->object;
@@ -451,15 +1155,16 @@ static int separate_exec(bContext *C, wmOperator *op)
/* 2. put new object in editmode and clear it */
make_editNurb(newob);
newedit= newcu->editnurb;
- freeNurblist(newedit);
+ freeNurblist(&newedit->nurbs);
+ free_editNurb_keyIndex(newedit);
/* 3. move over parts from old object */
- for(nu= oldedit->first; nu; nu=nu1) {
+ for(nu= oldedit->nurbs.first; nu; nu=nu1) {
nu1= nu->next;
if(isNurbsel(nu)) {
- BLI_remlink(oldedit, nu);
- BLI_addtail(newedit, nu);
+ BLI_remlink(&oldedit->nurbs, nu);
+ BLI_addtail(&newedit->nurbs, nu);
}
}
@@ -602,9 +1307,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++;
}
}
@@ -612,7 +1317,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++;
}
}
@@ -654,7 +1359,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) {
@@ -671,6 +1376,7 @@ static int deleteflagNurb(bContext *C, wmOperator *op, int flag)
}
if(a==0) {
BLI_remlink(editnurb, nu);
+ keyIndex_delNurb(cu->editnurb, nu);
freeNurb(nu); nu=NULL;
}
else {
@@ -699,10 +1405,13 @@ static int deleteflagNurb(bContext *C, wmOperator *op, int flag)
if((bp->f1 & flag)==0) {
memcpy(bpn, bp, nu->pntsu*sizeof(BPoint));
bpn+= nu->pntsu;
+ } else {
+ keyIndex_delBP(cu->editnurb, bp);
}
bp+= nu->pntsu;
}
nu->pntsv= newv;
+ keyIndex_updateBP(cu->editnurb, nu->bp, newbp, newv * nu->pntsu, 1);
MEM_freeN(nu->bp);
nu->bp= newbp;
clamp_nurb_order_v(nu);
@@ -736,9 +1445,12 @@ static int deleteflagNurb(bContext *C, wmOperator *op, int flag)
if((bp->f1 & flag)==0) {
*bpn= *bp;
bpn++;
+ } else {
+ keyIndex_delBP(cu->editnurb, bp);
}
}
}
+ keyIndex_updateBP(cu->editnurb, nu->bp, newbp, newu * nu->pntsv, 1);
MEM_freeN(nu->bp);
nu->bp= newbp;
if(newu==1 && nu->pntsv>1) { /* make a U spline */
@@ -764,13 +1476,13 @@ static int deleteflagNurb(bContext *C, wmOperator *op, int flag)
}
/* only for OB_SURF */
-static short extrudeflagNurb(ListBase *editnurb, int flag)
+static short extrudeflagNurb(EditNurb *editnurb, int flag)
{
Nurb *nu;
BPoint *bp, *bpn, *newbp;
int ok= 0, a, u, v, len;
- nu= editnurb->first;
+ nu= editnurb->nurbs.first;
while(nu) {
if(nu->pntsv==1) {
@@ -786,9 +1498,9 @@ static short extrudeflagNurb(ListBase *editnurb, int flag)
ok= 1;
newbp =
(BPoint*)MEM_mallocN(2 * nu->pntsu * sizeof(BPoint), "extrudeNurb1");
- memcpy(newbp, nu->bp, nu->pntsu*sizeof(BPoint) );
+ ED_curve_bpcpy(editnurb, newbp, nu->bp, nu->pntsu);
bp= newbp+ nu->pntsu;
- memcpy(bp, nu->bp, nu->pntsu*sizeof(BPoint) );
+ ED_curve_bpcpy(editnurb, bp, nu->bp, nu->pntsu);
MEM_freeN(nu->bp);
nu->bp= newbp;
a= nu->pntsu;
@@ -805,7 +1517,7 @@ static short extrudeflagNurb(ListBase *editnurb, int flag)
}
}
else {
- /* which row or collumn is selected */
+ /* which row or column is selected */
if( isNurbselUV(nu, &u, &v, flag) ) {
@@ -824,14 +1536,14 @@ static short extrudeflagNurb(ListBase *editnurb, int flag)
* sizeof(BPoint), "extrudeNurb1");
if(u==0) {
len= nu->pntsv*nu->pntsu;
- memcpy(newbp+nu->pntsu, nu->bp, len*sizeof(BPoint) );
- memcpy(newbp, nu->bp, nu->pntsu*sizeof(BPoint) );
+ ED_curve_bpcpy(editnurb, newbp+nu->pntsu, nu->bp, len);
+ ED_curve_bpcpy(editnurb, newbp, nu->bp, nu->pntsu);
bp= newbp;
}
else {
len= nu->pntsv*nu->pntsu;
- memcpy(newbp, nu->bp, len*sizeof(BPoint) );
- memcpy(newbp+len, nu->bp+len-nu->pntsu, nu->pntsu*sizeof(BPoint) );
+ ED_curve_bpcpy(editnurb, newbp, nu->bp, len);
+ ED_curve_bpcpy(editnurb, newbp+len, nu->bp+len-nu->pntsu, nu->pntsu);
bp= newbp+len;
}
@@ -858,7 +1570,7 @@ static short extrudeflagNurb(ListBase *editnurb, int flag)
bpn->f1 |= flag;
bpn++;
}
- memcpy(bpn, bp, nu->pntsu*sizeof(BPoint));
+ ED_curve_bpcpy(editnurb, bpn, bp, nu->pntsu);
bp+= nu->pntsu;
bpn+= nu->pntsu;
if(v== nu->pntsu-1) {
@@ -887,9 +1599,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) {
@@ -1057,13 +1772,16 @@ static void adduplicateflagNurb(Object *obedit, short flag)
static int switch_direction_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
+ Curve *cu= (Curve*)obedit->data;
+ EditNurb *editnurb= cu->editnurb;
Nurb *nu;
-
- for(nu= editnurb->first; nu; nu= nu->next)
- if(isNurbsel(nu))
+
+ for(nu= editnurb->nurbs.first; nu; nu= nu->next)
+ if(isNurbsel(nu)) {
switchdirectionNurb(nu);
-
+ keyData_switchDirectionNurb(cu, nu);
+ }
+
DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
@@ -1499,11 +2217,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) {
@@ -1819,6 +2541,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;
@@ -2759,7 +3483,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);
@@ -2987,7 +3711,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
/* joins 2 curves */
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *nubase= curve_get_editcurve(obedit);
Nurb *nu, *nu1=0, *nu2=0;
BezTriple *bezt;
BPoint *bp;
@@ -2995,7 +3719,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
int a;
/* first decide if this is a surface merge! */
- if(obedit->type==OB_SURF) nu= editnurb->first;
+ if(obedit->type==OB_SURF) nu= nubase->first;
else nu= NULL;
while(nu) {
@@ -3018,7 +3742,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
return merge_nurb(C, op);
/* find both nurbs and points, nu1 will be put behind nu2 */
- for(nu= editnurb->first; nu; nu= nu->next) {
+ for(nu= nubase->first; nu; nu= nu->next) {
if((nu->flagu & CU_NURB_CYCLIC)==0) { /* not cyclic */
if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
@@ -3029,6 +3753,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
nu1= nu;
switchdirectionNurb(nu);
+ keyData_switchDirectionNurb(cu, nu);
}
}
}
@@ -3036,6 +3761,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
nu2= nu;
switchdirectionNurb(nu);
+ keyData_switchDirectionNurb(cu, nu);
}
else {
bezt= bezt+(nu->pntsu-1);
@@ -3055,6 +3781,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
if( bp->f1 & SELECT ) {
nu1= nu;
switchdirectionNurb(nu);
+ keyData_switchDirectionNurb(cu, nu);
}
}
}
@@ -3062,6 +3789,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
if( bp->f1 & SELECT ) {
nu2= nu;
switchdirectionNurb(nu);
+ keyData_switchDirectionNurb(cu, nu);
}
else {
bp= bp+(nu->pntsu-1);
@@ -3080,27 +3808,28 @@ static int make_segment_exec(bContext *C, wmOperator *op)
if(nu1->type == CU_BEZIER) {
bezt =
(BezTriple*)MEM_mallocN((nu1->pntsu+nu2->pntsu) * sizeof(BezTriple), "addsegmentN");
- memcpy(bezt, nu2->bezt, nu2->pntsu*sizeof(BezTriple));
- memcpy(bezt+nu2->pntsu, nu1->bezt, nu1->pntsu*sizeof(BezTriple));
+ ED_curve_beztcpy(cu->editnurb, bezt, nu2->bezt, nu2->pntsu);
+ ED_curve_beztcpy(cu->editnurb, bezt+nu2->pntsu, nu1->bezt, nu1->pntsu);
+
MEM_freeN(nu1->bezt);
nu1->bezt= bezt;
nu1->pntsu+= nu2->pntsu;
- BLI_remlink(editnurb, nu2);
+ BLI_remlink(nubase, nu2);
freeNurb(nu2); nu2= NULL;
calchandlesNurb(nu1);
}
else {
bp =
(BPoint*)MEM_mallocN((nu1->pntsu+nu2->pntsu) * sizeof(BPoint), "addsegmentN2");
- memcpy(bp, nu2->bp, nu2->pntsu*sizeof(BPoint) );
- memcpy(bp+nu2->pntsu, nu1->bp, nu1->pntsu*sizeof(BPoint));
+ ED_curve_bpcpy(cu->editnurb, bp, nu2->bp, nu2->pntsu);
+ ED_curve_bpcpy(cu->editnurb, bp+nu2->pntsu, nu1->bp, nu1->pntsu);
MEM_freeN(nu1->bp);
nu1->bp= bp;
a= nu1->pntsu+nu1->orderu;
nu1->pntsu+= nu2->pntsu;
- BLI_remlink(editnurb, nu2);
+ BLI_remlink(nubase, nu2);
/* now join the knots */
if(nu1->type == CU_NURBS) {
@@ -3183,12 +3912,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);
}
@@ -3196,8 +3931,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 {
@@ -3205,10 +3945,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;
}
}
@@ -3233,6 +3975,7 @@ int mouse_nurb(bContext *C, short mval[2], int extend)
*/
static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, float *cent, short mode)
{
+ Curve *cu= (Curve*)obedit->data;
ListBase *editnurb= curve_get_editcurve(obedit);
Nurb *nu;
float si,phi,n[3],q[4],cmat[3][3],tmat[3][3],imat[3][3];
@@ -3281,7 +4024,7 @@ static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, flo
ok= 1;
for(a=0;a<7;a++) {
- if(mode==0 || mode==2) ok= extrudeflagNurb(editnurb, 1);
+ if(mode==0 || mode==2) ok= extrudeflagNurb(cu->editnurb, 1);
else adduplicateflagNurb(obedit, 1);
if(ok==0)
@@ -3366,7 +4109,7 @@ void CURVE_OT_spin(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- RNA_def_float_vector(ot->srna, "center", 3, NULL, -FLT_MAX, FLT_MAX, "Center", "Center in global view space", -FLT_MAX, FLT_MAX);
+ RNA_def_float_vector_xyz(ot->srna, "center", 3, NULL, -FLT_MAX, FLT_MAX, "Center", "Center in global view space", -FLT_MAX, FLT_MAX);
RNA_def_float_vector(ot->srna, "axis", 3, NULL, -1.0f, 1.0f, "Axis", "Axis in global view space", -FLT_MAX, FLT_MAX);
}
@@ -3375,7 +4118,8 @@ void CURVE_OT_spin(wmOperatorType *ot)
static int addvert_Nurb(bContext *C, short mode, float location[3])
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
+ Curve *cu= (Curve*)obedit->data;
+ EditNurb *editnurb= cu->editnurb;
Nurb *nu;
BezTriple *bezt, *newbezt = NULL;
BPoint *bp, *newbp = NULL;
@@ -3384,8 +4128,7 @@ 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);
+ findselectedNurbvert(&editnurb->nurbs, &nu, &bezt, &bp);
if(bezt==0 && bp==0) return OPERATOR_CANCELLED;
if(nu->type == CU_BEZIER) {
@@ -3394,7 +4137,7 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
BEZ_DESEL(bezt);
newbezt =
(BezTriple*)MEM_callocN((nu->pntsu+1) * sizeof(BezTriple), "addvert_Nurb");
- memcpy(newbezt+1, bezt, nu->pntsu*sizeof(BezTriple));
+ ED_curve_beztcpy(editnurb, newbezt+1, bezt, nu->pntsu);
*newbezt= *bezt;
BEZ_SEL(newbezt);
newbezt->h2= newbezt->h1;
@@ -3407,7 +4150,7 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
BEZ_DESEL(bezt);
newbezt =
(BezTriple*)MEM_callocN((nu->pntsu+1) * sizeof(BezTriple), "addvert_Nurb");
- memcpy(newbezt, nu->bezt, nu->pntsu*sizeof(BezTriple));
+ ED_curve_beztcpy(editnurb, newbezt, nu->bezt, nu->pntsu);
*(newbezt+nu->pntsu)= *bezt;
VECCOPY(temp, bezt->vec[1]);
MEM_freeN(nu->bezt);
@@ -3423,13 +4166,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,7 +4187,7 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
bp->f1= 0;
newbp =
(BPoint*)MEM_callocN((nu->pntsu+1) * sizeof(BPoint), "addvert_Nurb3");
- memcpy(newbp+1, bp, nu->pntsu*sizeof(BPoint));
+ ED_curve_bpcpy(editnurb, newbp+1, bp, nu->pntsu);
*newbp= *bp;
newbp->f1= 1;
MEM_freeN(nu->bp);
@@ -3455,7 +4198,7 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
bp->f1= 0;
newbp =
(BPoint*)MEM_callocN((nu->pntsu+1) * sizeof(BPoint), "addvert_Nurb4");
- memcpy(newbp, nu->bp, nu->pntsu*sizeof(BPoint));
+ ED_curve_bpcpy(editnurb, newbp, nu->bp, nu->pntsu);
*(newbp+nu->pntsu)= *bp;
MEM_freeN(nu->bp);
nu->bp= newbp;
@@ -3471,11 +4214,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;
}
@@ -3535,7 +4278,7 @@ void CURVE_OT_vertex_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_float_vector(ot->srna, "location", 3, NULL, -FLT_MAX, FLT_MAX, "Location", "Location to add new vertex at.", -1e4, 1e4);
+ RNA_def_float_vector_xyz(ot->srna, "location", 3, NULL, -FLT_MAX, FLT_MAX, "Location", "Location to add new vertex at.", -1e4, 1e4);
}
/***************** extrude operator **********************/
@@ -3544,11 +4287,11 @@ static int extrude_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
- ListBase *editnurb= curve_get_editcurve(obedit);
+ EditNurb *editnurb= cu->editnurb;
Nurb *nu;
/* first test: curve? */
- for(nu= editnurb->first; nu; nu= nu->next)
+ for(nu= editnurb->nurbs.first; nu; nu= nu->next)
if(nu->pntsv==1 && isNurbsel_count(cu, nu)==1)
break;
@@ -3726,7 +4469,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;
@@ -3813,7 +4556,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 */
@@ -3821,7 +4564,7 @@ static int select_row_exec(bContext *C, wmOperator *op)
bp= nu->bp;
for(v=0; v<nu->pntsv; v++) {
for(u=0; u<nu->pntsu; u++, bp++) {
- if(bp==cu->lastselbp) {
+ if(bp==cu->lastsel) {
if(bp->f1 & SELECT) {
ok= 1;
break;
@@ -3832,11 +4575,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; a<nu->pntsv; a++) {
@@ -4242,37 +4985,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= ED_curve_editnurbs(cu);
+ 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 *********************/
@@ -4321,15 +5155,20 @@ static int delete_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
- ListBase *editnurb= curve_get_editcurve(obedit);
+ EditNurb *editnurb= cu->editnurb;
+ ListBase *nubase= &editnurb->nurbs;
Nurb *nu, *next, *nu1;
BezTriple *bezt, *bezt1, *bezt2;
BPoint *bp, *bp1, *bp2;
int a, cut= 0, type= RNA_enum_get(op->ptr, "type");
if(obedit->type==OB_SURF) {
- if(type==0) deleteflagNurb(C, op, 1);
- else freeNurblist(editnurb);
+ if(type==0) {
+ deleteflagNurb(C, op, 1);
+ } else {
+ keyIndex_delNurbList(editnurb, nubase);
+ freeNurblist(nubase);
+ }
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
@@ -4339,7 +5178,7 @@ static int delete_exec(bContext *C, wmOperator *op)
if(type==0) {
/* first loop, can we remove entire pieces? */
- nu= editnurb->first;
+ nu= nubase->first;
while(nu) {
next= nu->next;
if(nu->type == CU_BEZIER) {
@@ -4353,7 +5192,8 @@ static int delete_exec(bContext *C, wmOperator *op)
bezt++;
}
if(a==0) {
- BLI_remlink(editnurb, nu);
+ BLI_remlink(nubase, nu);
+ keyIndex_delNurb(editnurb, nu);
freeNurb(nu); nu= NULL;
}
}
@@ -4369,7 +5209,8 @@ static int delete_exec(bContext *C, wmOperator *op)
bp++;
}
if(a==0) {
- BLI_remlink(editnurb, nu);
+ BLI_remlink(nubase, nu);
+ keyIndex_delNurb(editnurb, nu);
freeNurb(nu); nu= NULL;
}
}
@@ -4385,18 +5226,21 @@ static int delete_exec(bContext *C, wmOperator *op)
nu= next;
}
/* 2nd loop, delete small pieces: just for curves */
- nu= editnurb->first;
+ nu= nubase->first;
while(nu) {
next= nu->next;
type= 0;
if(nu->type == CU_BEZIER) {
+ int delta= 0;
bezt= nu->bezt;
for(a=0;a<nu->pntsu;a++) {
if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
memmove(bezt, bezt+1, (nu->pntsu-a-1)*sizeof(BezTriple));
+ keyIndex_delBezt(editnurb, bezt + delta);
nu->pntsu--;
a--;
type= 1;
+ delta++;
}
else bezt++;
}
@@ -4404,20 +5248,24 @@ static int delete_exec(bContext *C, wmOperator *op)
bezt1 =
(BezTriple*)MEM_mallocN((nu->pntsu) * sizeof(BezTriple), "delNurb");
memcpy(bezt1, nu->bezt, (nu->pntsu)*sizeof(BezTriple) );
+ keyIndex_updateBezt(editnurb, nu->bezt, bezt1, nu->pntsu, 1);
MEM_freeN(nu->bezt);
nu->bezt= bezt1;
calchandlesNurb(nu);
}
}
else if(nu->pntsv==1) {
+ int delta= 0;
bp= nu->bp;
for(a=0;a<nu->pntsu;a++) {
if( bp->f1 & SELECT ) {
memmove(bp, bp+1, (nu->pntsu-a-1)*sizeof(BPoint));
+ keyIndex_delBP(editnurb, bp + delta);
nu->pntsu--;
a--;
type= 1;
+ delta++;
}
else {
bp++;
@@ -4426,6 +5274,7 @@ static int delete_exec(bContext *C, wmOperator *op)
if(type) {
bp1 = (BPoint*)MEM_mallocN(nu->pntsu * sizeof(BPoint), "delNurb2");
memcpy(bp1, nu->bp, (nu->pntsu)*sizeof(BPoint) );
+ keyIndex_updateBP(editnurb, nu->bp, bp1, nu->pntsu, 1);
MEM_freeN(nu->bp);
nu->bp= bp1;
@@ -4445,7 +5294,7 @@ static int delete_exec(bContext *C, wmOperator *op)
/* find the 2 selected points */
bezt1= bezt2= 0;
bp1= bp2= 0;
- nu= editnurb->first;
+ nu= nubase->first;
nu1= 0;
while(nu) {
next= nu->next;
@@ -4508,16 +5357,17 @@ static int delete_exec(bContext *C, wmOperator *op)
if(nu1) {
if(bezt1) {
if(nu1->pntsu==2) { /* remove completely */
- BLI_remlink(editnurb, nu);
+ BLI_remlink(nubase, nu);
freeNurb(nu); nu = NULL;
}
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));
+ ED_curve_beztcpy(editnurb, bezt, nu1->bezt, cut+1);
a= nu1->pntsu-cut-1;
- memcpy(nu1->bezt, bezt2, a*sizeof(BezTriple));
- memcpy(nu1->bezt+a, bezt, (cut+1)*sizeof(BezTriple));
+ ED_curve_beztcpy(editnurb, nu1->bezt, bezt2, a);
+ ED_curve_beztcpy(editnurb, nu1->bezt+a, bezt, cut+1);
+
nu1->flagu &= ~CU_NURB_CYCLIC;
MEM_freeN(bezt);
calchandlesNurb(nu);
@@ -4529,15 +5379,15 @@ static int delete_exec(bContext *C, wmOperator *op)
nu =
(Nurb*)MEM_mallocN(sizeof(Nurb), "delNurb2");
memcpy(nu, nu1, sizeof(Nurb));
- BLI_addtail(editnurb, nu);
+ BLI_addtail(nubase, nu);
nu->bezt =
(BezTriple*)MEM_mallocN((cut+1) * sizeof(BezTriple), "delNurb3");
- memcpy(nu->bezt, nu1->bezt,(cut+1)*sizeof(BezTriple));
+ ED_curve_beztcpy(editnurb, nu->bezt, nu1->bezt, cut+1);
a= nu1->pntsu-cut-1;
bezt =
(BezTriple*)MEM_mallocN(a * sizeof(BezTriple), "delNurb4");
- memcpy(bezt, nu1->bezt+cut+1,a*sizeof(BezTriple));
+ ED_curve_beztcpy(editnurb, bezt, nu1->bezt+cut+1, a);
MEM_freeN(nu1->bezt);
nu1->bezt= bezt;
nu1->pntsu= a;
@@ -4550,30 +5400,31 @@ static int delete_exec(bContext *C, wmOperator *op)
}
else if(bp1) {
if(nu1->pntsu==2) { /* remove completely */
- BLI_remlink(editnurb, nu);
+ BLI_remlink(nubase, nu);
freeNurb(nu); nu= NULL;
}
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));
+ ED_curve_bpcpy(editnurb, bp, nu1->bp, cut+1);
a= nu1->pntsu-cut-1;
- memcpy(nu1->bp, bp2, a*sizeof(BPoint));
- memcpy(nu1->bp+a, bp, (cut+1)*sizeof(BPoint));
+ ED_curve_bpcpy(editnurb, nu1->bp, bp2, a);
+ ED_curve_bpcpy(editnurb, nu1->bp+a, bp, cut+1);
+
nu1->flagu &= ~CU_NURB_CYCLIC;
MEM_freeN(bp);
}
else { /* add new curve */
nu = (Nurb*)MEM_mallocN(sizeof(Nurb), "delNurb6");
memcpy(nu, nu1, sizeof(Nurb));
- BLI_addtail(editnurb, nu);
+ BLI_addtail(nubase, nu);
nu->bp =
(BPoint*)MEM_mallocN((cut+1) * sizeof(BPoint), "delNurb7");
- memcpy(nu->bp, nu1->bp,(cut+1)*sizeof(BPoint));
+ ED_curve_bpcpy(editnurb, nu->bp, nu1->bp, cut+1);
a= nu1->pntsu-cut-1;
bp =
(BPoint*)MEM_mallocN(a * sizeof(BPoint), "delNurb8");
- memcpy(bp, nu1->bp+cut+1,a*sizeof(BPoint));
+ ED_curve_bpcpy(editnurb, bp, nu1->bp+cut+1, a);
MEM_freeN(nu1->bp);
nu1->bp= bp;
nu1->pntsu= a;
@@ -4582,8 +5433,10 @@ static int delete_exec(bContext *C, wmOperator *op)
}
}
}
- else if(type==2)
- freeNurblist(editnurb);
+ else if(type==2) {
+ keyIndex_delNurbList(editnurb, nubase);
+ freeNurblist(nubase);
+ }
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
@@ -4617,7 +5470,7 @@ static int delete_invoke(bContext *C, wmOperator *op, wmEvent *event)
void CURVE_OT_delete(wmOperatorType *ot)
{
static EnumPropertyItem type_items[] = {
- {0, "SELECTED", 0, "Selected", ""},
+ {0, "SELECTED", 0, "Select", ""},
{1, "SEGMENT", 0, "Segment", ""},
{2, "ALL", 0, "All", ""},
{0, NULL, 0, NULL, NULL}};
@@ -4695,6 +5548,7 @@ void CURVE_OT_shade_flat(wmOperatorType *ot)
int join_curve_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
Curve *cu;
@@ -4723,6 +5577,7 @@ int join_curve_exec(bContext *C, wmOperator *op)
nu= cu->nurb.first;
while(nu) {
newnu= duplicateNurb(nu);
+ CLAMP(newnu->mat_nr, 0, ob->totcol-1); /* TODO, merge material lists */
BLI_addtail(&tempbase, newnu);
if( (bezt= newnu->bezt) ) {
@@ -4745,7 +5600,7 @@ int join_curve_exec(bContext *C, wmOperator *op)
}
}
- ED_base_object_free_and_unlink(scene, base);
+ ED_base_object_free_and_unlink(bmain, scene, base);
}
}
}
@@ -4754,7 +5609,7 @@ int join_curve_exec(bContext *C, wmOperator *op)
cu= ob->data;
addlisttolist(&cu->nurb, &tempbase);
- DAG_scene_sort(scene); // because we removed object(s), call before editmode!
+ DAG_scene_sort(bmain, scene); // because we removed object(s), call before editmode!
ED_object_enter_editmode(C, EM_WAITCURSOR);
ED_object_exit_editmode(C, EM_FREEDATA|EM_WAITCURSOR|EM_DO_UNDO);
@@ -4765,7 +5620,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... */
@@ -5015,6 +5869,7 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
break;
case CU_PRIM_TUBE: /* tube */
if( cutype==CU_NURBS ) {
+ Curve *cu= (Curve*)obedit->data;
if(newname) {
rename_id((ID *)obedit, "SurfTube");
@@ -5029,7 +5884,7 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
vec[2]= -grid;
translateflagNurb(editnurb, 1, vec);
- extrudeflagNurb(editnurb, 1);
+ extrudeflagNurb(cu->editnurb, 1);
vec[0]= -2*vec[0];
vec[1]= -2*vec[1];
vec[2]= -2*vec[2];
@@ -5100,8 +5955,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;
@@ -5137,6 +5992,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)
@@ -5190,49 +6357,111 @@ void CURVE_OT_tilt_clear(wmOperatorType *ot)
/****************** undo for curves ****************/
-static void undoCurve_to_editCurve(void *lbu, void *lbe)
+static void *undo_check_lastsel(void *lastsel, Nurb *nu, Nurb *newnu)
{
- ListBase *lb= lbu;
- ListBase *editnurb= lbe;
+ 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 undoCurve_to_editCurve(void *ucu, void *cue)
+{
+ Curve *cu= cue;
+ UndoCurve *undoCurve= ucu;
+ ListBase *undobase= &undoCurve->nubase;
+ ListBase *editbase= ED_curve_editnurbs(cu);
Nurb *nu, *newnu;
-
- freeNurblist(editnurb);
+ EditNurb *editnurb= cu->editnurb;
+ void *lastsel= NULL;
+
+ freeNurblist(editbase);
+
+ if (undoCurve->undoIndex) {
+ BLI_ghash_free(editnurb->keyindex, NULL, (GHashValFreeFP)free_nodeKeyIndex);
+ editnurb->keyindex= dupli_keyIndexHash(undoCurve->undoIndex);
+ }
/* copy */
- for(nu= lb->first; nu; nu= nu->next) {
+ for(nu= undobase->first; nu; nu= nu->next) {
newnu= duplicateNurb(nu);
- BLI_addtail(editnurb, newnu);
+
+ if (lastsel == NULL) {
+ lastsel= undo_check_lastsel(undoCurve->lastsel, nu, newnu);
+ }
+
+ if (editnurb->keyindex) {
+ keyIndex_updateNurb(editnurb, nu, newnu);
+ }
+
+ BLI_addtail(editbase, newnu);
}
+
+ cu->lastsel= lastsel;
}
-static void *editCurve_to_undoCurve(void *lbe)
+static void *editCurve_to_undoCurve(void *cue)
{
- ListBase *editnurb= lbe;
- ListBase *lb;
+ Curve *cu= cue;
+ ListBase *nubase= ED_curve_editnurbs(cu);
+ UndoCurve *undoCurve;
+ EditNurb *editnurb= cu->editnurb, tmpEditnurb;
Nurb *nu, *newnu;
+ void *lastsel= NULL;
+
+ undoCurve= MEM_callocN(sizeof(UndoCurve), "undoCurve");
+
+ if (editnurb->keyindex) {
+ undoCurve->undoIndex= dupli_keyIndexHash(editnurb->keyindex);
+ tmpEditnurb.keyindex= undoCurve->undoIndex;
+ }
- lb= MEM_callocN(sizeof(ListBase), "listbase undo");
-
/* copy */
- for(nu= editnurb->first; nu; nu= nu->next) {
+ for(nu= nubase->first; nu; nu= nu->next) {
newnu= duplicateNurb(nu);
- BLI_addtail(lb, newnu);
+
+ if (lastsel == NULL) {
+ lastsel= undo_check_lastsel(cu->lastsel, nu, newnu);
+ }
+
+ if (undoCurve->undoIndex) {
+ keyIndex_updateNurb(&tmpEditnurb, nu, newnu);
+ }
+
+ BLI_addtail(&undoCurve->nubase, newnu);
}
- return lb;
+
+ undoCurve->lastsel= lastsel;
+
+ return undoCurve;
}
-static void free_undoCurve(void *lbv)
+static void free_undoCurve(void *ucv)
{
- ListBase *lb= lbv;
-
- freeNurblist(lb);
- MEM_freeN(lb);
+ UndoCurve *undoCurve= ucv;
+
+ freeNurblist(&undoCurve->nubase);
+
+ if (undoCurve->undoIndex) {
+ BLI_ghash_free(undoCurve->undoIndex, NULL, (GHashValFreeFP)free_nodeKeyIndex);
+ }
+
+ 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 */
@@ -5240,3 +6469,24 @@ void undo_push_curve(bContext *C, char *name)
{
undo_editmode_push(C, name, get_data, free_undoCurve, undoCurve_to_editCurve, editCurve_to_undoCurve, NULL);
}
+
+/* Get list of nurbs from editnurbs structure */
+ListBase *ED_curve_editnurbs(Curve *cu)
+{
+ if (cu->editnurb) {
+ return &cu->editnurb->nurbs;
+ }
+
+ return NULL;
+}
+void ED_curve_beztcpy(EditNurb *editnurb, BezTriple *dst, BezTriple *src, int count)
+{
+ memcpy(dst, src, count*sizeof(BezTriple));
+ keyIndex_updateBezt(editnurb, src, dst, count, 0);
+}
+
+void ED_curve_bpcpy(EditNurb *editnurb, BPoint *dst, BPoint *src, int count)
+{
+ memcpy(dst, src, count*sizeof(BPoint));
+ keyIndex_updateBP(editnurb, src, dst, count, 0);
+}
diff --git a/source/blender/editors/curve/editfont.c b/source/blender/editors/curve/editfont.c
index 37e695cf823..146213af667 100644
--- a/source/blender/editors/curve/editfont.c
+++ b/source/blender/editors/curve/editfont.c
@@ -51,12 +51,9 @@
#include "BKE_curve.h"
#include "BKE_depsgraph.h"
#include "BKE_font.h"
-#include "BKE_global.h"
#include "BKE_library.h"
-#include "BKE_main.h"
#include "BKE_object.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -384,7 +381,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);
@@ -393,7 +390,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);
@@ -417,7 +414,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 ********************/
@@ -611,9 +608,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)
@@ -664,7 +662,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.");
}
@@ -702,7 +700,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 ********************/
@@ -862,7 +860,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;
@@ -873,7 +871,7 @@ static int move_cursor(bContext *C, int type, int select)
while(cu->pos<cu->len) {
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;
@@ -1228,7 +1226,7 @@ static int insert_text_exec(bContext *C, wmOperator *op)
Object *obedit= CTX_data_edit_object(C);
char *inserted_utf8;
wchar_t *inserted_text, first;
- int len;
+ int a, len;
if(!RNA_property_is_set(op->ptr, "text"))
return OPERATOR_CANCELLED;
@@ -1240,13 +1238,12 @@ static int insert_text_exec(bContext *C, wmOperator *op)
utf8towchar(inserted_text, inserted_utf8);
first= inserted_text[0];
+ for(a=0; a<len; a++)
+ insert_into_textbuf(obedit, inserted_text[a]);
+
MEM_freeN(inserted_text);
MEM_freeN(inserted_utf8);
- if(!first)
- return OPERATOR_CANCELLED;
-
- insert_into_textbuf(obedit, first);
kill_selection(obedit, 1);
text_update_edited(C, scene, obedit, 1, 0);
@@ -1363,6 +1360,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)
@@ -1564,7 +1654,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);
@@ -1613,12 +1703,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;
@@ -1639,7 +1729,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 950767cbac0..00000000000
--- a/source/blender/editors/datafiles/B.blend.c
+++ /dev/null
@@ -1,12378 +0,0 @@
-/* DataToC output of file <B_blend> */
-
-int datatoc_B_blend_size= 395872;
-char datatoc_B_blend[]= {
-
- 66, 76, 69, 78, 68, 69, 82, 45,118, 50, 53, 50, 82, 69, 78, 68, 32, 0, 0, 0,112,231,191, 95,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,128,230,191, 95,255,127, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 32, 32, 32, 50,
- 2, 0, 0, 0,250, 0, 0, 0, 1, 0, 0, 1,176,206, 83, 22, 1, 0, 0, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 16, 0, 0,
-128, 0, 4, 0, 60,109,101,109,111,114,121, 50, 62, 0, 0, 0, 0, 0, 0, 0,226, 76,241, 1, 1, 0, 0, 0, 40, 0, 0, 0,
- 48, 0, 0, 0,176,231,191, 95,255,127, 0, 0,224,230,191, 95,255,127, 0, 0,208, 38,171, 30, 32, 0, 0, 0,112,231,191, 95,
-255,127, 0, 0, 64,140, 49, 30, 1, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0,118, 0, 0, 0, 0, 0, 0, 0, 80,231,191, 95,
-255,127, 0, 0, 65,209, 98, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,231,191, 95,255,127, 0, 0, 32, 0, 0, 0,
- 82, 69, 78, 68, 64,140, 49, 30, 1, 0, 0, 0, 82, 69, 78, 68, 32, 0, 0, 0,112,231,191, 95,255,127, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0,160,231,191, 95,255,127, 0, 0,160,231,191, 95,255,127, 0, 0, 20,216, 98, 0, 1, 0, 0, 0, 48,162,172, 4,
- 1, 0, 0, 0, 64,140, 49, 30, 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,176,206, 83, 22, 1, 0, 0, 0, 87, 77, 0, 0, 16, 1, 0, 0,160,139, 82, 22,
- 1, 0, 0, 0,106, 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,240,140, 82, 22, 1, 0, 0, 0,240,140, 82, 22,
- 1, 0, 0, 0,240,140, 82, 22, 1, 0, 0, 0,240,140, 82, 22, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,240,148, 53, 30,
- 1, 0, 0, 0,240,148, 53, 30, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,108, 53, 30,
- 1, 0, 0, 0, 80,108, 53, 30, 1, 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, 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, 3, 80, 22, 1, 0, 0, 0, 32, 3, 80, 22, 1, 0, 0, 0, 32, 3, 80, 22,
- 1, 0, 0, 0, 64, 4, 80, 22, 1, 0, 0, 0, 64, 4, 80, 22, 1, 0, 0, 0, 64, 4, 80, 22, 1, 0, 0, 0, 68, 65, 84, 65,
-224, 0, 0, 0,240,140, 82, 22, 1, 0, 0, 0,107, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,112, 18, 80, 22, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,176,206, 83, 22, 1, 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, 0, 0, 0, 0,128, 7,128, 4, 0, 0, 0, 0, 1, 0,238, 3, 0, 0, 1, 0, 0, 0, 0, 0,160, 86, 96, 21,
- 1, 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,240, 44, 48, 30,
- 1, 0, 0, 0, 64, 18, 93, 22, 1, 0, 0, 0, 64, 18, 93, 22, 1, 0, 0, 0, 32,172, 80, 22, 1, 0, 0, 0, 64,206, 90, 22,
- 1, 0, 0, 0, 32, 29, 92, 22, 1, 0, 0, 0, 32, 29, 92, 22, 1, 0, 0, 0, 64, 19, 93, 22, 1, 0, 0, 0,224,122, 93, 22,
- 1, 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, 16,142, 82, 22,
- 1, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 96, 58, 83, 22, 1, 0, 0, 0, 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, 32,143, 82, 22, 1, 0, 0, 0,128,149, 82, 22,
- 1, 0, 0, 0,224,149, 82, 22, 1, 0, 0, 0, 96,160, 82, 22, 1, 0, 0, 0,192,160, 82, 22, 1, 0, 0, 0, 80, 43, 83, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 32,143, 82, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,128,143, 82, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 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,128,143, 82, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,224,143, 82, 22, 1, 0, 0, 0, 32,143, 82, 22, 1, 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,224,143, 82, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0, 64,144, 82, 22, 1, 0, 0, 0,128,143, 82, 22, 1, 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, 64,144, 82, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,160,144, 82, 22,
- 1, 0, 0, 0,224,143, 82, 22, 1, 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,160,144, 82, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0,145, 82, 22, 1, 0, 0, 0, 64,144, 82, 22,
- 1, 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, 0,145, 82, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 96,145, 82, 22, 1, 0, 0, 0,160,144, 82, 22, 1, 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, 96,145, 82, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0,192,145, 82, 22, 1, 0, 0, 0, 0,145, 82, 22, 1, 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,192,145, 82, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 32,146, 82, 22,
- 1, 0, 0, 0, 96,145, 82, 22, 1, 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, 32,146, 82, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,128,146, 82, 22, 1, 0, 0, 0,192,145, 82, 22,
- 1, 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,128,146, 82, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,224,146, 82, 22, 1, 0, 0, 0, 32,146, 82, 22, 1, 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,224,146, 82, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0, 64,147, 82, 22, 1, 0, 0, 0,128,146, 82, 22, 1, 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, 64,147, 82, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,160,147, 82, 22,
- 1, 0, 0, 0,224,146, 82, 22, 1, 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,160,147, 82, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0,148, 82, 22, 1, 0, 0, 0, 64,147, 82, 22,
- 1, 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, 0,148, 82, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 96,148, 82, 22, 1, 0, 0, 0,160,147, 82, 22, 1, 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, 96,148, 82, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0,192,148, 82, 22, 1, 0, 0, 0, 0,148, 82, 22, 1, 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,192,148, 82, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 32,149, 82, 22,
- 1, 0, 0, 0, 96,148, 82, 22, 1, 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, 32,149, 82, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,128,149, 82, 22, 1, 0, 0, 0,192,148, 82, 22,
- 1, 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,128,149, 82, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,149, 82, 22, 1, 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,224,149, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 64,150, 82, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,143, 82, 22, 1, 0, 0, 0,224,143, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 64,150, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0,160,150, 82, 22, 1, 0, 0, 0,224,149, 82, 22, 1, 0, 0, 0,128,143, 82, 22, 1, 0, 0, 0,160,144, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,160,150, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 0,151, 82, 22, 1, 0, 0, 0, 64,150, 82, 22, 1, 0, 0, 0,224,143, 82, 22, 1, 0, 0, 0, 0,145, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 0,151, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 96,151, 82, 22, 1, 0, 0, 0,160,150, 82, 22, 1, 0, 0, 0,160,144, 82, 22, 1, 0, 0, 0, 0,145, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 96,151, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0,192,151, 82, 22, 1, 0, 0, 0, 0,151, 82, 22, 1, 0, 0, 0, 32,143, 82, 22, 1, 0, 0, 0, 96,145, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,192,151, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 32,152, 82, 22, 1, 0, 0, 0, 96,151, 82, 22, 1, 0, 0, 0, 64,144, 82, 22, 1, 0, 0, 0, 96,145, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 32,152, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0,128,152, 82, 22, 1, 0, 0, 0,192,151, 82, 22, 1, 0, 0, 0, 0,145, 82, 22, 1, 0, 0, 0,192,145, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,128,152, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0,224,152, 82, 22, 1, 0, 0, 0, 32,152, 82, 22, 1, 0, 0, 0, 96,145, 82, 22, 1, 0, 0, 0, 32,146, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,224,152, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 64,153, 82, 22, 1, 0, 0, 0,128,152, 82, 22, 1, 0, 0, 0, 64,144, 82, 22, 1, 0, 0, 0,128,146, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 64,153, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0,160,153, 82, 22, 1, 0, 0, 0,224,152, 82, 22, 1, 0, 0, 0, 32,146, 82, 22, 1, 0, 0, 0,128,146, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,160,153, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 0,154, 82, 22, 1, 0, 0, 0, 64,153, 82, 22, 1, 0, 0, 0, 32,143, 82, 22, 1, 0, 0, 0,224,146, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 0,154, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 96,154, 82, 22, 1, 0, 0, 0,160,153, 82, 22, 1, 0, 0, 0,192,145, 82, 22, 1, 0, 0, 0, 64,147, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 96,154, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0,192,154, 82, 22, 1, 0, 0, 0, 0,154, 82, 22, 1, 0, 0, 0, 96,145, 82, 22, 1, 0, 0, 0, 64,147, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,192,154, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 32,155, 82, 22, 1, 0, 0, 0, 96,154, 82, 22, 1, 0, 0, 0,224,146, 82, 22, 1, 0, 0, 0, 64,147, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 32,155, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0,128,155, 82, 22, 1, 0, 0, 0,192,154, 82, 22, 1, 0, 0, 0,224,146, 82, 22, 1, 0, 0, 0,160,147, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,128,155, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0,224,155, 82, 22, 1, 0, 0, 0, 32,155, 82, 22, 1, 0, 0, 0, 64,147, 82, 22, 1, 0, 0, 0,160,147, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,224,155, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 64,156, 82, 22, 1, 0, 0, 0,128,155, 82, 22, 1, 0, 0, 0,160,144, 82, 22, 1, 0, 0, 0, 0,148, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 64,156, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0,160,156, 82, 22, 1, 0, 0, 0,224,155, 82, 22, 1, 0, 0, 0,192,145, 82, 22, 1, 0, 0, 0, 0,148, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,160,156, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 0,157, 82, 22, 1, 0, 0, 0, 64,156, 82, 22, 1, 0, 0, 0,160,147, 82, 22, 1, 0, 0, 0, 0,148, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 0,157, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 96,157, 82, 22, 1, 0, 0, 0,160,156, 82, 22, 1, 0, 0, 0,224,146, 82, 22, 1, 0, 0, 0, 96,148, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 96,157, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0,192,157, 82, 22, 1, 0, 0, 0, 0,157, 82, 22, 1, 0, 0, 0,160,147, 82, 22, 1, 0, 0, 0,192,148, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,192,157, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 32,158, 82, 22, 1, 0, 0, 0, 96,157, 82, 22, 1, 0, 0, 0, 96,148, 82, 22, 1, 0, 0, 0,192,148, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 32,158, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0,128,158, 82, 22, 1, 0, 0, 0,192,157, 82, 22, 1, 0, 0, 0, 32,146, 82, 22, 1, 0, 0, 0, 32,149, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,128,158, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0,224,158, 82, 22, 1, 0, 0, 0, 32,158, 82, 22, 1, 0, 0, 0,192,145, 82, 22, 1, 0, 0, 0, 32,149, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,224,158, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 64,159, 82, 22, 1, 0, 0, 0,128,158, 82, 22, 1, 0, 0, 0, 0,145, 82, 22, 1, 0, 0, 0,128,149, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 64,159, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0,160,159, 82, 22, 1, 0, 0, 0,224,158, 82, 22, 1, 0, 0, 0,128,146, 82, 22, 1, 0, 0, 0,128,149, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,160,159, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 0,160, 82, 22, 1, 0, 0, 0, 64,159, 82, 22, 1, 0, 0, 0, 32,149, 82, 22, 1, 0, 0, 0,128,149, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 0,160, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 96,160, 82, 22, 1, 0, 0, 0,160,159, 82, 22, 1, 0, 0, 0,160,144, 82, 22, 1, 0, 0, 0, 96,148, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 96,160, 82, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 82, 22, 1, 0, 0, 0, 0,148, 82, 22, 1, 0, 0, 0,192,148, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,192,160, 82, 22, 1, 0, 0, 0,198, 0, 0, 0,
- 1, 0, 0, 0, 96,164, 82, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,144, 82, 22, 1, 0, 0, 0,128,143, 82, 22,
- 1, 0, 0, 0,224,143, 82, 22, 1, 0, 0, 0, 0,145, 82, 22, 1, 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,224, 57, 83, 22, 1, 0, 0, 0,224, 57, 83, 22, 1, 0, 0, 0,160,161, 82, 22, 1, 0, 0, 0, 0,163, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,160,161, 82, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0,163, 82, 22,
- 1, 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,
- 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, 68, 65, 84, 65, 40, 1, 0, 0, 0,163, 82, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,160,161, 82, 22, 1, 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, 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, 68, 65, 84, 65,160, 0, 0, 0, 96,164, 82, 22, 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0,112,198, 82, 22,
- 1, 0, 0, 0,192,160, 82, 22, 1, 0, 0, 0, 96,145, 82, 22, 1, 0, 0, 0, 32,146, 82, 22, 1, 0, 0, 0,128,146, 82, 22,
- 1, 0, 0, 0, 64,144, 82, 22, 1, 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, 0,193, 82, 22,
- 1, 0, 0, 0, 0,197, 82, 22, 1, 0, 0, 0, 64,165, 82, 22, 1, 0, 0, 0,160,166, 82, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 64,165, 82, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,160,166, 82, 22, 1, 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, 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, 68, 65, 84, 65,
- 40, 1, 0, 0,160,166, 82, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,165, 82, 22,
- 1, 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, 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,168, 82, 22, 1, 0, 0, 0,112,191, 82, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0, 0,168, 82, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,144,169, 82, 22, 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,144,169, 82, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0, 32,171, 82, 22, 1, 0, 0, 0, 0,168, 82, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0, 32,171, 82, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,176,172, 82, 22, 1, 0, 0, 0,144,169, 82, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,176,172, 82, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0, 64,174, 82, 22, 1, 0, 0, 0, 32,171, 82, 22, 1, 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, 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, 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,
- 88, 1, 0, 0, 64,174, 82, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,208,175, 82, 22, 1, 0, 0, 0,176,172, 82, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,208,175, 82, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0, 96,177, 82, 22, 1, 0, 0, 0, 64,174, 82, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0, 96,177, 82, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,240,178, 82, 22, 1, 0, 0, 0,208,175, 82, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,240,178, 82, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0,128,180, 82, 22, 1, 0, 0, 0, 96,177, 82, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0,128,180, 82, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 16,182, 82, 22, 1, 0, 0, 0,240,178, 82, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 16,182, 82, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0,160,183, 82, 22, 1, 0, 0, 0,128,180, 82, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0,160,183, 82, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 48,185, 82, 22, 1, 0, 0, 0, 16,182, 82, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 48,185, 82, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0,192,186, 82, 22, 1, 0, 0, 0,160,183, 82, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0,192,186, 82, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 80,188, 82, 22, 1, 0, 0, 0, 48,185, 82, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 80,188, 82, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0,224,189, 82, 22, 1, 0, 0, 0,192,186, 82, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0,224,189, 82, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,112,191, 82, 22, 1, 0, 0, 0, 80,188, 82, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,112,191, 82, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,189, 82, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 1, 0, 0, 0,193, 82, 22, 1, 0, 0, 0,165, 0, 0, 0, 1, 0, 0, 0, 0,197, 82, 22, 1, 0, 0, 0, 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, 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, 40, 1, 0, 0, 64,194, 82, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,160,195, 82, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,160,195, 82, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,194, 82, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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,166,172, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48,166,172, 4,
- 1, 0, 0, 0,159, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0, 0,197, 82, 22,
- 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193, 82, 22, 1, 0, 0, 0, 64,194, 82, 22,
- 1, 0, 0, 0,160,195, 82, 22, 1, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-160, 0, 0, 0,112,198, 82, 22, 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0, 64,207, 82, 22, 1, 0, 0, 0, 96,164, 82, 22,
- 1, 0, 0, 0, 32,143, 82, 22, 1, 0, 0, 0,224,146, 82, 22, 1, 0, 0, 0, 64,147, 82, 22, 1, 0, 0, 0, 96,145, 82, 22,
- 1, 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, 16,202, 82, 22, 1, 0, 0, 0,208,205, 82, 22,
- 1, 0, 0, 0, 80,199, 82, 22, 1, 0, 0, 0,176,200, 82, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 80,199, 82, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,176,200, 82, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,176,200, 82, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,199, 82, 22, 1, 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, 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, 68, 65, 84, 65,200, 0, 0, 0, 16,202, 82, 22,
- 1, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0,208,205, 82, 22, 1, 0, 0, 0, 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, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 16,203, 82, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,112,204, 82, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,112,204, 82, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,203, 82, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 0, 0, 0, 0, 0, 0, 0, 0, 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,170,172, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48,170,172, 4,
- 1, 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,
- 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,208,205, 82, 22,
- 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,202, 82, 22, 1, 0, 0, 0, 16,203, 82, 22,
- 1, 0, 0, 0,112,204, 82, 22, 1, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-160, 0, 0, 0, 64,207, 82, 22, 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0,208,221, 82, 22, 1, 0, 0, 0,112,198, 82, 22,
- 1, 0, 0, 0, 32,146, 82, 22, 1, 0, 0, 0, 32,149, 82, 22, 1, 0, 0, 0,128,149, 82, 22, 1, 0, 0, 0,128,146, 82, 22,
- 1, 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,224,210, 82, 22, 1, 0, 0, 0, 96,220, 82, 22,
- 1, 0, 0, 0, 32,208, 82, 22, 1, 0, 0, 0,128,209, 82, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 32,208, 82, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,128,209, 82, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,128,209, 82, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,208, 82, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,224,210, 82, 22,
- 1, 0, 0, 0,169, 0, 0, 0, 1, 0, 0, 0, 96,216, 82, 22, 1, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 64,212, 82, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64,212, 82, 22,
- 1, 0, 0, 0,222, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0,144,212, 82, 22, 1, 0, 0, 0, 68, 65, 84, 65,
-208, 0, 0, 0,144,212, 82, 22, 1, 0, 0, 0,221, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 48,218,173, 4,
- 1, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0, 48,218,173, 4, 1, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0, 48,218,173, 4,
- 1, 0, 0, 0, 21, 0, 1, 0, 1, 0, 1, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,230,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,246,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 64, 89, 86, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48, 2,174, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 64, 87, 86, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,252,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,226,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 64, 81, 86, 22,
- 1, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,160,213, 82, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0,215, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 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,
- 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0,215, 82, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,160,213, 82, 22, 1, 0, 0, 0, 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,
- 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 96,216, 82, 22, 1, 0, 0, 0,165, 0, 0, 0, 1, 0, 0, 0, 96,220, 82, 22,
- 1, 0, 0, 0,224,210, 82, 22, 1, 0, 0, 0,160,213, 82, 22, 1, 0, 0, 0, 0,215, 82, 22, 1, 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, 2, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,160,217, 82, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0,219, 82, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 0,219, 82, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,217, 82, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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,174,172, 4, 1, 0, 0, 0, 68, 65, 84, 65,
-104, 3, 0, 0, 48,174,172, 4, 1, 0, 0, 0,159, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 48, 1, 0, 0, 96,220, 82, 22, 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,216, 82, 22,
- 1, 0, 0, 0,160,217, 82, 22, 1, 0, 0, 0, 0,219, 82, 22, 1, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,208,221, 82, 22, 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0,176,245, 82, 22,
- 1, 0, 0, 0, 64,207, 82, 22, 1, 0, 0, 0,160,147, 82, 22, 1, 0, 0, 0, 0,148, 82, 22, 1, 0, 0, 0,192,145, 82, 22,
- 1, 0, 0, 0, 64,147, 82, 22, 1, 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,128,240, 82, 22,
- 1, 0, 0, 0,176,244, 82, 22, 1, 0, 0, 0,176,222, 82, 22, 1, 0, 0, 0, 32,239, 82, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,176,222, 82, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 16,224, 82, 22, 1, 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, 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, 68, 65, 84, 65,
- 40, 1, 0, 0, 16,224, 82, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,112,225, 82, 22, 1, 0, 0, 0,176,222, 82, 22,
- 1, 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, 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, 68, 65, 84, 65,
- 40, 1, 0, 0,112,225, 82, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,208,226, 82, 22, 1, 0, 0, 0, 16,224, 82, 22,
- 1, 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, 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, 68, 65, 84, 65,
- 40, 1, 0, 0,208,226, 82, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 32,239, 82, 22, 1, 0, 0, 0,112,225, 82, 22,
- 1, 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, 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, 48,228, 82, 22, 1, 0, 0, 0,144,237, 82, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0, 48,228, 82, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,192,229, 82, 22, 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,192,229, 82, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0, 80,231, 82, 22, 1, 0, 0, 0, 48,228, 82, 22, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0, 80,231, 82, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,224,232, 82, 22, 1, 0, 0, 0,192,229, 82, 22,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,224,232, 82, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0,112,234, 82, 22, 1, 0, 0, 0, 80,231, 82, 22, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0,112,234, 82, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0,236, 82, 22, 1, 0, 0, 0,224,232, 82, 22,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 0,236, 82, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0,144,237, 82, 22, 1, 0, 0, 0,112,234, 82, 22, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0,144,237, 82, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,236, 82, 22,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 32,239, 82, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,226, 82, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48,178,172, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48,178,172, 4, 1, 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,128,240, 82, 22, 1, 0, 0, 0,160, 0, 0, 0,
- 1, 0, 0, 0,176,244, 82, 22, 1, 0, 0, 0, 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, 48,240,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 40, 1, 0, 0,240,241, 82, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 80,243, 82, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 80,243, 82, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,241, 82, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,200, 0, 0, 0,176,244, 82, 22,
- 1, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,240, 82, 22, 1, 0, 0, 0,240,241, 82, 22,
- 1, 0, 0, 0, 80,243, 82, 22, 1, 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, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,176,245, 82, 22,
- 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0,208, 13, 83, 22, 1, 0, 0, 0,208,221, 82, 22, 1, 0, 0, 0,224,146, 82, 22,
- 1, 0, 0, 0, 96,148, 82, 22, 1, 0, 0, 0,192,148, 82, 22, 1, 0, 0, 0,160,147, 82, 22, 1, 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, 16,252, 82, 22, 1, 0, 0, 0,208, 12, 83, 22, 1, 0, 0, 0,144,246, 82, 22,
- 1, 0, 0, 0,176,250, 82, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,144,246, 82, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,240,247, 82, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,240,247, 82, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 80,249, 82, 22, 1, 0, 0, 0,144,246, 82, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0, 80,249, 82, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,176,250, 82, 22, 1, 0, 0, 0,240,247, 82, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0,176,250, 82, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,249, 82, 22, 1, 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, 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, 68, 65, 84, 65,248, 0, 0, 0, 16,252, 82, 22, 1, 0, 0, 0,164, 0, 0, 0,
- 1, 0, 0, 0, 48,182,172, 4, 1, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 64,253, 82, 22, 1, 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, 64,253, 82, 22, 1, 0, 0, 0, 23, 1, 0, 0, 1, 0, 0, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,160,253, 82, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0,255, 82, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 0,255, 82, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 96, 0, 83, 22, 1, 0, 0, 0,160,253, 82, 22,
- 1, 0, 0, 0, 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,
- 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 96, 0, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 82, 22,
- 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 24, 0, 0, 48,182,172, 4, 1, 0, 0, 0,170, 0, 0, 0, 1, 0, 0, 0,160, 8, 83, 22, 1, 0, 0, 0, 16,252, 82, 22,
- 1, 0, 0, 0,160,253, 82, 22, 1, 0, 0, 0, 96, 0, 83, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,192, 1, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 32, 3, 83, 22, 1, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 32, 3, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,128, 4, 83, 22, 1, 0, 0, 0,192, 1, 83, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 4, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,224, 5, 83, 22, 1, 0, 0, 0, 32, 3, 83, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,224, 5, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 64, 7, 83, 22, 1, 0, 0, 0,128, 4, 83, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64, 7, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 5, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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,208,172, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48,208,172, 4, 1, 0, 0, 0,159, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,160, 8, 83, 22, 1, 0, 0, 0,160, 0, 0, 0,
- 1, 0, 0, 0,208, 12, 83, 22, 1, 0, 0, 0, 48,182,172, 4, 1, 0, 0, 0,192, 1, 83, 22, 1, 0, 0, 0, 64, 7, 83, 22,
- 1, 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, 48,240,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 40, 1, 0, 0, 16, 10, 83, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,112, 11, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,112, 11, 83, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 10, 83, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,200, 0, 0, 0,208, 12, 83, 22,
- 1, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 8, 83, 22, 1, 0, 0, 0, 16, 10, 83, 22,
- 1, 0, 0, 0,112, 11, 83, 22, 1, 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, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,208, 13, 83, 22,
- 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0, 80, 43, 83, 22, 1, 0, 0, 0,176,245, 82, 22, 1, 0, 0, 0, 96,148, 82, 22,
- 1, 0, 0, 0,160,144, 82, 22, 1, 0, 0, 0, 0,148, 82, 22, 1, 0, 0, 0,192,148, 82, 22, 1, 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,208, 18, 83, 22, 1, 0, 0, 0, 80, 42, 83, 22, 1, 0, 0, 0,176, 14, 83, 22,
- 1, 0, 0, 0,112, 17, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,176, 14, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 16, 16, 83, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0, 16, 16, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,112, 17, 83, 22, 1, 0, 0, 0,176, 14, 83, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,112, 17, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 83, 22, 1, 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, 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, 68, 65, 84, 65, 8, 1, 0, 0,208, 18, 83, 22, 1, 0, 0, 0, 24, 1, 0, 0,
- 1, 0, 0, 0,144, 25, 83, 22, 1, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 48,218,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 40, 1, 0, 0, 16, 20, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,112, 21, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,112, 21, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,208, 22, 83, 22, 1, 0, 0, 0, 16, 20, 83, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,208, 22, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 48, 24, 83, 22, 1, 0, 0, 0,112, 21, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 24, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 22, 83, 22, 1, 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,
-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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 25, 83, 22, 1, 0, 0, 0,164, 0, 0, 0,
- 1, 0, 0, 0, 48,212,172, 4, 1, 0, 0, 0,208, 18, 83, 22, 1, 0, 0, 0, 16, 20, 83, 22, 1, 0, 0, 0, 48, 24, 83, 22,
- 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,192, 26, 83, 22, 1, 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,192, 26, 83, 22, 1, 0, 0, 0, 23, 1, 0, 0, 1, 0, 0, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 32, 27, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,128, 28, 83, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 28, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,224, 29, 83, 22, 1, 0, 0, 0, 32, 27, 83, 22,
- 1, 0, 0, 0, 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,
- 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,224, 29, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 28, 83, 22,
- 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 24, 0, 0, 48,212,172, 4, 1, 0, 0, 0,170, 0, 0, 0, 1, 0, 0, 0, 32, 38, 83, 22, 1, 0, 0, 0,144, 25, 83, 22,
- 1, 0, 0, 0, 32, 27, 83, 22, 1, 0, 0, 0,224, 29, 83, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64, 31, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,160, 32, 83, 22, 1, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,160, 32, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 34, 83, 22, 1, 0, 0, 0, 64, 31, 83, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 34, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 96, 35, 83, 22, 1, 0, 0, 0,160, 32, 83, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 96, 35, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,192, 36, 83, 22, 1, 0, 0, 0, 0, 34, 83, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,192, 36, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 35, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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,238,172, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48,238,172, 4, 1, 0, 0, 0,159, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0, 32, 38, 83, 22, 1, 0, 0, 0,160, 0, 0, 0,
- 1, 0, 0, 0, 80, 42, 83, 22, 1, 0, 0, 0, 48,212,172, 4, 1, 0, 0, 0, 64, 31, 83, 22, 1, 0, 0, 0,192, 36, 83, 22,
- 1, 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, 48,240,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 40, 1, 0, 0,144, 39, 83, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,240, 40, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,240, 40, 83, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 39, 83, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,200, 0, 0, 0, 80, 42, 83, 22,
- 1, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 38, 83, 22, 1, 0, 0, 0,144, 39, 83, 22,
- 1, 0, 0, 0,240, 40, 83, 22, 1, 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, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 80, 43, 83, 22,
- 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 13, 83, 22, 1, 0, 0, 0, 32,149, 82, 22,
- 1, 0, 0, 0,192,145, 82, 22, 1, 0, 0, 0, 0,145, 82, 22, 1, 0, 0, 0,128,149, 82, 22, 1, 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,240, 46, 83, 22, 1, 0, 0, 0,160, 56, 83, 22, 1, 0, 0, 0, 48, 44, 83, 22,
- 1, 0, 0, 0,144, 45, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 44, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,144, 45, 83, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,144, 45, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 44, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48,242,172, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48,242,172, 4, 1, 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,240, 46, 83, 22, 1, 0, 0, 0,160, 0, 0, 0,
- 1, 0, 0, 0, 32, 51, 83, 22, 1, 0, 0, 0, 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, 48,240,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0, 96, 48, 83, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,192, 49, 83, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,192, 49, 83, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 48, 83, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 32, 51, 83, 22,
- 1, 0, 0, 0,169, 0, 0, 0, 1, 0, 0, 0,160, 56, 83, 22, 1, 0, 0, 0,240, 46, 83, 22, 1, 0, 0, 0, 96, 48, 83, 22,
- 1, 0, 0, 0,192, 49, 83, 22, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 52, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 52, 83, 22,
- 1, 0, 0, 0,222, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0,208, 52, 83, 22, 1, 0, 0, 0, 68, 65, 84, 65,
-208, 0, 0, 0,208, 52, 83, 22, 1, 0, 0, 0,221, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 48,218,173, 4,
- 1, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0, 48,218,173, 4, 1, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0, 48,218,173, 4,
- 1, 0, 0, 0, 21, 0, 1, 0, 1, 0, 1, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,230,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,246,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 64, 89, 86, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48, 2,174, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 64, 87, 86, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,252,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,226,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 64, 81, 86, 22,
- 1, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,224, 53, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 64, 55, 83, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 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,
- 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64, 55, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,224, 53, 83, 22, 1, 0, 0, 0, 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,
- 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,160, 56, 83, 22, 1, 0, 0, 0,165, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 32, 51, 83, 22, 1, 0, 0, 0,224, 53, 83, 22, 1, 0, 0, 0, 64, 55, 83, 22, 1, 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, 2, 0, 0, 0,
- 0, 0, 0, 0, 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, 96, 58, 83, 22, 1, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,176,206, 83, 22, 1, 0, 0, 0, 16,142, 82, 22,
- 1, 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,112, 59, 83, 22,
- 1, 0, 0, 0, 80, 64, 83, 22, 1, 0, 0, 0,176, 64, 83, 22, 1, 0, 0, 0,144, 72, 83, 22, 1, 0, 0, 0,240, 72, 83, 22,
- 1, 0, 0, 0, 80,178, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,218,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,112, 59, 83, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,208, 59, 83, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 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,208, 59, 83, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 48, 60, 83, 22, 1, 0, 0, 0,112, 59, 83, 22,
- 1, 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, 48, 60, 83, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,144, 60, 83, 22, 1, 0, 0, 0,208, 59, 83, 22, 1, 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,144, 60, 83, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0,240, 60, 83, 22, 1, 0, 0, 0, 48, 60, 83, 22, 1, 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,240, 60, 83, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 80, 61, 83, 22,
- 1, 0, 0, 0,144, 60, 83, 22, 1, 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, 80, 61, 83, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,176, 61, 83, 22, 1, 0, 0, 0,240, 60, 83, 22,
- 1, 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,176, 61, 83, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 16, 62, 83, 22, 1, 0, 0, 0, 80, 61, 83, 22, 1, 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, 16, 62, 83, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0,112, 62, 83, 22, 1, 0, 0, 0,176, 61, 83, 22, 1, 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,112, 62, 83, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,208, 62, 83, 22,
- 1, 0, 0, 0, 16, 62, 83, 22, 1, 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,208, 62, 83, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 48, 63, 83, 22, 1, 0, 0, 0,112, 62, 83, 22,
- 1, 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, 48, 63, 83, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,144, 63, 83, 22, 1, 0, 0, 0,208, 62, 83, 22, 1, 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,144, 63, 83, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0,240, 63, 83, 22, 1, 0, 0, 0, 48, 63, 83, 22, 1, 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,240, 63, 83, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 80, 64, 83, 22,
- 1, 0, 0, 0,144, 63, 83, 22, 1, 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, 80, 64, 83, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 63, 83, 22,
- 1, 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,176, 64, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 16, 65, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 59, 83, 22,
- 1, 0, 0, 0, 48, 60, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 16, 65, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,112, 65, 83, 22, 1, 0, 0, 0,176, 64, 83, 22, 1, 0, 0, 0,208, 59, 83, 22,
- 1, 0, 0, 0,240, 60, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,112, 65, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,208, 65, 83, 22, 1, 0, 0, 0, 16, 65, 83, 22, 1, 0, 0, 0, 48, 60, 83, 22,
- 1, 0, 0, 0, 80, 61, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,208, 65, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 48, 66, 83, 22, 1, 0, 0, 0,112, 65, 83, 22, 1, 0, 0, 0,240, 60, 83, 22,
- 1, 0, 0, 0, 80, 61, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 48, 66, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,144, 66, 83, 22, 1, 0, 0, 0,208, 65, 83, 22, 1, 0, 0, 0,144, 60, 83, 22,
- 1, 0, 0, 0, 16, 62, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,144, 66, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,240, 66, 83, 22, 1, 0, 0, 0, 48, 66, 83, 22, 1, 0, 0, 0,176, 61, 83, 22,
- 1, 0, 0, 0, 16, 62, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,240, 66, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 80, 67, 83, 22, 1, 0, 0, 0,144, 66, 83, 22, 1, 0, 0, 0, 80, 61, 83, 22,
- 1, 0, 0, 0,112, 62, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 80, 67, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,176, 67, 83, 22, 1, 0, 0, 0,240, 66, 83, 22, 1, 0, 0, 0,240, 60, 83, 22,
- 1, 0, 0, 0,112, 62, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,176, 67, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 16, 68, 83, 22, 1, 0, 0, 0, 80, 67, 83, 22, 1, 0, 0, 0,176, 61, 83, 22,
- 1, 0, 0, 0,112, 62, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 16, 68, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,112, 68, 83, 22, 1, 0, 0, 0,176, 67, 83, 22, 1, 0, 0, 0, 80, 61, 83, 22,
- 1, 0, 0, 0, 16, 62, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,112, 68, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,208, 68, 83, 22, 1, 0, 0, 0, 16, 68, 83, 22, 1, 0, 0, 0,240, 60, 83, 22,
- 1, 0, 0, 0,208, 62, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,208, 68, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 48, 69, 83, 22, 1, 0, 0, 0,112, 68, 83, 22, 1, 0, 0, 0,112, 62, 83, 22,
- 1, 0, 0, 0, 48, 63, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 48, 69, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,144, 69, 83, 22, 1, 0, 0, 0,208, 68, 83, 22, 1, 0, 0, 0,208, 62, 83, 22,
- 1, 0, 0, 0, 48, 63, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,144, 69, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,240, 69, 83, 22, 1, 0, 0, 0, 48, 69, 83, 22, 1, 0, 0, 0,208, 62, 83, 22,
- 1, 0, 0, 0,144, 63, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,240, 69, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 80, 70, 83, 22, 1, 0, 0, 0,144, 69, 83, 22, 1, 0, 0, 0, 48, 63, 83, 22,
- 1, 0, 0, 0,144, 63, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 80, 70, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,176, 70, 83, 22, 1, 0, 0, 0,240, 69, 83, 22, 1, 0, 0, 0,112, 59, 83, 22,
- 1, 0, 0, 0,240, 63, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,176, 70, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 16, 71, 83, 22, 1, 0, 0, 0, 80, 70, 83, 22, 1, 0, 0, 0,240, 63, 83, 22,
- 1, 0, 0, 0, 80, 64, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 16, 71, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,112, 71, 83, 22, 1, 0, 0, 0,176, 70, 83, 22, 1, 0, 0, 0,144, 60, 83, 22,
- 1, 0, 0, 0, 80, 64, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,112, 71, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,208, 71, 83, 22, 1, 0, 0, 0, 16, 71, 83, 22, 1, 0, 0, 0,176, 61, 83, 22,
- 1, 0, 0, 0, 80, 64, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,208, 71, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 48, 72, 83, 22, 1, 0, 0, 0,112, 71, 83, 22, 1, 0, 0, 0,144, 63, 83, 22,
- 1, 0, 0, 0,240, 63, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 48, 72, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,144, 72, 83, 22, 1, 0, 0, 0,208, 71, 83, 22, 1, 0, 0, 0, 48, 63, 83, 22,
- 1, 0, 0, 0, 80, 64, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,144, 72, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 72, 83, 22, 1, 0, 0, 0,112, 59, 83, 22,
- 1, 0, 0, 0,208, 62, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,240, 72, 83, 22,
- 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0,144, 76, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 60, 83, 22,
- 1, 0, 0, 0,208, 59, 83, 22, 1, 0, 0, 0, 48, 60, 83, 22, 1, 0, 0, 0, 80, 61, 83, 22, 1, 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, 48,206, 83, 22, 1, 0, 0, 0, 48,206, 83, 22, 1, 0, 0, 0,208, 73, 83, 22,
- 1, 0, 0, 0, 48, 75, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,208, 73, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 48, 75, 83, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0, 48, 75, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 73, 83, 22, 1, 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, 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, 68, 65, 84, 65,160, 0, 0, 0,144, 76, 83, 22, 1, 0, 0, 0,198, 0, 0, 0,
- 1, 0, 0, 0, 96, 85, 83, 22, 1, 0, 0, 0,240, 72, 83, 22, 1, 0, 0, 0, 80, 64, 83, 22, 1, 0, 0, 0,176, 61, 83, 22,
- 1, 0, 0, 0, 16, 62, 83, 22, 1, 0, 0, 0,144, 60, 83, 22, 1, 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, 48, 80, 83, 22, 1, 0, 0, 0,240, 83, 83, 22, 1, 0, 0, 0,112, 77, 83, 22, 1, 0, 0, 0,208, 78, 83, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,112, 77, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,208, 78, 83, 22,
- 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,208, 78, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,112, 77, 83, 22, 1, 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, 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, 68, 65, 84, 65,200, 0, 0, 0, 48, 80, 83, 22, 1, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0,240, 83, 83, 22,
- 1, 0, 0, 0, 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, 1, 0, 0, 0,
- 6, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 48, 81, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,144, 82, 83, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,144, 82, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 48, 81, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,246,172, 4,
- 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48,246,172, 4, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,240, 83, 83, 22, 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 48, 80, 83, 22, 1, 0, 0, 0, 48, 81, 83, 22, 1, 0, 0, 0,144, 82, 83, 22, 1, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 96, 85, 83, 22, 1, 0, 0, 0,198, 0, 0, 0,
- 1, 0, 0, 0,224,119, 83, 22, 1, 0, 0, 0,144, 76, 83, 22, 1, 0, 0, 0,176, 61, 83, 22, 1, 0, 0, 0,112, 62, 83, 22,
- 1, 0, 0, 0, 80, 61, 83, 22, 1, 0, 0, 0, 16, 62, 83, 22, 1, 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,192,107, 83, 22, 1, 0, 0, 0,112,118, 83, 22, 1, 0, 0, 0, 64, 86, 83, 22, 1, 0, 0, 0,160, 87, 83, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64, 86, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,160, 87, 83, 22,
- 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,160, 87, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 64, 86, 83, 22, 1, 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, 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, 89, 83, 22, 1, 0, 0, 0, 48,106, 83, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 0, 89, 83, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,144, 90, 83, 22,
- 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,144, 90, 83, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 32, 92, 83, 22, 1, 0, 0, 0, 0, 89, 83, 22, 1, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 32, 92, 83, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,176, 93, 83, 22,
- 1, 0, 0, 0,144, 90, 83, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,176, 93, 83, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 64, 95, 83, 22, 1, 0, 0, 0, 32, 92, 83, 22, 1, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 64, 95, 83, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,208, 96, 83, 22,
- 1, 0, 0, 0,176, 93, 83, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,208, 96, 83, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 96, 98, 83, 22, 1, 0, 0, 0, 64, 95, 83, 22, 1, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 96, 98, 83, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,240, 99, 83, 22,
- 1, 0, 0, 0,208, 96, 83, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,240, 99, 83, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,128,101, 83, 22, 1, 0, 0, 0, 96, 98, 83, 22, 1, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,128,101, 83, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 16,103, 83, 22,
- 1, 0, 0, 0,240, 99, 83, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 16,103, 83, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,160,104, 83, 22, 1, 0, 0, 0,128,101, 83, 22, 1, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,160,104, 83, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 48,106, 83, 22,
- 1, 0, 0, 0, 16,103, 83, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 48,106, 83, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,104, 83, 22, 1, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 1, 0, 0,192,107, 83, 22, 1, 0, 0, 0,165, 0, 0, 0, 1, 0, 0, 0,128,114, 83, 22,
- 1, 0, 0, 0, 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, 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,
- 40, 1, 0, 0, 0,109, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 96,110, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 96,110, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,192,111, 83, 22, 1, 0, 0, 0, 0,109, 83, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,192,111, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 32,113, 83, 22, 1, 0, 0, 0, 96,110, 83, 22,
- 1, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 32,113, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,111, 83, 22,
- 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,114, 83, 22, 1, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0,112,118, 83, 22, 1, 0, 0, 0,192,107, 83, 22,
- 1, 0, 0, 0, 0,109, 83, 22, 1, 0, 0, 0, 32,113, 83, 22, 1, 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, 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, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,176,115, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 16,117, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 16,117, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176,115, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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,250,172, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48,250,172, 4, 1, 0, 0, 0,159, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,112,118, 83, 22, 1, 0, 0, 0,160, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,114, 83, 22, 1, 0, 0, 0,176,115, 83, 22, 1, 0, 0, 0, 16,117, 83, 22,
- 1, 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, 48,240,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,224,119, 83, 22,
- 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0,144,154, 83, 22, 1, 0, 0, 0, 96, 85, 83, 22, 1, 0, 0, 0,240, 63, 83, 22,
- 1, 0, 0, 0,144, 63, 83, 22, 1, 0, 0, 0, 48, 63, 83, 22, 1, 0, 0, 0, 80, 64, 83, 22, 1, 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,144,138, 83, 22, 1, 0, 0, 0,144,153, 83, 22, 1, 0, 0, 0,192,120, 83, 22,
- 1, 0, 0, 0, 48,137, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,192,120, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 32,122, 83, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0, 32,122, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,128,123, 83, 22, 1, 0, 0, 0,192,120, 83, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,128,123, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,224,124, 83, 22, 1, 0, 0, 0, 32,122, 83, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,224,124, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 48,137, 83, 22, 1, 0, 0, 0,128,123, 83, 22, 1, 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, 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, 64,126, 83, 22,
- 1, 0, 0, 0,160,135, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 64,126, 83, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0,208,127, 83, 22, 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0,208,127, 83, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 96,129, 83, 22, 1, 0, 0, 0, 64,126, 83, 22,
- 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 96,129, 83, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0,240,130, 83, 22, 1, 0, 0, 0,208,127, 83, 22, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0,240,130, 83, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,128,132, 83, 22, 1, 0, 0, 0, 96,129, 83, 22,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,128,132, 83, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0, 16,134, 83, 22, 1, 0, 0, 0,240,130, 83, 22, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0, 16,134, 83, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,160,135, 83, 22, 1, 0, 0, 0,128,132, 83, 22,
- 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,160,135, 83, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,134, 83, 22, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 1, 0, 0, 48,137, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,124, 83, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 48,254,172, 4, 1, 0, 0, 0, 68, 65, 84, 65,
-104, 3, 0, 0, 48,254,172, 4, 1, 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,144,138, 83, 22, 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0,192,142, 83, 22, 1, 0, 0, 0, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 40, 1, 0, 0, 0,140, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 96,141, 83, 22,
- 1, 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,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,
- 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 96,141, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,140, 83, 22, 1, 0, 0, 0, 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,
- 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,192,142, 83, 22, 1, 0, 0, 0,176, 0, 0, 0, 1, 0, 0, 0,160,149, 83, 22,
- 1, 0, 0, 0,144,138, 83, 22, 1, 0, 0, 0, 0,140, 83, 22, 1, 0, 0, 0, 96,141, 83, 22, 1, 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, 0, 0, 0, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 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,
- 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,
- 40, 1, 0, 0, 32,144, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,128,145, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,128,145, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,224,146, 83, 22, 1, 0, 0, 0, 32,144, 83, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,224,146, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 64,148, 83, 22, 1, 0, 0, 0,128,145, 83, 22,
- 1, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 64,148, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,146, 83, 22,
- 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,149, 83, 22, 1, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0,144,153, 83, 22, 1, 0, 0, 0,192,142, 83, 22,
- 1, 0, 0, 0, 32,144, 83, 22, 1, 0, 0, 0, 64,148, 83, 22, 1, 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, 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, 40, 1, 0, 0,208,150, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 48,152, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48,152, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,150, 83, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,200, 0, 0, 0,144,153, 83, 22, 1, 0, 0, 0,175, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,149, 83, 22, 1, 0, 0, 0,208,150, 83, 22, 1, 0, 0, 0, 48,152, 83, 22,
- 1, 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, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,144,154, 83, 22, 1, 0, 0, 0,198, 0, 0, 0,
- 1, 0, 0, 0, 80,178, 83, 22, 1, 0, 0, 0,224,119, 83, 22, 1, 0, 0, 0,208, 62, 83, 22, 1, 0, 0, 0,240, 60, 83, 22,
- 1, 0, 0, 0,112, 62, 83, 22, 1, 0, 0, 0, 48, 63, 83, 22, 1, 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, 48,158, 83, 22, 1, 0, 0, 0, 80,177, 83, 22, 1, 0, 0, 0,112,155, 83, 22, 1, 0, 0, 0,208,156, 83, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,112,155, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,208,156, 83, 22,
- 1, 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,
- 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, 68, 65, 84, 65, 40, 1, 0, 0,208,156, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,112,155, 83, 22, 1, 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,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, 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, 68, 65, 84, 65, 32, 1, 0, 0, 48,158, 83, 22, 1, 0, 0, 0,176, 0, 0, 0, 1, 0, 0, 0, 16,165, 83, 22,
- 1, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,218,173, 4, 1, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 1, 0, 0,144,159, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,240,160, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,240,160, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 80,162, 83, 22, 1, 0, 0, 0,144,159, 83, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 80,162, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,176,163, 83, 22, 1, 0, 0, 0,240,160, 83, 22,
- 1, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,176,163, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,162, 83, 22,
- 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,165, 83, 22, 1, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0, 32,173, 83, 22, 1, 0, 0, 0, 48,158, 83, 22,
- 1, 0, 0, 0,144,159, 83, 22, 1, 0, 0, 0,176,163, 83, 22, 1, 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, 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, 40, 1, 0, 0, 64,166, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,160,167, 83, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,160,167, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0,169, 83, 22, 1, 0, 0, 0, 64,166, 83, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0,169, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 96,170, 83, 22, 1, 0, 0, 0,160,167, 83, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 96,170, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,192,171, 83, 22, 1, 0, 0, 0, 0,169, 83, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,192,171, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,170, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48, 2,173, 4, 1, 0, 0, 0,159, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0, 32,173, 83, 22, 1, 0, 0, 0,160, 0, 0, 0,
- 1, 0, 0, 0, 80,177, 83, 22, 1, 0, 0, 0, 16,165, 83, 22, 1, 0, 0, 0, 64,166, 83, 22, 1, 0, 0, 0,192,171, 83, 22,
- 1, 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, 48,240,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 40, 1, 0, 0,144,174, 83, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,240,175, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,240,175, 83, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,174, 83, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,200, 0, 0, 0, 80,177, 83, 22,
- 1, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,173, 83, 22, 1, 0, 0, 0,144,174, 83, 22,
- 1, 0, 0, 0,240,175, 83, 22, 1, 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, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 80,178, 83, 22,
- 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,154, 83, 22, 1, 0, 0, 0,112, 59, 83, 22,
- 1, 0, 0, 0,208, 62, 83, 22, 1, 0, 0, 0,144, 63, 83, 22, 1, 0, 0, 0,240, 63, 83, 22, 1, 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, 48, 6,173, 4, 1, 0, 0, 0, 48,205, 83, 22, 1, 0, 0, 0, 48,179, 83, 22,
- 1, 0, 0, 0,240,181, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48,179, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,144,180, 83, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,144,180, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,240,181, 83, 22, 1, 0, 0, 0, 48,179, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0,240,181, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,180, 83, 22, 1, 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, 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, 68, 65, 84, 65,216, 24, 0, 0, 48, 6,173, 4, 1, 0, 0, 0,170, 0, 0, 0,
- 1, 0, 0, 0, 16,186, 83, 22, 1, 0, 0, 0, 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,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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 80,183, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,176,184, 83, 22, 1, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,176,184, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,183, 83, 22,
- 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 16,186, 83, 22, 1, 0, 0, 0,176, 0, 0, 0, 1, 0, 0, 0,240,192, 83, 22, 1, 0, 0, 0, 48, 6,173, 4,
- 1, 0, 0, 0, 80,183, 83, 22, 1, 0, 0, 0,176,184, 83, 22, 1, 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,
- 0, 0, 0, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 40, 1, 0, 0,112,187, 83, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,208,188, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,208,188, 83, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 48,190, 83, 22, 1, 0, 0, 0,112,187, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 48,190, 83, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,144,191, 83, 22, 1, 0, 0, 0,208,188, 83, 22, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,144,191, 83, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,190, 83, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,192, 83, 22,
- 1, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0, 0,201, 83, 22, 1, 0, 0, 0, 16,186, 83, 22, 1, 0, 0, 0,112,187, 83, 22,
- 1, 0, 0, 0,144,191, 83, 22, 1, 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,
- 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, 40, 1, 0, 0, 32,194, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,128,195, 83, 22,
- 1, 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,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,
- 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128,195, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,224,196, 83, 22,
- 1, 0, 0, 0, 32,194, 83, 22, 1, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,224,196, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 64,198, 83, 22,
- 1, 0, 0, 0,128,195, 83, 22, 1, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64,198, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,160,199, 83, 22,
- 1, 0, 0, 0,224,196, 83, 22, 1, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,160,199, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 64,198, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 32,173, 4,
- 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48, 32,173, 4, 1, 0, 0, 0,159, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0, 0,201, 83, 22, 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0, 48,205, 83, 22,
- 1, 0, 0, 0,240,192, 83, 22, 1, 0, 0, 0, 32,194, 83, 22, 1, 0, 0, 0,160,199, 83, 22, 1, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 40, 1, 0, 0,112,202, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,208,203, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,208,203, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,202, 83, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,200, 0, 0, 0, 48,205, 83, 22, 1, 0, 0, 0,175, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,201, 83, 22, 1, 0, 0, 0,112,202, 83, 22, 1, 0, 0, 0,208,203, 83, 22,
- 1, 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, 1, 0, 0, 0, 6, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0,176,206, 83, 22, 1, 0, 0, 0,194, 0, 0, 0,
- 1, 0, 0, 0, 48, 67, 84, 22, 1, 0, 0, 0, 96, 58, 83, 22, 1, 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,192,207, 83, 22, 1, 0, 0, 0,224,211, 83, 22, 1, 0, 0, 0, 64,212, 83, 22,
- 1, 0, 0, 0,160,218, 83, 22, 1, 0, 0, 0, 0,219, 83, 22, 1, 0, 0, 0,208, 17, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,218,173, 4, 1, 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, 32,210, 22, 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, 32, 0, 0, 0,192,207, 83, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 32,208, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 32,208, 83, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0,128,208, 83, 22, 1, 0, 0, 0,192,207, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 4,
- 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,128,208, 83, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,224,208, 83, 22,
- 1, 0, 0, 0, 32,208, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7,128, 4, 0, 0, 0, 0, 68, 65, 84, 65,
- 32, 0, 0, 0,224,208, 83, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 64,209, 83, 22, 1, 0, 0, 0,128,208, 83, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 64,209, 83, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,160,209, 83, 22, 1, 0, 0, 0,224,208, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,101, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,160,209, 83, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0, 0,210, 83, 22, 1, 0, 0, 0, 64,209, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7,101, 4,
- 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 0,210, 83, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 96,210, 83, 22,
- 1, 0, 0, 0,160,209, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 32, 0, 0, 0, 96,210, 83, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,192,210, 83, 22, 1, 0, 0, 0, 0,210, 83, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 6,101, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,192,210, 83, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 32,211, 83, 22, 1, 0, 0, 0, 96,210, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 40, 6,120, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 32,211, 83, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0,128,211, 83, 22, 1, 0, 0, 0,192,210, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7,120, 3,
- 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,128,211, 83, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,224,211, 83, 22,
- 1, 0, 0, 0, 32,211, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 1, 0, 0, 0, 68, 65, 84, 65,
- 32, 0, 0, 0,224,211, 83, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,211, 83, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 6, 84, 0, 1, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 64,212, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,160,212, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,208, 83, 22,
- 1, 0, 0, 0,128,208, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,160,212, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 0,213, 83, 22, 1, 0, 0, 0, 64,212, 83, 22, 1, 0, 0, 0, 32,208, 83, 22,
- 1, 0, 0, 0, 64,209, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 0,213, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 96,213, 83, 22, 1, 0, 0, 0,160,212, 83, 22, 1, 0, 0, 0,128,208, 83, 22,
- 1, 0, 0, 0,160,209, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 96,213, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,192,213, 83, 22, 1, 0, 0, 0, 0,213, 83, 22, 1, 0, 0, 0, 64,209, 83, 22,
- 1, 0, 0, 0,160,209, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,192,213, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 32,214, 83, 22, 1, 0, 0, 0, 96,213, 83, 22, 1, 0, 0, 0,192,207, 83, 22,
- 1, 0, 0, 0, 0,210, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 32,214, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,128,214, 83, 22, 1, 0, 0, 0,192,213, 83, 22, 1, 0, 0, 0,224,208, 83, 22,
- 1, 0, 0, 0, 0,210, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,128,214, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,224,214, 83, 22, 1, 0, 0, 0, 32,214, 83, 22, 1, 0, 0, 0, 64,209, 83, 22,
- 1, 0, 0, 0, 96,210, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,224,214, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 64,215, 83, 22, 1, 0, 0, 0,128,214, 83, 22, 1, 0, 0, 0,160,209, 83, 22,
- 1, 0, 0, 0, 96,210, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 64,215, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,160,215, 83, 22, 1, 0, 0, 0,224,214, 83, 22, 1, 0, 0, 0, 0,210, 83, 22,
- 1, 0, 0, 0,192,210, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,160,215, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 0,216, 83, 22, 1, 0, 0, 0, 64,215, 83, 22, 1, 0, 0, 0, 96,210, 83, 22,
- 1, 0, 0, 0,192,210, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 0,216, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 96,216, 83, 22, 1, 0, 0, 0,160,215, 83, 22, 1, 0, 0, 0,160,209, 83, 22,
- 1, 0, 0, 0, 32,211, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 96,216, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,192,216, 83, 22, 1, 0, 0, 0, 0,216, 83, 22, 1, 0, 0, 0,224,208, 83, 22,
- 1, 0, 0, 0, 32,211, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,192,216, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 32,217, 83, 22, 1, 0, 0, 0, 96,216, 83, 22, 1, 0, 0, 0,192,210, 83, 22,
- 1, 0, 0, 0, 32,211, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 32,217, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,128,217, 83, 22, 1, 0, 0, 0,192,216, 83, 22, 1, 0, 0, 0,192,207, 83, 22,
- 1, 0, 0, 0,128,211, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,128,217, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,224,217, 83, 22, 1, 0, 0, 0, 32,217, 83, 22, 1, 0, 0, 0, 64,209, 83, 22,
- 1, 0, 0, 0,128,211, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,224,217, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 64,218, 83, 22, 1, 0, 0, 0,128,217, 83, 22, 1, 0, 0, 0, 96,210, 83, 22,
- 1, 0, 0, 0,224,211, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 64,218, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,160,218, 83, 22, 1, 0, 0, 0,224,217, 83, 22, 1, 0, 0, 0, 0,210, 83, 22,
- 1, 0, 0, 0,224,211, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,160,218, 83, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,218, 83, 22, 1, 0, 0, 0,128,211, 83, 22,
- 1, 0, 0, 0,224,211, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 0,219, 83, 22,
- 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0,160,222, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,209, 83, 22,
- 1, 0, 0, 0, 32,208, 83, 22, 1, 0, 0, 0,128,208, 83, 22, 1, 0, 0, 0,160,209, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0,102, 4, 0, 0,128, 4, 0, 0, 7, 7,129, 7, 27, 0, 1, 0, 0, 0, 0, 0,
- 7, 0, 0, 0,128, 96, 97, 21, 1, 0, 0, 0,176, 66, 84, 22, 1, 0, 0, 0,176, 66, 84, 22, 1, 0, 0, 0,224,219, 83, 22,
- 1, 0, 0, 0, 64,221, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 84, 96, 21,
- 1, 0, 0, 0,160,216, 90, 22, 1, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,224,219, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 64,221, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,147, 68, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0, 32,240, 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,128, 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,129, 7, 26, 0,129, 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, 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0,102, 4, 0, 0,127, 4, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,129, 7, 26, 0, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,112, 98, 97, 21, 1, 0, 0, 0, 48, 16,181, 29, 1, 0, 0, 0, 48, 16,181, 29, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,217, 90, 22, 1, 0, 0, 0, 16,221, 90, 22, 1, 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, 64,221, 83, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,219, 83, 22, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0,128, 4, 0, 0,128, 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,144, 97, 97, 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, 68, 65, 84, 65,160, 0, 0, 0,160,222, 83, 22, 1, 0, 0, 0,198, 0, 0, 0,
- 1, 0, 0, 0,112,250, 83, 22, 1, 0, 0, 0, 0,219, 83, 22, 1, 0, 0, 0, 0,210, 83, 22, 1, 0, 0, 0,192,210, 83, 22,
- 1, 0, 0, 0, 32,211, 83, 22, 1, 0, 0, 0,224,208, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 6, 0, 0,
-128, 7, 0, 0, 0, 0, 0, 0,119, 3, 0, 0, 4, 4, 88, 1,120, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 92, 97, 21,
- 1, 0, 0, 0, 0,245, 83, 22, 1, 0, 0, 0, 0,249, 83, 22, 1, 0, 0, 0,128,223, 83, 22, 1, 0, 0, 0,224,224, 83, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,221, 90, 22, 1, 0, 0, 0,160,194, 52, 30,
- 1, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,128,223, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,224,224, 83, 22,
- 1, 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,172, 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, 87, 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, 88, 1, 31, 0, 88, 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,
- 0, 0, 0, 0, 41, 6, 0, 0,128, 7, 0, 0, 89, 3, 0, 0,119, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 88, 1, 31, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 95, 97, 21,
- 1, 0, 0, 0, 48,190,179, 29, 1, 0, 0, 0, 48,190,179, 29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,208,224, 90, 22, 1, 0, 0, 0, 16,227, 90, 22, 1, 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,224,224, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,128,223, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0,128,171, 67, 0, 0, 86,196, 0, 0, 0, 0, 0, 0, 0, 0,
-251,127,163, 67,249, 63, 86,196, 0, 0, 0, 0, 71, 1, 0, 0, 88, 1, 0, 0, 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0,
- 74, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 70, 1, 0, 0, 0, 0, 0, 0, 88, 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, 88, 1, 89, 3, 71, 1, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,232, 48, 30, 1, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 41, 6, 0, 0,128, 7, 0, 0, 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 88, 1, 89, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 93, 97, 21,
- 1, 0, 0, 0, 48,202,192, 29, 1, 0, 0, 0, 48,184,186, 29, 1, 0, 0, 0, 64,226, 83, 22, 1, 0, 0, 0,112,243, 83, 22,
- 1, 0, 0, 0, 48,228, 90, 22, 1, 0, 0, 0,208,231, 90, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 64,226, 83, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,208,227, 83, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 94, 97, 21, 1, 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,
- 70, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,208,227, 83, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 96,229, 83, 22, 1, 0, 0, 0, 64,226, 83, 22, 1, 0, 0, 0, 80, 73,123, 28,
- 1, 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, 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, 70, 1, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 96,229, 83, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,240,230, 83, 22,
- 1, 0, 0, 0,208,227, 83, 22, 1, 0, 0, 0,144, 75,123, 28, 1, 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, 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,
- 70, 1,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,
- 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, 88, 1, 0, 0,240,230, 83, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,128,232, 83, 22, 1, 0, 0, 0, 96,229, 83, 22, 1, 0, 0, 0,208, 77,123, 28,
- 1, 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, 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, 70, 1,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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,128,232, 83, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 16,234, 83, 22,
- 1, 0, 0, 0,240,230, 83, 22, 1, 0, 0, 0, 16, 80,123, 28, 1, 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, 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,
- 70, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 16,234, 83, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,160,235, 83, 22, 1, 0, 0, 0,128,232, 83, 22, 1, 0, 0, 0,128, 10,119, 28,
- 1, 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, 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, 70, 1,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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,160,235, 83, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 48,237, 83, 22,
- 1, 0, 0, 0, 16,234, 83, 22, 1, 0, 0, 0,128, 85,123, 28, 1, 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, 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,
- 70, 1,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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 48,237, 83, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,192,238, 83, 22, 1, 0, 0, 0,160,235, 83, 22, 1, 0, 0, 0, 96, 3,119, 28,
- 1, 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, 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, 70, 1,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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,192,238, 83, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 80,240, 83, 22,
- 1, 0, 0, 0, 48,237, 83, 22, 1, 0, 0, 0,240, 90,123, 28, 1, 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, 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,
- 70, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 80,240, 83, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,224,241, 83, 22, 1, 0, 0, 0,192,238, 83, 22, 1, 0, 0, 0, 48, 93,123, 28,
- 1, 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, 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, 70, 1,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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,224,241, 83, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,112,243, 83, 22,
- 1, 0, 0, 0, 80,240, 83, 22, 1, 0, 0, 0,160, 17,119, 28, 1, 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, 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,
- 70, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,112,243, 83, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,241, 83, 22, 1, 0, 0, 0, 80, 82,123, 28,
- 1, 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, 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, 70, 1, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 1, 0, 0, 0,245, 83, 22, 1, 0, 0, 0,165, 0, 0, 0, 1, 0, 0, 0, 0,249, 83, 22,
- 1, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0,
- 0, 0, 0, 0,128,145, 49, 30, 1, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 1, 0, 0, 64,246, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,160,247, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,160,247, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,246, 83, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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, 36,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,
-104, 3, 0, 0, 48, 36,173, 4, 1, 0, 0, 0,159, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 48, 1, 0, 0, 0,249, 83, 22, 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 83, 22,
- 1, 0, 0, 0, 64,246, 83, 22, 1, 0, 0, 0,160,247, 83, 22, 1, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,112,250, 83, 22, 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0, 64, 3, 84, 22,
- 1, 0, 0, 0,160,222, 83, 22, 1, 0, 0, 0,192,207, 83, 22, 1, 0, 0, 0,128,211, 83, 22, 1, 0, 0, 0,224,211, 83, 22,
- 1, 0, 0, 0, 0,210, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 6, 0, 0, 0, 0, 0, 0,
- 83, 0, 0, 0, 15, 15, 40, 6, 84, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 51, 97, 21, 1, 0, 0, 0, 16,254, 83, 22,
- 1, 0, 0, 0,208, 1, 84, 22, 1, 0, 0, 0, 80,251, 83, 22, 1, 0, 0, 0,176,252, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 25, 95, 29, 1, 0, 0, 0, 0, 25, 95, 29, 1, 0, 0, 0, 68, 65, 84, 65,
- 40, 1, 0, 0, 80,251, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,176,252, 83, 22, 1, 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,197, 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, 39, 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, 40, 6, 26, 0, 40, 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, 0, 0, 0, 0,
- 39, 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, 40, 6, 26, 0,
- 5, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 53, 97, 21, 1, 0, 0, 0, 48,144,172, 4,
- 1, 0, 0, 0, 48,144,172, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,234, 90, 22,
- 1, 0, 0, 0, 80,241, 90, 22, 1, 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,176,252, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,251, 83, 22,
- 1, 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, 39, 6, 0, 0, 0, 0, 0, 0,
- 17, 0, 0, 0, 0, 0, 0, 0, 39, 6, 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, 40, 6, 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,
- 39, 6, 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, 40, 6, 58, 0,
- 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 97, 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,112,242, 90, 22,
- 1, 0, 0, 0,128,247, 90, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-200, 0, 0, 0, 16,254, 83, 22, 1, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0,208, 1, 84, 22, 1, 0, 0, 0, 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, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,
- 40, 1, 0, 0, 16,255, 83, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,112, 0, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,112, 0, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,255, 83, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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, 40,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,
-104, 3, 0, 0, 48, 40,173, 4, 1, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 48, 1, 0, 0,208, 1, 84, 22, 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,254, 83, 22,
- 1, 0, 0, 0, 16,255, 83, 22, 1, 0, 0, 0,112, 0, 84, 22, 1, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 64, 3, 84, 22, 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0,208, 17, 84, 22,
- 1, 0, 0, 0,112,250, 83, 22, 1, 0, 0, 0,192,210, 83, 22, 1, 0, 0, 0, 96,210, 83, 22, 1, 0, 0, 0,160,209, 83, 22,
- 1, 0, 0, 0, 32,211, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 6, 0, 0,128, 7, 0, 0,121, 3, 0, 0,
-100, 4, 0, 0, 3, 3, 88, 1,236, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 97, 21, 1, 0, 0, 0,224, 6, 84, 22,
- 1, 0, 0, 0, 96, 16, 84, 22, 1, 0, 0, 0, 32, 4, 84, 22, 1, 0, 0, 0,128, 5, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 94, 95, 22, 1, 0, 0, 0,192, 58, 53, 30, 1, 0, 0, 0, 68, 65, 84, 65,
- 40, 1, 0, 0, 32, 4, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,128, 5, 84, 22, 1, 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,172, 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, 87, 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, 88, 1, 26, 0, 88, 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, 41, 6, 0, 0,
-128, 7, 0, 0, 75, 4, 0, 0,100, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 1, 26, 0,
- 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 51, 97, 21, 1, 0, 0, 0, 48, 76,202, 29,
- 1, 0, 0, 0, 48, 76,202, 29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,249, 90, 22,
- 1, 0, 0, 0, 0,253, 90, 22, 1, 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,128, 5, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 4, 84, 22,
- 1, 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,163, 67, 0, 0, 64,195,
- 0, 0, 0, 0, 71, 1, 0, 0, 88, 1, 0, 0, 18, 0, 0, 0,209, 0, 0, 0, 0, 0, 0, 0, 70, 1, 0, 0, 0, 0, 0, 0,
- 17, 0, 0, 0, 0, 0, 0, 0, 70, 1, 0, 0, 18, 0, 0, 0,209, 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, 88, 1,210, 0, 71, 1,
-192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 6, 0, 0,
-128, 7, 0, 0,121, 3, 0, 0, 74, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 1,210, 0,
- 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 27, 96, 21, 1, 0, 0, 0, 48,216,190, 29,
- 1, 0, 0, 0, 48,216,190, 29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,253, 90, 22,
- 1, 0, 0, 0,240,255, 90, 22, 1, 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,224, 6, 84, 22, 1, 0, 0, 0,169, 0, 0, 0, 1, 0, 0, 0, 96, 12, 84, 22, 1, 0, 0, 0, 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, 32,122, 49, 30, 1, 0, 0, 0, 32,122, 49, 30, 1, 0, 0, 0, 64, 8, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 64, 8, 84, 22, 1, 0, 0, 0,222, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0,144, 8, 84, 22,
- 1, 0, 0, 0, 68, 65, 84, 65,208, 0, 0, 0,144, 8, 84, 22, 1, 0, 0, 0,221, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 0, 48,218,173, 4, 1, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0, 48,218,173, 4, 1, 0, 0, 0, 20, 0, 0, 0,
- 1, 0, 1, 0, 48,218,173, 4, 1, 0, 0, 0, 21, 0, 1, 0, 1, 0, 1, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 48,230,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,246,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 64, 89, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48, 2,174, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 64, 87, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,252,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 48,226,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 64, 81, 86, 22, 1, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,160, 9, 84, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 11, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 11, 84, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 9, 84, 22, 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 96, 12, 84, 22, 1, 0, 0, 0,165, 0, 0, 0,
- 1, 0, 0, 0, 96, 16, 84, 22, 1, 0, 0, 0,224, 6, 84, 22, 1, 0, 0, 0,160, 9, 84, 22, 1, 0, 0, 0, 0, 11, 84, 22,
- 1, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,160, 13, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 15, 84, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 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,
- 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 15, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,160, 13, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 44,173, 4,
- 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48, 44,173, 4, 1, 0, 0, 0,159, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0, 96, 16, 84, 22, 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 96, 12, 84, 22, 1, 0, 0, 0,160, 13, 84, 22, 1, 0, 0, 0, 0, 15, 84, 22, 1, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,208, 17, 84, 22, 1, 0, 0, 0,198, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 3, 84, 22, 1, 0, 0, 0,128,211, 83, 22, 1, 0, 0, 0, 64,209, 83, 22,
- 1, 0, 0, 0, 96,210, 83, 22, 1, 0, 0, 0,224,211, 83, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 39, 6, 0, 0, 85, 0, 0, 0,100, 4, 0, 0, 1, 1, 40, 6, 16, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 54, 97, 21,
- 1, 0, 0, 0,128, 61, 84, 22, 1, 0, 0, 0,176, 65, 84, 22, 1, 0, 0, 0,176, 18, 84, 22, 1, 0, 0, 0, 32, 60, 84, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,184, 52, 30, 1, 0, 0, 0,160,242,120, 28,
- 1, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,176, 18, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 16, 20, 84, 22,
- 1, 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, 0,197, 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, 39, 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, 40, 6, 26, 0, 40, 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, 0, 0, 0, 0, 39, 6, 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, 40, 6, 26, 0, 9, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 65, 97, 21,
- 1, 0, 0, 0, 48,202,180, 29, 1, 0, 0, 0, 48,202,180, 29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,176, 3, 91, 22, 1, 0, 0, 0, 48, 8, 91, 22, 1, 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, 16, 20, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 80, 43, 84, 22,
- 1, 0, 0, 0,176, 18, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 67, 0,128, 95,196, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 15, 67, 0,128, 95,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,125, 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, 0, 0, 0, 0,125, 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,160, 0,126, 3,143, 0,126, 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,159, 0, 0, 0,231, 0, 0, 0,100, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,160, 0,126, 3, 10, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 61, 97, 21,
- 1, 0, 0, 0, 48,100,188, 29, 1, 0, 0, 0, 48,212,180, 29, 1, 0, 0, 0,112, 21, 84, 22, 1, 0, 0, 0,192, 41, 84, 22,
- 1, 0, 0, 0, 80, 9, 91, 22, 1, 0, 0, 0, 32,119, 93, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,112, 21, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 23, 84, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 62, 97, 21, 1, 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, 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, 68, 65, 84, 65, 88, 1, 0, 0, 0, 23, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,144, 24, 84, 22, 1, 0, 0, 0,112, 21, 84, 22, 1, 0, 0, 0, 32,184,125, 28,
- 1, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,144, 24, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 32, 26, 84, 22,
- 1, 0, 0, 0, 0, 23, 84, 22, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 32, 26, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,176, 27, 84, 22, 1, 0, 0, 0,144, 24, 84, 22, 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,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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,176, 27, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 64, 29, 84, 22,
- 1, 0, 0, 0, 32, 26, 84, 22, 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,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,
- 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, 88, 1, 0, 0, 64, 29, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,208, 30, 84, 22, 1, 0, 0, 0,176, 27, 84, 22, 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,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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,208, 30, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 96, 32, 84, 22,
- 1, 0, 0, 0, 64, 29, 84, 22, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 96, 32, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,240, 33, 84, 22, 1, 0, 0, 0,208, 30, 84, 22, 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,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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,240, 33, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,128, 35, 84, 22,
- 1, 0, 0, 0, 96, 32, 84, 22, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,128, 35, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 16, 37, 84, 22, 1, 0, 0, 0,240, 33, 84, 22, 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,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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 16, 37, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,160, 38, 84, 22,
- 1, 0, 0, 0,128, 35, 84, 22, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,160, 38, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 48, 40, 84, 22, 1, 0, 0, 0, 16, 37, 84, 22, 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,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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 48, 40, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,192, 41, 84, 22,
- 1, 0, 0, 0,160, 38, 84, 22, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,192, 41, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 40, 84, 22, 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,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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 80, 43, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 64, 46, 84, 22,
- 1, 0, 0, 0, 16, 20, 84, 22, 1, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0,111, 0, 0, 0,230, 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,176, 63, 97, 21,
- 1, 0, 0, 0, 48,250,186, 29, 1, 0, 0, 0, 48,250,186, 29, 1, 0, 0, 0,176, 44, 84, 22, 1, 0, 0, 0,176, 44, 84, 22,
- 1, 0, 0, 0,224,119, 93, 22, 1, 0, 0, 0, 32,122, 93, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,176, 44, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 64, 97, 21, 1, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 64, 46, 84, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 32, 60, 84, 22, 1, 0, 0, 0, 80, 43, 84, 22, 1, 0, 0, 0, 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, 0, 0, 0, 0, 39, 6, 0, 0, 39, 6, 0, 0,111, 0, 0, 0,
-100, 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,176, 56, 97, 21, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,160, 47, 84, 22, 1, 0, 0, 0,144, 58, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,160, 47, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 48, 49, 84, 22, 1, 0, 0, 0, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 48, 49, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,192, 50, 84, 22,
- 1, 0, 0, 0,160, 47, 84, 22, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,192, 50, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 80, 52, 84, 22, 1, 0, 0, 0, 48, 49, 84, 22, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 80, 52, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,224, 53, 84, 22,
- 1, 0, 0, 0,192, 50, 84, 22, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,224, 53, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,112, 55, 84, 22, 1, 0, 0, 0, 80, 52, 84, 22, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,112, 55, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 57, 84, 22,
- 1, 0, 0, 0,224, 53, 84, 22, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 0, 57, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,144, 58, 84, 22, 1, 0, 0, 0,112, 55, 84, 22, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,144, 58, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 57, 84, 22, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 32, 60, 84, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 46, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 39, 6, 0, 0,111, 0, 0, 0,
-100, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 5,246, 3, 12, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 55, 97, 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,160,150, 93, 22, 1, 0, 0, 0,224,149, 93, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48, 48,173, 4,
- 1, 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,
-194,128,195, 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,128,
- 0, 0, 0,128, 74,215, 76,190, 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,110, 21, 29,191, 48,180, 81,191,184,158, 81,191,117, 90,127, 63,
-134,110,151, 62, 26, 63,185, 62, 35, 44,185, 62,145,180,109,188,224,251,174, 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, 97,116, 85, 63, 32,181, 70,188, 0, 0, 72,179,201,171,134,190,
- 82,211, 1, 62,111, 4, 22, 63, 0, 0, 64, 50, 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,110, 21, 29,191, 48,180, 81,191,184,158, 81,191,117, 90,127, 63,
-134,110,151, 62, 26, 63,185, 62, 35, 44,185, 62,145,180,109,188,224,251,174, 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,158,210,185, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-158,210,185, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,158,210,185, 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,252, 66,169, 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,128, 61, 84, 22,
- 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0,176, 65, 84, 22, 1, 0, 0, 0, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
- 40, 1, 0, 0,240, 62, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 80, 64, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 80, 64, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 62, 84, 22,
- 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-200, 0, 0, 0,176, 65, 84, 22, 1, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 61, 84, 22,
- 1, 0, 0, 0,240, 62, 84, 22, 1, 0, 0, 0, 80, 64, 84, 22, 1, 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, 1, 0, 0, 0, 6, 0, 0, 0, 83, 78, 0, 0,
-208, 0, 0, 0, 48, 67, 84, 22, 1, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 0,242, 84, 22, 1, 0, 0, 0,176,206, 83, 22,
- 1, 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, 64, 68, 84, 22,
- 1, 0, 0, 0, 32, 73, 84, 22, 1, 0, 0, 0,128, 73, 84, 22, 1, 0, 0, 0, 0, 81, 84, 22, 1, 0, 0, 0, 96, 81, 84, 22,
- 1, 0, 0, 0, 64,212, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,218,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64, 68, 84, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,160, 68, 84, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 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,160, 68, 84, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 69, 84, 22, 1, 0, 0, 0, 64, 68, 84, 22,
- 1, 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, 0, 69, 84, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 96, 69, 84, 22, 1, 0, 0, 0,160, 68, 84, 22, 1, 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, 96, 69, 84, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0,192, 69, 84, 22, 1, 0, 0, 0, 0, 69, 84, 22, 1, 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,192, 69, 84, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 32, 70, 84, 22,
- 1, 0, 0, 0, 96, 69, 84, 22, 1, 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, 32, 70, 84, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,128, 70, 84, 22, 1, 0, 0, 0,192, 69, 84, 22,
- 1, 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,128, 70, 84, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,224, 70, 84, 22, 1, 0, 0, 0, 32, 70, 84, 22, 1, 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,224, 70, 84, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0, 64, 71, 84, 22, 1, 0, 0, 0,128, 70, 84, 22, 1, 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, 64, 71, 84, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,160, 71, 84, 22,
- 1, 0, 0, 0,224, 70, 84, 22, 1, 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,160, 71, 84, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 72, 84, 22, 1, 0, 0, 0, 64, 71, 84, 22,
- 1, 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, 0, 72, 84, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 96, 72, 84, 22, 1, 0, 0, 0,160, 71, 84, 22, 1, 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, 96, 72, 84, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0,192, 72, 84, 22, 1, 0, 0, 0, 0, 72, 84, 22, 1, 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,192, 72, 84, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 32, 73, 84, 22,
- 1, 0, 0, 0, 96, 72, 84, 22, 1, 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, 32, 73, 84, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 72, 84, 22,
- 1, 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,128, 73, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,224, 73, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 68, 84, 22,
- 1, 0, 0, 0, 0, 69, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,224, 73, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 64, 74, 84, 22, 1, 0, 0, 0,128, 73, 84, 22, 1, 0, 0, 0,160, 68, 84, 22,
- 1, 0, 0, 0,192, 69, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 64, 74, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,160, 74, 84, 22, 1, 0, 0, 0,224, 73, 84, 22, 1, 0, 0, 0, 0, 69, 84, 22,
- 1, 0, 0, 0, 32, 70, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,160, 74, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 0, 75, 84, 22, 1, 0, 0, 0, 64, 74, 84, 22, 1, 0, 0, 0,192, 69, 84, 22,
- 1, 0, 0, 0, 32, 70, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 0, 75, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 96, 75, 84, 22, 1, 0, 0, 0,160, 74, 84, 22, 1, 0, 0, 0,192, 69, 84, 22,
- 1, 0, 0, 0,128, 70, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 96, 75, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,192, 75, 84, 22, 1, 0, 0, 0, 0, 75, 84, 22, 1, 0, 0, 0,128, 70, 84, 22,
- 1, 0, 0, 0,224, 70, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,192, 75, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 32, 76, 84, 22, 1, 0, 0, 0, 96, 75, 84, 22, 1, 0, 0, 0, 96, 69, 84, 22,
- 1, 0, 0, 0, 64, 71, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 32, 76, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,128, 76, 84, 22, 1, 0, 0, 0,192, 75, 84, 22, 1, 0, 0, 0,224, 70, 84, 22,
- 1, 0, 0, 0, 64, 71, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,128, 76, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,224, 76, 84, 22, 1, 0, 0, 0, 32, 76, 84, 22, 1, 0, 0, 0, 64, 68, 84, 22,
- 1, 0, 0, 0,128, 70, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,224, 76, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 64, 77, 84, 22, 1, 0, 0, 0,128, 76, 84, 22, 1, 0, 0, 0, 64, 68, 84, 22,
- 1, 0, 0, 0, 64, 71, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 64, 77, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,160, 77, 84, 22, 1, 0, 0, 0,224, 76, 84, 22, 1, 0, 0, 0, 32, 70, 84, 22,
- 1, 0, 0, 0,160, 71, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,160, 77, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 0, 78, 84, 22, 1, 0, 0, 0, 64, 77, 84, 22, 1, 0, 0, 0, 96, 69, 84, 22,
- 1, 0, 0, 0,160, 71, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 0, 78, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 96, 78, 84, 22, 1, 0, 0, 0,160, 77, 84, 22, 1, 0, 0, 0,224, 70, 84, 22,
- 1, 0, 0, 0,160, 71, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 96, 78, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,192, 78, 84, 22, 1, 0, 0, 0, 0, 78, 84, 22, 1, 0, 0, 0, 0, 72, 84, 22,
- 1, 0, 0, 0, 96, 72, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,192, 78, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 32, 79, 84, 22, 1, 0, 0, 0, 96, 78, 84, 22, 1, 0, 0, 0, 32, 70, 84, 22,
- 1, 0, 0, 0, 96, 72, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 32, 79, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,128, 79, 84, 22, 1, 0, 0, 0,192, 78, 84, 22, 1, 0, 0, 0,160, 71, 84, 22,
- 1, 0, 0, 0, 0, 72, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,128, 79, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,224, 79, 84, 22, 1, 0, 0, 0, 32, 79, 84, 22, 1, 0, 0, 0,128, 70, 84, 22,
- 1, 0, 0, 0,192, 72, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,224, 79, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 64, 80, 84, 22, 1, 0, 0, 0,128, 79, 84, 22, 1, 0, 0, 0, 0, 72, 84, 22,
- 1, 0, 0, 0,192, 72, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 64, 80, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,160, 80, 84, 22, 1, 0, 0, 0,224, 79, 84, 22, 1, 0, 0, 0,192, 69, 84, 22,
- 1, 0, 0, 0, 32, 73, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,160, 80, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 0, 81, 84, 22, 1, 0, 0, 0, 64, 80, 84, 22, 1, 0, 0, 0, 96, 72, 84, 22,
- 1, 0, 0, 0, 32, 73, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 0, 81, 84, 22,
- 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 80, 84, 22, 1, 0, 0, 0,192, 72, 84, 22,
- 1, 0, 0, 0, 32, 73, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 96, 81, 84, 22,
- 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0, 0, 85, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 69, 84, 22,
- 1, 0, 0, 0,160, 68, 84, 22, 1, 0, 0, 0, 0, 69, 84, 22, 1, 0, 0, 0, 32, 70, 84, 22, 1, 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,128,241, 84, 22, 1, 0, 0, 0,128,241, 84, 22, 1, 0, 0, 0, 64, 82, 84, 22,
- 1, 0, 0, 0,160, 83, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64, 82, 84, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,160, 83, 84, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,160, 83, 84, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 82, 84, 22, 1, 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, 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, 68, 65, 84, 65,160, 0, 0, 0, 0, 85, 84, 22, 1, 0, 0, 0,198, 0, 0, 0,
- 1, 0, 0, 0,128,119, 84, 22, 1, 0, 0, 0, 96, 81, 84, 22, 1, 0, 0, 0, 64, 71, 84, 22, 1, 0, 0, 0,224, 70, 84, 22,
- 1, 0, 0, 0,160, 71, 84, 22, 1, 0, 0, 0, 96, 69, 84, 22, 1, 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, 96,107, 84, 22, 1, 0, 0, 0, 16,118, 84, 22, 1, 0, 0, 0,224, 85, 84, 22, 1, 0, 0, 0, 64, 87, 84, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,224, 85, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 64, 87, 84, 22,
- 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0, 64, 87, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,224, 85, 84, 22, 1, 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, 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,160, 88, 84, 22, 1, 0, 0, 0,208,105, 84, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,160, 88, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 48, 90, 84, 22,
- 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 48, 90, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,192, 91, 84, 22, 1, 0, 0, 0,160, 88, 84, 22, 1, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,192, 91, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 80, 93, 84, 22,
- 1, 0, 0, 0, 48, 90, 84, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 80, 93, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,224, 94, 84, 22, 1, 0, 0, 0,192, 91, 84, 22, 1, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,224, 94, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,112, 96, 84, 22,
- 1, 0, 0, 0, 80, 93, 84, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,112, 96, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 98, 84, 22, 1, 0, 0, 0,224, 94, 84, 22, 1, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 0, 98, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,144, 99, 84, 22,
- 1, 0, 0, 0,112, 96, 84, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,144, 99, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 32,101, 84, 22, 1, 0, 0, 0, 0, 98, 84, 22, 1, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 32,101, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,176,102, 84, 22,
- 1, 0, 0, 0,144, 99, 84, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,176,102, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 64,104, 84, 22, 1, 0, 0, 0, 32,101, 84, 22, 1, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 64,104, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,208,105, 84, 22,
- 1, 0, 0, 0,176,102, 84, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,208,105, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,104, 84, 22, 1, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 1, 0, 0, 96,107, 84, 22, 1, 0, 0, 0,165, 0, 0, 0, 1, 0, 0, 0, 32,114, 84, 22,
- 1, 0, 0, 0, 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, 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,
- 40, 1, 0, 0,160,108, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0,110, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 0,110, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 96,111, 84, 22, 1, 0, 0, 0,160,108, 84, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 96,111, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,192,112, 84, 22, 1, 0, 0, 0, 0,110, 84, 22,
- 1, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,192,112, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,111, 84, 22,
- 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,114, 84, 22, 1, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0, 16,118, 84, 22, 1, 0, 0, 0, 96,107, 84, 22,
- 1, 0, 0, 0,160,108, 84, 22, 1, 0, 0, 0,192,112, 84, 22, 1, 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, 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, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 80,115, 84, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,176,116, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,176,116, 84, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,115, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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, 52,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48, 52,173, 4, 1, 0, 0, 0,159, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0, 16,118, 84, 22, 1, 0, 0, 0,160, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,114, 84, 22, 1, 0, 0, 0, 80,115, 84, 22, 1, 0, 0, 0,176,116, 84, 22,
- 1, 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, 48,240,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,128,119, 84, 22,
- 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0,144,153, 84, 22, 1, 0, 0, 0, 0, 85, 84, 22, 1, 0, 0, 0, 64, 68, 84, 22,
- 1, 0, 0, 0,128, 70, 84, 22, 1, 0, 0, 0,224, 70, 84, 22, 1, 0, 0, 0, 64, 71, 84, 22, 1, 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, 16,126, 84, 22, 1, 0, 0, 0,144,152, 84, 22, 1, 0, 0, 0, 96,120, 84, 22,
- 1, 0, 0, 0,176,124, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 96,120, 84, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,192,121, 84, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,192,121, 84, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,176,124, 84, 22, 1, 0, 0, 0, 96,120, 84, 22, 1, 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, 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, 32,123, 84, 22,
- 1, 0, 0, 0, 32,123, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 32,123, 84, 22, 1, 0, 0, 0,197, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 1, 0, 0,176,124, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,121, 84, 22,
- 1, 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, 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, 68, 65, 84, 65,
- 72, 0, 0, 0, 16,126, 84, 22, 1, 0, 0, 0,177, 0, 0, 0, 1, 0, 0, 0, 48, 56,173, 4, 1, 0, 0, 0, 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,
- 40, 1, 0, 0,144,126, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,240,127, 84, 22, 1, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,240,127, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 80,129, 84, 22, 1, 0, 0, 0,144,126, 84, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 80,129, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,127, 84, 22,
- 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 24, 0, 0, 48, 56,173, 4, 1, 0, 0, 0,170, 0, 0, 0, 1, 0, 0, 0,112,133, 84, 22, 1, 0, 0, 0, 16,126, 84, 22,
- 1, 0, 0, 0,144,126, 84, 22, 1, 0, 0, 0, 80,129, 84, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,176,130, 84, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 16,132, 84, 22, 1, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 16,132, 84, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176,130, 84, 22, 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,112,133, 84, 22, 1, 0, 0, 0,176, 0, 0, 0,
- 1, 0, 0, 0, 80,140, 84, 22, 1, 0, 0, 0, 48, 56,173, 4, 1, 0, 0, 0,176,130, 84, 22, 1, 0, 0, 0, 16,132, 84, 22,
- 1, 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, 0, 0, 0, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 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, 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, 40, 1, 0, 0,208,134, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 48,136, 84, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48,136, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,144,137, 84, 22,
- 1, 0, 0, 0,208,134, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,144,137, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,240,138, 84, 22,
- 1, 0, 0, 0, 48,136, 84, 22, 1, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,240,138, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,144,137, 84, 22, 1, 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,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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,140, 84, 22, 1, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0, 96,148, 84, 22,
- 1, 0, 0, 0,112,133, 84, 22, 1, 0, 0, 0,208,134, 84, 22, 1, 0, 0, 0,240,138, 84, 22, 1, 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, 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, 40, 1, 0, 0,128,141, 84, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,224,142, 84, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,224,142, 84, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 64,144, 84, 22, 1, 0, 0, 0,128,141, 84, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 64,144, 84, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,160,145, 84, 22, 1, 0, 0, 0,224,142, 84, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,160,145, 84, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0,147, 84, 22, 1, 0, 0, 0, 64,144, 84, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 0,147, 84, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,145, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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, 82,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48, 82,173, 4,
- 1, 0, 0, 0,159, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0, 96,148, 84, 22,
- 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0,144,152, 84, 22, 1, 0, 0, 0, 80,140, 84, 22, 1, 0, 0, 0,128,141, 84, 22,
- 1, 0, 0, 0, 0,147, 84, 22, 1, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
- 40, 1, 0, 0,208,149, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 48,151, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 48,151, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,149, 84, 22,
- 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-200, 0, 0, 0,144,152, 84, 22, 1, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,148, 84, 22,
- 1, 0, 0, 0,208,149, 84, 22, 1, 0, 0, 0, 48,151, 84, 22, 1, 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, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,
-160, 0, 0, 0,144,153, 84, 22, 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0,144,177, 84, 22, 1, 0, 0, 0,128,119, 84, 22,
- 1, 0, 0, 0, 0, 72, 84, 22, 1, 0, 0, 0, 96, 72, 84, 22, 1, 0, 0, 0, 32, 70, 84, 22, 1, 0, 0, 0,160, 71, 84, 22,
- 1, 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, 48, 86,173, 4, 1, 0, 0, 0, 32,176, 84, 22,
- 1, 0, 0, 0,112,154, 84, 22, 1, 0, 0, 0,208,155, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,112,154, 84, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,208,155, 84, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,208,155, 84, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,154, 84, 22, 1, 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, 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, 68, 65, 84, 65,144, 2, 0, 0, 48, 86,173, 4,
- 1, 0, 0, 0,172, 0, 0, 0, 1, 0, 0, 0,240,159, 84, 22, 1, 0, 0, 0, 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,
- 40, 1, 0, 0, 48,157, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,144,158, 84, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,144,158, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,157, 84, 22,
- 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,240,159, 84, 22, 1, 0, 0, 0,169, 0, 0, 0, 1, 0, 0, 0,112,165, 84, 22, 1, 0, 0, 0, 48, 86,173, 4,
- 1, 0, 0, 0, 48,157, 84, 22, 1, 0, 0, 0,144,158, 84, 22, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,161, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 80,161, 84, 22, 1, 0, 0, 0,222, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0,160,161, 84, 22,
- 1, 0, 0, 0, 68, 65, 84, 65,208, 0, 0, 0,160,161, 84, 22, 1, 0, 0, 0,221, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 0, 48,218,173, 4, 1, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0, 48,218,173, 4, 1, 0, 0, 0, 20, 0, 0, 0,
- 1, 0, 1, 0, 48,218,173, 4, 1, 0, 0, 0, 21, 0, 1, 0, 1, 0, 1, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 48,230,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,246,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 64, 89, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48, 2,174, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 64, 87, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,252,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 48,226,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 64, 81, 86, 22, 1, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,176,162, 84, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 16,164, 84, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 16,164, 84, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176,162, 84, 22, 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,112,165, 84, 22, 1, 0, 0, 0,165, 0, 0, 0,
- 1, 0, 0, 0, 48,172, 84, 22, 1, 0, 0, 0,240,159, 84, 22, 1, 0, 0, 0,176,162, 84, 22, 1, 0, 0, 0, 16,164, 84, 22,
- 1, 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, 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, 40, 1, 0, 0,176,166, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 16,168, 84, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 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,
- 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 16,168, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,112,169, 84, 22,
- 1, 0, 0, 0,176,166, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,112,169, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,208,170, 84, 22,
- 1, 0, 0, 0, 16,168, 84, 22, 1, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,208,170, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,112,169, 84, 22, 1, 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,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,
- 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,172, 84, 22, 1, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0, 32,176, 84, 22,
- 1, 0, 0, 0,112,165, 84, 22, 1, 0, 0, 0,176,166, 84, 22, 1, 0, 0, 0,208,170, 84, 22, 1, 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, 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, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 96,173, 84, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,192,174, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,192,174, 84, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,173, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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, 90,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48, 90,173, 4,
- 1, 0, 0, 0,159, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0, 32,176, 84, 22,
- 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,172, 84, 22, 1, 0, 0, 0, 96,173, 84, 22,
- 1, 0, 0, 0,192,174, 84, 22, 1, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-160, 0, 0, 0,144,177, 84, 22, 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0, 64,212, 84, 22, 1, 0, 0, 0,144,153, 84, 22,
- 1, 0, 0, 0,192, 72, 84, 22, 1, 0, 0, 0, 32, 73, 84, 22, 1, 0, 0, 0, 96, 72, 84, 22, 1, 0, 0, 0, 0, 72, 84, 22,
- 1, 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, 64,196, 84, 22, 1, 0, 0, 0, 64,211, 84, 22,
- 1, 0, 0, 0,112,178, 84, 22, 1, 0, 0, 0,224,194, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,112,178, 84, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,208,179, 84, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,208,179, 84, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 48,181, 84, 22, 1, 0, 0, 0,112,178, 84, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0, 48,181, 84, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,144,182, 84, 22, 1, 0, 0, 0,208,179, 84, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,144,182, 84, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,224,194, 84, 22, 1, 0, 0, 0, 48,181, 84, 22, 1, 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, 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,240,183, 84, 22, 1, 0, 0, 0, 80,193, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,240,183, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,128,185, 84, 22, 1, 0, 0, 0, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,128,185, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 16,187, 84, 22,
- 1, 0, 0, 0,240,183, 84, 22, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 16,187, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,160,188, 84, 22, 1, 0, 0, 0,128,185, 84, 22, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,160,188, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 48,190, 84, 22,
- 1, 0, 0, 0, 16,187, 84, 22, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 48,190, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,192,191, 84, 22, 1, 0, 0, 0,160,188, 84, 22, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,192,191, 84, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 80,193, 84, 22,
- 1, 0, 0, 0, 48,190, 84, 22, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 80,193, 84, 22,
- 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,191, 84, 22, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,224,194, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,144,182, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 94,173, 4,
- 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48, 94,173, 4, 1, 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, 64,196, 84, 22, 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0,112,200, 84, 22,
- 1, 0, 0, 0, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 40, 1, 0, 0,176,197, 84, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 16,199, 84, 22, 1, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 16,199, 84, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176,197, 84, 22, 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,112,200, 84, 22, 1, 0, 0, 0,176, 0, 0, 0,
- 1, 0, 0, 0, 80,207, 84, 22, 1, 0, 0, 0, 64,196, 84, 22, 1, 0, 0, 0,176,197, 84, 22, 1, 0, 0, 0, 16,199, 84, 22,
- 1, 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, 0, 0, 0, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 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, 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, 40, 1, 0, 0,208,201, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 48,203, 84, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48,203, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,144,204, 84, 22,
- 1, 0, 0, 0,208,201, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,144,204, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,240,205, 84, 22,
- 1, 0, 0, 0, 48,203, 84, 22, 1, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,240,205, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,144,204, 84, 22, 1, 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,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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,207, 84, 22, 1, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0, 64,211, 84, 22,
- 1, 0, 0, 0,112,200, 84, 22, 1, 0, 0, 0,208,201, 84, 22, 1, 0, 0, 0,240,205, 84, 22, 1, 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, 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, 40, 1, 0, 0,128,208, 84, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,224,209, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,224,209, 84, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,208, 84, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,200, 0, 0, 0, 64,211, 84, 22,
- 1, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,207, 84, 22, 1, 0, 0, 0,128,208, 84, 22,
- 1, 0, 0, 0,224,209, 84, 22, 1, 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, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 64,212, 84, 22,
- 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,177, 84, 22, 1, 0, 0, 0,128, 70, 84, 22,
- 1, 0, 0, 0,192, 69, 84, 22, 1, 0, 0, 0, 32, 73, 84, 22, 1, 0, 0, 0,192, 72, 84, 22, 1, 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,224,215, 84, 22, 1, 0, 0, 0,128,240, 84, 22, 1, 0, 0, 0, 32,213, 84, 22,
- 1, 0, 0, 0,128,214, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 32,213, 84, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,128,214, 84, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,128,214, 84, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,213, 84, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,224,215, 84, 22, 1, 0, 0, 0,169, 0, 0, 0,
- 1, 0, 0, 0,128,225, 84, 22, 1, 0, 0, 0, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 64,217, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64,217, 84, 22, 1, 0, 0, 0,222, 0, 0, 0,
- 1, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0,144,217, 84, 22, 1, 0, 0, 0, 68, 65, 84, 65,208, 0, 0, 0,144,217, 84, 22,
- 1, 0, 0, 0,221, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 48,218,173, 4, 1, 0, 0, 0, 19, 0, 0, 0,
- 1, 0, 1, 0, 48,218,173, 4, 1, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0, 48,218,173, 4, 1, 0, 0, 0, 21, 0, 1, 0,
- 1, 0, 1, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,230,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 48,246,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 64, 89, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 48, 2,174, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 64, 87, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 48,252,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,226,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 64, 81, 86, 22, 1, 0, 0, 0, 68, 65, 84, 65,
- 40, 1, 0, 0,160,218, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0,220, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 0,220, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 96,221, 84, 22, 1, 0, 0, 0,160,218, 84, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 96,221, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,192,222, 84, 22, 1, 0, 0, 0, 0,220, 84, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,192,222, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 32,224, 84, 22, 1, 0, 0, 0, 96,221, 84, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 32,224, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,222, 84, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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, 98,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,
-104, 3, 0, 0, 48, 98,173, 4, 1, 0, 0, 0,159, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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,
- 48, 1, 0, 0,128,225, 84, 22, 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0,176,229, 84, 22, 1, 0, 0, 0,224,215, 84, 22,
- 1, 0, 0, 0,160,218, 84, 22, 1, 0, 0, 0, 32,224, 84, 22, 1, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 40, 1, 0, 0,240,226, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 80,228, 84, 22,
- 1, 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, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 80,228, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,240,226, 84, 22, 1, 0, 0, 0, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,176,229, 84, 22, 1, 0, 0, 0,176, 0, 0, 0, 1, 0, 0, 0,144,236, 84, 22,
- 1, 0, 0, 0,128,225, 84, 22, 1, 0, 0, 0,240,226, 84, 22, 1, 0, 0, 0, 80,228, 84, 22, 1, 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, 0, 0, 0, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 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,
- 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,
- 40, 1, 0, 0, 16,231, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,112,232, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,112,232, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,208,233, 84, 22, 1, 0, 0, 0, 16,231, 84, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,208,233, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 48,235, 84, 22, 1, 0, 0, 0,112,232, 84, 22,
- 1, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 48,235, 84, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,233, 84, 22,
- 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,236, 84, 22, 1, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0,128,240, 84, 22, 1, 0, 0, 0,176,229, 84, 22,
- 1, 0, 0, 0, 16,231, 84, 22, 1, 0, 0, 0, 48,235, 84, 22, 1, 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, 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, 40, 1, 0, 0,192,237, 84, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 32,239, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 32,239, 84, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,237, 84, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,200, 0, 0, 0,128,240, 84, 22, 1, 0, 0, 0,175, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,236, 84, 22, 1, 0, 0, 0,192,237, 84, 22, 1, 0, 0, 0, 32,239, 84, 22,
- 1, 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, 1, 0, 0, 0, 6, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0, 0,242, 84, 22, 1, 0, 0, 0,194, 0, 0, 0,
- 1, 0, 0, 0, 80,176, 85, 22, 1, 0, 0, 0, 48, 67, 84, 22, 1, 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, 16,243, 84, 22, 1, 0, 0, 0, 80,248, 84, 22, 1, 0, 0, 0,176,248, 84, 22,
- 1, 0, 0, 0,240, 0, 85, 22, 1, 0, 0, 0, 80, 1, 85, 22, 1, 0, 0, 0, 80,149, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 16,243, 84, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,112,243, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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,112,243, 84, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0,208,243, 84, 22, 1, 0, 0, 0, 16,243, 84, 22, 1, 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,208,243, 84, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 48,244, 84, 22,
- 1, 0, 0, 0,112,243, 84, 22, 1, 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, 48,244, 84, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,144,244, 84, 22, 1, 0, 0, 0,208,243, 84, 22,
- 1, 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,144,244, 84, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,240,244, 84, 22, 1, 0, 0, 0, 48,244, 84, 22, 1, 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,240,244, 84, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0, 80,245, 84, 22, 1, 0, 0, 0,144,244, 84, 22, 1, 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, 80,245, 84, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,176,245, 84, 22,
- 1, 0, 0, 0,240,244, 84, 22, 1, 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,176,245, 84, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 16,246, 84, 22, 1, 0, 0, 0, 80,245, 84, 22,
- 1, 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, 16,246, 84, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,112,246, 84, 22, 1, 0, 0, 0,176,245, 84, 22, 1, 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,112,246, 84, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0,208,246, 84, 22, 1, 0, 0, 0, 16,246, 84, 22, 1, 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,208,246, 84, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 48,247, 84, 22,
- 1, 0, 0, 0,112,246, 84, 22, 1, 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, 48,247, 84, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,144,247, 84, 22, 1, 0, 0, 0,208,246, 84, 22,
- 1, 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,144,247, 84, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,240,247, 84, 22, 1, 0, 0, 0, 48,247, 84, 22, 1, 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,240,247, 84, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0, 80,248, 84, 22, 1, 0, 0, 0,144,247, 84, 22, 1, 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, 80,248, 84, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,240,247, 84, 22, 1, 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,176,248, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 16,249, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,112,243, 84, 22, 1, 0, 0, 0,208,243, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0, 16,249, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,112,249, 84, 22, 1, 0, 0, 0,176,248, 84, 22,
- 1, 0, 0, 0,112,243, 84, 22, 1, 0, 0, 0,144,244, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,112,249, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,208,249, 84, 22, 1, 0, 0, 0, 16,249, 84, 22,
- 1, 0, 0, 0,208,243, 84, 22, 1, 0, 0, 0,240,244, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,208,249, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 48,250, 84, 22, 1, 0, 0, 0,112,249, 84, 22,
- 1, 0, 0, 0,144,244, 84, 22, 1, 0, 0, 0,240,244, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0, 48,250, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,144,250, 84, 22, 1, 0, 0, 0,208,249, 84, 22,
- 1, 0, 0, 0,240,244, 84, 22, 1, 0, 0, 0, 80,245, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,144,250, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,240,250, 84, 22, 1, 0, 0, 0, 48,250, 84, 22,
- 1, 0, 0, 0, 48,244, 84, 22, 1, 0, 0, 0,176,245, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,240,250, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 80,251, 84, 22, 1, 0, 0, 0,144,250, 84, 22,
- 1, 0, 0, 0, 16,243, 84, 22, 1, 0, 0, 0, 16,246, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0, 80,251, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,176,251, 84, 22, 1, 0, 0, 0,240,250, 84, 22,
- 1, 0, 0, 0,144,244, 84, 22, 1, 0, 0, 0, 16,246, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,176,251, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 16,252, 84, 22, 1, 0, 0, 0, 80,251, 84, 22,
- 1, 0, 0, 0, 80,245, 84, 22, 1, 0, 0, 0,112,246, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0, 16,252, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,112,252, 84, 22, 1, 0, 0, 0,176,251, 84, 22,
- 1, 0, 0, 0,176,245, 84, 22, 1, 0, 0, 0,112,246, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,112,252, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,208,252, 84, 22, 1, 0, 0, 0, 16,252, 84, 22,
- 1, 0, 0, 0, 16,243, 84, 22, 1, 0, 0, 0,208,246, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,208,252, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 48,253, 84, 22, 1, 0, 0, 0,112,252, 84, 22,
- 1, 0, 0, 0,176,245, 84, 22, 1, 0, 0, 0,208,246, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0, 48,253, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,144,253, 84, 22, 1, 0, 0, 0,208,252, 84, 22,
- 1, 0, 0, 0, 16,246, 84, 22, 1, 0, 0, 0, 48,247, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,144,253, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,240,253, 84, 22, 1, 0, 0, 0, 48,253, 84, 22,
- 1, 0, 0, 0,112,246, 84, 22, 1, 0, 0, 0, 48,247, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,240,253, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 80,254, 84, 22, 1, 0, 0, 0,144,253, 84, 22,
- 1, 0, 0, 0,208,246, 84, 22, 1, 0, 0, 0, 48,247, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0, 80,254, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,176,254, 84, 22, 1, 0, 0, 0,240,253, 84, 22,
- 1, 0, 0, 0,176,245, 84, 22, 1, 0, 0, 0,144,247, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,176,254, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 16,255, 84, 22, 1, 0, 0, 0, 80,254, 84, 22,
- 1, 0, 0, 0, 80,245, 84, 22, 1, 0, 0, 0,144,247, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0, 16,255, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,112,255, 84, 22, 1, 0, 0, 0,176,254, 84, 22,
- 1, 0, 0, 0,240,244, 84, 22, 1, 0, 0, 0,240,247, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,112,255, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,208,255, 84, 22, 1, 0, 0, 0, 16,255, 84, 22,
- 1, 0, 0, 0, 48,244, 84, 22, 1, 0, 0, 0,240,247, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,208,255, 84, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 48, 0, 85, 22, 1, 0, 0, 0,112,255, 84, 22,
- 1, 0, 0, 0,144,247, 84, 22, 1, 0, 0, 0,240,247, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0, 48, 0, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,144, 0, 85, 22, 1, 0, 0, 0,208,255, 84, 22,
- 1, 0, 0, 0,144,244, 84, 22, 1, 0, 0, 0, 80,248, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,144, 0, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,240, 0, 85, 22, 1, 0, 0, 0, 48, 0, 85, 22,
- 1, 0, 0, 0, 80,245, 84, 22, 1, 0, 0, 0, 80,248, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,240, 0, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 0, 85, 22,
- 1, 0, 0, 0, 48,247, 84, 22, 1, 0, 0, 0, 80,248, 84, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-160, 0, 0, 0, 80, 1, 85, 22, 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0,240, 4, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,144,244, 84, 22, 1, 0, 0, 0,112,243, 84, 22, 1, 0, 0, 0,208,243, 84, 22, 1, 0, 0, 0,240,244, 84, 22,
- 1, 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,208,175, 85, 22, 1, 0, 0, 0,208,175, 85, 22,
- 1, 0, 0, 0, 48, 2, 85, 22, 1, 0, 0, 0,144, 3, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 48, 2, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,144, 3, 85, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,144, 3, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 2, 85, 22, 1, 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, 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, 68, 65, 84, 65,160, 0, 0, 0,240, 4, 85, 22,
- 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0,112, 39, 85, 22, 1, 0, 0, 0, 80, 1, 85, 22, 1, 0, 0, 0,176,245, 84, 22,
- 1, 0, 0, 0,144,247, 84, 22, 1, 0, 0, 0,240,247, 84, 22, 1, 0, 0, 0, 48,244, 84, 22, 1, 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, 80, 27, 85, 22, 1, 0, 0, 0, 0, 38, 85, 22, 1, 0, 0, 0,208, 5, 85, 22,
- 1, 0, 0, 0, 48, 7, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,208, 5, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 48, 7, 85, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0, 48, 7, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 5, 85, 22, 1, 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, 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,144, 8, 85, 22,
- 1, 0, 0, 0,192, 25, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,144, 8, 85, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0, 32, 10, 85, 22, 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0, 32, 10, 85, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,176, 11, 85, 22, 1, 0, 0, 0,144, 8, 85, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,176, 11, 85, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0, 64, 13, 85, 22, 1, 0, 0, 0, 32, 10, 85, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0, 64, 13, 85, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,208, 14, 85, 22, 1, 0, 0, 0,176, 11, 85, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,208, 14, 85, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0, 96, 16, 85, 22, 1, 0, 0, 0, 64, 13, 85, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0, 96, 16, 85, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,240, 17, 85, 22, 1, 0, 0, 0,208, 14, 85, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,240, 17, 85, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0,128, 19, 85, 22, 1, 0, 0, 0, 96, 16, 85, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0,128, 19, 85, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 16, 21, 85, 22, 1, 0, 0, 0,240, 17, 85, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 16, 21, 85, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0,160, 22, 85, 22, 1, 0, 0, 0,128, 19, 85, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0,160, 22, 85, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 48, 24, 85, 22, 1, 0, 0, 0, 16, 21, 85, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 48, 24, 85, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0,192, 25, 85, 22, 1, 0, 0, 0,160, 22, 85, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0,192, 25, 85, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 24, 85, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 1, 0, 0, 80, 27, 85, 22, 1, 0, 0, 0,165, 0, 0, 0,
- 1, 0, 0, 0, 16, 34, 85, 22, 1, 0, 0, 0, 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, 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, 40, 1, 0, 0,144, 28, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,240, 29, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 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,
- 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,240, 29, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 80, 31, 85, 22,
- 1, 0, 0, 0,144, 28, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 80, 31, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,176, 32, 85, 22,
- 1, 0, 0, 0,240, 29, 85, 22, 1, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,176, 32, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 80, 31, 85, 22, 1, 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,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,
- 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 34, 85, 22, 1, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0, 0, 38, 85, 22,
- 1, 0, 0, 0, 80, 27, 85, 22, 1, 0, 0, 0,144, 28, 85, 22, 1, 0, 0, 0,176, 32, 85, 22, 1, 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, 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, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 64, 35, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,160, 36, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,160, 36, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 35, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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,102,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48,102,173, 4,
- 1, 0, 0, 0,159, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0, 0, 38, 85, 22,
- 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 34, 85, 22, 1, 0, 0, 0, 64, 35, 85, 22,
- 1, 0, 0, 0,160, 36, 85, 22, 1, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-160, 0, 0, 0,112, 39, 85, 22, 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0,128, 70, 85, 22, 1, 0, 0, 0,240, 4, 85, 22,
- 1, 0, 0, 0,208,246, 84, 22, 1, 0, 0, 0, 48,247, 84, 22, 1, 0, 0, 0,112,246, 84, 22, 1, 0, 0, 0,176,245, 84, 22,
- 1, 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, 16, 43, 85, 22, 1, 0, 0, 0,128, 69, 85, 22,
- 1, 0, 0, 0, 80, 40, 85, 22, 1, 0, 0, 0,176, 41, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 80, 40, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,176, 41, 85, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,176, 41, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 40, 85, 22, 1, 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, 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, 68, 65, 84, 65,144, 1, 0, 0, 16, 43, 85, 22,
- 1, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 48,106,173, 4, 1, 0, 0, 0, 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,
- 40, 1, 0, 0,224, 44, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 64, 46, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 64, 46, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 44, 85, 22,
- 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 48,106,173, 4, 1, 0, 0, 0,172, 0, 0, 0, 1, 0, 0, 0, 96, 50, 85, 22, 1, 0, 0, 0, 16, 43, 85, 22,
- 1, 0, 0, 0,224, 44, 85, 22, 1, 0, 0, 0, 64, 46, 85, 22, 1, 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, 40, 1, 0, 0,160, 47, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 49, 85, 22,
- 1, 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, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 49, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,160, 47, 85, 22, 1, 0, 0, 0, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 96, 50, 85, 22, 1, 0, 0, 0,176, 0, 0, 0, 1, 0, 0, 0, 64, 57, 85, 22,
- 1, 0, 0, 0, 48,106,173, 4, 1, 0, 0, 0,160, 47, 85, 22, 1, 0, 0, 0, 0, 49, 85, 22, 1, 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, 0, 0, 0, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 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,
- 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,
- 40, 1, 0, 0,192, 51, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 32, 53, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 32, 53, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,128, 54, 85, 22, 1, 0, 0, 0,192, 51, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 54, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,224, 55, 85, 22, 1, 0, 0, 0, 32, 53, 85, 22,
- 1, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,224, 55, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 54, 85, 22,
- 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 57, 85, 22, 1, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0, 80, 65, 85, 22, 1, 0, 0, 0, 96, 50, 85, 22,
- 1, 0, 0, 0,192, 51, 85, 22, 1, 0, 0, 0,224, 55, 85, 22, 1, 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, 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, 40, 1, 0, 0,112, 58, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,208, 59, 85, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,208, 59, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 48, 61, 85, 22, 1, 0, 0, 0,112, 58, 85, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 61, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,144, 62, 85, 22, 1, 0, 0, 0,208, 59, 85, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,144, 62, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,240, 63, 85, 22, 1, 0, 0, 0, 48, 61, 85, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,240, 63, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 62, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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,110,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48,110,173, 4, 1, 0, 0, 0,159, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0, 80, 65, 85, 22, 1, 0, 0, 0,160, 0, 0, 0,
- 1, 0, 0, 0,128, 69, 85, 22, 1, 0, 0, 0, 64, 57, 85, 22, 1, 0, 0, 0,112, 58, 85, 22, 1, 0, 0, 0,240, 63, 85, 22,
- 1, 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, 48,240,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 40, 1, 0, 0,192, 66, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 32, 68, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 32, 68, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 66, 85, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,200, 0, 0, 0,128, 69, 85, 22,
- 1, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 65, 85, 22, 1, 0, 0, 0,192, 66, 85, 22,
- 1, 0, 0, 0, 32, 68, 85, 22, 1, 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, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,128, 70, 85, 22,
- 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0, 0, 97, 85, 22, 1, 0, 0, 0,112, 39, 85, 22, 1, 0, 0, 0, 48,247, 84, 22,
- 1, 0, 0, 0, 80,248, 84, 22, 1, 0, 0, 0, 80,245, 84, 22, 1, 0, 0, 0,112,246, 84, 22, 1, 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, 64, 78, 85, 22, 1, 0, 0, 0, 0, 96, 85, 22, 1, 0, 0, 0, 96, 71, 85, 22,
- 1, 0, 0, 0,224, 76, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 96, 71, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,192, 72, 85, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,192, 72, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 32, 74, 85, 22, 1, 0, 0, 0, 96, 71, 85, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0, 32, 74, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,128, 75, 85, 22, 1, 0, 0, 0,192, 72, 85, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,128, 75, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,224, 76, 85, 22, 1, 0, 0, 0, 32, 74, 85, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,224, 76, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 75, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48,114,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48,114,173, 4, 1, 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, 64, 78, 85, 22, 1, 0, 0, 0,160, 0, 0, 0,
- 1, 0, 0, 0, 48,118,173, 4, 1, 0, 0, 0, 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, 48,240,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 40, 1, 0, 0,176, 79, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 16, 81, 85, 22, 1, 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,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, 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, 68, 65, 84, 65, 40, 1, 0, 0, 16, 81, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 79, 85, 22, 1, 0, 0, 0, 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, 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, 68, 65, 84, 65,144, 2, 0, 0, 48,118,173, 4,
- 1, 0, 0, 0,172, 0, 0, 0, 1, 0, 0, 0, 48, 85, 85, 22, 1, 0, 0, 0, 64, 78, 85, 22, 1, 0, 0, 0,176, 79, 85, 22,
- 1, 0, 0, 0, 16, 81, 85, 22, 1, 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,
- 40, 1, 0, 0,112, 82, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,208, 83, 85, 22, 1, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,208, 83, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 82, 85, 22,
- 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 85, 85, 22, 1, 0, 0, 0,176, 0, 0, 0, 1, 0, 0, 0, 16, 92, 85, 22, 1, 0, 0, 0, 48,118,173, 4,
- 1, 0, 0, 0,112, 82, 85, 22, 1, 0, 0, 0,208, 83, 85, 22, 1, 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,
- 0, 0, 0, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 40, 1, 0, 0,144, 86, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,240, 87, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,240, 87, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 80, 89, 85, 22, 1, 0, 0, 0,144, 86, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 80, 89, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,176, 90, 85, 22, 1, 0, 0, 0,240, 87, 85, 22, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,176, 90, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 89, 85, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 92, 85, 22,
- 1, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0, 0, 96, 85, 22, 1, 0, 0, 0, 48, 85, 85, 22, 1, 0, 0, 0,144, 86, 85, 22,
- 1, 0, 0, 0,176, 90, 85, 22, 1, 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,
- 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, 40, 1, 0, 0, 64, 93, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,160, 94, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,160, 94, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 64, 93, 85, 22, 1, 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,
-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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,200, 0, 0, 0, 0, 96, 85, 22, 1, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 16, 92, 85, 22, 1, 0, 0, 0, 64, 93, 85, 22, 1, 0, 0, 0,160, 94, 85, 22, 1, 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, 1, 0, 0, 0,
- 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 0, 97, 85, 22, 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0, 16,128, 85, 22,
- 1, 0, 0, 0,128, 70, 85, 22, 1, 0, 0, 0, 16,243, 84, 22, 1, 0, 0, 0, 16,246, 84, 22, 1, 0, 0, 0, 48,247, 84, 22,
- 1, 0, 0, 0,208,246, 84, 22, 1, 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,160,100, 85, 22,
- 1, 0, 0, 0, 16,127, 85, 22, 1, 0, 0, 0,224, 97, 85, 22, 1, 0, 0, 0, 64, 99, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,224, 97, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 64, 99, 85, 22, 1, 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, 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, 68, 65, 84, 65,
- 40, 1, 0, 0, 64, 99, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 97, 85, 22,
- 1, 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, 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, 68, 65, 84, 65,
-144, 1, 0, 0,160,100, 85, 22, 1, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 48,122,173, 4, 1, 0, 0, 0, 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, 40, 1, 0, 0,112,102, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,208,103, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,208,103, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,112,102, 85, 22, 1, 0, 0, 0, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48,122,173, 4, 1, 0, 0, 0,172, 0, 0, 0, 1, 0, 0, 0,240,107, 85, 22,
- 1, 0, 0, 0,160,100, 85, 22, 1, 0, 0, 0,112,102, 85, 22, 1, 0, 0, 0,208,103, 85, 22, 1, 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, 40, 1, 0, 0, 48,105, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,144,106, 85, 22, 1, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,144,106, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,105, 85, 22, 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,240,107, 85, 22, 1, 0, 0, 0,176, 0, 0, 0,
- 1, 0, 0, 0,208,114, 85, 22, 1, 0, 0, 0, 48,122,173, 4, 1, 0, 0, 0, 48,105, 85, 22, 1, 0, 0, 0,144,106, 85, 22,
- 1, 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, 0, 0, 0, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 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, 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, 40, 1, 0, 0, 80,109, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,176,110, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,176,110, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 16,112, 85, 22,
- 1, 0, 0, 0, 80,109, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 16,112, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,112,113, 85, 22,
- 1, 0, 0, 0,176,110, 85, 22, 1, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,112,113, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 16,112, 85, 22, 1, 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,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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,114, 85, 22, 1, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0,224,122, 85, 22,
- 1, 0, 0, 0,240,107, 85, 22, 1, 0, 0, 0, 80,109, 85, 22, 1, 0, 0, 0,112,113, 85, 22, 1, 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, 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, 40, 1, 0, 0, 0,116, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 96,117, 85, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 96,117, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,192,118, 85, 22, 1, 0, 0, 0, 0,116, 85, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,192,118, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 32,120, 85, 22, 1, 0, 0, 0, 96,117, 85, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 32,120, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,128,121, 85, 22, 1, 0, 0, 0,192,118, 85, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,128,121, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,120, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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,126,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48,126,173, 4,
- 1, 0, 0, 0,159, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,224,122, 85, 22,
- 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0, 16,127, 85, 22, 1, 0, 0, 0,208,114, 85, 22, 1, 0, 0, 0, 0,116, 85, 22,
- 1, 0, 0, 0,128,121, 85, 22, 1, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
- 40, 1, 0, 0, 80,124, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,176,125, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,176,125, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,124, 85, 22,
- 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-200, 0, 0, 0, 16,127, 85, 22, 1, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,122, 85, 22,
- 1, 0, 0, 0, 80,124, 85, 22, 1, 0, 0, 0,176,125, 85, 22, 1, 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, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,
-160, 0, 0, 0, 16,128, 85, 22, 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0, 80,149, 85, 22, 1, 0, 0, 0, 0, 97, 85, 22,
- 1, 0, 0, 0,144,247, 84, 22, 1, 0, 0, 0, 80,245, 84, 22, 1, 0, 0, 0,240,244, 84, 22, 1, 0, 0, 0,240,247, 84, 22,
- 1, 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,176,131, 85, 22, 1, 0, 0, 0,224,147, 85, 22,
- 1, 0, 0, 0,240,128, 85, 22, 1, 0, 0, 0, 80,130, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,240,128, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 80,130, 85, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0, 80,130, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,128, 85, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,176,131, 85, 22,
- 1, 0, 0, 0,169, 0, 0, 0, 1, 0, 0, 0, 48,137, 85, 22, 1, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 16,133, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 16,133, 85, 22,
- 1, 0, 0, 0,222, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 96,133, 85, 22, 1, 0, 0, 0, 68, 65, 84, 65,
-208, 0, 0, 0, 96,133, 85, 22, 1, 0, 0, 0,221, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 48,218,173, 4,
- 1, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0, 48,218,173, 4, 1, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0, 48,218,173, 4,
- 1, 0, 0, 0, 21, 0, 1, 0, 1, 0, 1, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,230,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,246,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 64, 89, 86, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48, 2,174, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 64, 87, 86, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,252,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,226,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 64, 81, 86, 22,
- 1, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,112,134, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,208,135, 85, 22,
- 1, 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,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,
- 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,208,135, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,112,134, 85, 22, 1, 0, 0, 0, 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,
- 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48,137, 85, 22, 1, 0, 0, 0,165, 0, 0, 0, 1, 0, 0, 0,240,143, 85, 22,
- 1, 0, 0, 0,176,131, 85, 22, 1, 0, 0, 0,112,134, 85, 22, 1, 0, 0, 0,208,135, 85, 22, 1, 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, 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,
- 40, 1, 0, 0,112,138, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,208,139, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,208,139, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 48,141, 85, 22, 1, 0, 0, 0,112,138, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 48,141, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,144,142, 85, 22, 1, 0, 0, 0,208,139, 85, 22,
- 1, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,144,142, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,141, 85, 22,
- 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,143, 85, 22, 1, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0,224,147, 85, 22, 1, 0, 0, 0, 48,137, 85, 22,
- 1, 0, 0, 0,112,138, 85, 22, 1, 0, 0, 0,144,142, 85, 22, 1, 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, 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, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 32,145, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,128,146, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128,146, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,145, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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,130,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48,130,173, 4, 1, 0, 0, 0,159, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,224,147, 85, 22, 1, 0, 0, 0,160, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,143, 85, 22, 1, 0, 0, 0, 32,145, 85, 22, 1, 0, 0, 0,128,146, 85, 22,
- 1, 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, 48,240,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 80,149, 85, 22,
- 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,128, 85, 22, 1, 0, 0, 0, 16,246, 84, 22,
- 1, 0, 0, 0,144,244, 84, 22, 1, 0, 0, 0, 80,248, 84, 22, 1, 0, 0, 0, 48,247, 84, 22, 1, 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, 48,134,173, 4, 1, 0, 0, 0,208,174, 85, 22, 1, 0, 0, 0, 48,150, 85, 22,
- 1, 0, 0, 0,144,151, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48,150, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,144,151, 85, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,144,151, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,150, 85, 22, 1, 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, 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, 68, 65, 84, 65,144, 2, 0, 0, 48,134,173, 4, 1, 0, 0, 0,172, 0, 0, 0,
- 1, 0, 0, 0,176,155, 85, 22, 1, 0, 0, 0, 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, 64, 84, 86, 22,
- 1, 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, 68, 65, 84, 65, 40, 1, 0, 0,240,152, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 80,154, 85, 22, 1, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 80,154, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,152, 85, 22, 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,176,155, 85, 22,
- 1, 0, 0, 0,176, 0, 0, 0, 1, 0, 0, 0,144,162, 85, 22, 1, 0, 0, 0, 48,134,173, 4, 1, 0, 0, 0,240,152, 85, 22,
- 1, 0, 0, 0, 80,154, 85, 22, 1, 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, 0, 0, 0, 0, 48,218,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 40, 1, 0, 0, 16,157, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,112,158, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,112,158, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,208,159, 85, 22, 1, 0, 0, 0, 16,157, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,208,159, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 48,161, 85, 22, 1, 0, 0, 0,112,158, 85, 22, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48,161, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,159, 85, 22, 1, 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,
-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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,162, 85, 22, 1, 0, 0, 0,166, 0, 0, 0,
- 1, 0, 0, 0,160,170, 85, 22, 1, 0, 0, 0,176,155, 85, 22, 1, 0, 0, 0, 16,157, 85, 22, 1, 0, 0, 0, 48,161, 85, 22,
- 1, 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, 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,
- 40, 1, 0, 0,192,163, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 32,165, 85, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 32,165, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,128,166, 85, 22, 1, 0, 0, 0,192,163, 85, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,128,166, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,224,167, 85, 22, 1, 0, 0, 0, 32,165, 85, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,224,167, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 64,169, 85, 22, 1, 0, 0, 0,128,166, 85, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 64,169, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,167, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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,138,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,
-104, 3, 0, 0, 48,138,173, 4, 1, 0, 0, 0,159, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 48, 1, 0, 0,160,170, 85, 22, 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0,208,174, 85, 22, 1, 0, 0, 0,144,162, 85, 22,
- 1, 0, 0, 0,192,163, 85, 22, 1, 0, 0, 0, 64,169, 85, 22, 1, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 40, 1, 0, 0, 16,172, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,112,173, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,112,173, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 16,172, 85, 22, 1, 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,
-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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,200, 0, 0, 0,208,174, 85, 22, 1, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,160,170, 85, 22, 1, 0, 0, 0, 16,172, 85, 22, 1, 0, 0, 0,112,173, 85, 22, 1, 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, 1, 0, 0, 0,
- 6, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0, 80,176, 85, 22, 1, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 64,234, 85, 22,
- 1, 0, 0, 0, 0,242, 84, 22, 1, 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, 96,177, 85, 22, 1, 0, 0, 0, 0,180, 85, 22, 1, 0, 0, 0, 96,180, 85, 22, 1, 0, 0, 0, 32,184, 85, 22,
- 1, 0, 0, 0,128,184, 85, 22, 1, 0, 0, 0,192,206, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 96,177, 85, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0,192,177, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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,192,177, 85, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 32,178, 85, 22,
- 1, 0, 0, 0, 96,177, 85, 22, 1, 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, 32,178, 85, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,128,178, 85, 22, 1, 0, 0, 0,192,177, 85, 22,
- 1, 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,128,178, 85, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,224,178, 85, 22, 1, 0, 0, 0, 32,178, 85, 22, 1, 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,224,178, 85, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0, 64,179, 85, 22, 1, 0, 0, 0,128,178, 85, 22, 1, 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, 64,179, 85, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,160,179, 85, 22,
- 1, 0, 0, 0,224,178, 85, 22, 1, 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,160,179, 85, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0,180, 85, 22, 1, 0, 0, 0, 64,179, 85, 22,
- 1, 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, 0,180, 85, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,179, 85, 22, 1, 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, 96,180, 85, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0,192,180, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,177, 85, 22, 1, 0, 0, 0, 32,178, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,192,180, 85, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 32,181, 85, 22, 1, 0, 0, 0, 96,180, 85, 22, 1, 0, 0, 0,192,177, 85, 22, 1, 0, 0, 0,224,178, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 32,181, 85, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0,128,181, 85, 22, 1, 0, 0, 0,192,180, 85, 22, 1, 0, 0, 0, 32,178, 85, 22, 1, 0, 0, 0, 64,179, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,128,181, 85, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0,224,181, 85, 22, 1, 0, 0, 0, 32,181, 85, 22, 1, 0, 0, 0,224,178, 85, 22, 1, 0, 0, 0, 64,179, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,224,181, 85, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 64,182, 85, 22, 1, 0, 0, 0,128,181, 85, 22, 1, 0, 0, 0,224,178, 85, 22, 1, 0, 0, 0,160,179, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 64,182, 85, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0,160,182, 85, 22, 1, 0, 0, 0,224,181, 85, 22, 1, 0, 0, 0, 96,177, 85, 22, 1, 0, 0, 0, 0,180, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,160,182, 85, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 0,183, 85, 22, 1, 0, 0, 0, 64,182, 85, 22, 1, 0, 0, 0, 96,177, 85, 22, 1, 0, 0, 0,224,178, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 0,183, 85, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 96,183, 85, 22, 1, 0, 0, 0,160,182, 85, 22, 1, 0, 0, 0,160,179, 85, 22, 1, 0, 0, 0, 0,180, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 96,183, 85, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0,192,183, 85, 22, 1, 0, 0, 0, 0,183, 85, 22, 1, 0, 0, 0, 64,179, 85, 22, 1, 0, 0, 0,160,179, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,192,183, 85, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 32,184, 85, 22, 1, 0, 0, 0, 96,183, 85, 22, 1, 0, 0, 0,128,178, 85, 22, 1, 0, 0, 0, 0,180, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 32,184, 85, 22, 1, 0, 0, 0,196, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,183, 85, 22, 1, 0, 0, 0,128,178, 85, 22, 1, 0, 0, 0, 64,179, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,128,184, 85, 22, 1, 0, 0, 0,198, 0, 0, 0,
- 1, 0, 0, 0, 32,188, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,178, 85, 22, 1, 0, 0, 0,192,177, 85, 22,
- 1, 0, 0, 0, 32,178, 85, 22, 1, 0, 0, 0, 64,179, 85, 22, 1, 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,192,233, 85, 22, 1, 0, 0, 0,192,233, 85, 22, 1, 0, 0, 0, 96,185, 85, 22, 1, 0, 0, 0,192,186, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 96,185, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,192,186, 85, 22,
- 1, 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,
- 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, 68, 65, 84, 65, 40, 1, 0, 0,192,186, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 96,185, 85, 22, 1, 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, 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, 68, 65, 84, 65,160, 0, 0, 0, 32,188, 85, 22, 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0,192,206, 85, 22,
- 1, 0, 0, 0,128,184, 85, 22, 1, 0, 0, 0, 96,177, 85, 22, 1, 0, 0, 0,224,178, 85, 22, 1, 0, 0, 0,160,179, 85, 22,
- 1, 0, 0, 0, 0,180, 85, 22, 1, 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, 48,142,173, 4,
- 1, 0, 0, 0,192,205, 85, 22, 1, 0, 0, 0, 0,189, 85, 22, 1, 0, 0, 0, 80,193, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 0,189, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 96,190, 85, 22, 1, 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, 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, 68, 65, 84, 65,
- 40, 1, 0, 0, 96,190, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 80,193, 85, 22, 1, 0, 0, 0, 0,189, 85, 22,
- 1, 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, 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,192,191, 85, 22, 1, 0, 0, 0,192,191, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0,192,191, 85, 22, 1, 0, 0, 0,197, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 80,193, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,190, 85, 22, 1, 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, 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, 68, 65, 84, 65,216, 24, 0, 0, 48,142,173, 4, 1, 0, 0, 0,170, 0, 0, 0,
- 1, 0, 0, 0,144,201, 85, 22, 1, 0, 0, 0, 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,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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,176,194, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 16,196, 85, 22, 1, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 16,196, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,112,197, 85, 22, 1, 0, 0, 0,176,194, 85, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,112,197, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,208,198, 85, 22, 1, 0, 0, 0, 16,196, 85, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,208,198, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 48,200, 85, 22, 1, 0, 0, 0,112,197, 85, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 48,200, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,198, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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,168,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,
-104, 3, 0, 0, 48,168,173, 4, 1, 0, 0, 0,159, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 48, 1, 0, 0,144,201, 85, 22, 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0,192,205, 85, 22, 1, 0, 0, 0, 48,142,173, 4,
- 1, 0, 0, 0,176,194, 85, 22, 1, 0, 0, 0, 48,200, 85, 22, 1, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 40, 1, 0, 0, 0,203, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 96,204, 85, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 96,204, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,203, 85, 22, 1, 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,
-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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,200, 0, 0, 0,192,205, 85, 22, 1, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,144,201, 85, 22, 1, 0, 0, 0, 0,203, 85, 22, 1, 0, 0, 0, 96,204, 85, 22, 1, 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, 1, 0, 0, 0,
- 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,192,206, 85, 22, 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 32,188, 85, 22, 1, 0, 0, 0, 0,180, 85, 22, 1, 0, 0, 0,160,179, 85, 22, 1, 0, 0, 0, 64,179, 85, 22,
- 1, 0, 0, 0,128,178, 85, 22, 1, 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,144,228, 85, 22,
- 1, 0, 0, 0,192,232, 85, 22, 1, 0, 0, 0,160,207, 85, 22, 1, 0, 0, 0, 48,227, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,160,207, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0,209, 85, 22, 1, 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, 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, 68, 65, 84, 65,
- 40, 1, 0, 0, 0,209, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,128,213, 85, 22, 1, 0, 0, 0,160,207, 85, 22,
- 1, 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, 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, 96,210, 85, 22, 1, 0, 0, 0,240,211, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0, 96,210, 85, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,240,211, 85, 22, 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,240,211, 85, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,210, 85, 22, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 1, 0, 0,128,213, 85, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,112,216, 85, 22, 1, 0, 0, 0, 0,209, 85, 22,
- 1, 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, 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,224,214, 85, 22, 1, 0, 0, 0,224,214, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0,224,214, 85, 22, 1, 0, 0, 0,197, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,112,216, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 48,227, 85, 22, 1, 0, 0, 0,128,213, 85, 22, 1, 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, 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,208,217, 85, 22,
- 1, 0, 0, 0,160,225, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,208,217, 85, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0, 96,219, 85, 22, 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0, 96,219, 85, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,240,220, 85, 22, 1, 0, 0, 0,208,217, 85, 22,
- 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,240,220, 85, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0,128,222, 85, 22, 1, 0, 0, 0, 96,219, 85, 22, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0,128,222, 85, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 16,224, 85, 22, 1, 0, 0, 0,240,220, 85, 22,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 16,224, 85, 22, 1, 0, 0, 0,197, 0, 0, 0,
- 1, 0, 0, 0,160,225, 85, 22, 1, 0, 0, 0,128,222, 85, 22, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 1, 0, 0,160,225, 85, 22, 1, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,224, 85, 22,
- 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 48,227, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,216, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48,172,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48,172,173, 4, 1, 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,144,228, 85, 22, 1, 0, 0, 0,160, 0, 0, 0,
- 1, 0, 0, 0,192,232, 85, 22, 1, 0, 0, 0, 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, 48,240,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 40, 1, 0, 0, 0,230, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 96,231, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 96,231, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 85, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,200, 0, 0, 0,192,232, 85, 22,
- 1, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,228, 85, 22, 1, 0, 0, 0, 0,230, 85, 22,
- 1, 0, 0, 0, 96,231, 85, 22, 1, 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, 1, 0, 0, 0, 6, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0, 64,234, 85, 22,
- 1, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,176, 85, 22, 1, 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, 80,235, 85, 22, 1, 0, 0, 0,112,239, 85, 22,
- 1, 0, 0, 0,208,239, 85, 22, 1, 0, 0, 0, 48,246, 85, 22, 1, 0, 0, 0,144,246, 85, 22, 1, 0, 0, 0, 32, 52, 86, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 80,235, 85, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,176,235, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 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,176,235, 85, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 16,236, 85, 22, 1, 0, 0, 0, 80,235, 85, 22, 1, 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, 16,236, 85, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0,112,236, 85, 22, 1, 0, 0, 0,176,235, 85, 22, 1, 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,112,236, 85, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,208,236, 85, 22,
- 1, 0, 0, 0, 16,236, 85, 22, 1, 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,208,236, 85, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 48,237, 85, 22, 1, 0, 0, 0,112,236, 85, 22,
- 1, 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, 48,237, 85, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,144,237, 85, 22, 1, 0, 0, 0,208,236, 85, 22, 1, 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,144,237, 85, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0,240,237, 85, 22, 1, 0, 0, 0, 48,237, 85, 22, 1, 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,240,237, 85, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 80,238, 85, 22,
- 1, 0, 0, 0,144,237, 85, 22, 1, 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, 80,238, 85, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,176,238, 85, 22, 1, 0, 0, 0,240,237, 85, 22,
- 1, 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,176,238, 85, 22,
- 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 16,239, 85, 22, 1, 0, 0, 0, 80,238, 85, 22, 1, 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, 16,239, 85, 22, 1, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0,112,239, 85, 22, 1, 0, 0, 0,176,238, 85, 22, 1, 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,112,239, 85, 22, 1, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 16,239, 85, 22, 1, 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,208,239, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 48,240, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,176,235, 85, 22, 1, 0, 0, 0, 16,236, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0, 48,240, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,144,240, 85, 22, 1, 0, 0, 0,208,239, 85, 22,
- 1, 0, 0, 0,176,235, 85, 22, 1, 0, 0, 0,208,236, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,144,240, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,240,240, 85, 22, 1, 0, 0, 0, 48,240, 85, 22,
- 1, 0, 0, 0, 16,236, 85, 22, 1, 0, 0, 0, 48,237, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,240,240, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 80,241, 85, 22, 1, 0, 0, 0,144,240, 85, 22,
- 1, 0, 0, 0,208,236, 85, 22, 1, 0, 0, 0, 48,237, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0, 80,241, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,176,241, 85, 22, 1, 0, 0, 0,240,240, 85, 22,
- 1, 0, 0, 0, 48,237, 85, 22, 1, 0, 0, 0,144,237, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,176,241, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 16,242, 85, 22, 1, 0, 0, 0, 80,241, 85, 22,
- 1, 0, 0, 0, 80,235, 85, 22, 1, 0, 0, 0,240,237, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0, 16,242, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,112,242, 85, 22, 1, 0, 0, 0,176,241, 85, 22,
- 1, 0, 0, 0,208,236, 85, 22, 1, 0, 0, 0, 80,238, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,112,242, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,208,242, 85, 22, 1, 0, 0, 0, 16,242, 85, 22,
- 1, 0, 0, 0,240,237, 85, 22, 1, 0, 0, 0,176,238, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,208,242, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 48,243, 85, 22, 1, 0, 0, 0,112,242, 85, 22,
- 1, 0, 0, 0,176,238, 85, 22, 1, 0, 0, 0, 16,239, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0, 48,243, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,144,243, 85, 22, 1, 0, 0, 0,208,242, 85, 22,
- 1, 0, 0, 0, 80,238, 85, 22, 1, 0, 0, 0, 16,239, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,144,243, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,240,243, 85, 22, 1, 0, 0, 0, 48,243, 85, 22,
- 1, 0, 0, 0,144,237, 85, 22, 1, 0, 0, 0,112,239, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,240,243, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 80,244, 85, 22, 1, 0, 0, 0,144,243, 85, 22,
- 1, 0, 0, 0,112,236, 85, 22, 1, 0, 0, 0,112,239, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0, 80,244, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,176,244, 85, 22, 1, 0, 0, 0,240,243, 85, 22,
- 1, 0, 0, 0,240,237, 85, 22, 1, 0, 0, 0,112,239, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,176,244, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 16,245, 85, 22, 1, 0, 0, 0, 80,244, 85, 22,
- 1, 0, 0, 0, 80,235, 85, 22, 1, 0, 0, 0,112,236, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0, 16,245, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,112,245, 85, 22, 1, 0, 0, 0,176,244, 85, 22,
- 1, 0, 0, 0, 48,237, 85, 22, 1, 0, 0, 0, 80,238, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,112,245, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,208,245, 85, 22, 1, 0, 0, 0, 16,245, 85, 22,
- 1, 0, 0, 0,144,237, 85, 22, 1, 0, 0, 0, 16,239, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,208,245, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 48,246, 85, 22, 1, 0, 0, 0,112,245, 85, 22,
- 1, 0, 0, 0,208,236, 85, 22, 1, 0, 0, 0,176,238, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0, 48,246, 85, 22, 1, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,245, 85, 22,
- 1, 0, 0, 0,144,237, 85, 22, 1, 0, 0, 0,176,238, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-160, 0, 0, 0,144,246, 85, 22, 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0, 48,250, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,208,236, 85, 22, 1, 0, 0, 0,176,235, 85, 22, 1, 0, 0, 0, 16,236, 85, 22, 1, 0, 0, 0, 48,237, 85, 22,
- 1, 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,192, 71, 86, 22, 1, 0, 0, 0,192, 71, 86, 22,
- 1, 0, 0, 0,112,247, 85, 22, 1, 0, 0, 0,208,248, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,112,247, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,208,248, 85, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,208,248, 85, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,247, 85, 22, 1, 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, 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, 68, 65, 84, 65,160, 0, 0, 0, 48,250, 85, 22,
- 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0, 0, 3, 86, 22, 1, 0, 0, 0,144,246, 85, 22, 1, 0, 0, 0, 80,235, 85, 22,
- 1, 0, 0, 0,240,237, 85, 22, 1, 0, 0, 0,112,239, 85, 22, 1, 0, 0, 0,112,236, 85, 22, 1, 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,208,253, 85, 22, 1, 0, 0, 0,144, 1, 86, 22, 1, 0, 0, 0, 16,251, 85, 22,
- 1, 0, 0, 0,112,252, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 16,251, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,112,252, 85, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,112,252, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,251, 85, 22, 1, 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, 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, 68, 65, 84, 65,200, 0, 0, 0,208,253, 85, 22, 1, 0, 0, 0,175, 0, 0, 0,
- 1, 0, 0, 0,144, 1, 86, 22, 1, 0, 0, 0, 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, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,208,254, 85, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 48, 0, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 0, 86, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,254, 85, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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,176,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48,176,173, 4, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,144, 1, 86, 22, 1, 0, 0, 0,160, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,253, 85, 22, 1, 0, 0, 0,208,254, 85, 22, 1, 0, 0, 0, 48, 0, 86, 22,
- 1, 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, 48,240,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 0, 3, 86, 22,
- 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0,160, 22, 86, 22, 1, 0, 0, 0, 48,250, 85, 22, 1, 0, 0, 0,240,237, 85, 22,
- 1, 0, 0, 0,176,238, 85, 22, 1, 0, 0, 0,144,237, 85, 22, 1, 0, 0, 0,112,239, 85, 22, 1, 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, 96, 9, 86, 22, 1, 0, 0, 0,160, 21, 86, 22, 1, 0, 0, 0,224, 3, 86, 22,
- 1, 0, 0, 0, 0, 8, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,224, 3, 86, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 64, 5, 86, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0, 64, 5, 86, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,160, 6, 86, 22, 1, 0, 0, 0,224, 3, 86, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,160, 6, 86, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 8, 86, 22, 1, 0, 0, 0, 64, 5, 86, 22, 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0, 0, 8, 86, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 6, 86, 22, 1, 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, 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, 68, 65, 84, 65,248, 0, 0, 0, 96, 9, 86, 22, 1, 0, 0, 0,166, 0, 0, 0,
- 1, 0, 0, 0,112, 17, 86, 22, 1, 0, 0, 0, 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, 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,
- 40, 1, 0, 0,144, 10, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,240, 11, 86, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,240, 11, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 80, 13, 86, 22, 1, 0, 0, 0,144, 10, 86, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 80, 13, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,176, 14, 86, 22, 1, 0, 0, 0,240, 11, 86, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,176, 14, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 16, 16, 86, 22, 1, 0, 0, 0, 80, 13, 86, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 16, 16, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 14, 86, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 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,180,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,
-104, 3, 0, 0, 48,180,173, 4, 1, 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,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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 48, 1, 0, 0,112, 17, 86, 22, 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0,160, 21, 86, 22, 1, 0, 0, 0, 96, 9, 86, 22,
- 1, 0, 0, 0,144, 10, 86, 22, 1, 0, 0, 0, 16, 16, 86, 22, 1, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 40, 1, 0, 0,224, 18, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 64, 20, 86, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64, 20, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,224, 18, 86, 22, 1, 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,
-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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,200, 0, 0, 0,160, 21, 86, 22, 1, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,112, 17, 86, 22, 1, 0, 0, 0,224, 18, 86, 22, 1, 0, 0, 0, 64, 20, 86, 22, 1, 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, 1, 0, 0, 0,
- 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,160, 22, 86, 22, 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0, 32, 52, 86, 22,
- 1, 0, 0, 0, 0, 3, 86, 22, 1, 0, 0, 0,176,238, 85, 22, 1, 0, 0, 0,208,236, 85, 22, 1, 0, 0, 0, 80,238, 85, 22,
- 1, 0, 0, 0, 16,239, 85, 22, 1, 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, 0, 29, 86, 22,
- 1, 0, 0, 0, 32, 51, 86, 22, 1, 0, 0, 0,128, 23, 86, 22, 1, 0, 0, 0,160, 27, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 23, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,224, 24, 86, 22, 1, 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, 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, 68, 65, 84, 65,
- 40, 1, 0, 0,224, 24, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 64, 26, 86, 22, 1, 0, 0, 0,128, 23, 86, 22,
- 1, 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, 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, 68, 65, 84, 65,
- 40, 1, 0, 0, 64, 26, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,160, 27, 86, 22, 1, 0, 0, 0,224, 24, 86, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 68, 65, 84, 65,
- 40, 1, 0, 0,160, 27, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 26, 86, 22,
- 1, 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, 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, 68, 65, 84, 65,
-248, 0, 0, 0, 0, 29, 86, 22, 1, 0, 0, 0,164, 0, 0, 0, 1, 0, 0, 0,176, 34, 86, 22, 1, 0, 0, 0, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 48, 30, 86, 22, 1, 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, 48, 30, 86, 22, 1, 0, 0, 0, 23, 1, 0, 0,
- 1, 0, 0, 0, 48,218,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,144, 30, 86, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,240, 31, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,240, 31, 86, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 80, 33, 86, 22, 1, 0, 0, 0,144, 30, 86, 22, 1, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 80, 33, 86, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 31, 86, 22, 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0,176, 34, 86, 22, 1, 0, 0, 0, 24, 1, 0, 0,
- 1, 0, 0, 0, 48,184,173, 4, 1, 0, 0, 0, 0, 29, 86, 22, 1, 0, 0, 0,144, 30, 86, 22, 1, 0, 0, 0, 80, 33, 86, 22,
- 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 48,218,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,240, 35, 86, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 80, 37, 86, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 80, 37, 86, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,176, 38, 86, 22, 1, 0, 0, 0,240, 35, 86, 22, 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,176, 38, 86, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 37, 86, 22, 1, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 24, 0, 0, 48,184,173, 4, 1, 0, 0, 0,170, 0, 0, 0,
- 1, 0, 0, 0,240, 46, 86, 22, 1, 0, 0, 0,176, 34, 86, 22, 1, 0, 0, 0,240, 35, 86, 22, 1, 0, 0, 0,176, 38, 86, 22,
- 1, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 16, 40, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,112, 41, 86, 22, 1, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,112, 41, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,208, 42, 86, 22, 1, 0, 0, 0, 16, 40, 86, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,208, 42, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 48, 44, 86, 22, 1, 0, 0, 0,112, 41, 86, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 44, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,144, 45, 86, 22, 1, 0, 0, 0,208, 42, 86, 22,
- 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,144, 45, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 44, 86, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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,210,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,
-104, 3, 0, 0, 48,210,173, 4, 1, 0, 0, 0,159, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 48, 1, 0, 0,240, 46, 86, 22, 1, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0, 32, 51, 86, 22, 1, 0, 0, 0, 48,184,173, 4,
- 1, 0, 0, 0, 16, 40, 86, 22, 1, 0, 0, 0,144, 45, 86, 22, 1, 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, 48,240,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 40, 1, 0, 0, 96, 48, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,192, 49, 86, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,192, 49, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 96, 48, 86, 22, 1, 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,
-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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,200, 0, 0, 0, 32, 51, 86, 22, 1, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,240, 46, 86, 22, 1, 0, 0, 0, 96, 48, 86, 22, 1, 0, 0, 0,192, 49, 86, 22, 1, 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, 1, 0, 0, 0,
- 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 32, 52, 86, 22, 1, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,160, 22, 86, 22, 1, 0, 0, 0, 16,239, 85, 22, 1, 0, 0, 0, 80,238, 85, 22, 1, 0, 0, 0, 48,237, 85, 22,
- 1, 0, 0, 0,144,237, 85, 22, 1, 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,128, 58, 86, 22,
- 1, 0, 0, 0,192, 70, 86, 22, 1, 0, 0, 0, 0, 53, 86, 22, 1, 0, 0, 0, 32, 57, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 53, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 96, 54, 86, 22, 1, 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, 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, 68, 65, 84, 65,
- 40, 1, 0, 0, 96, 54, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,192, 55, 86, 22, 1, 0, 0, 0, 0, 53, 86, 22,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 68, 65, 84, 65,
- 40, 1, 0, 0,192, 55, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 32, 57, 86, 22, 1, 0, 0, 0, 96, 54, 86, 22,
- 1, 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, 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, 68, 65, 84, 65,
- 40, 1, 0, 0, 32, 57, 86, 22, 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 55, 86, 22,
- 1, 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, 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, 68, 65, 84, 65,
-248, 0, 0, 0,128, 58, 86, 22, 1, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0,144, 66, 86, 22, 1, 0, 0, 0, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0,176, 59, 86, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 16, 61, 86, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 16, 61, 86, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,112, 62, 86, 22, 1, 0, 0, 0,176, 59, 86, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,112, 62, 86, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0,208, 63, 86, 22, 1, 0, 0, 0, 16, 61, 86, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,208, 63, 86, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 48, 65, 86, 22, 1, 0, 0, 0,112, 62, 86, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 65, 86, 22, 1, 0, 0, 0,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 63, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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,214,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 48,214,173, 4, 1, 0, 0, 0,159, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,144, 66, 86, 22, 1, 0, 0, 0,160, 0, 0, 0,
- 1, 0, 0, 0,192, 70, 86, 22, 1, 0, 0, 0,128, 58, 86, 22, 1, 0, 0, 0,176, 59, 86, 22, 1, 0, 0, 0, 48, 65, 86, 22,
- 1, 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, 48,240,173, 4,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 40, 1, 0, 0, 0, 68, 86, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 96, 69, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 96, 69, 86, 22,
- 1, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 86, 22, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,200, 0, 0, 0,192, 70, 86, 22,
- 1, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 66, 86, 22, 1, 0, 0, 0, 0, 68, 86, 22,
- 1, 0, 0, 0, 96, 69, 86, 22, 1, 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, 1, 0, 0, 0, 6, 0, 0, 0, 83, 67, 0, 0, 64, 6, 0, 0, 48,218,173, 4,
- 1, 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, 64, 72, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,240,173, 4,
- 1, 0, 0, 0, 48,230,173, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 74, 86, 22,
- 1, 0, 0, 0, 48, 75, 86, 22, 1, 0, 0, 0,112, 74, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,144, 75, 86, 22, 1, 0, 0, 0, 48, 52,189, 29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
-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,176, 80, 86, 22, 1, 0, 0, 0,176, 80, 86, 22, 1, 0, 0, 0, 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,
- 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, 82,109, 21, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,101,109, 21, 1, 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, 68, 65, 84, 65, 96, 0, 0, 0, 64, 72, 86, 22, 1, 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,224, 72, 86, 22, 1, 0, 0, 0,224, 72, 86, 22, 1, 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,224, 72, 86, 22, 1, 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,128, 73, 86, 22,
- 1, 0, 0, 0,128, 73, 86, 22, 1, 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,128, 73, 86, 22, 1, 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, 32, 74, 86, 22, 1, 0, 0, 0, 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, 32, 74, 86, 22,
- 1, 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,
-112, 74, 86, 22, 1, 0, 0, 0,133, 0, 0, 0, 1, 0, 0, 0,208, 74, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,196, 2,251, 1, 48,246,173, 4, 1, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-208, 74, 86, 22, 1, 0, 0, 0,133, 0, 0, 0, 1, 0, 0, 0, 48, 75, 86, 22, 1, 0, 0, 0,112, 74, 86, 22, 1, 0, 0, 0,
- 1, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0,147, 3, 56, 3, 48,252,173, 4, 1, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 48, 75, 86, 22, 1, 0, 0, 0,133, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 74, 86, 22, 1, 0, 0, 0,
- 1, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0,156, 0, 92, 2, 48,240,173, 4, 1, 0, 0, 0, 68, 65, 84, 65,184, 1, 0, 0,
-144, 75, 86, 22, 1, 0, 0, 0,153, 0, 0, 0, 1, 0, 0, 0,128, 77, 86, 22, 1, 0, 0, 0,112, 78, 86, 22, 1, 0, 0, 0,
- 96, 79, 86, 22, 1, 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, 80, 80, 86, 22, 1, 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, 0, 0, 0, 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,128, 77, 86, 22, 1, 0, 0, 0,152, 0, 0, 0, 1, 0, 0, 0,
- 0, 78, 86, 22, 1, 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, 0, 78, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,208,143, 86, 22, 1, 0, 0, 0,
-144,100, 86, 22, 1, 0, 0, 0,176,166, 86, 22, 1, 0, 0, 0,160,147, 86, 22, 1, 0, 0, 0,176,105, 86, 22, 1, 0, 0, 0,
- 0,140, 86, 22, 1, 0, 0, 0, 32,117, 86, 22, 1, 0, 0, 0, 68, 65, 84, 65, 64, 0, 0, 0,112, 78, 86, 22, 1, 0, 0, 0,
-152, 0, 0, 0, 1, 0, 0, 0,240, 78, 86, 22, 1, 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,240, 78, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
-208,143, 86, 22, 1, 0, 0, 0,144,100, 86, 22, 1, 0, 0, 0,176,166, 86, 22, 1, 0, 0, 0,160,147, 86, 22, 1, 0, 0, 0,
-176,105, 86, 22, 1, 0, 0, 0, 0,140, 86, 22, 1, 0, 0, 0, 32,117, 86, 22, 1, 0, 0, 0, 68, 65, 84, 65, 56, 0, 0, 0,
- 96, 79, 86, 22, 1, 0, 0, 0,151, 0, 0, 0, 1, 0, 0, 0,208, 79, 86, 22, 1, 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,208, 79, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
-240,120, 86, 22, 1, 0, 0, 0, 16,159, 86, 22, 1, 0, 0, 0,112,151, 86, 22, 1, 0, 0, 0, 96,132, 86, 22, 1, 0, 0, 0,
-144,128, 86, 22, 1, 0, 0, 0, 48,136, 86, 22, 1, 0, 0, 0,192,124, 86, 22, 1, 0, 0, 0,128,109, 86, 22, 1, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0, 80, 80, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,240,120, 86, 22, 1, 0, 0, 0,
-224,162, 86, 22, 1, 0, 0, 0, 80,113, 86, 22, 1, 0, 0, 0, 64,155, 86, 22, 1, 0, 0, 0, 68, 65, 84, 65, 88, 0, 0, 0,
-176, 80, 86, 22, 1, 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,152, 0, 0, 0, 64, 81, 86, 22, 1, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 0, 0,248, 1, 0, 0,
- 48,226,173, 4, 1, 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, 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, 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, 16, 82, 86, 22, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 83, 86, 22, 1, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 16, 82, 86, 22, 1, 0, 0, 0, 81, 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,144, 83, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 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,144, 83, 86, 22, 1, 0, 0, 0, 79, 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,224, 83, 86, 22, 1, 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, 48,230,173, 4, 1, 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, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,176, 0, 0, 0, 64, 84, 86, 22, 1, 0, 0, 0,
- 27, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0,
- 48, 85, 86, 22, 1, 0, 0, 0, 48, 85, 86, 22, 1, 0, 0, 0, 48, 85, 86, 22, 1, 0, 0, 0, 48, 85, 86, 22, 1, 0, 0, 0,
- 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,234,173, 4, 1, 0, 0, 0,
-255,255,255,255, 0, 4, 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,
- 48, 85, 86, 22, 1, 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,
-240,139,109, 21, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 69, 82, 70, 68, 65, 84, 65, 4, 0, 0, 0,
-240,139,109, 21, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 79, 66, 0, 0,208, 4, 0, 0, 48,240,173, 4,
- 1, 0, 0, 0,121, 0, 0, 0, 1, 0, 0, 0, 48,246,173, 4, 1, 0, 0, 0, 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, 64, 81, 86, 22, 1, 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, 48,246,173, 4, 1, 0, 0, 0,121, 0, 0, 0, 1, 0, 0, 0, 48,252,173, 4, 1, 0, 0, 0, 48,240,173, 4,
- 1, 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,224, 43, 48, 30, 1, 0, 0, 0, 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, 89, 86, 22, 1, 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,144,125,109, 21, 1, 0, 0, 0,240,138,109, 21,
- 1, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 48,138,179, 29,
- 1, 0, 0, 0, 48,150,179, 29, 1, 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,144,125,109, 21, 1, 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,240,138,109, 21, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 79, 66, 0, 0,208, 4, 0, 0, 48,252,173, 4, 1, 0, 0, 0,121, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 48,246,173, 4, 1, 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, 48,226,173, 4, 1, 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, 48, 2,174, 4, 1, 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,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, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63,144, 85, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 86, 86, 22, 1, 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,144, 85, 86, 22, 1, 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, 64, 87, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 40, 0, 0, 0,224, 86, 86, 22, 1, 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, 48, 6,174, 4, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 16, 0, 0, 48, 6,174, 4, 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, 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,104, 1, 0, 0, 64, 87, 86, 22, 1, 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, 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,
-224, 88, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 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,224, 88, 86, 22, 1, 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, 48, 24,174, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 16, 0, 0, 48, 24,174, 4, 1, 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,
- 64, 89, 86, 22, 1, 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,224,114,109, 21, 1, 0, 0, 0,224, 97, 86, 22, 1, 0, 0, 0,144, 98, 86, 22, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,208, 92, 86, 22, 1, 0, 0, 0,112, 95, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-240, 99, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 91, 86, 22, 1, 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,208, 93, 86, 22, 1, 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, 64, 96, 86, 22, 1, 0, 0, 0,
- 3, 0, 0, 0, 5, 0, 0, 0, 84, 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, 4, 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,224,114,109, 21, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 48, 2,174, 4, 1, 0, 0, 0,
- 68, 65, 84, 65,104, 1, 0, 0, 48, 91, 86, 22, 1, 0, 0, 0, 85, 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,208, 92, 86, 22, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,208, 92, 86, 22, 1, 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,
-208, 93, 86, 22, 1, 0, 0, 0, 85, 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,112, 95, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,
-112, 95, 86, 22, 1, 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, 64, 96, 86, 22, 1, 0, 0, 0, 85, 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,224, 97, 86, 22, 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, 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,
-144, 98, 86, 22, 1, 0, 0, 0, 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,240, 99, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,224, 97, 86, 22, 1, 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, 68, 65, 84, 65, 32, 1, 0, 0,144, 98, 86, 22, 1, 0, 0, 0,
- 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, 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, 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, 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, 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, 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, 0, 0,
- 0, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,240, 99, 86, 22, 1, 0, 0, 0, 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,168, 1, 0, 0,144,100, 86, 22, 1, 0, 0, 0, 84, 1, 0, 0, 1, 0, 0, 0,176,105, 86, 22, 1, 0, 0, 0,
- 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,192,103, 86, 22, 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, 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, 16, 1, 0, 0,248,100, 86, 22, 1, 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,192,103, 86, 22, 1, 0, 0, 0, 81, 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, 64,105, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 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,105, 86, 22, 1, 0, 0, 0, 79, 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,176,105, 86, 22, 1, 0, 0, 0, 84, 1, 0, 0, 1, 0, 0, 0,
-128,109, 86, 22, 1, 0, 0, 0,144,100, 86, 22, 1, 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,
-144,107, 86, 22, 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, 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, 16, 1, 0, 0, 24,106, 86, 22, 1, 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,144,107, 86, 22, 1, 0, 0, 0,
- 81, 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, 16,109, 86, 22, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 16,109, 86, 22, 1, 0, 0, 0, 79, 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,128,109, 86, 22, 1, 0, 0, 0,
- 84, 1, 0, 0, 1, 0, 0, 0, 80,113, 86, 22, 1, 0, 0, 0,176,105, 86, 22, 1, 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, 96,111, 86, 22, 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,
- 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, 16, 1, 0, 0,232,109, 86, 22, 1, 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,
- 96,111, 86, 22, 1, 0, 0, 0, 81, 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,
-224,112, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,224,112, 86, 22, 1, 0, 0, 0,
- 79, 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,
- 80,113, 86, 22, 1, 0, 0, 0, 84, 1, 0, 0, 1, 0, 0, 0, 32,117, 86, 22, 1, 0, 0, 0,128,109, 86, 22, 1, 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, 48,115, 86, 22, 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, 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, 16, 1, 0, 0,
-184,113, 86, 22, 1, 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, 48,115, 86, 22, 1, 0, 0, 0, 81, 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,176,116, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,116, 86, 22, 1, 0, 0, 0, 79, 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, 32,117, 86, 22, 1, 0, 0, 0, 84, 1, 0, 0, 1, 0, 0, 0,240,120, 86, 22, 1, 0, 0, 0,
- 80,113, 86, 22, 1, 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, 0,119, 86, 22, 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, 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, 16, 1, 0, 0,136,117, 86, 22, 1, 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, 0,119, 86, 22, 1, 0, 0, 0, 81, 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,128,120, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 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,128,120, 86, 22, 1, 0, 0, 0, 79, 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,240,120, 86, 22, 1, 0, 0, 0, 84, 1, 0, 0, 1, 0, 0, 0,
-192,124, 86, 22, 1, 0, 0, 0, 32,117, 86, 22, 1, 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,
-208,122, 86, 22, 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, 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, 16, 1, 0, 0, 88,121, 86, 22, 1, 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,208,122, 86, 22, 1, 0, 0, 0,
- 81, 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, 80,124, 86, 22, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 80,124, 86, 22, 1, 0, 0, 0, 79, 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,192,124, 86, 22, 1, 0, 0, 0,
- 84, 1, 0, 0, 1, 0, 0, 0,144,128, 86, 22, 1, 0, 0, 0,240,120, 86, 22, 1, 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,160,126, 86, 22, 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,
- 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, 16, 1, 0, 0, 40,125, 86, 22, 1, 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,
-160,126, 86, 22, 1, 0, 0, 0, 81, 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,
- 32,128, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 86, 22, 1, 0, 0, 0,
- 79, 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,
-144,128, 86, 22, 1, 0, 0, 0, 84, 1, 0, 0, 1, 0, 0, 0, 96,132, 86, 22, 1, 0, 0, 0,192,124, 86, 22, 1, 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,112,130, 86, 22, 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, 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, 16, 1, 0, 0,
-248,128, 86, 22, 1, 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,112,130, 86, 22, 1, 0, 0, 0, 81, 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,240,131, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,131, 86, 22, 1, 0, 0, 0, 79, 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, 96,132, 86, 22, 1, 0, 0, 0, 84, 1, 0, 0, 1, 0, 0, 0, 48,136, 86, 22, 1, 0, 0, 0,
-144,128, 86, 22, 1, 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, 64,134, 86, 22, 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, 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, 16, 1, 0, 0,200,132, 86, 22, 1, 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, 64,134, 86, 22, 1, 0, 0, 0, 81, 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,192,135, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 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,192,135, 86, 22, 1, 0, 0, 0, 79, 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, 48,136, 86, 22, 1, 0, 0, 0, 84, 1, 0, 0, 1, 0, 0, 0,
- 0,140, 86, 22, 1, 0, 0, 0, 96,132, 86, 22, 1, 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,
- 16,138, 86, 22, 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, 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, 16, 1, 0, 0,152,136, 86, 22, 1, 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, 16,138, 86, 22, 1, 0, 0, 0,
- 81, 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,144,139, 86, 22, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,139, 86, 22, 1, 0, 0, 0, 79, 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, 0,140, 86, 22, 1, 0, 0, 0,
- 84, 1, 0, 0, 1, 0, 0, 0,208,143, 86, 22, 1, 0, 0, 0, 48,136, 86, 22, 1, 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,224,141, 86, 22, 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,
- 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, 16, 1, 0, 0,104,140, 86, 22, 1, 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,
-224,141, 86, 22, 1, 0, 0, 0, 81, 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,
- 96,143, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,143, 86, 22, 1, 0, 0, 0,
- 79, 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,
-208,143, 86, 22, 1, 0, 0, 0, 84, 1, 0, 0, 1, 0, 0, 0,160,147, 86, 22, 1, 0, 0, 0, 0,140, 86, 22, 1, 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,176,145, 86, 22, 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, 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, 16, 1, 0, 0,
- 56,144, 86, 22, 1, 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,176,145, 86, 22, 1, 0, 0, 0, 81, 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, 48,147, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
- 48,147, 86, 22, 1, 0, 0, 0, 79, 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,160,147, 86, 22, 1, 0, 0, 0, 84, 1, 0, 0, 1, 0, 0, 0,112,151, 86, 22, 1, 0, 0, 0,
-208,143, 86, 22, 1, 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,128,149, 86, 22, 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, 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, 16, 1, 0, 0, 8,148, 86, 22, 1, 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,128,149, 86, 22, 1, 0, 0, 0, 81, 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, 0,151, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 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,151, 86, 22, 1, 0, 0, 0, 79, 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,112,151, 86, 22, 1, 0, 0, 0, 84, 1, 0, 0, 1, 0, 0, 0,
- 64,155, 86, 22, 1, 0, 0, 0,160,147, 86, 22, 1, 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,
- 80,153, 86, 22, 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, 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, 16, 1, 0, 0,216,151, 86, 22, 1, 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, 80,153, 86, 22, 1, 0, 0, 0,
- 81, 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,208,154, 86, 22, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,154, 86, 22, 1, 0, 0, 0, 79, 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, 64,155, 86, 22, 1, 0, 0, 0,
- 84, 1, 0, 0, 1, 0, 0, 0, 16,159, 86, 22, 1, 0, 0, 0,112,151, 86, 22, 1, 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, 32,157, 86, 22, 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,
- 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, 16, 1, 0, 0,168,155, 86, 22, 1, 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,
- 32,157, 86, 22, 1, 0, 0, 0, 81, 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,
-160,158, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,160,158, 86, 22, 1, 0, 0, 0,
- 79, 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,
- 16,159, 86, 22, 1, 0, 0, 0, 84, 1, 0, 0, 1, 0, 0, 0,224,162, 86, 22, 1, 0, 0, 0, 64,155, 86, 22, 1, 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,240,160, 86, 22, 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, 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, 16, 1, 0, 0,
-120,159, 86, 22, 1, 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,240,160, 86, 22, 1, 0, 0, 0, 81, 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,112,162, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,162, 86, 22, 1, 0, 0, 0, 79, 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,224,162, 86, 22, 1, 0, 0, 0, 84, 1, 0, 0, 1, 0, 0, 0,176,166, 86, 22, 1, 0, 0, 0,
- 16,159, 86, 22, 1, 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,192,164, 86, 22, 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, 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, 16, 1, 0, 0, 72,163, 86, 22, 1, 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,192,164, 86, 22, 1, 0, 0, 0, 81, 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, 64,166, 86, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 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,166, 86, 22, 1, 0, 0, 0, 79, 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,176,166, 86, 22, 1, 0, 0, 0, 84, 1, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,224,162, 86, 22, 1, 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,
-144,168, 86, 22, 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, 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, 16, 1, 0, 0, 24,167, 86, 22, 1, 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,144,168, 86, 22, 1, 0, 0, 0,
- 81, 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, 16,170, 86, 22, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 16,170, 86, 22, 1, 0, 0, 0, 79, 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, 0, 13, 0, 0, 0,123, 54, 3, 1, 0, 0, 0,
-193, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4, 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, 48, 56,174, 4, 1, 0, 0, 0,
- 48, 56,174, 4, 1, 0, 0, 0, 96,151, 93, 22, 1, 0, 0, 0, 96,151, 93, 22, 1, 0, 0, 0, 96,157, 93, 22, 1, 0, 0, 0,
- 96,157, 93, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,136, 28, 0, 0, 48, 56,174, 4, 1, 0, 0, 0,190, 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, 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,
-144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,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, 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,
-144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,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, 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,
-144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,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,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,
-144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,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, 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, 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,
-144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,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, 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,
-144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,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, 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,
-144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,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, 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, 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,
-144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,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, 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, 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,
-144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,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, 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,
-144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,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, 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,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,
-144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,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, 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,
-144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,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,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,
-144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,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, 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,
-144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,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, 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,
-144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,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,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,
-144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,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, 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,
-144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,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, 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,
-144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,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, 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, 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,
- 1, 0, 0, 0, 0, 0, 0, 0, 68, 78, 65, 49, 40,222, 0, 0, 48, 16, 78, 29, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
- 83, 68, 78, 65, 78, 65, 77, 69,158, 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, 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,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, 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,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,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,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, 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,102,112, 95,115,116,114,
- 91, 56, 93, 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,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,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,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,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,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, 54, 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,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,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, 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,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, 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,
-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,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,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,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,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, 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, 0,
- 84, 89, 80, 69,207, 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, 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, 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, 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, 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, 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,152, 0, 40, 0,
- 64, 6,240, 1, 0, 0, 0, 0, 0, 0, 16, 1,104, 1,120, 1, 24, 0, 8, 3,200, 0, 0, 0, 88, 0, 32, 1,240, 0,136, 0,
-248, 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, 72, 0, 96, 0,
-112, 0,120, 0, 88, 0,120, 0,152, 0, 88, 0, 80, 0,128, 0, 80, 0,104, 0, 0, 1, 56, 0,192, 0,176, 0,216, 0, 80, 0,
-112, 0,128, 0,216, 0,128, 0,240, 0, 72, 0,128, 0, 0, 0,144, 0, 40, 0, 8, 2,152, 0, 0, 0,112, 0, 0, 0, 0, 0,
- 88, 0, 8, 0, 8, 0, 16, 1,104, 0,240, 1, 96, 0, 88, 0, 80, 0, 88, 0,200, 1,136, 0,128, 0, 72, 0,128, 0,104, 0,
-232, 0, 48, 0, 0, 0,144, 0,144, 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, 40, 0, 64, 0, 24, 0, 88, 0, 72, 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, 16, 0, 48, 2,
- 0, 0, 0, 0, 88, 0,104, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 1, 56, 0,152, 0, 72, 0,208, 0,248, 0, 40, 0,
- 0, 1,248, 0,200, 1,104, 0, 0, 0,168, 0, 0, 0, 40, 1, 16, 0, 16, 0,216, 24, 24, 12,224, 0,144, 2,120, 2, 64, 0,
-200, 0, 32, 1, 72, 0,208, 2, 40, 0,144, 1, 40, 0, 24, 1, 32, 0,232, 0, 32, 0, 32, 0, 80, 2, 96, 1, 16, 0,136, 28,
- 80, 0, 56, 0, 0, 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, 52, 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,224, 0, 40, 0, 40, 1,200, 0, 16, 0,
- 16, 2, 0, 0, 4, 0, 40, 0,120, 0, 8, 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, 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, 72, 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, 8, 2,104, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 16, 0, 32, 0, 40, 0,192, 0, 40, 0, 32, 0, 16, 1,224, 0,232, 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, 0, 0, 83, 84, 82, 67,148, 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, 50, 0,139, 0, 2, 0,140, 0, 2, 0,141, 0, 2, 0,129, 0,
- 2, 0, 19, 0, 2, 0,142, 0, 2, 0, 17, 0, 4, 0,143, 0, 2, 0,144, 0, 2, 0,145, 0, 2, 0,146, 0, 2, 0,147, 0,
- 2, 0,148, 0, 2, 0,149, 0, 4, 0,150, 0, 4, 0,151, 0, 43, 0,152, 0, 30, 0,153, 0, 7, 0,154, 0, 4, 0,155, 0,
- 2, 0,156, 0, 2, 0,157, 0, 2, 0,158, 0, 2, 0,159, 0, 7, 0,160, 0, 7, 0,161, 0, 51, 0, 63, 0, 2, 0,162, 0,
- 2, 0,163, 0, 2, 0,164, 0, 2, 0,165, 0, 32, 0,166, 0, 52, 0,167, 0, 0, 0,168, 0, 0, 0,169, 0, 0, 0,170, 0,
- 0, 0,171, 0, 0, 0,172, 0, 7, 0,173, 0, 7, 0,174, 0, 7, 0,175, 0, 2, 0,176, 0, 2, 0,177, 0, 2, 0,178, 0,
- 2, 0,179, 0, 2, 0,180, 0, 2, 0,181, 0, 0, 0,182, 0, 0, 0,183, 0, 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0,
- 7, 0,187, 0, 7, 0,188, 0, 7, 0, 57, 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, 7, 0,222, 0, 7, 0,223, 0, 53, 0, 15, 0, 0, 0,224, 0,
- 9, 0,225, 0, 0, 0,226, 0, 0, 0,227, 0, 4, 0,228, 0, 4, 0,229, 0, 9, 0,230, 0, 7, 0,231, 0, 7, 0,232, 0,
- 7, 0,233, 0, 4, 0,234, 0, 9, 0,235, 0, 9, 0,236, 0, 4, 0,237, 0, 4, 0, 37, 0, 54, 0, 6, 0, 7, 0,184, 0,
- 7, 0,185, 0, 7, 0,186, 0, 7, 0,238, 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,239, 0, 54, 0,233, 0, 56, 0, 17, 0, 32, 0,166, 0, 47, 0,240, 0, 57, 0,241, 0, 7, 0,242, 0,
- 7, 0,243, 0, 2, 0, 17, 0, 2, 0,244, 0, 7, 0,110, 0, 7, 0,111, 0, 7, 0,245, 0, 4, 0,246, 0, 2, 0,247, 0,
- 2, 0,248, 0, 4, 0,129, 0, 4, 0,143, 0, 2, 0,249, 0, 2, 0,250, 0, 58, 0, 22, 0, 2, 0, 19, 0, 2, 0,251, 0,
- 7, 0,252, 0, 7, 0,253, 0, 2, 0,142, 0, 2, 0,254, 0, 4, 0,255, 0, 4, 0, 0, 1, 32, 0,166, 0, 4, 0, 1, 1,
- 2, 0, 2, 1, 2, 0, 3, 1, 9, 0, 4, 1, 7, 0, 5, 1, 7, 0, 6, 1, 2, 0, 7, 1, 2, 0, 8, 1, 2, 0, 9, 1,
- 2, 0, 10, 1, 7, 0, 11, 1, 7, 0, 12, 1, 55, 0, 13, 1, 59, 0, 11, 0, 4, 0, 14, 1, 4, 0, 15, 1, 2, 0, 16, 1,
- 2, 0, 19, 0, 2, 0, 17, 1, 2, 0, 18, 1, 32, 0,166, 0, 7, 0, 19, 1, 4, 0, 20, 1, 0, 0, 21, 1, 7, 0, 22, 1,
- 52, 0, 61, 0, 27, 0, 31, 0, 39, 0, 75, 0, 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, 7, 0, 41, 1, 7, 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, 48, 1, 2, 0, 49, 1, 2, 0, 19, 0, 2, 0, 17, 0,
- 2, 0,244, 0, 7, 0, 50, 1, 7, 0, 51, 1, 7, 0, 52, 1, 7, 0, 53, 1, 4, 0, 54, 1, 4, 0, 55, 1, 2, 0, 56, 1,
- 2, 0, 57, 1, 2, 0, 17, 1, 2, 0,127, 0, 4, 0, 23, 0, 4, 0,124, 0, 4, 0,125, 0, 4, 0,126, 0, 7, 0, 58, 1,
- 7, 0, 59, 1, 7, 0, 43, 0, 45, 0, 60, 1, 60, 0, 61, 1, 36, 0, 80, 0, 47, 0,240, 0, 53, 0, 62, 1, 55, 0, 13, 1,
- 56, 0, 63, 1, 30, 0,153, 0, 58, 0, 64, 1, 59, 0, 65, 1, 0, 0, 66, 1, 0, 0,183, 0, 61, 0, 8, 0, 7, 0, 67, 1,
- 7, 0, 68, 1, 7, 0,174, 0, 4, 0, 19, 0, 7, 0, 69, 1, 7, 0, 70, 1, 7, 0, 71, 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, 72, 1, 2, 0,177, 0, 2, 0, 73, 1, 7, 0,184, 0,
- 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0, 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, 7, 0, 83, 1, 7, 0, 84, 1, 63, 0, 85, 1, 2, 0,251, 0,
- 2, 0, 70, 0, 7, 0,110, 0, 7, 0,111, 0, 7, 0, 86, 1, 7, 0, 87, 1, 7, 0, 88, 1, 7, 0, 89, 1, 7, 0, 90, 1,
- 2, 0, 91, 1, 2, 0, 92, 1, 2, 0, 93, 1, 2, 0, 94, 1, 0, 0, 95, 1, 0, 0, 96, 1, 2, 0, 97, 1, 2, 0, 98, 1,
- 2, 0, 99, 1, 2, 0,100, 1, 2, 0,101, 1, 7, 0,102, 1, 7, 0,103, 1, 7, 0,104, 1, 7, 0,105, 1, 2, 0,106, 1,
- 2, 0, 43, 0, 2, 0,107, 1, 2, 0,108, 1, 2, 0,109, 1, 2, 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, 7, 0,121, 1,
- 7, 0,122, 1, 2, 0,123, 1, 2, 0,124, 1, 4, 0,125, 1, 4, 0,126, 1, 2, 0,127, 1, 2, 0,128, 1, 2, 0,129, 1,
- 2, 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, 36, 0, 80, 0,
- 51, 0,137, 1, 2, 0,138, 1, 2, 0,139, 1, 30, 0,153, 0, 64, 0, 2, 0, 27, 0, 31, 0, 36, 0, 80, 0, 65, 0, 18, 0,
- 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,
- 7, 0,148, 1, 7, 0,149, 1, 2, 0,150, 1, 2, 0,151, 1, 2, 0,152, 1, 2, 0,153, 1, 7, 0,154, 1, 7, 0,155, 1,
- 7, 0,156, 1, 7, 0,157, 1, 66, 0,124, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0,158, 1, 2, 0, 19, 0, 7, 0,184, 0,
- 7, 0,185, 0, 7, 0,186, 0, 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, 7, 0,177, 1, 7, 0,178, 1, 65, 0,179, 1, 7, 0,180, 1,
- 7, 0,181, 1, 7, 0,182, 1, 7, 0,183, 1, 7, 0,184, 1, 7, 0,185, 1, 7, 0,186, 1, 2, 0,187, 1, 2, 0,188, 1,
- 2, 0,189, 1, 0, 0,190, 1, 0, 0,191, 1, 7, 0,192, 1, 7, 0,193, 1, 2, 0,194, 1, 2, 0,195, 1, 7, 0,196, 1,
- 7, 0,197, 1, 7, 0,198, 1, 7, 0,199, 1, 2, 0,200, 1, 2, 0,201, 1, 4, 0, 72, 1, 4, 0,202, 1, 2, 0,203, 1,
- 2, 0,204, 1, 2, 0,205, 1, 2, 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, 7, 0,215, 1, 7, 0,216, 1, 0, 0,217, 1, 7, 0,218, 1, 7, 0,219, 1,
- 7, 0,220, 1, 4, 0,221, 1, 0, 0,222, 1, 0, 0,107, 1, 0, 0,223, 1, 0, 0, 66, 1, 2, 0,224, 1, 2, 0,225, 1,
- 2, 0,138, 1, 2, 0,226, 1, 2, 0,227, 1, 2, 0,228, 1, 7, 0,229, 1, 7, 0,230, 1, 7, 0,231, 1, 7, 0,232, 1,
- 7, 0,233, 1, 2, 0,162, 0, 2, 0,163, 0, 55, 0,234, 1, 55, 0,235, 1, 0, 0,236, 1, 0, 0,237, 1, 0, 0,238, 1,
- 0, 0,239, 1, 2, 0,240, 1, 2, 0,241, 1, 7, 0,242, 1, 7, 0,243, 1, 51, 0,137, 1, 60, 0, 61, 1, 36, 0, 80, 0,
- 67, 0,244, 1, 30, 0,153, 0, 7, 0,245, 1, 7, 0,246, 1, 7, 0,247, 1, 7, 0,248, 1, 7, 0,249, 1, 2, 0,250, 1,
- 2, 0, 70, 0, 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,
- 7, 0, 2, 2, 7, 0, 3, 2, 2, 0, 4, 2, 2, 0, 5, 2, 4, 0, 6, 2, 4, 0,124, 1, 12, 0, 7, 2, 68, 0, 4, 0,
- 27, 0, 31, 0, 0, 0, 8, 2, 69, 0, 2, 0, 43, 0,152, 0, 70, 0, 26, 0, 70, 0, 0, 0, 70, 0, 1, 0, 71, 0, 9, 2,
- 4, 0, 10, 2, 4, 0, 11, 2, 4, 0, 12, 2, 4, 0, 13, 2, 4, 0, 14, 2, 4, 0, 15, 2, 2, 0, 17, 0, 2, 0, 19, 0,
- 2, 0, 16, 2, 2, 0, 17, 2, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 7, 0, 18, 2, 7, 0, 19, 2, 7, 0, 20, 2,
- 7, 0, 21, 2, 7, 0, 22, 2, 7, 0, 23, 2, 7, 0, 24, 2, 7, 0, 23, 0, 7, 0, 25, 2, 7, 0, 26, 2, 72, 0, 20, 0,
- 27, 0, 31, 0, 39, 0, 75, 0, 71, 0, 9, 2, 12, 0, 27, 2, 12, 0, 28, 2, 12, 0, 29, 2, 36, 0, 80, 0, 66, 0, 30, 2,
- 0, 0, 19, 0, 0, 0, 31, 2, 2, 0, 32, 2, 2, 0,176, 0, 2, 0, 37, 0, 7, 0, 67, 1, 7, 0,174, 0, 7, 0, 68, 1,
- 7, 0, 33, 2, 7, 0, 34, 2, 7, 0, 35, 2, 70, 0, 36, 2, 35, 0, 11, 0, 7, 0, 37, 2, 7, 0, 38, 2, 7, 0, 39, 2,
- 7, 0,253, 0, 2, 0, 55, 0, 0, 0, 40, 2, 0, 0, 41, 2, 0, 0, 42, 2, 0, 0, 43, 2, 0, 0, 44, 2, 0, 0, 45, 2,
- 34, 0, 7, 0, 7, 0, 46, 2, 7, 0, 38, 2, 7, 0, 39, 2, 2, 0, 42, 2, 2, 0, 45, 2, 7, 0,253, 0, 7, 0, 37, 0,
- 73, 0, 21, 0, 73, 0, 0, 0, 73, 0, 1, 0, 2, 0, 17, 0, 2, 0, 47, 2, 2, 0, 45, 2, 2, 0, 19, 0, 2, 0, 48, 2,
- 2, 0, 49, 2, 2, 0, 50, 2, 2, 0, 51, 2, 2, 0, 52, 2, 2, 0, 53, 2, 2, 0, 54, 2, 2, 0, 55, 2, 7, 0, 56, 2,
- 7, 0, 57, 2, 34, 0, 49, 0, 35, 0, 50, 0, 2, 0, 58, 2, 2, 0, 59, 2, 4, 0, 60, 2, 74, 0, 5, 0, 2, 0, 61, 2,
- 2, 0, 47, 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, 62, 2, 76, 0, 68, 0, 27, 0, 31, 0, 39, 0, 75, 0, 71, 0, 9, 2, 12, 0, 63, 2, 12, 0, 28, 2, 12, 0, 64, 2,
- 32, 0, 65, 2, 32, 0, 66, 2, 32, 0, 67, 2, 36, 0, 80, 0, 77, 0, 68, 2, 38, 0, 69, 2, 66, 0, 30, 2, 12, 0, 70, 2,
- 7, 0, 67, 1, 7, 0,174, 0, 7, 0, 68, 1, 2, 0,176, 0, 2, 0, 43, 0, 2, 0, 71, 2, 2, 0, 72, 2, 2, 0, 73, 2,
- 7, 0, 74, 2, 7, 0, 70, 0, 2, 0, 75, 2, 2, 0, 32, 2, 2, 0, 19, 0, 2, 0, 76, 2, 7, 0, 77, 2, 7, 0, 78, 2,
- 7, 0, 79, 2, 2, 0, 50, 2, 2, 0, 51, 2, 2, 0, 80, 2, 2, 0, 81, 2, 4, 0, 82, 2, 34, 0, 83, 2, 2, 0, 23, 0,
- 2, 0, 95, 0, 2, 0, 67, 0, 2, 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, 7, 0, 93, 2, 7, 0, 94, 2, 0, 0, 95, 2, 78, 0, 96, 2, 79, 0, 97, 2,
- 0, 0, 98, 2, 68, 0, 99, 2, 68, 0,100, 2, 68, 0,101, 2, 68, 0,102, 2, 4, 0,103, 2, 7, 0,104, 2, 4, 0,105, 2,
- 4, 0,106, 2, 75, 0,107, 2, 4, 0,108, 2, 4, 0,109, 2, 74, 0,110, 2, 74, 0,111, 2, 80, 0, 41, 0, 27, 0, 31, 0,
- 39, 0, 75, 0, 71, 0, 9, 2, 12, 0,112, 2, 36, 0, 80, 0, 38, 0, 69, 2, 66, 0, 30, 2, 81, 0,113, 2, 82, 0,114, 2,
- 83, 0,115, 2, 84, 0,116, 2, 85, 0,117, 2, 86, 0,118, 2, 87, 0,119, 2, 88, 0,120, 2, 80, 0,121, 2, 89, 0,122, 2,
- 90, 0,123, 2, 91, 0,124, 2, 91, 0,125, 2, 91, 0,126, 2, 4, 0, 54, 0, 4, 0,127, 2, 4, 0,128, 2, 4, 0,129, 2,
- 4, 0,130, 2, 2, 0,176, 0, 2, 0,131, 2, 7, 0, 67, 1, 7, 0,174, 0, 7, 0, 68, 1, 7, 0,132, 2, 4, 0, 71, 2,
- 2, 0,133, 2, 2, 0, 19, 0, 2, 0,134, 2, 2, 0,135, 2, 2, 0, 32, 2, 2, 0,136, 2, 92, 0,137, 2, 93, 0,138, 2,
- 83, 0, 8, 0, 9, 0,139, 2, 7, 0,140, 2, 4, 0,141, 2, 0, 0, 19, 0, 0, 0,142, 2, 2, 0, 72, 1, 2, 0,143, 2,
- 2, 0,144, 2, 81, 0, 7, 0, 4, 0,145, 2, 4, 0,146, 2, 4, 0,147, 2, 4, 0,148, 2, 2, 0, 47, 2, 0, 0,149, 2,
- 0, 0, 19, 0, 85, 0, 5, 0, 4, 0,145, 2, 4, 0,146, 2, 0, 0,150, 2, 0, 0,151, 2, 2, 0, 19, 0, 94, 0, 2, 0,
- 4, 0,152, 2, 7, 0, 39, 2, 86, 0, 3, 0, 94, 0,153, 2, 4, 0,154, 2, 4, 0, 19, 0, 84, 0, 6, 0, 7, 0,155, 2,
- 2, 0,156, 2, 2, 0, 47, 2, 0, 0, 19, 0, 0, 0,151, 2, 0, 0, 73, 2, 87, 0, 4, 0, 0, 0,238, 0, 0, 0,184, 0,
- 0, 0,185, 0, 0, 0,186, 0, 95, 0, 6, 0, 47, 0,139, 2, 0, 0, 19, 0, 0, 0,142, 2, 2, 0, 72, 1, 2, 0,143, 2,
- 2, 0,144, 2, 96, 0, 1, 0, 7, 0,157, 2, 97, 0, 5, 0, 0, 0,238, 0, 0, 0,184, 0, 0, 0,185, 0, 0, 0,186, 0,
- 4, 0, 37, 0, 88, 0, 1, 0, 7, 0,158, 2, 89, 0, 2, 0, 4, 0,159, 2, 4, 0, 17, 0, 82, 0, 7, 0, 7, 0,140, 2,
- 47, 0,139, 2, 0, 0, 19, 0, 0, 0,142, 2, 2, 0, 72, 1, 2, 0,143, 2, 2, 0,144, 2, 98, 0, 1, 0, 7, 0,160, 2,
- 99, 0, 1, 0, 4, 0,161, 2,100, 0, 1, 0, 0, 0,162, 2,101, 0, 1, 0, 7, 0,140, 2,102, 0, 3, 0, 4, 0,163, 2,
- 0, 0, 92, 0, 7, 0,164, 2,103, 0, 4, 0, 7, 0,238, 0, 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0,104, 0, 1, 0,
-103, 0,141, 2,105, 0, 5, 0, 4, 0,165, 2, 4, 0,166, 2, 0, 0, 19, 0, 0, 0, 47, 2, 0, 0, 73, 2,106, 0, 2, 0,
- 4, 0,167, 2, 4, 0,166, 2,107, 0, 10, 0,107, 0, 0, 0,107, 0, 1, 0,105, 0,168, 2,104, 0,169, 2,106, 0,170, 2,
- 4, 0, 54, 0, 4, 0,128, 2, 4, 0,127, 2, 4, 0, 37, 0, 84, 0,171, 2, 92, 0, 14, 0, 12, 0,172, 2, 84, 0,171, 2,
- 0, 0,173, 2, 0, 0,174, 2, 0, 0,175, 2, 0, 0,176, 2, 0, 0,177, 2, 0, 0,178, 2, 0, 0,179, 2, 0, 0, 19, 0,
- 91, 0,124, 2, 91, 0,126, 2, 2, 0,180, 2, 0, 0,181, 2, 93, 0, 8, 0, 4, 0,182, 2, 4, 0,183, 2, 81, 0,184, 2,
- 85, 0,185, 2, 4, 0,128, 2, 4, 0,127, 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, 72, 1, 0, 0, 20, 0, 46, 0,134, 0, 0, 0,186, 2,109, 0, 7, 0,108, 0,187, 2, 2, 0,188, 2,
- 2, 0,172, 2, 2, 0,189, 2, 2, 0, 90, 0, 9, 0,190, 2, 9, 0,191, 2,110, 0, 3, 0,108, 0,187, 2, 32, 0,166, 0,
- 0, 0, 20, 0,111, 0, 5, 0,108, 0,187, 2, 32, 0,166, 0, 0, 0, 20, 0, 2, 0,192, 2, 0, 0,193, 2,112, 0, 5, 0,
-108, 0,187, 2, 7, 0, 88, 0, 7, 0,194, 2, 4, 0,195, 2, 4, 0,196, 2,113, 0, 5, 0,108, 0,187, 2, 32, 0,197, 2,
- 0, 0, 72, 0, 4, 0, 72, 1, 4, 0, 19, 0,114, 0, 13, 0,108, 0,187, 2, 32, 0,198, 2, 32, 0,199, 2, 32, 0,200, 2,
- 32, 0,201, 2, 7, 0,202, 2, 7, 0,203, 2, 7, 0,194, 2, 7, 0,204, 2, 4, 0,205, 2, 4, 0,206, 2, 4, 0, 90, 0,
- 4, 0,207, 2,115, 0, 5, 0,108, 0,187, 2, 2, 0,208, 2, 2, 0, 19, 0, 7, 0,209, 2, 32, 0,210, 2,116, 0, 3, 0,
-108, 0,187, 2, 7, 0,211, 2, 4, 0, 90, 0,117, 0, 10, 0,108, 0,187, 2, 7, 0,212, 2, 4, 0,213, 2, 4, 0, 37, 0,
- 2, 0, 90, 0, 2, 0,214, 2, 2, 0,215, 2, 2, 0,216, 2, 7, 0,217, 2, 0, 0,218, 2,118, 0, 3, 0,108, 0,187, 2,
- 7, 0, 37, 0, 4, 0, 17, 0,119, 0, 6, 0,108, 0,187, 2,120, 0,219, 2,121, 0,220, 2,122, 0,221, 2, 7, 0,222, 2,
- 4, 0, 17, 0,123, 0, 11, 0,108, 0,187, 2, 52, 0,223, 2, 7, 0,224, 2, 4, 0,225, 2, 0, 0,218, 2, 7, 0,226, 2,
- 4, 0,227, 2, 32, 0,228, 2, 0, 0,229, 2, 4, 0,230, 2, 4, 0, 37, 0,124, 0, 10, 0,108, 0,187, 2, 32, 0,231, 2,
- 47, 0,232, 2, 4, 0, 90, 0, 4, 0,233, 2, 7, 0,234, 2, 7, 0,235, 2, 0, 0,229, 2, 4, 0,230, 2, 4, 0, 37, 0,
-125, 0, 3, 0,108, 0,187, 2, 7, 0,236, 2, 4, 0,237, 2,126, 0, 5, 0,108, 0,187, 2, 7, 0,238, 2, 0, 0,218, 2,
- 2, 0, 19, 0, 2, 0,239, 2,127, 0, 8, 0,108, 0,187, 2, 32, 0,166, 0, 7, 0,238, 2, 7, 0,253, 0, 7, 0,106, 0,
- 0, 0,218, 2, 2, 0, 19, 0, 2, 0, 17, 0,128, 0, 21, 0,108, 0,187, 2, 32, 0,240, 2, 0, 0,218, 2, 52, 0,223, 2,
- 32, 0,228, 2, 2, 0, 19, 0, 2, 0, 37, 0, 7, 0,241, 2, 7, 0,242, 2, 7, 0,243, 2, 7, 0, 77, 2, 7, 0,244, 2,
- 7, 0,245, 2, 7, 0,246, 2, 7, 0,247, 2, 4, 0,227, 2, 4, 0,230, 2, 0, 0,229, 2, 7, 0,248, 2, 7, 0,249, 2,
- 7, 0, 43, 0,129, 0, 7, 0,108, 0,187, 2, 2, 0,250, 2, 2, 0,251, 2, 4, 0, 70, 0, 32, 0,166, 0, 7, 0,252, 2,
- 0, 0,218, 2,130, 0, 10, 0,108, 0,187, 2, 32, 0,166, 0, 0, 0,253, 2, 7, 0,254, 2, 7, 0,255, 2, 7, 0,247, 2,
- 4, 0, 0, 3, 4, 0, 1, 3, 7, 0, 2, 3, 0, 0, 20, 0,131, 0, 1, 0,108, 0,187, 2,132, 0, 7, 0,108, 0,187, 2,
- 46, 0,134, 0,133, 0, 3, 3,134, 0, 4, 3,135, 0, 5, 3,136, 0, 6, 3, 12, 0, 7, 3,137, 0, 13, 0,108, 0,187, 2,
- 84, 0, 8, 3, 84, 0, 9, 3, 84, 0, 10, 3, 84, 0, 11, 3, 84, 0, 12, 3, 84, 0, 13, 3, 81, 0, 14, 3, 4, 0, 15, 3,
- 4, 0, 16, 3, 7, 0,222, 2, 7, 0, 37, 0,138, 0, 17, 3,139, 0, 7, 0,108, 0,187, 2, 84, 0, 8, 3, 84, 0, 18, 3,
-140, 0, 19, 3,141, 0, 17, 3, 4, 0, 20, 3, 4, 0, 15, 3,142, 0, 4, 0,108, 0,187, 2, 32, 0,166, 0, 4, 0, 21, 3,
- 4, 0, 37, 0,143, 0, 2, 0, 4, 0, 22, 3, 7, 0, 39, 2,144, 0, 2, 0, 4, 0,125, 0, 4, 0, 23, 3,145, 0, 21, 0,
-108, 0,187, 2, 32, 0,166, 0, 0, 0,218, 2, 2, 0, 24, 3, 2, 0, 19, 0, 2, 0, 72, 1, 2, 0, 37, 0, 7, 0, 25, 3,
- 7, 0, 26, 3, 4, 0, 54, 0, 4, 0, 27, 3,144, 0, 28, 3,143, 0, 29, 3, 4, 0, 30, 3, 4, 0, 31, 3, 4, 0, 32, 3,
- 4, 0, 23, 3, 7, 0, 33, 3, 7, 0, 34, 3, 7, 0, 35, 3, 9, 0, 36, 3,146, 0, 8, 0,108, 0,187, 2,147, 0, 37, 3,
-140, 0, 19, 3, 4, 0, 38, 3, 4, 0, 39, 3, 4, 0, 40, 3, 2, 0, 19, 0, 2, 0, 57, 0,148, 0, 8, 0,108, 0,187, 2,
- 32, 0, 45, 0, 2, 0, 1, 1, 2, 0, 19, 0, 2, 0,208, 2, 2, 0, 57, 0, 7, 0, 41, 3, 7, 0, 42, 3,149, 0, 5, 0,
-108, 0,187, 2, 4, 0, 43, 3, 2, 0, 19, 0, 2, 0, 44, 3, 7, 0, 45, 3,150, 0, 8, 0,108, 0,187, 2, 0, 0, 46, 3,
- 0, 0, 47, 3, 0, 0,178, 2, 0, 0, 48, 3, 0, 0, 49, 3, 0, 0, 90, 0, 0, 0, 73, 2,151, 0, 3, 0,108, 0,187, 2,
-152, 0, 50, 3,136, 0, 6, 3,153, 0, 10, 0,108, 0,187, 2, 32, 0, 51, 3, 32, 0, 52, 3, 0, 0, 53, 3, 7, 0, 54, 3,
- 2, 0, 55, 3, 2, 0, 56, 3, 0, 0, 57, 3, 0, 0, 58, 3, 0, 0,193, 2,154, 0, 9, 0,108, 0,187, 2, 32, 0, 59, 3,
- 0, 0, 53, 3, 7, 0, 60, 3, 7, 0, 61, 3, 0, 0, 72, 1, 0, 0,208, 2, 0, 0, 62, 3, 0, 0, 37, 0,155, 0, 1, 0,
-108, 0,187, 2,156, 0, 8, 0,108, 0,187, 2, 0, 0,218, 2, 7, 0,125, 0, 7, 0, 63, 3, 7, 0, 64, 3, 7, 0, 65, 3,
- 4, 0, 19, 0, 0, 0, 92, 0,157, 0, 9, 0,108, 0,187, 2, 32, 0, 66, 3, 4, 0, 67, 3, 4, 0, 68, 3, 4, 0, 69, 3,
- 7, 0, 70, 3, 7, 0,109, 0, 2, 0,208, 2, 2, 0, 19, 0,158, 0, 27, 0, 27, 0, 31, 0, 2, 0, 48, 2, 2, 0, 49, 2,
- 2, 0, 71, 3, 2, 0, 19, 0, 2, 0, 72, 3, 2, 0, 73, 3, 2, 0, 74, 3, 2, 0, 70, 0, 0, 0, 75, 3, 0, 0, 76, 3,
- 0, 0, 77, 3, 0, 0, 17, 0, 4, 0, 37, 0, 7, 0, 78, 3, 7, 0, 79, 3, 7, 0, 80, 3, 7, 0, 81, 3, 7, 0, 82, 3,
- 7, 0, 83, 3, 34, 0, 84, 3, 36, 0, 80, 0, 38, 0, 69, 2, 86, 0,118, 2, 7, 0, 85, 3, 7, 0, 86, 3,158, 0, 87, 3,
-159, 0, 3, 0,159, 0, 0, 0,159, 0, 1, 0, 0, 0, 20, 0, 71, 0, 3, 0, 7, 0, 88, 3, 4, 0, 19, 0, 4, 0, 37, 0,
- 32, 0,126, 0, 27, 0, 31, 0, 39, 0, 75, 0,160, 0, 89, 3, 2, 0, 17, 0, 2, 0, 90, 3, 4, 0, 91, 3, 4, 0, 92, 3,
- 4, 0, 93, 3, 0, 0, 94, 3, 32, 0, 38, 0, 32, 0, 95, 3, 32, 0, 96, 3, 32, 0, 97, 3, 32, 0, 98, 3, 36, 0, 80, 0,
- 77, 0, 68, 2, 71, 0, 9, 2,161, 0, 99, 3,161, 0,100, 3,162, 0,101, 3, 9, 0, 2, 0,163, 0,102, 3,164, 0,103, 3,
-165, 0,104, 3, 12, 0,105, 3, 12, 0,112, 2, 12, 0, 28, 2, 12, 0,106, 3, 12, 0,107, 3, 4, 0, 72, 1, 4, 0,108, 3,
- 66, 0, 30, 2, 0, 0,109, 3, 4, 0, 32, 2, 4, 0,110, 3, 7, 0, 67, 1, 7, 0,111, 3, 7, 0,112, 3, 7, 0,174, 0,
- 7, 0,113, 3, 7, 0, 68, 1, 7, 0,114, 3, 7, 0, 18, 2, 7, 0,115, 3, 7, 0,116, 3, 7, 0,117, 3, 7, 0,118, 3,
- 7, 0,119, 3, 7, 0,120, 3, 7, 0,254, 2, 7, 0,121, 3, 7, 0,242, 0, 4, 0,122, 3, 2, 0, 19, 0, 2, 0,123, 3,
- 2, 0,124, 3, 2, 0,125, 3, 2, 0,126, 3, 2, 0,127, 3, 2, 0,128, 3, 2, 0,129, 3, 2, 0,130, 3, 2, 0,131, 3,
- 2, 0,132, 3, 2, 0,133, 3, 4, 0,134, 3, 4, 0,135, 3, 4, 0,136, 3, 4, 0,137, 3, 7, 0,138, 3, 7, 0,104, 2,
- 7, 0,139, 3, 7, 0,140, 3, 7, 0,141, 3, 7, 0,142, 3, 7, 0,143, 3, 7, 0,217, 0, 7, 0,144, 3, 7, 0,145, 3,
- 7, 0,146, 3, 7, 0,147, 3, 2, 0,148, 3, 0, 0,149, 3, 0, 0,150, 3, 0, 0,151, 3, 0, 0,152, 3, 7, 0,153, 3,
- 7, 0,154, 3, 12, 0,155, 3, 12, 0,156, 3, 12, 0,157, 3, 12, 0,158, 3, 7, 0,159, 3, 2, 0,159, 2, 2, 0,160, 3,
- 7, 0,141, 2, 4, 0,161, 3, 4, 0,162, 3,166, 0,163, 3, 2, 0,164, 3, 2, 0,249, 0, 7, 0,165, 3, 12, 0,166, 3,
- 12, 0,167, 3, 12, 0,168, 3, 12, 0,169, 3,167, 0, 64, 1,168, 0,170, 3, 67, 0,171, 3, 2, 0,172, 3, 2, 0,173, 3,
- 2, 0,174, 3, 2, 0,175, 3, 7, 0,133, 2, 2, 0,176, 3, 2, 0,177, 3,152, 0,178, 3,140, 0,179, 3,140, 0,180, 3,
- 4, 0,181, 3, 4, 0,182, 3, 4, 0,183, 3, 4, 0, 70, 0, 12, 0,184, 3, 12, 0,185, 3, 12, 0,186, 3,169, 0, 14, 0,
-169, 0, 0, 0,169, 0, 1, 0, 32, 0, 38, 0, 7, 0,254, 2, 7, 0, 69, 1, 7, 0,255, 2, 7, 0,247, 2, 0, 0, 20, 0,
- 4, 0, 0, 3, 4, 0, 1, 3, 4, 0,187, 3, 2, 0, 17, 0, 2, 0,188, 3, 7, 0, 2, 3,170, 0, 12, 0,170, 0, 0, 0,
-170, 0, 1, 0, 32, 0, 45, 0, 4, 0,189, 3, 4, 0,159, 2, 4, 0,190, 3, 4, 0, 17, 0, 4, 0,191, 3, 7, 0, 69, 1,
- 7, 0,192, 3, 7, 0,193, 3, 7, 0,157, 2,167, 0, 40, 0, 4, 0, 19, 0, 2, 0,194, 3, 2, 0,195, 3, 2, 0,247, 2,
- 2, 0,196, 3, 2, 0,197, 3, 2, 0,198, 3, 2, 0,199, 3, 2, 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, 7, 0,222, 3, 7, 0,223, 3, 7, 0,224, 3, 7, 0,225, 3, 7, 0,226, 3, 7, 0,227, 3,
- 52, 0,167, 0,171, 0,228, 3, 7, 0,229, 3, 4, 0,196, 2,172, 0, 5, 0, 67, 0,244, 1, 7, 0,230, 3, 7, 0,231, 3,
- 2, 0, 19, 0, 2, 0,232, 3,173, 0, 9, 0,173, 0, 0, 0,173, 0, 1, 0, 4, 0,233, 3, 4, 0,234, 3, 4, 0,235, 3,
- 4, 0, 19, 0, 4, 0,236, 3, 9, 0,237, 3, 9, 0,238, 3,136, 0, 19, 0,136, 0, 0, 0,136, 0, 1, 0, 4, 0, 19, 0,
- 4, 0,239, 3, 4, 0,240, 3, 4, 0,241, 3, 4, 0,242, 3, 4, 0,243, 3, 4, 0,244, 3, 4, 0,234, 3, 4, 0,159, 2,
- 4, 0, 57, 0, 0, 0,245, 3, 0, 0,246, 3, 0, 0,247, 3, 0, 0,248, 3, 12, 0,249, 3,174, 0,250, 3, 9, 0,251, 3,
-175, 0, 1, 0, 7, 0, 46, 2,166, 0, 30, 0, 4, 0, 19, 0, 7, 0,252, 3, 7, 0,253, 3, 7, 0,254, 3, 4, 0,255, 3,
- 4, 0, 0, 4, 4, 0, 1, 4, 4, 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, 7, 0, 15, 4,
- 7, 0, 16, 4, 7, 0, 17, 4, 7, 0, 18, 4, 7, 0, 19, 4, 7, 0, 20, 4, 4, 0, 21, 4, 4, 0, 22, 4, 7, 0, 23, 4,
- 7, 0,144, 3,168, 0, 54, 0, 4, 0,234, 3, 4, 0, 24, 4,176, 0, 25, 4,177, 0, 26, 4, 0, 0, 37, 0, 0, 0, 27, 4,
- 2, 0, 28, 4, 7, 0, 29, 4, 0, 0, 30, 4, 7, 0, 31, 4, 7, 0, 32, 4, 7, 0, 33, 4, 7, 0, 34, 4, 7, 0, 35, 4,
- 7, 0, 36, 4, 7, 0, 37, 4, 7, 0, 38, 4, 7, 0, 39, 4, 2, 0, 40, 4, 0, 0, 41, 4, 2, 0, 42, 4, 7, 0, 43, 4,
- 7, 0, 44, 4, 0, 0, 45, 4, 4, 0,126, 0, 4, 0, 46, 4, 4, 0, 47, 4, 2, 0, 48, 4, 2, 0, 49, 4,175, 0, 50, 4,
- 4, 0, 51, 4, 4, 0, 82, 0, 7, 0, 52, 4, 7, 0, 53, 4, 7, 0, 54, 4, 7, 0, 55, 4, 2, 0, 56, 4, 2, 0, 57, 4,
- 2, 0, 58, 4, 2, 0, 59, 4, 2, 0, 60, 4, 2, 0, 61, 4, 2, 0, 62, 4, 2, 0, 63, 4,178, 0, 64, 4, 7, 0, 65, 4,
- 7, 0, 66, 4,136, 0, 67, 4, 12, 0, 7, 3,172, 0, 68, 4, 7, 0, 69, 4, 7, 0, 70, 4, 7, 0, 71, 4, 0, 0, 72, 4,
-152, 0, 51, 0,151, 0, 73, 4, 2, 0, 17, 0, 2, 0, 74, 4, 2, 0, 75, 4, 2, 0, 76, 4, 7, 0, 77, 4, 2, 0, 78, 4,
- 2, 0, 79, 4, 7, 0, 80, 4, 2, 0, 81, 4, 2, 0, 82, 4, 7, 0, 83, 4, 7, 0, 84, 4, 7, 0, 85, 4, 7, 0, 86, 4,
- 7, 0, 87, 4, 4, 0, 88, 4, 4, 0, 89, 4, 7, 0, 90, 4, 4, 0, 91, 4, 7, 0, 92, 4, 7, 0, 93, 4, 7, 0, 94, 4,
- 80, 0, 95, 4, 80, 0, 96, 4, 80, 0, 97, 4, 0, 0, 98, 4, 7, 0, 99, 4, 7, 0,100, 4, 36, 0, 80, 0, 2, 0,101, 4,
- 0, 0,102, 4, 0, 0,103, 4, 7, 0,104, 4, 4, 0,105, 4, 7, 0,106, 4, 7, 0,107, 4, 4, 0,108, 4, 4, 0, 19, 0,
- 7, 0,109, 4, 7, 0,110, 4, 7, 0,111, 4, 84, 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, 4, 0,120, 4,179, 0, 78, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0,177, 0,
- 2, 0, 73, 1, 2, 0,107, 1, 2, 0,121, 4, 7, 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, 7, 0,165, 1, 7, 0,167, 1, 7, 0,166, 1, 7, 0,130, 4, 4, 0,131, 4,
- 7, 0,132, 4, 7, 0,133, 4, 7, 0,134, 4, 7, 0,135, 4, 7, 0,136, 4, 7, 0,137, 4, 7, 0,138, 4, 2, 0,139, 4,
- 2, 0, 72, 1, 2, 0,140, 4, 2, 0,141, 4, 2, 0,142, 4, 2, 0,143, 4, 2, 0,144, 4, 2, 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, 7, 0,152, 4, 7, 0,153, 4, 7, 0,154, 4,
- 7, 0,155, 4, 7, 0,156, 4, 7, 0,157, 4, 2, 0,158, 4, 2, 0,159, 4, 2, 0,160, 4, 2, 0,161, 4, 7, 0,162, 4,
- 7, 0,163, 4, 7, 0,164, 4, 7, 0,165, 4, 2, 0,166, 4, 2, 0,167, 4, 2, 0,168, 4, 2, 0,169, 4, 7, 0,170, 4,
- 7, 0,171, 4, 7, 0,172, 4, 7, 0,173, 4, 7, 0,174, 4, 7, 0,175, 4, 7, 0,176, 4, 2, 0,177, 4, 2, 0,178, 4,
- 2, 0,179, 4, 2, 0,180, 4, 2, 0,181, 4, 2, 0, 19, 0, 7, 0,182, 4, 7, 0,183, 4, 36, 0, 80, 0, 51, 0,137, 1,
- 2, 0,138, 1, 2, 0,139, 1, 30, 0,153, 0,180, 0, 8, 0,180, 0, 0, 0,180, 0, 1, 0, 4, 0,122, 3, 4, 0,184, 4,
- 4, 0, 19, 0, 2, 0,185, 4, 2, 0,186, 4, 32, 0,166, 0,181, 0, 13, 0, 9, 0,187, 4, 9, 0,188, 4, 4, 0,189, 4,
- 4, 0,190, 4, 4, 0,191, 4, 4, 0,192, 4, 4, 0,193, 4, 4, 0,194, 4, 4, 0,195, 4, 4, 0,196, 4, 4, 0,197, 4,
- 4, 0, 37, 0, 0, 0,198, 4,182, 0, 5, 0, 9, 0,199, 4, 9, 0,200, 4, 4, 0,201, 4, 4, 0, 70, 0, 0, 0,202, 4,
-183, 0, 10, 0, 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,
- 4, 0,210, 4, 4, 0,211, 4, 4, 0,212, 4,184, 0, 15, 0, 4, 0, 17, 0, 4, 0,205, 4, 4, 0,213, 4, 4, 0,214, 4,
- 4, 0,215, 4, 4, 0,216, 4, 7, 0,217, 4, 4, 0,218, 4, 4, 0, 90, 0, 4, 0,219, 4, 4, 0,220, 4, 4, 0,221, 4,
- 4, 0,222, 4, 4, 0,223, 4, 26, 0, 30, 0,185, 0, 7, 0, 4, 0,224, 4, 7, 0,225, 4, 7, 0,226, 4, 7, 0,227, 4,
- 4, 0,228, 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,229, 4,
- 67, 0,230, 4, 4, 0,122, 3, 4, 0,231, 4, 4, 0,232, 4, 4, 0, 37, 0, 4, 0,233, 4, 4, 0,234, 4,187, 0,140, 0,
-181, 0,235, 4,182, 0,236, 4,183, 0,237, 4,184, 0,238, 4, 4, 0, 20, 3, 4, 0,126, 0, 4, 0, 46, 4, 4, 0,239, 4,
- 4, 0,240, 4, 4, 0,241, 4, 4, 0,242, 4, 2, 0, 19, 0, 2, 0,243, 4, 7, 0,104, 2, 7, 0,244, 4, 7, 0,245, 4,
- 7, 0,246, 4, 7, 0,247, 4, 7, 0,248, 4, 2, 0,249, 4, 2, 0,250, 4, 2, 0,251, 4, 2, 0,252, 4, 2, 0,248, 0,
- 2, 0,253, 4, 2, 0,254, 4, 2, 0,255, 4, 2, 0, 0, 5, 2, 0, 1, 5, 2, 0, 94, 1, 2, 0,106, 0, 2, 0, 2, 5,
- 2, 0, 3, 5, 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, 95, 1, 2, 0, 11, 5, 2, 0, 12, 5, 2, 0, 13, 5, 2, 0, 14, 5, 4, 0, 15, 5, 4, 0, 72, 1, 4, 0, 16, 5,
- 2, 0, 17, 5, 2, 0, 18, 5, 2, 0, 19, 5, 2, 0,124, 1, 2, 0, 20, 5, 2, 0, 21, 5, 2, 0, 22, 5, 2, 0, 23, 5,
- 24, 0, 24, 5, 24, 0, 25, 5, 23, 0, 26, 5, 12, 0, 27, 5, 2, 0, 28, 5, 2, 0, 29, 5, 7, 0, 30, 5, 7, 0, 31, 5,
- 7, 0, 32, 5, 7, 0, 33, 5, 4, 0, 34, 5, 7, 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, 7, 0, 45, 5, 7, 0, 46, 5, 7, 0, 47, 5,
- 2, 0, 48, 5, 2, 0, 49, 5, 2, 0, 50, 5, 2, 0, 51, 5, 2, 0, 52, 5, 2, 0, 53, 5, 2, 0, 54, 5, 2, 0, 55, 5,
- 2, 0, 56, 5, 2, 0, 57, 5, 4, 0, 58, 5, 4, 0, 59, 5, 4, 0, 60, 5, 4, 0, 61, 5, 4, 0, 62, 5, 7, 0, 63, 5,
- 4, 0, 64, 5, 4, 0, 65, 5, 4, 0, 66, 5, 4, 0, 67, 5, 7, 0, 68, 5, 7, 0, 69, 5, 7, 0, 70, 5, 7, 0, 71, 5,
- 7, 0, 72, 5, 7, 0, 73, 5, 7, 0, 74, 5, 7, 0, 75, 5, 7, 0, 76, 5, 0, 0, 77, 5, 0, 0, 78, 5, 4, 0, 79, 5,
- 2, 0, 80, 5, 2, 0,241, 1, 0, 0, 81, 5, 7, 0, 82, 5, 7, 0, 83, 5, 0, 0, 84, 5, 0, 0, 85, 5, 0, 0, 86, 5,
- 0, 0, 87, 5, 4, 0, 88, 5, 2, 0, 89, 5, 2, 0, 90, 5, 7, 0, 91, 5, 7, 0, 92, 5, 2, 0, 93, 5, 2, 0, 94, 5,
- 7, 0, 95, 5, 2, 0, 96, 5, 2, 0, 97, 5, 4, 0, 98, 5, 2, 0, 99, 5, 2, 0,100, 5, 2, 0,101, 5, 2, 0,102, 5,
- 7, 0,103, 5, 7, 0, 70, 0, 42, 0,104, 5, 0, 0,105, 5,188, 0, 9, 0,188, 0, 0, 0,188, 0, 1, 0, 0, 0, 20, 0,
- 2, 0,106, 5, 2, 0,107, 5, 2, 0,108, 5, 2, 0, 43, 0, 7, 0,109, 5, 7, 0, 70, 0,189, 0, 7, 0, 2, 0,213, 2,
- 2, 0, 72, 1, 2, 0,109, 0, 2, 0,110, 5, 7, 0,111, 5, 7, 0, 70, 0, 42, 0,112, 5,190, 0, 5, 0, 7, 0,113, 5,
- 0, 0, 17, 0, 0, 0, 43, 0, 0, 0, 70, 0, 0, 0,241, 1,191, 0, 28, 0, 7, 0,137, 4, 7, 0,138, 4, 2, 0, 72, 1,
- 2, 0, 19, 0, 2, 0,114, 5, 2, 0,139, 1, 2, 0,140, 4, 2, 0,141, 4, 2, 0,142, 4, 2, 0,143, 4, 2, 0,144, 4,
- 2, 0,145, 4,190, 0,115, 5, 2, 0,249, 4, 2, 0,250, 4, 2, 0,251, 4, 2, 0,252, 4, 2, 0,248, 0, 2, 0,253, 4,
- 2, 0,116, 5, 2, 0,254, 4,189, 0,117, 5, 2, 0,118, 5, 2, 0, 0, 5, 2, 0, 3, 5, 2, 0, 4, 5, 7, 0,119, 5,
- 7, 0, 43, 0,192, 0, 6, 0,192, 0, 0, 0,192, 0, 1, 0, 4, 0,233, 3, 0, 0,245, 3, 4, 0, 19, 0, 32, 0,120, 5,
-193, 0, 6, 0,194, 0,121, 5, 4, 0,122, 5, 4, 0,123, 5, 9, 0,124, 5, 0, 0,125, 5, 4, 0, 90, 0,195, 0, 8, 0,
-193, 0,126, 5, 2, 0, 19, 0, 2, 0, 37, 0, 2, 0,127, 5, 2, 0,128, 5, 2, 0,129, 5, 4, 0, 43, 0, 9, 0,130, 5,
-196, 0, 6, 0, 2, 0,106, 0, 2, 0,239, 3, 2, 0,131, 5, 2, 0,207, 2, 4, 0, 19, 0, 7, 0,224, 2,197, 0, 14, 0,
- 2, 0, 19, 0, 2, 0,132, 5, 2, 0,133, 5, 2, 0,134, 5,196, 0,135, 5, 9, 0,130, 5, 7, 0,136, 5, 7, 0, 57, 0,
- 4, 0,137, 5, 4, 0,138, 5, 4, 0,139, 5, 4, 0,140, 5, 46, 0,134, 0, 32, 0,166, 0,198, 0, 4, 0,198, 0, 0, 0,
-198, 0, 1, 0, 0, 0,141, 5, 7, 0,142, 5,199, 0, 6, 0,193, 0,126, 5, 7, 0,143, 5, 4, 0, 90, 0, 0, 0,144, 5,
- 0, 0,145, 5, 0, 0,193, 2,200, 0, 7, 0,193, 0,126, 5, 2, 0, 19, 0, 2, 0, 37, 0, 4, 0, 36, 0, 4, 0,146, 5,
- 86, 0,147, 5, 9, 0,130, 5,201, 0, 74, 0,200, 0,148, 5,200, 0,149, 5,199, 0, 89, 3, 7, 0,150, 5, 2, 0,151, 5,
- 2, 0,152, 5, 7, 0,153, 5, 7, 0,154, 5, 2, 0,239, 3, 2, 0,155, 5, 7, 0,156, 5, 7, 0,157, 5, 7, 0,158, 5,
- 2, 0,159, 5, 2, 0,137, 5, 2, 0,160, 5, 2, 0,161, 5, 2, 0,162, 5, 2, 0,163, 5, 7, 0,164, 5, 7, 0,165, 5,
- 7, 0,166, 5, 2, 0,167, 5, 2, 0,168, 5, 2, 0,169, 5, 2, 0,170, 5, 2, 0,171, 5, 2, 0,172, 5, 2, 0,173, 5,
-195, 0,174, 5,197, 0,175, 5, 7, 0,176, 5, 7, 0,177, 5, 7, 0,178, 5, 2, 0,179, 5, 2, 0,180, 5, 0, 0,181, 5,
- 0, 0,182, 5, 0, 0,183, 5, 0, 0,184, 5, 0, 0,185, 5, 0, 0,186, 5, 2, 0,187, 5, 7, 0,188, 5, 7, 0,189, 5,
- 7, 0,190, 5, 7, 0,191, 5, 7, 0,192, 5, 7, 0,193, 5, 7, 0,194, 5, 7, 0,195, 5, 7, 0,196, 5, 7, 0,197, 5,
- 2, 0,198, 5, 0, 0,199, 5, 0, 0,200, 5, 0, 0,201, 5, 0, 0,202, 5, 32, 0,203, 5, 0, 0,204, 5, 0, 0,205, 5,
- 0, 0,206, 5, 0, 0,207, 5, 0, 0,208, 5, 0, 0,209, 5, 0, 0,210, 5, 0, 0,211, 5, 2, 0,212, 5, 2, 0,213, 5,
- 2, 0,214, 5, 2, 0,215, 5, 2, 0,216, 5, 4, 0,217, 5, 4, 0,218, 5,202, 0, 8, 0, 4, 0,219, 5, 4, 0,220, 5,
- 4, 0,221, 5, 4, 0,222, 5, 4, 0,223, 5, 4, 0,224, 5, 4, 0, 54, 0, 4, 0,128, 2,203, 0, 3, 0, 7, 0,225, 5,
- 2, 0,226, 5, 2, 0, 19, 0,204, 0, 2, 0, 7, 0,227, 5, 4, 0, 19, 0, 46, 0, 40, 0, 27, 0, 31, 0, 39, 0, 75, 0,
- 32, 0,120, 5,179, 0,228, 5, 46, 0,229, 5, 47, 0,240, 0, 12, 0,230, 5,180, 0,231, 5, 32, 0,232, 5, 7, 0,233, 5,
- 7, 0,234, 5, 7, 0,235, 5, 7, 0,236, 5, 4, 0,122, 3, 2, 0, 19, 0, 2, 0, 66, 1, 60, 0, 61, 1,205, 0,237, 5,
-201, 0,238, 5,206, 0,239, 5,187, 0,184, 0,185, 0,240, 5, 12, 0,100, 0, 12, 0,241, 5, 9, 0,242, 5, 9, 0,243, 5,
- 9, 0,244, 5,207, 0,245, 5, 2, 0,246, 5, 2, 0,247, 5, 2, 0,249, 0, 2, 0,248, 5, 4, 0,249, 5, 4, 0,250, 5,
- 12, 0,251, 5,190, 0,115, 5,191, 0,252, 5,203, 0,253, 5,163, 0,102, 3,204, 0,254, 5,208, 0, 11, 0,208, 0, 0, 0,
-208, 0, 1, 0, 47, 0,240, 0, 45, 0, 60, 1, 7, 0, 92, 2, 7, 0, 93, 2, 7, 0,106, 0, 7, 0,255, 5, 2, 0, 0, 6,
- 2, 0, 19, 0, 7, 0, 70, 0,209, 0, 39, 0, 7, 0, 1, 6, 7, 0, 2, 6, 7, 0, 3, 6, 7, 0, 4, 6, 7, 0, 5, 6,
- 7, 0, 6, 6, 7, 0, 7, 6, 7, 0, 8, 6, 7, 0, 9, 6, 7, 0, 79, 1, 7, 0, 10, 6, 7, 0, 11, 6, 7, 0, 12, 6,
- 7, 0, 13, 6, 7, 0,173, 0, 2, 0, 14, 6, 2, 0, 15, 6, 2, 0, 16, 6, 2, 0, 37, 0, 2, 0, 17, 6, 2, 0, 18, 6,
- 2, 0, 19, 6, 2, 0, 0, 6, 7, 0, 20, 6, 7, 0, 21, 6, 71, 0, 22, 6,163, 0,102, 3,209, 0, 23, 6,210, 0, 24, 6,
-211, 0, 25, 6,212, 0, 26, 6,213, 0, 27, 6,214, 0, 28, 6, 7, 0, 29, 6, 2, 0, 30, 6, 2, 0, 31, 6, 7, 0, 32, 6,
- 7, 0, 33, 6, 7, 0, 34, 6,215, 0, 55, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 35, 6, 4, 0, 36, 6, 7, 0, 37, 6,
- 2, 0, 38, 6, 7, 0, 9, 6, 7, 0, 79, 1, 7, 0, 43, 0, 4, 0, 39, 6, 2, 0, 19, 6, 2, 0, 0, 6, 32, 0,120, 5,
- 32, 0, 40, 6, 12, 0, 41, 6,208, 0, 42, 6,215, 0, 23, 6, 0, 0, 43, 6, 4, 0,122, 3, 4, 0, 44, 6, 2, 0, 45, 6,
- 2, 0, 70, 0, 2, 0, 46, 6, 2, 0, 47, 6, 2, 0,241, 1, 2, 0, 19, 0, 2, 0, 31, 2, 2, 0, 48, 6, 7, 0,112, 0,
- 7, 0, 49, 6, 7, 0, 32, 6, 7, 0, 34, 6, 7, 0, 50, 6, 7, 0, 51, 6, 7, 0,173, 0, 7, 0,233, 5, 2, 0, 52, 6,
- 2, 0,124, 1, 2, 0, 53, 6, 2, 0, 54, 6, 2, 0, 55, 6, 2, 0, 56, 6, 2, 0, 57, 6, 2, 0, 58, 6, 2, 0, 59, 6,
- 2, 0, 16, 6, 4, 0, 60, 6, 12, 0, 61, 6, 2, 0, 62, 6, 2, 0,142, 2, 2, 0, 63, 6, 0, 0, 64, 6, 0, 0, 65, 6,
- 9, 0, 66, 6,163, 0,102, 3,217, 0, 25, 0, 24, 0, 36, 0, 24, 0, 64, 0, 23, 0, 67, 6, 23, 0, 68, 6, 23, 0, 69, 6,
- 7, 0, 70, 6, 7, 0, 71, 6, 7, 0, 72, 6, 7, 0, 73, 6, 2, 0, 74, 6, 2, 0, 75, 6, 2, 0, 76, 6, 2, 0, 77, 6,
- 2, 0, 78, 6, 2, 0, 19, 0, 2, 0, 79, 6, 2, 0, 80, 6, 2, 0, 81, 6, 2, 0, 82, 6, 2, 0, 83, 6, 2, 0, 47, 6,
- 7, 0, 84, 6, 7, 0, 85, 6, 4, 0, 86, 6, 4, 0, 87, 6,216, 0, 6, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 35, 6,
- 4, 0, 36, 6, 7, 0, 37, 6, 2, 0, 38, 6,218, 0, 8, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 35, 6, 4, 0, 36, 6,
- 7, 0, 37, 6, 2, 0, 38, 6,219, 0, 88, 6, 46, 0,134, 0,220, 0, 14, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 35, 6,
- 4, 0, 36, 6, 7, 0, 37, 6, 2, 0, 38, 6,217, 0, 89, 6,221, 0, 90, 6, 12, 0, 91, 6, 2, 0, 72, 1, 2, 0, 92, 6,
- 4, 0, 19, 0, 7, 0, 93, 6, 4, 0, 47, 6,222, 0, 20, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 35, 6, 4, 0, 36, 6,
- 7, 0, 37, 6, 2, 0, 38, 6,210, 0, 24, 6,217, 0, 89, 6, 2, 0, 94, 6, 2, 0, 95, 6, 2, 0, 96, 6, 2, 0, 97, 6,
- 2, 0, 79, 6, 2, 0, 98, 6, 0, 0, 19, 0, 0, 0,139, 1, 9, 0, 68, 2, 4, 0, 99, 6, 4, 0,100, 6, 27, 0,101, 6,
-223, 0, 18, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 35, 6, 4, 0, 36, 6, 7, 0, 37, 6, 2, 0, 38, 6,217, 0, 89, 6,
- 7, 0, 92, 2, 7, 0, 93, 2, 2, 0, 94, 6, 2, 0,102, 6, 2, 0,103, 6, 2, 0,104, 6, 4, 0, 19, 0, 7, 0,105, 6,
- 4, 0, 0, 6, 4, 0, 37, 0,163, 0,102, 3,224, 0, 15, 0, 0, 0,106, 6, 0, 0,107, 6, 0, 0,108, 6, 0, 0,109, 6,
- 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,110, 6, 2, 0,111, 6, 2, 0,184, 1, 2, 0,112, 6, 4, 0,113, 6, 4, 0,114, 6,
- 2, 0,115, 6, 2, 0, 37, 0, 0, 0,116, 6,225, 0, 16, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 35, 6, 4, 0, 36, 6,
- 4, 0, 37, 0,224, 0,117, 6,226, 0,118, 6, 12, 0,119, 6, 12, 0,120, 6,227, 0,121, 6,214, 0,122, 6,228, 0,123, 6,
- 2, 0,124, 6, 2, 0,125, 6, 2, 0,126, 6, 2, 0, 70, 0,229, 0, 17, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 35, 6,
- 4, 0, 36, 6, 7, 0, 37, 6, 2, 0, 38, 6,217, 0, 89, 6, 12, 0,127, 6,230, 0,128, 6, 0, 0,129, 6,231, 0,130, 6,
- 4, 0,131, 6, 4, 0,132, 6, 2, 0, 19, 0, 2, 0,133, 6, 2, 0,134, 6, 2, 0, 37, 0,232, 0, 31, 0,216, 0, 0, 0,
-216, 0, 1, 0, 12, 0, 35, 6, 4, 0, 36, 6, 7, 0, 37, 6, 2, 0, 38, 6, 47, 0,232, 2, 45, 0, 60, 1, 63, 0,135, 6,
- 2, 0,133, 0, 2, 0,136, 6, 2, 0, 70, 0, 2, 0,137, 6, 4, 0, 19, 0, 2, 0,138, 6, 2, 0,139, 6, 2, 0,140, 6,
- 2, 0,241, 1, 0, 0,141, 6, 0, 0,142, 6, 0, 0,143, 6, 0, 0, 47, 6, 7, 0, 92, 2, 7, 0, 93, 2, 7, 0,105, 6,
- 7, 0,124, 1, 7, 0,144, 6, 7, 0,145, 6,163, 0,102, 3,233, 0,146, 6,233, 0,147, 6,234, 0, 11, 0,216, 0, 0, 0,
-216, 0, 1, 0, 12, 0, 35, 6, 4, 0, 36, 6, 7, 0, 37, 6, 2, 0, 38, 6, 2, 0, 92, 6, 2, 0, 19, 0, 4, 0, 37, 0,
-221, 0, 90, 6,217, 0, 89, 6,235, 0, 27, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 35, 6, 4, 0, 36, 6, 7, 0, 37, 6,
- 2, 0, 38, 6, 42, 0,148, 6, 4, 0,149, 6, 4, 0,150, 6, 2, 0, 90, 0, 2, 0,133, 0, 2, 0,151, 6, 0, 0,152, 6,
- 0, 0,153, 6, 4, 0,154, 6, 4, 0,155, 6, 4, 0,156, 6, 4, 0,157, 6, 2, 0,158, 6, 2, 0,159, 6, 7, 0,160, 6,
- 23, 0,161, 6, 23, 0,162, 6, 4, 0,163, 6, 4, 0,164, 6, 0, 0,165, 6, 0, 0,166, 6,236, 0, 10, 0, 27, 0, 31, 0,
- 9, 0,167, 6, 9, 0,168, 6, 9, 0,169, 6, 9, 0,170, 6, 9, 0,171, 6, 4, 0, 90, 0, 4, 0,172, 6, 0, 0,173, 6,
- 0, 0,174, 6,237, 0, 10, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 35, 6, 4, 0, 36, 6, 7, 0, 37, 6,236, 0,175, 6,
- 2, 0, 90, 0, 2, 0,133, 0, 4, 0, 43, 0, 9, 0,176, 6,238, 0, 8, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 35, 6,
- 4, 0, 36, 6, 7, 0, 37, 6,217, 0, 89, 6, 4, 0, 19, 0, 4, 0,177, 6,239, 0, 23, 0,216, 0, 0, 0,216, 0, 1, 0,
- 12, 0, 35, 6, 4, 0, 36, 6, 7, 0, 37, 6, 2, 0, 38, 6,217, 0, 89, 6, 27, 0,178, 6, 27, 0, 81, 0, 2, 0, 19, 0,
- 2, 0,133, 0, 7, 0,179, 6, 9, 0,180, 6, 7, 0, 92, 2, 7, 0, 93, 2, 7, 0,181, 6, 7, 0,182, 6, 60, 0, 61, 1,
- 60, 0,183, 6, 4, 0,184, 6, 2, 0,185, 6, 2, 0, 37, 0,163, 0,102, 3,240, 0, 10, 0,216, 0, 0, 0,216, 0, 1, 0,
- 12, 0, 35, 6, 4, 0, 36, 6, 7, 0, 37, 6, 2, 0, 38, 6, 2, 0, 19, 0, 2, 0,131, 3, 4, 0, 37, 0,163, 0,102, 3,
-241, 0, 42, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 35, 6, 4, 0, 36, 6, 7, 0, 37, 6, 2, 0, 38, 6,217, 0, 89, 6,
-226, 0,118, 6, 0, 0,106, 6, 0, 0,107, 6, 0, 0,108, 6, 2, 0, 17, 0, 2, 0,186, 6, 2, 0, 19, 0, 2, 0,110, 6,
- 9, 0,180, 6, 4, 0,113, 6, 4, 0,187, 6, 4, 0,188, 6, 4, 0,114, 6, 23, 0,189, 6, 23, 0,190, 6, 7, 0,191, 6,
- 7, 0,192, 6, 7, 0,193, 6, 7, 0,179, 6, 2, 0,194, 6, 2, 0,239, 0, 2, 0,184, 1, 2, 0,112, 6, 2, 0, 37, 0,
- 2, 0, 43, 0, 2, 0,195, 6, 2, 0,196, 6, 9, 0,197, 6, 9, 0,198, 6, 9, 0,199, 6, 9, 0,200, 6, 9, 0,201, 6,
- 2, 0,202, 6, 0, 0,203, 6, 57, 0,204, 6,242, 0, 7, 0,242, 0, 0, 0,242, 0, 1, 0, 4, 0,205, 6, 4, 0, 23, 0,
- 0, 0, 84, 0, 4, 0,206, 6, 4, 0, 17, 0,243, 0, 16, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 35, 6, 4, 0, 36, 6,
- 7, 0, 37, 6, 2, 0, 38, 6, 4, 0, 17, 0, 4, 0,207, 6, 4, 0, 19, 0, 4, 0,151, 6, 12, 0,208, 6, 12, 0,209, 6,
- 0, 0,210, 6, 0, 0,211, 6, 4, 0,212, 6, 4, 0,213, 6,244, 0, 5, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 35, 6,
- 4, 0, 36, 6, 4, 0, 37, 0,245, 0, 7, 0,245, 0, 0, 0,245, 0, 1, 0, 0, 0,214, 6, 2, 0,215, 6, 2, 0,216, 6,
- 2, 0,217, 6, 2, 0, 37, 0,246, 0, 12, 0, 2, 0,216, 6, 2, 0,218, 6, 2, 0,219, 6, 0, 0,193, 2, 2, 0,220, 6,
- 2, 0,221, 6, 2, 0,222, 6, 2, 0,223, 6, 2, 0,224, 6, 2, 0, 79, 6, 7, 0,225, 6, 7, 0,226, 6,247, 0, 18, 0,
-247, 0, 0, 0,247, 0, 1, 0, 0, 0,245, 3,246, 0,227, 6,246, 0,228, 6,246, 0,229, 6,246, 0,230, 6, 7, 0,231, 6,
- 2, 0,232, 6, 2, 0,233, 6, 2, 0,234, 6, 2, 0,235, 6, 2, 0,236, 6, 2, 0,237, 6, 2, 0,238, 6, 2, 0,239, 6,
- 2, 0,240, 6, 2, 0,241, 6,248, 0, 10, 0, 0, 0,242, 6, 0, 0,243, 6, 0, 0,244, 6, 0, 0,245, 6, 0, 0,246, 6,
- 0, 0,247, 6, 2, 0,248, 6, 2, 0,249, 6, 2, 0,250, 6, 2, 0, 37, 0,249, 0, 8, 0, 0, 0,251, 6, 0, 0,252, 6,
- 0, 0,253, 6, 0, 0,254, 6, 0, 0,255, 6, 0, 0, 0, 7, 7, 0,255, 5, 7, 0, 37, 0,250, 0, 17, 0,248, 0, 1, 7,
-248, 0, 2, 7,248, 0, 3, 7,248, 0, 4, 7,248, 0, 5, 7,248, 0, 6, 7,248, 0, 7, 7,248, 0, 8, 7,248, 0, 9, 7,
-248, 0, 10, 7,248, 0, 11, 7,248, 0, 12, 7,248, 0, 13, 7,248, 0, 14, 7,248, 0, 15, 7,249, 0, 16, 7, 0, 0, 17, 7,
-251, 0, 90, 0, 0, 0, 18, 7, 0, 0, 19, 7, 0, 0,246, 6, 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, 0, 0, 90, 7, 0, 0, 91, 7, 0, 0, 92, 7, 0, 0, 93, 7, 0, 0, 94, 7, 0, 0, 95, 7,
- 0, 0, 96, 7, 0, 0, 97, 7, 0, 0, 98, 7, 0, 0, 99, 7, 0, 0,100, 7, 0, 0,101, 7, 0, 0,102, 7, 0, 0,103, 7,
- 0, 0,104, 7, 0, 0,105, 7, 0, 0,106, 7,252, 0, 5, 0, 0, 0,107, 7, 0, 0, 42, 7, 0, 0, 44, 7, 2, 0, 19, 0,
- 2, 0, 37, 0,253, 0, 25, 0,253, 0, 0, 0,253, 0, 1, 0, 0, 0, 20, 0,250, 0,108, 7,251, 0,109, 7,251, 0,110, 7,
-251, 0,111, 7,251, 0,112, 7,251, 0,113, 7,251, 0,114, 7,251, 0,115, 7,251, 0,116, 7,251, 0,117, 7,251, 0,118, 7,
-251, 0,119, 7,251, 0,120, 7,251, 0,121, 7,251, 0,122, 7,251, 0,123, 7,251, 0,124, 7,251, 0,125, 7,251, 0,126, 7,
-252, 0,127, 7, 4, 0,128, 7, 4, 0, 37, 0,254, 0, 3, 0,254, 0, 0, 0,254, 0, 1, 0, 0, 0,129, 7,255, 0, 5, 0,
- 4, 0, 19, 0, 4, 0, 37, 0, 7, 0,141, 2, 7, 0,130, 7, 7, 0, 46, 2, 0, 1, 82, 0, 4, 0, 19, 0, 4, 0,131, 7,
- 4, 0,132, 7, 0, 0,133, 7, 0, 0,134, 7, 0, 0,135, 7, 0, 0,136, 7, 0, 0,137, 7, 0, 0,138, 7, 0, 0,139, 7,
- 0, 0,140, 7, 0, 0,141, 7, 0, 0,142, 7, 4, 0,143, 7, 2, 0,144, 7, 2, 0,145, 7, 2, 0,146, 7, 2, 0,147, 7,
- 4, 0,148, 7, 4, 0,149, 7, 4, 0,150, 7, 4, 0,151, 7, 2, 0,152, 7, 2, 0,153, 7, 4, 0,154, 7, 4, 0,155, 7,
- 4, 0,156, 7, 4, 0,157, 7, 4, 0,158, 7, 4, 0,208, 6, 4, 0,159, 7, 2, 0,160, 7, 2, 0,161, 7, 2, 0,162, 7,
- 2, 0,163, 7, 12, 0,164, 7, 12, 0,165, 7, 12, 0,166, 7, 12, 0,167, 7, 12, 0,168, 7, 0, 0,169, 7, 2, 0,170, 7,
- 2, 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,255, 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,
- 4, 0,187, 7, 4, 0,188, 7, 2, 0,189, 7, 2, 0,190, 7, 2, 0,191, 7, 2, 0,192, 7, 2, 0,193, 7, 2, 0,194, 7,
- 2, 0,195, 7, 2, 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, 70, 0,
- 2, 0,202, 7, 2, 0,203, 7, 0, 0,204, 7, 0, 0,205, 7, 7, 0,206, 7, 2, 0,179, 5, 2, 0,180, 5, 55, 0,207, 7,
-219, 0, 21, 0, 27, 0, 31, 0, 12, 0,208, 7, 12, 0,209, 7, 12, 0,210, 7, 12, 0, 35, 6, 46, 0,134, 0, 46, 0,211, 7,
- 2, 0,212, 7, 2, 0,213, 7, 2, 0,214, 7, 2, 0,215, 7, 2, 0,216, 7, 2, 0,217, 7, 2, 0,218, 7, 2, 0,219, 7,
- 2, 0,220, 7, 2, 0,221, 7, 4, 0, 70, 0,214, 0,222, 7, 9, 0,223, 7, 2, 0,224, 7, 1, 1, 5, 0, 1, 1, 0, 0,
- 1, 1, 1, 0, 1, 1,225, 7, 13, 0,226, 7, 4, 0, 19, 0, 2, 1, 7, 0, 2, 1, 0, 0, 2, 1, 1, 0, 1, 1,227, 7,
- 1, 1,228, 7, 2, 0, 25, 5, 2, 0, 19, 0, 4, 0, 37, 0, 3, 1, 25, 0, 3, 1, 0, 0, 3, 1, 1, 0, 4, 1,229, 7,
- 5, 1,123, 6, 0, 0,230, 7, 0, 0,231, 7, 0, 0,232, 7, 2, 0,233, 7, 2, 0,234, 7, 2, 0,235, 7, 2, 0,236, 7,
- 2, 0,237, 7, 2, 0, 37, 0, 2, 0, 19, 0, 2, 0,238, 7, 2, 0,239, 7, 2, 0,240, 7, 4, 0,241, 7, 3, 1,242, 7,
- 9, 0,243, 7, 4, 0,244, 7, 4, 0,245, 7, 4, 0,246, 7, 4, 0,247, 7, 0, 0,248, 7, 6, 1, 22, 0, 6, 1, 0, 0,
- 6, 1, 1, 0, 1, 1,227, 7, 1, 1,228, 7, 1, 1,249, 7, 1, 1,250, 7,219, 0,251, 7, 23, 0, 52, 0, 0, 0, 36, 6,
- 0, 0,252, 7, 2, 0, 80, 6, 2, 0, 81, 6, 2, 0,253, 7, 2, 0, 37, 0, 2, 0,215, 7, 2, 0,206, 6, 2, 0, 19, 0,
- 7, 1,229, 7, 12, 0,254, 7, 12, 0, 35, 6, 12, 0,255, 7, 12, 0, 0, 8, 8, 1, 22, 0, 8, 1, 0, 0, 8, 1, 1, 0,
-217, 0, 89, 6, 23, 0, 1, 8, 23, 0, 2, 8, 2, 0, 80, 6, 2, 0, 81, 6, 2, 0, 3, 8, 2, 0, 4, 8, 2, 0, 5, 8,
- 2, 0, 19, 0, 7, 0, 88, 2, 2, 0,235, 7, 2, 0,236, 7, 2, 0,214, 7, 2, 0,219, 7, 9, 1,229, 7, 12, 0, 6, 8,
- 12, 0, 7, 8, 12, 0,255, 7, 0, 0, 8, 8, 9, 0, 9, 8, 10, 1, 12, 0, 0, 0, 10, 8, 2, 0, 11, 8, 2, 0, 12, 8,
- 2, 0, 13, 8, 2, 0, 14, 8, 2, 0, 12, 5, 2, 0, 7, 5,219, 0, 15, 8, 46, 0, 16, 8, 4, 0, 17, 8, 4, 0, 18, 8,
- 0, 0, 35, 0, 11, 1, 1, 0, 0, 0, 19, 8, 12, 1, 8, 0, 57, 0, 20, 8, 57, 0, 21, 8, 12, 1, 22, 8, 12, 1, 23, 8,
- 12, 1, 24, 8, 2, 0,129, 0, 2, 0, 19, 0, 4, 0, 25, 8, 13, 1, 4, 0, 4, 0,149, 6, 4, 0, 26, 8, 4, 0,154, 6,
- 4, 0, 27, 8, 14, 1, 2, 0, 4, 0, 28, 8, 4, 0, 29, 8, 15, 1, 7, 0, 7, 0, 30, 8, 7, 0, 31, 8, 7, 0, 32, 8,
- 4, 0, 19, 0, 4, 0, 37, 0, 7, 0,132, 4, 7, 0, 33, 8, 16, 1, 6, 0, 0, 0, 34, 8, 0, 0,108, 6, 49, 0,137, 0,
- 2, 0,106, 0, 2, 0, 11, 5, 4, 0, 37, 0, 17, 1, 21, 0, 17, 1, 0, 0, 17, 1, 1, 0, 4, 0, 57, 0, 4, 0, 23, 0,
- 4, 0, 28, 0, 4, 0, 35, 8, 4, 0, 36, 8, 4, 0, 37, 8, 11, 1, 38, 8, 0, 0, 34, 8, 4, 0, 39, 8, 4, 0, 40, 8,
- 16, 1, 96, 3, 13, 1, 41, 8, 14, 1, 42, 8, 15, 1, 43, 8, 12, 1, 44, 8, 12, 1, 45, 8, 12, 1, 46, 8, 57, 0, 47, 8,
- 57, 0, 48, 8, 18, 1, 12, 0, 0, 0, 8, 2, 9, 0,225, 0, 0, 0,226, 0, 4, 0,229, 0, 4, 0,237, 0, 9, 0,230, 0,
- 7, 0,232, 0, 7, 0,233, 0, 9, 0, 49, 8, 9, 0, 50, 8, 9, 0,234, 0, 9, 0,236, 0, 19, 1, 46, 0, 19, 1, 0, 0,
- 19, 1, 1, 0, 9, 0, 51, 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, 52, 8, 4, 0, 53, 8, 4, 0, 36, 8, 4, 0, 37, 8, 4, 0, 54, 8, 4, 0,248, 0, 4, 0, 55, 8, 4, 0, 56, 8,
- 7, 0, 57, 8, 7, 0, 58, 8, 4, 0,126, 0, 4, 0, 59, 8, 17, 1, 60, 8, 36, 0, 80, 0, 46, 0,134, 0, 32, 0, 61, 8,
- 49, 0,137, 0, 7, 0, 62, 8, 7, 0, 63, 8, 18, 1, 62, 1, 19, 1, 64, 8, 19, 1, 65, 8, 19, 1, 66, 8, 12, 0, 67, 8,
- 20, 1, 68, 8, 9, 0, 69, 8, 7, 0,254, 3, 7, 0, 37, 0, 7, 0, 70, 8, 7, 0, 71, 8, 4, 0, 72, 8, 7, 0, 73, 8,
- 9, 0, 74, 8, 4, 0, 75, 8, 4, 0, 76, 8, 4, 0, 77, 8, 7, 0, 78, 8, 21, 1, 4, 0, 21, 1, 0, 0, 21, 1, 1, 0,
- 12, 0, 79, 8, 19, 1, 80, 8,205, 0, 6, 0, 12, 0, 81, 8, 12, 0, 67, 8, 12, 0, 82, 8, 19, 1, 83, 8, 0, 0, 84, 8,
- 0, 0, 85, 8, 22, 1, 4, 0, 7, 0, 86, 8, 7, 0,109, 0, 2, 0, 87, 8, 2, 0, 88, 8, 23, 1, 6, 0, 7, 0, 89, 8,
- 7, 0, 90, 8, 7, 0, 91, 8, 7, 0, 92, 8, 4, 0, 93, 8, 4, 0, 94, 8, 24, 1, 13, 0, 7, 0, 95, 8, 7, 0, 96, 8,
- 7, 0, 97, 8, 7, 0, 98, 8, 7, 0, 99, 8, 7, 0,100, 8, 7, 0,101, 8, 7, 0,102, 8, 7, 0,103, 8, 7, 0,104, 8,
- 4, 0,236, 2, 4, 0,105, 8, 4, 0,106, 8, 25, 1, 2, 0, 7, 0,113, 5, 7, 0, 37, 0, 26, 1, 5, 0, 7, 0,107, 8,
- 7, 0,108, 8, 4, 0, 90, 0, 4, 0,194, 2, 4, 0,109, 8, 27, 1, 6, 0, 27, 1, 0, 0, 27, 1, 1, 0, 2, 0, 17, 0,
- 2, 0, 19, 0, 2, 0,110, 8, 2, 0, 57, 0, 28, 1, 8, 0, 28, 1, 0, 0, 28, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0,
- 2, 0,110, 8, 2, 0, 57, 0, 7, 0, 23, 0, 7, 0,126, 0, 29, 1, 45, 0, 29, 1, 0, 0, 29, 1, 1, 0, 2, 0, 17, 0,
- 2, 0, 19, 0, 2, 0,110, 8, 2, 0,244, 0, 2, 0, 40, 4, 2, 0,111, 8, 7, 0,112, 8, 7, 0, 89, 0, 7, 0,249, 2,
- 4, 0,113, 8, 4, 0, 82, 0, 4, 0,196, 2, 7, 0,114, 8, 7, 0,115, 8, 7, 0,116, 8, 7, 0,117, 8, 7, 0,118, 8,
- 7, 0,119, 8, 7, 0,246, 2, 7, 0, 59, 1, 7, 0,120, 8, 7, 0,121, 8, 7, 0, 37, 0, 7, 0,122, 8, 7, 0,123, 8,
- 7, 0,124, 8, 2, 0,125, 8, 2, 0,126, 8, 2, 0,127, 8, 2, 0,128, 8, 2, 0,129, 8, 2, 0,130, 8, 2, 0,131, 8,
- 2, 0,132, 8, 2, 0, 31, 2, 2, 0,133, 8, 2, 0, 28, 2, 2, 0,134, 8, 0, 0,135, 8, 0, 0,136, 8, 7, 0,242, 0,
- 30, 1,137, 8, 67, 0,244, 1, 31, 1, 16, 0, 31, 1, 0, 0, 31, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,110, 8,
- 2, 0,244, 0, 7, 0,241, 2, 7, 0,242, 2, 7, 0,243, 2, 7, 0, 77, 2, 7, 0,244, 2, 7, 0,245, 2, 7, 0,138, 8,
- 7, 0,246, 2, 7, 0,248, 2, 7, 0,249, 2,231, 0, 5, 0, 2, 0, 17, 0, 2, 0, 25, 8, 2, 0, 19, 0, 2, 0,139, 8,
- 27, 0,178, 6,230, 0, 3, 0, 4, 0, 69, 0, 4, 0,140, 8,231, 0, 2, 0, 32, 1, 7, 0, 32, 1, 0, 0, 32, 1, 1, 0,
- 0, 0, 20, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 22, 0, 9, 0,141, 8, 33, 1, 5, 0, 0, 0, 20, 0, 7, 0, 79, 1,
- 7, 0,142, 8, 4, 0,143, 8, 4, 0, 37, 0, 34, 1, 4, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 43, 0, 2, 0, 70, 0,
- 35, 1, 4, 0, 0, 0, 20, 0, 66, 0,144, 8, 7, 0, 79, 1, 7, 0, 37, 0, 36, 1, 6, 0, 2, 0,145, 8, 2, 0,146, 8,
- 2, 0, 17, 0, 2, 0,147, 8, 0, 0,148, 8, 0, 0,149, 8, 37, 1, 5, 0, 4, 0, 17, 0, 4, 0, 37, 0, 0, 0, 20, 0,
- 0, 0,150, 8, 0, 0,151, 8, 38, 1, 3, 0, 4, 0, 17, 0, 4, 0, 37, 0, 0, 0, 20, 0, 39, 1, 4, 0, 2, 0,152, 8,
- 2, 0,153, 8, 2, 0, 19, 0, 2, 0, 37, 0, 40, 1, 6, 0, 0, 0, 20, 0, 0, 0,154, 8, 2, 0,155, 8, 2, 0,246, 2,
- 2, 0, 72, 1, 2, 0, 70, 0, 41, 1, 5, 0, 0, 0, 20, 0, 7, 0,109, 0, 7, 0,134, 4, 2, 0, 19, 0, 2, 0,208, 2,
- 42, 1, 3, 0, 0, 0, 20, 0, 4, 0,196, 2, 4, 0,152, 8, 43, 1, 7, 0, 0, 0, 20, 0, 7, 0,134, 4, 0, 0,156, 8,
- 0, 0,157, 8, 2, 0, 72, 1, 2, 0, 43, 0, 4, 0,158, 8, 44, 1, 4, 0, 0, 0,159, 8, 0, 0,160, 8, 4, 0, 17, 0,
- 7, 0,212, 2, 45, 1, 3, 0, 32, 0,161, 8, 0, 0,162, 8, 0, 0,163, 8, 46, 1, 18, 0, 46, 1, 0, 0, 46, 1, 1, 0,
- 2, 0, 17, 0, 2, 0,164, 8, 2, 0, 19, 0, 2, 0,165, 8, 2, 0,166, 8, 2, 0,167, 8, 2, 0, 43, 0, 2, 0, 70, 0,
- 0, 0, 20, 0, 9, 0, 2, 0, 47, 1,168, 8, 32, 0, 45, 0, 2, 0,131, 5, 2, 0, 70, 8, 2, 0,169, 8, 2, 0, 37, 0,
- 48, 1, 11, 0, 0, 0, 20, 0, 0, 0, 17, 0, 0, 0,170, 8, 2, 0, 19, 0, 2, 0,208, 2, 2, 0,171, 8, 4, 0,172, 8,
- 4, 0,173, 8, 4, 0,174, 8, 4, 0,175, 8, 4, 0,176, 8, 49, 1, 1, 0, 0, 0,177, 8, 50, 1, 4, 0, 42, 0,148, 6,
- 0, 0,129, 7, 4, 0, 72, 1, 4, 0, 19, 0, 47, 1, 18, 0, 47, 1, 0, 0, 47, 1, 1, 0, 47, 1,178, 8, 2, 0, 17, 0,
- 2, 0, 19, 0, 2, 0,179, 8, 2, 0,167, 8, 2, 0,164, 8, 2, 0,180, 8, 2, 0, 70, 0, 2, 0,241, 1, 0, 0, 20, 0,
- 9, 0, 2, 0, 51, 1,168, 8, 46, 1,181, 8, 2, 0, 15, 0, 2, 0,182, 8, 4, 0,183, 8, 52, 1, 3, 0, 4, 0,222, 2,
- 4, 0, 37, 0, 32, 0, 45, 0, 53, 1, 12, 0,161, 0,184, 8, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0,112, 8, 4, 0, 89, 0,
- 0, 0, 20, 0, 0, 0,185, 8, 2, 0,186, 8, 2, 0,187, 8, 2, 0,188, 8, 2, 0,189, 8, 7, 0,190, 8, 54, 1, 13, 0,
- 2, 0, 19, 0, 2, 0,191, 8, 4, 0, 43, 0, 4, 0, 70, 0, 2, 0,192, 8, 7, 0,254, 3, 7, 0,193, 8, 20, 1, 68, 8,
- 55, 1,194, 8, 2, 0, 17, 0, 2, 0,124, 1, 2, 0,249, 5, 2, 0,195, 8, 56, 1, 11, 0, 4, 0,222, 2, 2, 0, 17, 0,
- 2, 0, 19, 0, 32, 0, 45, 0, 80, 0,196, 8, 0, 0, 20, 0, 7, 0,197, 8, 7, 0,198, 8, 7, 0,139, 3, 2, 0,199, 8,
- 2, 0,200, 8, 57, 1, 5, 0, 2, 0, 17, 0, 2, 0, 43, 0, 4, 0, 37, 0, 46, 0,134, 0, 32, 0,120, 5, 58, 1, 5, 0,
- 4, 0, 37, 0, 4, 0, 17, 0, 0, 0, 20, 0, 0, 0,150, 8, 32, 0, 45, 0, 59, 1, 13, 0, 2, 0, 19, 0, 2, 0, 17, 0,
- 2, 0,164, 8, 2, 0,140, 3, 7, 0,201, 8, 7, 0,202, 8, 7, 0,139, 1, 7, 0,152, 3, 7, 0,111, 3, 7, 0,114, 3,
- 7, 0,203, 8, 7, 0,204, 8, 32, 0,205, 8, 60, 1, 10, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,112, 8, 4, 0, 89, 0,
- 0, 0, 20, 0, 0, 0,185, 8, 2, 0, 43, 0, 2, 0, 70, 0, 2, 0,241, 1, 2, 0,124, 1, 61, 1, 8, 0, 32, 0, 45, 0,
- 7, 0,243, 2, 7, 0,206, 8, 7, 0,207, 8, 7, 0, 37, 0, 2, 0, 43, 0, 2, 0,208, 2, 7, 0, 70, 0, 62, 1, 12, 0,
- 2, 0, 17, 0, 2, 0, 72, 1, 2, 0, 19, 0, 2, 0,246, 2, 2, 0,222, 2, 2, 0,208, 8, 4, 0, 37, 0, 7, 0,209, 8,
- 7, 0,210, 8, 7, 0,211, 8, 7, 0,212, 8, 0, 0,213, 8, 63, 1, 9, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,112, 8,
- 4, 0, 89, 0, 0, 0, 20, 0, 2, 0,139, 1, 2, 0, 64, 0, 2, 0,214, 8, 2, 0,215, 8, 64, 1, 7, 0, 4, 0,196, 2,
- 4, 0,216, 8, 4, 0,217, 8, 4, 0,218, 8, 7, 0,219, 8, 7, 0,220, 8, 0, 0,156, 8, 65, 1, 7, 0, 0, 0,221, 8,
- 32, 0,222, 8, 0, 0,162, 8, 2, 0,223, 8, 2, 0, 43, 0, 4, 0, 70, 0, 0, 0,163, 8, 66, 1, 6, 0, 2, 0, 19, 0,
- 2, 0, 17, 0, 4, 0,112, 8, 4, 0, 89, 0, 0, 0,224, 8, 0, 0,225, 8, 67, 1, 1, 0, 4, 0, 19, 0, 68, 1, 6, 0,
- 0, 0, 92, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0,226, 8, 7, 0,227, 8, 42, 0,148, 6, 69, 1, 4, 0, 0, 0, 73, 2,
- 2, 0, 19, 0, 4, 0, 17, 0, 32, 0, 45, 0, 70, 1, 2, 0, 4, 0, 17, 0, 4, 0, 69, 6, 71, 1, 6, 0, 0, 0,159, 8,
- 0, 0,160, 8, 4, 0, 17, 0, 7, 0, 39, 2, 32, 0, 51, 3, 32, 0,228, 8, 51, 1, 10, 0, 51, 1, 0, 0, 51, 1, 1, 0,
- 51, 1,178, 8, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,164, 8, 2, 0,229, 8, 0, 0, 20, 0, 9, 0, 2, 0, 32, 0, 45, 0,
- 72, 1, 10, 0, 7, 0,139, 3, 7, 0,230, 8, 7, 0,231, 8, 7, 0,232, 8, 7, 0,233, 8, 4, 0, 19, 0, 7, 0,208, 8,
- 7, 0,234, 8, 7, 0,235, 8, 7, 0, 37, 0, 55, 1, 8, 0, 7, 0,236, 8, 7, 0,237, 8, 7, 0,238, 8, 7, 0,239, 8,
- 7, 0,240, 8, 7, 0,241, 8, 7, 0,242, 8, 7, 0,243, 8, 20, 1, 16, 0, 27, 0, 31, 0, 0, 0, 34, 0, 43, 0,152, 0,
- 9, 0,225, 0, 43, 0,244, 8, 36, 0, 80, 0, 7, 0,254, 3, 7, 0,245, 8, 7, 0,193, 8, 7, 0,236, 8, 7, 0,237, 8,
- 7, 0,246, 8, 4, 0, 90, 0, 4, 0, 37, 0, 9, 0,247, 8, 9, 0,248, 8, 73, 1, 15, 0,216, 0, 0, 0,216, 0, 1, 0,
- 12, 0, 35, 6, 4, 0, 36, 6, 7, 0, 37, 6, 6, 1,249, 8,217, 0, 89, 6, 20, 1, 68, 8, 2, 0, 72, 1, 2, 0,191, 8,
- 2, 0, 92, 2, 2, 0, 93, 2, 2, 0, 19, 0, 2, 0,139, 6, 4, 0, 70, 0, 74, 1, 6, 0, 74, 1, 0, 0, 74, 1, 1, 0,
- 32, 0, 45, 0, 9, 0,250, 8, 4, 0,249, 0, 4, 0, 37, 0, 67, 0, 4, 0, 27, 0, 31, 0, 12, 0,251, 8, 4, 0,131, 0,
- 7, 0,252, 8, 75, 1, 27, 0, 75, 1, 0, 0, 75, 1, 1, 0, 26, 0,253, 8, 75, 1, 38, 0, 12, 0,254, 8, 0, 0, 20, 0,
- 7, 0,255, 8, 7, 0, 0, 9, 7, 0, 1, 9, 7, 0, 2, 9, 4, 0, 19, 0, 7, 0, 3, 9, 7, 0, 4, 9, 7, 0, 5, 9,
- 7, 0, 79, 1, 7, 0, 39, 2, 7, 0, 6, 9, 7, 0,194, 2, 7, 0, 7, 9, 7, 0, 8, 9, 7, 0, 9, 9, 7, 0, 10, 9,
- 7, 0, 11, 9, 7, 0,174, 0, 4, 0,131, 0, 2, 0,160, 5, 2, 0,139, 1, 76, 1, 25, 0, 27, 0, 31, 0, 39, 0, 75, 0,
- 12, 0, 12, 9, 12, 0, 13, 9, 12, 0, 14, 9, 75, 1, 15, 9, 9, 0, 16, 9, 9, 0, 17, 9, 4, 0, 19, 0, 4, 0, 45, 6,
- 2, 0,250, 2, 2, 0, 99, 6, 4, 0, 37, 0, 4, 0,131, 0, 4, 0, 18, 9, 2, 0, 19, 9, 2, 0, 20, 9, 2, 0, 21, 9,
- 2, 0, 22, 9, 4, 0, 23, 9, 4, 0, 24, 9, 4, 0, 25, 9, 4, 0, 26, 9, 4, 0, 27, 9, 4, 0, 28, 9, 77, 1, 2, 0,
- 7, 0,155, 2, 4, 0, 19, 0,165, 0, 5, 0, 77, 1, 29, 9, 4, 0,194, 2, 4, 0, 30, 9, 4, 0, 31, 9, 4, 0, 19, 0,
-164, 0, 16, 0, 4, 0, 32, 9, 4, 0, 33, 9, 4, 0, 34, 9, 4, 0, 35, 9, 2, 0, 36, 9, 2, 0, 37, 9, 2, 0, 38, 9,
- 2, 0,249, 0, 2, 0, 39, 9, 2, 0, 40, 9, 2, 0, 41, 9, 2, 0, 42, 9, 4, 0, 43, 9, 4, 0, 44, 9, 4, 0, 45, 9,
- 4, 0, 46, 9, 78, 1, 44, 0, 78, 1, 0, 0, 78, 1, 1, 0, 26, 0,253, 8, 12, 0,166, 3, 0, 0, 20, 0, 2, 0, 19, 0,
- 2, 0, 47, 9, 2, 0, 48, 9, 2, 0, 49, 9, 2, 0,125, 3, 2, 0, 50, 9, 4, 0, 75, 2, 4, 0, 25, 9, 4, 0, 26, 9,
- 75, 1, 51, 9, 78, 1, 38, 0, 78, 1, 52, 9, 12, 0, 53, 9, 9, 0, 54, 9, 9, 0, 55, 9, 9, 0, 56, 9, 7, 0, 67, 1,
- 7, 0,174, 0, 7, 0, 57, 9, 7, 0, 18, 2, 7, 0,116, 3, 7, 0,118, 3, 2, 0,148, 3, 2, 0, 37, 0, 7, 0, 58, 9,
- 7, 0, 59, 9, 7, 0,121, 3, 7, 0, 60, 9, 7, 0, 61, 9, 7, 0, 62, 9, 7, 0, 63, 9, 7, 0, 64, 9, 7, 0, 65, 9,
- 7, 0, 66, 9, 7, 0, 67, 9, 7, 0, 68, 2,165, 0,104, 3, 32, 0, 68, 9, 78, 1, 69, 9,162, 0, 13, 0, 12, 0, 70, 9,
- 79, 1, 71, 9, 2, 0, 19, 0, 2, 0, 72, 9, 7, 0,104, 2, 7, 0, 73, 9, 7, 0, 74, 9, 12, 0, 75, 9, 4, 0, 76, 9,
- 4, 0, 77, 9, 9, 0, 78, 9, 9, 0, 79, 9,164, 0,103, 3, 80, 1, 1, 0, 4, 0, 77, 9, 81, 1, 12, 0, 4, 0, 77, 9,
- 7, 0,176, 8, 2, 0, 80, 9, 2, 0, 81, 9, 7, 0, 82, 9, 7, 0, 83, 9, 2, 0, 84, 9, 2, 0, 19, 0, 7, 0, 85, 9,
- 7, 0, 86, 9, 7, 0, 87, 9, 7, 0, 88, 9, 82, 1, 7, 0, 82, 1, 0, 0, 82, 1, 1, 0, 12, 0, 89, 9, 4, 0, 19, 0,
- 4, 0, 90, 9, 0, 0,245, 3,252, 0, 91, 9,161, 0, 7, 0, 27, 0, 31, 0, 12, 0, 92, 9, 12, 0, 70, 9, 12, 0, 93, 9,
- 12, 0,100, 0, 4, 0, 19, 0, 4, 0, 94, 9,221, 0, 5, 0, 27, 0, 95, 9, 12, 0, 70, 9, 67, 0, 96, 9, 4, 0, 97, 9,
- 4, 0, 19, 0, 83, 1, 13, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 35, 6, 4, 0, 36, 6, 7, 0, 37, 6, 2, 0, 38, 6,
-217, 0, 89, 6,161, 0, 99, 3,221, 0, 98, 9, 0, 0, 72, 1, 0, 0, 92, 6, 2, 0, 19, 0, 7, 0, 99, 9, 84, 1, 8, 0,
- 84, 1, 0, 0, 84, 1, 1, 0, 82, 1,100, 9, 36, 0, 80, 0, 12, 0,105, 3, 4, 0, 19, 0, 0, 0, 20, 0, 4, 0,101, 9,
- 85, 1, 5, 0, 85, 1, 0, 0, 85, 1, 1, 0, 36, 0, 80, 0, 2, 0, 19, 0, 0, 0,102, 9, 86, 1, 14, 0, 86, 1, 0, 0,
- 86, 1, 1, 0, 9, 0, 2, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0,103, 9, 0, 0,104, 9, 0, 0,102, 9, 7, 0,105, 9,
- 7, 0,106, 9, 4, 0, 37, 0, 36, 0, 80, 0, 7, 0,107, 9, 7, 0,108, 9, 87, 1, 9, 0, 87, 1, 0, 0, 87, 1, 1, 0,
- 32, 0,109, 9, 0, 0,253, 2, 7, 0,110, 9, 2, 0,111, 9, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0,112, 9, 88, 1, 7, 0,
- 42, 0,148, 6, 26, 0,253, 8, 4, 0, 19, 0, 4, 0,113, 9, 12, 0,114, 9, 32, 0,109, 9, 0, 0,253, 2, 89, 1, 15, 0,
- 32, 0,109, 9, 2, 0,115, 9, 2, 0, 19, 0, 2, 0,116, 9, 2, 0,117, 9, 0, 0,253, 2, 32, 0,118, 9, 0, 0,119, 9,
- 7, 0,120, 9, 7, 0, 39, 2, 7, 0,121, 9, 7, 0,122, 9, 2, 0, 17, 0, 2, 0, 72, 1, 7, 0, 79, 1, 90, 1, 6, 0,
- 32, 0,109, 9, 7, 0, 29, 9, 2, 0,123, 9, 2, 0,124, 9, 2, 0, 19, 0, 2, 0,125, 9, 91, 1, 6, 0, 32, 0,109, 9,
- 4, 0,126, 9, 4, 0,127, 9, 4, 0, 90, 0, 4, 0, 37, 0, 0, 0,253, 2, 92, 1, 4, 0, 32, 0,109, 9, 4, 0, 19, 0,
- 4, 0,126, 9, 0, 0,253, 2, 93, 1, 4, 0, 32, 0,109, 9, 4, 0, 19, 0, 4, 0,126, 9, 0, 0,253, 2, 94, 1, 4, 0,
- 32, 0,109, 9, 4, 0, 19, 0, 4, 0,126, 9, 0, 0,253, 2, 95, 1, 2, 0, 4, 0, 19, 0, 7, 0,254, 3, 96, 1, 2, 0,
- 32, 0,109, 9, 0, 0,253, 2, 97, 1, 10, 0, 32, 0,109, 9, 4, 0,128, 9, 7, 0,125, 0, 4, 0, 19, 0, 2, 0,142, 6,
- 2, 0,129, 9, 2, 0, 43, 0, 2, 0, 70, 0, 7, 0,130, 9, 0, 0,253, 2, 98, 1, 10, 0, 32, 0,109, 9, 2, 0, 17, 0,
- 2, 0, 48, 4, 4, 0, 88, 0, 4, 0, 89, 0, 7, 0,206, 8, 7, 0,207, 8, 4, 0, 37, 0,161, 0,184, 8, 0, 0,253, 2,
- 99, 1, 4, 0, 32, 0,109, 9, 4, 0,126, 3, 4, 0,131, 9, 0, 0,253, 2,100, 1, 4, 0, 32, 0,109, 9, 4, 0,126, 3,
- 4, 0, 37, 0, 0, 0,253, 2,101, 1, 6, 0, 32, 0,109, 9, 7, 0,125, 0, 7, 0,132, 9, 4, 0,133, 9, 2, 0,126, 3,
- 2, 0,127, 3,102, 1, 6, 0, 32, 0,109, 9, 4, 0,134, 9, 4, 0,135, 9, 7, 0,136, 9, 7, 0,137, 9, 0, 0,253, 2,
-103, 1, 16, 0, 32, 0,109, 9, 32, 0, 52, 9, 4, 0, 17, 0, 7, 0,138, 9, 7, 0,139, 9, 7, 0,140, 9, 7, 0,141, 9,
- 7, 0,142, 9, 7, 0,143, 9, 7, 0,144, 9, 7, 0,145, 9, 7, 0,146, 9, 2, 0, 19, 0, 2, 0, 37, 0, 2, 0, 43, 0,
- 2, 0, 70, 0,104, 1, 3, 0, 32, 0,109, 9, 4, 0, 19, 0, 4, 0, 31, 2,105, 1, 5, 0, 32, 0,109, 9, 4, 0, 19, 0,
- 4, 0, 37, 0, 7, 0,147, 9, 0, 0,253, 2,106, 1, 10, 0, 32, 0,109, 9, 0, 0,253, 2, 2, 0,148, 9, 2, 0,149, 9,
- 0, 0,150, 9, 0, 0,151, 9, 7, 0,152, 9, 7, 0,153, 9, 7, 0,154, 9, 7, 0,155, 9,107, 1, 8, 0, 7, 0, 9, 0,
- 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,156, 9, 7, 0,157, 9, 2, 0, 19, 0, 2, 0, 31, 2,108, 1, 8, 0,
- 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,156, 9, 7, 0,157, 9, 2, 0, 19, 0, 2, 0, 31, 2,
-109, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,156, 9, 7, 0,157, 9, 2, 0, 19, 0,
- 2, 0, 31, 2,110, 1, 7, 0, 32, 0,109, 9, 0, 0,253, 2, 7, 0, 79, 1, 7, 0, 88, 1, 2, 0, 19, 0, 2, 0, 72, 1,
- 4, 0, 37, 0,111, 1, 5, 0, 32, 0, 51, 3, 7, 0, 79, 1, 2, 0, 55, 3, 0, 0, 57, 3, 0, 0,158, 9,112, 1, 10, 0,
-112, 1, 0, 0,112, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0,159, 9, 7, 0, 23, 1, 7, 0, 24, 1, 2, 0, 89, 9,
- 2, 0,160, 9, 32, 0, 45, 0,113, 1, 22, 0,113, 1, 0, 0,113, 1, 1, 0, 2, 0, 19, 0, 2, 0, 72, 1, 2, 0,161, 9,
- 2, 0,162, 9, 36, 0, 80, 0,161, 0,184, 8, 32, 0,166, 0, 7, 0, 88, 0, 7, 0, 89, 0, 7, 0,163, 9, 7, 0,164, 9,
- 7, 0,165, 9, 7, 0,166, 9, 7, 0,239, 2, 7, 0,167, 9, 7, 0,186, 8, 7, 0,168, 9, 0, 0,169, 9, 0, 0,170, 9,
- 12, 0,107, 3,114, 1, 8, 0, 7, 0, 46, 2, 7, 0,206, 8, 7, 0,207, 8, 9, 0, 2, 0, 2, 0,171, 9, 2, 0,172, 9,
- 2, 0,173, 9, 2, 0,174, 9,115, 1, 18, 0,115, 1, 0, 0,115, 1, 1, 0,115, 1,175, 9, 0, 0, 20, 0,114, 1,176, 9,
- 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,177, 9, 2, 0,178, 9, 2, 0,179, 9, 2, 0,180, 9, 4, 0, 43, 0, 7, 0,181, 9,
- 7, 0,182, 9, 4, 0,183, 9, 4, 0,184, 9,115, 1,185, 9,116, 1,186, 9,117, 1, 33, 0,117, 1, 0, 0,117, 1, 1, 0,
-117, 1,187, 9, 0, 0, 20, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 35, 8, 2, 0, 70, 8, 2, 0,188, 9, 2, 0,133, 0,
- 2, 0,178, 9, 2, 0, 25, 8, 12, 0,179, 8, 12, 0,189, 9, 27, 0,178, 6, 9, 0,190, 9, 7, 0,181, 9, 7, 0,182, 9,
- 7, 0, 77, 2, 7, 0,191, 9, 2, 0,192, 9, 2, 0,193, 9, 7, 0,194, 9, 7, 0,195, 9, 2, 0,196, 9, 2, 0,197, 9,
- 9, 0,198, 9, 24, 0,199, 9, 24, 0,200, 9, 24, 0,201, 9,118, 1,153, 0,119, 1,202, 9,120, 1,203, 9,116, 1, 8, 0,
-116, 1, 0, 0,116, 1, 1, 0,117, 1,204, 9,117, 1,205, 9,115, 1,206, 9,115, 1,185, 9, 4, 0, 19, 0, 4, 0, 37, 0,
- 60, 0, 22, 0, 27, 0, 31, 0, 39, 0, 75, 0,163, 0,102, 3, 12, 0,207, 9, 12, 0,208, 9,114, 1,209, 9, 12, 0,210, 9,
- 4, 0, 17, 0, 4, 0,211, 9, 4, 0,212, 9, 4, 0,213, 9, 4, 0, 19, 0, 4, 0, 37, 0, 12, 0,214, 9,120, 1,215, 9,
- 4, 0,216, 9, 9, 0,217, 9, 9, 0,218, 9, 4, 0,219, 9, 9, 0,220, 9, 9, 0,221, 9, 9, 0,222, 9,121, 1, 6, 0,
- 4, 0,124, 0, 4, 0,126, 0, 4, 0, 25, 8, 0, 0,223, 9, 0, 0,224, 9, 2, 0, 37, 0,122, 1, 16, 0, 2, 0,235, 7,
- 2, 0,236, 7, 2, 0,225, 9, 2, 0,231, 8, 2, 0,226, 9, 2, 0, 68, 0, 7, 0,238, 2, 7, 0,227, 9, 7, 0,228, 9,
- 2, 0, 94, 1, 0, 0,229, 9, 0, 0,230, 9, 2, 0,231, 9, 2, 0, 37, 0, 4, 0,232, 9, 4, 0,233, 9,123, 1, 9, 0,
- 7, 0,234, 9, 7, 0,235, 9, 7, 0,246, 8, 7, 0,109, 0, 7, 0,236, 9, 7, 0,105, 6, 2, 0, 69, 3, 0, 0,237, 9,
- 0, 0, 37, 0,124, 1, 4, 0, 7, 0,238, 9, 7, 0,239, 9, 2, 0, 69, 3, 2, 0, 37, 0,125, 1, 3, 0, 7, 0,240, 9,
- 7, 0,241, 9, 7, 0, 15, 0,126, 1, 7, 0, 0, 0, 8, 2, 2, 0, 9, 5, 2, 0, 10, 5, 2, 0, 11, 5, 2, 0,205, 4,
- 4, 0,126, 0, 4, 0, 46, 4,127, 1, 9, 0, 7, 0,242, 9, 7, 0,243, 9, 7, 0,244, 9, 7, 0, 88, 2, 7, 0,245, 9,
- 7, 0,246, 9, 7, 0,247, 9, 2, 0,248, 9, 2, 0,249, 9,128, 1, 4, 0, 2, 0,250, 9, 2, 0,251, 9, 2, 0,252, 9,
- 2, 0,253, 9,129, 1, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0,130, 1, 2, 0, 0, 0,168, 0, 0, 0,254, 9,131, 1, 1, 0,
- 0, 0, 20, 0,132, 1, 10, 0, 0, 0,255, 9, 0, 0, 0, 10, 0, 0, 98, 6, 0, 0, 1, 10, 2, 0,225, 9, 2, 0, 2, 10,
- 7, 0, 3, 10, 7, 0, 4, 10, 7, 0, 5, 10, 7, 0,167, 9,133, 1, 2, 0, 9, 0, 6, 10, 9, 0, 7, 10,134, 1, 11, 0,
- 0, 0, 11, 5, 0, 0, 17, 0, 0, 0, 69, 3, 0, 0,109, 0, 0, 0, 8, 10, 0, 0,106, 0, 0, 0, 73, 2, 7, 0, 9, 10,
- 7, 0, 10, 10, 7, 0, 11, 10, 7, 0, 12, 10,135, 1, 8, 0, 7, 0,145, 8, 7, 0,125, 0, 7, 0,230, 9, 7, 0,160, 2,
- 7, 0, 13, 10, 7, 0,238, 0, 7, 0, 14, 10, 4, 0, 17, 0,136, 1, 4, 0, 2, 0, 15, 10, 2, 0, 16, 10, 2, 0, 17, 10,
- 2, 0, 37, 0,137, 1, 6, 0, 7, 0, 18, 10, 7, 0,202, 2, 7, 0, 19, 10, 7, 0, 30, 8, 7, 0, 31, 8, 7, 0, 32, 8,
-138, 1, 6, 0, 2, 0, 20, 10, 2, 0, 21, 10, 7, 0, 22, 10, 7, 0, 23, 10, 7, 0, 24, 10, 7, 0, 25, 10,139, 1, 1, 0,
- 0, 0, 20, 0,140, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 2, 0, 19, 0, 2, 0, 26, 10,141, 1, 10, 0, 2, 0,234, 3,
- 2, 0, 19, 0, 7, 0,134, 4, 7, 0, 27, 10, 7, 0, 28, 10, 7, 0, 29, 10, 7, 0, 30, 10,140, 1, 31, 10,140, 1, 32, 10,
-140, 1, 33, 10, 63, 0, 11, 0, 4, 0, 19, 0, 4, 0, 64, 0, 4, 0, 34, 10, 4, 0, 37, 0, 24, 0, 35, 10, 24, 0, 36, 10,
-141, 1, 37, 10, 7, 0, 38, 10, 7, 0, 39, 10, 7, 0, 40, 10, 7, 0, 41, 10,233, 0, 9, 0, 4, 0, 89, 9, 4, 0, 42, 10,
- 7, 0, 43, 10, 7, 0, 44, 10, 7, 0, 45, 10, 7, 0, 10, 0, 7, 0, 12, 0, 4, 0,129, 0, 4, 0, 19, 0,142, 1, 4, 0,
- 47, 0,232, 2, 7, 0, 46, 10, 7, 0,173, 1, 7, 0, 37, 0,194, 0, 18, 0, 27, 0, 31, 0,142, 1, 47, 10, 63, 0, 31, 10,
- 51, 0, 48, 10, 2, 0, 19, 0, 2, 0,255, 5, 4, 0,106, 0, 7, 0, 49, 10, 7, 0, 85, 2, 4, 0, 50, 10, 7, 0, 51, 10,
- 7, 0, 52, 10, 7, 0, 53, 10, 7, 0,173, 1, 0, 0, 54, 10, 0, 0, 55, 10, 0, 0, 56, 10, 0, 0, 70, 0,143, 1, 10, 0,
- 4, 0, 17, 0, 4, 0,125, 0, 4, 0, 19, 0, 4, 0,188, 3, 4, 0, 57, 10, 4, 0, 58, 10, 4, 0, 59, 10, 0, 0, 92, 0,
- 0, 0, 20, 0, 9, 0, 2, 0,144, 1, 1, 0, 0, 0, 35, 0, 91, 0, 7, 0,143, 1, 60, 10, 4, 0, 61, 10, 4, 0, 62, 10,
- 4, 0, 63, 10, 4, 0, 37, 0, 9, 0, 64, 10,144, 1, 65, 10,145, 1, 5, 0, 7, 0,155, 2, 7, 0,222, 2, 7, 0, 39, 2,
- 2, 0,131, 2, 2, 0, 37, 0,146, 1, 5, 0, 7, 0,155, 2, 7, 0, 66, 10, 7, 0, 67, 10, 7, 0, 68, 10, 7, 0,222, 2,
-147, 1, 5, 0, 32, 0, 69, 10,148, 1, 22, 0, 7, 0,227, 5, 7, 0, 70, 10, 7, 0, 57, 0,149, 1, 7, 0, 4, 0, 71, 10,
- 4, 0, 72, 10, 4, 0, 73, 10, 7, 0, 74, 10, 7, 0, 75, 10, 7, 0, 76, 10, 7, 0, 57, 0,150, 1, 8, 0,150, 1, 0, 0,
-150, 1, 1, 0, 32, 0, 45, 0, 4, 0, 1, 1, 2, 0, 19, 0, 2, 0, 72, 1, 7, 0,222, 2, 7, 0,153, 8,151, 1, 6, 0,
-151, 1, 0, 0,151, 1, 1, 0, 32, 0, 45, 0, 2, 0,207, 2, 2, 0, 19, 0, 2, 0, 77, 10,152, 1, 17, 0,146, 1,182, 3,
-146, 1, 78, 10,145, 1, 79, 10,146, 1,137, 8,147, 1, 80, 10, 4, 0, 82, 0, 7, 0,222, 2, 7, 0,249, 2, 7, 0, 81, 10,
- 4, 0, 71, 10, 4, 0, 82, 10, 7, 0, 75, 10, 7, 0, 76, 10, 7, 0,106, 0, 4, 0, 83, 10, 2, 0, 19, 0, 2, 0, 84, 10,
-153, 1,110, 0, 27, 0, 31, 0, 39, 0, 75, 0,154, 1, 85, 10,172, 0, 68, 4, 4, 0, 19, 0, 2, 0, 17, 0, 2, 0,148, 9,
- 2, 0, 86, 10, 2, 0, 87, 10, 2, 0,148, 3, 2, 0, 88, 10, 2, 0, 89, 10, 2, 0, 90, 10, 2, 0, 91, 10, 2, 0, 92, 10,
- 2, 0, 93, 10, 2, 0, 94, 10, 2, 0,254, 4, 2, 0,139, 5, 2, 0, 95, 10, 2, 0, 96, 10, 2, 0, 97, 10, 2, 0, 98, 10,
- 2, 0, 99, 10, 2, 0, 28, 2, 2, 0,130, 8, 2, 0,105, 8, 2, 0,100, 10, 2, 0,101, 10, 2, 0,198, 3, 2, 0,199, 3,
- 2, 0,102, 10, 2, 0,103, 10, 2, 0,104, 10, 2, 0,105, 10, 7, 0,106, 10, 7, 0,107, 10, 7, 0,108, 10, 2, 0, 88, 5,
- 2, 0,109, 10, 7, 0,110, 10, 7, 0,111, 10, 7, 0,112, 10, 7, 0,112, 8, 7, 0, 89, 0, 7, 0,249, 2, 7, 0,118, 8,
- 7, 0,113, 10, 7, 0,114, 10, 7, 0,115, 10, 4, 0,113, 8, 4, 0,111, 8, 4, 0,116, 10, 7, 0,114, 8, 7, 0,115, 8,
- 7, 0,116, 8, 7, 0,117, 10, 7, 0,118, 10, 7, 0,119, 10, 7, 0,120, 10, 7, 0,121, 10, 7, 0, 57, 0, 7, 0,122, 10,
- 7, 0,123, 10, 7, 0,124, 10, 7, 0,125, 10, 7, 0,139, 3, 7, 0,106, 0, 7, 0,126, 10, 7, 0,127, 10, 7, 0,128, 10,
- 7, 0,129, 10, 7, 0,130, 10, 7, 0,131, 10, 7, 0,132, 10, 4, 0,133, 10, 4, 0,134, 10, 7, 0,135, 10, 7, 0,136, 10,
- 7, 0,137, 10, 7, 0,138, 10, 7, 0,139, 10, 7, 0,212, 0, 7, 0,140, 10, 7, 0,225, 3, 7, 0,223, 3, 7, 0,224, 3,
- 7, 0,141, 10, 7, 0,142, 10, 7, 0,143, 10, 7, 0,144, 10, 7, 0,145, 10, 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, 7, 0,153, 10, 4, 0,154, 10, 4, 0,155, 10, 67, 0,171, 3,
- 12, 0,156, 10, 67, 0,157, 10, 32, 0,158, 10, 32, 0,159, 10, 36, 0, 80, 0,167, 0, 64, 1,167, 0,160, 10,147, 0, 44, 0,
-147, 0, 0, 0,147, 0, 1, 0,153, 1,161, 10,152, 1,162, 10,149, 1, 52, 9,174, 0,250, 3, 9, 0,251, 3,155, 1,163, 10,
-155, 1,164, 10, 12, 0,165, 10, 12, 0,166, 10,132, 0,167, 10,140, 0,168, 10,140, 0,169, 10, 32, 0,170, 10, 32, 0,171, 10,
- 32, 0, 38, 0, 12, 0,114, 9, 0, 0, 20, 0, 7, 0,242, 0, 7, 0, 20, 3, 7, 0,172, 10, 4, 0,196, 2, 4, 0, 57, 0,
- 4, 0, 19, 0, 4, 0,113, 8, 4, 0,173, 10, 4, 0,174, 10, 4, 0,175, 10, 2, 0,249, 0, 2, 0,176, 10, 2, 0,177, 10,
- 2, 0,178, 10, 0, 0,179, 10, 2, 0,180, 10, 2, 0,181, 10, 2, 0,182, 10, 9, 0,183, 10,136, 0, 67, 4, 12, 0, 7, 3,
- 12, 0,184, 10,156, 1,185, 10,157, 1,186, 10, 7, 0,187, 10,134, 0, 35, 0,158, 1,247, 8, 7, 0, 37, 4, 7, 0,188, 10,
- 7, 0,189, 10, 7, 0,227, 5, 7, 0,149, 3, 7, 0,139, 3, 7, 0,190, 10, 7, 0, 87, 2, 7, 0,191, 10, 7, 0,192, 10,
- 7, 0,193, 10, 7, 0,194, 10, 7, 0,195, 10, 7, 0,196, 10, 7, 0, 38, 4, 7, 0,197, 10, 7, 0,198, 10, 7, 0,199, 10,
- 7, 0, 39, 4, 7, 0, 35, 4, 7, 0, 36, 4, 7, 0,200, 10, 7, 0,201, 10, 4, 0,202, 10, 4, 0, 90, 0, 4, 0,203, 10,
- 4, 0,204, 10, 2, 0,205, 10, 2, 0,206, 10, 2, 0,207, 10, 2, 0,208, 10, 2, 0,209, 10, 2, 0,210, 10,172, 0, 68, 4,
-135, 0, 9, 0,158, 1,211, 10, 7, 0,212, 10, 7, 0,213, 10, 7, 0,245, 1, 7, 0,214, 10, 4, 0, 90, 0, 2, 0,215, 10,
- 2, 0,216, 10, 67, 0,244, 1,159, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 7, 0,217, 10,160, 1, 6, 0,
-160, 1, 0, 0,160, 1, 1, 0,159, 1, 29, 9, 4, 0,255, 0, 2, 0,218, 10, 2, 0, 19, 0,161, 1, 5, 0,161, 1, 0, 0,
-161, 1, 1, 0, 12, 0,219, 10, 4, 0,220, 10, 4, 0, 19, 0,162, 1, 9, 0,162, 1, 0, 0,162, 1, 1, 0, 12, 0,124, 0,
-161, 1,221, 10, 4, 0, 19, 0, 2, 0,218, 10, 2, 0,222, 10, 7, 0, 91, 0, 0, 0,223, 10,163, 0, 6, 0, 27, 0, 31, 0,
- 12, 0, 27, 5, 4, 0, 19, 0, 2, 0,224, 10, 2, 0,225, 10, 9, 0,226, 10,163, 1, 7, 0,163, 1, 0, 0,163, 1, 1, 0,
- 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 23, 0, 0, 0,227, 10, 0, 0,228, 10,164, 1, 5, 0, 12, 0,229, 10, 4, 0,230, 10,
- 4, 0,231, 10, 4, 0, 19, 0, 4, 0, 37, 0,165, 1, 17, 0, 27, 0, 31, 0,166, 1,232, 10,166, 1,233, 10, 12, 0,234, 10,
- 4, 0,235, 10, 2, 0,236, 10, 2, 0,237, 10, 12, 0,238, 10, 12, 0,239, 10,164, 1,240, 10, 12, 0,241, 10, 12, 0,242, 10,
- 12, 0,243, 10, 12, 0,244, 10,167, 1,245, 10, 12, 0,246, 10,214, 0,247, 10,166, 1, 31, 0,166, 1, 0, 0,166, 1, 1, 0,
- 9, 0,248, 10, 4, 0,213, 7, 2, 0,249, 10, 2, 0, 37, 0,219, 0, 88, 6,219, 0,250, 10, 0, 0,251, 10, 2, 0,252, 10,
- 2, 0,253, 10, 2, 0,235, 7, 2, 0,236, 7, 2, 0,254, 10, 2, 0,255, 10, 2, 0,188, 3, 2, 0,206, 6, 2, 0, 0, 11,
- 2, 0, 1, 11, 2, 0,216, 9,168, 1, 2, 11,169, 1, 3, 11,170, 1, 4, 11, 4, 0, 5, 11, 4, 0, 6, 11, 9, 0, 7, 11,
- 12, 0,239, 10, 12, 0,255, 7, 12, 0, 8, 11, 12, 0, 9, 11, 12, 0, 10, 11,171, 1, 17, 0,171, 1, 0, 0,171, 1, 1, 0,
- 0, 0, 11, 11, 26, 0, 30, 0, 2, 0, 12, 11, 2, 0, 17, 0, 2, 0, 15, 0, 2, 0, 13, 11, 2, 0, 14, 11, 2, 0, 15, 11,
- 2, 0, 16, 11, 2, 0, 17, 11, 2, 0, 19, 0, 2, 0, 18, 11, 2, 0, 31, 0, 2, 0, 37, 0,172, 1, 19, 11,173, 1, 10, 0,
-173, 1, 0, 0,173, 1, 1, 0, 12, 0, 20, 11, 0, 0, 11, 11, 2, 0, 21, 11, 2, 0, 22, 11, 2, 0, 19, 0, 2, 0, 23, 11,
- 4, 0, 24, 11, 9, 0, 25, 11,167, 1, 8, 0,167, 1, 0, 0,167, 1, 1, 0, 0, 0, 11, 11, 0, 0, 26, 11, 0, 0, 27, 11,
- 12, 0,167, 7, 4, 0, 28, 11, 4, 0, 19, 0,227, 0, 14, 0,227, 0, 0, 0,227, 0, 1, 0, 0, 0, 11, 11, 26, 0, 30, 0,
-174, 1,229, 7, 9, 0, 29, 11, 9, 0, 30, 11,172, 1, 19, 11,164, 1, 31, 11, 12, 0, 32, 11,227, 0, 33, 11, 5, 1,123, 6,
- 2, 0, 19, 0, 2, 0,139, 1,175, 1, 8, 0,175, 1, 0, 0,175, 1, 1, 0, 9, 0, 2, 0, 9, 0, 34, 11, 0, 0,245, 3,
- 2, 0, 17, 0, 2, 0, 19, 0, 7, 0, 35, 11,176, 1, 5, 0, 7, 0, 36, 11, 4, 0, 37, 11, 4, 0, 38, 11, 4, 0, 72, 1,
- 4, 0, 19, 0,177, 1, 6, 0, 7, 0, 39, 11, 7, 0, 40, 11, 7, 0, 41, 11, 7, 0, 42, 11, 4, 0, 17, 0, 4, 0, 19, 0,
-178, 1, 5, 0, 7, 0,206, 8, 7, 0,207, 8, 7, 0,222, 2, 2, 0, 42, 2, 2, 0, 43, 2,179, 1, 5, 0,178, 1, 2, 0,
- 4, 0, 54, 0, 7, 0, 43, 11, 7, 0,206, 8, 7, 0,207, 8,180, 1, 4, 0, 2, 0, 44, 11, 2, 0, 45, 11, 2, 0, 46, 11,
- 2, 0, 47, 11,181, 1, 2, 0, 42, 0,175, 6, 26, 0,253, 8,182, 1, 3, 0, 24, 0, 48, 11, 4, 0, 19, 0, 4, 0, 37, 0,
-183, 1, 6, 0, 7, 0,106, 0, 7, 0,224, 2, 7, 0, 49, 11, 7, 0, 37, 0, 2, 0,248, 0, 2, 0, 50, 11,184, 1, 5, 0,
- 7, 0, 51, 11, 7, 0,125, 0, 7, 0, 30, 9, 7, 0, 31, 9, 4, 0, 19, 0,185, 1, 6, 0, 27, 0,178, 6, 0, 0, 52, 11,
- 0, 0, 53, 11, 2, 0, 54, 11, 2, 0, 19, 0, 4, 0, 55, 11,186, 1, 7, 0,186, 1, 0, 0,186, 1, 1, 0, 0, 0,245, 3,
-185, 1, 56, 11, 2, 0, 57, 11, 2, 0, 17, 0, 7, 0, 61, 0,187, 1, 7, 0, 12, 0, 58, 11, 0, 0, 59, 11, 9, 0, 60, 11,
- 7, 0, 61, 0, 7, 0, 35, 11, 4, 0, 17, 0, 4, 0, 19, 0,188, 1, 3, 0, 7, 0, 61, 11, 4, 0, 19, 0, 4, 0, 37, 0,
-189, 1, 15, 0,189, 1, 0, 0,189, 1, 1, 0, 82, 1,100, 9,187, 1, 62, 0, 12, 0,107, 3, 35, 0, 50, 0,188, 1, 62, 11,
- 4, 0, 54, 0, 7, 0, 61, 0, 2, 0, 19, 0, 2, 0, 17, 1, 4, 0, 63, 11, 0, 0, 52, 11, 4, 0, 64, 11, 7, 0, 65, 11,
-190, 1, 2, 0, 0, 0, 66, 11, 0, 0, 67, 11,191, 1, 4, 0,191, 1, 0, 0,191, 1, 1, 0,161, 0, 51, 3, 12, 0, 68, 11,
-192, 1, 24, 0,192, 1, 0, 0,192, 1, 1, 0, 12, 0, 69, 11,161, 0,184, 8,191, 1, 70, 11, 12, 0, 71, 11, 12, 0,107, 3,
- 0, 0,245, 3, 7, 0, 35, 11, 7, 0, 72, 11, 7, 0, 88, 0, 7, 0, 89, 0, 7, 0,163, 9, 7, 0,164, 9, 7, 0,239, 2,
- 7, 0,167, 9, 7, 0,186, 8, 7, 0,168, 9, 2, 0, 73, 11, 2, 0, 74, 11, 2, 0, 43, 0, 2, 0, 17, 0, 4, 0, 19, 0,
- 4, 0, 70, 0,193, 1, 6, 0,193, 1, 0, 0,193, 1, 1, 0, 12, 0, 69, 11, 4, 0, 19, 0, 4, 0,159, 2, 0, 0,245, 3,
-194, 1, 11, 0,194, 1, 0, 0,194, 1, 1, 0, 27, 0,178, 6, 0, 0, 75, 11, 4, 0, 55, 11, 2, 0, 76, 11, 2, 0, 37, 0,
- 0, 0, 52, 11, 4, 0, 63, 11, 2, 0, 19, 0, 2, 0, 77, 11,195, 1, 8, 0,195, 1, 0, 0,195, 1, 1, 0, 12, 0, 78, 11,
- 0, 0,245, 3, 0, 0, 79, 11, 2, 0, 19, 0, 2, 0, 77, 11, 4, 0, 80, 11,196, 1, 5, 0,196, 1, 0, 0,196, 1, 1, 0,
- 0, 0, 52, 11, 4, 0, 63, 11, 7, 0,212, 2, 39, 0, 12, 0,161, 0, 99, 3,161, 0, 81, 11,191, 1, 70, 11, 12, 0, 82, 11,
-192, 1, 83, 11, 12, 0, 84, 11, 12, 0, 85, 11, 4, 0, 19, 0, 4, 0,249, 0, 2, 0, 86, 11, 2, 0, 87, 11, 7, 0, 88, 11,
-197, 1, 2, 0, 27, 0, 31, 0, 39, 0, 75, 0,198, 1, 5, 0,198, 1, 0, 0,198, 1, 1, 0, 4, 0, 17, 0, 4, 0, 19, 0,
- 0, 0, 20, 0,199, 1, 6, 0,198, 1, 89, 11, 32, 0, 45, 0, 4, 0, 90, 11, 7, 0, 91, 11, 4, 0, 92, 11, 4, 0, 89, 9,
-200, 1, 3, 0,198, 1, 89, 11, 4, 0, 90, 11, 7, 0, 93, 11,201, 1, 8, 0,198, 1, 89, 11, 32, 0, 45, 0, 7, 0, 67, 1,
- 7, 0, 94, 11, 7, 0, 20, 3, 7, 0,246, 8, 4, 0, 90, 11, 4, 0, 95, 11,202, 1, 5, 0,198, 1, 89, 11, 7, 0, 96, 11,
- 7, 0, 70, 8, 7, 0,245, 2, 7, 0, 57, 0,203, 1, 3, 0,198, 1, 89, 11, 7, 0,246, 8, 7, 0, 97, 11,148, 1, 4, 0,
- 7, 0, 98, 11, 7, 0,128, 10, 2, 0, 99, 11, 2, 0, 72, 1,204, 1, 14, 0,204, 1, 0, 0,204, 1, 1, 0, 12, 0,100, 11,
- 12, 0,101, 11, 12, 0,102, 11, 0, 0, 20, 0, 4, 0, 31, 0, 4, 0, 19, 0, 4, 0,103, 11, 7, 0,104, 11, 4, 0, 92, 11,
- 4, 0, 89, 9, 7, 0,254, 3, 7, 0,247, 2,154, 1, 23, 0, 4, 0, 90, 11, 4, 0,105, 11, 7, 0,106, 11, 7, 0, 57, 0,
- 7, 0,107, 11, 7, 0,243, 2, 7, 0, 98, 11, 7, 0,108, 11, 7, 0,224, 2, 7, 0,109, 11, 7, 0,134, 4, 7, 0,110, 11,
- 7, 0,111, 11, 7, 0,112, 11, 7, 0,113, 11, 7, 0,114, 11, 7, 0,115, 11, 7, 0,116, 11, 7, 0,117, 11, 7, 0,118, 11,
- 7, 0,119, 11, 7, 0,120, 11, 12, 0,121, 11,120, 0, 36, 0,119, 0,122, 11,205, 1,123, 11, 67, 0,124, 11, 67, 0,157, 10,
- 67, 0,125, 11,206, 1,126, 11, 48, 0,167, 0, 48, 0,127, 11, 48, 0,128, 11, 7, 0,129, 11, 7, 0,130, 11, 7, 0,131, 11,
- 7, 0,132, 11, 7, 0,133, 11, 7, 0,101, 9, 7, 0,134, 11, 7, 0,173, 1, 7, 0,135, 11, 4, 0,136, 11, 4, 0,137, 11,
- 4, 0,138, 11, 4, 0, 90, 0, 4, 0, 37, 0, 4, 0,139, 11, 2, 0,140, 11, 2, 0,141, 11, 4, 0,142, 11, 7, 0,224, 2,
- 4, 0,143, 11, 7, 0,144, 11, 4, 0,145, 11, 4, 0,146, 11, 4, 0,147, 11,136, 0,148, 11, 12, 0,149, 11,172, 0, 68, 4,
-121, 0, 11, 0,119, 0,122, 11,147, 0, 37, 3, 7, 0,140, 1, 7, 0,101, 9, 7, 0,150, 11, 7, 0,151, 11, 2, 0,152, 11,
- 2, 0,153, 11, 2, 0,154, 11, 2, 0, 17, 0, 4, 0, 37, 0,122, 0, 13, 0,119, 0,122, 11,138, 0, 17, 3,140, 0, 19, 3,
- 7, 0, 29, 9, 7, 0,155, 11, 7, 0,156, 11, 7, 0, 69, 1, 7, 0,157, 11, 4, 0,123, 9, 4, 0, 15, 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/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 <config.h>
-#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/Makefile b/source/blender/editors/datafiles/Makefile
index d7bb4e7222f..c76014df60e 100644
--- a/source/blender/editors/datafiles/Makefile
+++ b/source/blender/editors/datafiles/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/datafiles/SConscript b/source/blender/editors/datafiles/SConscript
index 8fb2ed6888e..99acd52806e 100644
--- a/source/blender/editors/datafiles/SConscript
+++ b/source/blender/editors/datafiles/SConscript
@@ -6,4 +6,4 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' #/intern/guardedalloc'
-env.BlenderLib ( 'bf_editor_datafiles', sources, Split(incs), [], libtype=['core'], priority=[135] )
+env.BlenderLib ( 'bf_editor_datafiles', sources, Split(incs), [], libtype=['core'], priority=[235] )
diff --git a/source/blender/editors/datafiles/add.png.c b/source/blender/editors/datafiles/add.png.c
new file mode 100644
index 00000000000..14492cfac24
--- /dev/null
+++ b/source/blender/editors/datafiles/add.png.c
@@ -0,0 +1,349 @@
+/* DataToC output of file <add_png> */
+
+int datatoc_add_png_size= 10948;
+char datatoc_add_png[]= {
+137, 80, 78, 71,
+ 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0, 1, 26,253,208,249, 0, 0, 0,
+ 4,103, 65, 77, 65, 0, 0,177,143, 11,252, 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0,
+ 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7, 21,
+ 0, 4, 16,211, 77, 59, 52, 0, 0, 32, 0, 73, 68, 65, 84,120,218,237,125,105,176,101,215, 85,222,183,214,222,231, 78,111,236,
+ 89,173,150,212,106, 13,142,109,217, 42, 75, 88,146, 13,100,168, 96, 82,137,193, 21,160, 10,170, 66,146, 34, 4, 39,228, 15, 14,
+ 96, 18, 6, 67,126, 4, 3, 1, 50, 48, 21, 73, 5, 59, 33, 9, 25, 42, 16, 42, 78, 17, 98, 82, 41, 59,196, 56, 56, 8, 99,199,
+150,236,182, 36,203,150,228,158,251,117,191,233, 14,231,156,189,215,151, 31,123,239,115,238,123,221,158,130,147, 74,170,124, 95,
+119,191,247,238,187,239,220,125,214, 94,123, 13,223,250,214,106,224,139,125,220,113,250,244,185,115,247,221,250,188, 0,248,254,
+ 31,248,161, 24,131, 0,170, 42,170,222,251,202,123, 95, 85,111,251,161, 31, 76, 47,210,183,252,245,239,158,205,166,117,189,104,
+154,166,110,154,166,169,253,112, 99,178,113,230,232,169,151,191,231, 35,225,244,233,211, 0,220, 35,143, 62, 98, 49, 90, 52,130,
+ 52,251,227,127,246,167, 78,223,255,213,247,156,123,228,196,157, 47, 23,234, 29, 71,226,251,222,247,219,126,107,123,254,212,115,
+179,189,121, 20,209,111,253,182,183,135, 48, 24, 58,152, 1,176, 64,157, 77,119,223,246,182, 31,118, 55,195, 61,117, 27, 73,130,
+220,188,231,205, 23,175,187,205, 85, 12, 42,134, 40,159,250,216,111,221,188,250, 73,146,222, 44,170, 40, 32, 4, 84,170,233, 12,
+239,255,176,221,123,234, 74,181,248,175,151, 62,253, 1,231, 28, 72, 15,154,145, 34, 2, 8,136,214,236,211,159,248,245,255,252,
+107,255,250,206,227,227, 71, 94,190, 62, 24, 16,132,103, 52, 81, 16, 2, 72, 61,223, 57,255,225, 95,220,186,248,187,226,252,197,
+171,243, 75, 91,245, 3,119,175,190,234,254, 53, 57,113,223,215, 8, 28, 20, 66,161, 42, 40,170, 16, 56,113, 78, 68, 69, 20,234,
+ 61,141,148,136, 40,170, 2, 3, 4,164, 2, 6, 2, 0, 69, 28,236, 11,218, 46,215,125, 53, 30, 79,238,190,251,110, 85,153,207,
+231,135,247,238,209, 71, 31,253,154, 55,124, 45, 73, 21, 17, 85,231, 92,218,184,119,191,251,221,239,255,157,247,229, 23,189,229,
+ 45,127,157,160, 64, 84, 85, 84,198,227,245,213,141,147,147,149,245, 83,119,189,252,158,251, 95,253, 85,175, 26, 2,112,143, 60,
+242,168, 69, 51, 26,201,251, 94,245,117,175,120,236,219,239,186,239,177, 59,239,121,120,178,113,186,165,190,236,174,193,123,223,
+251, 30,127,254, 83,187,207,125,102, 33, 34,163,225,228,117,127,230, 13, 52,177, 8,243,160,241,230,229, 79, 54, 77,243,246, 31,
+251,113, 87,251,115, 0,204,120,226,174,175,190, 25,159,104, 27, 28, 89,103,164, 52,139,217,147,239,253, 5,198, 96,164, 55,152,
+154, 1, 58, 24, 29,179,136, 79, 93,224,222,180,190,115,245,169,203,159,252, 15,161,153, 58,239, 8,120,154, 17, 2,177, 24, 23,
+102,156, 45,174,255,199,255,242, 99,237,236,194,227,175, 62,114,108,115, 64, 18,132, 91, 57,122, 31, 64, 2, 2,189,243,236,215,
+190,255, 63,254,197,122,113, 35, 26, 63,115,185,249,204,213,250,212,209, 65, 85,137,156, 56,247, 6, 81,133, 40, 0, 17, 8, 20,
+ 42, 16, 39,112,162,206,169,131,122,111, 48, 37, 37,237,148, 10,104, 2, 17, 85, 32, 10, 64,136,210,240,165,122,200,242, 55,223,
+253, 61,223,187, 50, 89, 73,155,148, 62, 68, 69, 69,213,169,136, 56,117, 63,247,115, 63,115,229,202,149,219, 95,232,251,254,198,
+223,140, 22, 65,192,152, 46, 43,128,168, 8, 84, 84, 0, 81, 39,170, 78, 68,156,115,170,234,212, 57,239,238,184,251,143,124,199,
+ 95,252,166,229, 11,249,217,108, 6, 48,105, 42, 0, 89,122, 64,112,230,220,227,103,206, 61,177,190,121,167, 27, 14,213,169, 8,
+ 84, 33,130,129,226, 61,255, 51,126,224, 55,255,222, 63,253,167,239,120,246,153,103, 0,248,182,105, 0, 24, 89, 55,220,155, 5,
+163,172,140,221,230,170, 63,125,246,177, 87, 62,246, 23, 40,131, 74, 12, 34, 98,112, 10,167, 0, 1,195, 60, 64, 25,230,179,253,
+111,253,214, 63,239,156,251, 91, 63,242,195,114,239,195,223, 20,141, 49,166,155, 18, 0, 80,217, 60,254,138, 71,190,242,173, 43,
+235,155, 15,158,193,233,227, 24, 13, 81, 85,112,142,170, 20, 65,160, 50, 54, 79,125,224,151,119,174,127, 90, 85, 85,213, 85,222,
+215,139, 0, 33, 68, 8, 81, 18,170,136, 92,221,120,144,178,177,179,135,143, 60,139,103, 94,224,177, 13,156, 62,137,163, 27, 24,
+ 86, 97,177,127,241,250,165,167,174, 94,248, 72, 61,219, 18, 73,215,209,104,230,137, 8, 18,166, 20, 82, 20, 22, 0,241, 85,213,
+ 26, 68,208, 68,216,220,118,119,247, 62,250,244,139, 97,250, 84,213,124,248,232,202,238,104,232, 42,175,233,240,165, 19,168,102,
+158, 22, 64,133, 70, 82,200, 0, 81,192,102,123,151, 53,134,232, 42, 52,219,207, 62,253,207,175, 93,252,189,182,153,138,138, 64,
+ 68,100, 60,242,247,220, 49, 58,123,122, 60,172,156, 79, 87, 84,147, 19,247,127,109,210,105,166, 79,162, 36,171,193,218,107,254,
+232,223,190,252,194,123, 46,126,234,221,100,164,136, 66, 8, 21, 85, 16, 34, 34,234,146, 64, 69,116,117,226,143,110, 14,229,216,
+185, 63,153,222, 39, 61, 11, 2,233,197, 40, 90, 85,126, 6, 81,161, 64, 53,153, 85, 17, 21, 1,161,170, 42,162,158,180,164,201,
+ 16, 5, 13, 2,154,168, 16, 0, 1, 80,168,162, 4, 52, 25, 70, 5, 35,160, 2, 37, 12, 20, 17,210, 64, 37,254,159,123,200,109,
+159, 61,114,228,200,230,230, 17, 0,117,189,216,222,222,158,205,102, 95,196,133, 30,120,240,193,111,254,230,111, 41,146, 45,194,
+ 23, 85,167,170,234,156,219,222,222,249,233,159,250, 59,159,235, 66, 63,240,131, 63,100,209,152,236, 97, 62,253,154, 54,166,168,
+174,186,116, 49,117,190,242,223,255, 55,255,198,109, 46,244,189,111,253, 62, 48,125,164, 93,146,180,177,146,118, 82,156,168, 56,
+167, 34,234, 92, 54, 36,199, 78,221,251,220,179,231,255,254, 79,253,232, 1, 51, 18, 66, 32,211,230,177, 51, 35,148,178, 34,225,
+120,180, 49, 24,173, 15,135,227,106, 48, 28, 12, 87, 54,143,223,117,242,238,135, 30,126,253,183,188,238,143,253,233,111,249,250,
+175, 58,112, 33,176,215,130,180, 24, 17, 19, 72, 53, 24,223,113,246, 43,238, 58,247,186,245,163,167,225,156, 83,168, 2,130,129,
+ 99, 19,208,182,250, 19, 63,249,211, 63,248,253,249, 54,213, 98,180,238, 65,163,145, 70,154, 13,199, 71,239,123,213,215, 63,240,
+170,111, 24,174,159,137,116, 21,224, 4, 78,160,102,102, 98, 68,136,140,193,126,226, 39,126, 50, 95, 40,198, 24, 45,206, 23,237,
+229,235,243, 11, 87, 22, 91,219,139, 69, 29,134,147, 19,167,206, 62,118,242,206,199, 91,243, 98, 16,210, 8,164, 63,208, 38,128,
+193, 98, 91, 55,245,172,105,155,239,122,203, 91, 0,248,237,253,230,217, 23, 23, 91,219,109,150, 16,164, 26, 84,175,124,232,145,
+245,179,175,174,131, 31, 42, 65, 33, 97,132, 18,102, 70,192,168,211,157,171,251,123, 91,102,134, 16,142, 31, 59, 46, 16, 55,211,
+251,246,102,193,146,152,104, 36, 71,147,211,227,205,135,109,240,138,107,187, 67,175, 50, 25,193,105,138, 67,140,144, 96, 26, 67,
+123,225,249, 15, 92,191,116, 62, 52, 57,158,248,218, 63,245,167,124,221,196,100, 65,178, 18, 9,170,225,134,175,142,182, 54,218,
+222,197,179, 1,251, 51,220,119, 23, 38, 35,163, 83, 21, 32, 46, 46,191,248,228,245,139, 31,155, 79,111, 0, 36, 9,145,166,105,
+ 60,152,124,168, 20,101,132,243, 99, 87,141, 20, 46, 68,236,207,112,225, 42, 99,196,217, 51,178,178,130,122,255,194,214,165,167,
+182, 46, 63, 61,223,187,102,108, 85, 20, 10,132, 0,194, 27,163, 64, 4, 4, 5, 74,163, 40, 28,225, 73, 1, 97,134,233, 28, 47,
+ 94, 65, 27,246, 55,171, 23,226,252,252,214,165,167,235,197, 54, 72, 85,161, 48,235, 49,130,151,164,208, 16, 8, 65,228, 59, 36,
+ 90,131, 10, 2,233,197,246,119,111, 62,249,252, 83,110,250, 91,199, 87,110,140, 71,206, 59, 85,167, 52,117, 74, 51, 75,247,225,
+ 9,210, 40, 42, 66,128, 74, 53, 90, 3,182,149,176, 37,196,108, 49,191,254,226,179,239,186,240,252,187, 69,244,196,145,193,253,
+119, 77, 54, 86,171, 65, 69,117, 4,161, 76,199,158,158,102,162, 10, 50,203,137,108,154,253,182,157,134, 24, 1,105, 23,215, 63,
+249,244, 59,175, 94,248, 61,136, 8,237,218,141,102,119, 22,239, 60, 62, 60,115, 98,180,182,234, 7, 30,128, 66, 4, 48,183,114,
+244,126, 66,178,149, 78,113,163, 27, 78, 86,206,172,172,157,141, 97,122,254,195, 63,183,117,241,131, 0,132, 76,193,109,136,182,
+179, 27,175,108,135,237,189,208, 4,142, 6,234,157, 64,196,173, 28,185, 63,199,171,229, 82, 49,214,195,241, 49, 17,119,225,249,
+119, 93,187,240, 1, 64, 36,187,152,162,179, 96, 12,220,155,199,171, 55,154, 79, 95,170, 47, 92,107,182,247,131,156,184,239, 13,
+ 57,134,129,230,112, 38,219,169,180, 1, 34,162,201, 14,228,119,234,188, 8, 20,146,194, 45,167, 42, 30, 36,146, 34,137, 37,255,
+195,226,125,196, 8, 65,242, 17, 36,144,162, 58,146, 20, 8,169, 76,254, 8, 74, 3,148,176,180,237,204,102,137, 66,136, 17, 52,
+ 19,144, 20,208,104, 0, 73, 3,105, 32,196, 0,136,129,217, 92, 80, 8, 37, 1,210,104, 4, 65, 51, 3, 97, 16, 2, 16, 90,122,
+131,178,140,178,120, 67, 54, 5,146,226,206,178,134, 47, 63,190,120, 63,219, 61,238,187,239,254, 87,190,242,149,231,238,191,255,
+232,145, 35,253,179,204,167, 64, 82,240,156, 63,233,246,246,246, 51,207,124,226,163, 31,253,200, 39, 63,249,201, 47,205,130, 86,
+ 87, 87,191,249,155,191,229,244,233, 59,205,146, 42,160, 56, 59,233, 34, 37,148,232, 74, 14, 69,210, 82,220, 88,114,206,162, 16,
+248,170,250,181,127,251,111,127,255,247,159,252,194,149, 67,222,244,166, 55,189,242,149, 15,153,145,232, 60,255,129,223,150, 18,
+196,247,139,232,226,250,195, 75, 74, 9, 71,191,172,178, 80, 85,167, 43,235, 39,254,193,223,253, 59,159,122,254,153,207,179,160,
+239,254,158,183, 34, 45,228,150,165,148,247,197,210,199,129,213,164,229, 12,134, 19, 85,117,126,172,206, 57,231,157,115,170,206,
+ 57,175,170,174, 26,170,115, 43,235, 39,156,115, 39, 78, 63, 56, 24,142, 4, 6,132, 55,253,137,151,205,166,123,183, 93,144,143,
+161, 45,139,232,147,154,165,213, 8, 15, 44,168,223, 60,167,213,198,209,179,206, 87, 71, 78, 62,224,253, 96, 60,217,116,110, 32,
+ 94, 83, 4,146,164,227,156, 83, 21,231,135,170, 58,158,172,169, 83, 21,138,226,151,126,229,183, 62,243,204,127,255,165,119,252,
+227,231,158, 61, 44, 48, 31, 98,196,109, 55, 56, 25,199,108, 20,187, 64, 91, 4,244,131,201,218,230, 25, 95,141, 79,221,253,136,
+211,106,178,121,198, 59, 55, 24,173,164,183, 87,133, 38,169, 74,231, 0,146,143, 17, 51, 4,144,145,209,208,198,248,237,223,254,
+151, 85,229, 31,253,195, 95,124,225,133, 23,150, 37, 20,150, 78, 79, 94, 90, 8,121, 65, 16,120,167, 16,120,149,116,175,222, 15,
+ 39,171,167, 78,223,251,122,239,135,155,199, 95,238,188, 2, 74, 5, 4, 70, 56, 64,144,194, 60, 40, 64,129, 2,102, 76,246, 26,
+150, 64, 16,198,104,161, 13, 34, 20,240,205,127,229,175, 14,170,193,247,151, 64,205,183, 33, 2,136, 70, 35, 44,178,137, 96,228,
+116, 30, 9,152, 1, 34,163,129,170,202,100,164,222,235,198,209, 59,215,142,223,187,178,126,199,230,137,215,136, 32,194,153,137,
+ 23, 83,235, 82, 15, 73,150, 88, 0, 19,106, 74,237, 69, 65, 52,145, 16,145,216, 2, 49, 54,139,208, 46, 58,221, 55,179,183,191,
+253,199,127,229, 87,254,197,249,243, 31,247,219,187, 45,193,235,219, 97,119, 63, 44, 90,219,159,197,164,174,201, 7, 82,147, 83,
+ 98, 85,141,212,185,151,189,226,212, 67,167, 94, 15,142,230, 11,167, 34,195, 17,132,160,106,114, 95,138,130,252, 48,237,151, 88,
+142, 67,210,135, 0,220,223,185,210,212,123,251,123, 91, 49,198,124, 36,105,102, 74,229,159,251,115,223,250,219,191,253, 94,255,
+129,167,183, 51,144, 84,206, 15, 13,132, 37,127,156, 86, 3, 96, 56, 57, 85,141,214,107,220,121,225,250,113, 85,255,194,150, 12,
+ 42,220,127, 26,206,225,142, 99,240, 30,222,193, 57,164, 32,201, 72, 65,167, 67,140, 80,128,136, 45,192,139,159,250,240,246,214,
+167,218,122, 63,198,168,170, 49, 71,242, 76,136,211, 31,253, 99,127, 60,185,233,172, 1, 2,100,208, 68,138, 78, 37,125,166, 12,
+134,155,147,213, 83,163,209, 49, 87,173,136, 72,221,178,105,229,233,231,161,138,203,215,225, 60,238, 61,141,149, 49,134, 21,171,
+ 10, 34,160,118, 7,146, 8, 83, 51,123,233,217,247,212,245,206,206,245, 23,234,197, 78,202, 83, 73,150,228,162,124,147, 0,191,
+ 44,161, 18,173, 80,141,121,203,160, 70, 10, 4,166,110,236,171, 53,232, 80, 68, 73, 41,201, 10, 72, 92,189, 97, 34,114,115, 7,
+170, 56,115, 10,199,143,200,112,128,149, 9, 24,102,123,219,207, 89,187,120,233,185,247,153,181,139,253,235,198, 40, 20, 81, 80,
+114,198,164,162,233,254, 37,137,136,244, 37,234,200, 65,184,136,128, 2,152,164, 80, 68, 4,176,228,187, 72,141,166,173,165,165,
+ 3,130,198,160,128, 87, 5, 56,171, 65,193, 71,207, 95,139,205, 46,218,231,221,226,127, 56,109, 55, 7,215,147, 65,202,217, 99,
+178, 6, 68, 74,248, 21,106, 26,147,173, 19, 32,237,157, 55, 82,200,236, 26, 8,100,156, 82, 82, 92, 45, 72,103,147, 22, 27,179,
+133, 67,235, 64, 64, 98,222,103,144,108,219, 25, 16,175, 92,248,157,122,190,117,243,234, 71,247,183, 63,157,246,222,123, 61,190,
+ 81, 85, 78,206,158, 25,123, 39, 43, 35,239, 52,157, 18, 21,137, 16, 5, 98, 62, 53, 42, 18, 41, 34, 84,241,194, 20,149,167, 79,
+ 34,198, 2, 58,228,141, 33, 1, 97,211,238,235,124,187,105,166, 22, 3, 68, 40, 94, 45,198, 48, 51,107, 94,122,246,215, 99, 59,
+189,113,237,163,109,189, 71,198, 28,124, 65,219, 54, 94,217, 50,136,220,216,107, 85,228,142, 99,195,170,146,227,155,131,241,200,
+ 57,213,202,211, 68, 5, 17, 16,137,146,129, 22, 83, 79, 68, 50,137,199,178, 68,105,232, 16, 36,177,116, 84,218,197,142, 16,205,
+ 98,187,105,230,206,185,170,242,117,179,247,233,243,255,198, 98,125,227,202, 7, 99,168, 99,108,242, 70,139, 26, 33, 18, 9, 53,
+163, 8,166,115, 3,100,209,152, 40, 46, 94,107,188,151,201,200,175, 77,220,104,224,142,109, 86, 78,101, 56,112,217,176, 43,124,
+138, 95,211, 46,229, 80, 62, 5,159,154,221, 91,138, 57,235,197,141,208, 76, 23,211,171,177,221, 90, 76,247,103,123,159,105,155,
+189,107, 23, 62, 96,108, 67,189, 7, 49, 64,133,100, 50,142, 0, 68, 73, 19,128, 84,139, 70, 21,107, 32, 64,219,182, 34,178,183,
+ 31,174,123,245, 78, 94,188,234,156,200,120,232, 84,117,117,236,212,105,194,185, 41, 16, 49, 17, 49,152, 80,132,233, 19,132,198,
+180,139,177,217,143, 50,187,121,253,169, 24,235, 24,102,211,189, 75,180,166,153, 95,167, 20, 91, 69, 82, 41, 57, 78, 86,154,101,
+136, 22,150, 98,119,192, 8, 68, 83,161,197,168,104, 12, 16, 76,163, 2, 85,229, 68,100, 52,116, 78, 85, 78,156,251, 26, 72,246,
+ 91,233, 48, 9, 20,146, 48, 85, 73,199, 95,179,237, 77,175, 73, 18, 45,128, 41,132, 40,160,151, 16, 84, 42, 21,233,137, 37,212,
+ 48,199, 14,154, 3,154,156,123,101,159, 39, 76,249,139, 0,226,139, 62, 51,191,187, 8,203, 57,207,239, 70, 80, 4,232,173,143,
+ 73,246,222, 72, 91,157,206, 5,169, 37,107, 49, 88, 74, 34, 4,106, 57,235, 80, 1,204, 44,103,165, 5,181,235,238,156,164, 0,
+ 84,120, 36, 88, 78, 37,225, 10, 98, 38,157, 23, 1, 45,131,136,217,152,102,153,164,200, 41,235, 61,192, 4,229, 41, 59, 47,150,
+180, 79,146,102,102, 11,151, 19,187,188,199, 2, 24, 69, 4, 41,223, 53,129, 82, 83,154,150, 12,145, 17,100, 78,160,146,203, 32,
+251,147, 15, 34,133, 3,164,229, 56,151, 57,218, 39, 65,163, 0, 52,144,201,138,166, 31, 10, 97, 52, 8, 96,197,240, 3,128,209,
+ 74,120,154,227, 29,230, 61,226,109, 34,196, 47, 63,190,252,248, 82,103,174,125,236, 93,249,201,120, 50, 24, 12, 70,163,113, 85,
+ 85,200,161,119,187, 88,212,117,189,152, 78,167, 49, 85, 61,254,143, 46,168,170,170,215,188,230,145,151,191,226, 21,103,239, 57,
+235,124,169, 56, 82,160,249,156, 73, 42, 91,136,168, 42,201,231,159,127,254,227, 31,123,250,131, 31,252, 96,211, 52, 95,226, 5,
+125,221,215,191,233,161,135, 30,170,124,197, 14, 55, 94, 42,250, 28,202, 28,187, 12, 31,128,115, 78, 84,154,166,249,208, 31,252,
+193,187,222,245,239,255, 80, 11,242,222, 63,244,208, 67,111,124,227,215,177,139, 93, 75,209, 2, 75, 41,253,114,134,127, 48,179,
+ 63,152,218,139,168,234,238,238,238,207,253,236,207, 76,167,211, 47,110, 65, 71,143, 30,125,227, 27,223,120,231,157,119, 37,204,
+104, 41,154, 94,122,209,114, 98,191,244,239,103, 93, 83,138, 78, 1,231,221,213, 43, 87,254,217, 47,255,242,141, 27, 55,190,160,
+ 5,125,215,119,125,215,120,188, 82,204,231,225, 12,191,207,228,251, 36,122, 89, 74, 5,237,211,146,172,246, 0,195,242,102,202,
+104,188,246,210,133, 75, 63,243,119,127,236,243, 46, 72, 7,195, 81, 8,193,204,130,133, 37,100, 63,255, 49, 51, 35,105, 70, 99,
+164,145,100,122, 38,166,111,141, 22,105,102, 49, 50, 65,124, 49,129,124,229, 58, 76,215, 33,193,135, 30,126,244,157,255,226,215,
+215,214, 54, 62,207,113,142, 49,230, 13,226,109,138,196,203, 91, 3,129, 45,107,181,193, 32,206, 87,174, 26,169, 58, 95,141, 84,
+213,251, 1, 84, 42,239, 5,206, 13, 42, 85, 55, 28,175, 15, 71,171,163,201,198,177, 83,103,157,226, 93,239,125,238, 95,253,242,
+207,190,227, 23,222,254, 89,233, 3,143, 63,241, 4,139, 63, 5,187,130, 4, 75, 56,125,232, 28,242,208,151,170, 78,157, 23,113,
+234,135,162,206,249,129,170, 83, 55, 80,231,156, 31, 57, 87, 13, 70,107,195,241,218,112,188, 62,222, 56, 45,213,104, 88,141, 30,
+126,244,137,141,113,252,192,239,190,255,246, 18,162, 25, 59,160,238,224, 59, 38,188, 33,199, 17, 7, 87, 69,216,234,250,233,225,
+202,198,120,229,232,218,198,105,239,134,163,149, 77, 17,129,115, 34,112, 78, 1,120,231, 68, 68,125,165,190,170,188,247,162, 66,
+154, 32,154,222,125,247,217, 31,251,241,159,232,104, 44, 7,183,204, 12,183, 71,170,208,233,109, 31,195, 44,217, 34, 63, 92, 25,
+142, 54, 39,107, 39,215,143,220,235,252, 96,188,118, 76, 21, 16, 39,154,147,232, 92, 50, 75,166, 52, 33, 16, 34, 77,164, 69, 49,
+ 82,196,253,232,143,190,253, 71,126,228,135, 15, 43, 53,115, 97,234,115, 62, 82,157,175,188,106,117,243,174,205,227,247,111,158,
+120,112,243,196,203, 86,214,239,210,106, 85,252, 4, 76, 81, 39, 4, 80, 32, 7,164,217,180, 51,193,220,209, 64,131, 89, 73,223,
+ 85,127,224, 7,127,232,150, 5,125,182,245,116,133,194,172, 98,236, 10,135, 27,199,206, 30,187,227, 21,199, 78, 62,116,252,142,
+ 87,175, 31,185,183, 26,109, 86,195, 21,131, 26, 84, 65, 39, 80,129, 10, 28,224, 4, 10,168,229,122,140,177,160, 17,150, 47,186,
+182,186,246, 29,111,254, 43, 7, 22,100, 75,143, 24, 99,176, 88, 55,113, 81,199, 69, 29,230,139,176,168, 99,211, 90,104, 99, 58,
+236, 85, 53,169,134,171,131,209,230,112,180,233,170, 1, 68, 82,222,107,214, 85, 57,229, 22,189,135, 9,152,194,225,180, 22,163,
+ 89,136,161,181,104,209,226,185,123,207,189,246,181,143, 45, 41,117,175, 61,108, 3, 9, 76,103,201, 34,129, 20,239, 48, 28, 58,
+175,178, 58, 1,225,215,142,157,115,110,120,252,244,171,135,163, 99,162,174, 53,117, 66, 7, 10,160,204,137, 89, 78, 77,150, 52,
+ 49,249,226, 54, 37, 14, 22, 17, 99,104,219, 16,154,196, 56, 50,197, 55,126,211, 55,125,236, 99, 79,167,170,179,134,104, 33,218,
+188,137,243,133, 77, 23,113, 54,143,243, 38, 46, 22,182,168,109, 81,219,188,177,249,194,102,139, 56,157,219,108,193,104,131,136,
+ 65,104,157,153, 68, 75, 80, 80, 65,147,123, 80,185,132,218, 25,140, 65, 9,208,211, 86,197, 16, 67, 46,167, 38, 43,107, 22, 66,
+248,158,239,125,107,150,208,254, 60,132,192, 23, 46,215,102,216,222,109,131, 45, 25,196, 46,155, 18,169,170,209,112, 40,235,247,
+190,102, 60, 88,105,184,234,163,175, 64, 87, 28, 72,183, 77,180,164,217, 64, 70, 77,178,127, 38,197, 32,140, 97,122,243, 66, 8,
+243, 24, 3,141, 80, 51, 40,205,156,234,112, 56,124,236,177,199,159,124,242,247,180,109,173, 13, 22, 35, 99,140,145,185,188, 67,
+ 35, 99, 49,254,201, 49, 16, 70,196,232, 98,240, 77,171, 33, 32,152,152,193, 44,171,170, 49,229, 29,146, 21,214, 16, 13,102, 98,
+ 6, 26,104,128, 49, 70,134,216,132,208, 46,185, 40,163,101,162,213, 55,124,227, 55,138,136, 91,248,251,175,220,104,166,243, 56,
+175, 45,153, 36,233,242,167,146, 87,169, 27,172,110,220, 83,141,142,143,143,125,229,188, 93,223,218, 31, 93,220,146,182,149,166,
+ 69,140, 24, 84, 41, 77, 77,208,113,170,133, 25, 75,213, 51, 66, 34,148, 70,139,161,153,109,127,234,227,239,217,222,122,169,158,
+222,204, 64, 66,249, 75,128,198,245,141,117, 95,183,177, 0,246,121,135,204,172, 56,243,156,183, 2,132,122,168,143,166, 49,184,
+166, 17,117,210,182,104, 67, 18, 3, 0,152,101,208, 51, 49,124, 36,149,254,200, 92, 94, 51,130,140,209,154,122, 78, 11,145, 38,
+ 36, 12, 16,131, 10, 75,186,248,216, 99,143,251,162,114,249,192, 22,220, 74,129,156,221, 2, 16,245,163,209, 49, 95,141, 85, 39,
+168, 70,173,137, 24, 46,223,192,214, 46, 86,134,216, 88,195,120,136,211,199,161, 14,195,129,169,193, 84, 53,221, 14, 4,214,210,
+218,197,108,235,218,165,167,219,118, 58,221,189, 2,144, 22, 9,168,104, 90, 47,149,206,204, 68, 99,140, 62, 21,244,216,131,122,
+ 9,143, 77,242,180, 92,111, 37,157, 31,168, 31,168, 58, 39, 26, 76, 33,104, 26,180, 45, 96,112, 14,102, 8, 17, 46,165,175, 10,
+102, 16, 69,146,232, 24,217,180,139,217,222,181,182,157,183,237, 66, 74, 93,192,204, 50,222, 96, 48, 85,129,137,137,207,105,111,
+138, 44, 88, 96, 4, 90, 23, 70,103,200, 88,134, 34, 35,129,130, 78,164,175,139, 52,129,187,251, 88,212, 32, 81,121,156, 62, 41,
+206, 97, 52,130, 87,169,231,215, 44, 54,211,221, 75,179,189,171, 77,189,189,189,245, 18, 45,118, 73, 62,151,172,167, 40,105, 6,
+ 17,138,248, 68, 70,147, 34,162,132,100, 88,190, 59, 74, 10, 5, 68,170,106,160, 90, 37,168,205,172, 3, 88,208, 6,180, 1,139,
+ 6,117,131,225,128,235,235, 90, 85, 24, 84,136, 64, 61,223, 13,237,254,246,245,231,183,175, 63,111,113,177,152,109,119, 64,166,
+230, 90,112,151,238, 51,107, 94, 66, 97, 19,170,144,236, 9, 65,201,203,201, 43, 75, 74,150, 23, 81,200, 3,198,254,130, 34, 48,
+162,141,100,195, 75, 87,247,188,114,215, 93, 84, 13,113,254,162,112, 54,221,189,218,212, 51,179, 96,198, 4, 18, 74,194, 9,173,
+184, 95, 65, 18, 79,170, 49,248, 4, 83,128,160, 24,165, 64,190, 48,228, 50,119,137,217,168, 6,137,233,204, 8,132,136, 9, 42,
+ 83,113, 68, 20,180, 45,208,196,235,215,174,198,216, 14,230,191,137, 56, 93, 31,222, 24,250, 6, 61, 28,156,240,164, 2, 53,241,
+150,192,143, 36,233, 83,169, 61, 31,251,140, 46,177,104, 36, 19,140, 9,163,106, 76,112, 93, 86,174,206, 51,208, 32,134, 16, 67,
+179, 71,107,247,247, 46, 34, 54,139,197, 84, 57,115,177,105,125,168,188,122,167,162, 41,106, 19,130,122,112, 29, 90,236, 16,204,
+ 50,253, 51, 45,158,146,228, 83, 32,106, 88, 78, 41, 72,192, 98,104, 69,156, 35, 61,208,230, 3, 9, 5,132,161, 14,117, 91,111,
+ 93,189,240, 59,161,157, 93,126,225,189,102, 49,173,247,232,134, 31, 84,122,226,232,224,216,122,229,189,142, 71, 9,159,147,140,
+136, 21,227,146,149, 89, 85, 0,152,249,124, 54,153,128, 55,233,160,188, 36, 48, 19, 75, 44, 60, 50, 50, 43, 56,197, 18,202, 72,
+130, 33,180, 22,103,109, 59, 11,205, 44,196,133,197,152,113,102, 97, 48,186,104,109,107, 77, 48, 18,222, 65, 68,124,166, 70,106,
+210, 88,201,136,161,116, 4, 45, 15, 2, 89,141, 37,235,119, 66, 62, 37,147, 45, 40, 52,139, 77,189,107, 22, 34, 91,137, 21,212,
+ 9,148, 97, 65,134,221,155, 31,191,118,225,119,219,102,247,198,213,167, 4, 52, 11, 29,203, 99,103, 47,136, 96,103, 26, 63,115,
+181, 30,143,220,137,205,170,242,122,234,216, 80, 5,131, 10, 48, 45, 66,234,107,171, 98,230,151,162,233,132,188, 41, 18, 66,151,
+115,231, 84,242, 50, 24, 97,153,225,196, 84, 14,161,129,209, 98, 29,195, 52,182, 51,139, 11,136, 74, 34,110, 83,141, 6, 85, 49,
+137,209, 90,145, 42, 88, 8, 20,201,212,238,104, 84,137,170, 46,169, 98,178,166,132, 66,196, 23, 38, 34, 19,104, 42,146,128,116,
+208,164,212, 25, 64,139,139,197,117, 31, 38,117, 61,171, 6,234,117,226, 33, 23, 47,254,247,157, 27,159, 88, 76, 47,237,221,124,
+ 46, 29,144,132,196, 38,142,135, 8, 64, 35, 52, 68, 68, 11, 77,171,211, 69,116,162, 87,182, 26, 85, 57,186, 81,121,213, 19, 71,
+ 6,131,129, 86, 94,188, 71, 10,127, 65,250,172, 66, 20, 17, 73,168,107,222,221, 68,191,177, 12, 9,211, 90, 90, 16, 48, 25,113,
+131,180,205, 94, 51,223,106, 22,219, 49,204, 82, 70, 65, 41, 54, 44, 49, 79, 52, 99, 5,132,136, 89, 99, 42, 46, 66,232, 84, 87,
+198, 46, 56, 70, 51,139,160,115, 76,104, 41,212, 72,143, 84, 72,144,242, 9,128,149,114, 34,146, 73, 16, 48,204,167,215,188,159,
+182,245, 13,176,222,186,254, 33,182,139, 27, 87, 62,188,191,243,124, 12,141,145,154,252, 78,166,228,228,178,168, 21,168, 56, 21,
+ 40,149,198,168,139,198, 20,188,178,213,136,224,230,110,171, 78, 71, 3,231,157, 12, 43, 55, 26, 58, 81,245, 89,201,243,121,202,
+ 50,145,124,240,146, 73, 35, 45,134,118, 10, 32,196, 5, 90, 55,223,251, 76, 91,239, 46,102,151,155,197, 77,201, 97, 74,241, 60,
+ 6,104,142, 65, 68,144, 76,138, 8,196,104, 42, 10,179, 32,166,108,231, 16,193,108,110, 20,140,134,206,171,140, 71,126,101, 76,
+ 17,113,147, 35,247,149,178, 60,150, 73, 11, 37, 78,227, 82,118, 24, 73,206,118, 95,220,221,126,126, 49,189, 90,207,111, 48, 46,
+ 58, 6, 45, 59, 32,160, 68,249,194,196,139, 44, 87,101, 49,212,217,104,119, 65,152,144, 8, 68,140,168, 91,200,137,251,222,144,
+209,245,194, 19,200, 16,124, 71, 33,101,103,151, 10, 96,149,173, 16, 1, 45,231,170,251,189, 30,173,201, 92,170, 62,248, 83, 1,
+168, 93,129, 35,195, 60,204, 5,198, 76, 76, 86,166,234, 69,114, 95,169,150,211, 69,176, 41, 89,205,108, 11, 36, 75,213,177,243,
+146,151, 76,108, 46,116, 55,159,171, 29,229, 56,119,136,127, 42, 77, 8,179,156, 96, 29,225, 36,139, 56,215,253, 82, 52, 85,172,
+ 82,170,119,100,118,188, 24,122,139, 96, 93, 6,204,194, 32,131,165, 93, 74, 60,206,206,184, 49, 87, 94,146, 95, 68,255, 27,150,
+171, 55, 20,150,178,106,249,113,162,151, 9,193, 68,253, 43, 64,140,228, 60,220,186, 0,140,217, 36, 30,224,113,152,101, 12,150,
+137,251,128,190, 72,154, 3,153,174,240, 46, 69, 28,217, 75,148,242, 79,174, 46, 39,146, 91, 82,128,130,100,168,100, 1, 0, 29,
+ 12,146, 10, 76, 61,220,201,206, 82,151,197,161,216,151, 84,149, 75,223, 10, 50,253, 52,253, 50,179,189,103,174, 48,230,186, 76,
+246, 71, 44, 53,154, 62,211, 37,105, 98, 90, 66, 88, 90,113,112, 76,219,151,235, 59,214, 99, 69,221,121, 98,146,145,100,134, 94,
+ 33, 68,100, 33,116, 50, 74, 2,206, 94, 56, 29, 18, 90, 6, 28, 50, 22, 32,121,105,198, 82,142,211,156, 63, 37,241,166, 96,192,
+186, 69, 48,191, 43, 73, 24,186,194, 83, 86, 96, 74,103,138,211,161,204,203,183,162, 4, 37, 76, 65,170,219,178, 48,227,129, 82,
+223,203,188, 21, 17, 41,135, 84,147,208,243,153, 32, 4,102,217,246, 51, 7, 2,233,224,152, 88,206,174,242,206,101, 81, 33, 71,
+ 76,233, 94,210, 55,233,188, 72,222, 56,150, 29, 78, 54,152, 57,241, 98,177, 69, 7,200,118, 95, 46,152,125,249,241,229,199,151,
+ 31,255, 95,212, 91, 63,215, 37, 68, 86,215,214,214,215,214, 86, 86, 86, 55, 54, 55,142, 30, 57,186,177,185,185,177,190, 62, 89,
+ 89, 93, 89, 25, 15, 6,195, 84,163, 90,170,228, 28, 40, 90,132, 16,230,243,217,238,222,238,222,222,254,213,171, 87,246,247,246,
+119,118,119,246,118,119,183,183,183,247,246,246,254,255, 19,208,100, 50,121,224,193,151,157, 57,115,230,212,201,147, 27, 27,155,
+147,149,137,247, 30,196,109, 13,190,244,248,210,161,226,201,193, 47, 58,114,235, 45,124,232, 16,194,108, 58,219,217,221,185,120,
+241,194, 51,159,248,196,179,207, 60, 19,190, 68,149,239, 47,153,128, 78,158, 60,249,200,163,143,190,234, 85, 15, 15,135, 3,178,
+143, 42, 62,255,117,115, 72,135, 37, 92,170,196,233, 57, 4,207,217, 74,142,141,229,128,164,138,188,164,212, 77,165, 64, 0,170,
+170, 47,190,248,194,127,125,239,123,207,159,255,184,153,253, 95, 21,208,234,234,234,169, 83,167, 94,253,234,135, 31,120,224,193,
+132,232,176, 43, 12, 47, 85, 82, 14,201, 72,110,171, 52, 34,135, 74,200, 75,223,222,194,161,191,245,223,131, 93,115,146,152, 89,
+178,204,132,204,181,248,155, 55,111,190,239,191,253,246,249,243,231,183,182,182,254,143, 8,232,228,201,147, 15, 61,244,208,185,
+115,231, 78,158, 58, 21,163, 37, 66,234, 65,161, 16,248, 92,106, 35,203, 6,105,201,210, 44, 63,127,192,248,224, 54,180,254,219,
+146, 1, 62,223,147, 9, 93, 99,162,251, 3,114,225,194,133, 15,126,240, 67, 79, 62,249,187,237, 31,130,230,113,224,214,222,246,
+182,183,213, 77,139,142,209,213,225,142, 75, 24,228, 23, 38,231,131,119,123,232,201,219,188,236, 16,109,227,115,168,210, 33,234,
+194,178,152,186,211, 7,136,168,234, 96,184,178,186,126,204, 15, 6,243,217,236, 55,127,227,223,255,167,223,248,245, 63,172,128,
+190,247,173,223,215, 17, 78,216, 17,220,110, 35,149, 91, 44,207,114,105,250,160, 92,150,158,188, 85,149, 14, 30,194,204,194,112,
+ 29,123, 68, 83,123,112,106,149, 47, 60,141,130, 20,116, 56, 0,156,250,114, 1, 85,239,157,122, 17,129,202,104,180,182,118,228,
+184,247, 67, 81,161,153, 89,168,231,251,191,248,179, 63,253, 7,191,255,254,255, 61,107,229, 51, 29,234, 80,107,201,237,106,247,
+ 60,100,177,114,203, 87,247,100,161, 96, 30,122, 29,115, 69,167, 35,157,151,242, 91, 78,246,212, 87,206, 15,146,125, 81,245,206,
+ 15, 69, 93,146,139,115, 94,213,229,217, 2,234, 82, 99,118,254,166,170, 68,188, 0,206,185,193,104,109, 56, 94, 77,204,160,225,
+120,125,229,200,233,193, 96,156, 50,126, 21,170,224,231,255,217,159, 9,237,244, 55,126,237, 29,239,252,197,159,188,126,253,218,
+ 23, 37, 32,247,196,227, 79,228,106,124, 79,142,228,173,162,225, 23, 96,226,229,214, 39,121,219,103,161,174,114,190, 82,173,212,
+ 85,190,154, 12, 70,171,126, 48,241,213,200, 87,227,225,104,173, 26, 76,170,193,216, 15,198,213, 96,226,135, 19,239,199,190, 26,
+251,106, 84, 13, 39, 85, 53, 76, 47,115,213,196,251,161, 86, 67, 95, 13,171,225,138, 31,140, 85, 43,184,202, 87,227,193,104, 69,
+213,119,214, 34, 97, 51,109, 27,215, 87, 7,175,121,245, 31,121,237,107,191,226,242,165,203, 55,110,108,125,193, 26,116,144,238,
+ 33,135,197, 33,183,149,143,116,172,216, 4, 93,201, 18,178, 86, 78,200,210,200,132,254, 87, 0,186,193,104,117,227,204,120,229,
+136, 58, 7,113, 43,171,199,215, 54,207, 56, 63, 20,129,186,193,104,188, 38,110, 80,184, 81,233,148,101, 28,171,199,237, 50, 22,
+ 80,174, 92,222, 79, 20,218, 79,102, 0, 4,129, 4,160, 32,225,162, 41, 41,171, 43,107,111,126,243,119, 70,198,127,242,142, 95,
+122,238,185,103, 63,191,128,184,116, 50,249, 89,104, 65,183,213,151,108,178,164,255, 98, 73,107,114,145,121,169, 74,152,202,192,
+169, 29,220,171,175,212, 15,211,236, 18,113, 3,209, 74,164,130, 80,212, 67, 60,196,105,198,123, 18,210,157,111,152, 69, 28,253,
+137,205,149, 60,233, 89, 11, 64,223,139, 44, 5, 7, 17,152,193,140,153, 35, 98, 17,192,119,188,249,205,211,233,244,215,126,245,
+ 87,207,159,255,248,231, 20, 80,239,175, 14,221,229, 45,225,239, 45,141,103,165,247,120,169, 15, 25,165,172,211,129, 43, 4, 68,
+ 70,227, 35, 71, 79, 62, 56, 24,175, 11,224,171,201,250,209,179,147,181,227, 10, 7, 64,212, 81,171,210,144, 47, 80,165, 32, 38,
+146,143,192,149,230,171, 30,204,237, 33, 93, 20, 24,121, 73,199,153,138,249, 61,172,153,160,214,196, 93,233, 1, 53, 34,198, 56,
+ 26,141,190,237,219,254,210,197, 75, 23,255,213,191,252,149,207, 22, 67,185,175,120,237,107, 59,122,246,210,159, 91,190,235, 73,
+ 69, 40, 84, 28, 98,169, 93, 8,135,225,166, 66, 10, 23, 8, 80, 13, 86, 39,107,119, 12,134,171,226,188,175, 70,227,149,227,195,
+225,134,136, 87,173,212,121,136,131,184,212,188, 88,106,230,146,213,174, 72,167, 31,105, 33,144, 3, 49,105,167,182, 2,202,146,
+170, 39,150,120,161, 8,197,176,191,125,105,239,230, 69, 11,109, 33,202, 68,144,102,182,182,182,254, 85, 95,253,213,171, 43,107,
+159,248,196,249,219,104,144,153,221,222,167,103, 22, 60, 0, 68, 67, 19, 44,132,172, 39,198,238,206,197,169,120,159,239, 75, 69,
+ 6, 3,241,197,207,140, 38, 71,198,171,199,156, 42,160, 43,235,167, 78,220,249,154,241,202, 81,166,159,185,113,164, 79,129,129,
+ 26,114,115,124,238, 32, 64,186, 81, 41, 29, 16, 7, 27, 36, 58,130, 3, 82,121, 10, 75, 37,134,164,229,109,198,203, 69,193, 4,
+221, 2,128, 5,179, 16, 66,211,182,139, 67, 76,217,104,209,104,143, 61,246,216,227,143, 63,254,243, 63,255,179,151, 47, 95, 62,
+160, 65,143, 62,250, 40,110,231,210,141, 76,196,155, 84, 28,174,155, 68,224, 97, 36,163, 49, 24, 83,207, 96, 23, 67,165,193, 65,
+ 94,203, 0, 11,209,193,112,109, 56,220, 80, 55, 82, 63, 24, 78,142,172, 31, 61, 59, 24,110, 58, 29,168, 27,138,250, 82,211, 43,
+ 92, 24,145, 37,160, 89,250, 48,169,107,253,232, 66, 76,233, 42,120,169,246, 91, 90,223,164,156, 29,246,142, 51,151, 7, 0,134,
+176,119,243,226,206,214, 75, 49, 52,125,160, 71,118, 50, 79,143,215, 61,241,250,241,100,146,134,234,100, 13,154,205,115,114, 28,
+141,137, 50,148,212, 50, 4, 46,106,235,240,229, 24,151,109,242, 18, 56, 45,105,104,149, 0, 80, 17, 95, 57,239, 28, 64, 95,141,
+ 78,159,217, 56,179,122,255,192, 79, 0,120,217,104,218,137, 86, 46,121, 28,151, 76,246,114, 18,194, 91,243, 66,201,230,177, 35,
+252,116, 85,132, 82, 2,224, 18,229,100,201, 48,228,222,146,104, 33, 44,118, 67,168, 69, 16,218, 69,189,216, 55,139,180, 92,253,
+235, 26,252, 98,161, 14, 27, 64,229, 87,190,254, 43, 79, 28, 63,241,239,254,221,175, 38,176,197, 55,109, 58, 98, 18, 34,119,167,
+ 97,111, 26, 19, 63,171, 14,156,205, 99,180, 91,124,152,176,200, 60,251,150, 37, 2,168, 58,103,170, 17, 34,195,161, 77,142, 76,
+ 78,224,164,234,170, 10, 34,198,141, 13, 7, 49,119,252,164, 73, 54,197,104,200,225,196,247, 22,198,133, 90,103, 88, 74, 53,106,
+233,153, 67, 94,183,227,208, 88,180,186, 93,196,118, 10, 90, 12, 77,104,235, 68, 36, 75, 81,137, 38,114, 85,105,133,164,136,138,
+208, 44,152, 61,240,192, 3,223,249,157,127,237,157,239,124,199,205,155, 55,221,145, 59, 94,190, 63,179,253, 89,216,159,197,189,
+ 89,156,215,214, 70,134,104,109, 96,176,174, 57, 53,247, 31,165,138, 81,142, 75, 74,109, 41, 91, 0, 66,197, 85,131, 21, 95,173,
+ 56, 55,242,213,234,202,198, 61,227,181,179,198, 73, 19,124,107,195,104,163, 89,237,246,166,178, 63, 71,140, 8, 17, 77, 64, 27,
+250, 91,101,151,249,229,233, 69,135, 18,193, 62, 3,226,178, 36,186, 42, 95, 97, 51, 11, 45, 13,119,136,205,124,111,251,194,116,
+231,242, 98,182,179,152,238, 76,119,175, 46,230,219, 22, 35, 15, 70, 42, 92,186,118, 97, 39,113, 60, 30, 63,241,186,215,125,248,
+ 67, 31,146,211, 47,255,134,131,155, 39,184,149, 42,125, 48,189,202, 85,159,196, 77,100,199,182,162,250,209,100,245, 84, 53, 88,
+ 23, 17,231, 70, 71, 79, 62,124,244,142,215, 56,191,146, 18, 2,173, 70,206, 57, 8, 42,135,147, 27, 88, 91,129, 42, 84, 48, 25,
+ 97,125, 5,222,101,193,167,225, 54, 61,179,184,111,247, 46,132,143,229,136, 49, 87, 43,197,138, 29, 87,198, 54,154, 23, 26,176,
+216,223,186,248,194,147, 59, 55, 94,164, 69,144,161,157,181, 43, 92, 56, 68, 0, 0, 10, 53, 73, 68, 65, 84,245,148,180, 30, 51,
+193, 33, 92, 96, 41, 13, 22, 81,167,140,153,194,112, 40,218, 97,239, 56, 15,165, 12,133, 79, 90,136, 60, 93,229,203,202, 60, 16,
+175, 90, 65, 84, 92, 5,113,132, 75,172, 96, 80, 29,115,113, 50, 10,234, 22, 58,135, 10, 84, 65, 66, 20, 94, 83,139, 58,134, 85,
+ 34,204, 0, 66,167,210, 9,171,175,170,119,209, 16, 59,106, 88,207, 70,111,218,186,169,247,193, 0, 96, 49,223,174,235,105,108,
+ 23,105,108, 96,140,173,153, 49,119,221,117,133,227,220, 5, 43,101, 43,242,173,146, 70,168, 83, 95,106,168,236, 90,249,122,189,
+ 97,175,252,201,238,229,164,162, 48, 3,216,207, 95, 74,166, 66,171,193,218,104,114, 12, 80,231,135,131,209,186,247, 19,239,199,
+201,227, 52,166, 98,153, 47,119,165,233,189,210,100,132,149, 49,156, 66, 4,147, 17, 78, 28,193,100, 4, 0,206,137,119,172,124,
+234,155, 78, 53, 67, 45,142,108,153,125, 79, 88, 96,108,147, 7,155,237, 93,217,186,244,177,166,222, 35, 17,219,249,222,206,229,
+182,222, 99, 46,164, 46, 65,225,194,174,125,144,133,132, 33,203, 61,218, 34, 2, 67, 68, 82,198,219,100,152, 75,101,212,236,246,
+209,245,186, 47,121,156, 68, 83, 99,119,118, 41, 68,238,184,233, 94,212,251, 31, 46, 89, 86,129, 25, 84, 25, 77, 66, 64, 26, 93,
+208,180,168, 91,104, 74,196, 29, 70, 30, 2,168,230,145, 45,236, 55,152,176, 80,122, 54,205,194, 34,132, 90, 64,210,234,197,180,
+105,235,182,169, 1,134,208,210, 98, 52,147, 82, 38,198,109,114,204, 37, 65, 75,215,100,153, 77,175, 41,252, 45,230,177,188, 24,
+ 44, 74, 92, 40, 4, 40, 68,206,204,108,234,102, 3,176,132, 37,234,253,208,251, 21, 81, 85, 29,138, 12, 5, 46,247,172, 75, 71,
+170, 88, 18,153,128,148,197,130,139, 5, 59, 3,116,237, 38,156,131, 0,195, 10,199,142,202,230,154, 58, 7, 8,134, 30,163, 33,
+ 85, 69, 5, 49, 44, 22,211,171, 49,236, 3,136,109,189,123,243,197,189,155,159,177, 24, 0,182,237,162, 89,236,154,133, 12, 96,
+231,124,227,243,131, 55, 89, 45,122, 32, 6, 66, 42,196, 91, 33,139, 72, 79,192, 41,252,138,174,145, 63, 75,174,136, 76,192, 66,
+141,205,175,207, 25, 47,251,209, 49,144,142, 37,145,174,145,153, 19, 75,218,202, 37, 68,183,231, 66, 75,199, 9,100,219,178, 9,
+116,150,102, 26, 81,197,212, 65,193, 16, 66,104,235,216, 54, 4, 99,168,219,166,110,219,218, 98, 3, 32,134,218, 98,107, 22, 15,
+ 32,189,153,236,212,157,172,131, 31,153, 74, 45, 93, 41, 33, 63, 37, 66,139, 94,108, 41,203, 75,141, 52,157,178,176, 39, 51, 17,
+ 38,236, 18,234,238, 31, 75, 22,187, 55, 99, 34,100, 26,209, 39,102,136,177,239, 41,145,254,184,162,181, 62, 23, 87, 17, 87,144,
+236, 72,196,214, 50,189,172,142, 55,183,119,197,166, 4,193,224,236,146,182,207,137,205, 68,160,210, 12,117,199,203, 66, 19, 29,
+131,193, 44,116,225,116,161,128,220, 6,124,144,219, 32, 57, 75,105,181,100,142, 69,223,240, 13,120,200,225,203,117,115,166, 80,
+ 24,117,178,228,212,250, 14, 8, 43,185, 99, 31,174,164, 95,201,164, 45, 66, 40, 75, 35, 58,216,135,121,157, 75,236,108,173, 9,
+ 18,195, 46, 22,170, 5,200,166, 13,214,180,164, 17, 81,219,153,107,110,192,246, 1,169,180, 53,191, 59,112,205, 82,126,175,135,
+123,238,138,171,205,236,211, 28,223,246,127, 15, 84,175, 74,128,195, 67,152,141,115,190, 83,251, 30,198,145,222,150, 38,106, 87,
+214, 22, 90,102,139, 80, 10,177, 12,125,194, 8,192, 24, 67,160, 53, 70, 85,136, 90,240,164, 43,198, 47, 44, 9, 51,171,156, 10,
+ 72,179, 16, 45, 56, 65, 36,219,102,119,186,243, 66,104,119, 1,137,113,190,191,253,194,124,255, 50,153,248,188, 11,225, 20, 12,
+ 16,169, 20,171, 99, 27,120,136,136,115, 88,157,184,213,177,115, 46,119, 31, 14,188,168,102, 0, 41,181,243,231,125, 75,228,106,
+ 73,221,233, 89, 6, 2, 73,228, 81,146,170,218, 91,166,164, 68, 49,250,130, 75, 46, 35,173, 82, 28,126,201,168, 81,204, 80,177,
+ 61, 25,238,232,199,200,148, 99, 42, 6, 68, 72, 26, 69,209,113,106,123,218,152,244, 36,159,124, 97, 37, 35, 45,210, 64,210,230,
+245,252, 90, 83,223, 32, 25,195,124,127,231,211,211,221,151,210,241,233,187,252, 33,149,147, 24,220,112,160, 0,188, 87,231, 48,
+172,210, 68, 10,113, 94,211,132,128, 28, 34, 11,211,204, 29,233,204,106, 10, 84,210,171,187, 65, 20,153,131,102,197, 21,247,111,
+230, 19,121, 79, 14,182,245, 89,223,229,212, 19, 16, 15, 69, 71,146,233,132, 57,160, 78,111, 16, 99, 29,194, 28, 80,250, 24, 98,
+ 67,198,132,154,164,217,113, 37, 24, 48,177, 72, 70, 2,198, 56,157, 93,157,239,189,100, 86, 3,108,234,157,221, 27,207, 54,245,
+142, 0,102,161, 94,220, 48,139, 29, 43,178, 80, 57, 25, 13,179, 58,214,193, 4,162, 26,219, 96,251,179,152,198,105, 14, 43, 93,
+ 25,107,229,132, 2,175, 58, 26,106,229,187,225, 89, 76, 44,113, 89, 34, 90,226,214, 74,177,244, 30,131,128,199,114,214, 87,216,
+112,125, 87, 2, 10,232, 36, 69, 35,123, 63,136, 50,240,181,235, 14,182, 24,219,216, 46, 68, 53, 18,102, 13, 17,105, 49, 49, 62,
+ 89, 88,100, 10, 70, 11, 96, 16,146,108,235,233,165,237,235, 31,105,155,125, 17, 52,139,189,233,238, 11, 77,179, 95,226,135,212,
+196,144,245, 57,243,226, 4,145,176,154,221,208,170,121,109, 59,251, 33, 33,179,227,145,219, 92,245,149, 87, 8, 7,222, 1, 78,
+196,229, 8, 89,229, 96,175,145, 28,128, 8, 62,203, 84, 44,111,210,197,220,157, 31,147, 50,115,131, 40, 38,170, 15,149, 10, 1,
+ 51, 23,213,187,200, 60,209, 12, 99, 19,194, 66,160,172, 16, 67, 27,219, 32, 18,203,140, 13, 85,129, 17, 22,219,102,118, 37,134,
+109,152,197, 24,166,123, 47, 45,102,215, 67, 51,133, 32,132,121,180, 0,166, 41, 62,217,192,119, 76,255,190,170,100,100, 95, 94,
+163, 69,196, 60,222, 11,117, 43,251,179,232,189,137,192, 59, 51,218,172,206,243,146, 42,175,131, 74, 18, 27,216,171, 84, 62,199,
+179, 34, 80,201,207,247, 99, 61, 50,232,214,141,206,233,248,142,210,231, 92, 61, 18, 37,165, 57,168,175,110,117,221, 75,214,183,
+ 20, 48,180,205, 84, 69, 72,241, 54, 14,205,126,140, 11, 13,158,128, 19,239,212, 39,255,191,104,103, 55, 46,127,104,119,235,227,
+ 68, 99,180,122,182, 53,159, 94, 49,171,151,208,193, 98,189, 18,161, 61,155,144, 46,202, 42,186, 92,136,237, 70,139,150,215, 90,
+215,220,159,133, 60,109, 91,101,224,197,105, 58, 95, 88, 25,185,149,177, 75,173,227,163,161, 30, 89,243,131,129, 10,160, 34, 85,
+165, 78, 58,103, 95, 6,171,144, 48,243,224, 82, 89,175, 8,203,250, 68,142, 75,174, 62,247,200, 64,122, 11,110,125, 73, 33,169,
+ 71, 27, 67, 3,213, 24,156,197,134, 22,146, 70,152, 6,109,234,132,180,135,230,102,104,247, 66,152, 25, 91,144, 22, 91, 34,118,
+108,206, 28, 83, 74,169, 38,229,190, 78, 75,249,209, 82, 67, 91,126,103, 65,241, 66, 93, 68, 97, 29,186,152, 74, 54,105,248, 50,
+ 66,100, 29, 76,139, 18,236,251, 48, 8, 46,249,210,202, 59,239, 10, 65, 66, 80, 84, 11, 10,245, 75, 92,249, 82, 34,201, 1,101,
+105,244, 44,100,244,220,233,150, 33,207,174,176, 97, 93,232, 29,173,173, 23, 55,154,102, 7,162,222,143, 22,179, 59, 23,139,235,
+ 21, 23, 48, 54,139,237,253,237,231,219,118, 15, 64,104,167,187, 55,159,157,239, 95, 34, 35,150,195,119, 17, 75, 77, 65, 57,227,
+ 74, 29, 0, 82, 16,112, 32,135,144,105,139, 83,215,157, 29,200,169, 83,219, 82, 62, 55,102, 81,106, 3,144, 38,218,201,116, 17,
+177,219,185,163,146,248, 74,214, 32,175,121, 52,193,112, 32,227,161,115,154,103,252,120,203, 51,160, 58,197, 77, 71,202,186, 56,
+ 48,111, 74,218,178,110,244, 89,166,101,203, 18, 48, 83,216,180,201, 97, 51, 70,107, 98, 59, 19,168,145, 33,204,218, 48, 15, 97,
+ 1, 48,132,218, 98, 0,210, 28,171,229, 56, 18, 98,146,166,218,225,224, 74, 36,143, 76, 74,125, 28, 25, 83,205, 49, 89,158,117,
+211, 33, 60,148, 50, 59, 40,185,241, 37, 35, 65,164,235, 91, 74,213, 45,167,191, 74,159,113, 70,137,212, 24, 37, 6,210,101,177,
+228,118,132,146,106,244,253, 4,125,242,219,213,235, 14,102,168,157,255,234, 8, 26, 60, 24,173,168, 86,234, 6, 37, 85, 49, 90,
+204,148,228,212,178,155, 8,246,221, 8, 38, 46,207, 35,234,166, 43,101, 23, 86, 98,255,146, 35,201,242, 87, 7, 34,187, 46,163,
+ 42,201,103, 50,245, 75,163, 0, 74,202,174, 57, 85, 44,190,160,175,116,148, 98,129, 0, 16,223, 5,182,210, 79,238, 2,210,208,
+190,180, 77, 29,138,102, 29,156, 87,234,248,203,227,244,186,237, 45, 2,138,172, 99,172, 15, 17,171,186,249, 14,197, 18, 75,113,
+ 8,165, 7,160,111,166,203,224,147,116, 29, 36, 68, 71, 58,183, 14,214, 68,223,135,135,108,172,122, 60,173,128, 49,165, 53,135,
+189,167,207,108,185, 46,240,237,176,138,228,119,138, 47,247,236, 58, 32, 59, 88,179,216,150,156, 60,117,158,188,147, 20, 59,104,
+ 77, 32,214, 21, 8,121, 11,169,236, 64,234, 94, 64,146,174, 6, 40,101,232, 92, 62,191,157,207,202,123,109,146, 26, 28,114,117,
+ 59, 75, 0, 38,217,124,119, 17,141,117, 64, 85,134,192,176,220,235, 67,237,107,189, 37,222,145,244, 95, 8,176,239, 40,200,211,
+186,250,252, 45,109,139,121,246,126,189,235, 21,237,106, 78,105, 73,105,100,113,178,161, 5,179, 42,210, 68, 55,148,177,139, 11,
+216,229, 90, 29,234,214,167,143,197, 92, 89,233, 7, 21,176, 71, 81,173, 76, 96,238, 60, 57, 58, 27,168, 5, 81, 42,167, 69,186,
+ 12, 61,205,133,131,244,103,136,121,108,164, 32, 39, 91,125,104, 88,148, 38,159, 69,162,211, 82, 46,215,100, 75,151,188, 47,110,
+ 18,253,140, 17,246, 93, 78,169,109, 61, 83, 56,146, 29, 43,135,137,178,156,169,201, 82,171,185, 28,164,117,176,123, 91, 46, 15,
+142, 43, 19,164, 59,156, 42, 55,147,136,230,136,185,139,237,211,121, 50,148,255, 97,164,244,251, 22,239,194, 37,169,160, 27, 25,
+ 87,218,157, 58,236,166,180, 95,165, 59,215,148, 35,101,165, 40,219,145,142, 90,129,245, 4,146, 82,141, 30, 91, 50,116,165, 74,
+ 43,157, 50,210,141,246, 46,211, 39,173,164,240,217, 70,200,146, 55,226,109,138, 34,236,207, 67,137,175,200,229,225,228,125,171,
+124,129,203,208, 29,184,188,228,142, 94,211, 81,109, 88, 88, 55,101, 6, 93,223,207, 86, 90,198,178, 97, 67,177, 53,229, 87,165,
+216, 35,230,218, 28,251, 66, 64,215,147,148, 86,231,217, 37,157,214, 19, 48, 65, 99, 31,206, 50,251,148,146,138,119, 6, 31,214,
+177, 59,216, 25,212, 3,112, 19, 14,125,102,223, 87,147, 7, 38, 98,137,168, 72, 90, 23, 51, 88,154, 84,156,179,224, 2,219, 23,
+ 16, 28, 6, 83,104,145, 81, 70,199, 83,227,187, 44, 19, 79,178,240,242, 97,146, 66, 61, 49, 72,170,167, 44,159,179,222,149,228,
+ 41,141, 20,136, 79,178, 40, 47, 72,221,242,133, 21,217, 87,155,115, 39, 48,151, 73, 2,189,164,242, 61,103, 76, 53, 53, 63,221,
+202, 12,238, 96,241, 37,251, 85, 28,114,137, 5,101, 9, 29, 47, 90,215, 25,166, 46, 59, 77, 55,156, 38, 43, 44, 57,199, 20, 55,
+166,255,101,161,120, 12,154, 64,217, 11,171,164, 69,154,163,135,226,226, 65,166, 81, 27, 29, 14,155,101,236,209, 91,233, 50,185,
+ 62, 55,175, 73,199, 52,145,146,227,119, 67, 59,203,114, 59,136,159, 75,182, 71, 14,149,131,173, 11,168, 4, 7,106, 37,194, 62,
+ 88,232,244, 78,186,201, 79, 41,198, 41,106,196,229,208,180,208, 77,187, 0,101,233,108,148, 46,242,206,112,244,214,168, 11,144,
+178, 19, 92,126, 25,151, 96,124,246,171,252, 95,129,131,209,235, 56, 35,137,112, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
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 <blenderbuttons> */
-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/blob.png.c b/source/blender/editors/datafiles/blob.png.c
new file mode 100644
index 00000000000..16dc958f7d3
--- /dev/null
+++ b/source/blender/editors/datafiles/blob.png.c
@@ -0,0 +1,341 @@
+/* DataToC output of file <blob_png> */
+
+int datatoc_blob_png_size= 10703;
+char datatoc_blob_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68,
+ 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0, 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,252,
+ 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215,
+ 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7, 20, 5, 32, 44,179,189, 3,155, 0, 0, 32, 0,
+ 73, 68, 65, 84,120,218,237,125,121,152,101, 87, 85,239, 90,251,156,123,111,221,174,121,234,185,134,158,170,186,186,122,202, 64,
+ 63, 50,116, 39,129, 4, 18,201,128, 33, 6, 8,248, 16,240, 1, 65, 1,101,242,227,201,167, 79, 68, 69,248,228, 41, 40, 2, 15,
+ 21,103,209, 39, 2, 79,145, 48, 42, 36, 16, 50, 66, 72, 39,157, 30,211,115,117,141,119, 58,227,222,123,173,247,199,222,251,156,
+115, 43, 33, 9,208, 74,252,244, 38, 95,213,173, 91,183,206, 93,103,237,181,215,240, 91,191,181, 27,247,237,219, 7, 79,251,120,
+ 38,111,242,179,103,247, 62,248, 93,153,202, 32,104,213, 22, 23, 78,157, 56,250,139,111,125, 71,246, 43, 97,190,125,243,238,123,
+101, 42,147, 36, 73,226, 68, 42,229,151, 58, 74, 37,127,249,155,130, 48,104,181, 90,173, 86, 51, 8, 90, 97, 16,164, 82,126,229,
+107, 95,255,212,167, 62,213,246,166,250,210, 98,189,182,212,168,213,162, 40,138,194,232,210,203,175,148, 82,161,231,191,255,183,
+223, 7, 0,130,136,238,125,224,193,102,179,217,168,215, 17,113,114,235,182,177, 13, 27, 14, 30,120,184, 86, 91,106,212,235, 97,
+ 24, 90,193, 17,189,109,219,119,106, 77,243,179,103,231,231,102, 23,230,231, 15,236,127,104, 98,106,251,204,217, 51, 39, 79, 60,
+254, 59, 31,248,109, 31, 0, 52, 49, 49, 48, 83,111,223,224, 3,247,223,179, 48,119,110,239, 85,215, 28, 61,124,112,106,122,251,
+202, 85,171,146, 40,242, 1,128,180,102,210, 90, 19, 3,239,216,185, 59,149,169,146,114, 98,235,212, 61,223,186,107,221,200, 40,
+ 32, 8, 0, 32,173,180, 38, 34,173,149,210, 90, 51, 49, 17, 53,234,245,141,155, 39, 6, 7, 7,153,193, 7, 0,169, 20, 51,107,
+173, 73,107,165,149,121,104,173,181,150, 7, 31,123,172, 84,242,241, 25,173,221, 51,121,160,249,246,233,207,124,118,253,200, 88,
+ 20, 69,205,122,109, 97,126,246, 85,175,122, 85,241, 77, 86,227,107,214,174, 79,146, 36, 78,146, 84, 74,165,233,189,191,254,107,
+203,175,244,133, 59,238,240, 75, 29, 74,202, 40,142, 90,205,102,173,182,116,209,197,123,154,141,218, 13,215,191, 40, 77, 83,123,
+165, 90,173, 86,175, 45,213,235,245,102,189,158, 36, 49, 48,104, 98,165,249, 15, 63,250, 81,115, 37,239,158,251, 30, 56,115,250,
+100,146,166, 97, 24,110,223,181,187,179,171, 59, 14, 3,225,121,245,250,210,210,226,226,250,213,131, 15,124,231,123,190,240,252,
+237,187, 46, 34,210, 74,233,249,185,185, 32,104,213,106,181,174,238,158,217,153,153,153,179,167, 43,149,142, 74,165,236, 51, 19,
+ 17,144, 38,102, 62,244,216,163, 81, 20, 30, 63,122,100,237,250, 17,207, 19, 8,188,243,194, 61,239, 25,223,136,119,223,247, 0,
+105, 98, 38,173, 73, 74, 41,165,212, 74, 74, 41,147, 56, 78,146, 36, 12, 91,205,122, 77,144, 54,235,161,181,214, 68,196, 68, 90,
+107,173, 52, 17,109,158,152, 96,102, 0,240,149, 82,164, 89,147, 38, 34,183,110, 74,107,165,181,126,116,255,126,173, 53, 17,195,
+249, 90, 59,255,137, 47,121,158,119,247,183,239,149, 90,203, 52, 77,211, 36,142,162, 48,104,221,254,134, 55, 44, 46, 45, 61,211,
+ 11,253,249, 95,252,213,214,169,109, 12,168, 73,107, 77,154,152, 8,136, 1,208,251,224,255,254,221,160,213,168, 45,206,253,242,
+175,188,231, 73, 47, 36,178,103, 95,249,234, 87,199,198,199,227, 56,142,162, 48, 12,195, 40, 50,223,131, 40,138,226, 36, 78, 82,
+153, 74,133, 94,249, 93,239,124,235,211, 72,212,108,182,252, 82,138,136, 68,172, 73, 43,169,164,148, 82,166,105,146, 36, 73,156,
+166,233,115, 47,187, 2, 17,211, 52,185,242,154,235,131, 86,163,182,180,248,241,143,253,225,221,223,190,215, 42,100,108,108,236,
+248,241,227,223,190,247,190, 51,167, 78, 26,175, 19,197, 81, 28,134,105,154,148, 74,165, 45, 19, 19, 61, 61, 61,149, 74, 5,129,
+122,250, 6,162, 48,136,172,196, 97, 20, 69, 99, 99, 99, 27, 71, 86, 61,240,157,239, 1,128, 55, 50, 50,242,247,255,240, 57,225,
+121, 67, 43,215, 0,112,173,182,148, 38,169,214,106,124,108,172,127,104, 40, 77,146, 48, 12,195, 32, 8,130, 96,255, 67, 15, 86,
+ 58,170,173, 86,171,217,104, 52, 27,245, 90,173,182,184, 48, 55,119,238,116, 87, 87,207,233, 51,103,125, 0, 64, 33,136, 1,152,
+251, 7,134,250, 7, 6,137, 8,128, 15, 29,120,164, 84,238,208,164,147, 56,105, 53, 27,181,165, 69, 34,189,106,245,154, 83, 39,
+ 30,127,252,232,225,161,225,225, 99,135, 31,155, 61,115,116,223,213, 55, 92,186,175,116,211,141, 55, 8, 0,208,100,254,179,246,
+ 72, 68, 90,211,248,198,137,117, 35, 99, 90,169,199, 30,125,248,224,163,251, 75,165,210,202,213,107,238,189,251,174,147, 39,142,
+ 63,255,133,215,169, 52, 78,162,230, 79,190,252,181,221, 61,253,194,243, 75,149,170, 15, 0, 90, 19,176,125, 16, 49, 51, 49,179,
+185,236,186,245, 35,171,215,172, 35,178, 70, 77,164,131, 32,248,252,231,254, 97,114,106,122,203,182,221,125, 3,195,179, 51,167,
+ 1, 0, 17,125, 0,208, 74, 51, 51, 3, 48,105, 0, 48,130,217, 75,146,217, 58,102,203,106, 38,242,125,255,130,139,247,144,166,
+137,173,219, 14, 62,186,191,187,187,219,188,193, 72,164,184,240, 32, 34, 50,206,146,136,137, 53,105,119,191,218,110, 68,173,181,
+214,113, 28,165, 73,172, 59, 59,181, 86, 90,211,249,243,147,231,229, 49, 58, 58, 42,206,215,181,158,100,247,191,247, 55,126,243,
+234,107, 94,160,148, 74,211, 52, 73,226, 40, 12,230,207,205,188,238, 13,183, 63,163, 8,144, 61,238,123,224, 59, 0,168,180, 86,
+ 74,165, 73,146, 36, 73, 18, 69, 81,212,106,212,235,175,127,195, 27,158,233,173,221,115,223, 3,196,160, 52,217,245, 33, 34, 34,
+ 2, 34, 70,225,121,191,243,129,247, 63,133, 68,249,133,238,188,235,155,154, 88,187, 40, 40,165, 84, 74, 90,175, 74, 74, 19, 49,
+224,187,223,245,206,167,215,145,210,196, 32, 25,128,136,204, 85,164, 76,165, 76,149, 84, 50, 85, 74, 41, 34,242,203, 21, 33, 4,
+ 17,125,223, 11, 93,118,217,165,105,154, 8,161, 25,152, 52, 41,173,149, 76,165,148,105,154, 38, 73, 98, 46, 55, 48, 56,116,217,
+190,171,246, 93,117, 77,171,217, 56,123,250,196,235,223,240,198, 39,185,181,125,123,247,198,113,156, 36,113, 18, 39, 73, 18,167,
+ 73,108, 20,109,191,199, 49, 51,239,188,224, 34, 20, 2, 0, 81,120,221,189, 3, 31,250,189,223,123,146, 11, 37,105,146,196,113,
+ 28, 69,113, 28,197,113, 28,199,113, 18,199, 74, 74, 64,102, 38, 20,226,185,151,237, 85, 82,165,105, 42,149,210, 90, 17,145,240,
+188,119,189,243,109,109,183,118,235,173,183, 94,121,197,149,245,102, 75, 8,143, 25,136, 72,147, 46,149,202, 19, 91, 38, 24,184,
+213,108, 46,206,207, 18,113,154, 38,105,154, 36,113,146,196,137,185,160,240,114, 21,251,247,220,119, 31,162,199, 12,139, 15, 63,
+164, 64, 51, 3,145, 22,194,219,188,121,179,240,252, 52, 77,153, 1, 61,255,193,123,191,181,113,203,214, 84,166,137, 17, 56, 54,
+178, 39,249,173,121, 94, 9, 81, 8,207,155,222,121,129,231,121,198,237,120,158, 72, 83, 25,199,113, 20, 69, 81, 20, 38, 73,162,
+180,126,244,225,239,134,173,150,113,188, 97, 16, 4,173, 86,208,106,124,240, 3,239,115, 58, 66, 1,136,198,129, 76, 78, 77, 79,
+239,216,181, 99,247,238,238,174, 21,205,102,163,217,108,180,154,205, 32,104,133,173, 32, 12,130, 83, 39,143, 19,115, 20, 4,205,
+102,189, 81,175,215,235,181,197,185,153, 82,185,227, 55,127,253, 87,152, 57,191, 73,102, 98, 6, 19,237,123,250, 6,103,206,158,
+ 69, 33,100,154,134, 97,208,168,215, 23, 22,230,111,121,249,127,159,159,155, 61,117,252, 8, 3, 70, 81, 56,127,238,140, 38, 22,
+158, 95,174,172,184,234,138,203,125,243,199,204, 12,204, 0,246,121,165, 99, 69,189,182, 40,149, 86, 82, 70, 97, 80, 91, 90,106,
+ 52,106,243,115,115, 75,139, 11,173, 86,176,239,121, 47, 56,118,228, 80,185, 82, 90,183,110, 4, 1,132,231,251,165,178,176,110,
+218,250,105,235,114,153,105,251,206, 11,183,239,220, 29, 71,225,252,220,108, 24,182,174,185,246,250, 99, 71, 14, 29, 57,244,216,
+141, 55,223,218,168, 45, 62,246,232, 35, 19,147,219,202,149, 14, 6, 64, 33, 80,120,120,207,253,223,209, 68, 0, 12,204, 90, 3,
+179, 54, 66,185,192,162,181,210,196, 68,154,152,116, 87,119,119, 16, 69,103, 78,158,240, 4,158, 56,126,108,116,108,163, 73, 51,
+246,239,127, 88, 16, 49, 48,177,102,173, 25, 64,155, 59, 37, 34, 48,210, 49,160, 91, 10, 34,170,213,106,247,223,125,215,221,119,
+126,173,167,111,224,202,171,127, 34, 8, 90, 0, 12, 8, 0, 40,108,224, 1, 27,139,200,197, 35, 34, 50, 47,104,210,144,197, 40,
+173,167,182,239,188,250,218, 27,207,158, 62, 89,237,168,156, 60,126,204,168, 23, 0,124,235,115, 24,204,154,217,191, 39, 2, 32,
+ 38,178, 41, 31, 19, 17, 91,247, 68, 68, 76,125,253,131,251, 31,126, 40, 12, 90, 86,191,192,249,133, 24, 40, 87,187,141,143,196,
+ 76, 70, 78,102,237, 94, 51,177, 74, 15,173, 92,181,227,130,231,200, 52, 37, 98,224, 92, 34,123, 9, 98,119, 65, 27,212,178, 16,
+ 87,124,104, 34,154, 61,123, 86,166, 41,217,143, 57,127, 57,228,121,121,140,140,140, 8,120, 54, 61,108, 46,242,204, 31,151, 92,
+122,233, 45,183,220, 50, 49,185,181,187,171, 91,147, 86, 82,134, 97,112,248,208,193,187,238,186,235, 51,159,249,236,249,145,105,
+223,190,125, 95,255,250,215,159,226, 29,183,189,226,149,111,249,197,183, 2, 8,132,220,220, 93, 98,163,148, 52,129,207,228,190,
+113,154, 38, 39,143, 31,255,213, 95,123,207, 15,157,137, 60,149,134,238,248,210,151, 6, 7,135, 25,133,177,121,118,201, 33,105,
+107,182, 68,204, 0, 12,192,108, 34,148,239,121,180,118,253,200,239,127,248, 67, 81,216,250,165,119,189,251, 73,195,232, 83, 63,
+158,220,134, 46,185,228,146,111,125,251,190,190,254, 65, 98,176,229,151,210, 42,251, 95, 43,165,148,150, 74,107,173,204, 75, 54,
+ 17,182, 91, 5, 16,133, 87,122,207,175,253,202, 43, 94,118,203,121, 16,232,218,107,175,125,223,251, 63,160,181, 86,210,132,126,
+251,200, 18, 10,243, 99,170,210, 84, 74,165,148, 84, 74,154, 4,195,200,166,205,118, 38, 0,220,176,113,243,235, 94,243,211, 63,
+106,206,247,214,183,189, 93, 41, 77, 4,136,152, 5, 20,155,109, 59,255, 97,234, 56,173,109, 37,154, 21,166,202,100, 44, 74, 51,
+ 96,111,223,192,158, 75,166, 60, 33,110,184,249,165, 71,142, 28,254,230,157,119,125,230,179,159, 53, 53,251, 15, 32,208, 91,222,
+242,230, 52, 77, 60, 77, 40,132, 19, 40,147,201,120,220, 98, 21,173,181,210, 74, 43,210, 90, 74,169,148, 50,161,166,163, 90,189,
+120,207,115,129,153,136,149, 86,194, 47, 79, 77,239,220,180,121,242,165, 47,191, 45,142,163, 48,104,125,252,163, 31,189,247,254,
+ 7,158,145, 64,157, 43, 86,196, 81, 44,124, 37, 80, 32, 34,219, 32,158,151, 57,148, 85, 37,218,213, 19, 90,105,169,165,150, 90,
+ 41, 20, 98,116,108,124,253,250, 81,115, 3, 90,155,253,104,238,132,153, 17, 81,120, 94,233,103, 94,253,154,151,188,228, 37,239,
+121,239,123,195, 48,122, 26,129, 70,199, 70,146, 36, 22,202, 67, 20, 8,104,211, 19, 96, 38, 87,114, 17,153, 28, 72,120,158, 95,
+ 42,245,246,246, 34, 98, 18,199,113, 20, 74,169,250, 6, 6, 7,135,134,164,146, 38, 48,104,210, 90, 41,169,148, 86, 50, 77, 83,
+169, 82, 41,149,210,154,152, 81,136,183,253,194, 91, 62,248,187,191, 23,180,203,228,155,232,120,215,183,190,229,123, 37, 20, 98,
+246,220,153,249,185, 57,212, 2,193, 36, 75, 0, 0, 38,191,101,102, 64, 40,149, 74, 93, 93,221, 35,163, 99,136, 72, 68, 38, 13,
+ 47,149,202,190, 95,138,162, 96, 97,110,230,236,201, 99, 19,211,187,164,148,217,130,106,165,165, 76,149, 43,213,211, 52, 77, 83,
+187, 77, 94,241,178,159,250,248, 31,255,217,114,129,238,189,255, 65, 0, 48,250, 88,181,102,164,111, 96,248,232,161,131, 54,123,
+ 32, 27,114,141,220, 66,136,145, 13,235, 43, 29, 43,180,182,144,141,245,137, 50,149, 74,106,173, 25, 48,145,234,158,111,254,235,
+196,182,157, 89,137,104,182,159,148,105,150,173,199,113, 20,133, 81, 20,134,113, 28,110,217,178,233,208,161, 35,109, 75, 38,132,
+103,238, 30, 0,145,185, 82,238,216, 58,189, 19, 17,136, 88,201,180,213,106, 45, 46, 46, 68, 81,200,196, 3,253, 61,105,154,106,
+ 6, 68, 97, 64, 59,173,204, 98, 88,140, 34,138,162, 36, 73, 90,173,224,238,175,127,117,122,247, 69, 0,160,164,115, 10, 86, 59,
+ 73,154, 38, 81, 24, 69, 65,171,217, 88,170, 45,156,251,249, 55,190, 49, 73,162,143,124,228, 99,143,159, 56,233,108, 8, 49, 79,
+ 65,129,209,196, 8, 70, 0,242,124,175,167,183,175,167,183,151,153,128,197,210,194, 76,189, 86,243, 74, 37,129,130, 1, 92,248,
+ 80, 6, 17, 74,226, 56,138,162, 32,104, 53,234,245, 23,221,244,146,114,165,210,172, 47, 45, 44,204, 55, 27, 13,153,166, 82,201,
+ 52, 73,156,122,130,160, 81,171, 45,158,187,242, 5, 55,248,165, 18, 51,223,126,251,235,211, 56,252,195,255,243, 73, 31,242,125,
+ 4,128, 12, 12, 4,204,128, 8,198,124, 17,192,102, 53,128,212, 63,180,250,236,153, 7, 24, 0,133, 7,128,196,164, 85,142,226,
+196, 81, 20,134, 65,216,106,221,112,243,173,158,239, 7,173,102, 20, 39, 82,170, 52,137, 70, 70,199, 55,108,158,104,212,107,179,
+231,206,126,251,206,175,205,205, 28, 87, 82,191,240,198,151,122,158, 64,244, 76, 34, 76,204, 47,188,230,106,223, 74, 3,192,230,
+ 19, 0,208, 36,157,192,204,192, 8,192, 86, 70, 96,214,160, 38,182,237,100,166,135, 30,188, 47, 12, 67, 35,141, 93,136, 36, 73,
+147, 36,137,163, 29, 23, 94,188, 48, 63, 79,164,147, 36, 9,195,160,190,180, 52, 55, 59,179,115,247, 5, 75, 75,139,243,179,179,
+243,115,115, 94,169,242,147, 47,123,141, 82,202,134, 27,173, 16,133, 16,158,239,149,132,231,249, 0, 96, 98, 56, 2, 24,172,135,
+192, 73,228,212, 5, 96,226, 42,216,138,130,121,122,231, 5, 76,100,130,153, 19,219,216, 61, 3,176,214,252,232,254,135,102,207,
+205,148, 74,254,139,111,121,185,148, 42,104, 53,151, 22, 23, 22,230,103,119,236,220,181,101, 98,178, 86, 91, 18,136, 44, 16,136,
+ 1, 17, 16, 1, 16, 5,218,124,200, 21, 10,204,132,104, 4, 0, 34, 70, 96,178,122, 98, 0, 96,114, 90,115,181, 14,123, 2,177,
+228,219, 31, 29, 50,196,140,136,188,117,122,199,228,212,116, 71,117,197,193, 3,143,104, 77, 97, 24,212,107, 75, 39,143, 29,157,
+156,218,118,232,177, 71,247, 92,114,121,146, 36, 71, 15, 29, 0, 20,246, 3,208,228,249,104,151,140,180, 9, 93,198,110,136, 1,
+ 51, 49, 17,205,199, 0, 34, 16, 59, 37, 2, 16, 0, 48, 24,247, 13,108,222,158, 99, 86, 76, 68, 0, 65,171, 89, 93,209,105,182,
+226,170,213,107,135,134, 87,239,127,232,161,131, 7, 30, 30,221,176,169,182,180,116,236,216,209,141,155,182,152,213, 0, 46,108,
+123,147,115,153,245, 96, 64,102, 70,100, 34,155,234,184,204,221, 85, 38, 0, 78, 37,196, 54, 79, 98, 6, 42, 66,104, 70, 70,151,
+ 49, 17, 34,118,247,244,104, 34,102,238,238,217,112,201,229,251,226, 36, 81, 82,118,118,118, 57, 47, 7,153,171,203, 5, 98, 70,
+155,108,229,142,208,106,204,252,224, 22,202,138, 78,238, 57,185, 42,131,243, 50, 42,147, 46,255,207,104, 46, 85,234,232,145,195,
+165, 82,233,228,241, 99,157, 93, 93, 92, 72,245,204,223, 57,129,204,173,187,250,213,236,245,204, 35,100,242,219, 74, 5,236,178,
+ 0,184,207, 4, 91, 48, 1, 19, 1,176, 45,150,220,218,185, 32,152, 71, 67,166, 93, 23,237, 57,240,240, 67,218,150, 89, 46, 32,
+ 0,251,136,248,181,175,126,217,238, 31, 52, 18,184, 37, 53, 47, 49, 23, 94,179, 91,137, 51,111,145,189,194,252,125,158, 21,181,
+110,205,130,153,249,254,251,137, 25,216,201,169, 53, 49, 47, 46, 46, 61,203,240, 70, 83,155, 61,123,132,217,183,111,159, 77, 11,
+159, 61,143,103, 87,229,250,108, 20,232, 7, 40,165,203,229,242,207,253,220,207, 95,188,231, 57,107, 87,175, 65,129, 74, 41,153,
+166,103,206,156,121,236,192,129,191,253,187,191,125,252,241,227,255,126, 2,109,221,186,245,143,254,248,147,194,247,129,193,246,
+ 46,180, 70,100,225,149, 86,175, 89, 59, 52, 60,124,241,115,246, 40,149,126,242, 79,254,228,139, 95,250,242,143, 90,219,143,142,
+142,158, 56,113,226, 41,222,113,239,253, 15, 48, 34, 50,146,173,163, 45, 38,158,117, 8,109, 53,153, 38, 73, 28,167,105,252,214,
+183,189,189,217,108,253,208,187,204,235,237,237,173,215,235, 79,250,235, 29, 59,118,124,254, 11, 95, 68, 33, 0, 69,150,196, 21,
+235,198, 12, 39,179, 79,129,153,248,170, 43,175, 40,151,253, 3, 7, 14,254, 16, 2,141,141,141,125, 95,163,222, 58, 53,245,199,
+127,250,103, 38, 37,128, 44,102,114, 17,242,115,226, 89,104,135, 1, 16, 4, 10,225,239,219,119,197, 43, 94,118,235,249,220,101,
+221,221,221,159,252,211, 63, 7, 7, 93,114,174,143,182,160,100, 51, 20, 7,190,130, 73, 49, 17,133, 16,219,119,238,184,112,247,
+206,243, 38,208, 63,223,241, 69, 68, 65, 46,147,205,214,196,228,156, 89,153,175, 11,112, 33, 3, 80, 30,133, 81, 8,255,198,235,
+ 95,228,251,254,121, 16,232,246,219,111, 7,192, 54, 88,193,213,206,217, 22, 51, 37,151,107,246,101,101,127,182,178,192,204, 32,
+188, 55,190,238,213,231, 97,219,191,236,182, 87, 48,128, 38, 66, 64, 83,182, 22, 87,202, 8,104,165,211,182, 21,229, 32, 85,157,
+193,180, 70, 79,213, 21,157,213,106, 71, 20,197, 63,188,134, 38, 39, 39, 13,198, 99, 97, 5, 91,160,103,157, 74, 85,160, 16,232,
+ 28,110,104,123,162,153, 24, 17, 61,223,171,116, 84,175,220,123,201, 15,164,161,229,219,254,163, 31,251,104, 71,181,154, 43,166,
+176,173,141,120, 6, 68,208, 74,107, 42, 8,225,228, 51, 96,145,113, 7,155, 38,182,110,223,177,235,210,203,175,120,254,243,159,
+ 55, 53, 53,213,106, 53,103,102,102,158,118,219, 47, 95,178,142,142, 14,173, 52,123,128, 68,166,243,104, 76,194,180,137,237,215,
+130,111,212, 90, 81, 81, 97, 90, 19, 3, 0, 94,252,220,203,170,213,170, 41,254,215,172, 91, 63, 52,188,242,226,231,236, 73,162,
+240, 35, 31,249,131,111,220,121,215, 15,176,100,172,217, 66,136,166, 74,214, 5, 32, 81,103,125, 71, 91, 65,107,173, 72,147, 42,
+188, 98,234,187,221, 23, 61,167,171,179, 27, 81,160,240,236, 87,225, 9,207, 19,190,255,154,215,254,236,135, 63,244,187,207, 84,
+ 32,207,243, 28,164,105,122,157, 74, 41, 37, 93,199, 83,101, 48,162,118, 79,148, 69,127,204, 43, 68,132,136,189,125,253, 61, 61,
+ 61, 46, 27,206,202, 76, 3,139, 11,207, 47,149, 43, 29, 31,248,237,223,122, 70, 2, 33,162,145,197,162,207,230, 73,222,132,205,
+162, 87,206, 80,202,168, 49, 90,217, 6,254,244,206, 93,198,101,230, 91,145, 51, 80,199,124,138,240, 75,229, 95,125,247,187,158,
+126,219,155, 11, 51,160,231, 49,146,200,202, 55,199, 16, 96,118, 72, 30, 48, 35,128, 16,130,129,209, 60,132,240, 16,215,143,140,
+145, 38, 3,112,233,162,119,176,110, 44, 19, 11,253, 82,101,237,154,213,103,206,206, 60,149, 64,215, 93,119,157, 82,202, 99, 36,
+178, 31, 99,202,177, 2,109,193,150,202,194,247,153,185,179,179,171, 90,237, 80, 74, 38, 81, 24, 69, 49, 49,172, 94,187,150, 44,
+101,200, 57, 9,165,200,128,181,110, 59, 24,183, 14, 0, 47,187,229,230, 15,126,248, 35, 79, 46, 80, 87, 87,215,231,191,240,133,
+ 74,185,227,209, 71,190,103, 96, 43,151,107,163,171, 15,109, 80,243, 60,207,243,253,254,190,254,149,171, 87, 41,105,178,180,212,
+243, 60, 20, 34, 12, 90, 11,115,231,250, 6,134, 13,249,204,110, 67,165,164,227,161, 21, 54, 35, 17,179,120,178,192, 34, 0,224,
+166, 23,191,248,203, 95,253, 90,185,220, 33, 60, 31, 1,180,214,228,254, 86, 74,149, 19,219,180, 2, 4, 33,196,248,248,248,202,
+ 85, 43, 77, 59, 1, 80, 0, 10,131,167, 8,175,116,246,244,169, 70,163,166,148,212, 22, 77,183, 20, 45,173,149, 86, 82,201, 76,
+ 38, 43,224,134,209,245,203, 5,122,245,171, 95,253,174,255,249,203, 66,120,158,231, 33, 98, 71, 71, 21, 0, 52,232, 28,137,214,
+118,239, 3, 51, 48,172, 93,183,182, 84, 42, 49, 96,193, 48, 52,185, 58,151, 0, 14, 31,216,111,208, 68, 37,149, 76, 29,214,105,
+ 48, 78,149, 63, 53, 59,117,205,234,149,203, 5,170,116, 84, 61,207, 23, 66, 0, 8, 64,216, 52,185,173,187,187, 7, 25, 51, 91,
+214,121, 92,231, 74,165, 82, 42,149,181,166,220, 21, 57, 87,101,240,104,102,150,105,122,244,200,193, 36,137,165, 76,165,116, 34,
+164,210, 73, 99,210, 75,243, 53,222,176, 97,116,185, 64,102,135,152, 6,172,217, 84, 99, 27, 55, 77, 76, 77, 87,171, 85, 3, 33,
+101, 62,129,153,250,122,187,140,169,186,214,135,148, 42, 53,132, 71,169,164,210,202,172,246,204,233,147,134,214, 32,101, 42,211,
+ 52,131, 95,165, 69,132, 83, 3,182, 37, 73, 60, 60, 52,252,190,223,248, 95,203,108, 8, 1, 1,208,104, 8,153,136, 9, 74, 37,
+127,227,230,201,169,233,237,155, 54, 79, 12,175, 92, 85,233,168,250,190, 87, 42,149,149, 38, 3,184, 74,153,164, 73,226, 62,192,
+246, 99,148,148, 42,149, 74,233, 52, 77, 27,245, 90,142, 6,167,150,224,146, 36, 73, 26, 39, 73, 28,167,134,143, 16,180,214,141,
+110,244, 75, 29,191,242,238, 95, 42, 8,212, 94,184, 50, 32, 32, 24, 16, 6, 16, 43,213,142, 85,171, 87,111,153,152,220, 58,189,
+ 99,211,150, 9, 41, 13,153, 35, 78,226,216,124,138,129, 22,211, 52,113,116, 17,251,193, 90,169,114,185,194,192, 90,147, 76,147,
+ 52,141,210, 36, 78, 19, 7,213,134, 97, 20, 54, 26,245,133,206,174,174, 82,201,239,236,236,122,253,207,190,170,184,237,209,250,
+ 64, 98,131,233, 33, 90,156, 17, 13,210, 8,136,192,126,169,148,196, 9,179, 16,158,103,160, 81,109,129,115, 35,103,108, 88, 39,
+113, 28,149,203,229, 93, 23, 94, 28,180,154,245, 37, 14, 90,173, 40, 10,173,249,152,119, 68, 81, 20,181,130,102,125,112,120,157,
+ 76, 37, 10,207,247, 75, 35,163,227,207,185,120,119,123,232, 48,232, 89, 1,190,204, 72, 15, 6,195, 67, 0,165, 84, 20,134, 81,
+ 24,197, 81,219,255, 81, 28,197,134,210, 27,134, 73, 28, 95,119,227,205,214,215, 0, 34,114,189,182,168,164,236,239, 31,232,238,
+238,137,194, 32,104, 53, 90,141,165, 48,104, 77, 78,239, 16,158,135, 40,132,240,125,191,116,253,139,126,194, 2, 86, 14,154, 2,
+ 6,100, 2, 11,156,131,105,102,216,184,200, 68,128, 98,120,213,186, 83, 39,142, 33, 10, 20,130,136,141, 71,177,184,112, 18, 71,
+ 97, 24, 4, 45,207,243, 0, 48,138, 66,195, 13,149, 82,147, 82,215,190,228,197, 97, 16, 44, 46,204, 87,171,229, 59,255,229,203,
+ 97,171,190,109,231,197, 93,221, 61,158,239,147, 38, 64, 33, 60,207,247, 74, 0,224, 91, 24,202,172, 12, 35, 32,217, 68,136,173,
+111, 65, 48, 8, 25, 2, 83,119,119, 79,181,186, 98,105,105,209, 56,158,188,181,144, 38, 73, 18,135, 65, 16, 6,173,107,174,187,
+ 49,104, 53,211, 52, 53, 26,139,194,160, 21,180,194, 32,136,194, 32,142, 35, 69,188,114,245,186, 29,187,111, 18, 2, 45, 96, 75,
+ 44, 4, 10, 97, 44, 33,139,101, 6,251, 69, 98, 66,139,159, 3,130,129, 16, 1, 1,217, 2,180, 8,163, 27, 54,117,118,247, 28,
+ 62,120, 64,107,109,221,137, 76,173,141,199,177,241,206,245,122, 93,202, 52,142,162,102,179, 81, 91, 90,218,184,105,139, 74,147,
+ 86,171,213,168,213,154,245,198,228,214,233,234,138,170,225, 9,106,173, 77,150,129, 40, 16, 61, 0,240, 57,135,162, 49, 71,243,
+ 1, 44,140,110, 86,203,193,141,134,148, 49, 48, 56,180,231,146,203, 23, 22,230, 79, 62,126,236,220,204, 25, 35,141,146,170,187,
+167,103,199,238,139,130, 32,136,227, 72,166, 73, 24,134,245,165,165,107,174,123, 81,103, 87,119,163, 94, 15, 26,245,179,103, 78,
+159,124,252,200,232,248,213, 38, 59, 96,173,161, 0, 9,163, 64,163, 33,135, 92,155, 24,111, 63,219, 66,251,192, 96,165, 49, 48,
+ 62, 48,147, 69,171,187,187,123, 38,167,166, 55, 79,108,181,142,195,217, 62, 0,204,206,204, 28, 57,123,166,190,180,120,237, 13,
+ 55,117,117,247,198,113,148,196,145,102, 22,192,175,189,253, 45,143, 61,250, 61, 39, 70, 65, 26, 68,179,217,141, 13, 17, 0,154,
+ 45, 79, 89,158,135,182, 81,239,120, 74, 89,209,108,216, 55,128,136,158,231,161, 64,118, 80, 51,128, 48,239, 28, 90,185,114, 96,
+104,168, 92,169, 0, 83,163, 81,143,163,176,217,108, 54,155,205,122,163, 54, 63, 63, 87,111,180,134,134,134, 65,107,187, 2,214,
+ 53,219,158,179,111, 33, 86,215,117, 65,116,183,153, 75, 79,224,122, 88,214,246,209,181, 60,204, 85,208, 1,180,142, 84, 96, 68,
+151,105,154,164, 73,216, 10,146, 52, 9,154,205,249,185,217,142,106, 53,142, 66,153, 38, 91, 38, 39, 79,157, 56, 94, 91, 92,180,
+123, 41, 7,242, 65, 0, 56,234, 14, 80, 86, 11,179, 67,164, 77, 95,209,226, 26,224,122,211, 38, 69,181,232, 52, 19,176, 33, 46,
+ 65, 17,209,102, 86, 74,149, 75,229,249,249,217,199,143, 30, 62,118,248,224,177,195,143, 94,241,252,235,130, 32,232,239,239,111,
+ 54,155, 73,154,206,156, 61, 93,144, 36, 75,208,236, 13,161, 69,229, 25, 17,108,221,153,129,247,142, 29,197,166, 7,139,133,212,
+ 22, 29,160, 77,174, 11,224, 74, 58, 6,102,165,228,232,232,248,240,240,170, 32,104, 13, 12, 60,239,224,129,253,103, 78,159,218,
+176,113,211,252,220,220,217, 51,167,151, 22,231,135, 86,174,206, 96,112,215,115,205, 90, 99,204,166,129,199, 0, 68, 38,206, 2,
+ 0,163, 13,109,217, 50,218, 58,217,129,233,228,140, 43, 55,179, 2, 96, 14, 0, 92,169, 84, 74,229,146,210,170,179,179,123,219,
+244,206,109,211,211,141,102,179, 89, 91,172,110,153,130,118,164,222,105,200,114, 74,236,157, 33, 60, 17,172, 39,104,183,237,252,
+105, 1,197, 42,130,246,217, 19,179,210,198, 76,202,229,242,232,248,134,102, 43,104, 53,155,154, 11, 93, 1,206, 12, 15,124,183,
+242,224, 26,226, 72,110, 79,154,101,200,154,100, 80,220,221,203,250, 5,100, 93,153,165,194,217, 95,154, 54, 13, 21, 4,230,249,
+185,217, 86,179,217,106, 53, 79,159, 60,177,122,205,154,130, 30,205,218,128,176,198,108, 20, 69,206, 61,176,179, 82,147, 31, 57,
+ 13, 57, 83,177,224,148,107,137, 16,152,222, 99,161, 64,201, 76, 60, 43,198,205,103, 55, 27, 13,173, 85,255,192,192,153,147,199,
+202,229, 74,222, 23,177,177,194,104,104,121,120,207, 37,110,107,108,130,237, 0,185,214,154,165, 59, 64, 1,237, 43,172, 99,118,
+ 71,204,237, 45,171,158,222,190, 52, 77, 38,183,109,127,226,219,173,134,150, 93,174,176, 16, 4,182, 55,199,108,120,200,236,186,
+117,148,201, 67,148,191,208,222,196, 3,199, 65,160, 34, 37,157,107, 75,139,213,106,231,208,240,234,226, 6, 96,215, 86,114,137,
+116,161,205, 4, 5, 35,163,204, 96, 92,139,216, 53,238,168, 96,204,212,190, 5, 50,246, 74,150, 91,113,177, 43,200,204,115,231,
+102, 14,236,255, 30,219,132, 34,215, 0, 0,248,199,142, 30, 45, 54,199, 50,179,135,204, 49,231,246,190, 76,100, 40, 50, 86, 97,
+121,102, 87,252,168,226,218,228,207, 30,217,255, 8, 23,250,123,198,205,224,190,125,251,150,150,150,106,181,218,179,173, 45,244,
+227,125, 48,115, 95, 95, 95,127,127,191, 15, 0,245,122,253,228,201,147,255,165,148, 39,146, 60,251,251,251,197,127, 41,226, 63,
+ 88, 59,241, 63,112,123,243,135,252, 0,223,239,235,235,171, 86,171,157,157,157, 29, 29,213,106,181,163, 84, 42, 3,112, 16, 4,
+ 81, 20,197,113,220,106,181,194, 48,108,181, 90,255, 89, 20, 52, 60, 60,124,235,173,183,222,246,202,159,182,160, 41,228,237, 45,
+ 83,220,153, 62, 72, 54,212,102, 1, 90,109, 9,181,231,102,102,254,233,159, 62,255,165, 47,127,229,217,226,137,246,237,219,247,
+248,227,143, 63,117, 7,248,105, 31,107,215,174,251,133, 95,252,133,203,247,238, 43,149,202,150,116,237, 50,115,202,146,152, 44,
+ 87,113, 12,103,109, 41, 49, 58,107,202,153, 9, 99,195,246, 85, 74,157, 61,125,234, 27,119,222,249,249,127,190,227,199,162,154,
+209,209,209,241,241,241, 31,201,130, 86,174, 92,249,166, 55,191,229,218,107,175, 99, 68,145,181,172, 5, 34, 35, 51, 35, 35,163,
+ 99,174, 1,186, 42,199,212,202,200,150, 4, 7,128, 2,208,244, 64, 4,162,135, 2, 16, 60, 1,224, 1,174, 89, 55,242,147, 55,
+223,114,211, 77, 47,142,163,240,175,255,230, 83,119,127,251,158,255, 48, 91,108,106,106,234, 67,191,255,145,222,222, 94, 33, 60,
+ 70, 48,173,241,156,250,152, 33, 77, 92, 44,210, 10,156,236,156,143,152,189, 25,243, 58,145, 45, 0,139, 40, 60,207, 3,230,114,
+165,122,219,109, 47,127,233,173,183, 28, 59,122,244,195,127,240, 81,254,119, 84,144, 55, 54, 54, 86,171,213,190, 31,167,225,137,
+143, 77,155, 54,125,234,239,254,239,109,175,120,101,185, 82, 17,194,195, 2,128,226,120,127,109, 57,106,219,172,105, 27,249, 32,
+239,250,231,165, 2,216,182, 49, 45,171, 53,236,110,133,238,158,158,171,174,216,187,162, 90, 61,120,232,240,191,181,106,122,123,
+123,251,250,250,126, 48, 11,122,211,155,223,124,219, 43, 94, 41,132,111, 81, 85,178,232,113, 94,160, 88,187, 33,206,190, 23, 8,
+ 34,121,121,196, 69,118, 4, 23, 74,187,204, 79, 65,161,160,179,168,158,237,198,121,165, 61,123,246,236,222,185,227, 19,127,242,
+167,103,103,206, 61, 91,182,152,231,121, 95,184,227,139, 43,186,186, 12,158, 38, 0,137, 93,165,148,161,109, 25, 75, 54, 35,213,
+ 22,149,148,213,138, 38,138, 17, 51, 91, 55,205,142, 28,144, 35, 78,203, 11,166,108,251, 89, 66,137, 40,149, 94,243, 51,175,252,
+251, 79,127,238,192,193, 67, 63,254, 68,113,120,120,248, 47,255,242,175, 58, 58, 86,176,173,161, 29,251, 54,139, 66,108,227, 16,
+187, 39,197, 94,150,105,183,113,198, 20,177,109, 68,219,131, 43,244,217,114,246, 17,217,241,118, 71,215,200, 63,208,106,205,224,
+154, 55, 94,127,221,222, 75,246,252,248, 45,232,253,239,127,255,234,181,107,137, 9,137, 81, 8,208,136,224,200,251,174,186,254,
+126, 21, 51, 23, 39, 2, 51, 54, 44,155, 81, 12,203,104,161,108,236,176, 48, 29,232,102, 65,136, 51,138,172,115, 86,128, 32,204,
+ 36, 9,240, 69, 23, 95, 56, 59, 63,255,216,161,163, 63, 54, 5,189,227, 29,239, 24, 29, 27, 35, 77,128, 44,132, 48, 52,117,132,
+ 2,206,152,161, 13,102,103,101, 95,219,144,162,130,103, 38,183,209,204,208,170,214, 25,191,206, 40,174, 72, 43,177,108, 23,211,
+200,181,140, 8,225,121,190,239, 99,185,220,221,213,213,229,121,162,167,167,255, 99,159,248,163, 32, 8,179, 6,217,191,159,130,
+214,174, 93,187,119,239, 94, 41,149,240, 88, 8,193, 22, 28, 71,120, 50, 5, 21,112,254,140,143, 94,228,207, 17,183,135, 45,199,
+234,115, 27,202,106,199,204,208,228,163, 98,153, 35, 55, 97,191,111, 96, 96,108,124,195,138, 21,157,224,248,219,227,155, 38,247,
+ 61,255, 5,228,216, 49, 90,202, 48, 12, 27,245,218,191,254,235,191,124,250, 31, 62,155, 36,201,191,161,130,246,237,221,107,250,
+ 96,192, 64,130, 17,201,106,199,133,246, 34,100, 90,132, 32,185, 77, 79,142,178, 95,112,216,153,118, 10, 3,188, 84,200,177,173,
+ 25,153,217,102, 68, 96,128,238,158,222, 45,147, 83, 43, 86,172,200, 45,148,136,144,124, 20, 68, 26, 81, 48,160, 7, 0, 12,213,
+ 21,157,165,114,229,134,155,110,126,209,139,110,144, 42, 61,116,232,208,223,252,205,167,142, 30, 61,118,254, 21,180,126,253,122,
+227, 91,153, 25, 8,179,198,189,157,197, 3, 40, 96,234,185, 25,229,241,135,178,120,191, 44,150, 81, 62,166,108,102, 64,237, 86,
+203, 92,144, 54,243,254,238,163,112,227,230,205,107,215,173,179,203, 35,132, 9,151,102,157,216,146, 12,204,155,133, 97, 76, 9,
+ 65,190,231, 41,102,143, 97,211,166, 45,239,120,251,219,149, 76,239,184,227,142,127,252,252, 23,206,155,130,124,223,175, 84,202,
+ 90,105, 38, 70, 33,132,157, 81, 68,204,170,132,162,126,218,176,218, 54,212,215,142,161, 20,195,124,161,137,228, 28,119,129,145,
+ 73,164,137,144, 25,132, 0,102,225,249,219,119,238,238,236,236,108,211, 62, 23, 6,193,205, 68, 65,238,195,193, 54,246,209,229,
+ 78, 40, 60,191, 68,196,207,123,254,213,151, 93,122,233,199, 63,241,137, 99,143,159, 56, 63, 22,100,122,204, 66,120, 66, 8, 18,
+194, 54,231, 16,224, 9,236, 7, 46,228,139,217,126,179, 99, 60, 68, 79, 14, 6,231,221,204,182,228,219,244, 82, 81, 8, 6, 88,
+209,217, 57,185,109,186, 82,174, 20,251, 37,185,219,207, 78,127,201,117,107,153, 57,153,231,114,108, 89,179,178, 66,248,254,107,
+ 94,253, 51,223,121,240,193, 79,127,246, 31,153,249, 71, 82,144, 82, 42, 8, 67,173, 20,123, 76, 36,208, 45,136,213, 78, 97, 70,
+143,219,113,255,220,144,242, 25, 44,211,102,115,143,172,247,239,121,204, 76,236, 17, 17,161,176,199, 48, 8,207, 52, 73, 75,229,
+242,228,212,180,239,151,180,166, 66, 36, 40,204, 63, 25, 54,144,115, 2,218,206,171,230,212,220,108,199,178,107, 17, 0, 8, 6,
+220,182,109, 90, 74,249,185,127,250,194, 15,169,160, 53,107,214,252,214,251,222, 55,185,117,235,204,233, 83,245, 70,195, 99, 54,
+233, 43,228, 14, 8,219,173, 7,158,124,135, 89, 62,141,101, 43, 34,218, 32,221,211,219,211,211,221, 35, 60,145, 37,146, 74, 42,
+165, 82,101,143,132, 74,181,214,136,162,186,162,211,243,252,172, 73, 74,133,194, 36,203, 26, 52, 17,179,118, 36,101,205, 54,245,
+ 84, 69, 62,110,193,186,220, 72, 24,194,196,228,196,222,165,197,111,124,243,158,167, 87, 80,102,105, 23, 92,112,193,207,191,233,
+ 77,211,219,183, 35, 10,102, 16, 66,120,126, 9,128, 73,107, 68, 34,182, 83,192,203, 27, 0, 54, 3,106,239,167,101, 44, 78,225,
+ 9, 79, 8, 33,202,149,242,208,224,112, 87, 87,151,109,234,155, 12, 64, 24,236, 3, 60,159, 25, 74,204,192,140,196,192, 32,211,
+ 36, 9,231,103,231,231,206,173, 92,189,174,175,127,192, 28, 95,150,199,187, 76, 75,164,205,113, 91,236,200,156,236, 88,114,110,
+230, 88, 21,105,128,198,156,180, 34, 38,222,182,117,235,195,251, 15, 44,213, 27, 79,165, 32,211,223,120,237,107,127,246,250, 27,
+111, 80, 74, 3,160, 16,134,123,134,136,216,213,221,189,180,184, 96,237, 66,107, 88,166, 32,203, 30,104, 51, 33,215,143, 66, 33,
+ 80,160, 64,132,106, 71,199,234, 53,107,202,149, 14, 68, 64, 16,134,162,239,242,196,220,217, 26,208,131, 93, 14, 33,132,135,232,
+ 73, 25,159, 56,118,248,212,113,111,124,211,132, 73,196,178, 89,185,204,197,187, 28, 51, 59,132, 42,163,111, 82,126, 72,129,157,
+206,182,167, 23, 25,189, 17,240,216,232,250,165,239, 61,242, 52, 10,122,249,109,183, 93,243,130,107,137,216,243,124, 96, 6, 67,
+225, 1, 4,128,158,190,193,205,213,206, 19, 71, 15, 39,105,106, 42, 69, 87,171, 35, 50, 16, 80,129,247,148, 79,114, 2,176,231,
+121,198,148, 6, 7, 7,251,250,251,132,240,152, 8, 16, 9,138,115,130, 69,130,127,150, 22,178,171,195,140,109,162, 38, 74,146,
+228,192,254,239,142,140,111, 44,149, 43, 70,145,214,142,128, 51, 42,173, 35,251, 22,184,182, 42, 99,152,231,231, 16,216,179, 19,
+210, 84,166,169,146,178,163,163,252, 52, 85,250,232,232,232,196,228,214, 77,155, 55, 91, 64, 1,156, 51, 22,118,140,220,243,188,
+193,225, 85, 3, 67,195,229, 74,135, 84,169, 86,218,210,171,242, 16,111,226, 84,158, 69, 35,162, 97,134,173, 92, 57,216,217,217,
+ 9,110, 32,158, 11, 64,107,182, 15,220,193,126,150,196, 74,170,200, 66,181,119,102,136,127, 51,103, 78,117,118,246, 0,176,214,
+202, 2,180, 82,102,111,165,236,111, 40, 35,118, 26, 78,174, 44,144, 74,237,128,178,148, 73,146, 70,105, 20,108,218,180,241,197,
+ 55,221,148,164,201,137,147,167,158, 10, 15, 66, 20, 0, 4, 88, 12,225,104,200, 55,102,184,216,243,252,254,129,193,254,129, 1,
+ 96, 78,149, 10,131, 32, 10, 90, 81, 28,165,105,170,164, 66, 55,254, 10,194,100, 74, 0, 0,221, 93, 93, 2,133, 82,154, 65, 9,
+102,227,223, 51, 53, 22, 82,158,226,172,131,206,136,237,202,158,139, 97,184,186,148, 38, 73,154,166, 7, 30,249,238,196,212, 14,
+227, 4,218,243,112, 42,164,152,249,129,111, 74,103, 84,125,199, 63,149,134,100, 25,199, 97, 24, 69,173,145,238,141, 43, 58,187,
+ 95,124,227,141,225, 7,206, 58, 0, 0, 9, 64, 73, 68, 65, 84,207,191,234,138, 63,251,139,191,126, 98,126,228,134,234,209, 18,
+134,218, 19, 28, 70, 64, 55, 64,106,152, 57, 0,128, 37,223,235,237,237,237,233,233, 53,211,183, 89,169,105,206,138, 76,211, 84,
+ 41,201,204,190, 96,165, 36, 8, 33, 52,101, 73,102, 86,148, 80, 54, 22,227,176, 17,123, 50,135,178, 49, 77, 75, 37, 11,199,139,
+164, 82,166, 73,204, 0,179, 51,103, 6,135, 87,121, 46,164, 50, 81,166, 5,139,159, 20,103, 56,156, 85,154,232,168,164,148,105,
+156,196,113, 18,135, 81,208, 96,134,145,241, 77, 74, 74,207,247,187,187,251, 94,247, 63, 94, 27,180, 26, 31,250,131,143, 55, 26,
+205, 39,134,121, 92,174,157, 28, 39,182,155,198, 80,225, 12,255,212,233, 11, 1, 88, 8, 32,242,124, 31,125,223,175, 86, 59, 50,
+106,232,194,236,153, 56,138, 53,177, 16, 30, 10, 47,111, 1, 25, 35,202,121,252,230, 4,156,118,126,183,155,137,176,252,221, 56,
+ 78,226, 40,142,162,145,177, 13, 23, 92,180, 7,128,211, 36, 78,146, 52,142,163, 64, 74,153, 74,231,137,149, 61, 26,198, 1, 79,
+133, 1, 6, 41,101, 42,147, 36, 77,227, 36, 14,147,176,149, 36,233,190,171,175,147, 82,122,158,103,152,127, 62, 64, 87,119,239,
+ 59,223,246,230,239, 62,244,208,223,253,253,255, 51,110,213,127,178,190, 61, 88, 45,160,229,119,182,143, 31,131, 59,160, 0,208,
+ 58,105, 68, 75,206, 7,167, 4, 68,132, 82,185,163,209,168, 75,165, 60,223, 55, 37, 18,184,227, 93,178,244,186,224,167, 85,166,
+159,194,236,136, 37,138,166,105,162, 82,249,223, 46,191, 98, 98,114,202,252, 82,168,146,231,107,207,243,124, 95, 32,235, 40,104,
+ 37,238,104, 41, 98, 50, 83, 7,214,135,105, 59,242, 33,211, 36, 77,227, 36, 10,146, 36,212, 10,118, 93,124,137, 57,226,192,228,
+ 34,204, 96,149,193,184,115,199,238,169,201,173, 95,249,151,111,124,223, 68,209, 4, 28,100, 52,179,124,150,243,135,192,100, 14,
+ 8,195,204,130,152,185,160, 29,195, 24, 1, 68, 70,196,158,190,129,165,197,133, 56,142, 49, 73,209,243,138,233,101, 86, 49, 56,
+228,199,156, 91,105, 14,154, 41, 44,185,148, 73,146, 40,153, 40,165, 46,124,206,115, 55,108,220,146,166,169,213,157, 97,208, 43,
+165,181, 37,153,197, 65, 99,245,250,209,205, 19,219, 58, 87,172, 32,230, 56, 10,131, 86,115, 97,126,246,216,145,195,103,207,156,
+ 52,132,238, 52, 9,210, 52, 97,246,183,237,220, 61,188,114,181,231, 9,223, 46,158, 1,115,136,205, 56, 3,251,136,213, 45,155,
+ 55, 31, 57,118,220,207,168,183,217,225, 11,206, 87, 96,118, 76,131,113, 68, 64,198, 82,204,214,202, 15, 39, 48,217, 29,160,225,
+ 71,187, 31,129, 1, 96,108,227,150, 51,167, 79, 46,204,206, 2,130,249,117,110,167,217,217, 55, 68, 76, 79,136, 91,198,107, 36,
+137,148, 50,137,163,233, 93, 23,140,140,111, 8,195,150,225, 63,154, 81, 32,123, 90, 97, 28,199,177,217, 57,105,217, 47,245,244,
+244,154, 72,101,124,187, 95,170,172, 90,189, 78, 43,117,228,224,126, 41,147,222,190,193,137,109,187, 6,135,134, 77,101,231,121,
+ 2, 13, 4,232, 26, 2,136,108, 52, 4,204, 38, 20,248,133,141, 69,232, 34,151, 25,104, 65, 4,115,219, 64,128, 0,140,100, 52,
+ 99,189, 53,177,181, 53, 59,178, 0, 69,155, 34,178, 58, 90,189,102,221,224,208,202, 51,167, 78,204,207,205,185, 97, 87,157, 87,
+241, 25,252,147, 71,176,108,192, 35,213, 74,166, 73, 50, 50,190,113,116,116,188, 81,171,153,141,105,189, 84,154,166,210,158,182,
+ 18,134, 65,179,209,104,214,107,196, 28, 70, 97, 18,199,230,232, 67,115,238, 73, 20, 71, 12,112,249, 85, 47, 28, 24, 90,105, 60,
+122, 97,216,213,226, 49,104,103,121, 80, 8,212, 44, 4,122, 44,216, 76,239, 22, 78, 38, 52, 53,138,217, 81,104,249,184,118,170,
+ 22,209,170, 9,201,176,224, 1,173, 5, 89,227,202,211,104, 2, 51,155, 7,185, 16,158,231,141,140,110, 24, 29,223, 40,165,156,
+ 57,123,122,126,246, 92, 20,199, 42, 77,117, 1,198, 55,150, 67,133,137, 80,163,190,222,190,129,177, 13,155,154,205, 70,134,105,
+ 91, 15, 85,160,213,151, 74,254,115, 47,221,187,102,221,186, 36,138,130, 48, 8,154,141, 56,138,194, 56,142,194, 40, 8, 90,245,
+218, 82,125,113,126,116,124,131, 64,212,136, 38, 25,206, 60, 96,145, 13,148,129, 57, 86, 85,136,174, 22, 3,199, 39,181, 30,199,
+ 53, 72,209,113,107,201, 88,142,161,188, 18, 34, 18, 25, 15,141, 76,224,182, 27,184, 60,128, 32,227,204,185, 20,193,236, 41, 33,
+196,218,117, 35,171, 86,175, 37,109,206,174, 34,115, 48, 83, 28, 69,113, 28, 75,153,154,132,171,163,163, 82,233,232, 40,151, 43,
+158,231,155,236, 73, 41, 57,123,110,166, 81,175,103,213,108,154,202, 36,142, 7,134,134, 94,112,221,245, 93,221,221, 74,107, 37,
+165,182, 3,189,101,130, 56, 14,131,115,103, 78, 37, 82,141,140,140,142,143,143,247,244,246,187,238, 47, 16, 35,100, 7,188,184,
+187,182,171, 92,128,144, 32, 83,144,241, 65,196,206, 44,236, 43, 86, 91,166,175,236,250, 93, 89, 24,178, 91, 42,203,165, 33,159,
+248,176,190,216,158, 91, 66, 86, 71,156,119,182, 64,120, 2,201, 23,101,246,201,175,148, 43,157, 93, 93, 14, 68, 2,215,144,110,
+ 35, 30,150, 74,165,117,235, 71,214,173, 31, 73,146,164,209,168, 55,235, 53,165,244,218,117,107, 87,174, 90, 35,132, 23,134,161,
+ 57, 76,201, 29, 86, 27,197,113,156, 74, 37, 60,255,178,231, 94,222, 63, 48, 84,175,215,102,206,156,210, 90,245,246, 13, 2,105,
+123,224, 77, 27,105, 60,203,140, 1, 51,186,122, 49, 15,114,100, 96, 75,198, 6,116,238,197, 29,107, 99, 67, 25, 18, 24,234, 50,
+218,222,133,243, 59,224,252,119,222,108,119,202,129, 12,157,198, 12, 57, 96, 70,129, 64, 54,243,102, 34, 70, 64,147,119, 34,230,
+115, 7, 54,104,228,236, 91,223,247, 7, 6, 6, 7, 6, 6, 75,165, 82,185, 82,105,212,235,230, 79, 76,154,234,142, 5,143,194,
+160,213,168,215,234, 75,139, 81, 24,122, 94,109,118,102,102,118,118,182,115, 69,117,106,219,234,102,179,213,168,215,149,214, 8,
+ 72,121,104, 42, 80, 43,156,203,118, 3, 9, 14, 14, 68, 32, 51,180, 1,228, 56,229,104, 41, 26,144,185, 25, 66, 35,177,157,156,
+ 2,180, 21,168,123, 98,148, 96,206,252, 49, 57, 81,198,118,183,102,230,190, 58,238, 42,102,104, 11,101, 84, 86, 51, 11, 81,168,
+245, 10,252,101,187, 38,105,154,104,173, 65,136,249,217,217, 36,137,178, 67,253,146, 36, 10,195,160, 81, 91, 82, 74, 93,127,243,
+ 79, 85,202,149,197,133,133, 40,106,237,218,125,193,218,245, 99,105,154, 18,163, 82,122,110,246,156, 82,178, 90, 93,145,121,208,
+204, 65,112,129,190, 95,220, 98,118, 43,100, 80, 60,103, 63, 58,164,199,109, 57,206,246, 90,230,146, 17, 41,203,158, 12, 33, 57,
+ 59, 80,213,106, 33, 75,160,193,157, 18,230,158, 59, 94,120, 1,173,205,231,162,138,108,121,112,149,161, 53, 72,210, 41, 0, 12,
+ 12, 14, 70, 97, 56,119,110,102,110,118,102,105, 97, 62, 12, 26, 68,180,117,122,215,214,233, 29, 81, 16, 46,206, 47, 52,234,181,
+179,103, 78, 35,138, 82,185, 34,149,138,163,168,213,108, 52,155,141,218,226,252,198, 45,147, 25, 13,218,221,118,190,197, 10,128,
+ 89,113,148,192,121, 17,231,167, 45, 3,127, 57,175, 28,178, 33,242, 12, 42,198, 39, 78, 36,128, 59,189, 41,119, 93,144,205,152,
+112,222,214,167,172, 45,194, 57,232,214,246, 23, 79, 0,115,243, 87,168,163,218,177,126,108,108,221,232, 40,216,249, 8, 66,196,
+ 70,189,126,230,244,201,249,217,115,181,165,249,169,233, 93,187, 47,188,216,243,132,249,167, 5,230,103,207, 29,124,244,123, 27,
+ 55, 79,186,251,201, 8, 41,121, 37,180,172, 22,115,242,145, 1,155, 25,237, 52,148,245, 48,198,129, 48, 0,130,113,205,228,234,
+ 68,123,106,134,233, 83,161,157, 99,194,162,146,140, 26,201,213,187,152,245,203,204,188, 28, 20, 38, 81,156,199,167,220,219,183,
+209,196,115, 88,186,125, 22,160,205,137,178,157, 97,168, 86, 87,108,216,180,101,211,230,137,145,177, 13, 29,149, 10, 49, 40, 37,
+117,146,150, 74,229, 85,171,215,148, 74,126,119, 79,159,251,252,130, 62,218,248, 77,237, 91,172,109,205,172, 55, 33,114, 69, 87,
+110,241,100, 53,146,213, 85,133,164, 11,218,166, 33,160, 48, 6, 98,247, 17,113, 14, 62, 82,214, 12,113, 86, 5,109, 83,126,206,
+180,219, 59, 3,109, 70,152,143,154,112, 62, 71, 6,133,115,225, 0, 69, 24,134,205, 70, 61, 3, 27,130, 86,171, 86,175, 45, 44,
+204,151, 43, 29,229, 74,199, 19, 40,247,185, 68,109,152,180, 61, 81,173, 72,242,202,176,242,162,249, 67,230, 92,218,125,103,161,
+229,144,137,159, 77,183, 33,187,193,174,236,207,178, 17, 21,204, 90, 62,249, 13, 22,118,110,251,230, 2,104, 27,240, 41,236,186,
+101, 93,221,108, 69,148,146,115,231,102,152,121,105,113, 33, 12,131, 36, 78, 90,205,250,236,185,211,131,131, 43, 43, 29, 29,133,
+107, 64,225,150,218,116, 84, 60,227,219,185,158,226, 68,196,114,243,103,123,140, 95,225,130,136, 46, 11, 71, 4, 87,114,216,253,
+106,175,233, 90,244, 5,215, 13,238, 68, 64, 42,220, 33, 96,225, 88, 55, 40,206,122,180, 53,254,219,242,116,230,246, 78, 65,118,
+ 32,162,125,193,252,139, 10,155, 38, 38,251,251, 7,194, 48, 60,254,248,145,129,193,193,129,225, 85,224,230,222,184,253, 52, 32,
+200, 52,196,208,150, 73, 23,124,159, 65,254, 48,223,255,136,121,255,130,184, 77,167,110,212, 44, 63,100,208,165, 0,246,192, 26,
+116, 25, 22, 20,156, 97,123,171, 49,183, 91,130,246,125,199,197,136,198,197,121, 46,224, 39,106,135,139,174, 40, 63, 95,136,137,
+120,126,110,246,220,217,179, 65,171, 9,166,224, 82, 74, 20, 28, 34, 44, 87,112,254, 17, 62, 20,224,171,194, 70,207,162, 48, 47,
+ 27, 5,202,120,207, 8, 80,140, 44, 46,169,228, 98,218, 84,152,139, 5, 42, 72,142,128,150, 44, 12,109, 33,105,249,184,142,203,
+ 85,157,229,180,109, 53,104,211, 68,150,142,112,251, 49,144,246,147, 85, 42, 81,224,170, 53,107,130, 86,112,234,248,209,114,185,
+210, 81,237, 44,208,115, 96, 25,173, 50, 91, 51,127,249,252, 6, 60,233, 11,110,106,221,121, 41,155, 4, 50,100, 19,238,214,205,
+160, 69,244, 41, 67,182, 93, 6,144,229,233,150, 28,204,152, 21, 47, 5, 47,189, 76, 7, 80,172, 62,242,153,185,229,219, 43, 91,
+200,124,107, 44, 31,243, 2, 32,173,107, 75, 75,164,105,124,211, 68,158, 65, 0,180,157, 56,153, 7,163, 2,145,188,205,146,255,
+ 51, 78,245,192, 19,255, 73,146,204, 62,254, 63,235,161, 95,175,171,129, 25,182, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/blur.png.c b/source/blender/editors/datafiles/blur.png.c
new file mode 100644
index 00000000000..d737bea4ae3
--- /dev/null
+++ b/source/blender/editors/datafiles/blur.png.c
@@ -0,0 +1,298 @@
+/* DataToC output of file <blur_png> */
+
+int datatoc_blur_png_size= 9327;
+char datatoc_blur_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68,
+ 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0, 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,252,
+ 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215,
+ 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7, 21, 0, 4, 16,211, 77, 59, 52, 0, 0, 32, 0,
+ 73, 68, 65, 84,120,218,237,125, 89,172,109,217, 85,221, 24,115,173,125,206,185,205,171,215, 84,231,178, 41,155,234,136,171, 30,
+ 54,174,206,101, 19, 18, 59,177,171,140, 76,172, 96,132,137, 2, 31, 65, 10,157,146,208,217,198, 54, 54, 16, 41,182, 48,144, 31,
+ 48, 31,129, 8, 16, 40,226, 35, 16,164,240,199, 87, 76,147, 16, 97, 3, 70, 33, 64,117, 70,118,217, 46, 85,149,171,185,239,246,
+231,236,189,230,204,199,156,107,237,125,238,189, 85,101, 7, 19, 5,169,206,123,186,205,121,231,236,179,246, 92,179, 29,115,204,
+245,128, 47,247,241,178, 27,110,184,233,166,155, 79, 63, 79, 0,239,255,192, 7, 75, 25, 8,136, 8, 69,114,206, 93,206,185,235,
+ 62,244,193, 31,245, 23,165, 31,248,193, 31,234,251, 85, 41,131,170, 22, 85,213, 98,254, 80,125,235, 91,239,127,240,161, 7,247,
+247,246,100,181, 90,246,171, 85,191,234,251,161, 31,250,126,181, 92,245,125,111,106,170,101,181, 90,125,223,247,126, 95,215,117,
+124,215, 63,255,206,255,253,232,225,222, 81, 33,229,214,175,218,120,217, 53,139, 11, 87,205,183, 55, 55, 82, 74, 36, 41, 50,235,
+186,244,220,240,202,101, 95,204,204,212, 72,187,178,215,155, 33, 39,146,166, 58,248, 39,167,173, 75,183, 18,128, 1,134,156, 96,
+102, 71,199,101,213,151,237,141, 68,129,193,104, 72,219,151,110, 53, 51,127,213, 44, 67, 13,123,135,195,147,207,246, 7,135,229,
+218,139, 29, 9, 0,105,235,194, 45,100,188,168,203, 60, 90,150,161, 87,144,251, 7,229,209,207, 31, 13, 5,215, 92,232,120,237,
+205,111, 33, 18, 4, 52,154, 8, 65, 18, 68, 98, 74,164,144, 2,201,217,212,140, 5,133, 34,132,194, 8, 64, 0,133, 1,128,145,
+ 9,250, 37,109, 87,106, 63,109,108,108,222,120,227,141, 34, 60, 58, 58, 58,185,119,119,221,117,215, 91,222,122,191,153, 9, 73,
+145,148,146,111,220,239,252,206,239,252,143,255,254, 7,241,162, 31,248,129, 31, 52, 24, 65, 17,161, 48, 73,202,254,232,186,156,
+243,143,125,232,131, 0,100, 85, 55,174, 31,250,213,114,181,234, 87,165, 20, 83,235,251,213,106,181,252,240,135, 63, 2,128,111,
+126,219,119, 60,250,249, 99,146,243, 89,190,227,230,205,107, 46,204,175,218,222, 88, 44,230, 36, 1,228,156,231,139, 69, 90,230,
+155, 0,168,154, 16,203, 85,217, 59, 44,179, 76, 18,106, 5, 48,168,169, 89,218,186,230, 54,154, 2, 72,201, 4, 90,212, 14,143,
+134,156,177,232, 8,139, 63,105,235,210,173, 52, 0, 72, 68,162,153,225,169,157,254,137, 47, 46, 47,158,239,230, 51,186, 72,211,
+214,165,155, 1, 51, 0,180,156,184,123, 56,152,161,168,125,254,137,213,231,159, 90, 94,127,105,214,117,228,181, 55,189,149, 34,
+160, 16, 48, 80, 72, 8,193, 68, 36, 74, 74,146, 32, 57, 43, 84,204,104, 48, 0, 66, 83, 18,164, 8, 80,226,109,166,248, 74, 61,
+ 56,253,229,135,126,248,221, 91,155, 91,190, 73,254,135, 66,161, 72, 18,146, 73,210,199, 62,246,179, 79, 62,249,228,217, 23,122,
+239,143,188,175,104,129, 1,106,126, 89,162,222,162, 16,160, 36,138, 8, 41, 41, 37, 33, 83, 74, 34, 41,231,252,129, 15,188,111,
+237, 66,255,234, 95,255, 27,192,239, 30, 0, 56,121,128, 32, 41, 34, 34,146, 36,165,148,124,121,238, 50, 68, 36,229,252,107,191,
+246,171,143, 60,252, 48,128,220,175, 86, 0,212,108,185,178,189,195, 65,141, 91, 27,233,194,118, 30, 10,134,130, 46, 75,151, 83,
+215, 37,100,144,204,146, 76,213, 12,165, 20, 10,101, 24,190,253,219,191, 35,165,244, 19, 63,254, 99,252,234,215,126, 75, 81, 43,
+197,111,138, 0, 32, 92,116,114,254, 92, 78, 73,206,109,164,139, 87,117,219, 91,179,141, 69, 55,235,114,215,165, 36, 52, 3,233,
+139,151,228, 75,235,114,218, 56,127,155,170,186,158,208, 20,132,169,145, 16, 90, 25,236,120, 85,118, 15,135,189,253,254,232,120,
+232,251,162,165, 20, 45,106,170,170, 48, 51,109,174,206,210,246,213,183, 2, 10,133, 65, 73,194,212,128,148, 84,104,106,166, 69,
+139, 90, 41,122,112, 92,174,236,245,203, 85,217,152,145, 48,162, 93,196,212,212,204,120,253,173,111,131, 9, 4, 6,250, 23, 51,
+235,114,154,207, 8, 64,200,227,222,134, 66,128, 20, 18, 36,185,177,200,175,124,217,226, 85, 55,108,204,187,148,179,248,118,240,
+218, 91,238, 7, 72,208,252, 27, 5, 48,128, 27,243, 52, 12, 54,168,185,223, 17,208, 32, 20,129,133,112, 92,160,164,108,111,230,
+ 75, 23,230, 89,181,248, 62, 3, 0,196,180,248,234, 14,143, 53,180,138,164,153,145, 32, 80, 12, 34, 0, 76,139, 43,155, 26,246,
+143,134,131, 99,205,102,234,154, 12, 10, 66,216, 20,154,251,106, 24, 77, 40, 6,136, 59, 70,129, 21, 64, 8, 49, 40,140,164,153,
+194,196,240,255,221,131,103, 62,123,241,226,197, 11, 23, 46, 2, 88, 46,143,119,118,118, 14, 15, 15,191,140, 11,221,122,219,109,
+239,122,215,183,185, 3,101,253,230,166, 47, 34, 41,165,157,157, 43,255,254,103,126,234,133, 46,244,129, 31,253,160, 22, 53, 51,
+183, 93, 2, 20,169, 54, 32,213,104, 69, 82, 74,146,114,151,223,255,190, 31, 57,227, 66,239,126,207,123,171,231, 13,149, 33, 41,
+ 97,252, 32, 19,133, 41,133, 27, 73,226, 75, 76,143,125,238,177, 95,252,133,255, 48,189,144, 12,195,208, 15,253, 48, 12, 67, 25,
+134, 50,104, 25,180, 12,165,148, 50,184, 93, 13, 90, 74, 25,138,150, 82,134, 97, 40,131,127,189,241,198, 27,127,234,167,127,230,
+228,133, 74,252,245, 55,251, 99, 24,191,123, 42,226,182, 85,180,104, 41,195, 48,244,125,191, 90,253,228, 71, 71,145,137,150,162,
+237,225, 6,168,102,234, 43,136,171,169, 42,253,230, 9, 40,212,124,149,195, 48, 12, 31,253,232, 79, 71, 76,190,243,206,187, 12,
+182, 92,150,103,118, 86, 87,246,203, 48, 20, 17,154,233,170,215,126, 80,115,203,138, 52, 70, 72,152, 33,182,165,254,240,154,215,
+188,230, 19,127,244, 71,121,103,127,245,200, 99,199,207,236,244,230,219, 14,118,157, 92,115,190,187,106, 59,111, 45,210,246,150,
+ 45,212, 64, 10,147,168,186,233,121,158,163, 84, 0, 24,134,107,174,190,134, 96, 58,148,155,247, 14, 7, 53, 79, 47,212,204, 84,
+ 49,159, 97,217,235,225, 81,233, 7, 75,130, 36,148,106,215,161, 40,102,102,163,125,221,255,192, 3,105,227,226,215, 64,253, 41,
+ 95, 19,132, 86, 10, 68,160,102,171, 65,151,189, 37, 50, 73,168,174,154,170,105,104,140,191,137, 52,179,116,238,234,191, 7,142,
+ 23,114,103,150, 19, 69, 92,175, 76, 13,253, 96, 66, 72,114,135, 21,110, 97,124,135, 25,192,172, 86,226,190,141, 16, 83, 99, 6,
+ 13, 40, 69,204, 10, 76, 0, 28,152,145, 16, 65,151,145, 40,144,100, 70, 49, 51, 90,232, 49,134, 76,255, 96, 16, 52, 24,104, 48,
+113,191,174, 80, 0,102, 4, 11,175,236,245,170,182, 49, 39, 23, 57, 39, 72, 18, 83, 73, 98,234, 59, 0,164,173,171,111, 53, 51,
+ 16,109, 81, 66,186,116, 61,197,236, 7, 61, 56, 42,123,135,195,206,222,112,112, 84, 54,230,146,147,199, 96,120, 42,136,200, 55,
+ 47,222,194, 42, 72,130,177, 56, 34, 37, 2, 86, 20,203,190,148, 33,196,114,116,172, 95,188,210,175,122,237,178,228, 92,223, 71,
+ 95,209,165, 91, 12,132, 85,175,237, 27, 39, 32, 13,138,163, 85, 81, 37, 0,250,178,193,161,232,149,221,242,228,206,176,179, 55,
+172, 6, 91,204, 36, 39,130,228,117, 55, 63, 0, 26, 32, 32,219,194,114,146,156, 88, 10, 6,141, 24, 2, 8, 1, 80, 40, 2,128,
+ 16,247, 19, 41,165,237,205,124,233,252, 44, 27, 20, 0,161, 48, 81,143, 39,134,126,176,190,104,220, 37,197,220,201,131,180, 48,
+ 26,131,210, 4,128,170,238,238,151,253,195,227, 12,243, 12, 30,100,196, 31,191, 21,154,191, 23, 30, 35,204, 0, 65, 40,159, 17,
+ 52, 19, 19, 55, 23, 49, 5,196,160,190,237, 85,231,141, 6,170,193, 84, 9, 51,143,206, 10,152,153,194, 76, 97,160, 2,160,194,
+180,198,107,131,152,185,250,170,193, 96,170, 10,131,186,174,211,212, 63,160, 46,163, 46, 94,107,129, 66,144, 32,214,236,238,165,
+199,151, 21,103,219,227,230,155,111,185,227,142, 59,110,186,229,150, 75, 23, 47,142,207, 70,230, 7,122,242, 28,223,100,103,103,
+231,225,135, 31,250,243, 63,255, 95,159,254,244,167,191, 50, 11,218,222,222,126,215,187,190,237,134, 27, 94,174,170, 54, 38,204,
+214,114,212,154,197, 3, 99, 92, 31, 31, 50,254, 36, 66, 1,145,187,238,191,252,198,111,252,241, 31,127,242, 75, 87, 14,190,227,
+ 29,239,184,227,142,203,170, 99,136,137, 42,104,125,201,244,220,177, 45,165,254,176,190, 36, 47, 56,198,101,213,133,138,136, 12,
+101,248,143,191,248, 11,159,251,220,231, 94,100, 65, 63,244,195,239, 65,141,117, 39,150,210, 60,211,228,207,218,106,176, 86,102,
+212,181, 96, 92,202, 9,225,137, 36,146, 41,167,127,251, 19, 63,126,124,124,124,118, 1,125,239,189,247, 70,106, 96, 58,166,223,
+147,224,103,167,255, 76,130, 53,108, 44,133,154, 9,215, 40,229,183,232,111,168,105, 61, 76, 85,223,244,166, 55, 63,240,192,219,
+ 62,243,153,207, 60,251,236,179, 39, 23,116,247, 61,247,152,122,220, 60,177,150,168, 49,208, 46,136,246,172,191, 88, 79,188,126,
+ 42, 56,131, 49, 10, 71, 83, 3, 98, 57,227,171,213,244,117,119,222,249,192, 3,111,123,244,145, 71,174, 92,185,210, 22,148,203,
+ 48, 76,172, 39,182,108, 24, 60, 92, 69, 0, 0,145,133,146,188, 90,247,251, 31,119,204, 49,155, 4, 81, 2,132, 64,162,136,133,
+227, 47, 6, 90, 1,104,132,182, 93, 86, 85,138,136,169,126,215,119,127,207,172,155,189,255,253,145,143,166,215,126,221,157,170,
+214, 15,186, 26,116,181,210,131,165, 30, 29,149,231,118,251,189,195, 97,119,127,216, 59, 44,203,149, 30, 29,171, 22, 27, 6, 91,
+245,186, 26,116,213,219, 48,104, 95,148,128,106,168, 94,172,159,145, 81,143, 70,224, 59, 25,126, 25, 85, 95,167,251,104, 69,203,
+ 91,223,114,255,227,143, 63,254,244,211, 79,243,157,223,250, 47, 12,246,244,206,176,187, 63, 28,247,186,127, 88, 92,234,190, 3,
+ 38,160, 17,176,148, 36, 37, 92, 58,223,109,205, 83, 78,220, 92, 8,133,155,139, 36,228,124,150, 68, 56,235,146,136,228,156,146,
+ 80, 82,170, 90, 93,237, 98,221,110, 99,217,174,236,226,133,108, 34,249,123,191,247,113,222,112,251, 63, 13, 32,169, 69,105,131,
+213,223,253,171,153,167, 0,220,152,203,246, 70, 54, 56, 58,196,237, 69, 34,121,225, 92, 78, 89, 54,231, 57, 37,233,114,172, 41,
+101, 17, 74,196,244,137, 93, 78,188, 89, 43, 67,125, 73,226, 95,115,152, 9, 43,248, 96, 58,145,181, 53,117, 17, 82, 4, 69,181,
+ 31, 6, 24, 40, 66,226,202,160, 20, 30,173,138, 16,231,183,187, 89,151, 54,230,105, 54,147,156,210,172, 19,146,174,127, 81,203,
+120,190, 65,105, 18,178,234, 20,172, 22,166, 52,203, 8, 69,101, 20,196, 6, 19,181,106,186,162,102,108, 70,109, 52,233,135, 66,
+ 10,173, 0, 72, 34, 30,244, 1,246,195,138,228,214, 34, 45, 22,121,158,185,185,153, 19,185,177, 72, 36,187, 46,196, 0, 64, 21,
+ 20, 24,163, 98,138, 84,155,160,131,114,102,185,102, 29, 0, 97,230,168, 1, 1,165,167, 34, 36,224, 94,156, 80,154,168,170,208,
+ 10,197,179,148, 34,160,138,187, 43, 33,184, 91,116,239,112,200,137, 87, 45,243,124, 38, 91,155, 11,161,152, 26,200, 18, 91,101,
+ 52,120,193, 47, 16,149, 2, 23, 17, 64,163,208,178,122,122,236, 58,102, 0, 20,254, 46,194,160, 4,105,244,100,136, 98,166, 98,
+ 84, 53,136,194,168, 28,104,108,119,168,171, 1, 7,135,234, 73,220, 23,190,200, 46,203, 19, 79,175,186,196, 87,189, 98, 35, 39,
+110, 45,114, 18,183, 18, 33, 11, 40, 64, 9,171, 17,178, 24, 73, 19,102,247, 19, 48,255, 70,170,175, 22,145, 52, 91,100, 83,142,
+112,169,105,162,136, 65, 1, 49, 19,129, 25,246, 15, 11,140, 69, 35,205, 37,221,202,101,213,151, 39,159, 81,144,207,238,245, 66,
+190,236,234,121,215,241,154, 11,179,141, 69, 74, 34, 93, 54,165, 16, 5, 32, 75,213,112,149,108, 40,142,115,208,106, 14,107, 10,
+ 95,156,129, 84,144, 48,170,154, 99, 27,165, 20, 26, 33, 44,134,163,101, 1, 88,138, 25,104,117,179, 61,123, 36,139, 65, 84,141,
+196,193,145, 2, 60, 94, 41, 5,143,127,113,149, 51, 55, 23,249,220,102, 90,204,210,213, 23,186, 36,156,207, 18, 43,160,147, 61,
+127,245, 93,138,123,244,228, 83, 66,145, 35,243, 84,128,166,106, 40,208, 40,246, 56,148,186,225, 82, 43, 31, 10,204,179,105, 49,
+ 83, 2,102,162, 69, 77,168, 43, 16,232,251,158,228,222,254,240,116,150,156,248,216, 83, 41,145, 27,243, 36, 34,219, 27, 73,146,
+ 56,206,109, 4,169, 36, 21, 74,139, 44,158, 4, 77,205,133, 20, 73, 54,116,105, 94, 52,194,140,158,149,123, 54, 12, 51, 19,143,
+ 14, 48,136,169, 74, 20, 55,234,185, 59,160, 6, 20, 21,154,150, 34, 88, 41, 64, 28, 20, 1,186, 46,145, 92,204, 83, 18,201,128,
+214, 8, 72, 51,186, 45,121, 25,100,172, 5,137,121,142,168,170, 44,138,138, 21,122,188,160,235, 83, 72,211,104, 98, 2,163,193,
+132, 94, 75, 80,196, 91, 9,164, 4,126, 8,139,218, 75,161,130,213,170, 80,100,213, 27,192, 92,245,217,241, 50,215, 28,173, 57,
+ 42,232, 26,239,138, 26, 93, 12, 40,107,145,232, 91,237,118, 97, 38,181,106,209,184, 73, 35, 68,163,234, 16, 2,170, 74, 97, 69,
+216, 4, 6,191,186, 87, 69, 4, 76,144,225,176,156,208,160, 6,161, 42, 71, 39,111, 26, 32, 98, 56,211, 8,242,158,234,132,222,
+ 3,161,238,225,142, 56, 6,250,240, 58,238,225,162, 56, 53, 70, 94, 2, 53,146, 16,152, 25,148, 16, 19, 47,211, 92, 47,155, 82,
+ 48,242, 30, 47,166,217, 50, 52, 53, 53, 56,102, 99,158,137,121,144, 51,131,169, 17, 48,245,152,110,245, 31,105, 80, 83, 16, 80,
+ 76,162,107, 5, 44,234, 30, 71,214,195,150, 83,189,244,120,233,241,183, 90,185,142,185,119,151, 55, 55, 54,103,179,217, 98,177,
+209,117, 29, 34,245,238,143,143,151,203,229,241,193,193, 65,241,174,199,223,234,130,186,174,123,221,235,238,124,245,237,183,191,
+234,149,175, 74,185,118, 28,141,144,176, 51, 47, 1, 61,221, 51,179,191,254,235,191,254,171,191,252,139, 63,249,147, 63, 89,173,
+ 86, 95,225, 5,125,211, 63,121,199,229,203,151,187,220, 53, 24,144,147,166,207,137,202,177, 85,248, 0,188, 21,181, 90,173, 62,
+245,167,127,250,219,191,253, 95,255, 70, 11,202, 57, 95,190,124,249,237,111,255, 38,107,185,107, 67, 38, 39, 37,253,180,194, 95,
+ 47, 78,215, 75,123, 82, 68,118,119,119, 63,246,115, 63,123,112,112,240,229, 45,232,210,165, 75,111,127,251,219, 95,254,242,175,
+114,204,104,146, 77, 79, 94, 52, 77,250, 39, 95,159,119, 77,158,157, 2, 41,167,167,158,124,242,215,126,245, 87, 79, 23,169,103,
+ 47,232,251,191,255,251, 55, 54,182, 70,188,119,189,194, 31, 43, 6,182, 13,155, 74, 41, 74, 29,207,249,167, 85,189,112,186,153,
+ 76, 41, 61,252,208,195,191,242, 43,191,244,226,205,241,127,240, 15,223,164, 69, 13, 86,172,180,170,185,198,132, 86,223,123,110,
+235,145, 36,126,137, 16, 91,235, 62,182,236,105, 44,243,189,252,141,128,112,245,213, 87,191,237, 27,191,241, 15,255,231, 31,246,
+ 47,168,242,233,190,251,222, 96,222,198, 60, 3,107,136,176, 86, 69, 54, 65, 26, 70, 52, 97,130,151,159,126,212, 58, 42, 46,163,
+250,230, 55,253,163,220,117,143, 62,250,200,243, 46,232,245,247,221,183,254,193,147,191,102,167,236,208, 78,255, 24, 88,105, 5,
+243, 57,130, 92,152, 24, 69, 21,173,225,166,175,190,233,213,183,223,254,201, 79,124,226,204, 5,137,169, 70, 12, 87, 13,132,162,
+253,197,243,128, 52, 58, 62,169, 35, 24, 82,119, 25,173, 45, 91, 1,143,250, 17,170,170, 90,138,150, 87,188,252, 21, 31,249,200,
+ 79,158,189,160,232, 9, 77,123, 67,235, 15,255,248,120,213,248,228,248,175,241,161, 21,209,169,242,165, 55, 57, 92, 19,218,213,
+ 74,124, 45, 32,254,221,135, 63,114,150,132,218, 37, 95,224,161, 1,233,180,223, 99, 73, 54, 89, 84,160,146,166, 14, 79, 51,202,
+167,218,237,208,138, 66,169,150,226,226, 19,145, 15,252,232, 7, 79,111,217,243,172,103, 2,151,181,175,254,123,169,210, 80,191,
+242,120, 5,173, 29,152, 9,200, 1,194, 17,204, 41,144, 86,111,228,220,246,185,127,249, 93,223,189,166,212,119,221,117,247,218,
+235, 96,125,111,195, 96, 67,209, 97,176,226,155,160,234,233,103,232, 69,212,132,102, 54,105,147, 87, 44, 67,214, 24, 14,158,222,
+ 6, 36, 83,193,139,168, 82,188,152,185,116,241,210,238,238,238,227,143, 63, 30, 1, 99,226,147,173, 31,204,128,131, 67, 29,130,
+ 56,192,156, 48,159,167, 44,220,222,132, 25,134, 2,192,123, 41,154, 50,133, 34,166,217,196,196, 32, 6,122, 50,172, 41,156, 17,
+ 35,137,175, 25,110, 88, 95, 75,219, 75, 17, 17, 21,188,243, 91,190,229, 47,255,242, 47,188,235,156,190,238,117,119,170,217,114,
+208,161,183,163,149,246,254,117,101,253, 96,195,128, 98,102,198, 82,204,140,253, 96, 69,173,245,141, 61,110, 84,118, 0,166, 96,
+ 79,236,148, 4,172, 54,129,188, 79,248, 12,247,249, 80,179,215,191,254,190, 63,248,253,223, 7,144,247,143,134, 97,176,207, 62,
+177, 84,197,206,110, 63,232, 36,122,213,184, 33, 68, 78,210,101,190,236,234,153, 16, 27,139,156,147,205,103,185,203,150, 18,186,
+ 12, 17, 2, 16, 35,147, 17, 38, 48, 21, 21,101, 32,125,228,186, 15,173, 24,164,168, 66, 76, 53,137,204,231,243,123,239,125,253,
+ 39, 63,249, 9,233,123,237, 7, 45,197, 74, 41,165,185, 20, 53,115, 3,181,106, 22,102, 69,181,168, 14,197, 84,181,168, 21,119,
+ 41, 5,163, 95,138,151,187,209, 5, 47,110,106,243,167,252, 72,152,107, 81, 53,181,111,126,231, 59, 73,166,227,124,203,147,207,
+174, 14,142,202,209, 82, 85,199,232, 25,213,147,177,221,218,162, 75, 6,172, 6, 59, 90,150,195, 35, 93,246,122,188,210, 97,240,
+ 34, 31, 66, 20, 5, 73, 53,215,218,232,172,142, 94, 99, 68,111, 79,236, 88,221, 89,181,171,206, 95,149, 54, 46,125, 77,209,105,
+178, 17, 5, 82, 0,123,244, 21, 17, 98,195, 96,139, 78, 90, 13, 41,194, 68,138,112,214,145, 64, 78, 2, 48, 9, 39,248,221, 90,
+188,107, 79,156,204, 11, 39, 61,130, 27,111,124,101, 58,119,205,171, 81,149,180,226,186, 70, 72, 13, 71,230,215,207, 66, 33, 82,
+ 10,109, 80, 99, 81,237, 7,237,123, 59, 94,233,241, 74, 73,172, 6, 75,130,161,152,227,208,240,230,160, 69,143,207,106, 67,135,
+173,201,203,218,203,142, 90,153, 32,178, 99, 6, 54,130,122,254,175,158, 79,104,244, 91,225, 75,100,120, 71,133,147,102, 10, 65,
+ 88, 79, 5, 48, 12, 42,130,161,168, 8, 75, 81,113, 36, 5, 53,145,106, 88,186, 83,142,124,115, 85,125, 23,160, 80, 17, 66,169,
+204,117,103,213,161,140,128, 17, 76, 39,105,180, 47, 43, 90,144, 37,250,231,116, 26,211, 0,218, 32,170,101,103,207, 59,252, 38,
+ 34,102,160,112,209,137, 8,147,144, 14,189,122,187,181,161, 38, 19, 15, 64, 49, 83,245, 6,109,118, 50, 26,171,136, 28,201,208,
+144,161, 81,131, 99, 64, 9,105,105,189, 1,133, 84,244,216,243,205, 65, 68,230, 75,138,216, 44, 51,101, 22,129,153,144, 72,222,
+ 0,166,176,234,182, 68, 47,184,149,251, 22, 42, 98,150,182,175,190, 45, 80,133,216, 42,135, 94, 67, 80, 70, 58,170,147, 4, 32,
+ 82,244,236, 91,163,189, 53, 92,198, 39, 85,145, 19,213,208,101, 38, 25, 27,240,147,132, 13,103,122, 73,127,105,118,233,195, 96,
+212, 80, 51,142,249,170,139,206, 27,209, 14,141, 58,160,236, 86,234,168,160,131,201, 25, 84,227,254, 97,168, 96,151,211,214, 34,
+128,243,113, 41, 22, 52, 3,227,201, 44, 51, 58, 89,102,217, 91,237,177,188, 64,151, 28, 14, 2, 2, 24, 14, 24,202, 33, 40, 11,
+193,177, 90, 65,160,105, 6, 74,237,197, 44,251, 82,212, 14,142,196, 12, 93,150,156,132,130,148, 4,193,194, 88, 91, 71,213,171,
+120,115,118,109,114, 79,230,242, 8,136, 26,234, 33,187,146, 94,252,157,166,161,146, 1,205,165, 68, 85,205, 73, 74, 41, 7, 43,
+ 28, 30,171, 8,113,133, 0,118,246,134, 89, 39,215, 94,154, 93,125, 85,151,179,108, 44, 60,136, 48, 66,171, 19, 33, 96,161,204,
+ 30,125, 84,115, 80,104,204,129, 55, 54, 40,143, 81, 90,232, 88,246,180,234, 34,136,130,230, 23, 45, 5,203,126,136, 22, 27, 90,
+102,129, 65, 45, 21,237,123, 93, 13,106,134,156, 16,221, 15, 4, 39,195, 73, 42,209,232,169, 4,173,180,125,233, 54, 4,180, 31,
+ 20, 20,178,230,236,140,133, 1,230, 40,113, 74, 16, 9, 71, 65,154, 8,251, 65,151,189,149, 98,131, 66, 53, 20,196,227,253,114,
+101,135, 75,221, 61, 40, 79,239,244, 59,251,195, 48,216,225,177, 46,230, 73,213,146, 96,236, 16,182, 18, 29, 32,144, 39,138,239,
+200,155,192, 17,186,168,157,171, 67, 82, 66,204, 20, 90,235, 11, 18,125,241,212,209,115, 84, 58,218, 74, 42, 76,212, 20, 34, 84,
+150,162, 61,217, 13, 58, 12, 70,154,170, 25, 89,212,132, 69, 36,153, 55, 86, 28,228,134,128,204,149,137,232,253, 21, 97,164,195,
+ 48, 37, 39,118,167, 86,168,110,114, 69, 32, 32, 86, 43,167,128, 82,205, 70, 32, 90, 2,105, 39, 67,241,134,130,162,195,170,151,
+131,227,146, 40, 79, 62,179, 18,225,165,243, 93, 22,185,246,226,108, 54,147, 46, 51,103,168,139,222, 44,135, 10,153, 43,112,227,
+118, 25,221, 67,107,224,194, 38, 81,155, 6,101,217, 51,148, 2,163,154, 17, 84,223,222, 80, 57,103,158, 72, 88,161,129, 84, 93,
+169, 48, 21,208,146,200,214, 70, 26,146, 21, 85, 45,176,148, 44, 90, 41,162,102, 25,222, 72, 96,253, 6, 32, 66, 76, 56, 34, 5,
+105, 6,133, 2,170, 20,232, 96,132, 97, 40,102, 48, 43, 98, 52, 49,130,198,160,228, 68, 91, 84, 43, 84,236, 54, 32,166, 86,228,
+120,165, 2,123,242,153, 21,137,231,118,123, 73,178,152,165,156, 56,239,210, 98,158, 40,146,107, 55, 83,233, 46,135, 17, 93, 61,
+162,132,117,209,252,234, 6, 43,198, 82, 52,186, 68, 90,101,211, 8, 25, 10,136,186, 61,187,215,142,116, 95, 77,133, 2,213,129,
+ 42,214, 31,129,196,225,145, 26,177,152,167, 44,220, 88,228,173, 13, 35,153, 91, 27, 51,114, 1,139,182, 98, 36, 53,170,173,211,
+108,102, 67, 81,127, 14,140,254, 80,203,184, 42, 42, 79, 95, 83,116,186, 68,106, 9, 77,170, 41,163,163,239, 32,188,247, 80,134,
+193, 76,160,203, 82, 20,160,228, 17, 26,111,221,104,173, 96, 61,107,243,171,126,110, 95,154,159,143, 22,150,184, 51, 65,165, 14,
+ 88,229,167,209, 59, 67,198, 86,217, 67,162,177, 58,246,152, 13,100, 63,232, 64,193,160, 71, 71,230,132, 46, 68, 67,211, 57, 81,
+ 21,190, 15,127, 29, 54, 51,102,147, 52,243,108,192, 27,110,206,230,106, 81,170,118, 59,170, 57, 55,196,223,165, 66,255, 55,183,
+116, 27,229, 80,163, 58,188, 64,168,159,166,222,239, 8,118, 60, 21,163, 71, 80,133, 42, 42, 83,144,244,202, 26,209, 55,176,214,
+ 45, 0, 44, 58, 47, 33,194,241, 29,209, 78, 54,163,213, 46, 91,253,103,167,151,209, 96, 6,113, 69,128, 53, 89, 27,148,141, 73,
+226,140, 83,140, 49, 5, 48,213,192, 96,205,181, 9, 99,147,212,170,143, 15,223,197, 42,142,136, 18,214, 42,199,104,164, 90,237,
+248,214,254, 18,133, 33, 0,215, 85,196,213,181, 78,170, 68,169,174,222,113,173,139,171,140, 9, 34,184,162,222,140,140, 98,193,
+223,108,225,239, 45, 74,233,232,203,120, 60, 26,203, 16, 79, 31,226, 26, 74,173,145, 9,166, 53,192, 89, 37,253, 5, 45,175,133,
+153,218, 28,142,178,216, 24, 12,189, 80, 47, 13, 33, 52, 25,185,128,221,141, 57, 12,224, 77,210, 9,144,193, 88,154, 90,109,199,
+ 5, 93, 53,196,235,201,128,182, 69, 88,124,170,153, 65,209,106, 43,212, 36,169,185,226, 74,140, 85,160,142, 1, 85,227,244, 6,
+ 84,160,122,209, 94, 67,237,239,161,181,178,235, 88,136,184,208,195, 38, 12,132,106,248,126,191, 96,101, 20, 40, 53, 90,173,177,
+115, 33,170,192, 53,227, 94,194, 75,120, 94, 21, 27, 55,210,154,162,242,177,120,209,180,114,172,206,236,165,134,217, 75,143,151,
+ 30, 47, 61,254, 78,244, 91, 95,232, 18,228,246,185,115, 87,157, 59,183,181,181,125,254,194,249, 75, 23, 47,157,191,112,225,252,
+ 85, 87,109,110,109,111,109,109,204,102,115,199, 65,177, 6,152,213, 18,200, 48, 12,195,209,209,225,238,222,238,222,222,254, 83,
+ 79, 61,185,191,183,127,101,247,202,222,238,238,206,206,206,222,222,222,223, 61, 1,109,110,110,222,122,219,215,188,226, 21,175,
+184,254,186,235,206,159,191,176,185,181,153,115, 62, 19,244,157,246,103,113, 10,189, 91,251,161,209, 29, 79,241,161,135, 97, 56,
+ 60, 56,188,178,123,229,241,199,191,240,240, 67, 15, 61,242,240,195,195, 87,168,243,253, 21, 19,208,117,215, 93,119,231, 93,119,
+125,237,215,190,118, 62,159,153,141, 89,197,139, 95, 55, 82, 58, 76,112,169,248,149,173,210,142, 66,157,152, 52, 75,167, 13,221,
+152,229,172,164, 80,131,249, 84,215, 99,143,125,246,119, 63,254,241, 7, 31,252, 43, 85,253,127, 42,160,237,237,237,235,175,191,
+254, 53,175,121,237,173,183,222,230,136,142, 77, 7,129,198, 81, 30,123,158,171, 76,148,102,100,177,142,200,216,180,247,255, 2,
+ 93,110, 76, 4, 53,105,125, 75,147,212,200, 21, 16,121,238,185,231,254,224,247,127,239,193, 7, 31,124,230,153,103,254, 86, 4,
+116,221,117,215, 93,190,124,249,166,155,110,186,238,250,235, 75, 81, 39,164,174, 11,197, 94,168,195, 59, 21,208,136,149,243,196,
+243,107,206, 7,103,208,250,207, 36, 3,188,216,147, 81,114,250, 68, 31,192,199, 62,251,153, 63,254,228, 39, 63,245,103,159,234,
+251,254, 43, 35,160, 15,125,232, 67,203, 85,223,122,223, 35,238, 56,237,217,124, 73,114,230, 73,122,242,244,201, 51, 94,118,130,
+182,241, 2,170,116,130,186, 48, 53,195,102,125,211,201, 74,146, 92, 30, 47,127,247,119, 63,254,241,143,255,183,191,169,128,222,
+253,158,247, 54,194,137, 53,130,219, 25, 82, 57,229,121,166, 52,153,117,185, 76,158, 60,173, 74,235, 70,120,138,215, 50,142,104,
+156, 96,114,188,184,138, 17,147,238, 97,112,116, 36,245,125,255,235,191,254,159, 30,124,240,193,255,187,249,167,160, 51,172,205,
+ 66,140,165,202,244,239, 89,173,201,181, 39,167, 74,119, 2,177,183,169, 11,179,181,137,196,117,175, 54,189,132,157,246,118, 19,
+186, 78,219,197,250,235,153, 95,189, 3,255,186,215,221,121,255,253, 15,220,112,195,203,191,240,133,207,159, 62,235,225, 69,248,
+100,166,106, 47,210,126,120,126, 27, 91,239, 10,112,100,193, 76,222,121,198,179,173, 65,101,129, 62,113,242, 43, 78,127, 95,255,
+132,214,204, 27,169,213, 54,101,242, 27,201, 82, 74,227, 14, 1, 32, 11,202,237,119,220,126,249,107,239,216,221,221,255,205,223,
+248,207,143, 60,242,240,151,170, 65,247,220,251,250,145, 45, 82,105, 11,186,206,209, 57, 77,119, 24, 27,222,245,135, 19,147, 66,
+107,220, 5, 76,222, 50, 14,101,213,182,196, 26,121,106,156,224,152,108,141, 77,252,213,152,101, 4,100,223, 24, 67, 78,101,168,
+134, 52, 82, 48,166,151, 83,155,117,221, 93,119,221,253,143,223,242,214,199, 30,251,236,151,194,243, 74,247,222,115,239,212, 56,
+170,221, 76, 72, 67, 19,250,237, 73,159,180,238,187,214,122, 75,103,104,224,132, 53,209, 38,177, 78,188,236,140,118,240,154,103,
+138,142,156, 19,180, 29, 24,171,157,189, 41,129, 16, 19, 14,148, 77, 62,191, 81,175, 72,220,125,247,221,111,124,227,215, 63,245,
+212, 83, 79, 63,253,244, 11,106,208, 61,247,158,229,132,237,236,156,120,253,149,163,187,157,128,156,211,128,222,254, 93, 43,177,
+ 25, 48, 91,159, 30,199,250,216, 26, 43, 20, 58, 97,212, 8,185,158,118,215,182, 37,199,110,108,149, 84, 27,189, 94,247,131,118,
+138,107,168, 69,187,174,187,243,206,187,238,184,124,249,211,143, 62,250,124,190, 41,221,125,207, 61, 54,110, 64,251,123,234,183,
+209,202, 38, 54,181, 54, 46,100,207,151,153,215,118,229,186,224,237,140, 76,106,146,221, 76, 74, 16,177,150, 30, 78,226,126, 72,
+204, 90,172, 31, 93,190,157,176, 80,156,242,223,163,205,169,158, 59,119,213,223,255,134,111,216,222, 58,247,208, 67, 15,158,225,
+102,191,251,123,190,247,108,251, 9, 22, 60, 0, 20,197,106,208, 97, 8,182, 84, 60, 79, 16, 76,194,156, 99,242, 90,200,217,140,
+ 89, 70,129,169,214, 81, 50,131, 54, 24,151,136, 51, 28,136,122,188,211,152,222,136,180, 73,203,145, 7,213,216,153,141,225,234,
+205,165,105,208,227,201, 64, 51, 58, 51,114,125,252,117,226,191,199, 79, 2, 73,254,252,207,255,220, 19, 79, 60,113,130,224,117,
+215,153,155,174,102,170,129,101,170,218,114,229, 4, 30, 43,102, 69,109, 80, 43,206,122,171,138,161,106, 49,184, 88, 27,197, 62,
+ 35,224, 95, 85,161,211, 67, 16, 56, 6,164,177,197,111,152,142,169, 54,108,158,210, 48,232,198, 1,174, 29,188,152, 18,173, 8,
+ 46,240,124,101, 51,166,174,125, 61, 69,152,154,228, 27,238,123,227,198,230,166, 31,170, 19, 97,254,240, 40,138,227,162,230,148,
+ 33, 55,158, 97,176,227,165, 54,124,185, 20, 88,139,202, 83, 10, 51, 41, 82, 55, 71,216, 37, 58, 81,128,194,197, 92,102, 89,234,
+ 33, 59,156,117, 49, 81, 66,114,150, 99,208, 19,128, 8,115,170,202,162,204,162,149, 68,167, 38, 20,241,129, 32, 35, 32,168, 45,
+135,218,169,183,218,241, 32, 27, 31,101, 93, 12,209,206,178,113, 7,106,164,108,105, 65,169,180, 52, 5, 76,236,235,223,248,245,
+215, 94,115,237,111,253,214,111, 58,216,194,111,253,103,223,233,239, 28,138, 61,187,219,239, 29, 20, 85, 51,195,114,176,195,163,
+ 82,244, 84,189,197, 70,100, 33, 71,233, 71, 85,148, 36,212, 57,103,158,223,206,155,115,103,157, 91,206,178,152, 73, 18, 24, 32,
+228,188,147,148, 26,225, 26, 93,150,170, 48,210,229,145,236, 44, 41,232,116, 18, 51,148, 39,193,146, 49, 62,132, 37,171,157, 21,
+ 19,125,204,118, 29, 60,136,201,200,105,249, 34, 45,255, 78,121,103,231,185, 95,254,229, 95,122,238,185,231,210,197,151,189,122,
+255, 80,247, 15,135,253,195,178,119, 88,142,150,218, 23, 27,138,246,131, 13, 90,199,122, 24,243, 71,190,147,161,249,181,183, 4,
+ 78, 6, 60,205,146, 48, 9, 69,152, 19, 72, 56,169,208,205,179,239,109,213,219,106, 80, 55,210,126,192,208,199,208,188,186,147,
+170, 62, 43, 40, 64,134, 54,209, 90,251,127,235,169,183, 53,134,223, 41,233,156, 17,138, 79,166,230, 39,216,235, 19,118,146,109,
+108,108,220,247,134, 55,252,217,167, 62,197, 27, 94,253,205,167, 18,213, 83, 23, 93, 47,175, 88,137,208, 28, 15,250,168, 3, 88,
+117, 87,102,153, 91, 27, 41, 9,155, 5,112, 82,155,206, 58,201,153,226,175,236,210,230,194, 93, 51, 68,100, 49, 19, 63, 77,134,
+100,206,146, 38, 35,241,105, 66,174, 19,174,103,148, 83,189, 57, 89, 32,243, 12,164,174, 6,197,117, 92,128, 83,183, 45, 73,172,
+ 4,133, 1,235,120,214,120, 6,204, 73,125,173, 41, 76, 37,242,212, 86,166, 51,157,168,173, 89,182, 26, 88, 14,108,107, 67,186,
+ 44,173,149,235,239, 23, 97, 81,197,224,183,110,198, 34, 43,243, 56,149, 4, 66,164,100,109, 34, 23,217,131,158, 57,117,162,149,
+161, 38,235,128,201,153,224,139,197,241, 84,107,174,186,250,176,105,117, 99, 21,192, 67,163,110,153,169, 65,146,100,197,212,129,
+141,167, 6,212,182,103,147, 85, 60, 85,159,172,168,209,122,229, 47,132, 68, 27,222,146, 64, 21, 67,239,252, 57,164, 26,133,138,
+ 90, 41, 78, 44,112, 31,207,163,227,152, 68,206, 73, 86, 27,169,203,226, 81,120, 49,147,174, 19,178,144, 76, 34, 57,215,202,138,
+ 72, 77,133, 88,103,251, 78,227, 78,193,196, 40,161, 60, 45, 1,109,249,104,212,110,209, 64,118,156,115, 28,214,134,162, 32,199,
+ 97, 2, 60,153,242,219, 26, 25, 52,154,151,141,119, 48, 1, 57,116, 50,122,192, 56,126, 97,156,163,159, 48, 24,170,213, 79,134,
+236, 25,233,180, 66,133, 52, 43,208,126, 8, 51, 20,101,159, 32,226,172,100,131,153,208, 76,216, 76,164, 85,184,228, 26, 6,197,
+245,133,159,153, 90, 55,154,237,154,190,177, 13, 89,198, 69, 85,144, 39,195, 40,227,177, 34,161, 74,141, 66,239, 20, 2,176, 85,
+151,180,137,188, 70,118,136,214, 29,168,108, 85, 85, 31,202,165,255,219,232, 9,172, 70, 12,163,162,200,136,230,172,122,245,115,
+140,146, 96, 49, 75,243,153,120, 66, 55,203, 92,204, 83,184, 42,114, 54,147,122, 64, 20, 83,114,133, 66,237,243,215,101, 53,159,
+255, 60,206,234,244, 19,214, 64,115,128,102, 2,102,173,117, 20,199,233,152,145, 99,211,146,136,186, 89,109,126,102, 66, 67,105,
+248,209,212,218,216, 92, 88, 36,135,193,144,165, 66,163, 9,100,237,202, 22,132, 29, 37,144, 32, 37,134,240,139,106,113, 78, 0,
+100, 16,209, 70, 30, 17,170,214,164,146, 52,231,114,197,110,138,176, 97, 5,136, 19,142, 70, 22,240, 89,127,226, 84, 39,182, 86,
+ 66, 60, 69,154,150,204,154,233, 88,176, 76, 39,202, 98,104,231,252, 25,156,246,198,105, 9,234, 68, 5, 35,215, 74, 55,142, 89,
+170,105,101,140, 88,205,226,162, 94,109,124,105, 40,125,196, 56,226, 79, 28, 20,229, 71,152, 21, 59, 58, 14, 73,116,153,199, 43,
+233,146,128,236, 50, 47,108,231, 46,167, 9,139, 18,235, 83, 24,103,102,210,118, 38,126,213, 42, 21, 15, 61,163,137,121, 38, 13,
+234, 73,220, 93,235,104,118,101,212,113, 18,212, 44,132, 20,130, 28,117,152,118, 98, 76,203,214,143, 4,178,202,168,171,213,110,
+221, 63, 39,164, 77,226, 67,240, 56, 4, 5,147,225,116,176,235,233,132, 69,241, 0,129,202,139,173,182,193,177, 96,111,247,235,
+132, 60, 26, 91, 97, 99,156,240,134, 78, 35,113,227,146,205,144, 82,174,186,216,156,211, 36,122, 85,106, 87,104,139,105,176, 69,
+ 44,210, 8, 39, 38, 5,164,101,113,106, 1, 84,166,152,108,204,192,215,186, 64,125, 2,198,143, 20, 48, 39,241,141, 4, 26, 63,
+119,161, 81,154, 87,189,174,134, 17, 66,219,221, 31, 42,251, 89,158,219, 27,230, 89, 72,166,132,237,205,180,189,145, 82,138, 10,
+116,150, 41, 18,149,190, 31,146, 82, 63,222,121,207, 62,157, 30,107,107,185,137,131,179,163,103,242,141, 41, 37,163,142, 87, 76,
+103, 33,107,192,111,142,175, 57,139,240, 61,214, 70, 25,218,177, 0, 85,177,108,162,146, 22, 52, 81,192, 32, 99,158,229, 84,208,
+112, 83,148, 48,102, 53,211, 1,199,203,210,151, 32,164, 5,175, 13, 39, 18, 30,118, 73, 85,109, 62, 19, 0, 57, 75, 74,152,119,
+126, 34, 5, 83, 22, 63, 33, 32,140,142,230, 44, 70, 78,168,139, 62,128,100, 30, 77,198,131,118,160,230,251,181, 6,107,102, 39,
+239,209,166,136, 24,180, 82,199, 49,230, 84, 60,145, 29, 49,232,132,193,203,106,116, 78,139,232, 59,222, 89,213,198, 17,154,153,
+164,178,166,134,161,183, 74, 85,131,123,101,215, 78,173,148, 43,178,178,113,225, 3,108, 56, 92,150,229,160, 4, 69, 74, 63,232,
+254, 97,241, 96, 55,239,100,107, 67,186, 68, 35,178,200, 98, 46, 93,110, 39,245, 88,205,163, 44,144,236,117, 12,119,204,150,109,
+ 20,113,134, 78,231, 42,235, 13, 84,154,165, 53, 95,194,170,145, 99, 28, 4,198,243,109, 66, 46,126,100,139,191,182, 24,156,184,
+235,231,163, 68, 70,196,214, 52, 53, 63,218,182, 40,134, 82,119,205, 16, 7,168,144, 45,133,138, 72,212,102,100,137, 98,126,154,
+ 71,100, 65, 71, 75,189,178, 63,120, 80,219, 88,164, 11,219,185,203, 2,218, 44, 39, 32,145, 41, 50,100,225,250,172,209,180,210,
+ 62, 27, 35, 33,144,117,236, 40,180, 56,230, 38,198, 9,199,158, 99,170, 84, 9,152, 81, 23, 91, 27,163, 59, 81, 52,142,165, 73,
+177,218, 87,175,196, 68,159,254, 66,216,145, 31, 10,232,154, 88, 3,180, 26, 61, 89, 2,235,228,138, 53,212,144, 33,196, 74,103,
+ 44, 40,149,151,187,236,185,127, 88,114, 86, 18, 57,169,154, 30, 46, 99,222,167,203, 50,235,232,243,217, 89,216,229, 40, 0, 3,
+192, 19, 54, 37,153,220, 87, 59, 58,167,241, 29, 57,222,216,104, 27,172,195, 65,117, 89,147,233, 37,141,113,161,234,190,171,129,
+132,151, 10, 85,174,213, 14, 12,174, 50, 90, 96,140, 48,101,237,212,212,246,249,117,104,201, 9,237,145,161, 78, 34,154, 49,166,
+147, 20, 84,211,162,177,214,229,210,246, 15,135, 56,109, 91, 56,203, 76,226,246,133,173, 69,218,218,240, 84,147,139,185, 92, 60,
+151,103, 51,241,186,183,235, 36, 53,120,189,114, 36, 28,232,203,168,113,138,141,228,138, 32,150,219, 88, 11,140, 93, 78,180, 3,
+ 62, 99, 14,134, 85,180,225,124,217, 14,212,180,113, 46,187, 90,106, 21,156, 54,216, 30,214, 78, 68,105,243, 49, 13,210, 98, 59,
+ 62, 70,107,122,212, 56,213,170, 0, 0, 3,224, 73, 68, 65, 84,212, 70,116, 20,227, 57,151,149,207,202,154,156,213, 20, 85,181,
+198, 28,193, 80,108, 57,168, 84, 37,216,207,195,108, 72, 94, 63,118, 57,229, 84, 9, 18, 21,246,245,243,218,242,132, 43, 95, 39,
+190,173,154, 68, 16, 91, 39, 51, 62,218,168, 42, 45,223, 80,140,186, 73,181,152,119, 33, 89, 52,120,217,140,185,220, 24,193,173,
+158, 56, 18,199,112,215,206,135,143,177,180,152,202,160, 6, 75,189, 14, 71,141, 87,172, 83,119,186, 86, 83,251,216, 82,216,141,
+106,225, 82, 1,248,184, 13, 15,142, 11,118, 91, 56,170,104, 1, 67,131,178,196,209, 4,243, 25, 55,230, 41,137,120,136,201, 26,
+103, 64, 53,197,117,109,208,150, 7,198,166, 68, 90,214,182,198,198,115, 89,171, 85,214, 54,195, 56,205,139, 58,225,217, 26, 60,
+245,244,208, 74,211,109, 72, 50,131, 15,173, 52,142,135,238,196, 74, 24, 71, 38,121,134, 29,163,119,145,147,197,181,199,176,200,
+122,118,144,135,241,137,147, 48,104,100, 95,164,243,185, 9,210,196,178,154,210,104, 44, 38,165,176, 12,102, 41,196,146, 91,153,
+ 96, 49,105, 94,171, 62,142,137, 77,203,226,108, 68,116,195,151, 71, 29, 49,202, 40,202, 78, 5,172,216, 80,236,249,208, 26, 27,
+ 79, 72,170,243, 42,116,194,255,232,243,199, 2,178,157, 75, 84, 15, 8,164, 15,145,140,211,169,230, 39,115,181, 89,188,166,159,
+238, 78, 26,162,238,155,168,230,115, 46, 6,192, 10,143,189,180, 3, 1, 59, 60, 46, 59, 19, 82, 68, 30,119,111, 60,185, 43, 52,
+ 63,112,160,134,162,105, 3, 5,171, 43,153, 30,167,215,182,247, 20,197, 99, 13,216,171,142,150,141,183, 29, 1,161, 1,242,109,
+152, 46, 80,129, 74, 50,111, 71, 75, 26,140,202, 9,200, 50,194,119,238,172,218,136, 64,140, 40,182,153,217,234, 33,195, 75,178,
+233, 65,245,117, 54,198,157,136,229,217,218, 36, 86,213,165, 22,178, 66,177, 26,198,214, 36,101, 13, 90, 35,168, 86,203, 90, 59,
+ 69, 42, 91,107, 87,217,216,116,168, 8,150,181,224,173,129, 44,105,235, 91,196,169, 98,106,182,118,206,162, 23,244, 86, 83,119,
+186,235,169,153,155,213,168,137,170, 75, 6, 19,182,233, 75,218,216,210,111,125, 53, 70,244,181, 58,204, 55,126, 0, 53,219, 24,
+215,219,204, 26, 91, 56,243,117,106, 36,108,213,104, 39,210, 68, 59,148,113,205,208,214,154,253, 99,114, 54, 30,149,169,117, 30,
+148,205,121,185,195,103, 45, 91, 67,155,154, 15,148, 10, 2,112, 60,148, 52, 74,231, 72,150, 26,204, 28, 40,112, 29,234, 82,212,
+129,117,182,179,195, 66, 70,172,152,121, 45, 65, 48, 53, 99, 35,152,107,152,156, 48, 12, 38, 57,139,151,154,110,125,225,199,170,
+ 49, 25,167,149, 26,235,249,160, 88, 71, 12, 49,246, 1,218, 44, 77, 67,191,173,166, 24,181, 58,241,141,157,158, 42, 51,102, 29,
+218,112,237, 58,239, 91,163,139, 77,164, 50,173, 13,109,212,151,166, 92,126,254,160,249,161,106,145,139, 26,218,118,180,212,173,
+ 37,128,185,253,183, 51,117,188, 55,240, 29,104,157,148, 25, 89, 21, 53, 48,105,148,240,161,101, 21,222, 61,147, 62,133,230,174,
+214,178,124,179,233,225,228,227,168, 60, 99,132, 22,205,224, 98,201,168, 3,181, 86,127,182,122,224, 64, 61,131, 46, 92, 75, 59,
+187, 47,140, 56,138,164,112,254,168,119, 84,229, 19,101,215, 26,183,166,222, 54,128,108,173,232,212,233, 97, 5,106, 35,162,101,
+ 1,138,177,150,144,173, 1,172,117, 36, 45, 6,145,200, 19,112, 19, 78,124,183,113,174,166, 85, 17, 35, 81, 49, 48, 82, 95, 64,
+228, 0,110, 44, 97,252,218, 64,112,133, 10,164,202, 40,208,113, 31,124,231,164,188,170,194,179, 54, 94, 88,115,118,214, 62,237,
+104,103, 99, 40, 9,156,202, 8,230,152,171,182,134, 79,248,252,249,244,156,192,234,203, 84,199,227, 18,214, 36,101, 35, 30, 20,
+ 93,242,241, 56,214,105,103,170, 70,134,209,127, 53,110,143, 85,237,156,228, 80,118,194, 49,181,234,212,111, 56,142,125,154,140,
+ 97,250, 8,166,197,152,161,203, 92, 9,177, 81, 88,117,210,218,143, 68, 25,147, 22,159,138, 28, 53,179,229,163, 25,163,151,174,
+ 39,215,199,240,218,216, 79, 97, 77, 92,106, 73,221,150, 59, 77,243, 70,108,241, 4,225, 74,219,120, 36,177,214, 43,161,141,201,
+ 66,211, 59,182,147,159,226,191, 89, 8, 53,178,105,106, 90,243,164,150,160, 76,108,195,106,139,167,185,159,230,141,234,126, 84,
+252,106,250, 50,155,192,248, 35, 63, 9,255, 7, 14,224,164, 93, 7, 57, 57,190, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/clay.png.c b/source/blender/editors/datafiles/clay.png.c
new file mode 100644
index 00000000000..aea212639e7
--- /dev/null
+++ b/source/blender/editors/datafiles/clay.png.c
@@ -0,0 +1,356 @@
+/* DataToC output of file <clay_png> */
+
+int datatoc_clay_png_size= 11181;
+char datatoc_clay_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73,
+ 72, 68, 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0, 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143,
+ 11,252, 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0,
+ 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7, 19, 0, 34, 11,191,157, 46, 32, 0, 0,
+ 32, 0, 73, 68, 65, 84,120,218,237,124,121,180,165, 89, 85,223,222,251,156,239,251,238,240,134,122,245,170,138,174, 30,170,233,
+102, 38,180, 52, 99, 55, 8,149, 6, 20, 73, 34,194, 66,151, 65, 3,100,153,232, 10, 70,212, 37, 6, 21, 39,156, 34, 70,113, 32,
+ 49, 70, 48,113,105, 52, 14,145,128, 64,148, 8, 34,208, 42,131, 49, 34,202,104, 47,160,231,234,174,170, 55,222,123,191,239, 59,
+211,222,249, 99,159,243,221,251, 26,154,201, 86,219,181,188,221,245, 94,189, 87,247,221,119,238, 62,251,236,253,219,191,253,219,
+ 7,207,158, 61, 11,159,245,241,185, 60,201, 50,243,187,223,247,255,186,118,190,115,225,238,170,110,166,107,107,198, 84,255,243,
+215,127,229, 53,175,253,133,225, 73, 4, 0, 93,215, 34,153,205,227, 39,187,174,221,189,120,113,118,176,243,143,111,184,225, 85,
+ 63,241, 99, 71,158,132, 0, 68,212,212, 13, 25,107,108,181,190,185,125,234, 1,167, 31,117,205,181,191,243,187,191,123,242,228,
+137,252,164,209,120,188,182, 54,117,190,159, 78,215,154,209,104, 60,158, 76,214, 54,108, 61,222,221,221,251,230,151,124, 83,126,
+146, 53,228,156, 79,193,247, 93,219, 52,141,247,174,235,186,187,206,221,177,191,183,183,183,187,251,210,111,125,137, 5,128,196,
+192,204,128,166,235,250,115,119,126, 24, 16, 71,163,145,173,170,174,107,173,173,214,214,215, 9, 0,246,247,119, 47, 94,188,112,
+254,238,187,206,221,121,251,221,119,157,243,174, 55,198,108,110, 30,139, 49, 34,226,124,118, 96, 1,224,206, 59,110,223,185,112,
+ 33, 4,239,156, 67,132,233,218,250,169, 7,156,222,223,223, 93,204,231,139,197,252,216,214,182, 5,128, 11,119,223,197,204,136,
+ 24, 67, 16,145,186,174, 15, 14,246,239, 62,119,238,226,249,187, 78, 94,114,233,120, 60,182, 0, 80, 85, 53, 18, 6,239,157,115,
+179,131, 61, 0,169,155,209,185,219,111,221,218,222, 62,117,201,233,221,139, 23,240,115,218,187,207,229,129,239,251,211,247,187,
+222,205, 14,247, 47,156, 63,119,242,212,233,209,120, 50, 59,220,127,238,115,190, 98,245, 73, 52, 95,204, 67, 12,163,233,218,230,
+177, 19,123,123,187,251,187, 23, 64,248,135, 95,241,242, 35,175,244,142, 27,255,152,153,235,186,158,207,102, 23,207,223,117,252,
+196,201,233,116,218,119, 11, 16, 89, 44,230, 95,249,149, 95, 5, 0, 68, 68, 27, 27, 27,134,136,136,234,166,153, 78,215,234,102,
+180,113,108,187,237,221,221,119,159,255,214,151,188, 24, 0,236,168,169,152,147,247,254,226,249, 59,167,107, 27, 34,226,156, 59,
+ 60, 56,184,112,254,194,254,254,126,223,117, 0, 96,145,172,247,129, 69,198,211,245,115,231,206,221,252,201, 79,140, 70,147,186,
+105, 66,240,174,239, 71,163, 49, 0,224,239,191,227,198,190,239, 22,243,249,197, 11,231,239, 62,119,167,181,118,251,228,169,227,
+219, 39,118,119, 46,222,113,235, 45, 72,212, 45, 14,237,238,206,197,115,119,220,222,182,109, 8, 94, 68,172,173,142,111,111,111,
+110,110,222,121,251,109, 93,215, 18, 81,221,140,232,174, 59,239,152,205, 14, 17, 65, 68, 92,223, 3, 0, 34,221,113,251,109, 23,
+ 47,220,125,219,205, 55,157,190,236,138,102, 52,177,204, 60,158, 76, 16,177,239,186,249,236,112, 62,159,133,224,231,243,217,199,
+ 63,250,129, 27,158,249,156,190,239,231,179, 67,184,175,246,206,234,167,167, 63,253,233, 63,248, 67, 63, 50, 95,204,247,119, 47,
+112,146,201,116,173,170,107, 99,173, 49, 22, 17,254,224,247,223,246,202, 87,190,242,179,248,192, 83,158,242,148, 87,254,248, 79,
+137, 48, 11, 51, 75,138,190,239,250,110, 49, 95,204, 15,183,182, 79, 86,117, 61, 26,141,235,186, 73,209,127,242,227, 55,237,238,
+ 92,248,246,151,125,215,189,174, 40,198, 32, 34, 34,130,136,214,214,147,169, 69,196, 16,227,108, 54,107,154, 38,120, 7,128, 41,
+134,245,141,205,205, 99, 91,191,249,235,191,118,225,226,197,151,124,243,183,124,154, 23, 10, 33,128, 72, 85,215, 77,211, 16, 81,
+223,247,117,221, 76,167,211,197,124, 94, 85,245,116,125, 99, 52, 26, 19, 34, 16, 10,139,247,253,250,177,237,215,191,225,183, 23,
+243,249,238,206,249, 55,189,241,141,111,127,199,187,242, 11,109,109,109, 1, 8,199,200, 34,237, 98,182,191,187, 91, 53, 13, 34,
+141,198,227,209,104, 84,215, 13, 33, 9, 8, 10,196, 24,103,135,243,195,131,189,182,109,231,135,135,231,239,190,243,193, 15,186,
+234,228,246,241,223,120,221, 27, 44,104,104, 18,100,192,196,140,100,215, 54,142,245, 93,235, 92, 47,156,250,158,156,115, 33, 4,
+231,156,115,142,136, 82,138,206, 57,215,119,139,197, 60,134, 96,140,121,200,195, 31, 1,240, 6, 11, 0,174,247,204, 73, 68, 82,
+226, 24,252, 98,177,152,207, 14, 15, 14,246,231,135, 7, 33, 4, 68, 28,141, 39,227,241,164,170,171,170, 26,143,198, 99,231,156,
+119,222,123,111,235,102,205, 90, 34,122,241,191,126,161, 5,128,189,221,139,109,219,182,109,235,157, 11,193,135,160,209,199,121,
+215,139,240,104, 52, 49,214,214,163,102, 58, 93,155, 78,167, 33, 4, 78,236,189,235,251,150,200,136,192,236,224, 96,243,248, 41,
+ 11, 0, 23, 47, 92,152,207,103, 93,187,136, 49, 33,162, 8,167,148,130,247, 49, 38, 34, 34, 99, 54, 55,143, 29,223, 62, 97, 43,
+219, 46, 22,123,187, 59,179,195,253,253,253,221,217,254,190,128, 92,118,197, 3,141, 49,174,239, 44, 0,236,238,238,196,224, 1,
+160,170, 42,230,232,125,242,206,117,109, 27,130, 71, 68, 52,116,120,176,223,117, 29,115,234,218,118,111,119,103,111,231,194,173,
+159,248,200, 99,175,187,225,196,169, 7, 48,115,223,247, 49, 70, 11, 0,136,104,140, 21, 16, 16, 1,192,186,174,173,181, 85, 93,
+139, 72, 93, 55,198,152,221,221,157,115,183,221, 12,136, 41,165,217,254,206,195,175,121,220,163, 31,247, 68,102,118,125,223, 46,
+ 22,251,123,187,231,239,186,237,190,139,147,247,201,227,204,153, 51,116, 95,189, 86, 62,253,127,252,158,247,118,109,215, 46,102,
+ 59, 23,238,154,110,108,141, 70, 35,107,107, 50,134,136, 82, 12, 47,122,225, 11, 46, 92,184,240, 89, 78,255,159,190,255, 47, 98,
+140, 49,198, 16,188,119,174, 93, 44,246,119,207, 79,215, 54, 71,147, 73, 85, 85,214,214,100, 40,134,112,254,220, 29, 47,124,209,
+139, 62,211, 91,243,222,123, 31,152, 19, 2, 90, 91,141, 39,147,205,173, 19, 33,248,190, 93,196, 16,152,163, 37, 51,157, 78, 54,
+143, 29,251,169, 87,253, 56, 17,222,219,107,153,127,241,194, 23,165,148,132,153, 69, 16, 17,201, 32, 98, 74,201, 7, 31,188,247,
+190,143,193,117,237, 34,198,152, 82,188,254,137,143,255,216, 77, 55, 29, 30,206,238,241, 42,155,155,155, 68,100,136, 8, 17, 1,
+ 0,144,140, 49,198, 86,100, 12,179, 0,128,181, 13,160, 73, 12, 2,176,125,226,212,195, 30,121,205,247,126,207,203,159,252,164,
+235, 62,141,141,110,252,163,247,198, 20, 75, 84,179, 0,224,157,155,207,103,179,195, 3, 99,204,100,186, 54, 30, 79,234,186, 22,
+225,224,157, 8,131,136,136,196, 16,230,243,195,175,249,218, 23,172,216, 40,250, 16,130, 48, 87, 85,165,126, 12,136,117, 93, 87,
+ 85,109,140,169,170,170,105,154,186,105, 70,227,201,250,198,177,201,116,157,108, 29, 98, 90,116,253,124,209,253,240, 15,190, 98,
+153,146, 43, 91, 77,167,211,245,141,141,241,120, 76, 4,125,215,113,138,136, 88,215, 53,145,169,170,202, 88,139, 0, 34, 2, 72,
+ 72, 38,132,208,182,237, 98, 62, 63, 60,216,159,207,231,223,246,205,223,152,253,104, 50,153,128,128, 72,138,193,199,152,186,118,
+ 30, 66,212,247,104,173,205,175, 2,250,134, 82,215,182,243,249,108,177, 88,116, 93,183, 88, 44,218,118,145, 66, 40, 14, 41,137,
+153,137, 12, 0,178,200,104, 50,233,118, 46, 58,215, 85, 85,221, 52, 99, 97,137, 49, 2,128, 8,120,239, 14, 14,246, 23,243,185,
+115,189,247, 46,120,159, 66, 32,202,103,195, 18, 25, 36,147, 18, 39,102, 16, 32, 52,147,233,186,235, 59,239,122, 0, 8, 49,164,
+196, 10,142,124,240,214,216, 16, 66, 12,209, 59,175,200,170,170,235, 83, 39,182, 1,192, 10, 96, 74, 41,165,196, 44, 2,162,127,
+ 15, 33,206, 22,173,191,184, 27, 98, 64, 68,181,148,238, 3, 0,164,148, 98,138, 2, 98,235,186,170,235, 23,190,224,107,127,235,
+245,111,180, 33,132,152, 18,167, 36, 34, 41, 70,239, 93,223,117,179,217,225,225,254, 94,215,117,204, 92,215,141, 0, 52, 68,214,
+ 86, 77,211, 8, 39, 17,225,148, 64,112, 60,158,128, 8, 19, 49,179,237,123,231,189, 75, 49,198, 24,125,112,125,215,119,237, 98,
+ 62,159,119,109,219,247, 29,145,177,198, 42, 0,174,234,106, 52, 26,121,239, 68, 36, 49,199, 24,201, 16, 89, 74,222, 61,244, 33,
+ 87, 91,215,119,109,219,182,237,162,235,218,160, 15,239,189,115, 49, 37,102, 54,198, 26,107,109, 85,141, 70,227,201,100, 90,215,
+141, 48,199, 20,131,247, 41, 69, 68, 27, 82, 34,196,147, 39, 78,218,182,107,219,197,252,240,240,176,235, 22,193, 7,230,148, 82,
+226,148, 56, 37, 68,163, 6,154, 78,167,235,155,155,163,102,228, 92,239,250, 62,120,239,250, 78, 68,230,243,217,177,173,109,199,
+201, 86, 53,181,139,197, 98,177,232,187,214, 59,175, 7,133,144, 4, 32,165,196,204,128,104,140, 25, 79,166, 85, 85,133,224,103,
+179,195,174,235,186,197, 34,134,112,254,220,237,205,104, 60, 93, 91, 27,141, 38,100,140,157, 29, 28,180,237,162,239, 59, 17, 49,
+198, 2,160,128,112, 74, 49, 70, 97,102,182,160, 39,107, 54,243,206,205,102,135,243,217, 97,219, 46,110,191,245,166,211,151, 93,
+125,242,228, 37,198,154,170,105, 16,209,250,224, 83, 74,100,172, 53, 36, 2, 49,134, 24,131,247, 46,120, 23, 83, 18,145,118,220,
+238,237,237, 33,130,247,126,118,120,176,115,241,194,206,221,119,110,108,158, 56,115,213,213,205,104,236,250, 30, 1, 56,177, 37,
+ 34, 91, 89,195,130,136,128, 64, 68,194,236,208,197,152,156,235, 92,215,166, 20,187,182,181,214,134,224, 15,246,247, 14,246,118,
+ 15,246,119,158,242,180,127, 50,157,174, 59,239, 98, 12,125,223,119, 93,107,133, 89, 88, 88, 24, 24, 68, 88,193,230,218,218,250,
+104, 52, 54,214, 84, 85, 45,194,119,222,113, 91, 59, 63, 4,164,190, 93,236,158,191,243, 43,254,249,215,137,176,238,111,219, 46,
+246,118, 47,182,243,125,184, 95,229,181, 43,174,184,130,224,254,244, 64, 68,251,105,255, 97,109,109, 58, 30,143, 47, 92,184,184,
+250,205,201,100,242,168,107, 30,117,226,196,201, 43, 46,191,220, 88,187,187,179,115,199, 29,119,124,240,131, 31,220,219,219,187,
+ 15,215,100, 69, 4, 0,126,254,181,175,189,246, 49,143, 19, 1, 78, 41,166,200, 41,133, 16,162,158,221,190,223,223,185, 96,170,
+122,178,182, 94,215,141,173, 42, 67,198, 24, 67,198, 32,162, 49,132,136,204,192,156,156,235,103, 7,251,223,240, 13, 95,223,182,
+221, 95,107, 65,127,242,103, 31,224,148,152,153, 89, 68, 4,128,136,192, 86, 72,100,200, 88, 91,213,117, 51, 10,222, 59,223,207,
+ 14,219,205,205,227,104, 5, 16, 4,196,144, 97, 68, 99, 76, 85, 25,196,170,110,154,186,174,127,249,151,255,251,206,197,139,139,
+249,225,183,191,236, 59,191, 64, 68,211,181, 45, 51, 35, 32, 32,136, 0,128, 0, 0, 34,160, 33,139, 53,145, 53,198, 26, 91, 25,
+107, 67, 8,138, 35,153,211,104,212, 76,167, 27, 70, 44, 33,146, 37, 50, 68, 2, 82, 85, 77, 51, 26, 79,198,237,226,240, 71,127,
+228, 7,172,173,127,224,135,126,248,243, 50,152, 5,128, 98, 25, 65, 1, 69, 35, 0, 0, 32, 8, 68, 6,136, 8, 9, 1, 17, 64,
+152, 37,165, 4, 72,198, 26,102, 92,180, 11, 67, 6,137, 16,128,153, 21,239, 35,192,104, 52,190,244,178, 51,222,245,183,124,242,
+166, 31,124,197,247,213, 77,243,159,127,238,231,255,234,175,110,250, 92, 23,100,140,145,188, 89, 64,192, 26,105, 1, 9, 17, 17,
+ 81,191, 15, 34,108,217,218,164, 5,173,136, 16, 17, 34,145,181,214, 90, 67,134,136, 68, 51, 58, 51,167, 40, 34,147,233,116,107,
+251, 4, 17, 34,226,207,252,204,171, 17,229,227, 31,255,196,251,222,247,222,183,188,229,255, 92,188,184,243, 89, 44,196,172, 96,
+ 13, 0,128, 16,145,200, 24, 99,140, 1, 0, 17,209, 4, 96,141,229,170,170,121, 36,210, 9, 51, 17, 25, 99,171,170,174,170,186,
+170, 42,107, 45, 25,131, 8,160,235, 98, 78,156,244, 19,167,152, 88,152,227,149, 87, 94,117,217,229, 87, 60,251,217,207,117,174,
+111, 23,243,119,189,235,157,191,246,235,191,121, 79,232,120,230,204,153,179, 55, 60,141, 89, 0,193, 24, 83,215,117, 93, 55,117,
+221,212,117,109,140, 85, 24, 25, 67, 96, 17, 64, 64,200,251, 41, 34,198, 24,173, 53,171,186,174,234,218, 26, 67, 68, 72, 4,136,
+198, 90,181, 28,145, 17,128,196, 28,130,119, 62,244,125,223,119,221,162, 93,204,231,179,217,236,112,125,186,246,132,199, 63,230,
+195, 31,249, 72,239,220, 0, 65, 45, 0, 76,215,214, 0,128,144, 8, 17, 9, 69, 68, 56,113,138,204,236,189,111,219, 69,140,145,
+144,136,140, 8, 35,128, 53, 22, 42,161,188, 93,214,218,138,136,128, 16, 0, 53,184,233, 46, 51,115,136,209, 57,215,247,109,223,
+247,222,251,224,189,178, 31,237, 98,190,152,207,218,197,162,239,219, 23,124,205, 87,191,237,237,239,248,216, 77, 31, 95,110, 89,
+101,140,128, 8, 51, 51, 67, 2, 64,202,158,144,146,158,190,224, 92,140,129,140, 53,198, 20, 7, 50, 85,149,109, 0, 32,194, 12,
+ 64,122, 50,244,117, 99, 76, 33,184,190,235,251,190,115,125,239,189,139, 49,166, 24, 67,240,125,175,150,106, 93,223,197, 24,172,
+173,191,228,233, 79, 59,178, 32,230, 4, 0, 72, 68, 96, 88,178, 47,233,255,136, 84, 55, 35, 50,198,185,222,117,109,183,232,140,
+ 49,182,174,173,181,154,135,131,119, 62, 32, 8,176, 40,125, 33,194,138, 95,180,164, 9, 33,134, 24, 66, 74, 73, 97, 87,240, 46,
+120, 31, 67,212, 99,164, 96,121, 60,153, 30, 61,101,182, 18, 97, 17, 72,249, 53, 21, 65,234, 27, 22, 22, 97,253,201,102,140,198,
+198, 16,218,174,227,180,208,221, 41,103,130,213,114,186,107,122,216, 0,209, 26,203,156,132,165, 44, 48,132, 24, 99,140, 2,130,
+ 68, 68,134,144,170,186, 30,141, 39,255,242,133,207,255,229, 95,249,141,188,160,148,152, 57,233,187,147,229, 3,132, 37, 50,167,
+ 24, 83,208,226, 40,120,231,250,190,115,174, 15, 62,196, 24, 82, 74, 25,141,145,177, 85,101,173, 53, 70,233, 55, 99,140, 49,214,
+ 90,107, 69,196, 67, 31, 98,200,182,139, 49,113, 2, 1,107, 43, 24,131,112, 50,100, 16,224,212,201, 75, 78,158, 56, 46, 34, 22,
+ 0,156,235, 83, 74, 44,172, 39, 54, 27, 94, 18, 39, 78, 49,133, 24,188,115, 74, 70, 56,231, 92,223, 59,215, 43,250,212,130,196,
+144,181,181, 37, 34, 38, 84,228, 79,164,249,196,214,117,131,136,156, 18,162,227,225,145,152,133, 1,177,110, 70, 68,168,142,149,
+ 82,122,254, 87,127,213, 27,222,244,187, 74,170,244, 33,134, 24, 99,138, 41, 37,133,235, 49, 69, 13, 32, 41,197,168,251, 31, 66,
+136, 33,120,239, 83, 12,222,123,245, 52,107, 45, 24, 64, 45, 54,137,180, 18,179, 85, 85, 85,117,211, 52, 85, 85,167,164,165,139,
+ 48,171,129, 98,140,129, 83, 2, 69,185,130,128,164,181,224,104, 52,185,254,137,143,179,202,118, 43, 48,119,206,121,231,242,137,
+ 40,101, 4,231,248, 38,137, 83,118, 23,102, 68, 36, 18, 61, 9,134,168,170,171,186,105,148,164,210, 20, 91, 85,149, 49,150, 57,
+117,157, 15,193,199,168,160,222, 43,255, 67, 68, 32,210,133,150, 0,109, 93,143, 38,107, 49, 56, 99,109, 85, 55, 22, 0,218, 54,
+ 47,200, 43,140, 15, 33,165,164,150, 5, 61,201, 26, 21,202,187, 28,182, 85, 55, 8,137,172,173, 70,163,241,100, 58, 25,141,198,
+117, 93,147,181, 40, 16, 98,232,187,174,107, 23, 74, 60,245,125,223,183,173, 15, 94,152, 23,139, 89, 12, 97, 50,153, 54,107,235,
+227,241, 84,132, 29, 0, 32, 24, 99, 45, 0, 44,230,115, 31, 92,112, 33, 4, 23,124, 96, 73,154,205,136, 0,192, 20, 15, 7,100,
+ 6, 0, 86, 82, 42,165,156,130, 17,203,154,114,132, 76, 41,121,221, 92, 37,222,186,174,107,219,118,177,104, 23, 11,239,221, 98,
+126,120,176,123,190,110, 38,219,167, 78,111,108,110,142, 39,107,198,152,224,157,158, 86, 50, 70, 23, 52, 11, 33,196, 24, 82,212,
+162, 5, 40,167, 85, 16, 97, 0, 13,153,172, 79, 80,250, 65, 52,213, 16, 35,162, 49, 38,198,216,247, 29, 11, 35, 18,136, 36,230,
+ 20, 67,240,190,119,174,239,218,174, 93,116,109,215,119,139,221, 11,231,186,118,118,233,153,135,156,124,192,165,211,181,181,186,
+174, 17, 49,135, 92, 17, 76, 41,159, 50, 1,208,163,139, 21,105,116, 65, 66, 4,212, 40,148, 82, 2, 9,217,155, 66,240,193,235,
+202,132, 25, 16,172,177,174,239,188,243,174,239,172,173,200, 16, 0,112, 98, 45,130,250,174,235,218,182,235, 22,174,109,119, 46,
+222, 49, 93, 63,246,200,107,159,180,181,189, 61, 26,141,137, 72,125, 60, 7,157,148,188,247, 49, 4, 91, 86, 64, 4, 25,129,136,
+ 0, 48, 48,176,128, 32,128, 49,132,212, 24, 99,163, 49,198, 88,242, 85,140,158,147, 0,138, 46, 60,197,120,120,176,119,176,183,
+131,132,214, 86,198, 88, 17,137, 41, 4,239, 53, 70,244,237,108,118,176,251,248, 39, 63, 99,243,216, 86,211, 52,198, 88,102,214,
+ 60, 50,120,174,235,186,249,236,112,118,184,111, 17,241,131, 31,252, 75, 41, 81,241, 72, 5, 80,254, 90,162, 48,228,229,102,139,
+106,125,138,132, 74, 15, 33, 71, 62,156, 31,204, 14, 15,124,223, 49, 71,102,209, 51,127,217,153,171, 47,191,234,225,139,174, 59,
+ 56,156,241,234, 35,197,184, 2,222,163,247, 93,215,223,207,248, 70,173,205,238, 63,139, 57,123,246, 44,173,236,204,253,226,113,
+255,170, 92,239,143, 11,250,244,165,244,246,246,246,238,238,238,145, 67, 7,240,136, 71, 60,226,146,211,167,207, 92,113,197,177,
+173,173,118,209,222,121,231, 29, 55,223,124,243,135, 62,244,161,191,169, 5, 93,122,233,101, 47,255,238,239,126,204, 99, 31,167,
+205, 15,223,247,222,187,195,253, 29, 36,211,140,198,198, 86, 74,171, 34, 25, 45, 75,148, 12,214,240,120,120,176,255,147,175,122,
+213,123,223,251,222,251,128,111, 56,115,230,204, 98,177,248,157,183,252, 30, 32,106,208, 76,133, 82, 47,164,250,236,240,112,127,
+109,125,107, 60, 30,219, 92,238,216,130,194, 8, 0,137,128, 89,148, 44,191,241, 93,239,252,153, 87,255,199,191,214, 41,123,241,
+ 55,254,219,183,188,245,237, 72,182,236, 15, 34, 25, 34, 99,172,181, 85, 93, 53,205,100,109,125,235,248, 9,215, 47, 20, 31,102,
+ 40, 41,146, 25, 99, 84,186,220,214,117, 51,154, 76,159,244,228,167,188,230, 53,255,101,109,109,250,133, 59, 53,230, 26, 35,149,
+122, 26, 50,224,167, 12, 66,171,170,174, 71,227,245,141, 99,237,226, 48,122, 87, 16, 52, 43, 30, 1, 0, 4, 36, 67,214, 86, 77,
+ 61,154, 76, 38,163,209,248,199, 94,249,163,215, 95,247,132, 47,112, 65,137,147, 66,111,230, 56, 0,217,188, 82, 99,140,173,140,
+173, 42, 91, 85,117, 51,153,110,120,239,246, 46,222,157, 98, 84, 24,169,245, 46, 34, 16,146,181,182,174,171,209,104, 52, 26,141,
+ 16,225,171,190,242,121,223,242, 77, 47,254,130, 22,148, 83,110, 74, 81,193,160,112, 46,244, 9, 17,149,143,177, 85, 85,168,221,
+166, 30, 77,103,179,131,217,254, 94, 12, 94, 56, 41, 62, 65, 16,144,196,156, 88,152,136,172,177,193,247,151, 94,122,217,119,125,
+199, 75, 63,239, 5, 9, 75,102,131, 57, 9,107, 33,196, 90,121, 98,134,168,121,239,140, 49,138, 76,200, 84,104,108,215,245,179,
+195,195,131,189,221,253,221,157,221,157,243, 23, 47,156,223,219,219,109, 23, 11, 17, 24,141,167,205,104,226, 92,187,181,117,252,
+251,190,231,229,159,103, 96,204,229, 47, 2,162, 96,249, 2, 65, 0, 51,255,161, 5,148, 49, 90,183,107,197,166, 85, 62,145, 33,
+ 91,137, 64,140, 28, 98,116,125,239,189, 87, 33,201, 37,167, 47,219, 62,113, 42,133,112,252,248,246, 79,252,135, 87,126, 94, 78,
+189,124,104, 98,211,211, 70, 43, 88,141, 74,181,165,117,123, 41, 9,149,178, 33, 50,214, 86,149,181,149,181,149,177, 86, 15,232,
+104, 60,185,244,242, 43, 31,250,200,107,142,111,111,141,198,227,159,254,201,159,248, 92, 3, 35,106, 13,205, 32, 40,194, 2, 0,
+ 40,130,185, 3,166,121,151,181,189,144,201,141, 21,120, 68,132,100,140,181,134,200, 32,228, 42, 87, 31,144, 9, 36, 28,143,199,
+ 39, 79,157, 70,128, 55,188,254,127,253,217,159,189,255,173,111,123,235,251,222,247, 39,159,145, 99, 4, 96,102, 0, 24, 56, 43,
+132,188, 33, 72,136, 0,204, 40,162,149, 47, 17, 25, 67,164, 52,153,238,178, 89,122,152, 37, 66, 16, 72, 28, 83,140,194, 92, 58,
+195, 0, 0, 2, 50, 26,143,175,187,254,250,199, 63,225, 9,222,247,127,116,227, 31,190,250, 63,253,236,189,248,208,192,122,101,
+222,147,243, 98,136, 12, 41, 69, 3,197,149,140,181,150,172,213,165,228, 80,173,223,181,149, 86, 29,182,170,234,102, 52, 26, 79,
+ 70,147,105,211,140,171,122,100,108,133,100, 0, 48,177, 68,230, 24, 83,140,252,232,107,175,253,233,159,122,213,208,224, 58,178,
+ 32,214,170, 38,198, 82,106,233,155, 54,182,178,186, 25,186, 71, 89, 59, 67,198,154, 92,192,231,160,160, 95,150,239,144,209,239,
+ 85,182,170,108,221, 24,107,145,140, 8,164,196, 49,166,224,131,243,174,239, 93,239, 92,240,225,251,191,251, 59, 63,173,133,212,
+133,169,178,182,174,234,186, 30,105,123,210, 26,107,136, 10,109,148, 64,148, 98,163, 97, 53,136,164, 62,100, 52,181,149, 66, 14,
+ 53,168,146,209,143, 90,202,133, 24,115,203,170,119,202, 26, 57,239,122,231,254,205,215,127,221, 61, 23, 68,198,228, 66,124, 52,
+ 26,141, 71,117, 83, 91,107,141, 33, 4, 73, 41,250, 16,130,119, 41, 38,237,186,170,200,160, 80, 28,132,148,255, 66, 72, 80, 90,
+206,186,161, 90, 93,169, 39,100, 82, 32,132,140, 35,188,215, 0, 17, 66,104,154,250,234,171,174, 60,178, 32, 99, 76,211, 52, 77,
+211, 84, 85,101,140,201, 86, 73, 49, 70, 37, 62,122,231,186,224,251, 24, 99, 57, 62,128, 68,217,203,200,168,227,175,226, 96,205,
+188,154,238, 98,202,160, 33,248, 16,188, 47, 11,243,193,123,223,247,222,251,232,195, 63,253,178,103, 30, 57,101,132,104,140, 1,
+ 4, 2, 20,145,148,162,158,106, 22, 73,234, 93, 62,176,176, 49, 76,198,104, 66, 69, 0,107,141, 26, 8,145,244, 16, 65, 38,143,
+ 69,233,119, 22, 86,244,162,146, 18,181, 77,212, 2,185, 44, 43,165,200,194,134,170,209,168,233,123, 87, 0,154, 54,220, 5, 88,
+162, 54,101, 17, 49, 87,105, 0,218,214,240,157, 75, 49, 26, 91, 17, 17, 39,214,115,103,200, 32, 96,161,203, 24, 16,181,190, 86,
+238, 45,134,208,187,190,239,123,175,236, 86,136, 3,163, 18,243, 35,113, 98,237, 99, 76, 38,147,149, 5, 9, 8, 39, 37,240,141,
+209,176,148,153, 57, 4, 52,182,106, 70,227,196,220, 45,230, 33, 6,107, 43, 34,131, 72,214, 90, 50,148, 77, 1,156, 35, 89,169,
+ 42, 83, 74,222,251,190,107,189,119,234, 43, 41, 51, 77, 49,198,200,156, 56, 67, 23,101,223,232,178, 75, 79,239,238,238, 13, 16,
+ 86, 16,128,140, 65, 36, 86,118, 65,223, 35,106,203, 3,200,216,166, 25,139, 72,223,181, 49,248,170,170, 81, 11,120,230,152, 34,
+ 36, 6,204, 76,121, 33,143, 88,237,160,219,148, 98, 92,109,229,106,180, 27,192, 58, 17, 25, 91, 61,236,161, 15,254,203, 15,126,
+184,164, 14, 68, 50, 54,159,139, 21,144,166,105, 68,191, 64,194,170,174, 1,145, 99,140, 49,184,190,143, 38,154,204, 9,131,128,
+164,196, 74, 30, 42, 5,200,137, 51,226, 22, 30,186, 76,137, 89, 41,175,196, 67, 18,215,188,103,175,190,250, 65, 43, 32, 31, 81,
+129,232,192,164,150, 38, 85, 73, 90,249, 59, 0,128, 44,144, 88, 98,140,226,131,158, 44, 17, 80,158, 85, 65,192,224, 84, 49, 50,
+ 25,131, 3, 53,192,138,114,152, 83,210,124, 98, 12,113,202, 45,140,186,174,143, 84, 29,153,103, 40, 60,115,225, 98,139, 62, 66,
+ 35, 99, 74, 81,207,171,115,193,251,236,147,169,172,148,200, 26, 83, 74, 17, 13,217, 57,116,139,176, 98, 4, 22,102, 73, 69, 69,
+167, 49, 63,229,240, 73,230, 81,143,124,216, 7, 63,252,177,220,192,211,182, 82,177, 4,103, 78, 70, 6, 83, 39,230, 20, 99, 8,
+ 49,122,231, 52,166,121,239, 57, 69,197,225,154,105,196, 90,229,227, 6, 24,103,141, 37, 99, 64, 36,132,144,125,128, 33,191, 87,
+ 68, 99, 44, 40,193,133, 0, 0, 79,125,242,245,121, 65,204,146, 18, 31,101,168,243, 35,163,219, 24,189,247,193,103, 98,184,239,
+123,165,172,149,108, 68, 34, 16,237,111,152, 21,214, 6,149, 89, 51,182,210,190,209,192,166,107,196, 7, 1, 21,147,114,138, 32,
+146, 82, 50,182, 94, 95,155, 0,128, 21,230, 24, 67,110,185,151,204,207,146,113,109, 82,217,136,243,222, 59,223, 59,215,187,224,
+189,243, 46,134,160, 71,157,136,176, 66, 17, 97, 16, 83, 66,182,230, 56,133, 74,204, 6, 17,151, 46, 89,220, 65,247,215, 90,203,
+204, 34, 9,137,158,251,229,207,188,229,206, 93,203,194, 26,178,138,161,180,209,149, 41,174,162,194,210, 20,228,135,147, 28, 99,
+150, 30, 13, 73,131, 32,227, 20, 50,134,180, 79, 99,140,177,150, 98,196, 28, 24,178, 31,232,185,203,128,203, 88,223, 45,180, 51,
+182,190,113, 92,238,216,177,204, 28, 98,224,152, 35,169,254, 97, 86, 18, 61,169, 26, 38,134, 48,172,174, 84, 1, 89,225,153, 1,
+157, 26, 38,183,171,169,112,231, 85,222, 44, 16, 89, 70, 42,173, 38,132,140,106, 67,162, 32,165,232,201,152,241,100, 2, 0,150,
+ 19,167,160,242, 24,237,103, 21, 58, 54, 37,133, 74,156,202,202,180, 90, 74, 92,200, 96, 64,212,142,172, 54, 23,173, 49, 70,235,
+202,170,174,117, 77, 26, 34,135,142, 66, 42, 17, 82,125, 57,197, 32,234,127,204,166,172,222, 50,167, 2, 14,156,235,157,247, 46,
+248,144, 56,234,207,107, 44, 80,167,202, 65, 54, 7, 37,212,192,159,219,161,214, 86, 85, 85,215,165, 31, 89, 55,214, 86,136, 24,
+ 57, 36, 77, 97, 37,124, 39,221,107,130,224, 61, 51, 91,107, 43, 91, 39, 83,105,114, 4, 0, 91,148,153, 81, 29, 37,120,239, 67,
+ 72, 49, 22, 11,203,145,188, 32,171, 4, 40,230,146, 9,209,100, 42,160,110, 70,163,186,170,109, 93, 17, 82,140,193,251, 16, 99,
+228,178,243, 49,196,148, 18, 34, 6,239, 98, 8,182,170, 84, 87,196,156, 56, 69, 44, 22,226, 12, 12, 66,254,156, 50,244, 73, 67,
+ 22, 81,212, 63,160, 29, 61, 95, 3, 65, 75,132,214,216,186,110,154,166,169,235,218,218,138,144, 18, 39,237,103,149, 22, 89, 12,
+193,171,188, 56, 4,223,119,173, 49,166, 25,141,181,135,156, 82, 26,104, 95,155,146,178,225,185, 31,166, 69,190, 38,124,133, 94,
+ 34,130, 40,200,165,101,158, 45, 36, 67,135, 53,215,183,214, 24, 99,145, 72, 68, 50,151,227,156,243,126, 16, 92,133, 16,152, 83,
+240,110,118,120, 0, 0,235,155, 91, 77, 51,170, 71, 35, 67,100,173, 85, 7, 0, 0, 27, 83,116,189,139,218, 20, 11, 62,198,164,
+ 1, 99, 40, 98,151,198, 24,226, 55,103,228,176,164,216, 74,187, 58,165, 20, 33,113,140,170, 26,241,174,215,198,175,207, 94,225,
+ 15,246,118,156,235,182,142,159,154,174,173,141, 39,147,166,170, 19, 39, 99,109,249,141, 96, 83, 76, 42,188,211,230,104,233,117,
+ 80,201,147,229,207, 50, 86, 38,245,107, 68,100, 98,109, 22,105, 48,243,206, 41,184, 83,146, 94, 37, 98,125,175, 66, 49, 23,188,
+ 59,220,223,157, 29,238,108,109,159,222, 60,190,189,182,190, 49, 26,141,136, 12, 7, 33, 50,198,100, 80,101,181, 79, 50,116,199,
+ 16,134,194, 26,114,203, 53,183,119,243,217,103,142,154,250, 84,146,101,173,229,148, 98,136,222, 59,141, 8, 82, 50,177,243,174,
+215,102, 71,219, 58,215,207,103,135,123, 59,119,173,109,108,159, 56,117,201,198,230,214,120, 60,214, 85, 32, 2, 33,114, 41,226,
+109,241, 9, 64, 84, 1, 78, 46, 11,151,138,135, 35, 41, 95,137,161,164, 63,204,108, 17,209, 88,107,173, 3, 0, 99, 60, 2,106,
+244, 82, 31,234,186,182, 91, 44,250,190,237,218,197,254,206, 93,100,171, 7, 92,122,197,177,227,219,227,201,180,178, 86, 51,119,
+110,199,169,140, 16,192, 14, 71,151,180, 70,214, 62, 76, 78, 73,196, 76, 9,163, 4, 73,197,129, 52,195,165,196, 32, 66, 38,164,
+ 20, 53, 76,166, 20,201, 24, 66,146,188,101,190,239,251,174, 93,104,127,126,126,176,215,117,237,213, 15,189,230,248,137,147,147,
+233,180,178, 21, 8,164,172,239,200, 13, 56, 31, 66, 6,249,170, 35,129, 34,219,128,225,136,231, 90,215,136, 8,179, 73,108, 12,
+153,132, 49, 21, 24,174,209, 69,157,171,106,234,202, 86,170,126,208, 45,235,250,206,117,109,223,119,125,183, 56, 60,216, 57,243,
+192,135, 61,224,244,165,107,235, 27,117, 93,131,150, 52, 25,178,197, 16,131,247,174,107, 23, 75, 90, 24, 1, 17,144,145, 17,115,
+155,172,236, 35, 0,160, 49, 6,170, 90, 9, 24, 36,178, 85, 37, 44, 74, 23, 1,115, 74,177,239, 23,125,223, 26, 50,166,170,180,
+ 13,173,199,182,239,123,239,186,249,225,206,201, 75, 46,191,234, 33, 15, 31,143,199, 85, 93, 3, 64,226, 33, 41, 5, 31,130, 10,
+168,103, 7,251, 10, 63, 36, 21, 31, 17,144, 82, 97, 73,105, 39,150,115, 77,104, 43,171, 29, 49, 53, 42,101,225, 23, 2,131,247,
+110, 54, 59, 56,216,219,139,135, 94,247, 63,113, 74, 49,184,190, 95, 44,246,215, 55,182,159,240,164, 27,170,202,234, 11,199, 2,
+245, 99,140, 33, 68,239, 92,223,182,237, 98,214,181, 51, 0,176, 23, 46,156,207,253, 94,144, 21,234,126, 72,228,234,188,146,139,
+ 28,197,252,152,217, 53, 85, 16, 81,169, 21, 19,154,206,167,197,252, 48,134,144,253, 45,198,181,141,173,173, 83,151,223,114,203,
+ 45, 49,134,196, 67,103,187, 28,145,210,123, 15,222,135,208, 3, 0,158, 61,123,118,111,111,111,127,127,255,254,214, 22,250,187,
+125,136,200,177, 99,199,182,182,182, 44, 0, 28, 28, 28,220,118,219,109,255, 96,148, 79, 21,121,110,109,109,209, 63, 24,226,239,
+ 89, 59,241, 31, 12,244,247,236, 97, 63,243, 63,175,175,175, 63,235, 89,207,122,250, 51,158,113,213, 85, 87, 3, 64, 74, 81,117,
+ 87,179,217,225,141, 55,190,235,246,219,110,159, 76,166,211,181,233,100, 50, 61,182,117,236,138, 43,174,184,228, 1,151,104,230,
+204,194, 22, 44,176,118, 41, 96, 93, 21,111,228,130,237,163, 31,249,200, 7, 62,240,129,247,188,231,221,159,252,228,205,247,187,
+ 72,116,246,236,217,155,111,190,249,214, 91,111,213,175,175,189,246,218,175,126,254,243,175,121,212, 23,157, 60,121,138, 65,184,
+112,111,165, 24,207,244,151,214, 89,202,131,247,237,162,109, 23, 0, 88,143,198, 90, 28,170, 34,150, 10, 81,164, 31,112,137, 67,
+ 75,139, 73,217,100, 0, 21, 5,101,118,131, 83, 12,225,174,115,231, 62,252,161, 15,189,249,205,111,250,248, 39, 62,249,119,101,
+154, 51,103,206, 60,240,129, 15,196,167, 62,245,169,125,223,127,201,151, 60,243, 57,207,123,158, 53, 54, 49, 67,233, 53,175,176,
+123,188,252,192,204, 25,231, 13,136, 95,165,110,174,107,231, 41,166,170, 25, 53,205,200,168,153,136,140, 49, 75, 57, 79, 1, 43,
+128,218,130,200,237,117, 37, 80, 6,222,175, 84,184,222,123, 31, 92,191,179,115,241,151,126,233,151,222,255,231, 31,208, 66,242,
+111,217, 64,230,204,153, 51,207,121,238,243,190,252, 57,207, 85, 46, 83,123, 36,247, 16, 47,101, 49,152, 34,254, 92,200,230,247,
+ 89, 88, 15,237, 70,143,170,186, 65,144,174,155,171, 10, 76,189,100,224,210, 20,232, 13,198, 40, 47,137, 74,130,228,151,194, 50,
+122, 64, 6, 13, 34, 98, 85,213,215, 62,230,218, 47,123,230,151, 62,229,201, 79,250,232, 71, 63, 54,155,205,254,118, 12,180,185,
+185,121,236,216,177, 76,190,198,152, 6, 38,175, 88,103,104, 93, 12, 90,228,242,134,200, 16,138, 16,129,182,235, 9, 85, 36,152,
+155,233,182,170,234, 38,165,212,181,115,230, 84,213,245,116,186,142, 68, 34, 68, 66, 68,152,152,181,161,204, 12,218,109, 43,234,
+246, 82, 42, 3, 26, 35,198, 26, 74,198,144, 33,212,174,105,154,174,175,127,199,203, 94, 26, 66,124,247,187,223,253,250,223,126,
+211,223, 94,144,142,105, 41,248, 95,129,146,131,243,148,230, 14, 34,136, 82, 11, 0, 8, 42,245, 96,212, 6, 21, 35, 25, 50,145,
+ 19,165,220, 4,101, 99,173, 30,201,217,108,198,209,219,186,110,234, 81,221, 52,100, 12,162,100, 78, 86, 8, 0, 76,254, 80,218,
+241, 8,144,187,207, 34,201,198, 44,102,175,172,247,189,239, 57,197,235,174,123,226,245,215, 95,247,209,143,125,236,183, 94,247,
+250,217,108,254, 55,110, 32,109,210,137,114, 79,159, 90,112,148,254,253, 10, 91, 38,160,155, 45, 2,153, 26, 68, 68,196,132, 58,
+ 60, 0, 49, 1, 68,201,209, 23, 44, 17,216, 10, 64, 66,140, 33, 6, 16, 64,132, 60,214, 57, 30, 3, 8, 33, 8, 11,131, 65,137,
+ 26,247, 84,215, 60,208,109, 0,168,172, 92, 12, 65, 21,211,198, 86, 15,121,208,131,191,255,123,191,231,240, 96,255,213, 63,251,
+115,159, 58,231,122, 95, 26, 40, 11,129,177,136,214,239,241, 20,150, 35,186, 74,214, 25,138,161,138, 37, 16, 33,206,179, 40,128,
+ 0,105, 8,183,192, 40, 8, 56,180, 16, 16, 68, 15,151, 38,180,200,146, 22, 29, 32, 18,102, 58, 1,135,118,228,209,178, 8, 0,
+172,181,227,201,180,110,154,201,100, 58, 59,220,219,223,219,177, 85, 13,136,235,155,199,126,232, 7, 94,209,117,221,207,191,230,
+181,183,220,122,219,223,136,129, 72, 57, 15,193, 79,173,216,238, 97,175, 44, 53, 85,189, 67,142,183,152,197, 33, 34,196, 0, 4,
+144,103,138, 4,137,129,151, 63,174,157, 79,196, 28,241,139,148, 36, 39,123,202,253,173,204, 14,229,201, 2, 25, 98, 57, 26, 91,
+ 25, 11, 32,245,120, 60,217, 56,182,117,250,242, 43,251,174, 61, 60,216,243,206,167,148,166,107,107, 47,123,217,191,115,125,255,
+171,191,250, 63,222,255,129,191,184,175,129,226, 74,147, 66,253, 95, 35,142, 8,136, 50,108,156, 89, 87, 80, 65, 71,126, 59, 56,
+ 84,117,250,166,152, 0, 69,136,200, 48,137, 33, 98, 98,212,159,102, 89,118,185,192, 24, 88, 38, 49, 34, 67,102, 41,199, 41,155,
+146,219, 99,153,209,144,149, 3,190, 52,217,120, 60, 57,190,125,178,124, 67,152,147,115,238,219, 94,250,109,139,249,226,191,254,
+183, 95,252,240, 71, 62,146, 82,244, 62,220, 7, 6,194, 97,103, 97,233,225,185,137,200, 75, 82, 72,178, 88, 97, 9,143,151,241,
+ 9, 0, 8,136, 81,136, 72,128, 13,145, 16, 25, 67,194,204,132,200, 2,160,179, 4, 43, 71, 83, 27,141, 6,179,204,197,100,253,
+ 8, 29,225,126,178, 55,149,126, 70,201, 29,178, 66, 18,229,173, 50,214,214, 77,179,190,190,113,226,132,252,200,191,255, 97,145,
+ 60,242,210,247,125,187,152,125,232, 67, 31,121,221,235, 94,247,201,155,111,249,130,130,116,118,235, 12, 17, 21, 8,221, 99,199,
+178, 70,136,142, 40,176, 6, 83, 50, 75,142, 85,152,117,231, 66,198, 24,129, 1, 58,164, 40, 72,176, 66, 50, 99,193, 80,218, 72,
+ 83, 87,162, 34, 10, 66,194, 37,181, 57,116, 55,153, 11, 22, 57, 2,215,242, 27,208, 79, 8,128,229, 7, 0, 5,176,170,155,117,
+ 99,159,240,196, 39, 62,250,218,199,112,138, 23, 47, 94,120,243,155,222,252,142,119,221,248,121,101, 49, 73, 41,102, 18,143,143,
+ 56,180, 34,223, 44,172,164,172,121, 93,201,198,195,234,147, 18,123, 74, 62, 34, 24, 18, 81,182,214, 8,136, 64, 4,200,251,191,
+ 34,171,203,253, 61, 99,138,149, 76, 1,220,116,100, 7,192, 12, 43, 82,254,117,104,142, 75, 33,241,185,232, 58,203,188,214, 17,
+158,112, 24,213,138, 33, 52,205,248,217, 95,241,236, 47,123,230,151,190,235,198,119,253,222,219,254, 96,181,111,244, 25,178,216,
+160, 51,205,138, 51, 69, 36,131, 69, 86,172, 99, 86,189, 71, 68,152,137, 57, 14,203, 5, 17, 85,106, 32, 17, 10,152, 18,111, 0,
+ 65,123, 92,197,121,178,132, 76, 49,115, 54,147,106,158, 74,219,166,156,158,252,155,176,104,163, 0, 69, 16, 36, 49, 18,229,129,
+ 60,157, 55, 21, 29, 41,205, 13,226,124,145,193, 82, 98,162, 74,156,224,189, 15,206, 57,239, 31,251,216,199, 94,243,168,127,244,
+214,183,189,253,207,255,226,131,159, 53,139,105,188,144, 65, 81,153, 21, 92, 5,252, 15,140,239,112,242, 7,159, 31,122, 29,131,
+ 26,163,104, 50, 96,217,157, 48, 68, 66, 96, 44, 64, 28,124,112,120,104, 85, 65, 88, 36, 16,195, 32,102, 22, 30,107, 67,144,134,
+ 6, 51,228,127, 34, 80,145, 12, 0, 51,228, 85,164,196,203, 78,117,212, 38, 84,204,189,244, 16, 66,136,222,133,220, 10,116,222,
+249, 24,195,211,110, 56,245, 9,220, 77, 0, 0, 11, 30, 73, 68, 65, 84,123,249,101,151,254,239,183,188,245, 51, 25,104,144,126,
+ 44,235,237,124,136,224,136,183,228, 8,174, 18, 73,157, 12, 74, 49,250, 16, 3,199, 50,144,178, 60,122,178, 2, 18,242, 16,141,
+ 30,150,226, 65,104,244,152,169, 16,145,150, 98, 68, 88,245, 29, 0, 68,100,102, 66, 82,128, 90, 52, 40, 42,173,225, 84,222,127,
+204,122,229, 60, 14, 55,232,129,226,224, 62,249, 62, 21,175, 50, 47,253, 41, 17,185,250,234,171,190,225, 95,189,240, 23,126,241,
+ 87,238,221,131,140,169,235, 58,147, 53,184, 90, 69,230, 33, 50, 97, 30, 36,101,203,246,127,226, 48,236, 76, 8,138, 53,245,160,
+232, 17,201,157, 17,109,125,194,178,217,165, 5, 41, 46,133, 51,165,186, 32,194,101,117,188,138, 78, 65,139, 28,144,101,192,206,
+ 94,146,155,201, 62,132,168,237,246,200, 75,133,212, 74,252, 89,106, 1,189,119,106, 44,157,248,210, 66,115,212,140,158,113,195,
+ 83,223,254,206, 63,188,151, 52,159,243, 60, 74,102,103,150,104,141,203,157, 70,136, 88, 90, 49, 32,144,163,226,176,120, 17, 86,
+221, 71,140, 88,238,177,161, 85,217, 82, 25,142, 71, 90,234, 29,169,112, 68,148,249, 2,102, 25, 78,214, 17,128,177, 68,212,131,
+ 50, 35,150,160,171, 31,139,194, 34, 14, 82, 89, 53, 80,121,166, 14,157,170, 93,130, 78, 99,114, 74, 80, 2, 62,146,121,224,149,
+103,214,215,166,179,249,226, 94, 24,197,172,123, 27,252, 87,241, 50, 18, 82, 25,255, 7, 36,200,170,187, 98, 25, 21,119,100, 40,
+141,222, 7, 31, 67, 16,241,136, 67,182, 38, 56, 10,239, 12, 13,234,221, 50,127, 36, 44,140, 64,200,130,171,149,224, 61,230, 89,
+178, 10,122, 41,132,137,131, 74,103,144,199,172,204,191,103,170,111,152, 54, 45,151,207,168, 6,143,243,200, 39,171, 59, 35,145,
+153,174,173, 77,167,247,102, 32, 17,144, 36, 34, 40, 42,133,211,171, 6, 64, 20, 35, 3, 22, 75,231,231,114, 81, 89, 8,104,232,
+168,180,117, 77,182,138,198,135,160,194, 3, 30,244, 40, 69,144,187, 18,151,145,164,104,202,114,179, 59, 21, 96,161,246, 63, 90,
+229,228,115, 61, 88, 34, 79, 68,198, 65, 86,147,231,129, 53,199,171, 19,229,231, 71,181,137, 42, 68, 56,159, 10, 30,164,199, 26,
+ 15,141,177, 85, 93, 63,252, 33, 15,190,235,238,243,247,226, 65, 56, 4,229, 12,173,139,118, 1, 69,150,184, 49,139,178,116,108,
+114,229, 13,168, 30, 89, 59,235,100,141,173, 26,221,188,124,151, 3, 51, 35,146,112,201, 95, 9,137, 16, 48, 18, 13, 82,145, 1,
+112, 14,133, 24, 15,194, 27,201, 35,180, 71,252,169, 96, 31, 30,230,202, 83,254, 78,226,172, 6, 27, 98, 16, 23,139, 97, 62, 24,
+ 88,196, 86, 58,162, 98,201,218,186,170,191,232,209,215,188,243,143,222,253,105, 99, 16,145, 49,229,246,138, 35,194,201,229, 36,
+ 2, 44,205,164,243, 38,165, 52, 41,231,146, 7,108, 73,198, 34, 38, 84, 13,113,105,122,115,140, 73, 35,220,192,191, 14,226,234,
+ 12,228,117,144, 5, 84,180,207,203,209,245,101,249, 42,172,146,143, 66,223, 14,250,190,162,223, 20, 62, 34, 32,211,255,211, 32,
+113, 82, 28, 75, 68, 74,243, 33,149,201, 1, 99,172,181,235, 27,155, 95,252,164, 39,252,241,123,254,239,167, 22,171,144,147,206,
+106,173,152, 83, 70, 97,168,139,156,110, 69,162,179,180,223, 48,163, 52, 92, 60, 80, 70, 11,138,148, 46, 49, 75,145,133,173,156,
+160,165,224,247,104, 19,158, 74, 93, 2, 71, 50, 89,230, 84,150, 40,146, 72,146, 32,162, 14,122,220, 99, 61,131,246,106, 73, 5,
+ 18, 33, 27, 50,108,152, 25,120, 25, 14,141, 33, 67, 22,235,199, 92,251,152, 15,125,248,163,251, 7,179,123,196, 32, 24,232,249,
+ 21,239, 1, 88,157,255,205,145,249,136, 52, 23, 4,100, 69,240, 59,196,197,101,126, 85,190,171,200,183,211,114, 51, 87, 75,124,
+ 37, 39, 53, 22,153, 1,179, 47,241, 42,226,138, 6,145, 86,113, 44, 2, 48, 97, 74, 9, 4, 24,121, 69,161,121,180,250, 24, 20,
+196,160,196,142, 1, 11,200, 9, 10,250, 24,118,101, 60,158,124,241,147,174,251,189,183,189, 35,150, 6,129, 29,100,224,217, 95,
+150, 27, 42,131,251,172, 6,205,165,119, 21, 53,211, 16, 41, 7,116, 63,148, 62, 25,227,167, 24, 67, 28,124,138, 75, 35,169, 8,
+159,242, 12,188, 33,202,204,181, 49, 8, 96,136,132, 69, 59,155, 5,158,229,145,163,172, 94,213,113, 36, 22,196, 24,152,145,115,
+ 49, 88,234, 86,190, 71,140, 0,206,232, 94, 85,149, 69, 74, 15, 84,196,250, 42, 32,123,224,149, 87,254,179,103, 61,253,141,191,
+243,182,149, 90,172, 44,125, 85,243, 34, 71,173,181, 44, 23,243,129, 7, 21,123, 22, 88,146, 82,138,249, 50,135,108, 30,253, 52,
+ 12, 0,100, 39, 90,221, 79, 89, 2, 72, 67, 0,156,161, 18,138, 72, 30,195, 66, 65,201,244, 37,194,114,183,243,156,164, 49,198,
+152,148, 18,128,176,177,204,156, 48,201,234,226,151,199, 77, 68,152, 81,111,247,160,108, 72, 91,233,116,138,102, 36,221,101, 97,
+ 70, 50,151, 95,126,197, 23, 95,247,216, 79,220,122,215,210, 64, 49,134,162, 17, 26, 26, 62, 75, 15, 26,226, 17,172,254,190,156,
+ 49,242,117, 20,249, 0,149,218,112,152,135, 72,197,100,171,231, 43, 19,176,195,123,206,193, 87,131,157, 2, 9, 42,121, 6,134,
+225, 39, 42, 77, 33,213,234,235,200, 95, 46,211,150,168,234,232, 99,165,184,215, 77, 97, 0, 18, 20, 68,202,243,131, 54,165, 16,
+ 99, 64, 64, 13,147,198, 16,218,209, 35, 30,241,136,206,151, 43, 16, 84,204, 52, 84,244, 57,176, 45,243, 70, 78, 91,171, 92,194,
+ 81, 74, 33,195,179,114,131,202,112,218, 18, 39,133,254, 69,127,155, 15,114, 9, 61, 58,210,119,164,127,130,121,116,109,217,133,
+ 53,134, 72,203, 54,181,205,112,171,138, 14,250,112,140, 90,168,136,172,132,207, 37, 15, 50,164, 52,205,188, 2,128, 76, 72,168,
+243, 20,138,243, 76,138, 33,166,160, 44,148,206,203,174,173,111, 92,117,229,153,243, 59,251, 43, 6, 82, 15, 75,137,143,124, 74,
+ 57, 66, 41,242, 26,112,202, 17, 71, 42, 86, 43, 10,203, 21,217, 22,175, 56, 38, 15,105,123, 57, 66,133, 75, 18,174, 12,208,101,
+230,204, 26, 75,102,153,101,140,177, 38,203,178,243, 95, 84, 86, 11,136, 82, 54,118,233, 55,194, 43,123, 21,143, 94,143, 66, 68,
+148, 71,166, 98,130,162,163,101, 22,192,164,113,205, 88, 2,168,117,164, 97,121,196,242, 53, 82, 41,199,163,124,191,197,224, 11,
+ 5,140, 29,241, 93, 37,153,143,246,169,151,190, 87, 28,173,108, 44,172,180, 84, 33, 51,148,184,202, 57, 13,252, 98,246, 17,253,
+156,207,148, 49,100,109,238,187, 26,210,246, 64, 76,161,228,202,196, 50,236, 75,202,240, 71, 49,162,170,115, 7, 69, 40,128,190,
+ 67, 40, 11, 82,250,174,170,154, 20, 2, 14, 83,169,150, 12, 45, 13,148,197,183,131, 12,125,232,184, 39,189, 79, 39, 67,174,229,
+ 81, 91,210,156, 75,175, 88,189,150, 72, 68,247, 8,100,213,247, 75,105,139, 90,144, 22,122,103,184,118, 71,135, 97,135,249, 74,
+ 53,146, 53,165,199,175,230, 83, 44, 44, 34, 90,113,168, 22, 94,195,224, 50,129, 22,138, 44,133,229, 13, 72,122,251, 87,214,237,
+231, 81, 75,139,198,234, 30,136, 73, 30, 80, 36,225, 64,153, 27, 3,229,246,165, 84,110,203,225, 52,220, 44, 84,174,128,185, 71,
+246, 89,118,168,203, 68, 23, 46, 11,220,149,192, 94, 0,225, 74,220, 95,161,211,112, 41, 77, 26,244,208,122,160,244,186,180,170,
+170,213, 80,198,216, 66, 60,230,218,127,224,233, 66, 25,104,204, 53,125,222,204,200, 49, 19, 28, 41, 6, 61, 95, 74, 69,132,224,
+ 83, 12, 41, 49, 32, 88, 91, 25, 83, 83,249,117,100,140, 36, 18,128, 20,113,133,120,160, 35, 6,138, 49,106,161,183,164,157, 98,
+138, 41,202, 50,184, 14,239, 29,202, 16,100,190,136, 77,212,227,181, 75,168,168,124, 25,125,151,232, 22, 80,111,154, 1, 4, 20,
+100, 0, 83,176,141,100,199,206,215, 55,229,137, 15,141,196,122,250, 52, 25, 47,213, 55,229,126,134,124, 7, 87, 8, 41,198, 20,
+226, 48,127, 25,243, 52, 6,139,128,222,242, 18,188, 23, 97, 50,182,105, 26,189, 93,162,214, 41, 80,107, 65, 32, 1,152,178,133,
+ 3, 34, 93, 26,200, 59,183,228, 3,202, 17, 27, 38,145, 87, 83,207, 48,131,144,235,126, 45,175,180,161,160, 99, 37, 74,183, 74,
+ 26,132,188, 67, 60, 2, 94,246,111,213,172,165,106, 88,225,122,151,244,107,102,221, 6,228,180, 82,207, 15, 15, 29,199,241,195,
+200, 67,182, 78, 8,153,110,140,209,247,125,223, 45, 98,244,128,212, 52,227,166, 25, 53,163,241,104, 52,174,234,166,174, 43, 99,
+173,142,183,169,227, 16,161,210,248, 3,124,207, 6,114,206,197, 20, 37,199,231,161, 44, 24,178,227, 10,135,190,236, 89, 97,161,
+137,135,194, 62,159,180,149,129,175, 85, 24, 82, 26,249,185, 65, 68,218, 35, 18, 50, 71, 9, 32, 97,144,196, 12, 41, 13, 24,117,
+249, 58, 3,130, 24,168, 84,101,134,188,143,101,112, 43,198,200, 41, 15, 73,170,254, 90,152,235,209,116, 58, 93,159, 76,215, 71,
+227,113, 51, 26,213, 85, 99,171,202, 24, 67,136, 2,144,146,234,233,213, 46,156,119,118,105, 32,253, 5,105,200,244, 60,160,228,
+130,102, 5,100, 40, 32, 11,131, 36, 67,138, 84, 74, 86, 86,240,125, 62,149,204, 75,116, 53,156, 81, 69,178,133, 94, 69,164,196,
+ 76, 67, 11, 32,196,168, 48, 61,175, 88,175,158, 40,175, 81,118,176, 16, 66, 33,150,251,155, 66,240, 62,134, 16, 83, 72, 49,122,
+231,250,110, 62,159,237,251,174,165,170, 90,223,216,222,216,216, 26,175,173,143,199,227,186,174,171,186,214,144,143, 68,106,245,
+ 44,117, 2,224,210, 32, 24, 26,223, 67, 45, 22, 89, 3,141, 6,226,101, 91, 2,151,109,134,229,165,143, 80,176,217,167, 99, 36,
+ 82, 90,169,210, 50,222, 94,233,183, 9, 43, 15,143, 68,194, 75,223, 46, 0,128,153,217, 86, 75,100, 60,140,121,103, 98,168,196,
+160, 50,101,149,133,241,193,151, 97,187, 16, 92,223,182,179,118,182, 31, 99, 24, 79, 55,143,109,159,218,216,220,154, 78,167,205,
+104, 92,110, 2, 49,122,164,121, 37,110,148,179,190,236,216,100,209,196, 0, 98, 17, 81,115, 18, 34, 17, 49,144,145,225,135, 16,
+148, 99, 94, 17,202, 13,119,194, 9,179, 16, 49, 51,174,228,124, 89, 14, 25,175, 16, 95,185,200, 24,230, 49,200, 24,162,104, 99,
+ 21, 35,167, 84, 37, 78, 41, 89,107,131,241, 67,147, 99,160,199,164, 76, 69,106, 8,136,229,254, 70,141, 56,106, 25,157,200,232,
+ 22, 7,109, 59, 35,164,173, 19,167,143,109, 63, 96, 99, 99,115, 60,153, 52, 77, 99,109,165, 45, 92,132, 50,179, 90,198,169,138,
+203,200, 64, 75,100,210,186, 24,168,176,137,132, 36,134, 33, 81,185,183, 87, 64,168,152, 38,151, 60, 26, 20,244,198, 4, 34, 22,
+ 33, 22,102, 70,100,198, 36, 0, 38,243,219, 56, 68,217,193,159,148, 9,206, 45,110, 4, 42, 32,205, 91, 91,249,186,170,245, 70,
+ 16, 91,146,186, 89, 42, 42, 86, 39, 41,211,112,163, 97,177,139,146,246,222, 59,223,119,139, 3,215,187,201,218,250,169, 75,174,
+216, 60,118,124, 50, 93, 27,141,199,117, 93,107,153,162,164,214,128,239,115, 28, 72,203, 38, 44,151,121,221, 16,124,136, 97, 73,
+152,105,204, 20, 32, 29,188,213,168, 44, 32, 36,164, 54,210,217,199,124, 82,150,146,129,124, 75,109,230,247,133,136, 40,165, 92,
+ 6,198, 24,149,251, 99, 98, 76,148, 48, 25, 49, 60, 48,219, 43, 60, 65,202, 87, 38, 59, 85,124, 82,233, 71,107, 17, 34, 75,118,
+142,121, 21,128, 68, 29, 34, 85, 12, 20, 92,183,104,219, 25,139, 92,118,229,131, 78, 93,114,217,120,178,214, 52, 77, 93,213,166,
+178,164,251,170,231,119,217,240,224,161,121,198, 37,232,231, 81,123,239,189,235,156,235,151,132,153, 20, 37,226,192, 9, 65,209,
+ 73,161,138, 1, 80,128, 65, 86,254, 91,153, 60, 28,116, 67, 48,116,171,133,133,140, 45,248, 91, 61, 89, 27, 75, 43,116,215,242,
+ 4, 9,115,241,138,224, 67,231, 18, 39, 16, 89, 17, 16, 33, 64,185,126, 60,147, 7, 49,166,200, 57,215, 59,215, 45,124,112,199,
+183, 79, 63,232,161,143,220, 60,190, 61, 92,132, 91,186, 50,122, 85, 20,175, 28,121, 53, 76,204, 29,128,252, 58,222, 7, 31,156,
+243,174,119,125, 27, 92, 55, 4,233, 50,147, 92, 56,141,123,232, 21, 63,117, 22,102,184, 64,117,192,204, 71,199, 64, 8,141, 32,
+161, 8,193, 82, 1,186,172, 42,238, 65, 12,210,138, 80, 68,209,139,235,251,182,157, 47,230,179,190, 91, 4,239, 56, 95, 6,149,
+117,178, 44,185,169, 28,163,143,209, 35,226,246, 37,151, 95,245,160,135,159, 60,117,106, 60,158,232, 96,232,145, 98, 16, 64, 86,
+ 11,232,114,185,128,246, 20, 53,148,101,148,160, 87,106,120, 31,130,215,198, 28,158, 61,123,118, 64, 40,127, 71,115, 71,159,126,
+210,230,190,121,161,191,222,203, 34,226,255, 7,169,229,123,123, 99,138,172,155, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/clone.png.c b/source/blender/editors/datafiles/clone.png.c
new file mode 100644
index 00000000000..324611a2d75
--- /dev/null
+++ b/source/blender/editors/datafiles/clone.png.c
@@ -0,0 +1,343 @@
+/* DataToC output of file <clone_png> */
+
+int datatoc_clone_png_size= 10774;
+char datatoc_clone_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 96, 0, 0,
+ 0, 96, 8, 2, 0, 0, 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,252, 97, 5, 0, 0, 0, 6, 98,
+ 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,
+155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7, 21, 0, 4, 16,211, 77, 59, 52, 0, 0, 32, 0, 73, 68, 65, 84,120,218,237,
+125, 89,208,101,215, 85,222, 90,107,239,125,198, 59,252,147,254, 86,183,108,203,178,100, 2,106,219,106,201, 50, 54,196, 9,161,
+108, 76,149,137,147, 64,202, 84, 5, 30, 82, 64, 24, 94,108,102, 12, 24,120, 8, 46, 8,225,133,209, 85, 41,147,216,174, 60,133,
+228, 33, 84, 37, 41, 94, 82, 4,140, 95,130,193, 41,136, 45, 91,131, 53, 88,106,245,244, 79,119, 58,211,222,107,229, 97,239,125,
+206,185,127,183,100, 25, 68, 42,169,242, 81,247,223,247,158,255,222,115,246,217,123,237, 53,124,235, 91, 75, 0, 95,237,113,247,
+197,139,247,221,247,134,219,207, 35, 0,124,232,103,127,222, 57,139, 0, 68,132, 68, 90,107,163,181, 54,230,195, 63,255,115,225,
+ 67, 31,252,209, 31, 19, 17, 0, 33, 36, 36, 34, 66,182,109, 85, 55, 77,103,237,250,248,191,127,234,127,190,120,245, 42,181,109,
+211,181,109,215,118,157,237,108,215, 61,251,244, 19,207,191,248,194,201,209,117, 4, 6,149,252,200, 15,255,136, 49, 70, 61,116,
+229,138, 48, 51, 51, 11, 60,247,220,211, 4,210, 53,205,108,239,128,210,178, 94,159,205,118,246,191,245, 31,124,171,182,157, 69,
+ 64, 68, 36,226,114,182,135, 32,139,211,155, 78, 8, 89, 94,243,218, 55,116,109, 43,204,218, 57,139, 8, 0,132,140,205,122,105,
+187, 38,157,236, 53,173,157,151,170,237, 58,165, 24, 68,180,117,150, 0,145, 4,145,154,166, 50,197,222,222,164, 32,165, 58,219,
+ 41, 81, 34, 2, 2,154,157, 19, 36, 2, 0,224,245,106,249,250,187, 46, 88,235,148, 8,136,128, 0,136,160,160,118,206, 33,130,
+136, 16,209, 61,175,185,215, 90, 71,196,128, 26, 0, 4, 0, 64, 3, 90,237,172, 35, 18, 0, 37, 34,136, 40,226, 0, 20, 58, 6,
+ 1, 0,100,116,196,244,138,150, 75,245,175,242,188,120,237,107, 95, 75,132, 85, 85,157, 95,187, 71, 30,121,228, 93,239,254, 54,
+ 17, 33, 68, 36, 82, 74,249,133,251,195, 63,252,195, 79,255,233,167,226,218,125,240, 71, 5, 4, 1,137, 8, 9, 21,169,229,217,
+ 45,203,224, 4,202, 60,255,221,223,253, 40, 0, 80, 27, 23,174,179,221,205,107, 47, 92,125,225,185,155,183,142, 87,203, 5, 51,
+158,158, 28,255,242, 47,127, 4, 0,252,218,137,176,136,200,213, 23,158,205,103, 7,229,124, 55,207,114,103,219,187, 47, 94, 34,
+164,247,124,251,183,147,237, 58,107,173,181,221,245,107, 95,158,204,118,159,254,252,103, 23, 71,215, 59,161,198, 1, 0,116,109,
+ 91,215,181,182,206, 17, 50, 17,213,117,183, 94,221,186,248,134,175,111,154,234,130,166,233,206,188,107, 59,214, 44, 16,151, 69,
+152,211,178,100,165,187,206, 94, 56,184,203,186, 46,140,192,175,157,115,142,144,133,168, 72,179,214,225,206,164,176,214,138, 0,
+168,176, 46,128,168,157, 99, 33, 68, 17, 68,156,231,169,115, 12, 0,136,214,161, 8, 10, 56, 68, 66,205,108, 1, 20, 17, 1,128,
+136, 35, 66,231, 4, 17, 17, 24,145, 24,153, 89,224,213, 58,112,252,230,199,126,252, 39,202,162,244,139,228,255, 67,191,207, 20,
+ 33,162, 34,245, 91,191,245, 27,215,175, 95,191,243,133,126,234,167,127,198,177, 3, 1, 96,241,151, 69, 0, 36, 68, 32, 36, 4,
+ 64, 82, 72, 68,136,164,148, 34, 68,165, 20, 41,245,165, 39, 31,251,119, 31,255,247,227, 11,233,205,102, 3, 32, 16,159, 17, 71,
+ 7, 32, 44,207, 78, 27, 49,228, 54, 38,155,128, 82,224, 58, 66,100,212,236,224,159,253,211,127,116,249,145,119,124,242,147,159,
+120,226,241,199, 1, 64,119,109,219, 63,164, 32, 32, 34, 33, 34, 98, 93,173, 79, 23, 75, 80, 38,209, 13, 40, 13, 96,235,211, 91,
+243,253, 75,213,250,140,210,210,185,170,216, 61,104,234,250,123,190,231,123,149, 82,191,244,139,191,160,222,242,208, 91,132,153,
+ 89,216,139, 29,139, 8, 56,219,221, 58, 57, 75, 38, 59,208, 86,142, 57,207,139,229,217,105, 49,191,139, 73, 3,168,205,226,152,
+ 69, 93,188,120,137, 89,188,158,249,214,119,189, 75, 59,103,193, 47, 37, 0, 18,128, 32, 33,159,156,222, 58,122,225,153,253,187,
+239, 89, 45, 78, 38,179,189, 23,143,111, 82,154,106,194,179,147,163,253,123,238,191,120,241, 18, 34,218,174, 67, 36, 38, 34, 34,
+199,172,173,101,194,176,124, 36, 0, 64, 12,178,217, 84, 58, 45, 89,207,156, 44,116, 82, 42, 7,119, 95,184,219, 24,179,179,127,
+ 72, 72,182,235,188, 38, 11,138,147,144,152, 53, 59, 43,128, 72, 32,130,204, 72, 36, 32, 50,155,205, 78,186,122,115,118,131, 92,
+ 61, 41,139,233,164, 20,128,174,179,164, 8, 1, 73, 17, 2, 41,197, 14, 73, 33,161, 66, 34,214,214, 58, 66, 64, 33, 64, 64, 32,
+182, 66, 68, 90, 39, 38,155,236,204,119,136, 46, 89,235, 16,129,136, 16,145,153,148, 66,102, 82, 68, 44, 72, 68,130,136, 66,138,
+148,118,206, 49, 34,178, 32, 2, 17, 35,146,115, 14, 17,231,179,153,136, 48, 51, 34,136,160, 8, 16, 33,146,136, 35, 34, 16, 39,
+ 4, 36, 34, 66,138,128, 17, 80, 59,118, 20, 5,199,107, 65, 63,241,254, 32, 34, 0, 36,191,241,128, 16, 16, 17, 80, 68,136,144,
+ 1, 16, 5, 16, 64, 9,190,122,123,237,111,103,211,246,199,238,238,238,206,206, 46, 0, 52, 77,125,122,122,186,217,108,190,138,
+ 11, 61,240,198, 55,190,255,253,223, 29, 36, 51,254,227,183, 62, 17, 41,165, 78, 79,207,126,253, 95,255,171,151,187,208,207,254,
+220,207,179,227,160, 15,195,238, 39,132, 96, 63,253,161,252,197, 72,105,163, 63,244, 51, 63,125, 7,123,243, 19, 63,249, 83,206,
+ 58,199,142,217, 9, 51,139, 8, 0,136, 8,136, 8,251,127, 0,132, 69,192,235, 71,230,111,124,251,219,238,185,116,233,115,159,
+251,252,150, 26,177,214,250,239,122,253, 27,228, 0,251, 17, 9, 56, 88,158, 46,218,166,110, 54,171,100,231,176,107, 43,110, 27,
+ 67,238,215,126,237,215, 63,244,161, 97,104,100,173,117,225,143,115,214,197,195,191,178, 55,110, 30,221, 60, 91, 94,189,126, 19,
+178,121,178,123,209,117,141,206,102,148,228,136,170,235,218, 95,249,213, 97,202,136,157,227,209, 17, 76, 24,179,115,246,249,231,
+158,216, 44,143, 55, 39,215,119,118,166,182,171, 78,175, 61,171,149,114,245, 90,108,219, 57,215,117,157,181,246, 87,127,245,215,
+194,133,220,112, 48, 51,247, 47,159,126,250, 9, 86,165,206,114,102,103, 69, 19,219,157,253,195,245,122,169,117,210,212,149,214,
+198, 49,219,174,107,187,246, 3, 31,252, 32, 0, 16,139, 31,134,147,254, 39,243,233,241,177, 54,217,173,171,207,118, 77, 67,218,
+108,206,142, 64,103,148,228, 89, 54,105,219, 42,205,138,206, 58,255, 40,206,218,131,253, 3, 4, 84, 15, 61,244, 16,128, 0,131,
+244,154, 91, 96,177, 94, 82, 50,157,204,231,200,162,180, 17,233, 22,103, 75, 68, 98, 84,202, 36,157,115,119, 31, 30, 42, 53,120,
+ 24,223,246,158,247,104, 97, 22, 47,124, 94,247, 51, 17,130, 99, 87, 24,106,107,150,246,108,179, 18,101,178,114, 58, 39,147, 16,
+ 82, 93,213,169, 98,173,141, 99, 39, 32, 34, 2,136,109,219,106, 17,239,250,176, 8,121,237,230, 64,148,179,171,211, 91,139, 91,
+ 47, 82, 54,221,219,153,118, 78,184, 93,157,158,220, 72,203,233,225,225,197, 44, 77,153, 25, 1, 65, 0, 8,192, 90,111,216, 25,
+ 17, 5,128,200, 49, 32, 10, 8, 34,171,212,118, 85,146,151, 73, 57, 21, 93,234,212,128,198,131,217, 93,147, 34, 67, 68,175,176,
+ 72, 80,208, 59,111, 0, 96, 73, 64,152, 25,128,153,129,217, 75, 49,119,213, 26,144,146,114,167,221,172,192,181,110,115,186,147,
+231, 89,162,221, 72, 76,252,166,242,239, 28,179, 22,199, 64,200, 12, 0, 14,145,152,189,114,211,155,205,106,190,119, 72,160,243,
+ 98,146, 38,137, 19, 22, 39, 40,226, 21, 44, 9, 1,137, 19, 32,241,219, 94,136, 65,152, 29,179,223, 80, 65, 36, 79,110, 60, 3,
+214, 94,125,250,177,221, 50,213,138,132, 29, 59, 22,246, 99,112,222, 8,134, 63,126,120,204,154, 29, 19,129,128, 48, 3,128, 32,
+ 17,179,148, 59, 23,147,188,184,235,194, 69,173, 53, 51, 3, 17,161,176, 0, 49, 51, 34, 10, 11, 19, 1, 32, 50, 16, 2, 3,130,
+210, 34,226, 24, 16,216,155, 10,102, 6,196,189,189,189,166,173,147, 36,241, 98, 34, 34,206, 57, 34, 5,194, 72,132,194, 68, 34,
+ 66, 64,194, 64, 8,200, 40, 90,132, 65, 0, 17, 5,144, 69, 16, 0, 68,136,168,200, 75, 0,239,181, 9, 17, 33,130, 8, 51, 18,
+ 49, 3, 17, 51, 0, 49,138,162,240, 17,209, 44,140, 72,225, 18,204, 18, 44, 7,248,135, 64,100, 68,100,246, 3, 17, 2, 17, 10,
+254,147, 8,160, 4,189, 37,194, 90, 88, 0,135,239,247,151,136, 74,202,187,244, 10,253, 87, 0,189,222, 67, 1, 65,191,171,208,
+235, 62, 45,194, 0,136,128,204, 28,205, 41, 71, 51, 23, 92, 77, 17, 63, 98, 18, 22, 65, 4, 10, 95, 98, 17, 5, 33,152,128,175,
+ 29,127, 45, 59,219, 31,111,120,195,253, 15, 62,248,224,125,247,223,191,183,187, 59,156, 21,129,104, 69,201, 59,156,132,132,116,
+122,122,250,248,227, 95,252,171,191,250,203,167,158,122,234,213, 25,208,100, 50,121,255,251,191,251,226,197, 75,204, 60,168, 93,
+ 16, 0,140,254, 55,134,151,131, 93, 31, 14, 26, 94, 17, 33, 1,130, 54,230, 63,253,254,239,127,230, 51,127, 38,175, 88, 56,240,
+125,239,123,223,131, 15, 94,230, 96,152,253, 32,182,190,141,209,137, 31, 6,209,251,245,231,135,228, 3,142, 97, 88,113,160, 68,
+ 68,214,218,143,125,236,223, 60,247,220,115, 47, 63, 32,125,255, 3, 95,215, 52,109,156,143, 59, 60, 8,246,193, 13,224,185,209,
+192, 16,102,244, 3, 33,142, 47,129,217,127,184,109,235,229,106,185, 58, 61,122,247,187,191, 5,132,118,118,247, 63,250,209,143,
+214,117,125,231, 1, 57,219,197, 65, 12, 65,205,104, 52, 40, 91, 3, 58,191,120,204,178,172, 90, 43, 32,205,138,116, 66,136,155,
+179,155, 73,150,103,211,125, 6,168,143,175,170, 36,167,124,198,109,133,217,220,182, 43,182,205,106,189,252,133, 95,252, 37,173,
+244,239,253,222,199,158,124,242,137,243, 30,214, 91, 31,125, 52,106,112,217, 58, 32, 4,180, 32, 48,156,137,103,217,185, 23,191,
+252,228,151,191,244,184,144, 52,155,181, 54,198,117, 22,108,139, 4,100,114, 83,204,192, 89,215,181,109,179, 49,105,129,174,173,
+ 87,199, 70, 43, 43, 90, 41,213,174,207,118,247, 47,176,240,149,135, 31,126,207,123,190,253,201, 39,158, 56, 59, 59, 27,166,224,
+135,126,232,135, 95, 74,220, 9,252,244, 16,146,128,160,143,153, 16,113,185, 94,118, 76, 68, 8, 32,192, 66,192,205,242, 8,116,
+158, 77, 74,112, 14, 17,117,146, 45,142,174, 77,119, 15,218,106,205,206,230,229, 4,147,137,181, 29,105,195,182,233, 86, 39,247,
+255,157,183,248, 40,192, 67, 22,137, 73,122,167, 79, 61,252,200, 35,225,233, 35,242, 18, 4, 73, 96, 16,172,248,147,133,111, 94,
+127,190,174,107, 32,114,237,122,117,227, 5,215,110,128,187, 77, 93,101, 69, 9,140, 94, 98,242,162,228,174, 37,147, 78,246, 46,
+154,124, 46,100, 54,203, 99,177,173,109,235,174, 90,238, 30, 92, 76,147, 20, 70,139,225,216,189,251, 93,223,118,245,234,213, 91,
+183,110,169, 43, 87, 30, 14, 81,103, 88, 16,191,217,130, 31,220, 59,200, 32,192, 34,167,167,183,172,160, 74,103, 90, 41,176,173,
+232, 68, 76,102,178,162, 93, 47, 59,150, 98,182, 39,148,152,124,166,116,106,138,185, 74,242,174,169, 69,216, 57,219, 84,235,180,
+156, 90, 43, 73, 86,236,239,239,251,113,112,127, 83, 17, 16,120,243,155,223, 66,132,234,161,135,174, 12,123,139, 97,252, 42, 78,
+ 24, 8,138, 8, 52, 93,183,174,154,229,209,117,118,238,234, 11,207,213,181,213, 89, 97, 76,214,108,150,206,118,197,108,223,185,
+174,221,172, 64,156, 99,231,227,227,166,169,234,213, 49,131, 24,132,122,125, 54,155,205, 14,246, 15,250,169, 71,136,230, 43,138,
+234,189,175,191, 79, 51, 59,240,166,223,199,250,130,130,130,140,130,225, 75, 2,222,199,160,179,163,235,155,186,202, 38,179,174,
+181,169,194, 52, 81, 32, 78,132, 77,146,157,222,184,138, 64,249,100,234,156, 91, 92, 63,218,221,219, 7,157,136,233,180, 74,178,
+157, 3, 6, 84, 98,239,186,235, 34, 16, 56,231,162,254, 64,233,131, 76,111,129, 17, 81, 68,199, 5,241,114, 44, 34, 8, 8,128,
+ 2,193,193, 68, 4, 63,181,220, 88, 72,179, 41,128,100,147,204,217, 38,203, 11,165, 76,106,204,233,241, 73, 62,153,150,101,190,
+ 94, 45, 65, 43,219, 54,214, 90,174, 55,152,149, 69, 81,230,102,166, 8, 1, 13, 11, 3, 11, 10, 33,129, 96,216, 31,132,227,136,
+ 22, 81, 68,179, 99, 9, 32, 18, 48,123,125, 39, 16,124, 91,128,112, 6, 65,184,174,206, 20, 34,176,228,179,253,249,193, 61,192,
+174,105, 54, 77,189,214, 73, 81,131,105, 41, 99,237,210,180,220,221, 59, 44,242, 66, 41,229,149,165, 48, 59, 9, 90, 29, 16, 16,
+ 4, 61,178,128, 66, 64, 76,206,235, 58, 4, 64, 65, 66,209, 78, 4,129, 65,144,131,202, 99,241,131,240,115,232, 95, 8, 34,194,
+124,231, 96,113,118, 34,232,150,171,211,172,107, 73, 25, 68,209,233, 4, 16, 83,195,147, 44,219,159,207,253,141, 69,128,157, 3,
+127, 35, 68, 10, 58,157, 60,222,130, 66,136, 14,144, 0, 28, 10,249,129,160,243,216, 3,106, 96, 22, 4, 65,239, 49,250,203, 49,
+ 0, 2,162, 48, 3, 34, 96, 56,163,149,114, 93, 83,173,151,119,221,125,143, 40, 37, 72,109,181, 94,159, 28,221,243,250,251, 19,
+ 83,130,119,252,252,216, 5,153,194,122, 35,138,243, 24,176, 0, 34,136, 67, 36,135, 66,136,126, 61, 28, 0,162, 67, 36, 68, 64,
+100,242, 51,228,215, 8, 17,152,101,152, 29, 24, 78, 32,128, 36, 73, 58, 41,203,233,108,175,233, 90,205,117,215,217,189,253, 11,
+249,197, 44,104,114, 16,113,189,121, 21,112, 72, 4, 34, 52,224, 80, 16,125, 22, 8, 18, 2,224,125,130,104,150, 1,145, 64,251,
+105, 64, 20, 31,115, 32,132,127, 68, 4,132, 0,195,190, 12, 16,130, 50,103,103, 39, 89, 57,213, 73,186,127, 48, 15, 11,236,227,
+ 31, 0, 64, 20, 1, 68, 33, 34, 0, 97, 70, 4, 39, 68, 0, 34,140,132, 78,128, 16, 64, 24, 16, 5, 5,145,156,143, 23,132,132,
+216,223,139,181,136, 0,176,151, 23, 63, 29, 24,165, 71,128, 9,130, 71,236,159, 97,103,103,127, 62,223,235,157,109,191, 91, 5,
+ 17,152,137,200,191, 20, 65,199,140, 30,201, 2, 32,240, 99, 37, 70, 64, 96, 32, 16, 33,191,158, 4, 8,200, 12,136,140, 66,126,
+ 15,129,102,118,113, 55, 8, 17, 50, 11, 17, 9,179,127, 74,199,222,155, 8,115,224,237,153,223, 51, 28,247,164, 7, 77,250, 8,
+ 69,132, 17, 1,137,252,238, 16, 17, 1, 34, 63, 45, 36,192, 20,188,126, 4,102, 64,234,157, 80,241, 49,172,150, 56,185, 8, 97,
+219,251,123,143,130, 15,134, 56, 79, 65, 76,252,194,196, 25, 2,102,136, 55,241, 81,133, 72,152,108, 1, 97,161,112,107, 4, 16,
+ 31, 59,123, 61, 4,136,224,247,207, 96, 47, 1,180,248,253,217,163,142, 8, 94,103,133,117,219,142,102,252,219,222, 51,115,206,
+249,168,144, 40, 64,122, 32, 20, 52, 28,160, 0,162, 32, 80,184,167,223,178,128, 18,157, 98, 16, 9,214, 35, 8, 64, 24, 80,240,
+ 19,209,207,102, 88,178,254,233,227,216,251,137, 29,159,233, 93, 39,102, 0,111,106,134, 87, 94,156,252, 27,175,226,188, 37, 98,
+143, 55, 10,138, 48, 2, 5,128,202,155,204,175, 20,115,124,237,248,218,241, 55,143, 92,135,232,196,232, 34, 47,146, 36,201,178,
+220, 24,227, 79, 90,219,213,117,211, 52,245,122,189,118,206,253,173, 15,200, 24,115,229,202,195, 95,255, 13,223,112,239,235,238,
+ 85, 58,226,129,130, 64,193,151,244, 33,160,143, 84, 69,228, 75, 95,250,210, 99,159,255,220,159,255,249,159,183, 49,193,243,170,
+ 13,232, 59,254,225,251, 46, 95,190,108,180,145, 30, 55,142,193,216, 40, 38,139,158, 95,140,240, 1, 64, 41,133,132,109,219,126,
+246, 47,254,226, 15,254,224, 63,255,141, 6,164,181,190,124,249,242,123,223,251, 29,210,107, 26,129, 62,139,216,135,244,227, 8,
+127, 59,178,223, 14,237, 17,137,104,177, 88,252,214,111,254,198,122,189,254,234, 6,180,183,183,247,222,247,190,247,210,165,215,
+120, 31, 22,206,105, 67,216, 70, 23,182,127,190,228,152,188,119, 10,160,180,186,113,253,250, 39, 63,241,137,227,227,227, 87, 52,
+160, 15,124,224, 3,121, 94,178,240, 86, 32,118,110, 2, 99, 0, 63,138,234, 71, 11,230,237,107,136,240,105, 27, 9, 9,112,141,
+ 82,234,177,199, 30,251,228, 39, 62,254,149,147,227,127,239,239,127, 11, 59, 22, 16, 39,174,143,154, 99,216, 40, 49, 70, 19, 31,
+ 25, 97, 63,121, 12,140,225,173, 15, 45,189,109,240, 38,201,175,116, 16, 61, 17, 16,112,206, 86,171,147,135, 31,121,228,201,167,
+190,212, 52,205,203, 13,232,237,111,127,135, 8,179, 15, 75,229,252, 1,163, 1, 5,131, 19, 49,155, 49, 56, 33, 99,172,164, 7,
+181, 0, 68,196, 58,187, 90,158, 93,127,241, 5,235, 58, 0,184,124,249, 77, 23, 46,220,253,228,147, 79,190,164,126, 97,102,136,
+166, 63, 62, 41, 12,247,241,110,254,246,169,115, 47, 69,196, 89,159, 4,105,154,170, 74,178,162,173, 54, 44,172,210,194,161, 6,
+ 91,147, 50,204,220, 53, 13,216, 86, 23,211,111,126,231, 59, 31,120,224,129,223,249,157,223,190,227,128,200,231,148, 88, 36, 66,
+218,163, 63,224, 79,220, 54,113, 33,241, 43,204,188,170,234, 91,203,234,120, 85, 45,170,102,213, 64, 39,184, 92,158, 66, 50,209,
+211,131,174,107,155,211,235,160,115,199, 2, 73, 73, 73, 1, 74, 19, 81,219,212,151, 46,221,243,145,143,252,202,157, 7, 20,144,
+254,237,220,208,185, 60, 81, 4,219,217, 13, 39,185,235,218,163, 91,183,206,206, 22,182,235,184,171,215,167,199, 70, 43, 52, 69,
+ 50,217, 7, 99,216,117,132,100,202,153, 49,134,146, 28,156, 83, 90,217,206,109, 22,139,102,179,114,236, 0,225, 95,254,242, 71,
+238, 32, 67,143,190,237,209, 59, 66, 85, 91,135,120,152, 25,122,237,180, 89, 45,158,127,230,241,186,222,104, 37, 0,128,164,180,
+ 73,234,245,153, 82,136, 58, 65, 0, 2,168,214, 11,109, 12,119,181,107, 54,182, 58, 3,149,160, 50,168,104, 50,157,166,105, 6,
+136, 68,244,141,111,127,251,159, 70,202, 72,191,100,114, 7, 97,238,209,144, 62,196,137, 33,183, 8,180, 77,117,116,116,195,164,
+121, 90, 78, 93,199,109,181,106,171, 37,136,109,155,141, 54,105,125,118,211, 85,103,215,159,123, 42, 47,167, 8,192, 2,148,228,
+168, 11,182, 45,114,211,182,214,218, 62,187, 33,211,201,244, 7,254,197, 15,110,205,208, 35,143,188, 85,238, 56,158,224,234, 13,
+104,189,143,252,173,237, 78, 55,117, 82,204,146, 98,146,164,133, 50,137, 2, 39,108, 85, 82,100, 89, 94,173, 22,179,221,187,172,
+109, 17, 56, 47,203,102,189, 96,215,102,121,169,146,140,148, 49,229, 14, 87,167,243,157, 93, 99,146,224,152,131,236,237,238, 45,
+ 22,139,171, 87,175,134, 93,118,103,192, 22,193, 71, 47, 12,241, 39, 2, 11,128,184,171,207, 63, 35, 58, 17,231,138,201, 14, 11,
+163,184, 52, 73,218,166, 37, 39, 58,203,242, 18, 81,186,166,170,246, 46,188,182,105, 27,147,149, 68,198, 49,177,116,205,226,150,
+117, 46,159,238, 42,109, 66, 78,196,187,228, 4,223,249, 93,223,245,249,207,127,206,103,157,105, 75, 15,246,128,144, 68, 61, 2,
+131, 6, 23,129,186,169, 77, 98,178, 52, 43, 39, 83,232,150,171, 27,207, 74,187, 90,157,222, 80, 4, 4,182, 89, 45,235,245,218,
+ 9, 76,166,179,147,155, 47,164,229, 52,155, 29,170,124, 34, 40,155,179, 91,148, 20,105,154,187,182, 85,218,132,116,170,248, 76,
+ 22, 91,107,127,252, 39,126,114,128,244,182,108, 86,239,107,227, 8, 48, 15,200,146,188,240,252,115, 2, 68,192,183,174, 95,181,
+157,155,239,223,197,166, 72,178,105, 91,111,218,166, 74,138, 89, 57,223, 95, 45, 78, 81, 37,179,189,195,229,201, 45,163, 77,181,
+ 89, 17,176,209,198, 7,128, 38,201,166,211,105,111,178,125, 20, 66,136,218,152,213,106,117,245,234, 11, 52,218,222, 28,132, 59,
+ 40,164,152, 97,139,137,182,182,107,178,204,228,211, 29, 93,236,188,230,245, 15, 76,230, 59, 39,167, 11, 69,212,174, 79,193, 54,
+211,221, 11, 77,103, 5,104,186,123,152, 77,230, 45, 75, 62, 63,176,206,165,121, 89,183, 45, 3,144, 41, 28,211,238,238,222, 72,
+143,132, 25,242,217,188,127,242,157,223,137,136,234,202,149, 43, 8,216,199,163, 18, 48, 1, 31,101, 33,120,131,133, 0, 2,155,
+106,229, 24,187,206, 98,154,177, 0,130, 20, 69,217,214,155, 98, 50, 79,138,105,215,109, 12,202,209,141,107,164,148,176, 5, 6,
+246, 25, 79,199, 40, 96,219,134, 1, 82, 67,243,217, 14,140,156,154,254,175,207, 69,206,230, 51,117,229,202,195,253,104, 64, 60,
+174, 37, 33, 59, 27,253, 50,191,108,103,235, 77,215,180,155,197, 17,138,123,234,139,143,229,229, 20, 72, 17,225,250,236,200,177,
+ 51, 73,233, 28,167,121,158,230, 69,211, 54,105, 94,216,206,182,245,218,118,117, 98, 20,178,101,219, 30, 30, 94, 10,105, 57,220,
+218, 64,125,142,224,181,175,125,157, 6,225,168,238, 48,134,146, 49,106,243, 38,155, 60, 49,200,213,171,227,249,254,197,124,182,
+163,144,239,191,255,126, 74, 75, 45,205,241,181,231, 69, 25,199,194,130,108,237,100,190,219, 53,149, 49,105,219, 52, 90, 41, 78,
+242,196,152,229,226,140, 0, 46, 28,222,173, 20, 49, 51, 33, 1,129,128, 16,146, 8, 32,131,144, 40,102, 70,114,206,169,183, 60,
+244, 16,132, 64, 50, 46, 86, 36,111,197,216, 21, 65,192,217,110,179,169, 86,203, 51,238,234,213,226,108,185, 56, 1, 17,210,233,
+100,247, 46, 68, 94, 30, 31, 77,102, 51, 69,184, 89,157, 9, 59,182, 29,170,192,226, 67,132, 36, 73,119,231,147,196, 36, 67,200,
+123,167, 36, 70,200,119, 5,231,102, 64,203,133,131, 47,195,204,126,179,179,135, 65,242, 60,235, 54,139,166, 90,237,236,237, 40,
+113, 96, 55,139,163,107,199,183,174,165,198,152, 52,117,206,173,215,235,157,221, 61,215, 54, 40,238,230,243,207, 46,110,124,185,
+217,172,144,101,154, 37, 90,153,176,101, 96,208,252,189,169,134,176,135, 88,152,117,192, 20, 5, 0, 25, 4, 57,236,122, 97, 17,
+ 15,215, 2,163,160, 56,150,117,101,243,249, 97,154,151,171,245, 10,147, 34,159, 31, 20, 64, 90,227,209,205,107,123,187, 59,202,
+152,174,105,190,252,236, 51,187,123,251, 74,211,238,222, 46,146,217,153, 77, 18,147,162,207,182, 70,236, 69, 60, 33,107,196,174,
+100, 17,138, 66,163,163,161,192, 62,224,143,112, 54, 66,244,199, 16, 64,152,211, 68, 35,161,176,219, 44, 23,198, 36,139,163, 27,
+229,108,175,105,229,224,226,235,171,205, 90, 81,102, 38,201,193,236, 32,203, 10, 0, 55,207,178, 52, 49, 16,135,130,236,105,158,
+193, 9,103,127, 6,195,159,128,226, 17, 49,179,230, 32,190,140,236,225,114,132, 0,238, 0, 96, 15, 74, 1,115,119,116,243,197,
+196,144, 73,202,189,195,215, 32, 17,119,109,219,108,146, 44, 63, 57, 57, 54,198, 96,187,113,150,211,178,204, 52, 36, 73,209,227,
+ 56, 30, 6, 10, 42, 54,224, 32, 17,122, 57,231, 79,248,132, 59, 8, 8, 6, 15, 57,220,218, 19,183,132, 35,140,194, 34,136,164,
+203,233,142,216, 22, 16,154,182,211, 70, 47, 78,110,217,182,217,221,211,123,179,105, 85,109,184,179,101, 57,157, 77, 39, 62,104,
+132, 64,234, 56, 39,188, 40, 32,180, 61, 14,138,122,200,167,251,117, 52,227,253, 10,121,129, 18,143,128, 33, 0,139, 0,160, 34,
+165,136, 54,174, 67,102, 84,155,186,130,233,206, 62,176,128,210,203,117, 85, 22,121,145,231, 90,107, 16,137,216, 25,160, 56,143,
+245,122, 45,231,247, 56, 10,114,136, 84,194,136, 61, 4,234,113, 65, 96,214, 16,145, 95, 24,139,183,231,166,244,107,134, 66, 74,
+169, 52, 43, 16,173,237, 60, 65, 81,192, 48,138,216,110, 82, 22, 69,150, 18, 81,192, 76, 97,144, 14, 70,175,220, 60, 51, 34, 82,
+231,124,228, 48, 2,180, 2, 76, 8, 32,136, 52,222,228,126, 22, 35, 69, 85, 56, 10,187, 48,131, 72,189, 94,156, 28, 93,179,213,
+202, 24,205, 0,206,213,203, 27,207, 24,176, 69,154, 68,149, 21,125,202,173, 64,202, 19, 84,182,247,122, 76, 76,158,119,194,152,
+181, 8, 96, 47,188, 65,107,163,167,132, 0, 5, 48, 63, 12,208,117, 69,106, 28,168,122, 83,177, 59,109, 55,139,221,131,187,119,
+118,247,100,204, 31,242, 90, 21, 72, 64, 8,250,215, 16, 78, 5,236,213,147, 80,188, 17, 96,244,186, 26, 68,128, 0, 81, 15,209,
+ 32,134,189,222,195,182, 61,200,232, 23,114,103,231,160,169, 55,173, 99, 64,232,154,238,174,139,247, 77,231, 59, 94,125,112,143,
+ 30, 11, 18, 9,128,191, 77, 80,187,232,101,133,195,126, 35, 8,216, 52, 4, 69,231,161, 73, 79,211, 17, 10, 84, 29,255,141,209,
+226,133,231, 6,175, 69, 25, 0, 80,233, 27, 55,111, 33,146,206,166,211,221, 11,147,217,140,176, 39,164,247, 80,115, 88,241, 30,
+ 34,240, 11,201,219,144,105,112,214, 97, 72, 50, 7,114, 76, 32,177, 10,132,175,196, 77, 47,195,219, 0, 2,131,136, 82,164, 13,
+ 89,231, 54,203,147, 60, 49,132,228, 31,197,111,200,254, 49,162, 24,138,132, 44, 41,247, 50, 3,253,237, 25,216, 39, 77,251,132,
+170,119,124,216,167, 22,250,196,157,223,131, 3, 20,227, 33,243,240,168, 68,234,174,195, 75,214,113,158,166,158,235,228,233, 77,
+128, 20,226,125,102, 34,242,105, 10, 98,150, 97, 17,217,103, 57, 24,129, 60, 4,141,136, 76,140, 66, 65, 47, 7, 64,128, 3, 78,
+ 29, 82, 64, 65, 35,250, 28, 67, 76,202,128, 68,180, 29, 17,203,114,114, 30,194,246,249,154,192,174,243, 48,183,231,236, 33,121,
+ 41,199,192,132, 18, 33,244,247,240, 9, 20,228, 8,170, 11, 11, 19,144,151, 95,138,198, 61, 44, 18,135,249,151,241,146,121, 1,
+ 8, 94,231,128,136,244,234,126, 11, 86,231, 40, 83,204, 48,100,184,185,151,158,128,135, 4,219, 25, 48, 18, 15, 18, 0,178, 80,
+159, 19,247,172,174, 94, 16, 69,134,244, 74, 28,200, 24,219,224,145, 13, 26,141, 27, 56,154, 41, 30, 44, 20, 8,160,127,112, 65,
+ 96, 1, 97,240, 78, 71,111,190,251, 88, 20, 2, 79, 76,250,135, 25,118, 25,251,253,220,167,167, 48,238, 41,230, 64,109,101,102,
+236, 21,124,120, 12,140, 79, 5, 33,241, 5,254,254, 16,134,194,232,131, 80, 24, 98, 99,136,209, 23,136, 8,245,143,226, 31,210,
+239,178,184,100, 60,184, 44, 49, 54,129, 62, 77, 54, 8, 19,198,103, 0,233,183, 69,200,157, 65, 8,130,253,236,248,148,123,216,
+ 83,131, 82,103,224, 88,206,130, 36,113,131, 70,209,241, 90,167, 23, 21, 63, 31,125,138,125, 80, 75,219,115, 25,190,219,191, 16,
+255, 34,200,195,104,182, 0, 35,189,174, 87, 86,128,130,113,158,196, 71,174,131,232,140,116, 26,196,193,193,121,139,115,219,104,
+ 96, 27,154,148,224,225,197, 85,244,195,144, 62,251, 22,150,113, 52, 36,233, 67,102,242, 83,230,159, 91,226, 46, 27,235, 92,136,
+202,122, 72, 58,111,105,243, 24,177,244, 62, 86,148, 1,137, 98,205,253, 66,133,205, 51,194,155,161, 23,163,176,134, 4, 3, 35,
+ 38,200, 35, 51,143,192, 69,233,133,186,215,126, 99,166, 99, 52,210,140, 3,150, 28, 4,220,187,134, 2,130,192,254,156,140,224,
+ 80, 24, 0,132,115, 56,212,215,142,175, 29, 95, 59,190,118,252,191,159,111,125,185, 75, 32, 78,166,211,217,116, 90,150,147,249,
+206,124,111,119,111,190,179, 51,159,205,138,114, 82,150,121,146,164, 24,153, 76, 35,192, 44, 98,102, 2,214,218,170,218, 44,150,
+139,229,114,117,227,198,245,213,114,117,182, 56, 91, 46, 22,167,167,167,203,229,242,255,191, 9, 42,138,226,129, 55,126,221, 61,
+247,220,115,225,240,112, 62,223, 41,202, 66,107, 61, 42, 47, 57,119,117,188,253, 38,231,168,180, 35,122,239,128, 88,245,135,181,
+118,179,222,156, 45,206,174, 94,125,225,241, 47,126,241,137,199, 31,183,175, 82,230,251, 85,155,160,195,195,195,135, 31,121,228,
+ 77,111,122, 75,154, 38,210, 19, 75, 94,201,117, 37,176,158, 71,184, 84,120,139,145, 76,134, 1,226,141,236,189,209, 76,197,249,
+194,152, 55,197, 8, 1, 16, 17, 61,247,220,179,255,227,143,254,232, 11, 95,120,108,228, 55,255, 95,153,160,201,100,114,225,194,
+133, 55,191,249, 45, 15, 60,240, 70,210,138,144, 68,120, 75, 64,228, 14,112, 37,222, 81,104, 16,207,165,144, 71,111,111,227,208,
+223,254,115,187,106,206, 7, 71,253, 76, 13, 92, 1,162,147,147,147, 79,253,201, 31,127,225, 11, 95, 56, 58, 58,250, 91,153,160,
+195,195,195,203,151, 47,223,119,223,125,135, 23, 46,132,194, 37,145,237, 73,145,151,247,154,112,172,144,182,161,249, 45,180,119,
+156,254,191,141,214,127, 71, 50,192, 87, 58,137,129,207,133, 68,138, 0,240,185,103,159,249,204,103,254,236,179,159,253,108,215,
+117,175,206, 4,125,248,195, 31,110,218,110, 32,114,159,243,211,229,149,249,147, 91, 2,131,120,251,201, 59,124,236, 28,109,227,
+101, 68,233, 28,117, 97,188, 13,251,221, 55, 84, 86, 50,243,106,181, 60, 57, 61,251,223,127,245,151,159,254,244,167,255,134, 85,
+ 61,186,170, 27, 25, 51,221, 95, 82, 94,110,211, 60, 99,154,204,246,188,140, 78,222, 46, 74,219,155,240, 54, 94,203, 80,162,113,
+142,201,241,149, 68, 12,132,235,174, 89,157,157, 44, 22, 39, 62,168,126,224,222,139, 95,119,255,247,234, 52,251,147, 63,254,212,
+227,143, 63, 46,127,173,153,210,129, 14,117,174,180,228, 78,215,146,115, 26, 75, 2,167,105,196,168, 64,188,253,115, 34, 91, 25,
+ 73, 1,233,115, 94, 24,227,184,225, 19,232, 99, 68,134, 8,168,123,108, 49, 64,113,194, 34, 74, 41, 36,197, 44,130,200,236, 92,
+215, 89,182, 93,211,216,174,181, 93, 71, 58, 17, 52,220,109,216,118,164,140, 74, 10, 52,233,123,223,247,143,255,249,254,222, 99,
+143, 61,246,223,254,235,127,249,106,245,148,150,113,115,130,151,152, 99,121,153,157, 37,183,189, 27,159,148, 59,158,237,147,185,
+ 30,156, 16, 22,113, 44,206,217,205,226,184,173, 54,105, 57, 69,101, 60,192,224,186, 6, 69,218,166, 74,242, 28,128,144, 20, 32,
+105,237,215, 85, 66, 90,132, 72,152, 65,165,164, 51, 16, 1,219, 8, 16, 91, 43,174,147,174,106, 72,219,172,152, 21,217,131, 15,
+ 62,120,249,242,229,197, 98,249, 31,127,255, 63, 60,241,196,227,175, 88,130, 2, 88, 41,227,135,188,237,169,229,118, 7, 39, 20,
+ 53,248, 42, 2, 20,128,136, 14, 98,252,237,208, 50, 97,244, 21,159,115, 65,116,206,181, 93, 87,183,157,101, 16, 82,138, 72,156,
+165,100,162, 84,238, 72,145,210, 74, 41, 79,202,178,205, 38,157,238, 42,147, 3, 41, 0, 17,215, 9,130,216, 86,108,203,206,234,
+108, 10,148,196,142, 22,128,200,104, 82, 97, 39,198, 1, 10,144, 70, 36, 38, 93,183,173, 73, 51, 4, 40,139,252,251,191,255, 7,
+ 88,228,227, 31,255,183, 79, 62,241,196, 87,230, 84,189,237,209,183,141, 53,178,192, 8,197,130, 45, 70,193, 29,116,210,182,238,
+218,202, 45,221, 65, 2, 61,230, 40,213,102,181, 56, 59, 57, 62,186,177,169, 54,174,221,156, 29, 93, 7,215, 18, 1, 2,183,213,
+130,184,173, 22,183, 54,167, 55, 93,189, 17,215, 56,219,153,108,130,202, 40, 2, 69, 2, 98,133,173,171, 86,220, 90,159,237,228,
+174, 49,138, 72, 41, 97,118,109, 13,206,138, 0,144,242,252, 50, 17,104, 54, 11,233,218,233,206, 94,146,164, 61,232,140, 8,111,
+125,235, 91,191,233,155,190,249,198,141, 27,183,110,221,122,185, 9,122,244,209,183,221, 73, 9,203,157,125,226,237, 79, 14,234,
+ 86,134, 15,140, 13,122,248,125,128,222,164,169,214, 39, 55,158, 63, 57,186,214,108,206,132,109,146,102, 62,153, 67,136,236,156,
+101,152,204,118,157,160, 78,203,114,182,139, 74,235,180, 48,105,142, 40,226,156, 82, 20,136,126, 34, 74,167, 42,205,149, 73,117,
+ 90,152,172,100,212,204, 44,206,186,174, 18,215, 2, 59,113, 22, 0,216, 57,173, 19, 83,204, 76, 86,228, 89,150,152,100,252, 96,
+236,216, 24,243,240,195,143, 60,120,249,242, 83, 79, 62,121,123, 31,154, 48, 65,111,125,244, 81,129, 49,116, 36, 47,161,115,182,
+126,213,147, 61,229, 21,248,227, 34,210, 89,187,169,171, 77,181,105, 89,148, 73, 76,146, 34, 42, 1,233,218, 78,233,164,152, 76,
+235,213,217,241,139, 95,222, 44, 78,180, 34, 99, 18, 34,112,109,221,181, 21, 34, 25,157, 32, 8,219,186, 90,157,174,142,175,111,
+206,142,148, 34,113,206,182, 13, 10,219,122,213,109,206,128, 45, 42, 35, 64, 72, 74,153,132,146, 92, 37,185,210,102,125,118,212,
+172, 23,224,186,114, 50, 77,211, 92,182, 56,125, 1,163,156, 78,103,127,247,157,239,156,148,211, 47,126,241, 11,119, 80,179, 63,
+248, 67, 63, 12,175, 48,116,136,121,219,219, 88,176,219, 54,223,119, 88, 9, 90, 7,133,121,189, 94,111,170, 13, 35, 10,131, 54,
+137,210, 58, 36,200, 17, 80,196, 57,171, 16,210, 68, 31,221,120,145,148,153,206,246, 64,169,196, 24, 17,183, 60,185,177, 60, 57,
+ 46,202,217,254,133,139,190,118,155,148, 2, 1,207, 78,110,187,134,187,142,153,149, 54, 64, 10, 81,161,210,214,118, 93, 91,199,
+ 28, 28, 40,133, 10,209,104,189,187,187,159,101,105,160,144,244,220,207,193,217, 12,255,252,246,111,255,230,181,107,215,206, 17,
+188, 30,121,165,193, 72,156,157,184,165, 60,241, 43,206,215,168, 42,183, 39, 27,217,182, 61, 57,186,126,116,227,133,182,109,149,
+ 86, 70, 97,187, 89,137,235,186,205,226,228,250,213,179,155,215,184, 93,119,213, 82,108,187, 89, 45, 64,216,243, 33, 66,150, 71,
+ 32,205,203,114,182, 91,148, 37, 17,185,174, 19,215, 85,171, 53,136,232, 36, 19, 82, 72,154,148,209, 38, 1,149, 8, 40,118,206,
+182, 53,187,142,132,129, 27,224,214, 85, 75,232, 26, 0, 72,178,108, 82, 78, 34,187, 6,198, 44, 77,217,182,175,239,120,251, 55,
+229, 69,225,155,234, 12, 12,184,151, 50,237,184,197, 16, 28, 84,139,192,168, 4,226,252,246,234,221, 29, 96,230,186,109, 29, 80,
+ 54,217, 73,211, 18,145, 58,118,202,164,198, 36, 74,161, 48,207,118,118,147,188, 40,167, 59, 38,159, 20,229, 84,167, 41,146, 74,
+140, 89,156,158, 56,219, 33,170,208, 65, 75, 64,105,205, 34,214,113,146,102, 44, 14, 64,148, 82, 90, 37, 68,218, 7,104,128,128,
+ 4,174,173,155,245, 9,145,212,109,203,140, 58, 45, 4, 21,160,158,205,119,210, 36, 29,101, 46, 96, 59,155, 25, 41,118, 34, 0,
+112,239,235,238,125,221,235,238,125,234,169, 39, 61, 39, 93, 93,185,242,240, 29,200,138, 35, 90,112, 40, 76,236, 65,127,193,200,
+197,149,144, 83,198,120,170, 79,156,138,136,115,167, 71, 55, 94,124,254,105,219, 86,222,211, 85, 90,105, 98,169,150,205,242,120,
+179, 94,231,147, 25,233, 12, 76,226, 0, 17,164, 89, 47, 79,142,110,214, 85,173,180,153,206,118, 77, 62, 73,138,137, 50,185, 78,
+ 50, 50,153, 8,145, 73, 77, 86, 32,105,147,149, 38,201, 69, 64,216,249, 76,133,117,157,184,214,103,138,242,114,138, 42,205,242,
+ 18, 85, 34,140,164,212,108, 54,157, 76,102,125,197, 87, 63, 70,140, 85, 96, 16, 19, 40, 24,211, 35, 7, 7, 7,111,122,211,155,
+ 30,123,236,177,186,174, 61,187,107,107, 55,201,150,142, 25,106, 39, 49, 54, 64,232,117, 13,202, 64, 62,192, 81,213,140,136,108,
+ 54,171,166,109,179,114, 71,101, 37,160, 78,178, 2, 72, 51,165,186,152,171,180, 36, 69, 93,211, 16,130, 66,114,214, 50,187,188,
+156,148,229,196,104,237,243, 95, 74, 97,181, 60,169,214, 75, 95, 2, 32, 32, 64,200,206, 17,130,239, 84,194,194, 8, 98,173,107,
+ 59,235,237,118, 83, 85,109,179, 73,147, 76,233,212, 10,116, 93,109,109, 53,155, 76,231,211,249, 64,105,216,182,214,231,216,235,
+113,154, 80, 68,242, 60,127,251, 59,222,241,191, 62,251, 89,252,190,239,251,190,109,203,222,187,123, 91, 26, 5,135,192, 34, 78,
+ 99,152, 20, 31, 19,245, 43,128, 0, 96,157, 93,174,150,214, 58,173, 77, 85,109,108,231,242, 98,138,198, 88,238,216,113,154, 36,
+138,148, 0, 24, 69, 8,220,117, 13,145, 98,118,109,219, 16,169, 60, 43, 72, 1,219,206,152,212,218,174,174, 42,102,152,204,102,
+105, 86, 8, 64,211, 52, 74, 39, 74,107, 4,113,182, 21, 97, 68,173,180,102,118,245,102,221,213,107, 66,112,206, 42,109,146, 36,
+157, 78,231,147,201,132, 72,221, 1,169,243,129, 46,156,195, 5,112,172,182, 73,145, 56,209,177, 7,208, 64,222,140,115, 17,203,
+ 25,125,110, 63,248, 32,192,158, 16, 37, 8,194,236, 93,177,200,107,241,132, 10,102,174,171,170,174, 42, 0,215,110,206,148, 54,
+179, 89,153, 24,186,121,243,121, 91, 87, 70,105, 53,153, 67,154, 17,208,170,169,150,139, 83,113,174,156, 76,178, 60, 83, 68,206,
+113,219,214, 70,107, 66, 58,186,113, 77, 27, 51,157,239,131,210,168,244,166,218, 8,187, 52, 47, 5,168,107, 91,163,254,188,140,
+ 59, 0, 0, 9,135, 73, 68, 65, 84, 72, 41, 67,132,206, 89,215,214,136, 56,153, 76,108, 94,212,155,101,187, 90, 20,185,217,219,
+191,203, 36, 9,140, 58,131,156,139, 4,135, 96,103, 92, 13,234,217, 63, 62, 5, 41, 64,138,212, 67, 15, 61,180,149, 78, 28,167,
+244, 96, 32,254,143,227, 43,220, 6, 69, 68, 36, 76, 39, 8, 0,116,109,179, 60, 59, 97,182,128,154, 76, 78, 58,105, 59,219, 52,
+ 86, 39,185,201, 38, 73, 49, 5, 50,190, 65,151,214,102,111,111,111, 58,157, 42, 34,199,194,142, 87,167,199, 77,181, 2, 4,165,
+144, 8, 25,176,110, 26, 2, 97,219,182,245,134, 67,212,238,196, 23, 17, 19, 89,219, 54,109,235, 68,144,200, 89, 91, 87,155, 68,
+235,195,187, 47,206,230,187,164,244,136,249, 61, 40,159,241,214,146, 49,105,224, 28,198, 19, 95,233, 80,254,217, 27,166,144, 30,
+246,125, 23, 70, 26,199,151,146, 3, 0,123, 98,157,196,106,190,192,243,241, 81,214, 64,224,237,186,174, 91,119, 93,103,242, 12,
+ 73, 37, 38,177,117,211, 86,235,166,110,116,154, 37, 89, 46, 72, 58,201,186,206, 25,163,218,166,181,205,198,182,117,150,102, 64,
+186,235, 58,109, 18,165, 76,170, 89, 43, 58, 61,122, 49,201,138, 52, 45,156,237,170,174, 33,165, 9,196, 57, 81, 73,154,229, 19,
+157,228,158,242, 92,164,217,206,108,234, 35, 56,145,161, 91, 1, 32,222,201,209,195, 65,231, 12,202, 36,168, 92, 79,254, 2, 68,
+ 38,208, 3,205, 5,163,123, 28, 42,146,165,199,144,197,107,227,129,175, 7, 61,153, 64,122,190,101,240,133, 68, 4,211,114, 55,
+ 41, 69,129,235,234, 53, 59,167,146,156,129,116, 62, 69,157,154,100,157,100,153, 74, 50, 69, 72,164,186,166, 58, 59, 90,230,229,
+204,148,179,116, 58,191,245,226, 85, 96,153,238,204,108, 83,119, 2, 64, 36, 32,229,108, 87, 68, 28, 48, 0,164,132, 4,150, 89,
+140, 81,206,182,208,213,121, 81, 36,121,162,136,124,226, 68,130,107, 51, 82,137,242,149,220,152,209,137, 30,136,241,211, 68,128,
+ 94,130,192, 55,145, 11,157, 7, 66,231, 3,216, 10,191,122, 1, 12, 84,178, 94, 86,195,228,132, 31,194,214,117,237,102,109, 37,
+116, 24, 75,146, 76, 89, 97,177,216,214,174,107,192,164,181,149,110,189,200,243, 66,167, 36,148,151,187,101,145,232,102,179,102,
+ 43, 23,239,189, 95,235,196, 24, 67, 68,206, 89, 97,231,218,134, 81,210,188,180, 86,140,209,138, 80, 17,129,128, 82,164,148, 38,
+ 82,190,200,150, 69, 80,220, 24,184,139,198, 37,108,129, 97,165,111,255,207, 39,234,123,162, 32,198, 83,136,194, 78,131,199,228,
+195,188, 97,223, 27, 46,114,186, 25,197,231,252,123, 74, 44,160,103,231,142, 64,196,168,176,144, 5,216,185,186,109, 16, 21, 16,
+137,237, 44, 55,152,164,105,158, 16, 80,154, 36,206, 57, 97,135,236,144, 16,216, 1, 72,221,116, 34, 19, 76, 74, 66,178,128,182,
+237,206, 86, 43, 69, 42,207,114, 34,104,133,156,117, 66, 46,207, 82,163,148, 86,138,130, 54,237,233,175, 99,221,123, 71,217, 24,
+ 76,250, 29,241,171, 33, 60,232,105,148, 35,246,145, 14,234,220,211,113,134,187,112, 80,199,177,153, 20, 32,134,246, 26, 91,128,
+ 96, 60,211, 67,205, 34, 68,104, 12, 57,219,137,101,148, 22, 64,111,170,198,193,196,164, 57, 41, 3,200,182,173, 69, 37,157,181,
+ 30, 63,214,218, 32,184,102,181,170,171, 77, 49,153,146, 54, 10,193,214, 85,195, 93, 94, 22,211, 34, 79,140,241,101,132,163, 39,
+237,179, 79,183,251,241,210, 23,193,244,116,209,208,135, 35, 4,137,225,239, 86,246,106,216, 6,163, 13, 39, 2, 74,105, 96,175,
+118, 49,162, 94,140, 0, 18,168,202,177,128, 28,165,167,194,202, 0,157, 6,158, 92, 79,138, 25,246,157,115,206, 58, 36,165,147,
+ 68, 19, 37,169, 1,165, 1,124, 95, 49,204,139, 73,193, 25,138, 93,173,150,202,164, 42,205, 69, 84,146,235, 36,159,176,235, 92,
+ 91, 23, 69,185,119,120,183,214,122, 48,189, 97, 97,163, 5,142, 70,249,188,233, 6, 26,240, 74, 12,138,130, 8, 34, 99, 42,118,
+158, 12,100,206, 96,106, 2, 21,208,183, 3,232,167,220, 11,145,115,186,215,106,131, 1, 60,111,218,163, 77, 24, 2,187, 81,151,
+198,190,212, 48, 4, 30,168,180, 54, 89,233,120, 67,232, 93,234,141,210, 38,201, 75, 4, 84, 74,186,186,105,153, 77, 86, 40,157,
+152,201, 1, 8,136,179, 72, 34,136,154,112, 90,204,180,214, 74,169, 16, 88, 6,170,119, 40,146,240,102,102,204,139,234,189, 28,
+ 12,155,156,125,149, 71, 79, 59,130, 64, 90, 12,229,146, 94,129, 6,160, 23,209,199, 72,189, 59,196,226,233,203, 50,110,245,169,
+ 57,170, 93,255, 1,217, 2,199,198,164,169,126,204,241, 76,188,109, 31,217, 96,176,149, 4,130,141,115, 30,155, 65, 45,204,221,
+102,113,130, 74,171, 52, 55, 73,110,210,148,144,108,219,214,155,101,211, 84, 89, 94,206,102,179, 60,203,140, 86,136,212, 11, 73,
+ 31,249, 96, 44, 77, 24,181,112,243, 55,242, 19, 24,206,199,137, 25, 7, 76,145, 80, 28,121,214, 97, 42,112, 52,183,183,103,138,
+113,176, 67, 2,160,131, 59,192,200, 56,178,142, 97, 54,199,223,243,253,248,198, 86, 94, 24, 4,207,165, 79, 65, 0, 32, 73, 76,
+166,113,117,122, 67,216,166, 89, 73,105,161,211,130,148, 22,128,214,182, 82,173,217,118,174,107, 12,194,193,238, 94, 49,153,107,
+147, 14, 34, 19,122,155, 68, 99,212,219,220,248, 38, 76,136, 47,112,195,158,220,134, 81, 19,134,112,177,151, 36, 4, 96,223,217,
+ 68,144,251,217, 12,113, 83,228,190,191, 68, 58, 29, 1,116,204, 44,111, 43,119,137, 65,252,224,221,244, 43,232,201,203,129, 8,
+ 7, 61,161, 94,182,160, 3,113,174,107,156, 49, 6,201,160,179, 70,153,182, 89,215,117,149, 26,173, 4,148, 49,147,131, 75,218,
+164, 90,155, 88, 39,219,163, 64, 61,126,201, 18,114,130, 61, 76,225,243,243,227,149,242, 69, 10,177, 29, 16,196, 88, 1, 3,231,
+ 54, 6,137,190,240,194,251,190, 40,136,145,103,140,200,224,139, 67,122,148, 6,251,170, 39, 4, 64,212,209,211,139, 78, 2,136,
+111,164,137, 67,189,205, 72, 78, 96, 40,130,233,215,188, 31,122,239,133,104, 99,166,187, 23,204,100,175,107, 27, 97,235, 58, 91,
+ 89,167,117, 54,223,155,117, 93,173,149, 46,203,137, 49, 73,108,148, 45,177, 5,140,231,192, 6,138,127,124, 78,241, 12,196,190,
+173, 80,188, 87, 44,128, 24,143, 10, 65,188, 92, 5, 63,206, 91, 29,223,134, 71,250,226,206, 33,210, 14,133,159, 56, 66,217,161,
+ 47,147, 0, 95,145, 48,134,156,251,109,133,145,231,139, 35,215, 98,104, 4, 51,170,164, 24,229, 70, 97,160,224,250,181,234, 42,
+187, 89, 57, 1,157,102,218,228,214,113,235,120, 50,153,167,209,108,247, 90,119,104,130, 18,219,183,244,251,171,111, 90,216, 55,
+ 95,137, 6, 1, 99, 4,208,167, 10, 4, 96,224,248,142, 66,130, 32, 56, 48,110,120,194,192, 56,210, 75, 24, 67, 43,236,123,116,
+133, 65,232, 45,186,109,236, 68, 53,126,139,129,111, 26,186,192,197, 38,151,125, 89, 64,124,200,158,240,234,175,171, 85,146,152,
+122,205,174,107,144, 80, 92,151,166,153, 23, 28,140,205,147, 2,107,184,135, 66, 99,243, 30, 24,186,124,110,209,232, 7,230,180,
+239,112,131,132, 65, 49, 98,111,172, 98, 15, 36,159, 83, 28, 18,180, 28,212, 87,236, 3,134,136,222,193,193,224,225,245, 12, 28,
+217, 78, 17,106,232, 63,215, 7,171,209,193, 25,136,207,193,117, 21,230, 33,191, 19, 23,153,199, 86,177, 87,173,136,148,102,229,
+222, 97,230,219, 42,248,254,204, 35, 29,239, 5, 48, 54, 45,151,216,115, 10, 71,181, 97, 35, 25,238,237,189,132, 18, 39, 97, 65,
+ 12, 13,225,183,248,201,177, 39, 43, 68,138, 10, 96,159,219,142, 81, 85, 40, 88,198,232, 91,203, 72,117,247, 16,105,172, 39,211,
+ 28,187,243, 2,142,158, 22, 71,113,223,104,243, 96,143,140,141, 38, 6,241, 54,132, 23, 67,217,135, 82, 74,129, 26, 49, 27,162,
+ 83, 16,149,216,232, 30,231,103,100, 52,149, 48, 52, 56, 11,139, 54,158,142, 94, 2,101,104,208, 22,158,206, 43,105,175,133,123,
+ 80, 2, 68,124,245, 15, 70, 55,192,119,251, 69, 96, 16, 26,133,103,136, 48, 42,115, 11,253, 66, 99, 41, 11,135, 50, 29,232,197,
+164,215,202,204,125,113,196,136,100,222, 75, 16,110,105,244,113,237,192, 88,120,195, 57, 24,214, 98,224,131, 15, 21, 99,209, 34,
+200, 80, 59, 38, 61,209,127,168, 72, 10,196,247, 62, 87, 16, 11, 71, 66,155,134, 8,170, 75, 15,184, 6,119, 17, 6, 22,123,168,
+254, 60,215,200, 49,224, 65, 67,103,176,222,110,202, 16,189,241,249,174, 80,189, 18,197,209, 3,200,237, 43,191,157, 52, 8,174,
+ 64,168, 78, 27, 41,120,137,122,168,215,101,241, 51, 65, 96,125,197,197, 86, 49,164,112,212, 64,253,170,245,222, 76,240,240, 56,
+182, 32,196,128, 86, 69,198, 61, 6,123, 77,219,140,127, 64,244, 53, 89,189,153,247,134, 76,247,245,101, 67, 89, 72, 12,150,251,
+226, 35,127,106, 91, 59, 68,205, 52,242,175,199, 36,161,109, 22,236,214,132,245,142,249, 72,238,134, 98,163,222,219, 10,219,203,
+183, 94, 27, 57, 88, 28,153,143, 35, 69,217, 35, 15, 67,197, 46,142,122, 54, 3, 12, 32, 96, 40,189,100,255,191, 53, 24, 71,166,
+226, 91,145,198,217, 9,177, 13,241, 48,139, 65,140,163,134, 25, 87,146,240, 72, 70,250, 18,160,161,216,101, 60, 19,219, 60,165,
+190, 13, 56,159,251,204, 56, 61, 21,234,155,134, 65, 96, 95, 57,129,227, 26,205,248, 41,225, 88,190, 35, 67,169, 75,208,189, 35,
+252,120, 4,158,142,234,254,188,146, 71,142,113,103,136,219,250, 50,253,173,234, 25, 0,138,213, 81, 28,203, 14,101, 84,104, 51,
+174,176,129,109,237,112,238,173,140,171,112,198,189, 82,110,207,211,143, 11, 2,251,226,170,168,101,101,180, 5, 71, 69,107, 65,
+ 11, 70, 48,189,247,172,183, 75, 91,125,165, 17, 71, 91, 60,170,110,145, 30,232, 9, 39, 25,123,253, 19,250,180,198,202, 40, 24,
+ 87,169,137,104,137, 10, 15,135, 58,175, 40, 29,163, 56, 24,113,136,197, 70,126,208, 86,233, 15,222,198, 82, 28,207,203,118,144,
+ 12, 35,103,167,183,243,184,101,200,122, 23, 39,238,166,160, 12,194,239, 66,119,119,236, 75,234, 6, 93,232,223,250,229,245, 93,
+255,130,253,226, 33, 92, 10, 22, 43, 68,113,161,123, 43, 83, 56,137, 61,102,166,135,187,198, 10,229,176, 46, 50,228, 67,194,253,
+227,226,142,253,148,115,204,193,219, 59,252,157,155,175,177, 38, 26,235,188, 81,230, 31,199,236,162, 88,164, 43,227,100,139,247,
+212,183,116,144,247, 99, 40, 10, 86,136,199,125,160, 65, 3, 76, 36, 33,199, 9, 91,159,137,238,143, 87, 76,163,240, 24, 35,208,
+221, 87, 58,134, 90, 56, 95, 84,119,238, 9,153,101, 84,164,185,165,149,207, 25,251,115,108,249,241, 87,198,223,138,243,219,211,
+ 15,183,169,142,193,182,247, 73,115,255,161,254, 90,128,195,151,130,223,209, 83, 27, 37, 4, 11,125,113,242,144,233,193,219,250,
+142,247,150,127,212,214, 37,238, 52,230,255, 3,181,198,231,135,110, 84,158,236, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/crease.png.c b/source/blender/editors/datafiles/crease.png.c
new file mode 100644
index 00000000000..f785c005628
--- /dev/null
+++ b/source/blender/editors/datafiles/crease.png.c
@@ -0,0 +1,276 @@
+/* DataToC output of file <crease_png> */
+
+int datatoc_crease_png_size= 8638;
+char datatoc_crease_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0, 1, 26,
+253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,252, 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0, 0, 0,
+ 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73,
+ 77, 69, 7,218, 7, 19, 0, 34, 11,191,157, 46, 32, 0, 0, 32, 0, 73, 68, 65, 84,120,218,237,124,123,176, 94, 85,149,231, 90,
+251,156,239,251,238, 35, 9,185,201, 21, 18,146, 92, 8,175, 16,222, 33,128, 17, 67, 2, 9,208, 64,112,108, 64, 64, 48, 60,180,
+ 7, 31,211,182, 53,229,148, 35,106, 73,183,218,218,227,163,160,171,213,174,153,170,238, 46,103,108, 25,176,117,236,154,106,219,
+105,167,102, 70,171,193,215, 48, 83,128, 53, 37, 53, 22, 56, 13,140,216,218, 36,185, 55,247,251,206, 57,123,239,181,214,252,177,
+246,222,103,159,239, 94,148,240,176,113,202, 3,185,207,239,158,111,159,181,215,227,183,126,107,173,141,187,118,237,130, 95,120,
+ 61,159, 23,149,204,252,192,183,190, 35, 34, 76,236,201,143,134,195, 67, 7,159,189,229,150, 91,242, 23, 25, 0, 64, 44,136,197,
+ 58, 91, 85, 85, 85,141,172,117,159,250,196,199,199, 95,228,188,179, 77, 83, 85,117, 85,141,154,198, 90,107,157,247,239,122,199,
+ 29,221, 23, 57,103,109,227,156,245,206,123,239, 70,195,197,127,248,135,159,253,147, 55,220,244,149,175,124,229, 51,127,116,119,
+124,145,109,156,115,222,123, 34,242,206,253,253, 79,126,124,253, 77,183,162, 41,122,253,193,204,218,117,127,120,247, 39, 13, 0,
+120,231,136, 8, 68,136,104,126,254,208, 13,111,186,157,153, 1, 13, 11,120, 34, 98, 49, 0,224,137,152,200, 57,119,232,192,179,
+175,190,240, 34,242,158,136,132,217, 57,231,172,117,206,151, 0, 80, 87,213,225,133,133,133,133,249,157,187, 46, 70, 99,156,243,
+222,251,166,105,154,186,174,170,202, 90, 87, 2, 64,175,223, 91,191, 97,195,153,231,108, 19, 0,219, 52, 68,100,235,166,170,134,
+163,225,176,174,107,231,108, 9, 0,211,211, 43, 7, 19, 19,214, 90, 34, 34, 34,103,109, 93,143, 22, 15, 47,142, 70,195,166,169,
+157,181,248,188,246,238,249, 92,248,237,239,124,151,152,137, 89, 88,154,166, 89,152, 63,244,236,207,254,254,237,239,248,103,221,
+109, 49,165, 0,122, 79, 85, 85, 87,163, 81,211, 52,206,211,239,125,240, 3, 29, 45, 32, 34,103, 93, 83,215,182,105,170,186,178,
+141,245,222, 75,247,237,140,179,182,105, 26,235,156,117,142, 60, 89,219,204, 31, 58,184,247,242, 43,255,250,107,255,233, 11,127,
+254,121,125, 81,113,243,155,246, 91,107,189,183,222, 59,239,220,252,161,131,151, 93,177,143, 89,156,119, 34,112,233,222, 61, 43,
+ 38,251,198,121, 71,228,137,136,153,155,198,254,248,233, 39, 89, 68, 0, 16, 13, 51, 51,241,214,211, 78, 55,204,172, 50,172, 70,
+213,211, 79,254,159, 27,111,121,139,119,164, 63,180,214, 54,214, 18,113,217,212,245,226,225,133,133,133,133,209,112,120,245, 53,
+215,121,231,136,188,181,182,174,171,186,170,109,211,120,239, 75, 99,204,202,149,171,230,142,223, 60, 61,189,162,169, 27,242,228,
+188,171, 70,195,209,112, 52, 26, 13, 27,219, 56,231,202,193,196, 68,175,215, 47,138,178,170, 42,239, 61,145,111,234,122, 56, 92,
+ 92, 92, 92,172,235,218, 54,214, 57, 7, 47,213,222,149,249, 55,123,246,236,121,239,123,239, 28, 12, 38, 4,132,153,137,188,115,
+206,217,230,221,239,126,247, 19, 79,252,232, 23,219,239,183,190,243, 16, 8, 51, 48, 19,176, 48, 51, 9,139,243,236, 61, 57,235,
+235,218,126,240,174,223,173,134,195,225,226,194,251, 62,240, 65,239,253,115,175, 8,129, 89,136,216, 19, 17,121,239, 61,121, 79,
+222, 91,103,189,247,174,177,206, 58, 34, 2, 52, 31,252,192,251,230, 15,252,244,238, 79,255,155,165, 55,138, 38,238, 92, 99,173,
+109,154,166,174,109, 93, 55, 77,221, 52,141,179,206, 89,215,216,166,170,235,209,104,184,184,120,120,126,254,208, 81, 51,179,159,
+252,248,199,214,172,153, 89,102, 69,206, 90, 79, 94,151, 66,222, 17, 17, 49,145, 39, 98,242,222,217,166, 94, 92, 56,180, 48,127,
+232,154,235,111,114,206, 53,117,237,156,253,220,191,253,188,109,154,170, 26,141, 22, 15,223,115,207, 61,143,253,239, 31,150,186,
+ 34,125,162,160, 85, 76,204,204,204,222,249,166,174, 15, 60,251,236,197,123, 47,155,156,156,246,228, 17,141, 41, 74, 36, 66, 67,
+128, 8,104,176, 40,222,246,182,183, 45, 30,158, 47, 1,192,147,103, 10,127, 44, 2,194,194, 68,214, 54,135, 15, 31,254,233, 79,
+158,185,246,250, 55, 10, 64,248,189,136, 90, 16,179,120, 79,206, 57,231,188,250,165, 18, 0,188,243,222, 91,103,131, 27,178, 77,
+ 51, 26, 46, 46,204,207,159,191,227,194, 11,119,238, 38, 10, 55, 9, 79,236,157,181,182,169,235,166,169,109,211, 52, 77,163, 30,
+ 70,111,164, 38,233,137,120,208, 31,172, 95,119,236,218,217,217,162, 48,196, 98,109,163,235, 96,102,242, 94, 61,111, 93,215,213,
+104, 84,215, 85, 93, 87,186, 39,222,251, 18, 0, 6, 19, 19,131,137,201,178, 44,250,253, 65,127, 48, 48,133, 33,102,107, 29, 11,
+199,187,144,250,108,103,109,221,212, 77,173, 31, 42, 93,148, 62, 75, 9, 0,166, 44, 12, 22, 69, 97, 4,192, 90, 11, 0, 34,204,
+ 44, 18,158, 40, 56,117,235,172,179,214, 54,182,105,106,107,195, 71,231,156,174,243,165,243,147, 47,201, 53, 55, 55,103, 94,170,
+123,181,214,191,113,227,198,223,121,215,187,118,236,216, 1, 65,107,200, 89,231,189,123,232,161,239,125,232, 67, 31,249,197, 17,
+224,190,251,238,223, 52, 55, 39, 0, 34, 0, 32, 34,144, 54,219, 58,219,212, 77, 83, 87,163,209,240,217,159,253,228, 61,239,125,
+255,207,123,180,205, 39,158,132, 69,129,198, 32, 32, 51, 50,179,247,228,189,119,222,107, 48,116,222, 51,115,127, 48,249,251, 31,
+190,235,231,172,200, 0, 34,128, 17, 65, 6, 97, 86,255,161,161,214,122,231,188,119, 76,228,189, 23, 17, 99,202,223,186,253,230,
+231,148,145, 8,112,208, 23, 86,111,164, 6,236,189,143,134, 68,204, 44, 0,128,184,110,253,134,231, 92, 81,144, 72,250,235,246,
+114, 68,196,172,183, 38,242,158, 60,145,231, 59,110,189, 97,249, 27,169, 41,198,143,158,201,135, 32, 22,162, 18,249, 16,122,234,
+209,104,180,184,184,184,115,207,111,220,122,235,254,101,118,237,155, 15,124,219, 57, 23,125,172, 58,166,112, 83,239,189,122,175,
+197,195, 11, 7, 15, 30,216,123,217, 21,189,126,223, 59,215,212,117, 93,143, 70,139,135,111,123,243,111,181,187,150,214, 66,228,
+ 53,112,234, 63, 22, 97, 22, 98,182, 77,115,248,240,194,117, 55,220,188, 98,213, 81,136, 6, 0, 76, 81,148,189,193,196,212,244,
+159,253,233,159,124,246,211,247,132, 71, 75,142,134,136,153,136, 85,145,132,133,213,232, 93, 85,141, 78, 63,107, 27,154, 2, 1,
+209, 24, 64, 3,168, 87, 81,148, 37, 96,249,241, 63,248,136,136, 24,166,136, 72,152, 68,152,133, 89,132, 69, 68,152,136,154,186,
+ 62,120,224,192,150, 83,183,130,134,123, 64, 68, 3,128, 0,192, 34,204, 0, 0, 34,120,201,238,139, 12,197,187, 0, 8, 11,160,
+ 4,237,246,158,154,166, 89, 88, 56,116,211, 45,111,102, 1, 22, 9,110, 22,245,143,129,152, 73,130,102, 32,162, 17,125,144,248,
+ 50,125, 48, 79,212, 52,245,225,249, 67, 69, 81, 2,162,168,179, 14,239, 1, 34,162,210,224, 76,203,140,222,166,213, 72, 34,239,
+ 92, 53, 26,205, 31, 58,120,224,192,179, 87, 94,253,122,197,149, 28, 99, 67,124,109,186, 66,200, 40, 85, 23, 3,254,244,214, 54,
+174,174,171,195, 11,243,195,197,197, 27,110,218, 31,221,164,222, 69,109,153,244, 95, 52, 3, 98,102, 0, 41,137, 72, 93,186,250,
+208,166,105,108,211, 76, 77, 77, 95,113,213, 62, 6, 96, 79, 44, 76, 76,194, 18,212,219, 59,189,124,128,214,158,136, 68,164, 20,
+ 17, 0, 65,192,162, 40,166,166,166,214,174,157, 93,127,236,134,137,137, 1, 51,122,213, 44, 97, 81,100,224,157,174, 60,126,178,
+228, 83, 60,149, 18, 17,203,162, 44, 38, 11, 83, 20, 83,147,211, 43, 86,174,236,245,122, 44, 66,228,146, 88,152,245, 46,222,218,
+198, 89,167,200, 74, 49, 89, 16,182,112, 89, 20,133, 49, 6,209,244,251,253,254, 96, 0, 8, 26,187,219,187, 80,176, 56,103,173,
+ 6, 80,231,172, 62, 95,146,185,136,148,104, 10, 3, 96, 10, 99,140, 1, 1,242, 36, 2, 34, 44, 65,186, 28,227,171,110,135,109,
+ 26,235,157,243, 46, 72, 71,157,178,176,148, 6, 16, 16, 0, 80, 4,136, 9, 24, 68,194, 38, 11,115,176, 67,231,124, 8,213,141,
+115,154,255, 56,197, 81,193,182, 68,224, 21, 21,215, 54,109,218,100,224,149,116,169, 71,120,101, 93,109,188, 94,177, 98,197,103,
+ 62,251,217,205,155, 79, 48, 6,213, 71, 2, 34, 8, 32, 0,171, 11, 18, 17, 0,102, 22,144, 20, 47, 20, 72,123,239,172,109,108,
+ 93,223,127,255,125,127,243,159,255,203,139, 90, 16, 51,127,231,123, 15, 5, 39, 7,160, 97, 16,132, 17, 64, 20,113, 2,130,122,
+181, 8, 9, 98, 48, 37,239,188, 6, 61,231, 61,145, 8,154,107,174,189,110,223,213, 87,219,186,250,189, 15,127,116,113, 56,124,
+129, 18, 66, 52,136,128, 2, 12, 12, 8, 34, 32,128,193, 72, 4, 88, 72,162,249,231,171,225, 36, 34,239, 67,164, 39, 34, 98, 17,
+ 17, 52,119,222,249,158,166, 26,126,228, 99,159, 60,210, 5,181, 58, 20,156, 58,131,218,124,112, 26,106,150,193, 33, 70,183, 24,
+160,167,186,199,176,172,144, 41, 8,139, 0,162, 49,166, 40,123,131,247,191,247, 95,108, 62,110,211, 17, 47, 72, 67, 33, 37,199,
+ 67, 62,130,225,176,168, 4, 76,226,255,222,147,139,222,204, 51, 49,197, 56,173,145, 53, 70,106, 4, 48,175,127,221,190,215, 92,
+176,237,200, 22,164, 34, 81,208, 16,119,130, 56,166, 91, 9, 49, 17, 41, 52, 10, 0, 33, 97, 32,239, 93, 10, 43, 62,178, 58,138,
+232,235,166,110,154,250,164,205,115,235,143,153, 61, 2, 29,138, 16,132,163, 87,101, 97, 98, 17, 69, 54, 73,123,146,211, 21,144,
+152,201,133,199,112,206,105, 72,112,214, 90,107,155,170,106,108,179,234,168,163, 46,191,226, 42, 37,185,110,190,253,237,154, 4,
+ 9,249,251,190,248,197,175,126,245,107,206,185,231, 94, 80,140, 1, 89,100,103, 25,251, 34, 68,123,201,175, 16, 18,188,247,206,
+ 69, 30,105,104,176,120,221,181,215, 3, 72,212, 45, 22, 17, 64, 83,148,189,137, 73, 67,222,223,124,243,254, 27,174,191,193, 90,
+235,109,243,195, 31,254,240,227,159,186,251,185, 22, 68, 9, 95,104, 60, 35, 34,145,152,145, 50,131,162,103,209, 40, 21, 96,161,
+ 39,239,156,109,108, 51, 28, 46, 46, 30, 94,184,254,166, 91,202,178, 84,204,136, 6,208, 8,178, 8, 10,162, 65, 44,140, 1, 41,
+160, 8,160, 9, 1,240,196,147, 79,249,204,167,255,208,217,230,145, 71, 30,249,220,191,187, 23, 0,138,185,185,185, 93,187, 47,
+225, 86, 66, 29, 0,164,114,201,193, 85, 0,149,204, 68,236,189,183,182, 81,232,227,156,123,227,254, 55,131, 41, 20,195,113,120,
+ 61,132,255,130, 15, 9,127, 78, 42,221,240, 46, 76,196,107,102,102,118,237,188,112, 56, 26,150, 0,144,173, 32,124,134, 40,132,
+112,131,236,182,208, 38, 7,174,105,234,106, 56, 92,152, 63,180,122,102,205,158,203,175, 96, 17,228, 16,230, 65, 98,112, 2, 4,
+196,128, 54,213,128,132, 33,224, 35, 97,145,224,186, 4, 0,113,253,186,245, 37, 0, 72, 80, 77, 17,137,224, 67, 4,132, 49,190,
+ 16, 32,253, 88,151, 66,214, 54,202, 44, 46,204, 31,188, 96,199,107,143, 63,225,164, 4,199, 69,128, 35, 62,143,127, 31, 87, 19,
+124,189,120,138,232,200,123,245, 20, 28,215, 84,106, 54, 30,111,128, 81,111, 57,221, 46, 71, 52, 1,205,216,102, 84, 13,135,135,
+ 23, 71,195,225, 27,247,223,134,104,244, 14,113, 61,105,103,226, 13, 90,160,220, 66,223,100,218,196, 17,230,137,128,136,110, 89,
+216,209,104,225,212,218,150, 36, 10, 68,151, 98,171,106, 84,141, 70, 77, 83,239,222,115,217,209,199, 28, 35,130, 65,174, 44,196,
+220,221,107, 17, 14, 25, 73, 22,139,131, 63, 11,105, 31, 17,249,248, 10,102,137, 86,150,129,109, 74, 95, 82,250,121, 12, 25,150,
+ 60, 1,200,238, 61,151,174, 58,234, 40, 4, 16, 6, 17, 98, 17,150, 96,131,154,119,196, 84,138, 2, 1,146,185,122,189,185,243,
+142, 60,169,223,143,206, 33,152, 81, 80,234,200,152,198, 85, 4, 47,192, 32, 82, 20, 69,175, 44, 87,173, 94,125,204, 49,235,142,
+ 62,250,104, 68, 99, 12,106,118,164,158,162,189,178,173,226,140, 77, 35, 69,174, 33, 48, 58,175,161, 80,189,191, 39, 34, 31,128,
+114, 90,144,218,131, 49,136, 88, 24, 52, 69, 89,192, 0, 10, 83,148,189,114, 98, 98,114, 98, 98, 98, 48,152, 40,123,165, 9,116,
+128,120,226,108, 83,130, 69,165, 60, 73, 68, 84, 50,204, 45, 96,114, 41, 76, 59, 27, 2, 81,136,137,196,121,216, 98, 46, 1,192,
+152,162, 44, 1,160, 4, 17, 68, 52, 69, 97,140,233,245,122,101,217, 43,123,189,162, 40,208, 24, 17, 32, 17, 17,223, 46,165,149,
+ 11, 72,164,169, 36,229,210,233, 10, 81, 57,172, 74,213,199, 57, 71,222, 39,205,138,209,147,130,132,138,162, 80, 68,132,136,198,
+ 24, 93, 80, 81, 20, 69, 81,232,163,227,216, 10, 0,152, 89, 33,100, 22, 70, 82, 4,140,230,163, 91,226, 35, 63,171, 68,130, 11,
+236,133,254, 66, 21, 40,154, 91,220, 50,205,128,208,160, 1,131,138,214, 0, 68,132,152, 80, 16, 12, 74,124,251,184, 8, 22,105,
+151, 19,227, 93,174,200, 1,150,248, 60, 61, 13, 59, 20,100,148,168,151,232, 1,130,214,150,136,248,224,131,127, 27,244, 8, 16,
+ 17,131,131,133,228, 93, 21,204, 6,111,221, 46, 44,174, 78, 63,235,126,129,162, 93,110, 63,228, 30, 36,248,163,150,199, 76,233,
+185,194, 10, 94, 92, 28,190,194,248, 70,205,205, 94, 57,139,217,181,107,151, 9,187,243,138,185, 94,113,137,226,175, 23,116, 68,
+133, 47,189, 86,175, 94,189,113,227,198, 75,246,236, 57,111,251,246,205, 39,156,192,204,170,103,234,245, 34,166, 33, 34, 22, 38,
+239,221,226,226,225,127,127,239,125,255,237, 27,223, 24,190,160, 84,117,156,111,152,155,155,123,242,201, 39, 1,224,214, 91,111,
+189,227,173,111,101, 22,131,200, 29,247, 19,192,149, 32,128, 64, 0, 42,204,209,203,106, 61,196, 58,219,212,245,232,109,111,255,
+237, 23,105,101,229,190,125,251,110,188,233,166,126,111, 64,204,136, 96, 16, 16, 1, 89,153, 6, 6, 65, 4, 96, 96, 0, 68, 0,
+ 22, 6, 65,133,204,209,227, 73,192, 28,104,140, 41,255,248, 51,127,244,245,175,127,253, 47,255,227, 95,189,112, 29,218,184,105,
+110, 48,152, 0,196,162, 48,136, 70, 41, 91, 84, 6, 4, 13, 96,130,235,146,177,150,156,130, 79, 98, 7,149,173, 16,192, 93,187,
+118,189,229,182,253, 47, 82,169, 13, 32, 10, 24, 68, 4,196,192, 52,164, 28, 59,198, 78, 69, 10, 41,103, 34,110,211, 72,133,184,
+ 65, 88,136,167,108,217,114,227, 27,174,121,161, 11, 66,221, 36, 37,131, 0,179,164,137, 33,172, 39,214, 28, 3,162, 76,240,133,
+210,174, 41,120,229, 4,235,205,233,167,159,177,243,194, 11, 94,168,132, 68, 80, 48, 75,163, 68,178, 92,153, 2, 42,230, 40,151,
+ 22,169, 75, 74,231, 68,152, 36,149, 49, 85,163, 46,185,120,247, 96,208,127, 33, 11, 18, 68,129, 0, 40, 56,112, 65, 90, 34,144,
+140,238, 38,102, 10, 75, 32, 34, 9,178, 10,175, 20, 86,188,171, 54,137,104,180, 2,241,207,223,249,246, 35, 95,144, 22,205, 4,
+ 67,118, 23,245,183,205, 64, 98,214,156,148,153,133, 69, 19, 19, 74,249,165, 72, 94,131,128, 80,212, 16,129, 29,231,159,251, 2,
+182, 12, 82,221,133, 59,171, 97,205, 44,219,165,168,250, 16, 39,133, 86,196, 19,228, 41, 16,133, 11,113,101,120,254,246,179,143,
+108, 65,145, 74, 8,201, 99, 39,185, 31,175, 53,113, 44,215,132, 61, 74, 82,108, 95, 41,113, 99,133, 98,165,211,239, 56,239,172,
+ 35,219,178,140, 65,200,101,211,190,107, 91,114,226,136, 13,187,104, 58,114, 6, 33,163, 83,134,205, 89,167,253, 42,199,111, 90,
+127, 4,177,172, 77,194,211,106,226,163, 75, 78, 66,180,136,115,140, 34,210,181,112, 68,236, 94,171, 24,182,110,172,173,133,121,
+199,206,221,236,221,218, 99, 79,124,248,225,135, 31,124,240, 91,207, 35,184,198,140,179,229, 62, 34, 87,150, 86, 25,127,210, 73,
+ 9, 91,199, 19,189, 67, 40,208,219,166,169,106, 17, 62,231,188, 11, 54,111, 62, 65,179,176, 13,115, 39,236,221,187,247,119,222,
+249,219,243,135, 14,126,232,195, 31,253,241, 51,207,252,156, 34,110,198, 12, 48, 67,150,255,229, 41, 24,164,196, 20,218,111, 56,
+ 83, 35, 34,114,206, 91, 91,215, 85,181, 97,195,166,243,119,188, 38,241,114, 34,128,198, 20, 69,217,235, 79, 28, 53,179,246, 19,
+159,248, 87, 77, 93,127,225, 11,247,254,215,111,124,115,249, 98,240,114, 10, 36, 73,108,146, 68,147, 75, 8, 58, 26,164,233,191,
+109,234,166,170,206,223,113,225,107,118,238, 2,229,207,160,229,137, 76, 81,152,162, 40,203, 94,217, 27,244, 7, 19,251,111,217,
+255,175,255,248,211,219,207,221,182,156,149,113,178,247,164,188,109, 24,139,218,157,210,158,214, 73,196, 24,167,105,160,173,235,
+234,236,237, 23,108, 62,225,164, 88,154, 69, 72, 81, 9, 67,228, 54, 69, 97, 76, 81,148,101, 81,148, 69,175,255,150, 55,223,254,
+ 7, 31,253,208, 18, 43,107,181,149, 5,100,233,165,174,138,133, 51,138, 61,176, 83,186, 91,206,217,186, 26,173,219,176,233,212,
+173,167,169, 56, 2,106,192, 80, 68,139,159, 48, 57,113, 52,198,160, 49, 69, 49, 57, 57,125,247, 39, 63,182,116,203, 50,155,206,
+210,191,160, 48, 42,250,200,236, 65,210,117, 14,194,105,154,198, 89,187,235,226, 61,162, 85,154, 84,108,138, 43, 72,121, 40,164,
+229, 97,145,100,198,130, 31,251,200, 93,250,142,109, 33, 56, 55,126,201, 72,181, 44, 67,205,232, 75, 9, 44, 7,121,111,109, 83,
+141,134, 87,190,254, 90,132, 78, 70, 21, 68, 3, 49, 9,238, 48,123, 90, 83,137,191, 0, 68, 44,238,122,255,123, 84,135, 64, 18,
+243,149,171,171,114,159,105, 9, 32, 49,208,133,239, 67, 21,219,218,186,174, 86,174, 58,106,245,234,153, 36,193, 32, 36,133, 87,
+152,150,135,113, 49, 16,111, 31,158, 85,127,110,138, 66, 99, 89, 32, 52, 33,227,156, 98,177, 76, 31, 5, 37,162,164,204,182, 66,
+163, 83,211, 52,163,197,225, 85,175,187, 6, 4,219, 93,141,245,251, 32, 33,108, 87, 19,165, 29,241, 31, 75, 90,165, 6, 86,147,
+ 59,234,140, 57,149, 68,238, 50, 48, 2,230,194, 73, 45, 83, 77, 93,143,134,139,103,158,115, 46, 24, 20,225,148, 15, 36,142, 66,
+239,145,111,101,122, 47,206,116, 35,145,200,173, 82,199,189,234,250, 62,125,188,196, 79, 67,146, 13, 57,165,204,171,145,247,254,
+236,115,183, 99, 64,154,208,241, 86, 81,147,179,149,180, 28, 87, 40, 25, 36, 3,137,187, 93, 6, 45,131, 86,123, 16, 37,254, 0,
+ 64, 36,214,244, 68,219, 9,180, 1,180,174,235,170,170, 70,163,209, 53,111,120,163, 50,194, 32,208, 65, 68,137,182,129,246,121,
+ 83, 89,128,133,146,243, 72,130, 80, 49,149,146,101, 94, 57,189, 45,233,158,146, 50, 13,239,180,243,184,105,234,106, 84, 13,135,
+167,158,126,230, 96,114, 34, 3,118,144, 91, 5,100,218,145, 12, 35,145, 70, 36,169,206,212,218,118, 43,161, 84, 69,232,216, 63,
+100,101,141,232,111, 66,163,221,226,226,202, 85,171,206,217,118,174,146,105, 16, 95, 14,203,249,213, 78, 80,202,124,112, 90, 75,
+ 96,254, 99,180, 31,131, 53, 89,121, 44, 0, 47, 74, 61, 31, 77, 93, 85,163, 81, 85, 85,166, 44, 47,191,234,106, 81, 13,209,142,
+ 20,200, 35,176,164, 98, 68, 44, 28,228,245, 90,238, 22,121, 24,146,242,106,180,143,191, 84,166,146,242,228,203, 71, 26,223, 90,
+107,155,186,169,107,107,237,212,212,244, 21,251,174, 78,174, 92,223, 45, 49,195, 73,181,219,199,215,124, 50,131,114,109,181, 73,
+ 24,160, 19, 30,202, 16, 9, 82,147,135, 79,237, 82,148, 90,203, 83,225, 87, 68,102,143, 62,122,247,238, 75, 40,186,180,229, 89,
+226, 92,230,109, 22, 71, 73,230, 33,111, 32,202, 54,142, 19, 64,147, 54, 1, 35,146, 78,127, 80,184, 0,196, 24, 51,152,152, 56,
+238,248,205, 39,158,124,114, 40,229,235,106, 98,129, 15, 98,188, 75,217,211,120,141, 50,207, 93,136,218,141,137, 74,164,107, 42,
+115,252,165,205,170,137,142, 45,138, 2, 17,203,178, 44,138,114,229,202, 85,155,230,230, 38, 39, 38, 64, 64, 16, 68, 64, 55, 33,
+112,214,201, 87,229,218, 27, 31, 50, 86,124,162,236,179,228, 51, 67,233,156, 89, 89,198, 9, 35, 22, 69, 1,198, 96, 9, 37, 34,
+150,189,222,228,228,228,170, 85,171,167,166,167, 10, 83,136, 54,125,101,214,194, 93,168,148,173, 39, 75,187,227,122,210,111, 36,
+214,237,186, 59,206,237,130,148,195, 7, 0,131, 70,160, 48,104, 76, 97,250,253,137,201,201,137,137,201,201,158, 22, 24,208,164,
+ 90,214, 56, 90,234,172,134,132,133,219,188,219,135,242, 74,236,136,111, 51,167, 49,252,174,142, 81,151,194, 0, 70,215,132,136,
+136,101, 81,244,250,253, 94,175,223, 31, 12,202,178, 52,104, 32,134,104, 9,157,202, 17,217,118, 49, 73,108,179,139,213,130, 88,
+127,247,177,200,207,109, 79,224, 88,254, 18,244,186, 84,166, 9, 17,149, 34,195, 80,229, 40,203, 94,217, 43,123,133, 41, 16, 81,
+130,105,114, 23, 44,113,114,199, 44,157, 36,147, 58, 5,134,208,123,144,138, 50, 18,147,184, 49,170, 63,232, 16, 34,232,102, 1,
+136,214, 94,140, 41,138,178, 40,203,158, 49, 5, 96, 52, 28,173,126,130, 38,241,250, 19, 65, 68,117,107, 89, 2, 78,169,220,225,
+189,231, 80, 51,243,173,111, 11,149,180,142, 7,206, 16, 23,148, 17,141, 7,202,194,152, 66,113, 56, 34, 38,236, 12, 8, 75, 4,
+220, 13, 47, 89, 13, 81, 98,157,140,219,142,153,152, 16,197,134, 84, 78, 44, 75,150,123,114,178, 50, 69,190,128, 96,194,238,161,
+154, 18, 24,147,252,213, 82,253,205,205, 60, 75,242, 37,172, 35,224,237,214,234,169,109,138,236,176, 7,121,170, 19,116, 72,205,
+ 71,243,149,208, 86, 37,194, 0,168,132,112,162, 88, 98, 52, 15,124, 89,196, 71,237,106,242, 98, 25,121, 31,140, 43,197,161,176,
+178, 60, 67,239, 60, 89,148,144, 54,157,162, 6, 74, 4, 1, 65, 1, 81, 53,207, 97, 72, 11, 70, 2,246,137,132,137, 36,215, 18,
+140, 57, 73, 38,244,240,196,229, 80, 96,155, 2, 69,218,250, 32,206, 22,244,228,147, 79,194, 3, 15, 64, 94, 39,139,217, 84,196,
+122, 25, 92, 74,160, 11,198,154, 40,198,176,134,180,221, 52,156, 37,220,233,235,236, 5, 45, 95,193, 12, 0,184,107,215,174,131,
+ 7, 15, 30, 58,116,232,149, 86, 22,250,199,189, 68,100,245,234,213, 51, 51, 51, 37, 0,204,207,207, 63,245,212, 83,191, 22,202,
+210, 38,207,153,153, 25,243,107, 65,252,138, 85,239,126, 45,160, 95,177,171,124,145,127,223,239,247, 55,110,220,120,210, 73, 39,
+189,234, 85,175,154,158,158, 94,179,102,205,236,236,236,236,171,102, 87,174, 88, 57, 24,244,203,178,215,118,100,164,174, 50,102,
+107,109, 85, 85, 79, 60,254,248,211,255,247,233,103,158,249,201,119,191,251,221,159,254,244,103,191,122, 2,154,158,158, 62,119,
+251,246,173,167,158,186,101,203,150, 53,107,214,172,158, 89,115,212,170, 85,101,175,215, 97,126, 88,150, 13,127,109,199, 74, 74,
+ 27, 67,149,148,153,165,236, 13, 38, 39,167, 87,175, 94,115,206,185,219,133,249,246,219,223, 2,129,153,241,213,104,244,212, 83,
+ 79,125,255,251,223,255,171,175,126,173,170,170, 87,132,128,152,121,237,236,236,220,220,220,171, 95,253,234, 75, 47,189,244,152,
+ 99,214, 21, 69,161, 80, 1,209,180, 4, 77,124,116,108,121,240,192,189, 33,132, 94,249,216,238, 40, 0,168,141, 90, 2, 28,193,
+139,194, 39,148,172, 77, 83, 57, 37, 64, 96, 2, 34, 97,193, 94,127,112,220,113,155, 55,108,220,116,217,101,151,131,240, 19, 63,
+250,209, 95,124,233,203,143, 63,254,196, 63, 90, 44,219,185,115,231,149, 87, 94,181,247,210,203, 82, 50,147, 24,102,142,221,153,
+204, 58, 30, 16,149, 2, 17, 19,213, 6,130,145, 89,139,194, 17, 64,140, 77,253, 49,193,134,140,122,162, 48,123, 74,177, 45, 58,
+245, 40, 83,219,101,149, 58, 5,181, 71,204, 63,250,232,163,127,126,239,253,207, 53,255,251,114, 92,115,115,115,199, 31,127,188,
+137,140, 58, 2,160, 65,205,160, 35,200, 71, 29, 25, 16,237, 36, 12,210, 66,131,208, 82,125, 58,114,147,100, 23,180,131, 98,225,
+113,172,185, 52,212,176,219,110,246, 44,241,136, 85, 92, 78, 85,232,152, 84, 24, 3,130,167,157,118,250, 71, 63,252,187,239,124,
+199, 29,147,147, 19,191,252, 40, 22, 42, 17, 49,249,193,212, 83, 32, 32, 40, 38, 90, 84, 48,166,118,178, 67,116,230, 91,136, 37,
+146, 46,156, 77, 14,143,181, 39, 82, 70, 61,105, 82, 79, 73,136,145, 99,226,110, 81, 35,230, 89,136,104, 80, 0,215,173, 63,246,
+125,255,242,221,151, 95,122,201, 47,215, 73,107,201,131,163,117, 41,219,160, 9,162, 32, 35, 3,163,104, 89, 33, 99, 50, 17, 80,
+217,178, 80,142,232,122,228, 84, 33, 73,125,151,129, 67, 16,161,192, 1,164,174,118,201, 91, 7,243, 33,132,160,151, 33, 7, 51,
+128,108,140, 17, 46, 95,179, 99,199,246,109,103,221,247,197,175,252,232,239,158,252,229,225,160, 72,216, 99,232,134, 9,126, 70,
+ 64, 71,131, 58, 73,101, 74,255, 36,159,205,203, 88,195,150,137,138, 41,117,219,193, 34, 45,169, 23,186, 37, 2, 33, 20,211,198,
+196, 11,115, 42,207, 5, 55,128,202,131, 24, 83,148,253,137,155,110,188,238,202,203,247,252,146,194,124,244,176,173,156, 66,201,
+ 40,122,151, 54,151, 31, 99, 62,218,248,157,243, 32,161,170, 19, 72,199,164, 29, 16,198, 6, 18,185,192, 99,205, 8, 44, 97,104,
+128,133, 57,104,113, 12,129,169, 0,105, 0, 89, 71, 49,206, 60,227,140, 77, 27,215,127,254,222, 47, 87,117,253,114,106,144, 64,
+151,207,133,216,221, 2,146,166,177,163,219, 96,145, 14,163, 67, 25,109,215,165, 48, 83,155, 74,250,149,132,145, 84,157, 79,109,
+ 11,240,173,175, 14,149, 7,210,141,226,220, 91,103, 29, 11, 41,155, 4,192,233,233, 85,111,186,241,218,169,151,205,115,155, 84,
+171, 12, 96, 23,114, 62,140, 59, 42,145, 21, 43,242, 50, 69, 91,178,143,210,144,246, 97, 89,114, 27,204, 98, 61,136,228,229,157,
+150, 91,138, 93, 20,121, 25, 36,109, 9,100,195, 55, 74,212, 51,115,191,223,219,127,227,111,246,122,229,203,167, 65, 99,228,146,
+180,143,190,204, 46,231,205,130,196,227,244, 96, 59,228,211,109, 15,227,246,177,226,251, 68, 6,153, 83,231,190,144, 48, 73, 62,
+248,145,134,219,245, 59,223,206, 26, 18,121, 98,239,136, 66, 45,232,154,125,123,203,178,120,249,124, 80,222, 41,144, 55,192, 64,
+172, 78, 67, 44,135,132,122,223,210, 82, 97, 59,194, 51,254, 85, 40,242,182, 41, 7,100,157, 63,169, 63,139, 34, 90, 24, 3, 11,
+173,231, 39,142, 67, 55,249,248,131,174,191, 87,154, 45, 39, 29,255,191, 30,123,252,165, 23, 80, 2, 29,144, 22,158,149, 7,150,
+169,153, 66, 56, 55,128, 99,175, 91, 43,196,177, 63, 81,212,148,245, 18,228, 37, 97,233,118, 4, 5,132,153, 43, 76,170, 70,180,
+ 35, 24, 97,232, 1, 1,103,214,206,110,221,122,250,218,217,181,104,140,118, 80,222,194,236,188,243, 90,120,173,171,167,159,122,
+250, 75, 95,254, 15,143, 60,242,232, 75, 32,160,229,202,146,227,227, 61,241, 97,151, 87,156,172, 26,174,165,125,110, 41, 98, 16,
+232,116, 37, 44, 41, 70, 72,236,248,139, 39,115, 36, 43,210, 67,122,156,119, 76,222,123, 94,177, 98,197, 9, 39,157,188,113,211,
+220,228,196, 4,133, 57, 20,101,196,131,251, 54,113,242,177,215,159, 56,117,235,170, 59,239, 60, 89,149,115, 52, 26,253,224,177,
+ 31, 60,244,208,255,120,240, 91,223, 38,226, 35, 55, 49,142, 72,164,211,190,197,153,105, 64, 28,141,140, 86, 2, 17, 11,142,205,
+189, 64,219, 68, 32, 89,163, 75,183, 3, 41, 5,245,232,245,242, 58,115, 24,158,245,206, 91, 61,107,167,223,239,157,114,202,153,
+167,108,221, 90, 20, 70,229, 73, 97, 89,144, 53, 77, 64,108,219, 2, 99, 16, 16, 13, 25,131,133,150,191,167, 87, 20,231,158,187,
+253,172, 51,207,190,253,182,219, 68,228,192,129,103,239,187,255, 47,126,240,216, 99,163, 81,245,252, 52,168, 27,176, 58, 6, 22,
+129, 50,116,154,153, 24, 0, 56,252, 10,194,199,100, 60, 8, 28, 17,204,248,172, 78,222, 80,147,151, 23,212,191,112,156,168,114,
+214, 89,235,189,237,245, 6,231,239,184,112,227,166, 77,138, 96,153, 25, 81, 0, 89, 75, 29, 25,144,132,188,129, 11, 12, 24, 41,
+ 24,192,132, 57,124,131,136, 72, 6,177,208, 77,152,153, 89,251,214, 59,254, 41, 51, 9,211,195, 15, 63,242,167,159,251, 60, 17,
+253, 2, 31, 20,167,231, 51,221,145,113, 51,137,253, 85, 93,229, 8,169,127,236,171, 0, 1,134,212,109,210,241, 63,185,137,133,
+210,126, 42,155,235,137, 24,169, 11,179,241,222,159,118,198,153,103,158,181, 13, 77, 24,191,132,216,154, 37,136,136, 40, 98, 16,
+ 5,209,132,253,209, 18, 17,100,237, 91,104, 64, 85,138,217, 24, 16, 0,131, 32, 80, 6,204,105, 12,120,207,128,103,158,117,246,
+ 61,159, 58,163,174,171,111,254,237, 3, 95,253,235,191, 89, 78, 64,208,182,191, 64,215,181, 4,255,155,199,163,220,211, 72,222,
+230,147, 59,161,108,234,172,213,160,113,245, 1,142,105, 8,233,177, 68, 78, 15, 62,113,182,153,156, 94,113,209,197,123, 87,175,
+ 94, 29,186,239, 67, 42,136, 25,158, 86, 57, 24, 68,150, 32, 26, 12,111, 21,186,246, 33, 73, 84,115, 4,131,134, 64, 84,166,104,
+ 10, 20, 65, 99,144, 11, 99,132, 68,250,253,193,197,187,119,239,190,104,231, 35,143, 62,250,197, 47,253,165,115, 46,239, 19, 10,
+193, 43,153, 91, 59,112, 12,153,107,137,154, 16, 11,174,201, 51, 98,234,200,144,148,166, 4, 30, 13, 66, 81,178,197,160,169, 53,
+ 82, 98, 61, 49, 12,168, 90,107,155,186,170,235,234,216, 13,155,118,239,185,204, 24,148,152, 24, 6, 50, 1,218,118,177,216,146,
+135, 16, 69, 37,161,167, 77, 64, 80, 37,138, 8, 97, 10, 70,201,137,144,246,182,124, 95,168,112, 11, 2, 27, 53, 67, 6, 56,109,
+235,105,119,125,224,148,239,253,247,135, 30,250,159,143, 38, 19,227,214,102,100,108,194, 59, 83,143, 40,130,152,188,118, 21,165,
+ 75, 57,114,120,162,196, 69,119, 3,151, 48,229,167,224, 88,219, 52,117,221,212,174,105,206,217,126,193,233,103,156,149, 49, 77,
+157,246,190,172, 91, 52, 74, 8, 49,172,168,109,219, 84, 66,130, 59,127,154,215, 96,219, 59,167,174,128,182,153, 19,141, 1, 54,
+219,183,109, 91, 51,179,246,137,191,123,170,140, 33,166,157, 93,239, 0, 61,233, 84,230,153, 25, 59, 57, 44,130,112,104,140, 73,
+243,147, 81, 46, 29, 78, 58,245,151,197, 99,217,130, 55,182, 78,135,153,234,122,228,173,187,224,181, 23,157,124,242, 22, 78,141,
+ 63,241,137, 18,181,146,201, 9, 1,131,130,161,206,228, 32, 46, 33,135, 59,157,124, 29, 96, 55,110,242,173, 57, 72,180, 83, 25,
+ 67,210,208,117, 61,208, 29,164,213, 47, 48,211, 34,148,200,202, 10, 48,102,205,174,217,160,233,210, 58,121,130,124,222,121,157,
+244, 82, 80,103,208,236,251,205,235, 86,175,158,225,104,242,136, 97,136, 22, 0,186, 86,191,124,129, 0,130, 54,117,127, 33,157,
+ 32,196, 89, 59,226, 50,157,216,146,111, 65,176,220,178, 19,158, 51, 68,215,198,167, 40,193,216,229, 25,230,150, 90,134,164,181,
+ 44, 12,248,176,155,138,164, 83,152, 56, 29, 21, 18,237,170,105,234,166,174, 87,174, 90,117,201,165,191, 49, 53, 53,197, 0, 24,
+ 35,150,238, 66, 7, 46,116, 84, 67,198, 98, 60, 2,114,110, 80,157,237,129, 28,229, 69,220, 39,221,134,169,132,249,195,211,100,
+ 26, 36,237,219,117,176, 93,167,175, 3,152,117,135, 36,113,210,200,113,147, 56, 51,177,204,141,165,132, 55, 27, 30,111, 3,121,
+211,212,182,174, 79, 60,101,203,142, 11, 47,146,232,236, 89,229, 2,220,157,116,206, 78, 45,107, 91,160, 91,209,128, 78, 2, 38,
+ 71,153,137, 40,159,181,151,252, 48,140,246, 55, 48,214, 15, 29, 29, 46, 38, 19,107,241, 74,132,164, 2, 29,144, 42, 58,125,151,
+157,174,150,253,209, 50, 6,213, 33,140,226, 9, 59, 62,157,249,216,212,181,181,141, 41,138,139, 47,189,252,216, 13, 27, 89,195,
+ 56,115, 42, 19,128,192,210,174,186,164,236,249, 68, 64,103, 90, 34, 71, 17,217,135,241,105,240, 68, 90,118,217, 5, 30, 75, 35,
+ 83,195,116,103, 60, 52, 27,133,200,195, 19,179, 72,135, 58,138,223, 69,172,147,119, 11,101,173,161,225,252, 14, 82, 4,168,193,
+220, 90,103,155,141,115,199,189,246,162,221,198, 20,234,212, 89, 24, 17,227,137, 10,201,120, 36, 15, 65,227,177,179,213, 20,232,
+136,165,237,250,225,238, 8, 83, 54, 76,148,248,186,177, 41,149,113, 61,138, 38,150, 24,207,165, 13,207, 93,100,216, 57,120,160,
+ 61, 15, 5, 88,251,177,169,229,164,211, 9, 17, 46, 28, 70,231,244, 4, 57, 63, 53, 61,125,241,222,203,214,206,206, 98, 40, 34,
+182,174, 63, 79,224, 58,146,234, 0,250,165,125,110,156,207, 69,229,131, 85,220,161,244,178,246,197,120,186, 11,119,127,152,208,
+176,140,167, 26,193, 36,199, 49, 75,135, 75,140,183, 4,233,164,111,233, 52,134, 48,156,152, 6,201, 2, 95, 19, 78,135, 16,230,
+193,228,196,121, 23,237, 62,246,216, 99,195,185, 36,129, 5,111,217,149,180, 91,136,109,160,200,246, 9, 96,108,176, 36,155,153,
+234,178,116,113,170,182,211,138, 76, 75, 94,148, 53, 36,135, 3,194,210, 1,140,177,109,114,140, 47,203, 94,157, 83,235,217,124,
+162,116, 25,156,156, 52, 76,237,128,241, 0, 69,229,192, 68,100,229,170,149,219,206,219, 49,187,118, 77,200,218,196, 8,182,216,
+188,157,156,128,212,109, 44,169, 79, 52, 2,101,201, 39, 89,198, 70, 4,184, 61,254,167,109,151,164, 88, 86,137, 45,139,138,221,
+117,244, 64,194, 81,129, 93, 82, 56,119, 94,210, 77, 86,187,175,203,107, 84,162, 92,123, 70,189, 10, 47,223,142,201, 68, 20,162,
+ 41,234,232,120, 89,172,157, 61,102,203,214,173, 43, 87,172, 12,240, 0, 99, 78,194, 89, 65, 36,139, 88,220,197,166,144,250,241,
+151,233, 62, 36, 25, 63, 13, 46,202, 70, 66, 19,103, 58,102, 36,157, 1, 20,186,255, 91,233,196, 9,220, 49,181,224,142, 6, 65,
+ 62, 31, 33, 93, 2, 89,132,128, 59,118,222,126, 25, 39,160,140, 49,128, 80, 20, 69,175, 7,104,176, 87,246,166, 86,172, 88,183,
+110,253,218,217, 89,108, 65, 27,182, 29, 12, 75,130, 84, 14, 41, 82, 32,235,224,195,124,174,173, 37,207, 57, 52,165,135,137, 7,
+202,123,250,147, 98,231,236, 45,197,249,233,206, 96, 68,231,220, 29, 14, 81, 39,215, 32,200, 59, 71, 51, 56, 12, 24,186, 25,194,
+217,177, 70, 16, 81,140, 20, 82,168, 70, 24, 3,198, 20,225, 84,188,193, 96,106,122,122,106,106,106, 98, 48,208, 51,110, 64, 4,
+208, 8,102,160, 32, 59,227,166,253,168,167,142, 9,234, 16, 86, 64,243,152,199,111,150,206,252,108,219,160,154,205,130, 36, 39,
+216, 25,114, 79, 61, 17,209, 17,229,243,230,156,171, 76,244,166,249, 12,254, 88,127, 16,134,158, 21, 0, 3,192,166, 48, 97,250,
+212,100,105, 17,166,115,113, 11, 83, 20,189,178,236,245,251,253, 94,191,236,247,202, 50, 30,107, 26, 7, 33, 81,101,147,151, 17,
+151,232, 75, 68,170, 1,233,197,246,152,206, 84, 95,167, 53, 63, 97,188,236,168,212,118, 78, 59, 54, 62, 43,119, 43,109,245, 69,
+141,171,115, 62, 66,183, 95, 63,213, 34, 56, 27,253,203,230, 35, 2,207,100, 76,145,104,193, 12,224,107, 71, 67, 24,241, 52,166,
+ 40,139,162, 40,139,162, 44,203,178, 40,139,194, 20,166, 48, 6, 13, 26,132, 56,132,185,180, 80,210,201,167,150,228, 86,157, 19,
+126,199,102,190, 58,147,154,227,241,129,219, 49,136,142, 55,140, 37, 40, 10,131, 71, 28,142,176,212,163,101,115, 95,194,220,157,
+233,230, 78, 39,121,171, 20,169,203, 94, 98, 7, 80,160,151, 16, 16,208, 20,133, 78, 14,171, 56,116,138,194,232, 57,184, 38, 28,
+ 50,161,153, 19, 3, 0, 80,242,110, 29,152,135,154,244,162, 30,239, 6, 2,193,178, 98, 96,151,108,251, 98,213,164, 99, 90,227,
+ 97, 84, 3,101,178,172,204,239,100, 17,150, 82, 20,203,146, 85, 78, 39,196,117,142,153,227, 22, 84,119, 4, 20,135, 54, 0,226,
+ 23,237, 24,179,158,105,102,208, 24, 85,148,162, 48, 70, 71, 59,116, 68,149,227,172,168,166, 83,121, 53, 95,198,226, 84, 6, 3,
+187,179,137,178, 12, 53, 25,216,187,206,161,114,157, 80, 27, 14, 47,163, 28,139,181,126, 90, 72, 40,117,205,183,101, 80, 72, 38,
+198,203, 64,153,246, 40,131,204,196,162, 10, 64, 59,148, 0,237, 80,137,142,149,160,126,105,176,208,137, 14,108,143,164,205,216,
+160,113,130,126,201,127, 89, 76,232,204, 91,102,146, 89, 26,208,187,216, 39,216, 72, 26, 48,146,110, 9,151,121, 25, 20,146,220,
+121, 50,199, 76,226,157,230,128,238,209, 5, 65,131, 32,204,179, 72, 56,144, 69,226,196,126,233, 42, 0, 0, 1, 47, 73, 68, 65,
+ 84,240, 50, 66, 26,116,209, 99,203, 77, 28,213, 69, 22, 70,198,100, 26, 99, 97,176,227,131,211, 99, 35, 66, 0,204,129, 17, 8,
+244, 91, 42,166,117,218, 61, 37,153,231, 88,251, 94, 14,130,194, 17, 39, 89,129, 59,248,233,204,250,114, 49,181,125, 3,237,237,
+184,155,242,103, 46, 51,105,144,170, 15, 98, 71,129,162,154, 32,166,137,234,182, 13,145,219, 65,228,238,136,195,216, 23,249, 92,
+ 14,104,128,207,138, 32,188,132,206, 15,119,111, 45, 43, 39, 42, 36, 15, 64,122,126,249, 50, 25, 41,141, 31,192,154,131,236,116,
+214, 68, 54, 28,218, 30,213,210,157,137,202,163,152, 50,235,122,114,142, 65, 3,113, 16, 9,116, 2, 72,249, 43,140, 40,185, 53,
+192,101,132, 35,161, 71, 13,198, 7,133,198,212, 41,171,122,200,242,197,126, 25,247, 62, 36, 75,210,156, 37, 14, 91,146,250,100,
+ 58,215, 25, 19,150,110, 3, 75,118,138, 74,219,222, 19,142,219,105, 91,240, 12,104,188,146, 84, 49, 81,235,202,186,113,178,166,
+205, 56, 18, 24, 90,210, 52,108,101,109,176, 99,206, 37,235, 37,135,238, 33,173,169,127,111,153,254,171,188, 49,150,219,105,233,
+ 36,135,244,216,148, 60,110, 27,184, 41,235, 38,149,101,204,103,156, 67,130,118,134, 50,197, 49, 77, 19,118,237,218,149, 39, 62,
+255, 63, 76,233,140,171,246,139, 26,248,249,127,255,206,139,124, 90,242,130,113, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/darken.png.c b/source/blender/editors/datafiles/darken.png.c
new file mode 100644
index 00000000000..9ba032f1f5e
--- /dev/null
+++ b/source/blender/editors/datafiles/darken.png.c
@@ -0,0 +1,308 @@
+/* DataToC output of file <darken_png> */
+
+int datatoc_darken_png_size= 9653;
+char datatoc_darken_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 96, 0,
+ 0, 0, 96, 8, 2, 0, 0, 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,252, 97, 5, 0, 0, 0, 6,
+ 98, 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66,
+ 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7, 21, 0, 4, 16,211, 77, 59, 52, 0, 0, 32, 0, 73, 68, 65, 84,120,218,
+237,124,105,172,173,231, 85,222,243,172,247,221,195,153,124, 7,219,215,118,102, 79, 81,176, 33,128, 27,135, 64,210,150,138,164,
+ 84,161, 81, 33,170, 65, 4,149, 68, 12, 85,255,132, 50, 39,100, 98, 8, 21,165,252, 97,232, 64, 85,130, 66, 5, 84, 16,168,224,
+ 79, 65, 85, 75,160,133, 86, 64, 32, 17, 83, 28,219, 9,137, 9,142,237,248,222,123,198, 61,126,239,122,250,227, 29,190,111,159,
+115,226, 36, 37, 84, 69,202,190, 71,231,158,179,207,222,223,126,191,245,174,119, 13,207,122,214, 2, 62,221,199,173,183,221,118,
+251,237,119,156,125,158, 0,222,240,198, 55,165,212, 17, 48, 51,154,197, 24, 71, 49,198,209,232,205,111,250,158,252,162,240, 45,
+255,252, 91,215,235, 85, 74,157,187, 39,119,247,116,120,172,131, 35, 61,249,148,167,201, 43,162, 63,120,116,116, 20, 87,171, 37,
+ 4, 0, 22,204,104,191,253, 62,174,214,136, 22,128,100,212,235,190,225,159,253,200, 15,191, 61, 94,221,159,255,201, 35,179,163,
+121, 34,237,202,165,109, 79,219,209, 8, 68, 0, 73, 14, 79,111,126,243, 91,194,245,238, 57,203,117,146, 4,233,120,182, 54, 91,
+196, 16, 37, 19,252,249,207, 77, 23,247, 36, 41,236, 92,190,139, 0, 4, 1,144,175, 59,239,210, 98,107,138,231, 63,215,158,121,
+ 69,130, 40, 68,200, 93, 34, 9, 17,132, 96,203,149,158,218, 63, 24,199,213,141, 23,110, 24, 67, 16,194,206,197, 59, 73, 1, 34,
+ 4, 16, 14, 66, 32,143, 79,210, 35, 31,157,119, 9, 55, 93, 28,241,230, 59,190,140, 8, 48, 80,132, 25, 64, 18, 68, 96, 8,164,
+145, 6,139, 81, 46, 49, 33,209,140,240, 44, 93, 3, 60,203, 69,100,128,127, 74,219, 21,218, 79, 91, 91,219,207,126,246,179,205,
+ 56,159,207, 79,239,221,125,247,221,247,101, 47,127,133, 36, 35,105, 22, 66,200, 27,247,235,191,246,107,191,243, 59,191, 93,174,
+244,192, 3, 95,221,117,107, 79,201,221,221,211,114,233, 7, 71,186,126,224,138,207,223,186,248,138,199,255,226,191, 3,136,171,
+213, 10, 0,141,102,246,225,199,248,225,199,220, 64, 50, 0,171,164,244, 3,111,255,193,183,189,245, 45,252,210, 47,255,186, 71,
+ 62,186, 32, 57,138, 97,119,235,162, 52, 34, 39,192, 4,192, 77,151,241,210,251,226,100, 58, 13,203,120, 59, 0,119,121,210, 98,
+ 53,219,158, 38, 96,212,185, 70,163,244, 69, 47,148, 65, 46, 69,135,155, 59, 96,130, 43,225,234,193,236,226,158,223,116,225,134,
+ 23,220, 62, 82, 10, 43,186,128, 40,119,129,160, 3,132, 4,232,250,225,124, 54, 95,221,118,243,165, 24,199, 82,222,187,203,119,
+ 0, 18, 64, 1,148, 0, 0,201,245,209,199, 87, 31,125,114,121,203,229,241,104, 68,222,124,251,203,105, 6, 26, 81,247,205, 8,
+ 6, 34,208, 66,176, 0,139,209,225, 38, 49,235,147, 17, 34, 65,154, 1,137,128, 64,147,227, 51,245,224,240,151,111,253,182,111,
+223,217,222, 81, 86, 81,130, 32,141, 70,179, 96, 36,131,133, 31,255,241, 31,125,226,137, 39,206,191,208,119,126,215,119, 39, 79,
+ 16,224,202,151, 37, 64, 35, 97, 52, 2,164, 49, 88,190,158, 25, 45,132, 96,102,143, 95,141,255,230, 71,223, 56,188, 80,156,205,
+102,245, 52, 33,139,169, 61, 64, 60,113,149, 31,251,184, 29, 29, 91,231, 33,121, 0, 28, 16,128,104,221,189, 47,249,129, 7, 94,
+ 25,127,238,103,223,249,240, 67, 15, 1,136,235,213, 10,128, 75,203,149,142,102,157,139, 59, 91,225,194,110,188,118, 96, 15, 63,
+202,117,199, 96, 6, 4,130,209, 12, 32,224, 0, 58, 79,227,192,180,238, 94,243,154,175, 11, 33,188,237,173,111,225,243, 94,248,
+234,228, 74, 41,223, 20, 1,192, 72, 32, 70,155,140,195, 36, 78,129, 41, 16,235,151, 1,236, 28, 49,232,254,207,227, 77,151, 44,
+152,153, 89, 24,197,184, 92,116,160, 64, 10, 52, 9,102,112,184,232,158,214,171,116, 98,235,173,201,201,214,120,226,152, 8,147,
+ 96,113,111,135, 55, 95,228,149,155,184,187,197,110,109,110,102,102,201, 61, 10, 9, 18,220, 68,137, 6,239, 0, 3,179, 46,138,
+142,147, 25,231,139, 68,206,119,182,226,149,155,167,207,185,117, 58,157,132, 81,176,117,103,117, 3,104,238, 97,231,210, 29,112,
+102,133,165,188, 72,193,179, 90,100,115, 33, 8, 46,173, 58,191,118,176,250,243,199,230, 31,125,114,185,238,124,123,106,132, 0,
+229, 7,111,190,243, 21, 0,153,213,159, 32, 13,217,136,129, 16, 96, 32, 32,210, 64,193,104, 6,129, 36, 45,100,129,146,182,187,
+ 29, 47, 95,156, 68,247,148, 85, 15, 0, 96,242,132,252,226,172,172, 78,145,148, 68,130, 64, 18,204, 0,200, 83, 86, 54, 23,142,
+231,221,201,194,163,228, 89,147, 65,131, 28,132,156,198,124, 75,128, 40,163, 9,176,108, 24, 13, 74,128, 17, 38, 56,242,135, 56,
+100,194,255,119, 15,158,251,236,165, 75,151, 46, 94,188, 4, 96,185, 92,236,239,239,207,102,179, 79,227, 66,119,221,125,247, 3,
+ 15,124, 53, 89, 12, 83,217, 18, 90, 86,222, 16,194,254,254,193,143,252,171,127,249,116, 23,122,227,247,188,201,147, 43,235, 96,
+ 57,253,249,224,147, 86, 30, 33, 95,204, 66, 28,197, 55,124,247,119,157,115,161,111,255,142,239,132,242,191,188, 75, 36,105,229,
+240,131, 22, 12,180,144,175, 24,130, 25,105,215, 14,226,227,143,127,228, 23,126,254, 39, 55,204, 72,215,117, 42,102, 88,205,140,
+136,117, 69,174, 69,178,213,202, 28,144,176, 94,107,255, 72,143,126, 12,169,123,206,107, 94,247,195, 63,255,206, 55,108, 92, 8,
+234,181, 32, 47,134,116,130, 73,124,242, 42, 31,123, 82,199,199, 88,151,155,118, 64,209,148,228,139,149,191,253, 7,127,232,173,
+111, 41,193,139, 85,215,231,238,238,114,185,228,146,251,241,204, 31,121,212, 31,250,176, 95, 63,242,181, 20, 12,209, 20, 13,209,
+ 0,184, 49,165,212,173, 87,221, 15,253,208, 15,151, 11,165,148,146,167,249, 98,253,248, 83,243,191,124, 98,113,117,127,177, 88,
+118, 71, 39,233,201,107,233, 99, 79,166,117,242,104, 30,205,137,118,251,234,220, 13, 41,134, 4,166,213,122,245,250,111,249, 22,
+ 0,113,255,120,245,240,163,139,171,251,107, 85,127, 20, 35,247,182,227, 40, 76,128,113,180, 80,204, 0,132,254, 90,216,217,193,
+214,196, 61, 1,210, 77, 55,222, 68,144,207,123,225,171,215,157, 36,144,204,231,158, 48, 51,196,145, 77, 70, 97, 20,182, 6, 22,
+ 50, 0,214, 57,204,240,252,231,226, 25, 87,184,183, 83, 84,108, 60,153,196,229, 42,101, 11, 82,148,136, 16, 82, 74,236,220,187,
+181,111, 79,211,120,212, 1, 59, 0, 58, 23, 96,227,136,103,222,138,155, 46,113, 50, 98, 81, 62,114,181, 90, 69, 72,162,138,245,
+ 41,138, 78,192, 9,118,201,143,231,218,198, 98, 58, 66,210, 54, 56,186,176, 99, 55, 93,228,205,151, 56, 25, 81,160, 39,192,128,
+174,131, 16, 93,137,121, 29, 34, 76, 46, 90, 89, 32, 32,185,115, 54, 83, 55,158,111, 79,177,183, 61,189,229,198,209, 77, 23, 56,
+153,144, 48, 79, 20, 85,244, 24, 93,204, 65,129, 64, 80, 16, 40,136, 4, 92,162, 1,144, 57,177, 92,123,215,205, 46,236,248,238,
+214,150, 89,148,155, 19,114, 11, 38,247, 18,199,133,157, 27,239,146,132, 28, 71,138, 48, 21, 27, 90,207, 34, 5, 2,130, 14, 78,
+210,201, 60,109, 77, 44,134,172,248,128,216, 14,126,216,185,116,103, 14, 69,170, 95, 19, 68,148, 5,139,162,202,179,128, 48, 95,
+248,199, 15,214,171,181,143,162,197, 88,223,199,188,162,203,119,170,196,170,205,107,215,221, 3, 5, 89, 94, 96, 94, 54,216, 37,
+ 63, 56, 76, 79,236,119,251, 71,221,170,211,116,108, 49, 16, 36,175,220,241,247,193,236, 46,200,222,180, 80,160, 33,127, 35, 45,
+199, 69, 37, 76, 4, 64, 88,182, 19, 33,132,221,237,120,249,194, 56, 10,142, 28, 66,203, 60,251, 19,229,117,185, 0,184,147,166,
+108,228, 65,202,179,234, 10, 78, 25, 0,119, 63, 60, 78,199,179, 69, 68,137,224, 65,102,175,152,255, 35,149,223,139,236, 35, 36,
+192,242,243,146, 8, 74, 38,203, 2, 48,213, 8, 19, 2, 37, 53, 1,131, 46,200,157,144, 68,200,229,128, 36,135,228, 16,232, 0,
+232, 80, 49, 23,162, 96, 18, 32,185, 92, 16,228,238, 16, 28, 20,178, 7,207, 11, 40,203,168,139,247, 98, 6,178, 99, 37,234, 26,
+ 62,251,248,244,253,108,123,220,113,199,157,247,220,115,207,237,119,222,121,249,210,165,254, 89,169, 42, 63, 45,251, 10,163,209,
+246,247,247, 31,122,232, 3,127,252,199,127,244,193, 15,126,240, 51,179,160,221,221,221, 7, 30,248,234,219,110,123,134,123, 86,
+ 5, 84, 11,205, 26,127, 19, 53,186,226,169, 72,154,213,141,101,231, 76, 3, 17, 71,163, 95,250,197, 95,124,207,123,126,255, 83,
+ 87, 14,190,234, 85,175,186,231,158,123,221, 37, 52,207,191,241,238,106, 38,216, 47,162,197,245,167,151,148, 19,142,126, 89,117,
+161, 70,242,137,167,186, 95,248, 79,255,254,241,143,253,197, 39, 89,208,183,126,219,119,160,132,193,167,151,210, 44,211,224,223,
+198,106,242, 50,187, 4,144, 93,199,108,119, 32, 2,230, 32,192,148, 40,241,232,132, 46, 62,254, 36,215, 93, 48, 67,140,252, 95,
+255,237,251,214,235,197,185, 11,138,169, 91,215, 69,244, 73,205, 96, 53,212,198,130,250,205,243,132,131, 19,202,121,253,136,238,
+ 92, 44,233, 78, 23, 93,150,189, 70, 9,144,129,245,138, 2, 87, 43, 74, 14, 24,201,175,252,154,183,125,193, 61,225,167,223,241,
+ 83, 31,252,224,195,167, 23,212,165,132,115, 55, 56,103,151, 44,225, 95,149, 14, 9,173, 19, 79,102, 72,206, 39,175,193,157,135,
+ 39,148,184,238,232, 50,200, 0, 7,114,184,111, 53, 84, 96,205,145,232,114,137, 93,178,229,194,255,201,215,191,118, 50, 25,253,
+228,191,251,183, 31,249,200, 71,134, 18,234, 6,167,167, 44,173,235,202,130, 64,196, 96, 32,162,145,129,158,232, 9,243, 21, 62,
+118,149,158,112,237,128, 2,147,103,231,102,128, 12,158, 93, 68,187,100, 11, 95,178,204,114, 28, 40,121,151, 16, 96,235,149,190,
+233,155,255,233,120, 52,126,195, 27, 74, 60, 26, 94,248,249, 95,232,174,117,231,171,206, 87, 43, 63, 89,250,124,158,174, 31,174,
+143,102,221,225,113,119, 52, 75,203,149,207, 23,158,146,186, 78,199, 51,237, 31,249,193,177, 63,121, 13,243, 5, 58,135, 11,209,
+ 96, 44, 95,100, 94, 89,149,240,224,145, 4, 1,227,160, 56,210, 77, 23,116,243,229, 98,154, 37, 37, 79, 47,255,178, 87, 60,246,
+216, 99, 79, 61,245, 84,220, 63, 92, 11,122,106,191, 59, 60,238, 22,107, 63,158,165,172,174, 57,182, 81,198,130,160, 96,164,113,
+119, 59,142, 99, 20, 12, 62,202,177,114, 93,129, 13, 62, 94, 64,104, 59, 85,109, 22,114,244,182,183,139,233, 24,211, 9, 83,170,
+ 71, 82,238,110, 50,125,237,215,190,230,183,126,235,221,188,237,115,254, 81, 1,146,154,151,206,153,231,240,140,103, 32, 33, 63,
+ 35,210, 52, 10, 22, 71,156,142,182, 0, 2, 99, 32,212, 93,179,250,115, 47,170,206, 65, 96, 20, 0,226,238,231,225,210, 30,166,
+ 19, 78,167,180,108, 74,242,178,204,242,247,236,166, 1, 86,240, 65,222, 31,238,162, 82,121, 77, 37,202, 17, 93, 9, 11, 23, 59,
+156,204,142,205,120,105,111, 4, 16,216, 6, 2, 16, 0,151,204, 65,169,100,158,211, 17, 64,222,254, 44, 76,199,184,176,199,173,
+ 9, 0,122,162,170,193,106,137, 41,165,136, 12,210,136, 37, 33, 22,100,174,178,101, 48, 87, 11,218,114, 88, 40, 9, 50,194, 5,
+ 64, 38,233,218,193,146,180,201,184, 11,198,209,104, 42,140, 37, 3,226, 56,242,242, 5,134,192,103,220,140, 16,184, 61,161, 5,
+ 17, 86,226, 67, 85,155,153,173, 89, 6,229,164, 88,163,142,252,145, 94,160,200,156,234,139, 53, 20,133,202,170,242,174,165,188,
+ 41,130,203, 41,130, 74,139,165,104,192,242,132,156,237,237,196, 43,151,198,227,113,184,253,182,137,153, 85, 35, 79,247,172,200,
+200, 9,191,193,220, 82,182,117, 4, 40, 26, 21,182, 47,223, 13,213,136,164,102,229, 57, 62,205,203, 96,137, 87, 51, 28,218, 27,
+ 79, 85,124,162, 61,153,209, 11,185, 86, 43,191,118,184,222, 63, 90,239, 31,117, 31,191,182,156, 76,108,221,121, 52, 50,135, 91,
+ 37,186,173,113, 81,142, 70,179,235,130,194,238,229,187,192,154,119,246,230,162, 46,170, 61, 59,204, 39, 88, 17,142,154, 30,149,
+112,181,230,192,130, 36,186,107, 54, 79,135,179,116,117,127,245,248, 83,171,229,202, 15, 78,214, 57,169,149, 96, 57, 79,105, 31,
+ 92,143, 84, 20, 82,198, 57,168, 26,195,202,209, 16, 36, 58,170,129, 46,122,141,154, 97,136, 50,229,216, 22, 57, 30,204,247, 15,
+147, 64, 38,193,220, 69,226,100,238, 0, 23, 43,167,225,177,143,175, 98,228,246, 52,238,109,135,233, 56,220,120,113, 20,140,147,
+113, 96, 5,116, 98,142, 95,243,245, 75, 40,159,131, 79, 43,155,145, 35,207, 28,103,247,254, 54,239,178, 4, 17,146,178,149,150,
+ 68,131,114, 52,109,146, 19,144,204,147,203,232, 43, 16, 88,175,215, 36,143,142,187,167,162,197,192, 71,159, 12,129,220,154, 4,
+ 51,219,221, 10, 22, 44,227,220, 34, 72, 39,233, 25, 29, 82,254, 15,148,171, 10, 73, 5,147, 44,184, 2,165,156,103,136, 37, 74,
+150, 76, 44,113,178,201,221,138, 53, 44,232, 48,224, 2,146, 27,229, 41, 25, 86, 14, 16, 39,201,128,209, 40,144,156, 78, 66, 48,
+139, 57,195,132, 92,160, 68,194, 41, 35, 51,164, 84, 19,146,124, 50,224, 61, 88,156,115, 57, 2,162,163,132,248,121,227,100,178,
+188,119,150, 23,236, 52,147, 84,208, 52,185,178,205,206, 22,220,225,134,213, 42,209,108,181, 86,214, 33,169,174, 37,103,104,130,
+247,246,190,207, 67, 85, 78, 94,134,216,170, 77, 39, 74,158,147,247, 45, 31, 35, 47, 55, 41,194,188,100, 29, 70,192,221,105,172,
+103,217,106,242,151, 21, 87, 4,100,136,200,176,156, 81,112,193,232,206,230, 69, 32, 47, 32, 98, 49,166,168, 54,178, 92,171, 92,
+ 60, 67,121, 86,180, 61, 27,171, 2, 91,215,164,191, 92,105,152,199,186, 72,194, 32, 9, 78,152, 44,167,105, 46, 81,114, 65, 42,
+ 9, 84,118, 25, 89,200,197,202, 8, 46, 23, 50,102,163, 6,136,228,252, 94, 46, 2,114, 72,217,138,230, 63,102,187,153, 65, 33,
+246,174,215,229, 53, 60, 45,241,142,202, 30,233,156, 8,241,179,143,207, 62, 62,211,153,107, 31,123,143,226,246,214,246,120, 60,
+158, 78,183, 70,163, 17, 74,232,189, 94, 44,150,203,229,226,228,228, 36,229,170,199, 95,235,130, 70,163,209, 23,124,193, 23,190,
+224,115, 62,231,185,207,121,110,136,181,226, 40,194,202, 57,203, 53,163, 28,238, 73,250,208,135, 62,244,254, 63,251,211, 63,248,
+131, 63,200,197,194,207,228,130,190,226, 31,190,234,222,123,239, 29,197,145, 26,110, 60, 40,250,156,202, 28, 91,110, 10, 32,132,
+ 64,227,106,181,122,239, 31,254,225,175,254,234,175,252,149, 22, 20, 99,188,247,222,123, 95,249,202,175, 80,139, 93, 91,120, 52,
+ 72,233,135, 25,254,102,102,191,153,218,147,102,118,120,120,248,227, 63,246,163, 39, 39, 39,159,222,130, 46, 95,190,252,202, 87,
+190,242, 25,207,120, 86,137,231,250,104,122,240,162, 97,208, 63,248,254, 9,215,148,163, 83, 32,196,240,228, 19, 79,252,204, 59,
+223,121,237,218,181, 79,105, 65,175,127,253,235,183,182,118,170,249, 60,157,225,247,153,124,159, 68, 15,165, 84,242, 32,230, 56,
+ 21, 67,128, 97,184,153, 92,119,246,190,247,125,224, 87,254,243, 79,127,242,226,248,223,254, 59,127,215,147, 11, 74, 74,197,152,
+ 23,135,208,126, 41, 43,244,226, 73,202, 47,197,197,122,193,232, 42,112,164,190,162, 86, 92,137,195,177, 90,115, 60,189,233,165,
+ 47,251,242, 63,250,163,255,189, 94, 63,157,202,199,148, 18,234,167,250,185, 59, 90,183,166,208, 11,154,120, 28,142, 12, 48, 64,
+240,174,203, 53, 18,144,158,113,116, 79, 16,124,177,228,114,173,217, 60,125,252,154, 25,117,223, 75,223,250,248, 95,188,251,145,
+247,255,250, 39, 92,144,187, 15, 3,234,141, 99, 39,180,114,193,240,169,225,143, 2,146, 67, 82, 74, 6,194, 29, 36, 82,254,158,
+224,142,197, 10,139,133,207, 23, 60, 62, 17, 96, 49,224,198, 91,191,244,239,190,236,174,119,252,135,127,125,254,130,228,222,203,
+ 27,155,249,120, 9,164, 74,102, 54, 92,149,160,217,156,203, 14,139,165,142,103,244,196,249, 82, 32, 82, 42, 25, 92, 14,228, 1,
+117,201, 82,146,187, 89,217, 96, 37,183, 91,111,125,214,247,125,255,191,248,190,239,125,243,121, 91,230,142,243,145, 42, 52,189,
+237, 99, 24,244,199,127,185,230,124,201,147, 57,175, 31,194, 29, 39, 51, 7,232,176,138, 12, 85,244,164, 20, 82,220, 72,130,235,
+ 68, 11, 72, 73,163, 17,191,255, 7,222,254,189,111,123,235,169,207, 52,149,194,212,211, 62,114,169,197,243,143,126,120,162,107,
+135,186,118,160,171,215,117,120,164,197, 74,139, 85,201,147, 8, 25,221,168,193,151, 27, 65, 56,225,130, 3, 14,164,228,174, 36,
+ 51,123,227,247,188,233,204,130, 62,209,122, 90,161, 80,106,223, 33,200,113,120,172,235, 7,120,234,186,158,218,215,225,137, 22,
+ 75,173,214,114, 41,185,140, 48,178,162, 51,172, 95,110,236,177, 34, 73, 41,121,231,238,174,189,221,189,111,252,166,111,222, 88,
+144, 15, 30, 41,165,206,211,114,149, 22,203,180, 88,118,243, 69,183, 88,166,213,218,187,117,202, 28,165,213, 74,171,181,207,151,
+ 62, 95, 42,185, 11,238, 46,192,115, 5, 1,167,117, 48,215,219,114, 25, 32,215,176, 60,152, 51,231,165,158,228,158, 60,221,254,
+188,219, 95,244,162,251, 7, 74,221,107,143,214,157, 4,156,204,242,242, 33, 49, 6, 76, 38, 33, 26,119,183,225,142,131, 19, 36,
+199,181, 3, 44,150,238, 66,114,146, 30,173, 66,119, 37, 25,245, 1, 62,212,107, 82, 54, 99,193, 16,205, 67, 64, 8,148, 32,135,
+ 27,190,234,213,175,254,179, 63,251,211, 92,117,182, 46,121,151,124,190, 74,243,133,159, 44,210,108,158,230,171,180, 88,248, 98,
+233,139,165,207, 87,158,159, 63,158,249,108,238,243, 69, 90, 46,147,187, 75, 62,128,235,116, 10,189,171,223,253,212, 15, 6,196,
+160, 16,138, 90,186,228,238,114,239,186,238,219,190,253, 59,138,132,142,231, 93,215,233, 35,143, 47,221,177,127,184,238,124, 96,
+ 16,171,223, 48, 34,152,133,128, 11,187, 19,137, 41,141, 37,146, 22,173,153, 7, 31, 64,156,234, 93,114,191, 56, 73,176,136, 27,
+118, 49, 26,101, 93, 52,152, 59, 76,238,193,108, 50,153,220,127,255,139,127,255,247,127,207,214,107, 95,119,158,146, 82, 74, 73,
+165,188,147, 85,212,179, 40,220, 83, 82,151,242,107, 60, 43, 83,166,135,213, 91,247, 65,109,214, 55,191, 82,251,153,116,193,163,
+121,160, 36,149,226,179,187,220,147,187, 92, 95,249, 85, 95, 69, 50, 44,226,157, 79, 92, 91,157,204,211,124,233,217, 36,177,229,
+ 79, 53,175,202, 40, 69,114,172,214,105,177,234,136,117,210, 42,208,171, 34,115,243,251,240, 87,184,144, 4, 35,204,180, 53,197,
+ 93,207,193,133, 27,176, 61,105,196, 14, 54,147, 37,215, 13, 23,110,136,203,117,234, 75,137,185,242,230, 94,157,185,114,142, 8,
+208, 41, 42,215,106, 1,185, 25,198, 33, 14, 36,145, 41, 66,195,237,243, 83, 43, 51,194, 32, 51, 4, 67, 73,251,138, 41,165,106,
+186,120,255,253, 47,142,245,143,197, 49,177, 20, 21, 13, 40,217, 45, 74, 82, 92,205, 18,217, 37, 71, 34,176, 28, 69,142, 98, 32,
+ 70,100, 0,166, 85, 93,172,243,114,196, 8,134,128,177, 97,123,138, 43, 55, 34,142,184,179, 5, 51,203, 78,196,104, 18,232,144,
+ 41,184, 59, 45,165, 20, 11,214,211,131,122, 42,254,148,249,116,100, 52, 82, 64,221, 66,200,157, 36,150, 43, 95,173,185, 61,193,
+116,146,111, 37, 23,188, 75, 69, 33,239,114,131, 8, 66,196,214, 20, 49, 40,219,201,108,215, 61, 95, 40, 7, 14,102,132,211, 25,
+ 75,218,155, 35, 11, 85, 24, 65, 62, 8,163,189,192,131,244,226,254,179,101, 35, 37,173, 58,144, 93, 8, 30,131, 0, 75,154,102,
+100,152,178,237, 41, 71, 81,219, 91,220,217,210,116,156,101,131, 22, 82,104,224,170,105,146,123, 46,208,198, 76, 70, 99, 21, 81,
+ 70, 50,188,226,211,185, 22,156,233, 32,133, 93,228, 34,152,183, 20,228,186, 83,151, 82,176, 52, 25,249,104, 20,132, 8,134,140,
+218, 76,198, 28,141,120, 97,215, 47,236, 90,140,154,142,171,251, 16, 76, 21,196, 46,138,175,194,133,202, 40,108, 70, 21, 88,128,
+ 49,177, 44,167,172, 44,151,144, 51, 94,194, 26, 32,121, 49,203,185,176, 76, 23,187,228, 32,198,163, 53,208,109,111, 41,152,221,
+176,109,147, 73,216,154, 32, 4,183, 10,231,100,112,197, 81,111, 48, 35,118,238, 32,105,230,238, 49,195, 20,153, 53, 38,178, 88,
+255, 26,175, 54,209,121,101, 2,208,189, 71,253, 61,215, 30,228,194,170,195, 58,249, 98, 53, 51,242,194,174,198, 35,187,124, 97,
+178,183,203,130,189,182, 11,171, 66, 77, 58, 21, 98,149,192, 55,170,128,135,108, 74,236, 25,159,102,133,126, 91,165, 2, 14,192,
+ 43, 0, 90,180,205, 43,182,102,165, 26,230,192,170, 75,144,230,139,206, 76,163,104, 49, 24, 77, 33, 88, 37, 39,108,172,195, 90,
+208,228, 46, 32,236, 92,186,171, 20, 70, 88, 45, 34, 42,156,154,113,255, 90, 91, 40,230,170,252,175, 18, 17, 90, 15,207,182, 80,
+241,100,158, 14, 78,186,249,210,175, 31,118, 14,140, 2, 37,196, 56,200,243,250,104,184,193,246, 69,232, 49,255,224,202,192, 27,
+ 27,148,199,146, 90,120, 93, 19,213,155, 86,193,201, 44, 75,183, 28,125, 49,151, 1,220, 97,249, 72,162,115,133,228,235,181,175,
+ 58,151, 16, 3, 72,198, 80,107,123,204,230,141,165,208, 83, 9, 90, 97,247,242,221, 40,208,126, 33,200,102,113,229,250, 41, 43,
+176,152,177,214, 86,160,110,108,232, 98,200,145, 75, 39,229, 83,114, 45, 97,185,210,108,233,135, 39,233,169,253,245,254,113,215,
+117,154, 45,124, 58, 9,238, 10, 54,140,113,193,158,254,130, 56,136,166, 51,242,102,200, 8, 93, 9,158,155,122,177, 5,202, 78,
+245, 53, 34,135,140, 57,248,130,153, 36,210, 33,115, 57,204,232, 76,201,215,228,168,243,174, 19, 89,168,221,201,101, 76,102, 33,
+111,119,166, 20, 10, 6, 50, 86, 38,162, 50,104, 74,102, 32, 29,121, 3,250,227,193, 22, 84,160, 8,139,229, 13,212, 0,136,182,
+130,180, 87,227, 96, 93, 66,242,110,181,182,147, 69, 10,180, 39,174,174,204,120,249,194, 40,154,221,124,105, 60, 30,219, 40, 50,
+ 70, 56,204, 32, 72,177,168, 80, 86,233,108,160,139,220,179,133, 46, 64, 63, 79, 65, 37, 89,114, 78, 89, 78,147, 60,111,111,177,
+ 97,185,210, 96, 5, 43, 16, 72,247,149, 27, 67, 2, 21,204,118,182, 66, 23,148,220, 61, 33, 7,108,249,110, 92,138,200,133, 4,
+214,255,170,241, 66, 53, 68,217,103,168, 63, 96,168,161,131,192, 66,133,181,172, 78,133,146, 83,202,162, 94,161,226,124, 6, 76,
+174,100,139,149, 27,244,196,213, 21,137,235,135,107, 11, 54, 29,135, 24, 56, 25,133,233, 36,208, 44,214,106,166, 23,219,199,106,
+247, 92,149, 67, 80,173,114,245, 60,217,159,208,208,203,166, 17, 50, 28,176, 18, 61,178, 36,178, 36, 65,151, 27, 13,238, 29,221,
+180,158,131,196,108,238, 34,166,147, 16,141, 91,211,184,179, 37,146,177,149, 49,139, 0, 84, 12, 95,137,211,124, 96, 11, 10,126,
+166,194,163,243,222,193, 53,142,186,242,115, 86,114,124,154, 85,116,130,116,121,182,107, 21,132,119,144, 66,215, 73, 6, 95,166,
+228, 0, 45,246,208,120,171, 70,123, 5,235, 89, 20,162,207,232,107, 77,152, 20, 8, 23, 45, 27,147,188, 70,170, 22,193,178,139,
+179, 97,245, 77,176, 82, 88,237,107,204,217, 61,123, 71, 67,231,243,185, 72, 90, 6, 87,138,251,202,181,156, 22,193,230,100,149,
+ 20, 7, 68,157,156,188,148, 52,192, 51,155,171,176,164,170, 16, 11, 32, 80, 25, 84, 57,214,203, 46,154,165, 90,234,141,112,210,
+ 20, 82, 84,182,252,173, 10,230,185,222, 81,216,241,116,244, 22,193, 29, 25, 37, 41,226,207,153,117, 9, 88, 51, 11,185,102, 23,
+165,242, 82, 74, 71,253, 59, 10, 29, 68, 98,169,102,244,127,206,244,178, 28,101, 89, 46,165, 66, 77,214,185,150, 90,171, 17,240,
+252,193,189, 30,201,189,165,133, 94, 27, 32, 88, 42,166,213,198,151,194, 59,171, 56,138,151,168,138, 86,170,203,153,228,150, 99,
+189, 26, 14, 26,139, 0,114,161, 13,229,234, 94, 59, 85,138, 19,115,184,202, 87, 41,234,212, 74,181, 55, 76,146,185,240,130,242,
+102, 21,123,175, 82, 97, 44,117,153,236,143, 74, 20, 6, 12, 14,176, 36,167, 91, 13, 97,229,173, 50, 95, 73,127,133,150,135, 65,
+122, 83,142, 64,150, 17, 11, 67,175,152,111, 87, 43,122,114, 32, 96,176,146, 66, 51,173, 66, 24, 0, 25, 44, 75,115,213,114,156,
+ 21,244,204, 75, 21,220, 65,122, 91,132,202,167, 74, 66, 6,218,122,148,184, 6, 42,173, 90, 85,202,199,141,215,175, 22,146,228,
+172,165,190, 93,165,174,173, 86, 46, 71,177, 6, 32,104, 89,232,229, 76, 8,132,123,177,253,170,161, 34, 32,202,233,128, 11, 82,
+217,185, 34,170,190,212,237,104, 86, 34,183, 61,149,141, 83,221,225, 98,129, 74, 92, 93,148,119,232,143, 62, 91, 48,251,236,227,
+179,143,207, 62,254,166,212, 91,159,238, 18,228,238,222,222, 13,123,123, 59, 59,187, 23, 46, 94,184,124,233,242,133,139, 23, 47,
+220,112,195,246,206,238,206,206,214,120, 60,201, 53,170, 65, 37,103,163,104,209,117,221,124, 62, 59, 60, 58, 60, 58, 58,126,242,
+201, 39,142,143,142, 15, 14, 15,142, 14, 15,247,247,247,143,142,142,254,230, 9,104,123,123,251,174,187,159,255,204,103, 62,243,
+150, 43, 87, 46, 92,184,184,189,179, 29, 99,132,112,174,193,111,165,145, 51,197,147,205, 31, 26,185,245, 12, 31,186,235,186,217,
+201,236,224,240,224,177,199,254,242,161, 15,124,224,225,135, 30,234, 62, 67,149,239,207,152,128,174, 92,185,242,133,247,221,247,
+185,159,251,194,201,100, 44,245, 81,197, 39,191,110, 9,233, 48,192,165,202,175,108,153,118, 73,212,137, 65,177,116, 88,208, 45,
+189,156, 44,245, 85, 65,185, 7,235,209, 71, 63,242,155,239,126,247,131, 15,190,223,221,255,159, 10,104,119,119,247,150, 91,110,
+249,188,207,123,225, 93,119,221, 93, 16,157, 86, 24,238, 49,165,211,250,194,115,149,102,216,107,114,250,215, 51, 28,250,179,223,
+ 55,187,230,114,175,107,147, 84,207, 21, 48,187,126,253,250,255,252, 31,191,245,224,131, 15, 94,189,122,245,175, 69, 64, 87,174,
+ 92,185,247,222,123,111,191,253,246, 43,183,220,146,146,103, 66,234,166, 80,116,182,224,116,190,128,106,241,124,195,218,244,204,
+131,205, 2,202, 57, 68,250,211,100,128, 79,246,100, 73, 57,115,211, 33,132, 15,253,249,135,127,239,119,223,243, 39,127,242,222,
+174, 91,127,102, 4,244,230, 55,191,121,185, 90,183,138,238, 6,163,115,131,100,241, 73,229,188,121,183,167,158, 60,231,101,167,
+104, 27, 79,163, 74,167,168, 11,195, 99,216, 78, 95,233,174, 93,172,236,248,132, 93,194,122,181,252,195,247,252,230,239,253,238,
+111,252, 21, 5, 20,231,139,101, 35,156, 12,168,181,103,165,114,198,242, 12,105, 50,155,114, 25, 60,121, 86,149, 78, 31,194, 82,
+207,168,242,106,165,108,246,205,101,164,229,138,194, 16,156, 98, 73,167, 64,121,205, 71,136,229, 82, 71, 39,185,147, 99,124,247,
+ 61,175,184,247,243,255, 65,242,213,111,252,215,159,251,232,163, 15,226,255, 42,111,136,133, 14,117,170,181,228,188,218,189, 78,
+ 89,172, 74,110,102,255, 30,242,236,235, 52,144, 0, 42, 85,189,182,214, 57,224,174,228,108,137, 91,151, 42,169,130, 21, 64,168,
+136,177,215, 95, 50,255,184,240, 68,165,249,146,203, 85,249,117, 54,231,213, 3,172,215, 86,219, 61, 18, 16,111,122,246,235,158,
+117,151, 66,250,211,247,255,241,127,185,118,237,211,179, 83, 3,122,197, 39,226, 52, 60,141,228, 55,171, 2,108, 4, 44,157, 5,
+196, 7,207, 10,201, 11, 1,147,100,151,176,238, 74,210,237, 98,151,122, 12,198,133,205,165,177,237,164,123, 46, 46, 82,226,106,
+173,229, 58,163, 9, 92,117, 57, 5, 77,149, 8,106, 25,101,233, 18,158,247,220,123, 95,254,247, 62,119,181, 58,250,165,119,253,
+194,195, 15, 63,252, 41,107,208, 38,221,131,131, 58,242,249, 79,212,131, 82,129,242, 76,160, 87, 67,252,139, 89, 24, 70, 3,125,
+251, 14, 37,117,142,147, 25, 23,171,130,190,204, 22, 58, 62, 97,234, 4,178,115,173, 86,182, 78,189, 84,106, 57,205, 78,237, 75,
+210,144,158,208, 14,117,235, 26, 41, 88,103,202, 32, 27,153,156,235,206, 87,107, 76,167,219, 95,255,218,111,148,244, 31,127,230,
+ 29,143, 60,242,200,167,164, 65,103, 52, 69,231, 43,207, 57, 44,157,214,137, 50,248,107,227, 88,111,190, 58,121, 57,130, 41,161,
+ 75,234,186, 12,107, 49, 37, 36, 71, 39, 80, 72,142,228, 94,186, 37, 50,190, 54, 44,246,110, 16, 0, 54,138,203,109, 51, 72, 4,
+ 54,200,173,150, 61,242, 46,102,189, 19,229,110,196, 55,124,227, 55,205,102,179, 95,122,215,187, 30,124,240,253, 79, 43,160,222,
+ 95,157,186,203, 51,225,239,153,198,179,218,123, 60,232, 67, 70, 45,235, 84,112, 37,147,222,151, 43, 30, 28, 99,181, 22,128,174,
+195,225, 49,231,171, 2, 31, 37, 71,231,131,186,212,160,223,193, 32,219, 64,161,159,198, 42, 54, 9,246,211, 28, 36, 88,225,119,
+ 41, 55,199,118, 29, 83,151,231,164, 80,242,233,100,242,218,215,190,238,177,143, 61,246,243, 63,247,179,159, 40,134, 10,127,235,
+ 69, 47, 82,191,188, 1, 83,227,212,111, 61,169, 8,117,224,128,176,209, 46,116, 6,110,170,168, 49,132,213, 90,179, 5,214, 29,
+220,209, 37,204, 87, 88,173,209, 90,235,188, 25,227, 1, 23, 66,130, 21,135,174, 1, 65, 98, 3, 77, 60,195,163, 64,109, 34,106,
+142,174, 28,211, 16,116, 97, 23,151, 46, 42,148,114, 80, 81, 44,185,239,237,221,240,210,151,189,108,119,103,239, 3, 31,120,240,
+ 19,144,242,206,245,233,133, 5, 95, 54,121,213,121,215, 21, 61,105,247, 67, 48, 24, 99, 44,157,215, 70,142,199,140,150, 11,158,
+ 88,117, 92,173,153,209,232,217, 18, 79, 93,231,114,149,197,193,212,169,176,110, 68,130,129, 26, 22, 43,134, 55, 62, 24, 35,112,
+138, 93,115,190,178, 75, 74,181,208, 98,132, 81,227, 0,128,209, 16, 2, 3, 17, 44,219, 72,135, 44, 55,134, 37, 79, 46,191,255,
+254,251, 95,252,226, 23,255,196, 79,252,216,227,143, 63,190,161, 65,247,221,119,223,185,202,235,146,123,241, 35,238, 90,174, 50,
+ 57, 71, 73, 74,174,206,149,114, 91,118,141,161,242,224,160, 88,136,165,144,176,238,176, 90, 41,155,152,197, 10,199, 51, 44, 87,
+197,139,187,106,215,128,144, 7, 3,157,103,234,184, 25,116,242,140, 33,228,185,158,182, 52,121,228,193, 12, 25,197, 37,130,225,
+226, 30, 46, 94, 64,140, 37,241,107,250, 63,244,186, 47,249,162, 47,222,218,222,206, 67,117,138, 6,205,230,197,103, 36, 87,166,
+ 12,229,195,211,117, 90, 44,189,225,203, 41, 13,109,242, 0,156, 38,205,250,188, 42, 70,150, 49, 48, 70,163, 73,161, 90,104,174,
+214,161, 22, 41, 51,248, 92,154, 84, 55, 77,201, 80, 89, 6, 68,135,243,157,133,206, 6, 93, 67,198,169, 25,166, 19,140, 2,105,
+ 10, 1,227, 81,134,170, 11, 3,161, 53,248,165, 74, 29,118, 64,166, 47,249,226, 47,185,249,166,155,127,249,151,223,149,193, 22,
+254,227,175,121, 93,190, 96,151,116,237,112,125,116,146,220, 37, 97,217,105, 54, 79,201,207, 44,139,234,169,154,195,251, 33, 73,
+ 25, 75,167, 87, 48,219,153,134,113, 12,181,238, 19,186, 20, 32,219,180, 41,236,169, 60,253,167,216,166,190,112,240, 36,206,152,
+158, 83,170,231, 82,137, 0, 72,140, 2,182,183,176, 53, 5, 97, 33,232,202,101,222,114, 35, 71, 99,181, 29,236,117,116, 64,175,
+ 6, 16, 66,220,223,191,254,142,119,252,212,245,235,215,195,165, 91, 95,112, 60,243,227, 89,119, 60, 75, 71,179, 52, 95,250, 58,
+169, 75,190,206,102, 66,165, 8,149,251,143, 88, 24, 2,165,123, 16,181,199,172, 53,120,182,126,165, 86, 41, 43,236,203, 82, 21,
+ 73, 64,151,235, 21, 3, 6,221,169,253,215,211,250, 44,157,115,166, 52, 84, 40,152, 33,183,202,141, 35, 46,238, 97,119, 27,211,
+ 9,182,166,216,217,210,116, 10,227,240, 18, 27,236,245, 1, 59, 73, 91, 91, 91, 95,244,146,151,188,239,189,239,229,109, 47,248,
+202,205,160,144,231, 68,209,155,233, 85,169,250, 72,236, 7,125,148,242, 92, 77,174,122,107,170, 58,144,105, 20, 74,222, 57,138,
+ 28,135, 76, 80,203,159, 25,234, 56, 43,108,106, 22,207,123,242,172,219, 42, 21,187,108,248, 70, 6, 39, 34, 32, 96,107,138,103,
+221,134,139,123,204,150,104, 50,194,120, 92,230,147,212, 65, 63,167,112,129, 1, 90, 64, 90, 48,165, 66, 97, 56, 21,237,156,230,
+202,244, 71,189,178,131, 27,187,164,146,113, 74,191, 94,230, 24, 9,222,203, 17,249,175,165, 83, 18, 80,162, 33,164, 13,100, 77,
+173,189,123,120,196, 26,213,208,212, 62,236, 28,126,100, 31, 65, 27,193,128,173, 17,130, 1,192,116,140, 81, 84, 48,179,129, 41,
+235, 45, 41, 7,140,220, 10,224,161,103, 88,201, 5, 11, 22,189, 87,108,162,181, 30,171,229,203, 77, 86,229,169, 70, 23, 42,168,
+209, 32,243,239, 15, 90, 95,202, 44,239, 75,201,157,165, 64,190,238,180, 88,166,150, 17,108, 77,108, 50, 14, 3,233, 76, 6, 50,
+178,122, 30, 41, 49,137,220,128, 6, 10,251, 36, 24,162,149, 79,223,221,193,205,151, 56, 30,131, 64, 12,216,217,198,214, 36, 53,
+ 24, 32,135,113,173,222, 92,123,177, 43, 11,170,196, 71,181, 89, 27,142,132,200, 28,207,158,238, 73, 56,197,236, 45,197,203,198,
+ 59, 24,128, 28, 53,216,207,195, 86,224,173,215,181, 40, 80,143, 90,120, 75,228,179,255,112,167, 25, 82,126,103,233,149, 21,144,
+212, 15,165, 9,167,108,118, 41,156,151,205, 46,210, 26, 5,196, 88,152, 87, 49,192,172,248,130, 50, 29, 45,209, 76,103,250, 25,
+120,198, 9, 54, 46, 73, 21, 60,233,134, 56,176,110, 61, 38, 81,239,171,138,168,180, 99,179, 41, 41, 53,144, 87,207, 5,241, 6,
+120,244, 13,146,133,176, 87, 57,189,125,145, 58,135, 75, 90, 44,181, 92,149, 95,131,113, 20,215,193, 12, 64, 52, 75, 24, 75,205,
+ 60, 25,105,130,229,168,111,111,135, 49, 42,191,101,111, 27,123, 59,133, 44, 22, 2, 38, 99, 4,107,122, 94,249,106,159, 12,188,
+ 41,106,209, 64,115,128,146,129,209,171, 81,101, 79, 13,238, 57, 54,173,187,159,141,166, 84,158,235,105, 40,172,165,238, 13, 15,
+124, 6, 58, 42, 92,177,214, 85,158,169,170, 68,161,143,101, 60, 39,183,250, 87, 30,144, 49,161, 76,225,107, 22, 53,229, 73,146,
+109,164,154, 17,150,251, 66, 12,204,163, 67, 6, 30,149,185,182,207, 54,106,234,188,127,101,170, 19, 91, 41,161, 60, 69,202, 83,
+108,109,224, 42, 44,211,129,178, 8,109,206, 95,225,223, 13,134, 83,213, 83, 83,226,214, 58, 18,181, 42,224,176,187,169,174, 57,
+191,176,140,114, 42, 92,178,218,154,203, 44, 50,172, 58, 16, 9,160,173, 61, 68, 15,182, 36,141,192,100, 18,246,182, 70,163,145,
+129, 24, 71,187,124, 67,156, 78, 44,231, 13,193,100, 54,100,169,247,217,178, 54, 93,250,185,248, 85,211,244,188, 67,253, 17,203,
+145, 52,232,167,113,119,231, 48,211, 27,216,157,214,230,140,126, 8, 2, 43, 41, 98,208, 75, 50,200, 23, 55, 33, 82,249,224, 84,
+230,238, 51,150,214,232, 70,128, 42, 10, 45, 9,105,157,242, 7,208, 16, 2, 28,214,114,131, 96, 54, 25, 53,227, 75,158,161,101,
+244,184, 2, 85, 56,250,172, 65,199,128, 55,116, 42,192,209, 41,204, 38,132,216,227,155, 13,198,105,222,171, 82,187,138,182,200,
+ 11, 91, 68, 37,140, 40, 83,116,155,254, 84,138, 22, 55, 14,118,229, 98,162,176,221,170,252,202,180,200,140,122,176,241,146,203,
+144,185, 76,214, 41,231, 77,206,217, 60,173, 59,207, 53,178, 81,176,227, 89, 55, 25, 25,201, 16,176,187, 29,118,183, 66, 8,165,
+251,112, 28,105, 86,176,160, 60, 4,180, 78,155,200,244,202,220,157, 94,214, 70,208, 11, 41, 78,102, 54, 56, 4,202, 93,112,177,
+218, 84, 13,123, 33, 57,244, 62,149, 85,202,129,237, 41,112, 71, 21,237,144,128,202, 13, 45,174, 92,195, 62, 69, 47,211, 51, 85,
+ 47, 92, 6,161, 21,114,113, 33, 36, 14, 89,164,130,224, 88, 75, 21,105,228, 40, 56,160,201,216, 0,196,104, 33, 96, 50,202,113,
+ 22, 67,180,210,102, 84, 48, 37,121, 69,251,123, 15,223,120,232,253, 20,143,204, 65,203,180,102,245, 20,117, 32, 22,200,114,211,
+ 13,150,182, 70, 14, 99, 42,158,138,142, 42, 69,184,240,178, 26,224,170,179,165,196,166,161,253, 88,128,170,131, 45, 98,106,101,
+216,214, 71, 82,205,106,102,104,170, 17,204,165,228,152, 45,211,178,115,130,102,105,221,249,241, 44,229,112,112, 50,178,157, 45,
+ 27, 5,138,136,102,211,137,141, 98, 27,158, 37, 43,179,133,107, 79, 69, 15,250,109, 70,203,234, 69, 28,251,142,152, 1, 26,126,
+172,230, 0, 0, 5, 38, 73, 68, 65, 84, 27,174,239, 74,200,231,174, 57, 62, 98,224, 7,235,193, 64,165, 3, 14, 56,117,234, 53,
+168,231, 52, 87, 10, 54,203,217, 44,241, 54,251,193,131, 94,206, 65,158,136, 80,113,230, 82, 24, 81,165,133, 38,193,151,106, 67,
+171,230, 75, 63, 56,238,114, 96,180, 53, 13, 23,119,227, 40, 26,168,113, 12, 64, 32, 67,137,144,141,155,189, 70,195, 76,251,252,
+114, 58,129,232,253, 36,196,230,199, 74, 73, 42, 47, 10,195, 99,166, 74, 99,172,236,247,193,217,234,179, 77, 14, 2,204, 83,121,
+168, 88, 1,164,214, 1, 82,154, 85, 10,181,174,232,124,118,250, 44,163, 78, 90,144, 88,246,209,165,190,188, 38, 79, 72, 53, 22,
+ 91,174,121, 60, 75, 49, 58,137, 24,220,229,179,101,153,151, 52,138, 54, 30,101,151,136,104, 28, 69, 43,241, 65, 38,161,215, 38,
+ 73, 86, 90, 99, 94, 97,172,243, 84, 42,223,145,125,206,213,188,115,155,107, 54,168,110,181,238,165, 62, 62, 30,164,111,103,167,
+165,105,192,247,215, 96, 86, 80,223,180,171,210, 0,209,203,184,153,162, 34, 72,245,248, 81,174, 18, 1,116,208,229,169,204, 21,
+210,114,169,227, 89, 87,166,109, 27,199,145,193,242,249,194,206, 52,236,108,133,220, 58, 62,157,216,165,189, 56, 30, 91, 14,157,
+ 70, 35, 11,173,161,160,114, 36,114,117, 41,182, 0,134,141,228, 58,108,170,169,211, 94, 90,191, 58,250,161, 48, 44, 77, 46, 26,
+ 20, 3,251, 8,251, 84, 27, 77,207, 92,238,207,102,225,185, 14,111,188,224,216, 5,210, 98, 27, 31,227, 5, 70,110, 53,142,250,
+201, 68,245, 66, 45,176,247, 42, 95,229,146, 13,115,163, 69,151,180,236,188,206, 61,195,113,236,198, 93,200, 41,238, 40,134, 24,
+106, 1,155,168,170, 5,131,197, 1, 87,190,150, 74, 75, 64,217, 18,134,114,187,165,211,109,128, 88,246, 61,103,213,159,183, 66,
+170, 78,201,166, 18,166,123,146,186,154,157,103,157, 31, 70,207, 77, 65,213, 72,209, 11, 75,189,190,182, 12, 94,202, 82,245, 66,
+165, 31,228,212,185,109,169,156, 27,247,196,165, 3,200, 19,237,120,178, 72, 56,108,238, 40, 55, 72,101,192,151,163,145, 69, 43,
+163, 9, 38, 99,110, 77, 66, 78,119, 64, 70, 47, 51,160, 48,236,231, 99, 27,214,221, 54, 37,111, 89,139,227, 11, 45,155, 3, 10,
+190, 6, 39,241, 84,144, 88, 83, 59,213, 88,179,208,195, 89,151, 91, 2, 1, 58,189, 54,168, 12, 87,194, 50, 50, 41,247,113,212,
+176,130,125,159, 54,122,132, 71,172,179,131,178, 27, 31,168,111, 62,196,165, 53,206,139,234, 81,166,152,231,144,137, 73,150, 18,
+ 83, 39,133, 34,150,216,250,183, 85,143, 74, 29, 61,167,126, 28, 93, 89, 64,233,173, 46, 48, 80,153,146, 53, 8,204,213, 15, 28,
+ 63, 83,106,171, 52,228, 30,115, 98,137,116, 84,251, 85,106, 95, 42,154, 83,105, 9,100,155, 75, 84, 91, 23, 9,170, 54, 83,150,
+ 12,166,102,118,106,117,194,130, 45,112, 80,220, 44, 30,201,149,251, 92,148, 1,170, 69,107,145,133,102,139,180, 63,160,216,196,
+126,247,250,201, 93,249,202, 69, 46,106,119,228, 28,160, 96,216, 48,234, 69, 54, 26,148,211,121,170,228,137,193, 11,217,192,198,
+ 58,118,150,173, 7,128,173, 41,172,128, 79,213,142,215,186,100,230,183, 55, 88,179,194, 2,181,225, 69,213, 92,170,182, 38, 53,
+244,165,128,160,109,236,112,107, 51,107,125, 26,234,253, 78,241,229, 81,173, 19,171,117,172,213,131, 82, 20,107,208,197, 88,135,
+210,113, 64, 90,113,213,180, 86,103, 72,101,131,159,170,174, 13,129,219,236, 19,154,177,111, 62,171, 28, 9,103, 77,216, 6,115,
+ 22,115, 55, 72, 29,108, 87,250,216, 26, 80, 85, 32, 48, 84, 73,230, 94,199,190,214, 91, 85,147,165,223,166,239, 40, 40,113, 87,
+159,191,149,102,175,168,222,175,183,158, 53, 54,119,150,215, 89,232, 1,172,135,118, 32, 77,180,161,140, 27, 7,109, 19, 70,111,
+193, 89,211,183,124,209, 1,100,203,106,240, 89, 39, 42, 22,109,106, 54,176, 86, 68,219,224, 12,182, 12,189, 4, 75, 13,102, 46,
+ 40,112,109,234,242,210,188,136,218,194, 92,251, 96, 91, 39, 2, 91, 10,130,225, 49, 22,193, 88,221, 36, 6, 51, 93,138, 27,107,
+169,102,161,112,100, 59, 86, 15, 83, 51, 86, 3, 8, 82,195,252,190, 15, 22,219, 80,203, 97,135, 94,157, 32, 61,176, 12, 57, 63,
+181, 22, 67,215, 0, 62,171, 82,129, 68,154,251, 67,245, 46, 26, 72,165,207, 13,107,187, 83,195,110, 42, 74,153,239,220,160, 26,
+139, 86,102, 74,239, 99,213,115,159, 34,124, 8,218,120,131,109,242,236, 73,130, 45,168,105,230, 15, 94, 82,248, 26,206,176,217,
+246, 51, 33, 98,159,124,109, 70,249, 18, 54,202,205, 21, 8,169,112, 25,218,129, 43, 75,110,244,154, 70,181, 81,101,221,212, 25,
+116,236, 97,234, 58,174, 82,213,227,169, 26,127,212, 59,170,242, 41,105, 23,135, 41, 71,189,109, 0, 81, 45,233,244, 1,172, 34,
+239, 49,157, 44, 41,182,241,234,205,224, 19,222,216, 29,106, 6,117, 3,110,194,169,255,213,247,213,180, 44,162, 39, 42,170, 98,
+182,101, 53,117,233,205, 76,122, 3,193, 29,110,121,154, 98,223,156, 89, 26,223, 57, 36,158,212,185,249,173,189, 48,155, 35, 7,
+ 13, 13, 86,161, 78,117,245,138,181,109,156,177,140, 60, 84, 99,104,228, 46,230,225,156,192,106,203,250, 86,245, 83,146, 42,247,
+172,146, 85,138, 67,252,117,192, 99,172,158,161,183, 95,141,152,160,225,104,148,102, 46, 54, 13, 83,203, 78,243, 13,151,177, 79,
+131, 54,204,220,130,169,138, 17,100,152,156, 48,245,194,170,157,214, 86,128,150, 86, 78,202, 92, 25,244, 56,108,145,113, 68,111,
+165,235,228,250, 54,186,133, 67,166,188, 74, 60,161,218,185,215, 23, 27,212,167,245, 77,124,131,163,230, 45, 20,226, 38, 55,131,
+234,131,133,166,119,108,136, 63, 81, 43,147, 77,238,253, 32,202, 54, 20,127, 88, 14,168,167, 10, 77,179, 88,237,114,141, 17,208,
+ 27,101,108,188, 76, 27,211,164,218, 42,255, 15, 49,206,148,201, 27, 21, 95, 6, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/draw.png.c b/source/blender/editors/datafiles/draw.png.c
new file mode 100644
index 00000000000..f87c5fc18c7
--- /dev/null
+++ b/source/blender/editors/datafiles/draw.png.c
@@ -0,0 +1,361 @@
+/* DataToC output of file <draw_png> */
+
+int datatoc_draw_png_size= 11349;
+char datatoc_draw_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 96, 0,
+ 0, 0, 96, 8, 2, 0, 0, 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,252, 97, 5, 0, 0, 0, 6,
+ 98, 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66,
+ 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7, 19, 1, 10, 6,157,179,150, 0, 0, 0, 32, 0, 73, 68, 65, 84,120,218,
+237,125,123,188,229, 87, 85,223, 90,107,239,253,123,156,115,238,185,247,206,157,201, 76, 50,201,100,242, 32,145,144,132,164, 36,
+ 20,101, 8,150,106,228,163, 86, 63, 40,213, 63, 90, 21,173,181, 86, 84, 84, 42, 69,139, 4, 16,141,248, 4, 65,173,173,162,104,
+ 1,181, 22, 84,108,245,211,250,128, 42,124, 16, 42, 16, 2, 24, 18,242, 32,153,100,158,247,113, 94,191,215,222,123,173,254,177,
+247,239,119,126,231, 78,128, 20,241,211,248,249,120, 38, 51,115,239,220,115,207,221,103,237,245,252,174,239, 90,193,219,110,187,
+ 13, 62,231,227,137, 60, 73, 3,192, 79,253,244, 79, 63,251,196,115,189,247,222,251,170, 42,235,186,210,218,252,214, 91,223,242,
+155,255,229,109,225, 73,120,226,196,137,159,123,195, 27,103,243,197,163, 39, 31,153, 78,246,156,181, 2,112,205, 23, 93,167, 8,
+ 31,249,244, 3,223,254,237,255, 26, 0, 8, 0,172,115,103,207,156, 46, 22,139, 99,199,175,184,238,250, 27,159,114,205, 83,183,
+ 14,108, 86, 85,117,238,204,169, 55,254,252,235,227,143, 67,162, 75, 47, 59,118,241,197, 71,157,115,198, 96,146, 36, 15,127,250,
+211,119,223,245,161,217,222,238,250,198,214,107,238,120,133, 6, 0,239, 61,179, 79,210, 36,205,178, 71, 30,126,232,209,147,143,
+ 60,252,224, 3, 59,219,103,111,123,222,237,197, 98,174, 76,162, 1,192, 57,199,158, 21,249, 83,167, 30,126,255,123,255,119, 49,
+159, 63,229,169,215,221,244,140, 91,155,186, 98,102, 17,208, 0,224, 26,203,194,139,217, 84,107,115,197, 21,199,143, 92,114, 89,
+ 85,215, 77,221, 88,231,157,243,222,123, 29, 14,206,222, 63,122,242,225,181,245,205,195,151, 28,115,206,149,139,153, 8, 58,103,
+157,179,206, 58, 13, 0, 77, 93,123,239,183, 14, 29,254,216, 93, 31,202, 7,195,245,205,205,196,164,101, 49, 43, 22, 11,107, 93,
+ 93,215, 26, 0,234,186, 10,146,188,226,234,107,103,147,189,123,238,190,235,224, 69, 71, 70,227,117, 97, 46, 22,243,166,174,240,
+ 9,221,221, 19,121, 32, 0,188,239,253, 31, 0, 16,239,125, 85,219,170, 44, 64,100,111,251,220, 55,125,203,183, 44,159,244,193,
+ 15,221,213, 84,229,249,237,237,179,103, 78,151,101,233,189,223,218, 58,120,252,170,171, 63,240,222, 63, 87, 68,223,255,210,151,
+197,187,219,155, 76,207,157, 57,155, 15, 6,215, 93,127,195, 83,175,187,254,248,149, 87,105, 68, 1, 26,173,109,220,249,218, 59,
+ 0, 64,123,246, 27,155,155,107,227,117,239, 29, 34,102,105,186, 88, 44, 30,124,224,254,191,185,251, 35, 95,252,156,231, 37,217,
+ 8, 0,240,189,127,245, 65,239,152,217, 15,178,116, 50,157, 61,242,240, 67, 39, 31,121,228,145, 7, 63,117,237,211,110, 92, 27,
+143,231,179,201,249, 51,167,180,179,158,217,103, 89, 90, 84,245,199,238,254,200, 61, 31,191,123, 52, 26, 63,247,203,158,111,173,
+173,202,130,153,145,148,118,206,178,247,103,247,118,117,154, 30, 60,120,209, 45,183, 62,115,180,190,105,155,198, 57,231,188,115,
+206, 51,179,182,214,178,119,128,120,250,228,201,209,120,156,101,105, 89, 22,139,217, 76,144,172,117,206, 90,231,156,110,234,218,
+179,103,239,157,115,247,124,252,163, 27,155, 91,195,209, 72, 39,233,238,249,211, 2,166,177, 77, 83,215, 58, 92, 28, 51, 15,134,
+195,203,142, 95,117,223,223,124,156,133, 15, 30, 58,172,211,225,206,153,147,141,199,166,169,225, 11,117,119,122,223,231,119,220,
+241,170, 47,191,253,118,231, 28, 51,123,239,189,119,206, 90,239,253, 31,253,143, 63,252,143,191,252,159, 63,155, 14,156, 56,113,
+226,103, 95,255, 6, 65, 18, 97, 97, 97,150,162, 40,202,178,168,202,210, 54,141,181,141,247, 94, 68, 6,195,225,230,230,150, 82,
+234,177, 71, 31, 18,231,191,231, 37,223, 55,159,207,247,159, 8, 81, 33,194,246,246,222, 98,177,152, 78, 39,243,217,212, 59, 7,
+ 0, 74,107,163,141, 78, 12, 17, 13,242,193,120,125, 61, 73, 18,165,213, 61, 31,251,232,155,222,248,198,170,170, 22,243,201, 75,
+127,240,229,203, 23, 18, 16,102, 24, 12, 7,164,212,250,198, 70, 98, 18, 1,241,222,139,247, 94, 88, 88,134,163, 33, 33, 88,107,
+183,207,157, 61,125,234,177,135, 30,124,224,220,233,135,159,253, 79,158,159,229,163,159,250,201,159,120,239, 95,188,231,247,222,
+245, 71, 26, 0,156,103, 96, 38, 82,121,158,139,176,103,175, 72,229,169, 70, 61,104,234,102, 49,159,159, 57,117,106, 54,155,237,
+238,236,156, 63,119,250,220,153, 83,229, 98,254, 37, 95,250,101, 34, 2,136, 74,233, 91,158,249,172,107,175,121,138, 6, 0,239,
+188, 8,139, 8, 51, 43,165, 82,163,149, 78, 39,123,187,103,207, 62,120,254,220,185,189,157,157,249,108, 82,150,101, 93,149,131,
+225,232,166, 91,158, 53, 28, 14,157,115,214, 90, 14,158, 4, 80,153, 52,188,144, 19, 16,102, 22, 17,103,107,167,140,231,114, 50,
+217,219,221,222,190,255,147,159, 24,140,198,215,221,240,244,193,112, 40, 44,241, 30, 93,112, 7,206,123,102,207,204, 2,193, 47,
+ 89,103,227,203,136, 20,243, 89, 85,149, 89, 62, 80, 90, 95,114,233,101,135,143, 28,177,182,177, 77, 93, 21,115,165,147,248, 50,
+ 46,168,133,115,206,122,231,188,119, 46,248,174,166,174, 69, 68,132, 89, 68,105,237, 61, 63,248,169,123, 77,146,102,249, 32, 73,
+ 18,109,180, 78,114, 16,118,206, 85,101, 81, 21, 51,210, 41,179, 56,231,156,117,141,181,182,105,172,181,225,133, 42, 22, 1, 17,
+ 47, 34,204, 38, 73, 46,185,236,242, 98,177,120,232,129,251, 22,179,105,146,102,195,209, 90, 62, 24,102, 89,166,180, 54,233,176,
+174,171, 98,182,199, 64, 44,208, 84, 85, 93,215, 77, 19,125, 96, 45, 65,218, 65,224,204, 44,130,136,151, 95,121,117,208,238,186,
+170, 30, 61,249,176,176,207,135,163, 60, 27,104, 99,116, 58,172,202,249,100,251, 44,153, 65, 93, 87, 85, 89,124,225,252,228, 23,
+228,113,236,216, 49,250, 66,189,214,138,245, 95,125,245,213,191,254,150,183, 56,231, 69,196, 51,179, 15,122,103,109, 93,191,228,
+251,190,255,209, 71, 31,253, 28, 17, 0, 0,222,255,129, 15,136, 96, 16,183,247, 30, 16,157, 13,138,210,120,231, 4, 64,107, 93,
+ 87,229,108,178,243, 45, 47,250,182,199,125,107,248,193,191,254,144, 0, 10, 3,128, 32, 81, 85, 86,243,197,172, 42,203,186,174,
+108, 99,157,115,158,189, 34,218,220, 58, 56, 26,141,202, 69,177,183,115,166,170,202,239,248, 55,223,181, 95, 70, 68, 26,129,128,
+176,177,205,246,249,243,167, 79, 63,118,230,212,169,179,103, 78,111,159, 63,191,183,187, 51,157,236,205,103,179,162, 40,216,179,
+214,102,188,177,169,147, 60, 73, 7,191,244, 11,111,218,119, 40, 2, 68, 1, 41,230,211,189,189,189,221,221,157,157,157,237,233,
+116, 82,149, 37, 51, 43,173, 7,163,209,250,250,198,120,188,190,177,177, 49, 24, 12,210, 52, 73,210,244,158,143,127,212,164,233,
+ 27,127,254,245,121,150, 45,133, 45, 34,136,192, 44,206, 90,219, 52, 8, 48, 26,141,214, 55, 54,215,214,198, 74, 41,102, 14,118,
+ 57, 30,175, 49, 75, 81, 44, 22,179, 89, 89, 22,136,202,152,228,181,175,125,245,191,251,193,151,139, 72,120, 33, 96,150, 44, 31,
+ 0,210,112, 52, 74,146,140, 16, 61,123, 97, 14, 78,214,152, 36,207, 76,211, 52, 69, 81,156, 63,119,238,212,169, 71,103,211,137,
+181, 13, 18, 42,101,126,244,213,175,124,197, 43, 95, 13, 0, 36,194,204, 66,132, 89,150, 15, 6, 3, 34,228, 96, 45, 0,249, 96,
+ 48, 24, 36,105,154,148,181,221,222,222,126,236,177,199, 30, 61,249,240,233,199, 30,173,171, 2, 4, 68,136,136,180, 54,255,254,
+165,223, 27,223,154, 8,179,128,176, 23,129,240, 42,195,225, 0,132,189,151,178,225,249,124,123,177,152, 79, 39,147,157,243,231,
+206,156, 57,181,123,238,204,145, 75,142,155, 36,177,206, 10, 0,146, 74,243,129,181, 86, 51, 11,179, 0,136, 8,136, 48, 8, 12,
+243,140,148, 46,138,114,178,183, 51,157,236, 77,167,211,233,100, 50,157,236,237,110,159, 47, 22,179,141, 3,135,158,118,227,205,
+ 44, 12, 34, 0,136, 0,136,234, 75,111,123,182,102,225,224,137,130,143, 28, 13,135, 0, 80,150,229,246,249,179,231,206,158,217,
+ 62,127,126, 58,217, 43, 22,243,170, 42,133,249,248, 85,215, 92,113,229,213,158, 89, 60,251, 86, 2,136,136,168,116,240,149, 34,
+ 44,194, 72,170, 88,204, 77,154,205,103,179,157,237,237,199, 78,158, 60,119,246,148,119,206, 36,233,145, 75, 46, 61,118,249, 21,
+105,154,122,239,227, 15,246, 16, 44, 65, 0, 0, 65, 11, 51,179, 15,175,148, 40, 44,235,138, 1,157,119, 74, 41, 68, 97,230,107,
+158,122,253,197,151, 28, 69, 66,239,124,124,149, 40, 14,110,253,179,196,244, 39, 92,179,136, 52, 34,197, 98,225, 60, 3, 64, 62,
+ 24, 28, 61,122,236,192,230,230,145,163,151,249,168, 76, 62,132,113,238,180,139,133, 89, 98, 82, 26,190, 16,205,213,185,197,108,
+102,173, 51, 73, 98,146,100,253,192,129,209,120,173, 44, 22,204, 94,105,227,189, 48,115,120,157,222, 75, 51, 51,131,136,102,246,
+236,195,197,139, 48, 51,200,206,246,249,193,104,148, 36,169, 82, 74,105,147,145,178,182,177,117, 85,150,133,210, 9,139,120,239,
+185, 59,151,247,236,153, 69,116, 72, 60,162,183, 22, 25,173,173,239,108,111, 47, 22,243,124, 48, 76,211, 76,107,173,180, 66, 64,
+101,146, 68,164,152, 79,189,103, 84,166, 31,222,130,224,122,111, 45, 30,137, 15, 95,124,244,161,251,239,155,236,237, 38,105,150,
+231,131, 44,207,141, 73,148, 82, 34,104,210,220, 45,102,197,108,199, 36, 3,142, 81,210,133, 87,208,206,121,102, 47, 2,194, 30,
+ 0,152, 25, 0, 46, 59,126,229,153, 83,143, 61,250,200,167, 17, 49,203, 7,163,181,181,124, 48, 52,198, 16,162, 54,153,106,236,
+124,114, 94, 39,163,246, 80, 78, 88,180,119,182, 59, 17,183,167, 18,230,173,131,135,198,235, 27, 59,219,231, 31, 59,249, 80, 89,
+204,135,163,181,193,112,148,166, 25, 18, 41,109,148,206,102,147,115,202, 12,156,179,161, 20,233,223, 90,212, 76,246,225, 78, 89,
+ 68,214, 55, 54,134,195,235,207,159, 63, 59,221,221,105,234,122, 56, 90, 75,210, 20,145,148, 73,148, 50, 85, 49,103, 1,219, 52,
+204, 30,158, 84,113,237,178,203, 46, 35,120, 50, 61, 16, 81, 63,241,103,223,124,243,205,151, 95,126,249, 21, 87, 92,145,229, 25,
+ 33, 89,219,204,231,243,251,239,191,255,161,135, 30,250,228, 39,239,253, 59,137,215,225,113,237,181,215,254,202,155,223,140, 64,
+ 49, 6, 11, 8,136,176, 4, 93,109,157,134, 0,128, 72, 72,135, 25, 98,124,103,102,231,156,173,203,162,174,235, 23,127,247,247,
+204,231,139,207,243, 64,175,122,245,107,190,242,171,190, 74, 36,158,128, 1, 48,166, 93, 30,137, 68,192, 1,123,107,157,115,206,
+123,246,209, 42,130, 71,145,112, 74, 16, 68,212, 58,201,178, 52,203,215, 0,224,109,111,255,157,221,157,115, 32, 34,194,111,125,
+235, 91,255,215,159,252,217, 19,186,181, 19, 39, 78,188,254,231,223, 36,241, 44, 40, 33,146,176, 7, 84, 77, 83, 91,219,212, 85,
+ 93,215,149,181,214,197, 3, 57,246,225, 87,116,169, 33,244, 0, 34, 41, 53, 28,142,214,214,214,178, 60, 79,146,148,136,188,119,
+139,217,236,177,147,159, 30,173,173,133, 32,126,223,125,159,252,233,159,125,195,103,201,213, 34,208, 32,158, 1, 81, 0,234, 98,
+225, 28, 91,231,154,166,169,235,170,105,154,186,170,154,166,118,214,250,152,160, 74,136, 27, 33, 0, 33, 0, 32,130, 8, 0, 16,
+145, 86, 74, 41,157,166, 89,112,135,222, 59, 34,117,216,187, 71, 31,254,244,218,250,186, 73,179,107,174,125,234, 47,188,233,141,
+182,169,126,248, 21,175, 44,138,242, 51, 92,153, 96, 80, 23,111,109, 99, 93, 93,215,117, 93, 55, 77, 83,215,117, 93, 87,182,105,
+156,117, 2,162, 72, 37, 73,162,148, 50, 73,146,152,196, 24, 99,146, 68,107, 29, 78, 21, 14,150, 15, 70,131,193,128,136, 8,145,
+ 69,156, 19,103, 27,231, 60, 16,221,253,225, 15, 94,127,211, 45, 74,155, 16, 75,239,252,177,215,214,117,245,202, 87,189,166,170,
+234,253, 7, 10,117, 26, 34, 0,146, 82, 26,201, 18, 41,165,180, 49,172,181,166, 53, 74,210, 52,207,243, 52, 73,145, 40, 92,110,
+ 20, 21,139, 0, 51, 11, 11, 19, 98,150, 15,242, 52, 17,182,158,169,241, 92,215,117, 81, 44,102,211,233,222,238,246,238,206,118,
+ 89,150,239,123,247, 31, 61,235,185,207, 71, 34, 36,165,180, 49, 34,175,122,229,143,212,213,226,142,215,220,185,122,160, 46,255,
+ 64, 72,210, 60, 73,179, 96, 71,109, 16,110, 77, 43,212, 41,241, 27, 0, 68,144,208,232, 84, 41, 2,240,132, 36, 64,117, 99,173,
+179, 77, 93, 87,101, 89, 20,197, 98, 49,159, 78,246,246,118,182,119,119,207, 47,230,211, 52,205,154,186, 54, 73, 66, 68,140, 68,
+164,180, 73, 68,228, 85, 63,242,195, 63,250,227,175,243,222,199, 3, 49,135,159, 5, 0, 28,149, 27,130, 45, 11, 10, 48, 0, 68,
+ 51, 7, 4, 52, 70, 27, 69,222, 59, 84, 4, 64,236,217,123,239, 28, 91, 91, 53,141,181, 77, 93,215,117, 89,150,101,177, 88, 20,
+139,249,116, 58,155, 77, 22,211,105, 85,204,148,214,151, 95,117,109,146,164,210,230, 64,128,132, 24,133,245, 67, 47,123,233,111,
+253,246,239,212,214, 71, 9, 9,112,240, 53, 8, 33,107, 67, 17, 1, 96,223, 30, 48, 73, 19,173, 72,216,147, 78, 66,246, 99,171,
+160,101, 85,211, 4,184,163,174,235,170,174,170,170,170,202,178, 40, 22,139,178, 88, 84,229,162,174, 42, 0,222,216,186,232,170,
+107,190,104,109,188, 30, 98, 93,248,161, 8,128, 33,207, 67,165,180,126,225,215,191,224,163,119,127, 34, 72,200,119,230,219, 62,
+153,131,228, 16,197,152,212,104, 18,102, 34,237, 0,203,178, 44,203,162, 40,138,170, 44,202,178,172,171,170, 42,203,186,174,131,
+123,104,154,166,169,171,186, 42,157,115,236,189,210,250,162, 35, 71,143, 30,187,124, 99, 99, 19, 32, 36,148, 49,146, 7,221,109,
+189, 13, 32, 18,145,222, 88, 95,215,225,158,226, 13,133,167, 1, 4,125, 1,128, 52,205,188,179,206, 41,165,117,221,212,101, 89,
+ 22,139,249,108, 58,157,207,103,243,249,108, 62,155,149, 69, 81, 87, 85, 23,244, 69,132,136,210, 44, 63, 56, 30, 31,188,232,240,
+120,188,174,141,129,144, 24,178,231,182,196,109,211,157,165,219, 15,121, 44, 16,234,120,112,239, 1, 80,128, 33, 74, 72, 68, 64,
+ 27,221, 84,165,247, 94,155,196, 58,103,173, 45,203, 34, 72,104, 62,155,237,238,108,239,238,156,175,171,146,148,206,243,193,218,
+120,125,188,190,177, 54, 30,143,214,214,140, 54, 65,251,218,218,186, 45,178, 57,126,224, 37, 38,155,193,173, 5, 13, 14, 90,218,
+130,171, 34, 32, 12,157,117,129,160,128, 48, 47,230,115, 1, 49,206, 41,165, 93,176, 2,173,243,193, 64, 88, 80, 88,161,160, 82,
+151, 92,122,249,250,198, 38, 34,138,116, 80, 72, 0, 13,164,119, 10,233,103,148,241,242,218, 52,184,203,197, 64, 36,232, 16, 51,
+ 51,116,199, 1, 1, 1, 6,225,134,171,170,116,206,145, 82,109,218, 8, 74,169, 44,203,141, 49,195,209,232,224, 69,135,189,119,
+236,125, 49,219, 83, 90, 39,105, 14,128,126, 25, 82,246, 9,168,251,200,183,162,138,229, 10,119, 79, 0, 9, 18,114,204,109, 64,
+104,207,197, 2, 0, 64, 74, 23,211, 9,123,214, 38, 9,110,154,148, 66, 68, 34,149,164, 42, 73,210,248,102,189,243,222, 55,117,
+197,222,121,239, 4, 80,105,195, 33, 65,104,243,198, 86, 88, 33, 45, 8,248,208, 50, 61,111, 79, 12,241,202,186,107,148,120, 99,
+241, 47,165,244,112, 52,222, 62,119,118, 62,159, 17, 41, 99,140, 54,137, 54,154, 72, 41, 34, 36,138,241,140,148, 34, 34,165,188,
+ 55,228,157,243,174,169, 42,231, 26,239,189,214, 9,144,146,158, 24,226,121, 90, 52,210,123, 23,138,133,152,230,199, 3,121, 97,
+ 16, 92,250, 36,100, 17, 0, 6, 17,173,245,214,161,139,102,147,189,237,237,243,211, 73,131, 68, 74, 41, 99,140,210, 90, 41,173,
+181, 81, 74, 41,165,144,144,144, 32,184, 21, 84, 38,205, 72,107, 87,215,141,109,156,173,189,103,101, 18,164, 80,231,176, 72,155,
+194,248,136,127, 5, 55,193,204,177, 25,176,148, 80, 23, 52,218,144, 18, 62, 25,174,141,179,193,112, 62,155,237,108,159,155,236,
+238,122,239, 0, 64,107,163,147, 36, 49, 70, 27,163,181, 49, 73, 18,228, 68, 68, 65,199, 81, 27,131, 4, 72,210,212, 77, 89,120,
+103, 81,167,164, 84,168, 8, 34, 54, 23,235, 61,239,189,151,112, 32,239,156,244, 20,104,169, 73,237,213,117, 73,207, 96, 56,204,
+243,220, 93,236,131, 59,218,219,217,217,221, 62, 7,194, 20, 51,128, 36, 77, 51, 99, 18,109,140,214, 58,156, 44,160,181, 74, 39,
+ 0, 40,128, 77, 93, 88,219, 40,157, 2, 82, 43, 34, 27, 14,230,156,237, 73,104,229, 28,171,226,233, 78,217, 59, 89,150,229, 73,
+154,110, 30, 56,200,236,155,186, 46,138, 98,111,231,252, 98, 62, 91,204,103,218,152, 36, 73,141, 73, 76,146,104,181, 60,150, 0,
+ 42,147,104, 22, 22,168,171,185,243,172,116,186,132,181,157,245,206, 49,123,141,136, 31,252,171,247,115,235,162,187, 88, 14, 49,
+176,183,159,202, 74,156,239,157,125, 41, 87, 97,182,214,214,213,174,247, 14, 17, 16,149, 82,138, 20, 17, 41, 68, 68,192,232, 80,
+216, 59,103,157,109,172,173,149,206, 36,160, 36,236,189,247, 69, 89, 61,201,240,198, 80,155, 61,121, 14,115,219,109,183, 81,151,
+128, 62, 73, 30, 79,174,202,245,201,120,160, 39, 90, 74, 31, 57,114,228,218,107,175,189,230,154,107,182,182,182,180,214,204, 92,
+149,229,233, 51,167,239,191,255,254,187,238,186,107, 95,229,240,119,114,160,131, 7, 15, 62,231, 57,207,121,209,183,126,219,129,
+ 3, 7, 90, 60,179,107,107,180,217, 67,248,203,135,254,132,191,247,147,159,124,219,219,223,126,239, 39,239, 45,202,242, 11,121,
+160, 59,239,188,243, 57,207,125, 46, 2,177, 8,181, 9, 62, 42, 1,230, 80,190,161, 0, 17,117,213, 54,139,132, 96,249,180, 27,
+158,254,163,215, 93, 95, 85,133,179,205,187,222,245,174,183,189,253,183, 63, 31, 0,228,216,177, 99, 15, 63,252, 48, 0, 60,253,
+166,155,126,252,199,239,220, 58,120,168,115,140, 1,162, 5, 0,246, 30, 0, 4, 49,132,236,144,241,196,144,221,226, 84,241,216,
+ 74, 33, 34,123, 63,159, 77,188,107, 78, 62,242,200,157,175,251,169,201,100,242,196,205, 30,143, 30, 61,186,190,177,241,107,191,
+254, 22, 17, 65,164, 21,111,205,204, 32, 0,212, 6, 66,239,172,117, 1, 99,112,158,189, 99,105,193,134,246, 52, 73,146, 36, 73,
+170, 20,121,207,229, 98, 54,217,219, 81, 74,149,197,252,229, 63,244,138,201,116,250,132, 14,116,231, 79,188,238,121,255,244,203,
+ 16, 16, 8, 65, 4, 4, 25, 25, 4, 20, 41,207,236,156,107,154,198,218,198, 54, 54,132, 27,231, 67,247,204,119,232,105, 44,179,
+ 0,180, 49,195,225, 40,207, 7, 38, 73, 8,209, 57, 59,159, 77,207,159,125, 44, 31,140,108, 83,127,234, 83,247,189,238, 39,127,
+230,115, 30, 72, 7,144, 0, 16,132, 49,192,206,226, 69,105, 93, 59,103,235,186,105,234,186,170, 3,216,224,218,211, 4,248, 85,
+218, 68, 29, 98, 21, 75, 34,226, 51,207,194, 33, 99, 75,149, 22,129,166,105,118,206,157, 30,141,215,175,186,234, 41,191,248,166,
+ 55,188,236,229,255, 97, 95,247,246, 66,165, 70, 68, 98, 0, 36, 17, 6, 68,244,222,213, 77,211,180,104, 67, 93, 87, 77, 83, 7,
+164,148,157,227,160,195,171,249, 10, 34, 34,145, 49, 73,128,151,128, 80,107, 77, 72, 0, 50, 28,173, 77, 39,187,136,164,141, 1,
+128,215,253,196,143,189,227, 29,239,252,211, 63,123,247,103,118,140, 24,203,100, 16, 32,194, 98, 62,173,235, 58, 20,230,225,191,
+178, 88,148, 69, 89,151,101, 93, 85,117,211, 4,152,200, 59, 23,106, 74, 68, 12,233, 24, 17,133,212, 49, 73,146, 52, 73, 77,146,
+104, 99,180, 49, 73,146, 12, 6,163,251,239,253, 4,145, 34,165,148, 50, 95,251, 53, 95,243,253, 47,121,241,103,245,212, 24,209,
+148,166,174,156,231, 58, 96, 66,161, 52,174,171,186,174,109, 83,135, 20, 51, 8, 67, 27, 99,210, 52,201,178, 60,207, 7,163,209,
+218,120,188, 54, 30,143, 70,107,195,209,104, 56, 90, 27, 12,135,105,154, 26,173,187,188, 17, 16,179,124, 24,176, 34, 34,165,141,
+185,252,242,227, 47,123,233, 75, 62,163, 31, 98, 1, 68, 64,128,144,215,134, 12,215, 89,235,172,243,206,177,103, 1,192, 22,140,
+210, 70, 37, 38, 53,137, 49, 38, 73, 76,130,138, 98,112, 22, 80, 90,141,215,215,141,209, 1,110, 18, 97,103,173,179,150,217, 51,
+192,195, 15,222,127,249,149,215, 4,204, 67,233,228,240,197,151,124,251,183,126,243,175,252,218,111, 92,112, 32,137,247,222,186,
+ 31,232, 42,234,240,230,180, 49,169, 74,141, 49,249, 96,144,166, 89,146,166,198, 36,225,173,139,180,165, 58,251, 80,178, 25,173,
+ 91, 76, 80, 2, 6, 87,215, 85, 89,148,182,174, 31,123,248,129, 99, 87, 92, 77,132,236,145,136,180,210, 87, 95,115,205, 11,190,
+246,171,223,249,251,127,248, 56,158, 58,148, 97,161,236, 34,165, 66,197,131,136, 25,228,198,152, 44,203,178, 44,215,198,132,178,
+ 36,184, 39,137, 8, 78,112,153,168,141, 94, 91, 91, 99,111, 1,144, 69,172,117, 85, 85, 46,230,243,197, 98, 81, 22,243,178, 44,
+155,166,217,217, 62,127, 96,235, 96, 0, 97, 0, 73,107,115,235, 45,183,252,197, 95,190,239,252,246,206, 82,135, 58, 1,129,136,
+210, 38,203,178,225,112, 52, 94, 95,223,216, 56,112,232,208, 69, 71, 46,190,228,240,225,139,215, 55, 54, 77,154, 96, 27, 70, 4,
+ 64, 48,128, 87, 34, 34,164, 84, 62, 24,140,134, 57,123,199, 12,214,249,170,174, 23,139,197,108, 54,157,207,103,211,201,100, 58,
+157,150,139, 5,139,204,167,147,216,103, 67,164,240, 80,250,123, 94,252,157,253,156,140,186, 16,193, 0, 0,162,148, 78,211, 52,
+207,243,193,112,152, 15, 6, 90,155, 94, 5,210, 22, 72, 34, 32,128,128, 70,155, 60,207, 7, 89,162, 9,152,129, 25, 26,107,203,
+178, 92,204,230, 1, 27,153, 78, 38,179,233,116, 62,155,149,101, 33,194, 45,236, 20,204, 40, 20,192,138, 72,255,192, 75,254,237,
+138, 14, 33,132,231,134,218,183,211,159, 37,192, 26,143, 0,192, 32, 32, 64, 74, 37,198,128,176,136, 67, 2, 0, 29, 2,156,179,
+ 17,187,138,136,213,124, 62,155, 77,167,211,221, 98, 49,181, 77,169,116, 50, 28,173, 9, 11, 0, 70,164, 3, 17, 35,152,188,118,
+205,213, 87,222,251,169, 7,226,149, 9, 75, 56, 19, 68,104, 8, 68, 16,145, 5, 2, 98,194, 16,139, 88, 81,164, 7,131, 60, 75,
+ 20,161, 40,173,149,202, 88,200, 90, 91, 87,117,177,152, 47, 22,139,197,124, 54,157, 78, 38,147, 73,232,141, 78,247,118, 23,179,
+ 89, 89, 20,158,253,198,230,161,181,245,117, 36,140, 17, 27,219, 35, 17,145,210, 47,248,218,175,238,148, 90, 4, 33,194, 66, 61,
+ 4,164,189,197, 86,199, 16,178, 52, 83, 8, 44, 94,155,212, 7, 2, 71,136,116, 77, 99,109,235,217,171,170,172,202,170, 44, 23,
+243,249,124, 62, 43, 22,179,178,152,123,231,178,124,116,201,101,199, 34,192,184,191,223,130,136,164,117,114,235, 51,110,106,205,
+ 94,152, 1,151,118,223,254, 83,231, 5,136,212, 32,207,188,107,144,180, 66, 29,184, 36,117, 83,133, 48,215, 52,117,192, 24,171,
+186,174,203,178,138,144,231,188, 42, 22, 85, 85, 58,107,147, 44,187,228,210,203, 15,108, 29,236, 52,160,187,181,229,161,148, 58,
+241,236,103,253,159, 15,127, 92, 11,128, 48, 4,132, 10,160, 3,130,161,213, 96, 86, 74,229,121,238, 93,163,117, 2,136, 77, 99,
+155,186, 42,171,170,174,202,170,174,154, 64,247,171,235,186,170, 2,232, 89,150,101, 85, 22, 77, 93,214,117, 35,236,211,124,112,
+241, 37,151, 30,189,236,152, 49, 73, 64,128, 4, 98,158, 37,173,248,131,148,180, 78,218, 43, 19, 1,108,113,200,213,226, 20,145,
+178, 44,115,182,238, 78, 83, 87,101,224,100,149,101, 89, 85,101, 93,150, 85, 85,197,164,160,174, 26, 27,194, 78,197,236, 9, 49,
+ 93, 27, 31, 62,124,201, 37, 71, 47, 77,210, 52, 68,228,214,195, 0, 98, 43, 36,196,160,226, 20, 12, 36,128,101,192, 75, 71,205,
+140, 93,150,150,101,169,183, 13, 41, 37,136,206,186,186,174,138,162, 88, 44,102,101, 81, 44, 22,139, 98,177,168,170,170,174, 74,
+107,155,166,174, 3,183,206,218, 6, 0,146, 36, 93, 91,223,184,232,240,197, 7,182,182,148,214, 17,116,111,177,129,128,107, 2,
+ 66,139, 36, 64, 11, 17,131,142, 70,221,235,127,181, 23, 39, 74,105, 68,112,204,168, 52, 59,111,173,173,171,170,170,138, 98, 81,
+204,103,179,217,124, 90,204,231, 85, 85,133,208, 43,194,222,123, 68, 12,205,227,205,173,173,173,131,135,242,124,128,132,210,117,
+217,162, 51,139,102,182,132, 58,131,131, 9, 7, 10,210,193, 21,180, 3,186, 3, 53,117,141, 8, 33,117, 14,250, 91, 87, 85,192,
+134,103,147,189,197,124,110,109,195,204, 8,168,180,202,243, 65, 62, 24,142,199,235,235,155,155,163,209,154, 82,212,117,132,165,
+135,203, 45, 59, 90,109,171, 34, 98,119, 8, 81, 66,161,245,178,124,106,144, 21,162, 8, 59,219,144, 50, 2,145, 14, 24, 83, 86,
+102,239, 93, 83,215,129, 34,153,164,217, 96, 48, 92, 27,175,175,173,175,143,199,227, 60,207,145, 40,160, 28,242,184, 15, 8, 80,
+ 48,203, 10,128, 2, 32,216,139,246, 29, 2,212,126,162, 0,188,115,214, 58,197,162, 32, 9, 7, 1, 64,165,149, 49, 38,116, 26,
+ 72, 81,150, 15, 14, 29, 62,178,117,240,208,120, 60,214, 38, 9,183,206,192,125,140,188,197,198,187,232, 39,208,131, 49,165,223,
+ 52, 13,220, 22,110,213,120, 5,169, 66, 12, 30,143, 69, 11, 4,159, 0, 68,168,180, 78,179,108, 96,135,227,141,141, 36, 73,198,
+ 7,182, 46,190,248,210, 36, 77,187,206,172,172, 30, 69, 62,163,148,150,127, 66,104, 54, 8, 47,205,126,121,144,246, 84, 30,192,
+123,103,109,227,156,243, 70, 72,145,176, 32,146, 86,202, 36,201,112,180, 70, 72,118,173,210, 90, 11,123, 69,228, 34, 60,205, 33,
+212,180,121, 82, 7,101,237, 63, 13,175,170, 85,140, 39,129,143,212, 3,242, 96,121, 52,102,246,108, 27, 43, 0,158, 69,107, 67,
+ 68, 2, 66, 72, 33, 65, 83, 90,123,151,179,243, 77, 93,122,111,141, 73,181, 73,162, 98,244,181,119, 41,138,149, 83,197, 30,207,
+ 42, 90,216, 93, 89,204, 63,150, 54, 31, 58,122, 8,109,221, 35,194,172,180, 6, 64, 64, 8,229,169, 82, 74,140,241,161, 73,237,
+156,109, 42,219, 84,136,164,147,212,123, 23,120, 87, 43, 96,254,178,231,194,157,245, 69, 1, 44,139,152, 86,135,224,130, 43,235,
+ 58, 71, 77,211, 56,231, 60,167,218, 27,165, 20, 81,200,233,128,136,128,136, 72,177, 82,164,116, 56,150,247,206, 46, 26, 68, 34,
+109,218,118, 69,200,116, 99, 27,161,227,135, 68, 70, 78,175, 59, 20,117, 40,246, 17, 49,252,201,129,181,215, 38,109,146, 36,233,
+124, 62,183,182,177,206, 37, 73,162,141, 81, 20,187, 11, 49,205, 67, 36, 84,162,160,245,254,100,155,198, 57,203, 77, 77, 74, 35,
+233,246,174,160,109,253,116, 4, 49,232, 65, 40,194,177,135, 6, 26,132, 25, 56,164, 94,173, 6, 44, 33,106,147, 36, 73,146,206,
+166, 37, 55,181,109,154, 36, 73,149,209, 74,233,208, 87, 32,234, 60, 62, 16,169,144, 16,106,147, 8, 0, 55,117, 83, 23, 72, 10,
+ 64,145,210, 44,158, 91,121, 68, 87,198,221,221,197,223, 33,193,208, 18, 10, 81,216, 15,150,119,127, 12,134,195,178, 44,138,249,
+204,130,109,154,198, 24,163,181, 86, 58, 94, 31, 41, 69,136,225, 84, 1,114, 8,173,109, 49, 34, 34,214,214,222, 87, 74, 39, 72,
+ 90, 90,121,180,232,146,239, 14,215, 53,178, 58,142, 93, 84,106, 70, 70,193, 96,181, 32, 16,226, 63,145, 26,175,111,216,166, 89,
+204,103, 13, 87,181, 82, 74, 27,173,117,128,235,149,210,161,102, 13, 0, 65,204,235, 48, 20, 95,204,204,226,185, 41, 11, 32,210,
+ 38,237,105,115,255,112,220,181,210, 98,232,136,158, 99,213, 76, 97,233,186,197,152,100, 99,243,128,243,126, 62,221,243, 77, 13,
+ 0, 74,105,109,140, 49, 70,107,163, 77,144,150, 14, 77, 14,128,216,195, 65, 84,164, 52,105, 38,102,107, 43,103,173, 74, 50,136,
+ 30,101,213, 2,219, 94, 94,203,139,244,188,255,186, 96,217, 62, 11, 78, 33, 73,211,173,173, 45, 69,180,179,125,174,170,170, 0,
+119, 24,147,152,196, 24,157,104,163,181, 73,180,214, 74, 41, 34,133,132,225, 80, 72,138,148, 86,138,157,243,222, 85,174,176, 38,
+ 25,196, 11,235,122,104, 49,204,176,136,239,204,222, 71,151,136,109, 53, 4, 44, 93, 9,210,218,166, 54,201,198,129, 45,165,245,
+100,119,103,178,183,219, 84,101, 83, 87,164,148, 49, 38, 73, 50,147, 36,198, 36,161,109, 21, 46,177,205, 43, 8,149, 82, 70,123,
+175,197,214,101, 49, 53, 73,222,111, 48,118, 26,205, 62,132,142, 62,174,194,251,250, 65,253, 47,177, 0, 16,209,218,120, 61, 77,
+179,193,104, 52,157,236, 77,118,119,235,170,180, 77,221,212, 77,146, 36, 73, 26,143,165, 77,212,173, 8, 54,132, 67,105,237,189,
+231,166,168,188, 87, 38,139,161, 32, 52,207,186,126,226, 62,199,120, 97,135,234,194, 51,137,136,214,102,125,125, 51,207, 7,227,
+241,250,116, 58,157,236,109, 91, 91,135, 65, 5,147,166, 38, 73,147, 36,209,218,104,173, 66,219, 69, 68, 0, 9, 73,147,242,164,
+ 77, 83, 21,236, 25,149,105,155,192, 45, 30,231,125,239, 64, 43,241, 21, 86, 78,214,217, 97,123,160,224, 63,148,210,131,225, 90,
+154,229,107,227,241,116,111,111, 58,217,109,108, 19,102, 61,216,123, 99,156,211, 90,107, 67,138,176,197,123, 66, 51,146,148,169,
+203,133, 74, 6, 2,200, 34, 1,165, 12,210,106,205,190, 45, 89,247, 55,203, 58, 70,193,227,228, 15,209, 84, 17, 41, 77,179, 3,
+ 91, 7,179,124, 48,217,219, 13,249, 53, 51,123,159, 24,147, 8,115,128,177, 48,204,109, 0, 34, 42, 34,141,164,170, 98,106,210,
+ 97,119, 99,161,197, 8, 0,250,209,147, 39,185, 77,113,165,107,146,245,187,102,189,191, 59, 26,194,210, 22,151, 22,201,222,115,
+224, 27,137, 48, 34,117,158,179,141, 51, 8, 16,179, 77,231,172,107,106,129,109, 82, 42,176,181,132,125, 24, 10,193,219,110,187,
+109,119,119,119,111,111,239,201,214, 22,250,255,251, 16,145,141,141,141,205,205, 77, 13, 0,147,201,228,145, 71, 30,249, 7,161,
+ 92, 72,242,220,220,220,164,127, 16,196,223,179,118,226, 63, 8,232,239,217, 67,255,237, 95, 98,109,109,237,196,137, 19,215,223,
+112,195, 77, 55,221,116,248,240,225,214,126,187, 0, 20,129, 38,110, 17,185,182,250,216,151,117, 8,123,255,137, 79,124,226,222,
+123,239,189,247,190,251, 62,252,225,143, 88,107,255,158, 9,136,136,190,252,246,219,191,248, 75,190,228,154,167, 92,115,232,208,
+161,124,144, 67,108,175,116,144, 83,139,169,244,249, 41,109,228, 85, 72, 65, 50, 4, 0, 34, 10,128, 85,247, 77, 17, 34,186,245,
+153,255,248,150, 91,159,233,156, 67,132, 48, 28,226,217, 79, 39,147, 83,167, 78, 63,244,224,131, 31,248,224, 7,239,250,232,221,
+ 79, 34, 1, 29, 63,126,252, 25,207,120,198, 55,191,232, 69, 71, 46,190, 56,240,255,100, 95, 36,140,125,195, 8,248,139, 72, 44,
+ 53, 64, 16, 16, 65, 32,212,105,128,161,251,213, 1, 24, 65,120,212,125,220,149,166, 32,128,160, 52,133,239, 81, 58, 3,132,124,
+ 48, 62,116,228,232,211,110,184,241,246,231, 63,223, 57, 11, 34,206,186,143,220,245,145, 63,127,247,123,238,255,212,253, 79,164,
+169,252,133, 20,208,209,163, 71, 95,121,199,171,110,190,249,230,144, 43,198,126, 24,119,229, 59, 68, 8, 64, 68,136,128,133, 48,
+112,170, 25,145, 90,182, 18, 32,138,239,120,147,203,249, 21,150, 94, 49,182, 10, 59, 46,197, 22,236, 17,145, 8, 49,176,178, 66,
+194,171,181, 73,210, 60, 52,234,155,186,186,241,233, 55,221,120,195,141, 72, 36,236,157,119,127,252,199,255,243,119,255,219, 59,
+246,119, 7,190, 32,193,254, 57,207,121, 78, 85, 85, 95,247,245, 47,188,245,214,103,142, 55,198,194,208, 94, 58, 6, 78,188,136,
+ 32,196,191, 58, 90, 1, 17, 17, 97,236,198, 44,105,137, 29, 87,146, 59,190,195,146, 31, 34,125,210,105,132,196,161,195,173,123,
+192, 48, 96, 72,185,149,210, 74,235, 68,107,173,141, 86,164,144, 66,221, 9,222,123,231,154,166,170, 23,139, 89, 85, 46,178, 60,
+ 15,229,134,115,238,204,153,211,239,126,247,123,254,228, 79,255,252,111, 47,154, 99,199,142, 29, 63,126, 28, 79,156, 56,241,149,
+ 95,245,207,110,255,138,219, 91,233, 35,196, 62, 86, 44, 96,161,237,145,176,103, 34, 36,165,195,164,167,247, 28, 89,135,206,133,
+ 25,205,254,124, 23,183, 53,205,178,106, 95, 82,163,151,101, 84, 31, 22,235,154,226,208,182,218,147, 36, 77,210, 88, 6,107,109,
+ 66,177, 16,250, 54, 44,226,157,107,154,186, 42,139,233,100,215,214,229,112,109, 61,136,222, 59, 7, 34,101, 81,188,243,247,127,
+255, 47,254,242,125,206,185,191,141,128,116, 11,229, 43, 22, 9, 77, 16, 68, 1, 17, 20,144, 80,176, 80,160,247,121, 36,242, 44,
+141,173, 2,217,144,189,111,201, 31, 97, 10,198,245, 20,200,119,152, 70, 31, 76,236, 66,216,190,218, 15,164,215, 85,128, 88,177,
+ 73,146,232, 14,239, 19, 16, 16, 4, 8,253, 89, 36, 2, 17,214, 90,105, 29,112,160,249,108,178,187,125, 62, 31, 12,179, 60, 71,
+ 64, 47,146, 15, 71,223,240, 13,223,248,207, 95,248, 66,219, 84,191,244,203,191,114,207,231, 59,178,164,187, 99, 17,182,238, 52,
+152,151, 8,130, 32, 98, 89, 22, 97, 66, 40,216, 76, 39,148,118,182,220,133,143, 34,199,183,141,220,251,197,209,135, 6,162,162,
+194, 42, 55, 64,176, 69,223, 0, 81,136, 16, 16, 9, 9, 81, 17, 17, 97,176,183,128,242, 68, 1, 49, 7, 12, 42,128, 54,158,253,
+246,185,179,117, 85,109, 28,216, 2,239, 24,192, 32,122, 79,128,244,221, 47,254, 46,231,236,221, 31,251,216,175,190,249, 45,159,
+175,147,198,182, 93, 21, 0, 66, 9, 51, 66,182, 44, 75,223, 18,167, 60, 7,177, 4,197,105, 5, 20, 63,115,113,134,255, 2,227,
+233, 58,188,203, 10,167, 67,138,130,211,111, 17, 92,192,229, 28,143,214, 42, 73,211,196, 36,105,154,166,105,150, 36, 75,176,137,
+ 58, 43, 99, 6, 0,142,228,109,109, 76, 58, 24,142,118,206,157,157,207,167,151, 94,126, 37, 88,203, 4, 42,254, 40, 68,196, 27,
+111,184,225,231,126,230, 39,239,185,231,158,223,248,205,183,149, 85,245,255, 28,197,164, 11,200, 0, 68,196,222,213,117,237, 89,
+122,147,158, 29, 9,123,169, 56,206,187,192,240,237, 28,112, 80,132,150,170, 28,116,147,144,144, 72,117, 84, 30, 34, 12,138, 16,
+160, 16,236, 30, 81,125,227, 0, 76,146,164,105,154,182,216, 96,252,230,208, 13,245,237,220, 65, 60, 19,251, 0,176, 41,109,118,
+182,207,231,131,225,230,129,131,200, 32, 8,164,128, 1, 8, 64, 35,122,239,175,189,246,139,126,244, 53,175,124,232,193,135,222,
+252,150,223,124,220,129,173,199,157,223,138, 13,171, 8, 47, 3, 9,179,243,190, 29,190,135, 14, 34,141,142, 57,254,118,158,125,
+108, 79, 34,118, 40, 98,136,203,154,148,210,129,175,172, 84,176,141, 22, 52, 38, 2, 4, 66,138,169,210, 10,109,163,103,142, 68,
+148, 36, 38,207,115, 69, 74, 80, 98,107, 24,164,195, 70,173, 13,252,128, 58,126, 80, 55,214, 90,231,157,247,238,129,123, 63,241,
+180,167,223,154,102, 89,152, 16, 32,138, 93, 72,165, 16, 0,156,133,203,143, 31,191,227, 21, 63,244,192,253,247,255,242,175,190,
+229, 9,106, 80,200,244, 66,110, 39,125,142, 1, 34,119,126, 42,186, 40, 34, 98, 82,164, 16, 41,208, 68,144, 66, 84, 14,248,121,
+196,171,149, 86,132,132,109, 55, 23, 87,166,122,122,238,136, 65,176,157,159,138,226, 38,173, 85,154,101,105,150, 18, 2,179, 13,
+ 57,168,180, 83, 66, 45, 79, 62,200,167, 14,195, 55,145,138, 86, 85,214,218,233,222,238,223,220,253,215,215, 94,127,115,154,229,
+ 24,232, 67,136, 68,196, 44,132, 74,105, 64, 68, 7,120,197, 85, 87,189,230,142, 31,126,231,239,189,235,195,119,221,253, 57, 4,
+ 36, 0,204,136, 40,216,182,199,137,148, 54,128, 68,129, 66,163,156,247, 74,155,174,128, 10,178,164, 72,141, 10, 19, 0, 33, 6,
+ 99,244, 98, 75,127,220, 57,108, 12, 91, 15,130, 52, 36, 82,107,130,228,130,228, 67,199,196, 36,137,209, 10,132,197, 89, 7, 81,
+190,145,206, 26, 66,166,181, 77,171, 63, 77, 59,189, 86,182,252,129,166,174, 5, 96,178,183,187,125,254,220,225, 35,151, 40, 29,
+ 3, 17, 18,130, 32, 18, 18,144,136, 34, 37, 0, 96, 18,252,186, 23,188,224, 43,190,252,121, 63,247,198, 95,170,235,230,241, 5,
+ 20, 69, 18, 38, 73, 66,159, 12, 65, 32,178,255,148, 82, 34,105, 32,238,247, 32, 79,192,158,223, 13,201, 53, 6,122, 6,153,118,
+ 70, 93, 0, 0, 11,198, 73, 68, 65, 84,246,184, 25,136,253, 97,182,158,116, 36,230,162, 24,205, 83,107, 77, 20,148, 55,228,158,
+ 81,110,204,194,226,195,102,151,200,204,179,214, 89,219,116,195,125,113,158,110, 81,149, 69, 81, 20,101, 49, 15,155,168,180, 49,
+ 77, 93,123,231, 72,169,158,110,162,244, 88, 65,136, 18, 24,121,131,209,248,101, 63,240,189,111,125,251,127,125,224,161, 79, 63,
+174, 15, 10,195,126,193,210, 34,169, 33,188,215, 72, 17, 1, 1, 65,173, 85,152,236,108,195,157,136, 96,219,151,141,211, 94,130,
+ 93,217, 26, 97,229,182,122,141, 76, 4, 36,210,237,233,226,108, 71, 60, 58,183,236, 55, 98, 17, 8,219, 27,218,141, 55, 62,144,
+128,227,170, 26,219,216,198,134,209,190,192,202,169,138,170,172,234,170,168,170,210,214,165,117, 22, 17,179,124,148,164,169, 0,
+ 98,119, 38,192, 46, 8,133, 68, 66, 4, 73, 72, 68, 17,137, 50,233,191,252, 23,223,120,247,221, 31,127,231, 31,252,247,199,247,
+ 65,220, 50, 79, 0,195, 96, 18, 0, 50, 0,114,156,119, 13, 4,162, 37, 21,140,121,105, 67, 32, 32,216,249,146,126,237, 26, 24,
+101, 33, 90,117,205, 60,223, 94, 34, 9, 98,219,161, 16,241,178, 28,164,106,183, 79,133,209,111,239,156, 13,203,169,218,237, 59,
+ 77, 83,135,137,228,170, 42,155,186,170,235,202,214,181,109, 42,231, 29,138,100,195,209,198,129,131,227,245, 13,173, 53, 68,174,
+ 24, 70, 14, 51,198,207,163,188,144, 0, 37, 68, 85, 17,121,218,117, 79, 77,179,244,119,223,241, 7, 93,254,173,151,252, 59,233,
+184, 59,128,192, 0, 24, 10,112, 64, 16, 22,196,104, 25,161, 72, 7,224,110,138, 38, 26, 29, 47, 53, 6, 0, 34, 41, 87, 17, 0,
+ 8,123, 16, 70, 82,161,151, 32,164,195, 55,249,174, 28,241,203, 89,169,229, 7,109,206, 21,213,198, 6,227,138,206,167,174,235,
+166,142,220, 50,103, 27,219,212, 97,172, 73,145,202,135,195, 67,135, 46, 62,112,232,162, 60, 31, 42,173, 58,114, 18, 17,120,223,
+ 86, 83, 75,122, 82, 40,177,163,185, 49,169, 43,143, 31,255,142,111,251,166, 95,252, 79,191, 22, 57, 12,157, 27,229,168, 58, 45,
+125, 9, 56,128, 23,216,242,207, 66, 56,235, 13,174, 71,231,139, 75,239,133, 65, 42, 70,107, 68, 96,118, 0,140,168,208, 36,145,
+ 66, 17,106, 88,207, 18, 50,114,207,222, 89,191,172,235,186, 81, 55,142,217,103,107, 89,174,167, 62,145,235,110,173,179,181,181,
+214,219, 38,164,169,138, 84,146,165,195,181,241,214,193,195, 7,182,182,242,193, 0,145, 32,188, 49, 1,137,221,107,132, 56,109,
+ 29, 75, 41, 89,114, 39, 41,148,128,172,120,109,109,252,157,255,234,155,255,244, 61,239,147, 48,174, 9,171, 60,129, 96, 41, 24,
+181, 34,124, 17,123,233,113,164,171,181,150, 7, 44, 28,124,139, 54,218, 40, 37,194,236, 29,144, 82,202, 32, 82, 28,200,228, 94,
+150, 25, 31,182,151,119, 46, 21,198,123, 27, 63,183,182,245,203,157, 6, 53, 65, 82, 97,135, 95, 24, 73, 8,180,171, 52, 27, 12,
+ 71,163,241,250,230,230,230,214,104, 60, 54,198, 32, 96,104, 16,183,212,185, 96, 17, 34,203, 17,111,145,125,209, 38, 66, 58, 68,
+ 74,175,141,215,111,249, 71, 55,157, 60,117, 70,183, 62,180,125,243,193,169,162,112, 12, 57, 24,233,166,130,209,126, 91,186,125,
+155,215,133, 24,100,140,214,204,206,251, 6, 81, 41,147, 32,146,136,184, 78, 43,194,123,116,237, 62,133, 32, 32,231, 93, 55,245,
+103,109, 40,232, 98,229, 27,191,182,116,207,221, 30,177, 80,177,135, 58, 67, 41,157,228, 73,150, 15,198,235,155,235, 27,155,163,
+181,145, 49, 9, 17,245, 97, 38,236,200, 37,128, 61, 72,165,155,227,107,249,214,216, 18,240,162, 58, 81, 75,198, 91, 42, 9, 75,
+112,203, 81,153,184, 83,150, 46,143, 89,202, 17, 25, 17, 68, 80,107,149, 36, 9,162, 56, 87,135, 9,133, 16,156,124,251, 94,163,
+101,216,166,117, 35,193, 58,130,207,109, 58,117,242,173, 77,113,171, 81, 1, 48,241,109,221,215,173,166, 0, 0,165,117,162, 77,
+146,102,195,193,112, 52, 30,175,173,141,179,124, 16,136,231, 29, 23,105,201,168,235,100, 33,203, 65,198,150,132,222,149,139, 45,
+ 79, 57, 40, 20, 34, 80, 28,176, 91, 58,105,230,142,242, 26,129, 32,232, 49,183, 17,187,118, 56, 4,150, 5, 17,133,156, 57, 96,
+122,132, 10, 73,181, 83, 66, 62,184,143, 54,103,169,235,166,177,117, 29, 92, 72,240, 35, 77,211,116,170,225, 90,213,104,107,153,
+184,242, 38,210, 65, 36, 44,163, 82,164,148,209, 58,201,210,124, 48, 28, 14, 70,249,112,152,231, 3, 99,140, 82,203,249,168, 37,
+185,160,243, 27, 45, 8, 37, 75,106,254,146, 29,222, 1, 10, 75, 48, 50, 74,106, 69,131,218,111, 71, 89,146,190,123,195,227,161,
+ 30, 16, 94,122,159, 64, 18, 52, 90, 57,215,120,231,136, 72, 16, 88, 4,188, 23,145, 40,157,232, 77,227,190,146,118, 67, 71, 21,
+184,186,117, 93, 91,107,131,130, 4,120, 13,162, 41,192,178,200, 71,212,202, 40,173,147, 36, 73,210, 52,207, 6,217, 96, 48, 24,
+ 12,146, 36, 53, 70,135, 42,151,133, 81, 96, 21, 85,105,149,190, 7, 86, 10, 64, 88,177,213, 50,224, 90, 22, 27,244,152,247, 45,
+220, 27, 81,176, 94,152,151, 62, 47,144, 35,160, 8, 45,213, 7, 59,133,100, 14,101, 13, 4,216,193,218,198,217,166,205, 41, 56,
+ 88, 96,240,188, 54,228,117,182, 53,172, 88, 87, 86, 85, 89,150,101, 89, 85, 69, 93,215,174,169, 3,126, 20, 23, 32, 40, 29, 65,
+ 31, 82, 58, 73, 76,192, 58,178, 44, 44,119, 9, 11, 10, 21,169,128, 86, 49, 95, 64,251, 90,150,187, 43, 4,205,152,183,181, 84,
+186, 30, 65,178, 75,145,151,210,234, 91,221,190,106,126,255, 50,137,248, 83, 49,228,202, 75,220,143, 69, 66, 9,194,206,217,166,
+246,236, 1, 64, 9, 16, 49, 32, 5,196,154,195,186, 46,137,236,181,200,245,143,179, 26, 68,161, 36,119, 54,140, 97,135,141, 6,
+121,158,167,249, 32,203,226,106,172, 52, 77,181, 49, 97,190, 7,169, 55,185, 28,192,236,149, 55,198,171,108,157,222, 34,138,110,
+ 5, 71,252, 23,232,129, 84,189,192,125,129,128, 59, 93, 90,209, 32, 94,142, 74, 8,180,201, 38, 4,141,236,125, 1, 99,233, 40,
+206,219,166,105,152, 61, 18, 49,139, 82, 10, 73,245, 41,163, 8, 64, 24,214,108,153,214, 65, 4,129, 51,139, 35,132, 36, 73,144,
+104, 48, 92, 91, 95,223, 24,141,199,249, 96, 96,180, 9, 56, 81, 40,111, 90, 64, 82,194,152,220, 5, 32,246,138, 46,244,160,186,
+ 62, 19,122, 73, 5,231,142, 88,212, 49, 54,185, 99, 34,247,189, 58,119,185,229,138, 6,245, 10,240, 40, 42, 89,146,116, 4, 91,
+242,126,200,170,187,218,136,217, 67, 88,118, 20, 55, 13, 80, 75, 55, 14, 67, 94,164,148, 2, 17, 48, 9, 66, 28,122, 51,218,100,
+ 89,106,109, 13, 44, 74,171,192,255, 30, 12,135,198, 36, 29, 84,184,140, 50, 45, 88,213, 49, 5, 87,109,106,229,157,237,163,104,
+239,223, 3,176,106,131, 32,251,168, 79,157, 24,177,207,224,214, 29,127,140,151, 93,209,149,190, 96,175,245, 25,171, 48,239, 37,
+154,152,181,129,248, 27,141, 39,206,242,199, 49,194, 86,101, 34, 37, 15, 49,178,209,125,150,229,126, 24,234,172, 88,214,249,166,
+ 42,132,147,148,148, 10,184,124,139,139,131,244,169,213,189,165, 2,171, 28,254,207, 70,245,234,217, 28,195,231, 32,148, 75,183,
+158,177, 51, 69,221, 25, 5,243,138,137, 45,185, 93, 75,161,197,111,195,152,150, 6, 88,207, 5,183, 78, 20, 40,185,113,223, 65,
+155, 83, 66,151, 76, 18,162,136,104,173, 89, 12,175, 48,113,227, 62, 22,107, 27,104, 98,197, 79, 68,136, 42, 20, 77,225,115,110,
+217,140,125,244,177, 93,119,246, 56, 12, 84,238, 8,219,221,187,223,207,110,135,199,213,184,190,243, 94,201,131, 62,131, 68, 58,
+155,195,126,218, 9, 34, 0,132, 68,204,236,108, 35, 65, 83,108,196, 90, 41,190, 67,236,101,241, 24, 90, 17, 8,130,130,138,116,
+139,151, 45,199,187, 91,169,113, 59,108,237,132, 25, 80, 16, 9, 81, 5, 28, 39, 24, 44,175,188,149,214, 11,115, 39,177,229,222,
+170,126,115,165,123, 90, 59, 16,192,253,225,247,238, 69, 65, 86,154, 83, 49, 15,138, 49, 7, 87, 68,211, 73,168,243, 88, 93,132,
+107, 81, 71,173,181,137,252,113,142,195,190, 74, 41,165,116, 23,180,250,120,124, 91,248, 4,164,140, 0, 5, 5, 69,129, 8,129,
+112,219,203, 97,234, 52, 43,182,115,152,165, 9,192,147, 5, 64,162,112, 55, 1,141,235, 20,135,123,241,234,194,225,131,246, 61,
+119,211, 36, 75,170,125,123, 69,220, 13, 5,112,140,233,210,243, 65,237,172, 69,175,139,119, 33, 99, 99,191,118, 33, 82,146,166,
+109,189,105,189,231, 22,192,215, 42, 12,189,168, 0, 93, 35,117,104, 44, 46, 25,241,171,172, 72, 12,123,117, 3,172,200,204,136,
+ 28, 9,215, 20,185,176, 97,143, 17, 91,219,210,214, 81, 41,141,168,186,112,183,127, 83, 11,175,204,180,180, 2, 1,190,112,148,
+164,219,124,217, 77,229, 74, 79,131,186,103, 96,155, 69, 75, 15, 78, 95,186, 18,108, 65,159, 56,169, 28,223,100,154,231, 0,176,
+ 88,204,156, 43,157,115, 17,107, 33,213, 53,118,130,247,198,182,231, 19,161, 5,164,182, 75,216, 45,219,235,117, 20, 17, 16, 72,
+132,195,119, 49,162, 66,194, 72, 2,247, 1, 44, 97,246,222, 54,225,109, 40,147, 16,169, 94,163,191, 93, 81,215,115,207, 93, 6,
+ 2,113, 12,170, 91,227, 41,126,149,220,222, 45,243,130,222,150, 60, 94, 78,181,244, 93,116, 79, 97,160,191,243,177, 99,232,138,
+ 32, 96,146,102,168,148,214,166, 88,204,171,170,242,206,177,212, 97,106, 98,201,209, 32, 21,210, 68, 84,138, 90,157, 10, 13,179,
+168, 87,203,113,139,190,106,181,113, 1,137, 0, 65, 35, 32, 33, 19,162,243,158,188,247, 32, 1, 46,104, 0, 17, 73, 19, 82,200,
+ 87, 47,200, 26,165,219, 35,219, 55, 40,238, 51, 44,186,177,132,118,140,108,213, 7, 45,233,245, 61,161,244, 51,207,149, 32, 7,
+176,210, 73, 22,173,244, 96, 56,210,218,152,164, 40, 22,243,186,170,172,109, 68,154,184,136, 32,136, 2, 85,235,155,218,212, 58,
+238,222,162,214,175,183, 61,179, 22,160,109, 89,223,189,208,213, 54, 37, 1, 9, 0, 61, 32, 1,178,247,222, 91,182, 54,142, 28,
+144, 38,165,151,140,105,142,227,142, 75, 91,107,199,105,132,187,249,173, 56, 6,212,114, 9,188,244,125, 80,231,151, 0, 97, 9,
+ 46, 7, 72, 8, 99,153,218,161,101, 1,141, 70, 4, 94,253,119, 68, 52, 73, 26, 38,221,170, 69,177, 40, 22, 85, 85,218,166,182,
+ 77,195,221,202,227,214,143, 99, 59,118,210,174, 76,136,146,194,158,176, 66,131, 30, 3,140,133, 43,236,159, 16, 55,149,214,128,
+ 8, 30,176,221, 76,224,189,243,182,113, 82, 11,160,210, 9, 41,213, 91,132,210,250,151, 22, 57, 89,142,215,200, 50,139,232,207,
+217,244,157,180, 95,118, 32,122,230, 35,176,132, 14,250,176, 64,111,190, 82, 86,225, 2, 65,196, 36, 73,181,210,249,112,216, 52,
+ 77,177,152, 47, 22,243,186, 44, 27,219, 44,215, 1,199,236, 6, 91,225,232,118,168, 94, 71, 40, 59,184,246, 96,140,234,113, 67,
+ 97,204, 56, 66, 49,195,200,180,236, 91,160,247, 14,216, 55,213, 28,144, 72, 27,165,140,180,100, 36,217, 55, 75, 19,215,128, 44,
+195, 26, 47,247, 10,175,104, 16,203,202, 82,195, 85,212,109,245, 11,242,120,214,118,161,241,145, 82,105,150,153, 36, 25,141,215,
+109,211, 84, 85, 89, 44,230, 85, 89, 52,117, 99,157,101,239,156, 11,153,116,112, 68, 49, 63, 80,237,148, 78,224, 79,133,228,179,
+ 83,173, 24,230, 90, 81,117, 59,189, 34,229,138, 64, 84,232, 41,160, 19, 12, 37,145,179, 53,145, 38,149,132, 5, 40,189,133,125,
+ 75,103,180,178, 20,143,123, 4,149,190,128,186,137,141,254,123, 70,196, 54,195,142,195, 64, 1,235,237,125, 9, 91, 82, 98,175,
+ 64,234, 75, 11,128, 72,165, 89,106, 18, 51, 26,173, 49,123,107,109, 85, 85,101, 48,192,186,113, 46, 96,207,214, 54, 77,103, 95,
+173,164,150, 10,165,180, 34,165, 58, 49,133, 40,216, 75, 16, 90,240,129, 84,104,196,171,200, 5, 67, 17,112,174,225,166, 18, 80,
+ 73,146, 9, 66,107, 81,113, 14,170,167, 80, 97,189, 33,123,246,226,125, 55,187,218,213,223,188, 47,116, 44,185,187, 43, 62,121,
+165,124,238, 42, 93,150,213, 58, 69, 86,212,109,185,247, 82,169, 4,201, 36,201,104,180, 22,122, 27, 97,160,186,174,235,248, 63,
+ 37, 9,211,178,206,161,237,100, 21, 54, 3,234,182,226, 11,117, 11,182,179, 96,221, 4,100,191, 0, 84, 68, 34,162, 69,117, 25,
+143, 19, 87,151,174, 38, 74,148, 73,226, 40,244,234,108, 38,199, 21,239, 62,174, 97, 92,241, 65, 97, 49,102,251, 30, 47,100, 55,
+ 1,226, 62, 59,234,131, 68,203,116,251,130, 89,156,149,165,118,251, 6,229, 16,148,210,131,225, 48,207, 7,204,236,156, 13, 3,
+232, 85,232, 2,218,166,219,141, 78,138,108,204,168,116,183,225,174,157,197,108, 19,171,150, 20,223, 70,141,208,132, 87,162, 64,
+ 4, 84,248,119, 91, 91,187,112,174, 65,101, 8,169,183, 21,169,219,180, 24,247,155,178,247,225,206,117,196,124,150, 21, 62, 66,
+ 95,151,250, 0,230, 74,117,182, 34, 23,232,117, 16, 87, 8, 45,112,193,175,253,131, 96,221,118, 5,212,198, 40,173,211, 44, 31,
+250,246,255,148, 17, 87, 57, 55,129,220,202,236,208, 57,165,136, 72,183, 99, 86,145,103,212,149,126,173,255,110,253, 40, 41, 18,
+ 17,165, 68,132,148, 48, 51, 48,187,166,244, 82,106,147, 19, 81,111,176,143,133,189,116, 20, 66, 31, 9, 71,120,219,109,183,201,
+ 5, 20,232, 39,195,164,205,147,228, 24,255, 23,101,110,253,130,218,250, 28,224, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/fill.png.c b/source/blender/editors/datafiles/fill.png.c
new file mode 100644
index 00000000000..010cd5ca278
--- /dev/null
+++ b/source/blender/editors/datafiles/fill.png.c
@@ -0,0 +1,534 @@
+/* DataToC output of file <fill_png> */
+
+int datatoc_fill_png_size= 16892;
+char datatoc_fill_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0,
+ 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,252, 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0,
+ 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,
+116, 73, 77, 69, 7,218, 7, 19, 0, 34, 12, 33,249,187,131, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236,188,119,144,101,217,121,
+ 31,118,206,185,231,230,252, 82,231,158,188,121, 54, 47, 22, 27,176,136, 4, 68,144, 4, 8,154,169,192,146,138,182, 44,148,196,
+114,209, 42,209,170,146, 44,217,170,178,252,135,139,150,108, 73,150, 92,101,131,162, 77,194, 4,109, 70,145, 6, 72, 0,139,184,
+187,216, 93,108,158,217,221,217,137,221,211,233,245,235,151,110, 78, 39,250,143,251,122, 22, 18, 19, 68,211, 37,200,165, 91, 83,
+ 93,175,167, 95,223, 62,247,203,223,239,247,125, 15, 62,245,212, 83,224,207,188,254,141, 55,253,200, 71, 30,251,163,239,193,183,
+ 94,237, 92,121,249, 11,159,251,236,169,179,235,255,248, 31,253,195, 34, 26, 29,238,110,255,214,175, 63,253,203, 95,122, 6, 0,
+128,165,148, 47,125,229,127, 91, 61,115,255, 23, 63,247,191, 62,242,196,131,253, 19,231,155, 50,221,187,113,245, 11,191,243,204,
+ 7, 63,252,240,223,250,175,255,230, 91, 47,189,128,164,148, 27,183, 63,242,135,191,246,217,251,223,115,239,218,109,143, 50, 90,
+ 15,175, 95,252,195,223,123,238,135, 63,245,254, 39,127,248, 39, 38,251,215,176,138,149,141,205, 77,191, 25,158, 58,187,126,242,
+252, 7,234, 50, 74, 71, 55, 76,215,123,224,145,187, 79,221,251,100,124,120, 37,141,162,167,191,248, 2,134, 16,186,174,125,238,
+225,143, 54, 69, 68,171, 20, 0,168, 96, 13, 2, 36, 57,141, 39,163,195,253,241, 97,148, 33, 0,192,195, 31,250,161, 38,159,113,
+ 82,125,251, 43, 95,129,138, 34, 57, 91, 58,253,192,222,229, 23, 9,161,191,242,175,158,249,153,159,254, 48, 2, 82, 82, 82,209,
+166,186,250,198,119, 46,191,117,243, 91, 79,191, 40,165,216,190,248,117, 70,217,231,127,245, 75, 31,127,252,252,131, 31,252, 17,
+ 4, 0, 32,101, 66,203,248, 43, 95,124,225, 61, 79,158,255,201,207,252,117,172,234,164, 33,219,215,246,128,148, 63,240, 35, 31,
+209, 77, 15, 1, 0,104, 93,188,240,205,231,187, 61,239,222, 71,159, 16,156,206, 70,251,117, 89,125,238,247,158,251,212,143,127,
+112,233,204, 67, 55,223,252, 6, 2, 0, 84, 69,124,225,181, 43,247, 61,124, 7, 84,240,246,197,103, 73, 67,126,237, 87,191,252,
+241, 39,206,223,247,196, 71, 56,169, 47,188,244, 38,252,158,116,247,189, 92,112,161,184,171, 47, 95,126,233, 43,219,215,246, 30,
+121,223,163,154,233,214,197,252,139,191,241,229,171, 55, 71,159,255,234,183, 1, 0,240,202,107, 95,242,186,155, 47,127,229,255,
+204,210,226,125,159,248,116,157, 71,180, 78,127,245,127,250,101,203, 54,222,255,177,247,134, 75, 27,207,124,233,105,236,247, 79,
+188,245,220,239,102,105,254,161,255,232, 63, 41,179,153, 20,244, 55,126,233,215,188,192,249,209,191,252,147,118,184,118,241,185,
+ 47,178,134,225,209,245,151,247,182, 14, 63,244, 99,159,174,138,185, 96,205,107,207,124,237,147,159,254, 4,169, 50,127,112,250,
+202, 75, 95, 98,132,125,241,249,139,202,131,167,150,223,251,161,167,116,203,101, 77,245,198,183,191,126,199, 3,247, 67, 41,156,
+112,121,120,253, 85,210,208,127,241, 47,255,239, 31,249,192,131,232,236,237,155,225,202, 57, 82,101,243,225,181,213,181, 37,193,
+ 40, 68,184,204,102,148,210, 23,190,245,218,221,235,131, 31,248,177, 79,161, 51,247, 63,149,207,135,164, 46,126,235, 87,191,248,
+250, 43,239,236, 94,187,230,247, 55,179,249, 52,137,178, 23,223,222,254,196, 79,125,196, 27,156,194,101,114, 36, 56,123,249, 91,
+207,234,134,246,193,143,255,128,219,223,220,121,243, 89, 74,217,191,248,229, 47,126,250,147,239, 59,243,224, 71,162,253,203,136,
+214,121,149,207, 95,121,241,210,195,143,223, 99,249, 75,195,171, 47, 17, 66,159,125,250,229, 7, 79,175, 62,254, 3, 31, 69, 72,
+121,254,171, 95, 69, 77,149,191,244,236,107,157,190,127,238,158,251,164,160,121,146,205,167,201,119,222,185,249,177, 79,190,207,
+235,111,190,254,245,223,110,106, 2,254,162,116,135,255,232,127,253,230,231,254,249, 3,247,221, 61,222,125,251,237,215,222,137,
+102,137,162,192,222,160, 23,158, 60,183,236,163,166,169,154,170, 46,242,234,127,252,236,239,124,243,165,183,254,152, 27,189,231,
+161,123,255,241, 63,248, 27,103,238,125,146, 81,114,225, 91,191,255,213,223,254,191, 44,219,188,253,158, 51, 27,119, 62, 42, 24,
+163, 77,201,105,205,104, 61, 58, 56,124,225,155,175, 29, 77,146,135, 79,109,126,236, 61,247,218,142,249,243,255,221,191, 92,220,
+ 72, 8,241,202,211,255,251,218, 29,143, 74,198, 94,255,198,239, 28,236,142, 92,207,126,232,241, 7, 86,111,123,140,147,138, 54,
+ 21,231, 68, 10,182,115,245,205,103,190,252,114,154, 21, 27, 39,150, 30,251,192, 3, 39,206,221,105,119, 86, 5, 37,127,112,199,
+137, 44,205,139,188,198, 82,130,181,219, 31,217,122,245,203,151,223,186,142, 85,229,174,123,111, 59,117,223, 7,145,130,171,108,
+ 46, 57,227,156,142,119,223,169,203,202,241,236,229,141,193,123, 78, 46,223,245,200, 19,118,176, 2, 33,218,187,244, 76, 26, 39,
+156,243,170,108,254,224,233,151,224,147, 79, 62,249,115, 63,246,104,153, 87,171,155, 75,183,221,255, 4, 21,200,208, 85,206,168,
+ 20,172,206,102,111,124,231,229,123, 30,186, 79, 81,176, 16, 66, 10,142,176,102,122,125, 70,170,241,238,101, 70, 57, 33,244,226,
+171,151,191,242,202,229, 51,161,135, 1,132, 66,200,243, 15,221,189,126,231, 19,130, 19, 88,164,140,148,130,177,189,171, 23,116,
+211, 56,255,208,253, 16, 66, 33,184,144, 28,171, 70,119,253,174,189,119,158,105,202,154,115,145,165,197,239,255,238,183,134, 89,
+249,161,251,206, 61,246,129, 7, 48,144,224,161, 39,159,228,208, 40,147,177, 20, 92, 8, 78,202,228,197,111, 60,119,227,218,222,
+ 3,143,220,121, 74,215, 52,221,196,154,237,133, 43, 77, 17,109,191,241, 53,198, 25,103,124,103,123,248,235,191,255,220,138,107,
+255,212, 15, 61,254,192, 99, 15,245, 79,220,135, 1,144,166,219,173,139,152, 53,141, 20, 34,153,238,127,253, 15,159, 63, 28, 78,
+ 79,156, 92, 9, 59,126, 85, 84,186, 21,116,215,239, 60,184,242,124, 85, 20, 92, 8, 82, 55, 47, 62,123,225,155, 23,174,189,231,
+236,198, 19, 31,120,240,142,135,159,112,187, 27, 66, 48, 12, 0,200,231, 67, 41,165,148, 98,122,184,255,181, 63,124, 49,207,138,
+ 59,239, 57,125,255, 35,119,110,220,249, 56, 41,115,136,208,141, 55,190,202, 40, 23,130, 39, 81,254,187,191,253,141,105, 89,127,
+252,241,123,223,243,196,189, 39,239,121, 66,119, 66, 90,231,175,126,237, 95, 97, 0, 0,169,115, 32,229,244,104,252,141, 47,127,
+167, 44,154, 59,207,159,190,239,225,187, 86, 78,223, 95, 23,113,147,207, 38,195, 61, 41, 37, 99,124,231,198,193,111,252,193, 11,
+171,158,253,227, 63,244,248,253,239,185,111,233,244,131, 24, 27,217,116,239,165,175,127, 57,141,243,246, 70,229,108, 18,125,235,
+171, 47,151, 69,115,231, 61,167,238,190,239, 92,111,253,246,186, 76,242,249, 48,154,205, 5,231,148,176, 87, 94,120,235,155, 23,
+174, 61,114,102,253,189, 79,221,127,231, 3, 15,121, 75,167, 33, 4,251,151,159,187,248,202,155,117, 77, 40,161,127,113,113,242,
+ 47,228,218,220,220, 68,127,202,143, 79,110, 44,191,239,209,251,254,237, 2,247,173,203, 52,141, 55,191,243, 37, 78,155,183, 95,
+122,102,103,235,128, 52,164,211, 15, 9,229,143,125,224,241,166, 76,155,186,170,203,102, 62,141,127,230, 23,254,177,148,242,187,
+ 79,244,175,221,232,226,203, 95, 11,130, 32,157,238,188,254,236,179,209, 60, 89, 94,235, 47,175, 14, 6,167,238,227, 36,103,180,
+102, 77,221, 20,201,219, 23,175,189,249,218,149,121, 94,125,245,181,183, 70,179,248,223,188,209, 43, 95,249,165,149,115,143, 66,
+ 8,198,219,111, 92,120,233,149,178,168, 87,214, 7,103,207, 63, 96,135,235,180,138, 57,109, 56, 35,121, 52,122,233,217,215, 46,
+189,181, 13,164, 92, 89,237,250,161,251,183,255,135, 95,165,140, 47,110,244,233,159,250,212,223,252,217,143,109,220,253, 20, 0,
+ 96,116,253,149, 11,223,121,149, 82,186,186,185,116,246,222,199, 76,175, 71,202, 68,112,202, 41,201,227,195,231,158,254,246,213,
+119,118, 12, 93, 59,117,219,250,233,115, 27, 75,235,235,182,191,116,112,253,205,157,173,131,151, 47,237,225, 95,248,107, 63,178,
+118,219, 99, 18,202,217,206,219, 23, 95,126,141, 49,182,126, 98,229,236,125,143,153,110,159,148, 49,144, 2, 8, 81,103,179, 23,
+191,249,157,107,151,119, 29,199,188,243,252,153,219,238, 62,211, 63,113, 23, 66,120,186,251,118,154, 22,134,169, 99, 21,227,245,
+219,222, 43, 32,200, 38,187, 23, 95,122,145, 52,100,109, 99,233,236,125,143, 1,108,210, 38, 19,130, 11,193,235, 34,122,253, 59,
+175, 92,189,180, 99, 24,250,189, 15,221,126,238,174, 51,131, 19,247, 73, 0,178,201, 78, 52,139, 16,130, 82,130,249, 52,193, 0,
+130, 38,155, 95,120,238, 27, 69, 86,246,151,187,167,238,126, 16, 27, 30, 2,156,211, 70, 74,193,234,226,234,197,139,103,110, 59,
+177,121,106,237,250, 59,219,103,110, 63,181,122,238,189,148, 84,172,206,167,135,123, 0, 0, 32,193,141, 43, 59,163,180,192,156,
+214, 23,191,253,229,104,158,134, 93,255,244, 29,119,133,203,103, 73,157,209,186,145,146,115, 90, 95,185,240,202,230,153, 77, 85,
+183,133,224, 15,134,193,254,206,104,229, 44,193, 88, 61,216,185, 36,165, 4, 64, 30, 29, 78, 95,184,116, 83,195, 26,190,250,242,
+211, 71,195,169,227, 90, 39,206,158,232,159, 56,207, 89, 77,235, 66, 10,206, 57,221,187,122,209,245, 28,195,242,165, 20, 0, 72,
+168,153,119, 62,248, 48,214,140,253,119,190,205, 24, 19, 82,102, 73,241,205,103, 47, 64, 8,151, 58, 62,186,121, 99, 31, 99,101,
+117, 99,105,229,204, 67, 82,138,166,136,165,224,130,211,232,240,122,211,144,254,234,134,132, 64, 74, 33,129, 68, 72,113,194,213,
+233,205, 11, 77, 93, 11, 33,104, 67, 95,126,225,237,113, 89,159,223, 24, 44,175,247, 49,101,124,117, 99,176,118,246,190, 52,142,
+ 76, 83, 19,156,113,198,234,124, 54,159,204,151, 87, 87, 37,132, 80, 48, 41, 5,148, 32,232,159,204, 38, 59,121, 58,151, 66, 8,
+ 46,110, 92,221,125,125,123,120,166,227,221,255,200,157,251, 57, 64, 97,232,173,159, 58,163, 89,190,101, 25,156, 81,193, 25,167,
+213,149,139,111, 26,134, 6,160, 4,156, 74, 46, 33,128,166,219,149, 64, 68, 71, 55, 5, 23, 66,136,249, 52,249,198,243,111,122,
+186,122,254,190, 51,103,239, 58,107, 58, 33, 90, 89, 31,132, 43,103,129, 20,180,169, 36,167,130,209,209,206,181,139,175, 93,185,
+114,105, 59, 79, 18, 70, 27, 0,129,110, 7, 78,119,125,124,243, 34,231, 92, 8, 81, 87,205,119,158,189,144, 19,122,223,109,155,
+183,223,125,186,183,126,167,162,234,184,191,126, 27,231,140,148,169, 20, 92, 10, 81,166,147, 55, 94,190, 20,207,179,160,227,189,
+242,210,213, 78,199, 58,125,118,253,228,210,169,201,206,197,166,174, 5, 23,156,241,235,151,119, 47,236, 31,221,181,220,189,227,
+252,233,245,179,119,155,110, 23, 0,128, 33,214,105,153, 72,206,164, 16,140, 54, 87,223,190,186,123,243,208,118,204,229,229,238,
+169,219, 54,155,154,158, 58,255,100,157, 71,121, 60, 21, 92,114, 33, 38,227,232,235,207, 95, 12, 52,237,174,243,103, 78,159, 59,
+233, 15, 78, 32,168,208,186,192, 8, 2, 66, 27, 41,133, 20, 34, 26,239, 95,126,235, 6,231,114,117, 99,176,113,106,117,253,246,
+ 71, 57,163, 72, 81,102,195,107,130, 11,206, 89, 85, 54, 47, 62,123, 33, 39,236,169,251,206,158,185,125,179,183,113, 23, 86, 13,
+ 70,155,217,104, 23, 55,197,156,115, 1,128, 96,164,186,122,105,123, 54, 77,187, 93,111,227,196,242, 96,227, 28, 68,138,106,104,
+227,237,215, 41, 33,130, 75,206,197,181,119,182, 47,238, 29,221,181,218,187,237,174, 83,107,167,239, 48,221, 46, 0,114,186,243,
+102, 22,231,152, 51, 34,132,144, 82,206,142,198, 91,215,246,177,130, 86,214,251, 43,235, 75,150, 63,104,202,132,147, 42, 79, 98,
+206,133,224, 98,122, 52,251,198,243,111,117, 12,237,174,123, 78,159, 60,187,225, 15, 54, 33, 84,234, 60,186,250,214,219,140,115,
+ 36, 88,195, 41, 33,117,113,237,242, 78, 18,231, 65,199, 93, 89,235, 7,131, 77, 90, 23,170,110,205,134, 55, 24, 99,130,139,178,
+168, 94,120,246, 98, 78,217,249,219, 79,156, 57,183,209,223,184, 83, 81, 77, 33,200,246, 91,223,142,231,169, 20, 18, 51, 74,133,
+ 20,179,201,108,103,235, 64,193,202,210, 74,183, 55,232,234,166, 71,105,157, 13,247,234,186,225, 66,114,202,174,190,115,243,205,
+253,241,221,171,189,219,238, 60,185,122,234,180,233,118,161,148,179,225,181,189,173, 3,198,184,144, 2,113, 70,155,186,217,186,
+186, 23,199, 69, 16, 56,131,229,174,215, 93,106,234, 2, 33, 20,207, 38,156,113,193,248,124, 18, 63,243,157,119, 66, 67,187,227,
+174, 83,155,167, 87,188,254, 73,128,148,186, 76,174, 94,120,163, 44, 27,193,133, 20, 18,124, 95,229,181,141,141, 13, 4,190,159,
+ 46, 8, 33,254,222,223,253,225,247, 63,250, 87,126,250, 19,247,159,191, 67,210,114, 58, 58, 24, 31, 78,162,121,154,167,101, 83,
+ 19, 33,196,239,125,235,213,215,175,221,108,223,249,139,255,213,223, 56,127,251,186,170,160, 40,206, 47, 93,217,121,250,185,215,
+159,123,229,237,239,245, 76, 79, 61,245,212, 51,207, 60,243, 39,253,248,239,252,194,207,125,230,175,254, 12, 0, 16, 2, 88, 23,
+243,195,237,183, 71, 7,147,100,158,214,117,131, 32,178, 28,195,245, 29, 85,197,142,107, 5, 75, 27, 65,119,169,105,147, 32, 99,
+130,211,246, 5,165,164,200,203,233, 81,116, 52,156,204,167,105, 89,214, 95,125,253,157,183,183,247,254,164, 74,228,143,145, 80,
+183, 19,220,115,231,185,207,127,238,179,109,129, 32, 56,139, 70,215, 15,110, 92,153, 28, 69, 69, 94, 10, 41, 13, 93, 95, 90,235,
+117,186,129,223, 93,182,252, 62,210,108, 40, 24,163, 21,231, 84,193, 42,132, 16, 66,133, 35,196,104, 51,159, 70,187,219, 7,195,
+221,241,124,158,150,132, 34, 8,177,130, 62,116,223,237, 31,125,232,174,207,126,241, 91,121, 85,255,137,253,140,174,107, 47,126,
+253, 55, 73, 58,132,216,222,184,237, 33, 32, 37,128,144,209,122,178,251,214,254,214,141,249, 52,105, 42, 2, 16,240,124, 39,236,
+249,157, 94,199,239,159,176,252, 37,164, 96, 70, 74, 78, 27, 33, 69, 43, 69, 9, 16,128,168, 46,231,163,253,131,155,215, 15,134,
+123,227, 52, 45, 24, 23,134,174,174, 45,117,252,208, 11, 58,174,227, 89,182,109,253,165, 79,190,207, 48,205, 6,232,156, 84,162,
+ 41,247,247,142,190,244,205, 87, 94,186, 58,196, 66,136,203, 47,127, 33,157,237,211,124,118,226,238,247, 3, 8, 1, 0,156, 54,
+211,221, 75,187, 55, 46,207, 39, 73,211, 16,132, 20, 55,176,195,142,215, 29,244,195,149,115,150,215,231, 66, 8, 90,211, 42, 19,
+ 82, 72, 41,129, 20, 0, 72, 41,120,157,207, 71,251,187,215,223,217, 29,238, 31,101, 89, 37,132, 52, 77,189,215,247,251,203,221,
+ 78,223, 15, 59,190,227,251,150,215,215, 12, 23, 0,200,121, 51,217,187, 18,231,105, 81,212,186,166,254,224,251, 31, 94, 89, 27,
+ 97, 0, 64, 30, 31,157,184,251,253, 82, 2, 0,164,228, 60, 58,218,218,189,114, 97,114, 52,175,202, 6, 66,224,184,118,216,241,
+122,203, 75,193,202, 89, 59, 88,170,139, 66,112,202, 73, 37, 56, 7, 64, 0,201,129, 20,130,243,186,136,198,251, 59,215,175,236,
+238,223, 28, 37,113, 46,164,176,109,115,105,165, 51, 88,233, 5,161,211, 95, 30,248,253, 13,211,237, 1,132, 4, 99, 16,193,249,
+193,149,104, 58,174,203,134,115,129,177, 2,128,202, 40, 99,148, 97, 41,193,198, 29,143, 75, 41,165,148,101, 50,222,187,242,202,
+225,254,184,200, 75, 41,164,105,233, 65,232,245,150,123,157,149,115, 78,103, 53,141,102, 64, 8, 8, 88, 91,163, 72, 41,218,156,
+ 67,202,116, 54,218,137,163, 4, 0,168, 40,168,105, 26,195,212,252,208, 89, 90,233,173,159, 88,238, 45, 15,188,222,166,233,245,
+ 32, 84, 24,169, 85,213, 72,163,155,243,163,155, 85, 89, 51,198, 32,132, 72, 65,146,177, 36,206,183,175,238,237, 14, 35, 12, 32,
+ 0, 82,210, 42, 63,220,122,109,255,230,110, 60,207, 24, 99,154,166,122,190,211,237,119,186,107, 39,253,254, 73,168,168,138,162,
+ 90,182, 85, 23, 49,144, 66, 8,209,126,229,180, 78, 38,123,123, 55,247, 12, 83, 95, 90, 25, 40, 88, 93,219, 92,127,224,189,247,
+113, 70,227, 89, 12, 32,220, 56,115,167,215,223, 68,138, 70,234, 76, 55, 77, 70,138,163, 27,175,228,105,194, 24,149, 82, 66, 0,
+ 36,144,117, 89,239,239, 30,189,245,214,246,126, 94,114,164, 98, 8, 64, 52,188,122,243,242,197,201, 56,170,170, 90, 65,200,243,
+157, 78,207,239, 45,175,133, 43,103, 12,183, 91,229,153, 6, 97,149, 37,130, 11, 0,132, 20, 66, 74, 33, 56, 43,211,201,193,205,
+237,104,154,156,190,237,132,229,133, 16, 41, 0, 0, 41,132, 2, 36,198,250, 96,205, 70, 16, 9, 78, 47, 60,251,133,251,159,250,
+164,170,155,179,131,119,210,217,144, 54,132, 11, 1, 36, 4, 82,112, 38,226, 89,122,229,237,237,139, 91,195, 82,112, 75, 81, 52,
+ 93,199, 0,192,183, 94,126, 33,137,115, 46,132, 97,104, 65,232,245, 6,221,206,218, 89,183,187, 94, 87,165,228, 12, 73,218,148,
+149, 4, 18,136, 86, 71,156,214,197,236,240,230,206,214, 65,127,169,115,247,131,247, 42,170, 6, 0,132, 0, 72,201, 1,144, 64,
+ 2,128, 32,130, 10,214, 76,205,244,239,127,255, 39,170,108,150,140,110, 84,101, 46,184, 16,178,213,179,168,202,122,184, 55,190,
+248,198,181, 27,243, 20, 66,184,106,153, 39,214,250,177, 84, 48,128, 96, 62, 75,145,130, 60,223,233,246,130,222,202,106,176,124,
+198,176,195,166, 42, 84, 5, 85,217, 92, 74, 1,100,235, 76, 66,112, 90,198, 71, 7,187,187, 82,130,219,239, 62,167,154, 54, 82,
+ 48, 60, 62, 44, 16, 92, 72, 9, 0, 64, 72, 81, 52, 51, 88, 58, 45,133,136, 14,174,228,241,132, 49, 42,132,104,159,136, 49,158,
+ 68,217,245,203, 55, 95,191,180, 51,167,212, 65,232,100, 63, 60,113,122,229,196,233,213, 75, 59, 51, 12, 0, 48, 12,221, 11,156,
+222,160,211, 93, 57,229,116,215,234,170,226,140, 10, 86,115,193,164,148,173,142,128, 20,164, 41,230,163,189,233,209, 44,232,120,
+186,161, 43,170, 10, 33,144, 66, 0, 0, 4,144, 80, 74, 1, 33, 4, 16, 41,216,244,122, 94,111, 61,157,236, 37,147,155,117, 89,
+ 74, 33,132, 20,173,120,154,154, 28, 29, 78,222,124,253,218,165,131, 9,147,114,213, 54, 79,109, 12, 78,156, 94, 61,113,102,189,
+211,239,239,229, 42, 6, 18, 12, 86,186,221, 65, 47, 92, 57, 99, 56, 29,210, 52, 42,134, 85, 54, 5, 82,130,214,143,164, 20,130,
+215,217,236,224,230,206,141,171,187, 85, 89,159,187,243, 68,127,169,219,118, 21, 8, 97,136, 16, 4, 0, 32, 5, 35,140, 53,195,
+237,110, 0, 0,198, 55, 47, 20,241,164, 45,130,218,167, 18, 92,228, 89,181,179,189,255,218,171,215,246,178, 92, 87,148,219,122,
+193,169, 83,171,235,167, 86, 86,215, 7,253,181, 51,118,103, 69,187, 52,199, 0,200,213,205, 13,167,119, 66, 8, 32, 24, 19,164,
+ 96,130, 75, 41,128,148,160, 85, 55, 35,233,236,112,251,218,206,214,181,189,233, 36,134, 0,170,154,186,191, 31,217,150,182,186,
+222, 13,187,161, 97,217,138,102,171,134,131, 53, 83,183,188,186,136,146,241,205,186, 44,164,224, 66,200,182,254,163,148,197,179,
+228,202,165,237, 87, 47,237,164,132,118, 12,237,204, 90,255,228,153,213,181,205,229,229,245,149, 96,249,140,229,245, 20,172, 67,
+164, 96, 0,128,219, 63, 89, 22,133,105, 89,117, 62,109, 3, 18,144,242,248, 48,229,116,116,112,253,242,206,206,246, 48,141, 11,
+ 8,161, 31,216,166,169,119,250, 94,150, 86, 87,175, 12, 1, 56,116,108,237,212,153,213,179, 15, 60,133,176,150, 28,109,231,209,
+136, 18, 42,229,194,168,132, 20,117,213, 28, 29,206,222,124,253,202,219,251, 19, 33,193,166,239,156, 62,185,188,121,122,117,109,
+ 99,105,176,182,233,245, 79,232,118,128,148,214, 73, 57, 6, 0,112, 70, 85,140,154, 34, 94, 52,220,199,217,160, 46,147,209,193,
+225,245,119,118, 14,246,142,138,162,214, 52,220,237,250,131,213,238,202,106,127,176,186,228,247, 55, 12,167, 3, 21,204, 73,173,
+219, 65, 83,196,179,131,203, 85,150,112, 33,132, 16, 64, 0, 33, 5,231, 60, 79,203,157,173,131,215, 94,191,182,151,230,134,162,
+156, 27,132, 39, 79,175,110,158, 92, 89,217, 24,116, 87, 79,187,225, 26, 54,109,132, 20, 41, 68, 83, 38,121,116,136, 1, 0,172,
+ 41, 4, 39, 66, 2,120, 44, 28, 32, 68, 85,196,195,221,195,235,151,111, 14, 15,166, 77, 67, 77, 83,239,245,131,229,213,222,242,
+ 90,111,176,186,230, 15, 78,234,118,192, 72,195, 41,209, 76, 55,155,236, 38,211,221,166,170, 91, 1,183,206, 77, 9,155,207,146,
+171,111,111,191,126,121, 39, 37, 52, 52,180,179,235,131, 19,167, 87,215, 55,151,151,214,150, 58, 43,103, 44,127,128, 53, 3, 64,
+ 36, 57, 47,179,233,193,181,215,102,227, 49, 6, 0,112, 90, 46,158, 9, 2,208,154,112,145, 30,236, 28, 94,187,178,115,116, 56,
+ 35,132,217,182,209, 31,132, 43,107,253,165,213,222, 96,117,205,237,109,170,186, 93, 23,177,130,117, 5,171,243,131,203,121, 52,
+166,148,181, 33, 83, 2,217,246, 93,163,225,180,245, 38, 41,229, 9,223, 61,117,106,121,243,228,202,202,250, 96,105,109,205, 27,
+156, 52,156,142,130, 53, 0, 0,167,164,136,134, 59, 87, 94, 31,237, 79,234,138, 96, 0, 0,163, 68, 10, 41,193,194,116,234, 34,
+ 63,216, 61,186,126,101,231,104, 52,167,132, 57,174,209, 31,116,150,215,250,203,171,189,254,234,154,211, 89, 67, 88, 43,179,185,
+110, 58,156, 53,243,131, 27, 69,154,112,198, 91,217, 10, 41, 5, 23, 89, 90,236,108, 29,188,254,198,245,131, 44, 55, 20,124,122,
+ 16,158, 60,189,178,126, 98,121,101,117,208, 91,221,116, 58,235,154,229, 34,132,165, 20,156, 52,209,232,250,206,213, 75,211,163,
+168,110,136, 20,178,181, 33, 34,219,243, 8, 94, 85,229,112,119,124,253,234,238,228,104, 78, 8,115, 28,179, 55, 8,151,215,122,
+ 75, 43,221,238,210,178,237, 47, 67,168, 84,121,164,155,110, 83, 38,241,120,187,204, 75, 33,218, 39,145, 66, 8, 74, 88, 52, 79,
+174, 92,186,249,250,149,221,156,208,142,161,159, 93,239,183,246,187,180,218, 15,151, 79, 89,193, 64,213,108, 0,161, 16,156, 86,
+217,120,231,173,221,173,157, 56, 74, 40,229,109, 99,220,170,140,180,186,175,171,230,112,255,232,250,213,189,241,104, 78, 41,179,
+109,163,215, 15,150, 87,122,253,165,110,103,208,183,131, 1,128,176, 41, 34,213,244,234,108, 22, 79,246,234,162,106,147, 65,235,
+154, 77,221, 28, 29,206,222,186,112,253,210,193, 68, 72,185,233,187,167, 79, 46,111,156, 92, 89, 89,239,247, 87,150,252,193, 9,
+195,238, 98, 77, 7, 0, 8, 70,171,108, 58,188,126, 97,184, 63,206,211,130,115,206, 89, 27, 35, 36,134, 16,126,229,185,183, 36,
+ 0,156,242, 60, 43,230,211, 36,207, 75,198,132,166, 97, 34, 16, 43,104,122,152,236,101, 84,223,203,145,178,199, 25, 81, 84,141,
+147,166, 46, 19, 74,152, 4,199,122,150,146, 81,158, 38,249,104, 52,155, 21, 53, 82,244,208,210,213,208, 77, 16, 22, 81, 57,101,
+115,125,204, 21, 45,106, 67,168, 16,156,148,105, 50, 27,231, 89, 73, 41,107, 35, 21,144, 64, 8, 49, 73,170,239, 51,188,177,237,
+205,190,127, 14,243,212, 83, 79, 33, 8,225,247,149,128,190,191, 58,215, 63,158,214,249, 94, 46, 69, 81,222,247,232,121,203, 52,
+158,253,206,197, 44, 47,255, 29, 28,200, 52,244,191,247, 95,124,230,209,135,239, 95, 91,238, 36,179,225,248, 96, 52, 29, 71,105,
+156, 63,126,251, 73, 70,232,193, 36,250,236,239,125,189,125,231, 39,127,240, 3, 63,253,137, 39, 7, 29,151, 54,116,239,112,242,
+242, 27, 87,126,231, 75,207, 79,163,244,123,109,165, 55, 55, 55,119,119,119,255,148,119, 60,254,232,131,191,242,191,252,247,109,
+ 93, 90,166,147,209,238,245,241,225, 52,158,167, 85,217,112,206, 33,128,166,109,120,161, 35,165,252,226,243,151,255,155,191,251,
+215,203,116,198, 56, 21,140, 49, 70, 25,227,140, 80, 66,104, 93,145,203,215,118,254,249,255,241,197,209, 52,254,211,141,250,207,
+144,208,205,119,158, 7, 0, 74, 8, 5, 35,209,225,245,131,237,155,211, 73, 84,100, 5, 99,194,178, 12, 47,116, 52, 93, 51, 45,
+195,243,157,149,179, 15, 62,242,254, 15, 18, 82, 33,172,169, 8,113,164, 64, 4, 17, 98, 82,136, 38, 43, 38,163, 25,203,155,159,
+249,208, 99,140,243,127,250,219, 95,249,243,168,236,231, 62,243, 87,254,238,223,254,121, 9, 32, 0,146,213,213,120,231,173,131,
+221,189,104,154,212, 85, 3, 33,234,246,220,160,235,217,182,101,251,158,110,117,131,193,122, 83,198, 0,200,182,192, 18, 28, 34,
+ 0,164, 16, 53,173,102,147,120,239,230,240,104, 56, 75,210,178,162, 76, 8,241,233, 15, 63,254,249,175, 61,255,111,113,160,219,
+207,172,255,253,255,242,239,124,224,253,143, 67,132,160, 4, 77, 25, 31, 94,127, 99,184,127, 24, 71, 25,105, 40,214, 84,215,181,
+186,253, 48,236,117,157,112, 25, 27,158, 97, 57, 77,153, 0, 0, 17, 68, 18, 33, 40, 21, 36,165, 96,164, 44,242,195,189,241,206,
+214,112, 60,154,165, 69,205,133,208, 20,164, 25,170,174,169,127,249, 7,158,252,220,211,207,253,217, 7,250,131,223,252,159, 29,
+ 84,157,184,231, 41, 85, 55, 0, 0, 82,202, 50,155, 12,175,191, 62,218,159,164, 73,198, 40, 51, 12,205, 13, 28,223,119,123, 43,
+ 43, 94,111, 19, 40,134,174,107,164,202,164,148, 80, 74, 9, 17, 4, 8, 66,193, 56,205,226,104,127,103,184,115,227, 96, 50,142,
+139,170, 1, 82,186,166,238, 7,142,174,107,166,109,156, 54,180, 78, 63,248,167,159,255,194,159,120,160,127,242,139,255,224, 67,
+143,221,149, 76, 15, 78,156,255, 32,198, 90,219, 83,150,233,228,224,234,171,163,131, 73,150, 22,156, 9,221,208,252,192,237,244,
+194,176,191,236,246, 54, 5,196,134,174,147, 42, 3, 64, 66, 0, 36,132, 64, 2, 0, 32,167, 36,157, 79,118,182, 14,118,183,134,
+211, 73, 84,213, 4, 35,104,219, 86,208,241,252,192,246, 2,215,113, 45,195, 50,238, 60,127,246,199,126,252,163, 37,131,152,231,
+179,113,116,253,198,222,223,255,103,191, 14, 0,128,167, 79,159,254,194,111,253, 82,157, 28, 84,233,108,227,238, 15,168,154, 6,
+ 36, 0, 64, 22,241,209,222,149, 87,143,134,227, 44, 43, 4,151,154,174,122,158,221, 29,116, 58,203,155, 94,111,147, 9,160,235,
+ 58,169, 50, 41,120, 75,111, 74, 33,132, 96,180, 41,226,201,112,251,218,238,238,141,131,233, 52,169, 27,162, 40, 74,224,219,157,
+158,223,118, 90,158,239,216,158,107,121, 61,172,154, 8, 43,201,120,247,104, 56, 74,162,172, 42,235,186,108,126,251,197,235,248,
+231,127,238,103,155,120,159,148,201,250, 93, 79,105,154, 46,161, 4, 64,150,201,244,224,218,107, 71,195,113,158,149, 82, 72,221,
+208, 60,223, 14,123, 65,103,229,132,223, 63,201,152, 48, 12,157, 84,217,162, 57,105,243, 61, 16,156,212,233,108,180,187,181,191,
+187, 53,156, 78, 19, 66,168,138,177,239,219, 75,107,189, 32,244,250, 75,161,235,123,182,215, 53,221, 46, 68, 10,194,106, 54,221,
+137,231, 17, 33, 20, 41, 72,213, 84, 41,165, 4, 0, 55, 69, 76,155,114,229,182,199,116,221, 4, 0, 64, 9,235, 34, 58,188,241,
+250,209,112, 92,228,165, 16, 82,215, 53,207,119, 58,253,176,179,114,210,235,109, 50, 46, 76,203,106,202,180, 61, 77,219,188, 1,
+ 32, 57,105,210,249,225,222,214,254,206,214,193,108,146, 16, 66, 85, 21, 7,161, 59, 88,233,118,251,225, 96,185,227,119,122,150,
+191,164,219,190, 96, 84,193, 90, 17, 13,227,233,184,169, 27, 32, 1, 86, 20,129,133,224, 8, 0,128, 37,103,157,245,187,117,211,
+106,169, 34, 82,167,135, 55,222, 24, 29, 28,101,105,201,185,212, 52,236,250,118,167, 31,116, 86, 78,250,131, 77,198,128,101, 59,
+237,105, 22, 85,153,144, 64, 74, 78,155, 60, 58,220,191,121,176,179, 61,156,141,147,134, 80, 85,197,157,174,183,180,218,239,244,
+252,222,160,211, 25, 44,219,157, 85,205,244, 88, 83,171,186, 85,165,147,104,114, 80, 87, 13,144, 18, 33, 40, 16,132, 16, 52, 53,
+133, 0, 96, 43, 88,182,253, 46,144, 16, 64,192, 72, 57,190,121,113,180, 55, 76,227,156,115,174,170,170,227,217, 97, 39,232, 44,
+111,250,253, 77,164,232,166,134, 73,149, 9,206,142, 59, 73, 33,128,224,140, 20,241,209,112,255,240, 96,239,104, 62, 77,235,134,
+ 96,140, 92,207, 26, 44,119,251, 75, 97,167, 23,118, 6, 43, 86,176,100, 88, 62,107,106,205,176,154, 50,142,198, 59,117, 85, 73,
+ 41, 33,132,109,185,209,212,100, 54,142, 0, 0, 24,171, 26,148, 82, 66, 40, 72, 51,221,187, 52,220,217, 75,146,140, 81,134,177,
+ 98,187,102,216,241, 58,203,107, 94,239,132,170, 59, 82,114, 90, 23,130,145, 22,123, 0,173,202, 24, 45,147,241,100,116,132, 85,
+101,253,196,114,150, 20,140, 49,211, 52,186,253,160,211, 11,250,203,221,160,191,238,118, 86, 84,211,165, 77,169, 26, 22, 37,117,
+124,180, 85,151,165,224, 18, 66,216, 34,136,148,208,217, 36,190,185, 55, 1,160,197,169, 33,148,156, 70,163,107,195,155, 91,241,
+ 60,165, 13, 83, 20,197,114,204, 32,244,194,193,138,215,219, 52,108,191,200, 83, 21, 99,206,154,133,166,128,144, 82, 8,193,170,
+124, 54, 62, 56,160,132,134, 29, 63, 8,188,229,181,193,225,193,116,119,107,127,176,220,233,246,131,160,183,226,117,215, 53,211,
+165,164,194,170, 33,165, 76,199, 91,101,150,113,198, 1, 88,176,192,140,241,120,158,238,238, 30, 29,230, 5, 80,108, 44, 37, 16,
+130,101,211,189,195,237,171,209, 52,105,106, 2, 17, 52, 45,195, 15,220, 78,175,231,247, 55, 13,167, 19,205,142, 92, 47, 32, 85,
+190, 64, 66,142,129,162,186,136, 39, 7,251,241, 60,221, 56,189,166,233,134,162, 96, 9,228,201,211,198,218,198, 96,127,239,200,
+239,118,156,112, 85,179, 60, 78, 27, 8,145,130,113,116,120,163, 72,231,140, 49,121,124, 28,193,121,158, 22,251,187, 71,187,243,
+148, 45, 2,163,148, 85, 58, 61,188,121,105, 54,137,171,170, 1, 64, 26,134,225, 5,118,216, 11,189,254, 9,211,235,167,241,212,
+ 11, 58,164,200,164,224,224,184,247,146, 82,144, 42,155,143,246,199, 71,179,229,213,190,101,123, 8, 99, 8,144,144, 2, 33,140,
+176,122,250,236,137, 56,138, 13, 55,214, 76, 87, 8,174, 25,118, 54,221, 43,162, 17, 37, 20, 72, 0,164, 68, 0, 80, 33,202,178,
+ 62,220,159,108, 13,167, 21,231, 42, 66, 13, 0,152,145,106,124,243,173,201,209,172,200, 43, 41,133,110,232,174,103,133,157,192,
+239,159,176,131, 37,218,212,126,208,109,202, 84, 8,118, 11,207,147, 82,176,166, 72, 38, 7,163,131,177,237, 88,157,254, 0, 97,
+ 13, 32, 4,165, 68,178, 13,215, 16, 42,234, 96,117, 51,159, 13,129, 96,189,205, 59,203,100,156,206,246,155,186,106, 9, 91, 0,
+128,144,160,169,201,244, 40,218,190, 57,138,106,130, 16,236, 25,122,209, 72, 84, 36, 71, 71,135,227, 60, 45, 57,231, 88, 85,109,
+199,244, 67,207,239,175, 58,225, 50, 64,138,170,234,164,202, 57, 35, 45, 24,210,254,227,180,206,162,209,193,222, 8,171,202,198,
+169, 77,164,106, 16, 42,139, 8, 9,110, 33,122, 10, 86,245,254,250, 57,175,183, 70,202, 52,155,236, 54,101,222, 66, 51,237,123,
+ 40,101,241, 60,189,121, 99,184,159,230, 18,128, 64, 83,151,186, 62, 0, 0,229,105,158, 70, 57,163, 84, 81, 20,203, 50,188,192,
+ 9,122, 75, 78,103, 13,235, 22, 35, 53,103, 53,163,245, 2,213,147, 66, 72, 33, 57,173,178,217,104,239, 80, 8,177,126, 98, 13,
+107, 38, 2, 10,132, 45,152, 11,160,104,195, 25,104, 79,164,153, 14, 82,112, 54,221,173,138,132,115, 33, 5, 0, 18, 72, 9, 56,
+227, 89, 90,236,109,143,182,142,102, 76, 74, 11,227,101,223, 93, 89,237, 74, 0, 80, 93, 53, 77,211, 0, 8, 13, 83,115,125, 59,
+232,116,220,206,154,110,249,241,116,164, 40, 10,109,170, 69, 68,150,162,157, 4,170,203,120,122, 56, 44,242, 98,243,244,134,225,
+248, 8, 33,128,128, 92,160,238, 66, 2, 1, 32,128, 16, 33,172,106,166,167, 26, 78, 17, 29,150,233,140, 51, 6,110,225, 78, 92,
+ 84,101, 61, 58,152, 92,223, 29,101,148, 97, 8,151, 93,107,105, 57, 92, 94,235, 3, 9, 16,163, 92, 74,160,105,170,227,218,126,
+232,185,221, 53,221,233, 20,105,236,133,221,150,126, 7, 66, 72,193,219,211,208,166,136,199,135,121, 86,174,108, 44,233,166,133,
+ 16,146, 0, 44,128,226,133,201, 75, 4,160,162, 40,134, 29,152, 94,175,136, 71, 69, 60,162,164,121, 23,202, 16,162,105,154,217,
+ 36,218,190,113, 48,206, 43, 4, 96,223, 50,150, 6,193,242,218,160, 55, 8, 1, 0, 72, 2,137, 49,182, 29,211, 11, 28,175,179,
+108,122,125, 9,164,229,122,180,202, 5,167, 64, 10, 41,120,155,178, 56,107,138,232, 40,141,179,160,227,155,150,133,160,210, 34,
+ 74, 18, 0, 40, 23,186,128, 8, 66,132, 20,213,112,194,213, 58,143,242,217, 65, 83, 87,199,237, 63, 0, 18, 48,198,211, 56,223,
+217, 58,188, 57,141,185,148,190,142, 87,122,193,202, 90,127,105,181, 27,246,186, 0, 72,140, 16,180,108,195,245, 29,175,211,181,
+195,101,172, 25,164,174, 5,108, 90, 67, 6,199, 25, 75, 48, 86,103,243,201,209, 84, 81, 21, 5, 35, 8, 17,128, 0, 74, 1, 0,
+148, 64,182,192, 18, 0, 0, 66, 69, 81, 13,127,112,138,145, 42,159,237,215,101, 38,249, 45, 52, 66,114, 33,138,188, 28,238,141,
+183,118,143, 42,198, 45,140, 87, 66,111,176, 28, 46,173,244,130,110,224,245, 54, 0, 0, 72,197,216,113, 45, 63,240,220,112, 69,
+ 51,221,116, 62, 81, 20,200, 72,117, 92,226,112, 41,133,224,188,169,210,217,248,104,116, 48,169,139, 26, 2, 8, 90, 91, 16, 92,
+ 72, 46,133,132, 82, 0, 0, 16, 66, 10,214,156,112, 21, 42, 74, 54,219,171,178, 57,231,108,113, 22, 33,165,144,164, 34,211,113,
+180,181, 53,156, 86,141, 2,209,192,177,150,150, 58,253,229,110,216, 11,188,112,201,176, 3, 0, 0, 86,117,213,245,109, 39, 92,
+ 54,156,176, 44,114,199, 11,142,211,167, 92,132, 65, 33, 24,169,178,249,228,112,239,232,104, 52, 21, 66,216,174,141, 85,140, 56,
+ 65, 64,131, 16, 33,132, 36,128, 72, 81, 16,214, 76, 39,212, 45, 55,155, 31, 22,201,132, 30,163, 60,237,173, 40,161, 73,146,238,
+108, 13,247,102,169, 0, 96, 96,232,203,131,160,191,220,233,245, 67, 47, 12, 45,127,160,234,182, 4, 0,235,154,234, 6, 29,211,
+235, 9, 9, 76,203,166, 85, 46, 56, 59,230,191, 4,144, 82,112, 90,101,179,163,195,241,104, 56, 77,230, 57, 66, 8,171,218, 18,
+ 99,157,110,128, 53,128,176, 42, 37, 82, 20, 5,169,134,170, 91,186, 29,214,121, 82, 68, 67, 82,151, 11,236, 84, 74, 32, 37, 99,
+188, 40,170,131,221,201,214,222,164,226,194, 81,149,229,174, 59, 88,238,244, 6, 97,216, 11,156,112, 69, 51, 61, 69,213, 0, 0,
+ 88, 51,116,203, 31,168,154,217,212,149,100,148,211, 70,182, 8,234, 49, 39, 71,170,108, 54,153, 30,238, 79,230,179,180,174,155,
+ 50,175,242,188, 44,111, 52, 89, 90, 46,175,245, 29,199, 70,134,174,104,166,170,219,170, 97, 75,193,243,104,191, 46,178, 54, 72,
+220,210, 87, 83, 55,211,163,249,246,214,193,172,174, 85, 4,151, 61,123,176,212,233, 14, 58,157,110,224,117,150, 13,167,131, 53,
+ 3, 66, 4, 0,192,170, 97,105,166, 27,205,198,126,216, 37, 85,218, 34,168,224,216, 73, 25,169,179,249,100,180, 63,153,142,163,
+170,172,165, 4, 16, 33,172,192,154,240,253,253,249,108,154,118,186,110,183,231,123,129, 23, 44,157,196,184,147, 39,163, 42,157,
+115, 78, 23,135, 17, 82, 8, 73, 40, 77,230,217,206,214,225,238, 44, 5, 0,116, 77, 99,105, 16,246,150, 58,221,158,239,117,187,
+166, 63, 80,117, 27, 33,101,209,117, 96,213, 4, 0,250, 97,151,214,109,250, 4,239,214,166,156, 86,121, 52, 62,154, 29, 29,206,
+210,164,224, 92,152,166,102,219,134,237,152, 30, 86,226,184,164,140,207,102, 25,132,112,245,212, 57,183,187, 81,101,179, 50, 30,
+ 83,218, 72, 46,165, 20, 45, 49,196, 25, 47,179,234, 96,111,188,181, 63,174, 56,119, 84,188,220,245,122, 75, 97,183, 31, 4,221,
+192, 9, 86, 52,211, 67, 88,133, 0, 74, 41, 0, 0, 88,193,106,153,167,134, 97, 8, 70,133,148, 16, 28,187,186, 20,180,206,163,
+217,124, 52,156, 70,243,148, 16,138,177, 98, 59,182, 23,184, 94,224,116,186,193,201, 51,184, 21,193,192, 53, 0, 0, 32, 0, 73,
+ 68, 65, 84,169,106,211,113,123,235,103,109,127,137,209,170,136, 15,155, 42, 63, 70, 29, 91,142, 79,214,117, 51, 62,154,111,109,
+ 29, 76,203, 26, 67,212, 42,171, 55, 8,195,174,231,134,203,134, 19, 98, 85, 71, 16, 74, 41, 89, 83, 66, 0,112, 89,100,150,109,
+147, 42, 95,240, 44, 82, 66, 32,165,148,156,145, 34,141, 39,163,217,116, 28, 87, 85, 13, 32, 48,109,221, 11,236, 32,116,253,192,
+ 13,250, 43, 78,184,162, 26, 14, 99, 68, 81, 84, 0,100, 62, 63,172,243,152, 51,254,174,229, 8, 73, 9,141,163,108,103,123,184,
+ 59, 75, 37,144, 93, 75, 91, 26,132,221, 65, 24,118,125, 63,236,153, 94, 79,213,173, 86, 89,130,179, 34, 25, 3, 0,144,105,217,
+164, 46,229,130,112,105,169, 49, 33, 56, 35, 85, 22, 77,226,241,104,158,165, 57, 99, 66,215, 53,215, 93,156,198, 11, 2,219, 31,
+232,118, 0, 32,144, 66,168,154, 81, 38,147, 42,157, 16, 66,110, 21,255, 82, 74,206,121,150, 21,195,221,163,173,189,113,195,185,
+173,226,149,174,223, 27,132,221,158, 31,132,190, 21, 44,233,166,135, 20, 21, 64,216, 86, 87,209,104, 11, 0,136, 91,106,236, 56,
+ 3, 44,158,141,179, 38, 79,147,201,209, 60,154,167, 77, 67, 21, 5, 89,182,225, 5,142, 23, 56,110,224,216,126, 95, 51, 93, 41,
+ 37,169, 74,221,114, 72,157, 21,241, 97, 83,151,173,142,142, 79, 35,170,170,153, 30,205,183,182,135,179,170,198, 8, 45,123, 78,
+127, 16,118,251, 65,208,241,221,112,201,112, 66, 69,211, 1,132, 82, 74, 78, 73, 54,223,159,140,166, 0, 0, 44, 56, 21,156, 75,
+ 32,161, 92,152, 15,144,162, 41,139,249, 52,153, 78,162, 34,175,164,148,134,161,185,174,229,249,142,231, 59,142, 23,234,118, 8,
+ 21, 76,235, 82,193, 24, 0, 80, 68,163, 42, 79,216,119, 43,139, 11, 74, 72, 18,165, 59, 91,135,123,179, 84, 0, 56, 48,245,165,
+ 65,208, 27,132,157,174,239,133, 97,171, 44, 8, 23, 12, 80,157,207,103,135, 59, 89, 82, 0, 8,208, 34, 81, 75, 33, 36,147,156,
+ 3,201, 25,169,243, 52,155,142,163, 36,206, 73,195, 20, 69,177,109,211,243,109,207,183, 29,207, 49,221, 46,214, 12,206, 8,103,
+ 4,171, 70,157, 78,139,116, 66,201,194,207, 91,230,144, 49,158,167,213,254,238,120,107,127, 82, 51,238, 96,101,185,235,245, 6,
+157, 78, 47,240, 59,158, 19, 44,233,150,167, 96, 29, 64, 8,164,164, 77, 17, 31,109,207, 39, 73, 93,214, 0, 0, 44,133, 0,146,
+ 47,218, 79, 41,165,224,117, 93,204,103,201,108, 22, 87,101, 13,128, 52,116,213,241, 76,199,115,108,215,182,188, 80, 51, 93, 9,
+ 32,169,114, 77,183, 24,173,242,248,176,169,170, 91,170, 2, 2, 8, 41,235,170, 25, 31,205,182,183,134,179,170,193, 8, 46,123,
+ 78,191,109, 66, 58,174, 27, 14,116, 39,196,154, 1, 32,132, 64,114, 78,202,104, 52, 25,141,242,188, 96,156,183, 69,190, 16,124,
+209,148,180,206,149,167,197,108, 18,165,113, 65, 8,197, 24, 91,182,225,184,182,227, 89,142,107, 27,118,128, 20,149,145, 26, 0,
+137, 20, 37,155, 29,214, 69,198, 25,107,179, 68,203,134,146,134,196,243,116,103,107,184, 23,181,158,101, 14,150,194, 94, 63, 12,
+187,158, 23,132,166,215, 83, 13, 27, 34, 5, 2, 33,185,104,138,100,118,184,157,204,211,166,166,109,149,135,165,148, 66, 48, 0,
+ 1, 20, 64, 72,209, 84, 85, 60, 75,230,179,180, 44,106, 41,129,166,171,150, 99,186,174,237, 56,150,233,120, 88, 51,165, 20,180,
+ 46, 52,203, 35,101, 82, 38, 19,210,144,118,244,131, 75,177,200, 89,105,121,176,119,180,125, 48,173, 25,119, 53,117,165,235,247,
+251, 65,216,245,189,192,179,131,129,102,122,138,162, 65, 9,133, 20,156, 84,201,100,103, 58,158,151,101,221,150,128,237,129,132,
+ 20,162, 45, 40, 24,165, 89, 86,204,166,113,154,228,140, 49, 5, 43,166,101, 56,174,101,187,150,229,152,186,233, 41,138, 74,155,
+ 18, 33, 4,129, 40,226,163,186, 42, 5,231, 92,138,182,179, 17, 66,212,101, 61, 30, 71, 91,219,135,179,170, 81, 17, 90,246,157,
+222, 82,208,233, 7, 65,232,122, 65,215,112, 66,172, 26, 16, 66, 9,132,224,180, 72,198,211,225,126,150,228,140,178, 54, 94, 44,
+250, 50,113,156, 49,154,186,137,103,233,124,154,180,226,209,117,213,118, 76,199,181, 45,199, 52, 44, 87,209, 45, 46, 56,167,141,
+102,121, 77, 17,151, 69,204, 40,227, 45,115,210,114, 83, 13,141,163,108,119,251,112, 63,202, 0, 0, 93,203, 24, 12,130, 94, 63,
+ 12, 59,158, 23,248,166,215, 83,117, 27, 41, 88, 74, 0, 0, 39,101, 58, 31,109, 71,243,180,174,155, 69, 34, 22, 2, 0,128,133,
+ 20,109, 10, 99,140, 23, 11,241, 20,132, 48, 85, 85, 76,211,112, 92,203,118, 12,203, 50,116,211, 69, 72, 97,164, 70, 10, 6,130,
+151,201,132, 84, 13,231,139,182, 70,112,201, 57, 47,242,242,240, 96,178,125, 48,105, 56,119, 84,117,185,235,117,251, 97,216,241,
+252,192,181,252,190,110,249, 10,214,164, 4, 0, 10, 70,234,108,186, 55, 61,154, 20,121,185,168,215,197, 66,101,168,237,254, 4,
+ 23,164,110,226, 40,139,102, 73, 85,213, 0, 0, 77, 87,109,199,180, 29,211,178, 77,195,182,177,102, 72, 33, 56,105, 20,172,213,
+ 69, 84, 21, 57,165,183,170, 65, 33, 4,111,106, 50,155, 38, 59, 55, 71,243,186,193, 16, 45,251,118,175, 31,118,187, 94, 16,186,
+ 78, 16,154, 78, 71,209, 12, 8, 33,128, 82, 50, 90, 37,227,201,225,126, 26, 23,148, 48,177, 24,191,144, 66, 8, 8, 0,190,190,
+ 55,105, 59,135,166, 38,243,121,146, 68, 89, 93, 81,136, 96, 89,137, 42, 42,103,124,186, 51,175,140,155,177,170,239, 11,193,129,
+ 4, 72,193,117, 17, 55,117, 45,223,173,221, 1,231,162,169,155,233, 56, 62, 76,106,174,232,154,170, 84, 88, 31, 22, 52,223,143,
+246, 82, 98,238, 21,170,113,136, 20, 13, 66, 32, 37,224,180, 41,147,113, 28,197,117,213,220,154, 6,105,115,223, 98, 40, 46,138,
+162, 56,142,191,223,104,161,127,183,151,148, 50, 8,130, 48, 12, 49, 0, 32, 73,146,189,189,189,255, 32,148, 63, 58,228, 25,134,
+ 33,250, 15,130,248,247,140,223,252,255, 9,223,250, 61, 50,162,129,239,134,129,119,234,196,218, 3,231,111, 63,177, 62, 56,119,
+ 98, 89, 85,100, 93, 86,121, 94,214,101, 93, 85, 77, 83, 55,156,137,162,172,223,217, 62,120,246,213, 75,251,227, 89, 85,147, 63,
+201,224,187,161,103, 91,134,101,234, 8, 66,198,120, 81,213, 85, 77,146,172, 96,140,255,251, 33,160,187,239, 56,243,153,255,248,
+167, 63,246,225, 39, 5,151, 8, 43, 16, 66, 41, 56,163, 85,153,206,139, 44, 42,210, 98,180,191, 95, 23,117, 85, 18,210, 16, 66,
+ 41,103,156, 83, 46,128, 16, 28,156, 90,234,157,254,225,167, 16,132,148,138,225, 56,250,252,211,207,101, 69, 5, 0,248,137, 31,
+253,216,127,254,215,126, 74,195, 66, 50,194, 57,227,188, 5, 98,196,241,213,118, 71,156, 49, 70, 40, 31, 29,205,191,241,194,133,
+175,189,112, 49,201,138,191,176, 72,244,212, 83, 79,221,188,121,243, 79,167,164,255,148,235,161, 7,238,249, 91,255,217,127,250,
+240, 67,247,170,170,182, 88,237,146, 64, 74, 65,235,178,202, 38, 89, 52,205,146, 52,207,202,170,172,155,138, 52,132, 48,202,133,
+ 16, 64, 2, 69, 65, 88,197, 88, 85, 16,130, 72, 81, 76, 83, 51, 45,211, 52,117, 77, 87, 21,221,246,251,107,166,105,113, 86,211,
+166,108,201,184, 5, 22, 45,132,120,183, 82,225,139,246,145,115,198, 56, 37,180,105,104, 93,214, 85,217,212, 85,221,212, 36, 78,
+139,107, 59,195, 47,189,120, 49,254,115,201,107,115,115,243,228,201,147,127, 78, 11, 58,127,207, 29,191,248,223,254,189,123,238,
+190,131, 49,142, 16, 90,172,188, 73,201, 24,105,242, 40,159,143,146,104,154,165, 69,153, 87,117,213,144,134, 50,198,132,144, 16,
+ 66,221,208,116, 93,213, 13,205, 48, 52, 85,215, 84, 21,171,154,170,170, 24,171,154,162,106,166, 55,112,195, 62,167, 13, 35, 21,
+167,149,224, 2, 33, 12, 32,146, 72, 17, 82, 0, 46, 4, 18, 80,112, 36,133, 20,156, 11,196, 25,147,140, 55, 13, 41,243, 42, 75,
+139, 52,206, 23,127,180, 38,132, 48, 66,153,165,168, 63,250,216,131, 0,130, 23,223,185,113,121,119,248,255,185,139,233,186,246,
+207,254,209, 63,252,248, 95,250,136, 4, 0, 34, 8, 0,196, 90, 75,208, 51, 70,202, 50, 25,167,179,195, 52, 74,242,172, 44,139,
+170,105, 8, 35,140,115, 1, 0, 80,176,162,171,216, 52, 13,199, 53, 13,203,208, 84, 85, 51,116,221, 48, 85,195, 86,117, 11, 41,
+134,102,121, 24, 99, 70, 42,214,148, 66,176,150,149,128, 8, 0, 9,128,132, 64, 64, 4, 17,128, 2,112, 46, 33,228,140, 8,206,
+ 73, 93, 23, 69,149, 39,121, 28,101, 73,148,229, 73, 81,148,117,221, 16, 66, 57,227, 92, 72, 41, 0,132, 82, 42, 8, 73, 32, 31,
+187,243,204,163,119,156,121,250,213,183,134,179,232, 47, 82, 64,239,123,236,193, 79,253,224, 19,203, 29,167, 55, 88, 57,115,247,
+195,166,229,112, 33, 90,238, 15, 2, 0, 32,224,140,145, 42,201,163, 81, 58, 27,165,113, 90,228, 85, 93,213,164,166,140,243, 91,
+ 38,163,105,170,102,104,134,169,155,166,110,217,134,229,250,186, 29,232,166,139, 53,139,113,169,235, 38,132,146,145,154, 54,185,
+ 16, 2, 0,137, 32, 20,168,229,219, 17,148,176,133,153, 65,203,103, 72, 78,234,170,174,202, 60,205,147, 40,139,231,105, 26,231,
+121, 86, 86,101, 83, 55,148, 50,198,219, 22, 74, 81, 84,140, 84,140, 49, 86,212,246, 27, 4, 21, 69,249,171,235,253,183,183,246,
+127,231,155, 47,253,191, 18,208,163,143,220,255,153,159,253,201, 71,239,191,173,202,102,121, 26,235, 78,111,253,220, 3,120,193,
+226, 3, 5, 35, 0, 0, 16,146,115, 82, 23,113, 62, 59, 72,102, 71, 89,146, 23, 69,217, 84,132, 16,202,185,104, 9, 93, 77, 83,
+117, 67, 51, 76,189,253,106, 88,150,229,120,186, 29,234,150,167,168, 38, 23, 18,169,170, 9, 33, 37,149, 96, 20, 72,113, 28,193,
+ 32,144,139, 23, 8, 32, 1, 4, 4, 72, 2,198, 89, 67,235,162,204,179, 44, 41,226, 40,141,102, 11,209,212, 53, 33,132, 82,206,
+129, 4, 8, 33, 29, 43,170,138,117, 93,181,108, 67, 55, 52,140,177,170, 98, 85, 87, 13, 67, 83,176,130, 20,116,199, 61,167,127,
+242, 83, 31,152,199,217,239, 62,253,194,206,112, 90, 55, 76, 85,149,126,215,239,248, 54,105,216,120, 22,237, 13, 39, 81, 90,180,
+197,244, 66, 64,237,171, 51,167, 79,252,202,103,255, 73, 63,180,202,116, 74,171, 44,153,238, 99,221, 61,251,224, 71,177,170,201,
+182, 11,129, 0, 2, 9,132,100,140,212, 69,148,207,246,227,233, 81,154,228, 85, 81,181,107,197,139,246, 14, 33,172, 42,186,174,
+234,134,110,217,166,229,152,166,229,232,182,111,216,129,102,186, 88, 51, 72, 67,177,102,168, 82, 48,210, 16, 78, 90, 28, 19,194,
+ 91,204, 43, 0,139, 81, 13,185,128, 74, 89, 67,171,188,200,178, 52, 78,231,179, 36,154,165,121,154,231, 89, 89, 85,132, 80,198,
+133,104,233,126, 93, 83,117, 93, 53, 76,205,178, 12, 85,215,116, 67,179, 29,203,180,116, 77, 87,117, 93, 85, 53, 77, 85,177,166,
+105,170, 97, 98,205,130, 8, 63,249,193, 15, 65, 4, 41, 41,139,116,150, 37,121,153,151, 85, 89, 55, 53,169, 27, 74, 9,141,227,
+236, 15, 95,186, 34,165,132, 79, 62,249,228, 71, 63,252,190,159,249,137,143,147, 42,169,178, 57,109, 10,206,136,102,134, 75, 39,
+207, 99, 77,111,149,185,144,141, 20,156,209, 99,209,140,210, 36, 43,243,186,174, 27, 74, 91,132, 10, 32, 5,169, 24,171,186,106,
+ 26,154, 97, 25,150,109, 90,142,107,184,161, 97,119,116,211, 83, 84,189,174,107,195, 48, 0, 16,140,212,130,179,150,197, 2,199,
+125,106, 11,255,221, 98,210,132, 96,156, 18, 82,229,101,158, 36, 81, 18, 77,147,249, 44, 78,227,162,200,203,170, 34,140,113,206,
+ 57,128, 80, 65, 72,215, 85,211, 92, 40,195, 48, 53,195,208, 44,199, 50, 45, 93, 55,116, 93,215, 52, 93,215, 12, 75, 51, 28,172,
+ 91, 72, 81,165,148, 8, 33, 0, 17,107,202, 50,157, 20, 73, 84, 20, 85, 83, 53, 13,161,140,114,198, 24,103,156, 49,193, 57,123,
+251,230,244,205,221, 25, 6, 0, 88,154,204,103,187,164, 46, 56, 35,138,106, 47,159,121, 68, 55,109,176, 96,190,160,108,199,152,
+ 57, 37,101,154,205, 15,226,201, 48,141,147, 34,171,234,186,161,132,113, 46, 32, 4, 8, 41,170,170,168,186,106, 24,186,105, 25,
+150,109,152,142,103, 58,161,238,132,186,233, 41,170,209, 84, 21,194,194, 52, 77, 70, 42,193,105, 27,107, 90, 68, 30, 8, 9, 22,
+ 11, 23, 11,142, 71, 8, 46, 88, 67,234,188,204,226, 52, 78,231,211,116, 62,141,227, 40, 43,242,178, 42, 27,198,184, 16, 2, 66,
+168,105,170,170,169,166,169,217,182,233,250,142,229, 24,134,161,219,142,105,217,150,110,106,154,110,104,186,165, 26,142,102,216,
+ 8,107, 16,162,246,183, 16, 82, 24,171,171,116, 92, 36,179,178, 40,155,154, 80, 66,185, 16, 8, 34,172, 72, 0, 49,130, 8, 33,
+206, 57,108,231,222,219, 25,243,138, 53, 5, 68,120,112,250,188,101, 7, 18, 74, 32,143,131, 48, 4,146, 51, 90,231,121,116,152,
+ 76,246,147,121,156,103,101, 85, 53,180,141, 53, 64,182,229, 76,235, 80,166,101,152,182, 97, 59,158,233,118, 13, 39,212, 76,175,
+ 37, 0, 25, 37,166,109, 51, 82, 19, 82, 73, 33, 90, 51,105, 77, 6, 2, 41,129, 56,158,233, 21, 64,114,206, 8,173,243, 50, 79,
+210, 40,142,102,233,124, 26, 39, 81,150,101,101, 85,214,132,176,246, 73, 84, 21, 27,134,102,217,134,101,155,142,107, 89,142,105,
+ 24, 90,139,237,153,182,173,155,142,102,186, 88,183,177,110, 42,138,218, 2,205, 16, 65, 77, 53, 24, 39, 85, 54, 43,146, 73,157,
+103,117,221, 80,202, 56, 23, 45,113, 46,145,128, 0, 41, 0, 0, 5, 8, 41, 36, 61, 70,168, 90, 26, 59, 88,189,203,246, 58,173,
+189,220,226,184,129,224,172,169,138,100,146, 78,118,227,249, 44, 75,139,186,172,155,134,114,198, 37,144, 16, 34,172, 98, 93, 83,
+117, 67, 51,109,211,178, 77,203,117, 77,167,107, 56,161,110,121,170,110, 53,117,221, 84,165, 97, 59,140, 52,164,202,165, 96,183,
+136, 37,120, 76, 92,139,133,164,132,148, 66, 48, 66,155,178, 46,162, 44, 78,163, 89, 50,159, 38,113,148,102, 73, 81, 85,117,211,
+180,250, 0, 42, 86,116, 93, 51, 77,221, 11, 28,215,119, 28,215,212,116,205, 48,117,219,181, 44,203,210, 45, 87,179,124,253,150,
+ 55, 9,206, 25,129, 8,181, 68, 89, 83,196, 69,114, 84,102,113, 83, 55,148, 18,206,132,108,131, 38,132, 2, 65, 8, 16, 2,160,
+173, 67, 73, 77,242,172, 44,203, 26, 2,128,165, 4,126,127,211,241,187,242, 56,157, 2, 9, 37,144,130, 52, 85, 54, 75,167,123,
+241,244, 40, 75,243, 50,175,235,154, 48,198,164,144, 16, 65,172, 96, 77,195,250, 34,115, 91,182,235,152,110,215,112, 59,186,229,
+171,186, 5, 0, 72,227,185,235, 5, 82, 74, 90,101,156,177,118, 21, 99,177, 2,241, 46,255, 38, 23,156, 58,167,180, 41,155, 50,
+ 41,210, 56, 79,139,178,168,242,188,170,170,186, 44,235,182,228,147, 18, 96,172,168, 42, 54, 12,221,180,117,199,177,252,142,231,
+122,150,105, 25,150, 99,218,142,123, 92, 55,152, 88, 51, 21,172,181, 43,218, 0, 66,213,176, 1, 0,164,202,170,116, 92,166,179,
+186, 44, 41, 89,148, 32,139,208, 42,129,132,173,171, 0,198, 57,105, 88,158, 21,241, 60,141,102,105,146,150,183,210,252, 34,103,
+ 64, 40,164, 0,130, 19, 82, 38,217,124, 24, 79,134,105,156,182,225,134,209, 54,220, 64,165,205,163,134,102, 90,186,105,153,182,
+107, 91,110,104,186, 61,221,246, 85,221, 65, 88, 45,178, 88, 55, 44, 55,232,112, 82,115, 70, 90,150,255, 22,217, 10,165, 20,199,
+107, 61, 0, 72,193, 25,163, 21, 41,211, 60,141,179, 36,163, 13,213,116,181,211, 15,123, 75, 93, 0, 36, 99, 34,142,210,131,221,
+201,124, 50,111, 25, 22,211, 50,108,215,116, 92,219,241,108,207,179,109,207, 51,157,176,157,152, 80,117, 19, 41,154, 16,156,209,
+ 90, 10,161,234, 38, 82, 48, 35, 85,149, 78,203,116, 82,151, 89, 83, 55,188, 21,141, 4,173,159, 64, 4,165,108,105,125, 73, 9,
+ 45,203, 42,137,242,249, 36, 30, 79,147, 89, 89,165, 28, 2,168,181, 11,128,173,140,218, 49,151,162,140,143,146,201,254,108, 58,
+171,138,186, 42,107, 74, 40,231, 92, 2,128, 20,164,170, 88,211, 85,195,212, 77,203,176, 28,203,118,125,211,237, 25, 78,160, 25,
+158,162, 25,180,174,138, 44,241,194, 30,163, 53, 45,179,150,193,105, 39, 42,222,149,200, 98,138, 79, 74, 41, 56,109, 72,157,149,
+105,148, 70,113,150,150, 82, 74, 63,116, 45,219, 68,138, 2, 33,132, 8, 65, 0, 93,223,221,216, 92,105, 33,212,163,241,188, 72,
+203, 32,116, 28,207,118, 92,219,242, 58,150,211,213,109,191,117, 40, 32, 37,163, 53,103, 12,171,170, 98, 24,130,179, 42,159,151,
+241, 81,149,199,164,174, 24, 99,156, 47,150, 15,224,187,167, 1, 0, 72,198, 88, 93, 53,121, 90,206,103,241,248, 40, 26, 71,121,
+212, 52, 84, 74,129,212,119, 99,144, 20,130,145,186,206,231,217,116, 55,158, 78,210,164, 40,139,186,105, 8,103, 76, 8,137, 16,
+196, 88,209,116, 77, 55, 52,203,210, 45,219,178, 28,199,116,187,166,219,209, 90,159,130, 48,139,103,142,231,219,170, 79,170,156,
+115,210, 18,252, 82,182,171,111, 18, 72, 32, 97,235,243,237, 88, 4,101, 77, 81,229,113, 26,197,113,148,212, 85, 99,154, 70,111,
+169, 99, 90, 22, 84, 48,130, 8, 34,180, 88, 41,148, 64, 10,161, 74,161, 25,166,227,123, 66,240,166,170,147, 36, 79,179,218,239,
+219,186, 19,170,186, 5,145,194, 25, 21,180,129,138, 98, 88, 46,128,128, 84,121,149, 77,171,116, 90, 87, 57, 37,132, 51,126,107,
+106,106,225, 47, 45, 15, 38, 4,161,180,204,235, 36,202, 38, 71,243,163,113, 60,206,138,130,113, 1, 36, 4, 8, 73, 8, 96, 43,
+ 32,206,154, 34, 78,103, 7,241,228, 32,141,210, 60,111, 83, 56, 21, 92, 64, 8,177,138, 85, 85,209, 13,221, 52, 13,211,214,109,
+219, 54,189,208,112, 58,134, 29,170,166,163, 40,106,145,197, 8, 41,158,223,161,164,226,172,145, 98, 65, 35,130, 69,230,190,229,
+ 77, 18, 2,201, 57,227,164,106,170, 52, 75,162,100, 22,103, 89, 33, 5, 8,187,126,119,169,167,106, 6, 66, 10,108,165, 3,222,
+221, 87, 1, 8, 73, 41,161, 88,220, 80,213, 76,199,239, 64, 8,103,195,221,139, 47,191,186,121,230,212,202,198, 89,213,176,177,
+110, 33,140, 57,169,235,124, 94,102,211,166,136,105,211,180,229,210,177,143, 31,227,205, 0,182,139, 92, 77,211,228,105, 57,159,
+198, 71,163,249,104,154,204,234,134,112, 1, 16,192, 0,154, 24, 49,168, 16, 14, 48, 4,160, 46,162,201,238,219,209,116,154,165,
+ 69, 89,212,132, 16,206,132,148,178, 45,252, 52, 93, 53, 44,221,180, 12,203, 50,109,215, 55,220,174,225, 4,186,233, 41,154, 41,
+ 56,139,103, 99, 63,236,114, 70,155, 50, 21, 98,193,105, 66, 40,143, 83,184, 4,183, 86,176,132, 96,172,161,117, 94,166, 81, 28,
+ 69, 73,148, 49,202, 12, 83,239, 45,117, 93, 63, 68, 88, 93,140,176,200,182,209,128,240,248,137, 32,128, 18, 10,136, 0,144, 16,
+ 64, 8, 33, 68, 80, 65, 88, 93,218,236, 44,109,158,169,203,148,115, 98,234, 61, 0,100,147,205,203,108, 90,231,115, 82,151,140,
+182,224,145,252,174,207,216,185,181,203, 37, 72, 67,202,178, 73,162,116,122, 20,141, 70,243, 81,146,103,148,113, 41, 21, 8, 53,
+132, 92, 21, 7,150,145, 8,148,100, 4, 3, 0,243,120, 54, 58, 48,242,172,108,170,166,221, 80,131, 16, 96,220,230, 41,205,176,
+ 12,219, 54, 45,199,177,188,208,116,186,154,229,171,134, 5,129,146, 70, 83,219,241,188, 32,164, 77,217, 6, 99,112,108, 48,237,
+108,238,241,194,146, 4, 82, 8,206, 40, 41,155, 34, 73,227, 40,154, 38, 85, 81,169,134,218, 95,238, 6,157,142,102,182, 83, 3,
+237,182,141,132, 0,181,180,104,235, 95,237, 99, 65, 0,193, 45,249, 32, 69, 65, 24, 97, 77,193,154,162, 26,150,215, 67, 88,231,
+164,170,243,168,202,166, 77,153, 82,210,112,206, 23,227,129,139,117, 70,112,188, 90, 38, 25,227, 77,221, 20, 89, 57,159, 38, 71,
+135,179,195, 73, 52, 45,234, 90, 8, 0,128, 10,161,165,226,192,208,124,199, 10, 66,135,103, 4,100, 4, 3, 0,202,162, 74,230,
+ 89,211, 16,182,104,249,224,113, 48, 54, 76,219,176,109,203,242,124,211,237,154,118,168,154, 14, 86,205,166, 46,154,186,114,253,
+144, 83, 66, 72, 41, 4,147, 66, 44,158,231,214,185,142, 69, 35,165, 96,180,161, 85, 86,164, 81, 60, 79,146, 40,149, 82,118, 7,
+ 29, 63,244,116,203, 86, 20, 13, 34, 4,225, 98,242,178, 21,133, 20, 16, 0,177, 24,159, 23,109,179, 35, 37, 0, 16, 66,132, 16,
+ 68, 10,196,170,130, 53, 85,183,117,203,147, 82, 52, 85, 90,165,179,186,136, 73, 93,112,198,196, 49,155,121,139, 16,111, 77,135,
+115, 78, 8,171,203, 58,137,243,233,120,126, 56,156,141,162, 44,110, 8,151, 18, 66,104, 32,228,233,106,104,155,158,111, 7,129,
+ 27,116,189,116, 24,203, 97,140, 1, 4,132,208,170,170,219, 44,142,177,162,105,170,110,106,134,105,216,182,105,187,182,225,118,
+ 76,167,163, 91, 62,214, 45, 8,225,124,122, 24,116,122, 24,171,180, 41, 56, 37,114, 49, 20, 41,192,162, 54, 22, 18,220, 26, 56,
+151,146, 51, 74,202, 58,143,211, 56,206,210,156, 52,212,118,237, 78, 63, 48, 45, 27, 41,154,162, 96,208,146,137,176,157,231, 19,
+ 2,182,222, 41,142, 5, 13, 22,245, 7, 88,248, 22, 66, 88, 81, 13,221, 14, 52,203, 71,138,202,154,162,202,102,117, 62,107,170,
+156,145,134,243, 99, 43, 62, 54,153,182, 95,226, 66,112,198, 73, 67,243,188,140,102,233,209,225,244,112, 52, 31,231, 85,201,152,
+ 4, 0, 67,104,170,184, 99,234,129,107,251,129, 19,116, 92, 63,244,130,192,217, 79, 27, 32, 65,187, 27,201,133,248,174,166,193,
+ 52, 44,203,176, 28,211,114, 92,203,237,233, 78,168, 25,142,162, 26, 77, 85, 16, 90,251, 97,143,145,134, 51, 34, 57,107,245, 4,
+143, 7, 67,142, 69, 35,219,105, 93, 70, 9,169,210, 50,139,146, 56, 35, 13, 81, 85,236,122,142,105,155,170,170, 35,164, 30,231,
+ 41, 8, 96, 27,167,128,148, 0, 74,177, 24,125,129, 18,180, 9, 16, 44,198,189, 17, 82, 32,194,170, 97, 91,193,178,170,153,156,
+147, 42,157,212,217,172, 46, 99,218, 84,183, 12, 7,252,235,210, 57,158, 55, 97, 85,213,100,105, 62, 27,199,163,225,116, 56,141,
+231, 85, 67,133,132, 16, 24, 8,185,186,214,113, 12,223,119,130,208, 11, 58,110,208,241, 92,207,182, 29,203, 58,136, 1,144,120,
+241, 49, 40, 88, 81, 53,220, 46,159, 88,150,105, 57,150,233, 6,166,211,213, 45, 31,235, 54,128, 48,153, 79,188, 32, 84, 85,149,
+214,133,224, 84, 10,126, 28,101,110,233, 76,130,119,167, 68, 24,107,170,186,140,243, 36, 41,242, 10, 66,224,122, 54,198, 10,198,
+170,130, 20,132, 80,139, 15,182, 40, 71,251,203, 16, 30, 3, 28,112, 17, 52,224,187, 65, 89,129, 72, 81,176,102, 56,161,233,245,
+ 17, 68,164, 74,171,108, 86, 23, 17,169,114, 74,137, 20,239,110,140, 2,249,238,185,164,148,156,241,166,161, 85, 81,197,243,116,
+124, 56, 63, 28,205, 70,113,158, 81,202,165,196, 16, 90, 42, 14, 77, 61,244,108, 47,112,194,142, 23,118,125, 63,116, 29,215, 50,
+ 45,203,241,187,186, 57, 95,212, 65, 10, 86, 76, 75,211,244,214,112, 12,203,113, 77,183,163,219,161,110,186,138,102,144,166,174,
+171,210, 11, 66, 70, 27, 65, 27,177, 24,184, 90, 36,225,197, 72,182, 16,139, 71, 21,156, 51, 66,155,188, 76,227, 36, 74,211, 36,
+ 23, 92,216,174,133, 80, 59,146, 42,219,209,127, 41,165, 0, 28, 66,180,248,148,146, 54,124, 9, 1, 91, 4,161, 29, 90,133, 80,
+ 65, 8, 64,164, 96, 85, 53, 29,211,233,170,134,205, 41, 41,242,184,202,167,164, 76,105, 83,114,206, 91,124,238,187,162,222,226,
+ 59, 33,218, 10,144,228,105, 49,159, 38,163,225,116,120, 52,159, 22, 85, 37, 4, 4, 64, 71,200,213,181,174, 99,250,254, 98, 54,
+204,239,184, 65,232,121,190, 99, 88,142,110,133,150,215, 81,180, 27,237,124, 7, 80, 85,108, 57,182,105, 26,182, 99, 90,174,111,
+ 56, 29,221, 14, 84,221, 6, 16,166,209,204,241, 2,199,113, 72,157, 11, 70,191,107,191, 6,128,119, 77,166,157,133,106, 63, 92,
+163,108,202, 52,143,147,104,158, 68,179, 36, 77,114, 69, 65, 66, 10, 21, 43,150, 99, 74,137,164,224, 66, 32, 8, 36, 66, 10,144,
+ 2, 64,180,200, 80,162,197,204,224,194,167, 80,187, 20,135, 21, 77, 55,172, 54,226, 40,164, 76,171,108, 94, 23,115, 82, 21,148,
+ 54,146,139, 5, 72,210,170, 75, 44,108, 16, 72,201,185,160,116, 17,143, 39,163,249,225,225,244,112,154,196, 53, 33, 82, 40, 16,
+ 26,138, 18,154,122,199,179,253,192,246, 67, 47, 8, 92, 55,112, 92,207,118, 3,215,118,187,134,237,107,166,167,234,166,162,104,
+178,181, 32, 77,215, 60,207, 54,109,203,114, 66,221, 13,117,211,199,154,217,212, 37, 33,141,235, 5,140,214,156, 53,178, 45,183,
+128,132,199, 62,181, 8, 56,139,246, 74, 10, 78,104, 83,214,121,146, 68,201,124, 22,207, 39,113, 18,231,101, 89, 35, 4,185,144,
+140,114,187,176, 92,207,178,108, 83, 74,169, 40,138, 68, 28, 34, 5, 34,212, 46,195, 1, 8,165,132, 16, 1, 4, 49, 68, 10, 66,
+ 24, 41,170,162,233,186,229,169,186, 45,165,168,146, 73,149,207,234, 34,101,164, 98,148,222, 26,228, 56, 94,117, 63, 78,229,162,
+117, 43, 82, 22,117, 28,165, 71,195,233,112, 56, 27, 37,121, 78,153, 4, 82, 69,208, 81,213,142,109,134,190, 19,132,142, 31,186,
+ 94,224,122,190,237,248,182,227,122,166, 27,234,118,168, 27,174,162,233, 24,107, 8, 31,227, 65,186,174, 58,190,103,216,129,225,
+116, 84,195, 65, 10, 78,230, 19,199, 15, 85, 85, 37,117,206, 25,249,174,196,112,236, 91,224,221, 15, 40,104,187,170,166,206,202,
+ 52,141,163,100, 54,137,163,105, 18,199,121, 85, 86,164, 97,109,204, 1, 0, 20, 37,153,207, 51,203,212, 92,223,118, 92, 75, 55,
+116, 85, 85,145,162, 32,132,129, 2, 1, 68, 10,194, 16, 97,132, 85, 5,171, 80,193, 24,235, 88,183, 20,172, 51, 82, 85,217,172,
+201,163,166,206, 24,165,226,184, 50,190,229, 80,199,146, 18, 66, 72,206,120, 85, 53,121, 86,206,167,209,232, 96, 58, 60,138,198,
+121,217,112, 1, 33,208, 21,197,215,181,174,107, 6,161, 23, 4,142, 31,122, 94,224,184,158,253,255, 52,118,101, 59,142,228, 70,
+144, 87, 93, 60,234, 80,143, 97, 24, 48,224, 63,217,255,255, 16, 79,171, 53, 82,221, 7,111,210, 15, 44, 73, 61,126,216,221, 22,
+208,221, 15, 2, 36,164,146,153,145, 17, 25, 20,111, 24, 19,109,197, 47, 57,171,179,130,145,172,128,136, 64,132, 19, 37, 70, 0,
+136,121, 89,177,250, 71, 78, 91, 82, 82, 16,193, 60, 62,234,246, 35, 56,227,173,142,225,213,170,158,180,223,247,244, 73,240,216,
+ 40,125, 44,235,188,140,195, 60,220,167,177,159,151,121,151,135,182,206,129, 8, 32,132,214,122,163, 13, 68, 80, 43,188,174,250,
+254, 88,243, 12, 87, 52,231,188,226,130, 82, 86, 21, 85,153, 23, 37,202, 16, 66, 0, 65, 4, 17, 38,164, 32, 57, 69, 8,155, 99,
+150, 91,175,143,217,170,195, 57, 23,227,183,101, 81,240, 91,241,241, 62, 56, 99, 15,169,151,105,123,220,134,207,159,143,107, 63,
+141,202,184, 0, 16,132, 52,195, 93, 85, 94, 26,214,116,162,237,234,166,227,117,195, 69,205,184,224,180,190, 20,188, 75, 42, 11,
+ 38, 57, 68, 56,161,138, 87,128, 64,218, 4, 71, 89,169,246, 13, 34, 92, 55,157,211, 71,240, 38,156, 3,103, 4,240,221,174,224,
+ 59,143, 66,112,206,154, 67,238,203, 58, 46,125, 63, 13,143,105, 26,214,109, 61,148, 52, 73, 47, 79,196, 72, 89,230,121,158, 81,
+ 90, 34,136,180,113,218,120,169,156, 84,118, 28, 15,130,135, 44, 39, 69, 78, 42, 90, 48, 94,118,151,182,251,231,191,185,248,200,
+ 10,234,189,149,107,175,182, 65,203,213, 26, 21,220,247, 70, 5, 94,236, 82, 76, 91,239, 62, 24,101,246, 93, 78,195,114,187,246,
+215,107,255, 53,109,155,117, 33, 70,130, 32,207,179, 15, 86,117, 29,111, 91,209, 92,234,166,229,162,230,162,102,188,174,171,250,
+ 82,208, 46, 47, 57,201,203, 52,238, 0,248, 84, 65,227,147, 81, 68,164,192, 89,126,236, 11,201, 11,130,137, 85,155, 63,235,241,
+ 89,245, 78,218,248, 5,222,146,111,194, 26,173,118,185, 45,211,184, 12,247,121,232,167,121,218,246, 77,106,109,188,255, 70,140,
+242,146, 11,202,107,198, 57,165,172, 36, 25,113,206, 29,187, 86,218, 6,231, 33, 66, 89, 70,152, 40,127,252,227,199,199,191,254,
+195,187,127,225,188, 4, 49, 26,185,202,173,215,251,100,212,238,172, 77,247,203,156,222,153, 84,110,194, 57,173,197, 16,172,117,
+ 74,233,109, 57,250,199,116,251,124,124,222,198,251, 38,149,119, 0,194, 2,227,182,204, 46,130,117, 23,113,110, 50, 55, 92, 52,
+140,215,156,214, 13,229, 63,114, 90,103, 37, 35, 89,129, 48, 1, 16, 2,128, 18,253,224,189, 13,222,194,151, 46, 54, 13,143,166,
+251, 17,188,117,122, 15,193,129, 87, 64,206, 9,224,196,180, 47, 26,208, 90,101,213,190, 45,235, 52, 44,253,125, 28,250,121,153,
+143, 99,151,198,184, 24, 35, 66,248, 84, 96, 88,197, 69, 37, 4,227,130,241,186,162,140, 86,140, 22, 21,199, 57,197, 36, 71, 8,
+ 35, 76, 48,206, 35, 68, 16,227, 44,171, 80,150, 5,107,244, 62,202,109,208,199,236,140,118,214,197,231,236, 2,190,131,235, 24,
+ 67, 56,167, 7, 41,213, 50,109,247,219,248,245,243,113,237,167, 65, 25, 31, 2,130,176,194,228, 66,203, 75,203,218,238,140,142,
+104,184,168, 41,175, 57,173, 79,214, 60, 43, 40, 38, 57,196, 4, 2, 24, 79,200, 26,131, 53, 70,173, 86,110,103, 6,121,239,154,
+246,226,140,124, 17,128, 79, 42,230,153, 49,239, 71,210,126,180,150,219,182,172, 99, 63,247,247,105, 28,150,117, 62,164, 84,214,
+ 58, 0, 0, 33,168, 44,242,146,150,140, 87, 92, 80, 33, 40, 19,148,215,148,113,198, 68, 91,242,143,156, 10,146, 87, 73,129, 9,
+206, 56,103, 16, 34, 89, 81, 65,132,157,218,228, 58,168,109, 48,106,115,198,120,127,242,109,225, 73, 86,196,111, 63,206,122,163,
+205,190,203,169, 95,110, 95,253,245, 58,124, 77,235,102, 93,136,128, 32, 36,242,236,131, 85,151,142,183,151,186,238,120,211, 8,
+209, 50, 46, 24, 23,130,138,143, 34,137,116, 69,133,113, 6, 16, 78, 56, 21, 70, 16,162,247, 86,235,125,218,199,235,177, 62,129,
+ 34, 66,200,233,195, 89,157, 6,171, 51,135,207,146, 12, 32,248,118,236,163,119, 70, 41,185,109,243, 54,244,243,144,162,179, 28,
+ 82, 26,239, 29, 0, 32,203,112, 81, 20, 21, 43, 56,163,188,166, 92, 80, 46, 40, 19,140, 11, 70, 69, 87,176, 75, 65, 5,206, 75,
+132,136,247,222, 91, 29,188,197, 89, 65,242, 18,132,168,183, 65,110,131,218, 39,171, 14,231,236,183, 5,238,247,193, 6, 32,196,
+ 8,210,125, 47, 74,153,109,217,135,251,244,117,125,124,126,141,247, 93,170, 16, 32, 0, 37, 65, 77,145,255,168, 89,219,137,230,
+ 52, 8, 48, 81, 51, 94,115, 38,154, 68,242,229, 37,199, 89,129, 73, 6, 33,138, 16,194, 51, 37,189, 51, 82,109,227,210,255,156,
+ 30,183, 99,151,167,133, 53, 56,227,172,244,222,191,228,205, 87,116, 82, 10,133,240, 4,238, 90,170, 99, 95,151,125,184,207, 67,
+ 63,142,195,146,196, 95,231, 2,132, 48,203,112, 89, 22,148,149, 76, 80, 33, 42, 81, 51, 38, 40,231,140, 9, 86,137, 75,193,218,
+188, 20, 56, 43, 0, 64,206,106,103, 84,140, 49, 43, 42, 76,138,224,140,222, 38,185,245, 90, 46, 70,235,224,125,240,225, 61,118,
+130,120, 94,200, 21,207,141, 92,107,173,220,213, 60,109,247,219,240,117,237, 63, 31,243,172,141, 9, 1, 67, 72, 51,114,169,202,
+ 75,195,218, 11,111,218,186,233,206,122,204,106,198, 68, 87,242,174,168,106, 82, 48,156, 23, 8,145,211,212,251,132, 42, 78, 31,
+114,237,231,254,191,227,253,177,206,155, 86,230,201, 40, 6, 23,188,123, 79, 84,239,142, 14,222,208,221,123,103,149, 58,142,101,
+218,134,126, 58, 53,153,229, 44,201, 16,194, 60, 39,101, 89,176, 84,146,207,170, 92, 49, 65,153,168, 43,222, 37,104,142, 73, 30,
+ 1, 8, 70, 57,171, 16,194, 89, 73, 33, 34,206,236,106, 29,228, 54,164,193, 42,221,146,246,106,154,224,197,105,251,152,174,231,
+ 54,218,236,219,217,173, 62,175,253,109,217, 55, 99, 35, 0, 25,130,117,158,127,240,170,235,120,211,138,166,123,213, 99,198, 57,
+167,245, 37, 29,171, 44,167,232,236,229,233, 88,165,118,108,141,218,142,249,215,252,248, 57, 62,134,117, 61,212,161,156,115,111,
+109, 62, 25,233,158,250, 6, 56,181,241, 23,236, 9,206, 26,163,228,177,190,163,179,110,235, 97,180,245,222, 35,136,178,156,148,
+ 85,193,121,197, 56,229, 53, 21,130,242,154, 49, 65, 25, 23, 37,239,210,196,139, 72, 22,162,119, 90,123,103, 49,201, 72, 81, 1,
+ 8,237, 49, 31,169, 91,201,195,189,169,156,239, 3,240,217, 27,124, 8,206, 56,165,244,186, 30,195,125,252,250,236,175,191,198,
+251, 38,117,154,173, 48,238,202,252,163,102,109,199,219,132, 0, 79,152, 67,153,168, 43,113, 73,162, 11,201, 75,140, 51,136,113,
+162, 11, 32,136,209, 7,239,180,150,235, 62, 93,167,251,117, 26,230,125, 61,164,210,206,184,115,249,255,233,203,114,103,124, 96,
+132, 1, 4,144, 32, 94, 72,194,185, 51, 90, 29,199, 50,239,195, 99,238,251,105, 30,215,125,147, 90,153, 16, 34,130, 40,207, 73,
+ 89, 21,140, 83, 46, 42, 81,211,228,165, 96,156, 81,206, 43,126,201,169, 32, 57,197, 8,121,231,188, 85,222, 89,146, 23, 36, 47,
+ 99,240,230, 88,229,246,208,199,162,149,242,206,199,144, 22,122,146, 84, 15, 35, 72, 64,228,180, 15,105,237,164, 84,235,180,222,
+111,227,245,243,113,237,151, 73, 27, 23, 34, 70,144, 18,124,161, 85,215,208,180, 70,159, 18, 71, 36,229, 67, 52,233, 88,101, 37,
+ 71, 89,142,113, 6, 33,138,175, 59, 6,157,243, 86,233,125,218,134,207,241,241,107, 30,151, 99,151, 74,153,196,255,164, 51,244,
+204, 32,255,156, 66,195,155,219, 14, 1, 68,239,156, 51,234, 80, 75,170,202,143,121, 26,215,125, 63,140,180, 62, 4,132,224, 51,
+ 58, 21, 23, 85,242,152, 48, 65, 25,163,148,179,146,167,117,142, 10, 66,232,156,245, 86,133, 16, 72, 86,146,172, 8,206,232, 99,
+ 82,235,160,228,102,181,246, 62,156,209,241, 33, 49, 29, 47, 78, 48,132,232,189,211,202,238,155, 28,135,249,215,215,112,189, 14,
+183,101,219,173, 15, 49,230, 9, 4, 10,218,181,188,233, 68,219, 10,209, 48,209,112, 33, 40, 21,140,242,238,164,207,139, 10,227,
+252, 68, 58, 39, 1,229, 19,153, 39,151,126,237,127, 78,253,144,214, 84,140,177,206,251,211, 52, 9,158, 25,148, 56,227,111,176,
+231,133, 36,189,181, 70, 73,189,206,251,216, 79,125, 63,207,195,186,109,210,156,106, 63,204,114, 82,156,209,161,188,102, 92, 84,
+140, 83,198,171,138,179,103, 73,206, 35,128,193, 25,103, 52, 0, 1,103, 37, 38,153,183, 74,109,147,218, 6, 45,119,107,173,247,
+111,223,219, 55,254, 24,156, 20,178,181, 74,153,117, 57,250,251,116,187, 62, 62,127, 77,253, 46,181, 15, 0,130,146,224,174,204,
+ 47, 34, 29, 43,241,251,177,226,137, 5,205, 42, 78,178, 50, 21,157,231,199,158, 6, 36, 99,212,118, 44,247,249,241, 57,245,211,
+182,238,242, 80,214,158, 55, 30, 62,155,210, 43,131, 82,111,120, 9, 0, 73, 99, 77,149, 75,234,196,167,244,253, 60, 15,203,190,
+ 43,165, 76, 8, 1, 33,148,165,170,204, 18,222,169, 24,175, 24,167,148, 87,148,241,146, 54,121,201, 48,201, 1,128,222, 25,111,
+ 84,140,145, 20, 37, 38,196, 25,169,247, 81,110,163, 86,210, 25,235,211,218, 24,136, 48,177,137, 39,227, 26, 1,136,222, 7,107,
+172, 60,244, 60,175,247,219,120,187,246,159,253, 50, 43,227,226,179, 91,209,178,107, 88,219,213, 77,203,155,150,243,154, 9, 65,
+153, 96, 76,212, 37,239,114,154, 38,207, 18, 98,114, 58,199, 1, 0,167,208,173,244,177,236,227,117,234,111,243,184,166, 69,202,
+228, 61,249,206,103,131,239, 11, 84, 33,250, 24,222,234, 72,240,206, 89,167,164, 89,151,109, 28,230,225, 49,207,227,186,109, 50,
+ 45, 17,156, 39,171, 44, 40,171, 24, 79,246, 36,250,180,190,208,156,114, 82,178,228, 81,115,206,120,171, 65, 4,164,168, 48,202,
+156,150,106, 27,228, 62, 25,245,252,184,192, 11,220,156, 19,121,122,111,206, 57,163,237,177,203,105, 88,127,125,245,215,175,254,
+107,218,119,231,124, 4, 57, 66, 34,207, 46,188,186,156, 48,231, 89,113, 56,101,130, 81,222, 20,172,203,169,200,138, 10,227, 2,
+ 98,146,184, 4,248,162, 58,147, 62, 58, 92,231,254,177,204,219,177, 43,173,140,127,169,174,241,237,137,249,109,195, 44,248,115,
+ 54, 75, 81,147,158, 10,119, 0, 0, 1, 97, 73, 68, 65, 84,118,214,105,165,215,101, 31,135,121,120, 44,243,184,110,219, 97,140,
+123, 69,167, 40,114,202, 74,158, 74,143,160, 60,185,130,170, 42,175, 88, 94,112,242,138,142,209, 16, 0, 92, 84, 16, 33,171,119,
+189, 15,114,155,141,214,175,100, 6,223,166,187, 23,105,225,156,215,202,236,235, 49,244,211,237, 58,124,222,198,251,126, 40, 23,
+ 0, 0, 37, 70,109, 89,124,212,180,237, 68,219,242, 58, 21,157,154,114,206,168, 96, 21,107, 11,214,228,165,192,121,137, 73,210,
+ 75, 96,186,237, 40,233,234, 86,237,114,125, 44,253,117, 26,198,117, 57,212,161,141, 61, 69,192,211,163,248,252,125,238,189,189,
+151, 23,210,224, 14,211,136,238,149,212,219,122,140,195, 60, 62,115,199,104,235, 67, 68, 8,230, 25, 46,203,156,241,146,215,148,
+ 37,160,204, 43,202, 43,202,170,138,241,156,214,201, 88,237,157,245,206, 0, 0,178,162,132, 24, 59,125,168,125, 80,219, 98,140,
+182,169,131, 62, 73,165,111,168, 52, 38, 11,165, 58,244,178,238,253,125,186,254,124, 92, 31,211, 32,181,241, 1, 35, 88, 17,114,
+169,138,143,150, 53, 93,221,180,188,110,121,157, 58,166, 72, 29,179, 45,104,147,149,140,100, 37,194,217,171,232, 36,136,235,157,
+ 54,114, 61,166,219,244,184,205,105, 35, 67,106,235, 92,112,175,235, 24, 99,120,157,172,248,114,212, 1,248,199, 31,127,188, 56,
+167,255,255,138, 15, 8,254,196, 33, 21,127,251,243,219,127,127,255, 43, 68,254,228, 89,240,181,175,248,187, 77,233, 47, 95, 61,
+254,197, 11,195,191,243, 70,224,211,255,240, 63,105,223,243,224, 10,178,220,221, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/flatten.png.c b/source/blender/editors/datafiles/flatten.png.c
new file mode 100644
index 00000000000..6c82baec5dc
--- /dev/null
+++ b/source/blender/editors/datafiles/flatten.png.c
@@ -0,0 +1,291 @@
+/* DataToC output of file <flatten_png> */
+
+int datatoc_flatten_png_size= 9114;
+char datatoc_flatten_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2,
+ 0, 0, 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,252, 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0,
+ 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0,
+ 0, 7,116, 73, 77, 69, 7,218, 7, 19, 0, 34, 12, 33,249,187,131, 0, 0, 32, 0, 73, 68, 65, 84,120,218,237,125,121,176,165,
+ 87,113,223,175,251,124,247,190, 89,222, 44, 26, 52,131,144, 52, 35,246, 29,155, 29,140,164, 17, 20, 24, 12, 9, 24,108,150, 56,
+198, 24, 85,217, 18, 18,184, 92,177, 42,148, 77, 2,146,192,142, 67,197, 46,178,176, 99,138,148,169, 74, 48,149,160,120, 9, 78,
+ 88, 21,177, 8, 36, 52, 90,144, 70, 27, 90,162,145, 70,219,236,111,222,125,247,222,239,156,254,229,143, 62,231,124,223,125,243,
+102, 24, 9,129, 69,202, 87,175,230,189,121,115,239,247,157,175, 79,159,238, 95,119,255,186, 37,219,183,111,199,143,125, 29,207,
+155, 26, 51,187,125,231,119,174,251,206, 87, 83, 59, 53, 99,138,113,105, 52,249,224,199,255,234,142,187,239,175,111, 82, 2,195,
+ 85,243,128,137, 8, 4,162, 58, 92, 61,184,240, 61,255,236,211, 23,159, 87,223, 20,182,109,219,246,132,117, 75, 34,194, 68, 26,
+ 33, 80, 81, 85, 0,242,218, 51,158,255,119,151,254, 0,128, 10, 32, 2, 0, 18, 68, 84, 0,136,136,134,102, 48, 28,204,173, 26,
+126,250,226,119, 3,104, 0,168,170, 6,141, 45,168, 52, 3, 0, 21,145,160, 24, 52, 0, 62,243,161,119, 43,128, 39, 63,251,249,
+ 42, 26,130,138,223,201, 47,172,170, 65, 67,208,225,176,105, 0,140, 15,239, 75, 41, 1, 8, 33,128, 64,132,193,252,125, 65,131,
+136, 40,128,241,226,161,141, 27,215,129, 16,129,170,168,138,136,132, 32,180, 68, 80, 68, 26, 64,198,163,165, 24,147, 0,162,106,
+ 52, 81,136,177,109, 13, 16, 8,255,247,151,191,215, 0, 88, 60,188,148,146,197, 24,151, 70,147,209,226,210,250,141,243,131,225,
+ 64,140, 42,114,197,183,175,155,154,201,113,237,221,241,188,228,142, 27, 47,167,165,107, 46,251,123, 51, 75,137,211,233,116,188,
+ 52,249,221,247,127,108,230, 77,187,126,116,245,213,151, 94,146,146, 89,178,148, 44,165, 20,219, 52, 25, 79,191,119,237, 45,127,
+241,223,190,146, 55, 24, 22,105, 4, 64,130,194, 16, 66, 51,108, 86,173,158,251,165,231, 62,229,147, 23,230, 61,214, 56, 25,105,
+ 8, 34, 34, 2,133, 2, 16, 32, 52, 58,156, 27, 14, 6,225,147, 23,190, 11, 64, 19,227, 68,131, 8, 26,146,180, 68, 64, 85, 73,
+ 54, 77, 32,243,230,203,206,203, 47,185,243,230, 31, 2,136, 49,198, 54,165,148, 72, 0, 32, 25,167,209,104, 42, 65,167, 75,135,
+ 78,222,122, 42,128,188, 81, 26, 68,178,194, 72, 16, 85, 37, 83, 51, 25, 29, 76, 41,182,109,108,154, 16, 52, 88,136,201, 40, 10,
+ 26, 72, 2,248,202, 55,119, 52,163,197, 37, 51,155, 27, 14, 82, 50, 8, 20, 74,101,140,201,204, 84,212,104,139,163, 73,179,120,
+120, 68, 50,198, 52, 29,183,163,209,120, 50,158,108,121,220,137,170, 66,202,173, 55,221,185,235,174,251,219,148,240, 72,237, 93,
+227,223,214,172, 94,245,189,175,253, 87, 17, 34,165, 59,110,185,121,188,116, 24,132,153,165,152,110,186,253,158, 15,125,236, 11,
+ 63, 94, 7, 78, 63,227,140, 47,252,231,255, 64,242,202,175, 95,210,136, 36,146, 32, 19, 65, 26, 64, 99, 74,201, 21, 50,181,150,
+146,157,123,209,199,143,190, 34,145, 29,223,248, 31, 3, 13, 20,136, 25,141, 16, 33, 1, 35,128,160, 42, 34, 26,148,141,197,148,
+ 62,251,199,239,137, 41,209,248,174,139, 63,185,252, 66, 54,157,136, 8, 68,224,251,234,138, 5,138, 10, 8,136, 40,169, 0, 69,
+ 52, 72, 10, 33,196,148, 98,250,244,197,231, 3, 60,231,194, 79,100,125, 19, 32, 78, 71, 42,162, 42, 33, 4,205, 7, 59,171, 1,
+136,172, 12, 34,126,150, 7, 77, 24, 12,154,225,220,112, 56, 55, 8, 77,243,153, 15,157,191,102,245, 42, 0, 10, 32,182, 19, 13,
+ 65, 85, 67,208,166, 9, 65, 27, 13,170,170, 34,208, 0, 74, 94,166, 95, 75, 84, 67, 19,180,145, 16,116, 56, 12,131,193,224,163,
+ 31, 56,231,233, 79, 60, 77, 1,180,227,133,211,158,252,212, 20, 19, 96, 34, 8, 1,170, 18,154, 16,154,160,162, 65,202,234,208,
+173, 46,104, 8, 33,248, 51, 52, 33,188,239, 93,191,214, 0,152, 44, 30, 48, 75,143, 61,121,203,158, 7,246,166,148, 84, 85, 85,
+ 0,131, 4,138, 32, 37,163,128,249, 49, 1,138, 42,141, 52,131,136,138, 2,112, 3, 39, 75,139,135,141,164,113,245,234,185, 24,
+227,210,210, 52,111,148,208, 40, 84, 13, 68, 50, 3,141,160,153,144,137, 70, 26,140, 38, 34,162,242,197, 47, 93,214, 0, 24, 45,
+ 46, 17, 66, 75, 70, 90, 50,166, 52,153,164,233,180,157, 95,191, 86, 4, 34, 66,154,138,152, 8, 8, 34, 17, 16, 17, 4, 40,244,
+219, 95,223,177, 48,158, 68,179, 6,192,225,133,145, 31, 62,146, 61, 13, 76, 15,220,187, 55,197, 52,157,182, 41,166,148,204,204,
+ 82,178,118,218,166,104,211,105, 59, 30, 79,199, 75,147,209,184, 93,154,198, 81, 27, 31, 57, 59,249,136,188,182,109,219,166,143,
+212,181,242,233,127,203, 27, 95,243,193,247,189, 39, 78,167,139,135, 15,221,121,243,141, 33, 4,154,197,148,226, 52,126,232, 19,
+ 95,188,245,206,221, 63,254,244,223,246,195,203, 52, 52,164,105, 24,236,184,244,111, 72, 10,132,164, 25, 45,165,148,172,109,219,
+ 20,109,113,113,233,247,254,205, 95, 28,227,209,228,238,219,174, 54, 75,128, 92,125,233, 95,155, 25, 0, 26,205,204, 0, 38, 35,
+105,201,218, 54,186,247,184,245,174,123,255,221,103, 47, 89, 89, 70, 34, 42, 34, 87,125,227, 75, 66, 87, 25,186, 42,136,229,211,
+ 0,149,166, 9, 77, 19,154, 65,120,234,105, 39,187,219, 56,242,165,174,114, 65,149,126,158, 4,116,147, 86,206,106, 40, 71,171,
+105,154,166, 9, 33,132, 79, 92,248,174, 77, 27,230,151, 95,200, 44, 45,236,187, 31,200,159, 19,138, 95, 77, 32, 32,220, 78, 5,
+ 17, 7, 13,161, 9,205, 32, 52, 33,252,233, 31,252,214,139,159,243,148,217, 11,197,118,255, 3,247,160, 28,112, 10,253,121, 8,
+ 80,233,199,189,119,228,125,105, 65, 69,127,231,205,191,252,148,211, 78,233, 93, 40,181, 89, 20, 42, 0, 52,123, 83,170, 80, 32,
+125,211,161,128, 4,213, 32,218,104,211, 4, 17, 92,240,206, 95,237, 95, 40,206,111,120, 12, 0, 17, 13, 33,136,102,115,232, 54,
+111,198, 12,169, 6,113,104,164,161,209,102,208, 52,141,124,234,162,243, 11,192,179, 56, 92,181,202,141, 95,190,115,190, 24,139,
+ 1,154,189,158, 58,230,146, 16, 52, 52,218, 52,250,194,231, 60,189, 60, 26, 77, 51,128,130,255,160,170,254,161,229,139, 18,209,
+238, 95, 37,132, 16, 26, 61,255, 55, 94, 13, 64, 83, 59,141,237, 36,165, 4, 80,139, 54,136, 64, 84, 84,225,184,178,191,180,252,
+216,110, 70, 69, 84, 67, 8,178,229,132, 13,106,113,106,105,242,196,167, 61,211,140, 0,243, 51,170,168,170,168, 66,160, 10, 71,
+162,221,181, 84, 33,160, 80,213,111,164, 27,215,205, 55,169, 29, 39, 75, 52,139, 49,133, 80,228, 36,170, 98, 16, 82,164,248, 52,
+ 33,217,191,150, 38, 71, 62, 26, 2, 53,168,182,237, 56, 78,199,177, 29, 63,238,228, 45,180,124, 62, 84,125,183,125, 7,178, 30,
+ 72, 39, 36,145, 89,217, 49, 37,141,211,113,108, 39,237,116,218,182,237,250, 13,243,142,224, 0, 8, 84, 85,144,101,150,127, 5,
+129, 64,204, 44,165,212,223,210, 16,180,105,167,173,145, 52, 51, 99, 74,105, 56, 28, 76,219, 54, 4,133, 8, 8,113,143, 45,166,
+128, 17,110,211,153, 40,238, 8, 72, 8,190,253,173,107, 29,253, 69, 51,186,233, 72,102,150, 18,140,212,124,115,241, 35, 7, 49,
+128, 25,111, 10,132,249, 63, 17, 9,114,112, 97, 68,162,105, 39,109, 34, 65,152, 37, 51, 90,178, 24, 83,187, 52, 1,176,122,237,
+106,144,249,228, 37,138,128, 52,208,111, 65, 18,139,163,165, 43, 47,191, 33,153, 25,165,153, 76, 91, 26,125,153, 52, 75,201, 82,
+ 76, 41,166,182,141,135, 14, 30,158,140,167,243,235, 86,175, 93, 63,175,170,102, 38, 84, 19, 3, 48,153,180,215, 92,113, 99,219,
+198, 73,219, 70,163, 81,154,118,218,166,100, 32, 8,184,172,252, 66, 41, 37, 26, 85,245,208,129,197,125,123, 14,154,209,239,209,
+ 78, 99, 27,227,116,210,210, 56,157,198,105,178,169,195,207, 71,149, 95,219,186,117,171,226,209,244,242, 88,107,229,215, 73, 91,
+ 54,253,234,107,207,122,198, 83,182,157,122,210,137,243,107,230,134,195, 64, 98,225,240,120,255,254,133,123,239,223,123,251,174,
+251,190,125,197, 15,111,250,209,157,143,248,154,242,130,182,158,250,184, 75,191,252, 95,140, 36, 32,204,240,243,254,187,239,184,
+239,206, 31, 97, 50, 58, 60, 25, 65, 68, 64, 51, 89, 59,144, 39,159,250,152, 39,159,178,233, 85, 47,126, 58,137,148, 82,140,201,
+104, 76,136, 41,189,247,207,254,242,224,194,225,159,104, 65,201,108,215,143,174, 50, 51,210,130,251, 87,209, 43,191,246,165,102,
+ 48, 32, 25,154,224, 7,211,151,170, 10, 18, 6, 1,161,162, 36, 33, 65, 84,204,104,106, 26,244, 35,127,120,182, 71,144, 49,165,
+ 63,250,200,231, 15, 29, 30, 61, 28, 9,169, 6,210,163, 61,220,121,227,142, 3,247,221, 53, 24, 14,114,204, 71,230,224, 28, 98,
+102, 16, 41,232, 48,227,149, 98, 74,161, 18,204,104, 38, 74, 85,181, 16,228,207,223,251, 78, 51,144,118,241,199,191,120,239,131,
+251, 30,202,150,185,217, 20,236,252,254, 55,198,139,135,220, 22,250, 13, 33, 98, 52,146, 30,142,228, 31, 28, 28, 72,142, 88,131,
+170, 1, 32, 69, 77, 25,104, 52, 85,210, 44,209,204, 44,201, 69,239,121,155, 3,220,247,252,241,103,146, 39, 41,126,204,130,204,
+ 72,139,211,201,210,226, 65, 55,232, 6, 8,144,111,131,140,150,136,158,173,151,238, 92, 24, 89, 62,165, 34,142, 63, 72,170,170,
+165, 36, 26,104, 73,204,104, 98, 31,251,192, 57, 34,242,169,191,250,202,142,157,183, 29,107, 65,180, 72,179,125,247,254, 95,247,
+ 21,142,150, 44, 71,107,112,155, 74, 80, 4, 48,152, 64, 76,216, 67, 4, 46, 39, 58, 88, 35, 77, 68,130, 24, 41,166, 34, 98,102,
+170, 98,137,102, 30, 76,218,185,111,123, 53,128,207, 93,242,205,239, 93,115,211, 74,136, 15, 72,169, 77,177, 29,143, 22, 4, 57,
+126,103,193, 8,217,147, 21,159,230,216, 4,130, 30,102,234, 96,133,123, 84,247,209,142, 19, 53,116, 8,175,130, 60, 21, 21,200,
+217,111,124,197,167, 63,120,126,208,229,134, 80, 1, 88,140,150,218,185, 53,235, 28,173, 57,152,145,242, 86, 41,191,113,255,234,
+112, 46,227, 85, 46,195, 75,218,161, 67,213,144, 63,231,128, 76, 28, 44,250,178, 66, 80, 13, 10,200,199, 63,112,238,187,127,243,
+159, 46, 95, 16, 45, 90,138,107,215,109, 40, 23,205,104, 44,104, 80, 13,170, 5,183,105,150, 74,134, 50, 88, 17,200,161, 11, 86,
+203,229, 84,160, 65, 58,112,231,144,184,113, 60,171,207,125,250,105, 31,191,240,252, 89, 9,165, 8, 75,205,160,241,107,169,170,
+ 4,136,138, 4, 4, 69, 21,143,138,170,104, 65, 53, 25, 40, 45,147, 83,127, 7,243, 46,107, 1,106,245,193, 68, 67,144, 16,130,
+ 35,207, 16,194,220, 48,124,246, 79,126,175, 91, 80,138,211,148,166,169,157,156,242,196,167,151,187,101, 52, 4, 17, 85,212,173,
+ 20,173, 48, 23,249,225, 5,162, 43,139,170,175, 91, 29, 76,150,154,147, 82,207, 82,132, 32,170,162, 65, 47,254,253,179,147,135,
+195, 22, 39,102, 4, 48, 28, 52,107,230,215,141, 14, 31, 86,101,145,189, 63,164,159,123, 35, 65,168,209,132, 66, 51, 81, 8,212,
+140, 65,213,140,196,172,170,163, 59,134,102,230,151,163,250, 37, 20, 2,199,163,244,120, 71,248,164,173, 27,159,118,218,201,141,
+ 75,200, 35, 59, 18,155, 54,111, 86,213,133,131, 7,242,241, 18, 55,199, 32,225,219, 4,165, 82,104,128,239,159,153, 10, 72, 95,
+180, 2,168,247, 94,182, 38,127, 38,133, 16,160,155,171,236, 54, 25,130,144, 66,162,105, 6, 13,128,212,142,205,220,177,146,228,
+252,252,234,185,185,193, 3,247,221, 31, 66,240,171, 23,111,235,139,115,237,241,127, 0, 85, 96, 2,208, 68, 5, 52,203,193, 65,
+183, 44,130, 25,197, 66, 85, 65,154,153, 27, 14, 19,235, 97,100,138, 32,182,109, 3, 32, 78,199,201, 23, 84,226, 87,146, 39,110,
+222,244,192,253,123, 85, 85,212, 67,146,172,239,110, 47, 13,210, 25, 71,117,227,108, 16,120,212,195,178,172,146, 22, 83,130,254,
+204,254, 45,107,152,205,236,240,129,131, 75,131, 65,211, 0,104,219,169,153, 21,175, 14,130, 30, 57,108,220, 48, 31, 83, 26,141,
+198, 38,156,141, 17, 28,140, 80,202, 53, 13, 84, 40, 65, 55,173,121, 89,126,181,124, 89, 95, 72,246,202,174,133,117, 53, 36, 7,
+195,193, 55, 47,251,174, 80, 27, 64,226,180, 53, 22, 35,157,151, 38,158, 50,176,100,195,193, 32,165,228, 14,203, 93, 1, 4, 32,
+144,227, 9, 16,208,124,107,223, 29,161,229,237,119,140, 32, 16, 35, 93,162, 42,106, 48,165, 66,115,184, 65,114,113,113,233, 91,
+255,235,251,110,220, 26, 0,211,182,166,176,243,134,121,192,231, 50,166,209,104,150, 44, 26, 1, 12,230, 6,197, 36, 58, 42,200,
+ 46,143,200, 16,193,213, 70,202,163, 67, 4,102, 57,140, 1, 64, 40,114,189,193, 31,236, 27, 95,189,210,140, 41,223,204, 23, 52,
+153,246,178,159, 21,240,148,147, 78, 88,126,209, 82, 90, 26,141,205, 44,198, 36, 34,107,231, 87, 15,231,134,240, 40,208,186, 43,
+212, 51, 37, 2, 71, 84, 2,192,213, 92,132,100, 51,108,118,124,255,134,195, 11,163,148,140,228, 52,165,104,140,164,145,190,160,
+182,202,166,250,120,228,200,200,195, 35,171,209,155,165,186,184,184,111,207,212,115,120, 94, 63,176,152,131, 86, 17,184,219, 82,
+ 21, 75,214, 78,227,120, 60,153, 44, 77, 61, 47,108,100,140,201,191, 38,109,156,198, 20,205,218,148, 34,153,160,141, 8,190,115,
+205, 29,245,120, 18, 51, 66,167,213, 45, 97, 81, 82,150, 48,174,190,234,143,229, 49,202,111, 45,203,152,229,132,177, 19,182, 89,
+ 74, 76,100, 50, 68,147,196,144, 8,106,120,148,229, 27, 61, 54,123,244, 44,102,251,246,237,122,164,153,255,135,125, 61,186, 34,
+215, 71,227,130,142, 26, 74,191,252,244,231,191,106,251,139,182,157,186,229,132,245,107,231,215,204, 1,108, 35,247,237, 59,180,
+119,255,194,221,187, 31,184,226,218, 91,190,254,237, 43, 65, 62,242,225,253,182,109,219,238,186,235, 46,255,203,147,159,120,218,
+191,254,151,231,188,244,133,191, 24,219, 8, 26,105,177,157, 30,216,183,247,193,221,119,123, 80,225, 38,217,253, 82, 74, 6,179,
+105,107, 95,250,234,229,223,185,106,231,254, 67,135, 31, 17,165,150,173, 91,183,238,218,181,235, 51,255,241, 79,206, 58,243,165,
+162, 66, 51, 41, 46,225,218,239,126,189,198, 33, 21, 65, 87, 51, 83,141,100,108,141,180,148,236, 7, 59,111,255,212, 23,254,254,
+ 39, 93,208, 69,255,234,130,119,190,253,205, 70, 74,182,141, 4,112,112,239, 3,183, 95,255,131, 92, 63, 67,231,186,221,209,185,
+ 1, 44, 86,142,102,158,168,180, 20, 41,194, 27,110,221,245,145,191,252,155,135,127,236, 31,115,226,102, 13,131, 16, 26,245,216,
+ 36, 52,123,238,223,125,231,141, 59, 66, 19,114, 74, 79,220,133,103, 8,154,145, 90, 77,241,170,151,231, 60, 31,174, 34,242,140,
+ 39,157,250,153, 15,190,251,181,219, 95,240, 48, 79,153, 87, 17, 50,206, 14, 77, 59,157,238,190,245,186,238,150,217,115,118, 1,
+164,195,142,153,208, 66,187, 11,120, 16, 38,130, 55,189,242,197,159,186,232,188,117,107, 87, 63,244, 99,159,113,129,250,237,111,
+184,252, 43, 30, 87,104, 70, 35,236,105, 15,133,236,193, 97,150, 32,194, 11, 39,185,114, 23, 74,172, 41,130, 63,127,239,217,239,
+ 59,231,205, 15,217, 14,137,199,126, 34, 55, 94,117,153, 20,114,132,195,122, 47,224, 87,168, 68, 82,178,103,205,160, 17, 51,123,
+231, 18,146, 76,151, 16, 21,193,182,199,109,254,212, 69,231,173,159, 95,243, 16, 22, 68,143,119, 52, 44, 30,220, 43, 71, 4,126,
+ 52,230,202, 76,142, 63,178, 76, 51,210, 40, 95,200,177,155,150,101, 5, 13,234, 17, 53, 4, 31,190,224, 29,103,190,224,153, 15,
+ 65, 66, 0,118,223,118,131,170, 22,108,186,204, 90,249,177,135, 44, 47,126,104, 73,217, 75, 89, 19,106,144,234,252, 17, 15,247,
+ 85,229,237,175, 63,235,253,231,189,245, 56, 22,196, 92,115,219,123,223, 46, 71,119, 68, 5,205, 61, 0, 89,203,234,229,220,101,
+173, 42,225, 72,222, 33,143,110, 21, 46,163,172,230, 89, 63,113,242,150, 77, 31,125,255, 57, 63, 86, 66,164, 25,192,241,232,112,
+ 63, 23, 85,133,228, 55,247,148, 71,142, 30, 75,192, 80, 3, 99,144,240, 18, 74, 81,114, 85,148, 36,138,230, 0, 28,162, 34, 77,
+208, 79, 95,124,254,177, 22,212,225,248,148,170,169, 97, 9,193,250, 9, 13,143,113,178, 29,234,133,243, 93,192,238, 71,163,230,
+ 4,106,205, 75,131,132,146,232,129,154,241,147, 23,189,235, 24, 91,230, 36, 9,243, 18, 73,201, 15,116,152, 84,125, 91, 43,239,
+ 73,170, 82,205,214,114, 72,215,110, 22,125,202, 57, 47,207,194, 72,200,123,167,240, 12,230,199, 63,112,238,209, 37,148, 18,205,
+ 74,164,237,161,138,118, 59,162, 57,131,230, 33,141,116,236, 2, 46,139,222,187,252,169,103,181, 4, 90, 44,130, 23,207,242,185,
+ 83, 85, 69,144,240,251,239,120,253, 81,116,136,137,102, 34, 89,228, 69, 22,213, 89,176, 99,245, 64,152,205,226,209,113,166,135,
+148,121,199, 58, 43, 37, 42,189, 44,161,136,242, 89, 79,218,250,138,151,252,194, 17, 18, 50, 58,208,232,233, 4,253, 66, 53, 87,
+ 68, 97,221,164,154, 28, 88, 49, 79,213,255,117, 94,142,162,158,128, 89, 81,137, 8,126,227,117,103,172, 40, 33,163, 37,209,146,
+160,118,195, 81,107,185, 53,230,244, 18,153,244, 66,183,149, 43,179, 58, 83,138,150, 42,156, 82,183, 13, 90, 51,170, 34,242,177,
+ 89,101, 82,150, 72,176, 25,206,229,124,158,171, 93,201,122, 85,211,232,250,147,253, 27,176, 98,110,106, 70,199, 89,247,186,166,
+219,164, 91,100, 46, 0, 96,110, 48, 56,105,243,166,254, 41,203,105,130, 85,171,215,118,186, 34,185,136, 80,125, 65,245, 17,229,
+146,203, 43,177, 43,100,168,170,204, 80,119, 45,155,170,186, 60,175, 32,252,233, 31,188,189,207,134, 36,153, 64, 91,187,254,132,
+ 34,106, 64, 81,140,126, 47, 39,216, 61, 98,190,195, 49,178,139, 53,107,214,219, 59, 87, 5, 20,203,169,170,121,117, 52,190,242,
+244, 23,244,236,144,153,165,180,113,243,150,234, 13, 50, 67, 79,196, 61, 75, 61,110, 21, 24,249,185, 6, 69, 69,115, 4,126,140,
+189, 43,217,119,116, 15,136,140,164, 28,149, 42,222,252,234, 95,202, 81,135,243, 79, 0, 10, 52,198,182,105, 6, 93, 17, 3,134,
+154,248, 20,117, 7,239, 87,112,199,239,153,150, 99,132,154,213,177, 84, 91, 79, 90, 89,167,235, 67, 78,122,174, 93, 21,182, 62,
+246, 49, 36,149,100,225, 63,182, 91, 78,222, 54,195,209, 42,167, 42, 3, 71, 65, 63,171, 91,110,121, 44,237,174,246, 33, 95, 7,
+156, 49, 1, 61, 13, 55,242,165,207,125, 14, 68,148, 48,166,104, 22, 45,165,245, 27, 55,229,188, 75,193,171,254, 28,157,110,229,
+ 53,186, 2, 85, 14,109,190,227,138, 58, 46,189, 77,130, 43, 67,183,126, 86,136, 32, 34,207,122,218, 54, 16, 10,203, 74, 77,139,
+180,184,122,205,218,156, 16,235,174,184,108, 11,164,122, 52,100, 7,236,224,145, 71,219,187,153,181, 10,107,230,181,226, 95,255,
+113,203,166,117,110,135,140, 22, 45, 70, 75, 49,165,118,243, 73, 39,121, 86,203,173, 65, 41,241, 72, 65, 53,162, 66, 17, 42, 10,
+149, 67,181,212, 64,228,232,190,132,189, 44,190, 64,165,240, 20,122,251, 46,210, 52, 10, 80, 73, 75,209, 83, 88,173,165,152, 98,
+187,225,132,141, 57,205, 84, 72, 78,249,241,242,163, 20, 24,225,150,151,153,129,228,201,255,126, 94,112,185, 75,233,130, 2,212,
+148,126,221,129,108, 18,178,132,152,204,162,215,132,204,226,252,252, 26, 23, 82,255,249,106,110,187,131,180, 80, 21, 80,233,161,
+ 20,169,162, 92,166,242,253,196,185,211, 13,115,234,186,186,164,222,251,151,198, 17, 16,245,144,211,183,204, 82,107,177, 77, 41,
+ 62,246,164,205, 30, 38,179, 39,168, 14, 95,139,171,183,195, 92, 41,113, 90,193,221, 51, 85, 22,151,165, 59, 36,120, 57, 21, 37,
+ 37,216,143,239, 0,220,124,235,221, 89, 66, 41,182,102,209,147,151,254, 50,179,249,117,107,242, 74, 56, 35,249,190, 66, 86,116,
+ 40,153,168,238,190, 58,195, 94, 17,106,169, 30,129, 25,243, 89,129,164,203,106,146,161, 9,119,237,186,167, 51,140,121,209, 48,
+150, 79, 14, 6,131,160, 33,153, 65,103, 64,116, 86,133,142,217,227,122, 15, 67, 87,252,112, 40, 71,230, 93, 50,243,116,110,150,
+119,101,215,244,245, 44,182,113, 48, 8,136,104, 60,113, 81,146,167, 64,225,202,208,108,245,154,185,209,226, 56,199,175, 61,181,
+160, 43, 56, 77,144, 45, 47, 4, 90,181, 52,215,251, 41,130,156,210, 47, 73,113, 23,204,242,213, 16, 20, 94,117,245, 45,254,233,
+134,132,165,196, 98,124, 56,155,195,159, 27, 54,147,105,235, 1,117, 13,131,188,202,225, 38, 65,213, 13, 71, 23, 95,103, 24, 80,
+158, 47,151, 59,114,166, 89, 76,142,168,219, 11,134,195,225,238,123,247,246,124,153,175,223,114, 50,198,186,188, 50,147, 49, 87,
+128, 74,108, 93, 50,217,168,250,197, 26, 69, 90,169,125,116,135, 64,178, 64, 11,196,203,130,236,178, 23, 12, 26,190,252, 63,191,
+171,170,140, 9, 64,147,115, 97,117,207, 8,163,129,190,172,124,109,231,108,106, 19,122, 54,166,240,181,164,150,247, 89, 3,238,
+188, 12,214,152, 42, 31,254, 98, 64,197,203,255, 94, 65,187,226,242, 27,104,157,149,105,156,226, 91,243,248,156,125,117, 21, 5,
+227,116,218, 14,231, 6, 26, 2,235,206,101,106, 72,118, 40, 4,141, 86,194,164, 44,243,172, 87,206, 39,173, 96,212,109,100, 35,
+215,237,184,101,225,208, 98, 42, 10,159,123, 90, 82, 76, 57, 14, 44, 11,245, 37, 91, 87,127,201,229,183,165,197,113, 74,182,102,
+126,181, 6,205,170,109,230, 38,201,216,197,100,197,128, 33, 23,211, 10, 44,207,153,157, 28,112,203,119, 46,189,186,157, 38, 43,
+246,206,192,188,101,189, 34, 95,177, 88,179, 66,234, 21, 40,104,102, 7,246, 29, 50,179,225,220, 96,126,221, 90, 21,201,201, 25,
+ 37, 76,125,171,123,204, 62,163,115, 90,186,220,160,104,192,254,189,135,118, 94,119,155, 39, 41,163, 89,178, 82,111, 19, 52, 52,
+198,152,186,247,207,108, 92, 41, 6, 38, 47,153,101, 57,121,156, 50, 58, 60, 62,116,224, 48,141,195,185,225,170, 53,171,230,230,
+ 6,218,104,117, 91, 16, 17, 24, 41, 96,175,182, 70,236,223,119,224,182,155,239,242,231, 79,201,205, 49, 73, 38, 50,145,190, 32,
+ 75, 49,117, 49,107, 87,252,241, 12,103,150,191, 23,111, 28,204,117, 69, 83, 17, 10,150, 70,227,195, 11,139, 41,210,204,220, 20,
+ 5, 39,230,135, 0,160,109,227,116, 58, 93, 26, 77,218, 54, 90,162, 87,211, 98,246, 11, 89,234,137, 76,198, 68,246, 78, 89, 15,
+ 24, 87, 60, 84,210, 16,174,215, 89,145,172,152, 92,160,223, 75, 32,161, 17,165,228,213, 19,105,218, 90,154, 56,205,210, 18, 61,
+210,179,148,104, 76,209, 98, 76,150, 44,153, 37,163, 17, 46, 30, 55, 80,205,174,251, 15, 20,132,200, 42,163, 76,103,238, 10,101,
+224,108, 73,108,230,151,182,252,151,203, 30,134,200, 28, 80, 51, 23,177,211, 56,105,134,104, 72, 94, 44, 19,205,231,115,251,246,
+237,251,247,239, 63,112,224,192,163,173, 44,244, 15,251, 34,185,113,227,198, 19, 78, 56,161, 1,112,240,224,193, 93,187,118,253,
+163, 80,142,140, 4, 78, 56,225, 4,253, 71, 65,252,156,149, 19,127,110,202,155,199,243, 10, 65,215,174, 89, 61, 28, 52,131, 38,
+132,160,206,179,129,163, 86,178,141, 49, 37,139,201,218,182, 93,154, 76,219, 54,253,255, 44,160, 87,189,252, 37,167,191,228,121,
+255,228, 85,103, 52,141,103,123, 29, 60,167, 2,242, 12, 20, 51,140, 70, 75,163,133,133,165,209, 98, 59,157, 88, 74, 51, 70, 15,
+ 72,238, 48, 8,213,102,247,158, 3, 87,223,112,235, 77,183,237,254,225,205,183,165,148,126,158, 4,180,126,221,218,179,223,254,
+235, 47,125,209,243,158,244,132,109, 27, 54,204,139,136, 35, 32,233,128,146,137,234,100,188,180,239,190,221,135, 15, 30,152, 78,
+198,150, 98, 77,168, 84, 26, 81, 8, 57, 23,204,194, 24, 87, 17, 34,184,251, 61,117,243,250, 83,206,122,254,235,206,124, 30,205,
+123, 53, 25,147, 61,176,247,224,125, 15,238,191,230,166, 59,119,236,252,209,226,104,252,168, 48,213,103,158,121,230,158, 7, 31,
+220,176,126,245,239,252,246,219,206,124,217,139,135,115,115,189,242, 11,103,242, 95,160,168,142, 22, 22,118,221,122,253,161,253,
+ 15, 54,205, 96, 25, 50,168,136,163, 3,140, 20,194, 60,246,183, 28, 81,214, 64,205, 57, 82, 21, 31,163,135, 77,115,224,105,102,
+223,189,230,230,255,115,229,245,253,110,245,159,217,107,219,182,109,143,127,252,227,229,140, 51,206,120,235,175,189,238,141,175,
+255,101, 38,214,253,238, 90, 4, 10,192, 86,109,246,222,123,215,109,215,255, 32,151,205, 43,177,128, 66, 33,141, 53,199, 88, 72,
+ 94,165,188, 96,165,102, 92,139,201, 46,178, 28,248, 73, 13,107,208, 11, 51,156,146,231,132,190, 76, 23,132,236,216,121,199,231,
+ 46,249,218,116,218,254, 44, 5,212, 56, 97, 86,181, 49,166,162, 42,236, 39,230, 84,117,207,253,247,220,113,195, 15, 20, 28, 12,
+ 27,239,245,235, 18,142, 94, 16, 82,176,240, 1,171,104,100, 38,134, 46, 21, 99,228,119,247,211, 72,154, 89,142, 80, 9, 14,121,
+ 67, 80, 51,168,152,151, 81,105, 74,242, 5,207,124,194, 11,158,249,187, 36,247,236, 63,244,205, 43,174,255,218,229,215,254,140,
+108, 80, 73, 52,169,231, 54, 59,221, 17,141,237,244,135,151,127,181, 29,143,188,110, 83,143, 16,209, 53, 88,138, 8,204,179, 67,
+ 93, 31,129, 27,163,124,104,252,223,102,123, 11,142, 76,218, 74,230, 97,138,155, 41, 17,146, 89, 94, 84,102, 67, 69,138, 96,243,
+166,245,111,121,205,233,111,251,149,211, 71,147,233,223,126,243,202,111, 93,181,115,242, 83, 83,171,166, 20,159, 43,211, 49,127,
+ 83,213,133,253,123,110,222,113,153, 0, 26,180, 20, 52,201, 82, 68,224,178,244,243,108,145,163,112, 31,104, 89, 84,200,141,104,
+ 69,203,114, 72,219,203,132,123, 65, 57, 83,147, 44,191,133, 52,102,193,145, 66,152, 43, 21,205, 8,225,234,185,225,155, 95,253,
+178,183,188,230,101, 36, 62,255,183,151,126,103,199,141, 63, 53, 47,230,228, 85,230, 28,156, 54,205,190, 7,238,185,229,170,111,
+ 53, 77,147, 11, 9,236, 82,249,210,171, 90,116, 86,217, 58, 3,132,101,186, 83, 58,102,115,170, 22,221,167,114,147,145,153,167,
+254,106, 17,187,208,141,189,166,230,105, 1, 79,201, 57,253, 89, 84,205, 47, 16, 66,206, 66,189,227, 13,103,189,227, 13, 47, 63,
+176,176,248,217,255,254,245, 91,238,188,231, 17, 22, 80,201,114,101, 55,189,120,112,239,109,215, 94,222, 52, 77, 54, 19, 44,185,
+212, 21,107, 6, 57,159, 89,184,209, 89, 5,204, 71, 36, 8,176, 98,166,213, 43,122, 43,253,165, 87,127,202,199, 93,250,193,186,
+103, 53, 73, 41,169,189,154, 48, 3,128, 13,235,214, 92,240,206, 55,152,217,183,175,186,241,146,175,127,127, 52,158, 60, 50, 2,
+242, 27, 11, 8,131,209,118,223,118, 35, 73, 47, 55, 72,205,237,246,116,167,146, 83, 86,178, 44, 46,105,116, 57, 29, 89, 86, 46,
+ 91,161,234, 81, 74, 75, 94, 22, 20,205, 76,117, 86, 86,128,159,251, 34, 32,154, 33, 32, 59,208,156,239, 6,187, 76,180,202,246,
+ 23, 62,107,251,139,158,117,232,240,232,223,127,254,239,238,185,127,239, 79, 38,160,156, 5, 51,215,147,201,232,240,194,129, 61,
+203, 49, 14,102,121, 59,179, 59,109,176,206,184,172, 32,147,156,146,150, 21,184, 72,232,209,191, 5,165,211,142,229, 44,231, 34,
+174,231,194, 50,225, 76, 0,170, 22, 31,224,167,207,106, 6,188,228,125, 5, 4,231,215,174,254,192,121,111, 77,228, 23,190,252,
+173,203,174,188,225, 97, 6,171,149,123,237, 90, 60, 90,216,223,182,147,202,176,207,118, 39, 19, 27, 51,223,229, 72, 46, 67, 53,
+189,226,101, 62,138, 20, 18, 95,150, 29,164, 95, 22,155,169, 10,151,182,175,110,246, 72,105,146,114, 35,164,121,128,145,183,110,
+193, 9, 82,133, 35,161,149,238, 38,193,185, 83,153,158, 36,148, 32,206,242,195, 63,127,221,153,159,186,248,188, 87,253,210, 47,
+ 62,172,104,222, 43, 51,150,204, 18,105,227,209, 66, 71,202,235,109,116,149,209, 74, 86, 40,179,226,170,179,135, 8, 51, 98, 2,
+103,120, 43,153,229,183,162,152, 42,235,176, 47, 54,148,217, 1,165, 21,170,163, 0,149,169, 72,206, 4,116, 82, 82,230, 37, 21,
+ 98, 66,102, 64,122, 61,228, 45,191,242,178,143,190,255,156,199,159,178,229, 33, 28, 49, 39,188,210, 18,153,220,212,197,118, 34,
+165,200,221,213,179, 73,151, 81, 69,137,172,100,175,210, 73, 32,189, 10,107,129,133,234, 24,137,181, 12, 85, 12,249, 49,138,195,
+ 86,218, 43,234, 10, 60,119,156, 89,138,213,225,177,131,170,121, 9,154,113,174,116,249,214,130, 82,115,199,139, 12,180,249,163,
+115,126,125,239,254,133, 63,251,220, 95,239, 59,184,112,156, 26, 68, 90,242, 34, 1,188,250, 86,170, 97, 93, 41, 93,179,167,232,
+ 26, 21,139, 75,118,105,246,233, 0,153, 58, 67,168,143,195,240,153, 63,157,185, 61, 86, 55, 92,223,120,207,168, 82,199, 59,168,
+212,168, 90,230, 71, 25,251, 32,133,214, 86, 57,166,133,201, 35,133,147,163, 4,101,211,134,245, 31,190,224, 29,239,124,211, 43,
+143,211, 6,177, 14, 32, 96, 74,205, 96,216, 31, 61, 81, 28,173,183,221,233, 12, 45, 80,122, 67, 10,132, 21,148,215,114,124,221,
+114,113, 19, 44, 93,101,234,216,185,206,206, 42,245,250,241,164, 55,188, 72, 58, 18, 4, 10, 41,178,207,217, 82, 55, 80, 78,164,
+206,135, 46,116,252, 41, 85,144,124,217,115,159,246,111, 47,248,237, 19, 79,216,112, 60, 26,100,158,220, 49, 75,115,171, 86, 75,
+105, 47, 82, 21, 85,138,176,216, 69, 84, 98,242, 50,219,161,149, 44,145, 89, 60,232,211,213, 40, 71,152,175,227,144, 81, 21,116,
+167, 80,153,166,152,249, 20,200, 34,201,213,194,124,111,169, 68,155,174,247, 53,115,220,178,236, 80, 78, 42, 54,173, 95,251,225,
+ 11,126,235, 69,191,240,180, 99,107,144,121,156, 35, 72, 96, 26,204,173,214,208,244,200, 43,149,174,198,186, 4,233, 17,234,102,
+ 84, 9,160,178,139, 75,123, 92,207,254,120,172,163,181,231, 30,227,196,213,170,115,134,102, 69,137,122, 36,173, 18, 15, 86,205,
+170, 12,192,186,226, 60, 58, 47,147, 77,125,120, 85, 74,118,238, 91, 94,249,155,111,120,249, 49,114,210,185,121,205, 83, 51,161,
+105,134,171, 86, 99,150,136, 11,169,100,252,142, 56,178,172,101,182, 78, 37,169,172,189, 30, 29,180,116,152, 9,107,165,245, 33,
+ 21, 24,250,108, 72,214,254,209,142,221, 55,195, 60, 68, 49, 86,210, 27,235, 82, 57,248,213, 84, 85, 59, 69,200, 43, 95,242,236,
+127,113,246,155,142,126,196, 74,135, 31,205, 66,208, 53,107,215,205,112,179,250,100, 26,167,234,149,113, 68, 42, 71,176, 80,138,
+ 25, 46, 84, 53, 41,152,193,217,123,146,103,171,101,102,226,241,104,210,202, 92,177,142,156,211, 99,215,106,161,254,150,189, 97,
+183,125, 82,249,230,218,123,158,140,159, 0,121,246, 19, 79,249, 79, 23,158,191,108,240, 79,233,151,181, 4,167,170,128, 36,215,
+ 63,102,243,140, 98, 11, 51, 39,185,112, 98, 85, 74,207,237, 44, 67,175,110,114,105, 47,239, 8,184, 5, 45,184, 29,245, 65, 5,
+ 42, 42, 62,173,233, 33,137,169,111,197, 43,118,213,106,197, 43, 69, 48, 15,143,240,227,168, 53,107, 81,209,147, 8, 50,239, 84,
+179,221,154, 95,213,252,225,185,111,157, 27, 14,151, 9, 40,193,137, 93,153,182, 24,215,206,175, 95,179, 62,243,205,252,105,171,
+ 58, 84,187,139,210,139,210,115,183, 51,120,175,167,237, 61, 75,149,137,180, 90,248,148,146,131, 88, 45,188,112, 62,180, 67, 87,
+ 25,154,253, 5, 86, 75,217,243, 36, 84, 45,158, 94,122, 93, 1,217, 26, 65,132,162, 20,200,179,158,124,202,219, 94,247,138,122,
+144,243,145, 54, 38,179,196, 20,105,145, 41,198,118,114,202,105, 79, 10,205,112, 69,208, 92, 56, 67,245,246,149, 17,135, 66,176,
+173,198,178,227,237,206, 60, 15,234,174,102, 74,189,183, 1,103, 85,125,120,135,174, 0,215, 30, 54,239, 92, 71,177,167,172,179,
+192,234,216,176, 89, 87,195, 20,227, 89, 47,125,246, 43, 94,248,156, 78, 64, 62,237,200,193,116,254,178,152, 98,123,242,105, 79,
+146, 98, 20,203, 2, 58, 6, 82,165,253,244, 6, 80,117,153,218, 28,201, 21,203,141, 35,226, 7,146, 46, 77, 15, 87,221,131, 59,
+ 86, 88, 22,175, 29,191, 42,177,199,173, 93, 54,208,170,199,250,235,209, 80, 81,209,130,214, 51, 74, 96,213,128,207,126,198, 83,
+158,250,248, 83,200,234,230, 61, 16,171,236,155,148, 44,197,166,209, 45, 39,111, 45,164, 28,150, 52,161, 1,254,229,232,127, 38,
+102,170,179, 56,178,203, 16,122, 68,222,243, 38, 57,133, 34, 29,235,188,230, 52, 43,103, 84,241,176,136, 20,165,209,191, 59, 87,
+ 93,219,128,160,223,202, 80,140,145,171,124,135,239,252,208, 89,226, 19,183,109,241, 20, 96, 69,210,137,201,233,156,209, 98,235,
+ 63,164,216,206,205, 13, 79,121,252, 19, 58, 58,149,129, 20, 51,152,229,193, 14,146,135,211,172, 68, 43,117, 38,103,241,232,206,
+210, 45, 99,235, 52,111, 95,111, 86, 2, 68,157,151,221,115,226,224,113,247,166,118, 14,244, 72,114,167,102,146, 62, 53, 51,224,
+186, 55,179, 27, 19,226,215, 80, 5, 4,107, 87, 13,154, 65, 3, 48,107,144, 31, 49,179,104, 22,253,136,249, 87,138,173,128,143,
+219,186, 85, 53, 88,143, 23, 84, 82, 17,181,167,173, 54,113,118, 64, 55, 79, 5, 20,205,104,165,128, 46,255,128,214, 24, 88,114,
+ 67,133,128, 96, 77,114,204, 0,159,135, 36,163,153,162, 75,183, 75, 94,203,146,154, 65,158,181, 77,200,227,242, 50, 36,135,143,
+ 99, 46, 54,200,204, 82,107,214, 50, 69,118, 26,212,166, 76, 17,142, 42, 60,233,228,147,154, 65,227,231,207, 63, 97, 51,212,174,
+206, 84, 85,208, 81,178,180,210,117, 37,168, 39,188,164,100, 45,178, 55, 19,143,251,197,247,203,149,105,198,163, 29, 23,119,137,
+153,195,169, 5,200,104, 23,161,118, 77, 59, 57, 61, 37, 71,140, 37,236,177, 65, 69, 16,147,181, 49, 2,210,100, 27,148,162, 21,
+ 98, 87,159,110,214, 39,192,109, 62,113,211,194,225,197,133,131, 11,137, 86,179, 17,203,202,170, 43, 5, 83, 53,221,160,222, 55,
+101,165,228, 33, 61, 78,165,239,123,110, 1, 81,136, 41, 64, 83, 8, 59,195, 81,105,180,203,220,234, 50, 33,230,107,136,154,153,
+244,104,124,189, 52,240, 81, 3, 26,191,126, 8,250,224,190,131,180,132, 48,104,178, 19,179, 72,122,149, 24, 93,191,227,108, 69,
+ 25,192,234, 53,115, 77, 19,246,237,217, 15,241,131, 13, 31,186,147,249,226,114,180,116,106,119,220, 75, 22,169,240,188, 29, 56,
+250, 76, 30,192, 58, 66, 49,132,185,180,193, 46, 47,222, 79,134,160,180, 29,247, 26, 9, 10, 77, 61, 15, 41,236, 6, 91,148,249,
+ 34,117,239,121, 84, 53, 20,129,106,184,230,186,155, 6, 77,211,250,148, 17,163, 89,138, 52,246, 62, 94, 91,141,251, 73,253,108,
+125, 30,115,226,198,197,197,165,241,210,180, 70,245, 52,206, 36,216,142, 60, 23,157,252, 42, 91,217,107,172, 90,105,193, 40,243,
+ 85,165,112,160,107,227, 99, 53,112,110, 18, 36, 3, 49, 45,177, 48,234,148,216,217,218,127, 41, 62,185, 14,230, 66, 55,133, 71,
+239,196, 17, 12,135,131,203,175,184, 49,197, 36, 18,192, 60,227,204, 44, 38, 43,204,253, 25, 17,117, 26,212, 39,192, 98,213,170,
+225, 96, 48, 88, 92, 92, 34, 13, 93,198, 25,203, 6, 48,117, 89,199, 94, 24,239,208,153,165,246, 85,102,148,229,138, 55,107, 87,
+ 90, 33,176,247, 92,100, 45,195,186,161,205,116, 77, 96,118,202,137, 85,242,118,145,142, 83,203,197,188,114,185,178,116,152,199,
+153,222,125,207,131,119,239,126, 48,228,161,115,104,188,234,100,206,100,119,116,103, 40,147, 7,242,252,239,218,113,211, 53, 9,
+ 24, 65,172, 89, 53, 76,198,201,116, 90,215,233,211, 5,235,188,166,126, 79, 43,202, 8,240, 25,170,114,111,254, 31, 75, 8, 92,
+ 16, 77,135,146,235, 40,167,126,189,187,140,101,200,215,200, 99,235,250, 12,147,202,147,149, 94, 94,118, 69,235,174, 32,216, 52,
+205,161,131,139,151,127,111, 39,123,198,170, 41, 25, 87, 51,103,163,116,231,115,230, 12,231,212,126,215, 99,128,210, 72,193,225,
+160,161, 49,209,204, 80,151, 94,162, 10,239,176,206,117,247,126,146, 25, 34,214, 39,129,160,118,198,195,132, 98,254,131,136, 25,
+139,231, 7,105, 69,130,102,168, 3,117, 72, 43, 83,159,152,155, 73,170, 35, 39,168,244,254,155, 62,255,164,194,141, 90,110, 24,
+ 14,135, 55,237,188, 99,231,205,119,105,144, 88, 6, 22,214, 35,198,148, 82,175,183,103,249,120,161,220,231,184,142, 0, 0, 3,
+ 11, 73, 68, 65, 84, 62,247, 7,125,230,113, 71, 77,182, 10,112, 86,166, 39,228,117, 64, 53, 79, 60, 98, 78,221, 19, 60,162,218,
+150,199, 63,228, 73,143,165, 91,222, 19,250,165, 66, 87,165,108, 44, 39,113,182,110,231,195,216,187, 60,121, 6, 1, 96,111, 92,
+ 48, 65, 80,131, 90,178,203, 46,221,113,240,208, 98,163,210,205,197, 98,167, 65,149,176, 46, 82,166,213,118,173,251, 62,136,140,
+121, 47,251,109, 82,245,184, 87,251,110,165, 11,174,105,130, 55, 82,212,228,244,242,243, 14,245,195, 92,167, 79,148, 94,248,124,
+ 19, 17,113, 2,145,143,118,119,153, 24,152, 11, 75,142, 21,172,212,112,217,163, 23,148,170, 97,142, 51, 40,125, 10, 14, 43, 69,
+197,125,132,132, 29, 87,236,220,179,247,160,111,103, 42,221, 52, 44, 26,210, 0,176,172, 65,179,201,226,242,119,163,101, 17,160,
+158,243,153,145, 90,121, 42,175,101,201,251, 73,156,142, 91,227,148,164, 6, 29, 14,155,208, 52,253,244, 22,188,137, 35,151, 55,
+164, 22,215,251,253, 56,116, 44, 67, 99,175,178, 83, 99,230, 58,116,129,157,120,178,136, 80,166,190,149,202,126, 41,191,148, 70,
+105,111,249, 26, 45,142,175,191,230,150, 67, 7, 23, 61,225,144,219, 70,188,140, 90, 29, 83,181, 65,253,206, 62, 0,125, 75,212,
+ 65,197,217,241, 94, 92, 54, 68,235,136,230,156,194,117, 77,211,113, 30, 9, 24,154,193,112, 56,104, 6,170, 33,248,160, 63,233,
+170,104,165,225,160,196,252, 62,113, 32,211, 26,228,200,242,153,102,162,146, 21, 2, 69,206,232,214,167, 40,255, 63,136,242, 44,
+222,238, 20, 99,220,125,247,131,119,222,126,183,247, 62,168,106,244, 22, 22,255, 31, 23,100, 46, 96,177,246,146, 53,200, 82,118,
+243, 43, 84,242,170, 82,177, 54, 53,150,158,186,238,123,105,143, 48,235,249,185,146,199,173,125, 58,109, 59, 25,143,198, 41,119,
+ 73, 64,131,206,205, 13,231, 86, 13,194,160, 41,169,203, 82, 90, 47,189,124,253, 82, 98,159,220, 87,181,188, 34, 80, 88,133, 26,
+197, 95, 74, 25,134, 34, 58, 26, 45,221,117,199,238,253,123, 14, 85, 44, 66, 48, 38, 75,201,162,165,148,204,136,220,134, 2, 38,
+ 34,101,128, 85,143,152, 37,239, 72,146, 89, 19, 61, 43,172,250,199, 12,130,156,113,106,197, 46,117,205,175, 85,106,214,141, 40,
+244,251,196, 54,182,147,246,224, 1, 3,153,138,100,125, 52, 74, 25,200,218,132, 70,155, 16,180, 9, 77, 41,117,213,243,212,139,
+105, 1,136,134, 60,150,164,109,219,241,210,100,113, 97,105,113,113, 52, 30, 77,166,211,232,241, 35,152,231, 97,230, 65,220,165,
+157,166,116,212, 88, 34,140,236,254, 4,179, 6,145, 76, 49, 19, 38,251, 94,108, 5,142, 66,117,249,172, 74, 85,108,245, 76,159,
+ 97, 29,234, 89, 4,104, 51,198,189,223, 42,228,139, 14, 42, 62,137,143,102, 49, 2, 49,150,225,124, 85,228, 93,243, 24,140,149,
+ 29,203, 62,207,179, 90,144,222,120, 73, 15, 27,115,166, 43,229,249,236, 41,101,209,120,147,151,231,187,204,114,206, 48, 58,241,
+ 72,123, 26,148, 45, 84, 47, 72,157,253, 99,230, 59,143, 20, 22,123,220, 50,235,224,190,145, 51,255, 58, 27, 10, 9,178, 9,233,
+ 37,186,114,222, 21,165,197, 19,200, 76,197,106, 6,105,150,233,162,102,133,171,229, 52,165,146,213,235, 43,175, 15, 44,180,108,
+100,147,153, 37, 38, 75,230,138, 83, 36,226,237, 97,137,244,144,221, 64,171, 17,222,246,237,219,151,117, 55, 63,148, 20,222, 79,
+153,196,253,179,188,252, 74, 55, 19,242,255, 1,146, 88, 89, 21,105,223,207, 0, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/grab.png.c b/source/blender/editors/datafiles/grab.png.c
new file mode 100644
index 00000000000..44c86d98a09
--- /dev/null
+++ b/source/blender/editors/datafiles/grab.png.c
@@ -0,0 +1,258 @@
+/* DataToC output of file <grab_png> */
+
+int datatoc_grab_png_size= 8045;
+char datatoc_grab_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73,
+ 72, 68, 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0, 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143,
+ 11,252, 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0,
+ 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7, 19, 0, 34, 12, 33,249,187,131, 0, 0,
+ 30,234, 73, 68, 65, 84,120,218,237,124,125,172,101, 87,117,223, 90,251,156,123,239,251,152,153, 55,227,177,141,191,102, 28, 59,
+ 20,140, 13, 24, 40,196, 37,197, 19,104,176,160, 6,183,196,164,161,145, 16, 20, 37,117, 74, 83,210, 34,100,250, 71,171, 68,164,
+165,129, 22, 40,144,180,170, 84,137,164, 74, 84, 41,130,202,106, 11, 77,128, 54,208,164,168, 13,148, 80, 64,184, 96,199, 54,195,
+120, 62, 60,239,235,126,157,115,246,199,250,232, 31,123,239,115,206,125,243,236,121,246, 60,240, 80,113,244,230,206,125,239,157,
+183,239, 58,107,175,189,246, 90,191,245, 91, 27, 79,156, 56, 1, 23,189,246,114,147,121,234, 95,191,247,179,155, 0, 80,238,250,
+187,255,251,192, 3,190,153,255,249, 55,190,240,230,215, 29, 77, 55, 13,203,210, 19, 45, 13, 7, 95,252,232, 63, 61,114,236,133,
+202, 52, 57,247,240,169,147,223,250,202, 67,223,141,127, 83,138,232,127,255,216,251, 7, 75,171,131,229,181,162, 28, 54,227, 39,
+102, 27,143,158, 59,247,248,195,167,207,127,245,161,147,233, 38, 0, 64, 80,114, 21,185, 74,200,187,249,198,246,108,118,102,115,
+114,114,125,235,212,198,118,119, 19,185, 42,184, 25, 5, 31,152,107,235, 55,231,213,250,100,246,196,214,116,105,121, 5, 96, 59,
+221, 20,252,220, 57,107,125,104,124,168,172, 27,207,235,113,213, 76,170,250,235,143,157,206, 42, 64,160, 96, 61,145, 13, 84, 59,
+ 95, 57, 95, 89,223,248, 64, 34, 11,122, 10, 36,158,216, 19, 5, 34,231,131, 15,196, 44,133, 49,119, 60,247,250,238, 38, 23,200,
+ 19, 7, 98,159,190,136,133, 11, 99,124,160,120, 19,238,105,238, 46,245, 58,114,221,205,239,253,220,214,238,191,123,241,115,111,
+250,206,127,250,244,151, 62,246,190,247,253,205,215, 37,101,150, 69,161,170, 44,114,203,177,235, 62,249,225,143, 12, 87,214,220,
+108,227,244, 55, 63,247,237, 83,167,191,244,224, 35,233,166, 63,249,248,251,177, 24,140, 86,214,202,209, 42, 40, 79,206, 60, 52,
+ 62,247,237,147, 79,108, 62,120,242,236,185,237,105,186, 9, 77,161, 28,220,124,203,206, 54,200,206,230,179,205,243,227,217,227,
+ 27,227, 63, 63,179,254,141, 83,231,211, 77, 28, 28,185, 25,185,138,152,156,167,105, 99,207, 79,102, 79,140,167, 79, 76,102,173,
+148, 37,135, 38,216,121,227,189,243,161,118, 97, 90, 55,147,170, 30, 87, 77, 32,234,166,133,125,229,137, 66,160,198,135,218,249,
+185,245,181,245, 46, 80,129,157,101,155, 16, 92, 32,118,204,158,216, 17, 57, 31, 2,177, 42,148,101,209,221,228, 2,249, 64,129,
+ 40, 16,135, 64,129, 57, 16, 35,192,160, 40,158,222,146,218,203,101, 46,241,239,223,251,135,155,183,189,246, 45,207, 68,162,215,
+255,165,151,127,229,223,126,252,191,252,234,125, 0,240, 43,255,225,145, 78,221, 23,253,203,255,250,155, 31,185,225,198,231,153,
+162, 32, 91,219,233,250,124,227,209, 83,143,254,159,199, 55,183,239,187,235,142,223,126,251,237,221, 64,162,250,197, 15,222, 15,
+ 8,198,148,102,184, 60, 88, 58, 56, 88, 58, 56, 24,173, 22,195, 37, 99, 74, 85,102,111,235,173,211,205,244,124, 61, 57, 59,153,
+215, 27,211,234,220,246,244,209,179,235,255,251,225,147,179,249,188, 39,145,194,242,161,231, 0, 2, 0, 98, 49, 48,197, 64,133,
+131,157,249,102, 44, 33,144,159,251,106,220,212,211,202,186, 73,213,108,206,171,245,241,236,212,250,248,193,147,103, 30, 60,179,
+217, 23,188, 4, 0, 17, 18,241,194, 12, 34, 42,172,202, 32,204,236,153,130, 39,182,157,133, 53,155,211,234,220,120,242,189,245,
+205, 11, 53, 80, 2, 0, 7, 43,193,114,104,136, 3,139, 48, 11,139, 16, 75, 96,246,196,214,133,202,185,121,227,198,243,122,115,
+ 58,223,152,204,167,149,253,214,233,141, 11, 6, 66, 96, 95, 83,168,137, 40,176, 16,113, 96, 14,204,148,253,134,245,161,178,110,
+222,184, 89,227,230,214,213, 46, 32,130,168,238, 34, 17,185, 42, 72, 28, 66, 2, 69,195, 21, 31,200, 51, 59, 79,214,123,235,131,
+ 13,193, 19,147, 40, 0, 24, 99, 6,101,217, 95, 69,217,117, 17, 7, 34, 23, 87, 64,252, 98, 14,204,158,200, 19, 57, 74,142, 77,
+ 68, 16, 97, 80,152, 65, 89,188,232,134, 43,119,177,108, 23,130, 11,193, 7,118, 68,158,217, 19,251, 64, 62,144, 15,113, 44,246,
+196,129,133,152, 69, 20, 17, 11, 52,170,186, 60, 26,246, 7,250,193,248,201, 61, 95,199,143, 31, 55,151, 62,202,219,126,235,143,
+ 46,117,136,193,104, 57,238,202,199,143, 31, 47,159,241, 40,247,255,225,121, 52,229,135,223,112,237, 94, 87,255,194, 28, 35,254,
+209,111,126,176, 12,213,231,255,244, 79,223,247,250,171,223,243,233,179, 28,220,211, 27,232, 63,126,232, 55,110,121,254,139, 57,
+184,102,251,236,214,246,119,111,184,114,237,222, 59,110,251,240, 27,175,221,171, 63,186,245,198, 27, 62,245,145,143,150,163, 85,
+ 21,118,243,237,122,251,244,100,253,177,115,219,211,211, 27,219, 91,211,106, 97,137, 32,226,160, 44, 84,149, 88, 84,213, 32, 30,
+ 92, 89,122,207,207,189,241,158,215,188,126,116,240,104, 57, 28,169, 72,176,115, 55,223,170,183, 79, 79,199, 79,108, 76,230,103,
+183, 38,223, 91,223, 94,159,206, 23, 6,250,226, 7,238, 87, 80, 68, 99,202, 97, 57, 90, 29, 44, 31, 26, 44, 29, 40, 71,203,166,
+ 24, 34, 34,185, 58,216,202,205, 54,155,201,153,217,108,188, 53,175,207, 79,102, 79,108,207, 78,157,223, 58, 95,249,133,129,150,
+ 14, 94, 41, 42, 16, 7, 26, 44,153,193,200,152, 66,153,153,107, 38, 34, 95,133,106,187,153,158,155, 85,213,164,106,182,103,245,
+230,172, 58, 55,158,158,217,154,172,143,167,139,143, 86,148, 40,140,128, 0, 32, 76, 0, 16, 56,128,170, 8,179,111,130,157,186,
+249,102,109,221,188,113,211,218,142,235,122,123, 86,109, 76,230,186,155, 27, 81, 80, 85,101, 21, 86,116, 12, 0,113, 24,242,236,
+235,224,230,181, 75,254,104,222,184, 89,101, 39,181, 29,207, 43, 46, 6, 23, 12, 36,194, 28,148, 9,148, 69, 24, 85, 88, 24, 36,
+ 48,185, 64,226,136, 26,231,107,231,231,214,205,173,155, 53,110, 86,219,218,133,239, 92,232, 33, 69, 24,152,132,156,176, 23,118,
+194, 34, 42, 44,202,204,129,217,249,180,225, 55,206,213,206,215,206, 87,214, 95,248, 92, 0, 80,170,144,176, 23,246, 28, 44, 11,
+199, 33,136,133, 68, 2,177,243,193,250,208,184, 80,123,106,156,111,156,183,222, 15,203,114,183,129,152,132,131,144, 99,102, 98,
+142, 62, 63,190, 6, 98, 71,100, 67,112, 68, 62,144, 11,100, 3, 5,226,209,112,176,203,234, 17, 14,194,158,133, 73,149, 68, 72,
+132,184,231,106,163,159, 12,105, 35, 96, 22, 81, 64, 52,187, 14,228,133,131,176,170, 8,139,178, 8,137, 18, 11,145, 4,150,232,
+191,137, 41, 14, 34,170,136, 0, 42,187, 15,196, 34,172, 66, 44, 34,194,162, 34,194, 34, 36,194,196, 36,233, 73, 89, 52,234,216,
+ 32, 18,243, 46, 3, 49,145,136,198, 79,139, 18,197, 47, 17, 33, 85, 98, 17, 81, 17, 81, 21, 80, 64,196,194, 24,222,109,214, 12,
+139, 16, 51,139, 38,225, 69, 89, 52, 13, 29,101,100,102, 85, 81, 85, 80,131, 80, 22, 6, 84,143, 30, 92,221, 57, 16, 69,213,176,
+180,178,228,247,202,209,160, 20,146,122, 20, 0, 17, 17, 13,226, 95,184,230,240, 5, 3, 49,147, 72,188, 53,169, 70,211,112,212,
+ 31, 93, 84, 84, 65, 21, 17, 17, 49,176, 60,147,180,236, 7,118, 29, 59,118,204,192,229,116,225,174,166,254, 3,190,110,127,195,
+223,186,255,179, 91, 79, 35, 54,254, 62, 93,119,189,235, 67, 47,189,231, 29, 0,200,228,255,197,235,174,120,150, 5,122,215, 39,
+ 31, 94, 62,116, 5, 40,252,175,223,255,232, 31,127,226,215,119,198,161,223,143,235,237,119,223,245,142, 55,221,251,156,171,174,
+ 17, 97, 14,214,215, 19, 59, 93,159,143,207,109, 78,231, 39,207,111,253,179,183,189,104,222,216,131, 87, 94, 55,219, 56,179, 75,
+ 96,124,233,215,176, 44,223,121,239, 61,127,251,103,127,174, 28, 29, 48,197, 0, 64,132,136,130,117,243, 45,223, 76,253,124,179,
+153,111,205, 26, 55,173,235,173, 89,189, 53,175, 95,125,235,141,159,253,250, 35, 23, 74,243,204, 5,186,227, 5,207,253,165,159,
+249,235, 47,127,225,237,197,232, 64, 57, 92, 66, 99, 64, 85, 69,132,131,119, 21,185, 58,216,121,104, 38,190,222,110,108, 93, 91,
+ 95, 89, 55,107,236,120, 94,111,204,170, 51, 27,227,179,155, 19, 83, 20,176, 24,235,119,121,218,103,126,245,190, 46,167, 80, 64,
+131,160, 80, 24, 52,166, 40, 7,163,114,184, 60, 88, 58, 80, 14, 87,138,225, 74, 57, 92, 42,202,145, 25, 12,141, 41, 0, 75, 99,
+ 64, 85,148, 3,123, 98,114,236, 45,185, 42,184,121,104,166,193, 78,173, 11, 77, 8,181,117,181,243,179,198, 77,170,102,123, 86,
+ 61, 49,158,157, 92,223, 50, 69,233,156,219,245, 81, 75, 80, 56,114,229, 49,141, 59, 20, 34, 96, 97, 76,129,166, 48,197, 0,139,
+ 65, 81,148, 88, 14,140, 25,152,162, 68, 99,208, 20, 8, 8,170,194, 65,197,147,196,205,217, 83,104,216, 53,228,230,193,206,188,
+111,172, 39, 23, 66,204,239,106,235,231,214,206, 26,187, 61,111,214, 39,179,179,155,147, 89,109,191,125,118,235,201,116, 95, 2,
+ 64, 57, 92,102, 85,108,125, 19, 22, 6, 11, 48,198, 24,163,136, 40,170, 64, 44,140,136, 0, 8,160,170,162,194,202,196, 28, 36,
+ 56, 14, 13,249,154, 93,229,201,187,152, 15,133, 24,109,132,198,250,185,115,243,198,197,156,243,252,246,116, 92,213, 78,240, 41,
+140,161, 4, 0, 64, 99, 64, 84,211, 78,140,202,130, 2,106, 84, 8, 16, 5, 98, 48, 8, 16,111,136,251, 48,135,168, 27, 14, 13,
+145, 99, 22,159,195,148, 24,169, 88,231,235, 28,150, 77,106, 59,158,213,155,211,249,184,110, 14,173,174,124,229,145,211, 23, 19,
+ 72, 85, 69, 84, 68, 65, 84, 85, 84, 1, 20,226, 63, 16, 80, 4,144, 36, 77,212, 77,156, 41, 14,204, 66,194,196,154,147, 86,118,
+129,172,167,198,251,198,133,198,249,202,250,153,181,179,218, 78,234,102,214, 88, 68,124,232,220,214, 83, 47,151, 18, 0, 84, 88,
+132, 84, 24,148, 53, 5, 9,162,202,160,162, 34,209,110, 65,147,172,241, 85,114,168, 66, 81,166, 8,244, 69,245,248, 96,227,148,
+ 57, 55,143, 17,112,109, 43,235, 61,241,129,209,112, 82, 53, 23, 23, 72,132,132, 73,133, 64, 72,132,132, 89,133, 52, 69, 10,233,
+ 18, 1,133, 36, 74, 82,166,164,184,130,152, 91, 68,209,250, 16,101,170,157,175, 93,168, 93,168,156,175,188,183, 33, 20,136,223,
+ 58,187,117, 81,135,146, 52,164, 81, 38,246,241,141,168,136,198,200, 12,146, 4, 89,186, 54,152,139,129, 33, 9, 7, 18,226,148,
+210, 59, 34, 27,200,134,224, 66,176,158,108, 8,206, 7,239, 73, 88,150,134,131,198,249, 61, 9, 36,236,149, 73,201,171,132, 24,
+ 99,169, 66, 12,251,162, 52,172, 42, 81, 14,150, 52,157, 57,138, 35,102, 98, 14,209,168,137, 60,177, 11,228, 66,124, 13, 62, 80,
+ 96, 33, 85, 64, 40,138,114,215, 20, 97, 23,112, 70,153,132,189, 72, 16,142, 79,174, 73, 2,137,162,168,112, 12,255,180, 11,119,
+185, 53, 32, 33, 78, 0, 74, 52, 35,162,148, 48,196, 71,138, 66, 20,104, 16,247,180, 7, 36, 13, 9,249, 24, 8,179,128, 72,154,
+160, 24,198,102,249, 58, 67, 78,193,119, 43, 77,126,211, 15,132, 69, 85, 52,174, 83, 48,136,140, 32,194,136,120, 81, 37, 25, 0,
+136,121, 16, 75,146,134, 69, 88,211,103, 11, 71, 81,226, 15, 23, 2,111, 18, 78,241, 50, 51,179, 80, 43,110, 94,140, 0, 0, 8,
+136, 80, 24, 44,208, 16,203, 45, 55, 92,189, 39, 13, 49, 75,212, 68,178,152,100,197,144, 68, 73,249, 72,171, 33,205,194, 41,101,
+249,168, 63,191,121,105, 34,128, 65, 44,140, 41,140,225, 66,152,101,117, 96, 46,170, 36, 3, 0,221,179,230,149, 44,162, 44, 76,
+ 61,173, 72,155, 51,228,169,229,156,129,177,168,196,220,135,133, 99,118,158, 63, 51,230, 40,113,119, 68, 68,102,121,193,197,148,
+ 20, 53,164,241, 17, 69, 65, 64,132,149, 69, 20, 32,155,112, 92,113,210,218, 80, 76,186,122,153,141, 80, 50, 56,101,142,235, 34,
+249,117, 80,141,251, 95, 76,122, 84,245,192,176,184,136, 64, 8,240, 63,190,187, 30,159, 41, 13,147, 7,147,252,109,235, 31,163,
+219,150,180,167,137,104,187, 30,227,132,130,168, 97, 65, 86,195, 88,114, 33,140,194,133,128,106,193,130,170,162,138,136,183, 61,
+111,117,102,119,143, 61,214,214,214, 46, 51,188, 49,230,102,151,143, 48, 39, 78,156, 48,184, 71,135,245,131,186, 46,175,204,245,
+114, 17,232,250,219,238,104,115,232,103, 95,160, 95,252,196,151,111,126,197,107, 53,195, 78,207,166, 64, 47,190,251,109,247,127,
+110,243,138,235,111,254,147,223,121,255,179,156, 74, 23,229,240, 61,159, 62, 11,136,160,208, 71,189,159, 29,129,126,230,215,126,
+247,185, 63,249,134,152, 56,156,252,218, 31,115,240,207,178, 81,127,245,129,127,131,168, 49, 41,253,253,127,248,166,239, 75,110,
+255,164,245,149,178,252,224, 47,255,226,157, 47,186,141,131,109,198,103,215,183,183,222,255,201,207,127,253, 27, 95,250,119,127,
+247, 53,111,255,215, 95,252,221,191,127,215,190,229,246, 79,125, 93,125,197,145,127,249,238,119,221,126,203, 11, 77, 57, 20,114,
+228, 42, 14, 78, 65, 7,101,241,119, 94,255,147, 95,126,232,228,111,255,183, 47,255,206, 59,127,234,252, 35,223,252,190, 11,244,
+ 11,247,220,253,238,183,190,117,176,124, 8, 16, 85,136,156, 13,118,230,235,109, 59, 59,223,212, 85,109,157, 11,225,192,104,112,
+245,218,193, 93,165,217, 55,129,174,189,242,138, 7, 62,240, 79, 14, 29,189,174, 40, 71,136,168,202, 28, 28,249,154,234,153,171,
+183,237,124,189,174,231,211,198, 77, 27, 59,169,154,218,250,107,214, 86,206,247, 24, 5,251, 41,208,199,254,193, 59, 79,188,226,
+149, 75,171,107,166, 28, 26, 68, 81, 17,114, 20, 28,185, 42,212, 83, 95,143, 93,181, 89, 59, 59,175,221,172,177,179,218,206, 26,
+ 59,105,108, 81, 14,158, 50,149,126,218,166, 90,188,227,238,187,222,113,207, 27, 15, 29,190,186, 24, 46,155,162,140, 69, 98,166,
+192,228,217, 55,193, 86,100,167,190,158,184,122, 92, 59, 87, 91, 63,183,110, 86,187, 73,109, 39, 85, 51,158,215,214, 63,105,130,
+ 86,170,106, 97, 76, 81, 24, 80, 0,140,105, 97,194,182,211, 29,133, 25, 13,202,149,209,232,206, 23,223,242, 75,247,220,117,244,
+138,107,203,229,181,193,210,138, 41, 71, 69, 81, 0,162,170, 10,179, 80, 96,114,236,155, 96,231,212,204,124, 51,118,118,158, 51,
+124, 55,107,146,134, 38,243,102, 92, 53,115,251,228, 2,189,237,175,252,196, 43,111, 60,170,125,192, 10, 83, 17,193, 20,131,193,
+112,105, 48, 90, 45, 71,171,229,112,165, 24, 46,151,195, 37, 83, 14,141, 41, 77, 81, 2, 26, 85,128, 8, 55, 80, 16,178,228,154,
+224,230,100,231,190,153,120, 87, 55,177, 4,100,253,220,250,170,113,243,198, 78, 43,187, 61,175,107,235,206,142,231, 79, 42,208,
+112,184,116, 96,117, 13,162,126, 98,229,192,148,166, 40,177, 28, 20,197,168, 24, 12, 77, 49, 50,131, 97, 81, 12, 77, 89, 98, 49,
+ 64, 99, 0,141,170,130, 6, 21, 17, 38, 97,207,222,145,175,201,213,100,103,222, 78,156,247,206,251,198, 83, 42,107, 57, 55,119,
+110,214,184,105,211, 76,106, 91, 26, 67,187,129,121,121, 66,202,225, 96,233, 64,130,207,192, 68,152,204,152, 65,252,120,147,190,
+ 74, 99, 10, 68, 3, 49,215, 7, 17, 85,136,137, 9, 5, 14, 13,123, 75,190, 34, 59,247,118,230, 67,176, 33,196,106, 91,227,125,
+237,124, 99,125,149, 43,138, 85, 99,245,201, 45, 26, 0, 74, 52,165, 41, 71, 25,218, 55,128,104, 76, 97,138, 18,176, 68, 44, 16,
+ 77,139,153, 25, 1,192, 88, 11, 82, 21, 22,102, 33,207, 20, 17,180,134,236, 60,184,202, 19, 57, 31,108, 32,235, 67,227,124,227,
+ 66,227, 35,148, 22,230,214,205, 27, 27, 88,206,108,111, 63,165, 64,136,104,138,182,214, 0,104, 16, 13, 0, 2, 42,128,130,178,
+ 10,128, 42, 8,230,242, 86,204, 51, 72,153,152, 28,147, 99, 87,147,175,200, 55, 46, 66, 68,145, 82, 20, 66,130,210, 34,207,204,
+249,202,186,202,249,209,160,156, 55,238,169,193, 6,196,180,215, 1, 42, 40,138, 42,130, 50, 10,196,194, 20, 26, 6,200, 80, 65,
+196,134, 98, 54,198, 94,130,231, 80,147,175, 41,248, 16,137, 21,129, 60,145,247, 17,148, 33,231, 67,227, 67,227,124, 92,252,158,
+248,224,202,242, 69, 19, 69, 4, 4, 80, 0, 17, 65, 68, 81, 64, 16, 49, 6, 85,149, 81, 81, 13,182,170,209,152,100, 51,169,132,
+ 56, 95, 18, 26,138, 64, 12,115, 32,246, 28,129, 24,242,129,188, 15, 81, 38,235,169,113,193,134,128, 10, 15, 94, 80,250,221,165,
+ 54,173, 2, 10, 10,160, 40,162, 0, 10, 2,128, 59,160,210,156, 65, 74, 2,215,216, 51,121, 97, 31,193,151, 88, 15,205,229,213,
+200,103, 73,232,140,163, 8,242,145, 15, 52, 40,139,139, 98, 86,209, 83, 43, 38, 88,161,205,202,179, 95, 82, 73,224,103, 76, 92,
+ 35,188, 17,151, 58,115,172,177, 18, 73, 96,162,150,102, 19, 25, 49,129,114,249, 56, 56, 10, 46, 16,139, 46,141, 6, 23,133, 99,
+202, 8,193, 2, 8,100,148, 12, 53, 42,109, 33,159,142,248, 43,168,136, 80,188,145, 50, 40, 67, 73, 61, 29,107,177, 99, 58, 82,
+170, 71, 7, 34, 5,240,178, 7, 4, 45,205, 81,134, 83,162, 14,226,194, 86,149,136,115,170,228,237, 4, 52,237, 45, 18,235,207,
+ 26, 75,243,137, 17,197, 28, 18, 71,138, 2,137, 15, 89, 91, 68,196, 82, 26,124,124,123,190, 7,124, 40, 42, 67, 25, 84,128, 89,
+149, 52,163, 83, 73,154, 8, 45,100, 64, 56,190,230, 98,177, 18, 51, 9, 39,162, 86,180, 39, 98, 79,146,138,246,169,116,207, 44,
+ 50, 40,204,120,182, 23,129, 32, 62,117,212, 13,129, 80, 2,101,133, 21, 50,244, 33,173, 52,144,200, 15, 25, 86,139,245,120,162,
+244,217,145, 76, 69,194, 9,105,140, 82,138, 0,192,174, 20,132,221,119,251, 56, 53, 18,129,243,196, 38,136,248,144,136,102,152,
+ 63,130,213, 10,137, 38,144, 57, 25, 45, 16, 27, 33, 47,138, 2,197, 73, 36,137, 98, 49,139,170, 58,214, 61, 9, 4, 93,193, 32,
+ 66, 81,148,225,158, 12, 2,181, 8,117, 6,135, 59,244, 51, 11,145, 20, 19,191, 36,179, 45, 18,231, 66, 68,212, 32, 86,158,247,
+136,194, 38,251, 85, 77, 0,126,146, 48, 1,248,202, 34,173,221,168,104,198, 67, 85,242, 71,182,239, 51,136,214,209, 17,226,195,
+ 41,168, 49, 56,175,220, 30,167, 44,174, 35, 6, 97, 16, 86, 0, 81,145,108, 61, 59,117,211, 74,163,105,217,199,210, 2,101, 66,
+ 67,114, 4,153, 46,145,181, 11, 6, 49, 48,239,117,202,116, 1,105,133, 22,213,203, 53, 24,200, 76,142, 92, 84, 80, 97,238, 0,
+ 90,201, 44,148, 22,129, 84,214, 14,141, 5, 69, 0, 52, 6,141,217,243,148,101, 27,138,115,164, 73, 31,113,226, 68, 57, 3,140,
+ 73, 26,101,238,102, 45,163,156, 45, 39, 70, 37,253, 5,180, 94, 31, 50,251,106, 79,248,144,170,128, 80,156, 22,141, 97, 53,128,
+198, 32, 67, 19,196,153,191,226, 22,220,250,198,182, 16, 19, 39, 17, 50,206,222,121, 44,200,232,185,170, 14,246,166,161, 84,198,
+ 85, 73,142,184,251,252, 60, 96,222, 62, 52,227,173,209,232,187,122, 67,170, 89,165,173, 16,210, 75, 10,208, 35, 38, 12, 0,176,
+182,178,180, 39,129, 68,163,249,117, 15,157,252,146,198, 72,172, 67,230,123,181,179, 84, 85,145,172,216,254, 10,144, 12, 49,167,
+128, 15, 49,194,152,135, 87, 71,123,211, 80,164, 43, 33,228,226, 38, 10,180,168, 52,104, 23,118, 68, 17, 65,242,207,115, 65, 77,
+219,204,169,181, 27,109,235,201, 25,204,143, 5,140, 61, 98,140,218,243,197,237,107,222,188, 32, 46, 58, 88, 64,208,147, 28,201,
+143,231, 39,129, 60,205, 10,185, 14, 20,165, 65, 68, 64,100,145,195, 7, 86,246, 98,212,105, 79,111, 45, 64,164,191,121,117,179,
+211, 77, 25,128,100,228, 95, 58,251, 74,186,137,102,151, 43, 10,128, 49,145, 65, 84,213,227, 87, 28,218, 83,248, 17, 13, 85, 20,
+ 90, 63,212, 70, 27,209,214,119,108,245,218, 26,182, 46,252,182, 21, 26,186,213,142, 8,216, 22,217,151, 6,229, 30, 55, 87, 21,
+129, 68, 14,139,190, 39, 70, 36,162,186,224,178,219,121, 76,114,100,195,234,166, 44,191, 73,147,134, 8, 49,217,139,105,132,168,
+ 96,107, 97, 79, 62,101,144,164,137,182, 9, 89, 44,233,102,176,175,131,228,156, 36,251,115, 17, 1, 16, 5,238,205, 42,180, 70,
+148, 23, 89, 86, 18,172, 46,141, 46,102, 67,208, 69,132,109, 13, 47, 89, 73,210, 92,183,218,251,166, 45,162, 29,243, 64,211,163,
+180, 90,132, 76, 68, 0, 84,232,149,167,110,188,106,237,162, 70,157, 22, 81,122,250,152, 21,138, 0,196,159,180, 17, 35,104,252,
+201, 14, 27,135,150, 13,209,174, 11, 88, 88,255,138, 0,208,166, 48,135, 46,166,161,242,212,184,206,163,129, 36, 95,221,149,204,
+122,159,221,250,158,174,106,214,149, 68, 69, 89, 81,196,176,160,168, 97, 44,184, 24,196, 98,153,150,138, 34, 70,101, 32, 26,105,
+ 38,199,142,193,174, 21,159,196, 60, 57,113,226,196,246,246,246,120, 60,190,220,202, 66,207,238,165,170,135, 15, 31, 62,114,228,
+ 72, 9, 0,147,201,228,212,169, 83, 63, 82,202,142, 11, 17,143, 28, 57, 98,126,164,136, 31,178,250,230,179,109, 53,230,208,213,
+ 55,252, 72, 65, 59,175, 3, 71,175,121,245,125,191,126,255,103,183,174,121,254, 75,167,231, 31,127,150,139,137,151,207, 53, 88,
+ 94,125,243,251,254,253,177,151,188, 10, 20, 55, 79, 62,248,175,222,242,188,122,188,241, 3,173, 37, 94,158,215,241, 23,191,234,
+167,126,225,215,174,125,193,203, 32,102, 53, 10,143,125,229,243,159,250,199,111,249, 62, 86,238,126, 40,156,203,241,151,220,249,
+218, 95,254,192,209, 99,207,203, 5, 20,136, 29, 33,159,249,141,251, 30,252,194,167,246,179,112,247, 67,119, 93,117,211,173,111,
+249,231, 15, 44,175, 93,133,170, 41,249, 81, 5, 68, 13,225,247,222,253,250,179, 15,125,237,162,120,249,255, 23,142,118,101,233,
+150, 99,215, 29, 92, 26,148, 6, 69,116, 99, 58,255,246,227,231, 93, 8, 0,176,254,216,131,191,245, 55,158,127,213,205,183,253,
+252,135,254,243,104,117, 45,102, 96,231,190,243,181,223,251,149,187, 84,101, 47, 5,133, 31,178,235,185,215, 95,123,235,143,223,
+124,226, 37,183,191,234, 37,183, 31, 88, 61,136,166, 96, 97, 9, 94,216,147,111,200,213,161, 25,187,102, 90,187, 80, 91, 55,174,
+234, 63,123,236,204, 3,255,243, 27,235,143,126,235,227,247,222,252, 99,127,241, 53,127,237, 31,125,226,225, 47,125,230, 15, 62,
+252,247,246,136,227, 93,222,190, 3,160, 44,203,227,207,185,234,157,111,126,211, 79,255,196, 29,195,165, 3, 88,148,198, 20, 0,
+ 24,177, 50, 38, 98,246, 66,158,189, 37, 95,147,175,131,157,120, 87,251, 64, 62, 4, 79,172, 10, 63,118,229,145,183,222,249,210,
+135,206,109,253,193, 87, 31,252,238, 87,191,240,241,123,111,218,187, 0,151,169,130,126,254,181,175,190,251, 47,191,242,166,227,
+ 55, 29, 62,116,184, 28,142, 0, 11, 52, 38, 86, 23, 99,237, 69, 57, 48, 17,147, 87,114, 20, 44,251, 38,210, 4, 66,168, 83, 29,
+204, 83, 19, 66, 99,195,220,249,198, 57, 79,188, 84,192, 45,215, 30,253,246,217,205,167, 37,201,101,161,160,107,143, 30,121,197,
+ 11,110,121,237, 29,175,120,249,173,183, 30, 94, 59,138,229, 16,208, 20, 69, 25, 65,165,132,182,112, 68,190,131, 16, 9,249, 92,
+ 83,181,228, 27, 10, 53,251,218, 7, 31, 2,249,182,246,236,125, 29,168,182,174,106,220,180,182,179,198,214,214, 47, 45, 45,173,
+174,172, 84,117,125, 89, 43,104,121, 52, 60,124,224,192,221,175,124,249,207,190,230,196,117,207,185,206, 12, 87,140, 41,139,193,
+ 8,141, 65, 52,128, 24, 1, 37,133, 72, 76,206,124,237,174,153,197,113,112, 18, 28, 83,195,190,166,224, 2,199,179, 59,226, 49,
+ 31,193,231,130,124,108,151,152, 53,110, 90, 53,227,170,153, 54,214,123, 39, 34,151,151, 5, 29, 62,176,250,211, 47,187,237,213,
+ 47,121,209, 77,215, 93,127,248,240, 21,171,171,135,138,193,168, 40,135, 16, 25, 28,133,129, 88,245, 64, 76, 90, 17,134, 72,252,
+ 79,229,101, 74,124,146,224,133,189, 4,199, 73, 53, 13,113, 8,148, 74,188, 33, 87,118,163,118, 92, 72,237, 54,149,117, 51,235,
+ 38,117, 51,174,234,202,250,192,218, 88,251,244, 20,164,170, 47,251,241, 99,127,245,133,199, 7,104, 6,101,177, 20, 11,143, 17,
+130, 67, 8,204, 34,226, 3,139,170, 11,164,160,204,130,104,136, 25, 17,134,101,105, 16, 86,150, 70, 43,163,209, 21, 7, 15, 28,
+ 90, 93, 61,124,232,224,149,107,107,203, 75, 43,229,112,169, 24, 44,153,114,132, 69, 89,148, 67, 83,148,104, 74, 52,133, 49, 6,
+ 18, 86,157,122,175, 32,117,245,136,170, 0,167, 94, 35,142,218, 33, 47, 28, 34, 33, 64,130, 99,178, 18, 28,145,101,226, 32, 28,
+136, 57, 23,192, 19, 75,128,200,250,216, 29, 21,233, 19, 97,110,179,249, 84, 86, 85, 55, 42,251,116, 39,184, 84,128,219,111,186,
+254,206,155,175,222, 89,208, 71,192,132, 44,199,111, 98, 65,160,192,162, 0, 44, 76, 81,160, 41,208, 12,138,162, 68, 51,192,162,
+ 64, 83, 22, 69, 25,223,152,162, 68, 44,208,164,102,128,200,103, 65, 52,237,112, 29, 38,216, 21,222, 89, 83, 61,149,242,106, 10,
+177,191,132,131, 23,178, 28, 44,115,232, 74,167,162, 68, 28,152, 2,245, 56, 20, 68,214,167,245, 85,197, 70,191,218, 78,234,102,
+ 90, 91, 98,134, 98,176, 61,171,158,182,130, 0,160, 28, 44, 45,173, 94,209, 86,199, 16, 90,144, 52, 34,202, 6, 17,193, 24, 68,
+131,145,196, 20, 21,132, 6,177,192,162,192,184,197, 24,147,222,160, 1, 52,198, 20,136,168,128,136,168,201,173, 8,100, 20, 53,
+ 97,181,210,182,238,177, 40,229, 5, 21,132,130, 68,171, 33,207,100,133,124,219,253, 31,105, 19,212, 53,218, 39,243,113,129, 2,
+165,230,186,218,167, 70,182,202,218, 89,237,102,181,179, 62,172, 29, 60,248,213, 71, 30,127, 6, 46,162, 4, 5, 44, 7,197,112,
+ 73,164,237, 73,140,255,226, 33, 57, 24, 57, 86,185,139,189, 83, 68,182,139, 86, 59, 89,149, 9,178,228,216,175, 46, 28,145,114,
+205,133,173, 88, 79,200,116,141,228,131, 41,182, 55,106,103, 56,142,201, 9,133, 68,110, 97,166,246,144, 5,230, 86, 65,137, 96,
+194,145, 78, 66, 46,132,198,147,245, 81, 59,110,214,184,121, 99, 27,239,135,131,193,247, 54,198,252, 52,221,115,103, 65,136,133,
+ 41, 6,136,209,128, 22,214, 24, 66, 34,161, 1,160, 65,163,198,180,223, 66,215, 54, 41, 32,177,168,162,209,100, 0, 88,219,182,
+ 74, 72,149,196, 92, 72, 74, 28, 5,137, 36, 23, 14,170,172, 76, 76, 65, 37,106,199, 9,249, 88,101,207, 60, 18, 97, 81,166,124,
+ 4, 5, 51,145,120, 38,202,172,150,220,192,150, 26, 51, 27, 31,230,214, 85,141,171,172,107,124, 48,198, 8,192,250,100,254,204,
+ 54,153, 50, 23, 65,140,162,166, 39,148, 88, 69, 74, 96, 90,230, 50, 70,118,165,130, 10,128,137,197, 12, 52, 38,118, 68, 25, 52,
+146, 22, 36,232, 78,197, 40,244,234, 17,137, 79, 34,170, 26,251, 13, 89, 36,196,198,195,212, 4, 42,156,186,162, 56,243, 36, 88,
+ 56, 58,157, 72, 32,145,180,109,197, 14,191, 64,228, 3, 71,178, 86,166,182,249,218,250,202,249,198,123, 85, 88, 25, 13, 30,122,
+ 98,251,153,153, 79,127,155,143, 15,143, 8,169,226, 10,144,190, 67, 80, 85,142, 55,168, 32,128,129,200,145, 67,100, 73, 37, 93,
+206, 0, 2,102,157,166,146,120,174, 11,101,151,204,185,215,140,218,206,216,220, 31, 75, 93, 31, 86,219, 92, 40, 18,233, 9,129,
+153,123,103,143,180,175,113,107,119,158, 29,133,200,253,171, 83,171,168,119, 62,136,192,176, 52, 13, 20, 79, 77, 73,220,107, 28,
+164, 8,152,171, 91,201, 6, 68, 34,163, 33,106, 48,173,154,164, 8,108,249, 0,176, 80, 46,210,174, 91,184, 45,148,165, 14,181,
+124, 32,141,138, 10,137, 16,196, 61, 43, 21,179, 68, 69, 41, 53, 99, 50,245,232, 52,196, 18, 36,241,163, 66, 98, 33,137,239,197,
+ 62, 46, 5, 62,100, 29, 89, 23,226, 78, 79,194,133, 49,197, 96,248,205,199, 78, 95, 74, 28, 87,182,171, 1, 59, 42, 68,222,106,
+ 16, 32,183, 92,182,197, 82,192,254,127,138,169,180, 11,105,109, 73,178,188, 24,176,162,170,228,218,112,102,106,165, 72,167,173,
+240, 71,226, 65,108,221,139,212, 8,226,244,202,204,113,137, 81,118,207,137,160,149,220, 51,185,220,247, 28, 41,155, 54,157,228,
+ 69,196, 12,128,163, 97,249,248,230,228, 18, 3,221,178, 91, 18,157,179,200,204, 5,129,196,135, 73, 70, 17,123,220,251,206,165,
+251,227,222,210,202,181,213,104, 53,145,131,209, 85,147,117,177, 96,220,182, 58, 70,214, 15,247,187,191, 51,143, 45, 55,205, 50,
+ 83,164,249, 17,133,216,243,156, 73,182, 46,219,145, 39, 14,204,162, 90, 22,133,168, 25,215,110, 63, 20, 4, 29, 87, 66, 65, 50,
+161, 35, 82, 36, 0, 85, 20, 0, 58,134,103, 94, 62,137, 58,145,119,168,174, 46, 47,208,145,115, 0, 58,162, 67,159, 53, 18,107,
+235,192, 57,136, 78, 45,160,154, 14,221,225,190,123,102,141, 62, 40,196, 83,144,162,247, 9,236,219,198,231,192,222,147, 39,138,
+145, 17,139, 34,226,176, 48, 91,214,135, 39, 39,176, 63, 13, 5,105,199,153, 16, 0, 5,137, 79, 40,152,137, 84, 57,132, 17, 85,
+ 69,200,171, 6, 34, 83, 22, 58,230, 78,207,154, 20,178, 25,197,241,165, 95, 89,143, 41, 87,164, 72,118, 13,242,185, 77, 54, 17,
+248,114,100, 24, 73,190,220,182,130,119, 76,205,184,202, 56,169,198, 83,164,108,138,170,148, 69,177,178,186,242,103, 39, 31,187,
+244, 92, 50, 47,177, 68,121, 77, 90,136,110, 53,211, 42,162,127,149, 24,224, 73, 62,163, 33, 83,153,211,226,234,104, 66, 61,155,
+132,182, 97, 23,250, 77,186,137,220,210,210, 13,165,127, 10, 20, 75,236, 26, 94, 88, 98, 34,185, 51, 62, 25,142, 39, 74,244,218,
+ 16,149, 69,137,161,168,138,198, 12, 74,115,102, 92,239, 75,178, 29,151, 88, 58, 15, 66,115, 67,116,203,183,105,125, 7, 44, 50,
+183,180,167, 14,109, 9, 56,189,149, 6,153, 41, 18,211, 45,232,233, 53, 17,146, 4,164,245,211,169,217, 92,120,193, 1,101,254,
+172, 68,111, 29,151, 88,235,179, 53,176,120,106,237, 75, 83,103,185,106, 89, 20,195,225,232,228,247, 30,223, 55, 5,105,203, 64,
+ 2,105, 57,127, 32,220,197,117, 29, 71,168,231,108,210, 62,215,177, 94, 22,237, 72, 59,166, 33,128, 72,199,105,218, 65,103,235,
+ 72,180,204,209,142,162, 31,105, 79, 6, 75, 17, 16, 73,123, 2, 68,246, 77,156,200,208, 18,143,152,148,116, 68,152,193,185, 11,
+162,186,127, 22,148, 25,254, 93, 44, 23, 77, 38, 55,168,107,251,120,157, 67,207,235, 82,251,250,202,111,114, 79, 69, 10, 19,163,
+ 57, 73, 38,245,102,107,106,137,198,194,153,144,220,158,105, 38,241,136,135, 54,255,106, 13, 42, 49,179,243, 73,110,137,217,158,
+143, 43, 3,131,102, 80,150, 27,211, 70,247, 81, 65, 45, 5, 89, 69, 64, 89, 85, 65, 88,148, 33,138,221, 90,132,244, 20,209, 87,
+ 16, 68, 94, 90, 75,192,234, 49,169,186, 29,189,231,131,160,199, 91, 19,237, 24,198,137,209, 44,172,210,242,123,169,119,174, 1,
+ 39,174,169,178, 42,119, 39,215,101,230,162, 2, 36,208,193,120, 98,216,167,171, 76,248,140,136, 68,237, 72, 60,165,134, 53,158,
+ 90,145,142,234,203,100, 64, 93, 92, 62,253, 39, 95, 52,168, 86,230, 54,124,208, 11,136,162,241,193,184,117, 67,153,105,157,218,
+ 29,210,129,121,221,241, 15,153, 0,205, 57,164,236,113, 58,115, 80,159, 88,172, 42,251,167,160, 24,227, 68,130,187, 70, 29,197,
+ 55,241,184, 28, 5,136, 13, 65,189,173, 42,175, 17,104, 41,212, 49,218,217,161,178, 78,119,249,152,164,236,213,218, 86,135, 72,
+244,206,129, 34, 36,141, 40,244, 76,166, 59,191,131,219,131, 53, 22,248,144, 11,232, 67,196, 91, 84,116, 63, 21, 20,139, 6,217,
+ 55,147,182,204, 82,200,241, 93,247, 77,118, 71,210,174, 44,216, 65, 26,236, 44, 8, 22,131,230,158, 41,181,116,230, 54, 2,234,
+ 36,104, 25,218,210,181, 29,236, 36,253,102,162,116, 14,185, 58,240, 37,149,210,246,143, 77,216, 58,105, 78,199, 65,165, 51,111,
+250, 43, 8,178,163,129, 69,154,102,219,187,208,134,127,176,131,245,221,210,114, 85, 46, 32,157,119, 58,234, 90, 65,186,243, 84,
+ 22,104,174, 11, 36,223, 54,112, 91,168, 46, 38, 60, 34,125,254,202,104,176, 95, 10, 50,201, 30,152, 19, 42,220,211, 75,231, 83,
+ 23, 44, 38,247, 32,166, 7,128,158, 99,210, 5,238,123,159, 9,222,139,163,210, 99,199,182,162,222, 81, 46,173, 26,165, 11,237,
+ 51, 53, 92,122, 1, 88,175,191, 32,162,195, 45,184,137,152, 90, 38,142,172,174,152,125,226,164, 26, 72,217, 18,165,254,148, 5,
+ 95, 2,121,193, 67, 62, 55,171,147, 79, 85, 21, 53,167, 94,216,182,176,244, 40,214, 34,139, 13, 23, 11,111,122, 39, 17,101, 51,
+ 17,145, 69,101,246,119,128, 69,202,119,162,175,228,202, 66,215,248,160, 32,170,195, 2,175, 90, 59,176,175, 22,148,143,147,138,
+ 84,237,238,169,122, 12,255,174, 81,170,157, 71, 78,191,144,236,119,186, 59,187,130, 78, 78,124,243,189, 59,168,251, 93,254, 33,
+189,195,212, 18, 53,187,205,229, 90,160,160, 93, 84,109,171, 3,230,119,128,136, 96, 64, 85,137,249,166,171, 14,239,159,130,160,
+199, 80, 7,237,123,150,206, 28,180,163,119,199, 12,164,211, 96, 86,113,127,167,207,198,176, 16, 49, 94,120,114, 82, 34,174,119,
+227,195, 5, 43,171,159, 3,107,223,144, 16,219, 51,157,192, 24,211,150,150,210,159, 50,223,124,205,209,125,116,210,201,178,211,
+174,212,182, 58,180, 45,100,121,155,111, 59, 86,226,137,189,189,134,128,246,222,244, 76,253,113,118, 16,250,115, 83, 72, 58,238,
+ 46, 38,129, 45,149,191, 83, 51,162,118,219, 97, 91,205, 76,170,137,135, 24, 27, 4, 99, 48, 54, 19, 42,166, 99, 32, 21,128, 85,
+ 15, 47, 15,151, 71,131,198,133, 75,181,160,232,104, 88,186, 94,186,222, 36,182, 30,185,127, 67,151,133,239,136, 3, 83, 16,216,
+107,231, 72,171, 15,250,187, 53,116,141, 59,208, 51,194,252, 19, 1, 76, 3,182,163,236,240, 65,154,131, 66,204,149,169,222,114,
+139, 93, 24,170, 90, 24,188,234,130, 67,155,159,217, 18,235,186,141,114,108,154,155,175, 68, 58,173,117, 25,194,194,247,253, 80,
+165,215,184, 1,189,118, 10,209, 29, 45, 67,253, 46,143,197, 93, 60,194, 32,186,120,231,194, 81,103,139,177, 97,139,144,183,197,
+108,104,171, 81,162,215, 28, 62,112,137,219, 89,116,210,144,207,194, 4,233,247,205, 40, 72, 23,254, 44,100,164,189, 46,173,228,
+ 65,219,168, 47,118,228, 73,215,233,181,176, 3, 74,191,171, 74, 22,246, 53, 88,216, 25,122, 86, 41, 11, 71,192, 45, 58,162,158,
+ 51,202, 77, 60,109, 31, 95, 52,199,235,142,174, 93,250, 54,223,206,115,182,161,188,210,242, 83, 66,182, 44,136, 97,139, 74,119,
+ 86, 96,215,238,215,158,117, 42,253,246,183, 5,251, 74,237,105, 11, 46,188,181,151,206,112,186, 4,165, 85,142,228,226, 99,187,
+202,186, 88, 17,119,144,210,218, 75, 20,142, 29, 57,176, 31, 75, 76, 85, 1,165, 13, 83,243, 97, 7, 49,204, 89,124, 78, 0,221,
+ 1, 28,102, 83,234,218,130, 51,228, 42,169, 63, 95, 22,252, 79, 14,181, 35,174,152,140,180,139,185, 65,251,122,203, 38, 12,105,
+ 31, 88, 72,151,115, 61, 5, 80,251,197,202,238,189,170,168, 94,121,232,153,120,162,174, 29, 74,247, 11, 59,217,141, 97,184,111,
+127,129,151,244, 89,170,250,204,250,189,254, 31,131,117, 74, 17, 84, 89, 65,223, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/inflate.png.c b/source/blender/editors/datafiles/inflate.png.c
new file mode 100644
index 00000000000..cd6f11877c7
--- /dev/null
+++ b/source/blender/editors/datafiles/inflate.png.c
@@ -0,0 +1,283 @@
+/* DataToC output of file <inflate_png> */
+
+int datatoc_inflate_png_size= 8840;
+char datatoc_inflate_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10,
+ 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0, 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77,
+ 65, 0, 0,177,143, 11,252, 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112,
+ 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7, 19, 0, 34, 12, 33,
+249,187,131, 0, 0, 32, 0, 73, 68, 65, 84,120,218,237,125,105,180,101, 87,113, 94,213,222,231,220,233, 13,253,222,107,117, 75,
+173,110,181,100, 13, 72, 50, 72, 13,200,203, 96, 57,180,137, 72, 20, 47, 7,219, 66, 3,131, 77,134, 31,128, 18,201, 32, 44, 44,
+203,204, 34,194, 16, 20, 67, 48,150, 77,178, 48,136,197,138, 77,176, 96,101,145,193, 33,113, 86,236, 8, 7,107, 0,164,196, 78,
+188,146, 56, 72,104, 86,143,111,184,247, 76,123,239,170,252,168, 61,157,251,154,150,132, 21, 71, 56, 92,129,250,246,123,247,158,
+ 83,167,118, 85,237,170,175,190,218,194,131, 7, 15,194,211,190,158,201,135,138,185,191, 47, 45, 45,253,219,175,252,222,116,186,
+249,232,195, 15,189,233,205,111, 73, 31,250,218,221,119, 59, 71,206,210,112, 84, 22,197,176,105, 59, 6, 53, 89, 92,254,149,219,
+ 62,242, 11,191,120, 51, 0, 20, 68,132,186, 80, 64,101,169,141,233,172,107,219,182,109,219,166,109, 91, 99,157, 92, 73, 1, 0,
+ 0, 50,128, 46,138,141,141,141,173,173,205,173,205,141,173,205,205,173,205,205,205,205,205, 79,254,198,237,254,118, 76, 0, 4,
+ 77,211,212,245,172,169,219,182,237,166,211,141,227, 71,143, 62,249,216,195,167,158,186,251, 31,125,228, 67, 10, 0,152,136,152,
+140, 49,107, 59,119, 43,173, 14, 31,122,226,137,199, 30,125,248,161,111,117, 93, 61, 26, 47,168, 98, 80, 0, 0,177,115,206, 17,
+145,181,118,101,199,218,232,130,241,116,186,117,222,249, 23,106,173,219,166,241,183,115,225, 69,206, 57,114,128, 56, 26,141,181,
+210, 93,215, 18, 17, 17, 21, 0, 96,173,115,206, 89,107,156,115,206, 89,178,214, 57,249,159,127, 21, 0, 96,140,113,206, 58,235,
+ 44, 57,178,198, 58,107,141,181,214, 89,107,173,181,206, 58,124, 70,107,247, 76, 94, 56,247,247,187,239,253,122, 93, 87, 27,199,
+143, 93,113,197, 21,233, 67, 47,121,233, 75,127,237,246, 95, 23, 5, 44, 45,175, 88,231,170,217,108,115, 99,253,240,161, 39,223,
+252,230, 55,203,135,244,151,255,213,191, 70, 86,128,170,174,166,170, 40,187,174,171,235,122, 86, 77,183, 54, 55, 95,120,193, 11,
+190,246, 71,119, 3,128, 98, 70, 70, 0,196,166,174,101,213,166,211,205,173,205,205,233,214,214,230,198,241, 95,249,200,135,228,
+ 67,192, 12, 68,110,215,105,123,143, 30, 57,114,236,232,225,163, 71,142, 28, 61,114,228,208, 83, 79, 60,250,208,255, 26,142, 23,
+222,126,253, 91, 20, 51, 51, 59, 34,106,154,102,231,174,221, 27,235,235, 79, 61,241,248, 99,143,124,251,145, 7,255,199, 43,255,
+198, 21,136,106,215,105,123,241, 15,255,232, 94,231,200, 89,235,156, 53,214, 88, 99,102,179, 89, 53,155, 34, 34, 17, 85,179,233,
+116,107, 67,137, 90, 41, 45, 2, 21, 69, 57, 89, 88,208,186, 32, 34, 38, 98,226,194,175,171,115,198,134,207,145,113,214, 57,103,
+157,181,206,145,115, 84, 24, 99, 28, 57,138,159,176,198, 47,152,117,214, 57,107,173,115, 14,158,171,181, 83,240, 28,189,122,254,
+171,148,186,230,154,107,174,253,123,215,146, 35, 34, 90, 89,219,169, 84,225,136,172,181, 93,215,117,109,211,212,117, 85,205,182,
+ 54,215,175,187,238,122,107,109,239, 66, 68,116,247, 61,247, 17, 51, 48, 48,147, 99, 6,230,114, 82, 0, 40, 6,101, 29, 57,103,
+141, 49,214, 24, 99,140,232,134, 25, 62,252,161, 95, 62,252,212, 99,183,125,244, 19,189, 71, 67, 93,160,214,168, 20, 40,165,116,
+ 49,158, 44, 28, 61,124,184,170,102,213,108, 54,155, 77,103, 51,121, 51,147, 55,149,127,213, 93,103, 62,254,209,219,122,143,198,
+ 12,192,192, 98,237,204,206,185,225,120,114,236,232, 81,165, 53, 0, 16,145, 49,198,152,174,109,218,166,169,155,186,154,110,109,
+109,172, 31, 59,252,228,227,103,159,123,254, 39, 62,254,177,106,186,249, 75,239,185, 69, 46,196,204,192,204, 68,196,204, 77,211,
+ 12,134,227,213,157,250,201, 39, 30,171,166, 51, 49,175,174,107,229, 66,179,233,214,230,198,241,163,135, 30,155, 76, 22,180, 46,
+152,169, 28, 77,110,189,229,189, 5, 0, 56, 34, 32,242, 23, 2, 38,231, 28, 91, 38,218,181,235, 84,179, 98,170,106,182,190,126,
+188, 51,157, 49, 93,215,181,186, 40,246,238,255,129,139, 94,252, 67,147,201,132,153,186,174, 67, 84,186,148,184,228,156, 92, 7,
+152,136,153,200,145, 99, 34,199, 68,192, 52, 26, 13,119,237,218,189,182,118, 10, 57, 43,198, 75,142,156,179,214, 90,103, 28, 19,
+ 19, 51, 51, 72, 88, 50,162, 11, 38, 34,185, 20,177, 99,199,142,136,153,156, 35, 34, 38,231, 63,224,136, 40,248, 3,201, 85,179,
+248, 6,204,196,142,136,137, 29, 16,136, 72,204, 44, 17,148,153,157,179,114, 27,231,172,115, 68,222, 87, 68,176, 16, 3,173,237,
+136, 9, 8,136, 69, 40,241,118,175,123, 34, 71,142, 28, 59,114,196, 68, 78, 28,208, 58,107,140, 13, 33,246, 57,141,147,207,201,
+107,255,254,253,207,153,211,254,223,241,254,237,175, 59,191,248,165,211,247,158,225,172, 13,190, 63,251,192, 45,239,255,147,255,
+246,223,159,102, 43, 25, 14,135,159,254,244,167,247,236,217, 67, 68,142,220, 41,187,246, 48,176,115,212,117,157,233,218,166,174,
+197, 69,214,143, 29,121,219,219,111,156,211, 17, 2,192,157, 95,250,226,105,167,157,142,128,204, 44, 22,224, 28, 45, 45,239, 64,
+165,153,201, 90,107,140,233,218,182,105,154,166,158, 85,179,217,214,230,198,147,143, 63,242,193, 15,223,150, 95,168,184,231,190,
+175, 19, 49, 3, 48, 49, 19, 33,128, 42,180,210, 68,204, 24,172, 88, 34,180, 55,104, 34, 98, 30, 12,199,243,202, 70, 85, 32, 42,
+ 68, 4,133,136, 74,235, 98, 52, 26,145, 35, 31,201,140,233, 58, 99,173,181,198,154,174,147,208,230,172,117,228, 94,119,229, 79,
+246,148,141,136,136,200,196, 0,136,200, 74,235,166,174,218,174,149, 31, 16,145, 13, 97, 36, 4,128,174,237,186,174,109, 23, 22,
+ 38, 90,107,231,178, 36,136, 25, 88,212,206,204, 12, 74, 23, 77,211, 52, 77,221, 54, 77,219, 52,109,219, 54, 77, 35, 42,106,219,
+ 86,126, 40, 1,238, 99, 31,189,109,117,101,135,191, 16, 51, 0, 2, 34, 16, 17, 1, 16,145, 46, 74,211,117,117, 85,213,213,172,
+174,171,186,170,155,166,105,234,166,109,154,186,170,234,170,170,102,179,217,116,171,174, 42, 93,148,239,126,215, 59, 17, 81, 36,
+146,240,232, 31, 85,194,196,242,202,106,211,212, 85, 53,171,170, 89, 85, 77,171, 89,140,223,211,217,108,107,107,107, 99,227,248,
+225,189,103,158,163, 80,233,162,252,224, 7,222,199,204, 5, 51, 51, 19,203,245, 36, 66,119,102, 52, 26, 47, 46,237, 56,114,248,
+169,174,235,172, 87,121,219,212,117, 85, 85,211,173,205,245, 99,135, 55,214,143, 29,248,161,151, 35, 42,165,148, 46,202,203, 94,
+249,138,130,153, 1,152, 73,210,188, 16,185, 29, 47, 44, 46, 18,185,195,135, 14,205,166, 91,117, 93, 55, 77, 93,207,170,217,108,
+ 58,221, 60, 94,207, 54, 47,122,233,203,119,172,172, 1, 0, 32, 42,165, 81, 21, 34, 17, 51,131, 15,153, 12,204, 62, 14,141, 70,
+227, 93,167,158, 58,158,140,215,143, 31,223,220, 88,103, 98,165,213,202,218,218,234,202,234,142,149, 21,165,181,179, 86,182, 31,
+ 68, 44,152,217, 57, 47,146, 68, 50, 17,138,136,136,169, 44,138,165,165,229,209,112,184,186,186,102, 76,231, 28, 33,130, 82,138,
+153,173,181,254,206,113,167, 5,112,156, 94, 94, 28, 32, 6, 98,102, 70, 68,173,139,209, 72,149,101,233, 66,148,245, 87, 73,171,
+132, 5, 17, 59, 71, 94,211,226,108,142,152,217,129, 11,145,151,200, 63, 55, 75, 82, 29, 5,143, 47, 0, 46, 56, 62, 78,120, 36,
+ 9,216,217, 35, 58,246, 59,139,127,222,248,255,248, 37, 6, 40,124,184, 39, 34, 96,246,187, 90,184,166,139,235, 64,254, 86,254,
+203,196,204, 46, 94,145,153,153, 11,114, 46,126,215, 63, 0,113,184, 6, 57,231,124,110,199, 68,228, 28,115, 18, 39, 60, 55, 17,
+ 3,115,225,136,156, 35, 31,136,124, 56, 10,247,116,142,153,228,214,254,102,228,228, 73, 37,190,196,135,141, 18, 81, 16,135, 28,
+ 17, 36,125, 16, 51, 57,158,191,127,220,252,194, 38, 76,204, 12,207,171,125,237,140, 51,206, 80,240,124,122, 33,226,243, 75,160,
+167,223,102,159,225,235,188,243,206,123,231,187,222,117,214,153,103,185,224,207,214,116,191,243,133,223,249,237,207,127,254, 89,
+ 43,233,224,193,131,119,221,117,215,119, 33,196,103,238,248,236,139, 46,186, 24, 0,197, 7, 37, 21,115,142,200, 23,168,146,223,
+119,166,107,235,186,217, 88, 63,250,243, 55,222,244, 76, 82,163,121, 13, 93,114,201, 37,111,187,225,134,125,123,247,149,131, 1,
+199,240,211, 11, 59,188,188,188,162,180, 70, 80,128, 64,196,200, 68,140,128, 8,128,232,191, 1,192,146,156, 40, 64, 85, 20,229,
+226,210,202,237,183,127,162,154,110,221,252,206,247,112,220,173, 78,184,100, 68,116,207,189,247, 17,177, 92,196,223, 31, 64, 82,
+ 9, 9,225, 41,235, 97, 55, 28, 77, 0, 21, 51, 50, 16,135,253, 38,166,203,206,231,188, 36, 81,201,145,163,144,130, 51,163,210,
+229, 45,239,123,239,191,251,202,239,126,237,158,175,159, 44,231, 67,165,149,214,160, 52,162, 66, 84,168, 80,201, 54,133,136,168,
+148,210,186, 40,134,195,145,237, 26, 68, 29,227,190, 11,214, 34, 85,168,228,200,178, 84,130, 45, 88, 43,197,172,252,202, 74, 78,
+ 14, 0,127,229, 21,175, 24,141,134, 39, 21, 8, 21,160, 82,128,168, 20, 2, 32, 40, 41,240, 17, 20, 0,104,173, 7,131, 1, 16,
+117, 93, 23,234,190,206,164, 87,215,117,157, 53,157,233,186,174,109,229,141, 79,167,252,159,242, 97,219, 25, 99,140,136,107,223,
+248,186, 43, 79,234,101,136, 64, 4,136, 12, 36,102,128,160, 8, 8, 17, 16, 21, 42,133,168,228, 62, 12,168,180, 21,229, 69,227,
+242, 91, 21,249,114,223, 69,141, 89, 95,179,118,157, 23,183,107,219,182,105,187,166,233,186,246,215,127,237, 19,166,107,110,185,
+245,151,215,215, 55,182, 9,228,115, 59,246, 50,249,164, 13, 72,172,143,136,136,203,225, 72, 41,221,212, 53,106, 45, 2,121,155,
+139, 62, 22,234, 36,231,215,206, 4,145,124, 46,212,181,109, 83,215,117, 61,173,102,211,217,230,113, 64,212,229,224,253,239,125,
+143, 49,237,175,254,234,237,143, 61,241,100, 86, 17, 3,139, 48, 68,128,136,132, 12, 36, 78,130, 68, 68,136,206, 89,165,212,242,
+202,218,250,177,163,117, 93,133, 85,150, 82, 90,242, 3,142,234,241, 66, 25, 99, 67,238,106,186, 78, 96,187,166,154, 86,179,233,
+214,198,225, 83, 78,221,107,140, 41,203, 82, 23,192,204,111,123,219,245,117, 93,221,242, 15, 62,156, 74,116, 4, 34,242, 14,198,
+196,200, 0, 8, 4,196,192, 64, 96,217, 34,162,214,122,101,109,173,216, 42,183, 54, 55,154,186,246,187,232,118, 13,249, 18,215,
+ 26,107,252,106,181, 93,219,212, 77, 61,171,102, 91,179,173,227,109,231,206,223,117,154,242, 62,196, 74, 23,154,104, 56,156,188,
+255,125,239,190,239,222,123,243, 82, 31, 0,125,254,200,200, 36,122, 99,144,178,148,195, 94, 51,158, 44, 20,229,160,154,205,166,
+211,173,186,154,117, 93, 39,185,127, 64,135,228, 31,193, 61, 58, 73,233, 69,154,122,182,213,182,213,100,188,240,131, 7, 14,156,
+122,218,233,101, 57, 0,100, 36, 84, 74,161,210, 74,185,178, 40,118,239, 62, 53, 8, 36,165,140, 88, 5,249, 36,155, 33,230,101,
+ 30,118,145, 16,165, 16, 39, 11, 11,131,225,160, 91, 90,106,234,186,174,170,170,154, 53,174,178,214,118, 93, 43, 94,214,117,157,
+237, 58, 99, 58,107, 12, 57, 59, 24,142, 87,215,118,175,172,173,173,172,172, 78, 22, 22,202,178,244,249,141, 55, 96, 31, 95, 80,
+105, 47, 16,249,212, 47,132, 69, 73,115,189, 16, 64,204, 49, 90,250,156, 25, 8, 17,135,131, 65,161,245,120, 60, 94,222,177, 35,
+ 68, 0, 47,132,181, 86,114, 29, 89,107, 93, 20,101, 81, 40,173, 37, 5, 6,102, 34, 7, 0, 24,242, 96, 14,101,167, 8, 36,249,
+ 99,140,233,156, 12, 42,104,204, 11, 2,178,182, 33, 93,245,197,152, 42,203, 82,194,213, 56, 37,167, 33,113,100,138, 95,144, 43,
+147,207,154,153,153, 9,226,175, 68, 30, 44,196,175, 33, 24,181,104, 1, 68, 76,175,150, 96,186, 0,209,178,124,150, 29,158, 67,
+ 62, 43, 17, 13,148, 82,132,160, 64, 60,133, 72, 76, 83,240,168,144,244,230,137,121,168,198, 68, 42, 17,200, 63,134,188, 23,253,
+ 17,203, 82, 81, 88,178,240,131,244,196,243,217, 62, 51, 49, 1, 67, 82, 78,239, 55,196,153, 48, 89,197, 68, 28, 51,117, 6, 14,
+ 75,198,146,229,251,154,200,171,141, 67,229,199, 98, 73, 4,105,255, 79, 58, 10, 69, 34, 37, 11,147,236,220,215, 7, 20,227,185,
+247, 31,142,133,134, 0, 71, 94, 86, 34, 6,129,193, 36,141,137, 38, 29,149, 24,108, 57, 74,227,101, 6,150,252, 93, 44,140, 73,
+234,186, 32, 3,199,202, 35,160,125, 1, 59, 36,255, 25,169, 24,130,149,197, 42, 64,190,233,145, 66,111, 56,193,214,162,103, 5,
+ 75,138, 5,105, 20,152,227, 87, 2, 56,152, 23, 77,178,114, 81,168,124,189,136,152, 64,204,222, 69,251, 79, 38, 32, 26, 34, 34,
+ 7,208,187, 41,202,211,123,239,207,252,189,159,181,249,171, 65, 84, 13, 5,185, 92,192, 85, 93, 16,200,197, 34, 50,214, 66, 2,
+ 27,114,172,139,128, 10, 68,252,234, 93,127,192, 30,222, 13,209, 49,127, 19,131, 1,243,220,191, 99, 50,151,201, 10, 73,209, 73,
+254,104,118, 62,196,100, 43, 75,121,185,187,190,190,249, 60,195, 27,165, 54,123,254, 8,115,240,224, 65, 37,153,205,243,231,245,
+188, 43, 20,191, 47,208,247,156, 64,207, 77,109,127,221,245,215, 93,125,245, 53,146,115, 89, 99,156,179, 15, 61,244,208,173,183,
+222,122,232,208,225,191, 80,129,174,187,254,250, 55,190,241,111,163, 82, 1,131, 34, 68, 11,168,208,170, 51,207,252,129, 79,126,
+242,159,152,174,253,147, 63,254,175, 31,252,208, 63,124,230,215,212, 59,118,236,216,216,216,120,182,162, 28, 56,112,224,223,252,
+238, 87, 14,188,248,165,168,149, 47,154, 48,107,195,133, 36,129,152, 87, 87,215, 94,253, 55,127,226,161, 7, 31,124,234,208,161,
+167,189,236,153,103,158,249, 29, 53,164,181, 62,247,220,115,175,188,234,202,203, 46,187, 76, 41, 21,179, 62, 38,158, 44, 44, 12,
+199, 19, 70,229,171, 55, 65, 25, 72, 10, 39,145, 13, 89, 18,101, 68, 84, 10,149,190,246,218,107, 31,248,230, 55, 62,245,153,207,
+ 62,235, 37,187,233,166,155, 46,189,244,210, 83,118,237, 98, 6, 71, 78, 58, 33,204, 12, 8, 64, 4,192,147,165,241,112, 48, 70,
+165,194,134,135,178,119, 33, 34,132,234, 37,219, 3, 17, 1, 0, 81,235,226,194, 23,190,240, 13,175,187,250,243, 95,248,226,211,
+ 8, 68, 68,101, 89,254,220, 91,127,238,154,107, 94,235,136,125, 73,202,140, 8, 26, 81,242, 16,191, 26,136, 10,177, 44,135,160,
+ 84, 72,207, 41,150, 7, 60,143, 82, 75,214,196, 4, 40,165,176, 82,250,226,139, 15,252,251,255,240, 31,143, 30, 61,118, 50,183,
+191,238,250,235,255,224, 63,125,245,181,175,125, 3,162,214,186, 80, 74,131, 96, 32,168,100, 9, 84,168, 81, 10,165,203,114, 0,
+210, 61,162,136, 18,251,173,218, 69, 60,153, 67,182,229, 19,201,136,114, 3, 0,254,253,183,188,233,105,226, 16, 51, 40,173, 81,
+ 33, 32, 34, 2, 3, 40, 20, 77,163, 82,136,128,128,168,148, 42,138,194, 57,227, 17, 41, 73, 94, 67, 74, 69,169,221,154,146, 29,
+ 23,254, 22, 16,110, 15,207,163, 82, 23,188,224,188,147, 9,132,136, 10,149,152,160,148,236, 12, 10, 17, 1,129, 89, 73,107, 68,
+107, 93,150, 37,135,206, 90, 68, 59,228,198, 46, 38,126,210, 89, 77,194,248, 15,177,243,169,155, 44,239, 95,127,213,193,147, 27,
+ 53,178, 66,223,255, 96, 36, 69, 72, 0,140, 0, 28,245,164,139, 98,182,181,206, 12,206,145,247, 33, 95, 8,164,222, 72,232, 93,
+ 7, 24,205,133,198,175,115, 46,207, 19,153,165, 58,253,206, 91,135, 96,133,136,136,194, 33, 10,113,133, 1, 17, 16, 1,181,214,
+ 90, 85,213,204,249,254,180, 75, 18, 36,140,193, 70,172, 33, 96,123, 66,241,200, 97, 26,255, 99,114,116,214,254,189, 39,219,203,
+ 88, 90,112, 28,123,168, 12,192,160, 20, 48, 3,162, 18, 95, 35, 97,177, 56,143,177,102,239, 69, 12,223,198, 12,104,149,179,129,
+136, 98, 29,185,240,113,223, 22,183,215, 92,249,211,175,127,221,213, 39,129,244, 48,114,172,124,146,236,193,159, 16,229, 24, 16,
+149, 39, 36, 57, 1, 15,131, 44,254,246, 94, 8,255,179,112,247, 12,125, 52, 54,125,219, 26,107,126,228,101, 47,191,241,134,235,
+ 79,162, 33, 96,228, 76,184,244,146,146,190, 24, 12, 60,204, 98, 76, 16,204, 56, 97, 79,137,136,129,101,224,127, 96,157, 49,198,
+203,104, 19,189,202,152,206,154, 22, 16, 85, 81,236, 59, 99,255,187,110,126,199,137, 4, 2, 64,223,122, 77,189,111, 6, 32,140,
+237, 88, 28, 12, 71, 68, 46,192,225, 9,247,180,198,100,224,157, 13, 40,172, 23, 81,126,110,173,177,157,177,198,216,174,179,166,
+107,219,102,121,105, 85,161, 46,138,114,117,109,231,205,191,240,246,237, 75, 6,130, 9, 49, 0, 17, 96,216,146, 66,125, 76,196,
+ 52, 24,140, 10, 93,202, 35,250,123, 8,104,103,140, 49, 93,176, 43, 19,212, 32,130,202,175, 4,137, 21,168,166,109,219,166,173,
+167, 11, 75,203,128,128, 74, 21, 69,185,182,182,243,239,252,236,235, 51,129, 2, 64, 35,181, 33, 98, 4,108,216, 51, 58,152,137,
+ 72, 41, 53,154, 76, 0,192, 24,103,163,114,130, 40,210,232, 13,152,113, 39, 8, 99,103, 58, 43,205, 5,223, 30,111,218,186,110,
+234, 89, 85,213, 66, 70, 66, 84,168,180,210,197,249, 23, 92,240,163,151,190, 44,203, 24, 89, 80, 94,193,244,252,190,142,128, 1,
+ 15, 33,129,136,134,195,209,112, 52,102, 38,143,213,181,157,233, 76,215,182,166,107,173, 7,171, 4, 60,238, 4,200, 11,127,182,
+ 93,219,181, 77,211, 54,117,219, 84, 77,181, 85,148, 99,244,123,174,236, 74, 90,235,226,199, 47,255,107,101, 89, 48,179,130,164,
+ 30,239,255,161,166,103, 89, 57, 38, 79,152, 81, 90,143, 23, 22,134,163,145,116,129, 3, 40, 46,146,180,166,107, 77,215, 10,164,
+231,165, 17, 96,186,109,218,182,105,155,170,169,171,170,218,106,155,110,121,199,114, 81, 14,100,175, 68, 68, 84, 8, 10,149,210,
+ 55,191,227, 6, 0, 40, 60, 46,230,195,160,108,136,136, 0,140, 57,178,224, 63, 82, 22,229,194,194, 34, 57, 55,155, 77, 5,235,
+236,199,105,202,220,202,154,128,192, 10,129,164,174,166,109, 61, 35,128, 61,251,206, 28, 12,134,168, 16, 72,156, 90,186, 25,186,
+ 40, 7, 17,176,146,181, 2,102, 68, 8,125,152, 72, 48, 96, 70, 0,199, 62, 51, 41,202,114,178,184,200,204, 83,154,218,214,223,
+ 62,180,189,189, 99, 57,107, 67, 95,161,237,218,166,109,170,186,154, 54,245,148,153,247,159,121,206,218,206, 93, 69, 89, 34, 42,
+ 6, 39, 74, 10,168,167, 6,128,194,103, 83, 17,121,165, 24,126, 34,212, 9,236,193, 97,143, 12,151,229, 96,188,176, 32, 54, 57,
+163, 25, 24,235,156,243, 78,111,141,243, 6, 47, 38,213,182,109,221, 54,141, 53,237,112, 56,222,185,251,244,211,247,158,177,176,
+184,164,181, 78, 77, 42,191,175, 43, 73,250,138,196,187,241, 80,103, 0, 29, 57,110, 36, 30,187,102,138,215,224,178, 44, 97, 60,
+ 65, 84,170,208,149, 46,176,158, 17,145, 53,150,137,173,135,171, 61, 33, 21, 65, 13, 71,227,229,229,213,229,149,149,213,181,157,
+ 75,203,203,131,225, 80, 43, 21, 49, 97,224,100,223,222,134,196,195, 25, 16,145, 50,158,129,199,216, 56, 98,194, 9,124, 97, 73,
+186,135,163,161, 82, 88, 20,197,112, 56, 24, 54,163,166,174,219,182,233,218, 65,215,117,118, 96, 70,206, 50, 3, 42, 53, 24, 12,
+ 70,163,209,120, 50, 25,141, 70,101, 57, 64, 68,136, 6,145,222, 72, 11, 48, 52, 95, 56, 42, 38, 6, 68,134,158, 41, 37, 92, 55,
+ 96, 63,194,249, 41, 75, 65,162, 7,195,114, 52, 30,123,106,143, 49,206, 57,185,134, 82, 88, 20,186, 40, 74, 93, 20, 90, 41, 64,
+ 79, 48,228,200,206,153,207,135, 18,184,155,173,151,207,221,189, 64, 20,190,156,178,103,191,163,176, 66, 5, 90,139,194, 10, 93,
+186,193, 48,165, 40,226, 38, 62, 15, 86,161, 78,138,207, 26,180,222, 23,170,136,200, 25,179,240,143,188, 26, 41, 0,252,192, 89,
+ 18, 16, 21,157, 60,145, 37,229, 6, 0, 40, 10,201, 47, 41, 80, 46, 34, 86, 26, 49,179, 8,176, 97,190,123,179, 68, 66,140, 94,
+ 22,133, 22,177, 60, 38,156,221,222, 11, 64, 61, 0, 30, 60,140,238, 85, 7, 74, 33, 49,162,214, 10,165,165,132,132,164, 60,108,
+ 76,177, 57, 28, 46,149,172, 51, 25,119,138, 67,126,177,162,182,146,199,115,170, 17,121,174, 63, 29, 22, 51, 98,136, 94,219, 24,
+194, 61, 10,136,223, 7,111,189, 9, 98, 20,162,135,105,202,146, 73,100,204,212, 17, 20,197, 16,128, 88,232,225,194,113, 85, 19,
+ 50,138, 32,113, 62,217,106,170, 27, 99, 67, 39,126, 1,164, 25,145,115,126, 66,107, 33, 24, 73,106, 42,144,247, 57,142,158,239,
+187, 28,220,235,189,244, 58, 49, 81,106, 10,253,135,232, 41,153, 47, 64,232,137,198,240,193,201,134, 68,142, 34,129,185,208, 19,
+ 54,117,113, 32,127,144,244,204, 20,160,221, 20,226, 51, 4, 27,130,121,109, 91,234,176, 55,102,189, 37,128,228, 50,133,100,101,
+148,109, 98,196,169, 85,230,165,137,245,114,208,115,240, 52,217,252,146, 58,114,204, 63, 48,219, 32,123,148, 28,114,135,185,118,
+ 16, 71, 13, 17,164,123, 80,114,197,208, 97,136, 87,163,100, 76,253,167, 14,237,105, 72, 11,145,223, 29, 50,165, 36,246, 92,214,
+199,232, 45, 89,104, 10, 0,228,160,123, 90,178,216,109,201,168,129, 61,105, 82,187, 49,220,168,239,148,112, 2, 52, 34,107, 79,
+ 69, 47, 12,253, 50,246, 45,195,244, 16, 20, 35,122,188, 28,197, 62, 72,112,221,116, 7,239, 51,222, 21,192, 55,135,152, 35, 33,
+177, 39, 57,244,217, 45,148,169, 88,238, 90, 4, 30, 59,197, 14,107,220, 51,164,169, 3, 0, 4, 4, 73,171,220,179,151,204, 19,
+100,233,145,193, 65,106, 70, 66,111,105, 78,208,247,203,148, 36, 54,196, 41, 46,199,213,227, 16, 74,105,206, 92,122, 75, 70, 30,
+ 4,137,194,164, 30, 85,192, 70,224,132, 50, 80,182,158,189, 27,136, 64,190,189,149,236, 42,236, 59, 24,148,148, 20, 74,148, 25,
+ 90,118,201, 12,182,202,212,233,187,162,125, 44, 43,110, 63,114, 27,202,205, 44,198,161,185, 14, 83,200,145,210,102,152,158, 96,
+206,248, 51, 12, 15,104,206, 41,146,187,246,174,192,169, 93, 77,208,135,221, 0,160,120,248,161,135, 50, 18, 41,115,255, 95, 89,
+131,108,238,175, 61, 34, 4,164,127, 40, 17, 14,250, 45,179,108,203, 79,157,207,160, 52,143,120,121, 14,218,241,227,199,215,215,
+215,159,111,109,161,255,183, 47,102, 94, 89, 89, 89, 93, 93, 45, 0, 96, 99, 99,227,145, 71, 30,249,190, 82,182,147, 60, 87, 87,
+ 87,213,247, 21,241, 61,214, 44,251,190,130,190,175,160,191, 92,175,226,249, 41,214,218,218,234,190,125,251, 70,195,209,104, 60,
+ 6,224,182,237,170,217,236,201,167,158, 60,124,248,200,255, 95, 10,218,121,202, 41,231,157,123,238, 43, 14,254,216,229,151, 95,
+190,184,184, 40, 25,146,179,142,209,207,133,101, 51, 24,169, 25, 38,195, 97,135,158,122,242,174,187,190,122,207,189,247, 62,242,
+200,163,115,211,174,223,219, 10,210, 90, 95,117,245,213,111,255,249, 27, 11,173,137, 1, 17, 51,110, 20, 33,176,210,200, 76,172,
+164,193,141,138,144, 1,149,135,214, 28, 32, 50,128, 98,216,125,234,158,215, 92,121,229,171,127,242,167,156, 53, 68,246,254,111,
+ 62,240,155,159,185,163,170,170,231,169,130,138,162,216,183,111,239,238,221,187,151,150,150, 39,147,201,112, 56,152, 76, 38, 11,
+ 11, 11, 17, 70, 36,162,211,246,156,254, 87, 47,123,213,226,226, 34, 17, 72,147, 95,197, 94, 58, 32, 50, 33, 42, 6, 22,141, 97,
+ 64,106, 4, 8,101,148,182,157, 2,100, 68,133,138,145, 25,149,246, 93, 73,167, 46,126,241,139, 63,254,143, 63, 86, 87,179,187,
+239,190,251, 11,119,126, 41,193,146,127, 1, 10, 82, 74,237,221,187,119,207,158, 61,231,156,115,206,133, 23, 94,120,230, 89,103,
+237, 63,227, 12, 93, 20, 49,191, 39, 63, 58,150, 0,190,188,162, 71,196,201,100, 82, 14,134, 50, 10,201,136, 74,163,148, 82,128,
+ 42,107,249, 40,144, 82, 33,193,104,152,193, 33, 17,215,192,152,201,249,110, 90, 64,219,153,121, 48, 26,255,200,165, 63,250,178,
+151,253,240, 3,247,223,255,219,255,252,206,206,152,231, 64, 65,249,184,135,244,229,207, 57,231,156,171,174,186,234,242,203, 47,
+215, 69,225,235,123, 41, 68, 82, 9, 36, 18, 10, 97, 94, 43,237,149, 18, 91,163, 24, 10,218,209,176, 28, 12,199,168, 20, 42, 37,
+173,255,216,128, 75, 0,210,137,166, 88,114, 64, 37,175,250, 34, 74,146, 17, 64, 3,182,141, 74,128,105,114,238, 7, 95,244,162,
+247,189,231,220,127,241,229,127,249,141,111, 62,240,231, 82, 16, 51,175,172,174,254,216, 43, 95,121,197, 21, 87,172,172,174, 78,
+ 38, 19, 0, 36, 34, 96, 16,202, 11,166, 6,117,104,186,132,117,244,125, 35, 89,116, 65, 55,125,239,139, 1, 80, 1,140,138, 66,
+151, 37,162, 66, 64, 72,208,102, 62, 89, 3,125,100,171,167, 42, 8, 99,192, 57,141, 55, 85,186,137, 99,158,136,169, 30, 83, 65,
+ 84,170, 64, 93,252,244, 79,189,250,135, 47,121,201, 39, 63,117,199,119, 31, 49,247,239,223,255,154,215,188,230,245,111,248,153,
+165,229, 29,131,193,208,183,210,148,192,223,232,167, 96,149, 63,158, 68, 41,209, 86,124, 3, 10,195,100,146,146, 47,121, 58,134,
+ 80, 70,148, 46, 81, 41,223, 85,142,235,207,240,157,208,229, 84, 82,247,138,234, 56, 62,152,246, 51,142,124,227, 52,125,233, 40,
+253, 90,134, 31,153, 28,141, 70,163, 11,206, 63,231, 79,255,244,127,154,103,185,211,237,216,177, 99,101,101,197, 79, 3, 41,165,
+101,200, 38,244, 25,149, 31,157,150,105, 11,105, 48, 34,128,124, 64, 1,131, 2, 64,165, 20,248, 81, 38, 81,140, 42,138, 98, 48,
+ 24, 32,176,181, 6, 81,205, 19,204, 51,218, 76,218,186,243, 62,100,120, 54,249,169, 11, 3,168,142,226,208, 39,197, 97,206,108,
+210, 50, 13, 96,102, 32, 70, 36,247,227,234,202,218, 79,252,248,171,254,124,153, 52,122, 95, 17, 54, 10, 0,130, 12,173, 33,176,
+152,139,194,248, 97,228,224,123, 28, 67, 36,134,217,136,210, 89, 83,205,182,242, 81,188,200, 47,207,168, 69,185, 45, 8, 61, 37,
+157,161, 32, 83,186, 94, 71,142, 60,159, 38, 17,109, 60,237, 38, 12,178,185,248,135,231, 42,185,196, 90, 15, 35,182,176,111,239,
+222, 75, 94,114,209,119,187,139, 33, 34,160, 31, 0, 66, 86, 36,243,100,140, 4,128,138, 49, 68, 65, 21,126, 2,132,140,190, 17,
+232, 45, 78,152, 78,138,137,182,182,214,153, 65, 17,163,163,208,220, 86,152,168, 54,189,110, 22,193, 60,162, 28,231,124,101, 92,
+ 32, 12,252, 70,147,241, 42,138,227, 71,241, 96,140, 56, 30, 69,225,140,140, 64, 97,242,254,120,201,129,139,190,121,255, 31,243,
+119,185,205, 35, 0, 73,183, 81, 33, 18,112,212, 64,136,195,242, 6, 88,116,226,163,107,162, 38, 42,165, 53, 34,116,166, 53,198,
+104, 85, 56,103, 25, 88,177, 70, 36, 84, 10,101,172, 49, 98,114, 57, 70, 76,113,120,133, 32,167,245, 51, 59, 25,240,150,243, 76,
+146, 57,134, 35, 68, 82, 86, 29,108, 45,158,185,224,136, 28,229, 39,240, 56, 34,235,220,205,239,120,235,239,255,225,221,247,221,
+247,141,103,158, 37, 21, 25, 60, 20, 27,109,201,121,160,223,203,100, 0, 78, 84, 25,206, 8, 27,158, 85,233, 44, 1,163,117, 78,
+218,109,132,164,180, 70, 34,244, 57, 11,200, 34,112, 15,187,229, 20, 58, 40, 64,195, 68,189, 81,255,100, 64, 46, 11, 93,156,230,
+ 68,179,201, 58,225, 76,249,161, 76,233,205, 27,227,172, 33,226,174,235,254,214,207,254,204,235, 95,123,245,183,190,245,224,167,
+ 62,253,217,166,105,158, 85,162, 24,244,146, 78,145,240, 59,187,231, 27,202, 92, 94, 68,205,115, 98, 65,248,134,112,109,140,233,
+ 44, 88,197,140, 74, 41, 38, 81, 95,100,145,229, 89, 16,229,173,184,222, 62, 70,253,105, 10,241, 41,142,195, 40, 49, 24,101,103,
+207, 36, 5,185, 48,160,233,201,100,158,226,212, 18,147,214, 5, 49,156,125,246,217, 31,254,224, 7,142, 28, 57,114,199,231,254,
+217,227,143, 63,241,140, 20, 68, 28,227, 10,199,180, 6, 78,196, 55,224,152,200, 18,129, 82,113,191,246,236,129,193, 80,104, 85,
+ 10, 9,253,164, 46, 74,160,135,156,192, 48,223,132,137,227, 49,114, 18, 2, 37, 35,114, 57, 55, 50, 41,168,231, 99, 94, 71, 54,
+178, 95,172, 39, 86,153, 48, 0,216,154,182, 46, 7, 35, 6,165,148,134, 2,200,185,181,157, 59,111,188,225,173,199,142, 29,253,
+141,127,250,155,115,147,172,243, 10,242,197, 15, 3, 98, 78, 56, 9,209,201,191, 65, 2, 10,221,110,111,111,144, 58, 21, 10, 0,
+148,214,131,225,200, 90,219,212,149,117, 14,201,249,116, 1, 20, 42,152, 59, 86,230, 36,249,115,190,155,115,110, 60,233,141,216,
+148,203,200,164,150, 92,154,207,180,214,216, 48,191,218,117, 77,219, 84,117, 93,173,172,238, 34,114,194, 82,246,102,129,110,101,
+101,245,151,110,186,241,225,111, 63,124,199,231,126,171,222,230,116, 5,228,101,143,159, 22,143,229, 35, 8,167, 9,129,133, 17,
+236, 63, 36, 25,117,226, 36,120, 74,143,184, 82, 57, 24,140,104, 66,204,109, 35, 52, 55, 10, 52,151, 72, 61, 71,200, 91,198,112,
+ 2,245,100,126,230, 79,212,201, 99, 80,136, 61,121,244, 9, 19,253, 18,131,188,115,181,166, 53,157,169,219,186,106,234,233,194,
+226,138, 82,104,173, 45,139, 82,116,196, 12, 10,160, 40,193, 90,220,183,127,255,123,223,253,139,247, 63,240, 95,238,252,210,151,
+ 79,232, 98,190, 51,135,158, 95,138,161,248,244,190, 19, 8,239, 40,123,151, 31, 54, 67,244, 60, 57, 31,173, 61,147,184, 28, 12,
+198,204, 8,208, 52,181, 49,134,200,113,100,153, 96,242,210, 84, 74,101,109,110, 74,163,121, 25, 41,155,243, 12,217,101, 1,200,
+159,163, 21,167,229, 93,118,234,129, 53, 93,215, 54, 93, 91,181, 77, 5, 80,236,220,181,203,145, 11,100, 90,201,221,148, 3, 70,
+102,173, 11, 0,116, 14, 15, 92,124,241, 11,206, 61,247,142,207,253,214,227,249,144,118,210, 16,138,165,136,118, 88, 54,159,244,
+198,243,105, 24, 66, 26,192,196, 33, 75,242,244, 34,165, 20,251, 9,215, 1,200, 17, 2,109,211, 54,141,181,198, 57,202, 41, 27,
+ 8,114,153,208,156,101, 72,211,147,180,173,218,240,201,140,228,147, 78,146, 30,226,224, 85,105, 20,219,248,232,220,117,198,180,
+ 93,215,152,182, 50, 93,219, 25, 90, 88, 24,141,198, 11, 90,151,222,223, 81,216, 48, 82, 34, 49, 48, 43,165,152, 53,107, 30,142,
+ 38,111,121,211,223,253,223,127,246,103,191,247,251,255, 57, 84,243,158, 64,201,236, 29,202, 15,251, 35,202,154, 34,162,160, 16,
+200, 64, 41, 18, 49, 51, 50,250,142, 48,167, 66,222, 23, 37, 80,148,165,167,144,106,221,182, 77,215,118, 98, 77,146,247, 1,204,
+ 57, 87,136,211,148,230, 11,120, 62,237,118,113,131,247, 41, 96, 48,158,200, 15, 22,237, 88,211,153,174,238,218,218, 24,227, 28,
+148,131,114,247,105,123,151,150, 87, 7,131,129, 82,218, 91,177,192, 76,178, 53,161, 98,100,153, 97, 47, 10,109, 29,159,125,206,
+185,151,235,242,193,111, 63, 90, 64,162, 49, 33,147,199,116,100,206,158,179, 42, 62,235,238,114,228,140, 33, 32, 49,137,163,137,
+ 37,196,189, 28,125,180, 81,101, 57, 80, 82,135, 20,173,144, 59, 1,140,181,222, 69, 98,183,151,121,155,237,164,115,127,122, 1,
+ 40, 35,207, 91,202, 78, 21,112,214, 90,219, 25, 35,179,234,181, 49,157,179, 14, 0,150,150,151,118,239,217,127,202,238, 83, 23,
+ 22, 23, 7,131,129,150,179, 2, 19,253, 16, 37,162, 70,202,164, 67,242,197, 41,170,140, 27, 40,112,167,183, 25, 22,205,250, 55,
+ 50,221,227,149,205,224,245,136,222,148, 66,150,148,246,236,237,245,158, 86, 37, 14,148,214, 69, 89,150, 93, 25,134,221, 91,107,
+140, 53, 76, 28,131, 74,218,207,211, 97,103, 33,127,102,151,198, 14,178,188, 80, 40,245, 94, 59,214, 24,107, 90,107, 59, 34,171,
+148,158, 44, 47,237, 88, 61,101,101,237,148,229,229, 29,147,133,197,225,112,168,180, 14, 5, 66,204, 55, 48, 36,177, 40,147, 34,
+168, 52, 50,171, 0, 89,244,131,180,108, 88,128,129,125,128, 97,110, 61, 96,133, 97,166, 35,152, 83,176, 32, 10,164, 16,140, 65,
+ 41, 47,186, 64,202,145,178, 44,149, 82, 69, 81,150,101, 57, 28, 14,133,250,221,117,129,166, 14,192,108,137,216,111,225,158,100,
+236, 40,219,173,182,219, 78, 56, 97,213, 17, 91, 0, 40, 6,195,241,100,113, 56, 26,143, 23, 22, 23, 22,150, 38,139,139,227,241,
+120, 56, 28,233,162, 40,180,246,181,182,231,168, 65,130,165, 60,170,139, 1,118, 83, 82,109,230, 49, 8,152, 9, 16,137, 17,146,
+225,248,160,228,171,179,100, 89, 20, 6,181,132,231, 24, 82, 3, 79,180, 74,199,204,228, 6,197,158,206,168,177,240,243, 68,101,
+ 89, 90,107, 71,145, 76,108, 60, 51, 53, 28,145, 98,201, 90, 75,214, 89,229,156,141,121, 25, 3, 3, 20,158,140, 78, 69, 72, 90,
+149, 86,170, 40,202, 98, 48, 24, 14, 6,131,225,112, 56, 28,150,131, 65, 89, 10,171, 53,204, 55,245,104, 42,137,206,159,147,110,
+ 61,146, 27,106,163, 2, 34,183, 48, 83, 13,137,174, 0,189,210, 66,172,102, 2,150,128, 45,161, 91, 24,161, 12,132,137,143, 72,
+ 33, 98, 33,244,152,102,152, 41, 11, 21, 42,212, 2, 68, 17, 81, 89,148,142,156,115,163,254,188, 76,122,227,108, 28,236, 33,150,
+195,193,122, 79,164,148, 86, 90, 41,173, 11,165,197, 86,148,214,133, 28,185, 3, 74,133,218, 26,122, 12,213,185,250, 32,203,141,
+179,124, 36, 38,138,158, 13, 37, 41, 33, 65,208, 81,120,195,130,195, 34,160,223,156,101, 95, 71, 8,227,128,217,172,133, 79, 13,
+197,204,252,239,227, 17,168,137,100,233,121,194, 74,249, 93, 68, 9,207,188,215, 2,227,136,246, 80, 63, 63,226, 48,177, 20,200,
+223, 30,179, 65,165,148,224, 43,115, 41, 59, 70,198, 26,251, 44,175,119, 82,224,156,226, 50, 70,119,218,230,179,202,193, 7,160,
+109, 58, 2,137, 56, 64, 97, 28,135, 82,201,234, 23,149,114,226, 50, 16,134,107, 49, 16, 16,114,130, 7, 32, 48, 89, 49,244, 39,
+180, 70, 34,242,100,103,214, 84,164,211, 67,182, 49,174, 82,185,187,141,215, 3, 89,138,203, 57,133,143, 18, 36, 65, 57, 46,206,
+208,187, 82,168,204,251, 46,230,123, 48, 94, 29,114, 3, 98,198, 72, 65,166,144, 46,147, 28,100,195, 49,123,130,185,160, 19,131,
+ 90,188,117,100,206, 17, 80, 72, 51,243,179, 29,146,128,152, 97, 70, 74,118, 27, 66, 86,190,216,211,115,167, 85, 36, 30, 89,164,
+142,249,138, 40,193, 14, 89, 31, 10,125,190, 14, 39,240, 50,238, 55,119, 56,205,210, 41, 72, 52,102,144, 58, 58,112,255, 32,167,
+ 36, 66, 56,143, 81,120,186, 28, 44, 60, 30,164, 1, 61, 62,166, 16,200, 41, 18, 64,163,147,245, 9,172,105, 33,123,185,130,152,
+ 43,132, 38, 9,128,159, 67,148,130,198,167, 44,113, 74,209,207,182,114,178,160,108,131,232,207, 84,132,231,199, 62, 81, 55,227,
+115,207, 5,239,120, 30, 84, 70, 95, 21,241, 56,244,120, 56, 66, 66, 28,146,135,156,187,152,115,198,179, 81,138,220,132, 18,108,
+ 24,232,166,169,185, 24, 42,143,222,136, 64,230,239, 20,177,145,180, 83, 98,118,206, 80,114,103,206,197,202,152,140,233, 52,148,
+140,140, 74,193, 96,209, 7,110,206, 56,206,105, 4, 0,242, 68, 49,111,135, 98,204,253,179,156,168,199, 58,239,205,119, 5,180,
+ 76, 2,115,214,223,233,149,163,161,173, 24, 9,217,146, 95,165, 33,154, 94, 20, 73, 45,179,160,130, 94,155,176,215,191,245, 24,
+104,239, 80,150, 30,147, 60,242,197,227, 56, 35,165,240, 22,181,205, 81,150, 92, 73, 42, 89, 16,164,209,221,236, 99,249,188, 11,
+100,163, 49,158, 6,237,207,248,242,133,102,144,139,194, 49, 55,105, 99,141,234,167,224,129, 32,243, 52,136,137,123, 13,225, 25,
+ 56, 27, 50,242,131, 89,144,181,179, 33,210,117,227,149,251,186,203,225, 38,244,124,221, 88, 34, 81,127, 22,162,215,182,164,172,
+ 85, 55,103, 65, 49,127, 9, 53,123, 56,154, 42, 79, 98, 60, 37, 26,250, 81,150,146,240, 94, 20,159,170, 50,201,249, 59,201, 26,
+ 48,108,106,208, 63,158, 43,156, 84, 20, 76,133,178,232, 10, 0,132,126,112, 13, 32, 30,230,147, 71,225,121,171,153, 39, 54,103,
+251, 1, 71,182, 52, 72, 45, 9, 60,215,211,205,237, 32,219,230,123, 31, 73,229, 40,132,105, 77,136,129, 57, 57, 73, 38, 96, 62,
+197,146,175, 95,156, 28, 20,157, 83,156,198,137,147, 15,222,127, 48,153, 15,231,207,221,127, 67,153,227, 66,111,220, 97,110,251,
+239, 77, 31,196,103,164,124, 19,139,115, 1, 3,219,202, 57, 0, 0, 1,249, 73, 68, 65, 84,115, 12,128, 94, 28, 42, 18,232, 32,
+ 71,246,205,105, 30, 48,197, 68,240,154,147, 21, 68, 70,102, 66,255,103,132, 62, 72,178,113,159, 37,138, 24,136,241,154, 24, 30,
+ 72,254, 59, 9, 8,125,112, 17,230,182,254, 24,253, 57,163,135,111, 55, 30,198, 62, 56,153, 2, 88,127, 20,103,174,239,154, 15,
+ 16,204, 13,162,246, 93, 44,134, 27, 10,147, 86, 18, 90, 0,253,233,120, 24,183,100, 15,106, 97, 24,153,200,167, 57, 51,151,203,
+ 54,145, 48, 6,214,219,200,227, 33,206, 25, 97, 36,115,132, 44,116,179,120,101,239, 72, 14,200,102,100,252,168, 66,222,106,203,
+ 79,164,234,197,104,218, 54,144,209,155,139,201,155,117,125, 23,139, 99, 10,121,126,154, 86, 38,128,209,217, 16, 0, 65,111,114,
+ 27,160,151,185, 97, 86,183,166,141, 1,251,230, 63,127,234, 86,102,217,105,102, 42,168,155,122,211, 24,243,227, 16,253,153,174,
+124, 98, 36,111,222, 18,244, 14, 34,227, 56,161,177,157, 70,145,237, 90, 69,188, 50,113,122,234, 60,213,160,176,149,139,201, 96,
+120,211,155,117, 39, 9, 50, 40,245,132, 63,144, 22,195,242, 99,140,233,224,177,181, 12,191,133, 92, 77,156,141, 51, 97, 88, 36,
+142,217, 74,172,137, 17,182, 41, 40,157, 30,152,107, 58,212,207, 49, 2, 1,159,104, 11,235, 85,120,185, 37,199, 68,145,146,245,
+102, 94, 30,197,241, 14,213, 27, 70,202, 34, 44, 39,195,202,142,176,139,249,221,188,139, 37,167, 38,134, 57,237,228,189,164,232,
+176,144,209,128, 32,140, 89,205, 79,101,245, 39,248, 78,176,183,165, 32, 29,173, 7,120,126,228, 44,139,200,185, 5, 9,182,137,
+ 89,214,198,121, 61,195,219,160,215,109, 39,213, 65, 56,215, 51, 85,174,217,126, 13, 39, 58,204,142,251,121, 89,182,240,212, 27,
+236,235,101,230,249,182,149,156, 49, 61, 97,252,239,184, 36,207,232,239, 76,233, 8, 75,158, 3,124, 79, 16,189, 67,144,206,138,
+236, 94,174, 12,121, 29,229,147, 31,232,231,248,249,147,245, 53, 49, 7, 56, 60,157,118, 32,191, 85,118,107,216,118, 28, 32,247,
+206, 26,133, 30, 53, 45, 33, 21, 89,197,144,219, 81,186,126,126, 20,117, 62, 98, 69,144,143,231,226,193,131, 7,121,238, 9,255,
+ 82,142,238,244,200,132,207, 98,224,231,255, 0,194, 7,103,207, 35,149,125,120, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/layer.png.c b/source/blender/editors/datafiles/layer.png.c
new file mode 100644
index 00000000000..6006067bf76
--- /dev/null
+++ b/source/blender/editors/datafiles/layer.png.c
@@ -0,0 +1,350 @@
+/* DataToC output of file <layer_png> */
+
+int datatoc_layer_png_size= 11004;
+char datatoc_layer_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0,
+ 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,252, 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0,
+ 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,
+116, 73, 77, 69, 7,218, 7, 19, 0, 34, 12, 33,249,187,131, 0, 0, 32, 0, 73, 68, 65, 84,120,218,237,124,121,148,157, 85,149,
+239,222,251,251,238, 80,247,214,148, 16, 8, 9,169, 74,128, 12, 12, 50,147, 0, 33, 19,196, 16,230,214,238, 70,177,105,158,246,
+ 3,108,129,110,251,169,175,187,159,218, 46,150, 52,168,207,126,168,111,105,171, 79, 5, 91,105, 27, 65, 68, 69, 25, 18, 18,134,
+ 0, 33, 33, 68,134, 8, 25, 0, 67,134, 74, 85,165, 82,211,173,123,235,222,251,125,223,217,251,253,177,207, 57,223, 87, 1,149,
+135,244,106,124,171,111,214, 74,106,165,238,112,238, 62,123,239,179,247,239,247,219, 7,151, 44, 89, 2,191,243,241,102,158, 20,
+250,159, 86,175, 89, 43, 44, 73, 18, 69,205,102,125,188,250,103, 87, 92,153, 62,137,153,215,111,220, 20,199,137, 49, 9,155,196,
+ 72, 46,204, 73,177,212,118,222,146,133, 66,240,208,163,235,237, 59,177, 17, 64, 4, 64, 17, 36,196,190,253,251,147, 36,185,252,
+ 67, 87,143,143,141,164, 79, 18, 16, 97, 22, 17, 65,108, 52, 26,173,109,109,204,108, 76, 2, 56,249,107, 95,253,106,173, 90, 9,
+ 1,128,133, 89, 24, 68, 64, 36,138,162, 48,204,177, 48, 0, 24, 30,167, 32, 8,115,121, 2, 0, 54, 44, 44, 34,114,219,215,191,
+146,207,231,145,168,163,189,181,217,108, 32, 16, 0, 32, 34, 1, 0, 51, 11,243,215,110,185,249, 3, 31,186, 6, 17,139,197, 98,
+111,239,128, 8,130,136, 8, 0, 98,232,159,244,193, 15,255,181, 8, 0,194,208,224, 1, 65,102, 54,134, 89, 68, 94,125,121,135,
+190, 83,242,197, 27, 63, 5, 0, 0,210, 94, 46,176, 17, 96, 97,102,102, 35, 0, 83, 14, 61, 44, 4,128, 36, 54, 31,249,111,127,
+ 47, 34, 0,176,183,167, 95, 68,140, 49,198, 24, 54, 50, 58, 60, 44, 34,248,166,246,238,205, 60,208,255,244,208,218,135,147, 56,
+142,163,168,217,172,239,216,190,245,211,255,112, 67,186,119, 27,158,126,198, 24, 19, 39,137,126,155, 32,148, 60,192,166,245, 79,
+156,183,108,225,234, 71,215,123, 47, 64,102, 0, 1, 6, 4, 64,164,240,107,183,220,120,229, 85, 31,105,212,199, 17,100,213,163,
+ 79, 1, 0, 62,241,212, 70, 99,152,141, 97, 99, 88,228,139, 55,126,242,195,127,253, 9, 19,155,196, 36, 99, 99,149, 70,189,246,
+243,123,239, 37,102, 17,221, 21,196,255,249,217, 79, 94,247,177, 79, 98, 16,228, 10,249, 40,138,137, 40, 12,194, 21, 43, 86,224,
+163,143, 63,197, 38, 97,145,193,129,253,133, 66, 1, 16, 69,100,172, 50,106,140,137,162,168, 81, 31,111,212,107, 33,115, 98,152,
+ 1, 64, 0,144, 8, 0,226, 56, 18, 65, 17, 16,102, 0, 32, 10,200, 24, 35, 34, 95,252,236, 39,139,197,162, 0,180,181,181, 53,
+ 26,117, 17,102, 54, 44, 2, 0, 35,195, 67,184,106,205, 35,194,102,188, 94, 71, 64, 68, 24, 27,171, 8,179,126, 86, 18,199, 61,
+123,118, 33, 34, 37,137,185,229,166,207, 48,179, 8,151, 91, 10,194,194,186,113,204, 44,210, 82, 42, 25, 54,240,118,237, 93,248,
+155,126,177,250,161, 53, 81,179, 97,140, 73,146,184, 86, 29,251,240, 95, 94,219,104, 52,126,155, 15, 44, 94,188,120,246,156, 57,
+ 87, 93,117,181, 0, 8,139, 97, 17, 17, 22,195,204, 98,216,176, 49, 38,209,127,140, 73,216,152, 56,106, 54,155,245,171,174,254,
+203,131,222, 40,232,238,238,254,244, 63,220, 32, 0,194, 8,132, 40, 2, 8, 8, 8, 96,227, 4, 0,145, 48,138,162,111,125,245,
+150,205, 27,215, 79,153,122,248,120,173, 74, 73, 99,246,145,221,175,190,182, 39, 93,209,162, 69,139,190,240,197, 47,129, 6, 24,
+179, 17, 17, 99, 68,132, 69,152, 13,136,236,235,217,251,131,219,190,249, 95,175,253, 27, 4, 48,108,132, 57, 73,226, 36, 78, 74,
+229,242,224,129,253, 81, 51,170, 85, 71,110,184,241,243, 65,119,119,247,242, 21, 43, 1,132, 89, 88, 88,140, 8,136, 0, 0, 8,
+ 27,190,229,230,207,156,181,228,220,249,103,157, 29,132, 33, 34, 5, 65, 16,134, 57,102, 97,230,102,179,161, 75, 15,130,220,210,
+197,103, 19, 0,168, 75, 24,147, 48, 51,235, 55, 18,249,250,151,190,176,119,247,174,235, 62,241,169, 48, 12,131, 32, 32,162, 92,
+ 46, 87, 42,151,199,199,199, 19,147, 32, 34, 32, 34, 17, 34, 33, 81,144,203,135, 0,160, 14, 39,204, 32, 2,136,108,204, 63,253,
+227,167,175,255,248, 39,213, 67, 5, 0, 0,219,218,202,125,189,125, 60,198,136,128,130, 2, 8, 2,204,106, 70, 34, 10, 52, 87,
+ 26,177,182,149, 90,181,250,163,127,189,237,250, 79,124, 10,209, 6, 53, 34,150, 90, 90,250,246,237, 19, 64, 0, 22, 1,102,209,
+184,211,220,130,136, 15,175,186, 63, 4,128,196, 24, 68, 17,134,151,182, 60, 31,132,225,101, 87,124, 8,236,251, 66, 24,134, 2,
+216,215,223, 39,106, 51, 17, 54,134, 13, 51, 27, 54, 70,243,222,200,240,208,105,103, 44,212, 36,104, 16,224,209, 53,171,230, 30,
+247,174,206,206, 73,134,133, 16, 0,160, 84,110, 29, 25, 26,140,162,136,129,109,198, 19,177,145,193, 34, 34,123,118,239,108,109,
+109,215, 40, 38, 0, 48,108,214,174,186,127,238,113, 39,180,183,119, 48, 11,136, 24,230,150, 82,249,192,192,254,102,179,105,216,
+254, 49,198, 36,113,162,251, 34, 44,219,183,189,216,214,222, 41, 34,198,112, 98,146,183, 47, 79,190, 45,143,238,238,110,122,187,
+222,235,141,163,127,249,242,229, 31,255,248, 39,152,141, 73, 18,195,230,203, 95,254,242, 19, 79, 60,249,102, 79, 0,125,204,156,
+ 53,235,219,223,185, 21,244, 92,210,115, 39, 73,140, 73,146, 36, 78,226,232,218,107,175,175,140,141,189,225, 87, 67, 0,120,242,
+169,167,132, 69, 4, 24,192, 36, 6,192,158,109,156,176, 97,221,166,196,190, 99, 18, 55, 26,141,235,174,255,171,122,189,126,240,
+ 27,109,220,180,217, 57, 8,235, 49,111,196, 0,179, 49,194,250, 46,108,196, 48, 51, 15,244,247,221,245,175,223, 69, 66, 0,200,
+133,225,125,107,214,101,223, 40, 68, 34, 4,224, 56,209,112, 16,112,161, 4,130, 72,136, 16, 0, 24,130,127,249,198,255,174, 85,
+171,115,142, 61,110,246,156,121, 47,189,248,252,158,157, 59, 15, 54, 54, 34, 26,195, 0,128, 32, 2,128, 34, 34, 32, 0,136, 40,
+130,136,192, 8, 95,249,220,103, 91,219,218,174,188,250, 58,102, 99,146,248,180,249, 11,143, 58,242,232,254,193,225,231,182,108,
+ 77,141,253,212,211,155, 93,244, 11,107, 70,241, 33, 32, 44,204,255,235,166,207,156,185,104,217,187, 78, 60,217,136, 97,163, 59,
+ 25,199, 81,211, 24,137,162, 70,179, 81,255, 31,159,250, 76,119,119, 55, 49,139,205, 99,104, 51,137, 0,160,219,206, 47,125,238,
+134,243, 47,253,147, 19, 79, 57, 29,137, 8,131,128,130, 32, 12, 59, 58, 39, 35,133,128, 16, 4, 97, 46,151,191,249,198, 27,212,
+143, 68,211,163,126, 37, 6,151, 32, 17,126,112,235, 55, 79, 63,115,209,145, 71,207,214, 61, 37, 66,102,106, 43,151,250,251,250,
+ 17, 41, 8, 66, 97, 70, 10,130, 92,254,220,101, 75, 72, 4,180,146,210,250, 12, 88,244, 59,239,126,237,181, 90,181,122,250,153,
+103, 35, 34, 34, 18, 5,128,212,209,209, 62,176,127, 64, 15, 4, 0, 0, 36,251, 8, 2, 18, 17, 22,112, 37,128,125,151, 36, 73,
+126,248,189,111,253,249, 85,215, 34, 0, 0, 33, 34, 16,116,118, 78,238,239, 31, 32, 34, 0, 76,223, 75,203, 15,164, 80,132, 1,
+ 52, 67, 50, 0, 48, 0, 48,255,211,141,159,186, 78,147, 36, 34, 2, 8, 99,177,165,124, 96,160, 31, 64, 68,252,235,173, 5,244,
+105,100, 19,166,251, 11, 65,214,174,186,255,210,247, 93, 17,134,161, 15, 31, 10, 2, 17, 19,199, 9,160, 77,226, 98,119,199,101,
+ 99, 64, 98, 91,236, 49,136, 0,115, 28,199,207,110, 90, 63,115,214, 81, 54, 93, 35, 2, 64,185, 84, 24, 30, 28, 68,183, 8, 17,
+ 1,253,124,212,220,143,113, 18,147,183, 14,139, 48,194,151, 63,119,195,135, 63,250,183,234,226,250,104,107,239,220, 63, 48,232,
+178,184,216,213,176,190,202, 26,180,217,168,135,234,118, 8, 34,130,189, 61,123, 22,156,189, 52, 8, 2, 97, 64, 4, 65, 32,196,
+ 36,137, 57, 97, 22, 16, 0,102,221, 22,173,188,237, 39, 13, 29, 24, 8,195, 28,169, 19,235,198,253,224,182,111,156, 58,255, 44,
+ 23,115, 0, 34,229, 82, 97,160,191,151, 81,180,118,215,242,221, 46, 69, 4, 0, 94,248,229,166, 66, 75, 17, 1,212,216, 34,194,
+ 27,158,120,236,125, 87, 94,141, 32,206,147, 36,159, 47,140,140, 86, 25, 4,133, 5,152, 25, 50, 86, 96, 17, 25,175, 86,103, 30,
+ 53, 7, 4, 5,128, 68,244,168,145, 39, 31,125,232,144, 41, 83, 68,163,151, 89, 68, 90, 10, 52, 62, 94,211, 5,232,135, 49,219,
+ 18,129, 69, 64, 32,138, 34,111, 59,210, 95,172,190,239,167, 87, 92,117,173,245, 4,102, 65, 44,183,182,246,246, 31, 96,102,212,
+ 21, 24,125,119,107, 32, 16,217,190,117, 11,161, 86, 63, 34, 2,164,241,254,226,179,207,180,182,182, 50, 11, 8, 11, 34,136,112,
+220, 76,162, 4,196,150, 59,122, 80,107,134, 80,243, 28, 62,125,134, 0,176,126, 77,102,120, 71,157,107, 93, 93, 93, 4,239,164,
+ 7,106, 67,246, 22, 30,231,156,123,206, 41, 39,159,130,132, 99,149,202, 99,143, 61,182,125,251,142,127,223,243,250,245,143,247,
+189,255,242,171,175,185,198, 24,163,238,103, 29, 74, 64,132, 47,188,240, 34,117,160, 36, 73,132,153, 77,242,189,239,127,127,213,
+234, 53,111,209, 72, 75,150, 44, 89,183, 46, 61, 47,143, 63,254,248, 21,231,157,183,114,229,249,165, 82, 11, 0, 24, 35, 90,140,
+217,188, 39, 44,172,237,129, 13, 33,237,114,220,143, 26, 58, 70,171,117,147, 24, 99,226, 56,138,254,241,166,207,189,182,107,215,
+155, 44,141, 66,102,222,176,113,147, 49,198,102,102,119,192, 25, 22, 97,193, 64, 64,244,252,117,185,144,132, 69, 16, 24,144, 0,
+ 24,137,144, 53,127, 32, 34, 9, 50, 18,137, 48,113, 64,100,134,250, 6,159,124,108,237, 49, 71,119,205,153, 53, 29, 17,131, 92,
+248,192, 67,235,126,247,150, 81, 16, 10,145,134,161,198,158,162, 19, 66,136,204,130, 32, 40, 32,246,220, 17, 0, 4, 20, 65, 64,
+ 0, 32, 66, 22, 8, 72,132, 69, 80,152, 9, 33, 78, 30,127,100,237,139,207,255, 18, 17,197, 54, 71, 54,199,155, 56, 89,185,108,
+ 97,173,222,120, 98,227, 47,127,219,130, 16, 17, 1,133, 89, 75,103,212, 77, 66, 4,102, 32, 2, 17, 20,116,103, 48,218,127,180,
+ 17, 67, 0, 33, 65, 1, 68, 18, 30, 60, 48,124,251,119,190,142,136,108,204,137,167,158,126,220, 9, 39, 17,146, 45,234,147, 36,
+ 73,162,209,161, 3,235, 30,121,184,220, 82, 40,149, 90,198,199,235,191,113, 65, 2,160,165, 56, 10,234,129,167,231, 22,160,226,
+ 1,174,221, 2,151,196, 81, 64,144, 72,152, 9, 73,144,185,175,167,231,142,239,125, 11, 0,230, 28,115,220,153,139,150, 5, 33,
+137,173,135, 88, 68,200,112, 24,134, 57,147,203, 77, 45,188,231,178,203,155,205,250,244,174, 89, 39,158, 50, 31,133,227, 36, 26,
+175,213,110,184,241,230, 9, 11,138,227, 68,132, 17,116, 99,172,157,245, 12, 97, 0,241, 39, 42,128,100,138, 96,221,181,161,193,
+ 3,223,254,218, 45, 65, 16, 46, 95,121,241,172,163,103, 19,145,186,183,186,154, 16,137, 8, 17,139, 4, 28,112,161, 88, 20, 32,
+170,141,157,126,198,217,204,198, 24, 8,194, 92,169,220,250,249,155, 62, 91,171, 86,110,250,194, 45, 62,236, 5, 0,152, 5,237,
+206,128,226, 80,246, 88, 23, 65, 17,214,162, 18,197,215, 31,113, 20,127,227, 43, 95,104, 54, 26,231,174,188,100,222,177,199,187,
+144, 0, 0, 9, 2, 20, 17,242,133, 65, 16,150,203,229,161,193,193,102, 35, 22, 96, 68, 66, 2,154,152,121,202,109, 29, 55,222,
+240, 15, 15, 60,184, 58,212, 29,113, 62,131, 54,198, 93,217, 39,126,135, 52,140, 88, 4, 81,152, 31, 93,253,192, 51, 27,159,156,
+ 61,247,216,229,231, 95,140, 1, 58,211,105, 56,234,203,136,136, 17,131, 82,169,101,104,104,232,192,192,128,128, 80, 64,204, 90,
+249, 88, 16,128, 72, 0,132, 41, 32,146, 48, 39,199, 28,123, 76,232, 34, 0, 0,116,219, 17, 52,227,185,250,199,218, 79,221, 24,
+160, 86, 29,251,250, 45,159, 71,194,171,174,255, 88,161, 80,180,165, 22, 9, 48, 50, 50, 1,169, 73, 3,164,114,107, 91,117,172,
+182,127,255, 0,176, 70, 1,104, 10, 65, 4, 2, 52,182, 40, 67, 64, 66,100, 36, 68, 9, 16, 41,116, 59,195,153,234, 9, 24, 24,
+ 1, 89, 45,230,190, 59,139, 60,254,240,234, 13, 79, 60,186,228,220,149,239, 58,249, 20, 4, 20, 68, 68,155,160,236, 78,128, 32,
+ 82,177, 84, 6,224,253,253, 3,204, 6, 0,180,120,178,155, 45, 8,128, 44,108,139,119,177, 49,139, 72,136, 98,207, 50,201, 60,
+ 82,215, 65,240,174, 3, 0, 81, 20,125,237,150,207,197, 81,243,234,235, 63, 86, 40,182,216,250, 76,247, 17, 81, 16, 73, 4,144,
+130,128, 90, 91,139,195, 35,213,234,216,152,186,129, 15, 82,223, 17,178, 8, 2, 10, 88,232, 12,220,134,107, 9,111,209, 78,205,
+253,152,137, 35,214,102, 8, 64, 68, 14, 12,236,191,237,235, 95,158, 53,123,238, 5,151,254, 73, 16,144,111, 52,209,237, 35,138,
+ 0, 81,169, 92, 22, 78,122,123, 7,140, 73,180, 67, 99, 0, 16, 70, 4, 97,176, 37,145,136, 0, 48,176,171,193,221,206,161,226,
+179,206, 66,204, 6, 0, 1,193,110, 19, 51, 32,170, 39, 61,245,248,163, 79, 60,178,250,146, 63,253,179,174,153, 71, 18,189,174,
+237, 69, 4, 16,164,160, 92,110,105, 54,227,225,161, 3, 44, 44,169,251,249, 46,196,174, 70,107, 78, 16,219, 13,218,183, 35, 0,
+193,241,122,245,229,237, 91, 29, 30,172,189,162, 97, 13, 34,141, 53, 97,254,225,237,183,238,121,237,215,127,113,237,199,202,229,
+178,111,194, 37,179, 40, 1,200,231,138, 45, 5, 26, 26,169,140,143,215,192,162, 53,236,176,204, 76,113,224,189, 34,205,108,206,
+ 63, 25,158,124,236,145, 57,243,230,117,205,156, 21,166,190,204,246, 73, 8,192,130, 38, 73,190,249,149, 47, 52, 27,141, 15,127,
+244,239,242,249,124, 26,139, 96, 83, 34, 34, 8, 64,185,181,149, 36,233, 31, 24,140,227,216,103,116, 6,180, 31, 11,204,118,115,
+ 88,220,251,107, 94,241,171,169,213,198,246,237,217,117,252,137, 39,107, 96, 89, 64, 77,219, 33, 97,107,217,168,217,248,234, 23,
+111,204,229,242,215,252,213, 39,114,185,156,166, 73,240,128, 22, 48, 8, 3, 64, 91, 91, 7,176,233,239, 27,136,163,216, 30, 65,
+ 34,236,156, 5,116,115,210,125, 98,118, 25, 31, 68,195, 13, 94,125,121, 91,179,217, 56,228,176,169,152, 77,147, 90,192,216,243,
+155,165,222,104,124,253,150,155,167, 29, 49,227,210, 63,253, 51, 12, 2, 1, 64, 20,177, 21,128,195, 16, 16, 91,219, 90,227,168,
+121,224,192,254,180,253, 21, 16, 16, 20,180, 77,190, 43,153, 92,217, 36,146,177,145, 8,111,221,242,220,180,174,110, 16, 97,195,
+ 62, 26, 29,207, 1, 34, 44, 0,216,104, 54,254,249,159,110,154, 49,243,200,139,222,251, 62, 36, 74,179, 56,128, 88,231, 19, 66,
+ 42,151,138,205, 70, 52, 56,168, 73, 79,187, 62,240, 61,185,110,145,100,118, 10, 28, 34,170,182, 54, 73,210,219,179,231,136,238,
+ 89,204,153, 95, 11,136, 72,104,183,204, 48, 32,214, 27,227,223,248,210,231,167,119,117, 95,248,158,203, 0, 80,139, 67,139,177,
+128, 77, 75, 1, 5,197,124, 56, 94,111,142,140,140,128,127, 51,125,182,186,159, 67, 30,188,121,188, 85, 88, 0, 64,198,107,213,
+250,248,120,123, 71,167,164, 16,137,150, 97, 44, 34, 33, 34, 62,249,248, 58, 17, 96, 54, 27,159,124,172,208,210, 58,117,198,145,
+207,108,122,218, 67,160,217, 7, 17,133, 97,192, 12,245,241,154, 59, 91, 50,127,233,127,137, 61,120,252, 70,166,231, 16, 72, 28,
+ 69, 90,152,167, 9,217,110, 39, 11,115,165, 50,246, 14,195, 27,181, 55,123,231, 44,102,201,146, 37,244,134, 91,243, 31,248,120,
+103,117,174,239,196, 5,189,149, 86,122,230,204,153, 43, 86,172,152, 52,169,147,141,217,182,125,251,125,247,221,255,118,182,247,
+221,221,221,187,119,239,126, 51, 79,157, 58,117,234, 77, 55,223, 60, 99,198, 12, 79,185,184,182,149, 65,120,195,134, 13,119,252,
+240,206,189,123,123,126, 79,167,126,179, 22,122,112,245, 67,168, 25, 15,128, 40, 0, 17,214,110, 14, 8,145,141, 49,243, 23,156,
+ 49,127,254,130, 36, 73, 70, 71,134,255,230, 99,159, 80, 16,234,237,223,178, 32,160,155,110,254,194,130, 51, 22,176, 97, 0, 17,
+ 36, 95, 74, 32, 3, 4, 0,204,232, 80, 85,102, 19, 34, 77, 58,100,202,191,220,118,107, 20, 55,239,191,239,254,187,238,190,231,
+247,218,178,201,147, 39,159,122,234,169,151,254,209,165,167,156,124,170, 97, 22, 97,192,208,214,197, 19, 78, 0,123,118,138, 71,
+ 26,236, 89,161,140,186, 97,182,240, 56,136,220,255,192, 3,119,252,240,174, 55,191,101,216,213,213, 85,173, 86,239,188,235,174,
+ 82,185,156,105, 78, 21, 80, 68,102,241,213,150, 63, 38,153,197,254, 94, 9, 41, 97, 99,220,241, 46, 44, 74,134, 89,118,219,242,
+145, 27, 55,110,248, 63,223,186,245, 77,249,208,181,215, 94,183,244,156,115, 80,143,108,180, 53,128, 30,241,130, 66,168, 94, 34,
+ 0, 2,132,246, 23, 4,192,202,104,248,130,132,132, 25, 1, 72, 80, 40, 16, 97,164,192, 36,201,230,141,235,119,108,223, 26, 53,
+ 26, 2,114,241,121,203,122,246, 15, 62,251,220,150,223,225, 67, 2, 16, 4,129,216,174, 85, 16,209,176, 48, 51, 32, 18, 35, 35,
+219, 30,223,225, 13,128,104, 33,116,209, 94, 11, 21, 3,209,206, 74,187,148, 56,225,141,235,215, 61,187,105, 3, 81,224, 32,120,
+140,162,232,208,142,214, 99,231, 30,189,117,199,171,191,109, 65,168,141,164, 45,147, 81,129,116,173,132, 20,240, 5,230,131,136,
+ 45, 11, 24, 41,152,141, 2, 4, 34, 64,168, 24, 17, 12, 14, 13,220,249,253,239, 8, 11, 81,144,169, 1,108,155,211, 53,237,176,
+109, 47,239, 20,225,223, 18,101,202, 57, 8, 16,178, 97,163,221,143,184,222,217, 86, 85,114, 48,219,134,164, 85,172,254,128,136,
+ 66, 32, 70,158,127,246,153,199, 31, 94,173, 77,106,107,123,219, 9, 39,157,218,209, 57, 9, 64, 70,135,135, 54,109,120, 82,129,
+167,227,143,157,243,171,151,182,255,214,176, 71, 68, 0,101, 86,181, 53,211, 18, 17, 37,219,197,248,127, 29,135,132,200,182,111,
+ 69, 18, 50,156,172,190,255,167,219, 95,122, 17, 0,218, 58, 58, 22,159,187,162,189,163, 67, 29,222,152,164, 88, 44, 94,120,233,
+123, 87, 63,240,139, 40,138,186,167, 29,250, 91, 23,132, 64, 0,137, 97,195,140,130,140,108,219, 99, 17,246,100,133,135,247,181,
+ 57, 23,237,224,212,137, 0, 1,146, 36,185,251,142,239,247,246,236, 5,128,249,103, 45,154,119,236,187,136,236,238, 59,146, 6,
+ 19,164, 21, 23, 92,252,216,218,213,181,106,213,247,153, 34,242, 6, 22, 74,146, 68,251, 84, 1, 65,176,161,228,155, 12, 73, 73,
+ 81,133, 65, 80,127,239,123,144, 36, 73,238,248,254,119, 6,250,251, 65,248,189,151, 95,217,222,209,137, 8,204, 76,100, 5, 67,
+ 6, 12, 33,132,128,136,184,116,249,202,173, 91,158,187,102,246,241,199, 30, 51, 87,132,227,102,115,245,154, 53, 15, 63,178,110,
+130, 44,138, 29,119,167, 77,131, 91, 60,107,235, 9, 34,128,170,169,177,171, 1, 77, 18, 8, 34,104, 76,114,231,237,183, 29,216,
+223, 95, 40,230,255,244, 3, 31, 42, 20,139,202, 69, 40,114, 69,174,153, 67,219,170, 96, 91, 91,199,105,103, 46,173,215,107,198,
+ 24, 99,132,194,240,221,203,207, 57, 48,112,224,133, 95,189,228,202, 15,177,161,108,215,227,112, 41, 1,228, 20,129,112,192,143,
+ 69, 7, 80, 8, 0,200, 24,243,179, 31,221,209,223,219, 83,110,109,189,252,131,215,148,202,101, 34, 2, 37,246,116, 1, 68, 72,
+ 68, 65, 16, 4, 65, 16,134,147,167, 28, 58, 94,175, 71, 81, 19, 17,131,192, 17,128, 65,254,178,203,254,164,189,189,205, 46, 72,
+ 50, 30,155, 54,200,138,126, 32,138, 66, 56,234,236,168, 75, 70, 1, 33, 32, 22, 94,247,200, 67, 59, 95,221, 81, 46,183, 94,118,
+197, 95,228,115, 5,103, 5, 85,100,232,191,246,135, 92, 46, 95,110,109, 31, 30, 26, 2, 0, 36,139, 43, 16, 5, 68,132, 68,185,
+ 48,255,183, 31,255,232, 65, 5, 26,106, 76, 42, 10,235,181, 42,232,250, 50,237,253, 45, 69, 44,200,194, 91,158,221,188,121,195,
+147,133, 66,254,178, 63,255,139,124,190, 64,132, 78,152,132, 46,235, 16, 2, 6, 20,148, 74,165, 92, 62, 63, 58, 50,194,118,251,
+220,186,237,154,213,138,185,191,255,239, 31,213,190, 76, 44,112,230, 92, 85, 15, 40, 64, 16,197, 81,220, 70, 50,162,174, 26,128,
+ 7,250,251, 31,252,249, 61,249,124,254, 3, 31,250, 72,161, 80, 20, 16, 20, 2, 18, 20,155,190, 28,252, 15,197, 98, 49, 49,102,
+172, 50,172,123,109,119, 65, 9, 87, 11, 84, 17, 19, 17, 81,107,107,187,239,237, 17,145, 61, 82,101,219,119,107, 30,135, 17, 59,
+100, 26, 65,234,227,227,183,127,231,159, 1,224,253, 31,188,166, 88, 44, 42,134, 41,100, 33, 8, 68, 32,235, 63, 84, 42,183,138,
+ 64,101,116, 68,129,119,180, 98, 65, 72,151,131,238, 69, 72, 72,129,117,106,187, 33, 54,176, 83, 4, 77,195, 76,151,226, 17, 63,
+ 99,204,191,124,251,171,204,252,158,247, 93,209,222,214, 78, 68, 40, 40, 36, 36,228, 82, 14, 41,253, 95, 42,149, 9,113,116,116,
+ 68, 83,173,160,254, 26, 38,210,209, 22,176, 2, 11, 88, 89, 11,185,109,242,173, 56, 40, 35,136,236,154, 79, 84, 14,149,121,237,
+170,251,170,149,202,153,139,206,153,222, 53, 19, 17, 5, 16, 72, 8, 72, 41,127,149, 8, 17, 82,177,165, 20, 4, 56, 52, 52,168,
+174,137,132, 14,203, 16,143,116, 73,138,123, 90, 16,205, 70,153,207,201, 30,137,210,213,128, 98,184,206,169, 89,100, 95,207,158,
+103, 55, 61, 53,229,176,195, 78, 58,237,244,128, 52, 90,196,234, 42, 20,124, 38, 32, 12,242,249, 92, 62,164,193,161, 97, 99,216,
+166,119,212, 98, 5, 9, 73, 82, 88, 39,205,188,232, 88,112,210,101, 56,101, 3, 56,182,216,229, 31,113,120,169, 72,179,209,184,
+227,123,223, 14,195,240, 61,239,187, 50, 8,115,226,219,125,113,137,140, 4, 0,131, 32, 40,149,138,149,177,154, 73, 18,171,236,
+ 68,173, 16, 92,210,151, 12,214,228,253, 83,207,105,151, 24,173, 33,245,112, 5, 79,172,103,108,198,108,126,244,131,239,154, 36,
+249,227, 15,124,176,144,207,147,171,141,108, 26, 86,131, 11, 17, 81,185, 84,170, 55,226,122,125,220,125,172,160, 63,122, 50,102,
+225, 12,228,153,145, 9,128,202, 73, 21,231,100,235, 52, 30,179,116,251, 45,204,219, 94,220,210,219,179,231,140,179,151, 30,122,
+216, 84,208,116, 44,174,198, 68, 4,155, 66,161, 92, 46, 27,147,140,140, 12, 75,154,217, 81, 82,250,198,126, 69,177, 21,134,199,
+132,209,213, 28, 64,154,123,237,106, 44, 84,105,163, 95,177, 79, 96,110, 52, 27, 63,191,251,142, 98,177,229,148,249,103,162, 10,
+119,148, 43, 83,197,175,221, 8,105,105,105, 9, 73,134,135, 71,152, 89, 99, 42,179, 81,146,110,145,213, 19, 88,224, 28,211,213,
+160,221, 50, 15,119, 57, 88, 19,213,139,244, 41,134,249,206,219,111, 5,132,247,255,151,171,194, 48, 60, 24, 19,118, 72,113, 16,
+134,133,124, 80,169,214,227, 56, 6, 65,165,216, 52, 34, 68, 15,100,207,170, 88,195,243, 4,104, 25,236,202,200, 97,123,182,142,
+ 6,199,119,136,133,249,100,247,174,157,253,251,122,230, 47, 92, 82,110,109,243, 59,125, 16,183, 13,136,229,214,214, 36,129,177,
+177, 74,234, 58,232, 58, 6,176,111,152,113,205, 84,131, 98,255, 19, 81,101,177,161,111,183,108,185,228, 29, 8, 45,224,117,215,
+237,183,230, 11,133,211, 22, 44,212,196,245,250,135, 8,180,148, 74,146, 52, 7,135, 70, 82,165, 70,234,244,146,241, 70, 79,121,
+121,100,211, 22,167, 32,178,249,233,245, 90, 17,131,101,196,152, 83,236, 17,109,208, 61,188,250, 62, 0,120,239,229, 87,134, 97,
+136, 8,242, 6,171,145, 48, 12, 2,228,218,120, 51,137, 99,204, 48, 56,142,106, 67,145, 12,126,119, 16, 9,224, 92,234,213, 87,
+118,180,182,182, 2, 8,137,210,134, 14,103,101, 75,111, 0, 51, 84, 70, 71,158,219,180,225,200,163,231, 78,158, 60, 69,220, 25,
+ 52,129, 87, 20, 33,162, 98,177,104,140,140, 85,199, 64,233, 18,176, 26, 50, 79,175,251,213,128,182,158,218,111,185,210, 13, 16,
+ 43,163, 35,227, 99,149,195,167,207,112, 44,131,197,204,193, 42,191, 4, 5,128, 57,185,235, 95,191, 27,132,225,185,231, 95, 68,
+ 68,106, 30,123, 46,102,190, 99,161, 80, 4,137, 71, 71, 71,213, 5, 81,196,135,132,235, 95, 38,110,153,203,131,172,100, 55, 72,
+146, 36, 59,182,189,216, 53,235, 40, 45,121, 73,153, 0, 20,171,138,241,177,176,103,247,174,145,161,193, 37,203,207,207,231, 11,
+106, 49,141, 98,246,239, 46, 66, 68, 1,113,163,201, 81, 20,217, 74, 69, 99,221,238,147,103,188, 50,120, 57, 90,211,144,128,114,
+206, 91,158,125,230,232, 57,243, 16, 9,124, 30, 74,183,214,146, 1,144,196,209,143,127,240,221, 66,161, 56,239,184, 19, 20,219,
+112, 93,179,248,101, 1, 98, 75,169,108, 88,198, 42,163,169,230, 10, 56,117,217, 20, 23, 22, 86,210,212,209, 67,162,141, 12,194,
+254,190,222,174, 89, 71, 17, 5,222,236,182,252, 64, 47, 27, 6, 17,225, 23,158,219, 44, 34, 23,190,231,178, 32, 12, 88,224, 96,
+155,139, 0, 72, 24,230, 36,105,212,106,117, 99,140,139, 20,119,140, 74,202, 99,123,190, 33, 5,236,213,153, 16,146, 56,169,140,
+142,228,194, 92,182,245, 35,199, 81, 0,186,254, 62,142,227,181,247,223,219,222,209,113,216,212,105, 40,130, 32, 46, 22,211,200,
+ 34,196, 66, 33,103, 24,235,227,227,142, 93, 17, 65, 37,113,108,103,146,238,153, 3,210,125, 83,170, 41,106,251, 75, 47, 28, 58,
+117, 26, 96, 54,133,171,232,139, 69, 64, 24, 80,241,148,199, 31,121, 8, 16, 47,250,227,203, 49,176,165,130, 76,116, 32, 68,200,
+ 23, 10, 96,226,202, 88,197,136, 1,208,214, 81, 73, 75,116, 60, 34, 59, 99,176,164, 75, 78,137,212,202,232,200,225,211,142, 0,
+204,118,197,105,145,175, 20,151,136, 64,179,217,120,118,211,250,233, 51,186, 90, 91,219, 50,137, 22,197, 45, 75, 80, 16, 3, 2,
+137, 12, 68,205, 8, 60,219,193,182,133, 4,229,161,220,230,176,213,102,100,202, 81,196,132,121, 96,127, 95,152,203, 99,166, 40,
+ 82, 11,146, 58, 32, 91, 13, 30,175, 91,243, 32,179, 44, 63,255, 82,237, 96,192,198, 23,248, 26, 6, 5, 10,197, 2, 34, 87, 70,
+ 43, 89,114,153,145, 45, 17,100, 63, 94,252,215, 17, 86, 58,134,253, 49,208,179,123,215,148, 67,167, 34,102, 56, 74,103, 57, 74,
+153, 89,145, 70,125,252,165, 23,158, 61,114,246,220, 82,185,156, 70,137, 74, 83, 28,185,132, 68, 4, 18, 39, 24,199,145, 26,196,
+ 38, 58, 65,246, 41,250, 32,106,204,185,143,110, 77, 28, 69,133,124, 1,136, 28,129, 37, 25,122, 88, 43, 70, 22, 4, 17,150, 77,
+ 79, 61, 41, 34, 11,151, 44,183,197, 50,164,234, 77,187,101, 34, 45, 45, 37, 66, 25, 29, 29, 86,161, 29,170,249,196, 54,222,160,
+ 0, 36, 59,247,201,150, 87, 98, 21,127,187, 95,251,117,177, 84,202,196,136, 11, 74,235,212,154, 21, 64,162,168,249,204, 83,235,
+ 14,155, 54,189,181,173, 85,205, 97, 93,129, 83,250,156,136, 8, 76, 61,226, 36, 78,108,209,142,172, 29, 5, 90, 93,174,117, 26,
+127, 42, 58,238, 21, 5, 80, 16,235,227,181,201,135, 76, 65,177, 88,207, 4,119,103, 1,128,112,207,174, 93,235, 5, 0,164,119,
+223, 94,198,112,210,161,211,159,217,180,233,141, 25, 25,196,124, 62,143,192,181, 90, 93,161,217,140,136, 39,163,205,144, 12,101,
+150,249,163,255,123, 96,160,175,173,173, 35,195, 75, 59, 6, 84,157, 76, 53,104,195,195,195, 35, 35, 35,239, 52, 90,232, 63,246,
+ 33, 34,157,157,157,147, 38, 77, 10, 1, 96,116,116,116,207,158, 61,255,105,148,215, 23,194,147, 38, 77,162,255, 52,196, 31, 24,
+157,248,159, 6,250, 3,123,132,255,222, 31, 48,109,218,180,203, 47,191,124,209,162, 69, 65, 16, 76, 64,237, 93,141,109, 76, 34,
+204, 81, 51,218,244,204,211,143, 60,186,238,133, 23,182,252,127,110,160,206,206,206, 43, 63,248,193,249,167,207, 63,108,234, 84,
+ 29, 18, 74,117, 89,105,209, 99, 91, 23, 17, 33, 10, 68, 36,204,229,151, 44, 61,103,241,146,101, 78,191,200, 99, 99,149,158,158,
+222, 29, 59,118, 60,181, 97,195,171,175,254,250, 15,219, 64,136,120,214,194,133, 31,185,246,250,174, 25, 51,226, 56, 18,112,147,
+165, 10,115,102,160,230,180,138,204, 84, 40, 34, 2, 66,118,190, 66,107, 79, 12,218, 59, 38,181,181,119,206,157, 55,239,162,139,
+ 46, 84,200,186, 86,171,109,124,122,211,250,245,235,119,190,246, 90,173, 54,254,142, 51, 16, 34,118,118,118,158,120,210,137,243,
+230,206,237,234,234,158, 59,111,238,148, 67, 14, 1, 10,130, 32,103, 73, 63, 34, 99, 12, 6, 1, 89, 60, 27, 72,137, 55,215, 27,
+104, 35,103,187,127, 0,143, 68,105, 19, 3, 34,164,144,169,173,215,148,204, 36, 8, 2, 45, 90,203,173,109,203,150, 45, 91,186,
+116,137,202,253,147, 36,121,104,205,154,123,126,252,211,230, 91, 21, 43,188, 69, 3,117,116,116, 92,114,233, 37,103, 44, 56,227,
+144, 41, 83, 38, 79, 62,164, 92, 46,123,229, 98,170,210, 21, 1, 12,188,200, 76,249, 3, 0, 84,165,188, 18, 15, 22, 59, 23,199,
+213, 40, 10,203, 96,137,101, 78, 21,173,110, 44, 1,144,156,122,159, 73,231,119,212,241, 8,109, 83,164, 19, 99, 58,199, 30,132,
+185, 11, 47,184,240,194,243, 47, 96,225,177,202,216,142, 87, 94,190,231,199, 63,221,219,211,243,246, 26, 8, 23, 47, 94, 92, 42,
+149,206,191,224,130,249, 11, 22, 4, 65,160, 67,147,110,193,144,206,180,165,213,185,229,208, 83,224,192, 37, 23, 43, 63,240, 24,
+141, 29,151,102, 59,252,120,112,104, 77,148, 36,171, 67, 1,192,235,194, 47,163,173,179, 3, 45,238, 69,156, 36,201,120,109,124,
+116,116,168, 50, 50, 92,173, 86,163,102, 51, 8,130, 92, 46,247,244,230, 95,110,219,254,242,192,192,129,223,199, 52,221,221,221,
+179,102,205, 10, 69,100,201,210,101,103, 45, 92,228,122, 83,160,208,221,223,144, 98,247,156,106,176, 89, 84,116, 14, 2, 66, 2,
+ 2, 40,200,100, 73, 39,118,136,169, 71, 78,145, 72, 28,149,100,101,244, 86, 30, 76, 40,108,145,115, 64, 1, 33, 10, 52, 31, 17,
+170,177, 20,216, 97, 59,111,131,130, 18, 24,230, 36, 54,195, 67,131,219,182,110,217,185, 99, 91,179,217,180, 60,207,196, 62,169,
+ 24,226,201,199,205, 9,131, 99, 6,134, 43,155,159,219,242,122,194,251,255, 45,196, 52, 64, 12, 51, 42, 95,230,192,126, 71, 42,
+ 50,160,157,243, 67,203, 31,144,141, 11, 29, 59,209,249, 90,116, 16,149,183,141,117,192,131,148, 20,152,210,244, 58,237,104,211,
+144,117, 70, 66,151,122,148,216,181, 99,152, 18, 53,163, 87, 94,222,254,194,230,141, 35,195,195,150,185, 71,248, 77,232,180,146,
+ 28,204, 60,185,189,188,114,217,194,231, 94,122,185,175,127,255,239,153,131,208,178,164,152,194,198, 44,198,234,140, 83,192, 21,
+ 29,217,160,122, 24, 37, 97, 39,124, 67,200, 6,102,214, 40, 46, 6,213, 44, 78, 98,142,150,198,133,236,132,170,229,176, 24, 56,
+137,147, 61,187, 94,219,188,113,125,111,207,110, 37,140,193,115, 64, 2,185,124,174, 88, 44,230, 11,133, 48, 12,153, 57,106, 54,
+ 27,245,241,102, 20,147, 99, 25,116, 35, 78, 60,230,232, 56,142, 7,135,134,223,178,129,148, 81, 82, 36,217,110,186,194, 39, 46,
+133,122,217, 5, 32,128,168, 96,201, 77, 23,167,208,231,193,238, 66,158,137, 66, 64,134, 44,191,238, 12,150,101,218, 44,178,166,
+ 32,137,169, 86,107,207, 63,251,204,179, 79,175,183,100, 18, 90,169, 70, 91, 71,219,172,163,231, 29,113, 68,119, 75,169,133,130,
+ 64,175, 4,177, 74, 51, 99, 68,140, 73,146,190,190,222, 23,159,127,174,217,108,218,165, 19,156,252,174, 99,214,174,123,234,173,
+ 26, 8, 83,231, 96, 54, 96, 37,242,142, 95,115,155,107,221,192,207,232, 56,132, 48, 13, 39,182, 4,157,227,190, 88,188,102,197,
+126,115,116,248, 91,154,162,116, 50, 69, 7,137, 5,128,141, 25, 30, 30,124,108,237,170, 61,175,237, 20, 55,187, 1, 40, 71,206,
+158, 51,239,152, 19, 58, 38, 77,242,156, 88, 22, 81,210, 20, 64, 20, 48, 27, 10,194, 35,102,116, 79,155, 54,125,100,100,104,243,
+211, 27,155,141, 6, 2,134,200,199,204,155,179,109,251,203,111, 53,196, 16, 81,192, 36,137,184,179,124, 98,200,184, 84, 97, 69,
+ 93,233,137,101, 37, 67,142, 64,247,252,108,202,243, 90,122,193,166, 43, 75, 16, 59,205, 26,184, 65, 16, 1, 49,198,244,237,235,
+ 89,183,118, 85,239,190, 61, 90, 94,139,200,225,211,143, 56,225,228,211, 14,157, 58,205,210, 79,153,131,207, 73,217, 17, 68,116,
+240, 80,136, 89, 2, 97,102, 98, 9,194, 67,166, 76, 93,113,254,197, 81,212,220,242,252,179,251,246,238,153,122, 72,199, 54,128,
+ 82,169, 52,111,222,220,238,174,174, 98,161, 24, 39,209,224,224,208,214,109,219,246,239, 31,248, 29, 6, 74,226, 88, 28, 45,145,
+ 94,247,225,212, 76, 90, 22,179,203,170,224,179,136,203, 52, 12,158,168,178, 82, 30, 55, 88, 9,246,188,115,179,137,206,164, 46,
+116, 5, 4,192,152,164,191,175,119,205,131,247,238,223,183, 79, 47, 78, 9,115,185,227, 78, 56,249,184,227, 79, 44,180, 20, 9,
+201,235,115,172,101,156, 40, 14, 2,107, 71,244, 76,142,102,120, 34,150,128,152,153,185, 24, 4, 11,206, 90,220,222,217, 73, 20,
+190,255,138,225, 56,142,188, 98, 87,152,153,205,202, 21,203,153,205,154,135, 31,121,244,177, 39,222,216, 64, 58,139, 98, 12,123,
+ 2,223,139,203,172,147, 75, 74, 22,171, 97, 28,157, 2,170,252,212,191, 5,209, 15, 66, 41,155,162, 71,161, 53,176,120,112,214,
+ 10, 22, 20,217, 28, 30, 30,122,232,254,159,245,236,222,165,152,110,177,165,229,140,179,151,117,205,156,149,203,229,124, 37,137,
+153,180,143,132, 58,153, 1, 46,184,201, 22, 22, 2, 64, 44,172, 7, 31,137, 64, 32,109,237,157,141, 70,189, 94,175, 87, 70,199,
+ 84, 10,139,104,165, 94, 8,200, 78, 0,147, 36,120,222,187,151,159,187,116,241, 63,127,243, 59,253, 19,189,201,207,255,217,147,
+221, 43, 23,180,210,245, 25,198, 75,191,210,177,136,140, 68, 6, 93,198,181,195,103,110,147,245, 89,144,190, 63,184,215, 33,179,
+ 25, 27, 29,125,252,145,213,219, 94,220,162,250,128,246,246,142, 51, 22, 45,235,154, 57, 43, 12,115,206,139,179, 5, 21,130,136,
+ 45, 2,192,198,107,154, 0, 29, 26, 31, 0, 34, 97,190,144, 39, 10,107,181,170,234, 23,180,142, 67,177, 51,116,204,132, 8, 12,
+ 6,149,138, 3, 8, 67,100, 54,129,192, 95, 93,247,151,175,188,250,234, 15,238,248, 81,146, 36,226,199,110, 92,234, 96, 55,204,
+226, 34, 76,183, 92,255, 81,137, 30,166, 74, 29,165,158, 82, 10, 56, 99, 23, 79,170,219, 2,216,221,137,100,133, 99, 44,205,102,
+227,185, 95,110,122,124,237, 42,253,164, 82,169,124,198,226,101, 51,103, 29,149,203,229, 0,179,169, 70,101, 45,144, 37,237,209,
+245,116,158, 7,180,158, 14, 24,134, 97, 46,159, 79, 18, 83, 29,171, 36, 38,177,154, 80,235,202,164,157,161,234,203, 68, 84,193,
+104,149,140,226, 52,183,196, 56,251,232,217, 55,124,250,239,254,237,135, 63,170, 84,199, 33, 59,210,234, 15, 96, 13,101, 13,115,
+101, 79,172,239,120, 9,179,187, 50,197,158,252,254, 22, 21,155, 84, 84, 90,100,247, 88,231,136,221,237, 42,146,196,201,222,221,
+187, 86,253,226,158,202,232, 8, 0,132, 97,120,246,210,119, 31, 53,103,110, 62,159,119,170, 42, 96,176, 92,182,157,189,148, 84,
+ 44,195,204, 7, 85,132, 4,136,136,133, 98,145,136,162, 40, 26, 29, 29, 53,186,249,118,160,210,138, 39,173,243, 18,130,149,178,
+233, 40, 39, 16, 49, 51, 9,130, 78,217, 26, 8,130, 16, 77,130,239,127,255,101, 59,119,190,246,235,215,246,132, 89, 14, 55,229,
+175, 29, 45,163, 53,178,165,202,197,170,201, 92,225, 15, 44,108, 11, 90, 61, 76,156,153,156,120,205, 73, 28,109, 1,193, 99, 99,
+163, 15,221,119,239, 43, 59,182, 18,145, 8,191,235,228,211, 79,157,127, 86,169, 84,178,210,175,140, 81,245,220, 23,178, 10,114,
+ 85, 30,138,168, 30, 72,178,183, 70, 21,138,197, 64, 77, 51, 50,154, 36, 49,103,218, 10,255, 52, 87,121, 19, 8,251, 5,185, 10,
+140,136,216,102, 57, 36, 66, 97, 4, 10, 1, 13,168, 28, 47,204,136, 68, 68,211,133, 94,233,225,206, 35,100, 45,249, 57,157,166,
+ 75,143,111,116,122, 25,144,116,250, 61,195,156,248,194, 47,142,162,237, 91,127,181,246,193,159, 71,205, 38, 17, 77,159,209,181,
+248,156,243, 58, 39, 77, 86,198,212,110, 11,137,213, 63, 89,102, 29, 84,226, 39, 86,102, 47,104,197,182,168, 4,102,190, 80,200,
+133, 20,199,201,232,232,104,212,108, 58,103,119,213, 62,138,115,196,140, 16,194, 73,227,157, 2,178, 19, 49, 0, 0, 10,109, 73,
+ 68, 65, 84,238, 14,157,237,208,247,116, 72,132, 70,128, 72, 75,211, 48,203,141,219, 92, 12, 30,175, 17, 68, 65, 64, 22, 39,166,
+246, 58, 49,203,193,131, 83, 73, 0, 48,167, 68,108,166,173, 48,198,140, 12, 15,221,255,147,187,246,245,236, 65,196, 32, 12,206,
+ 57,239,226, 35,143, 58, 58, 8,115, 68,100,231,164,201,215,161, 78,154,237, 52, 95, 62,253,145,138, 4, 8, 16,161, 88, 40, 6,
+ 33, 49,243,232,232, 88,179,209,240,184,146,173, 76, 88, 4,129,132, 24,217,213,107, 30,146, 66,175,176,118,172,180,164,226, 73,
+ 4, 39, 27, 36,239,128,169, 7, 49, 79,168,105,108,174, 81,138, 27,192,235, 42,237, 91,217,233,123,193, 76,163, 37, 86,156, 96,
+139,101, 6, 72,162,104,235,139, 47,172,125,224,222, 56,142,137,104,222,113, 39, 44, 88,184,184, 92,110, 69, 34,127,216,217, 34,
+ 58,245, 14,219,250,162,235, 71,208,182,106,128,132,185, 92,174, 80, 44, 8,155,122,189, 89,171, 85,245,172, 17,171,155,113,208,
+165,187,241,199, 74,137, 93,172,191,174,145, 6, 34, 96,182,122,149, 84,176,142, 2,254, 82, 35,127, 51,131, 71, 33,124, 33,167,
+ 82, 74,159, 26, 16, 17, 24,210,150,221,159, 14, 62,111,185,139, 7,116,123,140, 72,101,100,120,213,125, 63,221,249,202, 14, 68,
+ 44,151,203,231,156,127,201,140,174,238, 32, 8,237, 18, 85, 51,231,143, 56,251,117,172, 74,215, 98, 10,226, 52,113, 72, 97, 24,
+ 22, 11, 69,128, 36,137,147,202, 88, 37,142, 34,197, 23,172,248,223,197,186,189, 4, 79,208,159, 12, 94,183,207, 19, 43,124, 4,
+208,107, 40, 39, 42,230,156,184,201,117,231,225, 65, 24,149,102, 83,239, 96, 54, 13, 43, 88,165,130, 98, 72,101, 13, 86, 17,155,
+233,223, 53, 91, 37, 73,178,107,231,175, 31,248,217,143,198,199,107, 65, 16,204, 59,238,132, 51, 22, 45, 45,151,202,118, 92, 23,
+252, 4, 79, 42,162,244, 83, 42,206,105,220, 55, 4, 66,194, 66,161, 80,200,135, 81, 28, 55, 26, 81,173, 58,166, 58, 90,223,250,
+166, 17, 4,254,110, 3,119, 43, 64,122, 61,153,144, 54,225, 2,175, 31,101, 57,104,248,223,181,159, 56, 33, 7,185,105,125,235,
+132, 30, 57, 86,165, 39,248,192,211,139, 6,192, 10,137,157, 98,196,190,140, 69, 26,141,250, 99,107, 30,124, 97,243,211,128, 24,
+230,242, 43, 46,188,180,123,230,145, 65, 24,162,171, 68, 49,213, 3, 30, 52,138, 1,238,110, 19,209,177, 26, 36,202,233, 35,144,
+122, 51, 30, 27,171,196, 81,147,189, 39,100,234, 79,155,174, 60, 92, 7, 8,238,206, 2,116,211, 57,156,118,138,146,213,244,166,
+ 83, 14,233, 68, 73,186,166, 48,163,111,149, 20,104,113, 86, 87,132, 16, 61,140,110,103, 93,216, 43, 30, 83, 89, 30,179, 17, 30,
+ 58,112,224,254,159,221,221,183,111, 47, 32,118,205, 58,106,233,185, 43,219, 58,218,137,130, 84, 36,143, 41,162,228, 79,218,131,
+ 85,221, 42, 87, 37, 42,182,148, 2, 18, 22,169,142, 71,149,202, 40, 27,149,216, 8, 30,132, 50,249, 57, 51,143,194,217,178,128,
+179,122, 49,100, 7, 47,100,127,149,185, 38, 77, 82,172, 13, 61,198,145,173,131, 36,157,113,113,250,109,244, 62, 99, 59,118,132,
+244, 42,157,212,123, 68,196, 36,201, 43, 47,111,251,197,143,239, 84,202,225,140,197, 75, 79, 58,101, 65, 46,151,211,234, 62, 51,
+188, 3, 7, 25, 5,101, 66,157,169,183,242,132, 97, 88, 44, 22, 17,146, 40,230,106,181,218,104, 52,196,222, 36,236,212,128,200,
+ 25, 57,143, 11,119, 64, 47, 45, 99, 97,132,236,206, 75, 70,121,199, 19,198,172, 4, 60,116,225,199,176, 38, 92, 57, 0, 25,213,
+176,157, 7, 5,127,200, 35,248,252,196,174,157,130,204,145, 15, 32, 34,205, 70,125,195,147,235,158,121,234,113,102,110,107,107,
+ 63,247,130, 75, 14,159,118,132, 3, 40,178, 37,219, 27,133, 62,166, 51, 10,130,136, 68,133, 98, 75, 46, 64,230, 56, 74,100,116,
+116, 36,137, 19,239,202, 41,129,164,192,128,237,104,192, 75, 50,197,129,118,104,239, 51,201, 72,209,253,221, 43,153,128,242,165,
+ 73, 38,143, 34, 58,153,211, 65, 33,150, 94, 43,145,114, 59,105, 47,227, 80, 12,127,251,160, 34, 60,204,213,177,177, 7,238,253,
+241,206, 87,182, 3,224, 17,221, 51,151,175,188,164,173,189,221, 87,128,111, 82,117,164, 11, 11,131,176,216,210, 66,146, 48, 75,
+181,214, 24,175,213, 84,208,153,230,133, 20,134, 20,204, 64, 79, 58,144, 35,190,101,242,194,175, 9,222, 98,125,137, 37, 13, 45,
+191, 72,251,150, 74, 54, 49,143,142, 12,247,245,238,203,212, 65,214, 99,188, 33, 28, 91,229,248, 48,241,106,108, 61, 3, 17, 4,
+132, 19,211,215,219,243,139,159,220, 57, 58, 60, 76, 20,156,118,230,162,147, 79, 91, 80, 40, 20,236, 89,237, 94,242, 59, 77,164,
+ 29, 83, 24,230,139,197, 2, 74, 20, 37, 48, 86, 29,107, 54, 27,108, 88,235, 54,175,117,247, 41, 62,189,143, 67,178, 18,113,223,
+ 53, 91,112, 33,171, 38,119,108,230, 68, 86, 42,157, 78,176,159,208,108, 52,182,191,244,171,222,125, 61, 97,190,152,194, 29,224,
+210,141,173, 20, 61, 72,161, 23,240, 58,195,249, 74,135, 25,216,152,157,191,126,229,190,123,238,140,162, 38, 5,193,210,229,231,
+207,158,119,108, 46,151,199, 12, 9,147, 29,253,248, 77,150, 18,145, 32, 8, 90, 90, 74,194, 9, 74, 60,222, 52,213, 74, 37, 73,
+ 98,119, 57, 13,166, 23, 99,161,184,177, 18, 15, 28,104, 68,161,248, 49, 92, 73,121, 60,201, 10,237, 37,211, 34,189,158, 95,176,
+142, 99,246,247,247,189,180,229,249,195, 14,159,122,202,233,243,247,245,246,215,246,236, 13,125,126,102,244, 99,199,142,195,179,
+ 13,138,250, 42,122, 20, 67,152,227, 40,222,252,244,250, 39, 30,121, 72, 68, 90,219,219,207,187,232,189, 83,167, 78,163, 64, 21,
+216, 98, 95,237, 43, 28,129,172,194, 22, 39, 34,182, 65, 24,182,180,180, 16, 24, 3, 92,171,155,177, 74,197, 24,147, 94, 34,102,
+155, 63,214,105, 54,197,123, 57,173,135, 57,147, 9,189, 73,188, 10, 51,149, 3, 64,170, 71, 22, 63, 41,152,246, 5, 34,205,122,
+253, 87, 91,158, 19, 54,199,157,112, 82, 24, 6,174, 65, 75, 91, 13,189,211,212, 97, 46, 30,227,212,198, 44,179,107,194,220,104,
+212, 55, 60,254,232, 47,159, 94, 15, 0, 83, 15,159,126,238,202,139, 59, 39, 79,118, 66, 93, 69,233, 60,113, 33,236,102, 11,210,
+142, 49,109, 9, 48,151,203, 21, 91, 74, 73, 60, 46, 16, 86,107, 13,189,181, 18,252,133, 46,233,237,218,152,166, 63,237,157,173,
+ 27,160,248, 54, 90,252, 45, 91,246,197,233,221, 70,226, 46,254, 98,155,163,125, 35,134, 8,198,152,225,193,193, 87,118,188, 52,
+125,198,140,150,150, 86,112,247,239,103, 16, 69,223, 75,129,187,214,197,198, 9,131,207,215,202,148, 25, 51, 94,175,173,254,197,
+207, 94,222,246, 34, 0,204, 60,106,246,185,231, 93,212, 82, 42, 89,235,100,207,111, 47, 76, 32, 59,153,236,221,202,250, 14, 81,
+ 62,159, 15,131, 32,224,168,105,176, 86,171, 52,155, 13,102,255,137,168,172,170, 38, 99,203, 94,235, 12,164, 13, 44, 85, 69,103,
+245, 70,110, 6,215, 15, 34,184,157,102,175,127, 6,127,207,159,237,111,226, 40,122,121,199, 75,194,230,232, 57,199, 40,150, 34,
+ 14,169,200, 30,243,217,161, 10, 1,135, 52, 91,125,183,235,178, 12,243,200,232,240,170,123,239,233,217,179,139,136, 78, 56,101,
+254,233,103,158, 93, 40, 20,236,205,224, 14, 77, 68,156,112,132,251,185,119,109,100,245,171, 19, 81,161,216, 18, 18, 50,199,245,
+152, 42,149, 74, 28, 71, 98,239, 4, 18,246,119,197, 34, 59, 24,134,221, 12,139,147, 25, 75, 6, 13,158,160,159,206, 64, 64,162,
+170,116,192,140,144, 28, 83,124, 79,234,227,181, 87,119,108,237,156, 60,165,164, 87, 93,233,176, 10,103,231,184,210, 94,204, 41,
+157,208,147,159,108,169, 42, 1, 97,100,225,145,225,161,251,126,114, 87,127,111, 15, 17,158,116,218,153,167, 46, 56, 43,159,207,
+ 91, 76, 20,125,197,152, 50,179,214, 88,105, 43, 32,206, 58, 65,177,165, 36, 28, 1, 80, 51,230,106,101, 36, 49,137,176,117,121,
+241, 19,101,182,229,212,149,160,139,120,247, 11,100,118,163, 76,217, 86,210,222,177,229,110, 83, 78,107, 96,151, 6,181,157, 53,
+108, 14,244,247,233,109, 75, 65, 16,184,139,158,178,173, 72, 22,180,183,209, 40, 86, 8,238,219, 25,151,118, 12,155, 3,251,251,
+127,122,215,237,213, 74, 5, 0, 22,157,179,114,222,113,199,135, 97, 14,221, 20,155, 21,227,103,178, 79, 22, 26,245,213, 2, 2,
+ 80, 16, 20,139, 45, 1,154, 88,164,222, 76, 42,163,163,108, 12,123, 53,132,255, 26,206,214, 22, 0,100, 6,112, 55, 61,104, 47,
+202, 62,183,112,170, 20,215,229, 10,163,155, 4,182,167, 61,106, 83,107,183, 42, 73,226,158, 61,187,141, 73,186,143,156,109,163,
+195,245, 32, 25,102,216,122, 99, 26, 98,236, 48,123, 76,143, 85, 16, 17,147,112,239,190,158, 7,239,189,187, 86,173,134,249,252,
+217, 75,223, 61,123,222,177,158,120, 96,207,135,120,184,195, 90,202,187,149,187, 27, 17, 49, 8,194, 82,185,204,241,184,161,160,
+222,136,106,181,154, 18,185,153, 51, 55,237, 9, 17,213,115,208,194,254,118,252, 79,255,114,183,176,101,202, 31,246, 99,220,122,
+242,187, 41, 74,182, 21, 11, 10, 50, 48,196,113,180, 99,235,139,157,147, 39,119,116,116, 90, 87,200, 94, 81,151,177, 14,102, 88,
+ 13,189,159,217,146,196,246, 60, 68,212,155,222,251,251,250,238,251,201, 15,171,149, 10, 18, 45, 92,250,238,217,243,142, 85,198,
+ 74,145,145,236, 4,153,100, 10,103,111, 44,123,195, 32, 96, 16,134,133, 66, 1,185,153, 48, 54,198,235, 90, 37,123,172, 73,132,
+221, 88,200, 65,113,101, 15,123,206,148,133, 46,243, 74,230,123,165, 67,184,110,176,212, 94, 59,152,182, 26, 12,213,234,216,190,
+ 61,187,166, 78,159,145, 11, 67,255,194, 12, 86,154, 54,119, 62,251,167,167,152, 61,145, 37,237, 65,141, 49, 61,123,119,255,252,
+238,127,139,154,205, 48, 12,206,185,224,143,186,103, 29, 21, 6, 65, 58,231,137,169, 40, 3,237,173, 20,246,255,213,179,210,214,
+ 60, 12, 91, 90, 74, 98,234,145, 9,234,245,250,248,248,184,135,189, 5,217, 14,177, 91,210, 94,128,209, 86, 39,153, 82, 23, 93,
+165,227, 8, 55,219,124,122, 62,215, 95, 64,226, 7, 57,217,179, 44, 0, 34, 50, 86, 25,217,183,119,207,161,135, 79, 11, 40,176,
+185, 67, 38, 82,217,110,186, 68, 50,135, 99,232,243,158,100,165, 37, 34,204,188,111,239,158, 85,247,254, 56,106, 54,115,249,252,
+217,231,172,232,234,158, 21, 6,129,187,209,212,126,127, 15, 45, 74, 6,238, 1, 15, 54, 2, 16, 81, 46,204, 21,242,121, 48, 77,
+150, 96,108,108,172,209,104,168,112,196,190, 66,208,247, 79,122,137, 28, 58, 86, 73,192, 93, 74,113,112, 87,145,185,207, 45,123,
+250,218, 34, 21,109, 91, 97, 89, 42,100, 99,250,122,123,162,168,121,248,244, 25, 62, 35,102,156,113, 66,227,237, 7, 90,210,102,
+ 21, 44,238,236, 59, 88, 96,230,129,253,125, 15,252,236,238,218, 88, 5, 9,207, 92,124,238,145, 71,207, 13,195,156,123, 19,116,
+168, 37, 99,118,216, 46, 3,137, 91,248, 2, 41, 23,134,249,124,142, 48,105,198, 92,171,141, 55, 26,117,102, 70,127, 82,161, 56,
+182, 71,193, 37,155,140,211, 57,101,196,204,224,219,132, 31, 32,189, 19, 22, 51, 19,151,104, 79,118,167,180, 49,198,236,239,221,
+199,198,116,118, 78, 78, 69, 41, 19,152,174,223,244,152,168,180, 71, 55, 8,207,194,251,251,123,127,126,247, 29,227,213, 49, 34,
+ 90,186,226,162, 57,243,142, 85,236,194, 93,227,159, 41,191, 37, 51,202,154,129, 81,244,122,140,124, 46, 87,108,105, 65,137, 19,
+166, 90,173,166,176,142, 45,106, 17,252,113,128, 41,194,136,238,162, 70,183, 5,191, 67, 62, 55,113, 70,218,235, 80,108,179,140,
+134,147,221, 59, 95, 5,128,182,142, 78, 36,202,150,106, 50, 1,136,193,131,132,202,222, 64,184,100,201,146,172,163,102, 40, 55,
+ 60, 56,181,255, 97, 78,236,252,158, 47,255,191, 39,161, 67,133,199, 85, 52, 66, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/lighten.png.c b/source/blender/editors/datafiles/lighten.png.c
new file mode 100644
index 00000000000..7059d11de21
--- /dev/null
+++ b/source/blender/editors/datafiles/lighten.png.c
@@ -0,0 +1,301 @@
+/* DataToC output of file <lighten_png> */
+
+int datatoc_lighten_png_size= 9437;
+char datatoc_lighten_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0, 1,
+ 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,252, 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0, 0,
+ 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116,
+ 73, 77, 69, 7,218, 7, 21, 0, 4, 17,164, 74, 11,162, 0, 0, 32, 0, 73, 68, 65, 84,120,218,237,125,105,144,109,215, 85,222,
+250,214,222,231,246,248,102, 61,201,146, 44,219,146,108, 34,233,225, 65,179,237,144,136, 96, 73,166, 76,156, 96, 23, 38, 21,248,
+ 17,170,194, 84, 73,204, 12, 54, 54,144,170,224, 2, 2,127,192,252, 8,164, 32,133,171, 82, 84, 98, 66, 85,248,231, 63,137, 0,
+ 51,148, 7,144, 43, 24, 91,122,146, 29, 73,150,159,244,158,223,208,175,167,219,247,158,189,215,151, 31,107,239,125,206,237,110,
+201,114, 48,169, 80,165,211,173,126,221,183,111,159,187,239,218,107,175,225, 91,223, 90, 18,249, 90,175, 87, 92,127,253,205, 55,
+223,114,240,113,136,200,251,222,255,129,156, 19, 68, 84, 21,170, 49,198, 46,198,216,117, 31,252,192, 79,251,147,194, 15,253,240,
+143,244,253, 60,231,100,102,217,204, 44,211, 47,179, 7, 31,124,232,177,199, 31,219,222,218,210,249,124,214,207,231,253,188,239,
+ 83,159,250,190,139,125,144,100, 70,179, 60,159,207,127,240, 7,126,176,235, 58,188,231,159,127,207,103,159,220,221,154,102, 64,
+255,201, 3,215, 28, 93, 83,145, 40, 92, 70, 12,164, 64,117,210,117,241, 79, 30,189, 12, 64, 4,128,173, 45, 67, 68, 68, 18,101,
+198, 20,178,137, 32,208, 44,154,101,133,138,192, 68, 52,136, 8,205, 56,239,247, 40, 49,155,134, 96, 66, 70,161, 25, 9, 64, 0,
+ 17, 33,229,179, 79,238,124,230,236,246, 13,215,172,220,121,219,209,201,132, 66,137,204, 6, 21, 10,132,216,155,217,159,125,230,
+210,151,206, 77, 17,226,185, 11,211,231, 46,205, 94,123,211,250, 55,222,122, 4,167,111,121, 27, 36,136, 10, 8,170, 10,161, 42,
+144,128, 16, 0, 5, 84, 52, 70, 26,137, 44, 25,170, 16, 19,129,144, 42, 98, 66, 17, 17, 2, 65,236, 37,109, 87,104,223,173,172,
+172,222,116,211, 77,170,152, 78,167,251,247,238,174,187,238,122,219,131, 15,145, 84, 0,170, 33, 4,223,184,143,125,236, 99,127,
+250, 39, 31, 47, 79,250,161, 31,250, 97, 10, 33, 80, 85, 40,130,134,232, 87,215,197, 24,127,230,131, 31, 16, 17,157,215,141,235,
+ 83,175,210, 71,237,193, 76, 99,223,207,231,243,217,207,255,252,135, 68, 4,223,252,246,239,126,242,217, 61, 0, 43, 75,225,221,
+ 15, 94, 3,129,200, 18,117,201, 55, 40,198,184,180,188, 28, 31,127,106, 11,170, 36, 94,113,227, 50,132, 34, 66,206, 96, 36,145,
+168, 52,163, 72, 52, 49, 53, 19, 81,223, 93,146,217,108,222, 79,205,162,106,176,104, 20,137, 52,163, 64, 96,125, 50, 82,118,247,
+242,255,248,196,229,221, 41,239,123,253,137, 83,199, 39, 36,133, 18,214, 78,222, 34, 66,138, 40,228,117,175, 94,255, 47, 31,123,
+118,119,207,178,241,217,231,231,207, 94,152, 93,119,114,210,117,192,233,155, 31,132,170, 64, 93,227, 85, 84, 20,130, 0, 9,208,
+ 16, 52,136,198,104, 98, 74,130, 34, 34,162, 32, 13, 2,168,138,100,136, 80,160, 52,249,122, 93, 24,255,240, 35, 63,250, 99,107,
+171,107,190, 73,254, 1,133, 66, 53, 40,128,160,225,195, 31,254,213,243,231,207, 31,126,163,159,248,201,159,202,150,133, 34, 70,
+191, 45, 68,160,128, 40, 20, 34,208, 0, 85, 5, 52,132,160, 64, 8, 65, 53,196, 24,223,255,254,159, 90,184,209,191,250,215,255,
+ 70,132,174,169, 34,130,209, 37,144, 24,208, 69,133, 40, 37,104, 8,190, 60, 55, 25,170, 26, 98,252,200, 71,126,231,137,179,103,
+ 69, 36,246,243,185,136, 24, 57,155,115,107, 55, 25,177,182, 18,142,175,199,165, 73, 88, 89, 22, 8,204, 84, 16, 32, 32, 85, 5,
+ 52, 35, 37,231, 12,133,166,244, 93,223,245,221, 33,132,159,251,217,159,193,107,222,240,238,108,204,217,223,148,191, 55, 92,123,
+106,242,192,221,199, 87,150, 68, 68,171, 40, 35, 25, 41, 42,128, 82, 40, 52, 0,208,224, 75,235, 98,156,237, 37, 1, 5,160, 64,
+ 73, 81, 37,121,205,241,149,229, 73,217, 7,146, 34, 20,153,139,204, 33,209, 12,115,131,153,191,123, 53, 85, 85,205,102,145,146,
+133, 20, 83,130,132,138, 37, 10, 98, 16, 1, 69, 32, 66, 10,102,115,219,216,234, 47, 93, 77,150,229,154,227, 75,203, 75,161,139,
+234,135,207, 79,160,154, 69, 90, 18,170,104, 38, 65, 38,129,138,216,214,118,202, 25, 49,112, 58,147,191,252,220,149,103,158,155,
+206,122,223, 74, 0, 88, 89,142,175,122,197,242,171,175, 95, 89,234, 66,244, 59,170,225,244,173, 15,137, 0,190, 0, 8,160, 36,
+151,186,240,240, 55,221,240,228, 51, 91,103,159,218, 34, 73, 64, 5, 20,133,170, 80, 92, 56, 46, 80, 64,215, 87,227,201,227, 75,
+ 56,117,243,183,248,235,248,163, 66, 17,127,178, 84,173,170,191, 19, 40, 8, 81,173, 54, 90, 1,161,168,107, 89, 36,205, 53, 89,
+160, 66, 19, 8, 13, 10,138,184, 53, 0, 21, 74, 17,117,195,168,194, 44,226,154,101, 66, 0,164, 9,149,242,255,221,133, 67, 31,
+ 61,113,226,196,241,227, 39, 68,100, 54,219,219,216,216,216,221,221,253, 26,110,244,218,215,189,238, 61,239,249,206, 42,217, 42,
+124,168, 43,111, 8, 97, 99,227,234,175,252,242, 47,189,216,141,222,255,211, 31,176,108,116,123, 88, 78,191,250,198, 64,203, 21,
+252,102, 26, 98, 23,223,247, 83, 63,121,200,141,126,236,199,127, 66,232, 31,190, 75,240,141,133,239, 36, 2, 20, 33, 20, 51, 18,
+212,151, 24,158,249,210, 51,191,249, 27,255, 97,124, 35, 77, 41,245,169, 79, 41,165,156, 82, 78,150,147,229,148,115,206, 41,231,
+108,217,146,229,156, 83,182,156,115, 74, 41, 39,255,122,211, 77, 55,253,210, 47,253,242,254, 27,229,242,233,127,236, 87,202, 57,
+155,101, 48, 3, 25,102, 66, 35,201,108,217,114, 78, 41,245,125,223,207,127,225, 23, 7,145,169,229,108,237,162,209, 72, 35,205,
+132, 22,131,197, 96, 1, 86, 12,135,144, 16, 49, 49,250, 42, 83, 74,233, 23,127,241,223, 23,159,124,231,157,119, 81, 56,155,229,
+ 75, 27,243,171,219, 57,165,172,138, 24,216,117, 50, 9,132,186,232, 0, 81, 63,181,164,148,109,169,223,188,254,245,175,255,228,
+ 39, 62, 17, 55,182,231, 79, 60,179,119,105,163,247,231, 67, 48,233,112,219,205,107,223,240,170, 37,209, 64,102, 64, 68, 76,100,
+184, 1, 41,160, 24, 76, 68, 36,165,107, 78, 93, 3, 65,216,213, 91,182,118,147,209,195, 11, 35,185,182, 26, 78,159,136, 39,143,
+199, 24, 4, 80,169,246,220, 76, 68, 4,230,119, 36, 57,156,175,135, 30,126, 56,206,230,217, 45, 72, 81, 34,200,202, 4, 43, 75,
+218,133,225, 22, 34,201, 76, 84, 41,162, 20,201, 46, 45,160, 44, 18,152,207,231, 81,232, 62, 20, 85, 25, 37, 70,116,209, 85,187,
+153, 90, 1,146, 8,179,169, 25,178,193,181,222,109,142,164, 36,148,104,204, 16, 64, 40,132, 40,141, 80, 80,193,122, 35, 95, 20,
+ 83, 98,202, 38, 8, 57, 67, 68, 1, 40, 65,176,232,177,164, 8, 87,104,129,128,194,106,169,203, 45, 64,210,168,123,179,252,252,
+165,254,234, 86,190,246,196,100,101, 57,198, 64, 13, 74,211,160, 52,179,242, 62, 40,244,101,128, 34, 84,170,229,100, 70,144, 42,
+ 66,163,236, 76,211,231,190,176,115,246,233, 29, 64, 47,156,152,220,250,202,213, 99,235,221,164,163, 6, 10, 69,233, 47,203,176,
+118,226, 86, 40,234, 9,134, 8, 87,150,195,137,163,147,227, 71,162,128,187,211,252,169,207,110,126,241,217, 29, 95,246,116,207,
+190,114,181,159,247,214, 69,141,177,254, 29, 32, 34, 97,237,228,173, 20, 20, 43, 93,130, 48, 28, 93,143,199,143,116,125,207, 63,
+125,244,242,179,207, 79,225,111, 82, 32,130,148,237,234,102, 62,191,145, 54,182,210, 60,113,121,162, 49, 64,128,176,118,226,214,
+ 18,175,214, 91,245,153,171,203, 81, 33,159,123,114,243,233,231,166,112,221,240, 13,113,157, 21,230,196,173,105,190,112,121,254,
+212,115,179, 47,127,101,190,177,157,112,250,150, 7, 75, 12, 35, 90,194,153,178, 92, 10,220,172,168,135, 22,229,149,154, 23, 17,
+ 21,120,184, 21, 84, 17,133, 20, 87, 36,152,251, 31,162, 88, 55, 24, 5,226, 62,130,174, 50, 2,144,164,135, 20,116,127, 36, 74,
+ 19, 81,138,249,182, 87,157, 39,232,231,192, 12, 66, 18, 66,163,137,144, 52, 33, 77, 40, 48, 17,129, 9,139,185, 32, 40, 74,138,
+144, 70,243, 16,195, 76, 40, 38,160,136,128,230, 47, 80,151, 81, 23,111,174,101, 20, 8, 32,144,133,115,247,242,245, 53,249,217,
+118,221,114,203,173,119,220,113,199,205,183,222,122,242,196,137,225, 81,150, 83, 0, 15,158,203, 63,186,177,177,113,246,236,227,
+127,245, 87,255,235, 11, 95,248,194,215,103, 65,235,235,235,239,121,207,119, 94,127,253, 13,102,174, 10,131, 49,105,145,146,212,
+232, 10,251, 34,233,226, 83, 81,156, 51, 84, 32,177,235,254,219, 71, 63,250,233, 79,127,234,165, 43, 7,222,249,206,119,222,113,
+199, 25,179,193,197,136, 44,252,117, 61,119, 67,216,134, 22,215,239, 95,146, 39, 28,195,178,234, 66, 85, 85, 83, 78,255,241, 55,
+127,227, 75, 95,250,210, 87, 89,208,143,252,232,143, 75,245,117,251,150, 82, 95, 87, 70, 31, 11,171,145, 33,205, 24,137, 72,134,
+165,236, 19,158,106, 0, 16, 98,248,183, 63,247,179,123,123,123,135, 39,208,247,222,123,175,159, 93,178,254, 59,186, 68,106,180,
+ 51,254, 32,139,167, 21, 66,168,197,238,184, 27, 22, 20,159,214,222,226,224, 74, 73,183, 39,246,192, 3,223,252,240,195,111,127,
+234,169,167, 46, 95,190,188,127, 65,119,223,115, 15,205,104, 7, 86, 35,164, 13,110,190, 45,194,205, 17, 64,128, 49, 16,238,253,
+220,156,140,242, 33, 10, 81, 44, 45,141, 34,101, 57,195,221,141,246,166, 59,239,124,248,225,183, 63,249,196, 19, 87,175, 94,109,
+ 11,138, 57,165,209,233, 41, 91,150,146, 39, 50, 34,144, 24, 84, 32, 81,161, 1, 96, 9,107, 98, 16,129, 4,128, 53, 54, 20,241,
+ 24,193, 32,218,156, 43,133, 32, 5,204,110,186,173,237,178,153, 65, 85,105,246,189,223,247,253,147,110,242,190,247,149,120, 52,
+188,225,141,119,154,177, 79, 54, 79, 54,159,219,206,204,166,211,124,101,179,223,218, 77,155,219,105,107, 55,207,230, 54,221, 51,
+203, 76,137, 2,134, 32, 33,200, 82, 71, 7,111, 20, 11,122, 87, 20,166,248, 14,106, 61,165, 44,118, 89,170,190,142,247,145,217,
+242,131,111,123,232,220,185,115, 23, 47, 94,196,187,190,227, 95, 80,120,113, 35,109,110,167,189,222,182,119, 61, 48, 43, 62,144,
+234, 78,137, 93,212, 16,241,247, 94,189,122,203, 43,151,187,168, 53,171,108,178,112, 33, 5, 17, 45,223,120,216,132, 26,198,112,
+ 48, 48,172,135,160, 28, 73,245, 68, 54, 0,248,163, 63,122, 4,215,223,254, 79, 11,144,212,194, 7, 10,235,207,237,209,227, 71,
+186,229, 37,125,213,245,203,175,185,126, 73, 33,147,137,111,144,142,212,209,127, 84,145, 64,214, 77,164, 80,160, 37,140, 45,162,
+226,128, 72,140, 78,167,170,127,117, 55, 45,130, 10, 62, 56,104,130, 81,164, 39, 32,101,117, 25,235,107, 97,117, 89, 39, 19,197,
+ 96,171,247,217, 88,146, 73,196, 60,140, 19,207,216,139, 45, 65, 50, 97,185,125,145, 16,171, 81,240,156,209,191, 70,113,144,134,
+ 67,180, 66, 53,214,163,171, 70, 66,132, 18,131, 44, 77, 16,213,205,210,194,101,102, 24,173, 14, 48,145, 44,162, 36, 82,134, 8,
+ 82, 18, 2, 52, 15, 53, 21, 42, 44,161, 13, 20,234,239, 31, 14,202,145,145, 77,154, 16,210, 0, 8, 33, 98,240, 80, 4, 16,177,
+146,187, 11,165,156,240,166, 55, 20,161,170,186, 61, 16,112,103,202,189, 57,183,119,243,222,140, 49,226,212,209,137,170, 86, 35,
+143,130, 97, 82, 60,225, 87, 81,211, 44, 46, 34, 17, 16, 10, 70,163,159, 76,120,236, 46, 5,167,244, 87,182,170,153,204,201, 82,
+ 34, 13,251,246,138,196,188,207, 20, 60,245,229,233,206, 94,126,254, 43,243, 43,155,189,195, 4, 49,234, 53,199,186, 46,224,213,
+ 55,174,196,128,181,229, 24,212, 79,137, 2, 89,160, 34,185,156, 26, 5, 50, 1, 80, 17,221, 78,212, 20, 7, 48, 86,208,129,144,
+ 98,124, 5,156, 39,155,206,210,172,207,150, 69,192,160, 48,178,239,153, 50, 63,251,228,118,223,219,115, 23,103,123,115, 43,233,
+ 7, 41,162,125,159,207, 95, 50, 1, 46,111,245, 10,188,226,212, 82,215,225,154,227,147,149,229, 16, 84,187, 72,131, 66,178, 8,
+144,171,134,155, 70, 74, 38, 93, 60,174,111, 32, 77, 26,130, 4,115,137, 76,103,137,228,116,150,251,148, 21, 8, 19,157,205,236,
+ 51,103, 55,114,226,179,231,247,114,102,202, 45, 40, 81,163, 0,153,162,102, 4,100,103,106, 34,216,155, 27, 84,206,125,101, 30,
+ 35, 86,151,227,145,213,176, 60, 9,167,142,119, 65,177, 52, 9, 40,128,142, 68,143, 95,125,151, 74, 40,239,193,167, 22, 83,235,
+ 49,231,116,218,247,115,219,217, 77,187,123,214,247,182,177,181,187, 55,183,103,190,188, 99, 38,123,115,207,124, 20, 52, 66,133,
+230,203, 34, 13, 34,164, 90, 54, 42,108, 46, 16,233,251, 30,192,214,118,186, 24, 53, 6, 60,115, 33, 4, 96,101, 41,168,234,250,
+ 74,208,160,142,115, 19, 2, 24, 0, 19, 3, 1,250, 63, 2, 26,125, 23,103,189,245,137,207, 95,156,166,108,125,111, 87,183,123,
+ 51,217,157,102,162, 88, 78, 33,169,238, 29,132,162, 52,211,146,220,152,199,238,126, 56,178, 41,104, 57,171,204, 77, 4,178,147,
+ 85,164,235, 2,128,229,165, 16, 84,113,250,230,183,185,177,168,102,195,221,149,219,175,226,185, 85, 60, 83, 98,129,235,154, 21,
+130,187,249, 10,122,129, 66,165, 82,197, 31, 24, 80,195,106, 17,180,166, 96,158,123,193, 65,101,208,243, 23,136, 32, 86,125,102,
+ 61,216,160,216,240,138,174,241,110,222, 80,220,128, 21,151, 80,143,177,159, 11,186,231, 34, 40, 38,230, 73, 4, 68,173,100, 29,
+ 10,183, 88,158,149, 86,212,174,189,115,186,189, 83,137,226,176,156,130, 98, 20, 45,232,102, 61,212, 86, 64,196, 98, 76,139, 76,
+ 60,212, 41,122, 47, 66,135,242,180,248, 44,183,156,197, 69,212,164,191,220,201,109,155,195,128, 70, 0,162, 66,210, 99, 4,245,
+ 52,205, 13,145, 81,200,146, 64, 21, 28,150,195,201, 23,138,209, 40,142,217,176, 70, 63,238,180,133, 70,136,208,220,167,179,254,
+ 18, 20,163, 9, 68,172, 26,126, 17, 17,163,213,216,173,196, 59, 44,123,196, 1,246,126,249,122,249,250, 91,203, 92,135,216,187,
+139,171, 43,171,147,201,100,121,121,165,235,186,130,174,165,126,111,111, 54,155,237,237,236,236,100,175,122,252,173, 46,168,235,
+186, 55,189,233,206,219,110,191,253,213,175,122,117,136, 97,136, 64,181,156, 51, 79, 1, 61,220, 35,249,197, 47,126,241,243,159,
+251,235,191,248,139,191,152,207,231, 95,231, 5,125,219, 63,126,231,153, 51,103,186,216,213, 88,105,200,164, 71, 9,117, 75, 16,
+ 75,134, 47, 34, 33, 4, 40,230,243,249,163,127,249,151,127,240, 7,255,253,111,180,160, 24,227,153, 51,103,222,241,142,111, 99,
+139, 93,217,128,198, 33,165, 31,103,248,139,201,233, 98,106, 15,168,234,230,230,230,135,127,237, 87,119,118,118,190,182, 5,157,
+ 60,121,242, 29,239,120,199, 13, 55,188,210, 49,163, 81, 52, 61,122,210, 56,232, 31,125,125,193, 53,121,116, 42, 18, 98,184,112,
+254,252, 71,126,231,119, 14, 38,169,135, 47,232,189,239,125,239,202,202, 90, 53,159,251, 51,252, 33,147,199,144,149,142,164, 84,
+209, 62,143, 83,101, 12, 48,140, 55, 19, 33,132,179,103,207,254,167,223,254,173,175, 94, 28,255, 7,255,240, 1,203, 70, 97,102,
+110, 89,115,245, 9, 45,191,247,216,150,104,194,179,234, 98,107,222,135, 33,122,170, 25, 79,205, 68,124,219, 79,157, 58,245,246,
+111,253,214, 63,255,243, 63,123,113,149, 15,247,223,255,102,122, 25,243, 16,172,161,184,181, 42,178, 1,105,144, 1, 77, 24, 16,
+237, 67,174,146, 71,213,219,152, 61,240,192, 63,234,186,238,201, 39,159,120,193, 5,221,119,255,253,139, 47, 60,250, 36, 15,156,
+ 67, 30,252,150, 53, 29,229,104,151, 71,233,125,125,176,130, 41,175,121,205,205,183,221,126,251,167, 62,249,201, 67, 23,164, 52,
+ 43, 62,220,172, 32, 20,237, 83, 94, 0,164,169,232,171,144, 16, 83, 49,208,209, 92,142,208,151,118, 59,182,151, 48, 51,179,156,
+ 45,223,120,195,141, 31,250,208, 47, 28,190,160, 82, 19, 26,215,134, 22, 47,127,249,242,172,225, 65, 19, 49,136,121,166, 6, 16,
+ 48,208,106, 64,225, 65, 18,141,226,154,208,238,150,203,215, 44,144,127,247,243, 31, 58, 76, 66, 69, 26, 47,122, 89,129,116,252,
+ 7, 95,129,130, 80,130, 28,234, 69, 37,225, 53, 15, 52, 29,139, 49,143,178,105, 21,133, 50,203,217,197,167,170,239,255,233, 15,
+ 28,220,178, 23, 88,207, 8, 46,107, 95, 93,175, 52, 80, 85, 66, 96, 80, 66,169,163, 79,150, 10, 76, 51,166,128, 64, 28,193, 28,
+ 3,105, 85,246, 71,214,143,252,203,239,253,190, 5,165,190,235,174,187, 23,158, 39,236,251, 82, 0, 74,137,217, 85,197,204, 35,
+110, 47,247,196, 64, 13, 80, 80, 84,164, 2, 5, 67,157,163, 22, 35, 32,158,145,148,180,104, 0,234,107, 21,207,129,182,147, 39,
+ 78,110,110,110,158, 59,119,174, 56,140,145, 77,102,159, 72,145,157, 93, 75,190, 52, 34, 6, 89, 90, 10, 81,177,190, 42,153, 50,
+233, 0, 72,140, 80, 24,233,249,130,121,237,200, 35, 81,143,229,133,161,158,179,138,237, 9,173,122,162, 33,108,207, 89, 85, 77,
+229, 93,239,126,247,231, 62,247,215, 94,117, 14,111,124,211,157, 70,206,146,165,158,211,185,245,254,117,206, 62, 49, 37,201, 36,
+137,156, 41,130, 62,179,139, 66,202, 36, 18, 35, 40,182,138,167,213,163, 81,242, 77,165,231, 20, 35,200,123,159,205, 40,245, 25,
+ 35,239,187,239,254,143,255,241, 31,139, 72,220,158,166,148,248,244,243, 51, 51,217,216,236,147,141,188, 87,203,166, 32,147, 78,
+151, 59,125,235,157,199,186,224, 37,161, 18,177, 59,190,227,152, 80, 17,146, 31, 48,207, 85,170,109, 44, 16, 65,115,216,158,119,
+168,153, 40,205,130,234,210,210,210,189,247,222,247,169, 79,125, 82,251,222,250,100, 57, 51,231,156,155,213, 49,210, 15, 40,219,
+177,176, 92, 15, 20, 56, 10, 72,252, 88,121,109, 86, 8, 24,197,132,134,202,139, 27,204, 68,253,102,100, 71,232,255,101, 51, 26,
+191,253, 93,239, 2, 16,246,226,173,231, 47,207,119,166,121, 58,179, 82,164,109,249, 83,205,171, 98,192,241, 35,221,202, 82,120,
+229,117, 75,177, 67, 12, 37, 33,171,208,226, 2,216, 8,120,149, 23,205,106,107,193,232, 26,238,180,111,199, 42,208,100, 60,122,
+236,104,156,245,121, 40, 49,122,209,216,172, 58,243,146,183,122,169, 88,149, 40,192, 42, 14, 68,118,168, 40, 43, 42,164,103, 34,
+ 5, 7, 46,143,185,190, 89,253,107,151, 44, 76,252,184,146, 20,187,247,222,251, 98, 5,109, 11,240, 90,113, 43, 87,136,146,243,
+ 43,100,109, 37, 76, 34,186,136,174,211, 42,158,131, 87, 54, 19, 17,213,130, 84, 67, 0,171,180,174, 76, 17,194, 40, 10,207,253,
+169, 80, 82, 96, 66,101, 48, 51,104,206, 57, 58, 98,203, 1,212,115,252,213,227, 9,243,122, 43, 68, 98,112,238,213, 66,193,227,
+176,112,207,170, 3, 88,216, 71,138,152,185,215,135,137,137, 73, 1,207, 29,111, 48, 49, 85,136,193, 16, 75,218, 43,230, 53,214,
+ 2, 35, 20,201,250, 23,163,132, 16, 24, 21, 40, 64,240,168, 14,190, 88,174,241,250,182, 99, 9, 46, 96, 35,152, 75,138,222,142,
+ 1,198, 97,131, 67, 36,102, 2, 16,136, 78, 70, 67, 21,145, 35, 25, 21, 86, 37,204,107,200, 12, 65, 67,104,129, 43, 95, 40,248,
+ 81, 5,217,170,169, 32,145,179,229,172,126, 95,173, 56,186, 46, 66,220,205,182, 22, 20,150, 13, 93,119, 92,187, 44,167,172,204,
+ 77, 91,129, 62,192,197,213,236,255,190,239, 73, 17, 47, 66,120,197,209, 35, 63, 15, 31,173, 6,225, 38, 69,233, 11, 98,103,230,
+ 37,110, 51,139, 67,101, 9, 70, 55,114, 24,226, 85,160,226,234, 30,102, 28,200, 85,128, 22,126,153, 9, 54,119,204,140,151,174,
+102, 7,255, 87,150, 92,166,181, 68,195, 66, 51,224, 1, 41,151, 74, 22, 25, 89,160,110, 52, 37, 54,199,167, 93, 72, 86,227,102,
+106, 13, 93, 57, 94,144, 81, 68,196, 50,103, 61,115,182,171, 59,201,140,211,189, 76, 65, 23,145, 51,187,168, 49, 40,148, 33,168,
+187,182,131,229,136,178, 60,171,244, 79, 1, 32,100,113, 2, 21,162, 46,110,161,248,205,156,205,233, 78, 34,218,172,138,223, 36,
+ 37,238,238,229,167,206,237,245,201,190,240,165, 61, 22,236, 84, 78, 30,237, 38,157,158, 62, 57, 57,117,180,139, 81, 87,150, 29,
+159,131, 53,143, 39, 42,194,162,204,170, 16, 17,179,232,218,107,116,224, 13, 13,202, 67, 73, 45,172, 40, 78,137,204,154,124, 74,
+126,145, 77,250,108,125, 98,223,231, 62,211,204,171,117, 2, 72, 50,134,108,125,111,243,100,164,196, 32, 0, 98,168, 85, 27, 84,
+143,231,133,158, 74,208,138, 30, 16,148, 53,187,126,163, 70, 62, 5,204, 19,163,237,205,115, 54,102,147,144,205,233, 22, 41,209,
+200,243,151,230, 79, 63, 55,157,205,248,252,165, 61, 10,104,164,184,229,196,213,173, 4,200,213,157,252,236,133,217,202,114, 56,
+125,188,235,162, 94,119,106, 73, 33,147, 78,196,180, 10,105, 8, 6, 96, 22, 71, 89,161, 35,111, 42,142,208,149,220,217,164, 22,
+ 48, 75, 94, 82,117,192, 72,163,100, 99,223, 91,159,153,179,211,125, 8,152, 80,141, 38,170, 48,228,108, 61,208, 37, 75,137, 64,
+161,118,103,163, 34,171, 6,186,131, 19,170,120,124,133, 88,153,136,238, 15, 21, 37, 28,118,134,168,215, 25,132,148,157,105,223,
+ 69,237,251, 12,161,106, 16,145,167,159,155,126,229,202,108,107, 59, 93,218,152,155,192, 42, 18,203, 82,145,117,194,143,166, 44,
+217,210,188,215,157,189, 28,160,231, 47,205, 85,113,242, 88, 23, 85, 79,159,152, 76, 38,218, 69,196, 40, 38,170, 66, 33, 99, 81,
+ 33, 2,128,163,174,101,119,221, 51,154, 51, 72,212, 76,204, 60, 11, 5,133, 10,204,231,121,119, 55, 79,103,121,158,204, 65,103,
+162,110,126,163,120,150,138, 38, 96, 54, 55, 69,200, 2, 6,213,181,149,144, 2,179,153,101, 97, 8,110, 75, 41,106,100, 20, 47,
+ 36,160,254, 35, 34,197,197, 20, 67,100, 2, 24,183,119,211, 36, 98, 58,179,108, 56,119, 97,214, 39,126,249,252,244,242,230, 60,
+ 37,146, 84,247, 59,133,146, 83,202,162, 86,161, 98,161, 24,160, 52,102,221,155,155, 10,207, 95,154, 3,114,101,179,215,160,203,
+147, 16, 3,150,186,176,188, 20,160, 26,107, 53,211,207, 83,145, 73,241, 96,104,117,110,206, 83, 22,106,159, 8,216,198, 86,154,
+205,242,246, 52, 77,247,204,229,210, 60, 41, 76, 68, 75,244, 8,136,155, 20, 64, 96, 52,133,138, 89,130, 41,251,169, 0,178, 59,
+ 53, 66,150,151, 66, 84,172, 44,199,181, 21, 2,168, 65,126,173,150,213, 26, 66, 1,254,253,150, 2,177,204, 94,236,127, 63,187,
+ 21, 3,174,110,247, 41,201,222, 44, 99, 48, 72,172,168, 60,124, 77,165,210,165, 58, 80,226,204,137,203,148, 10,194,155, 0,148,
+148, 72, 21,155,229,108, 34, 80,156,190,229,193,130,174, 23,230, 84,133,224, 27,133,148,205, 46,213, 48,142,133,126, 37, 82,206,
+149,255, 1,135,216,196,143,168, 46, 70,231, 10, 17,106, 43,112,148,240,146,165,192, 88, 42,194, 30,184, 88,113, 95,238,165, 91,
+ 4,235,201, 42, 74, 41,192, 45, 85,249, 44, 55, 40,108,174,230,165,106,181,163, 30,231,134,248,187, 84,224,191,243,147, 94, 50,
+ 79,212, 0,146, 78,205,147,198,212,135,121,189,163,176,227, 97, 50, 88,132,225,144,177, 50,200,188, 20,235,137,115,171, 22,136,
+176, 84, 94,220, 47,202,240, 23, 86,170, 55, 4,107, 89,181,254,218,233,101,240,180,152,104,160,153,111,131, 59,212, 90,141, 16,
+107, 53,224, 42, 0,179,130,193, 82,172, 52,146,212, 34, 41, 43, 46, 83, 10,239,168,226, 40, 94,130, 45,115, 44,133, 84,214,138,
+111,173, 47, 57,215,146,102,141, 24, 90,232,165,181, 83,165,196, 64, 38,198,242, 89,251,103,170,236, 27, 38, 9, 41,244, 83,255,
+ 99, 22,123,207,146, 74,151,186, 76,241, 71, 21, 36, 41, 5,184,114, 15,131,105, 13, 97,105,213,193,181, 88,170,208,242,100,148,
+240, 20,224,206,101,132,194,208, 43, 97,179, 21, 33, 52, 25,213,196,162,146, 66,225,174, 67, 70, 64, 6,202,210,140,181, 28, 87,
+163,113, 43, 30,203,198,137, 2, 88, 94,149,164,152,180,194, 83, 81, 96,162,153, 98, 63,148,101,249, 86,149,160,228, 13,190, 97,
+ 77, 38,158,121,163,136,144, 5, 95,174,135, 84, 93,232,229, 76, 80, 32,102,197,246,179, 4, 2,126,112, 12, 38,142,146,149,157,
+ 43,162,146,202,165,160,149,120,187,158, 23,148,141, 27,104, 77,110,129, 6, 10, 8,247, 65,247, 47, 23,204, 94,190, 94,190, 94,
+190,254,174,212, 91, 95,236, 22,192,250,145, 35, 71,143, 28, 89, 91, 91, 63,118,252,216,201, 19, 39,143, 29, 63,126,236,232,209,
+213,181,245,181,181,149,201,100,201,107, 84,178, 0,152, 85, 12,132,146, 82,154, 78,119, 55,183, 54,183,182,182, 47, 92, 56,191,
+189,181,125,117,243,234,214,230,230,198,198,198,214,214,214,223, 61, 1,173,174,174,190,246,117,223,112,227,141, 55, 94,119,237,
+181,199,142, 29, 95, 93, 91,141, 49, 30, 10,250,142,235,179,251, 31,196,226, 55,181, 6, 40, 7,248,208, 41,165,221,157,221,171,
+155, 87,207,157,251,242,217,199, 31,127,226,236,217,244,117,170,124,127,221, 4,116,237,181,215,222,121,215, 93,223,248,141,111,
+ 88, 90,154,144, 67, 84,241,213,239, 59,208,250, 26, 46, 85,227,244,218,147, 92, 11, 15,144, 81,177,116, 92,208, 45,189,156,149,
+ 20, 74,161,119,117, 61,243,204,211,127,248,200, 35,143, 61,246,121, 51,251,127, 42,160,245,245,245,235,174,187,238,245,175,127,
+195,107, 95,251,186,130,232,180,194,240,184,114,184, 40, 35, 28,170, 52, 3,139,117, 1,113,198, 98,193,253, 5,191, 46,118,205,
+121, 19, 81,147,212,192, 21, 80,189,114,229,202,199,255,248,143, 30,123,236,177, 75,151, 46,253,173, 8,232,218,107,175, 61,115,
+230,204,205, 55,223,124,237,117,215,229,108, 94,103, 90, 20, 10, 95,172,194,187, 8,237, 97, 17,154,223, 15,249,141,133,119,144,
+ 72,127,128, 12,240,213, 30, 44, 41,167,119,244,137,224,153,167,159,250,244,167, 63,245,232,163,143,246,125,255,245, 17,208, 7,
+ 63,248,193,217,188,111,181,239, 1,119, 28, 97,144, 47, 77,206,139,239,118,223,131,135, 60,109, 31,109,227, 69, 84,105, 31,117,
+ 97,124, 12,219,233, 27,119, 86, 2,192,108, 54,251,195, 71, 30,121,228,145,255,249, 55, 21,208,143,253,248, 79, 52,194, 9, 27,
+193,237, 16,169, 28,176, 60, 99,154,204,162, 92, 70, 15, 30, 84,165,197, 67,120,128,215, 50, 66, 5, 22,153, 28, 95, 93,197, 32,
+144, 70, 21, 47, 28, 29, 13,125,223,255,238,239,254,231,207,127,254,243,255,119,253, 79,133,206,224,244,129,214,193, 49,230,124,
+212,207,195, 74,147, 11, 15,142,149,110, 31,197,130, 99, 19, 54,210,211,145,134,114,172,172,195, 62,237,123,137,161,166,210,118,
+177,254,120,232, 87,175,192,191,241, 77,111,122,232,161,135,111,184,225,134,103,159,125,246,224,172,135,175,194, 39,243,185, 10,
+251,222,227,161, 85,218,195, 79, 22, 15,252, 52,126,144,135, 62,218,112,167,198, 16,103, 45,152, 99,244,235,197, 58,193,190,242,
+ 81, 69, 65, 41, 3,135,127,248,154,115,110,220, 33, 17, 1,178,228,219,110,191,253,142, 51,119,108,110,110,255,222, 71,255,235,
+ 19, 79,156,125,169, 26,116,207,189,247, 13,108,145, 74, 91,176, 69,142,206, 65,186, 67, 85,159,225,155,113,167,144, 52,198,197,
+232, 30,237,193,146,208,131,170, 2, 17, 5,131, 58,175, 87, 20,132, 64,217,202,166,133, 12, 61,178, 87, 67,148, 81,120, 8,141,
+ 49, 68,178,226,253, 50,106, 67, 90,216,105,227,164,235,238,186,235,238,111,121,219,131,207, 60,243,244, 75,225,121,133,123,239,
+185,119,124, 56,234,185, 25,145,134, 70,244,219,253, 54,105,209,118, 45,212,150, 14,209,192, 17,119,172, 72,135,131,209,198,208,
+252, 32,139, 82,209, 18, 41, 97,104, 66, 37, 10,222, 44,165,163, 65, 22, 9,132, 50,226, 64,113,244,250,141,122, 5,200,221,119,
+223,253,150,183,188,245,194,133, 11, 23, 47, 94,124, 81, 13,186,231,222,195,140, 48, 15,143,137, 23,159,137, 17,125, 0, 11,225,
+206, 98,105,143,162,128,183, 53,169, 74, 8, 18, 3,130,138,250,103, 45,157, 99, 84,215, 29,107,140,120,248, 51, 14,187, 43, 59,
+ 29, 67, 53,182, 74, 74, 14,171,185,142,109, 83, 43,229,100,235,186,238,206, 59,239,186,227,204,153, 47, 60,249,228, 11,217,166,
+112,247, 61,247,112,216,128,246,121,224,167,225,148,141,206,212,208, 46,212, 84,254, 96,161,178,170, 12,196,139,190,234,228,126,
+ 29, 56,255,168, 40,234,216, 5,141,196,224,196,145,226, 38, 91,207, 97, 41,143, 54, 95, 63,188, 30, 23,183,153,114,192,126, 15,
+103,206,236,200,145,163,127,255,155,190,105,125,237,200,227,143, 63,118,136,153,253,190,239,255,129,195,207, 79, 97,193, 59, 63,
+ 65,230,201, 82, 42,108, 41,171,212, 22, 8,130, 34, 70,168,138,231, 4,147, 9,162, 86,175,171, 8, 5,159,151,160, 26, 3,161,
+251,146, 48,169,232,251,152,173,161, 99,214, 72, 41, 30,106, 45, 27, 87,134,171, 23,151,198, 78, 15,251, 29,205, 16,130,141,254,
+116,136, 12, 90,216,212,216, 86, 0,126,253,215,127,237,249,231,159,223, 71,240,186,235, 80,191,229,227, 26, 74,137,217, 56,155,
+ 59,129,135,153,204,198,100,204,222,150, 93,157,177, 15, 14,138,133, 88, 90, 22, 88,104, 69, 16,128,222, 72,143,210,129,209,148,
+101,120, 55, 35, 13,146,197,136, 80,106,167, 68,147, 80,173,224,149, 70,239,138,224, 30, 98, 17,247,219,133,131, 33,194,248, 72,
+190,249,254,183,172,172,174,250, 80,157,226,230,119,167,185,210, 88,232,148, 33, 63, 60, 41,113,111,102, 13, 95,206,185,150,159,
+185, 72, 97,134, 15,173,130,136, 40,208, 69,132, 32, 46,169,107, 78, 76, 78, 29,139, 33, 0, 34, 93,135,129, 48, 36, 92,140,175,
+ 57,162,178,180,213, 98, 32, 58,160, 0, 35,165,236,203, 10,197, 59,192,220,112,122,147,198, 38, 25,196, 80,154, 78, 56, 4, 29,
+ 30, 7, 20, 74, 13, 64,230, 74, 29, 54, 17, 42,223,250,150,183,158,190,230,244,239,255,254,239, 57,216,130,239,248,103,223,227,
+127,153, 50, 47,111,246, 91, 59,217,140,164,204, 18,119,167, 57,219,129,124, 11,141,200, 82,169, 18, 77, 84, 96, 12, 62,159, 0,
+ 75, 93,120,205, 13, 75, 55,189, 98,169, 11, 16,160,139,152, 68, 81, 5, 15, 49, 83, 24,221, 31,245,136, 97,177,120,161,173, 36,
+ 94, 67, 37, 12, 36, 40, 46, 16,131, 6, 63, 86, 95, 73,157,208,181, 0, 30,136,183,146,143,211, 23,109,241,119,136, 27, 27, 87,
+126,251,183,127,235,202,149, 43,225,196, 43,110,219,222,181,237,221,180,189,155,183,118,243,116,102,125,102,202,214, 39, 38,107,
+103, 65, 42,183,149,109, 79, 81,107, 75, 37, 23, 34, 21, 88,138, 58,137,136, 1, 93,135,227,235,241,216,122, 12, 65,221,169,171,
+247, 66,238,207,112,177, 16, 96,188,112, 88,202, 22,116,142,157,118,109,239,105, 55,161,140,216, 97, 60,148,194, 60,182,225, 11,
+236,245, 17, 59,137, 43, 43, 43,247,191,249,205,159,121,244, 81, 92,127,219,183, 31, 8, 84, 15,196, 48,139, 86, 21,149, 8,221,
+202,230, 78,196, 8, 17, 71,214,226,114,167, 0, 98,192,245,167, 39, 55,156,158, 76,162,138,136,170,184,114,141,180, 6, 47, 16,
+180, 99, 65,113, 6, 67, 94, 64,164, 97,214, 10, 70,127, 80,195,114,179,133,251,218, 98,204,129,209,108,167,253,112, 75, 35,238,
+183,198,223,160,204,133,194, 32,139,120, 22,135,232,127,223, 65,168,145,114, 37,242,180,202,151,185,242,134,234,197,131,138,251,
+117,109,118, 1,250,210,224,151, 22,216,148,218,122,109, 72, 31,251, 59, 25,143,164,105, 70,198,139,247,195, 98,139,158,233,130,
+ 30, 22, 34,230, 66, 54,195, 54, 84,176, 81,183, 72,163,104,208,104, 50, 54, 96,195,212, 0,145, 97,248, 76,153,181,227,117,122,
+182, 68,156, 28,230, 47, 9, 9, 85, 89,154,232,218,170, 15,110,147,165,137,250, 20,152, 81,252,199,151,128, 97, 54,191, 85, 90,
+238,106,126,133,170,128,173, 23,178,177,188,134,214, 72,243, 34,168,201, 96,184, 37, 23,229, 33,134,216, 31,108,237,131, 44, 92,
+209,178, 39, 67,179,182,152,100,137,240,114, 40,246,171, 57,199,188, 84, 41,197,203,198, 64, 27,129, 28,213,121,160,209,250, 40,
+109, 66,217, 64,183,112,110, 32, 14,134,184, 47,202,198,100,101,108, 53,209, 84, 86, 5, 27, 5, 85, 42, 83,122,148, 99,112,240,
+ 31,251,200,145, 7, 85,117, 68,155,108, 77,150,197,244,154, 74, 28, 76,228,104,172, 72, 81,165, 70,252, 45,156,188,234,111, 11,
+179,169,249,231,210, 60, 15, 48, 6,116, 17,170,136, 1, 81,203, 96, 54, 52, 66,245,193, 78,124,175,134,191, 0,138,224,145, 84,
+ 35,247, 22,118,158,147,224,136, 26, 21,131, 86,121, 1,108, 52, 80, 30,192,171, 14, 53,118, 7,212,162,129,230, 34, 32, 85, 16,
+109,236, 49,135,144,148,149, 85,128,186, 89,144, 38, 50,143, 64,198,249,150, 53,112,168, 18, 37, 15,123,183, 47,177,136,180, 16,
+215,141,210,130, 42, 73,231,243,162,249, 19, 35,156,125, 50, 62,161,172, 96, 37, 91, 34, 55,156,172,197,143, 50,213, 9,173,148,
+ 80, 30, 2,104, 57,194,100, 96,210,120, 27,109, 83, 22, 86,151,238,204,172,218,109, 59,178, 41,230, 22,123,156, 37,251,253,107,
+167,180, 85, 19, 59, 62,198, 67,244,226, 11,195,200,126,155, 25, 64,223,131,189, 25,125,162, 39, 41,123, 51,155,247, 53,121, 85,
+ 89,158,248,176, 68, 12,196,201, 33, 93, 62,108,131, 42, 77,232, 32,126,213, 50, 21, 55,165, 11, 13,223, 34, 81, 96,251,113,119,
+107,243, 94, 70, 7,163, 49, 95,132, 77, 98, 34,109, 16,214,192,179,106,148,105, 25,196,139,195,203, 66,148,125,252,116, 54,122,
+ 22,156,209,203,148,138,147,156,245,156,238,249,240, 20, 9, 1, 1, 8, 90, 99,242,197,163,219, 80,181, 70, 23,133,129,104,196,
+175, 74,196, 28,167, 36, 7,136,220, 69, 76, 33,196,130,226,161, 25,167,145,247,170,212,174,162, 45,180,194, 22, 33, 42,177,172,
+ 80,186,252, 69,205,104,217,114, 14, 10,201,101,196,214,120,104,217,254, 99,239,111,192,135,194,250,139,207,230,118,101,115, 62,
+155,139,136,244,153, 87, 54,251,237,157,108,149,160, 98,117, 43,163, 98,125, 53, 78,162, 2, 8, 65,214, 87,195,250, 74, 8,161,
+100,160,147, 88,200,248, 62,154, 70,181,232,170,211,194,124,126, 65,141, 28,252,193,114,164, 90,183, 64,101, 74, 65,114,142, 53,
+ 2,229, 2,158, 37,163,129,108, 24,205,234,169,182,167,192, 29, 67,216, 54,234, 56,164,212,161, 7,227,140,193,143,249,190,153,
+ 41,133,209, 86,224, 1,178, 79,178, 51,181,221,153,145,236,147, 92,185,218,111,108, 39,179,125, 74,130, 46, 32,103, 46, 77, 84,
+ 68, 98,212, 16,100,169,243,137, 20, 8, 81,125, 66, 64,177, 98,160,153, 52,162,208,208,246,225,207,110,131, 40, 10, 7,205, 80,
+ 7,160,181, 87,139, 37,127,225,194,193,109,243, 57,100, 68, 64,220, 23, 29,161, 4,170, 37,160,118,131,148,140,125,202,110,239,
+ 82,246,230,186,194, 4, 28,102,204, 45,226, 4,219,211,124,117, 43,229, 76,138,236,205,236,226,149,249,116,158,157,185,181,187,
+231,137, 33, 60, 38,170, 14,158,217,100,119,150,103,201, 32, 80,205,125,178,237,221,236,232,197, 82,167,107, 43,218, 5, 16, 18,
+ 85,151,151,180,139,109, 82, 15, 43, 66,205,130,100, 47, 98,184, 67,180,204, 65,196,113, 68, 14, 29,216,112, 67, 87,130,171,126,
+115,124,144,145, 31,148, 58,240,181,110,131, 49,103,166,228, 49,158,102,163,121,155, 5,169,138, 1,159, 39,178, 23, 81, 68,114,
+198,214, 78,126,238,226,108, 54,207,168, 99,107,103,115, 27, 7, 92, 40, 99, 71, 42,135, 29,146, 41, 54,171,169, 25, 48,157,217,
+213,237,228,145,215,202,114, 56,190, 30,187,168, 2, 78, 98, 16, 9, 64, 40, 17,178, 98,177,215,104,156,105, 31,142,145, 64, 36,
+ 26, 90, 80,213,252, 24,234,204,141,214,193,139, 33, 84,170, 4,204,138,244,141,224, 68, 97, 54, 75, 57,249, 13,189,237,179, 17,
+243, 99, 40, 65,112,202,182, 61, 77,123, 51, 82,196, 50,175,110,205,119,118,251,190, 39, 33, 41, 89, 1, 19,202, 40,150, 50,234,
+164,162, 8, 85,104, 70, 14,121, 21, 45, 75, 46, 51,119,101,214, 99,123, 55,199,104,128,196, 96, 70,219,157,149,121, 73, 93,212,
+ 73, 87,198, 85, 69, 69, 23,189,131, 92, 0,159,105,137,166, 36,195,251, 66, 27,157,211,248,142, 24,114,174,186,229,109, 41,182,
+128, 54,148,152,204, 90, 75,129,145,243,121,134, 64, 36,119,157,206,122, 75,201,169,191, 84,133, 41, 2, 0,145,121,178, 47,159,
+223,187,112,121,110,102,102, 50,221,203, 91, 59, 41, 57,203,191,162,243, 35,136,199, 26, 44, 95,215, 84,117,153,222,235, 5,163,
+229,218,148, 54,155,113,123, 55,149,105,219,138, 73, 68, 80, 63, 95,178,182, 28,214, 86,125, 95,177, 4, 0, 0, 4, 78, 73, 68,
+ 65, 84,130,163, 49,203, 75,122,226, 72,244, 81, 82, 10,116,157,134, 6,175, 87,142,132,251,133, 40,213, 79,161,145, 92,165, 16,
+203,171, 5,226,144, 70, 87,222,101,179,224, 86, 88,163,238,150,133,180,156,179, 64, 52,211,178,183, 12,138, 64, 44,229,100,133,
+ 58, 61,157,217,188,183,190,207, 30,221, 37,255,183, 54,147,186,157, 47,144, 22, 42,119,217,109, 42, 48, 52,180,213, 87,134, 84,
+ 47,212, 2,123,171, 72, 16, 89, 12,188, 80, 84, 82,230, 44,153, 86, 37,216,142,105,146,130, 99,228, 93, 12, 49, 84,130, 4,164,
+170,150,168,104, 28,113,229,107,199,119, 9, 40, 27,188, 82,234, 45,165,211,173,160,124, 45,110,181, 6,126,100,227,246,212, 20,
+ 6, 69, 23,112,100,173,219,153, 90, 50,208,184, 55, 75,151,175,206,103,125, 22, 98,222,219,197, 43,243,205,157,190,229, 10,213,
+111,194,188, 41,168,164,212,222, 1,128,161,185,179,100,235,190,197,222,117,103, 11, 57,181,183, 45,149,115, 99,150, 49, 51, 17,
+241,137,118,216,217,203,178,217,220, 81,141, 49, 81, 52, 40,106, 25, 77,176, 52,193,202, 82, 8, 90,102,252, 68,171, 51,199,154,
+ 17, 38,188,253,110,196, 23, 16, 43, 91,214, 70,159, 21, 90, 54, 70, 73, 4, 7,224,211,104,170,102,214,167,236, 84,236,121,178,
+121, 98,223,211, 71,218,154, 89,117,187,205, 26, 23, 62,180,121,232,181,184, 18,148,145, 73,222,199,193, 58,171,117, 84,172, 28,
+ 16, 30,162,206, 14,114, 55, 62, 50, 18, 20,191,191,121,170,110,101,134,144, 50, 26, 13, 4,145,169, 57, 35, 39, 50,212, 81,108,
+222,142, 80, 83,141,129, 39, 48, 32,150, 68, 67,205,185,128, 32, 15,254,107, 48,159,163,112, 37, 40, 66, 24,108,154,217,128,106,
+187,155,119, 0,191,154,152,241, 60,162, 54, 93, 9,229, 9,100,211,157,218,254, 0,142,254,207, 16, 45,178,107, 25, 85, 77, 62,
+221,212, 15,227,140, 90,202,174,168, 51,105, 57, 84,217, 6,188,172,202, 33,182, 20, 20,195,228, 46,241,230,230,130, 3, 53, 20,
+205, 26, 17,133, 13,244, 29,116,170,109,111,117,145,137, 76,249, 64,229,177,114,189,171, 37, 70,117, 8,181, 7, 96,104,166, 3,
+155,162,160, 85, 11, 10,233,220, 48,204,119,192, 0,223,185,177,146,102, 4, 42, 24, 83, 14, 9, 57,120,122,214, 62,237, 58,204,
+169, 98, 21,238,119,170, 47,143,108, 29,144, 85,213,155,203, 42, 45,146,205,147, 55, 73,177, 65,107,144, 18,232, 12,253,193,251,
+ 51,187,113,154, 53,192, 5,168,192,215,200,216, 55,159, 85,246,218,224, 13, 14, 11,115, 22,189, 27,132, 85,195,225,166,135,173,
+129,190, 6,128,197, 23, 58,187,170,117, 95,214,120, 7,254,191, 16,168, 89,164, 15,252,170,198,144,195, 11,192, 34, 7,191,222,
+122, 69,209,220,153,175,211,202,217,171,135,118, 36, 77,105, 67, 25, 91, 92, 64, 46,192,232,227,130,123,211, 55,191,105,131,108,
+107,193,194,106,207, 78,243,228,210,108,160,214, 54, 29, 12, 67, 73, 75,234, 92,130, 37, 12,103,136,101,108, 36,164, 36, 91, 67,
+104, 88,149,166,156, 69, 74,211, 82,142, 0,190,218,236,140, 88,221,228,136, 97,192,161,203,201,219,214,253,244, 21, 59, 86, 15,
+ 19, 49,206,212, 48, 42, 38, 12,131,195, 48, 32, 51, 50,244,210, 52,244,155,196, 8,167, 42,205, 36,208,241, 84,153, 33,234,176,
+ 90, 1,107,253,190,213,187, 80,198,228,153, 58, 50,142, 3,196, 90,134,197, 85, 83, 70,159,200,202,102,160,164,109, 71,169, 14,
+177,141,112,241, 84, 99, 0,180,108, 40,235, 89,237,148, 25, 88, 21,181,228, 96, 37,133, 47, 90, 54,180,156, 29, 66,159, 26,215,
+168, 70, 81, 62, 57,206,243,135, 86,121,148, 22, 90,105, 7,174, 44,185, 1, 42,172,223, 23, 27, 85,127, 91,204, 75, 11, 38, 81,
+219,203, 75,146, 68, 84, 8,144, 53,160,170, 70,188,193,107,245, 8,162,185, 87,241, 33, 24,222,109, 52, 16, 48,133,198, 33,156,
+101,241, 41,197,108,219, 80, 0,174,137,104, 27,126,143,125,112,211, 62,154, 71, 65, 1,218, 56, 3, 90,139, 81, 81, 66,205, 42,
+103, 67,153,199,233,173, 94,126,103,171, 32,184,152,152,138, 86, 25, 53,144, 95, 7, 27, 10, 14,162,173,135,169,152,115,241, 17,
+146,197, 55,180,115, 54,170, 37,161,197,245,209,101, 33, 67, 74,229,195, 76,199,115, 2,171, 45,179,154, 67,202, 62, 73,213, 1,
+ 34, 37,171,228, 80, 41, 95, 68,248,216, 6,198, 55,183, 88,145, 0,114, 52, 46,162,153,139, 69,195,212,178, 83, 41, 37, 33, 27,
+ 64,136,226,205, 28,104, 97,181, 44, 62, 89, 86, 57, 8,171,166, 69, 42, 3, 53,173, 2, 53,138, 65, 51, 91, 60, 26,101,176,210,
+117, 66, 70,105, 94, 67,155, 50, 91, 11, 7, 45,165,110,203,109, 16, 63,199,216,226, 62,194,149,181,128, 10,178, 0,191,130, 67,
+176, 48,174,229,176,213, 56, 43, 0, 88,229, 62, 12,162, 28, 64,250, 58,226,163,158,141,218, 69,222, 12,199, 96,141, 90,128, 84,
+156,224,248,105, 28,225,121, 28, 86,249,127, 0, 16,193,207,161, 22,223, 57,207, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/mix.png.c b/source/blender/editors/datafiles/mix.png.c
new file mode 100644
index 00000000000..5acf62b7cfe
--- /dev/null
+++ b/source/blender/editors/datafiles/mix.png.c
@@ -0,0 +1,333 @@
+/* DataToC output of file <mix_png> */
+
+int datatoc_mix_png_size= 10448;
+char datatoc_mix_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82,
+ 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0, 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,252, 97,
+ 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0,
+ 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7, 21, 0, 4, 17,164, 74, 11,162, 0, 0, 32, 0, 73,
+ 68, 65, 84,120,218,237,124,105,172,101,217, 85,222,247,173,189,207, 29,222,123, 53, 87, 87, 15, 30,218, 61,216,216,110, 48,238,
+182,219, 3,225, 71, 20, 12,145, 76, 44,134,200, 72, 64, 20, 35,230, 72,193,120, 0, 60, 38,138, 66, 36,147,160, 72,196, 16,130,
+ 4, 4, 18, 18, 36, 32, 36,225, 87, 80,136, 98, 32, 38, 10, 49,134, 4,240,220,109, 99,211,110,186,170,171,186,170,222,112,135,
+115,246, 94, 95,126,236,189,207,189,175,170,220,182,131,137,130,228,251, 94,189, 87,239,190,251,206,221,103,237,181,215,240,173,
+111, 45,224,243,125,220,113,231,157,247,220,115,239,205,207, 19,192, 91,222,250,246,156, 19, 1, 51,163, 89,140,177,139, 49,118,
+221, 59,222,254,182,242,162,240,250,239,127,195, 48,244, 57, 39,119,207,238,238,185, 11,171,105, 92,238, 76, 15,190,247,111, 63,
+231,183,255,199,213,195,195,131,240,224, 67, 15,122,206,158, 93,144, 92,247, 63,227, 35,183,157,190,124,254,204,193,201,221,125,
+135,223,251, 37,175,126,239,123,255,123,188,114,109,249,199,143, 44, 14,150,153,180, 87, 61,120,185, 31, 66, 8, 33, 78, 28,176,
+156,242,114,153,222,241,142,119,134,171,233,217,235, 33, 75,146,171,243, 79,126,250,137,229,169,147,147,105,103,202,254,248,149,
+243, 71,203,185,164,176,123,246,126, 2, 16, 32,157,219,189, 60, 12,254,248,197,149, 52, 89,246,119, 92,217, 63, 35,136, 66,132,
+220, 37,146, 0,115, 22, 13, 87,158, 58,245,129, 79,159,189,235,188, 30,124,254, 48,153, 8, 66,216, 61,125, 31, 41, 64, 0, 78,
+237,236, 63,113,237,194,245,197, 41,144,135, 71,249,145,199,150, 41,227,252,233,142,183,221,251, 85, 68,128,129, 34, 72,208, 72,
+ 16,129, 33,144, 70, 26, 44, 70,185,196,140, 76, 51, 66, 6,100,192, 0,135, 0, 64,100,128,127, 78,219, 21,198,255,205,231, 59,
+207,122,214,179,204,184, 92, 46,111,220,187,135, 30,122,232,171, 94,245,213,146,140,164, 89, 8,161,108,220,175,255,250,127,250,
+157,247,190,183,190,232,245,175,255,126, 65, 4,205,140,198, 73,167,157,153,230, 83,157, 62,181, 58,119,122,241, 55,191,245, 23,
+ 0,132, 7, 31,124,200,179,187, 92,210,185,189,139,207,188,237, 79,207,157,190,126,246,228,193,116,178, 48,173,191,236, 37,127,
+235, 61,239,249,175,252,171,127,253, 91, 31,121,108, 69,114,218,241,219, 95,115,101,111, 55,206,231,113, 62,239, 32, 29, 46,247,
+ 62,125,249,254,233,108, 22,214,241, 30, 0,238,218,155, 94,189,252,228, 19,171,117, 62,125,106, 98,202,253, 16, 30,253,244,115,
+228,112, 41, 58,220,220, 1, 11, 88,231,148, 63,241,167,139,229, 74,119, 63,251, 25,171,225, 46, 87, 14, 17, 2,194,238,217,251,
+ 41, 0,152,118,171, 89, 60,202, 57,126,240,177,187,254,248,209,217,201,189,233,116,194, 34,210,176,123,246, 94, 64, 2, 8,157,
+156, 31, 60,250,228, 61,201, 99,118, 61,246, 68,255,216,165,245,237,103, 39, 93, 71,222,118,207,171,104, 6, 26, 1, 1, 70,131,
+ 17, 12, 68,160,133, 96, 1, 22,163,195, 77,162, 32, 0, 70,185, 19,164, 25,144, 9, 8, 52, 57,190, 80, 15,110,255,240,134, 55,
+190,105,119,103,183,108, 82,249,160,209,104, 22,140,100,176,240,238,119,255,216,197,139, 23,111,125,161, 31,248,193, 31,202,158,
+ 33,192, 85, 46, 75, 20,229, 52, 26, 1, 90,128, 89, 32, 25, 66, 48, 90,249,114,230,196,242,239,126,255, 63,218,190, 80, 92, 44,
+ 22, 64,185,123, 0,224,214, 3,196,233,189,131, 51, 39,247,247,118,250, 73,244, 24, 24,140, 22,104,128, 66,252,247,191,240,218,
+ 15,253,233,151,255,252,207,255,235,143,125,244,163, 0,226,208,247, 0, 92, 90,247, 58, 88, 36, 23,119,231,225,244, 94, 60,185,
+123,116,231,185,139, 33,184,133,144,179,101, 51, 6, 35,233, 78, 8,204, 67,207,176, 90,246,223,242, 45,223, 26, 66,248,251,127,
+239,157,124,206,139,190, 49,187,114, 46, 55, 69, 0, 48,238,116,139,103,159,127,226,228,142,223,253,172,221, 59, 46,204,230,179,
+ 56,153, 88, 23, 67, 57,134,230,158,101,159,186,116,247, 98,125, 34,152,153, 89,232, 98,152,159,122,174,187, 87, 61,145,131,144,
+251,222,116,127, 62, 57, 24,214,126,233,169,245,227, 79,172,174,237, 15,202,110,148, 59, 14,143, 38, 79, 94, 59,253,248,147,183,
+ 45,215, 83,185,202,195, 93, 81,200,144,224, 38, 74, 52,120,146, 8, 36,101, 79,128, 1, 71, 71, 58, 60,194, 35,159, 34,195,236,
+228,169,179, 23,206,158,156, 77, 67, 23,141,150,140, 86, 78,160,185, 71,121,130, 12,150, 37, 74, 9, 52,201,251, 62, 12, 51, 4,
+122,202,241,201,195,219,142,250, 19,174, 72, 35, 47,173,201,203,243, 89,124,246, 29,179,187,239,156, 79,187, 16, 99,185,154,243,
+182,251,190, 26, 32, 65,149,111, 52, 0,134,124,215,233, 63,219, 95,157, 60, 88,159, 4, 40,210, 64,193,104, 6,129, 36, 45, 20,
+129,146,182,183, 19,207,158,158,242,220, 61,127,141, 32, 89,159,133,128,242, 98, 52,173,106,191, 3,141, 34,204,138, 89, 37,141,
+132, 96,102, 70, 90,148,188,104, 50,104,168,194,166, 81,197, 86, 67,148,209, 4, 88, 49,140, 6,101,192, 8, 19, 28, 34, 41, 57,
+100,194,255,119, 15,222,242,217, 51,103,206,156, 62,125, 6,192,122,189,186,118,237,218, 98,177,248, 60, 46,116,255,115,159,251,
+218,215,126, 83,147,108, 19, 62,205,130,153, 89, 8,225,218,181,235, 63,250, 79,126,228,233, 46,244,214,183,189,221,179, 75, 42,
+103,151, 0,205,202,198,208,234, 35,148,139, 89,136, 93,124,203, 15,253,224, 45, 46,244,166, 55,255, 0, 84, 62,202, 46,177,108,
+ 44,203, 78, 50,208, 16,130,145, 22,172, 24, 18, 59,185,179,126,244, 19,159,254,241,159,248,185, 99,102, 36,165, 36,149,205,211,
+104, 70,196,182, 34,106, 98,222, 89,142, 17, 49, 98, 18,125,111,190, 62,123,234,224,217,119,216,139,191,244, 7,191,227,123,127,
+244,216,133,160,141, 22,148,197,144, 78, 48, 4, 63,181,123,120,246,212,254,238,188,159, 4, 15, 49, 4, 2, 70, 71, 12, 25,158,
+ 23,239,250,145,119,189,237,173, 53,120, 49,207,217,199,135, 92, 46,185,228, 30,108,117,238,196,165,243,167,255,108, 26, 14,161,
+236,180, 12,203, 52,135,201, 61,185,231, 60,228,212,191,235, 93,255,184, 94, 40,231,156, 61, 47, 87,195, 19,151,151,159,190,184,
+186,114,109,181, 90,167,192,229,222,236,218,222,206, 85,165, 52,200,146,211, 93, 40,219,145,165,156, 83,210, 48,160,239,213, 15,
+253,247,189,254,245, 0,226,181,195,254, 99,159, 90, 93,185, 54, 84, 9,129, 93,212,179, 47, 44, 95,120,207, 98,103,198,233,212,
+186,156,221,224,110, 46,149,136,129,242,101, 63, 91,174,163,123, 70,210,249,115,231, 9,134,133,221,123,176, 72, 94,196, 36,151,
+ 20,217,155,174,175,151,251,215,174,173,204,108,103, 22,204,202,209,149, 11,244,156,179, 93,190,126,102,127,185,151,115, 13, 50,
+190,250,107,190, 38,204,207, 60, 15,190,189,107,152,134,213,172, 91,116, 92,244,189,239, 31,165,126,240,221,157, 24, 2, 41,135,
+231, 62,199, 43,215, 79, 95, 63, 58,217, 15, 93, 61,217,164,164,112,226,220,151,128,155, 11, 1,152,196,213, 78,183,236,226, 0,
+169, 79, 90,173,125,221,251,238,204, 98,228,114, 61,187,122,112,242,250,209, 94, 63, 76,132,234,210,139,149,142,174, 76,144, 16,
+ 68,152, 92,164, 28,112,201, 93, 32,252,104,145, 62,253,196,210, 24,206,158,157,155,237, 45,251,221,236, 17,144, 89, 22, 85,245,
+ 24, 41,156, 56,251, 92,108,121, 16, 10,211,174,159,196, 85,199,129, 53,236,227, 48,132,199, 46, 77,175,236,159,115,156, 18, 66,
+121,177,218,137, 44,231, 44,236,158,187, 95, 82,253,149, 8, 83,180,126, 22,251, 24, 7, 9, 2, 83,238,174, 28,157,125,242,224,
+252,149,125, 28, 45,243,124,106, 49, 20,197, 7,196,241,224,135,221, 51,247,209,136,205,170, 20, 45,117,113,232,226, 0, 32,229,
+238,210,193,249,131,213,169, 34,215,229,202,159,188, 62,244,131,119,209, 98,108,127,199,178,162,179,247,169, 46,116,244,218,222,
+197, 97, 26,251,236,118,241,224,194,178,223, 3,192,178,108, 48,101,191,190,159, 47, 94, 75,215, 14, 82,159, 52,155, 88, 12, 4,
+201, 11,247,126, 13, 40,192,208,238, 24,212,201,217,225,206,100,113,180,222, 59,236, 79, 66,213,179,176, 28, 69, 51, 0,132, 21,
+ 59, 17, 66,216,219,137,103, 79, 77,120,219,189,175,170, 49, 12,172,132, 51, 37,228,106, 95, 73, 90,177, 3,245, 30, 70, 47, 82,
+222,219, 12, 8,102,140, 80,137,224, 65,122, 17,157,179, 90, 55, 74, 32,138,143,144, 0, 67, 85, 62, 17,148, 76,197, 31,193,228,
+128, 9, 46, 8,148,170, 89, 18, 5,186, 32,119, 66, 18, 33,151, 3,146, 28,146, 67,160, 3,160, 67,213, 92,136,130, 73,128,228,
+114, 65,144,187, 67,240,162,235,148,151, 55,104,203,104,139,247,154,160, 20, 65, 16,109, 13, 95,124,124,254,126,118,124,220,123,
+239,125, 47,124,225, 11,239,185,239,190,179,103,206,108,158, 85, 61, 5, 44,193,115,253,102,215,174, 93,251,232, 71, 63,242, 71,
+127,244,135,143, 62,250,232, 23,102, 65,123,123,123,175,125,237, 55,221,121,231, 93,238, 69, 21,208,172, 29,199, 72, 9, 45,186,
+226, 13,145, 52,155, 27, 43,206,153, 6, 34,118,221,191,251,229, 95,254,189,223,123,223,231,174, 28,124,205,107, 94,243,194, 23,
+ 62,224,174,230,106,170,221,188, 97,201,228, 38,108,227, 24,215,223,184,164,146,112,108,150,213, 22,106,102,236,194,193, 79,252,
+243,159,251,147, 79, 62,254, 89, 22,244,134, 55,190, 25,101, 33, 55, 45,165,189, 47,182, 62,142,173,166,216,217,104, 78, 99, 12,
+110, 6, 51, 24, 97, 37,200, 52,196, 32, 18,243,105,111,198,147,123,135, 49, 64,138,180,248,186,239,254,217,229,178,191,229,130,
+ 98, 78, 67, 91,196, 38,169,217, 90, 13,117,108, 65,219,155,167,157,217,202,168,189,249,194, 76,147, 46,197, 14, 70, 5,194, 2,
+ 73,148, 80,198, 12, 93,200, 70, 11, 33,215,116, 11,246,238,127,250,119,174, 28,220,245, 51, 63,253,211,143, 60,242,200,141, 11,
+ 74, 57,227,150, 27, 92,178, 75, 54,103, 67,140,214,209, 44,207,186,117, 48, 63, 49, 63, 52,211,206,116,101,134,174,243, 16, 16,
+ 72, 11,168,219, 5,210,138,194,129, 96,118,210, 25, 32,144,158,251, 97, 88,189,238,219, 94, 23,227,228,167,254,197, 79,126,242,
+147,159,220,150, 80,218, 58, 61,117,105, 41,109,140,117, 12, 6, 34, 26, 45,144,144,153,119, 97, 56, 49,187,110,230, 59,179,165,
+ 81,102, 8,148,220, 4,122, 48,137,193,204, 65, 3, 80, 80,143, 12, 64, 52, 0, 74, 0,137,156, 83, 78, 9, 12,242,254, 59,191,
+235,187, 39,221,228, 45,111,169,241,104,120,209,151, 63,232,174, 33,121,159,188,239,253,104,237,203,101,190,186, 63, 28, 44,210,
+254, 97, 58, 88,228,117,239,203,149,123,246,148,100, 92,205,186,163, 46, 30,157,216,219,239, 98, 31,152, 5,119, 81, 32,104, 98,
+201,130,141, 84,217,235,226, 59,106, 62,227, 89, 82, 82, 72,137,135,203,221,195,229, 94, 61, 71, 82,246,252,170,175,250,234,199,
+ 31,127,252,242,229,203,241,218,254, 32,232,242,181,180,127,152, 86,131, 31, 46,114, 81,215, 18, 35,169, 96, 65, 80, 8, 10, 1,
+207, 60,183,188,251,142,163,221, 57,231, 83, 24,109, 58,165, 25,131,213,236, 49, 4, 3, 76,202, 17,230,202, 36,139,227, 42,194,
+ 47,233,209, 98, 53, 73, 41,174,214, 33,231, 92,143,164,220,221,100,250,230,111,254,150,223,250,173,247,240,206, 23,124, 93, 5,
+146,198,240, 65, 80,251,185,124,149, 48,237,214,209,242,222,236,224,212,252,192, 76,179, 14, 93,199,103,222,181, 27, 3,110, 63,
+ 63,139, 93,136,129, 49, 50, 24, 67,176, 34,165,226,208, 73, 24, 92, 64, 86,128,248,228,213, 11,139,126,158,114,151,189,179,230,
+184,173,154, 46,210,172,184,105,128, 13,124,144,111, 14,119, 85, 41, 2,136,214, 79,194,208,217, 96, 76,112,172,214,234,123,126,
+232, 99,251, 22,120,241,201, 85, 8,118,247, 51,119,119,118,194,108, 18, 38, 19, 55,179, 0, 89,139, 69, 6,239, 8, 92,217, 63,
+ 55,228,184, 90,239, 38,239, 8,144, 46,170, 37, 23,164, 84,190, 70, 20,144, 70,172, 9,177, 32,243, 49,182, 52, 87, 11,196, 50,
+153,164,228, 46,146,144, 92,146,153,178, 46, 61, 53,144,188,182,159,204,248,172, 59,166,183,157,155, 76, 39,182,187, 27,165,110,
+177,218, 1,194,213,195,211, 66, 72,169, 43,154, 69,203, 98,205,152,140, 53,216,102, 1,229,164,216,162, 14,128,144,156, 36, 68,
+192, 89, 66, 17, 18,240, 98, 55, 85,130, 86, 23,168,146,201,149, 80, 87,116, 64,171,149, 25,245,193,143,195, 31,245,201,100,111,
+119,239,124,215,197,243,167, 79,150,157,168, 33, 33, 69, 56, 85,236,129, 12,230,150,139,173, 43,191, 52, 42,186, 68,169,186, 6,
+ 1,112,128, 16, 69, 8, 78,144, 34, 36,207, 18,228, 1, 89,160, 64,194, 93, 70, 58,148, 97,160, 29,172, 78,102,239, 22,253,238,
+122,152,129, 36,115, 23,253,220,169,253, 46,240,238,103,204, 99,224,238, 44, 6, 43,167,196,200, 12, 26,144,235,169, 49, 50,139,
+164,140,145, 18, 40, 72,245,141, 92, 13,116, 80, 1,120, 75, 52,229,110, 3, 67,231,161,168,154,193, 5, 14,153, 66,120,106,113,
+ 70, 10,139, 97, 39,123, 36,172, 94, 77,214, 15,186,120,101, 13,242,169,131,193,200, 59,206, 77,187,142,231, 79, 79,230,179, 16,
+204,186, 40,167, 17, 25, 32,115,129, 49, 72,183, 40,100,169,136,199,139,183,146, 28,101,113, 2,233, 69,177,178, 27, 16,115, 54,
+119,150, 45,115, 15, 87,142,206, 0,225,168,223,145,204, 21,200, 34, 96,147, 64,102,193,220, 69,226,104,233, 0, 87,189,211,240,
+248,147,125,140,220,153,197, 19, 59, 97, 54, 9,231, 78,119,193, 56,157, 4, 54, 64, 39,150,248,181,236, 82, 13,229, 75,240,105,
+213,189, 73,164,144,114,200,206, 73, 8, 41,133, 44, 27,242,196, 21,143,214,187, 18,179,135,102,149, 93, 52,168, 68,211, 38, 57,
+ 1,201, 60,187,140,222,131,192, 48, 12, 36, 15, 14,211,229,104, 49,240, 83,151, 66, 32,231,211, 96,102,123,243, 96,193, 10,206,
+ 45,130,116,146, 14,167, 72,149,111,160, 92, 69, 72, 89,132,108, 57, 76, 93,112,217,144, 39,146,165, 20, 96,205, 82, 73, 50,177,
+198,201, 38,247,166,201, 94, 98,119, 20,107,228, 70,121,206,134,222, 1,226, 40, 27,208,117,129,228,108, 26,130, 89, 4,156,168,
+ 57,174, 68,194, 41, 35, 11,164,132,150, 46,212, 24,113, 61, 76, 87,195,180, 26,136,146, 18,170,109, 82, 61,136,148,201, 32, 10,
+197, 54,155,156,102,146, 80, 50, 33, 21, 37, 85,205,189, 28,110,232,251, 76,179,126, 16,192,216,244, 89,108,169,164,224, 45, 70,
+ 5,139,198,147, 64, 53, 72, 0,156,205, 54,149,173, 46,231, 66,178,150,181,120,189, 73, 17,230, 53,235, 48, 2,238, 78, 99, 67,
+216, 12, 42,183, 84, 20, 87, 4,100,136, 40,176,156, 81,112,193,232, 62,102,183,128,188,130,136,213,152, 2, 28,157, 75,211,123,
+ 64, 5,202,179,242, 70, 5, 25, 66,133,173, 75,174, 6,213, 43, 21,219, 86, 96,192, 98, 97, 13,146,224,132,201, 74,154, 86, 12,
+145, 11, 82, 77,160,138,203, 40, 66,174,113,155,224,114,161, 96, 54, 66,173,210, 20,213,129, 92, 4,228,144,138, 21, 45,191,164,
+224,114, 16,240, 17, 84, 0,224,242, 22,158,214,120, 71,117,143,116,139, 8,241,139,143, 47, 62,190,208,153,235, 38,246,238,226,
+206,124,103, 50,153,204,102,243,174,235, 80, 67,239, 97,181, 90,175,215,171,163,163,163, 92,170, 30,127,161, 11,234,186,238,197,
+ 47,126,240,249, 47,120,193,221,207,190, 59,196, 86,113, 20, 97,245,156,213, 20,144, 52, 51, 73, 31,255,248,199, 63,244,193, 15,
+188,255,253,239,239,251,254, 11,188,160,175,253, 27,175,121,224,129, 7,186,216,105, 68, 32,183, 33,187,227,153,227,152,225, 3,
+ 8, 33,208,216,247,253, 31,252,254,239,255,218,175,253,199, 63,215,130, 98,140, 15, 60,240,192,171, 95,253,181, 26, 99, 87,141,
+ 48,230, 38,165,223,206,240,143,103,246,199, 83,123,210,204,246,247,247,223,253,207,126,236,232,232,232,243, 91,208,217,179,103,
+ 95,253,234, 87,223,117,215, 51, 11,102,180, 21, 77,111,189,104, 59,232,223,250,250, 25,215, 84,162, 83, 32,196,112,233,226,197,
+127,245,243, 63,255,212, 83, 79,125, 78, 11,250,190,239,251,190,249,124,183,153,207, 27, 51,252, 77, 38,191, 73,162,183,165,212,
+208,190,146,168, 98, 27, 96,216,222, 76, 78, 58,125,226,209, 63,254,201,159,250,197,207,186, 32,155, 76,103, 41, 37,119, 79,158,
+182,144,253,250,233,238, 94,234,117,174, 92,202,119,229,153, 92,126,108, 47,203,229,167,242, 31,151,123, 46,149, 2,101,207,217,
+115,206, 57,189,224, 5,247,252,228, 79,252,131,189,189,221,207, 82,173,127,249,203, 95, 33,185,171,120,171, 27, 31,117,239,198,
+170,200, 22,102,211, 66, 8,183,144,141, 30,227, 16, 67,234,186, 33,134, 97, 18,215, 93, 28,102,221,106,210,173,118,231, 71, 39,
+119, 14, 78,238, 92, 63,115,226,169,221,217,193,215,189,230,197, 93,236,254,232, 3,143,125,198, 5,189,236,229, 47, 63,254,198,
+ 91,159,210, 77,231, 80,199,112,180,154, 49, 56, 9,179, 12,194, 76, 70,152, 57,161, 96,217,204, 99, 76, 49, 12, 93, 55,204, 39,
+139,192,193,130,158,255,188, 59,238,120,230, 43,127,247,119,223,247,153,116,232,245,218,188,193,141, 26,191,125,186, 55,167, 30,
+ 0, 48,157,172, 39, 33,119, 93,154, 79,215, 33,104, 50, 73, 70, 6,202, 72, 11, 26,245, 40,154,155,101, 51,198, 78, 36,193,160,
+220,125,226,137,251,215,131,189,243, 29,239,188,133, 14,213,154,208,118,109,232,248,163,128,191,245, 85,227,147,242,128,100,214,
+119,113, 53,155, 46,166,147,229,206,244,112, 62, 61,218,153, 29,237,204, 15,119,102,139,157,217, 98, 62, 57,154, 79, 14,167,113,
+217,133, 62, 90, 95,254,144,185,135,134,236,153,196, 63,252,225, 31,190,197,130, 84, 11, 83, 79,251, 40,117,190,250, 42,159,116,
+203,249,228,104, 54, 59,220,153, 31,205,186, 69, 96, 31,217,171, 69,205, 46,184,168, 2,137,128, 78,184,152, 81, 48,110,151,234,
+ 13, 74,110,102,111,125,219,219,111, 90,208,103, 90,207, 88, 40,148,198,175, 16, 92,154, 77,150,243,233,209,206,236,112,119,186,
+ 63,157, 44,163,245,198, 4,247, 18,143,137, 38,208, 91, 46, 42,152, 72,119,182,251,114,120,150,202, 97,212,137,189, 19,223,241,
+157,223,117,108, 65,219,187,147,115, 78,158,215,125, 94,173,243,106,157,150,171,180, 90,231,126,240, 52,212,189, 34,134,192, 20,
+216, 71, 91, 83,185, 44,211,125, 11, 46,117,109,171,255,184,211, 37,132,117, 71,114,102,201,179,138,142,100,207,247, 60,231,158,
+151,190,244,225,141,195,216,178,201, 26,146, 4, 28, 45,138, 69,130,196, 24, 48,157,134,104,220,219, 1,160,217,100,105,212,206,
+244,112, 50, 25,106,150, 36,203, 52, 9,146, 65, 12,101,107, 24, 74, 74, 48, 70,231,146,148, 51,192, 4,147, 91,114,100,135,209,
+ 13,112,195, 55,124,227, 55,126,240,131, 31, 40, 85,103, 75,217, 83,246,101,159,151, 43, 63, 90,229,197, 50, 47,251,188, 90,249,
+106,237,171,181, 47,123, 95,174,124,177,202, 71,203,124,180,204,253, 48, 12,169, 47,183,167,102, 51, 93,173,150, 81,183,150, 5,
+ 99,118,194, 1, 7, 50, 42, 78,145, 69, 79,150,171, 46, 85, 83, 42,247,148,210, 27,223,244,230, 42,161,195,101, 74, 73,159,124,
+ 98,237,142,107,251, 67,242, 45,239,213,252,134, 81, 49,176, 11,254,208,243,174, 78,162,246,102,128,208,117, 38, 24,137, 8, 7,
+ 36,154, 75,116,146, 82,137,233, 29, 5,247,105,190,209, 61,115,209, 79,220,163,151, 83, 98, 94, 42,185,193,108, 58,157, 62,252,
+240,203,222,247,190,255,105,195,224, 67,242,156,149,115,206,170,229, 29,185,148,219,249,246,246, 91,247,148,220, 61,167,156, 83,
+ 82, 74,197, 24, 40, 11,197, 97,200,229,142,209,235,100, 87,202,202,142,236,202, 94,148, 94, 57, 89,206,165,104,233, 85,202, 94,
+137, 86, 95,255, 13,223, 64, 50,172,226,125, 23,159,234,143,150,121,185,118,247,141,247,172,217, 83,171,129, 77,226, 58, 96, 8,
+186,122,116,180,190,122,109,117,233,242,106, 61,104,221,123,118,116, 93, 45,164,181, 42, 83,169,191,214, 20,155,114, 22,207,228,
+ 54,164,238,210,181,243,139,245,124, 72, 93,139,174,216, 16,104,200,117,242,212,201,184, 30,242,166,196, 88, 42,111,238,205, 62,
+171,228,136,168, 69, 50, 79, 57,187,107,221,231,100, 24,134,156,146,229, 84,111,195,114, 67,224,224, 86,210, 63, 2,144, 17, 4,
+ 50,160, 34,170, 76,137, 21,162,115,128, 14,163, 90,186,248,240,195, 47,139, 80,115, 26, 68, 99,185,148,178, 95,205,110, 1, 26,
+ 53,177,158,144, 33, 7,203, 57,195, 51, 46, 94, 94, 63,117,173,223,153,197,147, 39,250,249, 60,220,121,219, 60, 4,159, 77, 3,
+ 98, 48, 31,188,129,158, 9,209, 97,125,223, 29, 46,247,146,199,229,122, 82, 36, 34,186,209, 36,208, 33, 83,112,119, 90,206, 57,
+150,130,158, 54,160, 94,193, 95, 11, 2,234,168,199, 71, 69,107, 11, 16,169,236, 50,246,107,239, 7, 74, 41, 4, 72, 26,178,187,
+ 56,233,132,156, 1, 88,144, 50, 72,184,220,193,148,185,234, 39,238,150,115,133, 20,107,170, 95, 33,108,184, 25,225,116,198,154,
+246,194, 75,165,185,194, 8,242,173, 48,218, 1, 39, 51, 75,170, 95,202,216,165,132,234,234, 7,238, 31,164,213, 90,174,163, 73,
+103,207,184, 99, 22, 3,231,179, 16, 81, 32,155,176, 30,166,125,154,164,212,173,250, 73, 77,178,155,228, 71, 11, 74,147,220, 65,
+138,140,133,140,198, 38,162,130,100,120,181,104,162, 55,128,129, 78,122,171, 27, 9, 86,137, 4, 67,242,148,185,234,125,221,251,
+116, 26,206,158,138, 93,180,105,164, 19,253, 96, 57,199,197,122,186,236,119, 92, 33,229,104, 44, 55, 4,211, 6, 82, 47, 4,180,
+122,189,130,194, 22, 84,161,112, 10,132, 98, 75,202,202,229,165, 20,173,237, 98,158, 64,121,173,246, 87, 64,210,141, 41, 59,122,
+ 92,188,156, 66,176,163,213, 78,140, 70,155,145, 93,159,186,156, 75, 85, 89, 94,188,109,129,192,188,214, 29, 10,154, 91, 10, 54,
+238, 30, 11, 76, 1, 65,116, 21, 30, 66,209,158,106,251, 55,241, 90, 5,167,168,230, 17, 28, 24,143,160, 82,143, 60,248, 71,254,
+ 36, 25,237,196,169,157, 16,186,115,167, 79,204,166,147, 77, 64, 78,149,250,243, 77,123, 54, 38, 56,146, 20,139,153,169,199,190,
+162, 75, 5, 14, 2, 42, 48, 92,180,189,201, 71,104, 0, 90,193,207,139,150,209, 21, 33,246,169, 3,205,150, 10,193, 39,147,156,
+114,234,162,197, 96,133, 69, 84,240, 41, 59,190, 14,107,118, 8,238, 2, 98, 21, 23, 36, 86,158, 70,133,168,225, 37,165,168, 0,
+142,128, 2,154,151,141,109,124, 8, 1, 73,116,239, 14, 86, 39,165,112,125,117, 10, 48, 92, 37,168,179, 39, 87,147,174,191,237,
+236,228,220,201, 46, 70,155,207, 10, 62,199,138,136, 53,227, 82,149,217,140, 0,220, 99,149,190, 10,240,198, 17,202, 43, 2,243,
+ 81,161, 84, 86, 39, 81,213, 63,145, 89, 20, 41,183,228,204, 50,119,186,170, 38, 18, 74,174,144,125, 24,188, 79, 46, 33, 6,144,
+140,193,170, 92,138, 16, 42, 98,200,145,160, 21,161,170,104,149,226, 81,127, 93,204,116, 93,152,128,228, 52,154,139, 16,172,240,
+235, 68,193,150,253,252,104,125, 34,123, 88, 12,187,197, 9,180, 67,203,235, 7,137,196,245,163,252,216,165,245,124, 22,110, 59,
+221,117,209,110, 63, 55, 53, 98,210, 1,110, 77, 72,155,218, 42,221,227, 86,108, 95,144, 55, 67, 65,232,170,171,241,138,181, 54,
+100,113, 68,103,139, 61, 85,102,150,121, 65, 3,205, 36,145, 14,153,203, 97, 70,103,206, 62,144, 93,242,148, 68, 86,106,119,118,
+ 25,179, 89, 80, 41,172, 64, 86,108, 9, 25, 27, 19, 81, 5, 52, 37,107,109, 69, 78,142,231, 14, 72, 57,144,238, 78, 90, 48,102,
+128, 7,203,189, 85,154,165,220,173,210,172, 80, 89,224,213, 41,213,106,138, 92,176,148,145, 61,245,131, 29,173,114,160, 93,188,
+210,155,241,236,169, 46,154,221,118,102, 50,153, 88, 23, 25, 35, 28,102, 16,164, 88, 85,168,170,136,163,217, 35,178,248, 62, 21,
+231, 93,105, 70,117,233, 0,149,101, 41,135,193,131,187,181, 99,209, 54,191, 48, 79,172, 98, 5, 2,233,222,187, 49,100, 80,193,
+108,119, 30, 82, 80,118,247, 12,133, 80,162, 37,193, 92,138, 40,133, 4,182,111, 0,170,139,169,134,200, 65, 56,134, 28,141,158,
+178, 73, 88,167,153, 20, 22,235,121,159,167,238,166, 90,221,104,254,164,149, 69,189, 65,197, 16,156, 52,185,178,173,122, 55,232,
+226,149,158,196,213,253,193,130,205, 38, 33, 6, 78,187, 48,155, 6,154,197, 86,205,116, 86,147, 83,189,107, 81,206,106,143, 11,
+242, 43,115, 25, 93, 67,154,100,183,148, 99,206,177,189,128,213,243, 56, 96, 94,206, 51,137, 98, 82, 72,208,229, 70,131,123,162,
+155,134, 37, 72, 44,150, 46, 98, 54, 13,209, 56,159,197,221,185, 72,198,177,140, 89,149,165, 90,151,102,142,189,216, 2,184, 83,
+134,195,213, 46,168,148, 59,201, 82, 14,181,184, 86,140, 47,218, 9,118,192,188, 86,186,204, 26,180, 67,186,188,152,186, 6,194,
+ 59, 72, 33, 37,201,224,235,156, 29,160,197, 13, 52, 62, 86,163,189, 29, 41, 86,133,168,197, 25,231,254,250, 4,183, 72,221,133,
+148,171,209, 49,176,226,246,197,106,168,254,178, 86,223, 4,171,133,213, 77,141, 89,213, 61,211,144,124,185, 20, 73, 43, 25,103,
+117, 95,165,150, 51, 70,176, 37, 89,229, 88,218, 40, 97,137,168,182, 17, 37,244, 43, 5, 32,182,164,191,208,240,203,113, 30, 17,
+255, 34, 21,170, 58, 52,140,129, 67, 35, 41, 87,210,149, 12, 35, 83,159, 94,234, 29,149, 29, 79,199,198, 34,184,151,124,176,154,
+203, 18,112, 22,105, 56, 10, 11,185, 97, 52,181,242,130,102,192,234,134,169,150,147, 37,170,149, 85,219,175, 11,189,140, 37,174,
+169, 41,139, 70, 89, 11,222,206, 54, 4,120,121, 99,142, 65,183,220, 91, 16, 2,247,234,120,107,145,180, 6, 50, 99,225,157, 77,
+ 28,213, 75, 52, 69,171,213,229,234,138,138,139,171,154,108,172, 2, 40,133, 54,212,171,123,235, 84,169, 73,132, 23, 12,161, 45,
+ 14,205,190,160,114, 69, 75, 49,178,210, 79,203, 31,171,218,123,169,241,245,188,226, 77,197, 27,214,240,177, 4,197,245, 26, 78,
+183, 22,194,202,155,131, 83, 35,253, 85, 90,222, 70,131,209, 10, 79, 69, 70,172, 12,189, 74, 91,244, 42,132, 81, 70, 69,192,133,
+ 55,216,208,173,194,209, 29,129, 12,214,165,121, 75, 82, 74, 45, 16,170,226, 45,193,128,143,139, 80,125, 87, 73,112,140,133,167,
+170,192,226,104,138, 27, 49,214, 27, 33,102, 12,156,202, 95,169,226,187,181,188,214,194,205,234, 1, 80,173, 1, 8, 90, 17,122,
+ 61, 19, 42, 22, 7, 35,252, 82,249,145, 37,221, 3,106, 15, 86,219,167,234,106,170,100, 75, 92, 53,146, 20,197,186,113, 45,149,
+ 86,181, 64, 45,204, 35,116, 3,116,255,197,130,217, 23, 31, 95,124,124,241,241,151,165,222,250,116,151, 32,247, 78,156, 56,121,
+226,196,238,238,222,169,211,167,206,158, 57,123,234,244,233, 83, 39, 79,238,236,238,237,238,206, 39,147,105,169, 81,109,149,221,
+182, 88,155, 66, 74,105,185, 92,236, 31,236, 31, 28, 28, 94,186,116,241,240,224,240,250,254,245,131,253,253,107,215,174, 29, 28,
+ 28,252,229, 19,208,206,206,206,253,207,125,222, 51,158,241,140,219, 47, 92, 56,117,234,244,206,238, 78,140, 17,194, 45, 13,254,
+241, 74,205,177,106,206,177,255,140,228,214,155,248,208, 41,165,197,209,226,250,254,245,199, 31,255,244, 71, 63,242,145,143,125,
+244,163,233, 11, 84,249,254,130, 9,232,194,133, 11, 15, 62,244,208,151,126,233,139,166,211,137,180,137, 42, 62,251,117,107, 72,
+135, 45, 92,170,254,200, 18, 85, 87,132,166,118,203,141,197,210,237,130, 46, 90,163,113,137,150, 5,149,174,174, 79,125,234,147,
+191,249,158,247,124,248,195, 31,114,247,255,167, 2,218,219,219,187,253,246,219,191,236,203, 94,116,255,253,207, 45,136,142,198,
+194,240, 86, 49,241, 6, 25,241,150, 74,179, 97,177, 30, 67,156,121,188,224,254, 25,191, 30,239,154, 43,172,236,237, 34,226, 88,
+139,191,122,245,234,127,251,237,223,250,240,135, 63,124,229,202,149,191, 16, 1, 93,184,112,225,129, 7, 30,184,231,158,123, 46,
+220,126,123,206, 94, 11, 19,199,132, 34,224,233,212,134,219, 6,105,203,210,108, 63,127,204,248,224, 22,180,254, 91,146, 1, 62,
+219,147, 53,229, 44, 77,135, 0, 62,245,169, 63,249,253,247,255,238,251,223,255,191,135, 33,125, 97, 4,244,142,119,188, 99,221,
+ 15, 99,237,123,131, 59,110, 97,144,159,155,156,143,223,237, 13, 79,222,226,101, 55,208, 54,158, 70,149,110,160, 46,108, 31,195,
+241,244, 21, 18,131, 66,200,179, 73, 10,193,151,203,254, 55,254,203,239,252,231,223,120,239,159, 87, 64,111,122,243, 15,140,132,
+ 19,141, 4,183, 91, 72,229, 38,203,179, 77,147, 57, 46,151,173, 39,111, 86,165,227,135,176, 82, 89, 54,220, 22,219, 42, 13,141,
+ 20,235,241,242,173,149, 19,220, 50,232,102, 10, 86, 91, 7,187,152,167,147, 62, 90, 65, 97, 2, 24,215,171,244, 51, 63,247, 31,
+254,240,143, 62,254,127,215,255,196,239,127,195, 27,111,212,154, 91,119,153,212, 94,179, 91, 56,249,155,180, 99,195,126,228,230,
+207,182,165,182,173, 17,102,110, 5, 38, 32, 13,178,224,102,245,165,102, 24, 5,100,108,100,107,192, 12,193,196,250, 87,232, 98,
+238, 66, 42, 6,170,235,134,221,233, 50,134, 6, 14, 89, 40,237, 30,238,147,223,252,157, 39,126,241,151,222,123,229,202, 83,159,
+151,128,162,220,159, 94, 46, 79,119,198,142, 87, 5, 56, 18,176,116, 92,168, 55, 60, 43,193, 80, 26, 23, 72, 24, 61,132, 92,142,
+137, 81, 33,248,216, 81, 64,106, 84, 25,131, 26,117, 11,164, 10,177,164, 92, 33, 90, 42, 82, 38, 24,144,160,220, 70,119,176, 80,
+ 72, 11,232,250,229, 47,186,255,217,247,188,252,234,181,229,175,252,242, 47,125,236, 99, 31,251, 92, 5,148, 71,156, 99,235, 38,
+111,186,107,221, 28,224, 84, 86,108,129,174,106,183,223,198, 65, 29,139, 6,184,245, 39, 80, 48,159,198,117, 23,147,153, 8, 77,
+ 38,195,108,178, 14,230,165, 4, 52,233,114,168,164,115,129,168,157,214, 91,142,190, 36,254,193,142, 69, 18,173,105, 18,128,213,
+122,159, 0,210, 42,117,222, 32,194, 7,249,176,183, 59,251,142,239,248,118,151,254,229,207,254,220, 35,143,124,118, 49,133,135,
+ 95,250,240,182, 69, 86, 53, 54, 91,164,161, 45,250,237,141, 54,233,184,237, 58, 86, 91, 58,254,210, 86, 6,112, 2,100,238,226,
+ 16, 44, 25, 68,122,180,212,197, 84,105, 71,112, 51,103, 3,123,140, 34,100,112,180,242,111,193,188,140,181,237,175, 33,148, 13,
+ 81, 41, 84,229, 90,238, 42, 36, 95, 47, 56,139,139,203,245,236,104, 61,119, 89,129, 86, 30,122,201, 75, 94,249,202,175,184,116,
+233,210,229,203,151,159,246,136,109,164,179,109,100,110,161, 50,184,169,241,172,170, 73, 45, 18, 87,149, 33,183, 42,114,173,101,
+ 38,134,180, 51, 93,116, 49, 3, 48,243,157,217,106, 18,251,130,255, 24, 21,232,213,238, 26, 27, 84,196, 74, 39, 55,202,140, 64,
+101,130,147, 69, 58,176,210,224,192,237,131,220,144,220, 90, 78, 46,253, 0,149,247,173, 44,101, 40,203,139, 97,115, 13, 54,155,
+ 77, 95,247,186,111,123,252,207, 30,255,197,127,251,111, 62, 83, 12, 21, 94,242,210,151,142,244,236,173,207,155,126,218,144,138,
+ 26, 25, 14,194,177,118, 33,221, 20,120,106, 68, 93, 67, 72,147, 56,152, 37, 66,102,185, 11, 67, 8,217, 44, 91,129,178, 40,142,
+138,192, 13,197,161,181,212,105,171,207,142, 99,141,133,155, 52,101,243,227,104, 22,132,109,168, 22,238,182, 92,207, 22,235,121,
+150, 81, 99, 45, 28,238,126,226,196,201,191,242,149, 95,185,183,123,226, 35, 31,249,240, 45, 52,168,204, 32,185,197,249,169, 44,
+120, 0,200,142, 62,121, 74, 85, 79,234,243, 4,193, 96,140,177,114, 22,140,156, 76, 24,171,137, 85,140,121, 18, 83,217,248,105,
+236,119,231,135, 93, 76, 69, 21, 99, 16,144,199,226, 64,118,120,107, 82, 42,149, 11, 43,237, 52, 13,247, 47,149,196, 74,104,104,
+ 88,121,217,140,145,180, 56, 62,209, 26,149, 80, 73, 93, 8, 36,178, 51, 57,115, 70,206,200,149,251,233,165, 89, 43,123,118,249,
+195, 15, 63,252,178,151,189,236,199,127,252,159, 61,241,196, 19,199, 52,232,161,135, 30,186,165,223,114,201,189, 98,153,238, 90,
+247,133,162,163, 44,101, 87,114,229,210,150,221, 98,168, 50, 33, 32, 86, 98, 41, 0,197,144,163, 13,164, 27, 61,198,126,214,173,
+ 99, 76,100,177, 50, 13,224,188, 41, 56,225, 88,185,220,106,176,231,118,164,196, 77,223,196,104, 50, 71,166, 74,109, 46,216, 40,
+ 48, 91,131, 9,151,235,217,209,106,199, 21,182,195, 97, 29,247,186,175,120,249, 43,231, 59, 59,101,168, 78,213,160,197,178, 38,
+199,217, 85, 40, 67,101, 75, 82,210,106,237, 35,190,156, 51,142,149, 89, 71,112,154, 52,219, 68,196, 93, 68, 44,140,224,160, 51,
+ 39,214,231, 78,173,186, 32, 66,179,169, 38, 33,213, 86, 14, 34,132,218,165, 95, 28, 27, 89, 59,115, 74,149,183,180,155,148, 54,
+ 58, 18,161,148, 53,205, 91,204, 89, 58,150,216,132, 51, 22, 56,170,180, 27, 64, 13, 23,135, 28,221, 3, 64,151,245, 41, 20,190,
+ 20,199,250, 54, 73, 41, 55,234,176, 3, 50,125,197, 43,191,226,182,243,183,253,234,175,254, 74, 1, 91, 98, 63,148, 35,198,148,
+181,127,148, 14,142,178,187, 36,172,147, 22,203,156,253,166,124,139, 26, 67, 27,110,164, 95,179,162, 64,209, 68,176, 11,160, 47,
+119, 38,171, 20,179, 1, 36,134,129, 22, 10,239, 74, 38,122,169, 80,171,138, 0, 94, 9, 38,102,168,213,199,134, 1,228,140, 16,
+ 74,179, 79,171, 29,141, 81,230, 88,203,173,245, 24, 0, 42, 83,167, 68,186, 35, 37, 75, 41,208,232,110, 57,177,146, 38,197, 58,
+211,138, 26, 91, 33, 85, 34, 11,247,228,126,255,253,247,127,207,247,124,239,207,254,236,207, 92,189,122, 53,156,185,227,249,135,
+ 11, 63, 92,164,195, 69, 62, 88,228,229,218,135,172,148,125, 72, 74,222,218,122, 88,251,143, 74,197,136, 99,107, 97, 61,238,141,
+237, 36, 15,230,198,108,144, 49, 77,187,117,180,101, 78,105,221,231, 33,229,148,211, 98,153,142, 22,105,177,200, 67, 86,114,245,
+131,134,193,107,127,230, 56,106, 70,219,228,169,186, 13,242, 45,190,215,232, 57,202, 84, 15,140,129, 73,125,218, 69, 7, 33, 38,
+ 15,203,245,108,213,207,134,220, 13, 67, 92, 13,211, 97,232, 54,149, 33,220,200, 94,223, 98, 39,105, 62,159,191,252, 21,175,248,
+ 95,127,240, 7,188,243,249, 95,127, 60, 40,228, 45,162,104,222, 34, 81, 40, 27,215, 6,125,148, 61,241, 46,246,209, 74, 71,166,
+239, 78,143,246,166, 71, 70, 23, 16,130, 38,209,141, 4, 52,153,216,233, 83,147,189,157,104, 70, 26,119,231,225,196,110, 23, 98,
+181,210, 33,148,142, 91, 88,165, 58,227,248, 96,174, 58, 85,103,203, 68, 53, 51, 83, 78, 40, 3, 93, 78, 3, 48, 12,221,213,195,
+ 51,203,245,188,212, 95,179,135,156, 59,108, 19,175,113, 3, 46,176,133, 22,144, 22, 76,185, 82, 24,110,136,118, 70,175,192, 27,
+243,176,198, 14,110, 68, 30,108,202,243, 18,232,148,202,144, 40, 50,163, 80, 76,233,196, 88, 99, 20,164,148,212,247,126,196,108,
+ 70,171, 77,126,140,161, 76, 30,225,116, 98, 49, 88,201,194,140, 12,161,180, 26,104, 11, 6, 42,119, 38,110,197, 65,108,171,116,
+ 71,242,174,156,194, 33,197, 97, 96,206,149,149,223,230,248,108,247,185,181, 16,170, 1,120, 24,169, 91,146, 11, 22, 44,250,200,
+236, 31,153, 45,216,116,166, 97, 12,196, 42, 77,179, 85,224, 27,157,117, 43,243, 39,203,104,152, 48, 0, 48,122,176,108,204, 70,
+ 47, 5,231,236, 42, 13,233, 67,202,203,181,143,244,207,249,204,118,231, 49, 4,146,220,153,133,243,231,166,243, 89,160, 33,144,
+ 93,103,101,146, 29, 71, 3,135,113, 41,155, 53, 57, 44, 43,148,189, 90, 15,179,195,197, 94,246, 88, 98,159,245, 48, 75, 57,110,
+230,129, 65,155,106,179,198, 94,236, 90, 64, 46, 22,169, 2, 8, 37,228,200,136, 44, 54,128, 55,166,237, 91,101,212,234,246,129,
+ 13,239, 96, 11,228,240, 38,241,145,120, 44, 43,132, 81,185,182, 70,129, 20,162,124, 93,106, 33,210,145, 70,228, 92,184,151, 70,
+170, 79, 92,175,179,177, 78,181, 41,109,226,172,218, 84, 58, 38,219,148,158, 45, 16, 33,139,238,197,119, 88, 74,200, 25,217,107,
+185,184,116, 14,176,145, 25,113,139, 28,115,235,148,112,108,178,172,166,215, 13,113,219,232,109, 48,137, 58,234, 71, 99,128,225,
+ 45, 33,172, 44, 8,109,201,171,178, 34, 4,200,152, 67,200, 0,140,165,169, 20,141,158,176, 89, 65,229, 78, 52, 58,209,106,173,
+245, 80,120, 61,215,119,173, 0, 0, 8, 65, 73, 68, 65, 84,181, 48, 75,151,159,234, 67, 48, 2,147,137, 93, 56,219,157, 57, 21,
+ 67, 48, 0,211,137,205,102, 22,204, 72,101,197,126,152,122, 46,169,104, 88,245,179,117, 63, 19, 12,130,195, 82,142,181,145,149,
+ 91,249,208,103, 5,111, 52,198, 96,106,156, 1, 25, 24, 29, 91, 4,169, 77,182,160,198, 42, 96,107,114,169,142,170, 74,172, 81,
+ 99, 91, 96,223,210, 90, 84,118, 87, 25, 47, 5,109,152,133,198, 58,194, 14,108,212, 0,149, 12,163,140, 45,116, 53,138,140, 55,
+ 78, 96,159,188, 31, 20, 11,103,154, 12,198,108, 48, 67,150,134,132,202, 14, 21,114, 70,202, 28,233,148, 57,163,145,133, 74,213,
+191, 81,174,183,207,214,246, 71, 11,172,198, 82, 66,125,138,148,231, 72,199,134, 73, 83,186, 51, 70,101, 81,115,233,133,153,165,
+ 99,195,169,216,136, 10, 34,183,176,124, 47,228,147, 13, 51,168,205,172, 80, 37,209,169, 50,120,138, 19,172,219,155, 33, 20, 62,
+194, 32, 26, 28,196,208,243,104,129, 79,212, 0, 5,147, 73, 55,155,159, 8,214,129,232, 66,152,239,204,187, 24,173, 12, 12,129,
+ 21, 74,132, 54, 16,204, 77, 89,119,163, 9,221,140, 95,141, 73,100,113, 61,155, 35, 86, 34,105,208,111,196,221,189,181,102,183,
+ 40,140, 91, 78, 77, 85, 72, 85,144,245,212,140,177,123, 27,115,229,168,205, 7,106, 42,200, 13,114, 86,175, 52,206,233, 44,103,
+175,108, 26,220,115, 27, 84,146,220,179,171, 44,104,200,200, 96, 8, 4,208,197, 16, 98, 32, 2,110, 0,167,183, 24, 37, 27, 92,
+129,162,179, 54,255,104,243,239,216,193,107, 1,206, 49,164, 79, 66, 8, 81, 26,123,192, 43, 95,124,227,189, 26,181,171,106,139,
+188,178, 69,154,207, 45,196,164,218, 77,138,218,178,228, 35,176, 37,211, 24,114,171,210, 33, 37, 88,187, 54,235,172,173,194, 90,
+ 49, 18, 57,199,245, 48,117,149,208,218, 86,195,108,200, 19,212,177, 23,101,196,161, 3,232, 98, 58,177,179,154,116, 70, 90, 8,
+216,219, 9,123,243, 16, 66,237, 62,156, 68,150, 38,137, 18, 73, 86, 99, 95,120,148,197,245,109,172,118,121,178, 30, 41, 51,219,
+ 88,166,162, 68, 57, 71,140,224,210, 86, 47,100,115,248,237, 16,160,153,161,102,123, 42,220,209, 68, 75,110,227,253,117,126, 1,
+ 90,255, 0,125, 67,134, 67, 37,124, 11,130,249, 24,232, 85,224,203, 51,135, 28, 83,238, 68, 72,182, 26, 38,125,158,213, 49, 2,
+220,108,109, 23,220, 61, 77, 39, 6, 32, 70, 11, 1,211,174, 76,164, 96,136, 86, 38, 4,212, 16,153,114,199, 72, 20,170, 62,126,
+204,244,198, 65, 20,149,131, 86,224, 35,105, 43, 10,141,133,188, 87,177,211, 45, 86,126,227,126, 17,227,200,219,227,209, 17, 43,
+157,176,234, 69, 89,128,131,217, 9, 24,225, 62,102,236,141,130, 93,101, 84,220, 32,233, 2,192, 33,119, 67,154, 72, 1, 84,242,
+184, 26,102, 37,138, 17, 44,123, 84, 93,111, 99,227, 2,146,178, 99,177,206,235,228, 4,205,242,144,252,112,145,203, 56,205,105,
+103,187,115,235, 2, 69, 68,179,217,212,186, 56, 14,207, 42,208, 91,157, 77,215, 88,223, 55, 57,185, 90,192,173, 34,142,205,222,
+ 3, 91,108,184, 77, 87, 66, 57,119,163,227, 35,182,252, 32,176,153,111,211,114, 34,167, 23,100,152,230,162, 23,219, 89, 57,252,
+226,232,232, 27,111, 14,226,144,186,163,126,238, 30, 64,186,135,117,154,102, 89, 97,136,182,184,223, 91,172, 94,225,161, 44,248,
+122,132, 17,185, 92,251,245,195, 84, 2,172,249, 44,156,222,139, 93, 52, 80,147, 24,128, 64,134, 26, 33, 27,143,247, 26,109,103,
+218,183, 46,167, 19,136,206, 49,230, 30,253, 24,235, 96,198,154, 64,108, 29,179,134,184,160,177,223,171, 62,141,174,190,176,249,
+ 80,167,168, 20,200,188,224,197, 37,136,119,201,197, 33,119,238,177, 80, 17,251,212,165, 20, 93, 38,210,101,222, 90, 50, 74, 23,
+ 90, 97, 27,110, 76,121,117, 1,210,166,188, 38,207,200,141,151,187, 30,120,184,200, 49, 58,137, 24,220,229,139,117,157,151,212,
+ 69,155,116, 44,253,217,209,216, 69, 27, 33,151,146,247,141, 74,178,117, 95,227,232,156,145,239,200, 77,206,213,134, 48,141, 75,
+241, 49,146,220,234, 94,242,177, 93, 8, 66,174, 96, 3,130,204,163,185, 23,132,189, 96, 60, 21,106,151,135,101,191,187, 24,102,
+101, 71,178,199, 33, 79,218, 12,147,150,223, 65,173, 79,197, 53, 66,137, 26, 35,210,178, 55,165,215,139, 46,207, 94, 87,176, 94,
+235,112,145,234,180,109,227, 36, 50, 88, 57, 95,216,157,133,221,121, 40,173,227,179,169,157, 57, 17, 39,147,138,118,119, 93, 65,
+ 98,176,113,112, 37,220,119,143,104,126,138, 35,201, 21,149, 88,222, 44,208,104,181, 56,162,189,163, 5,247,202, 26,101,227,107,
+214,120,192, 81, 17,219,226,204,221, 41,148, 53, 32,123, 72,206, 50, 70, 18,160,156,106,238,184,145, 46,107, 30, 92,137,204, 44,
+ 51,121,198,166, 17,140,221,141,109,206,101,227,179,182,246,159,182, 97,133,192, 91,134, 47, 35,101,173,147, 91, 83,130,195,152,
+ 38, 41,148,106,109, 23, 67, 12,141, 32, 65, 52,213,130,193, 34,168,173,244,171, 82,119, 43,213,164,222,114,237,181,169,157,110,
+149,170, 50,226,156, 62, 34,246, 46,246, 57,150,241, 86, 70, 31,172, 27, 66, 44, 67,194,147,199, 62, 77,178, 2,137,172,176, 30,
+102, 67,142, 99,243, 30,219, 52, 62, 47, 77, 65, 53,165, 46, 29, 0,108, 8,120,163,218, 87,147, 81,186,238,252, 88, 78, 93,218,
+150,234,185,113,207, 92, 59,128, 50,209,142, 71,171,140,253,209, 29,209,218,180,189,162, 65,209,234,104,130,233,132,243,105, 8,
+ 86,146, 21, 70,175, 51,160, 70,197, 69, 93,170,111,241, 5,224,173, 33,117,220, 26,109,230,178,110,106, 47,170,152,112,161, 95,
+ 11,185, 28, 49,152,171,124,178,112,174,107, 84, 65, 82,173,204, 92, 98, 20,167, 83,220, 12,221,169, 43, 97, 29,153, 84,250, 56,
+ 90, 23, 15, 55,125,218,155,138,125,137, 42, 74, 11, 19,213,114,198, 81,130,244,218, 8, 85,248,220,165,122,171,232, 42,128,101,
+150,229,204,156,164, 80,197,194,219,238,125,213,200,247,199,214,156,240, 22, 49,111, 32,177, 27, 50,212, 26,169,234, 24,101, 99,
+ 59, 65, 3,220,120, 44, 46, 29,203, 67,146,181,122, 78,235,196,208,246, 60,162,113,186, 18,235, 11,164, 81,119, 90, 81,153, 27,
+ 16,103, 43,178, 27, 51,170,150,124,150, 24,106, 51,206,104, 76,217,109,156, 43,216,128,173,134,199, 85, 97, 23, 57,196, 49, 5,
+229,102,114, 23, 0,111,231,138, 26, 81, 52, 31,107, 86,141, 41,190, 61, 78,175,220,176, 31,171, 78,231, 77, 65,155,219, 69,190,
+113, 28, 20,218,216, 89,142, 61, 0,155,102,186, 10, 62, 53,146,121,171, 75, 22,126,251, 8,107, 98,211,135,135,106,172,198, 22,
+129,218,212,165,150,173,182,252, 15, 21,179, 7, 55,129,239,136, 85, 84,191, 83,125,121,212,216, 1,217,118,119,116, 89, 21,153,
+ 24, 49,182, 81, 82, 26,161, 53,130, 21,244, 25,251,131,183, 50,187, 99,196, 23,201,185, 37,175,177, 51,117, 99,236, 71,159, 85,
+247,186,116, 53,214, 3,219, 52,183,116,131,168,105, 56,139,233,209, 86,251, 95,171,101,214,230, 95,200, 54,181,222, 22,239,176,
+246,219,108, 58, 10, 42,196,176,201,223,202,182,120,212,198,175,143,189,162, 99,141,160, 44,169,140, 44, 6,217, 14,237,150, 52,
+ 49, 14,101, 28,227,130,177,190,176,169,203,114, 76,151, 91, 60,224,173, 31,148, 99, 67, 90, 49,248, 45, 42,108, 81,214,104, 3,
+173,181,233,108, 18,246,150,161,179,246,211,110,206,144,234,216, 72,214,222,177,173, 81,209, 77,105,234, 89, 20, 70, 45,221,164,
+160, 26,155,157, 25,155,155,196,102,198,200,120,204,235, 4,179, 86, 41, 47,118, 76,194,118, 87,211,216,169,188,105, 53,231,113,
+ 90,199,136, 24,183, 94,154, 17,253, 86, 11, 49,212,154,108, 41,209, 36, 29,139,237, 89, 27,100,197,237, 18,106,109, 44, 26,193,
+ 2,232,134,220,144,218,232,203,168, 92, 21, 55, 40, 67,213,154,129,194,184, 29,181,214,219,198, 93,163, 14, 81,216,176, 8, 29,
+ 35,154,233,173, 83,166, 90,163, 17,207, 46, 14, 96,147,138,140,240,238,173, 88, 15,227, 76,182, 27,162,124,105,123, 56,249,166,
+ 85,158,181,133, 22,227,129,171, 75, 30,233, 53, 35,213, 70,141,117,211,102,208, 85,211,130, 86, 53,170,135,184, 38, 73, 53,235,
+ 65,187,163, 38,159,154,118,113, 59,229, 24,131, 50, 32,106, 76, 58,125, 67,192, 44, 99,254, 52,102,174,229,221,171,217,246,209,
+224,195, 71,118,135, 70,131,122, 12,110,194, 13,223,181,233,171,169,245, 46,108, 17, 21, 37, 31,195,119,175,160,144, 26, 11, 74,
+ 99, 40,208,166, 0,192,154,140, 42, 58, 94, 26,223,183,129,214, 38, 60,141,237,133,197, 28,121, 77,246,142,157,179, 13, 13,174,
+142,122, 16,193, 88, 71, 30,106,203, 5,183, 9,130,220, 84,155,107, 39,176,198, 89,198,199, 36, 85,239, 89,117,152,165,184, 53,
+253,112,155,124,215, 60,195,198,126,141, 48,154, 54, 57,221,134,207,114,131, 97, 26,179,211,114,195,101, 60,229,198,108,160,182,
+ 96,170, 33, 43,133, 89, 70,152, 54,194,106,157,214, 86,163, 7,109, 10,180,165, 34, 48,226,176, 85,198, 17, 27, 43,221,166,118,
+212,230,181,177, 4,213, 80,106,142, 41,245,184,220, 17,226,215,150,237,225, 13,132, 43, 31,131, 36,226, 88,173,132,218, 4, 11,
+220,148, 63, 90,103, 90, 29,195, 95,213, 72,219,161,105,131,150,198, 0,101,235,108,212, 60,122, 68, 21,183,172,209, 24, 32, 85,
+ 39,184,253, 50,109,193,248,218,172,242,255, 0, 2, 20, 76, 70,229, 56,168, 10, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/multiply.png.c b/source/blender/editors/datafiles/multiply.png.c
new file mode 100644
index 00000000000..6648ecdf5d2
--- /dev/null
+++ b/source/blender/editors/datafiles/multiply.png.c
@@ -0,0 +1,320 @@
+/* DataToC output of file <multiply_png> */
+
+int datatoc_multiply_png_size= 10039;
+char datatoc_multiply_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 96, 0, 0, 0,
+ 96, 8, 2, 0, 0, 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,252, 97, 5, 0, 0, 0, 6, 98, 75,
+ 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,
+120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7, 21, 0, 4, 17,164, 74, 11,162, 0, 0, 32, 0, 73, 68, 65, 84,120,218,237,125,
+ 91,176,173, 89, 85,222,247,141, 57,255,181,214, 94,123,239,115,217,167,251, 52,221, 45, 66, 95, 64,160,149,216, 77, 55, 32, 49,
+137,196, 91, 21,134,138,146, 64, 20,171,148, 74, 52,149, 60,224, 13, 21, 5,226,131,229, 37,151, 74,149,151,170,132, 7, 41, 33,
+ 38, 38,241, 82,165,121, 49, 79, 65, 19, 65,163,160, 17, 5,161,185, 9, 54, 77,159,238,115,250,236,179, 47,235,246,207, 57, 70,
+ 30,198,156,243,255,247, 62,187, 27, 80, 76,197, 42,214,161,207, 57,123,157,189,215,154,107,204,113,253,198, 55, 6,192,231,250,
+120,198,237,183,223,117,215,221, 55, 63, 79, 0,111,252,161, 55,229,156, 8,136, 8, 69, 98,140, 93,140,177,235,222,252,166, 31,
+246,111, 10,223,245,221,223,211,247,155,156,147,170,102, 85,213,188, 90, 45, 87,171,229,241,209,141,123,239,185,243,218,181,131,
+195,195,195,112,255, 3,247,107,206,154,213, 96,166,246,241,143,126,224,198,141,171, 71, 71, 7,139,163, 27,217,236,235,190,238,
+ 21,239,126,247,187,227,181,253,229,159,124,100,113,184,204,164, 92,222,185,126,235,185,220, 33, 32,168,154,104,206, 41,229, 55,
+191,249, 45,225,122,250,226,117,159,205,204,212,174, 94,189,114,237, 70,191,179, 21, 98,132,170, 93,188,120,121, 58,155,155, 89,
+216,222,187,151, 0, 12,102,150,214, 55, 52,235,181, 27,253,180,155,220,121,251,109,187,231,246, 12, 70, 67,132,169,154,145, 4,
+104,166, 10,136,156,255,243,253,139,249,147,184,127,222, 79, 96, 48,132,237, 11,247,144, 6, 24,129,212, 31,197,233, 94,156,236,
+ 16, 60, 58,206, 31,121,100,153, 50,110,185,208,241,214,187,191,154, 8, 16,192, 8,146, 20, 18, 68, 96, 8,164,144, 2,137,209,
+212,140, 25,153, 34,132,137, 33, 3, 2, 40, 12, 0,140, 12,208,207,234,186, 66,251,219,214,214,252,153,207,124,166, 8,151,203,
+229,233,187,123,224,129, 7,190,250,107,190,214,204,132,164, 72, 8,193, 47,238,191,255,198,111,188,235, 93,191, 93, 94,233,213,
+175,126, 77, 74,189,230,172,170,170,185,223,108,214,235,229,114,113,124,233,210,185, 23, 60,255,222, 63,122,223, 7, 0,132,251,
+239,127, 64,179,170,169,153, 93,189,250,216, 99,143,253,217,225,225,254,226,240,198,106,117,164,154, 95,243,205,223,246,206,119,
+254, 15,126,213,215,127,235, 71, 30, 89,145,236, 2,239,186,245,137,233, 36, 76, 98, 12, 93, 71, 96, 62,223,121,214,179,159, 59,
+157,205,194, 58,222, 5, 64,213, 54,235,131, 79, 95,217,239,147,237,204, 3,161,100,184,227,206,187, 9,168, 89, 84,168,168, 2,
+162,121,163,170, 87,158,220,244, 9, 95,114,247, 45,119, 60,227,139,114,206, 27,194,128,104,170, 6,130, 10,131, 65, 97,241, 40,
+237,189,255, 19,211,237,115,233,210, 5, 49,243,187,219,187, 27, 48, 3, 72,203,155,227,201,206, 29,148,152,213, 30,121,108,243,
+200,227,235,219,246, 38, 93, 71,222,122,215,215, 80, 4, 20, 2, 6, 8, 5, 66, 48, 16,129, 18,130, 4, 72,140, 10, 21, 51, 26,
+ 12,128,208, 84, 9, 82, 4,200, 4, 12, 20, 83,124,190, 30, 28,127,241, 61,223,251,125,219,243,109,131, 17,229, 23,133, 66,145,
+ 32, 36,131,132,159,249,153,159,186,114,229,202,217, 47,244,253, 63,240,131, 89, 51, 12, 80,243,151, 37, 64, 33, 33, 20, 2,164,
+ 32, 72,160, 48,248,107,134, 32, 33, 44,151, 71, 63,241,227, 63, 57,126,161,184, 88, 44, 0,255,244, 0,192,209, 3,196,241,209,
+193,241,209,254,102,179, 2, 40, 82, 13,192, 40, 34,175,253,230,111,124,222,125, 15,254,194, 47,252,135, 15, 63,252, 48,128,216,
+111, 54, 0,212,108,189,177,195, 69, 82,227,246, 86, 56,191, 19,151,139,163,107, 79,124,218, 96, 66, 9, 81,132, 2, 6,146, 80,
+154, 33,105,146, 32,253,102,243,218,215,126,107, 8,225, 71,254,197, 91,248,236, 23,190, 42,171,229,236, 31,138, 0, 76,104,105,
+157,215, 87,167, 93,190,109,111,114,113,183,155,116, 33, 68, 17, 9, 34, 36,105,230,138,246,236,249,246,185, 32, 34, 34,161,139,
+ 97,235,252,115, 84,181,232,137, 41, 8, 83,205,253,113,234,143, 82,210, 27,199,249,218,141,116,188,202,166, 26,104, 36, 98, 55,
+221,217,189,176,119,233,182,201,100,102,106,254, 80,181,104,200, 48,131,138,209,140, 2, 77,102, 84, 75,170, 74,146,154,215,107,
+187,214,227,250,145,236,236, 76,158,117,231,222,222,238,185,217, 52,144,210,167, 36, 20, 17,161, 80, 84,195,246,197,187,161, 4,
+235,137, 64, 51,133,102, 77, 75, 82, 13, 33, 78, 47,116,179,139, 18,119, 51, 38, 79,222,200, 31,127,116,249,200,227,235, 62,233,
+124, 38,132, 1,229, 80,188,245,158,175, 5, 72,208,252, 15, 10, 0, 51,221, 44,175,197,110, 46,113,155,174, 9,160, 65, 40, 2,
+243,187, 11, 46, 80, 82,118,230,113,239,194, 52,170,102, 87, 61, 0,128,152,102, 8, 12,156,108, 93, 34, 0, 24, 0,170, 25, 9,
+ 2,217, 32, 2,192, 52,187,178,169,225,104,153,142, 87, 26,205,212, 53, 25, 20, 20, 97, 83,104,229, 53,140, 38, 20, 3,196, 29,
+163,192, 50, 32,132, 24, 20,230,119, 8, 19,195,255,119, 15,158,249,236,197,139, 23, 47, 92,184, 8, 96,189, 94,237,239,239, 47,
+ 22,139,207,225,133,238,125,206,115, 94,253,234,215,144, 44, 22,231, 87, 66,145, 32, 34, 18, 66,216,223,191,241,111,254,245,191,
+124,186, 23,250,161, 31,126,147,102, 53,247,135,197,250,221,240, 73, 41,143, 32,197,240, 99, 23,223,248,131, 63,112,198, 11,125,
+223, 27,190, 31,230,191,252,150,138,133,179,220,100, 16,192, 15, 69, 9, 65,132, 34,155,245,242,145, 79,125,234, 29,111,127,199,
+ 9, 55,146, 82, 50,243,203,179,230, 70,172,184, 34, 66,205, 84,205,114, 81, 6,211,245,122,117,124,180, 15,224, 13,111,248,238,
+127,251,111,127,250,196, 11,193, 6, 45,240,195,144, 74, 16,208,163,163,195,163,195,253,190, 95,139, 64, 40,164,187,245, 64,193,
+102,179,254,177, 31,255,137,183,188,249, 77,254,131, 82, 67,159,170,170,154,154,154,169,153,234,106,181,124,226,137,199,158,120,
+252, 83,171,213, 49, 96, 52,154,187, 78,165, 65, 53, 91, 78, 41,245,253, 79,254,228,191, 42, 47,148,115,206,154,151,171,254,177,
+171,203, 79, 93, 89, 93,219, 95,173,214,105,185, 92, 30, 30,238, 31,236, 63,169,154,203, 43,151,104,111,106,240,155, 81,131,154,
+109,250,205,235,191,235,187, 0,196,253,163,205,135, 63,185,186,182,223, 23, 9,129, 33,216,246,100,189, 51, 61,222,157,229,174,
+147, 96,245, 62,221, 66,104,102, 54,237,166, 33, 68,205, 25,102,183, 92,186,133, 32,159,253,194, 87,245,201,204, 64,122,104,163,
+105,210,116, 4, 61,158,117,118,121,111,186,119,174,235,162,132, 32, 20, 15, 7, 70,200,197,189,203,187,187,123,179,217,204,181,
+ 98, 50,157,134,173,139,207,133,142,111, 13,150, 55, 57,173, 82, 90,167,100,139,117, 78,217,102, 83, 17,161,187, 30, 82,118,118,
+247,118,182,207,199,174, 67,121,107,154, 89,216,189,244, 37,224,240, 66, 0, 52,111, 52,175, 97, 73, 13,170,232,123, 75,201,166,
+ 19, 6, 97, 55,153,237,236, 92,216,222,222,237,186, 41,221,175,161,120,233,168,150, 9, 18, 6, 35,196,212, 8,203, 48,117,185,
+168, 98,181,201, 87,111, 88,136,188,227,214,249,124,190, 59,159,239,198,216,153,153,230,108,180,162,199, 72,226,127, 55, 43, 82,
+100,121, 5, 83,115,241,154, 1, 73,229,177,235,241,198,106, 7, 97,215, 32,174, 38,110, 84,174, 54, 89, 53,108, 95,186,215,204,
+ 64,180, 67,153, 37,211, 30,214,251,199,165,196, 56, 57, 23,167, 23, 14, 22, 56, 94,230,173,169,196,224,138,239,185,101, 49,252,
+176,125,241, 30, 10,171, 5,187, 68,179,229,100,218,131, 6,137,113,122, 33,118, 59,238, 49,151, 43,125,226, 70,191,233,181,139,
+ 18, 99,253, 57, 18, 64,216,222,187,199, 64, 88,245,218,126, 12,235, 53,247, 68,232,166, 23, 99, 55, 7, 64, 63, 54,152,178,222,
+ 56,200, 87,246,211,254, 97,218, 36,155, 77, 36, 6,130,228,229,187,191, 14, 52, 64, 92,145, 0,168,169,229,149,230, 85, 8, 91,
+ 97,178, 3,243,200, 34,116, 83, 20, 1, 64,136,251,137, 16,194,206, 60,238,157,159, 68,131, 2, 32, 20, 38, 74, 16, 20,138,197,
+185,196, 57, 0, 83, 37,197,220,201,131, 52,117,213, 53, 40, 77, 0,168,234,193, 81, 62, 90,172, 34,252,194, 0, 82, 93,116,234,
+206, 17,254,179,240, 24, 97, 6, 8,138,242, 25, 65, 51, 49, 33, 97,128,152, 2, 98, 80,131,129,110, 81, 30,128, 64, 53,152, 42,
+ 97,102,132,169, 41, 96,102, 10,183, 94, 42, 0, 42,172,184, 11,163, 65,204,220,166,213,181, 71, 21, 6,117, 93,167,169,191, 65,
+ 61, 70, 61,188,186, 25,152, 7, 86,162,158,225, 11,143,207, 61,206,182,199,221,119,223,243,130, 23,188,224,174,123,238,217,187,
+120,113,120,214,138, 21,208,147,231,242,135,236,239,239, 63,252,240,135,254,248,143,223,247,209,143,126,244,243,115,160,157,157,
+157, 87,191,250, 53,183,223,126,135,170,171, 66,181,187,146,163,214, 28,190,184,246,147,153, 52,107, 24,243,224, 76, 1, 17,187,
+238, 87,126,233,151,222,243,158,223,255,236,149,131,175,124,229, 43, 95,240,130,251, 84,155,111, 43,126,243,212,145, 73, 14,135,
+104,121,253,233, 35,121,193, 49, 28,171, 30, 84, 72, 30, 29, 31,188,227,231,223,254,169, 71, 31,125,250, 3,197,123,238,125,238,
+122,189,169,242, 56,227,131,176, 21, 55,224,169,211,248,239,106,158, 16,231,145, 32,199,151,139, 77,191,134, 97,113,124,240,245,
+ 95,255, 85, 34, 18, 66,252,249,183,255,226,102,179, 57,251, 64, 57,245, 54,184,196,155, 79, 67, 59,113,160,225, 61, 77,117,181,
+ 94,209,108,185, 90,192, 52,231,100,128,251,156,147,146,132,102,165, 32,229, 76,119,200,228, 63,255,103,223,121,219,237,207,124,
+219,219,126,238,163, 31,249,200,233, 3,165,156,113,230, 5,123,117,201,146,254, 85,233,144, 64,214,212,111,214,170,118,124,124,
+ 3,176,126,189, 6, 45,171,150, 27, 4, 41,116, 47, 12, 65,147,168, 3, 20, 66, 24,209,167,180, 89,175,191,237,219,190,125, 50,
+153,188,245,223,255,187, 79,124,226, 19, 99, 9,165,145,128,203,209, 82, 66,141,231,136, 65, 64, 68, 33, 3,161,166,170,125,191,
+ 57, 60,218, 55,213,213,242,184, 28, 91, 44, 80,204,143,238, 17,194,107, 26,128, 6,119,133,132, 66,145, 9,146,170, 57,165, 20,
+ 66,232, 55,155,239,248,206,127, 58,233, 38,111,124, 99,201, 71,195, 11,255,198,253,170,214, 39,221, 36,221,108,244,120,173,203,
+101,190,126,208, 31, 46,210,193, 81, 58, 92,228,245, 70,151, 43,205, 89, 83,178,229,114,185, 88, 28, 47,150,199,199,135, 55,250,
+126, 77,247,210, 36, 13,131,246,148,130, 71, 74,148, 40,206,216, 96, 6, 26, 41,100,216,218,154,207,231,187,168, 21, 85,214,252,
+ 53, 95,253,181,143, 62,250,232,213,171, 87,227,254, 65,111,176,171,251,233,224, 40,173,122, 61, 90,100,215, 0,207,145, 76, 64,
+ 35, 97,164, 81, 48,239,214,211,176,232,130,237,108,169,144, 93, 4,141, 66,205,164, 24, 40,174, 57, 57, 83, 40,153, 86,194,154,
+ 43,183,107,232,116,107,218,197, 78, 36,230,156,139, 73,154,170,138,137,125,203,183,188,246,183,126,235,157,188,253,249,127,191,
+ 0, 73, 45,125, 48, 88,253,218,127, 55,131,105,111,200,154,150,154,142,168, 8,193, 66,228,229, 11, 19, 9,184,176, 19, 67, 16,
+207, 7, 75,129,192, 98,145, 85,106,234,233, 54,192, 75,151,110,155,205,183,187, 48,137,147, 78,232, 85, 63,165,184, 46, 82,196,
+195, 52,192, 10, 62,152, 14,198, 93, 84,138,102, 80,237, 97,201,114,175, 57, 19,200, 25, 84,124,242,202,138,228,245,237, 20, 4,
+183, 94,156,204,166,161, 11,140,209,212,207, 82,171, 81, 9,145,192,133, 11,151, 67,236,182,230,243, 46, 78,220,244,140, 86,139,
+ 11,210, 74, 82, 17,225, 32,141,177, 20,196, 6, 19,181,114,101, 16, 53, 43,135, 75,166,217, 44,155,103,207, 67,213,163, 55,142,
+148,144,163,229,138,228,173, 23,194,185,237,216, 69,153, 77, 69, 66,156,109,109, 7, 9,231,207, 95,132,132, 73, 55,113,148, 69,
+ 53,123,130, 87,124,166, 59, 93, 7,229,204, 98,205, 58, 0,194, 76,233,246, 9,165,167, 34,238,249,172,164,128, 48,133,105, 67,
+113, 12,106, 74, 35, 0,219,244, 70,216,163, 87,249,233, 39,243,185,221,217, 23,223,177, 55, 13,241,210,165,115, 82,252,181,223,
+187, 17,158, 83, 9,104, 2, 81,201,238,235, 8, 87, 71,139,106,198, 82, 49,144, 6, 64, 1,194,104,132, 65, 9,210,138, 56, 4,
+ 80,212,162, 18, 48,119,208, 48, 32, 24, 16, 39,219,100, 23,186,153,200,116,149,249,240,159,231, 73,167, 87,247, 15,186,192,103,
+221,185, 21, 3,183,103, 49,136, 91,137,144, 25, 20, 32, 23,171, 17, 50, 27, 73, 19, 70,154,129, 6,243, 63, 72,245,211,162, 36,
+205,214, 12,132,174,149,205,103,185,156,140,140,221, 46, 37, 72,152,129, 1,144, 90,197,202,166,183, 43,215,214, 32,159, 60,236,
+133,124,198,165,105,215,241,150, 11,147,173, 89, 8, 34, 93, 52,165, 16, 25, 32,115, 1,116,169, 18, 13,217,113, 14,154,231,176,
+ 52,135,104, 64, 63,160, 43, 22, 64, 32,208, 61,139, 39,235, 12,113,114, 14,160,196, 45,178, 0,142,128,154,137, 25,200,236,181,
+ 5,137,227,165, 2, 92,109,148,130, 71,159,216,196,200,249, 44,238,206,195,108, 18, 46, 93,232,130,112, 58, 9,172,128, 78,244,
+252,213,111,169,164,242,158,124,150,183, 54, 43, 14,152,100, 48, 6, 50, 16,100,152,128,194, 48,243,234,181, 8,206,212, 32, 69,
+201, 40,102, 74,192, 76, 52,171, 9,117, 3, 2,125,223,147, 60, 60, 74, 87,163,196,192, 79, 62, 30, 2,185, 53, 13, 34,178,179,
+ 21, 36,136,227,220, 70,144, 74, 82,161,180,146,197,147,160,169,185,144,204,225,242, 48,145, 2,107, 68,192, 11,117,199,219, 13,
+102, 38,198,146, 39,139,169, 74, 41,110,212,115,119, 64, 13,200, 42, 52,205, 89,176, 81,128, 56,206, 2,116, 93, 32, 57,155,134,
+ 32, 18, 1, 37, 8, 83, 3,205, 28, 83, 20,210, 33,165, 90,144,152,177,212,201, 49,196, 56,132,114, 58,190, 92, 82,124,175,111,
+ 77,188,238,134, 9,189,150,160,136,153,193, 43, 33,115, 37,181, 82,123, 41, 84,176,217,100,138,108,122, 3, 24,171, 62, 59, 94,
+230,154,163, 53, 71, 5, 93,227, 73,192,140,213,190, 74,154, 66,248, 85,187, 93,152, 73,173, 90,180,124, 72, 35, 68, 75,213, 33,
+ 4, 84,181, 72, 20, 6, 8, 90,236,117,191, 8,152, 32,194, 97, 57,161, 65, 13, 66, 85, 14,153,140,105, 1, 17,139, 51, 45,209,
+179,152,157, 21, 71, 97, 14,229, 73,209,245, 2,201, 58,216,231,181, 26,172,188, 82,195, 83, 8,168,145,132,192,204,160,132,152,
+120,153,230,142, 72, 13,102,165,128,242,144, 97, 54, 88, 62, 12, 90,224,147, 82,183, 87,112,165,249, 59,152,194,204,189, 40, 74,
+196,129,154,122, 40,227,144,251,169,105, 77, 79, 75,190, 99,229,142,236,140, 12,241, 11,143, 47, 60, 62,223,149,235,144,123,119,
+113,190, 53,159, 76, 38,179,217, 86,215,117, 40,169,119,191, 90,173,215,235,213,241,241,113,246,174,199, 95,233,129,186,174,251,
+242, 47,191,255,121,207,127,254,179,190,248, 89, 33,134, 33,170, 74,177, 51, 74, 75,244,196,204, 62,246,177,143,253,233, 7,222,
+255,222,247,190,247,169,106,174,191,248,129,190,225,239,189,242,190,251,238,235, 98,103, 13,129, 28,154, 62, 56, 85, 57,182,218,
+ 20, 64, 8,129,194,205,102,243,135,127,240, 7,191,254,235,191,246,151, 58, 80,140,241,190,251,238,123,197, 43,190,193, 90,238,
+106, 13,198, 28, 74,250,113,133,127,178,178, 63, 89,218,147, 34,114,112,112,240, 51, 63,253, 83,199,199,199,159,219,129,246,246,
+246, 94,241,138, 87,220,113,199, 23, 57,102, 52,202,166, 71,223, 52, 78,250, 71,191, 63,229,153, 60, 59, 5, 66, 12,143, 95,185,
+242,142,183,191,253,201, 39,159,252,172, 14,244,250,215,191,126,107,107,187,186,207,211, 21,254, 80,201, 15, 69,244, 88, 74,165,
+176,101, 43, 52, 6,128, 97,124,153, 52,211,247,191,255,143,255,243, 47,254,151,207,220, 28,255, 91,127,251,239, 56,205, 32, 91,
+ 46,206,188, 4,132,246, 69, 57,161,150, 72, 82,190, 40,201,180, 22, 44,184,150,186,214,202,191, 22, 28, 76, 45,107,222,221,221,
+249,187, 47,127,249,123,222,243,222,190,239,159,206,156,115,206,168,239,170,103,222,104,189, 26, 16, 58,214,106,117, 12,209,144,
+203, 79,183, 98,166, 97, 23, 4,115,238, 53,231, 62,245,171,229,145,136,188,246, 91,254,193,251,254,228, 3,255,251,119,223,243,
+148, 7, 82,213, 82,210, 84,244,100,132,148,161,181, 11,198, 79,181, 98, 84,138, 12,212, 10, 98,139,122, 32, 35,232, 97, 54,165,
+ 77,206, 57,165,141,119,132,131,132,251,158,255,156,251,191,252,193,183,190,245,173,103, 31,200, 84,173,189, 3, 78,188, 57, 74,
+ 34,101, 60,229, 29, 12, 6,219,108,214,170, 57,165,126,211,175,160,200,185,247, 62,210, 32, 81,135,146,203,245,121, 6,168, 25,
+ 96,230,237,183,223,241,163, 63,250, 99, 63,242, 35,111, 57, 67,135, 30,124,232,161,210,213,189,249, 81, 83, 49,107, 45, 49, 43,
+127, 0,214,247,155,190,223,244,155,245,106,121,220,167,126,189, 90,244,169,207,253, 38,165, 62,165, 62,245,125,206,125,202, 73,
+ 53,101,205,170,234,181, 33, 76, 73, 57,127,225,146,132,240, 85, 47,127,249,111,190,243,157,167, 14, 36, 86, 26, 83, 79,251,240,
+ 62,159, 55, 38, 76, 87,171,197, 98,113,188, 56, 62, 92, 44, 14, 87,171,227,148,250,156, 54,181, 32,168, 72, 18,107,254,102, 69,
+208,234,141,152,210, 5, 83,181, 44, 34, 63,244,195,111,186,233, 64, 79,117,158,145, 84,218,239,222, 81, 89,173, 22,139,197,225,
+241,241,193,241,225,193,114,185, 72,169,215,148,172,228,223, 94,209, 54,207,224,105,185,231,141,197,124,161,154, 53,107, 86, 83,
+221,221,217,253, 39,223,241,157, 39, 14,164,163, 71,206, 57,105, 94,111,242,106,157, 87,235,180, 92,165,213, 58,111,122, 77,125,
+246,118,141, 95, 71,191,217,244,125,159, 93,249, 92,130,172, 55,233, 57,235,200, 4, 0, 40,157,110, 82,212, 95,189, 79,164,170,
+166, 89,243, 93,207,190,235,193, 7, 31, 26, 41,245,224, 5,173, 79,102,192,241, 66,147,186,241, 49, 6, 76,167, 33, 10,119,230,
+ 69, 54,102,118,188, 56,202,253,166,246,193, 73, 79,125,197, 85, 4, 70,165,133,102,143,230,101,121, 33, 16,121,230,239,137,186,
+152,154, 65, 85,240, 77,175,122,213, 7, 62,240,126,239, 58, 75,202,154,178, 46, 55,121,185,210,227, 85, 94, 44,243,114,147, 87,
+ 43, 93,173,117,181,214,229, 70,253,249,163, 69, 62, 94,230,229,186, 95,173,122,205, 57, 59, 73,234,148,242, 23,199, 88, 59, 26,
+ 44,252, 9,165, 26,189, 64, 1, 40, 94, 67,186, 29,169,170,169,166,148,190,247,251,222, 80, 36,116,180, 76, 41,217, 39, 30, 91,
+171, 98,255,160, 79, 58,114,136, 3, 2,108, 65, 24,196,206, 77,111,144,182, 59, 75, 49, 32,136, 65,164, 40,139, 95, 88,105,185,
+153, 23, 77,163, 58,165,116, 46,133,152, 78,102, 33, 68,215, 69,136, 42,196, 84,131,200,116, 58,125,232,161, 23,255,254,239,255,
+158,244,189,246, 73,115,182,156,115,182,210,222, 49, 53,243, 30,177,153,170,230,108, 41,231,148,115,202,154, 82, 78,201, 59,200,
+197, 90,220, 40,180, 89,128,169, 57,225, 73,213, 76, 77, 21,106,229,127,102,206,149,169,109,196, 34, 33, 39, 90,125,227, 55,125,
+ 19,201,176,138,247, 92,121,114,115,188,204,203,181,170, 14,209,179, 84, 79, 69, 71, 77,211, 38,167,116,116,116,120,184,232, 15,
+142,250,235,135,125,159, 44,101,168, 33, 70, 2, 38,213, 65, 27, 73,115, 99,167,177,148,180,254,186, 49, 78,246,246, 46, 79,167,
+ 91,177,155,148,206,126,253,207, 93,231,185,243,231,226,186,207, 67,139,209, 59,111,170, 53,152, 27,232, 93, 54, 85, 40, 96, 89,
+189, 61,150,161, 76,217,146, 90,116,175, 33, 98,170, 16, 41,109,186,234,250,135,176, 54, 70,190,107, 87, 25, 10, 80, 33,180, 90,
+ 46, 62,244,208,139, 35,172, 6, 13,162,178, 92, 28,208, 45,202, 80,162, 89,238,173,122,183,156, 13,176,235, 71,233,112,145,167,
+ 19,153,111,133, 73,148,189,115,157, 72,238,162, 0, 66, 81,103, 18,168,145, 34,130, 16, 39,147,237,237,243, 33, 74, 23,167, 20,
+154,153, 66,133, 98, 6, 42, 76, 44,168, 42, 37,231, 28,221,149,218, 0,234,213, 19,176,160,105,170,214, 28,138,215,178,106, 32,
+153,179,165, 4, 51, 21,161, 41, 84,213,192, 88,128,231,194,172,169, 52, 27, 35,165,139, 29,131, 20, 27,240, 20, 70,181,128,163,
+ 10, 21, 33,148,202, 88,238,215, 51,139,226, 50, 10,173,168,118, 20,212,212, 84, 51,161,222,166,108,136, 27, 96, 73,101,185,204,
+155, 94, 97, 22,130,220,114, 33,138,232,164, 19, 33, 66, 55,149, 16,166,147,233,100, 58,141,177,235,186,137,247,233,139,228, 71,
+222,147, 98,166, 10,210,200, 88, 62,112, 21,145, 35, 25, 90,146, 26,163, 86, 28,196,109, 7, 86, 20, 76, 74,114,146,179,230, 76,
+ 73,200,201, 98,148,221,109,134, 32, 49, 16, 98, 34, 33,134, 56,157,206,102, 91,115, 9, 49,132,206,109,197, 12, 3,202,143,138,
+186, 85, 15, 22, 75,114, 80, 2,143,185,167,117, 59,243,147,213,204,164,178,104,232, 6,225, 48,178,121,184, 50, 32,169, 33,235,
+193,177, 5,177,201,100,218, 65,186,110, 54,153,198, 16, 39,164,180, 28,210,175, 73, 65,250, 29,176, 52,150, 64, 82, 68, 85,163,
+195, 20,238,242,109,232, 90,148,124,117, 4,143,149,220,159, 69,203,204,163,148, 73,177,166,148, 45,171, 92,121,210, 36,216,124,
+119,123,198,110,178,181,179,187, 61,105,173, 63, 43, 25,112,133,154,236, 84,138, 85,194, 98,244, 86,123, 49,251,130, 46, 57, 28,
+ 4, 20, 96,184, 41,124,137,148, 37,179,246,100,223, 81,100, 37, 37,128,132,116, 0, 55,189, 1,186, 88,102, 50,117, 81, 98, 16,
+ 10, 66, 16,199,167,228,228, 57,164,250, 33,168, 26, 16,182, 47,222,235,167, 41,168,221,128, 51,149,110, 89,209,156,156, 8, 51,
+221, 20, 12,205,125,131,153, 9,205, 2, 67,140,221, 78, 8,179, 48,185, 16,186,249,209,138, 55,142,177,218,216,245,131,164, 64,
+ 23,104,134, 24, 71,117,222,144, 13, 55,216,190,184,172,200, 26,107,104,234, 94,168,224,207,165,180, 80,191,198,147, 34, 46,181,
+172,214, 46, 93, 5,246, 89,200,136, 6,210,146, 90,200,218,247,186, 73,106,134, 24, 64, 50, 6, 41,114,161, 71,126,150, 70, 79,
+109, 85, 68, 24, 80,212,152, 21,154,244,238,159,129,229, 96,128,161, 49,107,134, 79, 38, 0, 25,166,161,155,147, 65,194,204,251,
+ 1,110,191, 0,111, 28, 38, 18, 55,142,243, 35,143,175,183,102,225,214, 11, 93, 23,229,182, 75, 83, 33, 38, 29,160, 82,216, 34,
+163,222, 42, 85,227,168, 42,116,228, 77,224, 8, 93, 9, 53, 90,222, 94, 91, 19,173,116,141,108, 40, 64, 74, 78, 38,226,101,144,
+194, 68, 77, 33, 66,101,206,218,147, 93,210,148,140, 44,212,238,172, 38,204, 34,193, 53,221, 9, 83, 6, 1, 25, 43, 19,209, 28,
+ 52,117,191,103,128, 41,189,207, 80,216,142, 18,172, 0,134, 2,168, 25,165,219, 10, 97, 66,233, 36, 76, 28, 59, 47,184,185, 89,
+233,166,152, 26, 36,101,100, 77,155, 94,142, 87, 57, 80,174, 92,219,136,112,239,124, 23, 69,110,189, 56,153, 76,164,139,140, 17,
+ 10, 17, 24,204, 98,237, 7,120,199, 70, 81,253, 17,233,129,195, 74,131,165, 68,101, 66,212,212,137,175, 2, 4, 80, 0, 97, 41,
+201,234,229, 23, 66, 86,193, 10, 12,164,234, 70,133, 33,131, 22, 68,182,183, 66, 10,150, 85, 53,195, 66, 48, 71, 75, 33,106, 22,
+253, 58,200,250, 7,128, 18, 98,138, 35, 42,213, 42, 2,224,228, 29,132,174,115,237,161,116, 14,210,151,238,120,137,245,226,170,
+167, 21, 42,134,249, 79,170,101, 89,109, 84, 96, 87,174,109, 72, 92, 63,232, 37,200,108, 18, 98,224,180, 11,179,105,160, 72,172,
+221,204, 18,159,209,174, 73,173,114, 8,172,194,238, 98,142, 85, 49, 18, 66,241, 70, 64, 45,120, 61,242, 40, 32,234,201, 66, 85,
+112,146,160,154, 10, 5,170,137, 42,214, 47, 65, 98,177, 84, 35,102,211, 16,133, 91,179,184,189,101, 36,107,146, 95,187,101,254,
+214,197, 9, 1,254,146,168,206, 53,196,153,153,137, 68, 80, 96,206,127, 45, 4,176,138,202,211,207, 84, 58, 93, 34, 21,157, 32,
+213, 91,159,134, 10,194,187, 57,166,100, 38,208,117,206, 10, 80,226, 0,141,183,110,180, 86,176,190, 52, 56,172,250,126, 65,156,
+143,252, 44,213, 40,254,207,240, 55, 42,184,189,123,141,250,143,165,250, 48, 72,197, 34, 90,143,217, 64,246, 73, 19, 5, 73,151,
+ 75,163,235, 68,105,104,106, 49,110,107, 25,172,213,132,163,245,228,189, 56, 66,189, 8,170, 19, 4, 10, 75,170,130,144, 5, 16,
+168, 12,170, 18,104,104,126, 98,115,112,191, 86, 43, 85,196,158, 45,187,216,235, 7,246,126, 71, 97,199, 83, 49,120, 4, 85,168,
+194,188,101, 91,188,144, 90,105,129, 59, 11,185, 86, 66,165,243,226,113,177,114,100,157,191, 86,238,222,106, 91,181,254,179,211,
+203,104, 48,131, 24, 27,104,230,178, 54, 40,209,186, 17, 80,127,227, 70,191,134,169, 22, 12,214,160, 90,162,110,173,131,202,109,
+213,198, 59,171, 56, 74,148,168,138, 86,186,203,238, 43, 60,208,212,116,208,115, 56, 85,191,142, 98, 49, 6,173,147, 42,158,234,
+ 99, 84,202, 12, 34,242, 55,107,152,164, 55,156, 61, 4, 22, 63,235,180, 15, 45,122,228,255,236,205, 37,171, 61,154,194, 15,241,
+215, 80,170,212, 20,214,180, 6, 56,171,164,191, 66,203,107, 88, 17, 91,113,236, 50, 98, 97,232,149,240,161, 69, 8, 77, 70, 46,
+ 96,231, 13,250,164, 8, 77,181,181,149, 13,149,183, 7,215,213,210,139,244,159,116,241,186, 29,107, 59,132,149,119,245,154,165,
+ 53,158,234,148, 2,155, 43,174,196, 88, 69,173,226, 27, 99,194,179,205,130,239,150,246, 26,106,127,175, 96,118,197, 27,148,206,
+183,150,198,152,186,173, 56,180, 84,187, 87,172,140, 2,165, 58,112, 97,229,230,138,168,170, 19,242,207,226, 95,184,189, 20,200,
+131, 86,111,184,120,160, 82,120, 21,229, 29,131,115, 95,104,152,125,225,241,133,199, 23, 30,127, 93,250,173, 79,247, 18,228,206,
+238,238,185,221,221,237,237,157,243, 23,206,239, 93,220, 59,127,225,194,249,115,231,230,219, 59,219,219, 91,147,201,212,123, 84,
+163, 78,206,137,166, 69, 74,105,185, 92, 28, 28, 30, 28, 30, 30, 61,254,248,149,163,195,163, 27, 7, 55, 14, 15, 14,246,247,247,
+ 15, 15, 15,255,250, 9,104, 62,159,223,251,156,231,222,121,231,157,183, 93,190,124,254,252,133,249,246, 60,198, 8,195,153, 14,
+255, 38,158,238,184, 83,138,113, 59,176,205, 54,157,226, 67,167,148, 22,199,139, 27, 7, 55, 30,125,244, 83, 15,127,232, 67, 31,
+126,248,225,244,121,234,124,127,222, 4,116,249,242,229,251, 31,120,224, 75,191,244,133,211,233,196,108,200, 42, 62,243,235,150,
+148, 14, 35, 92,170,124, 73,207,170, 75,203,180, 76,203,181,102,233,184,161, 91,102, 57, 11, 65,211,107, 3, 17,145, 79,126,242,
+ 19,191,249,206,119,126,240,131,127,170,170,255, 79, 5,180,179,179,115,219,109,183,125,217,151,189,240,222,123,159,227,136,142,
+181,198,240, 8,219, 61, 37, 35,158,169, 52, 3,139,245, 4,226,204,147, 13,247,167,252,253,228,212, 92,153,117,229,208,137,110,
+189,248,235,215,175,255,175,255,249, 91, 31,252,224, 7,175, 93,187,246, 87, 34,160,203,151, 47,223,119,223,125,119,221,117,215,
+229,219,110,203,185,244,112, 79, 10,197,128,167, 83, 27,142, 29,210,200,211,140,159, 63,225,124,112, 6,173,255, 76, 50,192,103,
+122,178,148,156, 62,116, 8,224,227, 31,255,248,123,126,239,247,254,232,125,127,148, 70,252,240,191,148,128,222,252,230, 55,175,
+ 55,253,208, 80, 29,218,210, 56, 73,178,248,140,114, 62,249,105, 79, 61,121,198,183,157,162,109, 60,141, 42,157,162, 46,140,205,
+112,160, 71,147, 2, 88,206,185,239, 55,106,121,179,222,188,251,119,126,231, 93,191,253,174,191,164,128,226,114,181,110,132, 19,
+107, 4,183, 51,164,114,147,231, 25,211,100, 78,202,101,244,228,205,170,116,218, 8,135,230, 59,201,167,242,228,229, 75, 27,143,
+ 75,212,185,142, 74,220, 35, 8,164,156,250,205,202,137,174, 47,121,241,131, 95,249,178,151,110, 82,254,111,191,246,235, 31,251,
+248,159,253,197,230,159,248,221,223,243,189,167,181,230,236, 41,147, 17,147,225, 84,144,191, 73, 59,134, 79,202,225,199,198, 82,
+ 27,249,159, 50, 8, 88,205,208, 55, 73,148, 34,185,146, 14, 7,214,123, 67,243, 75, 49, 69,192,144,114,159,115, 25,123, 77,105,
+179, 90, 45, 85,115,109,210, 23, 40, 36,198,201,227, 79, 60,249,174,119,253,238,103,201,204, 57,139, 94,241, 20,114,121, 58, 27,
+ 59,217, 21, 96, 3,173,237,102, 64,124,120,214, 12,102,185,201,218,187,242,195,208,167,102,171, 20, 81, 59,113, 13, 86,181,198,
+ 26, 17,167,148,232, 57,103, 77,254, 94, 41,101,243,109, 20,142, 6, 9,235,108,110,127,239,189,247,188,248, 37, 47, 91, 44, 86,
+191,242,203,255,245,195, 31,254,240,103, 43,160,220,112,142,209,135,188,233, 83,219,205, 9, 78, 97,197,214,118,106, 67,252, 43,
+137, 97,148, 13, 12,227, 59,116, 2, 81,191, 89,215,113,104, 75,155,126,211, 47,221, 40,204, 52,165,100,170, 30,220,235, 11, 23,
+104,119, 0,194, 90,135,150,133,250,221,158, 47,120,102,245, 81,150,181,204,229, 43,114,234, 83,159,230, 91,179,215,189,238, 31,
+171,217, 59,222,254,243, 31,249,200,103, 22, 83,120,232,193,135,198, 30,185,182,141,219, 95, 11, 94,114,182, 79, 58,233,187, 78,
+244,150,110,250,110,181,236,154,162,170, 41,245, 57, 39,231,224,100, 77,169,239,205,137, 13,166,166,185, 54, 25,173, 32,123,214,
+ 58,198,229,157, 88,249,201,142, 21,186, 40, 71,125, 46, 14,115,192, 21,178, 35, 57,157,205,103,179, 57,189, 97, 64,188,232, 69,
+ 47,250,138,151,189,236,241,199, 31,191,122,245,234,211,154,216, 32,157,177,147, 57, 67,101,112,211,224, 89, 81,147,122,183,214,
+134,172, 91, 71,174, 78,221,166,148, 86,203, 69,214,228, 70,180, 94, 45,251,212,143, 62, 67,105,234, 12,109, 49,171,127, 71,155,
+141,224, 48,113, 2, 14,237,151,202,231,104,209,176,142,204, 54, 85,243,142,159,228,172, 57,103, 74,242,252,201, 84,167,211,217,
+183,127,251,235, 30,253,244,163,191,248,159,254,227, 83,229, 80,225, 69, 15, 62,104, 67,219,204, 6,131, 58,245,213, 64, 42,106,
+195, 88, 54, 16, 28, 9,220, 12, 55,161, 82,141, 96, 57,231, 77, 95,204, 74, 53,247,105,147, 83,178,156,180,145,146,234, 59, 13,
+241,172, 72,187, 54,199,198,147,118,104,185,119,195,223,218,186, 11,107, 83, 30,222,178,110,175, 51,155,109, 77,103, 91,172, 80,
+186, 39, 9,166,186,187,123,238,111,126,229, 87,238,108,239,126,232, 67, 31,124, 10, 82,222,153,246, 83, 88,240, 0,144, 21,155,
+164, 41, 21, 61, 41,207, 19, 4,131, 48,198, 50,121, 45,228,100,194, 40,240,214, 95,214,228,211,124, 6, 75,253,230,248,248, 32,
+167,228, 77, 43,159, 84,246,177,140, 54, 19, 80,167,145, 41,133,129, 81, 71,126,106, 95, 14,173,229,237,221, 41,214,189, 69, 99,
+229, 47, 6,111,165, 69,238,157,198,210,189,102, 21,110, 67,214, 21,164,115,187, 30,122,232,161, 23,191,248,197, 63,251,179, 63,
+253,216, 99,143,157,208,160, 7, 30,120,224,204,184,165, 86,104, 53,222, 28, 94,111,156,192, 99,217, 44,171, 37,181,236, 99,217,
+ 53,135,242,197, 65,177, 16, 75,225,154,146, 82, 82,205,166,154, 82,191,217,172, 82, 74, 78, 52,187,169, 45, 62,244, 19,134, 68,
+185,229, 14,194, 34, 76, 54, 22,155,149, 14, 94,165,216,121,239,230,164, 7, 96,235, 23,121,143,102, 54,155,205,102,115, 9,129,
+227, 54,252,201,168,251,210,151,124,197,214,124,238, 75,117,138, 6, 45,150,165, 56,206,106, 78, 25,114,117, 79,201, 86,107,109,
+248,114,206,245,158,236, 36,133,153, 20, 25,162, 74,136,136, 82, 92, 65,224, 38, 96,229, 19,234,194, 44,236,137, 66,246,145,106,
+ 34,141, 71,132,218,112, 30,114,159,218,112,176,210,108,211, 34, 35, 43,170, 69,234,137,173, 16,198,118, 58,231, 38,128, 78,237,
+ 8, 52,250,190, 18,111,162,180,229, 93,222,254,201,149, 58,172,128,137,189,236, 43, 94,118,235, 45,183,254,234,175,254,178,131,
+ 45,252,135,255,232,117,238,229, 82,182, 39, 15,250,195, 99, 39, 40, 97,157,108,177,204, 89,111,170,183,104, 24, 57,136,177,168,
+124,219, 16,171, 8,102,113, 61,141, 75,239,125,119,157,206, 58,141,129, 6, 10, 45,212,170,211, 61,139,180,121, 94,231,208,183,
+225,202, 90,240,139,247,244,217,232, 21, 53,226,143,146, 16,182, 73,204,114,169, 20,145,110, 50,141, 93, 7, 80, 36,204,183,119,
+118,118,206,135, 80, 22,249,248, 40,249,184,124,145, 90,195,132, 16,247,247,175,191,237,109, 63,119,253,250,245,112,241, 25,207,
+ 59, 90,232,209, 34, 29, 45,242,225, 34, 47,215,218,103, 75, 89,251,100, 73,235, 88, 15,203,252, 81,201,186, 74, 96, 45,189,165,
+ 54, 42, 10, 51, 88,174, 52,210,172,186, 73,253,122,211,235, 58,233,102,147,251,222, 86,155,188, 90,231,245,198,114,134, 26, 83,
+182,148, 75, 43,164, 54, 92, 70, 41,235,104,178,182,246, 0, 57,166, 89,141, 99, 72, 9,150,108, 61, 50,248, 44,192,116,186,213,
+117,179, 46,118, 49,118,221,100,218,197,174,198,183, 49,157,119,168,174, 42, 59,201,182,182,182, 94,242,210,151,254,159, 63,252,
+ 67,222,254,188,111, 60,153, 20,242,140, 44,154,103, 20, 10,133, 9, 83, 90,159,165, 76, 48, 75,230,125, 26,168,229, 85, 78,139,
+210,236, 5, 68,124, 2,203,130,112,119, 30,183,102,190,169,137,211, 78,230,211,224, 11,154, 8, 12, 12,254, 86,169,114,112, 64,
+ 28, 0, 56,142,248,211, 99,118, 62, 43,193, 0,177,155,158, 59,127,113,182, 53,247,215, 8, 33,198,216,113,132, 46,157,168,139,
+ 27,113,191,254, 93,130, 88, 46, 20,134, 83,217,206,105,174,204, 80, 80, 85, 70, 41,107, 28, 41,173,204, 50,129,229, 61, 92, 45,
+ 52,211, 18, 6,149,163,222,157,194,104,232,147,114, 35,244,241,114, 3, 5,146, 72, 66, 68,186, 0, 9,174,176, 44,202, 91,134,
+ 88, 43, 65,180,106, 21,199,203, 26, 90,106, 22, 66, 8,209, 63,119,140, 65, 68,198, 48,220,160,164,214, 26,199,101, 99, 75,123,
+179, 86,236,169, 65,130, 68, 29,248,179, 68, 27, 61,174,147,105, 45,189, 40,116,130,214,129, 71, 69,141, 70, 30,219, 0,179,100,
+ 57,121,232, 51,205, 80,245,238,182,150,249, 65,128,200, 89, 55,125,227, 86,114,218,137,239,215, 1, 56,157,240,252, 78,156, 78,
+202,254,165, 24, 24, 66,165,204,183, 66,195,117, 73, 91,134,234, 35, 25,206,167, 99, 55,153,110,207,119, 67,236, 0, 4,145,110,
+ 50,235, 98, 7, 97,211,250,230,250,219,248,160, 21,174,104,193, 57,171,103, 36,161,200,136, 44, 62,224,116,217, 62,106,163,150,
+176,223, 76,105,156,114, 87, 82, 29, 6,250,249,169,100,124, 88,137,163,176,177,204,107, 46, 83, 10,120, 56,249, 49, 37,245, 19,
+ 74, 9,252,195, 50, 6, 97,229,183,177,106,119,179, 16, 9,213, 64,130, 13,153, 55, 1,100, 83, 81, 49,158,154,104,224,224,115,
+198,169, 70, 41, 98,138,235, 85, 65, 28,146,230,209, 90,145,162, 74, 28, 18, 10, 29,193, 55,101, 68,120,216, 13, 96,149,178,104,
+176,108,154,235,183,101, 95,115, 83,141,163,233,180, 85, 82,134, 1,232,147,245,169,124, 86, 89,234,225, 81, 18, 17, 0, 93,224,
+249,157,176, 61,151, 32, 4, 17, 69, 38,157,111, 56, 50, 50,196, 56,141, 93, 7, 51, 74,152,205,182, 38,147,153,255,148,136, 20,
+ 71,131, 33,223, 62, 11, 9,186, 9,188,113,181,104,160, 57, 64, 51, 1,163,142, 35,230, 80, 45,212,205, 19,149,164, 88,241,170,
+202, 45,168,212, 88, 84, 27, 30,202, 90,216, 56,247,178,182,152,201, 71,114, 96, 3,100,161, 99,158,134,170, 18,180, 76,154,102,
+146,137, 76,153, 57,211,156,241, 27,157,182, 89,230,122,106,249, 46,196,105,172,177, 14,177,148,185,187,129,114,125,210,186,134,
+ 95,101,171, 19, 91, 43,161, 60, 69,154,230, 72,197,192,164,241, 49,218,166, 44,134,182,231,207,160,117,241,233,104,107,134, 19,
+ 57, 72,140,135,109, 11,231,183, 20, 98, 3,185,184, 50, 67,202, 42,167,202, 37, 51,101, 11, 80,234,244,102,255,230, 44,125,226,
+245, 35, 95, 80,137,237,237,238,210,197,157,105,215,129,144, 16,182,118,183,182,166, 81, 68, 0, 19,183,175, 19,155, 45,218,144,
+210,184,194,182, 51,241,171, 86, 68,122,232, 25, 76,204, 51,105, 80, 79,227,238,202, 86, 60, 91, 27,193,106,204,151, 34,164, 34,
+ 72,112,204,169,172,249,200,104,129,153, 13,197,184, 97, 24,232, 42,124,153, 42,127,109,235,187, 42,165, 26,190, 13, 27,127,100,
+ 0, 0, 6,168, 73, 68, 65, 84, 83, 49,169,145,160,160,235,145, 85,178, 9, 12, 25, 1, 8, 33,132, 26,246,217, 34,202,160, 62,
+ 24,232,162, 84, 90,201,111,135,255, 78,116,175,120, 74,239,171, 39, 10, 33,142, 51, 50, 22, 54,138,157,200,205,134,233, 11, 45,
+108, 17,171,165, 48, 80, 11, 70, 22, 19,131,121,226,107, 3,134, 81,189, 92, 43,209, 43, 57,211,183, 69, 86,142,149, 7,200, 32,
+ 97,234, 91,110, 72,161, 76, 68, 58,215,138,222,194, 19,251,164, 40, 96, 93,135,131,227,213,108, 34,164,132,128,157,121,216,217,
+ 10, 33,148,233,195, 73,164, 72,169,244,205,156,146, 89, 56, 83, 78, 15,130, 54, 10,186, 63, 89, 76, 74, 68, 78, 12,200,145,200,
+ 57,150,211, 15, 8, 83,213,138, 22,125,216,128,136,193,247, 20,127,195, 22,165, 70,153,218, 0,198,140,111,200, 6, 37,172, 53,
+ 38, 43, 3,210,106, 18, 65, 8, 16, 40,177, 36,232,210, 65, 38, 14,155,102,195,114, 83, 56,221, 93,175,130,180,233, 5, 64,140,
+ 18, 2,166,157,111,164, 96,136,226, 0, 65,195,214, 84, 27,250, 93, 25,101, 62,219,224, 99, 75, 21,216, 6,219,234,166,209,220,
+ 34, 16,189,126, 57, 21, 4,213,172,114,191,136,182,242,246,100,118,196, 66, 39,116, 94, 86,225,215, 85, 99,149,145, 26,142, 75,
+185,241, 29,148,249, 32, 48,134,208,149,221, 72, 12, 18,166,100,168,109, 66,169, 11, 77,116, 32,152,155,101,197, 98,157,215, 73,
+ 9,138,228, 62,233,209, 34,251, 58,205,105, 39,219, 91,210, 5, 26, 17, 69,102, 83,233, 98,219,194,100, 82, 11,233,193, 16,111,
+238, 20,151, 6,110, 17,113,132,142, 14, 95,217,112,195, 84, 66,241, 29, 53,240, 17,163, 56,216,112,188, 97,190,211,134, 65,131,
+177, 71,215, 51, 2,107, 67,186,164, 99,152, 81,196, 12,194, 32,161, 3, 4, 34,104, 27, 32, 42,238,101,149, 22,154, 13,186, 30,
+128,216,229, 90,111, 28, 37,247,243, 91,179,112, 97, 39,118, 81, 64,155,196, 0, 4, 50,148, 12, 89,120,114,214,104, 92,105,159,
+221, 78, 39, 16,149, 45,231,110,113,140, 21, 74,177, 86, 52, 14,169, 82, 37, 96, 86,240, 97, 4, 85, 53, 87, 51, 14,246,227, 45,
+ 55,149, 11, 75, 9,226, 51, 12, 32, 37,146, 66,199,229,107,166,207,202,220,115,182, 97,205,251,106,180, 80,179,241, 50,177,140,
+ 92,121,185,235,158, 71,139, 28,163,146,136, 65,213,116,177, 46,251,146,186, 40,147,206, 7,161, 16,133, 93,244, 9,114,120, 73,
+232,207, 15,107, 61, 42,180, 91, 87,231, 52,190, 35,135,154,171,214,232,237, 40,138, 1,219,108, 94, 69, 75,153, 93, 66, 70, 24,
+ 40,135, 86, 75, 41,115, 74,119, 70, 73, 46, 69,194,140, 50,245,143, 36, 12,148,110, 88, 55, 87, 64, 83,107,147, 80,109, 53,105,
+ 61, 83,213,101,243, 89, 47,170,105, 46,171,176,108,189,182,163, 69,170,104, 16, 39,145, 65,202, 46,179,237, 89,216,222, 42, 75,
+158,103, 83,185,184, 27, 39, 19,175, 7,217,117, 18,216,130,125, 93,172, 98, 6,213,136, 26,167,216, 72,174,224,120,150,101, 20,
+234,107,198,199,193,131,107,241,181, 52, 98,152, 47, 39,112, 2,226,247,204, 54,212, 82, 89,134,109, 90, 70, 43,227,220,104, 62,
+166,166, 33,149,200, 76,192,125,106,101,245,151,206,216,176,231,178,242, 89,135,146,166, 68, 34,239, 66, 58,207, 59,101, 91, 39,
+149,170, 4, 71, 49, 77, 82,240,169,200, 46,134, 24,106, 3,155,168,170, 5,129, 68,208, 70,229, 87,161,238, 22,170, 73,141,219,
+ 37,255,245, 73,183,134, 5, 98, 52,115,214,194, 55, 2, 24, 42, 63, 62, 23,161,248,254, 96,233,202, 2,118,138,200,132,140,168,
+147,238,158,196,182,185,166,106,104, 62, 1, 64,107,222, 72, 43,153,158, 86,167,238,244, 68, 77,237, 99, 75,197,110, 84, 51,215,
+ 10,192, 55,218,241,120,149,113,208,194,145,215,122, 0,139, 6, 69, 41,171, 9,166, 19,110, 77, 67, 16, 41, 35,147, 90,118, 64,
+ 53,197,117,147,210,150, 7,150, 75,241, 43,107,200, 88,161,101,243,196, 36,101,241, 65,117, 66,166,210, 49, 48,184,144,234,234,
+ 1,131,137,163,137, 28,138, 94, 42,149,198, 97,233, 78, 57, 9,203,202,164,146,123, 23, 9,114, 52,189, 62, 32, 60,198,186, 59,
+136,172,221,215,230, 24,252,245,213, 75,245,218, 47, 16,139,190,135,204,152, 77,114,102, 78,102,161,136, 37,182,214,146, 85, 83,
+ 41,201, 15,107,198, 92,108,144, 28,231,194, 53,239, 45,165,232,152,184, 80,124, 73, 96,216,170,219,171, 48,154,181, 42,211,224,
+206,191, 31,182, 37, 20,213,244, 21, 15, 28,120, 38, 37,175,170,163,109, 53, 90, 18,180, 58, 76, 89, 42, 24, 45,118, 58,114,243,
+ 80,207,178,208, 86,144,149,136,164,230,115, 46, 6,192, 50, 87,173, 94,131, 45, 86,121,127, 68,177,137,173, 4,229,176,185,171,
+ 14,208,249, 53, 53, 20, 77, 27, 17,197, 90,187,111,132,182,150,244,178, 28,101,200,253,170,196,132, 39, 56,218,197, 15,179, 6,
+132, 58, 3,224, 37,159,113, 8,121, 54,198,227, 75, 4, 80,142,102,179, 6,248,206,157,213,192,126,112,109,170,164,144, 54, 14,
+136, 10, 41,112, 72,124, 27, 86, 81,226, 78,249, 60,181, 70,110,149, 86,203, 94,180, 42, 86,195,216,154,164,172, 65,107, 4,181,
+118,161, 70,163, 83, 5,224,224,137, 41, 67,213, 81,205, 90,115, 91,142,156,125,139, 89,197, 36,202,140,176,157,216,179,232,211,
+ 32,198, 38, 95,212,213,245, 53,131,107,149, 88,221,131, 41, 67,175,119,104,163,248,188,205, 48, 81,208, 48,152, 90,191,249,181,
+104,180, 33,174,183, 89, 81,182,112,230,231,212, 58,232, 91,140,118, 36, 77,180,165,140,205,208,202,199,174,126,104, 68,141, 25,
+ 50, 7,127,209, 17,100,203,234,240, 91, 55,180,104, 83,243,129, 82,199,116, 42,103,130,173, 66,247,189,112,104, 48,115, 89, 12,
+ 90,135,186,180,108, 67, 67, 29, 97,174,115,176,109, 18,129,173, 4,193,216,140,141, 96,172, 97,242, 4, 57,197,134, 98,212, 26,
+201,178,248,177,106, 76,205, 89,141, 32, 72, 59, 89,223, 15, 57, 83, 27,197,109,142, 29,117,131,244,200, 51,152, 95,236, 80,206,
+ 99,148,117,104, 27,232,175,217,185,182,153,182, 65, 42, 67,109, 88,199,157,198,117, 77, 57, 59,205,151,170,185,131,106,204, 20,
+214,145, 40, 90,107,228,122,169, 49,128, 53, 62,162, 85,103, 17, 91, 83,124,152,124,174, 19,230, 24, 74,145, 6,239,158,197,122,
+176, 49, 59, 97,148,229,183, 73, 61, 12, 97,209, 77,175, 14,198, 85,131, 67,221,221, 90,195, 95,253,187, 85,214, 77,221, 65, 87,
+109,123, 96,202, 20,199,214, 98, 78,253,209,186,185,198, 29,120,107,230, 12, 4, 12,180, 15, 20,173, 21,157, 58, 16, 48,219, 4,
+248, 32, 41, 86,213,160, 14, 96,166, 54,118,135, 53,135,122, 34,170,225,212,159, 54,204,213,148,133,137, 24, 17, 21,205,180, 25,
+ 97,193, 13, 11,112, 84,140, 95, 27, 8,174, 80,129, 24,135, 85, 38,100, 25,124,231,152,120, 82,132,103,109,188,208,221,145,175,
+ 30,177,147,118, 54, 68,225,154,247, 18,140,101,229, 97,219, 76, 82,118, 21,141,247, 4, 86, 95,166,109,178,246,148,164,172, 86,
+ 7,165, 3,196, 1,210, 59, 17,251,135, 72,215,194, 98,195,136,170,118, 14,232,120,213,186,230,152, 70, 52, 33,107,235, 41, 7,
+183,129, 50,130, 57,144,138,252,218, 33, 54, 8,171, 78, 90, 75,193, 91,106,210,226, 83,145,131,102,182,124, 52, 98,240,210,117,
+115,125, 25, 94, 99,245,122, 21,165, 30,240, 62, 27, 38,125,199,182, 54, 98, 13,140, 77, 77,219,120, 36,113,162, 87, 66, 27,146,
+133,166,119, 28, 33,145,181, 51,217,228,142,209,234,203,193,220, 78,218, 70,169,163,109, 84,219, 89,227, 46,181,255,211,135,178,
+216,103,248,182,209, 48,247,136,255,128,255, 11, 9,203, 84,141, 69, 4, 59,160, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/nudge.png.c b/source/blender/editors/datafiles/nudge.png.c
new file mode 100644
index 00000000000..2fa29ad78b4
--- /dev/null
+++ b/source/blender/editors/datafiles/nudge.png.c
@@ -0,0 +1,569 @@
+/* DataToC output of file <nudge_png> */
+
+int datatoc_nudge_png_size= 18012;
+char datatoc_nudge_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0,
+ 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,252, 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0,
+ 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,
+116, 73, 77, 69, 7,218, 7, 19, 0, 34, 13, 86,254,139, 21, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236,188,119,148,101, 87,121,
+ 39,186,211, 73, 55,223, 91,183,110,229,220, 85,213, 57, 7,169,213,234,110,229,156,144, 72, 2, 4, 38, 24,108,108,210,140, 13,
+ 14,204,216,248,225,240, 30,158,121,126, 12,140, 77, 50, 24, 99, 68, 6, 9,229,208, 45,169,165, 78,234, 92,221,213, 85,213,149,
+235,230,116,206, 61,249,156, 29,222, 31, 37, 99,204, 56,224, 49,246, 48,239,241,173, 85,107,213, 93,181,215, 94,223,253,237,111,
+127,241,183, 11,238,223,191, 31,252,179,242,211, 44, 34, 63,254,225,183, 30,184,169,167,183,175, 82,175,127,226,171, 63,248,201,
+ 69, 51,143, 63,245,248,247,254,226,234, 61, 7,229, 72, 58,127,249,165, 14, 37,253,197, 95,123,211,232,200,248,254, 15,255,254,
+234, 34,220,215,215,103,207,191,186,109,116,184,115,100,251,247,191,247,229,147,211, 11, 81, 85,206,165,226, 93,131,155,187, 85,
+159, 10,184, 84,105, 16, 8,209,221,183,220, 39, 71,146, 95,255,155,207,164, 99,145,237,163,253, 99,189,221,209, 76,255,161, 67,
+143, 40,146,180,174, 43, 19,145,215, 19, 33,120,105,225, 44, 33, 82,161,161,191,249,193, 95,211, 87, 46,213,170, 75,105, 45,209,
+ 82,146,157,170,235, 83,250,177, 55,221,137, 0,132, 2,224, 15,126,246,235, 15,222,114, 19,245, 44, 74,131, 84, 34,203, 66,239,
+216,169,115,199, 47, 47, 96,132,190,115,248,101, 4, 0, 0,114,236, 7,159,251,171,158,117,251,142,189,244,131,182,254, 77,145,
+ 84,238,249, 23,159, 34,204,191,180, 92,218,177,166,127,165,218, 36, 64,136, 53, 91, 14, 22, 46, 30,250,225, 43, 39,222,247,190,
+223,241, 90,181, 83,167, 94, 80,100,105, 32,151,233,107, 79,191, 58,179,120,213,250, 33, 60, 48, 48, 48,117,242,217,129, 92,234,
+154, 61, 7,245,252,165,106,254,242,240,240, 70,230,183,106, 45,203,176,221, 98,195, 88,211,157, 67, 66,136,223,252,200, 31,124,
+246,209,195,140, 6,146, 22, 63,116,110,114,102,230, 60, 16,224,228,244,162, 31,208,166,229, 92,152,207,195,159,234,236,126, 26,
+129, 63,250,237,218,109,155,118,116,199,215, 12, 15, 55,155,205,143,255,245, 99, 63,185,104,250,135,143, 79,156,124,178,165, 87,
+215,111,220,179, 52,123, 14, 2,208, 63,188,249,170,247,253, 7,198,249,107,139, 46,127,255,251,156,133,197, 43, 39, 13,163,246,
+228,201,139,131,185,204,214, 53,253,174, 31, 42,178, 28,143,167, 14,252,198, 31, 3, 0,208,217,163,143,156, 62,242,125, 17,218,
+195,235,246, 98,132,246,172, 91,243,210,133, 43, 17, 85, 94,108,133,199, 39, 46, 62,249,137,247, 3, 0,144,130, 65,127,119, 15,
+ 34,234,123,127,239, 63,191,247,161, 95, 78,118,172,217, 48,216,205, 56,223,183,253,170,138,222,122,244,149, 51,255,237,125,247,
+163, 76, 50,253,167,223,124, 52,221, 53,254,231, 31,255, 79, 78,109,209,243,221,115,115,203, 77,203,153,188,116, 50,100,236,154,
+141, 35,187,119, 92, 75,122, 55,221,252, 94,159, 70,219, 7,168,103,190,120,228,241,114,211,124,243,189,111, 42,205,159, 62,125,
+101,137,115, 49,179, 82,249,222,203, 95, 36,140,211,193, 13,215,254,240,219,159,213,100,114,113,161,248, 43,111,123,103,113,238,
+172, 16,160,164,155,153, 88,228,249,243,211, 31,186,239, 70,140,140,165, 11, 19,175, 62,248,150, 15,125,241, 91,223,248,232,175,
+255,230, 35,143, 61,252,200,177,115, 99,189,157, 47, 93,152, 89,174, 53,119,142, 14,124,227,197, 87,241,215,254,236,243, 86,249,
+138, 89,158,185,227,166,187, 14, 29,122,228,170,117,107,206, 92, 89,234,205,166, 91,174,183,190,191,251,198, 93,219,158, 63, 61,
+ 1,126, 86,103,135,192,207, 72,254,238,254,170,138,124,236, 75,159,179,189,224, 91,223,251,234, 93,183,221,191, 60,117, 60, 25,
+143,182,183,247, 53,106,203,186,237, 2, 1,186,178,105, 32, 69,111,250,232,159,252,195, 27,113,206,103,158,120, 70, 80,255,175,
+191,250,103,152, 40,198,242,201,219,246,238, 30, 24,217, 16, 21,182,169,151,124,187,230,135, 52,174, 42, 16, 66,221,180, 95,184,
+120,254,211, 31,120,199,114, 33,223, 52,173,207, 63,117,244,199, 55,194,253,253,253,162,112,190,179, 45, 51,152,203,174,204,157,
+ 25,221,118,107,121,113,226,169,231,159,200, 87, 42,235,215,109,131, 8,203, 72,212,140, 86, 64, 89,119, 71,151,110,232,179, 13,
+119, 91,127,110, 98,126,249, 55, 94,119, 67, 46,161,157,154,203,255, 45, 70, 16,222,121,215, 67, 83, 23,143, 19, 73,105, 75,181,
+ 29,122,250,111,186, 7, 54,184, 65,248,226,249, 73,223,170, 66,193,212, 72,114,176,111,200, 15,105,188,125,112,247,248,208,158,
+238,232,214,205, 87,221,186, 99,195,228,114,137,113,241,169, 95,186,235,137,255,227,195,175, 97,116,225,196, 15,251, 58,115, 68,
+141,157,186,112,234,209, 99,231, 31, 63,121,225,255,254,228,103,244,229,139, 16, 75,245,194, 84,199,192,198,226,210,101,199, 15,
+ 48,145,235,166,117,210,128,163,102,163,208, 48, 40,101, 1,101, 64,128, 90,189,114,242,243,127,134, 7, 6, 6, 39,167,166,190,
+121,248,196,254,157,219, 55,108,186,122,247,154,206,123,239,124, 80, 8,134,136,242,236,115,223,221,126,245,109, 95,254,250, 23,
+183,174, 93, 59,191,178,162, 48, 43,164,244,153, 35,199,226,146, 56, 54, 95, 86,177,200, 38, 98, 99,189,157, 95,120,242,200,206,
+129, 12, 1, 0,252,246,123,126,185,115,112,179,224, 92, 0,209, 17,223, 91,153, 57,254,210,233,147,182,227,191,227, 93,191,249,
+209,223,251,200, 39, 63,246, 7,159,249,252,167,222,245,166, 95,122,228,137,111,239, 89, 59,212,153, 78,148, 26,186,101, 52, 82,
+237, 3,189,217,212,151,159,121,229,142, 93, 27,255,243, 87,127, 0,247,237,219,247,153,247,190, 99,226,204,225,153, 66,181,222,
+178,178,137,216, 45,251, 15,182, 13,110,255,253, 63,254,232,251,223,240,250,100,231,216,231,191,242,233,183,221,251,134, 71,158,
+126,100, 77, 79, 46,162,202,199, 39,231,243,117,189, 45, 17,107,180,236,133, 74,125,227, 96,247,171,211,139,247,239,219,142, 7,
+ 6, 6,107,243,231, 71,186,115, 55,220,246,246,171,118, 31,188, 56,113,124,114,118,182, 55, 33, 31,220,127, 75,104, 55,255,235,
+151,191,240,250,107,119,186, 86,237,243, 79,190,116, 96,243,168,227,133,231, 23,139,126, 24,182,108,215,116,253, 61,227, 67, 47,
+ 94,184,178,117,184, 23, 34,128,251,251,251,119,247,165,254,234,185,227,196, 41,202,110,113,124,100,124,108,112,136,250,102, 97,
+241,242,127,251,222,147,119,236,218, 24,211,228,201,165, 98, 87, 38, 25, 83,148, 66, 67,119, 60, 31, 2, 80, 55, 29,140,209,254,
+ 77, 99,211, 43,197, 84, 34,114,110,118,229,103,231, 39,127, 38,210,223,223,255, 51,187,180,255, 6,183,255,199,229, 55, 31,184,
+217,178, 90,185, 92, 71,119,123,214,116, 92,199,104, 60,118,110,246,216,197,153,159, 42,148, 60,252,201, 79,140, 15, 14, 60,241,
+196, 55,186,218,218, 54,108,220,121,230,204,145, 13,107, 55, 59, 70,201,176,108,221,118,115,137, 24, 36,248,238, 79,124,238,159,
+194,232,165, 47,253,229,244, 15,159, 24, 27, 93,251,213,111,124,241,117,175,255,149, 48,244, 37, 57,178,255,230,183, 4, 86,205,
+118, 61, 0, 64, 42, 26,161,130, 31,186,184,120,234,175,190,248,145,251,174,255, 7,247,194, 87,158,120, 58, 22,141, 87, 43,203,
+207, 60,241,245,119,188,243,163,207, 61,246,165,253, 55, 63, 8, 1,168,205,158,224,156, 65, 40, 66,198,101,130, 57, 23, 3,217,
+ 68,103, 71,255, 72, 71, 38, 70,216,241,233,165, 31,223, 37,153, 76, 18, 8, 64, 62, 63,123,244,200, 99,111,124,240,131,135, 30,
+251,226, 77,119,189,167,190,112,234,252,197,179,151, 87, 74,186,229, 38,163,218,193,205, 99, 94, 16,198, 35,234,124,185,246,244,
+195,127,181,161,191,115, 65,247,190,250,225,183, 70, 20,249,254, 63,254,210,223,129, 93,175,228,159,120,242, 91,239,122,215, 71,
+143, 62,243,213,253, 55,189,169,177,112,234,220,197,179, 39,166,230,127,245,193,135,124,171, 65, 67,119,185,184, 34, 4,136,198,
+146,107, 16,236, 74, 39,251,135,183, 40, 80, 52, 45,167,102, 90,219, 71,122, 79,207,174,188,246,213,124,125,249, 67,239,255,221,
+115, 71,190,213,223, 51,200,105, 48, 61,125,174, 80,215,111,191,106,231,215,159,124,178, 88, 41, 37, 53, 18, 81,148,116, 34, 6,
+145, 20,137,183,125,255,228,133,173,235, 54,133, 86,249,236,236, 50,198,104,169,166,127,229, 63,190,235, 43,207,190,146, 76, 38,
+201,111,188,247,195, 75,231,158, 70, 16,202,209, 84,126,113,162,175,119, 88, 38,248,255,249,238,227,119,239,217,188,126,124, 35,
+243,173,229, 98, 33, 17,141, 52,205, 86,103,188,125,109, 91,228,235,143,127, 31,169, 90, 58, 30,181, 61, 63, 34,161, 76,255,150,
+215, 12,146,250,118,161, 94,239,104,239,110, 20,103,122,135,182, 94,184, 60,241,153, 71, 95,120,207, 93,183,236,187,229,161,208,
+179,213,100, 23, 0, 16, 98, 41, 8, 67,206,195, 68, 44,122,250,210,229,172,140, 18, 17,213,241,131, 84, 84,107,149,174,188,253,
+142, 27, 34,170,138,230,166,142,119,164,226, 0,162,104,188,237, 11,223,250,218,127,127,236,197, 79,127,252,247,219,218,114, 78,
+179, 80,173,151,137, 18,185, 82,172, 72,106, 60, 30, 79, 57,122, 9, 99,180, 97,160,123,251,248, 24,130,208,245,195, 76, 60,106,
+ 27,101,219, 15, 30,216,187, 5, 69, 20, 57,150,236,248,225,145, 35, 31,253,243,175,228,107,205, 71,190,244, 77,163, 56, 21,107,
+235, 39,146, 58,149,175, 32, 44,215, 91,182, 20, 73,181,229,250,203, 13, 29, 2,209,221,150,140,168,154, 79,105, 72, 89,111, 91,
+186,229,122,203,243,115,150,227, 96,141,224,191,126,230,133,186, 97,126,241,191,126, 49, 11,154,169, 84, 54,150, 27,198,146,210,
+ 92, 58, 95,172, 85,199,214,110,115, 27, 75,129,239,228,186,135,167,102, 46, 2, 0,129, 16,221,237,237, 83,139, 75,134,237,110,
+ 26,238,157, 89, 41,247,182,165, 95, 93,105,160, 55,222,114,235,151,255,244,207,175,223, 58,238,181,170,219, 15,190, 73, 73,180,
+ 99,162,212,151,206,127,247,240,139,119,221,251,238,191,250,155, 63,223,125,245,173, 79,159, 56,237,182, 42, 16, 0,221,118, 8,
+198,129,107, 56, 94,208,150,136, 17, 4, 79, 76, 45,108, 31, 27,200,197, 85,220, 19,131,187,246, 92,183,110,227, 30, 44,169, 0,
+128,208, 53, 79,191,248,173, 23,207,156,127,195,157,247,217,122, 5,241,160,183,127,172, 35,138, 46, 77, 95,138, 71,180,229, 90,
+ 51, 25,141, 40, 4,207, 20, 42,125,237,153,249, 82,109,165,222,140,170,114,119,207, 32,122,215,187, 63,198,104,200,195,192,172,
+ 45,189,122,232,107, 95,123,248, 47, 46, 45,149,222,120,247, 27, 35,241,236,163,207, 62,126,245,245, 15,124,249,225, 47,244, 13,
+111,190,176, 80, 72, 69, 53,219,245, 17, 2,181,150, 37,132,104,152,246,241,169,249,109, 35,253,223,123,229,108,190, 92, 36,152,
+ 72, 87, 78,254, 96,114, 97,121,177,210,224,130,111, 30,236,217,119,203, 67,149,249,179,223,125,252,219,111,127,232,131,245,249,
+211,221,153,132,221, 92,129, 16,168,178,196,132,128, 16,150,155, 45, 47, 8, 23,202, 13, 1, 64, 34,162,190,243,230,189, 95, 63,
+ 49,141, 99, 94,254,212,212,124,205,180,134, 58,179,247,222,126,255,216,214,235,191,250,149, 79,121,142,126,219,173,111, 8,221,
+214, 23,190,253,205,187,246, 31,152, 95,154,145, 8,110, 79,196, 22,203,245, 76, 44, 58, 87,170,214, 90,182,110,217,155, 6,123,
+158, 59,115,121,172,183,195,164,128, 84,117,115,188,175,235,192,190, 27, 82, 61,235,106,243,103,126,247,119,126,237,125,183, 31,
+232, 27,219,197,104,112,254,244,225, 92, 42, 14, 32,156,201, 87,214,247,119, 59,126, 16,143,168,110, 16,150,155,166, 23,132,189,
+217,180, 31,134, 31,126,221,141, 95,126,230, 21,143, 68,240, 87,254,232, 79, 54,237,184, 33,112,244,223,255, 47,159,172,215, 75,
+111,191,237,186,182,174,113,206,194,102,225,210,215, 15,159,184,121,219,122, 25,179,195,231,166,215,245,119, 26,182,235,133, 84,
+183,157,138, 97, 14,230, 50,170, 44,133,140,127,237,249, 19,215,111, 29, 47,152, 62, 41,207,157,254,220,163,207, 18,130,223,124,
+112, 87, 54,221, 38, 41,113,175, 85, 9, 28,253,229,139, 51,157,233,132, 34, 19,199,245,170,134,233, 5, 97,195,114,108,215, 91,
+172,212, 1, 0, 23,230, 11,111,189,126,247,159,124,243,169,157,227,131, 83, 43,101,195,161,224,231, 42,174,245,245,245, 33,240,
+243, 36, 16,194,159, 47,133,254,209, 48,251,211, 72, 60, 26,237,200,102, 60,223,175, 53, 13,207,247,255, 61, 20, 74,197,163,227,
+189,221,123, 55,173,223, 58, 58,176, 60, 63, 93, 54,204,145,174,206,241,241,141, 90, 36, 90, 89,156,172,234, 58, 7, 80,194, 88,
+ 34, 24, 33, 8, 0,144, 16,146, 84,173,166, 27, 61,233,196,167, 31,127,229,185,179,147,255, 90,133,246,110,218,240,217,143,255,
+158, 42,203, 0, 34, 38,248,228,233,231,143,156, 57,221,169,134,235,199, 54,111,223,178,239,242,153,167,106,186,193,237,122,170,
+123, 40, 22, 73,140, 64,232,181, 42,158, 89, 11, 66,159,113, 46,132, 16, 2,248, 97,232,121,254,229, 66,237,147,191,252,208,199,
+133, 36, 67,254,171,255,229, 51,103,175, 44,254, 11,204,104,255,254,253,175,188,124,100,250,177,167,152, 0, 0, 8, 30,250,165,
+106,233,240,179,223, 14, 66,118,215, 77,119,100,122,215, 45, 79, 60, 63, 53, 55,215,209,150, 94,191,231, 46, 8,145,224,212,110,
+228,125,179,230,219, 77, 63,240,130,144, 50,193,129, 16,171,185,145, 16, 64, 8, 1, 17,172,232,102, 58,215, 23,248,238,150, 77,
+187,207,157,124,246,242, 74,241,107, 47,158, 93,172, 52,254,217,228, 17,238,219,183,239, 47,127,235,119, 5, 0, 60,244,107,245,
+210, 51, 79,125, 43,162, 41,119,223,243, 78,162,198,102, 78, 62,178, 84,170,140,141,140,245,174,189, 6, 64,104, 22,103,170,249,
+201,134,105, 25,182,235,248, 1,227, 66, 38, 56, 19,143,102, 98,209, 90,203, 84, 37, 41,162,202, 16, 66,198,185,235,135, 0, 0,
+130, 81,153, 70,218, 53,220,219,209,121,228,213, 99,142,231,185, 1,189, 97,219,134, 88, 42,247,240, 51,207,127,250,209,195,255,
+160, 66, 4, 0,192, 67,207,104, 53,159,124,242, 97, 32,224,253,247, 61,164, 37,218,151, 47, 60,187,144,207,119,182,103,111,184,
+235,221,212,119,234,243,167,138,133,249, 82,179, 85,105,182,202,122,171,105, 57,189,109,169,173,107,250,101, 73,210, 77,235,114,
+179,133, 16, 94,215,151, 56,117,101,105,219, 72, 95, 68, 83, 35,178, 84,183,156, 83, 51, 75,227,189,185,190, 53, 59, 95, 58,243,
+234,174,177,129,199, 79, 92,112,131, 48, 95,173,105,134,177,101,160,227, 77,215,110, 63,116, 97,166,172,155, 63,153,241,245,247,
+ 15,196,173,197,103, 94, 60,116,243,213, 87, 95,115,227, 27,205,242,236,196,233,231, 28,215,217,180,237, 96, 91,207,186, 86,105,
+186, 48,115, 98, 33,191, 60,181, 82,158, 43, 85,239,186,238,134,157, 27, 55,247, 38, 72, 44,162, 6,148,105,146,212,219,158,109,
+ 79,197,251, 58,115,150,235, 14,118,100, 95,186, 48,179,118,120, 68,139,103,163,138,148,212,200,153,197,210,145, 51,103,223,118,
+223,155, 31, 59,118,124,251, 96,103,169,217,210, 29, 87,149,164,134,233,184,126, 16,137, 37,100,140,220, 32, 8, 40,251, 81,230,
+136, 7, 6, 6, 7,163,240,237, 15,125, 80,139, 36,102,207, 60,185, 92, 88,206, 37,147, 3, 99,187, 89,232, 54,151,207,231, 11,
+ 75,147,203,165,206,246,220,190,189, 55,117, 68,196,209,243,231,159,120,229,216,217,249,149, 84, 44,210,221,150,210, 20, 89, 0,
+161,169,145,114,189,214,217,209, 11, 68,216,178,157,116, 60, 18, 75,247, 64,132, 17,247, 10,117,253,234,209, 62,195,118,214,247,
+245, 44, 23, 86,178,169,120,189,101,123, 97, 24,132,204,114,253, 66,165,250,241, 7,111,255,200, 59,127,117, 93, 6, 62,121,250,
+242,107, 10,245,247,247,253,230,187,126,189,190,120,110,230,242,171, 1,101,189,185,246, 88,166,199, 51, 10,205,234,114,205, 48,
+135,215,108,234,239,232, 40,151, 11,143,191,248,226, 19, 39, 47,204, 20,202,239,184,233,154,215,221,241,230,177,241, 45,241,120,
+ 74,139,165,180, 72, 66, 82, 98,181,122, 89, 38, 88, 34, 36, 12, 41, 23,188,173, 99,128,135,190,103,213, 33,224,213, 16,125,237,
+169,231,239,187,229,174, 67,211,115,221, 17, 34, 0, 48,108, 47,160,204,241,125, 8,192,114,181,177, 99,195,198,182, 88,244,200,
+204, 98, 67,215,147,201, 36, 1, 0,174, 92,124,174,212,208, 53, 89,206, 36, 98, 16, 97, 79,207, 43,241, 92, 46,217, 21,204, 95,
+120,242,240,179,147,203,197,217, 98, 85, 0,240,169, 15,188,191,103,108,183,107,148, 2, 91, 23, 62, 44, 45, 77,196, 19,217,120,
+ 91, 47, 0, 80,183,221,100,130,105, 90, 36,164, 52,142, 99, 8,162,208, 51,109, 63,148, 8,169,186,114, 91, 76, 97,190,185,187,
+175,189, 92, 46, 40, 68, 2, 0,184,126,192, 24, 79,198,180,206,116, 66, 47, 94,246,252, 96,207,248,208, 95,254,250, 91, 30, 62,
+114,138, 0, 8,116,211, 76,199, 34,209,104, 92,141,102, 33, 66,115,115, 23, 79, 30, 59, 63, 91,172, 20,155,173,154, 97,255,218,
+189, 55,125,226,183,254, 36,240,204,250,220, 73,163,112,153, 40, 49, 73,141, 7,174, 81,110, 26,138, 26,195,146,194, 89, 56, 83,
+168,172, 31, 93,171,198, 50,249,250,233, 53,107, 54, 8, 1, 26,245,162,227, 5, 16,161,249,133,197,209,238, 92,169,180,210,145,
+201,190, 58,113,169, 43, 19,103,140,121, 97, 8, 32,232, 72, 37,134, 58,219, 60,207,189,180, 84, 90,206,231,213, 68,103, 38,153,
+ 32, 0, 0, 85,150, 45,215, 63, 54, 57,119,118,110,165,106, 88,182,231,165,162,218,239,188,235,237,107, 54, 95,103, 84,230,243,
+211,199,244,252, 37, 53,222,158, 29,218, 9, 17,226, 92,132,142,145,159,191, 48, 91,168,109,223,117, 35, 38,202,197,179, 71,162,
+138, 76, 0, 15,104,216,114,188, 68,186,211,110,230,203,186,169,201,178,224,162, 94, 92,222,213,181, 54, 95, 42,172, 31, 25, 91,
+210,173,100, 84, 13, 25,103, 92,196, 53,173, 63,151, 73, 69,163,249,154,113,116,114, 46, 78, 96,232,181, 46,204, 45, 18, 8,225,
+ 31,126,227, 9,207, 15,118,142,141,124,236,189,239,239, 26,220, 88, 93,158,188,116,238, 69,238,181,236,250,114, 36,158, 29,219,
+117, 15,132, 16, 64, 8,132, 96,161,111, 85,166, 39, 38,207,158,155, 91,190,255,134, 27,181,120,182,190, 50,249,216,137,179, 31,
+120,240,173,146, 18,121,236,233,239, 31,216,182, 25, 66,124,249,202, 37, 63, 8,219, 19,177,124, 93, 39, 8,200,132, 52, 91, 6,
+ 11,157,134,233, 58,158,207,133,208,100,169,175, 61,149,137, 71,117,203, 57,122,121,182, 97,218,111,189, 97,207,169,115,167,154,
+ 46, 37,130,243, 79,125,232,131, 47, 30,125,161,101,219,161,211, 12,156, 86,166,107,100, 95,215,168, 0, 2, 10, 46,128,128, 0,
+114,198,188, 86,181, 52,119,106,102, 57,191, 80,174, 43, 18,121,247, 91,222,171, 37,218,207,190,242,189,111, 29, 62,246,145,135,
+ 30,210,146, 29, 19,103, 14, 83,206,251, 71,182, 45, 76,159,200,215,140,206, 76, 66, 83,164,186,105,199, 53, 5, 99,100,153,190,
+107, 27,182,169,187, 65, 90,147,165,100, 68,107,139,199,116,211, 57, 49,179,176, 80,174,109, 29,233,147, 9,254,204,163,135,111,
+221,127, 13, 1, 0,116, 12,111,187,171, 99,152,115, 38, 41, 17, 8, 32,167, 33, 0, 64, 8, 17,122, 86,171,124, 37,191, 60,179,
+ 84,109, 54, 76,155, 50, 30,211,212, 7,110,185,173,109,112,155, 85, 95,254,196,255,249,219,107,251, 58,254,224, 99,159,228,140,
+206,156,126,250,229, 11, 23,223,253,134,183,185,102,229,232,197,169,100, 52,146,138, 70,132, 16,134,237,166, 98, 81, 4,145,237,
+ 5, 13,203, 25,238,204, 81,198,219,227,209,152,170,228,235,250,197,197,124,185,105,118,183,165,214,246,118,126,251,165, 83,183,
+237, 88, 31,141, 37, 8, 0,128,250,142,172,197, 25, 13,252, 86,213,170, 45,214,106,249,170,222,170, 25, 86,211,114,252, 48,148,
+ 8, 73,199, 34,187,215,174, 89,179,229, 6, 37,150,182,170,243,127,242,167,191,155,142,105,191,254,214,135, 82,157, 99,161,103,
+ 94, 58,245,212, 83,167, 38,222,113,231,237, 2,136,243, 19,167,203, 77,115,164,171, 61, 17, 81,253,144,250, 33, 77,104, 42, 66,
+160,229,184, 85,221,204, 38, 99,148,178,154, 97,205,151,106,197,134, 97, 58, 94, 54, 25,223, 58,210,251,242,165, 89,198,193, 45,
+187,183,126,244,235,207, 16, 0,225,212,201, 31, 46, 87,107, 13,211,105, 57,158,227,249,148,113,140, 81, 50,170,245,182,167,199,
+250,122,122,198,175, 81,162,105, 26,216,103, 95,121,244, 27,135,143,239, 93, 63,252,142, 59,111, 75,245,172, 7, 16,154,181,133,
+ 51,167, 95, 56, 50, 49,251,198,131,187,181,120,123,101,249,226,201,153,133,246, 84, 44,174, 41, 16,130,128, 50, 8,128, 44, 17,
+ 33, 64,195,116,138, 77,195, 15, 67,203,245, 77,199, 51, 93, 47,160,180, 35,157,216, 56,216,115,118,118,185, 97,218, 31,121,221,
+ 77,191,241, 23,223, 72,229, 58, 9, 4,240,145, 99,103, 41,101, 4,163,100, 68, 27,236,108, 27,234,204, 13, 14,111,138,117,172,
+193,146, 66, 61,115,234,244, 51,223,121,241,132, 34,227,235, 55,143,255,198, 91, 30,136,182, 13, 34, 73,166,158,101,148,103,142,
+158,159,184,184, 84,184,115,247,166, 76,174,207, 53,138, 51, 43,165,169,229,210, 59,110,218,139, 17,246, 67, 22, 82, 26, 85,101,
+199,243, 41, 99, 65, 72,139,141, 86, 64,169,229,250, 94, 16, 74, 4,247,182,167, 7,114,109, 39,166, 22, 34,138,244,161,251,110,
+252,240,231,190,181,105,176,135,171, 26, 1, 64,108, 25,234, 25,238,238,232, 26,218, 22,205,246, 98, 44,115,206,172,202,236,115,
+ 79,124,229,153, 83,151,100, 9, 31,220, 60,246,208, 77, 87,199, 51,189, 82, 36,133, 16,230, 52,240,204,106, 57, 63,125,228,226,
+108,190,166, 95,191,117,188, 51,147,161,158, 85,175, 87,102, 11, 85,140, 80, 50,170, 9, 33, 44,215, 11, 66, 26,215,180,211,115,
+249, 92, 58,209,145, 78, 20,234,186, 42, 75,132,224,222, 68,180,171, 45,233,250,225, 15,143,159,191,123,207,230,181,253, 93,255,
+225,243,223,222, 61, 62,136, 32, 88, 48, 45,184,111,223,190,175,252,206,127, 10,125, 71, 47,205,156, 57,115,236,217,179,151, 27,
+150,179,174,175,107,247,248, 64,111, 54, 19,137,103,137, 26, 67,136, 8, 33, 4, 11, 25,243,125,187,185, 82,174, 30,185,116,165,
+105, 57,123,215,141,172,233,105,215, 36,137, 11, 49, 95,170, 61,121,234, 82, 79, 91,242,218,141,163,148,241,186,105, 11, 33,116,
+203,157, 43, 85, 49, 70,130, 11,219, 11, 48, 70, 9, 77,173,155,246,114,181,177,101,184,247, 45,183,220,244,190, 63,253,239,227,
+189, 29,233, 88,164,218, 50, 21, 34, 45,152, 20, 94,123,237,181,221, 42,208, 45, 71, 8,144,142, 71,218,147, 49, 85,150, 36,140,
+ 49, 66, 24, 65,136, 32,132, 16, 8, 32,132, 16, 66, 80,206, 77,215, 91,169,234,110, 16,116,166,147,109,137,168, 34, 73, 16, 0,
+ 46, 68,173,101, 93, 41, 84,134, 58,218, 18, 81,141, 49,238, 7,212, 9,130,128, 50, 63,164,140,115,130, 80, 68,149, 37,140,163,
+170,162, 72,100, 58, 95, 94,170, 52, 18, 17,173, 35, 29,135, 0, 58, 65, 96,187,190, 19,132, 72,214,126,206,250,141,171,181,217,
+207,143, 50,251,247,239, 71, 16,194,159, 43,128,126,238, 10,197, 95, 40,244,191,157, 66,255,147,181, 61, 66,168,163, 45, 19,213,
+ 84,211,118, 42,141,166, 16,226,127,129, 66,191,116,243, 53,217,152, 26, 4, 62,163, 44, 26, 81,179,185,238,184, 42, 1,192, 3,
+202, 77,215,119,109, 51, 34,145,186, 19,252,233,119,158,254, 87,117,100,250,251,251,151,150,150,254,193,191,141,116,119,174, 27,
+232, 57,176,125,115,123, 84, 58,115,241, 98, 84, 85,214,142,172,233, 31, 26,243,244,242,202,202,130, 19, 80,140,144, 44, 17,130,
+208,234,144, 65, 85, 36,135, 33, 30,122, 4, 75,239,251,236,195, 94, 16,254, 79,248,161,159, 84, 8, 66,120,235,213,187,255,175,
+ 15,126, 32,240, 28, 73,139, 79, 77, 28,123,249,204,233,120, 68,185,110,239,117, 74,162,189, 54,119,186, 80,171, 69, 20,185,167,
+179, 43, 18,207,122,102,205,117, 77, 47, 8,253,144, 58,126,192, 1, 72,104, 74, 66, 83,141, 64,116,165, 19,255,241,139,223, 57,
+ 57, 53,255, 47, 85,232,239, 29,217,215,255,240,147,219, 55,110,102,148, 34,140, 77, 55,120,252,145,175, 52, 77,231,134, 61,187,
+251,198,118,183,202,211, 19, 39,159, 81, 37,188,109,219, 53, 88, 82, 17,198,161,103, 33,140, 9,198,138, 4,100, 66, 98,170,194,
+ 4,215, 45,247,236, 92,254,134, 29, 91, 45,138, 63,247, 91, 31,125,250,133,167, 63,250,151,223,253, 23,233,132,147,201,164, 97,
+ 24,183,238,189,250,169,207,125,169, 51,215,137, 16, 22, 0, 44, 94, 57,247,216, 83,223,141,200,210, 3,247,190, 53,215, 59, 62,
+115,250,169,217,197,185,193,222,254,177,173, 55,202,145, 4, 66,200,170,206,155,245, 37,219,177,221, 32, 12, 41, 11, 25,163,156,
+ 11, 14, 20, 73,234, 72,197, 95,188, 56,189, 97,116,124,126,101,225,154, 61, 7, 55,117, 72,133,134, 81,106,154, 63,141, 54, 3,
+ 3, 3, 56,158, 72,124,242, 87,222,251,193,183,191, 71, 8, 1,132, 96,140, 77,158,121,238,208,177, 87,214,246,117,221,126,223,
+ 47, 3, 32, 94,125,241, 59, 45,219,217,177, 99,127,186,115, 77, 36,209,230, 91,186,171,151,104, 96,115, 22,114,206,129, 0, 0,
+ 10, 4, 17,130, 16, 64, 40,128, 64, 16,118,167, 19, 63, 60,113,250,182,107,111, 40,149,151,134,122,250, 24,243, 71, 59, 82,103,
+231, 11, 63,149, 66,191,243,190,247,221,117,221,205, 16, 64, 22, 58,182,239, 79, 28,127,236,228,197, 75,123, 55,174,187,234,198,
+ 7,237,198,202,169,163,143,115, 33,174, 62,112,191,146,200, 74,178,106, 86,230,173,234,156,103,213, 24, 13, 48, 66, 24, 33,159,
+ 82,198, 56, 66, 16, 33,136, 33, 4, 0,112, 1, 16,134, 93,137,216,197, 98,133, 7,110,103,174, 59,180, 42, 16,192,117, 61,185,
+249,170,225,250,193, 63,173, 16,145,101, 21, 2, 16, 56,134, 29,210,133,137, 23,206,205,204,238,223,190,109,253, 85,119,183, 10,
+ 83,231, 78,191,128, 17,220,117,240,141,152,200,161,107,214,150,206, 85,107, 37,221,118, 77,199, 11, 40,133, 16,198, 53, 53,155,
+140, 97,140,116,219, 77, 70, 53,153, 96, 4, 1, 23,212,241,130,152,166,158,157,156,189,254,254,183, 28,122,229,185,205,253,189,
+199,175, 20,210, 81,245,147,111,185,117,243,186, 77,181,122,233, 61,159,254, 90,185, 97,252, 99,126, 72, 4,158, 25,114,176, 50,
+249,202,201,139,147,251, 54,111, 88,191,231,174, 86,233,202,196,185,151, 48, 70, 59,174,125, 29,150, 20, 79, 47, 87, 22, 78,151,
+234,141,170, 97,214, 12,203,176, 61, 55, 8, 1, 16,154, 34,199, 84,121,164, 59,151,141, 71,139,205, 86,111,123, 90, 38, 24, 66,
+232, 7, 97,177,174,239, 30,237,155, 93,156,209,180,184, 68, 72, 86, 35, 30, 7,166,235, 89, 70, 37,166, 42,239,190, 97,207,167,
+126,112,200,255,135,252, 2, 18, 52, 4,144,228,167,143, 29, 57,123,118,215,248,200,250,171,238,177,170, 11,211, 23,142,112, 1,
+ 54,239,188,153,200, 17,183, 81, 40,207,159, 44,212,234,133,134,145,175,233, 75,213,166,233,122,219, 71,251,111,220,190,254,154,
+245,195,185,100,194,114,253,154,233, 68, 21,217,176, 29,140,145, 42, 75,137,168,102,121, 1, 68,240,225,231, 94,188,122,203,142,
+211, 87,230, 55, 12,245, 94,154, 95,145, 8, 46, 55,154,165, 90, 45,161,201,155,122,115,255, 8,101, 2,128,234,202,229, 39, 95,
+121,101,235,112,255,182,253,175,119, 91,149,185, 75, 47,187, 65,176,118,124,179,150,204,186,122,177,190,116,174,210, 52,106,134,
+ 89,106, 24,134,237,188,245,142, 59,114,237,221,190, 99,112,234,115, 78,123,218, 29,195, 50, 13,219,201,196,163, 71, 39,231,186,
+210, 41, 69, 75, 96,226, 12,119,102,127,112,244,252,166,238,172,128,168,233,120, 35,237,137,181,125,157, 11,165,122, 50,170, 57,
+126,232,248, 65, 42,149,138,170, 85,219,251, 73,147,194, 7,182,109, 62,122,244, 80,127, 46,115,227,237, 15, 81,223, 93,186,116,
+184,209,178,122, 59, 58,115, 67,219,125,171,161, 23, 46, 85,155,205,138,222,154, 47,213,251, 59,178,111,126,221,219, 60, 61, 63,
+115,101, 34, 95,204, 27,173,166, 4, 25, 70, 0, 33,168, 41,178, 23,132,140,115, 85,150, 18,169, 14, 72,100,196, 3,211,245,182,
+ 12,245, 46,234,206,250,190, 30,219,210, 9, 70,203,181,102, 34,162,113, 33, 12,219,169, 54,154, 7,182,172,203,215,117,203,245,
+255,222, 45, 75, 68, 72, 71, 76,190,255,158,183, 33, 34,151,166,143,148, 26,205, 84, 84,235, 94,179,147, 83,223, 44, 95,169, 55,
+106,165,102,107,182, 84,187, 99,223,190,117,235,182, 77,156,123,225,204,149,249,201,229,178,238,122, 50,193, 8,193,168, 34,187,
+ 65, 16,141,196,161, 96,201,104,116,169, 92,235,237, 25,192, 88, 18, 44, 64,128,122, 76, 28,191, 52,189,127,231,213, 39, 46, 78,
+180,199, 34, 45,199, 93,173, 66, 45,215,111, 57,222, 64, 71,219,111,191,245, 13,215,142,119,253,240,228,165,213,240, 60, 48, 48,
+128, 16,130,247, 92,127,163, 18, 75, 55,150,206, 21,107, 53,153,144,142,174, 97,193,153, 93, 95, 54,140, 90,213,176, 12,219,121,
+203,221, 15,196, 99,241,147, 39, 15,159,156, 90, 60, 63,183,130, 16,220, 60,208, 61,210,149,205,196,162, 16, 65,130,137,227, 58,
+178, 68, 18,137,100,205,180, 33,194, 88, 82, 48,145,227,154, 54,103, 50,221,178,177,164, 22,124, 44, 17,156,142, 71,188, 32, 92,
+197,146, 96,124,105,177, 16, 73,230, 70,215,108,220, 56, 50,240,119, 54,180,113,104, 32, 55,184,213,172,204, 23,139, 11, 66,136,
+246, 84,146, 40, 49,175, 85,182,244, 98,195,180,101, 66,110,189,241,222, 86,101,246,204,212,212,249,249,252, 98,165,177,121,168,
+231,142,221, 91,163,201,118, 8, 4,103,129, 96,161, 26, 81,150,242, 11,241,142, 78, 34,105, 33,101, 16, 66,136, 8, 0, 0, 99,
+164, 51,220,166, 32,192,130,181,109, 90, 64,105, 84, 85, 12,219,245,130,112,213,117, 45,149, 27,190,221,136,166,186,118,141, 15,
+157,155,121, 45,234,145,100,110,208,183, 27,229,165,139,174, 31,166,162, 17, 45,214, 22,184,134,219,170, 52, 45, 55,155,206,180,
+247,140,151, 23,206,158,157, 93, 60, 63,151, 95,172, 54,118,141, 14,188,249,182, 59,162,217,129,208,179, 66,215,192, 92, 19, 60,
+ 20, 0,218, 94,136,176,140, 37, 25, 10, 0, 32,130, 8, 9, 78,185, 16, 65,171, 49,146,203, 52,235,133,117,189, 61,167, 47, 79,
+ 70, 85, 89,194, 56,160, 44,228, 12, 1, 24,215,148, 90,181,208,147,232,232, 80,209,143, 93,123, 70, 27, 43, 19,186,101,171,178,
+ 20,143,197, 4,167,190, 89,245, 2,191,175,111, 52,211,222, 55,123,249,228,209,201, 43, 39,166, 22,166,243,229, 61, 99, 3,239,
+124,243, 47,101, 6,183, 65, 68, 2,215,240,173, 6, 34, 50,146, 34, 68, 82,108,207, 23, 0, 64, 36, 65, 4, 16,194, 0, 64, 26,
+250,156,113,230,218,201,168,118,105,118, 54,158,238,104,134, 16, 65, 68, 8, 9, 41, 99, 76, 64, 8,147, 81,173,214,172, 83,223,
+138,170,210,103,223,251,186,119,222,188, 87, 0,128,124,171, 94,111,212, 32,130,241,136,138, 16, 14, 61, 19, 73,114,231,192,230,
+ 48,112,206,156, 63,241,194,133,233,227,151, 23,166,242,229, 91,118,110,124,239,187, 62,162,165,186, 91,197, 25,175, 85,229,161,
+ 95,174, 20, 32, 34, 88,146, 57, 99,126, 24, 0,193, 1, 68, 64, 0,132,136, 16,220, 15, 60, 46, 4, 15,125,130,209,196,220, 2,
+ 38,170,225, 6, 66, 8, 12, 33,227,156, 49, 6, 17, 76, 69, 53,132,144,111,214, 60, 63,236, 72,167, 94,127,205, 86, 33, 4,113,
+109, 35,136, 68,162,138,162,200, 18,132, 68, 75,182, 35, 73, 93,153, 63,119,106,122,113,186, 80, 89, 40,215,155,166,253,177, 55,
+221,121,237,205,111,243,172,134, 85,152,146, 35,105,136,144,224,172,222,178,135, 17,130,136,184,142, 73,185, 96, 52,100,212, 71,
+ 8, 1,132,121,224,120, 65,200,185, 16,140,114,206, 11,181, 6,128,130,200, 50,227, 28, 66,192, 56,167, 92, 16,132, 50,241,168,
+ 76,136,107,213,171,134, 25,112,212,215, 53, 6,192, 5, 18, 50,166, 74,114, 76, 83,101, 45, 35,107, 73,203, 40,189,122,105,114,
+ 98,161,176, 82,107,150,155,173,182, 68,228,107,127,244,199,233,238,177,210,228, 97, 76, 20, 53,145, 69, 68,225,140,249,110,203,
+246,124,132, 37, 8,209,114,113, 69,147, 36,193,169, 99,183, 52, 89, 66, 8,133,142,238, 5, 20, 33, 8, 32, 98, 0,184,126, 32,
+ 56,143,104,145,144,185, 92, 8,202, 57, 19, 76, 37, 82, 38, 30,149, 8, 54,108,183,172,155, 45,207, 67,152,172, 78, 72, 80, 60,
+162,170,209, 52,103,225,153,179, 71, 95,185, 60,183, 82,211, 27,166,237, 5,225, 7, 30,184,235,166,219,223,106,233,229,217,227,
+223, 76,119,172, 81, 98,109,136,200, 0, 0, 26,120,245,102, 29, 35,184,250,241,202, 74,126,176,179, 3, 17,165, 82,175,167, 19,
+113, 0,161,221,106,120, 33,141, 42,114, 64,169, 16, 64, 0,193, 89,152,136, 70,124,195,228,140,115,206,129,128, 81, 85, 73, 69,
+ 53, 4, 97,177,217,106, 88, 14, 11, 2,223,105, 1, 0, 8, 4,192,241,131, 43,133,203, 39,167, 23,230, 75, 53,195,241,130,144,
+222,182,107,211,187,222,241, 97, 36,201, 83,199,191, 31,139, 68,115,131, 59,136, 22, 67, 8, 67,128, 24, 13,124,179,182, 88,169,
+119,183,181, 33,132, 57, 11, 75,205,214,238, 13,235,212, 88,118, 97,226,210,248,208, 16, 16, 64,183, 90,140, 49,130,145,227,249,
+ 2, 0,140, 16,103,129, 36,168,233, 7, 84, 8, 38,196, 42, 10, 81, 77, 9, 40, 91,174, 53, 29, 63, 76,197, 35,133,252, 44, 4,
+144,204, 20, 42, 51, 87,102, 42,186,105,185,126, 64,233, 27, 14,236,190,239,117,239,210,162,201, 43,167,159,246,237, 70,247,240,
+ 86, 53,158, 69, 68,134, 16, 1, 8, 5,167,161,103,230,243, 87, 10,117,227,234, 29,123, 33,150,234, 43,147,148,241,246,142,126,
+ 34,199,138, 13,253,224,213,125, 52,244,154,150, 3, 33, 36, 24,121, 65, 8, 1,148, 8,102, 65, 0,104,224,248, 62, 68, 8, 10,
+ 40,203, 56, 29,139, 40,132, 24,142,187, 92,109, 42, 18, 73, 69,213,195,231,167, 0, 4,164,172,155, 78,163, 30, 83,200,187,239,
+185,227,166,155,239,103,140, 93, 62,115,216,104,228,199,214,110,143,143,237,194,146, 2, 33, 18, 64, 64, 8, 5,231,190, 99, 22,
+231,207, 94, 92, 40,100,227,209,116,215,168, 16,224,240,171, 39,187, 51,113, 46,160, 99,214, 4, 16,106, 60,219,200, 95,118,188,
+ 32, 25,213, 16,132, 94, 16, 34, 4,101,140,105,232,176,192,117,252, 80,149,101,140, 97, 92, 85,226,154,202, 5, 47, 54,140,154,
+ 97, 14,230, 50, 64,136, 99,147,115,160,125,128,236, 24, 31,121,251,109, 31,140,101,251,141,234,242,147,143,124,129, 32,178,125,
+219, 85, 99,155,247, 97, 73, 1, 16, 9,193, 1,128, 8, 2, 78,169,107, 84, 86,102,142, 95,152,207,215, 76,235,193, 59,239,193,
+146, 82,156, 59, 55,185, 88,252,181, 7, 31,148,213,232,233, 51,175,140,247,118, 1, 1, 11,165, 60,101, 92, 38,132, 11, 17, 80,
+134, 32,196, 24,211,192,133,140, 57,126,160,200,178, 66,164,100, 52, 34, 75,164,229,248,139,149,134, 31,210,209,158,142,138,110,
+186, 94,168, 10, 64,186,187,135, 39, 47, 30, 63,121,233, 43, 27, 6,122,175, 61,112,175,150,104, 71, 8,115, 8,225,107,131, 75,
+ 4, 32,160,190,211, 42,205,204,205, 78, 92, 41, 84,203,122,235,186,173,235,219,250, 55, 81, 71,255,203,239,125,119,211, 80, 79,
+ 58, 55, 40,168,119,126, 33,255,224,109,119,178,208, 89,169,235, 24, 35, 85, 38,140,243,144,177,213,179, 11, 66, 31, 33,232,248,
+ 97, 38, 46,162,170, 28,143, 40,140,243,149,106,179,212, 48, 52, 69,238,202, 36,206,206, 46, 15,119,101,243, 64,160, 87, 78,190,
+236, 5,244, 61,239,248,192,129,219,223,169, 37, 59, 0,128, 92,112,193,168,224, 92, 8,192, 89, 96, 85, 23,230,207, 61,243,234,
+217,227,151, 22,139, 13,211,218, 61, 62,180,105,239,189, 64,240,111,127,247, 43, 4,163,123,238,122, 11, 38,100,110,234, 85, 77,
+150,226,233, 92,171,158,111, 90,142, 68,176, 42, 75,148,113,198, 56,132, 16, 35,228, 7, 20, 0, 24, 80,138, 49,138,105,170,132,
+113,211,180,231, 74, 85,219, 11,186,210, 9,140,208,153,217,229,155,119,108, 0, 0,144,253,251,111,217,187,123,143,239,180, 4,
+180, 48,145,132, 0, 16, 8, 1, 32, 99,129,171,151,107,203, 19,139,165, 74,169, 97,152,158,255, 66,154,160, 0, 0, 32, 0, 73,
+ 68, 65, 84, 15, 33,216, 53, 62,180,227,218, 7, 32,196, 47, 61,253,213, 75, 75,133,247,189,238, 94, 37,154,242,205,218, 11,103,
+207,239, 30, 31,134, 8,231,139,139, 1,101, 10, 33, 4,227,144,113, 14, 4,130, 16, 99,228, 5, 33,231, 28, 35,132, 33,146, 9,
+118,253, 96,161,210, 44,235, 45,140, 96, 95,123,166,164,155,134,227,142,244,246,130,179, 43,132,134, 1, 0, 64,137,196, 0, 64,
+ 64,112,193,194,192,179,157,198,114,181, 52, 95,168, 55,203, 77,211,116, 61, 0, 64, 76,147,119,140,141,174,217,126, 51, 34,234,
+185,151,191,251,196,137,243, 15,222,112, 77,207,218,171,169,239, 92,185,120,212,246,130,145,145,205,212,179, 22, 43, 13, 9, 33,
+ 69,150, 16,132,140, 50, 40, 0, 4,128, 32,100,251, 65,200, 89, 92, 83,184, 16,142, 31,180, 28,119,169, 82,247, 2,218,145, 74,
+164, 98,145, 87, 46,205,110, 28,232, 90,101,126, 19, 40, 24,132, 16, 32, 41,116, 90, 78,179,160, 87, 23,106,141, 90,213, 48,235,
+134,109,186, 62, 7, 34,166,202, 61,109,169, 45,155,118,103, 7, 54, 3, 0, 78,189,240,205,111,189,112,236,254,107,182,173,219,
+117, 27, 11,125,171,190,116,100,226,242,198,129,110, 89,139,235,165,153,124,205,200,165, 98, 42, 33, 2, 8,202,249,106, 79, 4,
+ 35,104,187,126, 16, 50, 85,150, 28, 63,108, 57,110,181,101,233,150,131, 49,234,201, 38,221, 32,156, 43, 86,223,127,247,117, 47,
+159,191,128, 32, 36, 88,214, 56, 13,106,139,231,170,165,249,138, 97, 53, 76, 71,183, 29,215, 11, 56, 16,154, 44,119,167,226,227,
+253, 61, 67, 27,246, 43,241,182,208, 49,159,125,242,107, 47, 93,156,121, 96,223,142, 77,187,110, 1,156, 7,142, 62, 53,121, 74,
+183,157, 13,195, 59, 57,163,213, 70,173,214, 50,199,122,114,178, 68, 24,227,156, 11, 8,161, 0,128, 96,220,114,220, 32,164, 92,
+ 0,211,117,109, 47,104,154, 54,227, 60, 27,143,101,147,241, 75,139,133, 76, 34, 54,144,107,251,244, 35,135,226,253, 99,196, 40,
+205, 28, 63, 52, 93, 49, 44,195,118, 45,215,243, 66, 10, 4, 80, 21, 41,151,136, 14,117,180,141,142,239, 72,118,143, 35, 68,154,
+ 43,147,127,243,200,183, 13,199,123,227,129, 93, 35,235,174,193,146, 28,250, 86,125,229,210,241,203,243,163,221, 29,241,116, 87,
+232,181, 42, 77,195,241,195, 68, 68, 37, 4,211,213, 0, 1, 0, 16,130, 96,100,216,110,200, 88,200,168,237, 5,166,235, 5,148,
+169,178,212,211,150, 10, 41,155, 90, 41,191,241,192,206, 83, 87, 22, 35, 50, 17, 0,144,185,124,209, 36,204,241,195,128, 82, 0,
+128,166, 72,217,120,172, 63,151, 30, 25, 28,109, 31,220, 74,212, 56, 11,220,139,175, 62,250,240,161,151,251,219, 51,247,237,221,
+218, 51,180, 85,210,162, 52,240,236,250,242,133, 43, 87, 12,199,189, 97,235, 90,132,136,109,148,202,134,137, 17,210, 20, 25, 67,
+ 24, 80, 10,128,128, 16, 50, 33,100,130,155,150, 11, 33,244, 2,234, 5, 65, 16, 50,140, 80, 54, 17,203, 38, 99, 19, 11,133,182,
+ 68,116,195, 64,215,199,190,244,253, 53,221,217,138, 0,196,114, 61, 2, 67, 46, 68, 68,150,219, 18,209,254, 92,102,184,111,160,
+ 99,120,187, 28,205, 0, 32,140,226,229,103, 14, 61,113,108,106, 97,239,186,225,109,107, 6, 50, 61,107,165, 72,146,211,208,179,
+234, 43,203,211,103,231, 86, 70, 58,219,211,169, 12,163,190, 97, 26, 21,221, 76,197, 52,140, 17,132,144, 50, 46, 4,192, 8, 82,
+198, 8,198,186,237,168,178, 20,132, 97,200, 56,130, 32,174,105, 61,217,180,105,123, 75,149,198, 59,111,217,251,252,217,169,100,
+ 68,237,207,101, 42, 77, 64,184, 16,138, 34,181, 39, 98, 3,237,153,225,190,254,246,225,237,114, 52, 13, 33,244, 45,253,210,169,
+167, 30, 57,122,154,113,113,215,158,205, 35, 61,221,241,246, 33, 73,137, 11, 70, 67,207,210,139, 51, 23,230, 11, 97, 72, 71,186,
+179,146,172,176,192,105,217,110, 69, 55,199,123, 59, 94, 27,254, 49, 14, 4, 80, 37,201, 15, 41,132,176,101,123, 0,192,144,114,
+ 4, 97, 76, 83,186,219, 82, 49, 85,126,254,220,212,230,225,222,254, 92,219,167,127,112,104,231,216, 64,203,246, 0,212, 72, 91,
+ 60,118,205, 72,110, 96,112, 60,211,187, 94,142, 36, 32, 64,161,111, 45, 93, 58,242,196,209,227,151,150, 75,219,134,122,119,175,
+ 29,202,101, 59,213,100, 39,145, 85,193, 40,165,158, 93, 95,158, 45, 86,166,243,149,193,142,182, 76, 44,202, 57,103,129,165, 59,
+ 94,195,180,187,210, 73, 33, 4,227, 60,164,140, 11,209,158,138,181,108,151,114,142, 17, 10, 41, 69, 8,198,101,181, 35,157, 72,
+ 69,181, 51,115,203, 18,198,111, 56,176,235,143, 31,126,124,253, 64,119, 79, 91,250,165,137, 25,212, 57, 68,214, 12,141,238, 60,
+120, 27,150, 53, 0, 68,232,182,242, 51, 39,159, 62,122,244,204,236, 74,103, 38,241,186,189, 91,135,187,114,177, 84,167,164, 37,
+ 32,194, 44, 12, 4, 15,125,187, 89,170, 85, 38,151, 75, 16,130,254, 92, 90,150, 8, 15,221,192,247, 45,215,179, 92, 63, 25,211,
+ 86, 35, 70, 72, 41,101,188, 51,157, 92,172, 52,227, 17, 37, 21,211,188,144,166,162, 90, 71, 58,129, 33,186,176,144, 47,212,244,
+223,122,243, 93, 47,156,159,178, 28,127,164,171,125,185,218, 72,199, 34, 6, 0, 68,141,103, 17, 38,174, 81, 90,186,124,236,249,
+211,231,207,204,173, 36, 52,245,250,173,107,215,245,119,101,146, 41, 57,154,193, 68, 21,156,113, 74, 57,243, 89,224,182,244,202,
+108,177,154,175, 53,251,115,153,116, 44, 2, 0,160, 97,224, 82,106, 58,126,200,185, 68, 48,227, 2, 80,238, 6, 97, 64,153, 38,
+ 75,115,229,250, 0, 73, 67,136, 86,109,171,162,155, 11,229,186,227, 7,191,251,150,123, 46, 47,229,191,253,210,169, 27,183,174,
+211, 20,105,161, 92,167,140,195, 24, 32, 86,125,233,212, 11, 75,199, 46,207, 94, 92, 44, 98, 4,119,143, 13,108, 24,232,105, 75,
+ 68,163,170,130, 37, 85, 48,198,184,195, 5, 19,212,167,161,231,251, 94,161, 97,204, 22, 42, 8,194,174, 76, 82,150, 36, 46, 4,
+227, 34, 8, 66, 55, 8, 49,132,156, 3, 46,184,224,194,116, 60,198, 57,229,188, 35, 21, 55,108,151, 11, 97,123,126,163,101, 49,
+ 46, 54, 12,116,221,125,213,214,207, 63,241,226,201,233,197,187,174,218,236, 6,116,105,165, 44, 75,164, 98, 52,211,237, 0,222,
+125,227, 1,225,123, 94, 16, 40,178,212,145, 78, 36, 34,154, 76, 86,135,101, 8,175, 14,203, 32, 16, 66, 0, 1, 24, 23, 65, 24,
+ 86, 91, 86,190,166,199, 53,181, 51,147,140,107, 10, 70, 72, 0,225, 5,116,185,210, 88,174, 53,175, 90, 55, 44, 56, 23, 96,149,
+ 16, 10,130, 48, 12, 40, 3, 16, 40,146,164, 73,146, 44,145, 68, 68,181, 92,255,244,236, 18,101,108,172,167,195,176,221,168,170,
+232,182,195,185,104, 57, 94, 44,219, 1,247,239,223,223,108, 54,117, 93,255,121, 27, 11,253,175, 21, 33, 68, 42,149, 74,167,211,
+ 4, 0, 96, 24,198,242,242,242, 47, 64,249, 31, 73,158,233,116, 26,253, 2,136,255,205,134,101,191, 0,232, 23, 0,253, 2,160,
+255, 95, 9,249,183,219, 58, 22,137,100, 98, 90, 91, 34,214,211,158,233, 76, 37,210, 49, 45,170, 72, 64, 8, 26, 4, 1, 13, 41,
+165, 66, 8,136, 16,198, 88, 34, 68,150,100, 6, 68,203,241, 29,159, 46, 85, 27,165, 70,211,112,252,122,203, 54, 29,231,255, 11,
+ 0, 65, 0, 0,132, 0,128, 7,111, 62,184,111,188,191,217,168,214, 90,118, 16, 82,132, 96, 68,145,210,177,104, 91, 58,149,206,
+118,196, 98, 41, 9,242,208, 49, 45,179,233,250,126, 64, 41,125,173,176, 5,171,156, 41,210,158,146, 8,129,210,168,203, 97,163,
+101,249,174, 21,147,112, 91, 34,166,168,234,151,158, 61,249,204,169, 9,202,216,191,119,176,223,191,127,255,194,194,194, 63, 70,
+ 33,248, 9,105, 75,196,239, 59,176,111,203,232,112, 46,149,136, 41,114, 50,149, 38, 68, 54,205,198,242,210,236,114,177,216, 52,
+ 45, 1, 96, 58,166, 14,247,246,166, 50,157,106,188, 45, 30,141,249,102,213,168, 23,245,150,238,250, 1,227,130, 96,164, 74, 68,
+ 83,100, 85, 81, 9, 33, 8, 66, 32,184,224,156, 11,206, 57,103, 66, 8, 33,248,106,195, 86, 8, 1, 0,130, 16, 33,196, 4,176,
+252, 48,161,144,136,166, 78,230,235,127,244,141,199, 43,186,249,111, 13, 77,127,127,255,224,224, 32,249,167, 51,165,157,235,214,
+ 94,191,123,215,125,215, 93,151, 74,166, 56, 99,148, 81,140, 8,194,196,243,221,114, 97,110,226,252,137,249, 66,222, 13, 88, 76,
+149,250, 59, 59,175,222,190, 39,147,235, 7, 88, 2,212,107,150,102, 75,115,103,230,253, 0, 66, 16, 85,213, 92, 91,123, 34,213,
+161, 68, 18, 66, 0, 70, 3, 78,125,206, 25, 16, 76, 48,202, 89,192,105,192, 89,200, 56, 99, 92, 48,206, 66,202, 61, 26, 58, 94,
+ 96,121,190, 23, 80,130, 81, 71, 42,222,155, 78,105,209, 68,195,246,198,123,187, 31,253,195,223, 14, 41,251,204,247, 30,253,206,
+145, 83, 65, 72,255,189, 45, 40, 21,143,125,252, 61,239,190,227,192, 13, 16,225,213,163,132, 16, 66, 8, 57,163, 65, 72, 27,213,
+229,185,203, 39,167,151,243, 94, 64,163,170, 50,216,217,190,113,211,158, 88,166, 23, 99, 28,122,102,105,254,116,169, 82,118,130,
+ 0, 35,146,137,199,186,186,135, 18,157,107,104, 24,112, 22,200, 74, 84, 8, 30,186, 45,223,106, 4, 78, 51,240, 29,202, 24,227,
+156, 49, 46,192,107,246,242,163, 71, 33, 16, 2, 8,128, 0, 64, 0, 65, 41,211,109,247, 74,169, 46, 43,234, 13,219,183, 37, 83,
+237, 51, 75,243,163, 99, 91, 36,132, 29,163,116,241,242,217, 35,211, 43,223,122,225,196,143,207, 71,127,198, 22,244, 35, 10,210,
+239,190,231,221, 15,222,121,175,172,168,156, 49, 0, 4,132, 8, 8,206, 89,200, 5,104,181,244,202,252,185,137,169,139, 53,195,
+ 34, 24,117,183, 37, 55,109,220,209,217,191,129,200, 26, 11,253,218,210,249,252,202, 21,221,116, 56, 0,233, 88,100,120,205,166,
+ 76,247, 24, 13, 3, 34, 41, 68,209, 8, 13,125, 71,247, 90,149,192, 53,168,103,210,192, 9, 41, 99,124,117,212, 33, 94,123,184,
+ 3,192,223,251, 17, 0, 0,176,218,164, 39,152,180, 37, 98,153,120,180,229,184,143,189,252,114, 34,157,189, 99,223, 65,179, 81,
+ 44,214,171,235,199,183,110,219,118,160, 59, 59, 57,152, 77, 6,190,127,113,169,244,248,169,201,213,230,214,207,204,130,174,189,
+246, 90,230,218, 31,122,224,129, 93,219,246,176,191,213, 21, 0,193,105, 0,132,112, 3,218, 50, 42,149,133,137,137,233,203,150,
+ 23,196, 53,101,180,191,119,221,198,189,241,246, 1, 33,128,103,148, 10,115,103,138,149,162,237, 5, 10,193,157,185,142,222,145,
+237, 74, 44,195, 25,149,181, 24, 0, 32,116, 91,129,107,133,158,197, 66,151,135,190, 16, 92,112,202, 89,200,105, 64,105, 16, 82,
+ 26,210, 85,148,196,143, 46, 53,248,219, 55,215,175,153,149, 0, 2, 8, 0, 4, 4, 16, 64, 72, 25,155, 43,214, 10, 14,127,240,
+166, 27, 41,101,199, 47,158,187,102,243, 86, 89,137, 52,138,211,199, 38,103, 41,163,142,227,214, 45,231, 74,169,113,124,102,217,
+ 15,130,127,189, 5,193,125,251,246, 61,112,221, 13,119, 93,179,143,115, 1, 17,226,140,178,192,133, 8, 91,158,223,106,150, 43,
+139, 23, 46,205,206,249, 33, 77,199, 34,235,134, 6,214,108,190, 78,137,101, 4,103, 86,109,177, 56,119,182,220,108,184,126, 24,
+ 81,164,222,174,222,238,209, 61,144,200, 16, 34, 34,201,161,103,251,102,221, 51, 43,190,173,123,174,233,133, 33,165,175,249,151,
+213,222, 48, 65, 72, 38,132, 16, 68, 48, 6, 64, 56,126,184,202, 8, 35, 24, 17,140, 49,132,171, 79,212, 0,128,171,240, 49,198,
+153,224, 16, 66,130, 48, 66, 48, 95,107,156,202,235,239,184,253,246,168, 68,126,248,202, 75,187,199,199,218, 82,153,114,225,202,
+ 75,151,230, 52,130, 24,231,134,237, 38, 35, 90, 71, 38,177, 88,107, 45,214,140,166,105, 79, 45, 23, 43,186,249, 47, 50,174,191,
+187, 98,156, 81, 33, 4, 0, 34,176,117, 44,201,110, 16, 6,110,125,241,242,137, 75,243, 11, 94, 24,102,226,209,221, 27,215, 15,
+111,220,175, 68, 83,156,134,173,210, 76,121,241, 66,165,169,123, 97, 24,145,200,218,145,209,174, 53,187,177,164, 0, 0, 1,103,
+190,163,183,154, 5, 91, 47, 90,142,101,185,190,227, 7,142, 31,184,126,232,135,161, 23,210,144, 50,202,216,107,113, 29, 33,137,
+224,152,170, 36,163,106, 42, 26, 73, 68, 53,193, 69,181,101, 49, 46, 82, 81, 85, 33,146, 68, 16,128, 16, 35,204,133, 64, 16,114,
+ 42, 92, 63, 8, 41,143,105, 74, 95, 46, 11, 32,250,222,161,231,223,116,235,157, 55, 95,181,239,185,227, 47,239, 28,233,203,164,
+115, 91, 7,156,199,207, 78,183, 37,147,153, 88,132, 11, 16, 82,182,127,253, 80, 38,219, 67,228, 88,232,232, 75,249,249, 39,207,
+ 78, 63,114,252, 66,203,241,254, 5,156,179,254,254,254,245, 67,195,107, 58,115,140, 6, 33,227,182,101,148,230,207, 29, 57,250,
+252, 66,169, 18,211,228,237,227, 99, 87,239,187,187,107,100, 59, 66,200,170, 46, 21,102,142, 46, 45, 76, 53, 90,166,132, 97,111,
+103,207,216,214,235,219,122, 55, 64,136, 56, 13,189, 86,165, 85,154,110, 20,167,106,181, 66, 77, 55,170, 45,187,222,178,234, 45,
+187,106,216,245,150, 85,107, 89,117,211, 54,108,215,246,124, 33, 0,132,144, 11, 33, 56,160,140,187, 65, 96,216, 94,189,229, 48,
+ 46,186, 50, 9,137,224,197,114,131, 50,166,201,146, 76, 48, 33,152, 96,132, 17, 34, 8, 35,132,252, 48, 92,169,233,130,139,222,
+108,186,161,235, 51,133,210,246,117, 27,219,162,218, 51,231, 38,123, 98, 56, 30,141,196, 36, 60, 49,183, 84,110, 57, 93,233,120,
+ 68,150,252,144,134,158, 69, 61,221,245, 44,202,133,140, 17, 34,146,132, 68,205,252,231,243,207,100, 50,153, 74,165, 8, 0, 64,
+ 48, 10, 32,106, 52, 74,174, 81, 62,118,234,104,189,101,199, 52,121,203, 72,255,250,205,215, 36,114,195,130, 83,187,190,210,204,
+ 79, 86,106, 69,219, 13, 32, 2,157,153, 84,215,224,230,120,199, 16, 16, 48,116,205,192,214, 29,163,104,235, 37,211,113, 44,215,
+179,188,192,118,125,211,245, 45,207, 51, 29,207,241, 3, 77,145,215,246,117, 15,245,118,247,116,245, 75,146,194, 5, 23,140,113,
+ 22,178,192, 9, 3,215,245,220,150,227, 90,174, 7, 33, 40, 54, 90,169,152,182,105,168,251,226, 66,193,241,130,225,174,108, 92,
+ 82, 49,145, 1,128,156,133,178,132, 37, 66, 16,132, 39,103, 22,155,182,179,125,164,239,219, 71,207, 29,187,112,102,239,214,221,
+ 7,215, 25,135,103, 22, 15, 12,180,117,101,146,187,198,250,207,204,174, 76, 46, 21, 55, 14,118, 71, 53, 37,160, 52,176,104, 72,
+153, 19, 4,148,243,246,136,100,229, 58,214, 50, 62, 83,110,254, 52,105, 39, 1, 0,216,182,169,151, 23, 78, 28,125,110,182, 84,
+ 37, 24,175,233,204,110,221,178, 43, 55,176, 9, 34,236,155,117,163,124,165, 94, 89,212, 45,151,113, 30,213,228,142,142,190, 76,
+239,122, 73,141, 49,223, 11, 29,195,107, 85,156, 86,209,180,109,219,243, 77,215,183, 28, 79,183, 93,195,113, 91,182,219,158,140,
+222,124,213,206,145,209,173, 0, 0,207,172,217,122, 89,175, 45, 9, 14, 16, 20, 24, 35,132, 37,140, 9, 68, 72, 83,100, 85, 38,
+157,153,180, 31, 4,166,235, 10, 33,108, 47, 88, 63,216,115,252,242,220,124,169,182,174,191, 75,214, 20,136, 85, 0, 56,161, 33,
+ 33, 54, 70,112,215,216,192,145, 75,115,170,162,220,180,121,244,145,163,199, 71,122,251,251,134, 54,174,111,181,206, 21,234, 27,
+187, 51, 93,153,148, 23,210,133, 82,125,169,210, 64, 16,101,147, 81,140,113, 16, 82,215, 15,189, 32,148, 9,193,126,115,120,100,
+ 13, 80, 11,147,115,255,124,122,140, 7, 6, 6,228,176, 53,113,225,116,177,161,119,164,227,215,110,217,188,253,170,219, 18,185,
+ 1, 22,248,173,234,124,101,225, 92,185, 90, 52, 29, 15, 99,212,158,140,119,245,173, 77,228, 70, 32, 66,161,219,114,141,162, 93,
+ 95, 50,155, 37,195,178, 13,199,109, 90, 78,177, 97, 20, 26, 6, 4, 98,199,250,181,183, 30,188,121,203,134,237,152,123,197,229,
+203,139, 11,211, 87,150,230,103, 11,165,249, 98,117,169, 82, 43, 27,173,166,233,216,158, 23, 6, 1, 66, 66,194, 36,164, 52, 8,
+ 67,137,144,120, 44, 1, 1, 39, 8, 73, 68,138, 40,210,228,114, 41,161, 41,169, 68, 82, 82, 98,152, 40, 8, 75, 8, 97, 12,132,
+132,160, 42, 73, 19,203,149,117,189, 29,129,239, 21,117,107,108,112, 56, 25,139, 79,173, 44, 19,206,226,154,130, 49, 6, 0,248,
+148,250, 97,184, 26, 25, 67,198, 87,137, 83,171,237,123, 55, 12,239,222, 54,246,190,219,175,121,253,190,237,187,198,250,101, 66,
+150,106, 58, 99,252,127,188, 98,120, 96,112, 48,180,173,132, 4,182,175, 25, 60,184,239,166,158,209,157, 0, 17, 79, 47, 55,150,
+207,151,139,115, 77,211,166,156, 71, 85, 37,215,214,150,233, 26, 83, 98, 25,206, 2,223,110,184, 70,201, 49, 10,166,101,182, 28,
+175, 97, 58,197, 70,171,105,217, 61,237,217,155,174,222,183, 99,199,190,100, 44,214, 40,205, 78,207, 92,152, 92, 88,188, 82,168,
+ 92, 94, 41, 47,148,235,134,229, 8, 0, 98,170,146,138, 70,146, 81, 53, 34, 43,178,132,129,128, 8, 1, 69,150, 86, 31,161, 72,
+152, 68,180,152,224,148, 96, 28,141, 68,106,186, 97,123,126, 87, 91, 70,141, 36, 17,145, 33,194, 2, 64, 32, 24,224, 20, 35, 88,
+119, 66, 6, 96,111, 58,122,114,102, 97,253, 96,127, 50,209, 6, 3,251,116,190,214, 17, 37, 4, 99,136,160, 16, 34,160,140,114,
+ 14, 0,224,156,135, 33,243, 66,234,135, 52,164, 84,183, 28, 85,150,183,173, 25,236, 25,220, 52,208, 59,184,169, 59,217, 22,215,
+ 46,175,148,127,156, 94,253,183, 62, 72,136,206,116,226,158,171, 54, 15,172,219,139,137, 18,184,150, 93, 91,108, 86, 22,116,219,
+ 9,194, 16, 99,146,136, 40,201,100,155,150,236, 68,136, 4,182, 30,186,173,192,109,122,158,107,121,126,203,118,155,182, 35, 33,
+180,123,227,250,246,174, 53, 66,112,215, 40,205, 93,124,121,165,222, 44, 53, 91, 53,195,106,152,182,229,250,138,132,123,219,211,
+227, 61,157, 61,217, 84, 76, 83, 37, 34, 65,132,128,224, 66,240,213,220, 71,146, 35, 17, 64, 90,245, 26, 16,102, 71, 71, 82,102,
+ 33, 16, 76, 82,163,153, 68,180, 84,215, 93,223, 75, 64,132,177,196, 33,194,156, 50,136, 17,130,138, 68,218, 85,184,228,194,158,
+ 56,193, 64, 92,152,186,116,240,234,235,134,250, 6,206, 45, 23,102, 43,198,112,123, 50, 34, 75,137,136,202, 5,247, 3,234,248,
+ 1,193,136, 50,190,250,158, 28, 33, 40, 33, 48,189, 92, 44,214,234,153, 78,170,198,178,185, 62,121,167,105, 78,213,237,199, 94,
+ 58,254,147, 62, 72, 8, 49,190,118,203,208,198,253,156, 81,187, 89,108, 85,174, 52,155,117,219,243,185, 16,170, 34, 39, 34,106,
+ 44,158,145,180,180, 96,212,247, 76,234, 91,129,103,185,126,216,114, 61, 63, 8, 18,209,232,248,216, 38, 53,154, 14, 92,163, 94,
+184, 92,169, 55, 10, 13,189,216, 48,170,134, 85,111,217,166,235,201, 18,222, 56,208,189,103,124,168,183,187, 63,146,200, 66, 44,
+ 11,193, 5, 11, 5,163, 66, 48,193,153,224, 20, 8, 1, 17, 81, 37, 13,212,170,150,235,167, 3, 79,146,100, 78, 3, 44,105, 81,
+ 69,225, 2, 4, 65, 0, 16,132, 8, 35, 8, 89, 8,133,224,130, 11,136, 96, 50, 22, 89,106,209,186, 3,250, 82,209,151, 39,103,
+174,222,180, 85,142,164,182,245,180, 29, 94,104,100, 29, 87,149,101, 77,145, 3, 74, 25,227,148, 50,198, 56, 19,130, 50,190,154,
+ 52, 68, 20, 73,183,220,115,243, 43,131,189, 3, 68, 77, 96, 73,237,234,232, 25,205,174, 0,136,128,224, 63,233,164, 17,150,104,
+224,218,141,188, 94,153,215, 45,203, 15, 41,130, 48,166,200,177,136,166, 69, 18,152,168, 44,176, 89,224,132,190,227, 83, 26,132,
+ 33, 0,176,187,163, 59,150,234, 4, 0,184,102,117,185, 56, 87, 53,204, 98,163, 85,108,232, 21,221,212,109,183,229,184, 18, 38,
+ 59, 70,251,110,216,190,185,111,104,131,154,236, 64, 68, 5,128, 83,223, 13,220, 86, 24,250,130,115,132, 9,194, 10, 0, 92, 8,
+ 1, 33,196,130, 35,132, 45,219,113, 93, 71,142,167, 32,162, 8, 73, 4, 19, 0, 1,227, 28, 66, 4, 17, 20, 28, 0,193, 57,245,
+ 41,231,156, 9, 69,150,152, 93,183,218,122, 58,211,137,195, 19,179, 75,249,249, 53,163, 91,122,186,251,181,185, 66,205, 65, 93,
+132, 72, 8, 43, 68,242, 48,117,121,184, 90,215,172,118, 87, 16,130,170, 36,167,227,208,114,189,124, 41,175,198, 50,146, 26, 67,
+ 24,182,169,232,205,183, 28, 44,229,151,167, 10,213, 82,211, 88, 37, 60,172,190,214,180, 91,133,169, 70, 61,111,186, 94,200,152,
+132,113, 68,145,163,170, 34, 73, 26, 16, 32,244, 77, 78,125, 74, 25, 0, 32, 18, 77,100,147, 93, 8, 75,129,163,215,138,211,149,
+134, 81,214, 91, 21,221,172,183,236,202,107,174,215,151, 8, 62,184,121,236,230,171,247,118, 15,109,150,163,105,136, 80,232,217,
+190, 85, 95, 45,217,125, 71, 55,235,203, 66,128, 68,166, 75,142,164, 16,146,128, 0, 0, 64, 78, 61,215,247, 93,159, 10, 1, 0,
+224, 16, 98,128, 49,231, 12, 2,136, 16,132,136, 64,136,160,224,140,250, 97,232,135,148, 50,193, 49, 66,190,101,152,180, 55,171,
+ 72, 9, 77, 62, 55, 51, 59, 50,188, 78,142, 36,215,228,210, 83,229,102, 91,200, 48,134, 24, 35, 66, 16, 8, 5,229,140, 51,193,
+ 24, 91, 37, 50,168, 18,209, 20, 41,174,170, 1, 13,156, 86, 69,101,212,119, 76, 8,145,140,225,123,110,222,147,138, 70,235,166,
+253,212,116,105,177,229, 19, 0,161,215,170,212,106,158,237,249, 66, 8, 77,146, 52, 69, 86,100, 9, 99, 34,128, 96,204,135, 16,
+ 75, 90, 58,162, 37,177,164, 80,207,210,171, 11,229,122,173,220, 52, 43,134, 89, 53,172, 70,203,214,109,199,176, 93,219, 15, 58,
+ 83,241, 55, 30,220,125,253,181, 55,167, 59,135,177,164, 5,158,217, 42, 93, 97,161,135,136, 12, 49,134, 16, 3, 0,161, 16, 94,
+ 72, 13,203,145,148,136, 26,207, 66,136, 87, 75, 10,234,182,154,150, 19,132, 33,196,132,115,134,137, 34,132,112,131, 0, 2,160,
+ 40, 42, 66, 4, 0,200, 56, 13,125,203, 11,130,128,210, 85,254, 8,134,192,242, 2, 16, 21, 29,233,196,149,124,201,119, 45, 34,
+199,186,115,185, 11,197,134,227, 7, 81, 85, 94,237,195, 1, 1, 25,227,175,249, 32, 0, 16,134, 10, 33,154, 44,101, 18, 81,130,
+ 48,245, 29,159,211,150,213,210,109,199,176,124, 89, 86, 51,221, 99, 9,223,234,169,152, 11, 45,159, 0, 0,220, 32,240,130, 16,
+ 66,168, 74,146, 42, 75, 50, 33, 88, 82,136,164, 34, 73,197, 82, 4, 97, 18, 6,118,163,178, 80,172, 86,139, 13,163,212,108,213,
+ 77,219,116,188,150,227, 26,142,103,187,190, 76,208,190,141,163,247, 28,188,110,104,124,167, 20, 77,179,208, 55,171,243,110, 51,
+143, 37, 77,210,226,146, 22, 67, 88, 2, 0, 10, 33, 24,247, 88,232,217,174,167,219,110,142, 82,132, 8, 88, 5, 8,138,106,189,
+ 92, 49,204, 76, 44,162,200, 42,163,129, 28,205, 4,190,221,114, 60, 66,144, 22, 73, 64,132, 4, 0,204,119, 60,167,229, 5, 33,
+101, 28, 33, 8, 0, 20, 0, 52,117,131,107,106, 91, 60, 58,185, 84,178, 44, 35,153,137, 68,148,136,162,200, 45,215,150, 37,194,
+133, 16, 0,112,193, 25,231,148,177, 85,251,148, 48,142,106, 74, 58, 26, 73, 69, 53, 69,146, 40,163,126, 16, 84, 13,179,220, 52,
+189, 0,216, 84, 96, 34, 19, 57,171,168,218,223,181, 92, 37, 66,100,130, 20, 73, 34,114,132,200, 17, 76, 20,128, 80,224,219,229,
+242,210,114,185,182, 84,109, 86,116,179,229,120,166,235, 57,174,239,132,161, 31,132, 18,193,187,199,135,239, 57,120, 96,116,227,
+ 94, 73,141,113,206,140,210, 21,125,242,144, 36,105,106, 60, 27, 73,247, 96,162, 32, 76, 0,194,171,163, 92, 70,125,230, 59,102,
+171, 81, 53,108, 74,169,162,198, 16,145,129, 0, 0,130,192,181,230, 87, 86, 92, 47,136,181,183,201,178,194,131,128, 72, 90,173,
+146,111,154, 78, 54, 25,139,198, 82,171,255, 84,196,183,235,166,235,175,158, 37, 66, 4, 66, 16,134,180,213,168,243,206,158,184,
+166,134,140, 26,166,145, 72,182, 75, 4,167, 83,233,226, 92, 37, 17, 81,129, 16,171, 29,149, 85,150,173,224, 28, 35,164,201, 82,
+ 34,162,166, 98, 90, 92,211, 8, 70,126, 72, 91,142,187, 82,211, 43,134,169,219,190,209,106, 1, 32, 56, 13,131, 32,120, 13, 32,
+ 9,163,168, 42, 19,132, 16, 38,156,133,205, 70,185,216,104, 46, 86,234,133,154, 94, 55,109,203,245,221, 32,244, 67,234,135, 33,
+101,188, 51, 21,191,253,170,173, 7,174,185,161,163,103, 20,171,209,208,181,170, 75, 23,204,250,178, 34,145, 72,162, 35,221,181,
+142,200, 26,194, 18,196,100,149, 0, 10,132, 16,130, 51, 26, 80,223,177,244, 82,161,222,168,183,172,158,108, 42,154,204, 65,132,
+133, 0, 16,128, 90,101,121,161, 92,149, 8,201,101,210, 80, 48, 73, 77, 8, 33,242,149,138, 79,105,174,173, 77, 81, 99, 0,128,
+192, 53,245, 86,211,246,124,202,184, 44, 17,140, 96, 32,132, 31,134,142,227, 8,209,163, 42, 18, 66,168,101,154,156,133, 24, 65,
+ 5, 10,221,246,252,128, 34, 4, 41,231,140, 9,198,133,224, 28, 66, 36, 75, 36,174,169,169, 72, 36, 25,209, 84,153,112, 33, 28,
+223, 47, 54,140,229,106,195,116,124,153,192,136, 44,113, 22,154,205,114,165,217,132,171, 0, 25,182, 55,189, 82, 54, 93,175,222,
+178,171,134,213,104, 89,166,231,251, 1,245, 41, 13, 66, 10,128,232, 72,197,247,111, 89,191,111,199,158,145,209, 13,106,188,131,
+243,208,106, 20, 22, 38, 95,182,154,197,104, 36,150,204,116,117, 13,110, 37, 74, 4, 97, 9, 34, 12, 17, 2, 0,174,182,118, 4,
+ 16,130, 51, 22, 4,161, 99, 24,149,249,229,114,105,161, 92,135, 16,244,117,247,105,241, 12, 68, 18,132,192, 55,235,151,102, 38,
+ 91,142, 55,210,153,205,181,119, 9, 65,149, 88, 86,111,148,150, 42, 53, 77,150,122, 58,123,144,164, 8,206, 77,189,172,155,182,
+227,135, 4, 35,130, 16,193,136,113,238, 6,148,115, 10, 16,148, 48,146, 48,182, 93,135, 81, 31, 8, 78, 0,167, 88,118,124, 95,
+145, 37,198,216,107, 61, 57, 8, 36,130,163,170,146,136,106,137,136,170, 41, 50, 68,192,245,195,170,110, 46,150, 27,149,166,201,
+ 56, 31,237,233,104, 75, 68, 3,179, 58, 53, 63,187, 84,183,128,164, 17, 8,225,229,229,210,244,116,203, 11, 67, 63,100,148, 49,
+202, 24,193,168, 51,147,188,106,195,218, 3,123,246,229,122,215, 97, 69,227, 44,244,204,122,126,110,162, 84,120, 20, 19,148,203,
+180,103,218,251,186,250,215, 33, 73, 69, 88, 66,171,198,242,183,252, 16, 8,225,107,221,119, 26,132,174,229, 52, 11,181,202,226,
+ 74,181,177, 84,109,134,148,110, 31, 27,238, 25,220, 72,148, 8, 16,128,250,246,212,229, 87, 47, 46,149, 84, 89,218, 56, 50, 28,
+ 77,100,105,224, 1, 8,174,204, 79, 55, 45,103,199,232, 96, 58,219, 3, 33,246,172, 90,181, 86, 50, 28, 23, 0, 40, 19, 44, 17,
+132, 33,242, 67,230, 6,225, 42, 37, 6, 35, 76, 48,246,124,159,133, 30,224,148,249,142,237, 5,142, 79, 32, 68,171, 29, 93, 4,
+ 33, 34, 36, 42, 75,201,136,150,140,106,154, 42, 35, 4,189,144,214, 91,246, 82,181, 89,104,232, 78, 16,100,147,209,141,131, 61,
+ 17, 25, 23,171,165, 23, 47,204, 4, 76, 2, 18, 32, 0, 0, 63, 12, 85,193, 7,218,211,235,135, 6,183,109,217,213,217, 51,162,
+197, 82, 8,147,192, 49, 42,203,151,143,190,240, 45,163,213,138,169, 82,103,123, 46,219, 49,216,209,123, 11, 81,162, 16, 19,132,
+241,143,205, 29,197,143, 58,130, 66, 8,193, 57,103, 97,232,152,182, 94,208,171, 75,165,166, 94,172, 25, 21,195,148, 8,222, 57,
+ 62,188,126,203,126, 37,222, 6, 4, 8, 28,227,204,169,195,207,158, 58, 79, 48,222,189,110, 77,223,232,142,192,209,213,120,219,
+210,204,233,201,165, 66,123, 34, 58, 62,182, 1, 73, 42, 11,156, 74,113,174,106, 88, 1,101,138, 36, 73, 24, 43,132, 0, 8, 61,
+ 63,240, 3, 26,215,100, 4, 32, 66, 80, 34,216, 15, 67, 26,184, 0, 8, 30,120, 45, 67,119, 98,146, 44, 17,198, 5, 4,128, 16,
+ 44, 99, 28,143,170,201,168, 26, 85,100,140,160, 23,208,134,105, 47, 85, 26, 43,181,166,233,120,255,111, 43, 87,214, 28,199,113,
+223,251,154,233, 57,119,246, 94, 96,113, 16,132, 72, 16,188, 68, 93, 54, 35,201,162, 21,217,169,114, 94, 82,202, 71, 74,190, 68,
+222, 92,137,147,202, 99,242,148,164, 44, 71, 78, 34, 71,138,100,145,145, 40, 30, 22, 9, 18, 4,136,197, 98, 15,236,238,236,220,
+211,103, 30, 6,164,101, 85,165,242,146,183,185,170,107,106,106,186,251,255,255, 93,148, 24, 59,253, 94,191, 85, 79, 11,246,219,
+111,159, 61, 57,153, 52,123,107, 5, 0, 68, 43,245,231,127,250,225,135,183,222,151, 82,100,203,201,100,116,120,231,243, 95, 14,
+199, 67,165,228, 74,171,189,185,190,117,253,250, 77,219,239, 96,211,134,136, 0, 84,253, 36,213,236, 1, 74,171,223, 99,164, 26,
+104,160,148, 20,162,204,202,100, 22,207,142,230,243,201, 52,140, 79,163,100, 30,167, 5, 19,189,134,255,131,107,215,207, 93,186,
+137, 45, 7, 40,157, 46, 6,159,126,250,209,111,238,239, 57,150,121,235,198,213,215,222,122, 95,113,110,251,237,249,232,233,231,
+ 15,126, 39,149,126,125,119,215, 15, 86,181,146,203,233,225, 96, 58,139,243,210, 36,152, 96, 68, 13,195, 32,164,228, 60,103,156,
+ 75, 65, 13, 23, 86,156, 26, 70, 76, 72,193, 50, 0, 32, 2,128,149, 69, 86, 50,207, 50, 1,128,152, 96, 3, 16,219, 52, 2,215,
+113, 41, 69, 8, 21, 37, 95, 36,217,209,116,113, 60, 11,195, 36, 3, 16,246, 91,193,214, 74,155, 32,248,100, 56,253,237,227, 67,
+207,162, 23,250,237,251,211,140, 64, 8, 31,124,243,217,232,225, 39, 81, 86,186,150,117,113,163,127,249,226,149, 63,122,247,103,
+196,174, 65, 68, 32,128, 21, 40,172,207, 40,134, 10, 42,150, 21,245, 0,206,194, 17,148,150,156,151,105, 25,207,146,197, 48, 92,
+140,231,113,182, 72,179, 40, 45,178,146,149,156,123, 22,125,253,194,185,203,215,223,246, 58, 91, 8, 34,193,178,193,222,157,127,
+249,205, 39,251,163,211,173,110,235, 39, 55,223,218,190,250,174,146,130, 24,118, 52, 61,248,244,206,151,147,101,252,131,157,237,
+245,205, 29, 13, 64, 17,207, 6,163,225,100, 25, 3, 13,108,106, 26, 6,177, 76, 2, 17, 20, 74,103, 37,147, 82, 81,147, 32, 8,
+ 43,149, 56, 23,178,228, 2, 0, 8, 17,164,166, 81,148, 76, 42,109, 16,100, 67, 98, 24,196,181,168, 67, 13,132, 96, 94,176, 69,
+154, 13, 78, 23, 39,243,229, 50,205,165,210,237,154,187,213,107,249, 14,157, 70,201,151,143, 15, 22,113,250,103,111,223,160,245,
+214,189,105, 70, 52, 0,189,206,202,135,239,221,242,155,171,216,180,129, 6, 74,114, 41,185,228, 28, 66, 1, 16,130, 0,126, 39,
+186,180,250, 42, 64, 43,173, 36,147,162,224,233, 50, 15, 71, 81, 56, 90,196, 73,152,102,113, 86,100, 5, 43, 56, 87, 74, 75,173,
+ 93,106, 94,219, 90,219,217,185,209,232, 95,194,166,173,149,136,198, 79, 63,253,175,127,253,228,222,158,101, 26, 63,190,126,233,
+157,183, 63, 8, 58, 91, 74, 9,140, 64, 52,121,246,197,157,207,246, 71,211,157,181,222,245,221,107,132,122,146,231,211,209,193,
+225,120,150,228,101,224,218,148, 16,219, 32,148, 16,160,180,144,178,224, 66,105,109, 25, 70, 5,104, 96,132,184,144, 5, 23, 90,
+ 43,173,117,203,115,164,214, 82,105, 27, 35,106, 16,106, 26,212, 32, 90,131, 40, 43,194, 36, 59,153, 47, 71, 97,148, 22, 76, 72,
+ 85,115,172,141, 78,163, 19,120, 5, 19,247, 14,134, 79,134,211,203, 27, 43,111, 95,190,240,205, 76, 0, 13, 8,208,218,111,244,
+144, 97,103, 89,100, 10, 70, 8,133, 8, 99,108, 84,156, 2,212, 26, 0,173, 43,230, 74,201,106, 6,177, 44,204,227,211, 52,158,
+ 71, 73,188, 76,139, 40, 47,178,162, 44, 24,231, 82,106, 13, 48, 66, 24,163,150,111,159,239,247, 54,207, 95,173,117, 95,193,166,
+165,181,206, 22,195,123, 95,125,242,171,219, 95,103, 37,187,180,222,125,231,198,171,231,175,252, 8,155,182,150, 66, 9, 22,141,
+246,190,248,250,246,189,131,225,102,167,241,214,149,203, 78,125, 85, 43, 30,159, 30, 30,141,199,147, 48, 50, 8,177,169, 65, 77,
+ 98,153, 4, 99,200,165,226, 66, 86,210, 85,203, 36, 85,185,140, 17, 98, 66,228, 37, 83, 74, 75,169, 91,129,151,149,188,146, 35,
+ 99,136,128, 6, 5, 99, 5, 23,203, 52, 63, 93, 38,167, 81,146,149, 76,107,237, 90,116,173, 21,172, 52, 3, 13,192,227,193,248,
+238,211, 65,224, 88, 31,188,182, 91,175,183,178,163, 61, 0,171, 58,200, 48, 29,215, 7, 16, 66,132, 17,194, 0, 66,173,180, 86,
+ 82, 10,174,120, 33,202,148,229,113,153, 45,242, 36, 76,179, 36, 41,202, 36,103,105,201,178,162,172, 76,208, 74,107, 8,161, 73,
+176, 99,153, 46,165, 43,141, 96,125,109,179,221,191, 68,253, 54, 50, 76, 45,101,182, 24, 62,186,255,217,191,221,249,102,188, 76,
+ 94, 89,109,191,113,113,251,210,213,155,110,107, 67,107,165, 56,227, 69,188, 56,217,187,243,224,238,189,103,199,221, 70,237,205,
+221,139,141,222,182, 82,178,140,198,163,201,232,249,116,145,230,229, 74,211,114, 40,165, 6, 49, 13, 67, 3, 32,149, 18, 82, 9,
+ 37, 33,128,212, 48,170,162, 2, 35, 88,112,145, 22, 76,107,197,165,112, 76, 19, 65, 4, 1,100, 66, 10,169,180,214, 37, 23, 73,
+ 94, 46,211,108,153,229, 5, 19, 0, 0,135, 26,189,122,109,181, 25,152, 24, 63,159,204,191,122,122,164,180,186,117,253,226,197,
+141,245,209,244,228,235, 39, 7, 16, 88, 4, 0, 0, 49, 54, 45, 79, 67,160,164, 20,101,198,146, 89, 30,159,150,201, 44,205,146,
+172,200,211,156,165,140, 21, 37,203, 74, 81,112,198,184,224, 82, 41,165, 1,208, 24, 33,203, 52,108,211,172, 57,180, 83,243, 87,
+122, 43,141,149, 29, 59,232, 97,147, 66, 8, 37,231,225,224,225,195,251, 95,254,199,189, 71, 81, 86,188,210,239,252,232,218,206,
+246,133,107, 65,119, 27, 25, 84, 9, 38,121,201,178,229,236,248,219,187,123,123,247, 15, 79, 90, 53,247,205,139, 91,189,213,109,
+ 8, 33, 47,162,197,236,100,112, 26,142, 22, 17, 70,168,230, 88,182,105,152, 6, 49, 48, 86, 26,200, 51,202, 17, 84,165, 77,181,
+ 67, 16,140,210,146,199,121,161, 53, 40,185,132, 8, 98,132,184,146, 44, 23, 82, 41,198,101,206,120, 90,148, 89,121, 22,241,230,
+ 80,163, 91, 15,214,218,117,155,154,195,121,244,213,147,163,164, 40,223,185,188,253,195,221,237,188, 72,255,250,163,207, 38, 28,
+ 89,117,139, 0, 0,128,210,233,124, 16, 78, 14,162,112, 18,167, 73,154,151, 89,201,115,198, 11,206, 75,198, 25,127, 97,148,215,
+186,154,234, 38,193,174, 67,125,139, 6,174,213,174,249,157,238, 90,208,217,180,106, 93,108,216, 16, 33, 45,121, 17,158, 28, 63,
+187,255,229,131,251,119,247, 7,166, 97,236,174,119,119, 55, 86,214,214,182,189,246, 57,195,246, 33,132,146, 21,146, 23, 69, 52,
+ 25, 15,159,220,219,127,254,237, 96,212,244,156,215,183, 55,214,251,231,176,105, 9,158,167,225,120,188, 8,143,103,225, 50,201,
+ 55, 58,141,192,181, 77, 66, 76, 66, 32, 4, 66, 84, 94, 7, 93,173,141, 4, 33, 13, 52, 0,144, 96, 92,148,105,148,101, 16,160,
+156,113, 41,149,144,146, 75,201,132,228, 66,150,140, 23, 47,154,129, 10, 15,234,212,107,253,102,224, 80,115, 52, 95,222, 59, 56,
+ 14,211,226,173,157,115,239,191,186,163,148,250,249, 71,159, 30,159,134,181,118, 87, 1, 64, 0,132,251,143,255,251,227,201,131,
+172,100, 47,171,103, 46,164, 80, 74, 42, 5, 52,168,202, 48,147, 96,106, 26,158,101,214, 28,171,225, 57,205, 32,104,182, 87,189,
+214, 57,211,109, 96,131, 66, 8,149,146,101, 60,157, 30, 63,126,248,232,193,237, 39,135,139, 36,235, 55,131,247,174, 93, 60,215,
+107,181,219,171, 78, 99,205,180,107, 8, 19, 45, 5,151, 92, 20,105, 22, 30,159,156, 60,191,119, 48,220, 31, 77, 27,158,115,125,
+171,191,190,210, 55,172,154, 18,188, 76, 23,139,112, 54, 14,163,209, 98, 41,148,106,214, 92,223,182, 8, 70, 6, 66, 74,233,151,
+ 77, 57,174, 2,109, 32, 80, 10, 0,173, 13,130, 11,198,195, 36, 39, 24, 51, 33, 25, 23,165, 16, 37, 23,140,139,146, 11, 86,177,
+184, 90, 19,140, 93,203,108,215,188, 94,195,119,168,113, 50, 95, 62, 60, 60, 73,139,242,141, 11, 27, 31,220,184, 68, 48,254,187,
+143, 63, 63, 24,157,174, 52, 2,236, 88, 17, 0, 4, 2, 56, 93, 38, 58,139, 42, 41, 65,213,218, 85,107,158,105, 96,203, 52, 92,
+106,214, 28, 59,112,157,102,205,109,214,219,126,123,211,174,117, 49,117, 16, 38,103,100, 97, 60,155, 29, 63,220,219,223,251,250,
+233,209, 96, 4,206, 97, 47, 0, 0, 5,193, 73, 68, 65, 84, 22,250, 54,125,101,181,253,254,245,157,110,195,175,213,123,150,223,
+ 53,108, 31, 97, 3, 0, 32, 5, 83,188, 40,211, 48,153, 31, 31, 77, 38,191,123, 62, 60, 58, 13, 27,158,115,117,179,191,209,235,
+ 82,167,174,180, 84,101,158, 68,211, 89,156,142, 23,209,233, 50,105,250, 78,167,230,153, 6,169, 2, 46,197, 11,208, 75,107,109,
+ 98, 2, 1,228, 82, 85, 23, 8,194, 66,169, 48,201, 45,211,144, 82,113, 37, 75, 33, 25, 23,140, 11, 46,165, 82, 26, 35, 68, 49,
+114, 45,218,170,185,173,154,103, 96,124, 52, 13,191, 29,140,148, 82, 55,119,183,110, 93,223,129, 0,252,213, 63,253,251,112, 30,
+173,183,234, 43,205, 32, 67, 86, 84,156, 85,210, 34,147,188,202, 85,161, 38,177, 13,211,181,205,192,177, 3,215,106,250,110,163,
+222,245, 91,125,187,214, 33,212, 71,134, 9, 33, 2, 64, 43,206,139,112, 56, 61,222,123,122,184,127,255, 96,240,124,186,192, 16,
+110,116,154, 63,125,109,119,181, 25,212, 61,223,174,181, 76,183, 97,152, 14,196, 38,132, 80, 73,174,165, 16,101,150, 39,147,229,
+124,124, 56,157, 61, 58, 26, 79,194,164,233, 59,151, 55,122,235,157,166,227,248, 16,106,197,242, 50, 11,163, 36,155,199,233, 52,
+ 76,146,162,188,180,209, 11, 60,251,133, 64, 75,115, 33,133,146, 82, 43, 0, 0, 53, 9, 33, 56,201, 75, 46, 4, 23,170,162,173,
+195, 52,247,149,210, 0, 8, 41, 69, 5,182, 42,133, 32, 36, 6, 49, 8,241,109,218,240,220,186,103, 11, 41, 31, 15,198,251,163,
+ 83,199, 50,223,123,117,231,135,151,182, 78,163,228,231,191,252, 44,206,138,237,213, 86,175, 30,248, 54, 29, 78, 83, 64, 28, 82,
+ 97, 29, 77,151,250,206, 25, 11,220,240,107,141, 70,219,107,174, 82,175,103, 88, 14,194, 6, 64, 16,104,168,149, 16, 69,146, 46,
+134,227,227, 39, 79, 14, 15, 31, 30,157,156,204,151, 0,192,213,102,240,246,238,249,181,118,163,233,187,142,227, 81,167, 65,168,
+143, 77, 10, 17, 6, 16,105,197,165, 84, 74,150, 60,143,243,104,124, 26, 46,159, 79,102,123, 39,147,121,148,182,124,247, 66,191,
+187,218,170, 59,182, 5, 33,146,162, 84,188, 76,243,116,153,229,243, 56, 59,141, 18, 8, 96,191, 25, 88,134,169,180,130, 16, 74,
+165, 25, 23,252,133,208,138, 26, 36,112,237,105,156,165, 5,171,218,209,154, 99,157,204,151, 21, 62,161,180,174,182, 87,106, 16,
+ 3, 99,155,154, 53,215, 14, 28,203, 36,120,158,100,143,142,198,147, 48,218,232, 52,127,250,250,238,229,205,213,187,251,131,191,
+253,248,115, 74,200,213,115,253,186,231,212, 28,235,238,254, 81,130, 40,242, 28,162,129,222, 94,105,255,100,119,195,175,175, 56,
+205,190,233,212,177,105, 65,136,207, 26, 78, 37, 5,203,242,229,100, 62,122,250,236,232,240,219,163,225,193,100, 30,165, 5, 53,
+200, 90,171,241,238,149, 11,253,118,189,233, 57,174,237, 24,118,141, 80, 31, 27, 38,194, 4, 0,172,181,214,130, 3,173,149,230,
+146,149, 34,143,226,120, 54, 9,163,195,201,236, 96, 52,139,179,162,225, 59, 91, 43,237,213, 70,205,163,180,178,219, 42,174, 4,
+203,211,188,136,178, 34, 76,179,101,154, 53,124,183, 93,243, 16,132, 66,106,140,129,148,170,202, 14,209, 90, 75,165, 49,194,171,
+141,224,201,201,248,116,217,178,169, 81,249,190, 2,215,201, 75,134, 17,172,168, 31,131, 96,135,154, 53,199,114,168, 1, 0,140,
+179,226,209,209,248,112, 58, 39, 8,190,255,234,206, 31,223,184,108,154,244,111,126,245,159, 95, 60, 58,216,232,212,215,219, 13,
+223,178, 28,203,188,189,119, 32,164,178,124,175, 4,128, 0,173,123,155, 87,207,191,121, 11, 0, 4, 33,208, 90, 41, 33, 56,139,
+179,197,201,108,124,120, 56, 28, 60, 26,156, 28,142,231,139, 36,131, 16, 52,125,239, 92,183,181,209,110,244, 26,181,192,177,108,
+219, 49, 45,143, 84,243, 8, 19, 8, 17, 4, 64, 73, 1, 20,215, 90,105, 45,148,148,146,103,188,136,163, 36, 25, 45,162,231,147,
+249,225,100,158,149,172,233, 57, 27,157,230, 74,163,230,218, 20, 97,164,164,168, 4, 20, 37, 23,105, 81,198,121, 17,101,121,206,
+248,229, 70,205,166,166,172, 76,162, 18,104, 45,139,146, 87, 63, 11, 23, 66, 3,221,240,157,118,234,239, 13, 39, 91,189,166,144,
+ 74, 43,109,155, 6, 70, 8,104, 69, 77,195,183, 44,223,161, 6, 33, 37,227,199,179,229,120, 30, 77,227, 68, 8,249,234,249,254,
+207,110,190,177,214,237,125,242,213,215,127,255,235,207,165, 82, 55, 47,109, 85,198, 22, 41,213,237,199,135,182,101, 58, 20,205,
+ 74,142, 41,168, 4, 84,130,167, 97, 17,159, 38,225,100,122,122, 50, 24,143,159,141,103, 71,211,197, 60,201,148,210,158,109,246,
+ 26,181,107, 91,253,213,102,208,244, 93,215,162,150,105, 24,134,133, 12, 27, 17, 19, 97, 82, 81, 37, 90, 48,165, 53, 56, 67,239,
+164,150, 82,201, 82, 10,198, 88,190, 76,139,113, 24, 31, 78,102, 71,211, 69,193,120,211,115,251,237,122,183,238,187, 22, 37, 24,
+105,165,133,150, 0, 0,165,116,193,121, 86,242,172, 96, 73, 94,106, 0,218,129,135, 32,146,213, 50, 12, 0, 82, 48, 99, 76, 42,
+ 13, 33,168, 42,105, 4, 97,183,238, 47,146,236,249,100, 30,120,182,148, 90,202, 51,105, 22,203,138, 56, 43,197,169, 44,153,168,
+146, 40,234,174,253, 39,175, 95,126,231,218, 46, 34,230,175,111,127,245,151,191,248,199,140,241,157,126,119,187,223, 89,166,185,
+ 75,205,211, 48, 30, 46,162,102,205, 77,139,242,120,177, 4, 78,224, 86,219,252,225,211,111,254,121,244,224,100, 17, 77, 22,113,
+152,102, 5, 19, 24, 65,207,182,174,108,174,172, 53,235,173,192,243,109,139, 26,196, 32,184, 66,170,170,132, 10,160,149, 18, 69,
+149, 64,116,230,143,209, 10,168,179, 15,164,148,226, 74,114, 46,151,105, 49, 89,198,207,167,179,193, 52,228, 66,212, 61,103,181,
+ 89,235, 4,158,103,153, 6,198, 90, 3,169, 84,133, 14, 72,165, 74, 46, 75, 46, 42,118,152, 32,232, 91, 84,105,169, 36,148, 82,
+ 74,173, 49, 68, 66,200, 40, 47, 48, 68, 76,158,149, 54, 90,107,151,154, 74, 41,165, 52, 65,136, 58, 22, 23,178,224,188,178, 21,
+ 55,168,211, 9,188,141,110,163, 27,248, 76,200,111,158, 13,254,226, 23,255, 48, 90, 68, 4,227,237,149,214,149,115,253, 89,148,
+ 68, 89, 30, 56,214,100, 25,115, 33, 9, 70,243, 56,205, 11,150,230,204,177, 95,104, 20, 95,168,202,254,160, 41,253,142, 18,238,
+255, 67, 36,252,114,240,255,107,216,151, 15,195,151,194,197,239,223,253, 95,206,254,240,213,191,119, 4,127, 47, 96,123,105,120,
+ 2, 47,145,155,239, 13, 6,191, 99,138,250, 31,245, 66, 74,165,201, 66, 82,179, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/pinch.png.c b/source/blender/editors/datafiles/pinch.png.c
new file mode 100644
index 00000000000..23111e38e50
--- /dev/null
+++ b/source/blender/editors/datafiles/pinch.png.c
@@ -0,0 +1,315 @@
+/* DataToC output of file <pinch_png> */
+
+int datatoc_pinch_png_size= 9880;
+char datatoc_pinch_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 96, 0, 0, 0, 96,
+ 8, 2, 0, 0, 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,252, 97, 5, 0, 0, 0, 6, 98, 75, 71,
+ 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120,
+ 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7, 19, 0, 34, 13, 86,254,139, 21, 0, 0, 32, 0, 73, 68, 65, 84,120,218,237,125,123,
+176,157, 87,117,223,111,173,189,191,115,206,125, 72, 87, 87, 47, 75,178,101,249,141, 33, 2,130, 99, 28, 90, 7, 37,128,199, 64,
+ 33,113, 9, 36,132, 50,161,201,180, 60,146, 50,204,100,146,190, 8,109, 82,154, 97, 38, 52,153,105,233,144, 25, 50,165, 33, 77,
+ 11, 56,198,216, 6, 3, 54, 54, 24,219,216, 84,198,182,252,144, 45, 75,178, 44, 99,203,242, 67,207, 43,233,234,222,115,190,111,
+175,213, 63,214,218,251,251,206,181, 13, 46,113, 7,211,201,177, 70,247,156,163,115,191,179,191,181,215, 94,143,223,250,173,101,
+218,178,101, 11,126,228,227,133,124, 40,138,200,158,237,183, 74, 51,172,135, 11,163,133,227,195,147,115,245,104, 72,192, 91,222,
+251,111,143,207, 47,216,135, 88,129,170, 55, 8, 85, 63,196, 94,168,250,177, 63, 49,152, 94, 62,152,158,185,233,154, 79,127,226,
+119,127,195, 63, 4, 0, 80, 2, 56,132, 16,171,222, 96, 42, 86,131, 16,171, 71,119,238,233, 79,244,255,228, 67,239, 6, 16, 1,
+168, 42, 56,112,136,177, 55,224, 80,197, 94,186,254,138, 43, 99, 12, 33,112,213,171, 62,250,155,151, 69, 0,204,172, 34,204, 1,
+213, 96,219, 45,215,170,234,202,213, 51,195,197, 26,139,195, 20,155,254,160,138,246,165, 76,116,199,183,191,202,161,138, 85,148,
+148, 2, 51, 51,217,213,125, 77,177,215,191,227,134,171, 99,213,163, 64, 76,196,204, 28, 66, 8, 28, 99, 84, 85, 73, 18,206,216,
+180,233, 20, 28, 10, 33, 16, 19, 19, 17,179, 2, 16, 73, 73, 70,163,122, 97,126,241,228,201, 69, 86,128,152, 84, 21, 10, 16, 1,
+144,148,234,186, 25,141,234,209,176,174, 71, 77, 83, 55, 49, 75,213,254, 89,154,186, 25,141,234,225,226,104, 52,172,135,139,195,
+209,112, 52, 28,214,244,130,246,238,133, 60,104,207,253,183,168, 74, 83, 47,214,139, 39,134, 39,143,141, 22,231,235,225,168, 63,
+ 57,249,186,127,244, 59,229, 67,225, 95,253,193, 71, 0, 40, 0, 21,168, 16,135,254, 96, 34,132,106,125, 21,214,174, 92,254,224,
+222, 39, 0, 48, 84, 1,101, 34,219,150,170, 55,201,161,199, 33, 76, 47,155,188,112,243, 57, 31,125,223,101, 0,162,106, 3, 19,
+ 97,232, 85, 61,226,208,128,227,183,174,186,178,215,175, 82,147, 38, 38,251,155,207,216, 24,161, 68, 68, 76, 65,131,238,123,242,
+192, 83,187,238, 78, 77,154,154,154, 88, 92, 28, 14, 69,170, 42,190,249,162,205, 17,196, 4,132, 94,127,219,141, 95, 7, 16, 3,
+139,104, 8, 28, 2,135, 24,152, 41, 4,142, 33,132,239, 94,123,121, 85, 85, 68, 4, 2, 33, 68,149,212, 48, 7,102,230,212,136,
+170,134,229, 39, 15,174, 89, 59,203,204, 0, 49, 19, 1, 34, 10,213,166, 73,139, 11,163,147,243,139, 39,231, 23,249,236,243, 54,
+130, 73, 85,137, 64,128,168, 74,146,209,168,174,135,245,104, 88,215,117, 83,215, 41, 50,179,239, 28,161,105,146,109,220,112,113,
+ 52, 90, 28,141,134,163,122, 84,215,117,131, 23,107,239,138,166,224, 55,222,249,214,127,247, 7, 31,144,148, 36,213,169,169,155,
+122,161,169,135,163,225,176, 30,141, 14, 30, 60,246,225, 63,250,139, 67, 71,142,255,176, 11, 37,145,199,118,221,169,154, 82,106,
+ 84,154,212, 52,210,140, 36,141,154,209, 32, 53,195,222, 96,164,146, 86,172, 90,115,221, 23,255, 92, 84, 53,165, 53,155, 54,127,
+230, 19,127,250,201,207,127,237, 57, 86, 68, 33,144, 0, 34, 9,204, 68, 96, 86, 9, 28, 34, 0,162,160,154, 84,132,236,227, 61,
+ 58,118,240,177,153, 21,203,254,244, 35,239, 77, 77, 26, 14,235,255,240,217, 43, 59,183, 38, 73, 69, 64, 32,102,214, 0, 0, 68,
+196, 65, 82,163, 42,118, 33, 85, 81,213, 71, 30,218,185,231,193,221,147, 83, 3, 64, 83, 96, 98,250,227,247,191,235,240,193, 99,
+159,186,234,155, 17,128, 66,137, 1, 97, 34,213, 16,237,116, 50,171, 70, 1,112,228,200,220,246,219,111, 14, 33,136, 72,211,164,
+169,101,147, 41,137, 36,129, 38, 85, 85,213, 21,179,211, 31,121,199, 37, 17, 0, 19,169, 18, 40, 17, 49, 35,129, 88,184,218,118,
+243, 53, 68, 0, 72, 85,166,167, 39,146, 72,106, 18, 51, 17,129, 40, 37, 64, 85, 34,162, 42, 98,104,250,253,190, 9,130, 21, 74,
+136,223,187,233,107,149, 44, 16, 51,129, 98, 8,118,198, 68,137, 84, 88, 85, 3,139,130,153, 67, 80,133, 6, 68,213, 70, 85, 69,
+149, 8, 17,192,241,227,115, 91,175,187,122, 48,209, 15, 33, 80, 96,144, 42,136,137, 84, 65, 4, 82,101, 91,116, 67, 33, 64, 53,
+152,229, 76,154, 82,147,154,186,105,154,148,204,118,173,214, 35, 83, 83, 3, 38,178,173, 33,102, 2,152, 25, 68, 76, 4, 37,168,
+139, 91, 68, 82, 74,169, 78,245,168,169, 71,173,233, 26, 14,235,168,192, 96,208, 83,144,221, 61,129, 84,148,131, 89, 6, 36,209,
+166, 73,146,164,105,252,155,235,186,110,234, 52, 26,214,195,225,104, 52,172, 71,195,122, 52,106,106,179,129, 68,246,189,240,141,
+ 39, 18,255,114,145,148,154, 36,210,164,228,215,146,166,110,234, 81, 61, 26, 53,163,225,104,104, 79, 70,245,176,110, 94, 60, 59,
+249,162, 60, 78, 63,253,116,126,177,174,229,167,127,253,186, 53, 95,250,171, 63,155, 89,177, 76,154, 70,154, 58, 53,139,245,104,
+216,140,134,195,225,104, 52, 28,125,250,115, 95,189,246,166, 59,126,164, 7,248, 14,136, 85, 85, 69, 36, 53,154,234,166, 25,165,
+122,152,154,197,102, 52, 76,205, 72, 68,164,105, 68,100,114,217,204,247,191,127,207,239,126,236,211,207,121,107,225, 95,254,254,
+ 71, 64,204, 28, 24,164, 80, 34,216,198, 3,128, 42, 49,113,136, 85,175, 87,245,251,146,210, 57,231,111,222, 56, 25, 84,177,119,
+255, 51,221, 11,205,204,204, 68, 14, 1,170, 73, 0, 2, 17, 3,196,129, 69,152, 40, 16, 71, 54, 79, 4,144,106,136,189,122,241,
+196,133, 23, 95, 4,209, 55,189,118,243, 31,254,197, 23,187,215, 98, 34, 82,128,178, 93, 87, 34, 85, 59,127, 33,196,138, 67,143,
+ 57, 4, 98,230, 64,196, 68,180,103,199,174,170,138, 33,240,127,252,208,187,171, 24,218, 11,153,111, 3, 84, 85,137,136,137,137,
+ 67, 8, 49,132, 24, 98, 21, 98,197,177, 66,136, 20, 2,136, 57,246,142, 30,158, 11, 49,196, 24, 99,228,143,253,246, 59,102,166,
+ 38,115, 20,164, 2, 21, 95, 63,152,216,110, 42,112,136, 28,170, 80,245, 98,236,197,216, 11,177, 87, 13, 38,175,191,242,218,126,
+191, 98, 38,102,226, 16, 98, 8, 31,126,215,165,190,107,251, 30,190, 75,147, 40, 84, 53, 73, 74,182,121, 42, 73,196, 13,163,125,
+238, 91, 87, 93, 35,146,136, 8, 80, 17,149,148,154, 38, 53,117, 26, 14,235,185,163,199,191,180,245,193, 72,128,154, 72,149,136,
+ 72,149,152, 73,148, 57, 48, 88, 57,132,171, 63,247,185, 53,107, 87, 44, 91, 62,145,146, 52, 77,178,211,175,170, 28,192,162, 33,
+112, 85, 85, 23,158,119,102,132, 27, 10, 16,145,192, 54, 78, 41, 80, 12,241,166,107,174,152,156,232,157,182,113,141,168,166,148,
+ 20, 96, 85, 85,149, 32,172,100,174, 34, 4,142, 49,196,192,209, 93, 40, 67, 4,204,182,101,241,214,107, 46, 95,182,108, 98,249,
+178, 9, 0, 34,162, 73,137,148, 73,153, 73,153,136,152, 72, 56,144, 42,155,233, 96,230, 72, 68,182,229, 4, 40,120,207, 67,219,
+231,158,124,100,102,102, 90,205, 92,155, 67, 33, 85,166, 68, 32, 88,208, 1, 97,102, 69, 34, 5,212,222,117,123,196, 32,238, 85,
+183, 93,251,133, 24,130,123,122, 85,201, 38,211,140, 20, 51, 11, 43,137,121, 45, 85, 1, 84, 85,212, 84, 54,130,152, 8,183,124,
+227,235, 92, 31,137, 49,128,204,186, 65,137, 8, 10, 5, 17,192,102,191,137,137,212, 60,149,112,131, 36,170, 34, 42,170, 0, 56,
+196,234, 83, 31,251, 40,134,135,178,201,238, 60, 20, 12, 2,179,105,190,221, 21, 49, 19,145,170,170,168, 36, 17, 17, 21, 81,213,
+ 80, 29,120,252,103, 94,125,110, 21,131,125,194,111,131,148, 64,196, 76, 74, 32,133,154,196, 84, 85, 36,105,211,164,212,164,218,
+ 66,141,186,169, 71,205,209,133,154,167,151, 77, 84,189, 8,102, 82,168,201, 60,159, 65,115, 5,228, 1,164,170,136,136,166,148,
+ 36,165,148, 36, 53, 77, 74,146,108, 81,170,188,114,213, 12,149, 60, 32,223,145,218, 1, 84, 85,133, 8,252,119, 83, 74,117,146,
+ 36,230,117, 69, 52, 53, 73,146,164, 36,170,136,253, 65, 15, 38, 30, 85, 34, 22, 17,230,192,128, 42,137,152, 81,179, 5, 72,211,
+ 72,147, 47,151, 82,106,106, 95, 81, 74, 34, 42, 49,132, 0,179, 35,158, 48,152,139,133, 9,210,215,210, 72, 42,151,179,171,248,
+ 37, 83,106, 82, 74,162,170,145, 3,131,160, 68,230, 88,225,145, 38,220,169, 38,105,143,152, 57,232,148,234, 58,165,166, 92, 93,
+236, 74,120, 73,249,181,141, 27, 55, 50, 94, 74, 15, 63,178, 63,228,177,122,213,204,107,126,230,220,215,188,242,220,153,229, 83,
+ 83, 19,253, 65,175, 2, 97,254,228,194,137, 19, 39,143,159, 56,121,255,142, 71,119, 62,178,239,209,125, 79,191,136,107,138,170,
+ 10,224,180, 13,167,124,253,138,191,172,122,189,192, 44,238,199,224, 6, 91, 85, 82, 99, 86, 92,165, 73,169,134,152, 70, 54,191,
+250, 54, 49,189, 78, 73, 84,164,105,146,249,212, 71,159,120,230,143,254,252,111,158, 58,112,228,199, 92,208, 15,118,110, 85,181,
+160, 80, 96,225,174,154, 97, 16, 73, 13, 84,136,153,205,173, 36,166, 16, 53, 53,196,129, 67, 82, 73,209, 84,215,127, 93, 85,161,
+154, 54, 47,159,254,242,127,255,248,212,138,181,189,254,228,227,187,183, 95,254,197,235, 63,251,213,239,188,224, 5, 1,177,234,
+167,148, 84,133, 17, 84, 44,202,135,186, 39, 8,170,156,207, 32,177,101, 8,217,246, 10, 88, 41,155,217,174, 38, 0, 32,212,139,
+243,163,133, 99, 27,207,123,229,165,151,158, 88,183,114,166, 55,232, 19,225,207,254,230,171,199, 50, 58,241,188, 33,150, 89, 97,
+ 55, 66,230,149, 24, 16,119, 12, 10, 37, 34,133,197,170, 4, 16,136,137, 3, 0,102, 49,155,101,251,110, 11,179,229,152, 33, 38,
+138, 39,143, 62,211,159,152,232,247,123,189, 42, 42,244,223,252,214,101, 34, 42, 73,254,253, 95, 94,241, 67, 98, 62, 37,178,112,
+ 68, 61,176, 2,204,220, 90,188, 4,115, 66,162, 68, 26, 2,169, 38, 33, 82,102,136,138,237,178,133,243,170,170,106,226, 81, 5,
+136, 37,213,203,214,108,218,113,205,141,189,126, 21,171,168,162,162, 74, 73, 64,244,241, 15,254,122,106,210,127,253,219,235, 14,
+ 31,159, 95,186, 32, 85,133, 10, 65, 4, 10,109, 99, 36,128, 3, 67, 84, 33, 0, 19,155, 76, 82,130, 82, 32, 21, 17,176,146,170,
+106, 50,175, 0,181,188,208,238, 71, 85,100,110,110,254,134,175,124, 54, 4,142, 85,176,251, 14, 64, 34,144,144, 16, 0,253,240,
+175,189,121,113, 97,248,159,175,184,126,212, 52, 29, 9,185, 10,123, 68, 3, 37, 98, 18, 81, 64,149, 2,137,128, 65, 74, 2, 2,
+ 36,144, 71, 34,156,213, 31,168,242,174,153,110,163, 30, 53, 55,127,253,218,212, 40, 7, 30, 76,244,221,165, 64, 33, 80, 8, 43,
+231, 69, 3, 74,131, 9,252,222,175,191,229,232,220,252,103,190,118, 83, 71, 66,134, 62,152, 19, 97,182, 28, 15,112, 69, 0, 24,
+ 36, 76,172,230, 36, 85, 8, 65, 85, 45, 1,178,124,106,126,126,225,123,223,188, 94,155, 97,213,175,136,120, 98,114,210,240, 33,
+ 69, 62,178,170, 66, 66,202,196,194,170, 74, 20, 60,243, 10,210,171,150, 47,155,248,208,219,223,248,205, 7, 30,201,209, 21,204,
+197,219,150, 65,109,125,176,188, 84,125, 93,164, 34, 66, 12, 85,243,226,124,244,216,137,219,175,253,242,236,170, 25,102, 2,116,
+197,138, 9,145,190, 39, 14, 73, 84, 84, 2, 75, 18,101, 37, 81, 73, 66, 68, 34, 66,137,192,204, 16,128, 52, 4, 0, 49,114,138,
+ 97,208,175, 46, 56,103, 83,108, 15,134,136,144, 39,211, 4,242,133, 89,212, 66, 12, 21, 34,138,189,222,193,103, 14,108,187,249,
+186, 21, 43,150,155,242,158,178,126,117, 86, 66, 17, 40, 51,105, 14, 28,132,148, 68, 29,207,129, 64, 73, 84, 73, 45,202, 83,102,
+ 86,128, 33,170, 30,185,197, 24,152,185,227, 58,242, 65, 34,129, 80, 22,155,130,152,171,222,224,246,111, 92, 21,208,152, 33, 88,
+181,106,133,109, 52, 17,196, 2, 71,130,128, 88, 32,109, 6, 75, 76, 36,148, 60,192, 50, 32, 9,204, 44, 0, 9, 2, 84, 24,164,
+ 66, 14, 33, 17, 12,107,244,240,211,238, 18,204, 80, 85,114,148,105, 52, 74,119,222,120,117,191,223, 35, 80, 21, 64,176,152, 82,
+ 1, 21, 16,131, 84, 96,193, 10, 65,153, 57, 65, 73,114,172, 79, 4, 86, 82, 38, 74, 30, 64, 51,147,138,130, 1, 16,105, 74,212,
+181,238,154, 99,160,152, 1, 74, 54,189,230, 64,135, 15, 31,190,243,250, 47, 79, 45,155,100,230,254,160, 79,190,226,130,100, 18,
+ 64, 12, 85,201, 38,185,132,170,118,195, 46, 32, 75, 31, 52, 3,168,100, 73,158, 64, 72, 41,219, 22,143, 67,237,132,231,184, 26,
+ 32,102,128, 36,201,103, 62,241,241,151,191,226, 12, 14, 60, 57, 61,153,197,132,188, 59,157,151,182, 45, 12,133, 66,149, 13,219,
+ 36,130, 50,145,144,197,140, 68,194, 32, 16,131, 85, 21, 16,245, 92,201,147, 65, 81,149,164,146,227,105, 15, 97, 85, 35, 1, 71,
+ 15, 60,241,223,254,211,127, 57,243,236, 83, 95,177,249, 76, 38,246,208,218,112, 93, 17, 38, 86, 86,183,231,228, 33,170,171,152,
+105,155, 18, 88, 72, 13,119, 98, 17, 97, 82, 9,204,162, 0, 68,139, 94,185, 44, 84,196,162, 79, 17,105, 35,124, 81, 17, 1, 52,
+108,218,180,233,192,246,123,206, 60,231,180, 85,171, 87,144, 47, 7, 14,211, 0,228, 97,186,173, 79,137, 88, 29, 48, 53,185,193,
+126,195,101,103, 54, 11,237,134, 64,115, 88,239, 0,141,166,198,158,120, 20,157, 26, 95,156, 5,196,199,134, 18, 1,156,186,241,
+148,101,203,167,216, 48, 87, 87,121,136,154, 89, 26, 87, 32, 85,102,130, 42,152,203, 89, 16, 85, 40,212,110, 62,137,231, 71,201,
+ 48, 74,179, 72,234, 33,115,202, 1,182,201, 38, 63,207,121,135, 2, 26, 21,152,158,158, 12,129, 91,157,161,188, 59,118, 30, 68,
+ 64, 76, 12,219, 28, 95,112, 62, 28, 98,255,249, 86,136,228, 60, 71,218,191,165,236,142, 1, 97, 37,103,232,138,202, 69,168, 26,
+205, 80,122,102, 72,202, 32,215, 97, 82,162,110, 40, 1,102,219, 15,147, 72, 22,137,228,115, 34,174, 34,157,117,228, 39,150,135,
+ 53, 46,145,166,105, 44,191,203, 73, 72,155,150,168,104, 4,192, 33,128, 60,219, 5, 20, 96,144, 90,145, 68, 85,153,217,160, 71,
+117,181, 83, 91, 77, 89, 73,251, 92, 92, 98,101,203,252,190,187,226, 73,226,169, 79,155, 30,149,172, 81,196, 78,217,189,143, 60,
+221, 38,174, 89, 93, 8, 93,219, 99,206,218, 36,147, 83, 73,136, 8, 90,227,150,101,166,238, 73,180,251,112,217, 37,180, 55, 34,
+229,111,181,163,150, 68, 79, 38,188,196,240, 70,203,205, 94, 58,139,217,178,101, 11, 63, 7, 94,241, 19,125,188,180, 50,215,151,
+226,130,126, 68, 42,253,218,159, 61,255,172, 77, 27, 94,126,206,233,147, 19,253,233,169, 65, 21,195,194,194,112, 97,113,120,236,
+248,252,190, 39, 15,236,216,253,216, 29,247,238,250,127,184,160, 24,195,207,110, 62,255,183,223,123,217, 27,183, 92, 36, 2,145,
+198, 14,169,170,165,173,102,101,107, 17,131,120,154, 38, 73,106, 26, 21,173,235,230,150,255,125,255, 85,215,223,190,235,209,253,
+ 47,206,130, 62,250,251, 31,120,223,123,222, 65, 28,114,196, 47, 65, 36,160,103,222,200,114,106,226,134, 67, 72,137, 57, 5, 9,
+137,154,192,146,180,138, 41,165, 80,197, 75,126,241,130, 75, 94,255, 26, 5, 82,146,255,113,229,141, 95,248,202,205, 63, 38, 0,
+242,201, 63,249,195,119, 94,118,169,122,128,211,245,147,185,114,102, 72,177, 97,199,169, 17, 73,146,106, 73,141,106,146,100,117,
+ 53,119,102,102,157,137,169, 55, 24,196,106,112,244,224,193,207,125,225, 27,255,243, 43,223,249,191, 58,246,225,151,223,254,214,
+151,159,127, 46,135,216,130,145,212,134,124,157,160, 80, 75,216, 81,222,203,128,187, 85,221, 99,136, 49,132, 64,196, 34, 41,132,
+222,170, 13,103, 93,116,193,249, 23,156,185,238,222, 7,247,254,240,124,190, 60, 54,109,218, 20,137,152, 67, 48,185, 8, 18, 81,
+ 80,241,148,193,162,126, 37, 2, 49, 81, 80, 82,166, 0, 86, 81,101, 46,113,207, 24, 64, 89,170,227,146, 70,243, 71,246,175,220,
+240,178, 87, 93, 52,124,251, 93, 59,215,172,153,253,196, 95, 95,213, 36,249,209,199,158,136,136,130, 69,253,204,172, 4,199,108,
+ 41,199,105, 84,240, 89,134,191,201,234, 47,131,177, 14, 80,254, 48, 19, 5, 14, 85,168, 6,196,225,240,147,187, 79, 61,231, 85,
+ 34, 18, 2,255,241,251,127,237,159, 93,246,134, 23, 96,135,168, 36, 45, 4, 16, 19, 59,192, 97,238,191,120, 90,143, 68, 74,138,
+195, 32, 34,182, 53,181,127, 24,129,217,185, 19,196,145, 57, 52,163,197,201,137,126,136,204,129,206, 60,117,237, 39,254,197,123,
+166, 39, 6, 63,218, 48,230,192,213, 3,120, 3,102,140, 81,209, 89, 25, 90,240,155,136, 40,112,126,184, 12, 51,220,239,107, 34,
+ 34,102, 73,205,196, 68,223, 94, 4,102,168,252,235,127,122,217,133, 47, 63,251,135, 44,136, 90,124,186,171, 7, 5,216, 35,127,
+ 65,174, 76,140,172,200, 68,246,199,191,158,179,156,145,115, 2, 77, 77, 61, 26,246,251,189, 24, 99, 8,158,128, 51,225, 87,182,
+252,220,251,127,249,141,207,183, 32,237,220, 59, 90,244,169, 77,199,104,108,155,136,152, 25, 28,172,194,212,217, 32, 6, 51,152,
+236,143, 26, 70, 68, 97,215,125,119,199, 94,176,130, 84, 8,108,171,102,194,105,235, 87,125,224, 87,222,240,220, 91,150,115, 71,
+133,106,174,198,105, 27,190,154, 72, 40, 87,154, 57, 16, 49,187,234,176,169, 14,136,193, 1, 84,196,100,105,106,154, 94,121,234,
+206,251,118,196, 24,137, 77,168, 28, 66, 96, 14,196,204, 68,235,215,204,254,243,183,253,210,115, 75, 40, 99,114,121,175,180,200,
+134, 75, 49,199,144, 60,246,141, 51, 73,133,252, 77, 33, 47,221,151, 37, 41, 77,205,110,184,225, 75,151,171,192, 5,227, 57,175,
+137,210, 43, 82,167,172, 94,241,155,151,252,195,241, 5,101,140,176,108,149,125, 21,217,175, 22, 41,217,119,219,154,202,177,178,
+122, 40, 71,175, 30,134,200, 33, 48, 71, 85,141,253,233,235, 46,255,226,201,249,197, 88, 5, 14, 33,216, 57,117,187,155, 41, 16,
+ 76, 49,240,134,181,179,175, 61,239,204,174, 47,115,132, 16,228,224,162,225,141,142,112, 89, 82,172, 4, 73, 68, 65,145,152,130,
+128,140, 99, 97,124,140,140,120,121,188, 13, 96,207, 67, 59, 31,126, 96, 87, 8,220,235, 85, 86,247, 32, 34,130, 64, 36, 87,235,
+ 8, 74,162, 76,172, 85, 85, 93,252,202,243,118, 63,241,244,209,249,147,249,216,103, 52,206,109,144, 82,123,198,188,182, 12,152,
+212,178,249, 97,211, 24, 23, 85,100, 14, 28, 98,136,131,199,246,254,224,250, 47, 93,253,216,158,189, 19,147,253, 94,191, 10, 85,
+ 8,129,221,154,229, 4,152, 28,202, 37, 38,178,210,112,175, 23,223,243,134,215,181,192,185,217, 31, 2,137, 10,188,176, 5,175,
+ 54, 19,145,230,194,160,167, 68, 6,168,185,149, 32,143, 91,122,247,108,221,250,216,206, 29,147,211, 19,211,203,167,138, 82,166,
+148, 60, 85, 49,224, 38,131,197, 29,127, 73,166,233,253, 94,124,199, 47, 92,120, 8,136, 84,116, 86,197,234,117,230, 58,197,234,
+137, 66, 32, 85,101, 34,129,146,182,198,192, 33,107, 5,223,119,199,247,159,216,253,224,204,202,153, 85,107,102, 85, 33, 42, 80,
+ 52, 41, 1, 10, 4, 17, 9,196, 9,106,216, 72, 54,247,134,195,219,145,112,205, 60,101,197,244,193,185,228, 24,163,230, 4,153,
+ 44, 35, 52,101, 2, 9,219,155, 2,144, 20,204,193,153, 46,213, 13,215,124,165,207,139,177,138,107,214,173, 46,169, 26, 9,139,
+104, 12, 33,137, 48, 43, 84, 5, 8, 12, 17,219, 10, 7,142, 50,152, 97, 88, 22, 89,133, 30, 72,177, 4, 24,226,187, 84,242,122,
+131, 27, 5,148,209,112,114,128,161,234, 15,110,249,198,181, 58, 58,182,124,178, 7,244, 13, 95, 55,144,209,150,204,140, 36, 6,
+ 22, 41, 49, 83, 74,206, 13, 3, 41,105,177, 33, 16,119,142,238,225, 13, 0, 45,184,134, 59, 79,241,163, 66, 4, 17,205, 88, 35,
+140,230, 8,142,247,220,254,221,209,177,167,251, 33,208, 96,160, 14, 70,152, 57,101,135, 3, 12,233, 35, 82,127, 9,175, 74,216,
+193,135,136,171, 79,198,162,179,164, 12, 59,136,121, 61, 32, 15, 94, 61, 42, 83, 45,208, 35, 1, 26, 98,181,109,235,214,122,110,
+ 63, 7,142, 85,116,213, 44,184,132, 42, 84, 58, 37,109,247,180, 89, 30, 84, 46,231, 88,168,175, 40, 31,138, 44,167, 78,144, 79,
+230,222,225, 78, 72,213, 1, 6, 16, 51,239,217,185,251,192, 35,247,199, 42,112,224,178,159, 25, 60,202,159, 36, 38, 41,110,208,
+235, 54,228, 26,227,247, 72, 4, 17,151, 24,131,149,100, 73, 96,215,205, 58,152, 72, 32,234,251,156,183,106, 56,170,183,126,243,
+202,233,169,126,213,143,112, 12,132,224, 0, 43, 72,196, 0, 45, 34, 77, 73,137, 12, 98, 83, 64,202,173,163,227, 20,179, 92,200,
+ 66,210,241,149,248,209,139,173,253, 83,182, 50,134,221, 61,113,216,250,157, 27,185,158,155,158,238,119, 64, 71,167, 66, 88, 69,
+ 95,216,106, 34, 25, 20, 53,194,152,241, 54, 60,196,132,162,108, 22, 64,196, 12,145,236, 58,115,229,175, 91,112, 43, 56,117,190,
+158, 2, 68,243,243, 39,239,191,249,218, 16, 25, 76,101,237,121,107, 51, 47,128,136, 76,162,108,154, 10, 17, 47, 75,229,186, 91,
+177, 90,110,170, 57,151, 40, 50, 40,239,200, 78, 94,145,235,144, 69, 27, 46,214,106, 80,221,242,245,175,208,232, 40, 7,143,101,
+205,163, 65,161, 25,245, 51, 93, 85,136,111,128,170, 85,105,124,189, 12, 36,223, 72, 15,236,216, 62, 75, 74, 4, 22, 36,171, 60,
+180, 24,146, 5,135,118, 5, 70,222, 15,230, 48, 28,214,159,255,212, 39,211,201,195,174,173, 29,141,211, 66,133,206,134,157,193,
+118,176,149, 72, 65,170,229,132, 83, 27,128, 3, 37,190,117, 79,159, 47,163,218, 69,241,181, 85,106,179, 2, 33,196,135,238,217,
+122,223,109,183,174, 91,191,134,152,252,174,221,169,105, 23,147,224,142,223, 45,130, 45, 6,184, 4,229,153,255,231,165, 10,171,
+ 42, 16,224,245, 71,237,174,201,131, 6,147, 80,180,156,230,214,107,255,118,215,246,135,206, 58,231, 52,183,154,165,118,150, 53,
+171, 5,246, 75, 85,130,178,129,207, 37, 72, 21, 55, 74,201,107, 41,146, 89, 58, 90,206,147,139, 36, 3,183,190, 20, 95, 29, 0,
+112, 83,215, 55, 93,241, 87,119,221,126,215,166, 51,215, 83,134,193,139, 37,113,183,219, 41,105,184, 9,227, 54,109,115,179,134,
+236,160,156, 29, 90,238,192,239, 98, 9,248, 40, 2, 93,242,128, 2,136, 15,109,187, 99, 98,184,120,238,203, 78,143, 49, 80,135,
+ 34, 3,234,218, 44,245,131,222,205,136,188, 82, 46,102,183,178, 45,182,178,155,182,216,169, 85,176,178, 96, 90,116,219,241,207,
+177,141, 3,192, 71, 14, 29,159, 93,185,124,114,122, 2, 68, 0,117, 75,240,157,117,103, 82,151, 39,107,109,158, 68,134, 33,147,
+170,149, 35, 93, 59,202, 6,149,125,145, 2, 97,136,136, 10, 32, 16,237,110,156,159, 33,174,122, 97,118,229, 50,143,122,139,216,
+129, 49, 17,181, 5,116, 43,205,106,166,237, 43,216,244,153,168,115,122, 51, 55, 34,215,120, 50, 58, 98,128, 48, 20,218, 86,127,
+ 92,108,134,113, 3,136,189,170,234,247,123, 28, 76,232,214, 27, 64,224,165, 80,104, 7,191,206,117,190, 76,116,204,220,167,124,
+134, 5,154, 75, 79,154,161,244, 86, 54,185, 2, 81, 86,216,194,220,102,135,170, 94, 21,171, 88,140, 7, 88, 11, 74,222,234,147,
+ 27, 10, 33,116,178,165, 12,161,231,114, 7,188,140, 80, 54,194, 1,242,182, 4,145,151,213, 22, 33, 84, 10,211,196, 41, 27,198,
+168,107, 97,123, 21, 34, 86,234,236, 87,121, 65,218, 69,245,187,187,163,237, 66,114,217,165, 43,137,188, 8, 53, 44,110,188,110,
+132, 22,212,183, 45,179, 20,204,190,217,171, 43, 96,183,113,228, 96, 67,113,119, 86, 94,149,220, 32,161, 29, 73,136,168, 2,173,
+140,140,157,233,148,159,178, 83,229, 81,222,247,109, 53,131, 0, 32,102,163, 2, 37, 49,184,200, 3, 23,245,128, 86,225,117,160,
+ 28,184,121,125,180, 35,237,252, 52,111,129,221,183,223,120,106,203, 26,157, 83, 38,232,252,174,148, 67,111,174,195, 67, 46,109,
+195,125, 5,108,227, 60, 87,233, 0,101, 29,139, 82,214,209,170,106,187, 23, 42, 99, 91,150,212,235,118,121,251, 82,174, 30,105,
+231, 29,128, 98,139,159, 88, 68,202, 96,180,208, 84,201, 21, 61, 25,209,156,174, 26,115, 64,199,202,100, 42,229, 47,163, 75,182,
+ 27,229, 39, 42,101,237,150,206,118,251, 97,131,168,250,130,168,132,187, 0,148,148,141,217,160, 86,248, 47,118,200,255, 88,222,
+ 37, 93,107,215,249,150,148,141,138,189,239, 48,110, 6,115,219,181,182,139,213,142,165, 2, 40, 62,121,248,196,182,221, 79,122,
+200,159,195,169,238, 41, 43, 46, 92, 75,169,172,252,236,152,144,226,144, 74,205, 81, 91, 27,132,103, 73,177,221,212, 82, 15, 53,
+230, 22,109,217,178,229,200,145, 35, 71,143, 30,125,169,149,133,126,178, 15, 85, 93,177, 98,197,236,236,108, 4, 48, 55, 55,247,
+248,227,143,255,189, 80,158, 77,242,156,157,157,229,191, 23,196, 79, 89, 57,241,167,172,188,249, 99,105, 38, 66, 8, 85,140, 6,
+250, 26,146,102,102,175, 73,233,255,115, 1,205,206, 44,251,197,139,127,238, 21,231,159,121,193,230,151,157,118,234, 41,193,201,
+ 61, 6,101, 26,107, 82,243,223, 41,123,206, 84,194,141,194,175, 40, 84, 15,163,247,207,205,205,223,187,227,145, 29,123,246,109,
+221,246,208,193, 35,199,126, 10, 4,116,206, 89,167,191,249, 77, 23,191,246, 53,175, 92,191,110,237,105,235,215,132, 24,205,185,
+138, 36, 56,131,215, 76,189,100,103,107,205, 29,170, 42,176, 4,199,159,104,167,217, 81,116,140,208,227,229, 89,136, 78, 79, 79,
+174,223,176,250,210, 95,186,208,136, 45,246,145,197,225,232,192,161,163, 79, 60,117,232,222, 29,123,239,188,111,247,254,103, 14,
+255,100, 76,245,235, 95,255,250,147,243,199,215,175, 93,241,143,223,118,201,235,126,254,130,137,193,192,130, 96,203,138,199,242,
+141, 76,207,201,175, 68,187,113,163,165,124,200, 33, 77, 17,135,197, 27, 72,240,240, 39,105, 55,171,135,135, 77,206,116,119,206,
+108,139,200, 59, 60,196, 20, 67, 0, 81, 83,167,131,135,142,222,120,235,221,183,223,245,224,222,199,159, 62,254,194,138,202, 63,
+222,227,244,211, 79, 63,227,140, 51,162,170,190,239,159,188,243,178,183,189,169,228, 95,172,158,197, 27, 45, 17,100, 11,135, 5,
+175,160,160, 42, 78, 93, 85, 81,163,181,170,168,146, 26,135,215,152,156, 66, 8, 76, 42,198,172, 85,101, 69, 98, 18, 40,137, 8,
+192,202,106,228, 88, 4,151,115,102,180,129,160, 34, 74,109,132, 7, 67, 61, 3,243,212,242,169, 21,171,215,157,183,249,213,191,
+ 35,105, 97,254,232,220,161, 67,251,247, 61,243,191,174,190,233,219,119,108,119, 90,213,139,126,196, 20,224, 16, 67,236,185,122,
+183,169,170, 90,251,154,113, 20,200,159,104,102,119, 10, 21,254, 61,121, 73, 5, 90, 18, 71,203, 20, 4, 2,107, 86,131, 8,236,
+137, 18,131, 21, 2, 17, 13,185,135,168, 91,217, 53,112, 40,116, 17,151,124,138, 21, 77, 61,108,234, 81,172,250,131,169, 21,179,
+235,206, 90,181,254,156,181,167, 61,179,124,102,217,235,206, 63,107,238,232,137, 39,142,204,221,112,231,246, 23, 87,173, 98, 41,
+198,112, 6, 88,168, 77,248,237,172,229, 34,172,107, 84,174,153,147, 66,172,186, 33, 68, 65, 33, 48,198, 62,140, 8,172,214, 32,
+200, 74,234,210,177, 78, 3, 67,243,124,160,129,122,149, 80, 11, 20, 55,142, 88,143, 39, 23, 45,250,163, 11, 39, 14, 47,206, 31,
+ 29, 44, 91, 57,123,202, 89,175,156, 89,245,204, 83,135,158,121,230,193,243, 54,174,219,124,246,198, 24,195,161, 99,243, 55,220,
+113,223,142,189, 79,168,234,139, 32, 32, 34, 16, 7,104,242,178, 2,137,118, 22, 70,234,146,112,168, 65, 29,170,202,121, 45, 8,
+ 44, 36,206, 76,181,234, 66,254,105, 84,126,199,191,140, 96,238,232, 57,219,201, 37,167,209, 63,203, 52, 62,235,133,162,240,110,
+141, 20, 2, 85, 29,206, 31,109, 22, 79,174, 60,245,220,141,103,109,122,224,158, 93, 85,140,177,138,129,121,237,202,229,239,125,
+203,197, 0, 53, 41, 93,254,205,239, 61,184,119,223,223,209,139, 17, 89, 77, 78,189,252,235,132,236, 82,187,179, 35, 35, 74,185,
+232,105,124,157,150, 17,236, 29, 37, 25, 27, 80,237, 0,143,249,247,137,160,156, 33,118, 2,132, 56, 44,213,149,231, 19, 19,181,
+180, 27, 71, 59,188,189,144, 37,141,234,197,249, 88,245, 38, 39, 6, 85, 21, 66,198,111,172,125, 55, 6,126,207, 91, 46, 38, 96,
+238,196,201,207, 95,119,219, 19, 7, 14,255,248,110,222,165,130, 92, 22,104,241, 77, 47, 22,228,134, 19, 42, 12, 97, 42, 88,190,
+116, 0,244,194, 13, 81, 87, 23,151, 35, 49, 72,160, 12,101, 82, 41, 71,185,212, 91,116,236, 28,117, 0,177, 92, 17,200,245,247,
+ 92,169,245,108,157, 1, 28,124,242,169,193, 68,223,152, 84, 86,156, 70, 78,238,137, 84, 69,103,166, 39, 63,248,206, 75, 82,147,
+182,110,127,248,134, 59,238, 79, 47,216,162,199,231,214,106,152,254,119, 72, 23,237,130,149,168,219, 31,133, 92,143,113, 89, 88,
+ 5,205, 0,105, 51, 73, 68,156, 97, 80, 98, 27,133,160,118, 74,115,223, 16,193, 26,154,203,238,180,224,115,174,106,160, 16,206,
+178,193, 82,104, 74,245,228,204,154, 67, 79,239,127,122,255,211, 85, 47,134,192, 28,216,160, 35,115,126,102,226, 4,106, 13, 38,
+ 20,194, 63,120,213,121, 63,191,249,156,199,246, 31,188,226,166,173, 39, 22, 22, 95,184,128, 60,242,104, 75, 9,228,229,101, 63,
+ 47,185, 45,135, 8, 38,253,194, 2,104,195, 3, 85,182, 82, 80,203, 50,202,112, 49,172,120,166, 10,205,214,217,218, 22, 20, 80,
+134,159,109,165,214,175,121,176, 69,212, 61,133, 70,251,178,253, 75,169,158,154, 93, 63, 92, 92,184,251,187,223, 29, 46, 14, 99,
+229, 83,114,138, 90,107, 32, 3,193, 45, 32, 73, 34,230, 65, 1, 58,125,195,154,223,123,247, 91, 15,205,157,248,226,141,183, 47,
+105, 32,123, 78, 1,185, 58, 82,113, 94,230, 95, 36, 87, 39,160, 54,128,133,188, 33,128, 69,196, 82, 45,223,114,133,245,201,136,
+112, 62, 5, 12, 21, 82,136, 88,255,111,128, 42,121,239,182,118, 91, 32, 41,135, 10, 46, 36,116, 72, 27,185, 93,110,137,207,151,
+212, 48,199,229,171, 78,125,244,161,237, 59,238,121, 96, 97, 97,200, 28, 10, 65,170, 88, 70, 23,179,178,136,130, 17,136, 29,121,
+166, 64, 44, 20,121,213,138,233, 15, 94,246,198,253, 7,142,124,254, 91,223,171,155,244,252, 2,242, 3,212,130,115,176,124,202,
+171,109, 25, 39,183,144,198,172, 53,179,151,163, 33,196, 36, 34,185, 18, 33, 45,179, 7,129, 88,189,123,219, 66,109, 10,153, 20,
+ 97, 98, 45,167, 74, 58,231,166,195,167,234,170,183,253, 76,137, 56, 76, 78,207, 62,249,232,158,219,110,188,121,254,196,130, 49,
+118,109,178, 8,185,159,180,222,242, 82,239, 70,135,152, 1,111, 73, 18,114, 48, 23,113,195,154,149, 31,249,213, 75,239,223,243,
+248,141,119, 63, 32,207, 10, 11,198, 52,168,236,161,251, 98,167,212,120, 75, 13,178,239, 22,199,104, 11,231,198,235,202, 76,240,
+134, 52,235,234, 42,196, 2,159,109, 65,197,126, 81,167, 24, 78, 94, 75,106,139, 75,109,123, 96,107,182, 5,138,222,196,244,145,
+131,207,236,184,251,142, 35,135,230, 36, 37, 34,138, 49,112,185,211, 22,161, 85, 5, 19,180,176,215, 60,188, 16,120,144, 42, 96,
+102, 83,129, 16,216, 62,243,170,179, 55,158,119,218,186,107,183,222,251,232, 83, 7,158,199, 6, 1, 68, 10,209,210, 97, 66,121,
+194,145,189,206,158,206,152, 68, 74, 48, 73,121, 85,156,205,144,216, 15, 8, 40, 16,140, 70,163, 25,249,167, 14,207, 78, 59,229,
+ 90,237,248,174,165, 27,200, 33, 46, 46, 46, 62,190,103,239, 19,143, 60, 50,127,252,132,209,224, 98, 12,228,211, 18, 44, 32,202,
+198,221, 89, 22,110, 77,213,249, 13, 76,240, 1, 20,217,122,122, 29,212, 38,130, 33,114,225, 6,188,253,117,175,222,187,255,224,
+117,119,222, 87,220, 92, 44, 16,183, 51,216, 76, 38,109, 96, 75, 12, 47, 85,230, 74,166, 26,109, 65,209,126,150,201, 38, 76,104,
+113,177,118, 36,115, 83, 99,238,221,109, 97, 0,103,122,181, 7,136, 10,227,149, 1, 90, 92, 88,120,102,255,147,187,239,187,231,
+196,177, 99,253,193, 32,132, 16, 2, 79, 78, 77,118, 34, 45, 47,205,120,199,100,158,153,144,177,134,252,161,194, 90,113,153,104,
+ 41,144,138,151,167,137, 4,198, 7,141, 21,247, 17,207,218,176,250,183, 46,253,133, 47,221,250,125,203,189, 98,199, 8, 82,233,
+145, 82,251,207,212, 73, 75, 64, 82,104, 44,153, 80, 32, 78, 71, 17, 17,235,173, 22,107,166,182,110, 96,175,170,139,157, 32,103,
+180,100, 38, 79,135, 61, 98,204, 60, 94, 88, 24, 61,112,247, 93,251,118,237,236,245,170,254,160,226,200,253,126,156, 56,101,181,
+ 15, 73, 50, 11,146,164,116, 46,122,177,214, 61, 40,137,183,126,149,102, 38, 63,216,172, 44, 16, 23,156,183, 16,147, 66,189,248,
+175, 86,154, 85, 86, 86, 14, 28,180,138, 58,232, 85,239,122,253, 69,251, 79,142, 78,104, 62, 98, 37, 46,244, 64,208,200, 37,146,
+163, 68,207,200,109, 10, 9, 76, 10, 22, 20,219,239,100,119,230,100, 19,245, 34,173, 19,246, 60, 4,245,183, 60, 20,102,102,142,
+113,223,163,251, 30,222,126,255,201, 99,135, 2,201, 96, 98, 16, 98, 88,183, 97,181,118, 66, 71, 83,142, 96,160, 8, 52, 82,244,
+210,141,177,172, 40,148,250, 24, 49,135, 12,149, 88,251,157, 49, 93,132,164,112,159,114, 16,235, 34,102,134, 10,132,192,196,202,
+162, 76,129, 89, 3, 87, 49, 40,116,162,233,157,176,222, 63,228,169, 89,153, 52,208,209,201,174, 33,101,182, 29,243, 39, 30,255,
+145, 26,123,202, 13,121, 38,170,250,176,152, 14,165,138,137, 67,168,155,116,240,233, 3,123,119,238, 56,184,111,239,138,217,233,
+170,215, 27, 4, 12, 86, 78,119,183,169,216, 20, 21,207,110,148, 52, 55,218, 43, 11,107,112,169,120,216, 33, 57,201, 81,120,151,
+175,177,153,156, 77,196, 66, 66,106, 92, 11,231,132,100, 99,132,164,206, 13,164,150,216,201,196, 26,153,153,164, 75,126, 35, 51,
+179,206, 66,242,195, 45,157,198,113,228, 88,217, 40,145, 57,172, 83,101,133,128,193, 46, 75,235,117, 86,181,254,104, 24, 9,127,
+238,232,209,187,110,187, 5,195, 99, 19, 19, 3, 14, 28,128,117, 27, 86,163,205, 99,197, 54,220, 90,160,179, 30,171,187,159,108,
+164, 74,239,106,209,115, 21,205,173, 1, 32, 19, 25,231, 92, 91,139,245,241,140,210, 37,229, 23, 81, 8,169, 88,164,175,109,237,
+214,233,221, 42,204, 29,186, 34, 50,165,211,236,173,104,135,239,210, 33, 0,117,243,234,241, 4,197, 12,142,150,123, 99,238, 85,
+189,131, 7, 14,238,190,255,238,250,196, 28,161,137, 85, 92,214, 39,244,167, 58,160,143, 31,186, 76,202,133, 72,241,246, 93, 35,
+149,169,238,158,117, 8, 10, 97, 80, 75, 74,211,110,171,150,192, 34,255,166, 40, 58,195,107,236,252,251,189, 42,105,167, 17,194,
+237,169,169,138,245, 9,140,185,249,220,162,233,188,207,226,159, 41,119,106, 42,145,169,166,106,235, 59,218, 8,132,168,170,170,
+147,243, 11, 79,252, 96,239, 99, 59,183,247,163,196, 94,143,129,254, 32, 0, 1, 57, 16, 29,111, 50,112, 58,175,138,218, 8, 35,
+ 51,115,236,176,174,249, 4, 45, 49,136,115,244, 40, 31, 33,100, 95,130, 14, 75, 9, 93, 90,170,199, 31,222,194, 89, 88, 84,217,
+202, 83,203,216,131,228,103, 29,114,101, 39, 14,242, 9, 5, 68, 45, 59,216,163, 90,178,245,162,228,141,173, 49,226,220,190, 31,
+134,139,139,247,220,126,139, 12,143,218,136,201,233,201, 88,170,250, 57,232,247, 14,238,150, 15,159,223, 68, 62,140,206, 15, 80,
+ 55,192, 70, 70,130, 74, 73,221,209,114, 42, 41,235,172, 81,184, 10,108,144,161,134, 18,106,230,184,181,205, 34, 45, 96,241, 20,
+ 79,198, 2,117, 63,199,153, 41,138, 49, 13,114, 38,146, 13, 62,107, 53,213,103, 12,138,213, 24, 37,235, 14,135, 80,245, 6,187,
+119, 60,184,255,225,237,172,117,140, 28,137,208,239,217,198,218, 28,144, 12, 30,105,230,193, 81,185, 71,195, 36, 61, 91, 50,219,
+215,198,211,121,210,137,182,116, 67,219, 84, 23, 52,149, 35, 10, 15,206,178,202,251, 72, 50,143, 93,213,134,186, 20,205, 18,103,
+133, 43,196,246,188, 37,185,182, 88,101, 9, 92,233, 57,202, 62,133,176,101,231,179,116, 56, 88,208, 14, 64, 99, 8,117,147, 30,
+219,179,107,223,195, 15, 68,170, 67,136,189, 64,160, 64, 90, 80, 32,202,208, 98,230,188,186, 97,202,249, 94,154,154, 15, 41, 0,
+ 0, 6, 9, 73, 68, 65, 84,217, 78, 29,107,142,179,163,150, 67,164,188, 23, 30, 16, 3, 45, 11,144,196, 25,145,121,140,105, 86,
+ 24,111, 34, 39,178,224,141, 24, 98,120, 1, 41,196,189, 71, 14,155,164, 3,129,151,249, 54, 58, 30,199,211, 24,162,152,209,247,
+156, 99,101,250, 73,113,113, 2,218,187,123,215,174,187,110,157, 89, 54, 9,166,126, 36, 32,162,164,172,228,243, 50, 11, 51, 14,
+220,181,230,148, 89,187,118, 91,166,149,197,239,101, 98,173,207,221,117,138, 51,160,176,236,128, 90,194,139,123,156,194,136, 86,
+ 44,137, 93,145,167,139,104, 65, 81,252,150,144,141, 51,186,124,193,238, 1, 83, 64,159, 5,138,199, 18,165,168,163,163,140, 60,
+ 3,130, 3,115,140,247,223,121,231,206,187,111,159, 93, 49, 21, 3, 47, 95, 54,137, 22,157, 54,104,158,218,200,184,237, 69,107,
+ 49, 82, 90,178, 39, 12, 71,132,124,102, 17, 21,108,204, 91, 69, 50,238, 98, 94, 63, 3,220, 45,163, 30,153, 20,221,190,118, 21,
+210, 22, 32,105,161, 54,205,164, 96, 45,138,108, 57, 66,219,146, 42,186,148,156,220, 2, 89,157, 72,218,134, 99, 24,128, 79,196,
+251, 31,219,123,251, 13,215,203,226,241,181,235, 86,173,154,157,118,255,104,199,153,199,116, 35,139,164,228,181,185,101,144,150,
+ 6,232,237,145, 99,176,114,174,106,184, 71,102,243, 14,197,172,163,228,155,217,177,101,113,249,165, 73,199,246,199,148, 54,119,
+145, 0, 12,167, 68,187, 27, 20, 29, 35,200, 89,113, 79,159,205, 0, 46, 53, 75,167, 75,151,153, 79,196, 32, 58, 57,127,124,231,
+182,173,183, 93,255,173, 85,107,103, 79, 89,191,154,103, 86, 41,101,185,208, 56,199,170,133,140,157,208, 72,109, 64, 11,166, 49,
+136,154,115, 54, 92,224,118,180,209,137,230,217, 70, 68, 98,236,107,111, 18, 26,219,134, 37, 49, 88,246,214, 25, 1,106, 21, 23,
+212, 33,255,102,244,198,230,226,150, 17, 77,237,204, 13,109, 9,177, 45, 69,182,101,111,251,100,152,208, 52,114,252,232, 83,219,
+110,185,241,238,173,219,167,167, 7,103,158,125,218,228,244,128, 10, 55, 1,173,239,163,220, 0,147,141,174,150, 65, 73,109, 3,
+194, 56,217,218,199, 53, 22, 35, 1,109, 39, 62,161,141,193,115,197,195,125,149,118,139, 61, 34,101,170,137, 59, 47, 31,129,164,
+121,214, 72, 54,240, 93,232,191,220,174, 64, 84,138,246, 56, 43, 79,180,203,141,237,144,152,219, 92,199,105,156, 71,159,126,236,
+219, 87,254,245,246,109, 59, 69,244,148,245, 43,215,172, 93,217, 31,244,172,155,174,205,209,168,147,209,242, 56, 38,173,221,202,
+222, 82,233,160,219, 46,150,251, 6, 12, 67, 65, 17,133, 90,232,239,247,218, 54, 63,117, 58,213,168, 19,236,160,237,114, 27,107,
+184,149, 78, 49,195, 25, 2,153,148, 9,237, 78, 31,201,242,145,150, 79,185,148,219, 94, 58, 18,136,104,251,182, 7, 14, 78,198,
+126,191, 90,189,118,118,197,236,242, 94,191,151,193,111,237,204,171,234, 22,239, 58, 53,161,204,198,207, 1,126,110,119, 35, 94,
+218,209,211,225, 58,151,222,106,227,177, 90, 6,200,170, 98, 95, 85,154,208,198, 65, 52, 67, 20,198,106, 45,232,212,165, 13, 40,
+238,240,229, 11,109, 92, 51,215,214, 21,164,149,133,100,104,169, 52,241,118,186, 73,218, 35, 6, 76, 78, 13,102, 87, 46, 91, 62,
+ 51,221,235, 87,206,188, 55,174,187,215,110,180,244,218,228, 14,185,238, 92,188, 37, 21,163,142,157,176, 4,166,227, 65, 41,183,
+ 67,162,160, 39,153,185,128,210,252,209,137, 88, 58, 22, 83, 59, 65, 75, 75, 92,109,155, 28, 92, 54, 29, 25,117,105,210, 6,125,
+119,232,235, 99, 77, 0,250,156,143, 44,160,170, 87,205,204, 76, 79, 78, 77,246,250,222,205,157,239, 73, 57,171, 56, 59,131,131,
+218, 28,251,249,248,161,109,172,140,210,158, 83,144,127,205,227,128, 60,242,167, 12,209,169, 27,180, 49, 67,177,132,209,171, 24,
+ 51, 23,210,157,129, 51,126, 76, 68,116,137, 54,249, 40,159,194,187,111,155, 18,178,117, 26, 27,170, 35, 57,164,142, 0,122,253,
+106, 98,114,208,235, 71,107,174,110,139, 2,110,157,213, 6,151,229,156,136, 72,127,136, 96,218,154,115, 6,163, 75, 30,199,249,
+128,218,104, 34, 41, 93,242,222,126,171, 50, 54,212, 82, 48,110, 67,203,220,169,142,136,100, 73, 43, 83,151,117,189,164, 51,161,
+101,223,119, 4,215, 97,220, 47,149, 82,182, 65, 10,196,200, 85, 63, 6,147, 14,229, 22,203, 98,100,132,212,218,104,144,161, 33,
+106, 61,118, 46, 43,146, 71,240,252,108, 74, 6,181,125, 3,146,123,191,156, 36, 82,134,255,102,156, 76, 50, 78,102, 70,215, 45,
+ 45, 58,139,150,108, 41,178,135, 22,233, 28, 49,180, 70,216,159,161, 35,164,150,215,223, 74, 10, 69, 94, 45,133,188, 45,241,152,
+ 6,217,132,108,107, 72, 30, 51, 21,173,139,160,118,132, 22,200, 5,145, 51, 81,116,122,173, 59,211, 28, 92,229, 50, 20,155,163,
+254, 82,248,242,148, 94,198,233,241, 94,156,147, 76,238,243,177,205, 89, 89, 44,231,236,152,161,174,195,234,134,127,173,129,110,
+197,209,233,152,208,246,103,153, 2,215,189,142,205,213,204, 71,204, 70, 77, 48, 81, 55,252, 35,203,252,178,173,245,144,215,250,
+245,178,115,246,233,119,221,104,182,245,233, 68,206,230,204,246, 76,203,136,148, 37, 45, 4,101,134,179,116, 6,199, 97,105, 47,
+ 1,208, 74, 69,150,132, 46,109, 87, 68, 57, 56,249,206,225,138,161, 40,227,196,198, 78,162,116, 53,172, 29,141, 87,218,198, 98,
+ 33, 1,230,144, 35,123, 78,171,218, 80,139,182,180,120,179, 33, 21,121, 14, 44,149,241,242,185,153, 28,109, 69,182,168,134,131,
+194,210, 90, 94,148,249,149,109,151, 12,156,180,104,191,152,181, 6,214,106,230, 19,131, 59,154, 87,142, 97,105,191,200,236,200,
+182, 25, 75,203,136,188, 78, 91,214,216, 64, 54,237,176, 76, 11,225,178, 27, 73,151,158, 71,199,211, 58,179,122, 72, 59,253, 80,
+ 30, 71,179,163, 11, 37,245,111,235, 48,100, 37, 58,233, 12,113, 17,255, 76,183,113, 22, 99, 61, 39,121, 74, 91,231, 13,255, 95,
+181,136, 79, 99,109, 83, 36,201,229,176,150,241,153, 79,154,116,219,207,242,129, 26,107,216,106, 91,164,202,191, 64,159,163,225,
+167,125,210,106, 16,151, 25, 34, 29, 78, 78, 39,111, 47,150, 38,143,139, 40, 53, 87,255,151, 66,146, 41,217,102,105,182,134,116,
+186, 83,199,228,210, 61, 74,173, 71, 71, 91, 6, 44,235, 5,150, 72,103, 44,128,105, 91,153,208,157,210,215,117, 91, 99,150,184,
+ 99,125,164, 29,141, 87,250,178,218, 14, 56,160,140,209,183,185, 42,108,181, 70, 31,166,232, 13,117, 25,219,112,230, 9,113, 75,
+145, 26, 7,152,219,126, 46,109,199,220, 20, 73,116,129,169, 78,223,100,121, 1, 25,239, 66, 30,115, 94, 80,116, 84,208, 63, 41,
+ 75, 13, 81,105, 29,203, 42, 33,101, 43, 48,246, 1,140, 75, 22,227, 77,162,218,233, 53, 38,218,178,101, 75, 23,125,199,223,149,
+244,248, 66,184,217, 63, 53,151, 36,210,255, 3, 51, 1,167, 61,222, 14,125, 55, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/scrape.png.c b/source/blender/editors/datafiles/scrape.png.c
new file mode 100644
index 00000000000..b67bfa15984
--- /dev/null
+++ b/source/blender/editors/datafiles/scrape.png.c
@@ -0,0 +1,414 @@
+/* DataToC output of file <scrape_png> */
+
+int datatoc_scrape_png_size= 13055;
+char datatoc_scrape_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0, 1, 26,253,
+208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,252, 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0, 0, 0, 0,
+249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77,
+ 69, 7,218, 7, 19, 0, 34, 13, 86,254,139, 21, 0, 0, 32, 0, 73, 68, 65, 84,120,218,237,189,121,176,101,233, 81, 31,152,153,
+223,114,206,185,219, 91,170,170,107,233,234,234, 77,106, 36, 33,129, 6,144,196,210,116, 32, 1,178, 65, 4, 2, 2, 44, 6,205,
+ 48, 2,198, 33, 19,158, 8,140,151, 48, 12, 99,198, 6, 19, 30,121,108, 6,135, 61, 16,120, 38,128,177,153,177,197,226,177, 25,
+ 16, 98,179,144, 52, 32, 33,181, 90,162,213,123,181,106,223,222,114,223,187,235, 89,190, 37,115,254,248,206,185,247,150, 36, 27,
+ 97,107,236,118,132,111, 85,191,122,203,125,231,126, 55, 79,126,249,101,254,126,191,204,198,199, 30,123, 12,254,196,199,231,242,
+ 36, 29,153, 95,248,216,123,150,199, 55,163, 15,183,111,222,217,222, 29, 61,255,194,181, 59,251,227,255,225, 39,127,113,245, 36,
+ 2,128,254,246,217,209,233, 71,122, 91,167,230,147,197,123,255,229, 7, 71,253,226,145, 7,207,255,242, 63,250,225,255,227, 93,
+ 63,216, 94, 9, 1, 94,248,232,111,207,231,203,247,252,223, 31,120,221, 87,189,230, 77,223,248,229, 89,145, 19, 34, 71,238,109,
+157,184,249,169,143,127,253,215,127,179, 6,128, 51, 15,191, 58, 94,124,242, 75, 94,255,202, 7, 95,118,126,184,181,109,139,161,
+206,122,197,240,132,205,122, 31,250,205,119,255,249,111,127,179,186,112,225,254,251,122,238, 99, 31,126,234,117,143,126,209,112,
+107,219,230,131,172,183, 53,216, 62,173,116,118,241,241,223, 9, 49,250,198,105, 0,185,247,254, 51,103,207,223, 51, 24,237,144,
+ 54, 72, 74,103,133,201, 7, 79,252,222, 47,223,188,182, 7, 8,117,213, 16, 0,140,182,119, 71, 59,219,136,136, 0,164, 84,127,
+251,244,165, 39,126,171,105,252,246,137, 81, 12,177,174,156, 6, 0,102, 6, 32, 36, 2, 82,194,241,131,255,242,159, 28,236, 31,
+ 41,173,141,214, 33, 68, 34,212, 0, 0, 32,136, 36, 32, 16,253,244,104,175, 63,236, 11,192,222,237,113,185,172,170,101,237,156,
+ 39, 0,136,193,199,224, 67, 83, 47, 38, 71,243,217,210, 53, 78, 68,182,182, 7, 28,153, 69,110,223, 62,194,207,233,222,125, 46,
+ 15,188,252,201,223, 47,103,123,203,201, 1,128,252,226,207,253,250,104,216,251,178,175,120,245,183,188,243,199, 55,159, 68,118,
+176, 51, 58,253,176, 29,156,138,145, 51,163, 94,254,138, 11,206,185, 95,253,233,255,254,159,253,212, 95, 59,125, 98,171,189,119,
+215, 62,249,190,249,116,241,252,211,151,175, 94,190,253, 53,111,126,253,104,103,168,141,225, 24, 17,241,195, 31,252,205,235,207,
+252,225, 99,223,254, 87,241,250,197,199,159,248,253, 95,155,140,167,131, 81,255,220,125,103,242,254,150,182, 61,147, 15,134,187,
+231, 94,252,216,111,221,185,117,120, 60,158,210, 71,126,231, 95, 60,249,248,115,121,145,221,123,225, 92,214, 27,153,188,159, 15,
+118,183, 78,221, 95,207, 15,174, 95,185, 19, 92,168,171, 70, 63,244,242,135, 50,107,238,185,247,140, 49, 57,146, 82,202,228,253,
+173,197,209,205, 63,124,239,175, 55,141, 43,203,154,148, 34,219,223, 62,125,254,156, 86, 86, 16, 0, 32,239,239,112,112,207,126,
+244,131, 87,175,220,178,153, 65,132,199,159,120, 65,187,106, 78,132,128, 64,128, 72,180,119,229,201, 79,124,228,147, 33,196,243,
+247,157,190,118,249,206,137, 83, 91, 15,156, 63, 69,194, 17, 0, 5, 1, 16, 92, 57,155, 79,167,103,239, 61,149,231,118, 58, 93,
+246, 7,249,165,139, 55,132, 69,123, 87, 19, 17, 68,244,193, 47,230,139,186,108,156, 11, 69, 47,247, 62, 78,142,103, 89,102, 38,
+147, 57,124,190,238,157, 22,145,167,158,120,255,246,246,142, 72,228, 24, 57,120,225,128, 8,161, 94,248,102, 89,151,179,255,231,
+221,239,249, 31,255,183, 95,249,156, 46,212,183, 82, 30, 93,111,150,147,186,156,186,186,246, 33,120, 23,110,223,216,251,192,251,
+ 62, 97, 12,189,242,213, 15,253,237,191,240,182,222, 32, 63,119,254,180,128, 56, 23,254,198,255,242,139,215,110, 31,124,186, 51,
+ 61,250,232,163,127,255,135,223,230,157,231,200, 28,249,198,245, 59, 31,122,255, 39,238,123,224,204, 43, 94,253,208,193,254,241,
+112,212,223,218, 30, 40,173, 1, 64,132, 57,114, 12,236, 99,116,181,115,206,239,223, 57,250, 43,127,239, 23,218, 21, 1,192,169,
+251, 95, 27,125, 93, 30,223,220,191,125,107, 54,153,111,239, 12,179,220, 50,243,203,190,224, 66,150,231,202, 88,165, 12, 41,141,
+ 68,136,132,164, 77, 62, 80,202,154,188, 47,236, 79,158,218, 17,142, 63,244,247,254,137, 6,192,107,207,124,200, 59,255,228,199,
+159,159, 28,205, 31,120,248,222,175,120,236,181,131, 81, 63, 43,114, 99, 11,101,172,210,153,210, 70,153, 76,153,220,230, 67, 84,
+122,124,227,185,195, 59,215, 92,217,204,102, 11, 66,137, 2, 63,252,125,223,166, 1,224,120, 60,109,106,167,149,190,240,192,217,
+135, 31,185,208, 27,244,149,182,164, 52,146, 86,202, 40,155,105,219,179,249,192,246, 70, 32,114,251,133, 15,125,234,249, 75,229,
+178, 82,138,124,136, 68,196,204, 72,168, 1,228, 11,223,240,104, 53, 59,120,240,145, 57, 34,146, 50, 74, 43, 16, 68, 36, 68, 0,
+ 4, 82, 58,239,111,155,188,239,154,250,240,218,211, 31,250,192, 71, 79,158,218, 9, 33,214, 85, 19, 35, 51,243,193,222,177, 49,
+ 90, 3, 64, 61, 59, 12,174,209,202, 36,215, 5, 22,160,116, 33,165,109, 94, 12, 78,140,175, 63,245,194, 83,207, 79, 39,115, 68,
+ 24, 14,250,222,135,253, 59, 71,231,206,159,138,145,151,139,114, 56,234,141, 15, 38, 26, 0, 66,112, 0, 0, 8,237, 42,128, 0,
+ 16, 64, 56,250,197,209,237, 59, 87,158, 47,151,149, 8, 11,128,107,124, 93, 59, 0, 24,109,245,103,147,197,157, 91,227,237,221,
+ 33, 2,228, 69,174, 1,128, 99, 0, 1, 68, 0, 16, 17, 0, 9, 0,208, 52,206,213, 77,211, 52,174,241, 28,217,102,118,247,132,
+ 10, 62,206,166,139,178,172, 67,136, 28,185, 63, 40, 14,246,142,202,178, 25, 12,122, 26, 0,235,114,137, 0,136, 8,136, 32, 18,
+153,163, 15,222, 7,239, 67, 12, 49,132, 24, 99,140,129, 67, 8, 33, 68, 99,116, 81,100, 77,227,154,218, 11, 72,150,219,178,108,
+246, 15,143, 63,127,113,242,243,242,184,112,225, 2,125,190,174,165, 31,122,240,254, 15,189,255, 55, 67,240, 49, 6,137,193,251,
+ 70,107, 29,154,210, 55,139,232,155,235, 47, 62,255, 13,239,248,209,207,229, 66,234,143, 63,252,155,213,252,176,158, 29, 44,143,
+110,204, 15,175,149,211, 59,229,116,111,122,120,243, 3,239,125,255, 35, 95,248,202,139,207, 60,191,173,236, 79,252,200,247,126,
+203,215,190,225,217, 23,175,239, 31, 77, 63,235, 85,182,182,182,240,234, 51, 31, 12,174,105,170, 89,179, 60,106,170,165,119,222,
+251,176, 92, 84, 31,251,240,211,207, 92,186,249,198,175,250,162,217,116,225,157,191,239,193,179, 54,203,152,217, 59,255,142, 31,
+250, 7,159,105, 35,188,115,229,147, 81,162, 68,142,193,213,203,217,114,126, 12, 97, 49,190,125,231, 19,143, 63,115,235,230,225,
+133, 7,207,158, 59,127, 15, 42, 18, 22, 34, 66,132, 24, 57,132, 48, 57, 94,252,197, 31,255,217,187, 46,244,177,247,254,140,115,
+ 77,240, 65, 68,202,101,245,177, 15, 63,125,249,202,237,111,125,219,215,141,247,143,130,143, 39,239,217,205,114,131, 68, 32,194,
+ 44, 49,198, 16, 98, 8,161,169,125, 93, 54,223,255, 55,127,186,241, 33, 93, 72, 35, 81,112,161,105, 92, 8,126,114,180, 88, 46,
+ 43, 77,234,201,199,159,123,249, 43, 47, 12,134,131,188,103,181, 54,136,132,132,194, 44, 44,128,160,181,217, 62,243,240,232,228,
+249,143,191,233,141,207, 63,249,177,111,125,231,223, 6, 0,189,115,239,171,182,207,113,179, 56,154, 30, 92,155,207,202,162,200,
+206,158,179,103,239, 61, 57, 24,246,251,131,194,216, 76,153, 54,164, 32, 33,130, 82, 38, 51, 89,159, 99, 0,192,195,219,151, 23,
+211,229,207,252,232, 59,255,206,207,191, 71,107, 99, 35,243,209,254,141,201,120,106,140, 57,117,207,110,111, 88,156, 58,189,219,
+ 31,244,178,188, 80, 38, 87,218,144,182,164,140, 82, 90,103, 61,219, 27,101,249, 96,124,253,147, 79,252,222, 47,151,139,154, 52,
+ 89,163,191,225,209, 47,209, 47,126,252,125,136,184,119,123,252,212,199, 47,110,239, 14,239,123,224,236,206,238,168,232, 23, 54,
+ 47,180,201, 72, 91,173, 51,210, 86,155, 76,103, 61,147,247,155,114,126,233,201, 63,144,216,212,149,243,222,199, 16,157,243,214,
+106,154, 28,205, 15,247,143,143, 15,167,206,121,165,213,246,206,176,151,214,162, 45,165, 80,173,116,186, 74,214,219, 34,210,121,
+127,107, 56, 26,148,203,250,214,173,177,205, 76,100, 6,128,249,172,212,218, 40,142,108,172, 62,125,246,196, 3, 15,221, 59, 24,
+ 13,109,158, 19,105, 36, 69,164,136, 52,105,163,180, 53, 89, 79,105, 83,206,246,159,127,252, 3,135, 7, 71, 28,101,119,167,255,
+244, 39, 47, 63,252,178,123, 17,157,205,180,126,224,229, 95, 80, 45,142,251,163,222,185, 11,178,181, 61,178, 69, 15, 73,181, 33,
+ 5, 1, 0, 20,146, 50, 86,155, 44, 6,183,127,229,233,233,100,222, 84,158,153, 17,225,236,153,221, 63,250,240, 51,175,121,205,
+131, 0,168,251, 59,103,149,237,145,210, 49, 6,165, 12, 34, 17, 32, 32, 34, 34, 8, 32, 34,153, 60,235,111,251,166, 22,224,139,
+207,190,152,231,153,177,186,169, 93,112,129, 69, 30,122,240,204, 71, 63,242,172, 12,134, 20,124, 29,220, 18,144,148, 50,128,132,
+ 0,105, 33,237, 86, 52,182, 55, 58, 17, 92,189, 24, 95,123,230, 15,223, 59, 26,245,231,179,229,116,178, 24,109, 13,180, 53, 34,
+ 64,132,231,206,238,206,103, 75, 29,154,101,244, 14, 65,128,218,107, 72, 10,223, 72,164,180, 49,189,122,118,112,241,143, 63,116,
+235,250,190,115,222, 24,109,172, 41,122,217,165,139,215, 47, 60,120, 46,132,224,156, 88,107, 93, 8, 58, 6,199,194,128, 4, 0,
+136, 2, 64, 41,236,166,232,191,152,220,186,115,237,202,173,235,251, 85,213,196, 40, 49,114,140, 81,107, 61,218, 30, 92,124,238,
+234,217,123, 79, 41, 69,164,176,200, 44,113, 12,237, 91, 65, 20, 1, 68,193,246, 24, 96,239,202,229,116, 12,136,219,187,163,162,
+200,148,198, 24, 99, 93,185,229,162, 4,128,162,103,111, 94,219,139, 49, 2,128, 82,138, 68, 24, 64, 68,164,141,255, 0, 32, 2,
+194,193, 55,174, 90,186,166, 17, 22,109,212,246,238,104, 48,232, 41,165,152,197,249,224, 26,175,148,138,204,123,183,143, 92, 19,
+ 0, 68, 75, 12,194, 12,136, 44, 76,136,194,194,192,194, 49,120, 87, 87,117,211,248, 16, 66,140,204, 44, 89,110, 69,100, 54, 93,
+132,208,190, 71,107,244,193,100,193,204, 41,173,107,210,251, 66,164,152,146,120,225,224,156,115,222, 53, 46,184, 16, 67,140, 33,
+166,223, 84, 74,245,122, 69, 8, 49, 70, 22, 1, 64,208, 90, 77,103,101, 96,210,222, 59, 17, 64, 4, 68, 2, 0, 97,142,145,189,
+243, 33,108,156,107,233, 66,129, 67,136,204,108,141, 22,150,200, 17,137,172, 53,211, 69,233, 35,193, 75,234, 92,187,239,190,251,
+ 8, 94, 74, 15,196,182,214,106, 31,175,251,178,215,126,215,219,190,237,181,175,249,194,251, 31,184, 80,228,153,164,231, 0, 8,
+ 8,136,128, 8,128, 72,186, 25, 28, 57,134,189, 59,183,222,243, 27,191,254, 99, 63,249, 79, 63,143,107,210,145,249,206,181,167,
+ 0,144,153,129, 35,115,224,224, 57, 86,229,100, 18,131, 23, 14, 2,160,116, 70, 74,165, 10,112,178,127,253,185,167, 47,126,201,
+151,127,169,111,170, 56,159,188,234,194,233, 31,249,111,222,122,249,214,225,238,185,221, 95,250,245, 15,236,143,167,255,190, 11,
+ 66,128,197,248,102,140, 94, 98,136,193,197,224,162,175,163,119,157, 7,114,202,225, 68, 36, 70,118,141, 59, 26, 79,175, 93,188,
+246,129,223,251, 8, 88,243,231,222,246,166, 16,184, 63, 40,206,238,140,154, 73,245, 55,255,187,239, 58,121,106, 11, 24,152, 99,
+140, 2, 32, 79,189,112,245,231,126,229,119,247,198,147, 63,197,130, 0,128,108, 31, 69,136, 8, 73, 17, 34, 71, 23, 92, 19,220,
+210,215, 75, 87,205,131,111, 98,136, 33, 4,142,209,251,224, 27,207, 34, 86,171,178,106,126,237,221,191,119,250,204,137,211,231,
+ 78,156, 62,119,146,163,136,200,236,120,174,180,178,153,213, 70, 33,194,107,191,240,225,159,122,229,131,204, 18, 3, 59,215,252,
+236, 63,255,173,143, 62,245,226,159,188, 32, 55,223,143, 49, 8, 71,142,161, 45,223, 73, 3,160,119,213,100,124,244,226, 11,215,
+174, 95,185,253, 95,190,243,123, 16,101,186,127,181,169,221,137, 83,219, 90, 43, 64, 28, 12,123, 59, 39, 70, 69,191, 48, 70, 19,
+117,251, 67, 68,160,253, 35, 2, 44, 2, 44,145,217,102,250, 7,191,239, 91, 99,140,190, 9,207, 94,188,242, 63,255,194,175,125,
+118,191,126,244,209, 71,255,254, 15,253,185,224,125, 10, 47, 41, 60,165,212,165, 46,155,131,189,241,245,171,123,123,251,199,129,
+121,212, 47,238, 61,127,234,204,249,123,178,220, 18, 97, 58, 1,140, 53, 90, 43, 66, 18, 20, 74,197, 44, 32, 8, 51, 11, 0, 48,
+139,136,176, 8, 72, 10,221, 82,215, 62, 50,245, 71, 59,247,156,127, 96,231,196,201,247,253,206,123,254,194, 95,125, 87,221,184,
+ 85,130,165, 1, 96,231,204, 67,174,154,187,102, 25,154,202, 55,206,135,232,156,103,199,141,243,141,243,128,208,203,173, 54,122,
+ 48,236,229,253,156, 8,139, 34,203, 10,107,173, 37, 69, 74, 41, 82, 10,145,136, 8, 17,211,137, 40,136, 40, 32,194,105,155, 18,
+105, 34,133, 90, 43,157, 41,157, 41, 99, 8,105,118,112,245,133,203,127,188,165,249, 23,254,238, 15, 84,203,230, 93, 63,251, 43,
+207, 93,189,213,221,178,166,170,235, 50,250, 64, 58, 31,110,157,201,138, 33,251,102,178,127, 53,198,216,235,231,219,187,195,225,
+ 86,191, 40,178,209,214, 96, 48,234,247,251, 69, 94,100,218,104,165,181, 82, 26, 73, 83, 58,210, 72,117,149,101,187, 50, 34, 69,
+100,218,117, 24, 75,202, 16, 41, 99,243,122,126,116,124,231,226,236,248,200, 53, 62,196,120, 60,158,231,185,253,203,223,251,214,
+106, 89,255,175,255,226, 3, 26, 0,184, 89,102,121, 65,197,208,251,102,124,243,242,213, 43,183,198,123, 71, 54, 51,189,126,174,
+181, 62,125,250,132,201,108, 94,216,188,200,178,204,106,107,116, 90,138,210,164, 52,145, 66,165, 8, 53, 18, 33,169,148, 2, 33,
+ 41, 82, 70,117, 73,149, 82, 6, 8,217,187,233,222,165,163,219, 87,102,211, 69, 83, 57, 31,130,176, 0,192,104,212,243, 62, 78,
+ 38,139,221,157,209,215,127,229, 23,107, 0,188,118,233, 50, 0,176, 72,112,254,248,104,118,231,246,120, 54, 89, 32,225,206,238,
+232,244,153, 19, 91, 59,163,162,159, 89,107,149, 86, 90,107,165, 13,146,194,180, 20,164,100, 33, 68,133, 74,165, 21,144,210,164,
+172,182, 25,233,140, 72, 5, 95, 7,223,152,172,103,178,158,206,250,135, 7, 83,165,176,232,231, 80,214,222, 5,239, 3, 71,142,
+ 49,142,134,189,163,241,132, 57,221, 50,231, 18,182,229, 93,112, 46, 16, 97,158,103,189, 65,126,207,153,221, 83,103, 78, 12,134,
+133,177, 86,105, 77, 74, 35, 18,145, 2, 36, 36,234,110,147, 34,210,221, 58,140,210, 70,233, 76,217, 92,155, 76, 68, 56,122, 9,
+205,226,224,242,193,237, 27,243,201,162,113,142, 89, 2,192,108,186,184,121,227,240,225,151,223,139,136, 77,221, 48,139,176,228,
+153, 13,110,166, 1,224,228, 61,187,174,241, 62,165, 21,154,122,253,140, 72, 13, 71,253,209,246, 48,239,229, 90, 91, 82, 10, 19,
+104,132, 8, 68, 8,132, 68, 72, 4,128,216, 45,142,148, 81,198, 42,109,181,201, 81, 27,142,190, 94, 76,142,239,188,112,120,251,
+206,108,178,168,170,198,251, 0, 34,109,102,129,120,250,244,206,209,225,244,202,165,219, 15, 60,116, 54,207, 12, 51, 35, 81, 11,
+ 25,156,123,217, 23, 71,239,188,171,220,114,218,212,203,224, 61, 34,146,214, 90,105,210, 38,185, 42, 32,162, 32, 16,160, 16, 80,
+ 10,222, 64, 4, 41,143, 34,165,148,177,198,246,116, 86, 0,169,224,234,114,118, 56,190,254,220, 98, 62,151,148,120, 17,166, 40,
+144,194,138,136, 8, 0,128,220,123,254,228,241,120,122,245,202,222, 67, 15,159,179, 86,137,136, 78, 41,167,128, 32, 8,105, 99,
+179,194,216, 12, 68, 4,145,218,165, 80,151, 12, 10, 8, 2,166,165,164,108, 14,145,148, 54,185, 41,134, 89,111, 4, 2,174,174,
+180,177, 40, 2,190, 86, 74,113,140, 55,175,239,237,221, 26,159, 60,189, 51, 26,246, 99,140,206,249,224, 67, 12,156, 30,192, 80,
+ 20,217, 3, 15,158,185,115,107,220, 52,174, 33,163, 1,192, 55,165,119, 85,244,142,163, 23, 0, 68, 2, 74,201, 53, 1, 96,178,
+115, 2, 38,218, 15, 41,222, 16,145, 54, 38,239,103,253,109,109,114, 95, 47,203,233,222,248,230,167,198,227,227,114, 94,122, 31,
+ 0,144, 20,246,251,197,131, 47, 59,191,152,149, 47, 62,127, 53,239,101,231,206,159,206,243, 22,111, 8, 33,132, 24, 68, 68, 17,
+109,239, 12,198,135,211,195,163,185, 6,128,224,235,232, 29,199,144, 82,217,116,120, 8, 8, 17,164,251, 2,128, 32,128,132,128,
+ 8,128,148,188, 0, 21, 2, 70,239,150,227, 27,179,195,155, 7,251,135,147,163,121, 85,214,174,243, 21, 74,222, 69,164,181,202,
+114,115,225,193,179, 85,229, 47,191,120, 35,134,120,250,220, 73,107, 53, 34,136,136,120, 65, 68,165,213,112,216, 27, 44, 19, 64,
+ 29,188, 72, 20, 88, 91, 66, 68,136,168, 93,141,128, 16, 36, 12, 10, 1, 5, 16, 16,153, 25, 98,229,235,232, 93, 85,151,203,114,
+ 89,185,218, 35, 2, 41, 82, 76, 28, 89, 88, 98, 20,230, 0,128, 33, 4,132,180, 37,112,103,119, 84,215,238,230,181, 61, 17,217,
+ 57, 49,178,198, 96,138,166,136, 90, 43,107, 76, 2, 1, 35,136, 32,200,234,254,180, 39, 37,130,136, 32, 17, 10, 38, 7, 18, 4,
+144,200, 81, 56,134, 24,124,240,206,123,239,125, 32,162,188,151,153, 76, 23, 46, 4, 31,154,198,213,181,243, 46,165,245, 12, 0,
+192, 2, 8,201,224,132, 48, 26,245, 23,139,106,239,214, 88,107,213,235,231, 68, 20, 99, 20,233, 50, 70,142,145,153,219, 90, 42,
+249,119,242, 88, 17, 32, 98, 97, 20, 4, 70,129, 0, 1, 68, 56, 6,207, 49, 4, 31,210, 35,182,167,114,114,118,210, 70,147, 34,
+ 99,141,107,124, 83,187, 4, 94, 49, 8,135,180,187, 34,136, 48,136,181,154,163, 93, 46,203,249,188,204, 50,107,173, 22, 0, 78,
+187,140,163,111,183, 97,187, 16, 4,110,235, 52,224, 8, 0, 32,192,192,194, 41,121,229, 24, 66, 7,141,197,148,205,166, 71,100,
+ 1,145, 24, 89,152, 1,192, 88,173, 20,121, 23,234,186,113,206,167, 36, 66, 68,210, 83,153, 37,165, 12, 77, 19,102,243,133, 53,
+198, 26,195,204,105,151,213, 44, 9,150,219,248,179,225, 79,233, 50, 18, 57, 50,199, 16, 98,228,200,204, 49,198,152, 46,207, 49,
+ 69, 23,150,200,237, 43, 50,167,127, 5, 0,172, 53, 68,212,160, 3, 31, 98,136,235, 76,157,128,148,202,172, 14, 49, 46,171,198,
+185, 16, 2,104, 68,252,157, 63,124, 70, 36,149,191,171,231,182,119, 60, 69,157,148,107,125,198, 3, 54, 62,131,238, 59,188, 74,
+131,238,122, 90, 90, 98,247,214,186,101, 11, 71, 14, 33,122, 47,141, 7,118,193, 9,190,196,240,198, 84,155,189,116, 22,243,216,
+ 99,143, 81, 91,209,191,100, 30, 47,173,202,245,165,184,160,187, 74,233,239,126,251,119,252,153, 55,191,233,149, 95,240,240,233,
+123, 78,111,226, 87,146,206,182,182,130, 96,142, 81, 36, 86,203,229, 83, 79,126,252,111,253, 79, 63,253,201,231,175,124, 62, 23,
+132,136,239,252,111,191,251,111,253,232, 95,143,145,161,123,201, 24,188, 72,170,135, 2,199,160,148, 1, 20,142,142,189, 99,246,
+236, 93,228,200,193,221,123, 34,255, 75,255,245, 55,253,227,255,243, 55,255,232,217, 79,125,190, 22,164,126,226,199,126,228,251,
+223,249, 14, 4, 4,137, 32, 81,162,103,223, 68, 87, 69,183,244,245, 60,184, 37,114, 76, 63, 98,102, 87,205, 47, 61,243,199,182,
+ 24, 16, 6, 87, 45,166, 71,147,155,215,246,108,148,183,127,231,159,201,140,126,254,210,205,127,207,213,220,127,255,253, 90,162,
+111, 22,199, 28, 29, 7,207,209,199,224, 98,104,162,111, 56,184, 24,163,164,204, 18, 80,132, 99, 12,229,178, 60, 62,156,252,191,
+255,250,151,190,249,237,111,203,148,113,222,139,136,214,234,163, 31,122,234, 47,190,227,155,255,252,119,254, 89,231,252,254,225,
+228,163,127,124,241,231,126,245,119,254, 29, 45,244,230, 55, 61,250,240,133,123,162,111,216, 55,193, 85,190, 41,163, 43,131,171,
+189,115,222,187, 24, 98, 12,193, 57,231, 26, 87,215,205, 98, 94,141, 15, 38,251,119,142,126,247,119, 63,120,230,244,142, 82,176,
+152,151,174,241,150,240,217,167, 46,157, 62,119,130,136, 50,107, 30,186,239,204,183,189,249, 43,223,250,181,175,223, 63,154, 92,
+191,125,248,167,178,144,122,203, 55,124,221, 43, 95,241,114,165, 45,146, 74, 80,174,180, 80,208, 26,244, 16,145, 24, 99,240,177,
+174,234,233,241,252,120, 60, 43, 27,247,236,179,151,209,135,193,176,175, 53,229,185,237, 15,138,249,100, 33, 8, 54, 51, 68, 68,
+132, 68,248,101,175,121,249, 91,191,246, 13, 95,242,170,135,222,255,209,167,218,227,251, 79,188,101, 44,192, 66,136,100,242, 60,
+235,109, 11,115, 12, 77,240, 85,168,151,174,154,251,166, 12, 33,196, 16, 36, 21,231,136, 0,160,181,202,181, 34,162,233,100,209,
+ 31, 20,219,187, 35, 17, 96,102, 4, 32, 69,193, 71, 99, 81, 41, 66, 84, 68,162, 20, 61,120,225,236,207,255,157, 31,248,212,213,
+219, 63,246,211,239,254,147,119,153, 49, 89,209,223, 2,224, 22, 31, 3, 33,165, 81, 25, 80, 57,163, 13,162, 79,220,179, 91, 45,
+142, 92, 53, 47, 23,203,166,110, 76,102,138, 94,182, 21, 88, 25, 26,109,245,243, 94,150,247, 50, 99, 76, 58,141, 69,160, 75,114,
+169,251,142, 32, 18, 43,124,228,161,123,127,225,239,252,192,123, 63,248,196, 63,127,207, 7,255,109, 11,170, 23, 71,147,219, 47,
+ 36, 44, 38,129,196,128, 72,168, 35,135,106, 49,185,113,229,230,197,231,174,124,225,235, 95,255,200,171, 94,105,243,195,166,105,
+122,189,124,180, 61,176,153,205,114,179,189,187, 53,218,238,219,204,166, 66,167,187,207,237, 7,144,182,224, 65, 20,102,140,200,
+128,248,141, 95,243,165,111,122,253,171,255,242,223,253,249, 69, 89,127,118,167,126,211, 87,189,246,252,169,162, 46,103, 77, 57,
+175,203,101,181, 92,214,213,178, 92,204, 22,179,227,227,131,227,219, 55, 14,246,110, 31,125,226, 35, 79, 62,249, 71,143, 91, 11,
+ 54, 51,194,172,180,234, 15,123, 91, 59,163,173,157, 65,111, 80,152,204, 26,163,181,214,186,173,181,149,210, 74, 39,154,163,173,
+ 35,219,172,185,125, 73,173,222,244,134,215,156,221,222,122,226,185,203,159,197,169,223,244,213, 95,118,225,236, 78,240,193,251,
+ 54, 17, 12, 62, 56,231,155,202,205,230,229,209,193,228,120, 60,171, 26,207,194,203,233, 2, 1,179, 60,203,138,172,215,207,251,
+131, 34,239,101, 54, 45,198,168, 4, 65, 40, 77, 90,173, 30,105,141, 74, 27,109,173, 41,138,204, 88,163, 76, 94, 12,134,247,191,
+252,149,111,126,235, 91,191,239,187,191,237,120,255,214,211, 47, 92,189,203,169,149, 82,218,104,230,152,202,173,148,232,197,132,
+222,185, 16, 98, 4, 0,163, 41, 51, 26, 73, 57, 23,152, 57, 47,172,205,173,209,233, 21,245,170, 44, 74,204,244, 93, 89, 27,180,
+ 20, 3, 17,105,155, 23,195,147,197,240,132, 45,134,218,102,205,252,200,207,238,124,207,119,124,221,155,191,252,139,190,239, 71,
+254,225,218,135,108,111,123,176,115,206,215,115,223, 84,174,169, 99, 8,222,133,148,122, 10, 11, 2, 26,171,123,136, 69, 47, 27,
+142,122, 69, 47, 51, 86,219,204, 36,195, 40,173,144,136,148,106,203,180, 84,207, 74, 34, 60, 4, 68, 0, 1, 73, 33, 42, 82, 74,
+233, 12,145,124,179, 96, 14,126,127, 58,190,115,101, 54,153, 85,101,157, 89,243, 15,254,250,247,254,192,187,126,174, 93, 16,105,
+155, 15, 79,229,195,147,194, 49,186,202,213,179,122, 49, 41, 23,139, 16,130, 82,100,172,206,139,172, 40,176, 55,200,183,118,134,
+253, 65,145,231,153,181,214,180,128,149, 66,210, 45, 90,170, 40,169,143, 16, 87,188, 9, 38,120, 68,105, 75,202,146,210, 28, 3,
+146,238,141, 78,202, 96,151,133,239,220,254, 88,112,129, 57, 14, 6,189, 31,255,254,183,253,141,159,121, 55, 0,232,208, 84,211,
+131, 43,190, 41, 65, 68,101,253, 94,127,123,120,106, 75,103, 7,206, 57,109,151, 89,110, 71,163,126,242,226,209,214,160, 63,232,
+229, 69,102,140,214,198, 16,105,165, 40, 65, 82,136,148, 44,129,173, 30,129, 0,137,148, 34,165,149,182,202,100,164, 50, 36, 50,
+ 38, 67,224,233,254,229,227, 59, 87,231,179,121,102,204,244,120,110,181, 66,132, 19, 39,183,255,202,119,189,229, 35,215,231,218,
+228,189,147,247,126,129, 0,186,102, 57, 31,223,188,118,241,201,170,172,251,253, 34,132,168,136,138, 34, 75, 46,217, 31, 20,237,
+106,172,209,214, 40,165, 73,107,162,100, 33,133, 45,204,168, 16, 21, 16, 34,166,165, 24, 82, 86,153, 76,155, 76,105,139,136,229,
+228,206,209,205,231,143,199, 71,229,178,246,206,139,200,112,216, 91,204, 74, 82,100,140,122,240,129,179, 31,185, 62,211,213,236,
+224,248,214,243,164,173, 8,184,114, 86,151,213,245, 43,119,124,227,251,131,194,230,214, 88, 83,244,139, 44,183,121,145,229,185,
+181,214,104,173, 73,107,165,116,226, 48, 91, 40,109, 13,230,165,219,167,137, 12,105,163,148, 38,165, 1, 32,134,166, 89, 28, 31,
+223,186,120, 52, 62, 42,231,149,115, 46, 21,113, 0,144, 23,118, 60,158,142, 70, 3, 54, 44, 0,186, 90, 46,199,123,183, 8, 49,
+ 50,151,139,106,255,206,209,100, 60,171,202,102,185,172,118, 79,108,109,109, 15,122,253, 60, 47, 50,107,141, 49, 70,155,110, 53,
+ 74, 39, 87,109,241,188, 22, 87, 76,214,210,201,105, 18,248, 23,131, 47,167,251,147,189, 43,203,249,162,101, 62, 91,208, 98, 13,
+ 65,247,123,197,237,155, 7,167,207,236, 0,128,118,206, 47,230, 37, 2, 68,230,114, 89,149,139,170,105,156,247,193, 6, 35, 34,
+ 54,179, 69,145,217,204,182,171, 81,170,229,135,177,133, 56,147, 35,167,123,135,221,106,148,206,148,201,148, 54,194, 28,164,233,
+143, 78,109,159,186,223,215,243,219,151, 62,241,201, 39,158, 61,127,254, 36,128, 52,181,112, 20, 22,142, 49,138,200,104,212,187,
+244,226, 45, 4,208, 28, 57,221,206, 24,185,169,125, 8, 17, 68,148, 34, 99, 84, 81,228,189, 94,110, 51,107,173, 73, 24, 35, 41,
+221,110,242,116,154, 39,228, 2, 85, 27,144,149, 86,202, 40,109,149,177,218, 88, 1,228,232,140,201, 36,250,227,155,207, 28, 31,
+220, 92,204, 22, 39, 79, 14, 47, 62,127,237,204,185,147, 54,179, 34,142, 57,166,154, 17, 0, 71, 91,125,128,177, 78,248,171, 68,
+230,200, 34,140,136,198, 26,155,225,104,107, 48,218,238,231,189,204, 88,163,141,161,149,175,180,182, 33, 74,235, 82,132,132, 43,
+103,106,215,164, 44,146,146, 24, 16,161,154,237,143,111,190,112,124,120,188, 92, 86, 49, 68, 17, 56,117,207,206,222,237,195, 44,
+207,118,118, 6, 20,168,139, 16, 96,180, 2, 0,173, 52,105,173, 24, 81, 16,180,214,121,145, 1,136,177,102,247,228,246,104,123,
+152,229,153,177,150, 58, 16, 24, 16, 33,125,132,187, 62, 65, 34,213,194,177, 38,193,146,194,204,190,153,141,175, 30, 92,191,116,
+ 60,158,148,203, 38,132,192,204,132, 72, 68,219,219,131,201,100,113,229,202,226,220,217, 19,164,136, 66, 71,170, 3,232, 60,207,
+ 70, 91,131,116,126,165, 19,176,215,207,139, 94,190,181, 61,232,245, 11,155,101,164,116,107,152,246,119,186,180,168,253, 8, 93,
+224, 65, 76,144, 62, 18, 8, 71,223,204,199, 55, 14,111, 94,158, 28, 77,151,203,202, 53,129, 99, 4,128, 8, 72,196,128,216,235,
+229, 77,237,158,123,238,250,195, 15,159, 37,165, 40,196,118, 65,197, 96,116,226,158, 51,222,213, 77, 93,213,101, 85,215,153, 8,
+100,153,205,139,204, 90, 75,202,160, 82,105,115,180, 76,188,172, 74,221, 53, 56,145,110,158,106, 81, 91, 37, 32, 49, 70,239,235,
+224, 67,140, 45,236,154,192, 6, 0,136, 49,137,159,160,215,203,203, 69,245,220,211, 87, 30,124,217,189,237,225, 7,160,181,237,
+245,182,206,196, 80,155,106, 97,236, 52,107, 26,102, 81,138,180,214,164, 12, 81, 2,132,147, 93, 64, 18, 22, 11, 27,229,119,218,
+199,109, 68,206,149,182,204,220, 84,139,233,222,165,163,253, 27, 33, 68,107,141,119, 62,248,200, 8,169,200, 18,110,211, 37, 16,
+ 24,110,245,203,101,125,229, 83, 55, 79,159,217, 77, 76, 3, 33, 18,166, 35, 73, 25,109,115,155,229, 89,150,105,147,252,134, 82,
+ 10,144,128, 79,144, 86,130,209, 1,127, 45,109, 75,148, 50,140, 66,153, 44,120,231,155, 82,105,219,219, 58, 21,124,120,254,153,
+203,227,195,137,210, 74, 27,165,148, 74, 33, 40,189, 39, 22, 97, 78,248,235,104, 49,175,238,220, 30, 55,141, 7, 0, 18, 16,142,
+ 62,209,171, 0,128, 74,145, 82, 74, 41, 36, 74,233,104,119,111,218, 66,118, 37, 55,107,153, 39,210,202, 88,147, 13,148,201,124,
+ 83, 49, 71, 99,243,232, 22,213,116, 47,203,204,217,243,167, 14, 15, 38, 87, 47,221, 2,196,188,151,101,185, 81, 90, 17, 33,117,
+ 5,177,136, 24,171, 78,156, 24,237, 29, 76,166,211, 5, 0,104,225, 24,131,143,177, 73,176, 48, 9, 50, 38,159,167, 21, 84,222,
+242,209,132, 40, 40, 40,157, 35, 39,212, 60, 51,121, 95,219, 44, 6, 39, 28,124, 53, 63,220,191,116,124,112, 80, 85, 77, 12,172,
+ 73,221,123,225,244,173,235,251,151, 95,188,249,192, 67,231,138, 34, 39,242,174,105,156, 0, 49, 68,137,201,210, 54, 51,219,195,
+254,237,131, 73, 90, 16,199,224, 36, 4,225,216, 38,249, 68, 29,115,208,214, 26,201, 72,237,109, 19,130, 4,239, 19,145,210,100,
+114,210, 54,250,166,169,166,211,189,203,135,119,238, 76, 39,179,166,114,204,140,136, 90, 43, 68, 58,117,122, 23, 96,124,233,197,
+ 27,231,238,187,103, 52,234,139,136,136,111, 26,183,174, 11, 16,139, 94, 6,179, 5, 0,105,225, 40, 28,152, 67,114,182,214,117,
+ 91, 58, 97,211,119, 91, 7,134, 85,122,136,138, 72, 17,160,175, 23,245,236,224,240,214,229,195,253,163,249,108,217, 52, 46,198,
+136,128,138,208,107,149,242,255, 19, 39,183, 21,169, 91,215,246,234, 83,219,187,187, 35,173, 41, 70, 37, 73,249, 3,130,132,198,
+168, 97,145, 65,229,180,136,112,140, 9, 27, 68, 68,128, 86, 44,211,137,185,113,133,230,119, 10,156,246,145, 0,226,166,156,214,
+203,163,241,222,173,241,193,241, 98, 94,214,181,231, 24, 19,238, 30, 17, 21, 11,107, 81,138,136,104,107,103, 32, 32,135,119,142,
+ 92,227,119,118,135, 74, 81, 80,132,145,177,227, 31,243,220, 2, 56, 45,194,194,177,141, 41, 32,105, 53, 34,130,107,229, 78, 75,
+112, 72,183,219,219, 18,135, 67,108, 92,104,170,249,228,104, 62, 93,212,149, 11, 62, 66,183,167,153,153,136, 98,228,150,167, 38,
+ 17,128, 94, 47,247,163, 48, 25,207,130,243, 91,187, 35,130,238, 4, 66, 32, 34, 99, 76, 43, 31, 6, 96,129, 13,156,186, 91, 8,
+ 0,118,100,242, 42, 2,182,223,109, 75,129,224, 92, 93, 6, 31,136,200,102,186, 5,237, 33,161,232,192, 44,136,109, 49,158,110,
+181,136,228,133,245, 62,159, 78, 22,145,121, 56,236, 67, 39, 52, 74,113, 62, 1, 86,169,180,227,149,187,136, 72,171,174, 5, 73,
+112,242, 42, 74,183, 76, 60,131, 72,228,232,131,107,188,247, 44,162,140, 46,138, 92,145, 82, 68,117,237, 86, 90,161,100,172, 78,
+198,211,238,142, 60,183,174,113,243,233,146, 35, 23,189,124, 69,158,165,119,171, 91, 71, 7, 20,225,100,143, 68,116, 36,150,163,
+245, 36,192,116,225, 36, 85, 18,137,194, 33,120, 23, 66,224,200, 32,146,170,122, 99, 13, 18,146,162,166,118,174,241, 94,130, 36,
+198,110, 77, 86,164, 96, 15, 54,179,206,249,249,172, 12, 33,218,204, 66,202, 64, 4, 86,183, 76, 86, 71,229,106,163, 35,172,190,
+132,213, 59,144,244, 10, 28, 82, 95, 66,108,197, 7,146, 94, 18, 9,149, 82, 54, 51,237,147, 27, 8, 62,128, 96, 71, 33,174, 68,
+ 54,172, 8,173, 53, 75, 87, 47,230,101,230,163, 49, 74,186,147, 78,167, 3, 6,145, 69, 48,229, 67, 45,107,150, 22,178,254, 32,
+192,192, 32,194, 33,134, 68, 5,197, 24, 56,173, 71,184, 59,164, 64, 16, 81, 27,221, 58,127, 91, 51, 98,148,150,123,232,234,126,
+ 72, 26,132,170,242, 49, 86,121,158, 41, 69,201, 5,181,136,128, 68, 22, 64, 88, 57,112, 90, 3, 32, 34,164, 75, 36,101,154, 72,
+194, 36, 98,108,133, 96, 41,197,105,185,141,216,129,162, 34,136,144,106, 58,102,142, 81, 56,114, 75, 84, 8,176, 64,187,124, 16,
+165, 21, 0,212,181, 19,129, 44, 51,233, 70,105,145,152, 86,222,121, 75,119,124, 98,247, 94, 90,255,106, 95, 56,134,176, 90, 82,
+ 76,188, 75,235,191,237,194, 88,218,189, 79, 68,214,154,116,176,179,243,128, 41,193,104,151,157, 94, 73, 41, 18,128,186,113,201,
+ 11,211,209, 33, 49, 6, 4, 92, 49,216, 41, 28, 65,199, 14, 3, 64,187, 26,225, 24, 34,199,181,188,173, 35,154,184,101, 82,184,
+ 53, 18,199,150,104, 1, 68,173,149,136,105, 41,223,141,141,204,192, 72,168,136, 8,209,135,216, 56,111,140, 74, 22,226,216, 82,
+144,184, 10, 9,171,220, 2,164, 69,121, 56, 65, 16, 44,156,108, 19,185,149,126,117,165, 76, 90, 14,119,171, 73,220, 90, 43, 73,
+ 68,208, 74, 49,177,144, 48,175, 94,137, 16, 89,105,165,136, 28,196,164, 26,110, 45,196, 44, 41,228,180,171,185,107,147, 65,187,
+158,200, 44, 18, 99,203,216,117, 38, 91,221,201, 20, 9, 87,247,110,195, 90,204,145, 25, 16, 72,147, 18, 37, 18,145, 82,198, 39,
+233, 8,210, 90,129,243,145,217,249, 0, 0,250, 83,215, 15, 87,233, 35,108, 28, 14, 41,243, 88,239,214,206, 97,147,119, 67,187,
+165,224, 46,232,101, 77,144,113,251, 78, 58, 20,141,185,251,170,125, 3,233, 77,182, 88,106,227, 33, 68, 0, 96, 0,194,199, 30,
+123,236,248,248,120, 50,153,188,212,104,161,255,184, 15, 17,217,222,222,222,217,217,209, 0, 48,157, 78,175, 95,191,254,159,141,
+242,153, 34,207,157,157, 29,250,207,134,248, 79,140, 78,124, 73,211,155,159,245,145, 89, 51, 26, 13,243, 60, 31, 13, 7,253,126,
+111,119,103,123,119,103,251,236,233, 83,163,173,225,214,214, 48,179,214, 26, 75,132,214,102,233,228,222, 16, 33, 0, 32, 44, 23,
+203, 24,185,105,220,108, 62,155, 76,166,215,111,222,186,126,227,206,100, 58,157,207,151,179,217,252,120, 58,255, 79,192, 64,178,
+193, 98,189,238, 75,191,248,251,222,241,246, 55,127,253, 27,141,201,148, 74,101, 61,164,140,173,211,198,119,154,155, 54,150, 73,
+247,175,180, 63,133,164, 67, 17,230,152,206, 49,225, 40,194,235,231, 36, 6,206,187,166,154,207,142,246,110, 92,189,253,175,126,
+235,195,191,244,219,127,240, 18, 53, 16, 51,191,237,219,191,249,237,111,251,150,147, 39,119, 83,158,143,109, 73,223,202,168,211,
+201,223,217,144, 87,169, 8,180,199,108, 92, 37,112,176,145,147, 51,199,232, 27, 87, 47,170,197, 84, 68, 6,195, 33,199,192, 73,
+141, 44,204,193,249,166, 46,151,229,241,120, 58, 57,154,189,226,222,123,222,249, 77,111,124,239,227, 79, 93,189,115,240,146, 51,
+144, 0, 60,248,224, 3,103, 78,159,230, 24, 5, 34, 75,228, 24,161,203,117, 68,162,196,200, 18, 37,182,181,127,122,147, 41,177,
+ 78,126, 1, 45,120,223, 74,250, 58, 87,226, 24,131,111,170,229,124, 49, 57,158,237,221, 62, 60,220,159,126,249, 27, 31, 61,119,
+254, 52,187,154, 99,244,222,213, 85, 93, 46,170,166,118, 33,178, 66,252,234,215, 60,242, 29,223,240,232,155,191,246,203, 82,194,
+ 55,159,151, 47, 92,186,241,220,165,155,207,125,234,250,237,253,227,163,233,188,113,254, 63,130,129, 16, 32,212,203,106,126,216,
+ 82,155,109,225,192, 9, 33,150, 24, 68,152, 99, 16, 14, 49, 70,225, 40,235,202, 98, 93, 20,172, 78,198, 4, 86,180,236,117,136,
+174,113,203,101, 53, 61,154,207,142,231,179,201,252,151,126,225, 87,162, 82,223,255,151,190,215,216, 30, 84,101,170,156,148,166,
+ 44, 51,121,158, 1,192,228,206,209, 63,251,197,223,250,179,111,249,202,193,160, 40,138,236,213,175,120,224, 85,143,220,223, 73,
+201, 90,215, 93, 44,170,247,127,244,169,223,248,253,199,103,139,242, 63, 88, 12, 98,225, 0, 27,212, 95,122,247,157,100, 53, 10,
+ 71,230,100,157,110,177,221,159,180, 43,215, 10, 53,105,139, 54,102,246, 62, 52,181,171,150, 77, 85,214,117,237,131,143, 44, 82,
+ 85,245,187,126,226, 31,109, 15,122,175,120,228,190,211,103, 79, 8, 66,150,103,131, 97, 36, 34,231,242, 84,254, 62,241,161,167,
+144,112,107,123,184,123,106,171,215, 47,180, 86,237,166, 23, 82, 32,163, 81,239,138,219, 28,255, 0, 0, 18,112, 73, 68, 65, 84,
+155,222,244,186,183,188,241,117, 32, 18, 66, 60,154, 46, 94,188,114,235,183,255,224,227, 47, 94,187,243,255,215, 22, 51,121,191,
+216, 58,157, 4,140,109, 76,109, 45,146, 10,100,199, 33,245,156,120,230,192,209,167,104,210,138,243,218, 2,154, 59,213, 92, 27,
+183,219,203,164, 18, 41, 74,130,226, 52,145, 70, 68,162,166,118, 23,159,187,182,127,107,124,226,212, 86,127, 88,244, 6, 69,209,
+207, 87,198, 79, 70, 39, 66, 87, 59,142,146,101, 70, 91,173,149, 34,213,218,105,117, 48,144,162,211,167,118,238, 57,185,253,134,
+255,226, 21, 8, 16, 66,248,228,243,215,222,247,145, 39,159,121,241,186,235,170,169,207,195, 22,115, 77,185,156,141,187,170,102,
+ 83, 41,152,190,161,128,180,202,114,211,202,204, 9,132,153,125,112,117, 8,181, 4,207,193,199,216,196, 16,152, 35,135, 86,100,
+153, 72, 48, 21, 18, 51, 76, 70,107,155,153, 24, 34, 18,130,128,214,100,173, 73,192, 22, 71,201, 11,109,140, 73, 52, 1,124,250,
+174, 93, 81, 22,184, 82,132,175,208, 52,233, 16, 37,173,133, 89,148, 86, 95,250, 69, 47,123,237,171, 30, 18,225, 24,249,242,181,
+219,255,251,175,254,238,254,120,202,159,139,216,228,223,214,126, 67,202, 40,197,155, 39, 49,179,180,250, 89,236, 86,149,218, 12,
+187, 82,150, 81,152,171,197,244,248, 96,127,124, 48,245, 81,125,241, 27,190,124, 56, 26,184,166,140,174,242,205,178,169, 22,245,
+178, 20, 1,235, 66,222,203, 66, 8, 34,108,180,138, 9, 34, 86, 42, 43,108,175,151, 23,131, 34,207,173,177,214, 24, 69, 41,171,
+ 64,218,100, 7,218,190,153,213,109,219,100, 86, 96,125, 67, 69, 68,117, 72,144, 82,148,234,247, 71, 30,190,240,174,191,246,142,
+ 24,226,225,209,244,189, 31,252,248,191,254,200, 39,255, 29, 13,212, 44,143,166, 7,151, 18,103,215, 54,206, 36, 64, 73, 58, 63,
+234,228,229,144,126, 16,163,119,161,169,155,197,188,156, 28,207,142,199,179,233,100,254,196, 31, 62,190, 92,214, 23, 30,190,239,
+101,175,120,224,220,249,179,189,126,110, 11,201, 66, 8, 62, 75, 93,144,198,154,224, 3, 0, 32,145,177, 42,203,179, 44,207, 50,
+107,180, 81,164,168, 67, 96, 87,226, 91,217,196,237, 86, 9, 87,247, 17, 87, 10, 30,222, 80, 55, 37, 51, 49, 39, 84,144,152, 68,
+ 24,149,162, 51,103, 78,252, 87,223,242,198,239,124,203, 87,143,143,102,191,246,190,143,124,232,201, 23,254, 20, 21,217,163,143,
+ 62,250,141, 95,243, 69, 95,247, 21,175,228,187,180,189, 29, 80,208,202, 44, 86, 73,161, 48,115, 12, 49,201,144,231,179,229,244,
+120, 49,155,204,103,211,114, 89,214, 46, 68, 68, 52, 90, 13,250,249,238,238,240,228,217, 19,163, 81, 95, 27,205, 44, 29,216, 7,
+136,144,122, 80,180,214, 70, 39,177, 10, 37,214,118, 5, 39,180,240, 84,123, 92,220,229, 69, 43,112,163,101,107, 24,214,120, 70,
+130,143, 25, 58,248, 39,198, 16,121, 29, 36,219,188,197, 53,161,105,220,100, 94,255,252,191,250,189, 59,135,227, 52, 23,225,179,
+ 62, 46, 92,184,240,192, 3, 15,104, 88, 97,206,208,106,173, 35,183,238,211, 66,203, 27,192, 74, 11, 83, 69,110, 26, 95,149, 77,
+ 85, 54, 77,237,156, 15, 33,198,182, 57, 22,128, 16, 98,140,139, 69, 5,123,199,174,118,253, 65, 47, 43,172, 53, 38,177,194,233,
+161, 84,250,175,109, 27,104, 55,214, 6, 56,182,198,202, 58,227,220,237, 65,114,215, 70,235,236, 7,157,154, 75, 41,165,173, 49,
+166,167,108,161, 77, 78, 38,211, 38, 51, 89, 97,108, 78,202, 0,176,175,202,239,252,158,183, 47, 38,119, 38,135,251, 23, 95,184,
+250, 35, 63,249, 79,199,147,249,191,113,139,233,172, 40,250, 59,222, 55,177,149, 46, 38,253,120,135, 20,118, 0,231,234,126,197,
+200,233,111, 18,185, 35,160, 34,234,228, 49,100,140,206, 50,147,247,242, 44,183, 73, 77,164,136,148, 86,198,106,165,148,210,164,
+ 18, 99,157, 68, 86, 45,185,158, 90, 51, 40,213,206,107,118, 25, 19, 76,182,102, 45, 89, 90, 0,183,251,126, 71, 84,181,177, 50,
+153, 39, 13, 7,201,181, 45,140,237, 41,155, 43,157, 41,173, 81, 32,184,186, 44,247,170,249, 97, 57, 63,170,150,101, 93, 55,193,
+133, 83, 39,182,254,225,143,190,115,111,255,232, 31,191,251,183,159,189,124,227,179, 24, 40,239,239, 12, 79, 61, 24,130,227,232,
+ 87,127,163,119, 28,154, 14,157,247, 33,196, 24,130,247, 1, 92, 16,230, 86, 20, 68,168,136,180, 81, 89,102,181, 86, 72,168,181,
+182, 86,101, 69,214,235,229, 69, 47,207,114,155, 21, 89,150, 25, 99,140,177, 90,117,108, 89, 43, 56, 72,158,211,110, 46,162,214,
+137,168,107,168,199,110,195,193, 93, 48,231,154,254,134,149, 81,144, 8, 80, 17, 17,180, 50, 42, 4, 17,223, 84,213,108,236,189,
+ 71,101,149, 54, 89, 62, 80,198, 70, 87,207, 38,147,201,248,200,213, 77,234,175, 78,233,197,238,214,224, 7,223,241,205,139,217,
+242,103,126,249,183, 47, 94,187,125,151,129,234,229,116,118,116,131, 5, 20, 41, 84, 70,105,107,108, 63,235,107, 36, 66, 16,142,
+ 49,134, 38,250,202,215,139,166, 90, 84,101, 89, 45,171, 24,217, 56,101,173, 14,153,101, 22,173,148,128, 36,241, 90,214, 53,231,
+217,204,218,204,216,204,152, 36, 6,211,109, 48,238, 4, 97,173,248, 42,125,178,174, 1,113, 85, 12,174, 80,114,132, 13,116,122,
+227, 71,157,212, 68, 37,161,135, 38,165,128, 90,166, 59, 85,149,218,100,218,102, 68, 42, 6,231,171,121,189,152,132,122,162,137,
+251,253, 28, 65,198,227,105, 93,186, 94, 97, 83,162,174, 20,245, 6,189, 31,120,251, 91, 14,198,211,159,250,191,126, 35, 69, 24,
+ 45, 0,121,127,123,116,242,254, 24,124, 12, 46,248,198, 55, 75, 87, 45, 93,181,116,174,138,145, 17, 80,219, 44,203, 11,109,173,
+178,189, 44,114,240,193, 52, 65, 27, 99,109, 96, 6,165,137, 89, 8, 81, 25,101,140,182,214,102,185,177,169, 77,196,104,109,148,
+210,186,141, 59, 68,216,110, 46, 66, 84,144,252,135,168,107,118,218,176, 14, 34, 66, 59, 84,161, 27, 70,176,242, 47,194,212,114,
+212,138,165, 90,197, 75, 43,236, 74,242, 41, 34, 36,146, 24,125,189, 88,142, 15,202,233, 65,185,152,214, 85,229, 26,231,125, 8,
+ 33,166, 83,186,151,103,214,232,197,188,172, 43,215, 27, 20,136,160, 21,161,213,167, 78,109,255,232, 59,191,227,201, 75,251,151,
+ 14, 23, 26, 1,124,179,112,229, 49,162, 82, 74,171,188,151,229,253,222,144, 99,112, 77, 57, 45,103,135,211,227,201,248,224,104,
+ 49, 95,198,200, 73,123, 70, 68, 9,198, 39,165,178, 28,109,102, 40,253,178, 81,218,104, 99,181,214,218,152, 86,222,169,136, 72,
+ 41,165, 90,109, 81,219, 48, 71, 68, 27,221,131,136,169, 21,171,221, 92, 73, 30,176,106, 56, 76,217,215, 90,222,130, 73,253,167,
+ 80,165, 46, 85,221,105,185, 84,234,149, 20, 14,161, 94, 54,229,164,154,143,203,249,113,181, 92, 54,117,227,155, 52,237, 36, 50,
+179,240, 70, 92, 71, 24, 12,122,121,145, 45,102,101, 89, 53, 59,219, 3, 68,157,216,245,126, 63,151,195,133, 6,192,114,118, 52,
+190,241, 60, 0,162,106,215,196,204,193,123, 87, 55,203,101, 53,157,204,103,147,197, 98, 94, 54,141,151, 40,164, 41,207,147, 76,
+198,104,163,141, 73, 93,165, 73,243,170,148,209, 73, 23,152, 98, 13,181,255,180,199, 85,171, 28, 68, 2, 90,185, 76,183,203,144,
+146, 67, 37,178,131,136,210, 40,142,244,157,238,119,219, 6,227,164,181,131,213, 78, 4,136,190,113,181,103,239, 98,116, 28, 3,
+ 71, 31,234,178,169,166,245,178,106, 26,231,156,143, 33,134,216,146, 51,156, 74,159,246,112,108,139,209,162,151, 25,163, 38,199,
+243, 24,121,231,196, 86,242,209, 46, 81,172,155,233,100,190,145,153,129,176,132, 24, 92,237,150,203,106, 62, 91, 46,102,101, 89,
+ 54, 77,227, 56,178,214, 42,248,150,242, 78,199, 69,150,228,104, 70,107,157, 12,178, 62,206,215,210, 52, 76,159,168,141, 16,131,
+157, 94,109,181,185,214,198, 66, 34, 74, 38,107, 55,224,170,149,184,211, 72,146, 66, 66,129,164, 73,114,105, 50, 0, 32, 42, 83,
+ 40, 11,174, 42, 23,203,241,209,254,216, 55,110, 48, 44,108,102, 3, 5,244, 33, 32, 66,136, 64,107,126,170,107,155,130,148,240,
+245,250,121, 93,187,235, 87,110,159, 56,181,147,132,204,169, 59, 50,212,181,235, 82,158,174,186, 15,209, 53,190,174, 92, 83,123,
+239, 67,240,137,250,110, 65, 49, 34,210, 70,217,204, 22,121,150,229, 86,183, 42,229,181,117,186,206,219,238,157,175,186, 98,161,
+ 51, 71,187,131,168,213,161, 67,107, 11,192,245,175,175, 84,136,157, 56, 82,119, 17, 71, 1, 98, 26, 68,197, 49, 32, 81,150, 15,
+ 85, 43,213,172, 93, 53, 71,241,253,194,224,201,173,229, 98,121,116, 56, 61,220,159,110,237, 12,182,183, 7,153,214, 33,132,232,
+ 99,136,145, 99,234, 50, 76,181, 1,119,246, 2,173,213,246,206, 96,122, 60, 61, 60,156, 98, 7,119, 64,244, 65, 64, 68, 80, 86,
+244,168,143, 33,132, 24,146,254, 0,149, 34, 17, 77, 10,172,181,189,126,222,235, 23,131, 65,111, 48,236, 37,121,118,123, 66,117,
+ 27, 10, 96,181, 41,218, 28, 89,218,169, 99,152,132,244, 29,119, 75,173, 43,117, 58,191,228,107, 93,156,218, 8,195, 74,119,157,
+215,173, 40, 48,177,218, 8,168,148, 22, 14,190,158, 45,150,199,229,124, 92, 45,102,117, 85,187,110,226,138,176, 88,163, 79,159,
+217,110, 26,127,245,210,173,178,246,231,206,157,232,245,115,171, 40,248, 16, 2,180,241,168,163,215, 91, 65, 22, 81,209,203,139,
+194,194,180,214,237,137,169,148, 48, 99,139,185, 2, 50,182, 50, 52,133,198, 40,102, 67, 68, 34,172,181,206,138,172,223, 47,250,
+195,162, 63,232, 21, 69,222,101, 55,154,212, 58,237,235,210,188, 46,163,129,174,146, 72,103,211,134,180, 7, 9,211,235,164,167,
+164, 44, 6,210,201,141,186,149, 70, 37,225,106, 59,203,137,160, 3, 51, 69, 66,104,202,102,121, 92,206, 14,151,169,216,169, 93,
+154,149,149,122, 35, 91, 93, 6, 66, 10,186,187, 39, 70,195, 16,167,199,179, 43,151,110, 15,183,250,167, 78,109, 41, 69, 27,253,
+139,177, 83,110, 96,123,154, 80, 23,131,140,213,253, 94,222,246,194,198,182, 47, 43,237, 20, 64,212,154,108,102, 56, 10, 42,204,
+172,105,147,192,126,158,101,182, 29,135, 64, 73,189,221,101,104, 43, 28,123,245,121,234, 55, 95, 65, 22,132,176,230,222,215, 95,
+181, 98, 49, 76, 26,108,149,182, 18,170,182,107, 31, 73,165, 81, 67,194,145,131,115,213,162, 94, 30,149,211,131,229,124, 86, 46,
+235,186,106, 86,205,223,145, 25, 54, 96,155,110, 45,109,228, 27, 12,123,121,145,205,231,203,103,159,190, 90, 20,246,244,233, 29,
+155, 27,133, 10, 0, 4, 35, 9,137,112, 39,164,107, 99,144,244,250,189,221,147, 59, 33,229,149, 49,166, 49, 98,193,199, 16,130,
+119,173,200, 5, 1,148, 86,198,104,155, 89, 99,181,177,166, 21,222,183,103, 10,201,218, 54,152,244, 60, 29, 6, 64, 40, 32, 29,
+210,213, 41, 84,161, 67, 34,147,114,139,214, 94,213,157,119,216, 6, 29,133,164, 17, 41,201, 50,152, 99,116,141,171,102,213, 98,
+188,156, 30,148,139, 69,185,172,155,198,121,151,218,143,227, 74,183,112, 87, 55,236, 93, 21, 30, 8, 75,191, 87,216,179,122, 49,
+171,158,125,250,114, 94,100,231,238, 61,153, 23, 25, 1, 10,174, 58,121, 55, 50,105,219,219, 26,158,186, 47,198, 40, 49,164, 41,
+ 49, 33, 52,193, 55,193,121,239, 67,108, 11,209, 36,105,165,213, 60, 15, 74,103, 19,181,186, 96, 4,220, 16,136, 80,187,154,187,
+ 36, 8, 27, 32,206,167,233, 0, 16, 86, 25, 16,162,106,131, 78, 55,118, 2, 59,233, 27,115, 12,222,123, 87, 54,174, 12,105,198,
+ 18,161,210, 74, 5, 21, 21, 83, 36, 66, 22,148,187,193,162,110,196,136,172,219,189, 59,237, 19, 21,253,252,204,185, 19,179,201,
+226,153,167, 47, 15, 7,189,123, 78,239,216,220, 2,175, 78,183, 21, 96,166,140,201,250, 42, 1,242, 49,168,224, 41, 52, 74, 55,
+218, 56, 19, 60,115, 76,253,214, 93, 42,187,121, 24, 99, 23, 98, 1,215,194, 92,236, 4,106, 8, 40, 36,216,226,220,119, 97,132,
+107,254,123,237, 57, 74, 43,101, 73,107,210,182,155, 73,169, 18, 59, 18,163,231, 16, 98,112,190, 41,171,217,193,228,224,214,248,
+112, 82, 46, 43, 34, 44,138, 60,165,175,109,184,243, 33,129, 50,112, 23, 76,212,118,118,222, 69, 1,138, 32,162, 53,122,123,123,
+ 96,172,158, 28, 47,158,123,246,234,238,238,112,107,107,160,141,130, 52,216,102,147, 89,149,149,168, 70, 98,210, 87, 18, 41, 80,
+105,248,192,221,144, 37, 81,183,155, 72, 86,133,100, 11,222, 32,116,214,106,229, 97,216,178, 0, 68, 73,222, 35,107,253,119,123,
+232, 19,162, 78,147,240,180,206,200,100, 74, 27, 68, 18, 97,223,212,204, 1, 1, 72, 25,157,103, 8,253, 96,115, 69, 10,137,180,
+ 49,199,227,201,248, 96,178,127,251, 86, 12,177, 63, 40, 6,163,158, 49, 9,186,101,142,173, 88,168, 19,182, 36, 2, 6,101,147,
+227, 20, 16, 22, 64, 36,165,138, 34, 35,162,204,234,163,227,197,209,241, 98,119,123, 80,244,108,194,249, 90, 86, 35, 6, 31,163,
+151, 24, 91, 76,158,131, 36,193, 41,174,149,201, 29,180,152, 74,101, 90,207,177,128, 86,254,133,120, 87, 35,238,166,246,105,237,
+ 60,130,119,105,173, 49,141, 40,201,180,201,148,201,181,201,144,148, 8, 7,239, 56,134, 84, 86, 72, 12,174,156, 52,203,227,122,
+ 49,169,171,133,175, 27, 31,124,240, 81, 43,218, 61, 57,234, 15,138,197,172,156, 28, 79,199,135, 19,173,212,214,206, 96,184, 53,
+180,185, 5,128, 52,229, 37,132,184, 26,219,193,188,130,221, 58, 92, 87, 36,165,117,214,104, 25, 20,136,120, 60, 89,220, 58, 56,
+222,234, 21, 46,172,104, 31,142,146, 72,139, 24,132, 91,198,162,211, 39,109,236,156, 86,203,185, 50, 23,174, 0,209,150, 41,234,
+ 62, 89, 99, 21,155,130,190,212, 77,152, 70,179,117,217,141,210, 70,153, 92,155, 92,217, 92,105, 11, 34, 49,161, 46,193, 7, 87,
+ 53,203, 73,189, 60, 42,231,243,170,172,234, 52, 6, 46,141,143,216,208, 1, 43,196,225,168,151, 23,166, 92,214,179,233,226,240,
+ 96,122,184, 63, 25,110, 13,118, 78, 12,139, 94,174,181,210,154, 67, 55,210, 42, 85, 27, 32,200,119, 43,172,210,253, 82,138,108,
+102, 71,195,158,136, 28, 46,150, 37, 43, 0, 76, 6,226,200,142,147,251,180,252,215,122,130, 94, 11,201,172,212,255,237,112, 62,
+252,140, 56,251,105, 20, 98,107, 17,162, 86, 69,220,129,134,221, 33,133,148,230,254,164, 25, 64, 32, 18, 92,197,190,118,245,178,
+ 94, 28,151,243,241,114,190,168,202,170,174, 92,154,163,211,141,125, 88,163, 32, 68, 72,137, 9, 66, 20,132,148,178, 14,134,253,
+229,162, 44, 23,229,124,186,200,114, 59,218, 30, 12,134, 61,165,149, 37, 19,163,194, 16, 2, 70, 76, 19, 63,165,187,175,178,158,
+ 21,168, 20, 90,107, 6,253,156, 89,230,101,232, 12, 36,177,163,186, 2,180, 36, 87, 43,230,107, 79,227,212,156, 10, 43,229, 52,
+224,122, 87,221,101,170,116,144,183,254,210, 29,252,233, 61,117,225, 8, 1, 9, 72, 1, 33, 8,138,112, 58, 52,163,171, 93, 61,
+175, 23,199,203,249, 98,185, 40,235,170,105,106,231,156, 15, 62,182,131, 2, 87,122,110,104,245,193,136, 72, 20, 58,200,164,181,
+122, 81,216, 44, 51,253, 97,175, 90,214,229,162,218,187,117,120,168,213,112,216, 31,108,245,172, 49, 68,164, 21,132,164,237,149,
+ 40,146,172,155,154, 81, 36,229,135,137,146,234, 23, 49,247, 50,141,188, 26,198, 28,219, 14,128, 36, 37,110,247, 39,118, 54,161,
+118,160, 6, 8, 10, 34,225, 42,214,194,154,147,105,245,208,105,100, 75, 74,127, 16,112, 37,188, 94,109, 73, 72,137, 28, 83,192,
+ 8, 78, 18,197,214,148,243,170,172,170,101, 93, 85,181,107, 92,138, 51, 45,170,187,202,106, 54, 68,215,204,178, 42, 99, 16,145,
+136,137, 86,224, 36, 88,163,212,176,176,153,169,150,245,114, 89, 29,141,167,211,201,188,232,231,131, 65,209,158,119, 4, 36, 36,
+ 34,194, 68,212,150, 83, 93, 54, 73, 90, 43,155, 25,173, 3, 0,235, 77,173,230, 74, 55,189,210, 37,175,183,206, 70, 24, 90,241,
+ 13, 27, 54,105,219, 68, 9, 73, 86, 8, 41,110,144,128,157,226,185, 37,181, 87,163, 71,162, 15,222,185,166,118,181,107,154,198,
+123,159,100,232,132,160, 8, 65,168,213,219, 72,186, 37, 2,128,204,105, 45, 44,146, 62, 71, 34,100, 70, 68,134, 85, 26, 10,152,
+ 20,217,121,145, 41, 77,117,229,170,178,153, 30,207, 23,179,178,232,229, 69, 47, 51, 70,175,182, 61,183, 37, 15,227, 26,167, 76,
+205,158, 93,169,177,154,252,146,132,160,120, 23, 71,183,166,234, 48,229,199,237,251, 92, 29, 81,109, 11, 69,218, 92,146,118,146,
+ 0, 17, 66,183, 73, 5, 58, 5,118,138,140,169,156,145, 16, 99,228, 52,126,199, 7, 22, 38, 84,218, 72, 18,190, 38,117,120, 88,
+205,138,142, 41,123, 75,195, 64, 65, 0,147,182, 59, 97,247,204,235,102,173,141, 17, 81,237, 93,208, 74,229, 69, 70,138,234,146,
+154,218,205, 38,243,114, 81,229, 69,150, 21,214,104,213,201,250, 87, 29, 16, 93,244, 87, 27,181, 88,146, 99,108,108,242, 21, 91,
+185,238,176,217,156, 77,213,237, 47, 89,137,201,164, 59,159, 54, 9,209, 54,117, 76,130,121, 94,113,182,177,157,102, 25, 35,175,
+ 74, 27,102, 17, 73,110,143, 6, 73,145,214,154,141, 78,214, 73,102, 74,147,184, 83,168,102, 94, 15,198,129,117,163,252,221,199,
+ 5,110,166,240,162, 21,101,185, 69,196,110,216,145,175,202,212, 61,157,170,188,164, 39, 88,141, 25, 92, 39, 35,122,131,142,227,
+ 13,183, 89, 77,144,109,139,136,205, 72,140,107,243,116, 1, 28, 87, 68, 76, 23,113, 56, 53, 11,164, 31,112, 43,233,111, 85,201,
+ 49, 73, 26, 90, 26,174,229, 20,101, 45, 53, 71, 68, 18, 66,101,136, 20,147, 54, 58, 70,142,173,153, 66,178,212,106,202, 84,226,
+155, 65,144,129,219, 60,235,179, 48,241,146, 80,115,173, 21,228, 6, 16,188, 15, 77,227,154,198,107, 77,198,166, 6, 97,236, 10,
+ 26, 89, 17,182,155, 30,212,169,180, 87,198,235, 54,210, 93,187,108, 51, 79, 79,138,179, 14,236, 73,203, 0,192,100, 20,236,154,
+ 9,186,169, 71,237, 92,163,142,156, 76,189, 79,188, 30, 34,181,161,206, 19, 94, 15,134,104,177,233, 85, 90,169, 80, 43,181,242,
+ 44,102,225, 8, 76, 44, 2,192, 45, 37,196,194,169,186, 17,102,196, 21, 79,157, 74,104, 36, 69, 70,171,100,216, 52, 55,171,105,
+188, 78,189,127, 68,169,108, 72,245, 4,172, 74, 13, 89,171,234,160,189, 88,154, 35, 6,210, 2,183,128,192,109, 50, 35, 93, 86,
+211,238, 43, 1, 72,205, 39,235, 10,113, 51,161,111,251,119,187, 78,152,216,154,104, 67,163,191,234,172,104,203,245,141,193, 83,
+176,174, 10, 16, 81, 18,144,152, 38,114,248,160,144, 66,171, 35,137,237,161,182, 82,217,243, 26,230,129, 77, 94, 63, 37,153,137,
+ 87, 81,138, 98,196, 16,216,135,232, 92,208, 90, 25,211, 98,162,233,148,148,181, 7,117, 45, 13,176, 89, 55,164,196,183,195,156,
+ 82,243, 71, 26,202,182,142,208,237, 24,173, 77, 30,120,205,159, 39, 42, 27, 90, 94,124,221,248,210, 50,181,145, 55,122, 71,215,
+240, 48,127,250,248, 45,185, 43,223, 77, 12,172, 82, 6, 81, 17, 70, 69, 62, 16,250,200, 33, 4,160,118, 54,109,187,173, 97, 99,
+138,199, 93,195,189, 88,186, 62, 69, 69,164, 56, 70, 9,145, 99,140, 62,144, 53,122, 37, 93, 77, 48, 64,151, 7,133,192,119, 43,
+ 49, 25,187,220,185, 11,120, 93,106,212, 89,230, 51,180,251, 27,130,217, 21, 40, 35, 9,130,227, 78,118,198,194,210,181, 6,173,
+ 39,142,241,186,245, 34,253,234, 42,112,180,178, 55, 94, 13, 43,150,213,203, 35,161, 66, 5,128,138, 40,106,162,116, 42,134, 40,
+ 49, 53,141, 9,240,221,192, 71, 82,132,172, 24, 31,108,135,172,178,194,200,208,246,160,176,116,252, 38,166,215,106,255, 23, 55,
+177,107,129,219, 80, 88,224, 58,142,200,202, 74,184,169,220, 89,107, 7, 54,133, 23,188, 14, 37,171,237,179,234,108,145,181,233,
+218,112,184,222,223,119,207,103, 3,184,123,164, 27,111,188,202,166, 24, 38,193,220,164,180, 70,196,152,238,104, 4,142, 49, 85,
+218,201,166,159, 41,204,130,196,195,145, 34, 21,149, 38,241, 44, 81,146, 18,147,141, 38, 66, 90, 25, 8, 69, 36,198,176,114,138,
+181, 49,112,163,103,245,179,212, 91,119, 59, 78, 39, 63, 89,233, 64, 96,189,131, 90,157, 8,183, 42,106, 97, 16, 96,248,204,169,
+118,155, 80, 68,178, 8,127,218,247,187,231,119,133,249,102,143,183, 0,128, 34, 66,221, 22, 67,204,105,146,186,116,119,191, 3,
+ 94, 16,185,133,231,136,148, 40,173,146,156,165, 29, 33,141,192,204,138,136,163,108, 36,138,252, 25, 27,125,157,213,108,218,104,
+195,117,100,131,120, 91,205,235,105,207, 93,216,220, 61,171, 93,211,254,104,221,204, 4, 43, 67,180, 77, 89,119,171,109, 58,202,
+ 74, 86,187,182,237,128,227, 78, 7,153, 22,147, 88,186,174, 28, 0, 17,108,105, 21, 32,194, 24, 5, 49, 10, 3, 51, 2, 69, 6,
+ 0, 38, 68, 38, 68, 33, 20, 33,165,132, 35, 70, 68, 2, 8, 32, 28, 37, 2, 40, 74,157,128,136,143, 61,246,216, 93,150,121,105,
+ 53,220,252,135,191, 6,222,189, 13,229,255, 3,105, 65,234, 37,157, 34,125,171, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/smear.png.c b/source/blender/editors/datafiles/smear.png.c
new file mode 100644
index 00000000000..2e6f73d3fb1
--- /dev/null
+++ b/source/blender/editors/datafiles/smear.png.c
@@ -0,0 +1,299 @@
+/* DataToC output of file <smear_png> */
+
+int datatoc_smear_png_size= 9358;
+char datatoc_smear_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72,
+ 68, 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0, 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,
+252, 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,
+215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7, 21, 0, 4, 17,164, 74, 11,162, 0, 0, 32,
+ 0, 73, 68, 65, 84,120,218,237,125,107,140, 93,215,117,222,250,214,222,231,222, 59, 79,114,248,146, 73, 73,182, 73,145,182, 37,
+202,169,222,178, 93, 55,182, 91,139, 54,148, 24,104, 13, 56, 63, 18, 20, 13, 80,219, 65, 30,118,252,138,237,216, 73,250,163,175,
+ 52,253,147, 56, 64,227, 20,109, 98, 35,118,129, 58, 13,208,160, 45,234, 2,181,100, 55,150,211,248, 37, 35,129, 45,138,122, 88,
+ 34, 37, 70,164, 36,138, 51,228,204,220,123,207,217,107,245,199, 90,123,239,115,103,134,150,220,202, 64, 3,232, 14, 57,156,185,
+188,115,238, 62,107,175,199,183,214,250,214, 30,162, 31,246,241,178,131, 7, 15, 31, 62,178,253,121, 16,209,199, 62,254,137,148,
+ 58, 16, 49, 51,152, 99,140, 77,140,177,105, 62,249,137, 95,181, 23,133,247,255,242, 7,218,118,154, 82, 39, 34, 73,252,147,146,
+170,200, 91,223,122,215,201, 7, 79, 94,190,116, 41,220,124,203,205,146,146, 36,251, 15,253,238, 35,171,171,151,218,182,147, 24,
+ 57, 48,221,113,199, 29,247,221,247, 85,252,227,119,191,251,191,223,119,129, 24, 12,102, 80,140, 32,165,221,203,195, 35,215, 44,
+ 29,190,102,169,105,154, 65,211,132,167, 54,174, 1,148, 84,137, 84,149, 68, 73,133, 68,117,223,238,102,247, 82,163,162,170, 26,
+ 69, 18,131,137,160, 0, 72, 72,161, 28,165,147, 67,251, 6,211,182, 13, 65, 72, 53, 44,238, 57,170,170, 68,249, 98, 68,162,146,
+148, 78, 62,182,113,236,229,115,126,119, 11,187,175, 3,148, 72, 65, 74, 4, 18, 2, 41, 1, 80, 58,117,102,227,228, 99,155,175,
+121,229,124,152, 95,121, 37, 41, 8,106,175, 33, 34,255,154, 97, 98,124,224,241,205,168,162,138, 68, 9,204, 32,177,215, 49,145,
+144, 18, 17, 41, 16, 72, 94,208,118,133,242,213,220,220,252,181,215, 94,203,140,205,205,205,173,123,119,203, 45,183,252,189,183,
+222,165,170, 12,128, 57,132, 96, 27,247,197, 47,126,241,190,175,254,153,191,232,253,239,255,101, 37, 5,129,153,193, 8, 28,162,
+ 61,154, 38,198,248,107,159,252, 4, 17,133,155,111,190, 69,146,136,138,170,126,255,201,245,103,158, 27, 63,187, 58,141,129, 7,
+ 17, 74,242,214,183,222,117,239,189,247,224,199, 79,252,204, 35, 79,140, 65, 32, 48, 7,138, 76, 77,228, 67, 7, 22,174, 63,178,
+178,107,105, 16, 99, 28,142, 70, 97, 26, 15, 19, 72, 84, 65, 68,164,170, 72, 74, 77,196,222,221,205,112,192, 36, 42,170, 81, 72,
+ 88,132,136,149, 68, 19, 41,135,128,240,183,142, 45,142, 6,212, 78, 91,137,162, 68, 97, 97,207, 81,104,190, 87, 21, 34, 21,165,
+ 71,158,216,124,197,161, 33, 3, 38,210,176,176,231,136,237, 43,148, 8,154, 95,175,143,158,153,156, 58,189,177,119, 87,156, 27,
+197,168, 41, 17, 51,145,253, 12,160,162,108,250,144, 64,116,223,119, 86, 41,172, 71, 33, 97, 85,219, 83, 98,144, 2, 4, 48, 19,
+ 37, 16, 41,129, 69,232,197,122,160,255,205, 7, 62,248,161,133,249, 5,219, 36,251,128,217, 71, 96, 0,129,195,167, 62,245,219,
+231,206,157,219,249, 66, 31,249,149,143, 38, 73,164, 68,162,118, 89, 16,129, 1, 98, 48,136,192, 1,204, 12,112, 8,129,129, 16,
+ 2,115,136, 49,126,252,227, 31,157,185,208, 47,252,226, 47, 17,217,221,155,148,234,131, 64, 27, 99, 73,137,154,134, 7, 77, 92,
+ 90, 24, 18, 40,132,104, 46,131,153, 67,140,159,253,236,103, 30, 58,117,138,136, 98, 59,157,218, 50, 64,180, 49, 17, 6, 22,230,
+ 34, 17, 61,117,161,125,224,209,245,209, 0, 0,119, 34,195, 38, 44,206, 15,246,236, 30,174, 44,143,118, 47, 13, 6, 77,224, 0,
+238,186,159,254,233,159, 9, 33,252,198,175,255, 26, 14,190,230,239,131, 92, 42,176,123, 99,183, 76,187, 77,102, 34, 66, 8,152,
+ 27,197,197,185,102,223,202,240,208,129,249,229,197, 38, 4, 6, 56,216,210,154, 24, 73, 68,161, 68, 16, 2,171, 18, 51, 9,169,
+ 2, 80, 16, 19, 67, 4, 28,208,117, 42, 34, 73, 18,169, 44,140, 40,165, 78, 5, 0, 11, 51, 51, 39,145,168,148, 72,149,132, 21,
+170, 96,146,142,136, 9,170, 74, 74, 10, 33, 82,152, 53,174,111,146, 40,221,126,195,160,109, 91, 0,102,124,102,129, 44,130,171,
+142,190,141,148,137, 73, 9,254,137,148,148, 9, 68,182, 40, 34, 16, 43, 0, 6, 8, 0, 19,192,140,159,124,227, 62,219, 82,216,
+182,238,191,238, 46, 34,192,212, 31, 4,187, 16,129, 8,164, 68, 76, 32, 82,128, 9, 74, 12,102, 19, 31, 56,152, 64,193, 12, 48,
+129,163, 72,114, 65, 19, 17,177, 74,178,213,193,148, 85,160, 0, 84,213,118, 34,169, 27,148, 36, 83, 54, 17, 98, 38, 16, 69, 85,
+177, 61, 35, 48,169, 16, 72, 5, 12,117,243, 83, 40,131,213, 54, 79, 72,153, 52, 17, 49,136,149,132,236, 77,132,148,149,254,191,
+123, 96,199,103, 87, 86, 86,118,239, 94, 33,162,201,100,124,241,226,197,141,141,141, 31,226, 66, 71,143, 29,123,215,187,126,202,
+ 21, 58,255, 99,166,207,204, 33,132,139, 23, 87,255,245,111,253,230, 15,186,208,199,127,245, 19,146, 68, 77, 7,221,250, 25,118,
+ 57,246, 71,176,139,113,136, 77,252,216, 71,127,101,135, 11,125,232,195, 31, 33,181, 15,219, 37,152,234,217,118, 3, 1, 12, 55,
+171, 16, 2,219, 18,195,233, 51,167,127,255,211,191,215,191, 16,119, 93,215,118,109,215,117, 93,234,186,212, 73,234, 36,117, 41,
+165,212,165,148, 36, 73,151, 82,215,117, 73,146,253,219,217,231,107,175,189,246, 55,255,213,111,109,189, 80,242, 63,246,195,246,
+240,175,206, 61,179,249,220,234,120,125, 99, 58,158,180, 73, 68, 82, 74,146, 82,215,117,109,219, 78,167,255,226, 95, 86,145,133,
+ 91,111,189, 85,123, 15,247, 36,164, 73,244,193,199, 46,175,111,118,109,167,151,215,187,181,245,150, 20,110, 30, 76, 69,160, 39,
+ 78,188,237, 75, 95,250,159, 30, 36, 13, 76, 76, 90,153, 76, 19,224,106,253,149,111, 95, 88,223, 72, 27,147,238,226,165,246,242,
+102,183,118,185,109,147,128, 40, 48,128,108,218,170, 74,250,218,215,190,246,235,127,241, 23, 81, 68,254,199,255,126, 78,212,205,
+139, 9, 74, 20, 0, 10,202, 10,144,134,200, 76,136,145, 3, 79, 98,224, 38,114, 8,196, 8,142, 11,186,110,223,222,125, 32,132,
+115,155, 47,183, 72, 11,195, 45,134, 80, 84,133,160, 66,162, 5,247, 40, 64, 77,224,249, 81,156, 27,134,192, 51,123,127,215,137,
+ 19, 81, 73, 45,214,186, 18,129,148, 18, 41, 84, 8, 4, 14,108, 30, 84, 84,219, 86, 66,160, 24, 53, 73, 18,177, 55, 80, 85, 37,
+ 96, 58,157, 70, 82, 53, 87,155,149,209, 62, 11, 8,162, 68, 73,152, 89,137,148, 40, 6,106,219, 52, 26,160, 9, 36, 34,200, 14,
+139,186,142,148,162,104,130,173, 67, 65,172,162, 96, 37,130,249, 17, 21, 2,137, 50,179, 8, 47, 45,132,227, 71, 23, 64,154, 82,
+ 2,192, 10,133,186, 30, 83,199,200, 11, 84,168,170, 66, 12, 15,138,168, 16, 9,169, 10,105, 82, 85,149, 51, 79, 77,187, 86,252,
+161,110, 84,246, 93, 18, 9, 11,123,143,170, 42,217, 66, 21,196,174, 74,200,182, 8, 37,100, 9, 62,124,122,227,153,213,246,154,
+ 3, 3, 95,176,162, 24,126, 88, 88,185, 14, 92,127,138,236,114,190, 96,133, 66,253, 89, 34, 37, 16, 54, 38,242,208,227,155,203,
+ 75,113, 97,158,253, 26,128,129,159,235,212,177,106,137,218,121,247, 8, 57,158, 88,124, 50, 37, 81, 2,158,124,122,122,234,241,
+141,139,151,186,107,175, 26, 42, 17, 8, 56,112,228, 4,193,194, 5, 80, 93, 11,106,116, 82,128, 41,131, 93, 6,123,128, 34,128,
+ 24, 32, 38,102, 16,179,129,245, 34, 87,119,250, 74, 32, 79, 23, 12,209,251,205,170,168, 10,145, 42, 9, 25,206, 39,133, 16, 72,
+ 35,169,171, 36, 32,118,199, 98,183,166,128, 42,129, 44, 70,168,169, 12, 1,110,218,170,172,134, 14, 13,226,229, 21, 65, 85,139,
+128, 9,162,164, 34,176,141, 81,177, 85,168,175,154, 32, 68, 4, 33, 21, 53, 72, 12, 37, 7,140,162,102, 85, 34, 66, 74, 66, 80,
+ 34,130,138,189, 65, 94, 70, 94,188,212,251, 7, 8,148,215,240,210,227,135,143,179,229,113,228,200,117, 55,220,112,195,225,235,
+174,219,179,178, 82,159,117,103, 74, 48,240,236,255,240,197,139, 23, 79,157,122,240,175,254,234, 47, 31,121,228,145, 23,103, 65,
+139,139,139,239,122,215, 79, 29, 60,120,200, 82,224, 12,152,213,109,153, 50,134,183,181,108, 65,210, 30, 83, 81, 32, 33,129, 98,
+211,252,167, 47,124,225,155,223,252,198, 11, 87, 14,188,227, 29,239,184,225,134,227, 34,197,183,101,147,154, 93, 50, 12, 59,150,
+165,228, 47,102,151,100, 9, 71, 93, 86, 94, 40, 51,115,151,186,127,251,251,159, 62,115,230,204,243, 44,232, 3, 31,252, 48, 57,
+ 12,222,186,148,226,153,122, 31, 51,171,161,154,102,244, 68, 68,117, 41, 91,132,199, 28, 0,132, 24,254,201,111,252,250,120, 60,
+222, 57,129,190,253,246,219,205,118, 85,243,191,189,135, 71,186, 45, 31,249, 6,148, 52, 37,217, 28,119, 93, 18, 17,178,188, 56,
+128,169, 23, 34,213, 69,175,254, 22,164, 34,242,166, 55,189,249,196,137,183, 61,246,216, 99, 23, 46, 92,216,178,160,216,165, 68,
+ 59,110,176,187,101,135,127, 89, 58,213,137, 63,125, 97, 58,109, 53, 4, 0,212,196, 16, 35,139,210,176,137, 49,116,163, 81,100,
+ 54,108, 38, 77, 96, 13, 96,241, 60, 0, 34, 38, 44, 17,249, 71, 63,251,179, 49,198, 79,255,222,191,121,252,241,199,235,219,190,
+247,189, 63,119, 37,117,103,178, 24,196, 96,117,215,175, 32,224,177,179, 27, 23, 86,219,182,211,200, 24,141,130, 90, 14,165,148,
+ 68, 99, 8,163, 97, 96,198,238,165, 97,140, 60, 28,132,209, 48, 12,154, 16, 2, 66,224,200, 22,189,171,234, 91,201, 98,208, 12,
+ 62,246, 49,199,163,120,247,123,222,227,102, 4, 58,123,126,114,250,220,116,245,114,215,117, 90, 3, 37, 48,106,120,101, 57, 30,
+189,102,110,113, 62,220,251,205,231,148, 16, 51,154, 9,129, 69, 69,149, 6, 77, 16,209,192,136, 17, 49,240,242,226,208, 86,179,
+ 56,223,204, 13,227,176,225,225, 48, 48, 16, 98,214,179,153,117,113,224,240,185,207,253,209,201,147, 15,224, 29,239,252,135,223,
+124,224,114, 86, 87,173,242, 49,167,207, 4, 5, 74,146,228,217,145,125,167,100, 25,146, 2, 32,102,168, 82, 8, 8, 1, 49,240,
+194, 40, 54, 13,143,134, 97,215,210, 96, 56,136,203,243,113, 48, 8,195,129,137,196, 23,228, 38,201, 0, 56,112, 0,240,149,175,
+220, 27, 46,211, 97,100,253, 43, 75,241,232, 78, 94,113,241,143,130, 55,220,171,192,202, 35,176, 74, 87,118,153, 89,235, 65, 68,
+145, 49, 28,240,104,200,131,134, 99, 0, 17, 49,144, 47,231,128, 36,151,228,148, 84, 95,241,202,195,209,125, 15, 40,175, 65,170,
+113,215, 55,182,181, 41, 41, 20, 82, 87,167, 96,134,231,225,162, 10,128,148, 68, 1,102,232,104,128, 16, 8,164,227,205,118, 97,
+196,129,153, 72, 83,210,236, 63,160,121,211, 74, 98, 10,213, 72, 42, 94,106, 83,183, 33,101, 81,223, 50, 98,209, 2,218, 28,134,
+168,146, 50, 72,148,136,148,213,161, 44, 51,160, 94,246, 33, 85,154,118, 50,157,202,254,149,225,213, 7,134,204, 32, 64, 68, 8,
+150,204,218,221,229,144, 99, 78,215,138,114,170, 49,163, 14,123, 75, 1, 64,106,128,216,176, 30,136, 68,179, 72,124,109,154,124,
+191, 72, 84,160, 32,104, 82, 53,200,136,148, 40, 65,175,125,217,232,250,195,243, 68, 16,177, 60, 2, 57,240, 88, 14,195, 4,101,
+ 98,225, 68, 38, 34, 34, 40, 24,138, 3,199,238,118, 69, 40, 46,134, 96, 25,187,218, 93,100,240,153, 35,171, 35, 78,195,165, 30,
+219,236,133,185,222, 0,160,148,101, 94,119,227,242,190,149,198, 2, 49, 89,118, 67,108,121, 14,219, 15,128,138,154,131, 17, 22,
+247, 28, 37,104, 1,139,100, 88,185,106, 52,213,144, 82,242, 9,228, 10,135,107,114,134,171, 57, 7,206, 90, 73, 74,250,196,211,
+211, 83,143,111,158, 58,189, 41,162, 7, 86, 26, 17,123, 37,122,200,129,106, 81,151,128, 3, 71, 79,168, 57,209,226,142, 84,201,
+110, 49,255,205, 6,129, 89,191, 96, 78,129, 76, 32,202,185,122, 2,174,185,158,127, 1, 82,228, 44, 0,204,184,249, 85,139, 7,
+247, 15, 3, 51,245,227,160,169,226,129,235, 78,144,215,119, 76,209, 75, 94,228, 59,168,100,153,168,231, 71, 84,147,128,146, 93,
+ 24, 78,102,168, 21,155,172, 52,205,249,182, 25,100, 10,235, 91, 70,202,249,105, 16, 40, 48, 6,145,247,236, 26, 92,125, 96,184,
+103,185,193,254,195,119,169, 25,160,151,196, 65, 64,209, 30, 91,163,191,119,206,182,115,197, 28,158,103,248, 15,114, 73,163,136,
+184,128,121,211, 74, 43, 99,152,128,202,186,173, 64,162,106,255,203,182, 63,156, 13, 74,148, 12,149, 9,169,154, 59,209,156, 46,
+144, 90,234, 39, 14,195, 69, 73, 45,195,205,184,191, 56, 68,177,146,189, 66, 85, 97, 40, 94, 96,240,221,253,139, 40,178,239, 36,
+ 85, 81,130,170,168,163,125,213,232,110,217,235,101,118,219, 57,225, 55, 57, 40, 41,144,181, 93,189,196,150,125, 58,200,243, 28,
+ 85,219, 9,133,146,144,101,201, 10, 98,241,172,131, 65, 36, 34, 96,228, 10, 27,103,220, 0,203,138, 64,164, 76,145,172, 44,199,
+ 80, 18,181,146,103, 65, 97,164,142, 26,212,157, 41,101, 31,233,215,242,139, 91, 41,143, 61, 49,181,109,243,178,117, 78,250,253,
+ 74,253, 60, 86, 44, 6, 90, 43, 7,196,202,150,166,137,170, 9,205,119,193, 0,149,199, 24,148, 80, 38, 42, 74,162, 42, 30,107,
+212,109, 86,213,118,129, 60,209,244,188,158,178,223, 36,144,119,114,252, 33,182,199, 68,189,141,115, 17, 43,189,148,150,189,244,
+248,145,103,174, 53, 25,104,226,252,220,252, 96, 48, 24,141,230,154,166, 33,175,234,181,227,241,100, 50, 25,175,175,175,167,148,
+126,228, 11,106,154,230,166,155,110,126,205,245,215,191,226,229,175, 8, 49,212,104,207,110,103,150, 2, 26, 44, 86,213, 71, 31,
+125,244,129,239,125,247, 91,223,250,214,212, 26, 60, 47,226,130,126,226, 39,223,113,252,248,241, 38, 54, 25, 43,213, 76,186,151,
+ 80,151,192,232, 25, 62, 17,133, 16,192,152, 78,167,247,127,251,219,127,250,167,255,249,255,105, 65, 49,198,227,199,143,223,125,
+247, 79,104,193,174,125,160,157, 83,250,126,134, 63,155,156,206,166,246, 0, 51,175,173,173,125,234,119,126,123,125,125,253,135,
+ 91,208,158, 61,123,238,190,251,238, 67,135,174,177,154, 81, 15, 77,247, 94,212, 79,236,123,159,175,184, 38, 67,167, 68, 33,134,
+243,231,206,125,246, 51,159,217,158,164,238,188,160,247,189,239,125,115,115, 11,217,125,110,205,240,107, 38,143,178, 97,125, 41,
+121, 98, 11,102,207,240,107,129,161,191,153, 8, 33,156,122,240,212, 31,252,193,191,123,254,230,248,223,249,241, 55, 25,205, 32,
+105,162,156,134,231,152, 80,242,123, 37, 34,241, 72,226,223,120,136,245, 4, 38,199, 47, 47,206,230,224, 2,127, 1, 17,237,221,
+187,247,109,111,127,251,215,254,252,107,237, 15, 84,249,112,231,157,175, 83, 21, 81,139, 86,219,138, 13,189, 5, 81,191,210, 80,
+171, 9, 68,116,229, 16,148,243, 40,191,140,200,155,223,244,150,216, 52, 15, 63,252,208, 21, 23,116,199,157,119,206,190,113,239,
+ 79, 15, 73,211,246,183,238,175,166, 38,112, 64, 45,114,245,224, 92, 17,173,210,225, 87, 30,126,205,245,215,127,227,235, 95,191,
+194,130,238,184, 67,251, 23,237, 47, 9,179,114,232, 45,165, 60, 57,158,166,233, 52,217, 14,139, 18,160, 25, 59,151, 90, 57, 74,
+ 9,176, 8,109,215,242,174,183,188,229,239,222,115,207,151,118, 88,208,109,183,223,110,229,125,213, 29, 54,172, 86,122,250,133,
+ 33, 85, 34,237,146, 62,183, 54,157,182,137,136,186, 36,134, 21, 83,162, 24,184,143,120,161,208,109, 18, 54,136,252,230,183,188,
+229,222,123,239,217,190,160,219,118,148,194,246,141, 66, 89, 30,104, 99,156,206, 61, 59,233,146,116, 73,173, 84, 50,237,100,218,
+ 10, 51,166, 93, 34, 66,114,123,181, 14, 50,102,222,194, 51, 45, 48,243, 29,119,222,249,213, 76, 25,201, 11,186,245,182,157, 87,
+ 83, 51,213, 94, 70, 70, 32,162,213, 75,237,217,167, 39,147,105, 26, 79, 36, 37, 37,162,205,113,154,180,218,118,178,190,217, 77,
+ 59, 33,160,109, 19,121,123,202,152, 22,216, 30, 20, 64, 24, 13, 71,135,143, 28,185,255,219,223,174, 11,186,229,150, 91,117,167,
+135, 9, 36, 87, 24,188,166, 79,138,141,113,122,244,236,230,165,245,110, 60, 21, 34, 74,162,227, 73,154,118,186,177,217,110,140,
+147,245,178,218, 78, 1,154,182,137,128,192,206,238,225,226,117, 45,245,243,236, 79,247,172,236, 89, 91, 91, 59,123,246,172, 7,
+140,190, 79, 54,205, 19,161,105,103, 55,134, 24, 48, 28,176,249, 22, 81, 18,145, 7, 30,189,124,241,114, 7,208,160, 65,219,137,
+101, 46, 41, 41, 7,110, 2, 54,199,105,110, 20, 83,210,182,147,133, 81,195,220, 17,233,104, 16, 1, 33, 69, 8,198, 96,200,176,
+ 61, 37,102, 22,166,127,240,206,119,126,239,123,223,181,174,115,204,253, 41, 26, 79,229,225, 51,227,103, 86,219,245,205,148,141,
+ 21, 68, 20,152, 23,231,248,224,254,225,177,107,231,190,247,253,245,167, 46, 76, 24, 8,129,218,142, 2, 64, 76,146, 52, 68,230,
+ 46, 77,148,154,134,101,179, 21, 53,129, 16, 64,129, 49, 69, 98, 16, 2, 19, 52, 88, 46, 64, 70,173, 96, 18, 97,162, 78,245,131,
+ 31,250,240, 63,255,103,255,148,136,194,205,183,220,178, 57,150,251,254,114,237,161,211,155, 23, 47,183,109, 39, 57, 76, 0, 80,
+203,117, 39,173, 60,187,154, 30, 62,179,185,122,185, 83,213,164, 42, 66, 32, 77, 74, 41, 41, 1, 41,137, 8, 1,232,146, 48, 16,
+ 3, 82,146, 38,218, 79,211,160, 97, 34, 10,209, 11, 86, 85,193,189, 36, 64, 12,196,166,185,124,249,242,217,179, 79,134,105,115,
+221, 3,143,109,116, 73,115, 61,204, 27, 99, 61, 95,103, 70,106, 58,154,119,158, 44, 79, 81, 16, 37, 17,147,165,136,114, 38,127,
+133,200,146, 36, 4,110, 26, 16, 97, 56, 8, 0, 5, 96,214,145,129,106,217, 0, 55, 28, 63,126,239, 61,247,132,184,244,106, 80,
+174, 36,231, 0,238,249, 83,201,171, 74,113,198,163,170,194,214, 95,234, 76,222,178, 39, 21, 53,240,161,170,131, 38,128,169,137,
+ 97,216,176, 85, 66,193, 61, 71,222, 51, 91,175,237,137, 46,239, 90, 14,203,251, 95, 77, 94, 92,203,158,204,186,167, 14, 47,212,
+ 91, 94,246, 79,117,184, 84,151,238,125, 66,175, 12, 89, 21, 49, 6, 6, 48, 55, 12,243, 35, 30, 14, 66,211,176,213, 21,118,192,
+133,189, 30,193,181,215,190,156, 45,209,243, 13,176,228, 48,119, 72,181,151,201,121,254,104,245, 48, 18,162,156,195,131, 61,205,
+ 54,154,152, 88, 50, 9, 17, 29, 52,104,162,101,136, 58,157,166,192,249, 2,146,219, 6,246,206,162,201, 59,193,154, 82,178,138,
+ 23,121, 97,192,186,154, 90,194,187,228,152, 40, 94,192,130,130, 68,196,181, 71,213,186,215,160,114, 71,164, 42,202,164,195, 1,
+136, 84, 68,219, 46,141, 39,105,126,100,110, 72,108, 41, 34,146,239, 78,252,137,252,124,244,176, 64, 98,149, 57, 47, 35,168,244,
+ 96,180, 16, 65,132, 0, 81,111, 11,149,194,177, 35,126,171,215,121,125,137, 41, 70, 76, 91,137, 49,140,167,105,247, 98,179,111,
+165, 1, 72, 68, 75,233,107,166, 72,168, 4, 54,187,133, 2,145, 60, 72,103, 93, 87, 37, 88,237,147,136, 20,162, 25, 49,250, 18,
+ 69,172,221,224,109,188,204,105,240,181,216,234,199, 19,153,159, 11,131, 64, 71, 14,205,205,207, 69, 18,175,236,114, 86,232, 92,
+ 62, 42,233,190, 58, 23,202,170,176, 90,169,100,170,164,144,172,172, 80, 49,179, 83,175,247,100, 69,182,178, 14,121,173, 74,225,
+118, 15, 17,130,116,186, 60,207, 71,174,158, 59,184,127, 4,130,136, 16,193,251,198, 25,132, 11,229, 27,180,187, 49, 39,198, 44,
+ 34,209,125,147,146, 66,212,138,242,168,120,181,136, 78, 10,186, 17, 43,163,216,173, 89,153, 81, 51, 31,213, 36,197,147,150,118,
+ 45, 6, 47, 70,213,234,165,247,159, 61,220,235, 54, 60,161,170,170, 97, 97,239,171,128,236, 15,253,134,115, 69,175,148, 16,171,
+129,123,205,217, 61, 17,229,250,111, 69, 99, 32,162, 78,244,177,179,147, 97,131, 93,139,113, 75,128,215, 89,147,207,148,181,234,
+ 13,194,194,202, 81,175, 95, 34,123, 68,247,135, 94,188,174,200,177, 95,249,132,170,146, 21, 48,157, 86, 81,219, 19,142, 85,207,
+ 93,104,207, 63,215, 94,125, 96, 80, 22,163, 52,171,204, 69,185,181, 64, 95, 10,139,123,143,121,204,200,184,169,230,168,154,203,
+121,153, 7,130,217, 96,162,217, 44,109, 19,173,202, 6,228,168, 3,108, 78,229,161, 51,155, 11,115, 97,215, 66,176, 54, 18,149,
+250, 28,122,173, 1,148,146, 50,194,226,158, 99,132,220,114,114,199,232, 20, 32, 11, 18,190, 85,208, 82, 16, 71,142, 19, 53,136,
+120, 3,198,174,225,253, 48,207,141,128,167,158,153, 62,241,244,228,224,222, 65,140, 60, 19, 44, 72,103,113, 32,129, 40, 44,174,
+ 28,237,117, 52, 73,137, 93,231,220,163,103,126,154,102, 69, 33,167, 29, 85, 62,181,149, 44, 29,114,184, 28, 84,213, 9,185,170,
+202,104, 91,122,244,236,230,133,213,238,208,190, 65,214,131, 28,166, 43,102, 3, 1, 97,126,207,117,190, 77,170,185, 11,145,205,
+165, 16, 64,145,155, 45,228, 46,194, 58, 63,234,141, 56,115,143,185,180,170, 37,211,117,240, 0,135, 8,180, 57, 78,167, 78,111,
+174,173,167,221,203,113, 16, 57, 27, 93, 69,135, 64,238,117,120,251,165, 7, 49, 75, 43, 6, 40, 12, 53, 84,155, 48, 16, 80,107,
+237, 89,168,197, 37, 40, 42,140,118,221,242,189,186, 60,150, 71,159, 24, 63,254,212, 88,132,150, 23, 66, 19,185,170,116,191,181,
+160, 69, 20, 58,115, 49, 91, 82, 77, 1,243,205,100, 3, 97,205, 56, 46,119, 63, 56,111,182,177,132, 12, 44, 24,123,139,235,162,
+189, 65,199,145, 49, 55, 10,215, 28, 24, 29,216, 51, 88, 90,136,216,127,221, 93,149, 19, 5,151, 47,151,236,110,107, 34, 74,121,
+125,165, 73,221,115, 37,240,102, 67,230, 45,149,190,151,245, 5,193, 94,239,242, 94,173,203,217,218, 32,165, 65, 85, 25, 3,238,
+176,125,117, 90, 16,191,246,157,153,250,252, 0,172, 83, 32,189,124, 52, 35, 72,177,132, 64, 73, 4,200, 14,152, 8, 6, 56,156,
+173,165,146,153,120,158,130,154, 21,147,181, 1, 11,238, 49, 17, 56,146,144,188, 58,127, 38,175,204, 59, 10, 4,107, 91,100,166,
+104,225,123, 34,215,116, 0, 47,164, 56,159,220,116,149,250,183,237,198,132,210,178, 51,102,148,245, 95,140, 19,149,203,247, 40,
+ 29, 24, 96,166,221,166, 74, 25,156, 0, 98,237, 25,234, 27,140,121,249, 44,171, 92,255, 50,197,214,156,237, 73, 37,156,192, 67,
+146,165,127,236, 77, 96, 11,198,198, 43, 51,118, 60,164, 22, 12, 84,196, 55,207,213,219, 71, 77,188,111,160,165, 91, 64,164,222,
+121, 33,201, 82,211, 60, 71,224,245, 36,120, 55,163,254,183,209,203, 76, 72,172, 40,165, 15,248,156,137, 20,113, 42,145,216, 27,
+ 23,245,166,140, 41, 9, 74, 34, 57,130,105,222,187,222, 32,138, 53,162,108,109,206,128,115, 79,234,221,101,100,112,140,210, 95,
+178,124, 78, 69, 76,127,157, 61,165, 36,121, 82,197,157,181,144,168,255,161,172,169,254,102,165, 38, 9,207,227,253,135,179,191,
+ 87, 21,119, 64,158, 13, 19,140,127, 73, 89,247, 8,249, 26, 2,225, 12, 97, 85, 74,103, 62, 99, 41,167,229,213, 36,163, 68, 86,
+ 7,248,206,208,115, 87, 35, 46,132, 34, 35, 19,176, 89,191,251,111, 21,183,143,108, 91,200, 45,193,220,142, 99,199, 4,226, 86,
+ 39, 4,148,249, 15,168,191,171,102,234, 98,175, 74,156,129, 74,233, 86,193, 93,129, 11,183,199,152,240,172, 36, 23,198, 60,187,
+203,121, 2,114, 27,217, 38,110,200,249,145,182,211, 4, 18,201,137, 99,134,138, 68, 10, 21,136,247, 54,125,231, 92, 84,132,194,
+186,116,120,235, 36, 69,231,100, 40, 42,173,201, 0, 74, 49, 42,210, 45, 41,218, 75, 13,179,151, 30, 47, 61, 94,122,252, 77,233,
+183,254,160, 75, 0,139, 75, 75,203, 75, 75, 11, 11,139,187,118,239,218,179,178,103,215,238,221,187,150,151,231, 23, 22, 23, 22,
+230, 6,131,161,161, 64,154, 41,152,229, 28, 71,169,235,186,205,205,141,181, 75,107,151, 46, 93, 62,127,254,220,229, 75,151, 87,
+215, 86, 47,173,173, 93,188,120,241,210,165, 75,127,243, 4, 52, 63, 63,127,244,216,171,174,190,250,234,171, 14, 28,216,181,107,
+247,252,194,124,140,177,223,137,217, 82,166,223,254, 38,152,109,219,246,232,189,101, 60,161, 62,186,174,219, 88,223, 88, 93, 91,
+ 61,123,246,201, 83, 15, 62,248,208,169, 83,221,139,212,249,126,209, 4,116,224,192,129,155,111,185,229,198, 27,127,108, 56, 28,
+212,146,203, 11,185,110,173,220,150,186,148,127,139,146,105,123,162,158, 11,187, 61, 73,101,121,129, 11, 51,218, 51,100,102,230,
+211,167, 31,255,242,189,247,158, 60,249,128,188,136, 83,169, 47, 68, 64,139,139,139, 87, 93,117,213,107, 95,251, 99, 71,143, 30,
+227, 24, 24,172,165, 49,220,235, 81,109,145, 17,118, 84,154,254,172,201,214,111,183,113,232,183,127,158,157,154, 67, 33, 23,246,
+ 90, 12,214,133,127,238,185,231,254,236,127,125,229,228,201,147,207, 62,251,236,143, 68, 64, 7, 14, 28, 56,126,252,248,225,195,
+135, 15, 92,117, 85, 74, 2,160, 82,201,103, 73,134,207, 47,230,146,185,247,189, 77,173, 2,209,140,240,182, 19,233,183,145, 1,
+158,239, 73,100,174, 34,115, 96, 34,156,126,252,177,111,126,227, 27,247,127,231,254,182,109, 95, 28, 1,125,242,147,159,156, 76,
+219,153,142,110,159, 66,240, 60,146,153,165, 60,244,239,118,203,147, 59,188,108, 11,109,227, 7,168,210, 22,234, 66,223, 12,139,
+245,245, 39, 43, 1, 96, 50,158,124,249,203,247,110,111,229,254,208, 2,250,208,135, 63,210,203,179,245,202,250,178,205,243,244,
+105, 50,179,114,233, 61,185, 93,149,102,141,112, 27,175,165,142,104,108, 97,114, 60,191,138,193,217,190,168,174, 44,112,104,219,
+246,243,159,255,163,147, 39, 79,254,223,205, 63, 57,157,193, 91, 33,185, 30,211,231,124,228, 63,219, 68,166, 91,132,214, 87,186,
+ 45, 20, 11,237,187,176,158,158,246, 52, 84,183, 49, 37,244,138,207,107,127, 23,243,183, 59,126, 86, 85,102,190,233,166,155,239,
+186,235,196,193,131,135,158,124,242,137,237,103, 61, 60, 15,159, 76, 69,116,219, 61,238,196, 29,184,130,101,233,182,239,250, 79,
+234,142,207,102,234,103,166, 32,151,225, 54, 39, 64,219,160,160,241,125,184,199,195,236,183,143, 0, 75, 77,149, 42,135,191,126,
+182,129,206,108,118, 4, 36, 74,215,223,112,253,241, 27,111, 88, 91,187,252,199, 95,248,143, 15, 61,116,234,133,154,216, 47,254,
+210,251,250,162, 65, 97,251,208, 21,158,200,134,146, 11,229,254, 69, 41,172, 83, 62,150,160,119,100, 66,239, 71,124,230, 15,164,
+212,118,210, 37, 45,117, 66,147, 72,140,126, 24,128, 9, 45, 48,199, 6,129, 67,181,191,124, 20,133,211,184, 52, 23,164,235, 64,
+ 14,122,161,162, 14, 77,149,182, 1,115, 16,213, 63,252,195,127,255,240, 67, 15, 61,191,137,221,126,219,237,125,227,200,118,211,
+ 35, 13,245,232,183, 59,178,116,182,154,223,246, 65, 48,157, 49,182,201, 84,214, 55,186,181,245,118,125,179,219,156,164,105, 43,
+146,114,129, 68,181,235,116, 50,149,105, 43,198,170, 78, 34, 93, 75,185,162, 68, 34,153, 77, 85,198,185,115,167,170, 79, 32,164,
+ 30, 7, 74,123,239,223, 99,227,208,173,183,222,250,250,215,191,225,252,249,243,207, 60,243,204, 15,210,160,159,255,249, 95,232,
+ 57, 97, 92,201,170,250,108,150,108, 32,133, 46, 72,229,244,138, 45, 1,189, 95,230, 23,213,205, 73,186,180,222,109,142,165, 75,
+126, 26, 73, 8, 28, 35,184, 87,132,103, 70, 8,126,242, 3, 17,133,192,129,193, 1,131, 24, 98,100,211, 50, 27, 33,178,129, 46,
+251, 95,246, 81, 12, 80,159,159,127, 5,120, 85,106,229,118,110,204,217,191, 62,251, 31, 62,255,185, 43, 97,168,112,235,109,183,
+213,138,116,253,179,163, 35,234,109, 6,205,182,241,232,121,248, 79,151, 55,218, 39,207,143,207, 61, 51, 89, 93,239,198,147,212,
+ 37, 17,165, 36, 58,237,116, 60, 77,147,137, 76, 59, 73, 66,157,232,100,146, 46,111,116,235,227,118, 50,149,105,171,227,105,154,
+ 76,211,120,156, 38,173,168, 82,151,100,210,166,201, 52,181,157,171,182,213,147,197,120,230, 82,170,249,179,252,173,109,254,187,
+172, 76, 68,150,150,150,255,246, 27,223,184,184,176,244,224,131, 39,119,208,160,247,188,247,231, 94, 8,210,201,156,146,172,205,
+179,177, 60, 19, 47, 74, 47,174, 14, 13,182,157,156, 61, 63, 57,127, 97,218, 38, 69,223, 89,131, 24, 20,152, 67, 96,128, 68, 53,
+117,146,132, 66, 64, 96,127,198, 20,106,216,132, 24, 64,160, 24,120, 48, 8,131,104, 71, 15, 32, 6, 14,129, 67, 64,211,112, 52,
+ 69,179, 67, 73, 24,204, 84,230, 88,250,128,137,122,200,160,192, 38, 66,245, 82,191,251,187,191,243,212, 83, 79,205, 8,232,221,
+239,121,207, 14,214,228, 67, 4, 58,153,234,230, 36,173,111,166,245, 77, 25, 79,165,109,181,147, 26,124, 3, 16, 27,158, 27,240,
+252, 40,204, 13,121,110,196, 11,163, 48,104, 24,185,182,251,236,197,246,241,191, 30,175,143, 83,151,106,180, 52, 38, 19, 7, 59,
+175,169,204,172,155,147,246,136,198,224,192, 62,232,164, 68,118, 30,195,104, 24, 76, 52,129,185,137, 38, 44,196,192, 49,114, 8,
+ 28, 3, 98,228, 16,108,210,198,102,105,137,123,166,118, 37, 0,213,135, 78, 12,254,218,159,127,237,191,253,215,255, 82,195,124,
+111,214, 72,153,104,125, 44, 79, 62, 61, 57,119,161,221, 28, 75,155,106,252,157, 77,165, 10, 33, 4,219, 34,184,207,252, 45,206,
+135,249, 17, 95, 88,235,214,199,201, 42,197,176, 35, 89, 24,128, 74, 34,237, 58,235,170,147, 29, 9,146,107,206, 54,193,156,144,
+166, 62,150,196, 49, 0, 80,237,146,168,196,192,195, 38, 52, 13,137,106, 18,109, 35, 6, 49, 12,149, 6, 68,118, 14, 67, 72,136,
+ 17,129,153, 68, 69,136, 2, 96,227,118, 5,116, 20, 78, 84,134, 5, 41, 83,135,133, 72, 89,223,240,250, 55,236,223,183,255, 79,
+254,228,143,173,216, 18,110,186,233,230,233, 84, 78,159, 27,127,231,193,245,239,125,127,253,177,179,227,103, 87,219,105,107,173,
+142,114, 80, 6, 97,134,185, 66,189,233, 50, 45,205,125,228,161,197,105,210,245, 77,185,120,185,155, 78, 69, 37,119,196,160,162,
+ 42, 73, 83,162,148, 10,247, 7, 41,105, 74, 78, 28, 35,130,157,135, 38, 94,125,135, 18,137,136,209, 74,152,153,128, 36,146,146,
+136, 40, 51,103, 78,147,170,168,143, 18,214, 70, 64,241,215, 90, 26, 41,125,126, 42,106,121, 95,123,172, 90, 18,145,125,251,246,
+221,120,227,141, 15, 60,240,192,120, 60, 14, 79, 79, 15, 63,124,102,243,153,213,182, 77, 91,104,192, 58,155, 76,169, 15, 41, 85,
+ 38, 29,168,144, 12, 60,144,121, 47, 10,101,128,144, 74,127,221,154, 64,101, 8,140, 72, 97, 70,231, 76, 66, 63,213, 77,139,243,
+ 48,134,148,155, 30,172,133,169, 70,122, 49,171,176,195, 24,152, 17,236, 28, 35, 35, 36, 6, 4,152, 15,218, 1,212,111,129,230,
+ 91,216,235, 61,118,146,206,205,205,221,249,186,215,125,231,254,251,195,226,190, 87, 3, 51,189,247,153, 76, 66,107,195,101, 75,
+ 50,101,104, 2,234,102,166,153, 32,208, 75,203,212, 27, 85,154, 71, 47,225,124, 45,165,204,197,200, 76,239, 50,192, 95,187,141,
+ 89,152, 82, 72, 35,142,159,141, 80,134, 16, 17, 3, 51,200,102,155,155,134,155, 96,246, 72,101,215,234, 73, 90, 91, 36,213,167,
+ 5,246,115,207,156, 24,169, 42, 24,175,187,243,245,145,116,123,153, 75,183,230,159,149,214,157,207,198,202,188,130,124,119, 54,
+202, 38, 54, 3,107, 7,186,160, 48,213, 84,172, 43,239,202, 12,201,163,134,238,124, 42,171, 44, 67,191,204,165,178, 3, 73,152,
+ 8,146,164, 21,168,162,137,193,206, 9,180, 46,120, 19,120, 56,192, 32, 2,164, 34,210,117,104, 2,115,230,106, 10, 9, 43,207,
+160, 91,148,217,216,222,204,103, 25,113, 44, 60, 36, 85, 81,226,192, 81,168,239,192,242,166,234, 12,237,169, 28,101,227,241, 28,
+153,183,161, 51,210, 47,122,131,218,202,244,159, 19, 21,239,209, 89,182, 32,185, 91,170,253,188,221, 68, 5, 21,173, 59,227, 24,
+ 71, 56,112,132,185,121, 13, 64, 12, 52, 28, 96, 56, 96, 2, 77,166, 41,137, 12,155,136, 70, 2, 49, 7,101,134,183, 20, 65, 66,
+137,102,115, 20,202,253,230,156,187,121, 3, 25, 30, 22,242,176, 54, 9, 37,138, 48,116,181,141,255,165, 51, 32,208,155,151, 90,
+ 40,103,181,200, 33,101,244,192,248, 20,168,108, 28,202,212, 35,103,103,212,115,141, 28,164,249,182,105,225,190, 3, 37, 11,207,
+ 20, 37, 16,105, 0, 7, 80, 96, 50,140, 19, 35, 0, 88,154, 50,104,120,126, 20, 34,243,112,128,209, 48,216,172,124,127,162,163,
+122,189, 29,242,236,217,228, 1,101,200,210,233, 45,194, 20,123,195, 40,245, 88,145,194,225,240,107, 25,133,160, 18, 68, 50,141,
+ 45,179, 44,189,102,165, 66, 61,206, 94,237,228, 26, 17,148, 10,145, 0, 62,186,137, 60, 22,137,108,180,126,122,100,142,135,164,
+236, 45,233,236,205,136,166, 83,233, 58,141,145, 23,231,227,174,197,184,188,216,204,143, 66, 19, 61, 21,205, 12, 0,173, 30,245,
+138, 21, 10,108,127, 66, 75,209,156, 8,170, 76,136, 66,149,185,221, 63,101, 32,179, 10,144, 3, 58,168,136, 12,206,161,169,123,
+161, 78, 87,216,214,219,153,169, 75,218,228,111,190, 1,167,192,102,118,167,244,180, 17,230,126, 64,249,192, 1, 81, 98,154, 78,
+ 53,177, 46, 45,196,151,237, 29,238,217, 61, 88,152, 11,193,249,217,228,148,145,158,227, 44, 49, 88,139, 59,172,150, 53,251, 81,
+104,100,217, 19,105,158,188, 86, 73, 17, 66,149, 73, 99, 99,180, 69, 89,242, 76,187,217, 24,180,230, 16,249,147,100,178,121, 57,
+ 18,181, 64, 2,161, 45, 19, 15,249,133,126, 10,129, 56,239,212, 71,115, 11,179,136,178, 16,243, 73, 99, 22, 3, 64,184,106,239,
+224,200, 53,115, 75, 11,161, 4, 38,201,188,168,236,123,119,212,141, 26,210,119,172, 95, 21, 77,215,108,224,232,205, 7,133,197,
+125, 71,253,188,174,138,168, 81, 15, 41,164, 58, 19,230,108, 63,212,227, 53,250,172, 80,148,231,141,204,209,251, 83, 39, 16, 84,
+203,208, 63,101,215,147, 25,185,153,122, 57,163,126, 40, 20, 28, 85, 93, 91,239,206,156,155, 60,183,218,205,143,194,104,200, 59,
+123,150,173, 93, 21,244, 11, 85,253,191,216,161,124,188,173,102,195, 28, 22,246, 28, 43, 76,100,143,180, 85, 94, 22,180,123,211,
+ 13,126,212, 66,166, 70, 34,123,115, 45,142,167,220,126,185,146, 82, 57,166,173,184, 46, 19, 35, 35,143,101, 91,101, 48,107,129,
+246, 2,170, 86,128, 98, 62,108, 99, 44,167,159,154, 60,242,228,230,250,102,218,189,152,189,242, 12, 22, 41,212,163,254,168, 88,
+ 86, 31,244,142, 57,201,208,191,242,206,182, 20, 87, 85,141, 14,188,117, 22, 18, 21,225, 86,112,132, 10,160,139,188,180,190,174,
+ 15, 34,102, 8,210, 5, 78,247,123,100,125,197,116, 8,105,164, 65, 42,122,148,227, 70, 30,121,240,209, 53,167,105,137,174,173,
+ 39,163,132, 38,209,185, 1, 55,161, 63,128,151,249,107,152,197,128, 62, 91, 85, 1, 70, 63, 75,163,153,147,102,242, 29, 92,117,
+236,237, 51, 21,186,204,206, 70, 31, 52,231,227, 68,182,246,193,156,130,139, 30, 45, 16, 59,180, 18,103,192, 67, 46, 38,161, 23,
+ 48,168, 30, 86,146,233,196,245,173, 51,114,204, 4,115,157,233,190, 21, 2,212, 96,128, 3,123,134,175,120,217,112,239,174,198,
+ 65, 90,201,220,181,158,185,215, 75,231,183,181,193, 49,123,252, 21,129,128,152, 79,136, 38,234,177,225,234, 84,130, 87,213,169,
+206, 32,204,220, 86, 57,223,166,248,111, 45, 44,102,162, 45, 95,102, 11,114, 69, 19,114,188,141,122,240,160, 24, 61,210, 77, 47,
+167, 31,170, 89,127,250, 14, 74,197,207,117,176,138,116,219,209,147,231, 38, 79,158, 27, 7,198,210, 66,124,229,193,209,161,253,
+131, 24, 57,143,186, 72, 14,141,189,163,138,202,100,196, 21,218,233, 32,194,254,163,111,171,229,221,108, 57, 40,229,141,204, 82,
+167,222, 1, 48, 57,254, 67, 75, 99,125,235, 49, 45,180,211,244,107,158,116,202, 17,163, 30,170, 91,226,101,169, 70,100,112,228,
+ 44,112,234, 77,140,212,247,239, 41,173,207, 0,212, 73, 9, 91, 58, 51,237, 95,105, 14, 31,154,219,179, 28,109,120,180, 4, 3,
+202,168, 89,243,190,215,219, 46, 67,222,204,209, 25,167,133,239,136,154,115, 1, 51,245,113, 63,142, 28, 21, 72,250,212, 94, 77,
+111,104,118, 56,108,139, 51,234,159, 9,130,234,197, 10,143,159, 4,117,192, 39, 79, 66, 65,180, 12,157,250,154,202, 60, 77, 78,
+253,204, 58,141,193, 40, 62,126,226, 68, 86,161,167, 47,180,231, 47,180,162, 20, 3,175, 44,197,125,187,155,149,229,184,107, 49,
+142, 6, 1,208, 45,220,132,109, 9, 0, 0, 3,255, 73, 68, 65, 84,245,252, 50,252,224,147, 21, 34,177, 0, 24, 20,146,107,127,
+168,198, 51,250,218,229,164,114,192,167, 33, 87,103,141, 22, 25,213, 65,187, 89, 13, 66,207, 23, 21,186,126, 46, 3,104,175,212,
+110,152,179, 12,210,217,127,121,153, 35, 67, 3,173,239, 12,159, 8,202,103, 42, 59,236,171, 73,164, 65,205, 0,168,232,179,107,
+237,179,171,222,179, 15, 1,163, 65,152, 27,242,174,197,184,188, 24,119, 45,196,197,249,208, 52, 37,207,245, 75, 68,130,206,122,
+208,194,255, 47, 9, 67, 46, 86,144, 26,183, 54, 67,147,172, 86, 40, 14, 44,203, 79,183, 28, 31,133, 66,152,206, 38, 92, 96,165,
+239,184,205,139,137, 29, 59,148,157, 20,196,143, 21,202,175,149,114,210,154,173, 5,238,176,138, 10, 82, 30, 51, 67,153,246, 71,
+221, 68,113,124,110, 91,155,104, 99,179, 91, 31,227,217,181,206, 5, 95, 32, 26, 83,240, 67, 10, 40,138, 74,207,243, 22,116, 35,
+ 36,253,210,142,248,150,149,132,221,105,217,245,176,214, 82,211,193,204,175, 0,152, 77,237, 52,227, 94,167,135,247,145,143,243,
+161,197,167,121,102, 86, 2,211,162, 82, 88, 67,214,192, 50,189, 78,101,158, 83,145,207, 14, 2, 20,189,195,175, 80, 60,130,255,
+159,184,125,146,214, 77,177, 40, 42,148,212,196,138, 88, 74, 64,154, 77,197,167,118, 42, 98,206,197, 46,239, 18,231, 50,144,231,
+225, 61, 96,174,245,192,241,109,173,182, 76, 67,166, 2, 46,109,118, 32, 95,208, 85, 83,242,104,172,206, 36,144,229, 92, 34, 42,
+ 67,143,240,106, 64, 30,106, 43,153,157,150,211,242,188,182,224,113,182,102,163,164,162,118,252,159,215,238,252,172, 56, 18, 63,
+ 47, 46,163, 13, 64, 99,221,189, 44,101, 99,131,151, 34, 96,133,203,130, 90,196,200,220,235,170, 83,101,123,103, 90,141,197,216,
+ 64,189, 23,162,192,216,124,236, 44,202, 12, 0,202, 80,152, 23,159,178, 31, 47, 13,103,179,150, 10,234, 80,203,119,121, 6,180,
+204,115, 73, 29,164,246, 8, 89, 50, 31,205, 99,102,249,184,171,114, 56, 88,175, 60,200, 81,203, 4,100, 69,204,110, 40,174, 88,
+165,198, 86, 19,139,146, 9,248,201,210, 25,233,110, 37,149,245, 81,139,106,239, 87, 68,212,233,173,158,179, 47, 49,203,237, 78,
+144,127,153,133,150,185,112, 63,135, 75,243, 33,114, 86,148, 45,133, 42,205, 16,177,224, 67, 59, 97, 48,187,246,172,154,176, 95,
+ 33,160,117,162,192,113,151,201,186,188, 1, 36,106,141,235, 69,120, 40,225,204,214, 41, 14, 59, 36, 31,198, 86,165, 73,229, 80,
+198, 25, 67,155,105,246,215,217,190,162,111,118,209, 94,201, 22,217,225, 35,159,168,232,218, 84,124, 32,231,116,169, 2,151,156,
+161, 91, 5, 63,227,162, 92,177,203,207, 64,124,120, 49, 55, 74, 10, 88, 42,147, 8,200,165,131,170,229,121, 74, 62,122,152, 68,
+ 47, 99,201, 21,218, 28,154,220, 61,168,192,207, 7, 7,234,142, 22,128, 83,230,184,123, 33, 30, 51, 21,242, 60, 75, 83, 60,145,
+102,136,161, 37,165, 87, 5,247, 79,149,169,168,163, 95,143,172,170, 84, 3,100,197,180,154,111,184,234, 75, 81, 46,195,159, 54,
+185,166,142, 69,125, 40,159,106,140,205,199, 93, 19, 40,150,152,227, 10,156, 65,174,157, 61,153,135,242,250,126,222,146,132,154,
+138,148,242,238,142,244, 41, 42,238,106,230,148,131,156,149, 22, 3,148, 50,252,231,177, 92, 10,134,161,222, 77,148,185, 80,175,
+118, 21, 91,162, 50, 18, 74, 53, 55, 44, 35,152,245, 92,132,252,107,129, 52,203,135,178,135,238,165, 28,189, 1,202,168,110,237,
+148,199,212,109,215, 69, 75,238,111,146,170, 39,243, 74,101,117, 72, 57,128, 68,139, 67,157, 41, 55, 17,182,102,172, 90,195,162,
+ 25, 70,143,168,168,185,102,235,171, 41,193, 37, 27,191,148, 34,184,144, 48,177,246, 14,155, 1,124,240,189, 14, 35, 23,209,102,
+ 99,114,119, 78, 53, 92,245,237,172,134, 18,173,147,176,209,100, 65,181, 50, 96,135,153,246,207, 9,204,190,172,142,170,111,145,
+148,223,179, 34, 71,200,126,253,181, 87,156,202, 73, 80,245, 95,133,219, 83, 38, 26,123, 67,200,186,197, 49, 21,162,141,221,112,
+ 1,130, 84,115,124,251,221, 67,138,146,246,168,128, 88,171,176, 92, 70,254, 59, 80, 42,104, 33,155, 69,166, 90,135,117, 25, 71,
+170, 94, 58,159,218, 81,129,123,191,132,225,211,190,238, 56, 42,217,163,103,107,189,211,125,251,166, 38, 5, 10, 97,150, 48, 3,
+173, 96,161,232, 29, 74,197,223, 59,135,121, 44,187, 15, 77, 51, 78, 42, 0,165,103, 27, 90,233, 38,121, 18,191, 71, 74,163,234,
+148,105,230,101,253,113,216,222, 89, 44,255, 7,220, 22,142,137,141,220,236,213, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/smooth.png.c b/source/blender/editors/datafiles/smooth.png.c
new file mode 100644
index 00000000000..bb54061b172
--- /dev/null
+++ b/source/blender/editors/datafiles/smooth.png.c
@@ -0,0 +1,520 @@
+/* DataToC output of file <smooth_png> */
+
+int datatoc_smooth_png_size= 16428;
+char datatoc_smooth_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13,
+ 73, 72, 68, 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0, 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,
+143, 11,252, 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0,
+ 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7, 19, 0, 34, 13, 86,254,139, 21, 0,
+ 0, 32, 0, 73, 68, 65, 84,120,218,236,188,119,124, 92,247,117, 39,250,107,183, 78, 31, 12, 48,131, 54,232,133,189, 87,129, 20,
+213,169, 94, 28, 57,142,101, 59, 94,103, 99,167, 56,137,157,178,155,141,119, 55, 78, 54,222, 36, 78, 98, 39,246,102,159, 21,199,
+ 69,242,202, 77,178,122,165, 68, 82,164, 72,138,189, 1, 4, 65,130,232, 29,152, 94,111,249,149,247,199,189, 51,128,100, 39,235,
+228,249,237,250,125,222, 94,138, 36, 0, 94,205,156, 57,247,212,239,249,158, 31,220,187,119, 47,248,159, 94, 43,111,106,106,136,
+254,196,123,112, 75, 75,203,143, 30,255,195,142, 72,205, 31,255,225,191,233, 91,223,181,181, 51,254,245,111, 63,222, 29, 68,175,
+190,115,126,249,166,230,230,184, 15, 75,119,222,127,219,235,207, 30,232,232,141, 55,198, 99, 70,126, 49, 28, 9, 62,112,235,246,
+221,107,187, 94, 63,126, 1, 0,128, 0, 4, 15,252,210,163,253,103,206,212,212, 6,101, 69,214, 61, 94, 33, 4,196,208,235,211,
+219, 58,155,254,254, 63,126, 18, 0, 64, 32, 0, 8,226,238,213, 29,217,116, 6, 65, 4, 0, 7, 0, 64, 8, 17,130,182,101,119,
+116, 55,127,229,143,126, 21, 9, 0,178, 75,227,138, 30,240,135, 66,170,166, 66, 0, 56, 99,220,102,178, 44,109,187,237,193,254,
+139, 35, 51,211, 11, 8, 8, 33, 73, 10, 23, 28, 17, 2, 17,134, 16, 2, 0,186,183,221,117,226,240,121,211, 40,173, 89,215,214,
+217, 29, 71, 0, 0,219, 50, 56,181, 33,128,130,115,203,178, 32,132,175,127,239,155,143,126,242, 83, 39, 94,123, 62,159, 47,239,
+255,208, 39, 16, 0,128,217,101,193, 40,181,140, 98, 62, 15, 1,120,245,185, 35,227,179,233, 82,102,250,153,195,253,173, 93, 93,
+223,127,252, 43,176,175,175,239, 47,127,239, 17, 74,153,101, 90,132,224, 88,199,122,219, 44, 82,179, 48,112,233, 58, 98,230,197,
+161,133,144, 66, 9, 0,176, 84, 44, 83,202, 20, 69,242,248,253,102,126,241, 71, 79, 62,191,121,231, 26, 72,141,129,254,145, 79,
+252,230,199,125,161, 6,248, 83, 61,187,159,230,130, 0,128,107,231, 14, 28,124,254, 71,107,183,172, 78,205, 47,217,148,198,154,
+162,127,253,213,239,191,112,240,212,242, 77,207,255,227,159,153,197,194,209,131,103, 63,240,225,219,137, 36, 9, 33, 16, 70,133,
+ 92,113,113, 62,245,203,255,254,203,238, 3,222,183,177,107,227, 77, 55,155,249, 4, 64, 48, 20, 9, 65,136, 56,231, 8, 65, 69,
+145, 30,188,117, 27,182,249,192,232, 52,209, 60,170, 63, 20, 90,189,161, 75, 8,193, 41,133, 8, 33, 0, 17, 66,156,113, 76,200,
+ 39, 62,241,192, 67,247,239, 35,225,112,192, 44,230,252,161, 26,106,155, 66,112,219,178, 40,165, 0,130,186,198,250, 64,164,233,
+248,145,211,132,150, 81,199,186, 77,140, 26, 8, 33,132, 9, 0, 16, 66, 40, 41,114, 77,172,205, 27,172,251,250,255,245, 84,223,
+205, 59,234,226,109,132, 51,202,108, 83,112, 6, 33,100,212,182, 45,187,117,205,110, 73,243,254,238,175,125,250,163, 31,186,235,
+232,107,175, 94,159,205, 19,106, 22, 25,165, 64, 48,179, 92, 42, 21,203,157,155,247,253,201,239,254, 97, 93,109,176, 33, 18, 50,
+ 74,165,169,241,217,182,134, 8,254,216,195, 55, 91,166, 81, 46,150,202,165,114,231,198,155,110, 92, 58,142, 0,120,228,195,143,
+ 28, 57,124,242,194,249,107,136,224,228, 98, 6,149, 75, 70,169, 80, 42, 21,203,109,107,183, 79, 95,191,240,196,183, 95, 9, 4,
+ 60, 95,253,235,199,255,244,239,190,188,107,251,170,223,249,220,239,215, 52,214,129,159,213,179, 35, 43,191,249,240,163,247,121,
+ 36,254,173, 31,188,241, 27,159,252,216,154, 58,165,119,235, 46,143, 6, 19,115, 51,221,235,183,125,233,111,190,242,223,158,124,
+241,159,179,129,189,123,247,126,245,191,126, 54,183, 56,201,185,109, 51, 24,142, 54, 77, 76,204,111,217,185, 11, 33,116,244,229,
+239, 99,140, 11,249,226,134,109, 27, 56, 99,233,100, 50,149,204, 22,114,197, 27, 99,179,127,249,205,231,222, 31, 8,154,155,227,
+ 49,197,154,159, 89,220,178,239, 46, 90, 76,188,240,212, 11,115,227, 19, 65, 63,131, 80, 4,195,126, 93,151,194,145, 32,181, 44,
+106, 91, 8, 67, 77, 83, 60, 30,173, 62, 90,115,255,190,109,183,108, 89,115,101,120, 34, 91, 44,187, 47, 20,143,183,172,110, 10,
+220,255,209, 95, 53, 10,233,197,233,201,218,104, 40, 90, 31, 97,156, 81,163, 40, 4, 69, 8, 35,140, 33,172,218, 48, 4, 64, 32,
+132, 20, 85,174,169, 13,238,191,101,235,142, 85, 29, 58, 38, 87, 39,102, 9, 0,162, 54, 22, 73,207,143, 42,186, 55,218, 28, 55,
+139, 89, 74,105,229,255, 67, 0, 8,206, 24, 23,130,115,225,188,132, 36, 73,156,139,114,217, 88,154, 79,221,114,223,253, 13,109,
+ 93,175, 30,189,252,193,219,119, 19, 0, 64,231,170, 30,140,177,109,150, 32, 68, 68,209, 49,161, 92,112,193, 57,227, 76,112, 33,
+132,224,148,113,206, 53,175, 87, 82, 52,106, 91,254,144,242,228, 95,124,253, 83,191,246,208, 43, 47,189, 42, 51,107, 67,107, 84,
+215, 21, 4, 0,144,117,191, 16,140, 81,139, 51, 42,132, 16, 8, 65,136,160, 19,125,132, 0, 0, 72,178, 20,172,141,169,154,119,
+240,124,127, 62,147,141,182,111,216,183,111,243,231,190,240,100,103,188,110,219,190,125,251, 31,190, 77,214, 20, 4, 0, 96,102,
+153,218, 38,163, 38,163, 54, 16, 28,112,198,153,237,152,169,105, 24,154,199, 31,235,216,148, 75,167,190,250,213,239,238,188,253,
+ 46,219,178,254,254,139,127,217,208,222,251,185,207,126,240,155,255,227,213,169,145,145,169,145,177, 99,103,175,226,120, 60,126,
+251,174,110, 70, 45, 70,109,198,108,106,153,166, 97,148,139,101,163,108, 40,170, 28,142,198,231,167, 39,190,253, 15, 63,216,182,
+ 99, 77, 67,173,143, 16,145, 75,167, 89,201,232, 92,213, 57, 59, 62,121,207, 61, 55,189,242,234,137,165,217,165,142,120, 12,199,
+227, 45, 55,111,105, 55, 13,203, 52, 12,163,236,252,103, 17, 9,247,238,188,167,166,169, 7, 19,249,181,103, 94,100,150,117,190,
+127,172,181,165,254,137,127,124,182,156, 43, 53,182,196, 52, 5,188,241,218,201,233,137,185,223,253, 47, 95, 88,191,117,253,229,
+147,167, 9, 0,160, 92, 50, 56, 23,156,115,206, 57,130,104,195,222,251,168,109,228,151,198, 5, 34, 23,143, 29,158, 75, 21,103,
+150, 82,127,250,249,223,249,219,191,248,218, 47, 60,122,171,238,213,254,230,239,159,109,143,199,186,187,154, 94, 60,116, 46,253,
+153,223,217,189,123,221,120,218,252,217,197,201,159,201, 21,143,199,209,207,234,181,150, 95,200,235,209,142,191,240,119,206,215,
+ 39, 95,254,111,159,125,116,255, 59, 47,252,247, 31,254,253,127,254,216, 99,143,190,252,173, 63,249,169, 50,192,189,183,223,244,
+103,255,225, 87, 11,197, 50,132,104,184,255,202,205, 15, 60, 58,118,249,157,133,133, 84, 38,153, 59,122,114,240,211,191,253, 88,
+ 48, 18, 29, 60,119,250,218,240,212,127,250,202, 83,255,212, 71,195, 1,191,247, 59, 95,255,219,177,171,151, 66, 33,223,181, 43,
+ 35,190,128,214,182,122,171,172,200, 13, 45,237,153,228,124,123, 75, 84, 81,144,162,170,138,130,252, 94,237,238,190,205,119,238,
+222,240,202,145,115,239,123,161, 64, 32,128,159,255,218,231,154,123, 55,223,184,116, 78,247,104,170,166,190,246,252, 17, 90,154,
+ 47,102,147,156,149, 52, 85,241, 7,189,170,166, 50,219, 20,140, 99,140,136, 68, 8,193,119,238,222,208, 22,171, 61, 53, 48,188,
+242,133, 16, 86,253, 35, 23,143, 98, 9, 27,134, 49, 63, 53,171,107,138,101,209,134,214, 22,127, 56,166,251,188,146, 44, 1, 1,
+ 56,231, 2, 8,136,161,162,200,186, 71, 11,133,253, 27,214,180,255,197,111, 63,246,158,192,214,183,182, 77,213,228,141,125,183,
+ 45, 78,141,229,115, 69,159, 95,151, 21, 9, 66,134, 0, 5, 0, 64,136, 97,245,121, 8, 80,173, 70,100, 69,150, 85,105,123, 79,
+251,193,211,253,238, 71,251,253,223,254, 88,164,190, 49, 80, 27,183, 10,243,132, 96, 77, 87, 61, 30, 77, 82, 36,140, 16,198, 8,
+162,106, 80, 3, 66, 8, 46, 56, 23, 66,112,129, 9,246,250,116, 85,147, 59,194,161,227, 3,195,129, 64, 0,175,107,170,213, 84,
+ 88,223,210,205,169,129, 33,147,100, 34, 43,146, 44,203,152, 96,132, 16, 0, 64,112, 33, 0,119,196, 1, 0, 48,198, 13,195,180,
+ 45,138, 16,170,173,171, 89,191,101,109,123,180, 62,111, 81,210,222, 21, 39, 18, 54, 10, 25, 34,171,138,238, 69,132,112,198, 32,
+132, 0, 66, 8, 33, 99, 76, 0,193,185, 0, 92, 0, 0, 16, 66, 4, 99, 85,149,147, 75, 25,106,211, 64,164,177,100,129,203, 87,
+ 71,246,221,180,153,148, 75,229,186,250, 26,219, 44, 10, 46,176, 36, 3, 33, 24,102, 66, 8, 8, 4, 99, 12, 8,193,185,224,140,
+ 11,225,190,144,172, 72, 77,221, 27, 86,235,254,196,236,232,212,248, 28, 22,165,117,171,218,115,169, 36, 90,189,105, 77,160,166,
+ 94,112,202, 57, 5, 0, 34, 68, 16, 66, 8, 33, 8,145,163, 90, 8, 4, 23, 2, 2, 16,170,107, 84, 61,222,153,201,249, 98, 38,
+ 57,120,250,240, 23,254,235,227,161, 0, 58,248,214, 89, 59,159,157,155, 77, 32,205, 91,131,136,204, 25,229,130,185,137, 2, 98,
+136, 32, 0,192, 81, 52,132,144, 96, 84,211,208, 26,138,117,252,240,137, 23, 77,211, 82,189,222, 96,125,215,174,117,173, 77, 93,
+ 27, 62,244,209,251,238,255,197,123, 52,143,142, 0,128, 64,112,193, 25,224,206, 51, 1, 16, 8, 8,160,168, 92, 0, 8, 85,247,
+ 80,219,188,240,246,203, 15,124,224,150,185,233, 68, 38,145,120,233,135, 79, 79,205, 36,177,236,121,243,192,137,241,225,225,197,
+133, 4,226,220,230,140,114,206, 56,163, 66,112, 1, 4,128, 80, 8,193, 25,181,109,155, 82, 74,109,166,106, 62, 85, 15,248,194,
+161,246,205,183,231,144,250,249, 47,124,205, 35,227,223,254,163,223,155,155,158,249,248,111,125,166,125,253, 77, 45, 45, 49,194,
+169,205, 57, 21,156,113, 46, 32, 16, 64,112,247, 69, 44,155, 82, 42,201, 82, 32,214,232,171,105,254,242,231, 62,111, 99,244,137,
+ 96, 48,234,129,159,124,108,255,236,204,226, 91,207, 63, 93, 91,223,232,245,200, 47, 60,249, 84,190, 96,193,203,135,159, 96,140,
+ 1,224,124, 14, 46, 56, 99,148,154,166,105, 91, 54, 0,160,161,173,183, 84, 54,206, 28,126, 91,146, 8, 23, 32, 90, 95,219,208,
+210, 56, 53, 54,229, 15,250,226,221,155,190,249, 55,127,119,250,250,212, 39, 31,187,243,187,175,156,193,255,246,195,251, 25,179,
+157,143,198,108,219,182, 44,211,180,108,203, 6, 0,134,106,107, 37, 69,255,209,147, 79,111,216,210, 51, 51, 53,191,251,230,157,
+133, 92, 46,151,206, 60,241,189, 3, 1, 93, 97,102,186,189,187, 89,148,140,203,131, 83,254,160,135,216,166,201,220,208, 47, 56,
+231,140, 50,198, 24,231, 60, 22,111,173,107,223, 60,116,250,141, 29, 55,173, 93,181,227,238,169,137,121, 1, 0, 66,248,196,233,
+171,146, 68,168,105, 94, 27, 24,153,152,207,213, 5, 20,171, 84,164,140,195, 99, 63,250,107,202, 56,175,228,101,206,133, 16,162,
+169,163,219, 23,105, 45,166,103, 32,145,207,190,125,104,232,202, 88, 58,153,251,232,167, 62, 56,112,238, 82,106, 41,179,126, 75,
+239,248,200,180,164,144, 61,251,239, 53, 45,154, 73, 46,124,231,169,151,144,101, 83,106, 83,106,217,148, 82, 74, 25, 99,172,169,
+189,179,148, 75,140, 93, 62,114,253,210,185,114,118,241,251,175,190,171,200,228,142,123,118, 94, 56,125,126,106, 98,254, 67,191,
+249,155, 92,136,108,174,104, 26, 54,132, 34, 24,169, 83,117,127,215,170,118,252,145,135,246, 49,198, 25,227,156, 9,198,120,109,
+180,166,161,103,151,224,180,161,107,155, 16,246,215,191,253,138, 71,176, 98,217,160,101,107,110,102,105,213,218,182, 51, 71,143,
+157, 56, 51,180,118,117, 75, 42,149,123,254,217, 55,144,153,188,113,245,218,235,199, 47,131,159,171,188,214,220,220,140,192,207,
+211, 5, 33,252,151, 9,244, 43, 31,125,248, 43,127,248,137, 7,111,218, 12, 0,184,109, 95,223,183,254,234,247, 21,130,239,223,
+191,239,103, 41,211,222,189,123,143, 30, 61, 10, 0,208, 84, 21, 64, 80, 46, 27, 24,227,115,111,125,155, 72, 50,145, 61,103,143,
+ 30,106,110,107, 30,188, 52,180,102, 99, 47, 34, 26, 51,115,227, 35,211, 75,243,233,155,247,247, 93, 62,115, 57,149,204,198, 87,
+175,221,186,107, 39,130, 80,112, 94,200, 46, 14, 93,188,240,187,127,246,245,233,133,228,191,186, 18,113, 5, 66, 8, 29,123,245,
+137,185,177,107,241,158,141,153,197,241,158, 45,251,152, 85,190,124,252,128,164,106,186,174, 54,180,175,149, 60,161,114,102,126,
+113,226, 42,130,200, 27,174, 57,243,206,105, 89, 34,165,146, 49, 63,155,232, 93,223,189, 97,199, 14,102,155, 66,112,179,148,203,
+101,210,185, 76, 62,159, 45,153,166, 5, 0,152,154, 79,124,249,137,151,138,101,227,167, 21,168,175,175,239,223,125,124,127, 48,
+164, 73,178, 58, 63,187, 16, 8,250,230,103, 22,155, 90,155, 5, 51, 15,188,114,124,113, 49,211,220, 84, 27,170,241,215,212,133,
+182,222,124,231,141,203,167,230,102, 23, 59,186, 91,140,178, 97, 26, 22, 66, 72, 81,100, 73,145, 36, 66,136, 44, 67, 8, 57, 99,
+148,218,182, 69, 45,203,178, 76,203, 50,109,211,180, 44,211, 54, 12,219, 44, 27, 79,188,120,228,194,208,232, 63, 47, 16,142,199,
+ 91,238,232, 91,219,212,181,193, 27,137, 23,115, 25,171, 92,106,237,234, 48,203,249,134,246, 53, 13, 77,225,133,233,249,196, 82,
+150, 81,214,216, 28, 85, 20,160,233, 74, 91,239, 58, 89, 81,101,153, 40, 10, 81, 20, 25, 17,132, 32, 20, 64, 8,198, 25,165,140,
+115, 32,132, 0, 2, 2,128, 49,198, 4, 75,146, 36, 43,146,162, 72,138, 34,109, 90,221,126,199,206,245,123, 55,173, 58,122,126,
+144,115,241,227, 2, 5, 2, 1, 28,143,199,239,218,179,246,157, 55, 14,101,150,166,125, 62,141, 83,179,190, 99,221,204,232,240,
+244,216,200,141,161, 81,206,185,166, 41,170,166, 48,198,108,203, 36, 4, 67,192,132,224, 0, 8, 88,185,156, 76,186,220, 53, 1,
+ 1, 5,132, 8, 57,249, 30, 97,132, 49,150, 8,150, 36, 73, 81, 36, 85,149, 21, 85,185,109,251,186, 61,155, 86, 49,155,141,207,
+ 45,189, 79, 32, 2, 32,156, 24,158,184,237,129,251, 2,209, 86,206, 40,179,141,197,241,126, 69,149, 40,165,145,186, 80, 48,228,
+227,156, 67, 4, 9,145, 8,193, 70,217, 20, 34, 67, 36, 66, 8,129, 8, 1, 8, 48, 70,156, 59, 30,235,164, 81, 1, 1, 20, 72,
+ 0, 46,156, 10, 10, 8, 8, 48, 2, 16, 72, 8, 17, 9, 43,170,226,241, 9, 70,253,229,146,241,193,128,231,150,173,107,174, 92,
+159,248,225,219,167, 87,244,196, 66,180,173, 89, 47, 16,185,126,225, 88,247,166, 62, 65, 97, 32,210, 32,201,146,199,155, 55, 13,
+211,182, 40, 99, 46, 90,132, 49, 70, 24, 97,132,156, 60, 14,133,112, 10, 4, 8,133,211,134,137, 74, 55,230, 42,203,173,136,160,
+ 83,153, 49,198,132,112,164,196,178, 78, 20, 77,246,248,180, 72, 93, 40,218, 16,233,140, 55, 44,228,114,223,122,241,109, 33, 4,
+ 1, 0, 46, 78,221, 96, 86,174,190,165,211, 54,203,132, 40, 68,214, 85, 79, 8, 97, 34,203, 37, 74,109,198,184,112,158,119,245,
+ 13,160,219, 11, 58,239, 85, 45, 49,160, 83,120, 0,225,254, 27, 0, 8, 33, 33, 4, 20, 80, 8, 97,155,180, 84, 46, 51,202, 9,
+193,235,118,236, 48, 75,249,114, 33,171, 40,202,182,219,183, 14, 95, 62, 55, 51, 58,210, 22,139,204, 26,144, 0, 8, 50,201,108,
+ 33, 87, 42,229,115,245,241, 22,205, 23,225,156, 67,136, 48,145,133, 2, 16,182, 57,103,156,115, 87, 5, 28, 2, 4,128, 0, 16,
+ 2,167, 71, 22,192, 49, 98,183, 42, 20, 66,188, 39,240, 34, 72, 32,148, 36,224,241,122, 52, 95, 72, 86,189,140,218,133, 50, 31,
+186,112,254,198,141,233, 83,151, 71, 67,186, 60, 50,247,181,143, 61,184, 39, 87,176,182,239,217, 50, 56,107, 18, 32, 64, 83,107,
+189,170,169,186,215, 79, 36,141, 81, 27,112,198, 24, 5, 0, 33,132, 1, 1,144, 35,196, 57, 23, 2, 2, 33,176, 83, 28,115, 71,
+ 68,224,138, 34,132, 83, 94,114,238,116,226, 16, 34,136, 32, 66, 0, 99, 34,132, 96,140, 42,154,174,104,222,197,201, 27, 55,134,
+198, 0,128, 35, 35,211,254,250,216, 31,127,238,147,239, 28,120, 59, 85,178,175, 14, 77, 50,219,238, 89,219, 57,114,229, 50, 1,
+ 64, 52,181,175, 18, 66, 0, 8, 1, 4,130, 81, 33,184, 83, 97,137,202,199, 20, 8, 64,206, 33,128, 16, 0, 46, 56, 0,208, 81,
+ 18, 16, 16, 66,199,158,157, 86, 0, 98,130,116,111, 32,210,188, 74,210,124,227, 3, 71,143,190,113,194,227, 81, 39,199,230,183,
+221,180,110,122,252,157,233,153,165, 15,253,242,125, 47, 63,123,232,194,120,226,254,120, 61, 66,240,225, 95,249,181,141, 55, 13,
+ 36,103,198,166,103, 18, 47, 61,115, 32,105,114, 28,143,199, 31,186,103, 47,128, 0,186, 85, 52, 7,156,113,193, 1,119,170,105,
+ 33, 0, 0, 80, 32, 8,133,107, 33,162,218,140,136,229,114, 25, 34, 4, 9,193,146, 44,235,190, 26,132,241,244,213, 83, 35, 67,
+ 99, 62,191,103, 33, 81, 88,179,161,125,247,254, 71, 54,244,237,211,176, 97,216, 48, 24, 14, 54,134,244, 88, 44,152, 75,167,147,
+115, 19, 10,225, 2,240,174,238,214,222, 53,109, 37, 6, 8, 0, 64, 56, 53,172, 99, 3, 78, 97, 12,132, 16, 28, 0, 14,128, 0,
+ 64, 64, 0, 1,224,149,119, 23,156,115, 23,237,112,190, 17, 2, 0,136, 49,242, 4, 34,225,134,238, 66,102,225,226,137,183, 85,
+ 89,234,236,109,215,189,222, 72,116,230, 59, 79,190, 54, 63,189,120,117,120,186,185, 62,114,125,116,118,235,166,174,123, 63,252,
+209,212,210,226,179, 79,126,247,248,192,216,183,190,241, 87,154,175,102,126,108,160,255,228,224,216,200, 12,142,199,227,247,221,
+190,205,233, 48,128,211, 55,113, 46, 56,135,194,145, 9, 56,237,139,163, 44,206, 57, 99,148, 51,202, 40,171, 84,151, 2, 64,128,
+ 16, 84, 52,175, 47, 92, 95, 72, 77, 31,125,237, 77,127, 40,248,198,193, 75, 91, 54,119,106,190,154, 96, 77,221,158,189,155, 79,
+157,187,190,117, 83,123,115, 60,234,213,149,245, 27,123,230, 39,110, 20, 50, 75,175, 31,185,248,225, 7,111, 62,249,246,241,151,
+127,244,226,109, 15, 62,210,217,211, 62, 48, 48, 72, 0, 0,156,154,140, 59,149,185,168,186, 12,115, 11,126,183,224,230,140, 9,
+193, 42,114, 80,167, 68, 37, 18, 14,132,163,161,134, 30,203, 44, 91,165,172, 96,236,212,145, 19, 75,139,169, 53,155, 86,253,250,
+111, 60, 58,112,238,210,248,216, 25, 89,149, 41,128, 15, 63,114,103,160, 38,122,224,249,103,135,174, 79,245,174,238, 88,187,251,
+ 14,106, 91,219,206, 93,107,105,139, 37, 22, 19, 35,179,137, 63,254,247,255, 9, 80,186,227,174, 59, 96, 95, 95,223, 87, 63,255,
+113, 87, 14,176, 28,220, 28, 49,156, 28,229,150,255,140,113,198, 25,227,130,115, 8, 33,145,176,162,170,186, 63,148, 89,154, 47,
+ 21,205,167,254,199,107,221, 29,141,197,162,209,222,209, 88, 42, 26,150,205, 54,110,233, 45,149,202,161,154, 64,203,234,157, 63,
+250,198,215, 95,127,231,242,239,125,230, 99,197,244, 98, 32,228,159, 28,159, 63,112,224, 84, 71, 71,195,187,151, 70,246,109,237,
+225, 66,152, 20, 79, 76,206,102, 44,134,227,241,248,157,187,123, 24,165,220,125, 22,148, 51,155, 81,198,168, 77, 45,219,182,109,
+106, 83,203,178,109,219,102, 54,163,148, 65, 0, 52,143, 22,142, 53,213, 52,246,248, 35, 77, 8,203,212, 50, 82,137,132,109,218,
+119, 63,178,223,239, 87, 74,133,210,250, 45,189,107,183,108, 40, 23,178, 61,155,111,114,156,223,171,195,144,223, 71, 75, 57, 73,
+194,163, 35,211,187,110,237,179,139,249,158,158,150,225,209,217,206,150,232,249,254, 49, 90, 42, 69, 67,190,162,205, 8, 0,208,
+178,108,193, 5,175, 68, 20, 39,200,113, 33,128, 99,219, 78, 55,206, 5, 0, 0, 99, 20,174,173, 13, 53,116, 41,122,160,148, 77,
+ 72,222, 80, 98,122,232, 59,143, 63,253,145, 79, 62,186,245,182,135,174, 13, 13,157, 63,117,101,195,150, 94,217, 91, 75, 41, 55,
+ 76,246,214,243, 47, 60,247,230, 73, 89,215,125, 88,196, 35,193, 77, 15,239, 75, 39, 51,151,250, 71, 21, 73,122,225,208,185,187,
+118,175,189,251,142, 93,178,132,183,109, 2,253, 3, 35, 30,159, 10,210, 69, 2, 0,160,182,107, 19,194,137,198, 92,188,239,130,
+ 16, 40,170,210,216,185,206,162, 64,247,120,231, 70, 47,214, 54,247, 36,103, 70, 98,170, 55,214,177,165,163,231,196, 23,191,248,
+205,173,107,219, 37,137,212, 55,213,125,231,233, 67, 31,188,207, 96,140, 31, 63,209,223,211,217,212, 89, 27,188,239,225,125, 77,
+ 29,171, 32, 2, 99,131,151,146,137,108,200,167, 29,127,119,224, 15, 62,253,193,181,187,239, 80, 61, 1, 39,134,216,166, 49,114,
+229,130,125,232, 8,236,235,219,243,249, 95,191,155, 11, 46,120,213,114, 28,109, 1, 46, 4,132, 64,150,165, 88,115,139, 47,210,
+ 82, 72,207, 44, 78,143,235, 30,141, 72, 42,131,210,245,129,161, 99,231, 71,253, 10,158, 24,157,240,123,212,246,182,134,211,253,
+ 35, 15,237,223, 57, 49, 58, 99, 90,244,236,181,137,219,183,175, 41, 22,203,251, 31,220, 23,168,107,186,114,238,220,115,207, 29,
+106,111,142,110,217,190,218, 48,236, 77,125, 55,223,232, 63,155,207, 22,166,166, 22,175,140,206, 19, 89,181,153,197, 40, 3,146,
+ 10,247,236,217,179,111,107,151,227, 78,160,146,177,221, 12, 5, 0,198,200, 23, 12,122, 66, 13, 16, 66,219, 50,169,101,228,178,
+ 57, 77,197,138,230, 27, 30,184,220, 63, 60,227,213,100,131, 50,175, 71,207,101,243, 97,175,222,218, 90, 63, 59,187,228, 81,101,
+127,192,219,177,110,227,204,232, 80, 56, 82,115,229,226,144,224, 92,146, 73, 40, 28,168,169,171, 41, 21, 10,167,206, 14,105,132,
+ 40, 10, 17, 0,250,189,234,240,244, 18,198, 72, 35, 24, 74,242,207, 25,222,232,244,102, 63, 63,194,236,221,187, 23,193,101,132,
+235,231,226,250,249,234, 92,255,197, 2,121, 60,250,207,151, 64,135,127,244,119,159,186,239, 22,137, 96, 0,192,151,191,248,249,
+223,255,216,131, 0,128, 80,192,247,255,174, 64,154,166, 1, 0,250,223,125,225,204,129,111,168,178,212, 88, 95, 7, 0,136,213,
+213, 12,188,251, 98, 98,110,198,239,211,191,250,185, 79, 13, 95,120,235,214,155,182,118,182, 55, 14,158,122,241, 63,126,250, 35,
+ 87,206, 29,186,120,248,137,255,254,231,127,240,255, 92, 32, 28, 8, 4,178,217, 44, 0,224, 23, 30,218, 63, 56,116, 3, 0,240,
+149,255,242,155,127,251, 55,127, 86,206,204,149, 75,165, 13,173,245,191,250,145,187,239,219,183,237,131,143,220,155,156,155, 48,
+203, 38, 0, 98,205,198,158,185,177,225,139, 39, 79,143, 12, 79,237,185,251,254,174,158, 46, 9, 3, 73,245, 43, 32,191,170, 49,
+250,214,201,203,255,106,105, 90, 90, 90, 96, 60, 30,159,156,156, 4, 0,188,251,242,227, 62,191,127, 41,107, 73,162,212,127,246,
+ 98,160, 38,226,209,241, 80,255,200,222, 59,118, 34,162, 6,163,241,133,177,129,196,124, 18, 19,148,207,151, 1, 16,139,243,201,
+197,185,148,201,249,109,119,110,239,222,120, 19, 66, 48,187, 56,190, 56, 59, 59, 55,189,152,202,228, 22, 82,185,239,190,124,116,
+230, 95,136, 58,236,221,187,215,213,208,246,205,107,111,217,177,118, 46, 97, 53,198,124,144,104, 91,246,222, 1,121,174,152, 47,
+ 6,195,254,150,158,245,129,186, 22,136, 20, 65, 11,150, 81,142,119,245, 36, 22, 23, 24,101, 16, 64,140, 81, 46, 83,188,229,190,
+123,172,114,142, 90, 37,206, 24, 4, 12, 19,172, 72, 82,192,163,237,217,188,250,129, 91,183,205, 39, 50,179,139,169,159, 94, 67,
+216,231,243,157, 60,244,204,125,119,236,206,103, 82, 62, 77, 24, 54,128,118,142, 35,249,228,225,163,173, 61,189, 62,191,247,212,
+145,119,218,215,108,212,116, 47,150,148, 96, 36,230,175,107, 43,103,103,243,185,130,215,239,241,248,244,112, 77, 32,155, 90,208,
+117,130, 16, 6, 66,112,193, 16, 4,152, 96, 66, 92,128,121, 99,111,219,254,155, 54,157,185, 50, 82, 42,155, 63,149, 64,127,244,
+ 7,191, 21,213,141,196,220,180, 39,220, 60, 55, 49,234,245,233, 75,115, 11, 94,175,148, 73, 36, 95,127,238,224,240,149, 17, 69,
+149,102, 70, 6,101,108, 2, 8, 78, 30,124, 43,159,156, 82, 20, 9, 19,130, 48,242,249, 60,145,186, 80, 32,232,195, 8, 11,193,
+ 24,179,157, 90, 27, 65, 8, 17, 68, 24, 99,140,156,225,194,158,205,189, 91,122,218,143,158, 31,252,159, 11,180,123, 83, 23, 97,
+ 86,231,198,157,245,241,246,171,231,207, 34,192,203, 38,143, 53, 52,212, 53, 53, 38, 23,230,231,230, 83,204,162, 62,191, 71,150,
+161, 85,202, 17,130, 67, 53, 65, 76, 8, 33, 88,150, 36,247, 45, 49, 2, 0, 10,206, 56, 99, 78,251,228, 0,222,200, 5, 34, 32,
+ 66, 8, 66,168,169,242,173,219,214,222,152,156, 79,231,139,255,140, 64, 68, 8,212,218,213, 86,211,208,150, 92,152,102, 28,214,
+ 54,212,151,242,121,136,177,166,250,195,145,160, 54,177,232, 64,198,254,144,223,227,245,214,212, 55, 74,178,110, 25,121,171, 92,
+180,169, 37,152, 16, 64, 8, 46, 4,116,170, 23,183, 70,128, 8, 33,196, 17, 70, 4, 16,119, 34,224, 32, 15, 16,254,198,135,246,
+159,188,112,237,153, 67, 39,255,201, 1,188, 77,109,155,225,233,235, 23, 47,159, 61,143, 17, 19, 92,248, 34, 77,185,196, 92, 54,
+123, 61,147,204, 42,138, 4, 0, 48,203, 86, 38,153, 81, 85, 85,214, 36, 0, 4, 66, 18,145,100, 33, 56, 3, 76,184,149,184,128,
+ 78,187, 8, 4,128, 0, 10,128, 16,194, 88, 0, 1,129, 4,100, 87, 32, 8, 17,128, 16,238,218,220,211,209, 84,247,151,255,196,
+ 56, 31, 63,242,240, 3,118, 98,122,240,210,149,125,247,238, 47,101, 19,225,218,154,124, 54,159,207,102,230,102, 22, 45,147, 34,
+132, 20, 85, 82, 84, 5, 33, 4, 33, 64,144, 11,193, 57,167,156, 51, 0, 4, 0,110,106, 70, 46,120, 42, 0,132, 80,192,202, 52,
+ 10, 64,232, 66, 20, 8, 66,132, 16, 70, 8, 97, 4, 33,146, 36,124,211,154,174,183,127,204,164, 90, 90, 90,240,170,150,152, 87,
+ 65, 62,191,222,218,213, 27,105,104, 14, 68,154,199,175,245, 83, 74,169, 69, 17, 66,178, 44,105,186,162,235,170,172,202, 68,194,
+ 8, 65, 32,152,112,176, 7, 33,160, 43, 17,172,130,186,142,182,150,139,188, 10,136, 85,133,182, 48, 70, 68,194, 24, 33, 0,192,
+ 77,107,187,223, 39, 83, 75, 75, 11,222,181,101,237,214, 77,221,219,110,187,223, 27,174,103,204,178,140,188,145, 75, 56,239, 68,
+ 8,150,100, 73, 81,101, 69, 83,100, 69,150,100,130, 49,118, 84, 5, 0, 68,192, 17, 5, 58,237,155,131,188,172,224, 31, 84,135,
+118, 14,110, 34, 32, 0, 16, 35, 66, 48, 33,146, 36, 19,140,137,101,217, 59,122,219,143, 94, 28, 90, 41, 16, 10,134, 3, 0, 73,
+ 71, 95,126,154, 81, 83, 86,188,186,191, 46, 92, 27,241,120, 53,175, 95,247,250,116,175, 79,247,120,117, 77, 87, 21, 85,114, 66,
+139,112,223, 86, 8,224,168,200,181, 97, 81,177,221,202, 76,183,162, 51, 88, 45,141,129, 3, 60,202, 10,209, 61, 90, 32,232,173,
+137, 4, 36, 73,250,119, 31,190,207, 81,152,107, 67,247,222,187,127, 85, 79, 71, 77, 93, 93,185,152, 13, 70, 26,203,185, 69,206,
+ 41, 4, 12, 0,136, 48,196, 24, 19,137, 16,137, 72, 18, 33, 14,138,137, 49, 66,176,106,166, 14, 56,227,232, 65, 64,232, 24, 22,
+ 88,161, 31, 23, 1, 96, 92, 84, 26, 9,132, 16,198, 24, 0,168,104,178,166,107, 92,128,237,221,173,151, 70,167, 76,203,142,199,
+227,184,189, 46,172,176, 98,102,105, 49,222,222, 37,169, 30, 34,107,130, 83,206,108, 32, 56,114, 33, 75, 71,207, 21, 97,170,129,
+ 5, 33, 87, 23,194,197, 66, 42,189,119, 5, 27,113,140,137, 11,206, 5, 99,220,182, 40,167, 14,227,128, 19,130, 17,130,177,198,
+198, 66, 33,223,209,213,108,148,141, 95,124,240,246,176,172, 38,202,148,196, 26,235, 34,117, 53,117,245,117,170, 63, 12, 33,180,
+205, 18, 0, 0, 19, 69, 82,108, 0, 0, 66,180,130,215,129, 74, 64, 65, 78, 78,112,148,193, 93, 28, 24, 84,128, 71,192, 43,222,
+ 6, 5, 4, 14, 78, 3,185, 16,194,182,109,211,180,128, 0,209,134,218,214,222,245,111,191,252, 74, 36, 26, 93,183,237, 38,197,
+ 27,153,155,203, 82,179, 8, 85, 13, 0, 3,223,186,103,103, 80, 67,229, 82, 17,178,146,164,120, 4,183, 5, 99, 66, 80, 23, 24,
+114, 81, 95, 8, 33,114, 45,186, 2, 2, 67,136, 28,152,107,197, 28,147, 87, 92,189,242,183,243, 16, 33,132, 8,202, 50, 49,202,
+102, 49, 95, 14, 4,125, 67,151, 7,238,254,208,199,223, 61,116,184,165,107,245,119,191,254,248, 51,175,157, 76,206, 44,238,237,
+ 91,119,254,218, 12,201,166, 82, 5, 31, 10,134,124,140, 90,204, 46, 35, 76,132,224, 0, 34, 8, 49,194, 68, 0, 32, 56, 19, 28,
+ 85, 13, 19, 64, 0, 33,128, 16, 57,166,227, 88,141,168,244,221, 0, 56, 63, 3, 64, 0,136,128, 0, 16, 67,199, 85, 67,154, 47,
+220,210, 67,202,101, 35,181,152,108,105, 83, 62,243,235,159,241,169,202,119,159, 63, 82, 31,246,127,244,193,190,124,174,184,117,
+239, 45,255,248,210, 25, 2, 0,240,250, 61,254,160, 95,213,189,130, 51,238, 64, 85, 2, 0, 4, 17,194, 2, 8, 1,160,128,188,
+210, 83, 87, 32, 52,238, 26,139, 27,110,170, 48,142, 0, 64,112, 23,238, 19,110, 67, 67, 48, 81,189, 33,111, 48, 70,100, 85, 55,
+ 10,186,174, 13,158, 63,127,223,254,190,112,109,195,212,196, 68, 52, 36,223,152, 92, 50,242,197,129,119,143, 2, 0,137,199,167,
+ 71,234, 66, 30,175,135, 72,170, 3,103, 2,206,129, 16, 64, 32,224, 68,123, 7,118,173,128, 53, 14, 22, 81, 81,151,211,112, 59,
+152,132,147,213,132, 83, 23, 67,247,217, 34,219,166,140, 51, 8, 97,102,113,244,250,229, 43,233, 84, 30, 0,240,189,151,142,125,
+241, 11,191,149,152,159,187, 62, 48,212, 95, 54, 0,128, 55,223,182,181, 88, 50, 1, 4,200, 23, 8,132,106,107, 85,111,136, 40,
+154,235, 21,130, 87,240,188, 10, 56, 13, 16, 68,200,125, 90, 85,170,131, 27,134,144,123,155,224,142,209,200,178,236,143, 68, 3,
+145, 6, 69,247,201,154,183, 92, 50,178,169,156,172,120,222, 61,124,114, 98,124,110,195,214,213,178, 76, 32,132,102,185, 72,100,
+ 89,214,181,222, 85, 45, 22, 0,169,197,212,139,175,159,128, 0, 16, 76, 20, 89, 11, 66,232,194,158, 21,105,220, 64,134, 32,228,
+ 0, 2, 4,132, 16, 16, 65, 39, 63, 57, 62,199,221, 76,193,171, 9, 11, 64, 32, 75, 36, 88,215, 26,136,181, 27,133,212,225,231,
+126, 80, 42,217, 83, 19,243,173,237, 13,249,108, 97,224,242,240,195, 31,188,109,113,118,241,213,183, 47, 17,140, 37, 73,138,182,
+244,254,214,182,219,250, 79, 30,172,171,175,185,113,109, 58,234,211, 83,121, 78, 28, 55,114,124,216, 65,154, 65, 21,216,123, 63,
+163, 70,192, 74,129, 33, 32,130,128, 11, 33, 32, 66,144,115, 4,161, 64, 8, 66, 32, 41,154,230,175,129, 0, 10, 70, 35,177,232,
+137,163, 23, 99, 13,145, 77, 59, 55,132,163,205,219,111,191, 55, 95, 40,157, 58,120,160,161,169,225,131,247,183, 32,140, 21,205,
+151, 89, 24, 87,101, 76,195,209,123,127, 97,245,248,200,204,224, 83,111, 34,224,184,140, 75, 67,224,174, 44, 21, 47,230,239, 69,
+230, 65,165,239,134, 96,133, 73, 1, 1, 0, 64, 24, 33, 66, 32,132,140,154,201,169,254,193,211,239,204, 77,205,109,217,177, 38,
+151, 45,248,195, 49,127, 93, 59,150,148,167,255,225, 31,239,120,232,225,169,137,233,114,217,156,157,156,185,116,236,192,226,244,
+216,149,171,147,117, 33,197, 44, 22,106,130, 10, 16,128,184, 65, 95, 8, 46,152, 16, 28, 86,236, 19,186, 74,169, 68,192, 74,188,
+113,126,204, 43,183, 57, 34, 67, 8, 49, 33,178,234, 65, 88, 42,231, 83,233,165,185,124,190,216,208, 20,173,141,213, 66,193,102,
+ 38,167, 2,145,230, 63,254,195, 63,254,192,253,125,255,246, 87, 62,179,177,167, 53,157,204,237,184,227, 30, 69,213,127,248,228,
+ 83,107, 87, 53,166,211, 57,102,154, 47,190,112, 12, 66, 64, 28,210,134,168,162,230, 46,134, 47, 68,101,120,192, 43, 5,142,168,
+128,161, 14,165,207, 37, 11,112,225, 84,103, 8, 97, 95,184, 65,245,213, 94, 63,247, 86, 38,149,141,214, 71, 66, 53, 97,136,165,
+139,231,174, 25, 86,255,169,183, 79, 68, 67,190,163,135,206, 60,114,199,182, 96, 77,120,237,206, 91,143,188,248,236, 11,111,157,
+189,243,150,237, 27,110,186,155, 90,197,231,158,250, 62, 87, 85,144, 47, 34, 55, 5,114, 86,241,103, 7, 93,228,208, 25, 48, 0,
+225,200, 35,150, 17, 72, 46, 56,103,140,113,230,140,101,220, 63, 5,103, 8, 19,193,108, 0,196,224,229, 27,221,155,247,197,186,
+118, 70,226,235,239,253,232,199, 44,202, 15,157, 31,174, 13,251,226,241,186,124, 54,191,251,142,253, 70,102,250,214,135, 30,217,
+182,186,125,223, 29,123, 16,145, 57,192,225,186,134, 88,208, 39, 0,192,119,222,186,187,171, 53, 6, 42, 50, 57, 53, 50, 0, 66,
+ 64, 55,220, 65, 55, 71, 1, 23, 1,101,148, 81, 86,193, 66,133, 51, 71,147, 21, 89,247,215, 42,186,239,218,249,163,233,100,118,
+102, 46, 19,208,108, 97,231, 56,179,100,100,173, 90,221,126,229, 92,255,253, 15,237,227, 14,194,108,100,205,114,254,141,151, 15,
+ 50, 32,102,198, 38, 78, 30,122, 11, 33,188,251,246,219,162, 97,252,214,187, 87,136,243, 46, 14,106, 14, 4, 7,130,187,227, 11,
+225,152, 78,197,118, 57,115,112,124,198, 28,205, 56, 60, 74,164,106,154,226,241,171,158,176, 30,168, 45,229,147,215,174,140, 78,
+ 76, 46,245, 79,204,124,224,195, 15,120, 2, 53,179, 99, 87, 82,137,236,183,191,255,230,167,126,249,158,147,103,110, 32, 40,152,
+ 69, 49,193, 63,248,193,155,109, 93,237,241,168,190,102,235,118,179,152, 26,188,112,229,185,167, 95, 8,215,132, 33, 0, 4, 8,
+206, 57, 5,110,152,229,208, 73, 28, 78, 43,225,136, 86,249, 39,198, 24,163,148,187,116, 21,142, 16,146,100, 57, 84,223,169, 5,
+234, 50, 11, 99,197,236, 66, 49,155,154, 24,157,219,255,208,190,135,117, 45,151,152,125,243,133, 3,144,200,138,130, 30,184,239,
+206,214,222,245,181,141, 45,223,121,242, 5, 11,144, 71,122,214,254,231,191,190,117,102,244,234,245,203, 23,103, 71,175,252,224,
+153, 35,169,146,177,177,187,169,174, 37, 46,198,150,136,243, 24, 42, 90, 17,149,105, 37,119,134, 28,142,153,187, 86, 67, 41, 99,
+156, 49,151,158, 10, 32,144, 21,149, 72, 50,198,228,217, 39,190, 23, 14,251,203,101,179, 88, 54, 10,249,226,211, 79, 31,186,239,
+222,157, 88,194,123,110,221,162,121,253,151, 79,159,207, 38,231, 31,255,218, 15,238,185,187, 79, 34,192, 40,228, 20, 79,248,240,
+ 75,111, 44, 38,178,233,124,105,169, 80,254,252, 31, 60,246,246,219,231,236,204, 18,132,144,112,206, 4,179,133,155, 49,151, 7,
+ 11,238,172,165, 50,252, 97,180, 98,200,156, 11, 32, 16, 66, 88,194, 16,161,228,236,181, 66,246,108, 34,149,167, 54,227, 66,180,
+181,213,207, 76,204,244,118,212, 95, 56,125,229,150,253,187,231,167,231, 58, 87,135, 54,238,238,251,243, 63,249,146, 26, 8,122,
+ 61, 18, 4, 96,236,218,245,115, 79, 60,147, 46,150,139, 5,131,113,254,240,173,155,159,249,222, 27, 80, 81, 22, 23, 82, 0,200,
+ 68,112,206,168, 13, 86, 86,157, 85,188,154, 59, 77, 15,119, 70, 28,206, 23, 2, 0, 73, 34,154,174,107,190, 32,145,117,106, 21,
+175, 30,191, 20, 8, 7,253, 94,181,171,167,153, 49, 81,204, 23, 91, 59,155, 34, 13,173, 51, 99,215, 5,231, 99,215,134, 10,249,
+ 2,241,133,214,117, 68,253, 53,209,244,226,172,105,148,239,121,228, 22,163, 84,182, 76,251,200,193, 51, 99,227,243, 37,129, 64,
+ 38,183,111,239,134,167, 14, 15, 58, 2, 49, 8, 1, 0,156,115,119,134,236,146,142, 29,235,117,120, 74,204, 85,151, 36, 75,190,
+128,223, 27,110, 84, 60, 97, 70, 77, 76,148,182,206,134, 84, 34,221,222,217, 52, 59,157, 80, 20,210,220, 18, 85, 85,173,148, 75,
+215, 53,117, 68, 98,166,162,249,128,224,195,195,115,209,186, 64,118,105,238,141, 87,222,253,133, 15,223,169,121,131,199, 14,158,
+ 81, 52,217, 22,216,163,162,235,211, 11,141,126,223,197,243,215, 33, 0,174, 13, 45, 3,231, 98,121,232,225,142, 81,133,112, 52,
+ 37, 4, 64, 8,234,186,230, 13, 53,122, 66, 13, 0,145,249,107, 87, 50,137,165, 72,172, 97,231, 94,169,103,251,254,204,252,232,
+223,252,217, 87, 62,177,170, 77,210,188, 64,136,114, 33, 53, 55, 53, 63,116,125,178,148, 47,158,191, 49, 31, 10,104,140,178,185,
+100,246,185,239,191,213,213,221,196, 40,157,154,201,231,139, 86,215,186,214,201,133,100, 32,160,103,115, 37, 0, 0,169,204,194,
+170,179,178, 21, 23, 95, 30, 42, 82, 18,154, 0, 0, 31,157, 73, 68, 65, 84, 25, 58, 79, 82,209,212, 64, 93,139, 30,140, 2, 0,
+202,153,249,154,250,246, 75,167, 47, 92, 58, 59,248, 75,159,254,204,244,196,248,229, 19, 71, 55,172,109, 27,184,120,253,222,143,
+236,153,184,114,124, 97,102,225,165, 67, 23, 11,229,178, 42, 41, 65, 96,215, 55, 70, 34,117, 53,173,205,209,134,218,192,165,161,
+201,197, 68,230,147, 31,191,183,108, 48, 8, 25, 21, 64,211,149, 66,209, 0,128, 19,193, 5, 99,110, 39,202,185,171,164, 74,126,
+128, 66, 56,178, 2,132,145,207,239,107,234,221, 33, 0, 68,146,106, 27, 69,213, 27, 22,128,111,218,185,245,149,167, 95, 61,248,
+204,119, 46,156,191,174,122,189,150, 81, 42,229, 74,119,126, 32,243,210,179, 7,155,155,234, 90, 67, 26,245,202,107, 54,118, 9,
+ 46,106,234,194,179,211, 11,217, 76,174,187,163, 65,130,232, 19, 31,217,191,241,230, 7, 40,181,178, 75, 51,159,223,121,203,129,
+231,158,247,120,180, 43,151,166,201,114, 66,250,177, 33, 80,133, 38, 10, 48, 70,225, 72, 36,214,185,213,178,172,204,220, 53, 34,
+169,158, 64,141, 37,136,162,121,106, 26,187,174,140,206,150, 10,229, 85,171, 90, 60, 30,237,133,183,206,116,196,194,215,206,159,
+152, 94,204, 52,214, 71,114,217, 98,115, 75,172,107,245,170, 80,180,101,122,228,146,170, 42, 5,142,230,102,150, 90,155, 34,141,
+173,109, 88, 86,137,162,169,158,128,224,252,238, 71,127,241,210,241, 3,226,226,180,171,161,101,126,194,143,141,167, 8,193,129,
+144,191,166,177,107,110,248,140, 36,203,229,124, 54,151,201, 7,195,193, 66,190, 88,219,208, 52,116,169,191,104,211, 76,201, 88,
+154, 79,249,123,226,183,110, 95,189,102, 99,207,252,236,162,101, 51, 33,128,174,171,183,220,115,107,180, 99, 99, 41,151, 24, 25,
+ 26,187,113,125, 74,193,184, 41, 30,237, 94,219,237, 11,214,228, 19,147, 68,210, 36, 69, 53, 74,133,254,115,103, 46, 93,157, 6,
+ 64, 16,183,173, 92, 65,153, 88,105, 64, 8, 35, 95,192, 23,105,234,129, 16,219, 86,217, 50,202,146, 34,123, 3,190,154,166,238,
+167,190,252, 13, 85,186,156, 74, 46,121, 8,217,189,115,205, 75, 7,206, 0, 8,101,153, 28,122,237,132,128, 16, 67, 80, 40, 20,
+215,110,234, 82,116,111, 98,226,234,227, 95,253,150, 95, 83,252, 65, 47, 99,124,215,237,183, 47, 76,141,142, 12, 13,204,140,207,
+ 12, 13, 79, 47,149, 40, 2, 0, 99,156,203,229, 32,132,248,230, 93,155,154, 99, 33,224, 62,159,106, 14,117,204, 88, 40,178,220,
+208,190,218, 87,219,130, 37, 69,245,248,161, 96,177,246,205, 64,240, 80,172,131,152,179, 19,147,139,138,230,179,140,210,220, 76,
+ 50,105,152,119,236,219,212,218,221,122,240,248,101, 93,198, 91, 54,116,182,180, 53,168,186,146, 77, 44,253,245,151,158, 44, 88,
+118, 32, 20,156,156, 89,188,117,223,230,115,239,158,125,253,205,211,103,206, 12,142, 45, 21, 27,253,106,223,142,222,104,200, 3,
+ 0, 28,159, 93,178, 4, 33,227,179, 41,177, 44,201,123,166,101, 16, 64, 85, 83,250,167,138,170,111, 72, 8, 97, 91,102, 49,155,
+ 4,224, 66, 62,157,168,111, 25,124,249,133,195, 22, 99,170,174, 16,132, 77,211, 18, 12, 29,120,119,200,239,213,211, 38, 15, 10,
+156, 22, 74,185,168,100, 39,102, 49,198,146,170,251, 3, 30,131,131,214,222,206,193,233,212,149,107,179,182, 37, 56,150,144, 97,
+ 46, 24,250,153,103, 79, 88, 0, 98,206, 8, 66, 0, 8,184,119,239,222,116, 58,157,201,100,126,222,198, 66,255,123, 47, 33, 68,
+ 48, 24, 12,133, 66, 4, 0,144,205,102,167,166,166,254,143, 82,126,156,228, 25, 10,133,208,255, 81,196,255,199,230,155,255, 63,
+ 82, 80, 93,109,205,187,111,254,224, 31,254,244, 55,110,223,178, 86,150,222,179,175,135, 49,110,140,213,198,106, 67, 63,255, 10,
+ 34,255,154, 73,127,223,142,230,250,240, 11,175, 30, 41, 20, 75,255,212, 61,186,166,254,213,231,127,195, 76, 77,154,166,213,213,
+ 24,237,136, 69,230, 82,217, 55,206, 95,121,249,233,111,136,226, 92, 75,207,166,129, 51,167, 38, 71, 70,198, 22,179,183,221,251,
+ 96,173,102,124,233,239,158,120,230,205, 19, 16,194,251,238,190,189,161,214,255,210,235,111,207,254,107,233,207, 63,227, 72,180,
+119,239,222,241,241,113,103,224,250,207, 92,191,245,201, 15,239,185,105,199,233,243,131,143, 60,120,151, 79, 87, 11,217, 36, 18,
+ 6,103,226,237, 99,231, 10, 20,109,238,109,122,233,229,131,223,127,229,216,186,117,171,255,246,139,159, 67,102,174,152, 75,201,
+ 18, 76, 37, 50,201,165,204,236,212, 34, 0,226,206, 71,238,169,107,234,152,189,113,121,122,124, 34,159, 47, 3, 1,102,103,151,
+ 26,227,177, 29,183,220,134, 36,175,170,233, 4, 9,219, 44, 89, 70,145,217, 86,185,152,158, 25,159,156,154,152,251,210, 19, 47,
+141,205, 44,252,239,218,120,107,109,109,253, 9, 10,234,108,109,252,222,227,127,106, 83, 42,233,145,161,193,254,191,248,202,147,
+ 95,248,147,255, 16,192,121,137, 32, 69,247, 10, 78,109,179, 28,140,182, 77,143, 92, 29, 27,158, 72, 44,164,186, 87,181,214,214,
+215, 44,206, 37, 33,130,109,221, 93,249, 92, 46,151,206,248,131,126,192,237, 84, 50,107, 25,182,109,209, 92,174,216, 24,143,122,
+125,122, 38,153, 77, 37,179,165,146, 97, 25,214,194, 66, 42,109,129,123,238,218, 29, 12,233, 30,127,168,190,165, 75, 86,188, 0,
+ 66,219, 44,149,114, 75,133,204,124, 54,149,202,101, 10,139,243,169,119, 47, 93, 31, 24,158,204,228, 11,249, 98, 57,145,206,253,
+175, 84,208, 79,112,177,143,124,224, 14,211,164,217,116,186,115, 85,116,251,206,155,158,218,176,193,235, 15, 83,219, 22, 0, 50,
+ 46, 84, 85,153,185,113,233,252,137,119, 36, 9,107,186, 26,174, 13, 66,130, 67,117,141,181,205,221,178,234,245, 4, 99, 66,240,
+217,209,126, 97,166, 11, 57, 91,146, 36, 85, 85,253, 65, 31,165,108,122,124,182, 92, 44, 51,206, 33,130, 18, 33, 66, 22, 1,191,
+215, 74,100, 15,188,254,206, 93,119,108, 11, 71,106, 50, 11,227, 8, 19, 73,214, 1, 0,148, 89, 68, 82,125, 1,191, 68, 36, 85,
+ 87,106,163,161,219,251, 54,152,101,211,178, 41, 0, 80, 34, 24, 66, 56,181,144,252,254, 43,239, 12, 79,204,254, 47,138, 65, 91,
+ 55,111,248,244,167, 30, 91,219,213,100,155,198,226,204,180,223,175, 28, 61,240, 86, 32,210,180,105,215,246,201,161,115,177,120,
+167,224, 84,146,100, 78,129,199,235, 13,135,125,190, 96, 48, 26,239,205,167, 19, 51,227,195, 38, 69,145,166,230, 92, 54, 91, 42,
+100, 60,222, 64,172,185,171,144,154, 1, 96, 86,213, 52,127, 77,212, 19,106, 48,242,169, 98,161, 56, 59,181,168,106,178,207,239,
+161, 58, 99,148,123,124,122, 32,236, 53,202,214,228,196, 28,150, 73, 93, 52,162,122, 60, 66, 48, 8,145,195, 45,197, 88, 86, 52,
+ 14, 17,148,101, 89,211, 85,219,166,150,233, 16, 24, 25,103, 60, 30,139,252,254,191,121, 80, 8, 65, 41, 91, 72,102,142,157,187,
+122,248,204,192,207, 62, 6,237,217,179, 7, 8,254,233, 95,190,191,214, 7, 13, 10,117, 77,241,248, 67,134, 37,184,145,206,101,
+ 11,209,198, 6,155, 75, 11,147,215, 61,186,236,241,135,194,209,166,217,177,161,171,253,195,227,195, 51, 22,101,161,144,183, 54,
+ 26, 38,132,112,193,169,101, 71,154, 90, 59, 86,245, 4,130, 65, 89,243,113,206,178,137,217,124,174,168,233,158, 96, 77,216, 46,
+231,146,115,227,185,108,193, 52, 76, 46,132,179, 14,232,226,239, 0, 32,140, 36, 66, 20, 77, 81, 84,149,200, 50,198, 82,133,170,
+ 77, 25,163,204, 89,157,178, 25,165,140, 81,106, 87,127, 70,157,229, 8, 70, 41,231,140,219,148, 9,198, 77,203, 58,124,122,224,
+232,185,193,108,161,244,179,137, 65,125,125,125, 15,221,123,235,246, 85,245,170,238, 67,208,146, 21, 15,181, 12,201, 23, 61,246,
+250,107,126, 15,150, 36,226,245,123,210,169,130, 36,145,218, 88, 56, 16, 10, 90,166,145, 92, 74,141, 12, 77,140,141,206,228, 11,
+101, 8,160,215,163, 6, 2, 94,175, 95,247,250,117,127,208, 27,169, 13,251,131, 1,179,108,164, 18,233, 82,169, 44,203,146,238,
+213, 36, 89,198, 24,137,202,112,211, 25,216, 56,147,105,103,185,162,186,132,177, 98, 93,212, 65, 60, 65,101,231, 77,112,230,252,
+ 18,204,193, 55, 43, 95, 56, 8, 26,165,140, 49, 78, 41,181,109, 74, 41, 99, 22, 59, 61,112,227,185, 67,167,172,234, 98,251,191,
+ 74, 65, 56, 30,111, 9,171, 60,172,195,114, 62,109,150, 75,129,186,120,164,185, 7, 2, 62, 49, 50, 82, 40,150, 21, 25, 75, 50,
+209,116, 5, 0,228,241,168,254, 72,131, 39, 24,139,181,116, 55, 52,215, 75,200, 46, 23,203,166, 97, 83,202, 41,165,156, 9, 89,
+150, 84, 77,149, 21, 9, 65,128, 32, 32, 50, 9,134, 2,117, 13,245,254,112, 68,211, 53, 34, 75,206,176,150, 56, 35,100,140, 49,
+118,121,129, 16,192, 42,212, 2,248, 50, 0,196, 29,216, 94, 44,207, 11, 43,179, 85,103,220, 11, 17,114, 23, 58, 16, 70, 24, 19,
+130, 17,198,152, 16, 76, 48,198, 4, 53, 68,195,183,109, 91,187,107, 67, 15, 65,104,116,102,241, 95,170,160, 64, 32, 16, 12, 6,
+ 9, 0, 66,241,248, 26, 90,219,151, 22,147,193,134, 78, 89,247,141, 14,156,206,101,243, 62, 77, 72, 80,246,132,106,219,122,123,
+252, 53, 13,115, 99, 87,139,153,249,114, 62,169,232,118, 54, 49, 49, 61, 58,185, 56,151, 96,140,203, 50,225,156, 35,140, 17, 65,
+ 0, 66, 69, 85,188, 62,175,238,243, 99, 66,124, 88, 34,178, 6, 33, 22,130,113, 78,145,109, 49, 98, 49,219,230,140, 50, 78, 43,
+163, 29,151, 86, 80,161,111, 3, 14,185, 75, 25, 89,193,127,173,176, 17, 42, 52, 22,192, 57, 68,238,192, 76, 8,136, 57,230,136,
+ 49,206, 25, 34, 18,102,148, 51,137, 81, 74, 36,155, 82,153, 73, 10,217,191,119,243,157, 59, 55,140, 76,205, 63,127,228,204, 66,
+ 42,251, 47, 14,210,170, 66, 4,132,118, 57,251,206,107, 47,123,189,218,182,190,237,185,164,153, 47,218, 18, 18,220,204, 21, 51,
+243,186, 47, 72, 25, 40,151, 76,193,147,182, 61,159, 76,100, 50,233,188,101, 81, 69,145, 92, 17, 33, 68, 16, 90,134,149, 88, 76,
+ 89,166,237, 11,228,188, 62, 93,213, 53, 89,213, 49, 81, 28,222,133,227, 47, 8, 33, 33, 16, 6, 68, 64,103, 29,196,109,157,225,
+138,161, 87,117,171, 8, 32,232, 78, 50, 43,187, 9,208, 57, 58, 6, 65, 36, 0,132, 72, 64, 1,185, 64, 16,114,132, 16,228, 28,
+ 11,206, 57,198,156,115, 76, 24,103, 18,161,140, 73, 22,145,101,102, 89,118, 79, 71,227,103,155,163,166, 97,125,247,245, 99,215,
+ 38,231,126, 90,158, 96, 60,222,210, 28, 13,104,220, 72, 37, 50, 16,112,193,121,177,144,109, 95,189,182,103,253,166, 64, 64,243,
+120, 84,111,160, 86, 64, 60, 63, 49,204,168,109,154,118, 46, 91, 52, 74, 38,231, 2, 99, 36,201,146,170,200,170,166,104,186,170,
+233,138,162,202,178, 44, 33,140, 28, 76,153,113,198,109,155, 83,147,217, 22,163,150,224,182,131,114, 3,103, 33,164,202, 5, 1,
+206,160,125,153,234,180, 76, 26,169,146, 34,224,251,251,236,149,108, 18,119, 67, 9, 57, 28, 41,136,156, 37, 42, 12, 9,193,132,
+ 32, 66, 8, 33,152, 72, 68, 34,142, 19,162,245,157,241,189, 27,123,107,252,190,193,241,153,159,194,197, 32,200,166,178,105,159,
+ 4, 49,138,212, 6, 66,145,154,166,142,222, 96,172, 93,112, 30,172,151,100,213, 35, 24,159, 25, 62, 71,205, 18,150, 8, 51, 41,
+193, 88,213,101, 73, 38,156,113,103,105,216,137, 15, 8, 33, 76,156, 16, 64, 48, 70, 66, 0, 70,185, 13,169, 16, 2, 99,230,240,
+150, 16,130,206, 64,169, 66,157,113, 60,200,177,194,229, 15, 94,229, 4,184,200,125, 5, 58, 91, 65,250, 89,113,171,203, 16, 66,
+128, 11, 0, 4,198, 64, 8, 33,144, 64, 2, 10, 1,132, 32, 66,114,143, 12,161,148, 83,219,214, 44,219, 40,155,229,146,185,113,
+ 85,219,218,142,166,254,225,169,231,223, 57,203, 42,182,252,147, 92, 76, 0,205,163, 54,183, 55,214, 52,117, 25,165,178,166, 98,
+ 79, 40,134, 37,217, 54, 74,212, 42, 67,136,152,101,248,130, 53,156, 25,150,105, 74,196,182,101, 66,169,236, 14, 59,170, 0,123,
+133, 20, 2, 43, 81,211,137,192, 96, 25, 79,230, 8, 1,206,221,109, 52, 80, 33, 91, 57, 62, 35, 92, 75,168, 80,232,224, 50, 67,
+107,153, 19, 85,209,148, 27,209,157, 31, 34, 8,185, 27,168, 28, 67,171, 42,247,125,248, 95, 69, 12,133, 81,106,233,106, 89, 55,
+139,249, 82, 54, 91, 92,213,214,208, 19,191,127,120,106,246, 71, 71,207,254,196, 45, 73, 28,143,199, 55,109,232, 13,250,188,201,
+233,177,228,194,108,122,105, 17, 67,203,227, 15, 99, 76,100, 89,171, 76, 14,109, 8, 5, 66,128, 56,107,152,132, 96,130, 36, 9,
+ 19,137, 72, 50,145, 36, 34,201,146, 44, 73, 82,133,232, 36, 17,140, 37,151,240,230,166,240,138, 31, 84, 63, 54,114,191, 4, 2,
+190, 39, 71, 57,204,132,101, 23,116,121, 63, 21,206,152, 88, 86,220,123,140, 11,128, 42,112,189, 98, 3,176, 26,216,161,243,228,
+176,147, 63, 9, 34, 18,145,101, 73, 86, 36, 34, 17,211, 48, 85, 76,246,110,232,137,199, 34, 3,163,211, 63,158,197, 64,217,176,
+187,214,110, 65,152,207, 12, 15, 46, 76, 79,143, 94,189, 70,109,218,178,106, 43,145, 53, 12,161, 96,148, 40,186, 34, 24, 70,196,
+ 38,101, 98,155,212,166,140, 73,206, 96,179, 50,182, 18,203,143,217,181, 18, 4,145,195,236,172,236, 48, 86, 89, 35,160,106, 48,
+239,245,155, 31,247, 44,238,108, 51, 58,123,169, 64,188, 79,119,142, 65, 85, 13,207, 37,192, 84,102,209,238,186,158,179,133, 8,
+ 17,130, 16, 35, 4, 32,132,144, 16,162,168,138, 28, 9, 9, 46, 16, 38, 68, 82,230,167,103,109,202,214,216,180,111,231,122,226,
+209,230, 18,153,129,129,225, 35, 23,110, 0, 0,112,188,165, 37,164,136,236,212,141,209,193, 65, 8,121,123,111,215,234,173,123,
+107, 26,218, 5,103, 8, 98,231,163,137,202,230, 29, 88,222,170,117,169,104,216, 41,109,156,135,227, 80,228,136,243, 27, 57,229,
+137,115,146,133,195,194, 90,177,234,249,158,133,207,229,218,176, 66, 11,117,171, 34, 8,160,179,170,234, 18,235, 96,245,174,101,
+146,142, 88,233, 65,206, 25, 10,156,218,148,218,212, 61, 98,194,162,150, 69, 1, 0, 62,159,215, 23, 12, 34, 4, 41,165,129, 80,
+ 40, 80, 19,131, 24, 22,115, 5, 89, 85, 33,132,103, 47,220, 88,154, 93,168,111,109, 89,191,190, 39, 26,246,251,100,121,253,134,
+ 85, 55, 38, 22, 9, 16,162,185,163,115,215,182, 46, 74, 45,193,153, 81,202,205,142, 92,244,134,106, 53, 95, 4,170,144,115,202,
+169,201, 25, 5, 64, 32, 68, 48,150, 43, 53, 48,226,140, 49,196,222, 99,207, 43,246, 71,151, 67, 0, 66,208,177, 11, 33,170,133,
+178, 75,166,113,249,141, 16,112, 46, 32, 4, 85, 6, 45, 0,220, 73,234,206,193, 32, 80, 56,244,159, 10,139,205,173, 1, 92,157,
+ 33, 8, 4,196, 43,108,208,169, 12,108,155,218, 22,133, 8, 50,198, 53, 93,109,106,111, 39,178,186, 48, 57, 86, 27,171,203,166,
+ 11,153, 84,170, 88,200,215, 53,180, 54,237,218,134, 37, 57,151,152, 61,123,238,202,181,241,212,194,169,193,241,161,235, 23,175,
+ 77, 82, 33, 2,129, 0,132,128, 0, 8,231, 38,198,250, 65,158,115, 65, 36,162,234,138,199,171, 51,106, 49,219, 20,254, 8, 34,
+178,203, 75,113,114, 51,132, 8, 97, 65,132, 96,142, 19, 97,103, 64,253,158, 21,189, 21,249,185, 82,222, 33, 0, 0, 70,206, 71,
+ 20, 16,186, 36, 98,215,167, 92,150,146, 67, 10,224,192,173,170,129,179,167, 42, 56, 88,201,106, 91,102, 45, 85,184,126, 78, 85,
+ 33, 4,196, 2, 11,137, 56,252, 76,136, 16,231,162,144,203, 39,151,178,195, 87,111,152,101, 35,181,148,226, 76,108,218,189, 35,
+ 88, 27, 31,190, 49,123,234,208, 41, 14,229,181,221, 83,243,137,151, 47, 14,222, 88, 74, 21, 91, 98,225,250,250, 90,179, 96,154,
+ 38,191,189,111,221,246,190,173,199, 47,207, 78,188,124,152, 0, 0, 24,227, 8, 99, 73, 70,138, 34,235, 94, 77,247,234,170,238,
+ 33,146,194, 57, 3,212,170, 50,208,220,221, 90, 8, 33,196, 0, 9, 0, 32,130, 92,112, 6, 33,170,206,244,151,205, 99, 69, 79,
+ 85, 77, 70,206, 0,219,157, 29, 87,180,195,223,203, 11, 88,166,216, 85, 41,135,239,173,128,156, 20,230,110,129, 59, 92, 78, 1,
+ 1,134, 24, 99, 73, 86, 37,205,167,232,126, 73,241, 18, 89, 65, 8, 3, 1,247, 61,140, 32, 4,156,217, 83,195, 3,231,142,157,
+250,198,215,190,155, 43,149, 17,130, 33,175,246,210,155, 19, 5,195,238,142,199,238,191,117, 27, 68,112,116, 60,193,136,229,175,
+173, 93,187,101,189,226,139, 80, 58,225,166,121, 89,145,125,126,143, 44, 75,138, 42,171,154, 34,171,170, 36,169, 85,234, 0, 16,
+ 78,127,233,228, 82,225,242,171, 32,130, 8,184, 76, 75,167,171, 4, 2, 32, 0, 57, 23, 8, 9, 33,208,123,204, 72, 0, 71, 19,
+112,133, 30,151,123,210, 74,150,174, 18, 76, 92, 10,137,224, 14,227, 12,172, 72,115,208, 89,155, 23,213, 83,204, 28, 90, 34,224,
+206,107, 51, 40, 56,183, 76,139,154,165,180, 97,149,139,197, 66,190,152, 47, 24,101,211, 52,172, 76, 58,215, 63, 48,220,179,161,
+247,209, 95,250,160, 36,107, 70, 49,147, 94,156, 29, 25,186, 54, 61,151, 25,188, 50, 54,151, 44,180, 54,213, 48, 74,189,154,116,
+173,255, 42, 4, 67,227,163, 11, 0, 66, 2,128, 8,132,252, 13,205, 49, 0, 32,198, 24, 75, 18, 34, 10, 38, 50,194,196,101, 32,
+187,203,225,188, 66,155, 20, 0, 32, 8,152, 0, 14, 17,207, 97,186, 67, 55,157, 32, 12, 93,190,251, 74, 59,130, 80, 8, 14,151,
+ 79,109, 88,193, 29,118, 92, 76, 84, 99,145,251,110,160,186, 24, 95, 77, 67, 8, 97, 4, 17, 70,208,225,105, 19, 39, 71, 50, 70,
+ 45,163, 76, 41,197,146,230, 11, 55, 41,158, 32,163,214,220,216,224,249,119, 47,100, 51,249, 96,200, 31,174, 9,104,186,106, 25,
+214,187,103,134,110,204, 36, 58,215,173,154, 26, 58,139, 8, 25,187, 49,181, 52,159,156,156,203,166, 50,185,157, 27, 59, 90,219,
+234, 71,198, 22,219, 91,163, 93,221,141,138,170, 14, 15, 77,200, 30, 63, 16, 75, 4, 0,160,168, 30,111,176,206,165, 30, 66,135,
+ 87, 10,161, 19, 27, 43,188, 15,224, 54, 83, 43,216, 59, 16, 0,238,230,145, 21, 84, 88, 71, 95,192, 9, 37, 21, 62,152,168, 82,
+242, 93, 75,170,112, 48, 87,148, 62,130,243,101,250, 31, 20, 2, 56, 27, 61, 8, 98, 66, 84,221,171,249,106,100, 45, 0, 17,178,
+202,249, 66,122, 33,157, 88, 42, 21, 75,178, 44,115,206,199,134, 39,151, 22,210,245, 13,145,104,195, 12, 33,100,110,102,241,204,
+217,107,217,146,249,209, 95,186,163,125, 85, 47,181,204,201,209,177,147, 87, 70,211, 20,202,138, 76, 0,247, 6,195,146,162,237,
+104,238, 42,151,202, 23,207, 95,153, 27, 27,193, 4, 45, 45,100, 4,181,134,174, 78,140, 12, 79, 47,166,243, 68, 34, 80,211, 33,
+ 4, 4, 0,128, 48, 33,178,234,146, 15,161, 27,252, 4,172, 36, 17, 46, 42,140,211,138, 51,188,143,228,233,208, 95,161, 0, 43,
+138, 97, 0,185,203,151, 94,225, 80, 78,197,135, 28, 70,124,165, 65, 21,208,173,251, 16,114,206, 86, 88,222,188, 64, 24, 19, 73,
+210, 60, 33, 61, 88,167,251, 34, 88, 82,132, 16, 16, 17,129, 20,131,233,103,142,191, 12, 1,199, 4, 21,114, 37,143, 79,175,137,
+134,163,141,245, 78, 21,116,247,189, 17,206, 97, 48, 82,147, 73, 38, 78, 31, 59,119,242,236,144, 33,233,160, 84,220,189,182,181,
+181, 49, 92,206,103,189,193,186, 64, 36, 30,196,164,182,177,147, 51, 10, 0,180,202,185,209,161,203, 4, 90,249, 92, 49,145, 40,
+141, 93, 31, 31,158, 77,185,221,188, 0, 46,137,126,121,103,188, 74, 61,118, 1,153, 21,167, 48, 56, 22,241,190,232, 9,151, 99,
+196,114,253,230,240,132,223,207,154,117, 91, 13, 88,161,173,175,248, 91, 56, 37,129,163,114,228, 36, 36, 34, 19, 89, 33, 68,230,
+212,178, 74,217, 82,110, 49,155,152, 95,154, 95,154, 24,157,201,102,178,121,131,249, 52, 57, 18,241,181,117, 53,119,175, 91,167,
+249, 35,170, 30,108,219,168, 49,219,162, 86,113,232,226,185,147, 71,223,189,249,182,155,238,251,240, 99,239,188,117,144,217,118,
+ 56, 32,203,138,196,133, 72,205, 77,204, 79, 12,155,101,131, 82,139, 81,190,184,144,130,170,190,251,230, 61, 8, 17, 33,120, 15,
+224,123,238,184,245,165, 55,142,191,240,198, 59,164,242,161,160, 88,177,252, 1,132,224,192,165,146,187,170, 1,130,243,101,143,
+ 19,203,169, 87,192, 21,150, 36, 86,168, 9,252, 24,167,120, 25,246, 17, 66,172, 0,201, 42,218,118,214, 64, 0, 0,208,105,110,
+157,246,156, 81,211, 44,102,203,116, 49,151,154, 79, 37,211,153, 84,206, 40,153,225, 72,112,243,174,141,245,173,189,229, 98,110,
+224,220, 57,203,178,100,205,231, 9,198,108,163,100,102, 19, 23,207,156, 30,190, 60,176,247,246,190, 15,125,252,177, 35, 7, 15,
+255,249,151,190, 29,141, 53,116,212,168,118,125,141,207,239, 97, 76,132,235,162,129, 72,131, 55, 24, 86, 53,239,240,224,149,249,
+197,124, 44,168, 78, 95,235,183, 44,219, 1,115, 39, 39,231,207, 94,153,130, 16,146,202,158, 10,171,242,109,151, 17, 61,231,223,
+184,128, 64, 8, 32,160, 67,197,173, 44,141,172,168, 15,129,128,220,221,242, 1,110,227,202, 57,175,106,105, 69, 25,185,146,255,
+ 12,222, 87,100, 58, 5, 19,132, 78,245,175,203,154, 95, 82, 60, 92,112,179,148,205,103,230,153,109,151,138, 69,106,217,178, 76,
+188, 62,221,235,213, 5,179, 38,175, 93, 72,167,114,115, 83,115,227, 35,179,147,163, 51, 91,118,111, 70, 68,155,158, 90,122,243,
+205, 35,235,123,154,158,249,238, 11,215,167,151, 8, 70,171, 91, 98,155, 54,118,204, 47,149,202, 37,179,163,183,179,190,165, 45,
+ 57, 63,243,206,129,131, 71, 78, 13,104, 94,207,103, 63,243,171,119,127,240, 49,128, 48, 0,162,144, 89, 58,243,246,193,183,223,
+ 62,103, 81, 90, 2,114,197,197, 92, 70,144,203, 10,130,162, 18, 45, 93,255,168, 44,219, 3, 1, 43, 11,255,213,228,235, 80,115,
+ 87,172, 31,185,229, 1, 4,192,101,241, 86,188,178, 74, 86,175,114,181, 4,120, 79,233, 4,128,147, 21, 0, 18, 2, 97, 73,214,
+252,154, 55, 68,100,205,178,138,195,231,142,156,123,247,146,172, 72,107, 55,246,180, 53,183,170,158,160,164,120,176,172, 64, 68,
+102, 71, 7,223,120,243,204,200,212, 2, 69,112,233,165, 35, 83,139,233,156, 65,247,223,188, 57,232,149, 85, 85,246,168,114, 83,
+ 75,204, 40,155, 61,155,119,220,217,189, 22, 33,124,241,216,155,135, 94, 62, 48, 56, 56, 60,181,148,107,169,175,185,243,206, 93,
+129, 80,141,131,196,216,102,105,232,252,201,179,103,174, 74, 8, 88, 0, 54, 70,124,153,169, 20,236,235,235,123,120,255, 77,119,
+223,182,173,162, 35, 0,156,170,103,153,185, 84,125,236, 0, 0,215,203,170, 21,176,155,155,150, 17,136,234,141,110,198,118,168,
+198, 85,146,234,202,215, 91,134, 19, 43,125, 9, 66, 16, 97, 44,201,170, 30,136,168,158, 16,103,150, 81,204,204, 79, 78, 96,140,
+162, 45, 61, 39, 14, 29,181,205,210,237, 15,220, 71,169,133, 32, 34,178,142,137, 44, 32,148, 36, 69,112,251,252,201,227,207, 60,
+119, 96, 98,102,169, 61, 22,238,219,182, 10, 97, 84, 42, 25,153,116, 30, 2,184,115,207, 70, 69, 83,138,249,162, 81, 54, 26,219,
+218, 67,209,214,254, 11, 23,203,101,171,187,183,221,227,243, 25, 37,195, 52,202,140,163,142, 53, 27, 48,198, 16, 2,179,156,191,
+118,225,212,203, 7,142,157, 25,154, 33,149,144,204, 42, 6, 84, 57,223,195,161,223, 47,135, 26, 0, 86, 84,182,213, 19, 72,220,
+164,199,171, 78, 7,224,242,238, 71,245,128,146, 42,173,142, 87, 48,151,106,247, 15,157, 22, 23, 34, 68, 48, 33,138, 46,235,126,
+ 89,245, 17, 89, 21,156,165,230, 71, 7,206, 93, 30,190, 54, 21, 8,249,205, 99, 3,103,251,175,121,189,158,237,123,247, 4,107,
+106, 1, 4,130,179, 98,118,193, 44,166, 1, 0,136,200, 11, 51, 51,109,109,109,191,243,217,223,244,120,117,203, 52, 11,217, 12,
+ 70, 48,157, 88,154, 26, 25, 81, 52,197, 1, 93,146,137,220, 27, 7,127, 56, 52,190,208, 84, 27,136,215,133,206,189,115, 76, 85,
+101,191,223, 99,153,182, 81, 54, 58,187,143,199, 26, 34,217,188, 73,100, 93,208, 98, 50,153,131, 21, 23,227,206,126,205,242, 25,
+ 17, 43, 41,193, 0, 84, 15,235,169,162,165, 43,208, 13,119,230,224, 84,189,238,110, 91,149,255,238,208,135,171,223,138,149,251,
+ 76, 16, 19,172,168,154,234, 9,200, 90,128,200,170,115, 6, 15, 81, 84,140, 37, 33,120, 62,187, 48, 55, 53,149, 88,204, 48,139,
+218,150, 97, 26,180, 39, 94,183,125,251, 26,110,165,146, 51,233, 84, 34,157, 74,102, 77,139,150,138,102, 34,153,185, 52, 52, 22,
+168,141,222,178,181,109,234,234,217,116, 58, 63, 62, 54,215,209,217,116,236,228,149,128,174,230, 45, 17, 10,122, 35,177, 26,211,
+162,186,207,251,216, 47,255, 98, 93, 67,188,152, 79,165, 23,166, 91, 87,109, 6,130,230, 83, 75,131, 23, 47,158,124,231,226,225,
+ 35,151,230,178, 5, 10,128, 46, 17,141,224,174, 13,171, 71, 23,243,149,114,153, 83, 7,215, 89, 94, 98, 4,149,211, 67, 43,219,
+108,213,216,186,188,220, 34,192,138,188, 86,161,167,186,170, 97, 21,170,245,123,227,143,179, 80, 1, 17, 66, 80, 81, 84, 79,160,
+ 86, 15, 68,101,221,143,136,148, 93,156,188,113,249,180,109,217,154,174, 10,206,115,217, 66,255,133,235,179,115,169,173,219,123,
+111,127,248, 17,198,196,245,129, 75,205,173,241,217,241,145,139,231,134,146,169, 92, 36, 18,174,143,133,218,187, 26,118,223,178,
+243,163,145,198,145,171,151,251,207,245,239,184,237, 94, 77,215, 7,207,158,248,238,179, 7, 91,234, 66,249, 92,222,171,105, 53,
+177,218,250,142, 94, 34,169,154, 55,108,151,210,135, 94,122,241,212,169,129,173,155,123,198,135, 71,231,166,151,250,135,167, 82,
+133,178, 44,201,183,236, 90,243,145,117, 29, 75, 11,169,215, 14, 95,124, 96,255,182,193,201,106, 29, 36, 56,163,180, 26, 57,151,
+145,153,229, 52,237,122, 30,172,134,152,170,129,129,170,102,196,242, 90, 73,133,178,187,226, 39, 21, 96,182,114, 58, 27,198, 24,
+ 17, 73, 8, 81,204,204, 23,210, 51,138, 22,152, 25,189,254,220,211, 7, 77,147,182,198,163,138, 42,101, 50,133,197,100,206,163,
+202,197, 92,233,251,255,240,205,165, 84, 14, 66, 20,171, 13, 72, 24,199,162,193, 59,238,221, 35, 17, 98, 91, 22,179, 45,219,200,
+ 21, 82,144, 89,102, 54,149, 57,241,250, 11, 87, 6,199, 47,142,204, 54, 68,130,155, 55,118,250, 2,222, 82,177, 60, 51, 57,227,
+ 11,215, 5,194,181,253,199,223, 60,252,214,137,177,137,121,136,208, 43,111,158,193, 4, 39,139,229,160, 87,223,185,190, 99,251,
+142, 53,169,165,204,235,111,156,218,178,169,187,189,185,246, 31,190,119,208,226, 16, 42, 26,236,235,235,187,239,214, 77,119,238,
+ 89, 43,248,143, 23, 45,142,127,173,192,179,150,157,208, 93, 91,123, 15,202,185,140,230, 45,195,122, 46,216, 86,129,217, 48,193,
+ 4, 19, 34, 75,152,200, 68, 82, 16, 33,102, 33,187, 56,191,148, 76,230,242,185,130, 81, 50,174, 93,155,106,111,175,111,109,171,
+183, 45, 26,137, 69, 16,130,139,243, 73, 70, 41, 70,200, 27,208, 17, 66,178,162,122,189,218,220,204, 82,177,104,122,189,106, 56,
+ 18,240, 7,131, 88, 82,210,137,196,169,227, 23, 46, 79,166,103,166,102, 30,188,255,182, 71, 31,123,108,116,240,226,141,254,243,
+171,215,117,167,147,153,161,254, 17, 76,112, 36, 26,178,109, 22, 8,121,235, 98,181, 99,163,179,175,189,126, 50, 94, 23,144, 21,
+ 41,157, 45,230, 75, 70,216,167,115, 89,159, 77,228,226, 33,213,163, 75,211, 89,115,120,161,226, 98,140, 82,241,147, 32,235,149,
+ 70,244, 62, 82,174, 88, 65,202,119,247,186,150, 79,147,226,206,225,197,213, 13, 79, 66,136,164, 72,178,162,201,154, 79, 82,117,
+ 76,148,234, 49,152,146,226,181, 44,186, 52,159, 44, 23,203,201,116, 49, 91, 54, 60,126,127,172,181,125,116,240,106, 48,228,191,
+ 54, 56,146,203,228,227,173, 13, 30,159,238,245,123, 60,190, 26,162,232,133, 76,162,165, 83, 7, 2,164,150,150, 44,211,202,166,
+211, 68,146, 49,198, 91,182,173, 46, 89, 3, 59,123, 99, 33,141,191,249,253,111, 70,235, 35, 53,145,240,161, 55, 78, 54, 52,214,
+116,244, 52,251, 3, 94, 89, 85,166, 39,230,179,201,156, 44, 75, 1,159, 18, 13,251,188,126, 79,109, 93,200,163,231,198,167, 22,
+134, 22,178, 29, 97, 22,247,147,128, 79, 21, 2,228,243,165,101, 23,227,148,185,112, 15,120, 63, 4,186,114,239,123,197, 82,104,
+245,183,219,115,187,220,234,234,238,166,147,209, 16, 68, 16,202,138,164,234, 30,213, 19, 80,244,128,164,250, 36, 69, 71, 88,162,
+212, 50, 75, 57,106,149, 44,163, 8, 17,232, 94,219,213, 88, 40,228, 50,249,135, 30,189, 75,245,120, 33,132,188,171,125,224,226,
+208,208,149,177,206,158,120, 40, 18,212,116, 29, 97, 66,153,109,101, 23, 85,221,231, 11, 55,153,229,130,191,182,137, 16,217,182,
+202,185,228, 98, 54,185, 52, 53, 62, 51,187,144,177,132, 84, 87,139, 53, 77, 41, 22, 74,243,179,137,107,195, 83, 75, 75,153,117,
+ 27, 58, 20,221, 39,105,210,212, 92,118,113,114, 26,223,152,190, 49,155,150, 4, 51, 24, 68, 0, 88, 54, 37, 24, 5, 49,204,230,
+138, 18, 33,249, 66,185, 80,182,100,143, 23, 0, 70, 0,128,156, 11, 46, 24,103, 64, 0,238,194,155,213,195,188,196,123,177, 66,
+ 33, 64, 21,148, 88,241,139,115, 87,185, 46,130, 47,220,221,121,140,144,170,169,186,207,175,249,194,146,234,151, 85, 47,150, 85,
+ 70,173,114, 49,131, 48, 41,229, 18, 75, 51, 99, 55,174, 77, 88,166, 93, 23, 13,203,138,212,177,102,157,191,182, 25, 33,137, 83,
+ 43,155,201, 12, 95,159, 18, 24, 5,195,254, 76, 42, 87,215,210, 43, 41,158, 66,122, 14, 19, 85, 8,118,227,210,177,153,153,228,
+200,216,226,249,225, 9, 1,184,166,233,156,211, 98,209,224,134,105,228,115, 13, 65, 18,107,136, 40,170,210,216, 28, 61, 63, 48,
+150,203, 22,198,134,167,114,233,252,212, 92,114,120,114, 65, 87,101, 93, 83, 31,189,123,251,217,179, 67,165, 98,185, 92,146,234,
+155,107, 77,195, 94, 72,231, 9, 33, 77, 13, 53, 92, 8,184,148, 73,219,116, 69, 37,205, 28,208,203, 1, 50,248, 74,244,116,197,
+185, 80,203,155,197,213,161,121, 53,181, 85,230,200,238,113, 8, 24, 99, 69,149,189,193, 26,127,164, 89,245,134,145, 36, 67,128,
+128,224,166, 81, 48,242, 73, 7,111,242, 71, 26, 49,193,229,178,253,214,203, 71,109,203,234,187,125, 55,145,228,203, 39,142,188,
+116,224,100, 50,155,175, 11,120,154,235, 2, 16,226,177, 27,211,249,124,209,162,112,235,205,119, 80,202, 78, 31, 62,122,117,112,
+162,182, 46,104, 51,208, 63, 60,217, 89, 27,148,100,204,152,104,109,105, 2, 0, 36, 19,185,198,230,218,150,182, 70,143, 79, 79,
+ 45,165, 23,230,147,132, 96, 44,145,166,120, 52, 24,242,207,165,138, 17,159,103, 77,111,115,123,103, 83, 48, 82,187,239,174,186,
+112, 36, 20,170,107,162,182,157, 90,152,185, 54,120,245,226,185,107,165,146,225,243,123, 66, 65,111, 38, 89,117, 49,103,147,144,
+175, 4,222,197,123,202,195, 21, 45,234,123, 10,164, 21,119, 59,128, 5, 70, 72, 86,100,143, 63,224,175,105,212, 3,209,124, 62,
+ 87, 46,151, 11,153, 33,136,176, 47,210,164,106,126, 65,237, 66,122,190,174,101,189, 0, 66,152,101, 44,105,241,142,174,214,206,
+177,193,193,177,235,195, 63,148, 32, 10, 4,189,183,108,235,204,231, 75,186,174,234, 94, 79, 42,149, 61,117,122, 48,160,201, 4,
+210,137,171,103, 18, 11,139, 23, 6,198,202,197,114, 71, 71, 3, 68,176, 51, 22,206,164, 11, 68,194, 29,157,141, 53,145,128,166,
+105, 91,118,109, 84,117,143, 81,202, 51, 74, 21, 85,174,141,134,205,115,215,188,138,196, 24, 27,186, 50, 86, 72,166,123, 59, 27,
+118,237,219,217,182,110, 55,145, 20, 7,244, 7, 64,216,102, 89, 86,180, 96,109,108,235,174, 93,133,108,242,226,153,129, 8,160,
+ 37, 41, 61, 51,178, 80,181,160, 21,123, 70,239,211,200,202, 51,198,150,145,173, 21,237,130, 0, 8, 65, 68,176, 36, 75, 30,175,
+199, 95,211,168, 7, 99,165, 92, 50,179, 48,170,251,107,202,229,114, 49,179,100,148,141,196,236,152,166,235, 68,146, 10,185, 34,
+128, 67,145,166, 78, 68,136, 55, 88, 87,132,136, 82,154, 40,150, 25, 23,205, 33,159,224,124,232,202, 88, 33, 95,138,212,133,115,
+185, 66,201,176,118,239, 88, 29,142,132,124,126, 93, 34,128, 96,108,218, 44,236,243,112,206,203, 69,203,182,236,142,174,198,205,
+ 59,214,181,173,218,168,249, 35, 16,203,182, 81, 88,156,188,186, 48,179, 56, 60, 52,145, 73,231,153, 0, 72,209, 59, 90,106, 18,
+ 75,217, 82,217,188,243,238, 93,237,171,122,253,181,173,182, 81,178, 77,131,200, 42, 38, 50, 68, 72, 82,180, 64,109, 99, 64,112,
+206, 41, 53,141, 72,125,211,149,179,103,146, 20,131, 27,174,130, 0,175, 30,136,247,222,124,245,254,195,215, 68,165,109, 93,113,
+200, 9,194, 80,150,101,221,171,123,252, 97,213, 87,131, 37,181,144,156, 74,207, 79, 81,198, 10,233, 57, 8,160,224, 76,146,112,
+ 46, 87,192,146,238, 9, 4, 7, 47,223, 72, 95,184, 17, 8, 92,144, 8,145, 36, 52,122, 99,242,252,229,145, 2,165, 62,175,183,
+189,179, 9, 1, 48, 57,185, 96, 88, 76, 81,229,206,104,211,236,244,210,204,228,252,210, 98,186, 80, 44, 3, 0, 71,167, 23,103,
+ 19,217,218,158,184,105,216,217,116,190,171,183,101,253,230,213,245,109,171, 20,111, 8, 66,100, 21,147,163, 3,231,207,188,123,
+158,217, 44,153,202,199, 26, 34,109,237,245,111,190,121,174,177,181,190,189,167,211, 52,205, 98, 62, 47,107, 65,106,228,179, 75,
+147,249, 76,182, 88, 52, 76,195, 46, 27,118, 54, 95, 44, 83, 0, 24,103,150,109, 24, 70, 33,155,193,222, 26,172, 84,232, 47,238,
+130,238,178,243,172,200,235,239,241, 36, 80,237,194, 93, 24, 17,253,223,157,156, 59,115,211, 64, 16,199,239,228, 59, 89,167,135,
+ 95,242,200, 82, 28,143,226,100,130, 33,192,164, 96, 24,168,252, 49,169,104,232,233,232,248, 16, 12, 5,140, 69,130,137,140, 35,
+219,138, 29,203, 47, 89,175,147,142, 2, 18,203, 25,104,104,119,103,103,171,221,226,255,219,255,114, 28,199, 17, 81,168,212, 53,
+ 69,109,242,164, 12, 33,151,166, 49, 46, 18,169, 82,245, 87, 75,150, 49,158, 16, 69, 81,139, 98,185,186, 93, 33,158,200,149,134,
+113,232, 44, 22, 23, 87, 99,207,113,151, 16, 0, 9,177,211, 35, 35,244, 3, 73, 38,136,131,253,159,238,133,123, 43, 21,184,115,
+153,152, 39,173, 34, 17, 6,125,103, 60,154,173,131, 56,133,192, 91,249, 47, 31,155,237,182, 65, 19, 42,151,196,102, 75,139,162,
+192,182, 62,205,103,203,175,214,224,115,207,222, 70,137, 86,150,206, 59,230,217,179,163, 31,223, 71,180,165,189,126,245,196,155,
+175,182,126, 32, 41,178,123, 61,126,247,230,237,112, 50, 47,201,132,102, 44, 8,147,138, 88, 60,110, 27,130, 40, 96,150,133, 73,
+146, 80,202, 32,139, 83, 54,248,102,101,188,244, 71,114,253,189,150,255,102, 66,186, 95,197,187,161,203, 51,239, 2, 7,138, 2,
+ 95, 81,235,114,245, 64, 40,105, 8, 97, 6, 0, 98, 34,226, 69,165,110, 2,198,194,205,156,102, 28,194, 56,165,201,204,177,181,
+214,105, 1,243, 5,204, 79, 39, 83,123, 56, 93,134, 49, 86,228, 5,194,235,205, 58,163, 20, 47, 54, 81,127, 68,163,152,240,232,
+164,213, 48,154,245,186,209, 44, 18,101,226,184,160,118, 80, 93, 77,116, 93,229,207,142,158,191,120,218,108,119,252,141,119,213,
+235, 9,130, 32, 43,114, 24, 70,151,150,109,125,177,245,178,168, 52,106, 25,132,163,217,210,243,195, 71, 29,243,208, 52,130,109,
+ 48,189,241, 62,188,255,104, 13,221,136,102, 34, 42,168, 37,233,118,177,142, 98,122,172,171,186, 94,227, 49,114,174,111, 46,157,
+105, 2,113,146, 50, 22,248, 18,199, 40,205, 24,140, 1,224, 96,183,219,221, 39, 49,255,227, 29, 2,251, 74,245, 63,124, 85,112,
+119,123, 0,246,142, 17,114,255, 99,239,227, 44,159,124,136,137,246,250,176, 60,199,125, 64,177,247, 52,206, 59, 78,157,163,154,
+ 44, 47, 5,239,254,198,220,213, 67, 8,127, 1,199,251, 38, 31,206, 72,110,197, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/snake_hook.png.c b/source/blender/editors/datafiles/snake_hook.png.c
new file mode 100644
index 00000000000..44d3efab779
--- /dev/null
+++ b/source/blender/editors/datafiles/snake_hook.png.c
@@ -0,0 +1,310 @@
+/* DataToC output of file <snake_hook_png> */
+
+int datatoc_snake_hook_png_size= 9710;
+char datatoc_snake_hook_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72,
+ 68, 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0, 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,
+252, 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,
+215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7, 19, 0, 34, 13, 86,254,139, 21, 0, 0, 32,
+ 0, 73, 68, 65, 84,120,218,237,125,121,148, 94,215, 81,103, 85,221,251,222,183,244, 42,201,218,172,104,177,101, 91,138,109, 57,
+222, 29, 39, 70,100, 51, 38, 38, 9, 4,226, 16,114, 8, 57,129, 9, 14,204, 73, 96,128, 51,204,144, 48,115,102, 6,206, 0, 51,
+135,129, 48, 33, 76, 32, 48, 11,153, 0, 19,150,236,100,199, 24, 59,142, 29,219,177,108,217,178, 45,217, 86, 75,109,181,186,213,
+219,215,223,246,222,189, 85, 53,127,220,251,150,150, 37, 91, 94, 2, 6,242,157, 62,173,175,191,229,190,122,117,171,234,214,173,
+223,175,174,112,239,222,189,240,140,143, 51,249,144,217,190,125,251,225,195,135,239,248,208,127,222, 62,153, 92,177,115,203, 74,
+230,103,151, 86, 78, 61,210, 15, 93,123,113,248,243, 13,151,239,254,185, 55, 85, 99,223,124,253, 85, 0,128,123,247,238, 77, 86,
+230, 54,140,166, 31,191,245,190,211, 93,206, 2,192, 67,211,115,111,255,225,215, 94,117,254,142,109, 27,214,118,135,153,247,242,
+ 91,159,189,237,129,199,143,172,250,208, 45,127,244,199,204, 46,239,119,178,222, 82,127,241,232,226,226,236,251,110,188,118,113,
+229,101,143,207, 46,252,222, 95,223, 14, 0, 36, 34, 72, 6,145,140,109,152,164,217,104, 79, 78,140,142,109, 90, 59,177,121,237,
+248,121,155,214,189,239, 13,215, 1, 0, 1,128,170,170,138,170, 32,168, 34, 33, 25, 2, 48,198,180,154,141,241,118,235, 45,215,
+238, 33, 0, 80,206,197,101,226,134, 62, 31,138, 27,120, 55,244, 44, 44, 34, 34,134,112,188,221,180, 0,224,134, 61,206,135,110,
+216,245,195,142,235, 47,230,206,103,206,231,206, 59,207,158,197, 16, 90, 0,200,251,203, 62, 31,184, 97, 39,239, 45, 12, 6,253,
+126,150, 15,157, 27,230,110,232,156,115,222,179,224, 25,205,221,153, 60, 76,248,231,163,239,125,219, 5,155,207,122,205, 37,231,
+255,237,131,143,157,250,131, 31,251,249, 31, 93, 55, 49, 6, 0,198,152,183, 95,119,233,158, 29,103,135,215,223,254,250,215, 87,
+ 31,250,173,127,241, 3,136, 88,255, 90,163,217,172,255,137, 0,240,137, 95,124,215,241,165, 78,187,145,182,155,105,111,144,119,
+179,225,251, 62,242,151,171, 62,116,231, 71,127,119,237,217, 23, 12,123, 75,110,208, 25,118,102, 87,230, 15,159,232,244,102, 23,
+ 59,189, 44,127,255, 31,127, 46, 10,254,175,223,243, 51,160, 12,160,160, 34,194, 8,154,128,107, 88,171,160, 87,159,191,245,192,
+241,229,110,191, 79,100, 12,168,170,176,170, 2, 34,162, 65, 68, 34,108, 36, 73, 43, 77,222,114,213, 46, 0,176,236,114,246,153,
+248,220,187,129,228, 3,206,251,158,197,139, 48, 11, 0,164,214,188,241,138,221,214,103, 61,246,185, 31,246,252,176,227, 6,203,
+ 46,235,230,206,231,142,115,239, 29,139, 42, 52,210,196,186,254,178,247,153, 31,118,243,254,114,214, 95,236,103,249, 32,207, 7,
+121, 62,204, 93,238,188,243, 30,207,208,165,206,228, 97, 79,250,251, 91,127,242,241,193,252,225,249,153,199,190,120,223, 35, 31,
+252,212,223, 60,151,129,110,255,224,127,186,245,238,111,252,194,175,124,224,200,252, 98,187,221,110, 25,252,254,171, 94,122,214,
+248,104, 51, 77, 62,244,249,219, 79,247,253,175,125,228,127,188,250, 39,111,174, 6,106, 54, 26,119, 63,112,239, 45,251, 30,253,
+242, 3,135, 0, 0, 96,161,252,232, 69,231,108,251,129,171, 47,106, 55,146, 45,235, 38,207,217,180,110,114,164,221,233,103,119,
+ 28, 56,244,177, 91,191,229, 60,135, 81,170,129, 46, 63,111,107, 98,205,133,219, 54,121,230, 47,238, 59, 88,191,230,254,199,167,
+246, 63,126,198,183,246,190,239,187,238,252, 93, 87, 94,113,185,188, 85,245, 87,145, 68,216,103,189,188, 55,215,237,245, 58,253,
+ 97,167, 55,200,188, 71, 64, 64,232, 13,178, 95, 42, 76,108,213, 64, 34,242,240,167, 63, 75,100, 85,152,133, 85,156,120, 47, 62,
+119,105, 59,105,180, 27, 35,221,177,193,202,250, 97, 55,115,110,152,187,126,230, 44,209,111,188,243,141,131, 60, 95, 88,233,253,
+246,103,254,174,114,184,109,219,182,253,208,107,174, 7, 64, 5, 32, 4, 16, 81, 21, 80, 5, 21, 85, 5, 80, 80, 68, 80, 84, 54,
+ 68,134,200, 26, 74,173, 77,140, 73, 19,123,245,249,219, 46,220,178,225,241,217,197, 65,238, 44, 0,168,136, 40, 3,123, 17, 47,
+236,132,157,112, 46,236,132,189,176, 87,201,133,115, 17, 96, 81,209, 48,184, 34,162, 69, 76,173,105, 55,211,239,187,124,215,209,
+249,101, 11, 0,156, 15, 84,152,217, 43,123,102, 39, 62, 23,159,249,124,200,110,232,243,158,207,122,222, 59,231,189,243,222,133,
+ 88, 37,234, 89, 88, 85, 21, 8,177,217, 72, 38, 71, 91, 22, 0,242,193,138, 10, 11,123, 21,199, 46,103,159,139, 31,250,124,192,
+121,207,251,220, 57,159,123,206,189,207, 61,135,208,151,121,159,251, 16, 0, 61,179,168,130, 53,100, 1, 32,239, 45,170,178,120,
+ 47,156,137,207, 56, 31,178, 27, 56,142,129,210,121,239,152,227, 40,222,231,142,179, 48, 92,136,167,222, 59,239, 69,244,133,139,
+147, 47,200, 99,219,182,109,244, 66,141,181,202,251,175,184,240,162, 63,122,255, 47,204, 79,237, 59, 62, 63,255,147,191,251,103,
+157,254,240,204, 7,170,194,245,129,191,250,171, 71,238,250,204,161,153,185,185,165,110,230,125, 98, 8, 0,127,237, 47,190,122,
+134,183, 22,151,146,245, 19,163, 87,109,162,191,190,123,255, 39,191,126,223,129, 35, 51, 79,206, 47,207,175,244, 60,243,107,246,
+156,127,247, 99, 71, 69,245,116, 67,188,237,186, 75, 31,152,154,153,152,152,136,127,127,225, 63,188,231, 63,252,200, 13,231,173,
+159,172,127,232, 85,151, 94,252,150,151, 95,252, 19,175,189,234,253, 55,189,238,169, 67,220,242, 59,191,126,214,228,120, 41, 81,
+212,209, 66,183,191,220, 27, 76,140,143,193,220, 82,249,209,191,249,214, 3,136,120,195,203,118,118, 6,217,187,175,191,250,156,
+ 77,103,109, 89, 59,105,140,121,116,122,230,107,251, 31,251,238,247,254,226, 41,148,157,231, 62,177, 54,165,147,111, 65, 85,255,
+250, 91, 49, 60,217, 36,241,206,157,238, 30,169, 84,250,100,187,181,235, 37, 27,137, 78,107, 16, 79, 51, 74, 45,212,166,201,214,
+ 13,107,214,140,183, 47,223,185, 93, 17, 54, 77,142, 89, 67,131,220,229,158, 69, 65,152,231,251,131,127,251, 63, 63,253,204,211,
+127,199,127,255, 85,219, 26, 23, 22, 36, 2, 85,246,121,222, 95, 26,118,231, 59,131, 97,167, 55,236, 14,135, 97, 1, 85,213, 15,
+127,254,246,135,167,103, 79, 49,253,223,115,197,158, 79,126,240, 67,227,155,207,111,140, 76, 38,205, 17, 74,154,104, 19, 34,131,
+198, 24,155,166, 36,205,212, 52, 19,107,136, 28, 75,238,249,146,237,155,175,221,189,253,246,135,167, 68,164, 28,104, 98, 98,194,
+124,246,195,191,111,155,109, 0, 97, 97, 16, 65, 68,141, 86, 19, 82, 48, 32,101, 66, 48,198, 36,134, 12, 81,120,247,138,115,207,
+222,185,101,211,125,143, 29, 45, 7, 34,219,104, 17, 25, 0, 34, 66, 36,131,132, 72, 4,136, 72,134, 76, 66,182, 73,105, 43, 73,
+108, 35,177,173, 70,210,110,164,163,173,230,104,171, 49,222,110,157, 61,222,126,215,107,174,172,102,141, 76, 2, 68,136,168, 81,
+ 97,136,225, 7, 9,209, 32,145,161,240, 64, 66,180,134, 82,107, 26,137,109,166, 73, 35, 77, 38, 70,218,111,189,118, 79,109,250,
+ 69, 65, 5, 20, 68, 69,133, 85, 88, 65, 64, 21, 64, 0, 84, 20, 65, 85, 21, 84, 65, 1, 0, 1, 1, 49, 14, 74, 35,173,198,171,
+ 94,186, 3, 0, 44, 8,131,178, 8,131,176,134,129,148, 53,134,125, 81,102, 21, 39, 34, 34,162, 33,123,213, 98, 64, 68, 34, 74,
+173, 93, 51, 62, 50, 42,185,149,184,156,177,178, 19,239,148,125,248,173,226,196,231,194,185,178, 11,235, 7,179,138,196, 31,208,
+ 40,156, 53,212,176,118,253,152,181,226,115, 13,233, 46, 59,101, 47, 46, 99,118,226, 51,118, 25,251, 76,124,198,222,177, 8,139,
+176, 74,120, 34, 33,169, 86, 5,208,112,143,137, 1, 43,236,132, 89,197, 43,123,246, 78, 56, 23,151,177,203,196, 13,197, 13,216,
+ 13, 88,196,179,120, 22,102, 97, 81, 22,245, 34, 44, 26,135,140,153, 30, 88,206,135, 18, 37,202,197, 59,225,156,243,140,253,144,
+243,129,207,251,206,115,238,189,103,102, 22,207, 28,126,152,197, 11,123,225, 48, 20,168, 34,146,101,159, 9,179,132,183,124, 38,
+ 62,103, 55,100, 23, 71,113,204, 65, 28,199,236,226,111,118,204,204,197,109, 74,140,122,150,243,129,132,213,145, 29,187,140,253,
+144,221, 48,108, 20,124, 28,136,115, 31,214, 56,118, 94,226,235,190, 28, 75, 69, 5,148,224, 69,181,174,109,221,186,149,224,197,
+244, 64,196, 23,151, 64,167,200,214,203,199, 67,159,254,156,235,204, 45, 61,249,208,114,103,190, 55,204, 7, 89,158,123,246, 18,
+108, 82,102, 22, 59,255,229, 47,191,246,247, 36,208,167,126,227, 87,206,106,240,253,183,254,233,145, 19, 75, 51,139,157, 19,203,
+ 43, 75,221, 65, 63,203,152,213, 88,106, 37, 73,187,153,182,210,244,189, 55,190, 50, 77,236, 19,179,139,127,254,245,125,207, 71,
+130,157, 91,183, 93,189,251,156,143,127,233,150, 83, 11,244,225,159,254, 97,211, 61,114,207,193,185, 7,167,142,237,123, 98,250,
+200,236,194, 82,198,157,254,176, 88, 12,192, 90,179,231,156,237,107, 91, 73, 43,129, 86,154,182,211,228, 61, 55,188,188,221, 72,
+ 31,122,242,196,231,191,249,224,153,203,241,139, 63,254, 19,187,214,192,135, 62,245,229,187, 31, 61,124,232,200,212,105, 53,180,
+121,205,232,209, 19,139, 83,179, 11,143, 31,159,159,239,244, 14, 47,116, 79, 94,178, 61,223,251,104,220, 63,111,219,180,241,162,
+179,215,244,134, 89, 98,204,186,118,227, 61, 55,188,252,172,241,209,117, 99, 35,125,214,143,126,233, 27,211,115,243, 44,170,170,
+ 68,100,141,185,116,215,121,191,249,190,127,185, 56,115,232,171,119,221,245,205, 67,199,126,253, 15, 63,122, 6, 57,223, 5,231,
+118,251,217, 32,203, 89,181,145,216, 70, 98,158,254, 46,167,102,142, 79,205, 28, 15,207, 55,174, 25,223,177,126,205,104,106, 18,
+ 99,172,161, 61, 91,214, 94,182,245, 44, 64, 16,209,254, 96, 56, 16, 60, 50, 55,119,221,123,126,134,189,123, 22, 54,180,118,180,
+233, 85,140,161,118,154,172, 31, 31,117,206, 51,216,251, 15, 63,121, 38, 83,112,124,177,115,124,177,243, 2, 27,245,161,153,121,
+131, 52,214,106,160,142,183, 26,233,134,201,177,157,155,135,187,183,172,255,171,187,246, 51,203, 88,171, 49, 49,218,222,182,110,
+242,165,219, 55,141, 52, 26,205, 52,201, 29,175, 12,179,153,165,149,253, 79, 76, 47,174,244, 86, 6,153,103,126, 33, 5,218, 48,
+ 57,186,110,172,221, 72, 83, 17,246, 28, 87, 5, 34,122,247,235,191, 11, 17, 67,229, 68,133,153, 57,103,206,115, 55, 44,170, 67,
+ 55, 92,178, 19, 0,168,168,173,120, 85, 17,126,114, 97,229,207,239,120,224,224,244,241,231, 40,208, 47,189,227,173, 55, 93,127,
+125,115,116, 29, 26,171, 18,150, 79, 14,137, 68, 92,127,133,133, 61,251, 92,125,238,243, 1,187, 33,231,189,220,229,206,251,204,
+115,238,217,249,176,219, 98,102,102,150,245,227,237,155,175,191,154, 16,189,104,183, 63,252,127,119, 62,116,224,240,209,103, 22,
+ 72, 68,246,125,252, 99,182,209,182,105,139,140, 1, 68, 17, 86,246, 34, 68, 66, 42, 70,133, 17, 89,213, 42,123, 68,131,100, 4,
+ 9,136,200, 38, 38, 73,140,203, 82, 55,108,122,231,153,189,136,243,236, 61, 59,150,220,185,204,179,243,156, 51,131, 74,171,145,
+188,253, 21, 23, 15,175,188,160, 59,204,191,250,224, 19, 15, 60,126,244,233, 52,212, 26, 91,171,136, 0,168, 34,161,252, 7, 0,
+132,164, 4,130,136,136,138, 40,194, 33,127, 70, 80,178, 73, 72,175, 0, 0,144,144, 12, 82, 70, 62, 51,194,134,136,173, 73, 89,
+210,196, 52, 67,134,224, 57,143,155, 84,182,134, 26,105,242,134,203, 47,120,237, 69, 59, 58,253,236,255,252,237,189,222,251, 83,
+ 8, 68, 73,170, 10, 8, 32, 42,160,128,192,136, 70, 85,148,149, 0, 21, 81, 1,139, 92, 17, 17, 8,136,136, 12,168,130, 81, 80,
+ 85, 82, 99, 1, 1,192,103,209,146, 16, 67, 42, 72,200,132,104,136,172, 53,222,179,245,156, 59,111,136, 26,214, 54,147,228, 61,
+223,115,205, 98,183,127,203,195, 71,143, 30,159, 91,181,139, 65, 34, 4, 0, 84, 4, 4,208,176, 11,130, 80, 99, 8,213, 82, 8,
+197, 12, 5, 85,136,137, 51,134,197, 25,138,203, 67, 97,245,229, 70, 4, 1, 16,129, 16,137,208, 32, 26,162,196, 80,106, 77, 98,
+141, 49,100,173,105, 36,118,162,221,124,245,238,173,223,119,217,174,114,247,100,161, 40,210, 70, 41, 84, 64, 5, 84, 69, 24, 68,
+ 64, 89, 69, 64,130, 81,139,134,172, 57, 36,206, 42, 42, 12, 42,160,162, 26, 50, 83, 1,192, 80,142, 9, 63,113, 84,128,112, 31,
+ 65,212,160,179, 80,159,177,198, 52, 18, 59, 49,210,250,222, 75,207, 63,222,233,207,102,106, 1, 64, 57, 94, 0,130, 62, 68, 85,
+ 89, 85, 64, 68,132, 85, 5,152, 37,184,155,176,176, 7,241, 90, 20, 96,148, 93,116, 61,113, 18, 43, 78, 26,179,219, 66, 44,145,
+234,169,130,130, 42, 2, 16, 2, 33, 25, 67,137, 49,137, 53, 35,205,116,189, 72,107,188,105, 1, 64,216, 73, 44, 53, 5,129,164,
+216, 57, 72,244,127,101,101, 22,241,225, 55,176, 99,246, 18,165,113,194,153,114, 30, 50, 99, 81, 21, 9,201,247,201,185,188, 40,
+212,126, 52, 88, 45, 1, 16, 81, 98, 77,194,166,153, 38,185, 26, 11, 0,226,243,104, 42, 16,117,163,170,194, 28,182, 69,160, 34,
+226,133, 25,148, 37,200, 17,170, 92,222,171,228,226,115,102, 39,133, 4, 33,156,214,158,104,177, 57, 8,194, 5,161, 43,141, 41,
+ 0, 34, 0, 34, 17, 25, 34, 3,100, 1,128,125, 46, 34,193,108, 75,173, 4, 37,133,173, 86, 57, 83, 69, 26,159,139,120,241,161,
+230,198,197, 92,170,136,120,102,174, 11, 39,225, 59,202, 44,204,241,251, 44,234, 89, 89,148,181,216, 37,168, 34,104,112,141,160,
+161, 76, 68,138, 29, 28,171,106, 16, 66,153, 85, 89, 37,236, 84,124,216, 44, 85,229, 63,169,116, 16,231, 85, 68, 68, 61, 51, 23,
+179, 22, 74,220, 18,159, 48,179,122,150,248, 1,102,102, 17,133,194,224, 0, 17, 80,193, 2, 0,103, 3, 41, 76, 48,250, 87,161,
+ 30,101,175,226, 37,136, 34, 62,110, 3, 53,234, 35,236, 93, 10,245, 20,243, 18,182,110, 44,162,197,150,174, 80, 88,185,201, 11,
+ 50,213, 53, 26,189, 0,192, 34,226,231,239,185,183, 40,155,134,127, 69, 65,161, 48, 71, 80,145,224,255,113, 3,172, 82,110,134,
+163,111, 71,243, 43,158, 23, 55, 39,170,160,209,210, 11,247, 13,175, 23,198, 4, 44,200, 66, 34,150,213, 48, 90,135,230, 69, 86,
+111, 12,123,179, 23,143, 48,123,247,238,165,147,240,161,127,240,199,139,110,163,248, 29,129,158,243, 86, 58,177,246, 87,222,251,
+222, 55,190,226,154,126,231, 68,127,233,248,160,123,162,159,101, 11, 43,131, 15,125,254,182,123, 14, 78,125,251, 4, 50, 19, 19,
+ 19,203,203,203, 39,189,250,214, 27,110,248,196,127,253,205,141,105, 54, 55,181,111,118,102,106,126,105,126, 97,165,215,233, 13,
+ 29,243, 37,219, 55,239,189,112,231,225, 19,203, 11, 43,189, 23, 92,154,237,219,183,159, 66, 67, 63,125,211, 91,110,126,243, 27,
+143,238,255,242,236,194,194,194, 74,127,101, 48,236,103,249, 48,247, 44, 2, 0, 68,152, 24,243,182, 87, 94, 50,219,233,126,228,
+ 11,119,124,219,167, 44, 49,230,230, 55,125,239,204,163,119, 76,205, 46, 28, 91, 88,158, 89,234, 44,174,244, 58,253, 97,230, 60,
+ 2, 52, 18,219,106,164,237, 70,218, 76,147,145, 70,250, 51,111,184,238, 79,110,219,247, 60,247,135, 63,250,250,235,255,244, 75,
+ 95,115, 69,114,125,178, 64,183,252,214,127, 60, 49,117,223,212,236,194,161, 99,115,135,102,230,158,152,153,239,244, 7, 8,104,
+ 19,147, 24,155, 90,147,218,193,104,179, 57,210, 76,251,141,198, 72, 51,253,145,235, 94,246,224,244,137, 47,222,243,208,115, 16,
+101,247, 57,231,252,252,155, 95,251,179,191,247, 49, 87, 75,245, 87, 9, 52,210, 76,243,238,220,204,252,210,244,252,226,193, 99,
+179,247, 63,254,100,206,114,116,177, 91,255,194,248, 72,251,202,243,118,232,112,200, 34,142,125,219, 37,187,207, 94,183,107,211,
+117, 31,249,202,157, 89,150,159,169,229, 18,125,238,191,253,250, 39, 63,247, 23, 63,245,219,127,116,210,102,119,149, 81,191,242,
+194,157,151,159,187,249,248, 98,231,240,236,226, 35, 71,143, 15,157, 59,120,124,177, 94,183, 7,128,204,185,199,143,207,129,105,
+141,183,155,160,194,170,222,115, 98,233, 85, 23,157,123,193,150, 77, 7,166,103,159,126, 55,189,125,243,230,143,254,242,191,249,
+238,243,206,250,131, 79,126,246,207,110,191,239, 36,160,232,100,163,254,254,107,246,244,178,188,151,229,253, 97, 54,200,157, 52,
+218,117,152,185,254, 56, 56, 61,125,112,122,250,181,151,237, 25, 17, 39,162,142,101,144,187, 53,163,173, 15,220,244,186,241, 86,
+243,214, 71,167, 63,125,251, 61,161,192, 29,244,209,110, 54,126,246, 71,110,186,241,234,203,239,184,243,171,127,241,153, 79,124,
+126,223, 99,139,203,157,103, 54,234, 77, 19, 35, 89,238,114,231, 69,213, 26,234,245,158, 97, 10,190,114,239,253,173, 70,250,202,
+221,231, 52, 45,230,222,246, 51, 55,223,233,141,183, 90,187, 55,142, 95,251,163, 55,142,181, 27,173, 52, 37,162,220,243,137,229,
+149, 35,199, 14,254,234, 71,238,184,111,122,241,241,233,153, 51,245, 50,239,189,103, 81, 5, 67,212, 74,211,230,240,153, 49,193,
+ 65,150,127,249,190,135,173, 49,231,110, 90,187,245,172,181,232,179,185, 36, 53,179,100, 13, 25, 66, 85,200,189, 31,122, 93, 28,
+228, 79,204, 45,157, 88, 92,122,118,110,207,170, 10, 64,132,105, 98,198, 90,141,137,204,157,161,145,122,230, 71,166,231, 30,153,
+158, 43,203,187,173,102, 43,119, 57, 63,101,167,252,236,214, 50, 13,104,184, 53,173, 52,157, 24,105,181, 82,243, 28, 99,139,234,
+ 96,208,127, 14,210,156, 44,144,136, 26,196,166,181, 35,173,198,154,209,246,230, 53, 19,151,236,252,251, 78,223,158, 18,169,173,
+105, 55,211, 73,225,132,104,164,217,152, 24,105, 13, 29, 63, 50,245,100,187,217, 24,109, 54,206, 26, 31,189,104,219,198,141,147,
+ 99, 99, 35,109, 81,237, 13,242,229,254,224,192,209,227, 71,231, 22,186,131,108,101, 48,124,129, 5, 66,196,102,154, 36,198,164,
+214, 76,180,217, 51,111,223,176,246,146,115,182,136,104,171,145,142,181,155,137, 53, 6, 81, 84, 61, 75,238,125,168,177,189,234,
+194,115, 0,226,214,172, 55,204,239, 63, 58,247,191,190,252,117, 56, 61, 18,253, 44, 4, 26,109, 53, 38, 71, 90, 0, 88,236,153,
+128, 16,201,152, 0, 57, 66,224,104, 48,123,145,204,121, 68, 8, 4, 5,231,139,210, 17,226, 72, 51,185,122,231,217, 87,158,243,
+230,161,243,223,120,228,200, 39,110,187,247,185, 11,132,136, 27,214,174, 31, 93,187, 21,141, 41,118,186,177,206, 18, 42, 4, 34,
+ 94,189, 99, 63,244,249,160,145,245,114,103, 51,231,135,222,231,206, 15,115,159, 59,207,204,193, 45, 16, 33,181,230,187, 46,220,
+241,138, 93, 91, 31, 57, 54,255,191,191,122, 87,255,140, 87,149, 40, 80,146,216, 91, 63,248,107,163,235,182,216,198, 8, 2, 48,
+123,149,176,211,101, 21, 47, 42, 97,207,170,198,163,177, 68, 41,219,148,178,190, 53,131,148,109,110,125, 51,225,204, 57,199, 28,
+ 88, 86, 44,202,194, 34, 64, 4, 59, 55,174,125,255, 77,175,155,237,244,127,251,204,120, 78,166,217,110,255,254,207,253,212, 47,
+255,228, 79,141,172,221,146,182,199, 77,210, 0, 50,136, 20,240, 96,136, 64, 43, 96,168, 9,104, 40, 82, 5,133, 6, 93, 8, 33,
+ 18,162,181,198, 32, 25, 34, 99, 40,212,219, 0, 32,108,112, 1,160,153,152, 43,119,190, 36,105, 52, 14, 31,159,127,250, 4,205,
+252,251,155,223,125,221, 21,215, 36,173, 49,147, 52,144, 72, 3, 73, 45,212,166, 32,226,161, 8, 16, 49,224, 80, 90, 84,137,111,
+197, 98,153, 4, 17, 12, 5, 70, 34,153,128, 63,151, 95, 80, 80, 0,131,184,126,188,125,241,142, 45,223,122,124, 90, 79, 99,242,
+219,183,111,183,148, 52,108,163,133, 72, 0, 34, 44, 0,170, 34,160,138, 68, 5,248, 14,136,138,164,168, 2,100, 80, 4,208, 18,
+ 49,144, 85, 35, 4, 98, 84, 65,135, 0, 38, 34,228, 8, 65, 30,131,104, 12, 25, 79,185,243,200,168, 0, 45, 85, 85,189,249,250,
+171,255,242,155,143, 28, 59,113,234,101,219, 18, 89, 36, 75,136,160, 8, 8, 42,138,136,138, 4, 32,164, 36,168, 8, 40, 72,136,
+130,136,177,164, 73, 8, 66, 64, 6,201,160, 88,178,172,154,168, 58,107,168,162, 59, 36, 0, 17,185, 39, 68, 68,231, 1, 0,210,
+ 88, 14,122,243,149,187, 14,158,232,126,241,155,247,159, 34, 82, 35, 17,133,161,137, 40,208, 8, 3, 41, 0, 81, 99, 41, 52, 76,
+ 26,134, 43, 0, 18, 34, 1, 25, 66,131,100,200, 24, 68, 75,198, 26, 99, 16,203,202, 33, 89, 34,107, 76, 98, 77, 98, 41,181,182,
+ 97, 77, 98, 77,106, 76,106,109,187,145,180, 27,233,206,117, 35, 63,112,221,229,167, 18, 40, 8,129, 20, 46, 73,136, 74,168, 24,
+ 3, 27, 22,107, 92, 81,120,133,162,222, 74, 97,114, 0, 9,136, 32,148, 89,139, 66, 44, 81,168,136, 97,188, 87, 66,107,109,106,
+141, 53,148, 88,178,134, 66,110,190,190,153,252,224, 43, 47,127,234, 90, 22,198,213,192,148, 0, 0, 84,197,147, 88, 70,209,168,
+ 79, 70,108,131,187, 81,128,238,177, 34, 88, 20,223, 69, 42,249, 22, 20,171,213,166,224, 93, 24,162, 70, 98,198, 82,124,221,158,
+243, 87, 11, 20,111,157, 10, 15, 42, 84, 82, 22,166,195,243,224, 42,197, 31,171,168, 49, 88,200, 23,191, 88, 13, 83,148,178,227,
+ 7, 40,152, 8, 6,150, 9,146,161,196,152,181,163,205,171,206,219,250,148,213, 94, 11, 54, 94,193,245, 40, 24, 46, 2, 32,160,
+133,136,225, 42,165,184,160, 8,101,125, 91,244,164,145, 78, 82, 39,128, 22,165,118, 34, 52,132,150,200, 32, 37,214,108, 24,107,
+191,100,221,100, 33,144, 2,196, 10,117,212,135,150, 4,149, 80, 97, 6, 8,117, 52,141, 68,197,200, 85, 44, 42,105, 82,137, 32,
+149,130, 74, 24, 64,139,202,249,106,206, 81, 40,243,163, 49,100,141,105, 54,236,249, 27,215,148, 75, 71, 89,170, 83, 0, 17, 21,
+ 16, 45,107,214,160, 2, 18,175, 29,158, 7,177, 66, 81, 16,180,168,101, 43, 43,115,197,124, 41,176,153, 82,188,146, 95, 19,149,
+133, 16, 2, 2, 81,144,201,182, 26,233, 85, 59,183, 0,128, 45,169,153, 88, 84, 1, 3,163, 56,214, 24, 69, 35,247,166,170,128,
+179,150,112,130,134, 82, 63,131,114, 57,223, 82,215,204,106,189,151, 58, 12,168, 82, 88,145, 8,209, 34, 38,150, 70,154,169, 0,
+144,130,138, 10, 22, 21,106, 84,133, 80,133,133,242,170, 26,197, 42, 81,142, 98,109, 81, 97, 80, 46,212, 35,170, 42, 0,229,165,
+ 37,252,121,146,126,160,122, 94,218, 19, 25,178,100, 26,214,104,208, 80,132,201, 68,160, 44,149, 22,176,139,138,128,248, 85,162,
+196, 10,191,143,191,153,149, 3, 26, 14,171,170,179, 5,237, 94,106, 58, 42, 37,211, 24, 89, 48,194, 69,136, 68,104,137, 0,192,
+198,213, 20, 2, 48, 82,204,139, 8, 20, 85,104,173,128, 78, 31,202,214, 42,129, 58, 85,200,164, 94, 85,184, 16,167,224, 60,197,
+129,180,224,211, 70, 11,131, 56,107, 82, 51,246, 8,174, 5,129, 64, 99, 13, 58,168, 39,120, 88, 5, 45, 48,171,122, 16,137, 18,
+104,160, 99, 69,153, 34,238, 33, 21, 30, 37, 82,248, 94, 81, 9,151,162,176, 29,102, 80, 20,107,174, 23, 67, 73,136, 85, 84,104,
+ 72,148, 89, 64, 81, 11, 13, 73,229, 56,113,226,216, 67,201, 12, 99, 47,226, 85, 92,172,234,199,162,126,224,222,199, 2,249,106,
+ 16, 40,186,165, 74, 85,101,151, 10,159,171, 34,108,136,159,182,240, 20, 13,188,184,232, 71,133,205, 70,113,217,171,122,225, 0,
+ 14,123,229, 92,124,144,201,115,128, 25, 84, 57,214,231, 69,180, 82,146,172,130,202, 66,184,144,232,122, 82,154, 83, 48,245, 24,
+207, 45,168, 10,123,192,154, 13, 73,136, 55, 1,125,143, 22, 45,149,245, 20,172, 57,246, 92,104,165, 64, 57, 64, 74, 0,112, 21,
+144, 80,199, 24, 75, 92,161,130, 28, 85, 43, 21,217, 50, 57, 44,125,173, 12, 60, 34, 53,105,162,146,156,122, 23, 25,107,165,101,
+ 20,244,184,120,165,112, 59,133, 52, 28,132, 43,180, 87,130,163, 39,249, 96, 25, 68,109, 80, 3,148,211, 90,243,240, 96,209, 26,
+ 97,252, 18, 66,244, 34, 62,160, 93, 42,186, 26, 10,170,161,175, 82,224,163, 1, 13,148,136,211,106,193, 59, 44,161,153,114,209,
+ 10, 34,217, 96,170,170, 2, 97, 53,170,144, 77, 95,155, 41, 14,252,120, 21, 23,144,167, 96,168, 37,178, 84, 2, 83,117, 88,147,
+163, 86,162,160, 26,229, 14, 26,149, 26, 92,180,138,187,105,227,181,227,194, 4,197,124,197,153, 18, 97, 8,128,102,160, 58, 86,
+ 48,101,136,208,133,149, 68,172, 73,185,240,171,128,151, 85,115, 20,241, 53, 9, 46, 22,182,188,149, 76, 53,252,218, 30,156, 57,
+ 30, 86,162, 58, 80, 95,174,172, 5, 32, 44, 85, 28,174, 47, 88, 80,123, 46, 80, 5,214,136, 91,174, 50,234,194,247,161, 50,106,
+ 65, 22, 35,138,172,196,104,217, 38, 16,250,189, 22, 23, 23,151,150,150, 94,108,176,208, 63,236, 67, 85, 39, 39, 39,215,172, 89,
+ 99, 1, 96,121,121,249,200,145, 35,223, 81,202, 83, 73,158,107,214,172,161,239, 40,226, 31, 25,122,247, 29, 5,253, 35,123,216,
+231,231,165,112,217,174, 11, 94,125,249,165, 87,236,218,185,121,162, 45,110,224,135,221, 44,207,230,123,131,187, 31,157,218,127,
+100,230,235, 15, 61, 54, 60,227,194,226, 63, 17, 5, 93,182,251,165,255,234,157,239,186,108,247, 46, 11,156,247,151,179,238,146,
+ 27, 46,187, 97,215,173,204, 6, 58,165, 99,110, 91,124,197, 5, 91,175, 62,111,203, 59,246, 94,198, 44,253, 60,159,158, 95,190,
+239,137, 99,183, 60,112,112,152,187,127,178, 10,250,233,183,190,245,231,222,249,174, 97,191, 51,236,204, 46, 61,118,103,191,187,
+ 48,200,178,129,243, 89,238,189,231, 60,246,105, 68,130, 80,153,218,132,220, 97,178,221,220,123,225,142, 87,238,222,158,229,126,
+255,209,217,191,121,224,224, 82,183,255, 79, 71, 65,151,239,186,224, 15,254,221, 7, 72,220,220, 99,223, 92, 89,156,233,244,251,
+221, 65,214, 27,102,253, 44, 31,100,110,152,187,216, 78,233,124, 96,194,134, 18, 81,168,236, 25, 67,134,200, 18, 26, 99,194,239,
+ 11,206, 94,119,193,230,181, 89,238, 31,158, 89,248,234,190, 71,114,231, 95, 12,138, 64, 60, 53, 44,243,204, 10,122,239,155,111,
+252,137,239,127, 99,255,196, 99,221,229,185,197,110,119,169, 55, 88,238, 14,150,251,131,229,110,191,211,207, 86, 6,195,238, 96,
+ 56,200, 93,230,156,231,152,159, 7, 82,162, 49,161,197,214,164, 54, 73, 19,147, 90,147, 24,155, 88,147,196,162,172,217,125,246,
+186,221,155,175, 93, 25,230,247, 60,113,236,222,111, 39,141,228,105, 30, 63,255, 99,239,188,112,203,228,190,135, 30,252,195, 47,
+220,122, 74, 84,237, 25, 20,244, 99,175,187,246,109,123,175, 92, 60,246,240,242,202,202, 98,183, 63,191,210, 91,232,244, 78,116,
+186,115,203,221,185,229,149,197,110,127,152,231, 2,168, 74, 98, 76, 47,203, 29, 11,146, 69, 66, 67, 4,222,173, 25,107,143,165,
+ 58,218,178,153,119, 4,121, 98, 77,154,196,222,129,196, 24,107, 77,106,108, 51, 49,123,119,111,223,187,123,219, 82, 47,251,218,
+254, 67, 83,179, 11,223,110,165,156,187,117,219,219,190,231,181,223,189,103,215, 29,119,222,114,219,125,183,127,248,207,166,250,
+195,236,185,184,216,142,141,235,110,122,197,158,110,103,182, 59,200, 22,123,253,249,229,222,137, 78,119,118,169,243,228, 66,231,
+216,252,210,202, 96,216,106,183, 87, 52,153, 61,113, 90, 84,103,190, 70, 17,152, 28, 27,189,104,251,182, 22,161,243,222, 26, 72,
+140, 49,222, 12,209, 91,131,214,154,212,218,241, 86,122,211,181,123, 8,209,171,126,229,254,199,246, 63, 49,205,171,153, 20,207,
+231, 97,136, 94,115,205,213, 31,248,241,119, 13, 22,166,190,126,207, 55, 14, 60,124,207,255,253,236,103,158,152,153,123, 94, 49,
+232, 77,215,236, 65,208,149,193,176,211,207, 58,221, 97,167, 63, 88,234,245, 23, 86,250, 11, 43,189, 97,238, 70,199,199,247, 63,
+241,228,153,139,184,180,210,189,237,129, 7, 1, 96,180,213,218,189,125,235,186, 17, 99,189,179, 6,173, 24,195,156, 57,215, 31,
+ 26,107,168,145,218,102,146,188,254,210,243,222,124,213, 75,173, 49,221, 97,246,224,209,217,187, 14, 77,207,204, 47, 62, 91,165,
+ 92,117,209, 69,239,120,195,141, 23,109,123,137,244, 79, 60,118,248,208, 35, 83, 71, 62,248,135,191,243,224,244,252,161, 99,115,
+103, 30,248,158, 78, 65,215,236,218, 49,200,252, 48,119,131, 60, 31, 56,151, 57,159, 59,118, 44,162, 58, 58, 58, 50,215,127,142,
+ 11,118,119, 48,248,230,129, 71, 0,160,217,104,236,216,120,214,150, 53, 99, 13,163, 69, 20,167, 97,238, 86, 40, 51, 20,218, 77,
+ 77,171,153, 94,186, 99,243, 43,118,109,107, 55, 26,173,212, 38,214, 42,153,165,238, 96,224, 92,150, 51,171,230,206,141,180, 91,
+227,237,145,145, 86,123,253,218, 53,235,198,199, 84,164,219, 93,153,155,159,155, 62, 49,247,232,253,183,253,221,173, 43,115, 43,
+195, 39,230, 22, 15,207, 45,202,179,111,125, 57,173,130,182,110, 92, 15,236,115, 70, 23, 26,250, 89, 2, 46,157, 24,106, 38,118,
+232,188, 53,230,121,154,253, 48,203, 14, 76, 77, 31,152, 2, 0, 24,105,181,182,174,159,220, 48,218, 76,136,210,196,132,133, 15,
+ 41, 0,190,161,116, 77,101,128,183,198, 36, 6,145, 76,128,138,186, 43,203, 75, 75,139,206,249,161,115,253,204, 13,115,223, 25,
+ 12, 6, 98,166,230, 22,142, 47,118,156,123, 94,153,215,105, 21,180, 99,195, 26, 22, 1,192,144,212, 32,162, 33, 76,172,105,164,
+ 73,187,145, 58,230, 54,242, 11, 24, 56,123,131,193,129,169,193,129, 98,201,181, 68,214,154, 13,103,173, 91, 55, 49,142,226, 71,
+155,105,106,140,112,198,236, 2,206, 20,208, 75, 64,200,157,239, 12,156, 87, 60, 54, 59, 59, 24,102, 2,224,253, 11,153, 55,156,
+ 86, 65,173, 36, 97,137,181,217, 0,103, 37,214, 54, 19, 51,210, 72,188,111,138, 42, 66,182,118,124,100,161,243,194,211, 41, 65,
+ 53,244, 6, 79, 77, 31,155,154, 62,246, 34, 77, 20,135,206,169,106, 4,220,201,164,214, 54, 18,230, 70, 26,206,231, 8,136, 50,
+ 33, 62, 12,180,212, 89,249,231,184, 89, 93, 25, 58, 22,177,198, 88,162, 70, 98, 0, 18, 68, 48, 68,137,181,205, 70, 58,218,114,
+ 19, 35,205, 53,195,145,179, 38,199,190, 53, 53, 55, 61, 55,255,207, 78, 65,199,151, 58,225,240, 2, 36, 74,132, 18,107, 26,214,
+182,210,196,177,120, 31, 32, 31,241,204,142,229,226,109,155,135, 94,142,175,244, 59, 67,222,188,113,195,100, 10, 19,205,100,227,
+196,104,187,145, 36,134, 8, 67,127, 24,134, 94,245, 18,125, 88, 5,121, 70,204, 5, 50,230,149,254,176, 59,204, 79, 44,119, 79,
+116,251, 83,115, 75, 79, 46,118,142, 28, 63,241, 98, 84, 80, 98, 76,146,152,102,154, 36,134, 16, 83, 81,141, 93,249, 69,169, 61,
+146,110, 2,152, 12, 37,135,168,132, 39,137, 74,118, 78,104, 69,193, 10, 22,136, 24, 76,137, 84,133,200, 3, 96, 0,214,180,155,
+107,218,205,173,107,199, 1, 99,153, 61,224,146, 44,220,207,253,254, 35,115,247, 28, 60,242,228,194,210,114,111,240, 15,172,160,
+239,122,233,142,117, 99,163,237,102, 43,105,180,209,164, 17,164,138,128, 85,129, 32, 3, 66,128, 69,209, 68,158, 71,160, 43, 41,
+ 4,244, 2,152, 69,125,209,134,230, 2, 80, 34, 44,142,197, 51, 7, 2,111,216,223,198, 86,165,136,195, 70,162, 72, 36,140, 32,
+ 16, 34, 26, 59,222,178, 87,159,183,229,229,231,191, 36, 32, 59, 89,238,102,150,251, 95,184,247,225, 3, 71,142,253,125, 43,232,
+221,223,123,221, 59,174,127,117,115,108,109,218, 26, 55,182,129, 68,177,105, 50,186, 69,193,158, 8,168, 95,157, 30, 0, 5,134,
+ 90, 67, 68,139,166,175,112,212,147, 19,206,132, 67,167, 84, 56, 12,163,104, 59, 99,241, 42,204,234, 11, 88, 82, 68, 88,184,214,
+210, 8, 0,224,139,205,119, 51, 77,207, 89,159,190,251,250,171, 69,164,159,185,163,243,203,251, 14, 31,251,198, 35,135,159, 51,
+ 89,242, 52, 10, 42,192,233,241,118,235,117, 87,190,236,221,111,188,113,243,198,205,148,180,109,179,109,109,130, 38,137,103,190,
+ 68,140,187,250, 1,169,240,165,178,195, 43,252, 9,165,130, 84, 84, 24,197,170,120, 48,105, 1, 93, 55,133,157, 97,167,236,146,
+ 96, 82, 1, 66, 99,137,192, 39,115,160,107,132,115,173,152, 99,131, 94,233,146,162, 42, 2, 18, 96,124, 0, 64,108, 38,246,220,
+141,107,183,173,159,188,225,210,243,123,195,252,224,236,242, 29, 15, 63,126,124, 97,249, 5, 80,144, 0,188,243,134, 87,191,233,
+218,107,108,163,157, 36, 77, 74,154,198,166,198, 90,192,208,214, 11,128,193,173, 4, 8,149, 3, 93, 36, 88,126, 60, 14, 7,136,
+ 80,226, 43, 16, 88,147, 42, 32, 0, 68,161,169,153, 16, 1,145,129, 9, 0, 9,133, 67,140, 50, 66,150,200,171,122, 98, 39, 34,
+214,152, 8,131,138,137,100, 22, 14, 64,118,108,181,244,149,166,130,125,161, 40,176,176, 20,161,158, 16, 83,107, 77,139, 46,222,
+ 98, 47,216, 56, 57,116,126,161,239, 62,117,231,190,149,231, 17,176, 44,168, 78,172,217, 56, 58,177, 17,200,144,177,129,149, 23,
+220, 71,132, 75,206,142,106, 69, 58, 64, 0, 5, 4, 80, 68, 3,168,168,162,132,145, 80, 66,136, 85,212, 13, 13,214, 22,196, 43,
+ 42, 25, 80, 4,144,192,107, 3, 65, 36, 36, 37, 18, 38,131, 68,226,133,153, 16, 69, 85, 80,132,208,136, 10, 81, 8,231,137, 45,
+123, 47,109,108,148,141, 77,169,204, 74,193, 15, 75, 0, 23, 12,165, 96, 3, 81, 43,181,246,199, 95,125, 69,230,248,232, 82,239,
+ 75,247, 30,200,242,252,185,196, 32,178,137,105, 52, 99, 88, 36,132,178,133, 57, 50, 48, 52,112,196,194, 47, 0, 80, 50, 20,104,
+ 53, 49,164, 18,137, 42,138, 42,160,160, 0, 69, 42,157, 4,238,155, 2, 25, 4,136,237,210, 20,118,112,150, 0,227,184,136,194,
+164, 72,136, 62,112, 74, 16,137, 84, 5, 11,103, 38, 85, 69, 18, 49,130,162,202,140,162,196, 38, 24, 17,121, 81, 49,194, 90, 54,
+207,162,136, 18, 34, 41, 25, 35,150,217,121,178,134,119,174, 55,219, 95,115, 69,207,201, 93,135,166,247, 63,113,244, 89, 42,136,
+136,140,141,190,131, 8, 4, 10, 26,201,156, 24,163, 48,162, 34, 5,122,158, 18, 72,232,102, 38, 21,193,208,212,174,160,132, 40,
+ 18, 1,108, 84, 13,180, 69, 84, 68, 4,210,216,155,175, 0,160, 97,185,163,144, 35, 48,104,120, 27, 20, 81,144, 12,163, 42,139,
+ 40,146, 34, 0,138, 80,224,111, 3, 10,170,136, 4, 43, 35, 22, 33, 20, 33, 18, 17, 37, 22, 49, 40,162,106,162,113,161, 81,101,
+ 70, 66,178, 70, 18, 54,158,217, 89, 49,214,239,221,189,245,154,115, 55,205, 15,229, 43,247, 29,232,246,250,103,182,138, 33, 17,
+ 26, 1,168, 56,164, 37, 21, 18, 81, 37, 26,142,160, 70,190,103, 48,143, 64, 95, 86, 0, 4,137,230,132, 5,137, 57,174,207, 69,
+ 79,113,197, 41, 3, 81, 68, 2,210, 64, 52, 6, 82, 16, 85,138,220, 70, 84, 0,163, 42, 64, 33, 75,136,108, 96, 4, 17,164, 48,
+ 28,161, 40,138,162, 65, 22, 33, 16, 68, 98, 9, 61,241, 65,113,200, 68, 33,101, 35, 36, 18, 97,193,162,139,159, 45,161, 51, 38,
+ 49, 38,181,254, 7,175,220,221,101,184,243,224,209,163, 51,179,207,160, 32, 12,135,137, 21,116,107, 84, 12,190, 21,110, 14, 73,
+ 69, 0,131,149, 32,134,211, 27, 74,158,131, 98, 69, 72, 12, 95,170, 29, 47, 16, 86, 24, 4,144, 34,168, 7,130,177, 70,251, 66,
+ 84, 8, 12, 99, 5, 13, 10, 80, 0, 50, 0, 18, 62, 67, 10,197,105,181, 80,200, 16,143, 75, 16, 0, 66, 6, 34, 17,160,168, 56,
+ 16, 5, 3, 40, 74,145,186, 38,200,128, 8, 28,101, 8,215,228,200, 72, 36,180,206, 95,119,238,166,254,246, 77,223,120,244,240,
+233,150, 60, 11,165,197, 72, 56, 41,130, 0, 5, 20, 9, 84,112, 53, 37, 24, 1, 67, 13, 20, 11,246, 76,145, 1,213,149, 20,119,
+ 13, 21,103, 87, 11,178,187, 22,148,247,232,135, 90,176,176, 35, 73, 63,184,181, 98,168, 33, 32, 2, 10,104,136,124, 82, 75,109,
+180,184, 80,121, 78, 5, 20,190, 27,153,205,138,132, 6, 0, 4, 13, 5,103, 22, 69, 84, 66, 81, 68, 68, 67, 36, 10,106, 40, 21,
+ 11, 45, 53, 57, 95,187,243,236,249,141,107,239,126,108,250,169,253, 19, 4,165,103,161, 66,113,242, 27,170, 40, 2, 86,233,159,
+ 2,104,144, 82, 65,163,123, 5, 59,128,178,241, 61,176,131,181,236, 17,208,146,213, 92, 81,201, 74,245, 86,124, 92,173,232,120,
+ 5,255, 45,132,247,177,193,103, 43, 0, 0, 5, 95, 73, 68, 65, 84, 58, 87,118, 53,143,183,198,221,171, 77, 94,204,228,177,104,
+163,192,162,189, 37,244, 1, 68, 30,107,224,220, 83,104, 88, 48,104,201, 36,134, 90,141,116,221, 88,235,186, 93, 91, 95,182, 99,
+243,169, 20, 84,209,155,139, 14,127, 8,135,232,213,184,179,165,178, 34,119, 89,203,204,176, 34,121, 7,194, 98,141,113, 27,148,
+ 85, 35, 74,106,113, 18,107, 28, 11, 84,169, 84,177,172, 58, 30, 32,174,147,171,249,226, 21,101,170,166,178,154,109, 33,172, 38,
+ 34, 71, 61, 33, 22,135, 81, 64,160, 32, 23,187, 69, 42,224, 41,211, 72,108,187,209,216, 56, 49,114,237,249, 47, 25,105, 54,138,
+109, 66,116,177,130, 22, 23,214,177,120,132, 96,136, 71, 90,158,139, 16, 24,204,101, 54, 4,117,242,118,113,128, 8, 68,246, 88,
+ 45,111, 42,121,197, 34,165,102,235,239,150, 20,108, 85,142, 52,215,242,152,146,168,238,146, 63,172,245,155,127,138,125,197,207,
+214,169,250,117,166,104,209,137,163,161, 71,128,202, 83, 98,136, 44,169, 16,169, 53,162, 9,180,224,178,237, 27,142, 46, 13,124,
+ 93, 65, 21,157, 50,220, 47,198,134, 26, 9, 79,227,107,129, 87, 29, 24,248, 2, 53, 51, 9,183,131, 5, 99, 14, 87, 29,235,194,
+ 53,115,227,218,139, 82,144,173, 3,107,157, 1, 34, 15, 91, 74, 75, 69,168, 14,247, 8,147,160,117, 86, 99, 21, 2, 11, 47,215,
+234,211,225,138,133,121, 98,173, 83, 65, 17, 98, 91, 12,162, 65, 18, 82, 34,177,198,136,106, 42, 70, 19, 85,208,173,147,232, 91,
+227,133,130,180, 60,134, 24, 42,141, 20,145, 65,160,166, 5,168,121,156, 74,233, 41,165, 41,149,199,130, 20, 27, 87, 9,103,150,
+172,218,181,133,211,111,164,224, 25, 11,139, 6, 58, 61, 23,228,249, 82,241,165, 41, 66, 65, 51, 44,156,182, 10,117, 53, 89,107,
+102, 85,183,161,178, 27, 10,107, 73, 10, 34, 16,130, 96, 60,202,135, 69, 13,145, 24,181, 74,169, 90, 21, 69, 67, 26, 20,164,229,
+ 25,226,101,168,128,210,191, 64,171,158, 8,128, 98, 63, 10,213,161, 36,113,239, 30, 75, 28, 82, 57, 17,148,180,107, 40,119,182,
+193, 70, 84,149, 65,188, 4,221, 5, 78,184, 50,112,113, 70, 78, 73, 61, 47, 38, 69,162,174,160,100, 91,171,104,125, 30,101,245,
+137, 39, 10,101, 91,197, 42,127,172,175, 5, 69, 84,138, 15, 67, 36, 34,100,208, 8, 89, 82,182,134, 9,125, 97, 65,161,118, 19,
+ 72,249,241, 80, 21,168, 8,242, 10, 1, 72, 0, 21, 17,172, 25,145,150,109, 29, 69,251, 64,176, 17, 4, 45, 61, 43,108,116, 3,
+ 75,183,222,226, 1, 42,202, 62,246, 60, 4,198,177, 74,169, 16,145, 64,133,175, 71,100, 56,249,244,151,208, 97,162,178,122, 57,
+ 57,185, 65,167,234,211,137, 30, 80,133,168, 90, 95, 68, 17,191, 37, 4,111,181,198,184, 72,255, 47, 44, 72, 10, 59, 45, 12, 8,
+ 42,135,170,116,165, 18,109,188,240, 41,169, 76,190, 8,189, 34,171,206,223, 9, 31,102, 88,125,102, 81, 85, 48, 82, 95, 4,105,
+ 45,252,168, 76, 46, 74, 47, 43, 93, 12,100,149,118, 86,135,157,162,201, 96, 85, 51, 70, 28, 4,138,223, 90,207, 44,234,246, 84,
+ 59,121, 12, 73, 98,133, 52, 40, 72,148,185,214,250, 19, 55,243, 85,244,131,250,130, 85,246, 28, 21,161, 7, 42,101,197, 46,150,
+208, 78, 16, 21, 81,107,184, 80,169, 83,213,227, 41,186,202, 5,111, 90,106,102,162, 21,159, 58,118, 50, 64,173,123, 71,171,144,
+ 84,118, 26,212,249,252,213, 97, 67,213,209, 93,181,114, 95,153, 89, 84,126,135, 80,229, 5, 85,250, 84,158,111, 22,248,231, 33,
+145,144,144,173,105,113, 32, 28, 70,207, 82,149, 16,195, 99,232, 45,196, 67, 40,155, 30,162,189, 99,108, 8,224, 48, 50,134,154,
+114,116,186,112,238,150,132,179, 0,161,138, 44, 80,133,152, 72, 47,175, 34, 78,101, 62, 18, 59,139, 74,149, 5,146,120, 17,240,
+ 32,246, 96, 20, 5, 62, 89,101,116,186, 90, 85, 90,245,131,105,185, 81,210,226,172,187, 88,247, 42, 44, 40,172, 44, 80,105, 85,
+160,222,157, 86,209,216,107,145,160, 56,202, 42, 6,238,106, 57,151,122, 69,177,236, 43,171,124,170, 52,168,202, 71,164,234, 96,
+129,147,243, 69,173,242,171,178,201,163,230, 95, 80, 29,159, 38,197, 97, 95,145, 66,175,245,102,150, 42,183, 42,131, 83,108, 82,
+ 41,251, 24,203, 90, 59, 20, 37,246, 66, 65,194,190, 12,108,229, 46,171,136,223, 85,176,131, 85,203,185,212, 66, 15,212, 18, 60,
+174,222, 42,151,240, 74, 71, 92,111, 33,136,179, 42,181,100, 33,174, 88, 18,151,246,147,148, 85, 59,126,171,254, 98,165,184,242,
+124,182, 74, 53,133, 88,197,101, 89,171, 68, 84,235,183, 93,219, 44,174,218,172,134,126,141,226, 88,147,226,236, 58, 41,147,195,
+114, 69, 47, 50, 20,145, 34,105, 22, 44, 26,107,226, 52,151,139,151,114,140, 68, 82,116,117, 20,170, 41, 64,163, 50,196,196,124,
+ 89,194,233,224,181,213,170,232,111, 4, 41,144,166,242,182, 99,143, 26,172,234, 10,171, 29, 16, 88,154, 46, 84,111,137,232,170,
+119, 65, 86,157,127,182, 42, 0, 67,177, 81,143,203,188,136, 15,120, 14,212,218,203, 86,175,143,213,188,214, 28, 42,162,129,241,
+102,235,141,154,162, 80, 54,188, 84, 39, 28,174,218, 24,172, 14,180,245, 38, 74,144, 58,126, 82, 5,148,184,219, 91,237,128,177,
+ 19,171,122, 75, 66, 67, 85,169,187,208,174, 82, 52, 25, 61,101, 5,148, 58,242, 80,182,149, 22,219,188,224, 98, 44,222,157,188,
+186,195,170,148,190, 90,203,164,238, 89, 28,227, 1,148, 73, 80, 21, 98,138, 99,236,138,133, 35, 30,116, 87, 0, 31,171, 85,115,
+178, 6, 33,224, 22,162, 39,171,163,102, 62,171, 66,204, 42,115,168,159,136, 87,244, 6,201,170, 86, 68,168, 59,102, 61, 98,215,
+ 79,206,212,202,197, 64,124, 45, 86,149, 41, 23,212,118, 24,229,255,135, 82,198, 23, 89,213,162, 20,219, 41, 57,230,185, 0, 90,
+ 79,106,180,200, 38,139,151,226, 90, 43,161,114, 32, 69,203,235, 73, 43,125,245,149, 82, 35, 90, 11,183,181,251,132,170, 33, 78,
+ 98, 32,174,204,164,182,210,151,189,115,197,149,106,151, 3,168,183, 85,197,117,127,239,222,189, 79,169, 27,156, 89, 95,212,139,
+160,123, 10, 95,216, 47, 61,229, 29, 84,253,255,247,125,202,160,216,217,116,216, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/soften.png.c b/source/blender/editors/datafiles/soften.png.c
new file mode 100644
index 00000000000..c50e3064e30
--- /dev/null
+++ b/source/blender/editors/datafiles/soften.png.c
@@ -0,0 +1,295 @@
+/* DataToC output of file <soften_png> */
+
+int datatoc_soften_png_size= 9219;
+char datatoc_soften_png[]= {
+137, 80, 78,
+ 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0, 1, 26,253,208,249, 0, 0,
+ 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,252, 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127,
+ 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7,
+ 21, 0, 4, 17,164, 74, 11,162, 0, 0, 32, 0, 73, 68, 65, 84,120,218,237,125, 89,140,101,215,117,221, 94,251,220,247,106,236,
+ 42,118,245,196,230, 32,178,217,221, 18,201, 38, 13,118,147, 26,163,216,145, 68, 82, 10,109, 1,142, 0,249,195, 70,254, 44,219,
+ 72, 34, 89,147, 53, 81,118,128, 72,137,108,231,199,209, 79,236, 68, 48, 36,216,254,136, 28, 3, 49,146, 32,202, 71, 68, 41,142,
+228, 88, 19, 5, 27, 22,155, 77,138, 33,155, 34, 37,206, 61,213,240,222,189,103,175,124,236,125,206,189,175,170, 56, 40,166,129,
+ 24,224,235, 98,117,213,235,247,238, 59,119,159, 61,174,189,246,161,200,143,251,184,252,240,225, 35, 71,174,219,249, 60, 68,228,
+163, 31,251, 68,206, 29, 68, 84, 21,170, 77,211,140,154,166, 25,141,238,254,196,199,253, 69,233,125,191,250,254,182,157,230,220,
+153, 89, 54, 51,203,150, 45,155,209,120,251,237,183,159,190,255,254, 75, 23, 47,234,116, 58,105,167,211,118,218,182, 93,219,181,
+237, 51,207,109, 92, 88,159, 76,167, 93,215,118,147,233,244, 87,126,249, 87, 70,163, 81,211,182,237,127,251,218,179,162, 80,232,
+141,215,206,207,207, 53,203, 29, 69,148, 20,205, 32,121,247,221,159, 76, 63,218,184, 10,160,144, 34, 76, 96,219, 89,206, 70,210,
+204, 22,230,148, 70,146,141, 89, 86,168, 8, 8,156, 95,111,183,166,121,218, 90,151,121, 96,239,120,218,182, 41,153,144,105,121,
+237, 24, 73, 17, 10, 73, 74,206,242,236,197,238,153, 11,221,233,135, 55,142,191,106, 33,238,110,233,178,163, 0, 69, 8, 33,129,
+105,107, 16, 10, 0,202,153, 71, 55, 78, 63,188,121,253,181,139,105,113,239,181, 66, 8, 40, 20,134,236, 40, 20, 81,184, 24,239,
+123,100,179,161,145,200,146,161, 10, 49,151,174,138,152,191,131, 64, 18,123, 73,219,149,234, 79, 11, 11,139, 87, 95,125,181, 42,
+ 54, 55, 55,183,239,221,169, 83,167,222,118,251, 29, 36, 21,128,106, 74,201, 55,238, 75, 95,250,210,215,254,215,159,197,139,222,
+247,190, 95,165, 16, 2, 85,133, 34,105, 82, 77,163,113,211, 52,163,209,104,244,201,187, 63, 33, 34, 58, 45, 27,215,118,237,185,
+243,155,207,157,223,216,220,106,219, 54, 79,167,211,201,100,242,169, 79,125, 90, 68,240,147,119,254,194,247,127,176, 5,129, 0,
+ 55, 31, 91, 92, 92, 24,173, 44,207, 47, 47,205,143, 71,105,212,232,104, 52,154,155,159, 79,211,230,136, 64,140, 92, 94,132,144,
+ 93,103,217,140,180,156,109, 60, 86, 49, 26,217,152,152,154,137,104,215,201,249,139,156,180,214,118,118,229,129,249,148,216, 78,
+ 91,107,140, 34,105,105,237, 24, 40, 34, 98,102,153,236,178, 61,245, 92,247,192,217,205,107,174,152, 83,192, 69,154,150,214,174,
+ 19, 87, 20,138,136, 76, 91,151, 47, 31,122,116,114,230,236,198,190,213,102, 97,190,193,129, 35,183, 67, 85,224, 91, 5, 8, 68,
+ 33, 72,144, 4, 77, 73,147,164,166, 49, 49, 37,125, 79, 69, 33, 4, 4, 80, 21,201, 16,161, 64,205,228,229,122, 96,248,203,251,
+ 63,240,193,165,197, 37,223, 36,255, 3,133, 66, 53, 41,128,164,233,179,159,253,157, 39,158,120, 98,247, 11,125,248,215, 62,146,
+ 45, 11, 69,140,126, 89,136, 64, 1, 81, 40, 68,160, 9,170, 10,104, 74, 73,129,148,146,106,106,154,230, 99, 31,251,200,204,133,
+254,201, 63,253,103,210,235,182, 96,240, 16, 72,206, 52, 34,165,212, 52, 58,106,154,148, 84,147,130, 72,161, 79,163, 47,124,225,
+243, 15,156, 57, 35, 34, 77, 59,157,250, 50, 32,178, 49, 49, 5,150, 22, 26, 17,153, 78,249,220,165,118,148,180, 25,165,185, 81,
+ 26,143, 71, 54,198,168, 17,205,132, 74,206, 72, 10,205,249,231,127,254, 23, 82, 74,191,241,235,159,196,225,235,127, 22, 18, 82,
+129,223,155, 34, 1, 87, 95, 62,110, 18, 70,141,142, 71, 58, 55,110,230,198,163,249,185,102, 52, 74,163, 38, 37, 21,168,206,207,
+ 37, 64,147,170,170,166, 81,147,246,172,189, 90,196, 68,132, 34,160, 9, 68,200,197, 57,180,217, 38, 83,155,182, 54,109,243,180,
+181,201,180,155,180,121, 58,237,178,229,229,197, 4,144,102,238,109, 72,154,177,161,100, 33,197,148, 32,161, 98,157,136,110, 78,
+217,118,162, 9, 73, 53, 37,140, 82, 62,191, 78, 10, 22,230,211, 91,111, 91,107,219, 22,128, 27,159, 91,160,154,225,208,177,183,
+ 11, 85, 84, 40,136,111, 66, 17,164,164,238,135,167,157,169, 40, 1, 40, 32, 0, 84, 0, 85,252,204,155,247,251,150,194,183,245,
+192,209, 59, 68, 0, 1,253,175,114, 33, 17, 21,154, 40, 32, 66, 64, 5, 20,133,170, 59, 54,104,114,129, 66, 21, 80,129, 54,102,
+ 57, 4, 45, 34,162,180,236,171,131, 24, 68,196, 64, 0, 36,125, 39, 50, 69, 85, 68,104,217,149,205, 76, 84, 5, 34, 13,105,190,
+103, 2, 21,154, 64,104, 80,208,197, 47, 4, 21, 74, 17,117,199,168,194, 44,162, 16,165,152,248,135,152, 80, 41,255,223, 61,176,
+235,179,123,247,238,189,236,178,189, 34, 50,153,108,157, 59,119,110, 99, 99,227,199,184,208,177,227,199,223,253,238,159, 3,194,
+ 49,249, 95,110,250,170,154, 82, 58,119,238,252,191,254,237,223,124,161, 11,125,236,227,159,176,108, 36,221,118,225,155,234,151,
+211,120, 36,191,152,166,102,212,124,244, 35,191,182,203,133, 62,248,161, 15,139,135, 54,250, 46,193, 85,207,183, 27, 72, 80,164,
+ 20,110, 36,169, 47, 49,157,125,244,236,239,253,238,191, 29, 94, 72,187,174,107,187,182,235,186, 46,119, 93,238, 44,119,150,187,
+156,115,238,114,206,150,173,179,220,249,191,119,109,132,156,182,107,175,186,234,170,223,252,173,223,222,126,161, 28, 95,254,102,
+127,248, 79,221,250,250,116, 99,179,157, 78,115,219,229,156,105,153,157,229,156,173,107,219,118, 58,253, 87,159,233, 69,166,150,
+179, 13, 30, 52,210, 72,179,156,243, 51,231, 39,147,105, 55,233,114,219,101,203,204,102, 38,198,204,156,187, 46, 91,151,187,174,
+235, 62,243,153,223,138,152,124,242,228, 41, 79, 38, 38,173, 77,166, 25,128,130,164,252,240,233, 45, 51,210, 92,252,213,105, 70,
+ 88,162, 16,226,233, 7,111,190,249,230,111,252,197, 95, 52,102,246,223,255,247,115, 70, 10,220, 76, 64,145,213,165,116,245,229,
+115, 77,146,174,105,178,145,116, 99,132, 80, 20, 98, 10,132, 57,139,116,221,254,125,251, 33, 72, 79,108,190,202, 72,248,174,139,
+185,179, 60,176, 55,177,247, 92,194,216, 82, 33,195,151,165, 52,179,247,119,220,121,103, 90,222,255, 26,132,197, 81, 68, 0, 33,
+ 57, 63,214, 28, 34, 17,146,164,248,251,253,202, 73,165, 73, 26, 1,131, 34, 0,201,180,103,223,107, 36,174, 84,174, 71, 25, 53,
+200, 20, 95, 20, 41,241,157,102, 38, 43,203,163,241, 72, 69, 6,239, 32, 69,208, 24, 51, 4, 16, 10, 33, 74, 35, 64,153,182, 89,
+ 51, 44, 33, 39,100, 99, 54,205,198,181,213,197,189, 43, 35,192,114, 22, 0, 74, 16,245,166,187,180,103,237,184,212,120,228, 73,
+ 27,160,138,114, 59,160,200,230,196,158,124, 46, 63,250,163,233,209,171, 22,194, 3, 70, 10,136,106,103,105,105,223, 49,146, 2,
+169,139,242, 29, 50, 19, 33, 77,184,190,101,147, 73,152,225,131,103, 55,158, 62,223, 94,117,112,236,142,143, 68, 53,252,180,180,
+247,168,167, 34,101, 85, 20,250, 39,209,132,211,214, 60,146,187,199,132, 96, 99, 98, 15, 60,178,185,178,167, 89, 90,212,184, 6,
+124, 69,107, 71, 25, 11,173, 81, 91, 40,160,208, 50, 41,162,238,228,125,217,126, 77,224,177,167,166,103, 30,217, 56,119,177,187,
+250,208, 28, 93, 99, 15, 94,119,167,192, 95,143,186, 48, 82,225, 55, 11,245, 24, 82,146, 93,133,170,136, 64, 84, 0, 81, 64, 84,
+ 84, 33,170, 20,163, 80,196, 92, 34,229, 22, 60, 59, 33, 93, 84,140, 77, 22, 26,105, 34,164,152,144, 98, 20, 33, 76, 32,108,132,
+ 20,122, 80, 51,191, 99,115,231, 72,128, 20,136,199, 8,191,201, 80, 62, 66, 64, 42, 61, 59,164,146, 34,101, 69,112, 5,246, 0,
+ 36, 48, 10,205,224, 27, 67,243, 85, 48, 86, 45, 48, 17,129, 9, 45,116, 29, 20,117,107, 54, 26,133, 66, 51, 19,138,185,174,131,
+230, 31, 80,150, 81, 22, 31, 57, 7, 75, 6, 83,214,240,202,227,199,143,179,245,113,221,117, 71,111,188,241,198, 35, 71,143,174,
+237,221,219, 63, 27,206, 84,224,201,115,252,165,231,206,157, 59,115,230,254,191,250,171,191,252,254,247,191,255,242, 44,104,121,
+121,249,221,239,254,185,195,135,175, 48,179, 65, 49,200,222,195,196, 31,145, 62,174,247, 15,237,127, 82,133, 10,164, 25,141,254,
+227, 23,191,248,173,111,125,243,165, 43, 7,222,249,206,119,222,120,227, 9, 51, 70, 97, 91, 77,106,118,201,240,220,177, 46,165,
+252, 48,187, 36, 47, 56,250,101,149,133,170,170,118,185,251,119,191,247,187,143, 62,250,232,139, 44,232,253, 31,248,144,199,186,
+157, 75,169,158,105,240,103,102, 53,210,151, 25,131,133, 72,191,148,193, 74, 5, 64, 74, 13,128,212,164,127,254, 27,191,190,181,
+181,181,251,130,222,251,222,247,177,134, 21,238, 92,205,204,114,234,142,213, 31, 73,201, 38,238,217,160,240,196, 93,213,215, 84,
+ 50, 44,137,228,188, 60, 15, 85,109, 82,243,185,207,253,251, 7, 31,124, 96,123, 69,127,235,109,183,209,108, 88, 81,196, 67, 88,
+ 34,181,244,207,212,103,141, 27, 91,237,230, 36,183,157, 67, 47, 30,198, 5,245,190, 64, 33,132,130,192, 25,104, 70,186,111,165,
+121,156,189,229,228,201, 59,239,124,251,131, 15, 60,112,254,252,249, 94, 4,191,244, 75,191,252,124,234,174, 2,122,149,172, 12,
+215, 79, 0,184,180,217,110, 77,204,149, 36, 37, 77, 0, 18, 26,213,164,154, 26, 85,213,212, 36, 5,146, 71, 5,136, 2, 36, 85,
+ 19, 73, 40, 84,144,146, 23, 50, 33,174,241,104,252,209,143, 70, 62,138, 95,124,207,123,194,140, 32,143, 63, 57, 57,251,196,244,
+252,165,174,235,216, 7, 74, 96,126,164,123, 87,154, 99, 87, 45,172,173,142,126,248,212, 86,155,153, 20, 80, 36, 69, 82,168,106,
+ 74,154,146, 54, 73, 83, 74, 77,210,212,120, 42, 13,255,120,244, 8,128, 0, 80, 21, 29, 42, 89, 36,203,233, 15,255,240, 15, 78,
+159,190, 15,239,124,215, 63,254,214,125,151,138,186,178,151,143,203, 93, 5, 68, 9,191,184,124,127,179,188,224,133, 54, 18,160,
+ 10, 85, 52, 73, 83,210,164,104,154,148, 26,109,146, 54, 41,249, 51, 0, 82, 42, 25,191,132, 54,141,155, 84,205, 86,195, 91,168,
+ 11,250,171, 95,189, 39, 93,146, 35, 40, 38, 86,151, 18,209, 93, 60,197,136, 36,126,110,140,197,121, 53, 99,151,153, 59,118,102,
+217,152, 77,114,166, 25,179,209,140,185, 51,163,228,128,243,152,205, 51,101,127,129, 37,148,252,142, 81, 81,114,144,210, 10,121,
+205,181, 71,154,240, 61,144,178, 6,235,141, 59,220,153,175, 10,163,134, 91,147,172,136,236, 65,161, 73, 69,213,146,162, 73, 72,
+ 85, 78, 93,110, 84, 53,105,211,104,108,168,202,226,252,104,110,156, 4,204, 57, 23,255, 1,150, 77,171,133, 41,200, 70,104, 1,
+181, 49,178, 33,170, 69, 10, 34,162, 70,150,140, 43,119,152,210, 0, 7,207,160,176, 4,209,228,182, 44, 77,210,164,101, 89,201,
+ 82,210,185,145,238, 93, 29, 47,205, 39, 85, 8,196,204, 4, 94,204,122,130, 95, 66,142,239,158,131,114,100, 83,178, 14, 23,146,
+ 1, 16, 66,188,168, 38, 8,136, 24, 41, 20,116,217, 19, 63, 0, 97, 98, 10,209, 76, 87,148,182, 99, 74,128,216,198,132,235,155,
+188,246,202,133, 35, 87,204,139,192,204,235, 8, 20,223, 69, 80,188,224, 87, 81,211, 44, 46, 34, 17, 16, 10,226,224,241,187,224,
+239,112, 16, 13,190,180,146,214,134,113,144,148,166,209,222, 82,194,217,137, 70,116,149, 73, 39,211, 41,161, 21, 43, 13,227,122,
+195, 77, 43,251,247,142,252, 77,226,213,141,215, 45, 80,117, 93,175,126,211, 21,252,208,177,127, 24, 80,170, 95,133,116,253, 31,
+232, 56, 4,164,136,214,146, 20, 21, 40, 35,136,105,166, 24, 68,189,254,169,193, 69, 3, 61,130,250,197,143, 95,189,112,227,145,
+ 37, 99, 93,211, 32,166,244,145, 71,113,240,216,157,116, 48,165,186, 35,178, 44, 46,254, 43, 6, 17, 98, 44, 82,147,108, 37,190,
+ 80,168,241, 58,129,246,181, 94,252, 0, 33, 74, 21, 0, 85,156,124,245,242,225, 3,115, 73,181, 42,120, 31, 92, 14, 30,189, 83,
+ 2,223,113, 69,175,117, 81,236, 32,197, 1, 22, 1, 40, 18, 90, 40,102,230,203,117,207,224,249, 59, 29,108,114,104, 90, 41, 5,
+ 87,243,116,159,177,101, 66, 45, 79, 67, 32, 73, 49,110,116,109,117,124,229,193,185,181,149, 17, 14, 28,185,131,110,128, 1,137,
+ 35, 62, 7,253, 26,203, 14, 98, 80,218,133,248, 74,124,161, 80,189,140, 10,208,169, 36,243,174,149, 17,100,189,226, 40,235,118,
+128,132,244,127, 85,223, 31, 45, 6,101, 20,207,202, 76, 72, 72,148,120, 94, 46, 8, 35, 48, 70, 26,110, 20, 18, 52, 65,201,251,
+107,167,192, 34,148,130, 36, 60,139, 55,175,137, 25,254,197,136,210, 84, 16, 15,200, 14, 0,196, 21,154,112,203,129,151,249,109,
+151,130,223,229, 64,161,131, 4, 37,182, 24, 74,145, 72,129, 68,157, 67,250, 78, 16, 20, 19,243,212, 4,162, 22, 85,135, 66,196,
+204,160, 40, 8,155,134, 81,251,158,144, 16,161, 74, 35, 14,203, 41, 40, 70, 81,152,245,134, 34,180,208,174,112,166,161,181,225,
+249, 99,211,132, 14,229,105, 84,117, 40, 73, 72,241, 58,238,225,162, 56, 37,232, 57,132, 24, 1,136, 10,233, 86, 74,245, 50,205,
+ 72, 23, 90,236, 66,228, 61,190, 11,168,161,204,104, 20,199,108,232,226,245, 4,147,244, 93,144, 40, 52,125,115, 67,186,230, 40,
+175, 21,199, 47, 34, 98,190,199, 34,131,141, 11, 17,239,146, 33,190,242,120,229,241,114, 87,174,245,209,140,154,197,133,197,241,
+120, 60, 63,191, 48, 26,141,252,201,174,107,183,182, 38,147,201,214,250,250,122,206,249,111,125, 65,163,209,232,150, 91, 78, 94,
+127,195, 13,215,188,234,154,212, 20, 76,144, 16, 13, 59, 43, 37, 15, 84,149,228, 67, 15, 61,116,223,247,254,250,219,223,254,246,
+212, 27, 60, 47,227,130,126,250,103,222,121,226,196,137, 81, 51, 98, 69, 32,135,144,221,108,229, 88, 43,124, 17, 73, 41, 65, 49,
+157, 78,239,253,206,119,254,244, 79,255,211,223,104, 65, 77,211,156, 56,113,226,174,187,126,154, 53,119, 29, 38,218,165,164, 31,
+ 86,248,179,149,253,108,105, 15,168,234,133, 11, 23, 62,251,111,126,103,125,125,253,199, 91,208,218,218,218, 93,119,221,117,197,
+ 21, 87, 57,102, 52,200,166, 7, 47, 26, 22,246,131,239,207,187, 38,207, 78, 69, 82,147,158,124,226,137, 47,124,254,243,207, 62,
+251,236, 75, 90,208,123,223,251,222,133,133,165,226, 62,183, 87,248,125, 37,223, 23,209, 67, 41,149, 28,203, 11,103, 25, 2, 12,
+195,205, 68, 74,233,204,253,103,126,255,247, 63,247,226,205,241,191,255,147, 63,101,217, 40,204,204,181,106, 46, 49,161, 0,125,
+164,136, 88, 68,146,248, 37, 66,108, 20, 48, 37,126, 5, 56, 91,130, 11,226, 5, 34,178,111,223,190,183,191,227, 29, 95,255,243,
+175,183, 47,168,242,233,245,175,127,131,131,219,178,163,186, 47,229,124, 21, 89,169,243,133,219,192,137,231, 13, 65,229,141, 86,
+ 52,225, 31,252,212, 91,154,209,104, 39,198,208, 47,232,117,175,127,253,236, 7, 15,190,200, 29,118,200,157, 63,198, 75, 77, 6,
+146,173,225, 55, 74,193, 42, 90, 10,143, 92,123,228,250, 27,110,248,230, 55,190,241, 60, 11,122,221,235,226,205,213,178,234, 23,
+158, 7,164,233,209, 53,118,153, 57, 23,217, 86, 64,169, 20, 94,158,107,197,101,226,111,138,112,117,101,245, 45,111,121,235,151,
+191,252, 63,118, 46, 72,163, 39, 52,219, 27,218,214, 39, 50,198,207,185,127,210,186,156, 55,183,186,233, 52,119,217, 58,231, 54,
+ 88,124,209, 60,251,244, 86,144,191,139,150, 89,175,144, 45, 11,228, 95,124,234,211,187, 44,136,209,152,122,193,135, 13,218, 48,
+ 52, 10,219,206,214, 55,186,182,179, 46, 71,245,238,119, 68, 95,188,103, 70,129,189, 83,224,159,145,189,159, 29,181, 62,169,170,
+ 31,251,248, 39,182,111,217,109,183,222,182,187, 78,162,119,205,131,239, 16,145,182,181,245,205,174,234, 74,239,169, 36, 72, 23,
+ 24,120, 10,175, 88, 89,160, 43,148, 30,191, 95,125,126,110,254,200,117,215,221,251,157,239,244, 11, 58,117,234,214, 93,133, 82,
+ 47,226,168,123, 32,240, 68,206, 60,127,113,106, 21,194,175, 64,197, 16,125, 44, 69, 84,173,174, 74,182, 61, 72, 10,163,250,227,
+218,222,181, 11, 23, 46, 60,254,248,227,117,203, 6,139, 40,216,219,214, 52,111,108,230,141,173,188, 53,205, 82,114, 86,135,242,
+158,187, 48,157,180,214,101,118,217,114,203,174,179,174, 99, 54,118, 57, 7, 34,147,141, 38,217, 72, 19,154, 89,150,210,111, 11,
+101,100,209, 18,203,153,102, 70,251, 71,239,122,215,226,226, 98, 68,176,210,159,146,173,169, 61,248,232,214,211,231,219,245,205,
+ 92, 34, 24, 68, 36,169, 46, 47,232,225, 3,115,199,174, 94,216,154,116,151, 54, 91, 0, 89, 37,169,154, 90, 42,247, 77,170, 16,
+210, 72, 3,116,176, 70,212,148,222,198,143,226,206, 27, 74,240, 70, 61, 69, 96,162, 98,166, 34, 29,249,129, 15,126,232, 95,126,
+250, 83, 34,146, 78,158, 58,181,185,101, 95,251,203, 11, 15,156,221, 60,119,169,109, 59,235, 75,119,208,107,221, 73,107,207,156,
+207, 15, 61,186, 41, 66,213,222,141, 15,252,113,175, 26, 1, 90, 68,169, 89, 94, 84, 42,135,158, 0, 81, 52,207, 81,131,102, 52,
+186,116,233,210,227,143, 63,150,166,163,163,247, 61,188,209,101,194,235,102, 68, 99, 76,122,176, 42, 42,154,185, 49, 86,151,213,
+171, 69,233, 81,217,242,129,210, 55,244, 2, 30,100, 56,104,171,120, 60,153,146, 12, 56, 99, 97, 38, 14, 42,220,120,226,196, 61,
+ 95,254,114,106,246,188, 38,218,195, 33,217,114, 57, 12,234, 42, 8,132,123, 22,116,220,232,246,166,238,208,117, 22,189, 46,170,
+139,178,142,120, 78,129,148, 48, 40,199,103,214, 68,227,202,234, 74, 90, 57,240, 26, 9,112,173,116, 76,163,137,141, 64,145, 28,
+253, 4,247, 44, 36, 65,173,198, 74,109, 45,131, 44, 65,182, 55,118, 67, 70,101, 73,125,235, 23, 51,254,165,246, 8,174,190,250,
+ 85,105,121,255,245,126, 71, 5,113, 17,128,142,246,244,226, 20, 81,112, 97, 78, 75,152,236, 87, 35, 97,202, 14, 45, 49,234,122,
+ 25,134,199, 8, 42, 11, 99, 13, 40, 81,122, 52, 44,150, 30, 62, 3, 2, 73,123,246,191, 38, 10,244, 2,192,162,215,134,192, 99,
+ 0, 38,213,241, 56,170,217,232,110, 74,191,113,181, 8, 29,108, 89,169, 73, 73, 85, 89,156,119, 50, 16, 95,160,137,225,202,215,
+148,221,118,102, 83,129, 17,104,131, 52,218, 28, 19,200,153, 68,144,121, 18, 73, 66, 9,243, 47,133, 81,163,103, 96,108, 72, 51,
+ 53, 35,147, 46, 47, 52, 75,139,141, 2,102,172,208, 23,134,105, 3, 5, 74,154,121,131,182,113, 50, 26, 74,120,119, 36,195, 66,
+134,132,177,154, 77,206, 98, 48,117,176,144, 52, 83, 77,146, 40, 52, 97,114,252, 6,102,194, 6,164,176,225,252,184,185,108,101,
+ 52, 26,121, 3,216, 42, 40,196, 30, 62,170,229, 62,181,108, 71, 90,222,119, 60, 80, 5,103,102, 4,244, 90,244, 59, 16, 82, 81,
+138, 38,225, 76,147, 26, 61,198, 61, 32, 53, 24,101,105, 33, 29,220, 55,183,178, 52,210,190, 61,240,188,237,175,254,173,128,136,
+ 52,225,155, 40,132,133,154,161,207, 87,171,232, 50,232, 52, 87, 15, 78, 84,144,166, 26,216,147, 38, 53, 19, 35, 55, 51, 46,110,
+116, 63,124,186, 91, 91, 29,153,169, 67, 71,168, 61,201,112,115,142, 5,237, 88,147,115, 66,150,246,189, 26, 40,254,208, 1,215,
+138,232, 73,129, 16, 5, 42, 65,163,172,142,163, 15,146,140, 6,247,197, 13,187,184, 97,150,165, 51, 62,252,248,100,110,132,213,
+229,102,155,234,114,214,228, 41,197, 15, 23,111,144,150,246, 30, 43, 73, 94,241,136,225, 15, 3,188,174,153, 99,208,112, 66,242,
+ 24, 22, 75, 93,230,133, 13,107, 59,127, 62,118,245,137,103,219, 39,159,107,175, 60, 56,174,139,161,204, 42,115, 85,110,246, 78,
+ 53, 45,239, 59, 30,182, 77,214, 82, 48, 18, 33, 22, 56, 79, 10, 93,194,183,151,149,199, 33, 16,180,153,155, 91,174, 84, 14,115,
+151,168, 3,108, 78,237,129, 71, 55,151, 22,210,234, 82, 34,135,124,176, 65,205, 89,158,243,159,210,242,218,113, 9,104, 31,225,
+103, 2,241,166, 64, 80,129, 69,176,242,101,189,190,247,245,116,217,166, 93,112,158, 29,211, 46,184, 45, 66,140,192,143,158,158,
+254,224,169,201,225,125,227,166,209,153, 96, 33,156,205, 3, 5, 34,105,121,239,177,242,179,183, 92, 52, 36, 16, 30,189,196,192,
+ 88, 39,138, 91, 6, 69,114,199, 46,135,143, 6, 5,234,203, 41, 6,168,129,136, 82,209,182,242,208,227,155,207,158,239,174,216,
+ 63, 46,122, 16, 9, 90,229,192,120, 31, 37, 45,174, 29,173,245, 64,233, 66, 80,226,202,126,223,101,255, 28,204,142,142,140,152,
+ 49, 59,173, 58, 0,145, 2,173,178,230,175,145, 60,132,179, 23,217,220,202,103,206,110, 94, 88,207,151,173, 52,227, 70,139,209,
+245, 70, 15, 32, 45,175, 29, 11, 58, 78,224,172, 82,228,222, 35,173,172, 44, 76,169,248,188,100,227, 0,107, 47, 66,101,237,181,
+ 97, 38, 69,138, 76, 66, 32,114,105,203, 30,250,193,214, 35, 63,218, 50,147,149,165, 52,106,180, 87,233, 97,107,161,160,181, 85,
+ 11,100,128,216,135,202, 74,208,126,196,156,142, 37, 34, 84,150, 60, 78,252,167,248, 13,244,134,143, 95, 4, 80,138, 64,251, 69,
+ 71,131, 78, 27,197,194,124,186,234,224,252,193,181,241,158,165, 6, 7,142,222, 81, 57, 81,145,147,123,191,134,165, 39,211,155,
+168, 72,165, 53, 5,133, 22,197,179,160,118, 97,164,231, 45,213,190,151,247, 5,161,197, 30,130,205,234,111,246, 54, 72,109, 80,
+213,252,190, 56,236,248,192, 48,247,168,177,234, 78,155, 72, 22,113,104,219,127,157, 9,240,132, 63,231, 77, 10, 43,153, 35, 41,
+ 2,231, 22, 5, 91, 43,146,151,240,190, 66,130, 16,138, 80, 49, 68,176, 93, 24, 65,208,179,178,186,120,166,172, 44, 58, 10, 2,
+111, 91,176, 39, 14, 4, 14, 82,156,103,100, 72,126, 97, 99,216,158, 12,111, 59,140,201, 85,145, 81, 6, 73,244, 95,156, 19, 85,
+224,123,212, 14, 12, 34, 39, 25, 66,247,197,141,153,183,103,100,104, 48,238,229,139,172, 10,254,229,138,205,190,100,172, 9, 57,
+ 2,144,240,196, 78,163, 9,236,172,177,200,188,188,181, 26, 20, 73,113, 10, 87,108, 94,168, 55, 35, 73,243,106,148,181, 91, 32,
+194,232,188,148, 44,170,190,195,162,123, 67, 68, 55,163,255,103,167,151,185,144,148,168,121,129, 91, 46,197,170, 56, 41, 98,254,
+193,189,225,211, 34,147, 6,197,172,212,173,125, 89,132,210, 49, 21,235,201, 31,194,210, 40, 5,165,250, 50,175,133,221, 75,149,
+136,229, 9,132,153,235,111,196, 77,138,149, 73,149,112,214, 38,198,248,146,162,169,241, 97, 21,147,132, 4, 44,229,111, 46,254,
+158,180,112, 64, 22,120, 19,136, 94,103,195,105, 71,217, 4,211, 90,176, 88, 4, 69,127,151,149,254,142,245,153, 1,106,153, 22,
+ 77,186, 40,239,195,213, 88, 8,161,202,200, 5,236,214, 31,254,155,102,181, 42, 96,209,123,239, 33, 69,212,212,200, 9, 44,172,
+206, 4,168,243, 31, 96,124, 42, 11,117,113,128, 18,151, 68,165, 22,176, 8, 87, 16,194, 29, 48, 38, 36, 82,166,194,140, 23, 41,
+253,189, 72,100, 16,221, 91, 8, 84,130, 31,233, 59, 45, 16,179, 82, 56,122, 1, 30, 54,103,176,194,182,172, 69, 71, 49,183, 96,
+ 93, 74,161, 39, 19, 65,185,116, 7, 83,118,184, 84, 62,197,168,132,219, 74,180, 87, 26,102,175, 60, 94,121,188,242,248,187,210,
+111,125,161, 75, 0,203,123,246,172,236,217,179,180,180,188,122,217,234,218,222,181,213,203, 46, 91, 93, 89, 89, 92, 90, 94, 90,
+ 90, 24,143,231, 60, 11,148, 25,192, 76,106,214,217,117,221,230,230,198,133,139, 23, 46, 94,188,244,228,147, 79, 92,186,120,233,
+252,133,243, 23, 47, 92, 56,119,238,220,197,139, 23,255,238, 9,104,113,113,241,216,241, 87, 95,121,229,149,135, 14, 30, 92, 93,
+189,108,113,105,177,105,154, 29,120,222, 0,168,219,241, 33,219,168,180, 3,122,111,143, 88,213, 71,215,117, 27,235, 27,231, 47,
+156,127,252,241,199,206,220,127,255, 3,103,206,116, 47, 83,231,251,101, 19,208,193,131, 7, 79,158, 58,117,211, 77, 63, 49, 55,
+ 55,142, 25,131,151, 16,252, 80,193, 3,200, 0,151,138, 95, 43,199, 13, 81,168, 23,246,222, 64, 82, 69, 94, 40,125,211,200,185,
+157,165,122,246,236, 35, 95,185,231,158,211,167,239,179,151,113, 42,245,165, 8,104,121,121,249,208,161, 67, 55,223,252, 19,199,
+142, 29,215, 38, 41,148,181, 49, 60,192,185,182,201, 8,187, 42, 77, 63,107, 50, 3, 95, 99,182,225,254,188,223,103,167,230, 80,
+201,133,131, 22,131,119,225,159,123,238,185, 63,251,159, 95, 61,125,250,244, 51,207, 60,243,183, 34,160,131, 7, 15,158, 56,113,
+226,200,145, 35, 7, 15, 29,202,217, 80,144,230,153, 22,146,188,144,218, 96,134,154, 62, 3,205,207,160,189, 51, 77, 53,217,133,
+ 72,191,131, 12,240, 98, 79,162,112, 21, 85,147,138,224,236, 35, 15,127,235,155,223,188,247,187,247,182,109,251,242, 8,232,238,
+187,239,158, 76,219,153,142,238, 16, 37,125, 17,201,204, 82, 30,134,119,187,237,201, 93, 94,182,141,182,241, 2,170,180,141,186,
+ 48, 52,195,106,125,195,201, 74, 0,152,108, 77,190,242,149,123,238,185,231,203,127, 83, 1,125,240, 67, 31, 30,212,217,124,126,
+125,217,225,121,134, 52,153, 89,185, 12,155,169, 59, 84,105,214, 8,119,240, 90,250, 17,141,109, 76,142, 23, 87,177,242,199,199,
+ 38,162,231,152,218,182,253,163, 63,250,131,211,167, 79,255,191,205, 63, 5,157,161,140, 52,176,178,247,100,251,215, 14,145,113,
+155,208,134, 74,183,141, 98, 49,108,248, 14,245,116,160,161, 67,234,253, 96,218,165,194,254, 28, 60, 63,216,198, 97,155,169,212,
+240, 78,167,177,248, 85, 85,111,185,229,228, 29,119,220,121,248,240, 21,143, 61,246,131,157,103, 61,188, 8,159,140,102,220,113,
+143,187,247, 31,118,181, 44,238,248,109,248, 36,119,125,182, 52, 74, 11, 0, 99,180, 40,234, 75,224,211, 25,107, 42, 12,128,120,
+178, 64,113,206, 24, 45, 35, 63,222, 98, 10, 4, 51, 51, 71,207,209, 59, 55,154,145,111,184,241,134, 19, 55,221,120,225,194,165,
+ 63,254,226,127,120,224,129, 51, 47, 85,131,110,123,237,235, 88, 6, 80, 75, 67,119,200,182,216,241, 68, 45,172,235,110,178,239,
+ 36,114,216, 10,158,189, 70,255,100,129,252,114,102,155,205,231,148,131,155, 49,104,251, 13,251,129, 40,205, 11, 72,143, 93,248,
+173, 71, 55,211,138,120, 29, 38,148, 94,179,134, 91, 76,227,120, 52, 58,117,234,214,183,190,237,246,179,103, 31,121, 41, 60,175,
+244,218,219, 94, 59, 52,142, 98, 55, 3,210,208,144,255,179, 27, 75,103,183,166,239,172, 42,114, 70, 63,115,102,219,218,180,181,
+ 54, 91,118,142,239, 80, 42,129,127, 58,141, 25,125,203,125, 24, 16, 67, 18, 61, 94, 92,219, 57, 69, 34,168, 19,237,113, 39,168,
+140, 58,111,240,202,173,183,222,250,198, 55,190,233,201, 39,159,124,250,233,167, 95, 80,131,110,123,237,110, 78,152,187,231,196,
+179,175,236,221,237, 0,228, 28, 6,244, 58,155,236,144,107,219,217,214, 52,111,181, 57,119, 78,214,137, 27,178,194, 54,151,254,
+230, 2,179,196,204, 39, 15,250,107,181,155, 83, 6, 81, 3,227, 66, 52, 73, 7,100,128, 2,163,206,222,149,101, 27,141, 70, 39,
+ 79,158,186,241,196,137,239, 63,248,224,243,249,166,116,235,109,183,245,136,116,255,181,171, 35,226,160,175, 93, 9, 96, 47,158,
+143,147,108, 59,110,108,182,155, 91,214,117,133, 19,206,225,247,248,161,206,199, 81, 6,179,114,148, 65, 91, 20,149, 93, 82,206,
+189,232,201,226,168,147, 85, 67, 60,122,232, 2,103, 56,125,142,216,218,158, 61, 43,127,239,205,111, 94, 94,218,115,255,253,167,
+119, 17,208,169, 83,183,190, 56,195,139, 5,110, 43,172,140,104,228, 13,140,178,186, 25, 14,184, 41,126,223,155,147,124,113,189,
+155,180, 57, 91,249, 87, 43,228,249, 1,247,221,141,194, 10, 18, 43, 51,163,247,101,110,170, 55, 87, 22,198, 31,139, 61, 57,162,
+ 57, 8,127,197, 15,233, 48, 60,202,160, 39,203,158,120,127,229,149, 87,190,237,109,183,127,239,123,127,125,233,210,165, 25,211,
+249,197,247,188,103, 23,107,138, 33, 2, 78,166,220,156,228,245,205,188,190,105, 91, 83,107, 91,118,214, 91, 89, 2,154,145, 46,
+140,117,113, 62, 45,204,233,194,188, 46,205,167,241, 40, 24, 29, 34,210,117,188,180,217,109,108, 89,229,178,160,212, 10,128,168,
+162,140, 4, 70,193,159,226,151, 50,241,164,253,148,167, 51,105,181,175, 54, 6, 9, 99,207,137, 99, 41,246,250,204,146,144, 84,
+ 35,221,110, 9, 84,157,139,242,143,249,250,159,127,253,191,254,151,255,220,135,249,193, 12, 34, 85,100,125,203, 30,123,106,242,
+196,179,237,230,150,181,153,189,207,155, 41,165, 42, 33, 4, 59, 34,184, 52,138,241, 88,247, 44,166, 67,107,163,185, 17, 38, 93,
+204,168, 20, 1, 65,235,156,157, 49,126, 53,168, 2, 6, 83, 81, 51, 40,212, 68, 85,148,102,208, 68,129,154,247, 30, 76, 77, 1,
+173, 45, 68, 84,154, 93,136,170,176,115,203,234, 40,128,154,198,196, 75,105, 93, 68, 6,224,237,159, 92,168,195, 38, 66,229,155,
+222,248,166, 3,251, 15,252,201,159,252,177,131, 45,233,150, 91, 78, 78,167,118,246,137,173,239,222,191,254,189,255,179,254,240,
+227, 91,207,156,111,167,173,183, 58,234, 65, 25, 69,233,163, 93, 95,187, 13, 46, 44,162,223, 45, 49, 97,151,185, 53,181, 54, 91,
+ 28, 88, 96,245, 0, 11,103,251, 74,182,146, 59,136,143,179,212, 3, 51,104,195,200,201,158,196, 59,120, 50, 78,196,232, 35,104,
+ 92,103, 72,106,238,109, 92, 53,232,119,125,226, 25,109, 69, 12,179,205,234,254,205,108,255,254,253, 55,221,116,211,125,247,221,
+183,181,181,149,158,154, 30,121,240,209,205,167,207,183,109,222, 70, 3,230,108, 49,197, 24, 82,234,153,116,229, 68,147, 50,234,
+ 22, 59, 70,136,200,226, 60,150, 23, 85, 81, 28,176,183, 50,135,100,213, 56,255, 67, 42,163,184,182,239,130, 53, 87,250, 40,149,
+ 46, 57,224,221, 85,254,157,231,185, 61,169,154,236,251,128, 34,226,214,217, 39,108,179,209,122, 27,123,125,192, 78,226,194,194,
+194,235,223,240,134,239,222,123, 47,174,184,225,103,119,175,204,135, 87,155, 45,175,250,180, 13,101, 10, 23,101,160, 17, 34, 34,
+163,132,213,229, 52, 55,134,150,145,191,234, 4,220, 13,233,224, 87, 45,179,195,241,171, 34,252,142, 34, 85,215,163,170, 42, 49,
+100,128, 24, 58,173, 87,219, 86,206,186,173, 41,124,206,182, 7, 51,103,144,186,250,194, 25, 92, 96,224,158, 0, 77,202,204, 70,
+184, 19,230,226,246,250,179,167,117,199, 38, 87,118, 73, 97, 78,248, 40,155,145,128,162, 73, 2, 97,206, 78,208, 15,127,131, 50,
+ 95, 8, 8, 96,131, 81, 6,170,185, 23, 16,247,201, 9, 4, 68, 85, 77, 9, 72, 82,133,250, 88,175, 40,232,210, 25,188,189,208,
+ 73,253,248, 64, 0,144,148, 52, 37,159,206,156, 77, 90, 89,137,152,195, 98, 71,250, 17,199,202, 67, 34,141,162, 73, 27,235,171,
+198,210,120,151,126, 50,173, 38, 59, 65,160, 0,203,147,232,187,239, 67,174, 24,169, 34,170,240,195, 30, 16,227,188, 61, 47, 74,
+181,232, 81,120,232, 18,206, 92,173, 8,100,203,126,152,131,153,170, 40, 96,113,176,152, 32,169,250, 0,116,141,128,113,116,134,
+ 0, 64, 22, 38, 29, 53, 50, 30,105,210,186, 95,236,241,185,114, 92,158,148,126, 51, 7, 4,202,138,115,246,195,218, 98,146,165,
+129,183, 67,119,240,191, 56,147, 4,150, 98,167, 14,223,247, 32,135, 21,137,199,120,163,167,107,217,226, 51, 81,135, 66,133,234,
+ 4, 3,176,140, 49, 51,199, 84,189,168, 87, 22, 64, 82,152,133,103, 45, 49,190,140, 95,219,204, 92,183, 42,212, 66, 88,227, 70,
+199,227, 52,110, 84, 19, 32, 50,156,232, 24, 12, 47,239,172,179,135,117, 12, 75,170, 21, 52, 34, 1, 76,165, 25, 12,163,244,249,
+ 67,229,112,212,212,223, 48, 36,136, 20, 26, 27,250, 65, 8, 47, 27,253, 67,178,149,232, 91, 6,108,193, 58, 55, 43,101,188,219,
+117,129, 57, 76, 44,244, 40, 27, 21, 8, 1,121,188,135, 66, 69,251,233, 29,113,175,212, 52, 24,143,211,252, 92,154, 27,197,193,
+ 10,197, 7,148, 92,104, 71, 10,178,131, 5,184, 67, 45, 42,104, 46, 2, 82, 5,141, 73,207,220, 30,158, 50, 80,147,140, 18,208,
+ 33, 85,100,144,170,187,133,185, 24,116,133, 96,219, 68,112,169, 76, 95, 63,251,174,146, 13,233, 51, 10,213, 58,204,157,142,133,
+127, 76, 10,243, 23,184, 92,224, 34, 67, 82,104,131,241, 40, 45, 46, 52, 11,115,169,105, 92, 44, 17, 25, 81, 82,182,186,105,165,
+176,173, 7,145, 84,203,154,253, 83,105,100,197, 19,177, 76, 94,211,114,131,210, 20, 96, 33, 45,245,202, 82,102,218,221,198,192,
+ 26,179,234, 55,147,194,102,100,145, 60, 69,204, 25,113,197,147, 69, 34, 87,168,124,133, 91, 75, 56,211, 23,225, 98,172,120, 73,
+ 11,159, 77,104,148,235,109, 38, 5, 7,247,206, 29,218, 55, 55, 55, 6,203, 38, 90,112,171,170,239,221, 85, 55,250,144,190, 43,
+126, 85, 57, 11,181,226, 7,251,131,178,112,249,171,239,218, 94,111,178,175,193,217,179,250,235,223,196,204,203, 48,168,180,133,
+148,164,210,164, 20, 28,155, 30,247, 26, 56,203,218,146,168, 3, 49,129,135, 73,153,245, 15,102, 77,219,201,164,181, 46,163,226,
+ 20,154,176,111,101,116,252, 85,139,123, 87,154,221,128, 94,236,232,170,108,111, 44,245, 28,196, 29, 51,149, 69,225, 7, 21, 73,
+ 74, 77,161,128, 86,231, 52, 4, 21, 10, 25, 45, 48, 4, 11, 3, 41,167, 71, 48, 78,163, 43,250, 83, 90, 94,133, 46, 37,128, 9,
+ 0,115,102, 95,207,234, 15,102,153,122,205, 32, 16,228, 56, 11, 67,218,204,206,232, 69,159,243, 37, 81,142,104, 0, 96,102, 79,
+157,155, 62,249, 92,155,146, 28,222, 63,190,254,154,197,249,185, 52,136, 43,218, 35,108,206,141,162,104, 9,246, 78, 11, 3,234,
+ 25, 18, 81,187, 89,156, 59, 65,237,207, 73, 40,231, 76,229,236,116,224,237,179,144, 69,100,181, 22,100, 33,156, 73,245, 61, 12,
+151,132,254, 40,136, 97, 74, 61,152,175,171,168,134,244,192,114,120,178, 58, 20, 74, 74,215,113,107, 98,155, 83,155,182,204, 17,
+ 97,226, 38,200,254,140,152,160,105, 25, 47,172,103,167,132,102,227,194, 88, 71,105, 56,128, 87,170,121,108,195,235,156, 44, 84,
+ 15, 44,232,117,115, 48,250, 48, 59,162,122,232,248, 59, 68,234,237, 87,170, 53, 49, 76,154, 81,156,244,246,108, 27, 65, 51,236,
+ 17, 51, 68,130, 63,160, 28,207,168,187,176,156, 72,199,114,166, 34,204,216,229,194,234, 35,182,125,116, 25,240,168,113,106,166,
+251, 86, 9, 80,227, 49, 14,174,205, 93,115,249,220,190,213, 81,129, 19, 74,106,204,218, 91, 26,150,243, 59,218,224,187,156, 55,
+ 5, 28, 58,250,142, 30, 47,192, 12,223,156,210, 11, 25,168,104, 66,141,131, 50,204,147,102,174,224,131,182,229, 4,158, 97,167,
+116,208, 44,162, 0, 52,233,172,247,139,125, 88, 41,211, 93, 82,204, 75, 56, 64, 54,128,126,146, 32,106,141, 18,165,133, 73,177,
+103,169,185,246,240,252, 21, 7,130, 49, 62,184,116,239,103,130,201, 60, 91,167, 96,231,156,247,129, 99,111,175,238,191,128,120,
+197,127,246,100,255,161,188,106,252,143, 91, 17,204,180, 47, 42,255, 23, 40,131, 85,253,171,122,167,111, 66,230,242, 89, 53, 94,
+ 86, 52,130,210, 31,249, 66,214,163,169, 80, 45,111,112, 96,113,137, 29, 40,132,124,148,128, 1, 85, 57,176,119,116,228,138,133,
+181,149,166, 73,129,252,176,186,180,193,150,148,230,219,236,144,183,106, 19,140,211,202,119, 68, 95,115, 85, 98,120, 89,135,213,
+ 76,146, 53,215,134, 13,202,155,216,133, 58, 95, 91,246,216,130, 61, 41, 0,196, 1,144, 64, 66,203, 73, 47,145, 73,244, 3, 62,
+133, 9,237,185, 55, 10,234, 88, 69, 4, 1,253,163,203,140,137, 51, 24, 45,198, 79,130,200,106,242,212,179,237,147,207,182, 70,
+105,146,238,221,211,236,191,108,180,119,165, 89, 93,110,230,199,169,240,231,135, 88,127, 33,125,250,109,152, 53, 37,129, 41, 59,
+ 28,159, 51,232, 90,213,177,187, 50, 35, 35,232, 61,184, 5,107,180,202,104, 0, 85, 5, 7, 90,226,240, 28, 79,178,140,125,209,
+ 82, 56,214,131, 27, 15,224,167, 31,164, 99,156, 32, 90, 14,245,169, 3, 35, 38,253, 57,151,209,252, 41, 67, 20, 28, 22,145,126,
+182, 85, 2,104,124,230, 66,251,204,249,232,217,167,132,249,113, 90,152,211,213,229,102,101,185, 89, 93,106,150, 23,211,104,228,
+181, 74,239, 60,154,190, 97, 87,206,168, 47,252,255, 50, 68, 55, 48,113,231,214, 22,118,240, 96,230,172, 12, 47,132,252,250,233,
+240, 8,175,206,160, 21, 49,244,106, 22, 3, 79,113, 65,115, 77,213,184,234, 41, 0, 0, 3,116, 73, 68, 65, 84,163, 22, 19,129,
+184, 58,160, 15, 71,102,131,161, 97, 26,225,149, 96, 47, 14, 63, 20, 39, 34, 68, 76,251,163,223, 68,131, 21,220, 87,196,178,108,
+108,118,235, 91,120,230, 66, 23,130, 47, 38, 6,149, 20,112,129, 52, 70, 27,120, 94,148,122,196,162,112, 10,149,183,216,178,234,
+120,131,150, 61,200, 21,201,129, 37,134, 99, 48,195,204,248, 81, 57,240,183,208,195,251,249,148,240, 43, 6,243,212,107,118, 37,
+136,115,104,225,125,216, 50, 92, 49,104, 86,246, 8, 15, 81,206, 14, 2, 88, 63,187,116,127, 96,126, 4, 43, 64,175,112,216, 27,
+123, 40,176,151,241,116,177,162,169, 16, 16,139,169,148,128, 85, 15,164,171,187,238,176, 93,129,129,164, 76,238,115, 48,181,143,
+225, 28, 24,177,163, 67, 81, 57, 84,140,217,129,114,193, 80, 77, 63,226, 1,131,115,137, 37,220,205,204, 62,248,115, 54, 28,184,
+245,225,198, 58, 88,134, 24,107,240,255, 19, 64, 63,104,224,110,194,232,199,255, 17, 44,183,234,214, 10, 13, 27,136,193, 44, 54,
+253,238, 21, 41, 59, 27,188, 88, 65,109, 20, 80,172, 70,196, 2, 18, 15,143,211,171,219, 59,211,106,220,222,100, 44, 19,238,172,
+242, 43, 1,161,204, 0,120,201, 71,120,101, 41, 82, 73,230,101,167,157,223,142, 62,169, 67, 15,223, 73,204,128,214,121, 46,235,
+ 7,169, 81, 64,208,122,236, 48,122, 25,149, 32, 72, 14,103,247, 72,109, 88, 39, 32,251,140,185,244, 7, 34,122,150,132,180, 74,
+138, 21, 90, 43,254,165, 66, 12,216,193,168, 26,180,149,193, 25,241, 69, 0,173,206,190,198,172,176, 59,131, 15, 56,132, 2,148,
+244,192, 10,246, 85, 7,226,172, 2, 85,172, 29, 39,169,195,105, 84,212, 89,192,162,154,240,255,133, 0,251,137,130, 72,142, 93,
+214,245, 3, 96, 13,251,184, 94,133,135, 26,206,124,157, 22,105,135,149, 34,167,151,166,212, 67, 25,103, 12,109,166,217,223,207,
+246, 85,125,243,139, 14, 32,219,210,180,137,153,157, 26,201,165,250, 64, 45, 99, 58,125,226, 82, 42,116, 8, 2,138,194, 96, 70,
+175, 60, 3,139,161, 64, 41, 35,204, 37, 89,170,147, 8, 81,184,201, 64,203,203,148,124, 19, 97, 18,131,138,165, 32,180, 37, 52,
+133,123,160,247,166,138, 49, 85,103, 37,195, 49,162, 74, 46, 24,102,217,245, 80,203,222, 93, 21,141,159,241, 12, 14,134,232,240,
+ 84,153, 62,235, 48, 97,159,232, 87, 85,170,120, 21,100, 80,118,163, 76,241,244,177, 33,148,203,243, 79,159, 92, 43,165,112, 37,
+ 75,244, 67,149,172, 9, 96, 83,231,208, 66,129, 75, 49, 36, 5, 84,238, 51,150, 58, 64,103, 81,194,135,150,149, 36,126, 87,250,
+148, 84,119, 53,115,202, 1, 57, 60,156,188, 4,109, 31,157,114,205,178,154,195,200,224, 38, 2,183,146,130,118, 85, 91,146, 58,
+ 18, 42,125,109, 88, 71, 48, 67,109,202, 91, 81,252, 17,163,153, 87,203,154,210,201,175, 55,212, 48,172, 93,202,152, 58,130, 72,
+ 83, 75,114,151, 20, 42,131,192,234, 33, 80, 98,245, 0, 18, 86,135, 58, 3, 55,201,182,191,217,207,213, 32, 12, 99, 80,205, 50,
+132, 35,177,154, 26, 92,138,241, 91, 5,193, 77,252,127, 19, 82,231,159, 4,136,193,119, 72,127,175, 69,120, 97, 76,225,206,165,
+ 15, 87, 67, 59,235, 67, 73,196, 53, 66,208,184, 44,122, 58, 69, 28,102, 58, 60, 39,176,248, 50,179,254,184,132, 25, 73,197, 61,
+187, 5,197,240, 19,118,161,206,148, 34,168,247, 95,165,186,234, 39, 26, 7, 67,200,220,230,152,234, 73,247,126,195, 53, 17,148,
+190,198, 55, 17,141,113,193,194,174,130, 40,123, 97,133,140,226,255,129,210, 39, 45,226,179,200,210,227,176, 33,227, 70,122, 47,
+ 93, 78,237,232, 19,247, 33, 83, 62,166,125,195,113, 64, 6,163,239,213,163,247, 32,255,208,212,172, 66,144,152, 37,204,128,125,
+178, 80,245, 14,149,244,132,254,176,164, 34,247,254, 32,202,122, 40,126,137,136,213, 54, 88, 90, 60,213,253, 84,111, 84,171,221,
+ 8,130,195,151, 13,199, 97,217,175,242,255, 2,210,193, 8,215, 78, 23,231,219, 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..e374742c8da 100644
--- a/source/blender/editors/datafiles/splash.png.c
+++ b/source/blender/editors/datafiles/splash.png.c
@@ -1,6610 +1,5790 @@
/* DataToC output of file <splash_png> */
-int datatoc_splash_png_size= 211350;
+int datatoc_splash_png_size= 185087;
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, 1,115, 82, 71, 66, 0,174,206, 28,233, 0, 0, 0, 6, 98, 75, 71, 68, 0,255, 0,255, 0,255,160,189,167,
+147, 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,
+ 7, 20, 16, 36, 40,202, 81, 99, 29, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236,189,121,188, 37,215, 85,223,251,221, 67,213,153,
+238,189,221,247,222, 30, 53, 88, 82,107,178,141,144,176,101,155,196,198,208, 96, 57,196, 16, 8, 96, 36,158, 9,216,143, 73,202,
+ 64, 18, 8,207, 45,243,224, 5,243, 1,131,213, 64,204, 20,130, 5,132,151, 56,196,196,178, 33, 60,242, 1,140,228,208,198, 54,
+ 96, 27, 25,121,192,131,108,181,102,245,124,111,223,225,140, 85,123,175,247,199,222, 85,167,206,233,219,163,186, 91,131,107,233,
+115,212,247,156, 83,167,106,215,174, 93,235,183,214,111, 13, 5,181,212, 82, 75, 45,181,212, 82, 75, 45,181,212, 82, 75, 45,181,
+212, 82, 75, 45,181,212, 82, 75, 45,181,212, 82, 75, 45,181,212, 82, 75, 45,181,212, 82, 75, 45,181,212, 82, 75, 45,181,212, 82,
+ 75, 45,181,212, 82, 75, 45,181,212, 82, 75, 45,181,212, 82, 75, 45,181,212,114, 81,196, 92,228,227,169,248,106, 2,187,180,102,
+171, 8, 61, 32,139,159,215, 82, 75, 45,181,212, 82, 75, 45,207, 1, 81,128,214, 90, 93,243, 19,183,222,244,251, 15,252,226,183,
+ 29,254,204, 47,127,251,177,159,251,158,151,254, 81,106,245,205,149,109,106,169,165,150, 90,106,169,165,150,103,185,167,174,128,
+244, 95,190,238,250,183,253,226,119,190,240,141,219,179,126,103,235, 92,167,245,234,175,190,246,250,175,121,225,214, 91, 62,252,
+185,131, 7,151,215, 71, 15, 2, 82,131,123, 45,181,212, 82, 75, 45,181, 60,187, 65, 93, 3,237,175,187,178,245,250,127,180, 45,
+191,161,127,100,137,108,249, 24,121,127,200,117,215, 93, 49,255,157, 95,115,245,183,124,225,201,101,243,197,167, 86, 63, 9,244,
+107, 96,175,165,150, 90,106,169,165,150,103,183,167,222,248,232, 35,171, 7, 23, 55,165, 55,190,234,234,185, 29,146, 11,110,109,
+149,124,109,141,249,109,219,236, 27, 94,243,226,175,115, 62,191,246,195,159, 61,248,119,192,177, 26,216,107,169,165,150, 90,106,
+169,229,217, 9,234, 0, 74,132,181, 63,249,236,202, 3,135,250,110,241,181, 47,218,124, 93,211, 88,178,126, 31,119,124, 9, 26,
+109, 94,251,170, 23,191,232,198, 43, 54,237,254,224,103,158,122,100,125,144,239,175, 47, 81, 45,181,212, 82, 75, 45,181,156,185,
+247,124,177,143,215, 4, 54, 1,151,125,205, 53,179,111,250,111,111,216,245,131, 87,180,108,179,215,203,192, 24,244, 37, 87,210,
+188,252,114, 30,122,234,216,234, 29,191,190,239,231, 63,240,192,147,191, 1,172,197,223,203,179,121, 50, 69,228,102, 96, 62,190,
+221,175,148,122, 94, 27, 37, 95,110,231, 91, 75, 45,181,212, 82,131,250,198,162,129, 57, 96,251,142, 57,251,173,255,227, 77, 87,
+255,187,175,217,209,217, 49,232, 59,192,163,182, 95, 70,235, 5, 87, 49, 18,207,255,245,187, 31,249,175,191,246, 71,159,254, 73,
+224,241, 56,222,167, 13,236, 34,178, 11,216,117,134,155, 47, 43,165,238, 63,195,253,222, 11,220, 18,223,190, 69, 41,117,215,243,
+ 28,212,159, 23,231, 27,141,147, 91,162,129,114,115,229,171,251,129,253,192, 61, 74,169,229,243,112,156,233,253,115,190,215, 96,
+ 45,181,212,242,229, 45,246,105,128,178, 7,102, 23,103,146,175, 92,236,216, 69, 47, 74, 77, 88, 10, 10,148, 82, 74,138, 79, 84,
+241,121,249,173, 5,218,153,147,254,143,254,201,225, 63,251,229,111,187,252,219, 94,185,173,179,121,148, 9, 44, 31, 99,208,158,
+ 33, 89,220,206,175,222,177,251,141, 55, 95,179,253,250, 31,121,231, 95,190,249,248,250,232,195,231, 9,216,111, 5,222,126, 22,
+202, 24,224, 30,224, 62,165,212,221,245,178,121,222,176, 12,183,198,215,201, 12,188,194, 96,121,167,136,220, 29, 13,151,167, 3,
+238, 55, 3,247,158,195,239,238, 3, 94,123, 78,231,185,119,247,153,220, 43, 14, 88, 5, 14, 1,159, 2,222, 15,188, 87,237,217,
+183, 90,175,148, 90,106,121,254,131,186, 2, 84,167, 97,110,254,217,215, 93,241,115,111,184,105,219,238, 77,173, 36,245, 74, 7,
+192,214, 58,188,148, 66, 89, 51,241, 30,173, 81,198,140,223,171,240,157, 71, 73, 38,202,231,214,162, 43,251,201, 93,134,239, 43,
+222,244,218, 27,190,250, 37,215,108,125,223, 15,188,227,190,159,250,219, 7,143,252, 46, 48,228,226, 83,241,183, 2,183,138,200,
+173,192,109,231,195,115,171,229, 25,149,191, 61,203,237,111, 7,110, 17,145,219,158,135, 94,179,137, 44,197, 60,240, 66,224, 54,
+224,151,100,239,238, 31, 87,123,246,253,230, 69, 51,180,166, 12, 16,181,103, 95,157, 40, 91, 75, 45, 23,201, 83,223,186,247, 91,
+174,122,199,191,124,229,165,175, 30,245, 60,226, 21, 70,171,224,192,139, 10, 47, 52,202,171, 0,189, 2,104, 21,124,123, 47, 96,
+ 64, 41, 21,252,125, 1,163,148,178, 90,153,232, 17, 7, 80, 23, 64, 4,175, 20,195,222,136, 27,175,216,182,245,222,159,251,142,
+ 95,255,151,191,241, 23,215,190,251,127, 63,248,243,192,145,243,228,181, 23,158, 16,167,241,214,170,239,239, 21,145,215,214,192,
+254,188,145,251, 35, 19,115,191, 82,234,190,232,201,207,199,107,125,123,101, 13,236, 2,222, 35, 34, 47, 59, 79,215,254,110, 2,
+189,127, 58,121, 38,214,217,102,224, 63,201,222,221,151,171, 61,251,126,162, 94, 34,181,212,242, 60,246,212, 27,137,222,245, 79,
+ 94, 52,255,114,233,102,100,131, 33,120, 31, 64,186,100,214, 11,127, 94,141,113,215,104,244,226,182, 8,238, 30,165, 1, 31, 89,
+124, 5, 37,194,107, 31,128, 95,235, 64, 10,154,176,139,209, 48, 99, 83,154,234,255,190,231,155,126,244,229,215,239,248,202, 31,
+255,237,143,236, 25,102,238,129,243, 1,236, 74,169, 83, 82,155,209, 59,127, 59, 99,154,246,230,168,236,239,170,151,208,115, 90,
+238, 6,238,222,200,243,142,160,125, 15,112,143,136,188, 51, 94,239, 2,216,207,215,181,191,167, 48, 34, 46,150,108,228,253,202,
+222,221, 41,176, 3,120, 53,240,102,224,166,202,215, 63, 46,123,119,255,153,218,179,239, 67,245,114,169,165,150,103,191,232,115,
+248,141, 25,101,254,216,239,127,234,200, 71,149, 30,210, 73, 29,157, 22,180,155, 18, 95,126,252,119,195,211,212, 35,112, 25,170,
+209, 14, 32,239, 61,120, 79,233,149, 3, 48, 2, 63, 0,223, 7, 25, 0,195,240, 94, 70,113,123, 65,196,147, 57, 79, 62,116,252,
+232,235, 95,126,203,189,123, 95,255, 63,175,220, 62,247, 29, 17,246,245,133,156, 36,165,212, 61,132,152,102,213, 99,186,181, 94,
+ 62,207,105,121,173, 82,234,142, 51,161,210,149, 82,119, 76,121,212,119, 62,159, 38, 66,237,217, 55, 82,123,246, 61,166,246,236,
+251, 61,224,171,129, 15, 87,191, 6,254, 85,189, 92,106,169,229,249,235,169, 35,112,236,206, 63,122,228,167,254,228, 51, 71,191,
+227, 69, 59, 90, 87, 40,208, 94,196, 23, 58,192, 75,128,236,222,200,235,151,188, 96,246,197, 63,244,181,215,236,106,218,166,246,
+222,131, 49, 65, 77,120,143,140,214, 81, 70,161, 47,191, 9,189,245, 26,212,220, 14, 84,115, 14,242, 33,190,123, 4, 89, 59,128,
+ 63,242, 32,228,125, 80, 45, 4,135, 19,240,235, 35, 94,125,195, 11, 94,240,254,189,175,255,157,127,252,150, 63, 48, 15, 31, 88,
+121, 31,227,228,189, 11, 5,236,251, 69,228,158,138,199,118,243,249,216,239, 6, 25,209,247,159,167, 76,235,106,134,255, 57,149,
+155,157,143,125, 92,140,243,157, 26,231, 25,237,239, 28, 60,228,187, 25, 39, 87,206,139,200,205,207,199,140,116,181,103,223, 80,
+246,238,254, 9,224,131,149,143, 95, 85,171,202, 90,106,121,254,130,186, 3,186,192,231, 62,248,208,250, 59, 62,248,208,122,139,
+141,155,216, 44,190,238,198,109, 63,240, 29, 47,187,106,103, 91,167, 58,247, 18,168,247,193, 0, 25,118,193,117, 49,215,189, 26,
+251,178,239,198, 92,245, 15, 78, 74, 33,200,210, 35,228, 15,125, 0,247,232, 71, 80, 38, 5, 17, 68,193,168, 55,226,186, 75, 22,
+ 55,253,207,159,254,167,255,241, 53,111,126,207,210,209,149,193,255,230,252,197,216, 79, 38,231,165, 14, 59, 2,219,237,209,219,
+191,121,131,239,247, 51,166,134,151, 79,178,143,183, 87,126,123,143, 82,234,238,202,126,111,103, 42,163, 59,238,243,174, 51,201,
+222, 23,145,219,163, 55,186,235,108,199,117, 33,206,247, 20,231,122,103,220,239,124,101,243,115,206, 20, 63,141, 76, 3,248,252,
+243, 88, 47, 76, 39, 17,110,171, 85,101, 45,181, 60,127, 65,221, 3, 3, 32, 39, 52,133,137, 81,239,178,230, 93,148,226,197,119,
+125,231,117,111,125,243,238, 43,119,187, 17,140,156, 67,178, 33, 50,232, 65, 62, 4, 43, 52,190,233,199,177, 47,123,195,233, 61,
+135,133, 43, 73, 22,126, 0,189,227, 70,242,143,255, 54,104, 23, 32, 95, 41, 70,189,140, 27,175,221,185,229, 29,255, 98,247,222,
+239,125,251,159,125, 7,240,216, 5, 6,245,170, 34, 63, 39,239, 82, 68,110, 1,222,115, 26, 80,216, 21,189,194,219, 79,145,109,
+ 93,212, 86, 3,220, 23, 75,180,222,121, 10, 6, 97, 23,161, 52,235,230, 72, 39,159, 12,124,223,201,201, 67, 11,197,184,110, 21,
+145,215, 94,196,243,221,232, 92,239,125,158, 3,235,179, 73,122,103,116,173,247,238,190, 6,248,103,192,215, 3,215, 3,139, 81,
+ 47, 28, 5, 62, 75, 40,149,251,127,213,158,125,135,167,126, 39, 39,217,159,156,130, 81, 80, 83,219, 94, 5,188, 62, 30,251, 43,
+129,237, 81, 55,173, 2,143, 68, 67,229, 15,129, 63, 83,123,246, 73,125, 73,107,169, 65,125,234,126, 35, 60, 3, 61, 43,238,177,
+248,175,185, 98, 75,243, 91,222,249,134, 23,222,245,141,215,109,185,118,216,247, 56,151,193,176, 15,121, 6, 74, 80, 9, 52,190,
+253,231, 49, 55,124,115,185,179,213,254,144,247, 63,240, 8,239,255,228, 35, 44,173,247, 73,140,226, 69,151, 44,240,173, 47,187,
+134,151, 94,189, 51,236,248,242,151,163,210, 89,178, 15,255, 18,164, 54, 12, 65, 43,242,245, 33,223,243,154, 27, 94,242,223, 62,
+240,249, 31,120,255,199, 31,121, 27, 23,168,220, 45, 2,222,173, 83, 30,225,217,238,227,214, 8,112,211, 30,224,125, 21, 35,161,
+234,205,238, 98,156,105,127,255,105,140,141,247, 84, 60,235,123, 42,158,229,205, 83,227,190, 93, 68,246,159,164, 81,204,219, 55,
+ 0,244,234,190,138,177,221,188,193,121, 92,172,243,157,159, 2,244,229,202,248,118, 93,192,123,229,150,211,120,238, 79,103, 93,
+157,247,240,203,211,148,105,195,240, 83,167, 1,243,205,192, 59,128, 55,177,113, 67,171, 29,241,245, 13,192,191,151,189,187,127,
+ 10,248, 15,231, 3, 92,101,239,238,221,192, 91,128,127,116,146, 99, 23,165,122, 47, 1,126, 8,120, 64,246,238,126,163,218,179,
+239,211,181,250,175,165, 6,245,147, 24,205, 17, 68, 55,189,238,134,133, 31,189,251,182,235,247, 92, 54,211,106,245,187, 14,113,
+ 67,200,134,241, 72, 6,149,119, 73, 94,245,131, 19,128,254, 55, 95, 60,192,155,127,239, 67,236, 63,186, 70,179,145,144, 88,141,
+ 22,248,228,227, 75,188,247,175, 63,207,183,188,236,106,254,159, 91, 95, 77,187,145,160,183,191, 16,123,195,109,228,127,247,187,
+ 48,187, 29,144, 16, 68, 23,197, 79,191,241,149, 63,248,231,127,251,200,123, 69,248, 12, 33, 68,112,190, 1,253,157, 83,160,113,
+247, 89,238, 99, 87,220, 71, 33,251,129, 59, 54,136,237,222, 53,229,221, 22,199,126,217, 41,118,127,103, 5,128,239,152, 6,133,
+120,236,247, 84,148,245,157, 34, 50, 65,117, 71,202,253,246, 41,208,186,109, 42,142, 94, 29,219, 45,207,208,249,222, 89,217,223,
+ 91, 98, 18,227,244,181,186, 16,114,235, 5, 0,222, 13, 25,140, 24,142,184,135, 16,142,184,168,173,119, 99, 38,252,207, 76,125,
+252, 95, 79,177,253,174,104,100,157,169, 65,213, 1,126,145, 80, 15,255, 67,231, 97,200,127,113,150,219,127, 21,240, 17,217,187,
+123,183,218,179,239, 19, 53, 4,212, 82,131,250,198,128,126,213,143,124,195,165, 63,243,246,215, 93,249,207,172,183,244,134, 25,
+184, 17,184, 60,196,209, 21, 32, 14,181,229,114,236, 43,222, 88,254,248,139, 7,151,121,227,127,124, 63,135,251, 57,237, 78,139,
+204, 24,146,196,144, 26,133,145, 20,229,114,222,247,209, 47, 97,180,230,103,191,123,119,240,216,175,249,122,220, 23,254, 12,220,
+ 58,216, 22, 40,200, 71, 25, 47,185,122,219,142, 87,188,104,199, 55,126,244,179, 7, 63, 71, 8, 17,156,177, 23, 32, 34,119,158,
+198, 67,155, 6,176, 59,206, 33,209,234,157, 83,222,229, 73,107,157,149, 82,247, 69,122,187,240, 72,111, 22,145,219, 79, 19, 15,
+191, 79, 41,117,219, 73,246,183, 95, 68,222,194,184,155, 89, 81,131,125,207, 6, 96, 89, 0,230,134,117,248,149,177,253,237, 51,
+120,190,251, 79,182,191, 11,225,229,198,245,113,206, 6,221,105, 24,150,141,100, 87,188, 30,119,138,200, 5,111,191, 43,123,119,
+ 39,209,147,254, 26, 66, 73,219, 75, 42, 95,255, 57,240,187,167,240,208,255,124,106,110, 30,140, 94,251, 7, 8,173,157, 13,240,
+ 98,224,251,163,209, 88,164,203,252,160,236,221,253, 25,181,103,223,175, 20, 84,250,211,104, 62,227,129, 63, 3,254, 0,248, 27,
+ 2,221, 62, 0,102,129,235,128,111, 6,126, 24, 88,136,219,207, 2,239,150,189,187,111, 80,123,246,101, 53, 12,212, 82,131,250,
+ 24,208,213, 66,199,190,230, 55,110,189,250, 23,191,235,198, 45, 55, 13, 7, 48, 84, 25,248, 64,181,147,232,114, 75,201, 70,216,
+235,190, 22, 53,179,165,220,193, 91,126,239, 35,124,241,137, 21,216, 52,195,202,122, 14,202, 97, 20,180,141, 98, 75,199, 50,223,
+178,108,218, 52,195,255,252,216, 23,217,253, 21, 87,112,203, 77, 87,129,177,152, 93, 95, 75,254,192,127, 65,109,189, 18,196,227,
+149, 34,109,165,124,215,238,235,111,249,232,103, 15,254,103, 96,137,179,163,224,207,180,101,236,221,156, 67,109,113,165,183,120,
+121,234,167, 3, 31,165,212,253,177, 53,233,157, 21,227,226, 84, 96,114,199,105,246,119,159,136,220,207, 36,213, 93,140,111,186,
+ 85,234, 93,167, 26, 95,101,108,183, 63, 67,231,123,215,197,162,168,227,185,188,125,202, 75, 63, 31,160, 94,244,149,175,210,248,
+213, 30,244,229,218, 20,145, 93, 39,203,131, 56, 7, 0, 63,211,251, 98, 5,248, 13,224,167,213,158,125, 39,171, 42,249, 69,224,
+234,202,251,247, 1,223,163,246,236, 27, 76,109,247,113,224,227,178,119,247, 7, 34, 59, 81,128,245,207,200,222,221,239, 82,123,
+246, 45, 61,141, 83,250, 35, 96,143,218,179,239,193, 13,190, 59, 14,124, 12,248,152,236,221,253,155,209,171,191, 62,126,119, 29,
+240,157,192,187,107, 24,168,229,249, 36,231, 82,223, 93, 36,197,205,188,250,234,217,127,247,145,127,245, 21,239,253,174, 23, 45,
+220,212,235, 57, 28, 46, 0,186, 6,140, 66, 25,133,178, 10,101, 52,202, 42,244, 37, 55,148, 59,121,248,208,113,254,244,129,199,
+160,221, 10,101,110, 90,131, 49, 56, 52,107, 67,199,195, 71,122,236, 63,220, 35, 19,133, 55,134, 15,124,250,209,241, 0,182, 92,
+131,244, 87,129, 60,142, 70, 32,247,188,240,178,133,171,129,157, 92,184, 7,213,220, 26,189,200,179,165,120,171, 0,183,124, 22,
+160,112,223,212,177, 79, 10, 16,103, 72,211,222,127,146, 49,221, 50, 5,176,103, 50,190,123,158,161,243,221,127,177,250,239,199,
+ 16, 66,181, 87,251,242,233,140,167,211,200, 50, 33,254,123,181, 82,234,101, 74,169,219,148, 82,119, 85, 94,183, 41,165, 22,226,
+ 54, 85,163,229,246,104,120, 93, 44,249, 12,240,125,192, 79,168, 61,251,134, 39, 49, 14,174,140,219, 20,242,208, 73, 0,189,234,
+121,191, 23,248,173,202, 71,179,192,247, 62, 45,170,112,207,190,111, 59, 9,160, 79,111,119, 0,248,215, 83, 31,127, 91, 13, 1,
+181,124,185,131,122, 65,183,239,252,254,127,176,245,151,238,253,254,235,127,225,186,217,230,166,222,200,135, 78,112,146,163, 68,
+208, 30, 20, 42, 80,239, 90,135,100,117,155,162,231, 95, 80,238,232,145, 35,171,244,227,227, 86, 75, 59,161,240, 33, 98,191,248,
+227,235, 25, 95, 58,216,197,139,102,109, 48,102,201,212,108, 76,108, 29,246, 80, 58,182,155,205,115,174,218, 62,187,173,145,154,
+ 29,231, 0,234,111, 57,197,171,218,202,115, 62,122,109,247,158, 37,176,223,114, 18, 96,229,116,222,245, 6, 94,227,233,192,240,
+ 84,114, 50,224,223,117,182,251, 58, 13, 91,113, 33,207,247,162,212,134,199,235, 59, 29,243,126,203,211,169, 77, 87, 74,221, 31,
+193,123,255,105,182,187,139, 19,203,242,222,126, 17,245,194, 13, 4, 42,251, 83,178,119,247,201,214,220, 63,155,210, 31,191,122,
+ 42, 64,175,200,127,158,122,255,143, 47,226,121,125,120,234,253, 75,107, 8,168,229,249, 38,103, 67,191, 43,128,217,166,121,229,
+ 47,124,243,101,123,239,184,121,235,171, 70, 35, 24, 36,161,229,171, 56, 65,101,158, 52,213,172, 56,231, 91,104,141, 53,101, 5,
+123, 8,154,229,229,206,182,109,106, 99,210, 4,231,137,253,226, 37,130,122,252, 87, 20, 24, 77,183,151,241,232, 96, 64,227,166,
+202, 80,197,129,100,144, 15, 64,207,161,196, 35,222,179,208, 73,218,155,218,233,252,225, 81,255,172,140,149, 51,137, 89,198,184,
+234,157,140, 31,207,121, 47,167, 78, 94,171, 74, 85, 49,238,138,143, 44, 61, 23,153, 63,133, 7,248,116,228,156, 64, 56,110,123,
+243, 69, 62,223, 11, 14,234, 17,208,239,157, 58,143, 59, 46,230, 19,250, 98, 56,226, 45, 21, 48,223, 37, 34,183, 78, 39, 6,158,
+131,103,187, 81,155, 88, 13,108, 34, 36,175,125, 7, 33,254,220,140,224,254,151,178,119,247, 55,169, 61,251, 62, 56,245,179,111,
+152,122,191,239, 12,135,240,247, 27, 24, 16, 79,255,154,133,248,254,109,113, 45,127, 5,112, 41, 48,195,198, 61, 52, 10,185,180,
+134,128, 90,190, 28, 65,189, 80, 2,201, 11,183, 55,191,251,247,190,235,170,187, 94,186,173,189,173, 63,242,208,176, 1,208, 51,
+143,205, 60,105,203,240, 19, 31,120,242,147, 87,108, 78, 55,255,208,205, 91,175, 24, 8,193,147, 86, 10,178, 12,127,244, 75,232,
+203, 95, 14,192,139, 46, 93,228,171,175,221,198, 95,125,238, 8, 88, 27, 64, 92, 71, 64, 47, 34,120, 62,252,118,176,212,229,218,
+ 29, 99,253, 46,171, 79,193,112, 21, 25,110, 70,197, 39,198,136, 47,140, 2, 52, 23,128,126, 87, 74,221, 21, 91,219, 22, 74,246,
+ 76,146,215, 54, 2,167,179,121,150,251, 51, 33,203,231, 97,219,231,210,249,158, 9,160,191,229, 25,122,228,238,221, 83, 30,250,
+ 5,153,199, 24, 51, 95, 6,254, 26,248,107,217,187,251,247,128,191, 36,208,227,109,224,247,101,239,238, 23,169, 61,251,142, 87,
+126,246,162,169,221,124, 66,246,238,158,214, 25,167,250,187,180,239,159, 38,152, 43,224,199,128,159,138, 32,126, 54,210,170, 33,
+160,150, 47, 55, 80, 47,232,246,109,183,125,213,194,155,127,229,155, 46,251, 55, 59,154, 73,218,243, 10,213, 14, 6,176,140, 60,
+ 77, 47, 12, 82,248,215,127,252,232, 31,223,253,145,195,127,248, 59,183, 93,185, 71, 73,124,158,139,137,217,239, 86, 35,135, 62,
+ 83,238, 88,107,197, 79,126,251,203,248,166,207,254, 47, 24,100,208, 72,227,211,221, 34,168,123, 64, 60,172,247,120,201,139, 47,
+229,123,191,238, 43,202,223,250,195,159, 67, 36, 67,185, 81,216, 80, 4,173,132,165,245, 65,127,181, 55, 90,187,128,222,211, 93,
+177,187, 89, 33,183,114,246,153,208,251, 57,247,206,116,207,197,167,194, 61,215,206,119, 26,208,239,190,208,217,231,167, 88,111,
+203, 83,201,141,183,112, 17, 30, 34,164,246,236,123, 64,246,238,190, 11,248,217,248,209, 14,224,159, 79, 25, 24, 91,166,126,102,
+206,241,112,233,211, 28,238,175, 81,247,166,175,165,150, 51, 2,117, 5, 40,107,212,117,111,251,199,151,252,202,155,255,225,142,
+111,204,115,232, 89,141,106,104,196, 11,210,119,116,172,226,145, 97, 62,248,190,255,246,240,111,239,123,112,245,247, 0,255,216,
+ 74,118, 8, 37, 47,148,210, 83, 7,154,109,220, 35, 31,198, 46, 63,130,154,191, 18,128,215,189,228, 74,238,254, 23, 95,207,143,
+252,206,135,232, 29, 31, 66,179, 1, 70, 7, 42,126,148, 65,175,207, 75, 95,184,157,247,190,249,155,233, 52,147, 48,170,172,143,
+251,236,251, 80,105, 3,148, 3,241,136,119,160, 53, 15, 29, 60,126,100, 48,114, 71,184,112,137,114, 16, 98,206,183, 84,148,236,
+ 89,123, 95,207, 20, 72, 60, 67,242,156, 57,223,248, 52,182,105, 64,191,227, 25, 30,214, 51,101,200,253, 97, 5,212, 1,190,117,
+ 10,212,245, 51,126,189,246,238,126,237, 6,128,254, 65,224,119, 8, 97,154, 39,129,117,181,103,159,171,120,245,158, 90,106,249,
+ 50, 6,245,109,111,255,166, 75,255,227,143,253,195,237,175,233,143, 64,218, 22,149, 40, 36, 23,232, 57, 58, 45,195, 95, 60,182,
+118,232,251,222,189,255, 63, 60,122,108,248,191, 8,165,100,230, 11, 71, 7, 95, 64,171,175,195,197,204, 55,163,131, 14, 24,174,
+147,125,248, 29,164,223,242, 43,229, 65,126,232, 53, 95,193, 87, 95,179,157,223,253,192,103,249,163, 79, 60,202,129,227, 61,172,
+ 86,220,120,237, 22,190,251, 85,215,242,127,190,230,197,116, 26, 73,185,125,254,241,223, 70,142, 63, 2,141, 54,162, 34,145,144,
+ 59,104, 24,190,240,196,242,163,132,231,172, 63,219,110,220,139,238,109, 93,164,241,221,242, 28, 61,223,147, 1,250,237,207, 50,
+ 64,127, 38,229,225,169,247,211,116,251, 10,227,186,111,128,197,167, 89,154,118, 46,242, 47,166,222,191, 11,120,211, 41, 58,213,
+205,213, 42,191,150, 47,103, 80,231,242,249,116,247,247,125,229,194,107, 70, 3, 15, 51, 9, 42, 85,200, 72, 48,131,156, 70,199,
+240,174, 79, 30,251,252, 15,191,247,145, 95, 88,237,187, 15, 1,199, 8, 15,122,105,254,229, 67,107, 31, 59,176,150,125,255,150,
+118, 98,157,200,184, 8,174,213,198, 63,246,151,228, 31,249,101,236,171,126,164, 60,206,141, 87,108,225, 29,223,255,181,252,252,
+247,230, 28, 92,234,146, 38,150, 75, 22, 58, 39,140,199,125,246,143,200, 63,245, 46,104,182,131,213,161, 13,226, 60,202,121,178,
+193,144,247,125,232,161,143, 16,250,209, 95, 72, 80, 63,151,184,230, 4,200,137,200,252,179,160, 21,104, 85,246, 87,198,119, 70,
+ 79,159, 59, 69, 38,254,115,225,124,159, 75,128,126,174, 73,140, 79, 87,166,217,174,246,212,251, 7,129,234,147,152,110,228,204,
+147,229,206,151,252,195,169,247,111, 59, 77,235,217,107,106,149, 95,203,243, 93, 78, 69,161,217, 43, 23, 26,215,206, 55, 12,185,
+ 15,217,237,210,115,164, 35,135,106, 40,222,252,254,199,239,123,227,187, 30,250,177,213,190,251, 0,112, 40, 90,238, 35, 32,123,
+234,248,232, 99,239,251,220,242, 3,137, 5, 25, 56, 64, 80,154, 80,175,222,158,197,125,234,191,146,221,247,147, 72,239,232,196,
+ 1,155,137,229,202,237,155, 78, 4,244,172,143,251,232,111,144,127,232,109,168, 70,138, 50, 38,196,235,147, 6,100, 57,137,134,
+191,249,194,129,131,127,245,217, 67,247, 17,122,191, 95, 16, 80,159,122,196,231,217, 40,217,233,242,175,219,159,101,235,160, 58,
+190,249,216,182,245, 92,189,244,231,194,249, 62, 39, 0, 61,182,238,157, 54,190, 46,150, 92, 53,245,254,216,212,251,233,108,248,
+219,206,195, 49, 39,238,219, 72,151,159, 74,182,158,229,252,124, 99,173,242,107,249,114, 6,117,243,217, 67,253, 7,159, 24,185,
+188,221, 54,180, 51, 71,219,192,186,241,242, 61,239,217,255,238, 95,188,247,192, 91,129, 79, 18,158,192,212, 37,244, 91, 47, 30,
+244,114,232, 87, 62,120,232,158,149,204, 97, 51, 7,153, 15, 89,115,177, 41, 13,157, 89,252, 67,127,202,232,125,111,196,253,253,
+251,144,213, 39, 55, 86,106,221, 35,248,135,238, 99,244,135,223, 79,254,119,191, 5,205, 38, 24, 27,154,205, 40,133,210, 9,106,
+144,129, 17,126,246,247,255,238, 15,129, 47,197,227,159,119, 80,175,212, 45, 87,229,140,202,139, 98, 25, 82, 85,225,220,121, 26,
+ 79,247, 98,203, 61, 76,198,110,239, 60,131,185,184,243, 57,124,190, 39, 3,244,251, 9,189, 9,206,217,232, 19,145, 59, 43,175,
+ 91,166,230,236,108,215, 91, 53,134,189,124,166,235,237, 60,201,235,167,222, 79, 63,212,229, 93, 83,239,127, 80,246,238,126,186,
+229,105,171, 83,239, 55,157,102,251,238,212,251,157, 39,157,207,189,187,103, 57,145,174,175,165,150, 47, 43, 80,231,216,122,254,
+241,239,122,247,195,119,189,231,193,227, 15,126,224, 96,239,208,175,223,127,228,254,175,249,181,207,255,244, 61,247, 47,253, 2,
+161,131,212, 49,160,207,228, 3, 84, 28,208,255,210,145,193,159,190,237,127, 31,188, 55,105, 24,100, 61, 71, 50, 15,196,242, 54,
+165,160, 61, 7,249, 10,217,135,127,142,209,251,190,155,209,255,119, 7,249,135,247,146,255,205,175,146,255,213, 47, 49,250,147,
+127,203,232,189,111, 32,187,239, 45,200,250, 35,208,217, 20,154,210, 20,182,187,215,200, 80,145, 52, 53,255,229,190, 47,124,246,
+207, 63,241,228,187, 9,212,251,121,237,229, 28, 21,245,237,132, 94,231, 55, 79, 41,217,179,201,124,175,122,127,243,132, 6, 54,
+183,156,225,241,239, 60, 77,127,250,167, 37,145, 26,175,198,189,111,137,128,119, 50,176, 57,147,199,158, 62,107,207,247, 20,128,
+254,218,167, 25, 38, 40, 30, 33, 91,188,170,235,229,102, 17,185,247, 76, 58,195,157,228,209,178, 23,175, 53,110,104, 56,243,230,
+169,143,255, 96, 98,205,236,217,247,247, 76,182, 88, 77,128, 63,149,189,187, 95,122,134,199,120,165,236,221,253,231, 83, 31, 63,
+ 58,245,254,116,251,250,252,212,251,127,115,146, 99, 89, 66,255,250,203,106,149, 95,203,243, 93, 78, 21, 83,207,128,165,191,222,
+191,246,159,255,122,255,218,189,132,154,213, 99,192, 65, 2,213,190, 30,183,153,142, 97, 21,207, 91, 63,248, 75, 31, 56,240,142,
+151, 92,222,190,234, 13, 55, 45, 94,211, 95, 29,161,230, 82,104,232,208,105, 14,129, 36, 65, 37, 73,200, 96, 63,246, 73,242,195,
+247,151,187, 83,218,130, 77,161, 51, 85,122, 42,192,200, 33,190, 69,179,145,114,255, 23, 15, 45,255,219,223,250,232,222,232,165,
+ 79, 27, 24,103,170,224,207,229, 17,144,119,156,141,146,141,189,215,239, 96,252,228,178, 2,232,238, 35,208,213,247, 79,129,195,
+ 46, 2,197, 93, 0,195, 91, 46,240, 90,184,155,201,199,160,222, 30, 65,248,238,202,216,110,137, 64, 56, 31, 61,241,101, 78, 18,
+131,127, 54,159,111, 60,175,141, 66, 2,239, 57,139,165,112,207, 57,212,174,223, 18, 13,166,253,113, 14, 54,234,253, 62,253,168,
+ 92, 8,109,128, 47, 88,178, 97,164,185,231, 8,201,112,175,103,220,124,166,144, 47,176,241, 67, 93,126,152, 16, 87, 47,168,250,
+203,128,143,202,222,221,191, 31, 89,173, 79, 68, 38,207, 17, 74,224, 94, 8,188,154,208,115,253,198, 13,246,247, 97,224,166,202,
+251,119,200,222,221,255, 54,238,103,109,131,120,249,123,129, 87, 84,222,255,152,236,221,221, 4,126, 61, 58, 29,179,241,120, 63,
+ 73,104, 20,245,191,128,127, 82,171,253, 90,190, 92, 65,221, 69,224,206, 35,136,235,248,217, 48,190, 28, 39,127,104, 74, 14,172,
+123,145, 79,255,243,223,127,248,103, 23, 59,246,109,255,232,154, 77,151, 14, 86, 70, 48,155,160,154,102, 92,191, 30, 16, 28,210,
+230,169,235,208, 4,240, 2, 67,135, 95, 29,209,218,185,157,207, 29, 88, 94,191,237,174, 15,222,181,210,205, 62, 84, 49, 50, 46,
+180,220, 31, 1,253,172,147,150,148, 82,119, 87, 26,216,204, 87, 21,253, 51,189, 16, 98, 77,244,109, 76, 62, 70,179,240, 60,167,
+101,153, 16, 67,125,251,115,245,124, 55,144,179, 13, 15,220,247, 52,142,181,139, 51,207, 51,184,251,124, 26, 56,103,241, 64,151,
+ 66, 14, 1,255,116,163,167,153,169, 61,251,150,100,239,238,215, 0,127,202,248, 65, 41, 22,248,158,248, 58, 91,249,205,200,240,
+ 20,122,233, 70, 42,143, 86,173, 52,183, 41, 58,227,253, 70,156,199,106, 2,220,191, 98,227,186,245, 3,113,219,167,106,181, 95,
+203,243, 89,244,105, 96, 52, 39,196,173,150, 9,229,106,199,129, 94,252, 92, 78,243,219, 33,176,178,218,119,251,190,253,238, 7,
+255,239,119,253,221,177,207, 55, 83, 77,178,154,225, 87, 50, 24,248,114, 47, 10,133, 82, 27,188,226,127, 56, 96,228,145,213, 28,
+181, 60,164, 53,191,153,125,251, 87, 14,126,227, 79,221,247, 83,251, 15,173,255, 65, 28, 91,143, 11,151,245,126, 95, 84,174,183,
+197, 7,113, 60,157,254,223,119, 71,175,225,110,206,172, 6,249,158,168,232, 46,120, 71,179,216,147,252,101,167, 57,214,125,132,
+199,158,222,255, 92, 63,223,139, 44, 69,188,254, 76,215,206, 61,132,112,192, 29,207, 96,229,192, 31, 3, 47, 83,123,246,125,225,
+164,215,119,207,190,135,129,151, 3,191, 74, 72,148, 61, 35,219,130,240,168,212,175,157,218,215,103, 8, 77,110,134,103,180,182,
+246,236,235, 2,175,139, 76,194,169,228, 65,224,235,227, 67, 93,106,169,229,121, 45,234, 2,239,223, 16, 74, 97,230,129,175,248,
+190, 87,110,251,193,159,121,221,165,223,122,233,166,212,230, 67, 33,183, 10,154, 6,101,117,240,220,117,101, 56, 34,224, 64,114,
+ 15, 3,135,201, 60, 73,162, 88,117,240,115, 31, 90,250,139,255,240,199, 15,189, 51,115,254,227,140, 75,233,242,231,226, 5,136,
+ 84,240,180,151,184,159,240,116,179,251,158,193,113, 21,116,120,245,153,232,247,157,225,211,224,158,115,231,251, 12, 93,247, 93,
+156,152,155,112, 63,129,110, 63, 47, 64,126, 22,158,121, 55, 26,237,159, 35, 60,147,252,191,171, 61,251, 62,119,150,199,218, 14,
+252, 31,192,107, 8, 61,221,119, 16,104,252,126,244,144,255, 62,122,222,239, 85,123,246, 61,121,138,253,236, 2,222, 72,160,206,
+175, 7, 54, 71, 61,162,166, 60,245, 98,251,118,244,194,191,147,240,236,246, 57, 2,187,248, 41,194,227, 96,127, 71,237,217,215,
+223,104, 62,206,226,153,237,181,212, 82,131,122, 5,216,155,132, 76,214, 29, 47, 88,104,124,195,237,175,222,246,109,111,186,121,
+203, 43, 46,155, 77, 18, 68, 33, 34,120,165,240,149,209,104, 1, 45, 18, 74,215, 20, 28, 27, 56,255, 63, 62,185,244,233,119,126,
+228,240, 31,127,234,241,238,159, 0, 79, 68, 37,212,127,174, 2,122, 45,181,212, 82, 75, 45,181, 60,215, 64,189, 56, 78, 10,116,
+162, 21,189, 99, 97,198,126,213, 43,174,156,121,197,119,222,180,240,242,155, 46,109,239,156,111,152, 78,199,170,212,106,165,115,
+143,244,156, 31,173,140,124,239,139,135,251, 71,238,121, 96,233, 19,127,181,127,253, 99, 79, 29, 31, 21,173, 31, 87, 9, 49,244,
+ 11, 86,147, 94, 75, 45,181,212, 82, 75, 45, 53,168,159,250, 88, 26,104, 16,168,180, 54, 33, 59,117, 1,216,222,110,232,197,166,
+213,115,137, 81,105,238, 37, 31,228,178,214, 27,186, 99, 34, 28, 38, 80,236,171,132,184,121,151,211, 39,234,213, 82, 75, 45,181,
+212, 82, 75, 13,234, 23, 17,220,147,232,189, 23, 47,203,228,147,158, 60, 33,155, 61, 35, 36,224, 12, 9, 52,123, 13,230,181,212,
+ 82, 75, 45,181,212,242, 44, 1,245,233,227, 23, 32, 95,252, 91, 5,117,169,252, 91, 3,121, 45,181,212, 82, 75, 45,181, 60,139,
+ 65,253, 84,227,169, 65,188,150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,165,
+150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,165,150, 90,
+106,169,165,150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,229, 2,137,122,229,
+ 75, 95, 5,128, 86, 26,173, 99,131, 55, 37, 40,165, 66,251, 23, 5,160, 40,222, 78,180,132, 81, 10,205,137, 93, 98,194,207, 20,
+ 74, 73,252, 50,244,148, 81,241, 95,137,191, 16, 64, 73,124, 34,139, 10, 91,137,108,180, 55, 38,126, 31,183,140,191,137, 99, 43,
+158,203, 78,248, 27, 37,148,187, 82,196,109,226,239,100,188,111, 81,234,196, 14, 60, 19,231, 24,126,139,140,199,174,202,227,171,
+184, 59,169,140, 77, 42,219,233,242, 51, 85,221, 97,156,129, 98,183,138,240,135, 16,199,172,198, 91, 78,244,227, 41,191,147,202,
+223,147, 3, 87,168,120,157,226, 53,140,115, 35, 27,158, 88,121,121,203, 99, 73,252,191, 66,197, 57, 21,170,141,254, 84, 60,109,
+ 85,206,111,252,165,146,202, 21, 26,143, 65, 16,180, 42,102, 76,161, 84,120, 42,159, 0, 94,194,211,118, 85, 28, 64,185,157,148,
+203,107,124, 92, 29,174,174,146,226, 82, 8,226,193, 35,248,248, 52,191,234,149, 52, 26, 44, 58,204, 1, 69,235, 66, 21,247, 25,
+198,132, 2, 39,227,118,134, 94,192, 40, 65, 35, 97, 93,139,224,227,162,119, 30,180, 86,152, 56, 87, 90,133,115,209,241,156,140,
+ 30,175, 63, 85,221, 70,166,231, 24, 42,179, 49, 94, 3,113, 94,203,251, 45, 94,171,241, 61,195,196, 10,211,113, 21,137, 82,232,
+184,104,164,114, 29,199, 55, 69,252,125, 92, 15, 82,189,175, 69,226,202, 12,215,163,152,119, 41,151,152,196,123,134,202,247, 97,
+108,229,182,113,224,225,251,184,173,138, 47, 1,231, 5, 29,175,173, 76,220, 33, 97, 91, 31,215,130, 82,241,111,169, 92,247, 56,
+ 33, 34, 30, 47,224,226,247, 46, 30,220, 87, 38, 68,198, 90, 1, 69,188,110,106,188,228,213,212,173, 93, 92,167,112, 77, 85,185,
+ 86,137, 99, 70,141,215, 69,248, 92, 42,107,189,178,223,120, 1,149,170,238,119,172, 23, 40, 85,170,170,220,245, 76, 14,108,234,
+186,149, 58, 73,169,241,254, 84, 85, 35,200,244,109, 92,234,210,170, 78,208,197,111,100,124,191,198, 83, 43,239, 65, 53,165, 97,
+171, 26,162,216,166,186, 40,124,188,175,125,188, 6, 34, 18,183,147,241, 34,217,160,109, 88,161,127,131,238,168,220, 9, 83, 42,
+157,241, 45, 16,214,166,200,228,148,169, 98,108, 69,155,209,226,188, 66,227,209, 66,199, 23,231, 10, 82,249, 87, 38,214,120,245,
+186,150,250,177,132, 22, 85, 30, 78,169,160,127,180, 10, 47,226, 61,175,170,227,174, 46,138,120,252,241, 24,199,227, 20, 0, 31,
+239, 27, 31,230,110,242, 34, 68,101, 32,197, 60, 73, 92, 7,106, 3,149, 63,190, 62,213,107,165,174,154,127,129, 20, 64,170,162,
+162, 26,223,172,241,164, 38, 46,146,102,252, 96,180,226,119,186,114,129,217, 8,109, 80, 24,148,174,116,125, 85, 30, 68,143, 87,
+ 53,106, 98,145,140,197,151,239, 69, 71, 69,235,125,220,206,161,226,123,165,138,166,240, 26,239,253,196,239,116, 52, 82,130, 18,
+ 14,106, 44,108, 19,206, 89,107, 93, 57,255, 0, 8, 74, 41,188, 31,131,133,209, 38, 40, 97, 29, 94,168,202, 2,213, 42, 24, 68,
+170, 0,105,141,114,213,113, 10,206,121,188, 8,206, 59,178, 60, 39,207, 61, 46,243, 40, 37,104, 29,192, 71,233,114, 37, 6,197,
+ 25,231, 85,203,216, 0, 64,105, 20, 58, 40, 28, 1,165,165, 4,202,233,249, 11,215, 82, 87, 20,208,137,215, 69, 16,156,246,227,
+ 5,161, 20, 17,170,198,227, 2,116,188, 57,124,169, 48, 44,198, 24,172,214, 24,109, 17,227, 17,113,120, 47,229, 43,203,114,148,
+214, 24, 99, 74,101,173,227, 2,157, 88,107, 18,144,218, 75, 80,224, 32,229,130, 46,230, 88,107,141, 54, 10,196, 76, 40,157,234,
+191,197, 62, 39,207, 63, 0,127,169,124, 68, 80,226,203,155,169, 80, 78,225, 26,235,248, 2,173, 65,105,202, 27,207, 59,133,199,
+131, 81,108,219,190,133,205,139, 29, 90,109,139, 18, 88, 62,118,148, 81,191,207,142,109,219,121,217,141, 47,225,239, 63,241, 73,
+ 86,142,175,210,243, 57,107,131, 17,237,217,205,116,215,186, 72,158, 97, 21,120, 60, 35,239, 16, 9,215,190,211,110, 51,236, 15,
+200,178, 12,163,198,107,220,139,224,138, 37,161, 12, 8, 97, 94,115,207, 80, 52, 63,254,239,127,134,227,171, 75, 60,248,224,253,
+124,244,175,254,134,245,227,107, 40,209,184, 44, 35,151, 28,173, 53, 54, 49,228, 46,199, 59, 79, 98, 45,136,208,176, 9, 90,107,
+ 36,119,164, 54,204,103, 38, 66, 98, 13,206,133,113, 89,107, 81, 90,145,231, 25,214, 90,156,178,188,233,135,126,152,143,127,226,
+ 1, 62,245,153,191,231,169,167, 30, 71,242, 1,155, 58, 13,102,211,132,166,181,228,249, 40,204,164, 49,228,206,145,101, 57,141,
+180,129,247, 30,231, 28, 73,195,146,185, 33,185,203,209,202, 98,173,101, 48, 24, 97,109, 18,174,163, 87, 40, 13,163,209, 16,239,
+ 61,214, 90, 70,163,209,120, 60, 74,145,101, 57,162, 44, 90,107,242, 60,143,250, 52, 92,231,145,203,163,134,210,120,231,195, 28,
+250,156, 36,177, 8,190, 92, 27,218, 24, 92,188,255,173, 49, 32,130,209, 6,239, 29, 2, 56,239, 81,218,160,181, 65,124,248, 93,
+208,179, 14,188, 96,140, 33, 77, 83, 18,171,113,121,206,112, 56,196, 24, 19, 63, 79,200,243,156, 60,207,163, 94, 81,165, 30,200,
+243, 28, 99, 76,112,134,140, 33,203, 50, 68, 64,107,131, 82, 26,173,195, 88,138,245,153,187, 17, 73,146,144,196,109,189,247,225,
+186, 21,235, 88, 41,146, 36,193,101, 25, 56, 9,231,130,138,224, 37, 78,149,197,197, 0, 0, 32, 0, 73, 68, 65, 84, 40, 13,202,
+ 22,136, 17,143,171, 64,225, 73,173, 6,239, 40,208, 71, 43,161,209, 76,241,185,195, 90, 27,206, 83,107,196, 59,140, 9, 58,181,
+ 97, 20, 90,124,137,116, 65, 63, 72,212, 15,138, 52, 77, 48, 74,130, 83,232,133, 36, 73,176,198,160,163, 97,166,148, 34, 53,150,
+ 86, 35,197,104,143,181, 96,141, 99,126,166,193,230,166,101,107,167,201,230, 52, 97,113,190, 73, 39, 81,108,154,237, 48,183, 99,
+ 17,219, 73,144, 52, 65, 6, 57,135, 31,122, 20, 59,204,152, 89,156,165,185,185,141, 51, 48, 58,186, 66,162, 83,186, 3,120,228,
+208, 10,159,248,228, 23,177, 70,115,249,246, 5,174,185,242,106, 62,254,137, 7, 72,218, 45, 46,217,182,131, 3,143, 61,204,252,
+226, 12, 91,119, 46, 98,243,156,133, 43, 47,227,200,242, 17,174,124,197, 75, 25,230, 67, 30,252,235,251,121,241,214,203, 89, 59,
+114,152,133, 43, 47, 33, 51, 9,203,143, 62, 65,203, 90,154,155,154,168,133, 54, 73,167,205,195, 95,120,148,165,161,227,248,241,
+ 30,215, 94,119, 3,159,121,112, 63, 95,248,210,227,136,164, 36,202,162,101,196,101,151, 44,208,106, 91,150, 86,214, 56,112, 96,
+153,149,117, 71,214,207,153,155,153,225,216,161,195, 52,141, 37,207,114,146,180,129,203, 50,172, 8, 9,208,177,134,217, 86, 74,
+214,239, 49,219,110,146,141,134,204,164,205,232,108, 56,172, 14,243,105,140,101,152,229,184,136,159,162, 96,224, 61,102,115,115,
+238,173, 27, 89, 85,165,235, 32, 85,111,251, 68,179,170,170,156, 39,183,153, 6,245,177,151, 52,105, 59,171,147,252, 78, 78, 60,
+ 70, 48, 61,131,130,215, 26,163, 76, 4, 32,141,210, 1,174,125,245, 36, 74, 79, 94,151, 22,143, 86, 26, 19,111,216,240,185, 2,
+165,131, 7, 83, 1, 65, 95,190,130,223,234, 37,236,219,123, 34, 56,123,156,243,184, 8, 96,225,185,240, 32, 30,196, 11, 18,191,
+ 47, 20,154, 23,143,247, 66,238,165,252,141,243, 30, 81,133,135, 94, 88,148,190, 98,213, 73,233, 29, 23, 6,149, 80, 57,175,210,
+ 2,148,177, 69, 56, 5,116,211,128, 62,222, 86,112,226,163,167, 52, 6, 60,188, 76, 58, 17, 2,136,143, 96,171, 80, 17,232,195,
+252, 23,127, 71, 59,210,251, 96,133, 74, 97, 21,251,210, 40,210,128, 81, 96,149,194, 40,131,209,186,180,124,139,151,138,107, 46,
+120, 80, 96,180, 38, 49, 26,107, 52,198,104,140, 42,128, 87, 97,180, 42, 61, 64,163, 9,239,181,194, 22,223,233,194,232, 42,140,
+ 6, 79,225,151, 22,222,143, 72,197, 5, 21,153,240,192,213,132, 67,165,240, 62, 62,136,192,123,214,214,215, 88, 95, 95,167,223,
+ 27,144, 38, 77,230,102,231, 72,147,132,209, 96, 8,185,167,221,104, 50,219,110,227,149,166, 59, 28,162,141,101,148,103, 40, 13,
+237,118,139,245, 94, 23,148, 34,203,115, 26,141, 6,121,150,129, 82,184,168,248, 4,193, 75,177, 14, 52, 40,133, 49,224,157, 3,
+209, 8,134, 93,187,174,225,149,175,254, 7,140,242, 30,159,254,228, 39, 56,240,212,147,140, 70, 35,172, 49,228, 89, 78,230, 50,
+ 68, 4,147,216,232,202,142,215,133,213, 38, 0,142,151,242,124, 61,130,177,225,190, 82, 58,120,176, 90,135,121, 87, 10,156, 40,
+174,127,209, 13,244,123, 25,107,107,125,150,150,143,147,103, 25,222,101,193, 51,246, 57,185,243,160,116, 24,187, 72,184,102,102,
+188, 15,165, 53,104,197, 40,143,224, 41,144, 59,135,243, 66,150,231,225,214,243, 14,231, 92, 52, 4, 11,112,210,104,155,144, 59,
+137,160, 43,241,158, 18,114,239,200,189, 39,207, 29,162,192,137,143,215,114, 12,124, 58, 30,223, 24, 19, 28, 0,173, 49,209,152,
+ 41, 65, 59, 94, 91,145, 48, 39,214,104,108, 92,163,217,112,132, 82, 66,195,166,116, 90, 45, 26, 73,138,120,143,143,128, 87,232,
+163, 98,188, 90,235, 96, 32, 20,198,124, 4,227,194, 16,209, 90,151, 6,150, 82,133, 19, 34, 88, 27, 12, 11,132,112,126,222,211,
+108, 54,194,117,143,227,171, 30,103,108,132,143, 57, 42,109, 76,249,185, 87, 18,239,219,112,206,225,120, 65, 75,138,119,165,145,
+109,181, 33, 77, 27, 72, 28,243,132, 91, 38,126,194,243,247, 82,208,107,145, 93, 51,134, 70,179, 65,179,221, 66, 41,141, 73, 19,
+ 76,146, 96,146, 20, 81, 42, 48, 3,198, 96, 27, 13,180,177,160,117,212,123, 14,231,250,204,205,182,153,105, 54,152,177,134,237,
+155,219, 92,117,217, 22, 58, 51, 29, 70,162, 57,124,120,149,135, 62,247, 16, 42, 27, 50,211,178,120, 55,162,211,158,227,240,129,
+ 99,184,225,128,206,226, 22,104, 52, 48,141, 38,249,241,117, 58,164, 44,182,102, 16,114,196, 38, 28, 61,186, 74, 43,105,112,201,
+182,237,100,163,140,163,107,199, 73,103,154,204, 54,155, 44, 52,218, 36,179, 13,102,118, 46,178,124,236, 8,131,149,101, 22,118,
+ 94,138, 22,195,160,187, 78,154, 26,116,106, 16,237,105, 52, 83,100, 56,228,200,218, 18, 42,181, 88,157,208,238,108,102,211,246,
+ 75, 56,120,224, 16,249, 48, 35,203,133,149,149, 46,199,151,215,216, 60,183, 9,173, 60,205,134, 97,243,230, 77,120, 7, 71,143,
+ 29,199,218, 6,206,133,107,155,143, 70,193,117,146,128, 73, 74, 5,237,222,176,134, 84, 43,172, 2,237,114,154,105, 74,154, 24,
+ 26, 70,163,196, 97,117,100, 33,141,137,108,134, 68,140, 10, 14,151, 87, 10, 51,223,216,244, 86, 20, 21, 69, 38,193, 75,175,210,
+173, 27,130,238, 52,176,107,228,148,221,218,229, 4, 74,117, 18,212,171,207,108,241, 83, 70, 70,244,192,212,248,111,165,116,197,
+235,211,104,101, 2, 48,235,138, 39, 72,161,164, 2, 24,105,109, 80,162,209,232,120, 52, 21,189,225, 56, 6, 81, 40,101, 40, 9,
+ 88,101, 34,136, 26,208, 38, 78,156, 66, 68,225,124, 4,124, 41,126, 27,141, 1, 39, 1, 0,156,224,221, 24,252,115, 39,100, 46,
+ 40, 32,231, 3,192,139, 84,168, 75, 21, 21,185,168, 73,170, 83, 84, 9, 60,126,130,224, 1, 37,227, 57,155,100, 48,228, 68,211,
+ 72, 85,104,160,146,110, 21, 92,188,222,229,239, 10,118,163, 2,234,226,203, 95,148, 52,182, 45, 12, 43, 29,120, 3, 21,141, 63,
+ 41, 65,210,163, 34,205, 29, 0,189, 48,191,198,212,180,142,199,209,209,210, 87, 58, 0,123, 1,210, 37, 80,155, 8,182,154, 96,
+ 72,148,227,144,242,111,173, 2,141,170, 10,111, 68, 23,122,167, 28, 84, 0,117, 5, 42,142, 77, 85,200, 49,188, 43,153, 1, 74,
+154, 57,222, 19,162,195,245, 34,120,217,226,133,108,148, 49,232, 14, 24,141, 50, 94,252,226, 27, 64,105,134,163, 17,131, 94,143,
+185, 86,155,134, 77,104,119, 58, 60,117,224, 48, 54,109, 96,172,165,209,108, 48,202, 51,114, 23,188,161, 44, 27, 49, 59, 59,203,
+218,250, 58,198, 24,242, 60,199, 38, 9, 78,130,209,167,208,193, 72, 68,128, 44,208,238, 42, 65,196,112,227, 75,111,228,138, 93,
+ 59,233,245,150,249,219,143,125,148, 99, 71,142,150, 74, 34,207, 70,160, 21,214, 6,111,184,122, 93, 1,172,181,193, 11,139,231,
+107,141, 65,153, 2,196, 13,185,203,112,226, 34, 37,238, 25,101, 25, 40,205,214,237, 59,152,155, 91,160, 63,200,232,246,134,228,
+121,206,104, 52, 32, 73, 19, 70,217,136, 52, 77,209,198, 96,172,141,225, 21,137,225, 31, 33,115, 35, 70, 89, 22,238,131, 60,199,
+229,130,119, 97, 46, 11,214, 44, 73, 18,114,231,130, 7, 46, 48,202, 3,224,231, 46,222, 67,121,142,247,158,204,229,225, 58,168,
+ 96, 60,122,113,129, 30, 53,193,131,209,170, 80,148, 10, 99, 76, 4, 84, 53, 97, 40, 36,105, 26,142, 43,193, 64, 48,214,150,140,
+ 93,113,245,109,152, 0, 26,209, 91,214, 42, 24, 42, 54, 9,128, 60, 28, 14,200, 37, 0,102,146, 36, 32, 50,246,168, 81,209,168,
+ 8, 58,203,218,224,201,151,172,194,104, 20, 13,130,192, 26, 20,158,124, 1,246, 34,145,119,212, 10,151,231, 19,172, 98,113, 14,
+197,254, 68,130, 46, 16,145, 16,154, 80, 65,131, 42, 93, 97,173, 16,172, 81,168, 8,236,141, 36,176, 76,133,170, 47,214,136,137,
+ 70, 1, 34,136,143,247,150, 30,199, 22,116,164,177,108,154,146,182, 90, 36,105, 90, 26,168, 30,133, 24, 3,202,144,123,193, 35,
+ 96, 44,218, 90,156, 4, 35,142,212,226, 83, 69, 98, 19, 22, 58,155,184,100,243,102,118,204,182,216,182,185,193,150,249, 38,226,
+ 6,244,135,125,102,231, 22, 73, 90,155,233,142,132,199, 31,127,146,181, 67, 71,153, 79,155, 52, 18, 75,179,221,226,224,129, 3,
+116, 90,109,146,180,129,110,182,144,204,225,187,125,172,135, 86,154,144, 13,133, 36,237,240,248,161, 3,164,173, 6,205, 70, 66,
+ 35,177, 12, 6, 61,218, 73,194,150,205,155,241, 58,135,109, 51, 36,157, 54,107,199, 86,152,109,164, 44, 31,124,146, 29,215, 94,
+ 29,140, 62,113,232,196,144,204,182,241, 13,131,120,199,108,123, 6, 53,219, 97,181, 63, 96,125,173, 75,130, 38, 27, 14, 89, 93,
+235,113,124,101,157,213,213, 46, 90, 41,102,103,218, 28, 95, 62, 70,187,209, 96,126,126,158,213,149, 53,180,177, 12, 71, 35, 26,
+105,112, 0, 36,247,164, 38, 5,239,176, 70,145,234, 0,232, 77,173, 80,121, 70, 43, 49, 88,229,153,105, 54, 72,141, 96,181, 39,
+181,193,113,177, 70, 71, 3,210, 4, 96, 71,192, 24, 60, 96,230,155,115,111,141,238, 88,136,131,113,162,215,135, 20, 49, 2, 41,
+169,244, 98, 53,140,169,247, 51, 12,226,171, 73, 47, 93,162,194,245,213,227,151, 1,175, 34,198, 84,196, 81,199, 94,125, 24,114,
+ 0,244, 2,228,161,120, 95,120,135,186,194, 18, 68,111, 16, 19, 53,190,142, 94,161, 62,225,165, 37, 66,141,210, 99, 10,187, 36,
+ 45,198,112, 82,122,250, 5, 84, 9,227, 88,138, 39,210,208,225, 55,190, 98, 4,248,194,170,138, 84, 86, 9,188, 50,142, 77, 22,
+231, 27,217,232,248,251,104,136,196, 3, 73, 4,250,192, 40, 72,140, 47, 23,116,173, 46, 13,134, 24,140, 40,183, 41,254, 43,226,
+153,129, 77,136,140, 67, 53,119, 65, 10, 39,175, 98, 8, 20, 51,160,116,200,195, 40,169,201, 24,199,242,129,134, 23, 31,128,179,
+ 0,230, 0,254, 99, 47, 88,151,215, 77, 77, 24,148, 74, 75,185,125,225,105, 23, 30,163,209, 69,236, 43, 82,128, 49,196,162,148,
+140, 99,154, 49,222, 95,120,106,197,197,144, 64,161, 4, 3, 34, 26, 49,170,140,166,141,191, 87,149, 32,173, 82, 82,198,173, 37,
+210,168,197,164,248, 60, 7,129,225,112,196, 90,183,203,220,166, 57,142, 31, 95, 97,109,101,149,212, 36,108, 93, 88,196,229, 57,
+ 74, 91,250,189, 62, 42, 4,221, 25,101, 35, 90,141, 38, 70,105,196, 7, 69,158, 38, 41,198,132,181,106,140,193, 42, 29,129,215,
+ 68,227, 52,120,116, 74, 91,180, 14,212,249, 75,110,254, 74,182,239,156,231,169, 3,143,241,201, 79, 60,192,160,223, 39,177, 41,
+222,249,184,159, 0,232,101, 4,191,240, 90,181,174, 24,189, 4,207, 48,184, 9, 37,184,122, 95,228, 41,132,107, 44, 18, 60, 50,
+231, 28,215, 93,119, 61,198, 24,178,124,196, 48,235,147,231, 25,163,225, 8,101, 12, 89,238, 24,101, 57,105,163, 65,230, 66,152,
+ 73,128,193,104, 88,126,231, 28,120, 23, 61,235, 50,254, 25,128, 53,208,214, 14,165,116, 12, 87,141,169,222,220,185, 8,210, 22,
+ 47, 46,132, 22, 34, 16, 91, 51,102,126,172, 9, 70, 76, 49,119, 90,171,112, 93,167, 66, 84,196,247, 70,235, 24,102,171,132,155,
+138, 48, 28, 4,224, 53,154,102, 35,141,244,127, 22,194, 36,129, 74, 42,199, 94,134,169,138, 80, 30, 96, 19, 59, 54,148,242,188,
+ 52,188,141, 49,100, 89, 48, 80,180, 9,243,107, 76,160,250,197, 71,229,161, 10,175, 63,176, 83,229, 49, 42,192, 94,120,239, 69,
+104,206, 68,250,189,170,107,131, 81, 83, 24,183,158,196, 26,194,148, 8,214,216,200, 42,248,177, 70, 86, 97,157,235, 34, 23, 69,
+ 7,150,179, 8, 47,216, 52, 33, 73,210,200, 48, 72, 25,254, 80,198,196,188, 7, 79,238,131,145, 37,232, 24, 70, 8,172, 67, 96,
+ 88, 50,148,184,232, 86, 41,122,131, 17,199,187, 67, 68,167,172, 13, 51,188,177,204, 37,179,248,245, 30, 77, 28, 91,231,102,217,
+ 58,191,131,238,154,227,192,129,163,140,134, 61, 54,109,106,209,108, 54, 56,124,248, 16,155, 23, 22, 64,114,172,214,248, 97,198,
+160, 63,160,209,104, 97,156,102,118,102,134, 53, 25,240,232,193, 39, 72,141,101,198,166, 92,178,184, 5,165, 29,205,249, 14,155,
+183, 45,208,207,135,116, 87,151,104,108,110,177,120,205, 53,244,142, 44, 49,211,108,144,116, 26,136,207,209,202,163, 53, 72,106,
+176,179, 51,140, 6, 3,104, 53,152,187,116, 27, 90,132, 97,183,135,198,112,108,121,141,149,213, 62,131, 81,142, 19,207,246,109,
+ 91, 88, 93, 89, 33, 27,142,152,155,157,161,219,235,209,104,182, 24,101, 67, 58,157, 54,195,193, 48,132, 76, 48,104,132,153, 86,
+131,124, 56,160,105, 45, 86, 60,237,196, 50,215,110,146, 42,161,149,106,172,246, 36, 26,154,169, 69, 17,174,151,209, 54,228, 1,
+217,112,239,249,136, 19,214,137, 59,129, 97, 47,147, 0,138,132,158,146,186, 61,209,203, 22,217, 40,187,108, 35, 48, 31,223,192,
+ 19, 17, 93, 25,115,189, 19,223,109,192,226,135,120,232,164, 81,160, 42, 79,108, 13, 94,156,143, 73, 5,193,146, 87, 74,199, 36,
+ 24, 98,114, 84,240,198,139,100, 15,165,166, 24, 4,153,228, 14, 42, 72, 81,142, 87, 42, 73, 93, 5,144, 7,175,164, 50,126, 95,
+196,136,139, 44, 2, 61,246, 28,139, 81,107, 27, 89,145, 49,165,174, 41,206, 81,208,152, 48, 62, 15, 74,249, 50,217,163, 56,174,
+174, 24, 97,136, 76,196, 23, 11, 67, 65, 23, 33,148, 74, 6,138,143, 96,231,165, 66,221, 23,249, 25,158,232,189, 71,246, 64,133,
+ 88,162, 39, 80,127, 74, 20,162, 5,165, 12, 94,185,113,234, 99, 53, 22,236,125, 84,188,106,124,237,131, 59, 61,190,172,186, 56,
+ 1, 53, 78,178, 97,154, 2, 87, 99,197,204,216,232, 8,235,196,151,158,208,100,178, 94, 52,168, 34, 5, 60, 30,143, 84, 18, 31,
+ 21,198,168,248,253, 56,220, 32,222,135,107, 37,130,104,143,148, 70,157, 39,247, 69, 56,202,225,188,139,199,135, 60,247, 60,242,
+200,195, 60,254,212, 19,164, 70,163,115,199,210,193, 99,204,207,204, 35,249,144,166, 49,104,231,200, 92, 14,214,224,242, 28,131,
+198,103, 14,131, 38,207,114, 68, 57, 68,235, 0, 72,121,136, 37,103, 49,150,109,140,162, 63,112,136,232, 48,231,222,145,229, 35,
+230,230,154,228,249,128,165, 99,199,130,130, 0,156,119,225,118,215,227,181, 90, 36,168,249, 72, 51, 3,100,121, 54, 94,227,226,
+145, 60, 67,242, 49,216,133,185, 16, 50, 21,192,211, 57,143,103,200,254,135,191,200,117,215, 95,203, 11,174,184, 10,236, 16, 39,
+107, 24,147,113,124,105, 21,151, 11,163, 97, 23,196, 99,146, 17, 89,150,225,242,140,196,106,114,151,151,215,175, 0, 62, 65,225,
+188,155, 88,175, 46, 82,227, 33,230,157, 99, 98, 28,189,136, 59, 23,113,220, 68, 2,120, 25,165,113,113, 93,230,121,142,120,143,
+ 73,146,104,132,121,226,173, 31, 12, 88,231, 75,192,181,214,226, 93, 56, 55,173, 20, 73, 98,199,244,182, 10,121, 21, 74,133, 80,
+ 64, 72,244, 12, 97, 2, 0,101, 20,163,209, 8,231, 29, 73,163, 65,146, 36,120, 31, 88, 4, 19, 1, 92, 69,166, 32,207, 93, 84,
+ 77, 66,158,187,146,130,183, 54,161,217, 84,140, 70,209, 64,176, 73,105, 80, 21,222, 57, 42,122,225,206, 67,244,158,139,107, 81,
+132, 70, 74,134, 46,234, 4,231, 61, 58,254,206, 57,135,119, 18, 65,221,160, 36, 24,202,121,188,246, 86,155,210, 56, 81,168, 96,
+ 76,104,194,152, 41,114, 10, 2,187,145,164, 22,163, 85,121,111,185,194,216,162, 96, 97, 92, 76, 44, 84,160, 37,230, 66, 12,199,
+ 76,154, 86, 49,247, 70, 99,197,160, 1, 39,142,158, 12, 65, 53, 16,109, 56,190,222,167,157,164,108,238,108, 66, 91, 69,218, 78,
+ 57,112,232, 41,140, 19, 22,230, 54,177,109,199, 38,186,163, 54,143, 28, 62,204,145,222, 65, 94,120,229, 78, 48, 93,122,221, 46,
+ 13, 13,190,215, 39,181, 13, 84,154,224, 50, 97,203,124,155,181, 97,151, 27,174,188, 4, 55, 26,112,252,248,113,146, 89,216,177,
+117,129,157,151, 93,198,210,224, 24, 50,187,133, 57,157,146,245,186,184, 65, 78,182,182,204,252,117,151, 98,103,230,144, 35,199,
+195,181, 68,163, 26, 13,178, 97, 23, 99, 18,230,174,191,138,225,250, 58,190, 33, 52, 54, 25,230,119,204,243,119, 31,255, 28,163,
+ 44,163,223,235,211,106, 54, 89,235,117,201, 69,216,121,201,101,116, 87, 87,200,134, 33, 87,102,203,226, 38, 6,131, 30,131, 81,
+ 70,103,166,197, 82,119,128, 50, 22,227,160,149, 88,134,206, 97, 16,172, 86, 36, 70,209, 76, 52,169, 77, 72,149, 68,224,246, 72,
+238, 48,132,100, 81,231, 93,224, 62, 69,176, 86,227, 92,208, 97,102,166, 49,243, 86, 87, 64, 67,145,232, 21, 21,165, 30,147,144,
+ 39, 80,225,167,147,113, 98, 82,177,167,137,188,211,138,103, 85,236, 79, 77,253, 71, 73,173, 22,244,179,248,170,247, 56, 78,244,
+ 26,179,139,227,228,190, 34, 78,107,162, 55, 25,226,177, 6,141,193, 40, 59, 62,110,204,128, 45, 65,164, 56,239,152,237, 56,142,
+253,234, 9, 90,175,156,172, 98,172, 83, 79,124, 23,165, 75,114, 88,170, 41,174,101, 70,107, 8, 11,160,245, 56, 52, 80, 30,203,
+160, 98,190,128,142,241,103,165, 53, 42,110, 51,193, 78, 76,176, 12,106, 34, 60,161,162, 55, 40, 85, 6,161,204,138, 15,172,129,
+210, 58,130,151,174, 24, 47, 58,198,239, 35, 11,128,144,139,139,192,168, 74,118,166,152, 47, 34,235,224,188,139, 30,150,155, 72,
+112,171,102,214, 86, 67, 0, 94,124,153,209, 60,142,255,141,231,168, 52, 86, 74,112,158,252,119, 28,106, 8,191,245, 69,158,131,
+115,227, 87, 1,234, 81,105, 86,169,104, 95, 9, 89,120,239,241, 49, 78, 91,102,210, 42,193, 19,194, 37,130,196, 56,105,100, 34,
+ 36,199,251, 60,102,102, 7,138, 56, 27, 5, 90, 57, 27, 57, 14, 31, 58,204, 11,175,185,138,217,217, 25,250,189, 30, 89,158, 97,
+ 18,131,243, 14,163, 21, 62,247,209,171, 22,116,140,171,182,154, 45, 0,210, 52,101, 48, 24,150,172,199,112,148,161,117,131,225,
+ 48, 35,119, 35,156,140,120,193,149,151,208,153,157, 97,255, 67, 15,243,200, 35,143,227,242,160,136,131, 82, 14,212,186, 14, 46,
+ 90, 0,246,202,185, 6, 58,216,162, 80,248, 8,172,222, 23,185, 3, 33,183, 62,228,127,196,176, 81, 30, 60,173, 44, 27,178,186,
+186,204,182,237,243, 92,123,221,149,108,218,212,166,223,239,163,176,184, 76,161, 77,184, 7, 7,131, 97, 8, 33,136,148,158,119,
+145,207, 82, 56, 9, 82,100,245,198, 53, 87,128, 79,145, 89,172, 35,115,161,181, 46,211,158,189,132, 28, 20, 29, 25, 13,239,198,
+137,107, 18, 25,138, 2,164, 93, 4, 97, 93,201, 1, 41,230, 32, 73,146,242,251, 42, 69,159,231,121,153, 52, 87, 48, 68, 62, 82,
+229,206, 59,140, 53, 24, 27,232, 78,109,116, 60,159,176,143,196,218, 72,189, 11, 70, 91,156,247,113, 30,130,145,230, 92, 96, 68,
+108,146,160, 32,134, 18, 92,105,168, 56,151, 7, 29, 21,153,129, 66,195,186, 60,159,184,143,170, 33,132,170,254, 44,140, 54,173,
+ 52,205,102,147, 34, 87,189,200,240, 87,145,173, 42, 28, 54, 69,181, 90,168, 82,143,164, 10, 32, 79, 72,210,148, 36, 73, 74,199,
+193,104, 67,158,101,100,217, 40,176, 42, 62,199, 21,204,144,214,224, 61, 70, 41,196,133,251, 68, 23,119,189,143,127, 7, 42, 15,
+ 37,130, 53, 9, 86, 39, 40,132,102,162,104, 89, 97,115,167, 73, 43,177,248,209,136,153, 86,202,246,197,121, 22, 23,102,177, 86,
+232,117,215, 88, 89,239, 67, 99, 19,235, 67, 56,252,212, 33, 22,119,236,228,232,225,163,108,158,153,133, 97,198,104,189, 71,163,
+209, 98,180,214, 69,233,140,153,133, 54,107, 71,150,184,234,138, 93, 28, 89, 58,206,202,122,151, 60, 31,178,117,251, 60,118,198,
+210,185,242, 5,244,142, 30,195,107, 97,219,150, 69,214,151,150, 72, 22,102, 80, 73, 76, 16,109, 55,233,118,123,140,196, 49,179,
+ 99, 11, 89,158,193,166, 54,233,214, 77,168, 68,232,245,187, 88,219,194,153, 6, 15,125,254, 97, 70,195,192,148,118,102, 58,172,
+174, 46,211,110,183, 25, 14, 6, 12, 7,125,180,130,217, 78,139,197,197,121,122,189, 30,214, 36,172, 44, 31,199,106,139, 17,161,
+101, 45, 6, 65,123, 71,203, 26, 26, 6,102, 82,139,241, 25,169, 81,101, 40, 19,241, 24,109, 48,218,196, 48,112, 8,185,136,214,
+225,158,115,130,105, 37,173,183,122,124, 40, 15, 81,147, 57,238,213,210,143,113, 9,130, 66,169, 51,165,218, 35,184,108,232,121,
+ 79,238, 71, 77,167,204,149, 37, 36,170,180, 36, 21,102,162,188,106,227, 58,180,194,219,211,101,166,186,142, 65,214, 34,206,206,
+132,209, 32,147,231, 83, 4,154, 10,192, 47, 41,246,130, 25, 8, 49,121,173, 66, 54,124, 81, 10, 56, 77,225, 23,161,131,106, 98,
+ 89, 17,219, 83, 49, 22, 29, 12,135,152,184, 23,203,175,140, 50,229,182, 74,153, 10, 77,173,203,172,251,241,190, 76,101,255,147,
+201,127,229, 56,164,242, 93, 52, 8,138,237, 74, 10,189,242, 91,165, 13,198, 38,104, 99,131, 97,162, 52,162,199,249, 12,227, 50,
+163,113, 66, 77, 65,187,149,137,119,213,236,243,138,241, 52,142,253,143, 75,147,138, 68, 61, 95, 45,141, 41, 67, 15,225,115,151,
+251,144, 80, 21,105,188, 42,160, 23,251,243,149, 4,196,130, 62, 30, 31,199,151, 49,222,170,183, 63,206, 48,143,192, 95, 30,123,
+204,200,140, 67, 27,227,146, 26, 81, 82,134, 71,148,178,225, 58,105, 19,255,181, 69,173, 0,219,182,204,241, 85, 55,221, 72,167,
+221,193,249,156,110,175, 27,178, 5,117, 80,204,205, 86,139, 44,203,131,119, 73,176,198,157, 11,244,101,230,242, 72,245,134, 4,
+180, 60,210,209, 74, 43,108,106, 72,155, 45,154,205, 38, 79, 29, 56,196,193, 3,135,201,115, 65, 43, 75,158,187,232, 45, 70,234,
+ 88, 38,147,228, 10, 79,210,149,115, 24,231, 19, 41,141,165,178,180,138,113,117, 0,128,115, 57,221,238, 58,203,199,143, 50, 59,
+215,225,218,107,119,177,109,235, 22,210,196,134,220,135,212,210,108, 54,208, 70,135,236,240, 52, 41, 1, 66, 68, 48, 49,150, 95,
+ 80,185,101,194,107,229,239, 34, 25,172, 0,170,177, 49, 22,140, 53,137,148,248,120,140,227,184, 98, 32,165,130,210, 43,140, 2,
+ 23,243, 23,202, 88,113,145, 87, 96, 18, 84,164,181,165, 98,172, 74, 76,244, 76, 98, 34, 82,233, 93, 27,131, 54,166,156, 19,107,
+ 18,156,203, 99,172,218,150, 52,115,238, 28,198, 38,184,152,184, 23, 18,120, 65, 27, 27,214,168, 11,108,132,119, 82,178,159, 74,
+ 23, 97,145,201,170, 28, 19, 61,238,146,169,136,161, 17,165, 40,199, 93,204,159,137,227,172,230, 30,232,104,228,132, 4,203, 49,
+ 83, 82,130,251,148, 34, 87, 58,228, 53, 36, 73, 18,230, 56,230, 84,168, 88, 10, 34, 34,164,137, 45,117,145,177, 6,101,194,220,
+ 20,224,174,163,241,110,140,174,148, 73, 51,174, 44, 81,154,212, 36, 88,107,176, 9,164, 73,200,176,183, 74,104,104, 69,170, 96,
+115,187,141,207, 2,245,221, 93, 91,101,216, 31,226, 50,197,220,220, 60,205, 24, 87, 71, 89,246, 31, 56,196,209,213, 30, 56,197,
+252,204,102,172,178,100,131, 12, 99, 52,253,124, 72,163,211,225,248,177, 21,180,109, 32, 90,179,176,101, 11, 40,225,200,209, 67,
+ 44,238,220, 70,123, 97,129, 67, 79, 61,197,226,165, 91, 25,228, 67,210, 52,165,181,105, 14, 51,215,134, 20,104,167,216,217, 54,
+ 75,199, 14,211,220,186, 72,186, 56,135,222,178, 25,167, 60, 40,135, 36, 22,139,193, 57,205,231, 63,253, 32, 13,219,162,211,106,
+145, 54, 52,237, 78, 8,177,205,180, 59, 44, 45, 45,209,105,165,164, 38,228, 11,205,204,205,177,222,235,147,229, 57,195,126,143,
+205,237, 54, 13, 66,101,128,207,115,148,207,153,109, 53,104, 90,133, 21, 71, 51,177,101,158, 81, 8,155,132, 80,135, 82, 58,230,
+175, 8, 46, 38,158,122, 15,166,213,104,191,181,160, 95,125,181,214, 50,210, 78,227, 26, 91, 85,177,156,213, 25, 0,186,174, 0,
+162,154,174,139, 59, 33,206, 94, 40,234,105,152, 23,169,102, 42,171,147,208,243, 85, 31, 80, 77,214,166, 79, 89, 11, 74, 84,133,
+182,173,208,190,170,186,203,233,138,192,162, 70,218, 84,178, 77,199,177,253,162, 62, 87,197,216, 43, 17, 28, 41, 50,187, 75,144,
+174, 36,114,169, 8,204, 49,125,172,176,190, 76,153,128,166, 49,198, 6,192, 45,226,125,145, 18, 11,180,161,142,134, 75,164,136,
+ 84,244,248,149, 25,123,221, 4, 64, 47,246, 93,128,183,209,182,252, 59,128,125, 80, 88, 69,146, 83,149, 21, 8,166,126, 48,116,
+ 2,251, 48, 89, 55, 46, 82,201,212, 46, 43, 39,170,101,107, 99, 22, 97, 42,189,178,172, 79,159, 40,135, 84, 99,143,190,168, 43,
+245,149, 26,207,106, 86,128,103, 50, 71,160,172,243,143,235,166, 96, 72,124, 53, 84, 84,169, 39,245,101,246,255,184,132,147, 74,
+ 29,106,193, 92, 20,201,146,101, 55,130, 2,208,181,197,104, 27,128, 29,131,181,105,184,246, 70, 99,172,162,221, 12, 30,216,241,
+229,227,244, 7, 61, 76,106,233,141, 6,100, 46,148,177,172,175,119,233, 15,134, 8, 66,183,223,167,219,237,210, 31, 13,232, 15,
+ 7, 12,179, 81, 92,133,161, 68, 42,147, 33, 74, 5, 38, 66, 68,227, 60, 52, 91, 45, 86, 86, 87, 88, 93,233,210,235, 13, 65,235,
+ 96,189,187, 28,231,242,104,213, 87,234,106,181,166,209,104, 76,220, 67,133, 1, 32, 18, 74,144,148, 82, 56,113, 49,116, 53, 86,
+234,101,226,169,210,244,122,125, 14, 31, 58,200, 96,208,101,113, 97, 51, 91,183,206, 51,191, 48,135,181, 9, 94,132, 86,171, 73,
+171,157,210,108, 54, 66,242,156, 82,100,163, 81, 76,118, 84, 49, 86,174,198,198, 69,133, 65,113, 46, 47,141,236, 2,164,138,114,
+182,162,218, 35, 73,146, 50,222,238, 99,200, 64, 69, 54,171,236, 27, 81,241,110, 11, 67,193, 87, 88,155, 34,193, 54,207, 93,164,
+214,199, 10, 51, 41, 75,186,194,253,155, 38,105,200,135, 24,141, 66, 9,146,181, 12, 7, 67,172,209,140,134,225,188,242,232,137,
+187,184,198,116,168,139,101,148,101,193, 24,144,177,193,164,212,216, 16, 23,241, 19,158,121, 89,118,167, 99, 25,173, 14,204, 73,
+ 94, 73,150, 27,135, 36,244,132, 63, 19,116,232,184,194, 33,150,226, 20,133,209, 49,153, 89,198,157, 68,244, 88,191, 18,115, 0,
+148, 14,215,196,249,144, 15, 97,141, 9,165, 40,132, 36, 57,173, 53,205, 86,139,102,167,141, 73, 76, 72,148,147,112,255, 24, 29,
+170,136, 76, 52,112, 37,222,255,198, 90,108,146, 96,108,130,181,161,204, 45,236, 54,148, 23,118, 58, 51,160, 13,189,193, 8, 49,
+134,110,238, 88,233,245,104,164, 9,243,157, 14,155,231, 54, 49,204,114, 70,222,161, 36, 67, 73,206, 74, 54,128,164,193, 80, 44,
+ 7, 87,123, 60,126,120,137, 97, 46,172,118,187, 12,189, 3,219,224,208,161,101,134, 30,182,238,220,193,112, 56, 2, 45,108,185,
+100, 7,189,193, 0,237, 21, 98,160,189, 56, 79,107,231, 54,146,173,155, 49,137,194, 24, 33, 87, 96,231,103, 97,182,129, 52, 13,
+155,182, 46,112,240,177,199,153,123,241,117, 48,211, 66,205,116,144,213, 53,146, 60, 71, 53, 90, 28, 91,234,178,244,248, 97,154,
+166, 73,171,145,210,106,165, 92,127,221, 53, 28, 95, 90,138,216, 98, 88,220, 60,203,250,202, 18, 51, 51, 45, 58, 51, 51,172,172,
+172,161,180, 37,203,114, 82, 1,147, 57,210, 36, 9,238, 64, 54,162,221,176,204,181, 26, 88, 28,141, 36,228,176, 36,198, 4, 99,
+ 40,150,100,230, 46, 39, 19,135, 87,190,100,132,179,204, 99,218,173,246, 91, 39, 60,235,104,109,233,138,254, 43, 63,173, 80,207,
+101, 66,210,134,110,123,180,154, 11, 47,120, 3, 64,223,248,119,106, 34,233,237,196,154,117, 78, 29,115,159, 68,239, 49, 27, 48,
+ 17, 47,175, 50, 4,114, 34,160,151, 33,136,113,178,154,175, 82,253, 83,219,251, 74, 78,186, 84,104, 13,197,100,105,136, 84,234,
+161,203,204,253, 8,120,101, 89, 76,140,231,233, 2,220,163,165, 91,122,230,166, 48, 14,244, 24,140, 43,177, 70,173,170,172,128,
+ 25, 3,115,133,226,215, 21, 42,127, 26,208,149, 30, 51, 3,166,100, 32,198,117,235, 10,131, 86,225, 5,129,141,144, 50,145, 80,
+143,203, 7, 35, 83,161,116,213,192, 24,155, 94,190,240,178,202, 6, 29,170, 76, 90,140,181, 79, 49, 14, 44, 37,160,151, 77, 74,
+244,100,162,227,248,111, 61,174,102, 40, 26,157, 40,133,232,106, 66, 99,153,121, 23, 89,136,168,176,116, 81,241, 48,222, 95,225,
+121, 67,156, 23,138,249, 44,188,114,139,142, 47, 19, 13,165, 42,149,107,180, 98,182,221, 98,219,214,237,116,187,235,116,123, 61,
+ 30,126,228, 81, 6, 89,206,122,183,199,210,242,113,146, 52,197,121,207, 90,183, 27,198, 27, 89,156, 97,150,197, 74,203, 48,215,
+ 74, 75,164,250, 37, 36, 41,161, 25, 12, 7, 40, 29,234,216,187,131, 17,253,225,136, 81, 62, 10,141, 83,136,241, 96,241, 88, 99,
+ 99, 51,148,144,105,169,181, 66, 98, 34, 84, 40,201, 50,145,154, 14,224,169, 77,240,194,108,225, 77, 23,148,176,130,102,154,150,
+ 43,161,223,235,243,212, 83, 7, 56,114,248, 8,189, 94,151,225,160,143,115, 66,158,141, 24, 13, 7,140,134, 67, 68, 28,217,112,
+ 20,194, 15, 89, 86, 54,241, 24,131,186, 46,195, 32, 33, 20,165, 74,150, 46,148,159,201, 68, 72,233,100, 25,185, 66,165, 44, 81,
+169,178,108,204,196,228,190,170,247, 63, 93, 98, 91, 86,199, 20, 84,125,164,251,157,207, 43,172, 80,200, 49,112, 62,120,205,214,
+218, 50,115,190,168,121,119, 34, 49,252,145,227,197,151,201,113,168,113,146,110, 56, 39, 87,122,231, 85, 38,164, 48,120,148, 10,
+ 57, 47,206, 5,195,202,249,216, 32,171, 18,250,171, 54,187, 10, 9,104,110, 50,188, 68, 76,222, 43, 28,177,200,216, 21,243, 93,
+156,103,121,173,147, 36,150,248,197,172,122,107, 72, 27, 13,180, 13,217,212,170,146, 19,149, 36, 9, 42,134, 8,138,202,138, 80,
+ 34, 24, 18, 51,195,247, 6, 29, 19, 53,181,181,161,204, 46,150,216,121, 66,120, 46, 92,219,112,223,101,185,167, 59, 26,209,119,
+194,209, 94, 70,207,195,112,148,177,116,232, 40,195, 94,159, 65,230,112,198,210,237,103, 28, 91, 90,101,181,219, 71,119, 58,104,
+147, 34, 24, 6,162, 88,201, 28, 71,214,123, 28, 89,237, 49, 68, 51,112,134,158,211,172,244, 71,164,237, 54,199, 87, 87, 88, 27,
+172, 51,191,117,129,220,141,152,237,204,112,172,183,130,207, 51,154,173,148,100,182, 13,179, 45,148,209, 12,122, 93, 84,167,137,
+ 78, 53,210, 0,179,169, 19, 12,183,108,128,157,155,193,116,218,184,229, 21,186,199,150,104, 54,218,144,107,150,158, 56, 74,170,
+ 18,242, 44,167,209, 72, 65,121,210, 52, 65,156, 48,236, 15,176, 26, 52,161, 12,114,113,113, 30,165, 13, 7, 15, 31, 38, 73,155,
+ 12,214,122,116,140,101,115,167,137, 85,130,207, 51,102, 91, 77, 82, 45,164, 6,172, 53,232,152, 28,231, 92, 94,160, 16,142,112,
+255, 11, 58,150,135, 10,121,238,177,136, 15,101, 83, 19,133,107, 50, 6, 86,136, 73, 58, 85,151,215,151, 11,164,236,225, 52,213,
+ 5,172,100,106, 9,165, 17, 27, 83,243,170,140,245, 86,111, 56,145, 19,227,247, 74,141,169,211,147, 33,188, 42,227,220,149,158,
+ 91, 78, 98,242,137, 62,193, 11,175, 36,247,199, 44,251,162, 46,188,218,203, 77,198, 37, 29,227,220,235,152,131, 46,149,158, 62,
+ 76,132, 38, 84,121, 59,176,177,215,143, 47,147, 19,199,201, 66,178,113,165,128, 98,170,171,222, 84,155,172,146, 49, 56,209,200,
+ 18, 29,142, 84, 36,159,133,155,187,202, 44,200,137, 29, 2, 42,201,143,177,202, 21,239, 2,147, 35, 33,251,110,220, 53,140, 16,
+ 15,215, 82, 25, 89, 44, 63,147, 10,184,250, 74,147,179,144,229,103,202,218,240,105, 35,175,244,182,161,226,205, 23,185, 0,122,
+106,126,170,205,103,166, 58,229, 21, 37,121,241, 56, 33,121, 14,124,225,161,232, 10, 67,160,199, 73,147,197,202, 87, 69, 82,101,
+204, 2, 14, 89,198, 97,231, 70,201, 68, 92, 82, 77,182, 20, 11,128,150, 67,218,108,115,124,245, 17, 46,185,236, 18,156, 73,120,
+228,137, 39, 80, 24,140,241,172,173,173, 97,147,148, 70,179,193,112, 56, 68,161,201,114, 87, 26, 93,162, 96,152,119,209, 90,147,
+ 38, 13, 92,150,211, 76, 67,104, 36,115, 35,142, 28, 62,204,214, 29, 59,105,183, 91,228,222,177,188,180,140,203, 67,178,151, 50,
+ 9, 74, 2, 45,167, 53,216,200,236, 56, 23, 50,143, 37,122,241,170, 40,113,171,148, 91, 85,197, 36,182, 4,197, 52,209, 12, 6,
+ 57, 54, 73, 17,160,223,237,243,240, 67, 79,240,196,227, 7,153,153,105, 99,147, 70,240,106,189,224,178, 17,189,110,151,108,148,
+225,242,208, 36, 74,137,196,220, 72, 85,246, 61,208, 90,227, 99,102, 55, 42,128,100,200, 53, 80,227, 46,120,149,117, 93,140,179,
+ 0,236,106,199, 60, 19, 65, 70, 71, 90,189,122, 95, 22, 64, 95,236,203,139, 27, 87,113,136,170,244,123,240,228,177,153, 85,238,
+131,238, 48, 86, 69,195,195,134,100,202, 88, 93,226,240,228,121,134, 49, 22,165, 13,190, 50, 6, 31,235,192,173, 14,181,241,196,
+ 26,121, 84, 48,106,198,140,161, 10,212,181, 49,101,197, 69,168, 52, 8, 37,125,218,132,100, 41, 99,108,200,179,200,163, 49, 17,
+ 13,177, 34,115, 61, 96,110,104,166,160,117,104,110,163,138,138, 28,175,202,168,165, 49, 54,148,141, 90, 67,146,132, 4, 56, 99,
+131,241,230,179, 17, 73,146, 6,166,167,146,120, 91,220,113,137, 77,201, 92,142, 19,135, 21, 83,174,155, 34,206,175, 34,213,175,
+ 98, 70,157, 23,202,108,251,162, 52,206, 0, 73,164,145,197, 90,116,163,129, 50, 64, 30, 40,123, 99, 21, 43,235, 61,214,189,163,
+173,133, 3,235, 75,204, 30, 94, 37,213,154,197,249, 69, 26,141, 25, 6,249,136,238,129,227,120,132, 86,187, 69,167,209, 8, 73,
+167,206, 65, 83, 88, 18, 97,132, 97,109,125,141,254,122,159,163,195,199,216,178,169,195,104,152,211,105,166, 72, 39,101,113,113,
+134,133, 77,219,120,234,169, 39,240,131, 17,170, 59,192,225, 81,157,132,206,214,121,134,171,235,144, 41,236,226, 12, 94, 67,107,
+215,229,140,158,120, 28,215, 95,195,180,103,177, 91, 23, 49, 71,143, 33,253, 33, 12,135, 88,163, 88, 29,245,217,185,243, 18, 30,
+127,242,113,230, 23, 54,161, 27,138,229,195,199,104,219, 16, 22,152,153,233, 48, 26,245,200, 6, 61,182, 46,204, 48,219,105,176,
+214,243,216,118, 19, 11,168,188,207, 66,187, 69,222,237,198,121,247,140, 70, 67, 26,141, 70,137, 25, 38,198,206,157,115, 36, 54,
+101, 48,200, 66,101,142,243,161,244,209, 11,182,208,124, 5, 43, 83, 40,209,178,213, 40,122, 3,197, 73,121,243, 84,111,184,113,
+108,106,178,249,160,174,212, 75,158,208,224,110,156, 88,126,154,178, 56, 93, 42,221, 83,149,194,203, 68,198,218,216, 19, 63,225,
+248,213, 30,178, 76,255, 61,149, 24, 88,246, 98, 28,151,147,249, 13,178,253, 39,230, 98, 42,246, 95, 85,152,122,220, 51,110,210,
+123, 56,211,100,133,147, 36, 38,158,116,230, 42, 9, 73,101,147,138, 34,110, 41, 30, 85,161, 67,169,100,210, 79,118,250,211,101,
+105,144,210, 6,209,161, 61,105, 40, 79, 19, 84,161, 95, 43, 73,135,186, 12, 53,108, 84,206, 56, 57, 55, 27,141,127,186, 59, 92,
+ 53, 33,232,228, 29,242, 38,129,191,104,117, 43, 18,186, 92,169, 88,162, 86,109,247, 89,141,207, 23,237, 54,117, 1,234, 49, 4,
+ 81,237, 58, 88,182, 1, 82,149,106, 9, 53,213,159, 83,160,215,239,179,178,182,138,177,150, 7, 31,252, 18,151, 92,254, 2,146,
+ 67,135, 17,237,162,129,234,177,218,144,231, 25,137, 9,149, 14, 65,177,217, 96,128,120, 65, 91, 75,171,209, 12, 64,149, 57, 52,
+138, 70,154,194, 72,192,121,150,142, 28, 97,203,182, 29, 52,210,132, 68, 27,134,131, 65,152,183,220,209,239,247, 66, 25, 95,145,
+143, 49,213,166,181,136,205,134,210,183,144,148, 21,192, 96, 28,235,133, 80,130,166,180,142,140, 85, 65, 27,135,146, 26,163, 53,
+ 62,247,172, 46,175, 49,202,150, 98,167,180, 28,148, 38,207,179, 50, 87, 67, 36, 36,225, 25, 47,101,239, 3,143, 43,217, 0,197,
+184, 20, 85, 25, 53,206, 82,175,228, 80, 76, 3,116,181,131, 96,113, 30,197,191, 69, 92,185, 0,156,130,190, 46, 26,208,248, 88,
+ 62,166,140, 42,245,195,104,148,209,104, 36,129,214, 47, 58,170, 65, 73,173, 43, 69,204,228, 31,135,137,138,210,186,144,160, 56,
+190,183, 68,170,213, 25,227, 82,177, 49,144,187,113,153,109,245,125, 44,229,180, 54,193,123,135, 19, 79,150, 57,178,204,145,231,
+190,172, 0,242,185, 43,157, 21, 85,101, 7, 85,212,217, 50,214,225, 62, 86,212,148,249, 11,166,208,201, 30, 33,100,193, 83, 86,
+ 22,229, 24,163, 66,254,131, 53,193,171,206,114, 92,238, 24, 56,143,177, 33,215,167,200,221, 40,238,163,162, 43,160, 73,211,144,
+ 0, 88, 86, 27,248,192, 12,233,192, 12,129,132, 94, 33, 90,145,121,135, 31,244, 73,173, 33,141,172,128,228,158,102,136, 89, 52,
+ 46, 0, 0, 32, 0, 73, 68, 65, 84,187,133, 86,138,227,221,117, 18, 44, 43,125,135,145,156, 39,250,135, 73,108, 8, 89,180,211,
+ 4,131,208,234,204,210,180, 9,198, 11,166,149, 50,114, 67,122,131, 53,218,115, 11,164,237, 5,150, 14,193, 76,179, 69,187,213,
+ 98, 54, 81, 12,215,214, 89, 95, 94,102,199,194,102, 70,235, 93, 46,219,182, 29,219,108,224, 92,142,206, 50,196,141, 96,243, 22,
+140, 79, 25, 29, 63,142,233,180,200,140, 39,153, 79,177,109,139,214, 33, 84,163, 91, 29,146, 70,138, 91,207, 89, 61,182,204,104,
+ 52, 68, 3,157, 78,139,181,181, 85,150,151, 90, 92,113,197, 85, 60, 54,122, 28, 81,134, 45,139,139, 28, 60,116,128, 70, 83,179,
+222,237,177,185,209, 98,235,150, 45,172, 63,126, 8,155, 38,104,113,248, 60,195, 42,133, 53, 10,231, 50,208, 9, 74, 27, 70,131,
+ 33, 77, 27, 67, 39,202,160, 98,203,106,231, 66, 95, 4,147, 54,131,202,113,193,174,179, 99,229,233, 35, 16,197, 62,200, 69,119,
+ 47, 57,209,139, 83,138,169,150,164,234,148,160, 82,180,120, 61,121,131,117, 74,171,242,212,113,250,211,110, 48,209, 63,126,242,
+223,226,183,102,195,242,187,113, 47,228,208,192, 99,124,163,168,233, 60,188,178,100,232,140,227, 2, 19, 96, 48,238, 43,172,207,
+ 16,196,171,115,171, 42,253,176, 75, 47,230, 20,185, 10, 82, 1, 68,181, 65,187,216,201, 74, 3, 53, 81,250, 86,206,223,244, 28,
+ 23,229, 46, 42,100,180, 42, 93,105, 30,164,170,221,220, 42,221,230,166,128,122, 26,152, 67, 94,130, 63,101,152,166,240,208, 54,
+154,155, 82,193,151,157,219, 55,232, 31,175,252,134,151,107,162, 89, 79,185, 63,153, 72, 12,173,142,183,168, 29, 47,234,218, 79,
+ 48, 50,162, 39, 50,200, 50,150,143,175,224,128, 81,158,243,240,163,143,210, 31, 12,104,180,218, 12, 6,195,144,193,234, 92,136,
+ 91,198,184,106,154, 38, 12,134, 3, 58,205, 86,153,193,110, 98,151, 56,107, 76,232,110,214, 16, 52,138,225, 96,128,119,158,135,
+ 30,124,144,118,187, 19,122,217,143, 70, 88,107, 24, 13, 7, 24, 29, 12,209,160, 76, 99,226, 88,225,221,169,241,253, 22,188,247,
+184,238, 99, 2,142,115,121, 72,250, 19, 41,251, 11,100,153,139,201,101, 62, 94,215,240, 95,106,146,216, 76, 97,220,157,206,121,
+ 65,124,236, 84,103,198,160, 93,109,162, 82,140,163,104, 35,140, 31,119, 72,172, 26,158, 27, 25,113, 89,150,149,177,246, 2,172,
+ 11,239,220, 87,107,184, 43,241,246,220,141,195, 13,129,150, 15, 44, 70, 81, 53, 97, 98,205,120,136, 3, 83,122,158,185,119,101,
+ 13,184, 54, 38,128, 36, 99,246,104, 52, 10,173,110, 11,227, 34, 73, 44, 58,198, 75, 75,138,188,194, 28, 84,141,200, 34, 1,109,
+114, 78,138,241,197,100,206,104,100, 20, 61, 6,202, 30, 11,106,220, 35, 99,162, 91,103,108,115,173, 43,250, 65,219, 80,207,140,
+137, 6, 78, 30,235,216,167,140,240, 44, 23, 68, 12,248, 17, 9,150, 36, 77,104, 88,131,246, 69,206,203,184, 77,120, 48,148,132,
+ 36, 77,202,117, 42, 46,143,201,145,141,192, 70,138, 39,207,114,180, 10, 52,178,169,244,181, 80,132, 10, 11,229,130,177,146,197,
+184,124,226, 52,189,225, 0, 47,150,129,119, 88,147, 4, 3, 88,192, 15,115, 90,105,194,166,206,102, 18, 45, 28, 91,239,178,186,
+190,198, 76,179, 65,195, 41, 90, 45,203,182,133,237,236,220,177,133, 99, 71,142,161, 26,194, 85,151,109, 70,178, 1, 91,230,183,
+ 99,181,208, 79, 91,248, 92,211,237,174, 50,127,245, 78,124,106,192, 40,196, 1, 46, 71,245,250,152,180, 65,179, 51, 67, 62,200,
+ 73,182,205,134, 78,120, 6, 52,121,104, 84,229, 5,175, 53,195,110,151, 39,247, 63,134, 21,197, 32,207, 1, 71,179,153,210, 93,
+239,242,248, 99, 79,210,108,182, 56,118,228, 40,173,206, 12, 30, 69,127,144,177,180,180, 66,163,213,161,221,110,178,125,235, 22,
+ 14,254,255,156,189,217,146, 36, 71,154,165,119,116,183,197,221, 35, 34, 19,168, 2,170,186,171,167,187,103, 19, 82,134, 34,188,
+227, 35,240,177,240, 98,124, 5,138,144,188, 24,161,112, 70,122,175, 2,144,153,136, 8, 95,108,209,149, 23,191,170,154,154, 71,
+ 36,170,100, 26, 18, 82,232, 64, 70,164, 47,230,166,255,114,206,119,254,248, 35, 98, 98,208, 66,195,185, 5,189, 34,240, 77,100,
+ 18, 90, 74,196,213, 34, 50,210, 35, 68,134, 44,160, 13,128, 80,232, 76, 7, 27,200,138,232,124, 64, 72, 60,119,234,181,203,140,
+155, 38, 60,165,198, 50,246,182, 27,175, 10,225,180, 63,108,191,218,173,167,191, 64, 92,199,247,227,215,191,244,192,124,255, 0,
+ 76, 59, 31, 60, 99,251, 84,128,173, 11,100, 59,207,124, 66,130,128,120, 51,202,110,105, 83,169,165,238,221,249,195, 89,129,195,
+ 48,145, 15,209, 88, 87,252,172, 17,146,129,189, 45, 98,254, 92,167, 94,111, 82, 72, 32,102,213,230, 83,103,239,112,223,171,225,
+ 44,177,119, 34, 45,182, 98,103,123,255,226, 93, 0, 67,220,176,181, 77,168, 13, 18, 49, 1,164, 20,153, 80,133, 6, 94,146,154,
+131,176, 97, 30,180,129, 3,123,187, 65,115, 83, 98,239, 31,216,205, 60,125, 11,132,105, 67, 15,218,194, 44,189, 89, 99,188, 89,
+229,236, 70, 78,216,214, 46,109, 16,199, 87,223,147, 50,116, 15, 59,209,221,155, 63,199, 0, 23, 34,250,113, 4,231,155, 7, 59,
+196,136,117,181, 96, 76,160, 51, 26,118,153,179, 69, 75, 98,181, 11,148,234, 17,163,196,195,233,128,215,215, 23, 12,125,143,215,
+215, 11,237,237,203, 78, 53, 70, 68,231, 33, 33,224,150, 21,201,123, 44, 87, 18,222,176, 16, 16, 83,128, 96,200,138,100, 90, 91,
+109,187,115, 58,120, 90, 17, 25,242,129,209,210, 24,185, 84,213, 90, 22,124,160, 3,162, 20,106, 89, 89,207, 52, 29,230, 92, 8,
+ 8, 65, 54, 61,161,232,160, 93,236, 10,166, 68,222,241,147, 62, 55, 6,208, 90,160,132,249, 52, 92,116, 6, 81,239, 37,109, 55,
+219,118,185,155,136,108,179,167,181, 64,150,246,207,128, 19,151,221, 59,151,109, 89, 89,151,145, 15,118, 41, 52,229, 48, 56,215,
+ 92,131,244,119, 42,174,242,206, 55,238, 62,255, 45,166,181,248,211,233,113,216,252, 25, 34,191,112,101,173, 99, 43, 70,156,115,
+187,105, 79,185,182, 67, 44, 7,158,130,214,166,146, 38, 99,140, 88,150, 5, 34, 59, 9,202,206,220, 90, 11,169, 5,198,126, 4,
+103,192,106,137, 9, 16,171, 98,158,220, 0,146,211, 10,204, 40, 3,173, 21,221, 91, 89,230, 22, 20,234, 94, 66,126,254, 41, 99,
+118, 89, 37,251,129,231,247, 56,255, 25,157,247,228,206,249, 60,217,201, 54, 71, 79, 66, 89,203, 44,140, 49, 48, 66, 33,120, 15,
+235, 61, 9,239,138,224,209, 59,104,158, 7,195,130,180, 67,116, 46,208,193,239, 98, 4, 7, 17, 56, 95,158, 95,203,146, 23, 82,
+ 41,120,112, 40,169,161, 59,133,232, 45, 98,240,248,252,229,130,190,151,144,130, 86, 97,110, 89, 49, 40, 78, 5,164, 7,254,248,
+207,127,196,249,114,129,157,110,120,249,252, 9, 18, 30,143, 29,137, 93,163,245,248,252,211, 23,232, 7, 9,121,232,192, 58,133,
+ 32, 18, 68, 55,192, 77, 19,150,231, 51,186,223,126, 3,244, 3, 77,177,179,150, 73,244, 61,184,209, 72,243, 4,188, 92,160,250,
+ 3, 46,151, 47, 16, 14,248,112,120,128,240, 51,188,117, 56, 62, 28, 97,109, 0,151, 2,171,243,248,246, 55,191,197,207,159, 62,
+231,181, 8,195,243,235, 5,227,241, 2, 46, 21,134, 94, 67, 26, 1,107, 29,116, 55,162,115, 1, 2, 17, 54, 88, 40,169,144,172,
+133, 0, 33,164,201, 49,193, 17,243,245,183,216, 0, 31, 81,245, 60, 76, 42,184,192, 32,223,132,129,240,125,218,213,215,187, 78,
+246, 21,236, 43,154,195,126,155,171,179, 95, 25, 71,167, 50, 25,104, 25,228,117,228,206,118,221,125,123,184,190,231,139,111, 15,
+243,242,225,120,239,103, 42,151,188, 40,235,219,156,181, 24,238, 14,156,125,119,201, 91,245,221,123, 35,224,146,134,197, 0, 68,
+ 78, 33, 8,205,206,125, 27,241,178,183,211,138, 95,233,210,121,229, 68,147, 32,253, 30,236,243,238,248,122, 47, 82,104, 14,183,
+ 84, 71,204, 91, 17,246,254,235, 74,157, 79,161,234,229, 0, 27, 38,239,128,193,169,241, 20,163, 6, 61, 32,171,227, 75, 24, 78,
+123, 35,222, 30,119,218,144,184, 45,179,155,241,187,215, 21, 85,241, 94,212,184,169, 9,132, 73,213,201, 16,191, 34,194, 44,128,
+ 17,177,155, 64,149,107,149, 97, 19,113,149,240,160, 90,144,213,199,154,133, 83,108, 91,163,188, 9,146, 73,168, 34,187,159, 63,
+253,130,177, 83, 88, 87,139,199,195, 1, 74,221, 72,113,237, 29,188, 40, 62,113,142,195,241, 4,185,208,200, 90, 41,133,235,249,
+ 5,136, 33,119,232,212, 65,134, 12,249, 40, 65, 36,235,186, 2,145,246,182, 68,126,203, 97, 15,121,116,109,145,114,199, 77, 35,
+107, 33, 37, 98, 6, 87,164, 24,193, 19, 65, 89, 2,227, 89, 24,185, 63,116,202,168,154, 10,130,109, 47, 75, 8, 83,150,141, 52,
+249,117, 10,156,138,137,196,161,164, 0,227, 6,214,123,240, 16, 32,132,132,103,196,174, 23,249,243,230, 51,103, 92,114,153,139,
+157,172,153,201,188,130,214,126, 87, 14,212, 50,165, 41,193, 40,173,253,139,132,222,164,220,102,130,193, 7,255,238, 78,190,144,
+221, 56, 74,158, 73,170,187, 97, 42,118,232, 0, 44,229, 95, 17,218,181, 30,241, 86,105, 94, 14,193, 80,137,119, 84,156,172,235,
+186,179,230,149,221,185,148, 98, 55,129,144,146,214, 47, 46,120,196, 53, 65, 43, 5,165, 36,164, 52,248,248,241, 9, 96,192,178,
+ 76, 36,156, 11, 17,189,145, 16, 66,210,193,204, 57, 62, 28, 30, 0,198, 48, 47, 75,134, 67,145,154, 94, 9, 78, 97, 54,121,130,
+192, 56,105, 74,188,247,224,140,195, 89, 71, 7,187, 32, 75, 89,215, 27,112, 46, 41,135, 32, 3,188,220,106,113,181, 43,148,224,
+152, 67, 64,223,245,232,250, 1, 49, 70, 88,107,161, 20, 9,122, 75,160,205,186,174,232,164,198, 48, 24,116, 93,135,224, 3, 98,
+182,222, 41, 69, 54, 54,231, 61, 61,151,204, 4, 40, 2, 66,145, 69,188, 28, 9,156,251,236,201,166,251,138,115, 30, 8,145, 44,
+111, 82,100, 55, 8, 0,151,224,167, 5,227, 96,208,247, 3,184,228,120,189,205, 88, 22,139,225,248,128, 37,246,152, 87,139, 63,
+ 12,223,225,227,168,112,250, 48,194,135, 5,236,242,130,197, 95, 96,216, 9,235,229,138,238,216, 65,118, 6, 24, 53, 4, 79,152,
+127,249, 5,189, 18, 72,125, 7, 88,135,148, 60, 24,215,128,236, 9,135,251,252, 35,248,101,130,232, 62,192, 79, 14, 15,102,196,
+186, 0,231,151, 23,124,126,126,134,231, 9,195,233, 1, 63,125,254,132,117, 94,241,135,223,255, 30,183,219,140,105, 89,145, 66,
+ 0, 67,196,151, 47,207,248,171,191,254, 43,132,232,224,163,199,225,112,192,109,182,120, 26, 6,136, 96,225,111, 30,146,209,202,
+ 75, 74, 1, 33, 57,253,221, 49,100,190, 72, 33, 34, 74, 88, 79,171, 25,135,132, 41, 49,136,177, 27,126,216,143,119,183, 94, 4,
+239,141,163,255,135,118,192,236, 13,183,124, 67,154,147, 79,184,132, 9,220,239,208,222,219,231,191, 17,131,181, 59,209, 20,119,
+ 69, 74,123,128,108, 31,238,175,117, 87,109,184,200,190,232,120,111, 20,248,181,175, 45, 32,166, 8, 77, 26,143,122,225,211,223,
+165,149,177,255,129, 81, 60,218,248,192,180,247,184,178,118,143,206,246, 99,100, 94, 9,188, 44,251, 74,211, 87,223,207, 24, 99,
+ 78, 10,203,146, 58, 46, 32,133,202,157,163,216,184,237,108,255,123, 42,244,162, 96,168, 88,172, 99,120,158,217, 5, 12,236, 77,
+156,207,215,118,235,239, 64, 19, 50,111,255,235, 41,127,239, 61,159,242,126,252,218,238, 62,181,100,197, 50,209,204, 98,123, 81,
+113,195,251,196,185,118, 92, 92,186, 17,128, 97,186, 93,240,248,112,194, 48,244,164,116,207,156,119, 58, 12, 36,132,228, 56,158,
+142, 56, 28, 14,136, 49,212, 93,112,111,122,196, 76,175, 27,134,177,138,194, 74,221, 90,212,213,197, 46,165,132,132, 96, 84,197,
+ 11, 78, 30,107,169,120,245,241, 23,251,216,110,151,155,147,233,116, 78,109, 43, 65, 42,229,128,187,215, 58,112,145,119,191, 5,
+107,154, 34, 65, 83,132, 32, 1, 85, 14, 47, 41,201,124, 68, 21,163, 34, 89, 10, 1, 41, 36,148, 80,116, 67,138, 33,139,169, 98,
+245, 79, 87, 69,118, 62,200,203,174,191,221, 57,151,251, 67,129, 11,165, 12,220, 72,237,245,159,139,118,158,167, 26,200, 69, 76,
+185, 74,138,109,148,246,207,132,158, 45, 5, 68,140,161, 2,121,218, 53, 64,123, 47,217,114, 18,248,206,195, 95,224, 68,156, 23,
+ 64, 12,117,197,125,223,215,199, 30, 2,193,111, 74,247,189,174, 22, 49,146, 82,218,104, 13,103, 29,166,121, 6, 99, 9,175,175,
+ 47, 88,150, 5,199,177, 3, 67,132, 82, 2, 93,103,224,188, 67, 76, 30, 92, 48,248,224, 0, 22,209, 15, 29, 66,112,132, 52, 77,
+100,187,227,130, 99,153,167,124, 79, 68, 38, 32,122, 12,195,128,135,135,135,236,195, 7, 68,126,157,157,119, 72, 41,194, 46, 43,
+188,179,144, 74,162,235, 58, 8, 46,209,153, 14, 66, 42, 88, 75, 62,112, 99, 52,148,146,249,253,163,247, 67, 10,137, 24, 28, 49,
+241,157,219, 68,152, 69, 15,194, 5, 77, 77, 98, 32, 69,124,162, 61, 48,229, 15, 16, 69,145, 44,142, 17,178,215,240, 41,194,122,
+151,167, 65,128, 54, 18, 49,122, 76,203, 2,159,157, 45, 99,215, 67, 11, 1,248, 0,149,195,101, 2, 18, 14,167, 39,220,110, 51,
+122, 35,241,159,255,254, 15,120, 24, 36,188,159,161, 68, 66,176, 43,158,158, 62,226,233,227, 7, 48,163,225,167, 9, 76, 75, 48,
+ 9,112, 41, 33, 4,135,237, 56,244,183, 31,137, 47,176, 92, 33,250, 17, 44, 36,240,152, 32, 83,130,212, 10,184, 5,252,244,255,
+254, 19,194,205, 34, 6, 6,101, 6,252,233,231,159,241,248,241, 3, 68,182, 61,122,235,177, 46, 43,184, 16,120,126,189,162, 27,
+ 6,132,224,208, 15, 29,180,214,184, 77, 19,124, 76,184, 92, 38, 44,215, 27,190,233, 59,140,130,193,205, 11,180, 82, 8,222,225,
+ 48,246, 88,115,114, 97,200, 83,181,152,104, 18,152, 24,137,107, 87, 31,177, 50,129, 63, 94, 23,136, 83, 55,254, 16,239,110,164,
+156, 53, 62,236,108,104,122,239, 64,255,181,131,168, 61, 88, 99,138, 25, 52, 74,255,148, 94, 43, 34, 3, 75, 50,142,113, 75, 3,
+195,157, 58,125,207,153,223, 58,248,141, 59, 79, 95,241,171, 54,184,251,239, 85,214, 56,123,155, 81,195,192,222, 60,199,251, 67,
+125,207,137,190, 63,212, 9, 54,193,179,205,139,151,220,109,108, 81,173, 91,180,201,215,191,190,246, 60,246, 40,216, 45, 93,237,
+189, 3,173, 30, 58,119, 59,110,114, 26,198,221,222,253,107, 83,148,194,148, 47, 86, 58, 33,228,118, 99, 76,121,225,192, 54,177,
+161,224,105, 83,144,215, 47,182,115, 69,180, 46, 51,252, 10,177,112, 87, 76, 50, 52,163,119,126,183,143,103, 59,182, 1,208, 90,
+ 35,177,193,120,176,207, 19,104, 85,252,169, 69,218, 98,235,208, 25,163,231, 83, 38, 17, 53,150,160,137,167, 21, 69, 29, 95,199,
+248,140, 48,192, 33, 96,158,174,232,123,131,241,112,192,249,114, 1, 18,195,241,112, 68,223,119,228, 59,205, 52,178,105,154,104,
+244,137, 4,109, 52, 69,215, 34, 65,155, 14,203,178,108, 17,233,130, 99,117,150,118,187,156,103,101,118, 14,104,137,148,204, 70,
+234,118, 58,184,124,230, 66,167,166,160, 46, 65, 77,165, 67,111,197,102,117,207,126, 55,230,142, 49,194, 89,151, 15, 64,178,156,
+209, 77, 94, 86,206,119,138,168,135,122,240, 1,198, 24,168, 92, 52, 32,131, 83, 10,165,145,113,212, 2,164, 88, 50, 83, 62,144,
+247, 22, 45, 84, 54,124,204, 40,223,216,192,131, 82,158, 62, 20,101,121,140, 4,135, 41,239,183, 16, 18, 74,234,234, 87, 37,155,
+ 96,193,213,102,156,110,198, 6,135, 72,120, 99,173,245,190,160,201,239,115, 59, 1, 76, 57,156,188, 76,128,138,247,220, 24, 93,
+175,197, 16,124,157, 14,148,169, 0,137,242, 40, 82,214, 24,131,190,239,235,216,189, 51, 26,135,195, 0, 37, 5, 30,142, 7,244,
+157,129,150, 2, 82, 16, 14,116, 93, 22,140, 67,143,195, 56, 82,199,188, 44,116, 87,141,200, 42,246,132,105,154,177,204, 14,206,
+ 90, 34,224,229,112, 32, 6, 96, 24, 6,204,243,132,101, 89,112, 58, 29, 96, 58, 3, 31, 61,152, 32, 21,188,200,151,191, 82, 10,
+ 46, 23, 78, 70,107, 4, 31,225, 86, 7,239, 92,166,202,209, 97,219, 25, 3,163, 13, 21,108, 74, 81,130, 88,190,134,188,243,240,
+214,213, 27,185,181,150,120, 5,117,252,158, 50, 51,131, 33,248,144,135,186, 17,224,140, 96, 75, 57,190,213,123,139,224,125, 78,
+150, 76, 96, 66, 34,228,207,165,179, 43,180,228, 24,187, 14,167, 67, 7, 36,135,224,102, 40, 35, 96, 12,199,114,253,140,239, 63,
+244, 56, 14, 9,122, 16,136,243,132, 65, 31,208,141, 39, 48, 70, 40, 97,230, 3, 68,167, 73, 35,179,102,216,142, 20,224,198, 32,
+ 5,155,109,191, 26,225,229, 21,105,153, 50,118,216, 35, 37,141,244,124, 5,151, 6, 63,255,252,140,227,195, 7,252,233,167, 79,
+ 25,203,155,192, 66,192,195,120, 0, 24,217,205,150,213,195,135,128,161, 55,112,206,162, 31, 7, 72, 73,209,172, 92, 40,104, 46,
+193,237,140, 35,103,120,236, 7,172,243,138,126, 28,225,252, 68,164, 63, 41, 41, 13,210, 57,250, 60, 39, 86,211, 11,215,144,112,
+245, 12, 63, 94, 23,136, 67, 55,254,208, 70,111,238,186,186, 44, 94, 43,157,230,123,221,207,215,148,203,233,142, 45, 94, 82,149,
+ 80,111,162, 45, 48, 36,127,197,180, 75, 21, 67,179, 91,175,140,242,250, 59,247,157, 89,217,231,214,113,113, 99,107, 77, 59,128,
+ 78,164, 12,242,119, 70,251,117,195,158,216, 27,248, 77,107,233,251, 53,245,117, 41, 14, 98,179,179,221,145,234,107, 80,247, 95,
+ 66,228, 75, 95,221, 51,167,134,192, 86, 35, 83,223,217, 33,115,190,249, 95, 25,107, 39, 49,177, 30, 88, 96,111, 39, 6,187, 27,
+ 88, 42,222,114, 14,206,201,151, 93, 38, 26, 40,234,242, 24, 42,193,106, 43,152, 18, 1,212, 50,170,148,231, 49,113,249, 57, 81,
+146,218, 10,174,156,237,119,231,239, 78, 14, 18,219,237, 42, 83, 98,119,187,238,253, 4,160, 36,222,148,117, 7,103, 28,239,201,
+ 59, 88, 35,209,103,205, 26,129,231,238,124, 11,162,217,126, 79,187,163, 23,124,243,227,111,224, 19,138,139, 13,222, 66,107,137,
+ 63,252,205, 31,160,148,198,243,243, 47, 56, 12, 61, 18, 34, 86, 79, 59,209, 97, 24,113,187, 94,225,125,168,228, 52,151, 71,239,
+171, 93,225,125,128, 84,186, 38,152,133, 24,178, 63,121,191, 91, 46,210, 7,231,108,165,202,197,196,106,152, 15,242, 24,188,248,
+180, 89, 83,248,181, 19,169,251, 78,189, 32, 92,169,104,219, 8,133, 60, 79, 36,164,212,180, 46, 97, 27,159,128,115,158,209,206,
+ 44,231, 50,160,250,154,193,182,117, 2,249,178,233,171, 8, 64, 91,154, 28,238,216,245,177, 65, 29,151,201, 79, 97, 51, 72,169,
+ 43,219,225,126,114,213,254,255, 74,137,186,250,104, 71,253,117,117,116,183,150,242, 25,215, 90,254,108, 41, 96, 40,144, 37,230,
+ 41, 7,207, 19, 24, 13, 6, 98,187,151, 48,172,237,245, 44,142, 3,149, 39, 48, 30,211, 52, 33,198, 80, 51, 14, 24, 75,144,138,
+103, 39, 3,141,194,199, 97, 68,204, 93,190,115, 14, 33, 4,140,195, 8,173, 53,132, 36, 44, 45, 7, 48, 12, 35,198, 97,160,245,
+ 10, 24, 98, 72, 89, 61, 95,232,132, 20,247, 43,165,200, 43, 2, 6,211,153,202, 47,144, 66,192, 40, 67,147, 18, 46,192,165,204,
+ 43, 32,149, 89,232,168, 0,148,132,136,101,153,225,203, 72, 61, 37, 24, 77, 83, 60,173,116, 62,220,105,197, 67, 69, 0,242,251,
+ 26,234,189,197, 57, 7, 95,116, 1, 62,228,148, 75, 58, 11, 56, 24,122, 99, 32, 25,131, 86,146, 10, 7,173, 9,128,163, 53,148,
+ 20, 0,143,112,193,194,217, 25,138, 39, 60, 29, 58,124,115, 60,224,177, 31,112,253,229, 5,235,229,138,135,195, 8,228, 41, 70,
+127, 26,160, 30, 6,120,120,204,231, 11,204, 55,143, 8,215, 27,120, 2,146,117,192,109, 65,180,142,212,251,193, 99,241, 11,116,
+ 63, 32,121, 14,255,203, 47,224,154,195, 49, 6, 8,137,248,122, 67,178, 17,209, 3, 63,254,248, 5,156, 27,188,188, 92,240,205,
+199, 15, 24,123,147,247,225, 0,151, 10,231,243, 21,224, 18,151,235, 21, 74, 41,112,193,170,234,252,124,157,225, 60,192, 66,128,
+242, 22,143, 82,224,168, 13,110,183, 25, 93,111,192, 68,194, 60,205, 20,211, 28, 60, 66,140, 13,167, 67, 16,113, 50, 50,220, 60,
+199, 47, 54,179,223, 83,220, 70,215, 37, 65, 43, 33,147,202, 18,175, 42,109,206,183,240,142,138,203,188,251,135,224, 2,185,146,
+206,190,207,128,210,169, 55,209,156,205, 1, 21, 83, 36, 48, 1,167,145, 74, 81, 94,165, 98,183,203,221,125, 77, 27,163, 74, 35,
+255, 93,205, 87,153, 3, 48,212, 36,180,218,137,101, 50, 25,120,193,184,242,221,228, 54, 53,227,106,158, 43,143, 84, 90, 26,196,
+253,238,151,181,211,130,252, 88,211,118,200, 20,212,100, 10,233, 46,180,246,110,199,253,103, 45,105, 44,231,103,167,157,119,188,
+ 93, 53,144,100,184,164, 59,221, 9,188,120, 3,173, 64, 34,206, 74, 3,147,160,233, 33,171, 34, 31,178,181,196, 55, 30,133, 80,
+102,190,137, 83,101,205,196,166,106, 47,217,213,249, 90, 40,137, 80,172,250,202,219,192,214,230,181, 76,239, 72, 18, 24,165,180,
+177,106,104,103, 77, 93,151, 42,161, 10, 57, 57,172, 74, 5, 10, 14,177,124, 47,231,129, 39,132,230,103,202, 9, 22,107, 55,125,
+239, 42,104,199,231,228,187,103,100,215, 99,205,116,163,181,235,113,158,115, 2,248, 86, 12,166, 13, 48,196,184,168, 69,100,240,
+ 14,255,254,239,254, 22,243,237,130,101,186,225,219,143, 31,224,220,138, 24,232,102,183,206, 43, 98, 32,254,123,201,172,174, 26,
+140,124, 33,115, 38,114,135, 64,196,176,224, 3, 4, 35,230, 54,203,227,113, 41, 57,152, 32,159,188,146, 10, 37,224, 54,100,255,
+112,140, 17, 41, 68,168,172, 28,231, 82,228,180,174,205,181, 32,164,216, 20,255, 57,110,147, 11, 78,212, 48, 73, 8, 86, 33,120,
+245, 99, 11,145, 69,147,172, 32,121,233,218,244,209, 87,133,116, 68,170, 9,103, 33, 6,162, 97, 57,159,209,194,219, 8, 39,230,
+235,186,136,228,182,130, 29,164,227, 72,121, 52, 47,228, 54,105,200, 69, 21,203, 24,211,152, 39, 14,111,249, 1, 60, 79, 54, 66,
+ 78, 62,139,187,221,188,200,202,246, 80, 10,165, 70, 88, 26, 34,229,130,103,105, 57,100,142, 90, 45, 9,130,198,232, 10,119, 90,
+ 22, 11,187, 58,196, 72,217,239,101, 74,226,115, 51,194,243,228, 96,154,103, 4,231, 32,121, 66,215, 41,116, 90,224,116, 28,113,
+ 60, 82,167,222,247, 29,148, 82,152,110, 11,230,121,193, 48,244, 88,237,146, 71,240, 1,211,188, 64,104,218, 85,171,252,188,125,
+ 62, 24,237,106,177, 46, 83,222,161,211,227, 85,154, 32, 51, 82, 9,218,221,107, 5, 41, 41, 54,182, 51, 26,189,238,154,162,135,
+196,133,222, 59, 40,173,161,141, 34, 0, 81,103, 42,112,135, 53, 40,112, 89, 38, 45,177,172, 67,136,239, 33,149,130,233, 58, 8,
+ 33,161,149,206,159, 19, 15, 33, 56,188,115, 85,159, 33,179,144, 83,230,192,155,226,100,138,206,226,113,232,112,234, 58, 40, 78,
+ 77, 89,223,107, 32, 56, 60, 29,143,128,163,180, 68,173, 12, 82,138,152,166, 43, 98,112,248,254,233, 17,255,233,239,255, 30,255,
+240,175,255,130,241,241, 1, 99,215, 65,135,128, 56,205, 8,158,129,153, 1,235,243, 11, 12, 4,210,101, 66,124,189,129, 45, 14,
+108,177,184,124,121,134,246, 12,188, 31,144,192,193,149, 65, 92,110, 72, 97, 69, 24,122,232,161,167,235,207,115,132,217, 34, 76,
+ 22,243,117,133, 95, 35,190,124,254,130,111, 62,126,196, 50, 47, 72, 9, 20,241,203, 56,166,121, 6,192, 48,223,230,154,182, 89,
+120, 12,231,219,130, 16, 18,100,138, 16, 49,224,113, 28,193, 66, 68,112, 43, 20,223, 10, 75, 41, 84, 21, 92, 11, 73,247, 64, 23,
+ 73,218,189, 88,224,186, 4,138, 1, 59,152,195, 15,228,101,140, 57, 0,128, 85,198, 58, 71,238,172, 74,203, 82, 41,107,251,253,
+120,172, 29,227, 54, 14,163,160,178, 50,102, 79,136, 44,238, 70,173, 49, 6,148, 98,162,138,224,242,190,147, 53, 34,180,162, 52,
+143, 44,100, 14,249, 94, 56, 94,252,188, 49,165, 55,143,109,167,153,103,187,224,214,186, 83, 78,119, 66, 44,198, 80, 97, 60,247,
+132,188,189,230,236, 94,101, 31,247,135,109, 62,236,144,246, 49, 38,205,171,182,251,247,237,144,190,243,213,167, 86,139,157,246,
+118,152,156, 50,151,238,152,230,117,151,206, 25,209,159, 56,175,126,113,214,250,198, 27, 91, 53, 82, 34, 26,108, 33,155,101,146,
+ 94, 40,176,141,140, 74,229, 76, 2,188, 20,122,145, 94,135,230,181, 47, 16,140, 86, 8, 87,108,144,229, 53,223,240,177,119, 2,
+ 63,214,218, 18, 75, 81,179,253, 79,204,111,124, 76,119,239,197,110, 71,206,106,113, 81,118,166, 27,177, 14, 13, 56,233,253,233,
+196,118, 45,150, 68,210, 22,237,123,175, 79,192, 22, 84,204, 54, 97, 29,178,194, 56,178, 4,134,152,147,247, 18,254,240,251,223,
+225,122, 57,211,104, 14,192,233,116,192,178,206,208, 90, 83,237,200, 57,172,115,164, 14, 22, 57,178,182,218,182, 4,141,221, 66,
+132, 80,162, 22, 61, 5,243, 42, 21, 37,254,113,193, 41, 81, 47, 39, 76, 21,176, 18,141,245,177,227,173,151,175, 66,156,107,189,
+222,101,188, 93, 60,223, 33,209,138,140,246,185,177,134,144,132, 16,176, 44, 11,233, 1, 66,192,178,174,181,203,246,222, 55, 19,
+133,184,165, 3,102, 52,108, 33,155,165,252, 60,200, 6, 23,191,226, 88, 96,217,243,206, 16,163,191,243,195, 16,210, 85,137, 34,
+180,162, 67, 98, 19,194,198, 76,109,204,214,221,244,150, 48,183,125,166,238,175, 45,177,225,144, 99,128,148,148, 56,214,117, 10,
+ 90, 82,198,182,148,116,160, 25,173,161,132,196, 97, 28, 97,140,201, 97, 44, 60,107, 31,120,101,228, 35,209, 14,190, 51, 26, 70,
+ 75,244,125,135, 97,232, 96,122,141,152, 40,178, 54,166, 4, 99, 58,138,111,133, 64, 76, 17, 74, 11, 28, 14, 3, 86,187,162, 31,
+122,204,203,140,105,186,210, 65,157,155, 21,202,184,183,248,240,244,152, 9,112, 2,195, 48, 82, 6, 60, 35,129,101, 65, 22,120,
+151,211,244,154, 66,177, 51, 93, 93,117, 48,206,208,117, 29, 21,104,193,195,121, 7,187,174,213, 50,168,141,105, 86, 82, 28, 41,
+ 36,132,136, 92, 48,162,250,236,121, 46,250,104, 37,146, 54,140,113,158, 0,109,201,118,165, 80,102, 4,164, 97, 9, 41,121, 24,
+ 33,240,215,191,251, 29,144, 2,166,117,129,139,100,193,156,174,183, 92, 64, 11, 88, 31,225,124,128,233, 12, 62,124,252,128,231,
+ 47,159,112,155, 39,124,190, 78,208,166, 7,124,196,111, 30,159, 96,184, 4,227, 10,126, 90,193,124, 64,184, 46,224,137, 35, 44,
+ 14, 10, 2,112, 17,183,231, 51,226,109, 5,143,192, 50,175, 20,194,195, 3,212,177,135,139,180, 94, 72,214,194, 45, 1,176, 1,
+243,207,207,208,188,199,229,229,134,105, 90,208, 13, 61,126,121,254,130,241,112, 64, 74,156,220, 46, 92,224,245,245,156,115, 31,
+202,109,159,225, 48,142,152, 87, 7,239, 35,122, 37,192,189,199,168, 52,252, 50,131,167, 8,165, 41,131,157,138,213,152,175,245,
+ 60,233, 74, 64, 4,135,243, 9,171, 75, 88, 60, 53,190,212,169, 55,135,122, 9, 45,217,236, 72,172, 65,176,110, 68,176,221, 81,
+213, 28,170,169, 5,170,182, 9, 90, 41,108,227,241, 60, 90,217,163,101, 0, 81, 63, 66,108,103,215, 34,188, 96,115,184,221, 67,
+ 67, 50,187,155,186, 79,254,118, 79,219,144,106,121,217,113, 51,142,247,220, 74,239, 81,109,217,206,183,221, 10,237,246,194,172,
+214, 15,191,183,214,225,174,187, 78,119,226,190,253,247,139, 58,127,255,179,241,206, 29,176, 23, 6,182,121,247,101,158, 93, 87,
+ 38,117,172,135, 38,107,190, 21,234,109,175, 77,219, 93,111,175,109, 89,130, 11, 48, 33, 51, 99, 62,143,240,203, 99,102, 13,174,
+ 38,165, 93, 22, 58,231, 69,152,149, 26, 37, 58,175, 57, 2,245, 49, 52, 73,121,219, 53,215,196,129,178,141,225, 94,127, 54,189,
+ 53, 58, 50,126,119,237,166, 18,187,139, 59,109,198,251,182, 55,158,215, 18,140,109, 44,129, 54,117,142,109,115,235, 77,195,192,
+ 83, 19, 6,180,173,123,106,244,109,136,248,155, 63,252, 53,142,135, 3,110,183, 11, 24, 79,248,253,239,190,199,183,191,249, 45,
+172,181,152,215, 21,171,119, 20,230,226, 86,244,125, 7,239, 45,237, 58,149,198,188,172,136, 89, 53, 94,120,236,164,244,166,137,
+147, 50,134,172, 83,193,109,233,122, 89,208, 19, 66,160,157,101, 86, 59, 23,149, 54, 69,144, 18, 28,132,160, 46,161, 30,184,180,
+ 95,166,131,222, 90, 11,231, 72, 73,205,193,105,156,234,233,239,177,206, 17,243, 60,211,210,202,110,254,126,250,180,121,177,243,
+168,159,109,136,225,132,180, 99,155,223,255,108,241,110,111,197, 62,169,200,137,246, 70, 72, 94,169,100, 62,172,182, 42, 48,198,
+ 64, 74,172, 6,237,204,114,197, 88,126,103,137,232,221,236,115, 84, 8, 73,158,167, 2,249, 49,107, 45, 41,124, 36, 69,112, 70,
+ 19,205,227,113,128, 49, 10,198, 24,116, 93, 15,100, 33,154,247, 30, 90, 75, 60, 62,158, 48,244, 29, 66,240,248,230,219, 71, 72,
+201, 48,244, 26,167,211,128, 97,208, 56, 12,116,152, 31, 14, 35,249,223,179,170,124,154, 23,204,243,138,235,245,138,195,241, 1,
+ 66, 48,132,232,160,141, 68, 63,208,168,220,174, 22,227, 48,208,212,195, 19,130,215,152, 14,227,120, 64, 76, 1,151,243, 11, 14,
+199, 17, 12, 60, 11,217,168, 59,150, 74,214,233, 68, 8, 1, 34,139,215,202, 61, 56,165,132,195,225, 0,153,177,175, 92,108,227,
+249, 18, 12,195,242,207,148,223,105,140,174,193, 58,148,171, 78,100, 59, 10,240, 33, 6,252, 50, 47,176,203,138,148, 72, 20, 40,
+ 53,137, 5,133,216, 50, 50,170,197,146, 6,170,181, 33,244,206,227,229,229, 5,145,113,248,148,224, 35,224, 92,130,117,129, 4,
+107,130,147,136,207, 7,216,117,197,124,155, 17,144, 48,199,132, 47,207, 11,146, 87, 64,224, 88, 47, 55,196,213,194, 36, 14, 1,
+160, 63, 28, 33,181, 6,180,134, 84, 26,203,188,226,246,114,129,228, 10, 82, 27,168,135, 7,136, 78,129,249, 8,255,242, 74,220,
+135, 0,168,174, 67,178, 43,228,225, 8,251,233, 25,183,127,251, 2, 4,137, 63,253,248, 5,243,234,112, 60,157,240,242,250, 74,
+ 41,125,222, 35,250, 8,231, 61,172, 11,240,137, 17,245, 17, 12, 90, 41,184,101, 69, 55,140,248,244,229, 11, 30,134, 30,194, 59,
+244,156, 67, 38, 10,127,225, 82,192, 6, 58,212,157,181, 57,187, 33, 79,197, 25,173, 35, 87, 27,224, 66,132, 13,148, 22, 41, 14,
+102,108, 14,117,250, 64,240, 26,194,177,193, 58, 91,182,121,218, 9,168,210, 78,208, 86, 59,235,114, 32,148,195,152,189, 99, 55,
+111,104,167,180,187,228,187,191, 43,229,155,100, 44,129, 27,173,112, 46,135, 77,180, 86,173,132,237,240,143,109, 55, 91,200,164,
+216, 43,219,217, 29,130,245,237,161, 94,186,209,182, 83, 46,234,232, 61,133,108, 75, 26,139,123, 93, 0,246, 66,172, 90,244,220,
+125, 47,101,143,102,220, 37,149,165,170, 63,168,127, 31,218, 84,179, 80, 11,139,216,174,223,155,195,135, 11,190,141, 85,249, 59,
+ 7,214, 93, 7, 90, 15,191, 18, 18,145, 82,115,168, 19, 14,147, 18,151, 0,164,112, 23,203,155,106,102, 64,155,251,179,197, 61,
+166, 93,151,190,105, 56, 74,215,203,114, 1,194,118,186,137,141, 19,191,219,150,103, 4,192,157,189,178, 81,174, 55, 77, 95, 67,
+ 84, 75, 77,176, 5,118, 62,231,150,204,197,119, 99,246,253,129, 94,159, 79, 11, 83,105, 74, 17,222, 88,250, 56, 24, 88,164,221,
+246,245,124,129,146, 2,171, 93, 49,205, 87,252,252,233,103,124,250,249, 51,110,243, 12,166, 36, 86,239,129,108,115, 75, 89, 35,
+226, 92,192, 52, 45, 80, 90,195,102,225,147,115,142, 98, 98,243,126,178,236, 51, 67, 22, 23,145,176, 44,102, 11, 76,170,126,240,
+152,232,123, 59,103, 8, 47,211,143, 28,149, 26, 66, 77, 18, 36, 65, 78,202,211, 2, 26,173, 22,149,124, 8,212, 81,242,172,228,
+ 47,153,222,101, 47, 95, 10,202, 86, 96, 86,110,222,177,137,190, 5, 40,244,132, 68,100,226, 77,129,181,177,244, 75,138, 32, 50,
+219,220, 83, 88, 12,103, 91, 20,111,126,254,228,139, 14, 53,180,164, 8,217,106,151,147,245, 59,219,250,140,174,137,224, 55,116,
+ 44,217,172, 24, 14,135, 49, 99, 85, 25, 78,135, 17,199,227,136,135,227, 1,130, 3, 74,114,216,117, 1, 18,195,151,207,191, 96,
+186,205, 85,236,229,236,130,121,154, 16, 67,192,233, 56, 98, 89,103,112, 66,233, 65, 73, 6,173, 21, 56,163,199, 81, 92, 7, 69,
+203,160, 85, 71,221,181, 84,120,126,126, 65, 63, 24, 76,211,132,148, 8, 64,212,247, 67, 38,184, 37,244, 29,169,168, 99, 32,150,
+ 64,223,245,232,187, 46,175, 45, 19,198,161, 39, 14, 63, 18,148, 34,203, 26,237,239,121,181,227, 21, 85,188,119,182,190,191, 82,
+ 81,209,100,173,197,178,204,208, 70, 99, 28,135,188,215,167,204, 2,109, 52, 21, 28, 89, 84, 41,165,162, 34, 75,138, 74, 49, 12,
+ 72, 57,132,136,194,114,188,115,176,214,214,144,160, 66, 79, 44,126,118, 42,164,242,244,143,151,220,240,132,197, 58,172,214, 35,
+ 50,202, 93, 16, 82,215,105,145,143, 33,175, 54,128,161, 31, 97,116,135,190,239, 96, 67,128,247, 28,214, 70, 12, 67,143,195,208,
+225,122,123,197,249,250, 74,122,138,224,113,190,156,241,249,243,103, 92,206, 87,192, 83,240, 77, 55,142,232,143, 39,204,211, 13,
+221,227, 35,248,233,144, 53, 7, 1,246,182, 66,105, 1, 4,138, 76, 78, 63,190,192,189, 44,248,252,233, 21,159, 62,189,226, 50,
+ 45, 96, 82,225,120, 58, 82,145,189, 56, 76,215, 43,110,211, 10,101, 70,204,214,194,121, 90, 89,117, 74, 3,193, 67,247, 29,214,
+117,193,177,239,192,157,135, 97, 12,134, 17,220, 75,114,134,152, 40,226, 89, 9, 89, 63, 35,229,254,182,186, 8, 23, 0,231, 35,
+124, 17,191,214, 67,157,197, 55,204,245,214,214,134,156, 44,150,129,115, 53, 15, 59,229, 88,202, 18, 85,153,216, 94, 69,156,106,
+184, 74,122,183, 45, 46, 55,150, 18,232,144, 88,177,191, 53,211, 0,150,238, 24,239, 27, 32, 36,177,150,195, 94,163,215,235,252,
+140,181, 65, 42,216,110,200,104, 71,239,205,191,179, 76, 73,219,175,184, 55,216, 73, 42, 38,243,124, 63,136,119,144,158, 54, 47,
+188,174,197,155,215,170, 21,242,181,197, 64,108,254, 91,186, 83,182,239,159, 91,188,243,228,163,118,102, 40, 19,139,156,242,182,
+ 9,229,242, 78,189, 30,172,123, 78, 61, 26,218, 93, 35,158,104, 44,135,133,129, 94,130, 32, 8,114,145, 16,155, 36, 63,182, 83,
+187,139,230, 49,180,133, 91,233,208,217, 78, 84,214,190, 15,236,173,189,173,104, 21, 90,162, 94, 76,149,245,207,246,188,214, 55,
+157,248, 27,119,194, 87,172,132,237,122,162, 22, 32,119, 93,122,187,171,225,121,222,196,242,206,187, 20,132,244,213, 4,111, 36,
+ 42,148,151,117, 65,136, 30,143, 79, 15, 56,156, 70,252,242,229, 25,183,105,193,151,231,103,112, 37, 33,181,130,143, 1, 15, 15,
+ 15,152,174, 55, 72, 73,163, 55,206, 5,156,117, 96,160, 61, 36,203,216,211, 54,244, 4, 41,213,236,109, 6,150,133,114, 12,214,
+121,164, 72,113,164, 33,199,183, 22,203, 90,202, 63, 3,208, 4,160,122,194, 27, 37,124,193,178,106,165,106, 23,234,131,207, 1,
+ 65,212, 5,202,188,127, 13, 25,223,122,223,157,151,101, 83,113, 9, 20, 49, 98,153, 6, 72,165,118, 69, 64, 89, 15,180, 19, 46,
+138, 17, 70, 94, 11,133,170, 52,151, 66, 34,100,161, 86, 27,177, 74,113,167, 91, 84,106,235,121,175,154,141,148,170, 54, 32,165,
+ 88, 11,136,195,225,128,161,239,160, 36,240,240,112,192,241, 52,146,159,220, 89, 58, 60, 57,199,227,233, 17,211,116,197,178,204,
+ 88, 23,135, 16,136,141,158,114,134,124,200,138,247,206, 24,164, 72,182,182,174,163,131, 49,132,128,215,151, 51, 46,151, 9,235,
+106,243,148,130,213,231,180,174, 14,231,243, 5,175, 47, 23,226, 8,164,136,167, 15, 15, 72,113, 11,186,209,170, 35, 7, 69, 71,
+123,119,107, 87,104,101,112,189, 94, 49, 12, 29,180, 86,232,123, 3,198,128,167,199, 39,104, 67,157, 53,141,247, 29,150,101,161,
+ 9,107,134,220,108, 32, 42, 58,104,215,117,134,115, 14,125,223,213,247,211, 59,135,174,235,201,206, 42, 68, 93,105, 80,216,148,
+168,156, 1,206, 24,148, 84, 89, 55,225,234, 20, 38,134, 64, 43,135, 78,215,247,155,138,149,141,105,193, 57,135, 96, 91,147,195,
+165,132, 11,100,135, 19,146,146,222, 74,161,169, 36, 69,149,250, 68, 49,183, 82, 8,172,203, 76,194,214, 72,194, 82,199, 24,110,
+118,194,199,143, 15, 80, 50,226,155,111, 30,113,124, 60,226,199, 95, 62,227,227,227, 9,227,227, 9, 31,190,251, 13, 62,252,238,
+ 59, 72, 45,208,141, 61,120, 39, 33,250,236, 89,121, 0, 0, 32, 0, 73, 68, 65, 84,159, 14,176,203,132,100, 45,160, 36,248,113,
+ 0, 55, 6,230,233,137,214, 73,211, 4,246, 58,195,254,116,193, 79,255,244, 39, 68,175,112,190,173,176,129,225,227,183, 31,209,
+245, 29,120, 2,122,109,112, 60, 30, 17,144,240,203,249,130,217, 18, 40, 72,107,133,193,104,116, 70, 33, 34, 66,106,137, 81,105,
+196,121,129,140, 9, 60, 70, 26,191, 11, 18,219, 82,230, 3,175, 43,138, 16, 3, 66, 2,156,245, 0, 4, 86, 23,234,154, 84, 28,
+187,195, 15, 85,177,157, 15,140,234,167,110,226, 49,219,208,149, 88, 58,251, 20,247, 35,241,102,247, 92, 58,163, 54,213,109, 71,
+120,107, 83,179,138,229, 88, 20,229,248, 62, 98, 51,167,114,224,190,183,109,211,224,182, 67,146,189,139,142, 45,187,213,162,188,
+141, 95,163,210,230, 15,123, 59, 6, 79,105,163,174,109, 0,153,124,179,105,145,145,119, 67,255,123, 11,220, 27, 97, 92,162,209,
+103, 42,157, 89, 22, 25, 33,197, 55, 73,114, 89,125, 87, 31, 35,107,118,236,213, 67,222, 20, 84,188, 57,212, 75,167, 89, 71,226,
+104,211,234, 54, 6, 61, 43,130,188,102, 10, 18,179,223, 22, 77,226, 19, 23,172,250,182, 73, 13,158,247,184,205,142, 94,148,238,
+117, 71,150, 75,216,194,130,240, 6,218, 82,158, 85,235,157,223,210, 89,138,255, 63,219,222, 83,249,147,216, 95,131,172,112,173,
+179,229,163,198,222,226,206, 17,143, 55,154, 9,214, 10,233, 83,172, 55,255,247,108,139,162,142,254,155,206, 29,172, 10,236,202,
+152,184, 20,147, 41,239,243,173,179, 24,134, 30,195, 56,192,122,143,213,122,220,150, 25,214, 57,244,227, 64, 29, 4, 72,137,108,
+237, 10,239, 2,140,238, 16,125, 66,244, 1, 70, 43, 82, 41,231, 27, 43,165,176,113, 24,109,160,148,204,156,237,124, 40,166,108,
+181,203,187, 86,153,105,111,165,155, 46,215,161,202,153,204, 45, 57,173,125,174, 69, 52, 86, 70,243, 59, 7, 72,181,175,249,154,
+236,214,142,208, 75,158,248, 86, 32,209, 11,237,202,168,255,174, 88, 98,237, 24,182, 17,202, 85,181,121,113, 38, 36, 18,199, 5,
+ 79,182, 63,198, 57, 69,166,230,105, 67,209,237,208, 88,158,231, 93, 46,125,191, 20,156,200,157,236,241,120, 36,223,181,148,208,
+ 90,195, 57, 7,187,206,208, 26, 89,239, 18,144, 66,192,178, 46,176,214,193,173, 30,222, 5,116, 67,151,167, 23, 2, 74,105,148,
+193, 33,231, 28,227, 56, 96, 28, 7, 40, 69, 81,183,243, 60,227,122,187,225,122,189,129,115,137,227,225, 8,100,176,200,106, 45,
+230,121,169,135,124,202,202,186,211,233,136,126,232, 97, 58, 67,214, 49,163,241,250,122,193,245, 50,225,122,189,225,114,185, 32,
+198,132,174, 51, 56, 29,143,152,151,149, 64, 48, 82, 64,202,220,197,122, 82,189, 75,197, 49,140,244, 92,149,146, 52, 2,207,209,
+206,125,223,215,200, 89,235, 44,214,117,197, 48,142,132, 47, 46, 68,184,224,115,225, 72,215,116,140,113,135,128,166,194, 79, 67,
+ 74, 65,247,178, 70, 47, 37, 4,175,223, 67, 12, 16,156, 85,146,159, 86,186,210,229, 82,136,112,222, 98,181,164,209,224,121,213,
+103,186,142,174,225, 92, 80,153,174,163,226,148, 37,208,244, 62, 11, 58, 25, 96,164, 64, 47, 57,140,208,176,158,225, 22, 2,174,
+217, 55,175, 33,112,254,114,198,116,243, 16,170,199, 52,189, 96, 56,244,232, 79, 71,128, 69,240, 78, 64,140, 10,120,232,129, 78,
+128, 73, 14,149, 40, 94, 55,165, 0,161, 21,216,227, 17, 97,165,131, 55,158, 23,196,151, 5, 95,254,248, 5,183, 57,226,243,243,
+ 13, 95, 94, 94,241,241, 55, 31, 33,133,192,229,229, 5,118, 89,176,216, 5, 17, 12,183,101,133,212, 6,222, 90, 24, 37,241,112,
+ 28, 96, 20,195,241, 52,194,219, 21,167,174,135,189,220, 0,235,160, 57,135, 98, 32,198,125, 74, 80, 90,110,121, 5,121, 42, 29,
+ 98,130,115, 17, 62,146,144, 19,137,156, 39,226,216,209, 78,189,116,147,187,155,215,174,211,105,101, 41,219,142, 23,173,237,138,
+229,195,175,222,196,121, 77, 60, 3,139,251, 3,141, 97, 7,238,168,138,250,178,131,207,195,116,236,144,157,252,206,190,116,151,
+217, 13,246,134,202,182, 11,100,169,194,187,134,120,122, 23,200, 81,179,198,106, 46,119,172,143,125, 27,245,230,195,188,245,133,
+183,157, 93, 94,236,126, 13, 44,147,170,136, 46,110,163,214,114,104, 55, 7,118,205, 67,206,177,153,155, 33, 31,155,164, 63,191,
+ 74,184,179,100,109, 54, 31,182,165, 36,177,237,139,229,111, 38,182,141, 72, 69, 51, 6,223, 91, 8, 55, 55, 2, 9, 91,178,119,
+155,109,104,213,186,199, 78,155,143,187,190, 78, 91,235,221,148, 64,237,132, 36,213,241,108,125,149, 89,187,174,168, 17, 42,185,
+192,219,124,214,117,232,205,210,246, 24,170,213,141,109,182,189,186, 70,122, 11, 15, 66, 51,189,216,174,174,180, 61,183,247, 44,
+127,249,253,103,251,192,223,237, 49, 49,142, 54,183, 26,141, 47,250,182, 76, 88,157,197,229,122,131,143, 41, 19,230, 60,186,174,
+ 71,138, 17,135,126,192,249,245,181,170,188,133,144, 88,230,181,241,147,251, 58,146, 38,171, 89,190,241, 58,159,115,203,105,132,
+234, 67,200,112,154, 92,172,139,125,190,248,142,101,192,249, 91,113, 90, 83, 28, 10, 41,119,197, 83, 29,177,223,113, 17, 90, 27,
+154,111, 4,119,101,180, 92,186, 9, 31,222,186, 16,238,201,111,251,128,148,118, 93, 70, 0, 28,165, 37,237,117, 25,133, 13,113,
+ 48,132,124,104, 72,193,193, 16,161,165,192, 56,244,121,236, 45, 32, 56,240,248,240, 8,165,201, 87,221,117, 6,235,178,224,112,
+ 56,128, 51,134,101, 89,168,235,213, 10,166, 83, 52, 38, 53, 6, 93,223, 81,216, 14, 35,181,184, 82, 26,183,233,134, 97, 24, 43,
+169, 77,155, 60,113,200, 14,162,121, 89, 72,225, 31, 60,156, 15,217,206, 22,225,125,192,106, 29,132,208,121,132, 45,234,253,171,
+188, 22, 93,215, 85, 63,119,136, 30,211,116, 35,223,185, 16,240, 46,228, 0, 25, 6,235, 44,137, 28,125,128, 54,166, 50, 15,180,
+ 86,208, 90,214,140, 9,114, 20,184, 26,143, 90, 98, 96, 9, 24, 19, 42,170, 86, 8, 81, 11, 27,165,116,165, 9, 74, 41,177, 44,
+ 11, 56, 56,156,243,217,107, 79,112,161, 50,225, 64, 76,228,230, 72, 84,128, 50,144,104, 78,100,194, 93,175, 21,116,198, 15,167,
+ 12, 4,138,165, 88, 8,161, 10,140,171,243, 35, 11,118,189,243,121,218,184, 23,169, 10,206,137,203, 32,200,118, 39, 0, 48,111,
+233, 43, 6, 40,163,193,148,160,113,119, 98, 48, 92, 65, 66, 98,190,173, 48,166,199, 56, 40,172,211,132, 94, 73, 72,197,193, 53,
+ 7, 27, 20, 88, 39,193, 58, 77, 29,255,180,130, 37, 6,111, 23,232,135, 3, 96, 20,156, 15,224,215, 27,226,121, 2,174, 30,151,
+231, 9,231,179,197,101,114,112, 96,144, 70,161, 55, 6,201, 57,178,180,102, 1, 57,152,128,209,134,238,193, 41,224,219, 15, 39,
+ 28, 6,133,195,208, 1,206,131, 45, 14,105,182,208,224,136,222,129,165, 64,255, 45,133,204, 81,192, 46,241,212,135,136, 16, 25,
+172,219, 26, 47,206, 0,113,234,143, 63,160, 10,107,194, 27,175, 58,223,145,178,178, 32,139,181, 7,122,170,170,241,150, 35, 94,
+ 15,244,148,119, 88, 44,222,141,211,154,241,111,106, 44,202,121,150,188,211,165,215, 34, 67,160,193,184,236,110,163, 72,251, 3,
+124,207, 64,111,124,206, 13, 58,181, 29, 97,151,137, 58,223,128,224,155, 56,142,165, 55,133, 77,189,245,199, 38,122, 54, 53,177,
+161,108,223,249,191, 79,177, 79,191, 26,132,211, 10,233, 98,131, 66,221,137,226,216,214,229,166,187, 29,177,200,185,222, 34, 31,
+182,133,244, 89, 87, 29,205,142,185,218,182, 26,205, 68, 74,219,161, 94, 71, 59, 89, 36, 87,236,113, 60,241, 60, 10,223,122,109,
+158, 45,101,101,156, 87,112,175, 41,103,132,151,228,179,237, 45, 44,111, 62,223, 45, 89,202,228,104,191, 42,105, 86, 41,217,174,
+181,201,248, 27,187, 94,190,246,154, 56,119,108,239,240,254, 32,106,135, 40,247,246,181,175, 29,234,188, 81,189,227, 45,202,126,
+119,221,130,165,157, 69, 12, 96, 88, 87,135,144, 34,186,174,195,233,116, 2, 18,129, 65,190,255,237,111, 17,188,199,249,124,174,
+ 55,112, 58, 24, 98,189, 14, 66,238, 64,153, 16, 20, 82, 34, 5,249, 87,243,205,185,140,157,183,247,120, 91,164,113,193,119,152,
+213, 16, 66, 25,239, 84,200,203, 22, 20,148, 31,127,201, 53, 23, 60,239,175,195, 27, 70,196, 70, 76,219, 91,209,218,174,191,126,
+ 54, 50,144,170, 29,183,239, 96, 85, 49,238, 72,110, 85,160,154, 10, 41,142,110,114,130,211,151,204, 98, 57,206, 25,140, 81, 56,
+ 30, 14,212,177, 25, 13,163, 54,253,135, 81,146,208,187,118,133,233, 12, 18, 18,214,133,172, 70,183,219, 13,183,219,156,195, 88,
+178,104, 48,145,240, 72, 10,158,133,133, 34,219,195,232,223, 11,129,163,235, 58,172,118,174,116,181, 24, 73,128,150,192, 96,221,
+ 10, 38, 4,180,209, 96,156, 67,107, 3,109, 12,180, 54,144, 66,213, 93,127,103,250, 45, 65, 46, 4, 56,103,225, 61,145,199,128,
+173, 43,118,206, 81, 66, 94,158,174,132,224,234,199,231,252,122, 70,223, 15, 80, 90, 97, 93, 23,114, 79,112, 14,231,104, 53, 65,
+ 83, 24, 2,224, 24, 99,178,239, 60,145, 37,146, 49, 24,211, 17,110, 53, 79,129,236,106, 43,154,155,162,119,137,147, 16,156,175,
+211,142, 16, 28, 98, 36,139, 36,103,156,138,169,140,127, 13, 33,192, 89, 11,164, 68, 99,228,130,224,174, 33, 60, 60,103, 19,208,
+115,230,249,179,166, 58,178,222, 49,148,137,211,182, 42, 41,169,126, 62,147, 12, 25, 56,148,210,244,251, 24, 32, 82,192, 95,125,
+247, 13,254,203,127,254, 27,252,199,191,253, 30,235,124,197,116, 62, 67, 9,137,167, 15, 79,240, 97, 69,215,113,112, 30,240,211,
+207,159,112, 58,156,208, 73,129,206, 8,240, 65, 3,189, 6,250,142, 4,193, 66, 32, 46, 19,221,105, 66, 64,136, 30,105,232,193,
+ 36, 67,252,233, 19,196,151, 27,190,252,203, 39, 92,206, 11,158,207, 11,102, 7, 68, 78,154, 2, 45, 57, 68,140,144,156, 97, 94,
+ 38,112, 38, 97,164,130, 18, 18,154, 51, 68,183,226,183,223, 62,162,239, 4, 12,103,192,188, 98,125,185,130,187, 8,158,128, 24,
+ 61, 56, 75,208,138,230,150, 33,250, 93, 19, 28, 19,145, 62,125,100,240,158, 98,130, 19, 34, 88, 2,228, 94,212,245, 14, 67,188,
+ 42,199,202, 12, 62,237,168,111, 91, 7,148,234,161, 95, 15,247, 42, 26,219, 98, 8,223,114,216,211, 22,180, 93,245, 97,105,199,
+ 81,111, 71,227, 37, 31,187,113, 59,109,130,215,152, 26,140, 76, 3,193,201,225, 5, 49, 67,112,216,166,241,207,172,247, 84,147,
+151,182, 45, 53,175, 22,156,125,150, 76,218, 30, 87, 34, 5,226, 86, 24, 52, 25,219,129, 85,181, 54,227, 77,218, 93,218,254,158,
+214,138, 70,130,165,244, 14, 77, 47,251,235,219, 9, 66,177, 90, 97,191,251,103,181, 35, 47,188,186,152,237,137,251,243,147, 62,
+ 72,141,141,239,254,125, 96,251,215,177, 45,196,138, 88,240,189, 92,118,220,105, 9,218,139, 16,185,168,192,238,117,222, 94, 82,
+126,207,104,111, 10,191,212,234, 40,210, 86,197,211, 24, 62,110, 33, 57,173, 55,177,229,207,191,113,222,163,190,239,237,164,105,
+123,142,155,194,177,133,179,212, 14, 61,195,247, 55,247,195, 94,117,189,255,104,108,213, 98,181,130,165, 4,163, 52,156, 13, 88,
+173, 69, 76,180, 11,214, 74, 67, 73, 13, 37, 21,158,158,158, 16, 99,196, 45, 78, 88,214,149,144,160, 57,107, 61,242,132,196, 19,
+124,116,224,156,110,214,215,219,149, 14,243, 16, 32,178, 18,217,135, 64,123, 73,198,128, 16,193, 56, 3, 79, 34, 39,137,169, 13,
+ 26, 34, 40, 0,164,112,206,185, 16,121,175,238,160, 21,237, 48,131, 39,234, 88, 76, 33,171,155,211, 62,237,173,133, 77,101,113,
+ 37,227,228,187,217,178,207,105, 92, 95,144,173, 5,196,194,235,247, 54,125, 0,109, 43, 66,102,152,199,236,131,231,208, 90,162,
+211,100, 15,243,142,172, 98, 12,172,122,219, 59, 99, 32, 25,135,207,129, 59,133, 84,198,177, 17,209,180,214,148,155,238, 45, 89,
+131,162,167,223,207, 25, 92,142,139,237,187, 30, 66, 73,112,150,234,148,228, 48, 14,224,140,225,249,249,153, 88, 13, 66, 82, 16,
+135, 34,214, 57, 3,131,148, 10,206, 5,172,171,133,226, 2, 76,208,127, 3, 79,208, 76, 1,160,209,243,243,203, 5, 82, 72, 60,
+ 61,156, 32, 56, 69,153,114, 36, 60,158,142, 8, 49, 63,102,193,209,117, 26, 62, 58,196,224, 97,114, 26,154,247, 49, 31,238,137,
+ 34,145,179,160,112, 60, 28,176, 44, 11, 14,199,177,242,232,165,214, 56, 28, 71,164,152,224,156, 5, 0,220,110, 55,218,185,119,
+ 61, 20,231, 88,115,209, 45,132,168,193, 51, 74, 18,182, 54, 6, 71,105,128, 41,161,211,134, 10,120,206,176,174, 11,137, 21, 21,
+225, 85,231,105, 38,232,140,228,121,138,197, 96,164, 2,148,106, 38,119,244, 81, 8,153, 85,192, 56, 77, 52, 68,158, 0,150,181,
+175,200,130,176,232, 40,152, 40,177,108,173,245, 0,178, 96, 50, 70,218,215, 43, 67,175,251, 96, 6, 72,120,132,217, 34,121,139,
+ 14, 30,127,245, 96,240,219,255,245,191,224,255,184, 89,252,219,151, 87,188, 92,111,120,236, 13, 34,179,208,131,134,157, 7,252,
+248,211, 23, 60,116, 26, 66, 68,244, 60, 65, 49,138, 26, 22, 93, 79, 66,191, 65, 67,235, 30,233,124,129, 8, 9,108,114, 96,186,
+135,139, 2,235,203,132,215, 47,175,232,204, 35, 86,119,133,245, 30, 62, 37,124,250,252, 25,211,237,138,158, 11, 60, 29,142, 24,
+198, 35,220,234,225,108, 32,250,157, 25, 33,146,197,116,126,197,191,251, 79,255, 1,201, 58,252,183,127,248,127,112,236, 14,185,
+105,102,228,111, 15,235,230, 18,137,212,241, 23,253,113,200,205, 86,209,196,148, 40,104, 33, 57,196,177,127,252, 33, 86,207,116,
+220,241,142,203,156, 99, 15,155,217,186,244, 34, 96, 97,111,218,148,205, 95,158, 50,188,229,215,209,230,169,221, 30,211,223,199,
+ 43, 85,124,167,112,142,101, 50,144, 15,130, 66, 49,219,241,218, 75,119,213,162, 93,171,119,187,236,123,169,183,229, 41,213,174,
+171,252,179, 29,137, 49, 11,255, 26, 9, 88,126, 29, 8,118,147,119,243,237, 86,160,216,188, 16, 27, 91, 90,218,201,225,139,109,
+ 35, 84, 64, 14,171,129, 38, 85,110,198,232, 72, 46,196,244,152,117, 0, 5, 4,195,154,160,114,150,154,217, 69, 74,144, 44, 87,
+173, 60,131, 81,184,216, 40, 89,173,176,141,241,237,144, 44,107,147,234,185, 70,221, 75,199, 72,251, 27,145,147,154,138,151, 84,
+228, 17,115, 44,124,131,212,236,211,219, 2,174,236,246, 43,169,112,147,254,241, 92, 97,111,226,180, 70, 52, 87, 44, 79,229, 57,
+163,137,154, 44,169, 83,156,109,196,186,252, 26,166,152,182,199,144, 11,160,182, 56,100, 89, 17,206, 26, 22, 2,231,108,159, 1,
+ 0, 65, 55,238, 76, 80, 75, 25,140,195,179,118,128,241,205, 13,194,218,189, 70,177, 19,178, 6, 66,179,155, 46,176,220,117,136,
+205, 74,200, 68, 62, 80, 3,110,211, 13, 9, 30,140, 71, 60, 62, 28, 96,164, 6,151, 9, 93,111,208,229,195,227,233,195, 1,131,
+ 76,224,206, 65, 49, 78, 52,172, 20, 33,141, 65,168, 69,122, 66,140, 46,199,158,110, 69,146,224, 89,108,151,195,113,136, 99, 32,
+234,206, 92, 74, 9,169,117, 22,195,145,112, 43,102,145, 19,103,155, 18, 86,112,133, 88, 14,236, 24,179,111,150, 62,155, 82,171,
+250,122, 10, 33,107,254,118, 9,131, 81, 66, 80,144, 75,126,125, 4, 3,180, 96, 80, 28,208,146, 68, 65, 70, 73,244, 70,225, 56,
+ 24, 60, 30,122, 60,157, 6,156, 70,133, 99,175,240,116, 28, 96,180,132, 96, 17,189, 20,144, 44, 65, 32,192, 8, 6,197, 18,180,
+228,136, 33,192, 40,149,149,223, 52,194,245, 33,212,247,108, 90, 87,128,243, 28, 27,154,111,162,121, 76,106,140,198, 97, 60, 32,
+186,128,243,235, 43,214,117,133, 18, 2,206, 90, 60, 60, 62, 0,137,225,229,245, 12, 31,128,219,117, 69,215,245, 88, 87,135,105,
+162,131, 78, 42,242,177, 15,163,193,233,116,204,191, 95,192,104, 66,158, 74,193,208, 25,133,199,211, 9, 66, 50, 48, 22, 33, 4,
+195,225, 48,160,235, 13,164,150, 80, 70,130, 11,186,207, 10,150, 96, 58,133,190,239,192, 24, 42, 3,158, 64, 48,153,233,238,168,
+216, 34,188,176,133,214, 10,183,235, 21,214,174,164,168, 23, 58, 23,141, 18,118, 93, 48,223,110, 52,217,208, 58,227,119, 3,180,
+ 18, 80, 66,224,122, 57, 35,120, 79, 93,165, 18, 48, 90,131,165,132, 24, 2,250,174,203,142, 11, 79,190,105,162, 83,229, 17, 53,
+133,196, 20,213,174,119, 84,140,120,183, 66,102,145,151,181, 43, 1,157,144,104,171,233, 82, 93,173,196,204,201, 63, 14, 35,156,
+ 91,145, 98, 64, 8,142,178,197,179, 48, 86, 73,131, 16, 34, 58, 99, 16,220,138,190,147,232,164,132, 74, 9, 7, 41,240, 96, 36,
+140,240,248,254, 97,192,167,127,250, 39, 28,198, 17, 65, 9,124, 57,223,224,151,128,239, 78, 31, 17,230, 27, 14,163,193, 65, 25,
+ 64, 0,159,207,207, 88,157, 7,247, 9, 50,144,213, 44, 36, 11,174,104,175, 78,195,230, 72,159,167, 99, 15, 8, 1,188,204,248,
+252, 47, 63,225, 79,255,246, 5,147, 77, 96,227,128,159,159,127,129, 80, 18,145, 9, 68,174,241,122,181,184, 45, 1,211, 58,195,
+152, 14, 74, 48,176, 20, 96, 12, 67,111, 20,224, 3,190,123,250, 22, 95,254,248, 5,127,252,215,159, 96,250, 1,183,101,134, 84,
+ 18, 82, 50, 32,120,116, 90, 17,149, 83,208,217, 34,121,217, 29, 19, 41,210, 89, 90,223, 22,109, 76, 39, 36,196,177, 63,253,176,
+121,160,227, 14,165,248,110,254,239,155, 84,180,247,113,169, 59, 15,246, 59,190,236, 63, 23, 96,194, 27,235,211, 61, 40,162, 90,
+136,202, 65,125, 55,166,199, 29,195,123, 63,121, 72, 59,149,242,123,176,154, 92, 66,238, 3, 62,208, 54, 98,205, 72,188, 29,223,
+231, 98,129,191,179, 67, 47,191,164,142, 44,145, 16,238,246,198,233,190,176,105,236,112,177,153,166,108,217,225,219,127,111, 94,
+ 4,250, 0, 9,202,126,230,133,179,205,178,239,177,226, 65,121,117, 52,108,123,229,109, 37,210,174,240, 67, 76, 68, 42, 18,146,
+188,167,140, 70, 96, 34, 39, 5,145, 72, 46,179,199, 43,219, 27,245,198,206,218, 53, 72, 67,239, 43,133, 99, 89,155,240, 6, 20,
+147,154,101, 8, 26,129, 21,208,226, 63,223, 50, 5,246, 29,119, 97, 23,176,183, 37,100,251,190,222, 69, 5, 19,129,143,239,160,
+ 51,229,162,217,137, 12, 55, 74, 78,245,163,179, 29,212,135, 53, 78,131,253,248,158,146,171, 36, 66,244,123,107, 93,214, 43,176,
+236,193,142, 41, 97,181, 43,144, 34, 58, 46,208,167,136,255,237,239,255, 22,255,251,255,252, 63,225,239,186, 30,127,253,244,128,
+199,211,128,135,193,192,112, 42,232, 88, 74,121,127, 76, 35, 81,145, 3,120, 10,193,138,115,129,174,239, 73,136,196, 40,218,179,
+ 76, 81,132, 16,208,157,222, 82,196,212, 22, 67, 76, 33, 36, 41,123,139, 1,149,163, 87, 43,241, 74,211,174,185,252, 89,202,114,
+111, 18,206, 98,200, 55, 38,218, 77,147,199, 89, 98, 28,122,116,157,196,216, 27,244,249, 64, 31, 59,141,222, 40, 40, 14, 24, 45,
+192, 83,128,150, 12,200, 81,165,130, 51, 4,103,145, 2, 5,195,164,156, 0,199,115,145, 70, 29,179,203, 16, 28,151, 61,247,116,
+232, 17, 93,141,196,103, 42,147,231,250,190,195,113, 60,160, 51, 38,235, 36,169, 40, 95, 45, 49,247,157,117, 96,156,213, 17,185,
+ 54,196, 67,215,218, 96, 89, 38, 60, 60, 60,224,245,245, 21, 33,164, 92, 64,167,140, 67,205, 62,127,187,224,244,120,196,227,195,
+ 9,227,208, 35,197, 0, 31, 28, 24, 34, 58,163, 41,230,148, 51,244, 67,135,206,104, 12,125, 7,173, 36,148,204, 54,176,213, 18,
+165, 44,135,254,148,132,179,206,116,185,211,143,152,167, 25,203, 60,211,206,156,137,140,148,245,176,171,195,186,172, 68, 32, 20,
+164, 63,234,250, 1,171,115,152,150, 5,253, 48,128, 51,137,101,186, 34,196,128,135,135, 39, 8, 33, 48, 47, 51, 4,231, 21,214,
+211, 25, 67, 5,130,214,232,186, 14, 82,208, 53, 21,235, 99,209,249,189, 33,125, 71,129, 2, 73, 46,234, 40, 94,107,133,213, 90,
+ 4, 79,105, 99, 34,103, 31, 8, 41, 49,142, 3,192, 25,174,215, 43, 16, 35,156,179,244,251, 99,162,212, 61, 48,200,140,224, 29,
+ 58,131, 20, 3, 4,128,209, 40,136, 20,193,131,197,135,135, 17,235,124,197, 95,125,255, 29, 78,135, 3,254,191,255,254, 15,120,
+190, 76,184,204, 14,209,115, 12, 66, 67, 6, 15, 17, 28, 14, 74,225,233,225, 4,112, 1, 23,128, 95,158, 47, 72,137, 65, 51, 1,
+205, 24,152, 96,224,199, 17,105, 93,193, 23, 11,172, 14, 97,157,193, 98,130,123,189,226,246,122,198,235,121,197,231,243, 21,230,
+112,132, 96, 18,163, 25,136,211,159, 53, 76, 82, 8, 4,159,224,173,135,204,233,144,227, 56,160,235, 12,192, 34,110,183, 87,252,
+219, 63,255, 17,118, 37,120, 78,202,116,189,224, 28, 56, 18, 58,173,106, 40, 18, 7, 39,126, 66,206,187, 72,137,101,129, 92,246,
+217,112,142, 20, 34,196,113, 56,252,176,131,196,220, 41, 95,255,220,225,251,231,254,204,215,254,251,159, 61,212, 57,111, 14,156,
+183, 40,213, 86,236,246, 94,223,255,213,248,246,252, 98,164, 18,213,201,182, 46, 28,140,111, 7,100,123, 88,238,164,209,219, 33,
+ 85,249,223,169, 61,184,190, 86,176,236,161, 26,145, 81, 87, 19,217, 38, 18,100, 59,193,224,238,156, 70,220,188, 82,141,240,235,
+ 13, 42, 47,251,114,233, 80,103,121,159,206,139, 42,156,101, 47,121, 86,131,167,157, 74,191,116,204,153, 19,158,163, 48, 67,214,
+233, 33,135,185,240,188, 59,227,249,247,150, 67,189, 60, 12,234,188, 55,228,232,150,102,150,197,131, 37, 26,138,111, 34,199,114,
+152,111,208,161,214, 28,183,137, 64, 88,101,191,239,227,106,217, 59, 65, 56,251,226,238,254,253,136,141, 83, 99,243,206, 23, 40,
+ 78, 89,204,112,150,178,218, 31, 53,183,128, 55, 98,202,244, 78,232,204,230,247,231,123,139,220,174, 40,229, 77,198,249,230, 62,
+ 72, 41, 66, 72, 14, 32,230,155, 60,125, 14,214,117,134,214,146,222, 31,191,224, 63,126,115,194,255,242,219, 15, 48,225, 10,206,
+ 29,152,183,208, 44, 65, 32, 65, 10, 14,187,172,184, 94,174, 8, 62,193, 5, 26,241, 23, 59, 90, 25,177, 47, 51, 41,130,157,245,
+ 88, 87, 18,134, 13, 67, 71,217,218,206, 2, 49,162,211, 10, 74,112, 28,143, 35,250,142, 48,156, 36,232, 51, 24,134, 30, 41, 37,
+104,173,161, 53,221,144,133, 84, 80,138, 96, 44,214, 90, 36,164,236, 37, 47, 7, 3, 81,223, 4,223,108,100, 49, 56, 8, 1, 24,
+201,105,255,157, 18, 20,231, 72,209,195,104, 14, 36, 7, 37, 25,137,222,180,204, 2, 77,134,232, 61,250,206,100,161, 41, 69,206,
+202,108,221, 20,138, 4,116,198, 24, 18,139,165, 60,233, 48,134,226,139, 51,173,109,153,103,104,165,200,174,231,168, 91, 13, 57,
+169, 44,101,244,244,241, 72, 35,109,165, 53,180, 54,212,113, 25, 34,166,157, 47,103, 56,239,209,245, 26, 31, 62, 60,193, 24,157,
+237,100, 84,252, 80,114, 25,199,120, 24,112, 60, 29,192,115,151,205,115, 12, 43,231, 44, 23, 52,212,209,167,148, 48,221, 38,220,
+174, 87, 92,175, 23,204,243, 12, 41, 4,198,225,128, 24, 34,164,146,117,127,204, 24, 48, 77, 55,132,224,242,245, 46,242,107, 45,
+ 48,221, 38,218,187, 11,250,243,198,116, 72, 33,135,200,128,129, 21, 97, 30,163, 66,253,229,153, 68,153,199,195, 1, 49,166, 44,
+146, 83, 24,114,193,192, 5, 21,103, 52,225, 97, 53,160,166,235,123, 28,142, 7, 24,163,192, 37,135,181, 43,162,119,112,171,173,
+140,140, 34,130, 43,108,128,152,167, 58, 92,146,178,189, 27, 6, 74,173,235, 12, 34, 75,152,231, 25, 28,192,146,173,110,109,228,
+110,153,241, 73, 45, 17,146, 35, 46, 60, 56,140,228, 56, 13, 10, 15, 71, 3, 45, 57,137,249,206, 87,252,187,223,126,135, 81, 15,
+120,121,189,226,249, 54,227,236, 29, 46,126,133, 24, 21, 46,235, 5, 71, 5,116, 74,226,155,199, 39, 48,159,192, 66,196,124,187,
+ 34, 69, 7,183,222, 16, 18, 32,100, 15, 54, 7,224,234,176,188, 94, 17,185,132,236, 71,192, 39, 28,187, 19, 62,127,126,193,101,
+246, 0, 55, 48,114,128, 95, 28, 82,136,120,120, 60, 96, 28, 52, 4, 34, 36, 72,184,108, 87,130, 74,105,163,241,241,227, 19,130,
+ 11,248,231,127,248,103, 76, 55,135,152, 40,171,222,232,158,166,131,121,102, 43, 5,135,144, 12,146,209, 84, 57,133, 8, 41, 53,
+ 66, 72,240, 49, 18,247, 61,100, 39, 80, 78,197,148,251, 3,175, 65,104, 52, 89,228,191,118, 40,255, 90, 20,107,219,149,124, 45,
+ 7,253, 47, 57,236,171,136,134,237,180, 97, 95, 63,192,223,248,204,223, 63,248,105,247,243, 14, 19,167, 1,105,236,146,183,202,
+ 81,154,119,251,224,165, 51,216, 30, 87,250, 26,199,189, 81,147,239,205,106,251, 34,128, 37,188,131,226,205, 34,136, 70, 57,158,
+114, 71,198,218,212,182,148, 26,245, 62,111, 58,202,109, 28,189, 75,158,202,163,224,148, 53, 7, 53, 58,245,157, 87,138, 51,209,
+ 76, 69,226,155,100,181,132,176,243,139,183,196,190,150, 11,144,242,248,187,173,151, 82,243,103,118,131,234, 28, 38,148,216, 38,
+150, 18,172,224,144,242,148,224,110,141,205,238, 86, 58,241,157,129, 77,106, 58,124,198,246,118,203, 77, 93, 91, 68,127,121,108,
+ 93,245, 7,133,126,245, 94,177,240,245,253, 61,242,136,191,136, 15,105, 55,234,161, 52, 7,139, 44,223,188,202,254,152,246,138,
+ 52, 18, 37,251, 32, 23, 64, 96, 12,188,147,184, 76,175,224, 34,192, 49,139, 0,139,228, 22,248,121,197,116,190,194, 70, 14,191,
+174,136,222,131, 27,141, 20, 2,188,179, 20,243,202,139,109,117, 35,171, 17, 33,140,225,225,225,152,111,250, 1,206,211, 33,175,
+ 13,117,123,235,186, 64, 42, 13,105, 36,142,250, 64,106,252,101,193,234, 87, 12,195, 0,128,195, 71, 2,221,220,110, 83,213,137,
+144,181,142,166, 17, 33,250,109,238,146, 80,189,229,135, 67, 15,111, 45, 38, 59, 35,229, 46, 93, 42, 77,150,189,108,217, 72, 33,
+100,101, 57,229,212,115,136, 28,152,148,114,231, 73, 7,183, 40, 94,118,206,145, 68, 14,124, 78, 20, 89, 90,232,120,206,145,242,
+ 92, 73, 3,183, 90,188,174,150,216,229,146,124,215,195, 97,192,203,203, 13, 58,171,227, 67,240,248,238,187,239,240,227,143, 63,
+ 99, 93, 46,144, 82,224,241,195, 3,230,121,198,239,255,250,247,132,245, 77, 9, 47, 47,191, 64,107, 77, 96, 24,165, 17, 83,194,
+ 50, 79, 64, 12, 88,151, 5, 41, 25, 48, 70, 76,118, 82,169,115, 8,174,177,174, 43,150,117,197,249,114,193,235,235, 5,203, 66,
+217,228, 74, 10, 72, 37, 97,221, 11, 36,191, 85, 56, 15,227, 46, 23,131, 4,142,161,105,128,135, 16,228,145, 31,122,234,244,175,
+ 57, 56, 36,184,136,121,154, 8, 76,211, 83,132,171,183, 43, 66, 70, 7,199, 24, 49,246, 61,162,247, 88,166, 25,156, 49,204,211,
+ 4,183,208,216,155,172,116, 38,191,206,200, 5, 14,101,190,207, 51,177, 20,180,166,240,150,190,235, 97,231,105, 27,187, 7, 18,
+212,133, 20,235, 8,159, 11, 78,147,146,156,228, 22, 35, 21, 92,235,188,192,249, 53,231, 32, 44,116,111,138,196,187, 72, 89, 15,
+ 34,149,202,249, 0, 1, 49, 49, 36, 46,128, 72,215,180, 80, 12, 74, 83,227, 97,186, 1, 95, 62,255,140,207, 95, 94,112,234,123,
+252,221,247,223, 67, 12, 39,252, 95,255,248,207, 20,150,195, 57,226, 18,208,127, 24,144,150,128,217,158, 41,128, 69, 57, 44, 46,
+194,174,180, 34, 58,255,195, 79,144,191,204, 56, 30, 6, 28,198, 14,195,239,190, 67,232, 37,152, 86,224,107, 0,139, 51,142,166,
+ 3, 79, 47,184, 93,206,208,250,132,203,117,194,235,116, 1, 59,255,130,111,127,251, 13, 6,163, 16, 65,174,148,195,135, 7,184,
+176,130, 43, 74,156,187,190,174,176,147, 68,130,134,141, 43,188,143, 56,112, 14,231, 29, 24, 35, 27,219,226, 28,184,144,232,140,
+202, 60,120, 15, 30, 40,160, 39,230, 38,148,114, 29,200,125, 96,180,132, 44, 29,203,198, 14,103,117,175,122,159, 51,253, 94, 55,
+253, 94,238,249,175, 29,212,247, 33, 26,191,174,252,142,111,121, 53,247, 58, 62,206,222,166,197, 49,246, 70,113,254,238,243, 40,
+ 63,147,176, 27,153,239,189,211, 57, 47, 57,149,125, 59, 32,182,200,176,157, 40,175,116,114, 95,179,191,239,236,121,101,184,156,
+ 90,223, 57,170, 5,176, 4,178,108, 97, 22,172,177,125,181,175,199,150,169, 89, 30, 27,125, 32, 34, 82, 0, 82,222, 89,162,161,
+234,149, 85, 1,234,251,199,246, 9,105,213,118,200,182, 0,159, 18,220,146, 34, 5,149,176,180, 27,131, 87,207,126,115,224,177,
+157,192, 47,221,209,231, 26,245,121,253,251,223,138,205, 24, 3,120, 73, 24, 75,109,218,222, 30,225,187, 21, 69,137, 4, 93,141,
+ 10, 3,111, 70,249,156,180, 33,247,145,195,252,206,245, 81, 52, 6, 57,152,168,197,228,221,231, 6,252,218,117,191, 23,224,221,
+ 33,133, 19,203,140,246, 0,198,200,227, 91,186, 37,109, 8,234, 34, 36,237,181,185, 16, 8, 43, 48,221, 44,236,146, 48, 93, 61,
+ 94,167, 21,159,175, 43,206,214,226,101,177,184,250, 4,155, 18,134,211, 9, 66,107,168, 24, 49,164, 30, 74, 10, 88,235,192, 56,
+161, 66,139,101,172,122,183, 37,131,136, 12, 42, 73, 88,187, 64, 41,133,211,233,152,233,117, 2,231,203, 5, 44,123,154,129, 8,
+ 99, 36, 98,210, 36,166,211, 26,171,119,112,139, 67,167, 53,150,217, 82,151,218, 41,248,213, 86, 11,158, 86, 18,146, 75, 68, 31,
+225,173, 67,159, 57,227,130, 49, 24,213,129,165, 72,161, 53,185,192, 9,193,147, 10,154,111, 92,136, 24,129,196,104,223, 31, 17,
+242,103, 36,213,177, 56,141,115, 69,214, 16,208, 91, 38, 51, 96, 6, 49,119,249, 33, 98,186, 94, 17, 44, 25,103, 25,167, 38, 96,
+ 28, 15,112,214,193, 24, 5,107,109,133,239,132, 16,240,205,199,111,240,203, 47, 95,240,242,114,198,225, 56,162,235, 58,162,173,
+205, 11,161, 79, 37,197,236, 46,243, 4,123,126, 69,204, 1, 48, 18, 64,223, 31, 72, 11,148, 34,236,186,226,245,245,138,113, 24,
+ 96, 87,139,121, 93,192,149, 68, 12,192,188,122,196,196,193,146,128,247,168,193, 51,107,152, 16, 19,113,220,141, 49,164,249,200,
+ 86, 49, 45, 76,214,183, 80,225, 18, 67, 4,231,192, 55, 31,159,114, 96, 10,135, 60,142, 88,230, 9,126, 93,224, 45, 42, 2,182,
+ 88, 30,189,119,240,206, 99, 13, 1, 90,146, 50,127,154,103,120,107, 49,223, 38,168,108,131, 59,158, 14,120,120,164,130,102,181,
+150, 94,251,140,248, 85, 82,130, 43,142,163,121, 0, 18, 48,207, 55,154,122,196, 4, 35,168, 83, 85, 74, 1, 12,112,214, 98,177,
+ 30,130,145,176,240,124, 62, 35,248,128, 24, 9,148,164,238,109,162,130, 87, 97,114, 8, 1, 42, 73,210, 73, 4,178,245,121,112,
+156,167, 27,130, 3,126,243,244, 1, 33, 69,136,135, 3,254,251,203,207,248,247,253,247, 96, 2,232, 13,195,227,193,224, 60,175,
+232,164,130, 25, 31,112,185, 94,241,237,239,127, 3,182, 78, 48, 44,160, 59, 38, 4,217,225,248,241, 3,212,216, 35, 32, 66,157,
+ 70, 26,195, 27, 6, 12, 18, 98, 80,132, 45,159, 86, 72,172,248,230,116,128,255,253,239,240,223,254,244, 5,211, 50,129,117, 6,
+118, 58, 67,114, 9,187, 58, 40, 67,171,200,167,167, 3, 56, 15,248,246,195, 1, 79, 15, 71,176,164,240, 95, 95, 94, 49,173, 12,
+ 62, 11,202, 61,128,155,115,144, 41, 66,247, 26, 30,196, 25,232,153,202,164, 68, 1, 46, 0,231, 50,121, 52,135,231, 72, 65, 60,
+121,145, 18, 36, 0,249,150, 93,158, 15,246,244,246,144,126,155, 73,254,235, 17,164, 95,203, 54,255,181,206,188,165, 80,189,179,
+ 14,255,213, 17,255,253,243,104,255, 79, 52,183,248, 55, 96,119,214,218,126,168,187,107, 19, 92,202,111,227,105,195,157,242,230,
+140,190, 31,149,255,218,108,224,141,240,127,199,191,103, 85,205, 95, 8,118, 44, 71,235, 84,206,123,203, 66, 47,249,195,213,210,
+ 87, 14,122, 86, 11,140, 34, 36, 68,163,226,222,173, 68,242, 15,209,249,252,118,117,176,235,221,211,198, 17, 40,147,142,194, 20,
+ 96,105, 11, 64,225,205,196,129,189, 25,147,239, 5, 4,181, 83, 78,216, 57, 9,144,129, 34, 69,200,199,155,196,129, 74, 24, 76,
+123,222,112, 25,181,167,132, 6,116,243, 14,224, 63,165,173,176,105,128, 57, 44,187, 54,120, 89, 5,176,141,189, 80,120,229, 44,
+181,128,163,244,171, 81,196,111,175,195,180,187, 86,139,114,158,115, 1,150,111, 80,219, 65,203,238,212,205, 18,130, 41, 88, 88,
+252,124,158,241,143,159,206,248,167, 31, 95,241,243,106,241,243,108,113,177, 22,215,200,113,245, 14,221, 56, 18, 77, 43,120, 12,
+ 67, 71,112,163,108, 43, 85, 82,129,101,225, 86, 12, 17,222,163,242,164, 57,207,169, 92,138, 18,185,140, 50,152,174, 19, 98, 72,
+116,104,129, 97,158,174,208, 90, 67, 41, 73, 22,177, 44,162, 67,222, 65,123, 23, 97,140, 2, 99, 29,140,201,227,241, 68, 32,157,
+ 20, 35,184, 18, 80, 82,209,244,136,115,172,118, 33, 5,123, 66, 77, 64, 43,104,100, 33, 37,132,104, 65, 68, 4,145,161, 84, 56,
+153, 5, 94, 30, 42, 67,117,130, 79,224, 50,239,251,165,216,180, 44,156,244, 43, 82,208, 40,217,171,128,213,134,188,106, 42, 25,
+227, 11, 94,207, 23,124,248,248,136, 48, 79, 48,166,199, 52, 47,120,122,124,194, 52,173, 56,157, 78,100, 33,243, 14,159, 62,125,
+198,120,232,193,133, 34,192, 81,177,144,230,177, 54,192, 48, 47, 22,151,215, 43,130,117, 8,241, 23,124,255,253,119, 20,122,227,
+ 1, 33, 12,214,149,186,171, 16, 19,230,219, 2,193, 21, 4, 87,249,186,205, 94,112,235,179,237, 43,146,126, 37, 0,222,122, 26,
+111,103,251, 94,215,245,245, 57, 19,228,165, 16, 4, 21,250,227,136,219,109,130,212, 2, 90,112,188, 60, 63, 19,241,206,249, 45,
+ 72,133, 19,221, 76, 40,133, 57, 68, 92,110, 87, 28, 48,146,165, 45, 37, 88, 75,222,246,219, 60, 17,142, 53, 70,152, 78, 35, 88,
+ 42,192,144, 87, 50, 33, 4, 96,221, 82,235,164,214,232, 6,162,231,205,211, 76,227,251,117, 65, 8,101,122,162,225, 66,160, 66,
+ 51, 71, 55, 35,210,152,190, 56,145,136, 90, 72,235, 62,235, 60, 84,207,145, 66,128, 93, 86,140,199, 3,124, 12, 80, 90, 33, 9,
+ 14,151,128,196, 21,172, 11, 36,126,206, 34,188, 94, 41, 8, 31, 48,177,132,199, 78,227, 54,207,112,206, 98, 52, 29,126,250,229,
+ 19,126,243,109,196, 55,218,224, 36, 73,155, 33, 14, 3,208, 9,136, 15, 39,120, 22,193, 21, 9, 25, 3, 15, 96,130,129,229,117,
+ 82, 48, 2, 16, 12, 34, 58, 60, 14, 6,223,126,120,192,213,115, 76, 54,226, 98,123, 60, 60, 61, 0,150, 2,152,166,213, 66, 74,
+129,239, 62,140,232,146,197,247,143, 71, 44, 81,225,114,123,197, 53, 0, 96, 18, 8, 17,137,113,204, 62,128, 5, 7,169, 56, 18,
+ 79, 24,180,193,234, 2, 12, 99, 72,136,144,140, 19,254, 25, 12,206, 5,242,231,203,236,169, 15, 17, 41,120,136, 67, 63,252, 80,
+ 70,130, 49, 54, 99,107,246, 62, 98,243,235,201, 86,191,190, 79,255,181,223,129,175,110,160,255,220,120, 19,239,134, 64,220,223,
+ 76,249,206,169,251,254,225,219,250,217, 83,235,115,207, 89,220,237,145,196,154,240,147,123, 31,252, 87,159,210, 61, 0,159,237,
+217,164,123,112, 77, 25,243,223, 61,204,157,255,176, 61, 88, 82, 85, 88,163, 9,205, 16, 98,243,239,190,143, 75,221, 94,231,157,
+147, 43,179,195, 35,216,142, 40,199, 50,157,174,238,203, 75, 96, 57,163,200, 86,145,199,238, 34,167,105,177,202,134, 45,141, 56,
+223,237,190,235, 14,187, 10,227, 54,139, 89, 98,233, 77,245, 83,166, 50,169, 14,224,223,190,153,187,220,120,246, 94,224, 64, 75,
+137, 19, 85,212,135, 12,147,217,242,211,139,110,160, 97,164,179,141, 34, 87, 40,125,247,215,249,126,205,180,135,221,236,223,131,
+237, 90, 41, 63, 19,147,175, 62,233, 16,136,208,166,184,172, 72,215,117,161,132,172,243,116,197, 28, 44,254,245,249,140, 63, 94,
+102,252, 98, 29,102, 48,204, 9,224, 70, 67,247, 29,164, 22,240,145,130, 69,100, 78,120, 34, 43, 76,204,153,204,164,182,143, 49,
+230, 76,110, 65,144, 20,231, 72, 4, 37, 37,198,225,128, 79,159,190, 32,134,136,195,241, 8,211, 25,138,236,204, 35,121,163,117,
+245, 59, 27,211, 65, 10, 9,173, 13, 56, 39,250,213,186,174,152,166, 25,214, 90,218, 87,199,132,105,158,177, 46,115, 78,117,243,
+ 59,193,163,224, 28, 74, 73,128,145, 2,189, 68,201, 34,171,242,139, 31, 90, 8, 90, 37,145,240, 47, 23,222,145,174,143, 88, 35,
+136,233,117,182,118,173,251,109, 48,142,224, 99,126,225, 5,124,126, 76,156, 11, 98,103,251, 64,190,116,165,114,188, 47,131,115,
+ 30,195,208,227,114,121,197,199,143,143,212, 61, 75, 1,107,125,198,181, 42,232, 76,178,227,140, 84,246,118,117,208,218, 32,248,
+136,121,166,241,254, 52, 77, 0,231,120,121,121,197, 50,211,110,117, 28, 15,232,135, 2, 11,163,109, 0, 0, 32, 0, 73, 68, 65,
+ 84,158, 14,199, 8, 44,179, 37,206,148,139,245,106, 21, 57,214, 84,144, 93, 1, 33, 99,127,163,143,112,214,193, 46, 22,193,123,
+116,166, 3,139, 52,146,103, 12,184,221, 38,172,203,130,190,239,179,239,221,161,235, 7, 88, 71,193, 34,214,249,138,167, 38,124,
+ 48, 0, 33, 32,164,192,229, 54,147,134, 32, 3,112,116,103, 8,203,106, 12,164, 82,132,246,205,226, 54,210, 13,144, 4, 95, 10,
+ 9,112, 96,181, 22,215,219, 45,139,220, 34,116, 22, 45,122,151, 51,233, 99, 73,178, 36,158,122,181,180,102,135,133,104,128, 88,
+ 37, 96,135, 50, 3, 8,160,163,132,130,146, 10, 41, 38, 40, 45,144, 16, 48,244, 35,120, 4, 70,165, 49, 26, 5,153, 40,182,181,
+147, 28,154,147,114,255, 60,205,184,174, 22, 62, 70, 28,250, 17,243,141, 98, 90, 15,163, 38, 39, 69,167,137,175, 63,246, 72, 42,
+129,143, 6, 44, 39, 34, 50, 45,193, 36, 7,239,122,164,200, 0,155,192, 46,228, 45,159,150, 21, 75, 12, 56,156, 78, 8,209,225,
+114,121, 69,223,107,252,230,155,143,248,240,244,136,243,245,140,243,243, 51, 88,138, 56,245, 29,158, 62,124,192,203,249,130,255,
+243,255,254,175,176, 76,131, 49, 2, 0, 37, 38, 16,114, 51, 19,243, 1,110,148, 70,116, 1, 60, 5, 40,153,197,174, 53,167, 33,
+ 39, 78,166, 28,123,155, 60, 24, 2,196,216, 15, 63,164, 26,137,216, 18,210,176, 59, 12,118, 97, 22,205,215,159, 83,178,191,215,
+221,255, 37, 2,188,183, 99, 88,214, 34,215,223, 20, 29,191, 54,214,191,239,202,216,123,135, 58,246,135,122,233,208,217,187,202,
+124,236, 58,245,247,146,222,254,236,161, 94,208,184,247,199, 82, 35,208, 99,237, 55, 26, 10,223,254, 37, 10,197,116, 93, 89, 0,
+162, 97, 4,111,135, 48,171,170,238,134,169,139,130,131, 35,114,222,254, 80, 79, 96,217, 15,153, 75,163,204,232, 23,156,213,136,
+213,178,241, 23, 89,233, 74, 7, 30,175,138,246, 10,127, 97,155, 85, 47,181,201, 43,153,247,143, 6,210, 2,236, 51, 98,203,183,
+202, 46, 59,221, 17,224,208,164,188,213, 81, 63,195,251,222,243,122,200,102,218, 94, 21, 61,102, 59, 94,141,170,101, 16, 72, 53,
+ 64,164, 22, 95,104, 34, 34,249,175, 95,203, 27, 60, 37,131, 95,248,219,201, 66, 97,103, 35,135,142, 8,201,169,144,224, 9,222,
+ 59, 92,207, 23, 88,239,176,174, 43,145,226,144, 96,225,113,177, 51, 46, 54,130, 15, 7,200,174, 67, 82, 18,178,211,232,199,161,
+138,237, 40,147,219,208, 36, 38, 16,185,174,208,225,188, 15,180,255, 78,116,168,115,193,112, 62,159,243, 94,184, 7, 7,135,247,
+212,101, 1, 28, 31, 63,126,132, 54,116,115, 94,215,149,176,179, 82, 98,158,103,120,239, 49,207,148, 9,125,187,205, 68, 30,203,
+ 54,182,146,248, 69,121,227,128, 54,164,152,239, 58,131, 24, 29,184, 96,232,250, 46, 31, 76,122, 19,206,105,153,185,236, 4,212,
+ 81, 82, 18, 65,172, 20, 95,137, 10, 72,196,226, 60,200,241, 75, 57,145,174,100,129, 83, 65, 4, 8, 38, 17, 66,206, 74,207,177,
+194,224,130,154, 67, 48, 8, 65,135, 85,241,246, 91, 23, 48,244, 3, 46,215, 27,156, 91, 48,142, 3, 81,230,140,134,247, 17, 90,
+ 25, 2,181, 48, 78,251, 99,107, 51,175,159,116, 8, 82, 81,193,211,247, 35, 57, 3,148,198, 48,142,100,171, 3,189,183,231,243,
+ 25,222, 57,172,203,140,105, 38, 22,123, 10, 91,118, 2, 71, 34,113,100,140, 72,129,214, 7,217, 33,156,131,177, 5,162, 39,154,
+156,181,107, 21,148, 89, 71,239, 77, 74, 9,231,215, 51, 0, 96, 24, 71, 92,175, 19,198,195, 17,166,235,234, 84,100,181, 14,203,
+186,194,133, 0,161, 20,134,195,136,110, 24, 32,148,130, 50, 6,170,211, 80,198,128, 75,142,213,174,224, 92, 96, 89, 22, 44,203,
+ 10, 48, 6, 93, 99, 86,169, 99,119,150, 88,239,209, 19, 80,102,153, 22,204,243, 4,163,116,189,254, 24, 24,253, 57,231, 43, 81,
+142, 37,130,224,240,130, 41,231, 13,104, 43,139,183,121,158,224,112,198, 33,153, 66,215,169, 58, 89, 74, 46, 66, 51,178,182, 61,
+244, 10,209,174, 64,140, 56, 29, 59, 60,140, 61, 6,211,129,171, 14,159, 95,206,184, 77, 11, 14,221, 8,173, 20,172, 95, 48,244,
+ 6,189, 82, 48, 66, 17, 60, 71,113, 36,149,192, 58, 1, 38, 56,224, 45,193,211, 36, 3,151, 25,158,181, 56,240,171, 67, 92, 45,
+212, 48,192, 51, 2,143, 46,183, 9,199,177,199,249,252, 12, 41, 24, 30,198, 14,223, 60,246, 24, 15, 3,152,144,184,204, 19, 18,
+ 23,120,126,190,226, 31,254,241, 71,164,212, 35, 6,186,183,248,152, 96, 67, 4, 24, 71,116, 1,189,210,144,137, 65, 50, 14,201,
+ 19,148, 16, 16,140, 82, 18,131,143, 52,142,103, 2,130, 73, 48, 14, 72,197, 96,148,132, 56,116,135, 31,202,168,183, 48,150,139,
+237, 11,187,138,233,237, 94,252,207,217,211,222,198,139,254,101,251,244,251, 40, 21,214,140,201, 55,142,120,222, 33,179, 28, 28,
+ 82,246,173,245,241, 54,194,240, 93, 55, 77,194,176,246, 48, 21,105,159, 36,198,203, 77,191, 46,117, 43, 63,181, 77,123, 39,245,
+ 58, 54,130, 92,100,169,177,153, 21,143, 63,223,136,104,108, 15,175,217, 65,213,210, 86,124,176,187,185, 64,125, 46,188,141,139,
+141,149,189, 93,252,219, 69,208, 39, 5,145,157, 56, 47,238,188,114,120, 52,147, 5, 94,226,106,201,222,150, 26, 29, 69,140, 9,
+ 62,134, 93,136, 13, 75, 13,169,142, 21, 90, 96,106, 38, 5,169,170,220, 5,207, 7, 52,127, 59,119, 97, 28,251, 64, 25,198,118,
+ 7, 45,238, 95, 23,214,188, 39,197,110,214,142,205,115,129,193, 91,182,120,139, 18,110, 11,136, 6, 27,204,243, 84,129, 55, 5,
+ 2,221, 76,242,225,206,177, 43,136,176,139,101,109,112,194,191,178, 78,226,119,236,248, 66,217, 35, 93, 66, 2, 23, 9, 82, 9,
+112,158,192,121,132, 82,100,241, 18,146, 50,195,149,148, 24,251, 30,253,216,193,100,143,177, 80, 2,253,208, 3,156,163, 27, 15,
+240, 0,162, 96,100, 39,211, 26,203, 66,234,225, 15, 31,158,208,117, 29,156,181,184, 92,175, 21,255, 89,186,227,243,249, 76,234,
+238, 60, 86,238,250, 17,183, 43,117,208, 74, 42, 44,235,140,195, 56, 64, 41,129,143, 31,159, 16, 17,177, 44, 43,172,165,176, 17,
+ 74,246, 10, 0, 56,172,181, 88, 87,178, 43,157, 30, 78, 84, 20, 8,134,105,158, 48, 77, 19,172, 93,115,110, 55,141, 93, 15,227,
+ 1,211,109,130, 16, 2,135,227,136,121,162,189,237, 50, 45, 96, 44,225, 48,246, 80,138,104,103, 50,163,114, 99,238, 8,131, 39,
+161, 88,171, 2, 39,194,154,170, 24,233, 4,150, 17,173,148,253, 46,184,168, 68,198,146, 21, 30, 60,224, 28,117,239,222, 7, 72,
+109,160,181, 66,215,119,212, 9, 39,218, 77, 63, 61, 61, 32,196, 0,235, 22,104,163, 48,140, 7,244,253,136,235,117,193,243,203,
+ 23, 44,203, 2,198,129,126,232,241,240,248, 8, 46, 36,164, 82,249,240,142, 56, 30, 6, 28, 15, 35,134, 65, 3, 41,224, 56,246,
+240,118,133,181, 43,198,129,138,130,101,154,193, 18, 67,167, 52, 9,228, 56, 21,118,156, 87, 78,100,182,126,115,196,200, 16,178,
+205,148, 48,161, 9,171, 11,112, 46, 98, 89, 45,184,160,235,227,114,190, 0,156,225,225,244,136,196, 56,166,121,197,241,116,130,
+202,206, 4,211,119, 96,156,227,112, 24, 49, 30, 70, 12,135, 17,199,227, 9, 41,165,156,244,214,195,230,199,201, 56,200,241,208,
+117,144, 92, 64, 10,145, 45,109,188,242,200, 99, 44,122, 32,142, 16, 34,164,144,176,150, 30,143,224, 60, 39, 4, 18,252, 39,250,
+128,152, 25,242,116,219,225, 53, 65,111, 23,185,219, 64,189, 56,103,196,124,143,137,222,235,204,126,239,255,127,206,222,173, 71,
+178, 44, 61,207,123,214,105,239, 29,135,204, 58,116,247,116,207,104, 6, 34, 41,202, 4, 45,139,146, 32, 64, 23, 6,104, 73,134,
+161,159,224, 27,255, 25,254, 48,223, 9, 16, 12, 19, 48,108,194, 38, 65,145, 28,145,156,153,102,119, 87, 87,101,101,102,196, 62,
+172,163, 47,190,181, 15, 17,153, 89,221,195, 2,102,170,187,186, 50, 35, 50, 98,199, 94,223,225,125,159,183, 6,230,228, 34, 58,
+ 20,163, 20,141,179,148, 24,241,211,153, 95,252,252, 75,202,216, 19,251,158,182,107, 25, 82,226,190, 31, 9, 17,110,118, 29,133,
+192, 23,183, 7, 62,191, 57,208, 29,118, 20, 3, 73, 37,212,190, 67,117, 22,140, 38,141, 35, 86,137,126,160, 52, 6, 93,192,191,
+187, 67, 61, 12, 20,101,248,187, 95,127,139,109, 15, 28,110, 14, 40,157,209,170,208, 53,134,215,183, 59,126,242,246,200,135,111,
+126,195,171,155,142,253,209,241, 79,126,250, 83,246,183,183,252,249,159,255,146,239, 63, 12, 76,147,144, 95, 98, 17, 80, 80,138,
+137,198, 53,228, 40, 16,169,227,174,147, 48, 33, 63, 72,162, 93, 92,215,116,146,131, 33,206,143,214, 25, 26, 99,176,177,204, 41,
+109,155, 67,120,177,251, 60, 63,102,191,222,193,255, 24,207,249, 75,163,248, 31,254,162,122, 83,159, 5, 74,234, 18, 52,179, 61,
+176,175,133,109,243,207,162,174,246,229, 11, 45,173,126,157, 46,155, 67,117,246,177,151, 75, 82, 93, 94,246,211,213,106,176,192,
+120,184,130,243,168,170,206,188,180,193,149, 37, 88,166,118,153,243, 65, 91,212, 42, 92,187,242,115,171,133,234,126, 41, 98, 91,
+158,216, 12,147, 41, 18,220, 33, 0, 17,249,126,118, 51,118, 87, 90, 85,192,136,190,240,138,111, 75, 38,125, 37, 58, 76, 21,239,
+185,104,185, 42,248, 65, 43,241,156,138,255,121,141,187,157, 15,116,189, 96, 63,215, 98,104, 30, 6,104,117,121,160, 95, 77,225,
+151,215,135, 77,170,223,106,108,219,176,160,149,222,208,169,212, 22, 20,188, 40,214,175, 57,230,139,248, 77,175, 34, 56,179,164,
+198,169, 11, 30,254,252,239,230, 25,143,249,214, 9,162,245,234, 46,120,122, 61,151, 85, 65,191, 5, 34,213, 67, 93,107, 17, 61,
+ 25,163, 48, 6,118, 59,135, 82, 9, 99, 10,144,104, 27, 91, 59,217,140,143, 99, 77,193, 18, 18, 93,211, 56, 81,158,251, 80,171,
+ 15,185, 62,165,195, 23, 15,108,219,182,213, 99,237,241, 83,192, 56, 75,183,219, 73,220,103,205,197,126,243,246,141,132,122, 84,
+ 86,184,115, 45,227, 48, 10,161,170,192,205,241,192,227,233, 81, 96, 74, 90,132,104,143,167, 51, 31, 63,222, 51, 77,158,224, 35,
+ 77,211,114, 60, 28, 22,226,155,124, 47,137,166, 12, 53,184, 38,215,241,106,219,182,104, 99,232,118,123,206,167, 51,141,109,232,
+186,150, 48, 91,237,130, 20, 27,251,202,191, 79, 57,214,168,206, 88,227, 62, 93,117, 1, 40,156,107,107,158,187,228,202,207, 2,
+198,148, 11,227, 20,121,120,236, 25, 39, 47,112,150,153,172,151,132,151,174,170, 79, 63, 70, 65, 76, 26,235,208,198, 44,133,199,
+ 48, 14,180,141, 3,228, 57,148,146, 57, 28,119, 40,165, 56,157,207, 40,165,121,184, 63,113, 60, 28, 49, 6, 14,213,194,118, 30,
+122,134, 97,168,250, 20,121, 61,134, 97,228,238,238,123,161,124, 25,177,243,165, 20,184,189,189,161,113, 13, 62, 4,134, 97,160,
+109, 90, 41, 92,234, 8, 63,231, 76, 66,166, 6, 33,100, 18,154,144, 51, 62, 38, 34, 2,173,114,237,142, 41, 4,198, 16, 81,218,
+ 16,130,100,106, 15,163,136, 20, 95,191,121, 67, 65,209, 79,158,201, 7, 82, 77,211,212, 90,179, 63, 30,132, 84, 89,228,103,236,
+135,158,199,199, 71,241,195,143, 19,143, 15, 15,156,207,162,158,127,253,250, 21,141,115,130,133, 85, 26, 87,217, 6, 57, 39, 81,
+201,135,192,221,135,143,228, 40, 0, 26,101, 12,206, 54,140,227,184,188,238,242, 56,105,161,102,138, 37, 86, 62, 63,102,198, 70,
+ 51, 35,128,213, 69, 46,196,252, 89,180, 53, 40,168,212,162,222,105,177, 57,182,214,200, 4,164,100, 66,201,104,163,241, 83, 96,
+156,122,222,190, 62,114,236, 28, 77, 73, 28, 90,135,235, 26,206, 33,242,241, 60,113, 26, 2,157, 51, 28, 59,195,231,135,134, 87,
+157,161, 57, 88,216, 91,162,202,216,227, 30,156, 28,234, 37, 36, 84, 82,104,215,144,157, 69,187, 22,245, 56, 82, 38, 79,177,240,
+217,207,190,162,219, 31,233,253,196,135,251,143, 60,158, 7, 94,189,254,140,211,249,129,113,234,185,221, 29,177, 10,218,214,210,
+ 89,195, 87,255,236, 15,248,179, 63,251,175,252,221,215,239, 72,198,145, 88,215, 17, 10,133, 85, 2, 42, 26,199,158,198, 10, 55,
+ 95,145,234, 20, 71,147, 83,189, 31,107, 1,229, 8,195, 65, 50,216,143,214, 97,110,107,167,158,151, 52,164,188,116,108,215, 35,
+247, 31,178,174,125,234, 48,255,109,188,239,151,231,250,186, 17, 55,213,122,197, 51, 98,174,109,100,233,162, 54, 87,101,147, 54,
+183, 61,212,213,101,247,120,141, 32,223,196,182,240, 92,102,182,186, 18,127, 61, 43, 62,187, 66,130,151,237,190, 87, 93, 88, 7,
+ 95,238,246,214,221,224,162, 82,223, 36,199,173,198,188,217,158,150, 43, 20, 70, 87,175,184,220, 76,150, 3,190, 92,113,246,235,
+ 9, 39, 93,248,250,218,228, 90,121,203,248, 75,215,244, 41, 85,227, 22,205, 66, 67,147, 73,192, 54, 90,117,134,206,136,255, 26,
+181,141, 92,229, 9,115,253,114, 28,190,141, 61, 93, 27,120, 93,253,180,243,239,203,107, 59, 79, 46, 54,251,253,237,225,175, 55,
+248, 91,181,133,189,109, 8,116,198,168,245,223,205, 58, 10,183,250, 42, 93,110, 86,255,215,189,222,130,186,157,133,139, 11, 34,
+249, 50, 65, 80,166, 94, 91,248,188, 20,116,206, 25, 26,231,234,136, 25, 38, 63,200,136,214, 90,180,134,105,154,106,113,149, 22,
+213,119, 74,226, 13,150,206, 55,208, 54,142,182, 17,149, 54, 5,252, 36,225, 26, 55,199, 3, 37, 39,134, 97,141,206, 52,198,212,
+ 3, 71, 32, 42,243,190,187,105, 26, 73,124,179,178, 19,159,198, 1,103, 13,183,183,175,216,237, 59, 98,140, 28,111,110,200, 57,
+ 19, 66,170,110, 7, 85,213,208,134, 93, 21,225,181,173,227,112,220,139, 10,188, 17,155,150,208,207, 20,187,221,142,227,241,134,
+221,110, 15, 74, 66, 94,102, 17,238, 56,122,206,125, 47,159,241, 2,141,109, 80, 23,233,140,162,248,111,155, 86,186, 54, 37,150,
+168, 53, 11,157,133,172,229,125,228,225,254, 76,223,143, 40,101,216,239,247,245,121, 7,166,209, 99,180,171, 72, 93, 75, 41,178,
+123, 14,117,108,109,157,172, 7, 82,140,149, 19, 47,239,177,181,146,136, 55,231,215, 3, 12,189,231,112, 56,144, 83, 18, 22,187,
+247, 60, 86,245,182,159, 98, 77, 51,131, 20,147,116, 88, 73, 44,109,135,253, 94,242,181, 67, 64,107, 69, 63,140,244,125, 95,197,
+128, 78,214, 23,181,235, 78, 5,124,144,125,191,177, 13, 25, 69,183, 63,200, 78,187,113,248, 20,153,102, 66,158,150, 34,124, 38,
+ 47, 42,173, 25, 38,207,253,195,137, 16, 2,135,195, 13,251,253,158, 24, 37, 67,224,225,225,145,190, 31,152, 38,207,126,191, 23,
+132,173,146,132,187, 92,196, 61,176,219,117, 28, 15, 55, 88,227, 8, 62,112, 62,157,121,188, 63,241,225,253,123,238,238, 62, 94,
+120,137,103, 77, 76,240,114,232, 60,158, 30,150,213,204, 12, 53, 18,139,150, 90,114, 6,172, 49,107, 24, 86,181,168,105,205,146,
+ 78, 89,102, 96, 81,101, 88,232,197,125, 35,182, 54,165, 21,206, 24,156,179,236, 58, 1,226,236, 14, 71,166,113,196, 86,171,156,
+ 86,133,183, 55, 7,194,249, 68, 83,215,147, 33, 23, 18,134,211, 20,249,120, 58,113,188, 61,112,219, 56, 94, 41,248,236,246,128,
+109, 44, 52, 26,117,219, 81, 28, 20, 83, 27,162,202,144, 80, 90,161,246, 13,170,113, 48, 78,232, 2,166,179,216,155,134,230,102,
+199, 77,219,113,243,246, 11, 62,244, 61,127,245,223,254,158, 80, 44,223,220,157,184,191, 63, 81,148, 65, 55,150,125,119, 68,187,
+142, 63,255,139,191,225,251,187, 51, 62,105,114,166,174, 75,100, 13,148, 75, 70,149, 66,231, 12,134, 66,137,190,210,232, 68, 44,
+ 57, 59,175,140,177,216,122, 46, 89, 52,182,100,246,157,198,188,218,221,252, 9,115,112,199, 6,169, 49,143, 26,159,163,185,205,
+225, 13,191,205, 56,253, 31,123,160,207,199,159,222,236,212,215,120, 53,117,129, 19, 65, 93, 11,214,158, 63,212, 85, 89,177,161,
+234, 9, 23,125, 21,215, 45,118,174,107,188,201,213,161,190,141,148, 84,219,159,245, 74,181,127,121, 88,191,176,147,191,120,205,
+202, 5, 80,101, 62,208,215,152,215,122,248,232, 89,137, 94, 42, 65, 76,215,174,186,118,236, 70,173, 91,132, 43,112,158, 90,236,
+114,235, 19,157,181, 21,165, 40, 74,174,106,114, 53,135, 90,216, 69,225,186, 38,160,205,163,236,170,126,223,166, 44, 93, 28,212,
+106, 1,223,204,239,203, 74,146, 85, 11,188, 71,171,203, 1,197,122, 29,232,139, 29,250, 76, 19,222,166,179,173, 20, 56, 22, 50,
+219,130,145,213,235,122, 96, 46,116,180, 97, 1,233,232,205,120, 93,235,235,218,177,108, 70,252,108, 62, 43,107,224,239,242, 94,
+204,207, 69,235, 37,231, 94,215,149,132, 28,232, 85,213, 93, 34, 49,250,154,250, 53,167,223, 41,218,182,145, 81,112,215,161,173,
+ 89,212,197, 90, 27, 17,162, 41, 69,215, 9, 24,132, 82,100,114, 82, 5,128,119,119,119,244,231,126, 9,237,240, 33,224,189, 39,
+198,180,236,203,231, 3,125,191,219, 17, 99, 88,210,199,130, 15, 28,143, 71,154, 70,252,207, 50,174, 79,220, 63, 60, 18,188, 64,
+ 69, 26,103,177,198,210,117, 13,206, 25,110,142, 7,186,174,165,148, 36, 7, 55,138,113, 24,121,120, 60,209, 52, 50, 61,138, 49,
+ 50,142, 3,195, 40,221,112,227, 28,231,211, 64,204,137,156,193,104, 91,119, 89, 50, 37,107, 90,241, 79,107,168,163,219, 34,118,
+190, 20, 73,121,206,110,144,252,110, 17,126, 69,166, 49, 46,176,149,249, 87,138, 73, 56,222,218, 72, 96, 85,174, 90,145, 34, 34,
+210, 16,227,130,115,238,186,150,227,113, 95, 35, 90,195, 18, 89,219, 84, 39, 64, 41,153,182,105, 9, 33,240,248,248,200,208, 15,
+248, 81, 0, 62, 90,233,139,105,133,115, 78,132, 79,133,138,115,221,161, 80,180, 53, 69, 77,107, 77,211, 10,204,198, 90,135,247,
+ 81,148,224, 81,108,141,177, 64,209,166, 42, 85, 52, 83,202, 76, 33, 98,156,227,254,241, 68,136,162,189,152,175,175, 25,242, 51,
+ 7, 47,165, 10,139,138, 41,115,255,240, 72, 63, 72, 81,145,179,226,241,116, 98, 28, 38,134, 97,228,225,225,196,227,227,169, 94,
+ 95,117, 42,166,101,226,113, 58,157,185,187,251,200,195,131, 68,189, 78,163, 95,210,217,250,190,151, 41,130,143, 2,183,105, 58,
+140,117,149,248,102,128,194, 52,141,196, 24, 64,137,186, 62,165,188, 52, 33, 51,221,112,254, 12, 45,246, 67,181,213,184,232,170,
+209,145,102,110,166, 5,106,107,176, 86,116, 25,214,104,156,214, 56, 43, 12, 13,231,154,138, 39, 87,164, 24,216,187, 6,134, 1,
+ 83, 50,251,227, 1,215,118,148,162, 24,167,192, 67,223, 83,180,230,160, 20, 95, 28,118, 28, 91,139,107, 44,133,128,121,115, 64,
+237,156,184,119,140,145, 69, 64, 18, 86,189,234, 44, 41, 6, 24, 39,166,115,207,112, 26,235, 53, 25, 41, 5,236,237, 13, 95,254,
+206,207,121,123,188,225,227,247, 31,185,125,245, 25, 62,203, 4,225, 31,190,253, 7, 62,255,236,115,222,254,252, 23,252,249,159,
+253, 5,223,189, 63,145,104,100,185, 88,215,158,170, 78, 67, 32, 99,107,154,219,174,107, 41, 41,139,210,189,226,149, 41,178,154,
+ 82, 37,227,148,162, 81,138,189,211,116, 45, 88,181,193,116, 62, 57,188,231, 44,232,151, 96, 48,155,223, 95,130,212,252,216, 95,
+ 23,169,106,139,240,165,242,197,175,188,216, 23,132,182,205, 65, 89,126, 76,161, 80, 20, 27, 68,203, 26,200,169,158,238, 72, 5,
+128, 82, 86,252,108, 41, 79,245,214,243, 88,117, 51, 54, 98,155, 73,126,157, 22,183,242, 89,158, 16,201, 46,133, 93,149,118, 94,
+ 54,250, 47,182, 99,234,117,102,175, 54,252,114,165, 46,103, 16,179, 29, 76, 47, 60,124,245,140,118,111,142,204, 85,172, 3, 1,
+181,116,137,203, 65,170,159, 25,155,207,153,229,136,160,103,193,240,206,251,120,181,114,239,175, 49,169, 79, 70,215, 75, 80, 79,
+126,130,111,153, 15, 76, 93, 54,186, 65,117, 57,149, 41, 90,173, 65, 56, 51, 61,112, 51,238,223, 58, 32,180, 42,151, 42,249, 37,
+234,145,139,194,236,122,197,180,101, 51,108, 61,242,115,129, 85, 42, 7,127,203,188,223,174, 85,172, 86, 56,171,137,209,147,210,
+ 36,164, 56,171,151,245,128, 54,178,163,206, 69, 14,164,148,179,168,244,141,140,141,189, 15, 53,200, 1, 66, 10,210,165,207, 59,
+235,152,200,213,245,224, 67,192, 7, 17, 45, 57,103,233,186,142,251,251,123,246,251, 61,227, 56,114, 83, 59,112, 17,173,137,165,
+ 75, 27, 69,136, 83, 13, 59,145, 27,246,227,233, 68, 72, 17,141,162,107, 91,198,113,164,235, 58,118,123,217,245,229,156,240,163,
+ 40,220,219, 22, 26,231,216,237,218,154, 5, 31,176, 70,124,180,129,194,110, 39, 36,172, 97,232,229, 80, 77, 17,109, 29,198, 58,
+198,126, 16,160, 76, 81,152, 49, 8,148, 38,142,144,133, 39, 30,125,164,105,180,216,157,172,227,254,116,194, 24, 43,135, 71,202,
+180,237, 14,165,202, 18,214,226,125,172, 7,186,173, 41, 96, 25,215, 56, 57,244,146,168,225,149, 22,235,155,177,142,195,174,197,
+ 90,195,110,231, 8,113,183, 81, 23,139, 2, 30,160, 31,250,138,193,157,243, 27, 50,206,137,231,123,118, 12, 88,107,185,191,191,
+167,105,154,154, 53,239,152,166,137,143,119,247,149,239,126,100,119,216,163,141,229,120,211,144,179, 34,164, 15,100, 5,182,131,
+148, 64, 39, 42, 45,172, 16, 98,194,181,142,152, 19, 15,143,143,203,154,108, 9,234,217, 88, 17,149, 50,213, 34,105,107, 23, 45,
+248,219, 97, 60,243,205,183,239,104, 92,195,103,159,125,193, 52,142, 76,147,248,235,173,109, 46, 44,173,195,105,168, 43,143, 84,
+117, 51, 34,202, 3, 73, 31, 67,101,180, 81,248, 32,215,132,247, 31,177, 90,112,212, 82,208, 8, 92,198, 58, 71, 8, 19, 57, 21,
+166,232,101, 61, 84,215,118,169, 54,132,186,226,131, 19,153, 68,169, 96,169,202,213,152,133,202,133, 26, 65,108,200, 20,114, 20,
+252,108,219,182,132,224, 9, 26, 89,109, 20, 97,174, 43,235, 56, 13,103,154,146,153,146,176,220,199, 80,184, 63, 13,236, 19, 88,
+211,136, 2,253,230,192,189,247, 60,146,241,250, 13,131, 79,236,250, 9, 93, 20,140, 19,234,112, 35,122, 27,173, 32, 74, 86, 4,
+ 70, 83,180,194,164, 2,214,145, 12,156,206, 3,175,143, 71,178,109, 57,223, 61,240,250,245,231, 88, 11,191,248,234,192, 91,245,
+187,124,253,238,129, 59,123,131,206,145,183, 55, 95,161, 75, 18,212,172, 85, 4, 85, 8, 90,111,196,145, 70, 92, 9, 57,209, 89,
+ 69,200, 89, 86, 54, 69, 87,177,167,102,244,129,157,179, 53,154, 44, 11, 76,199,168,186, 87,215,236,247, 26,243,170,187,249,147,
+ 57, 6, 49,151, 66,170,253,189,236, 12,121,150, 4,119,221,161,111,199,244, 47,169,228, 63, 53,126, 95, 32, 38, 92,178,184,149,
+210, 23,221,249,245,212,118, 78, 81, 43,106, 37,185, 61,221,109,110, 51,186,107,144,203,149, 80,238,170,151,191,128,195, 92,140,
+ 80, 23, 49,219,165,101, 73,215, 80,155,101,168,127,245, 60, 84, 93, 27, 44,187,251,133,185,174,127, 64,123, 80,150, 83,109, 57,
+ 84,212, 58, 90, 86,250, 82, 91, 48, 87,186,198,152,165, 19,181,230,234, 96,185,178,179,233,165,152,201,107, 22, 90,237,106,164,
+187, 41,228, 74,233,210,198, 96,172, 69, 27,189,100,115, 11,196, 69,100,122,186, 84, 5,252,252, 24,122, 29, 85,232,250, 51, 63,
+ 63,145, 88,119,250, 90,171,139, 53,138,210,106,225,149, 95,184, 49,182,162,181,141,114,222,108, 52, 9,107,247,205, 70,104, 39,
+221,185,217, 40,207,151,176,153,141, 3,253, 58, 45,240, 34,127,252,201,245, 92, 3, 23,106, 80,139,160, 53,245, 42,226, 82, 34,
+124, 35, 39, 92, 99,104,172, 34, 39, 79,183,107, 49, 70,178,170,115,201, 18,141, 83, 69, 63,169,142, 75,181,118,164, 44,126,225,
+243, 73, 58, 38,239, 87, 22,248, 52,200,222, 60,231,130,143,226,251,213, 53,103, 61, 23, 48,218,144,114,225,253,251,247, 85,188,
+ 5,135,195, 1,133, 34,229, 40, 66, 47, 5, 31, 63,222,209,117,173,252, 55,165, 43,158,118,146,195,163,222,176,253, 52,209,117,
+ 45,166, 42,188,231,195, 77, 16,176,194, 31,159,233, 98,109,235,150,152,207, 92,181, 0, 41, 71, 66, 12, 75, 53, 61,239,179,251,
+ 65, 24,227,251, 93,135,169, 89,240, 57, 9,142, 54,120, 9,243,152,225, 88, 33, 68,206,125, 68,105,199,185, 31, 42,107, 93,213,
+209,191, 35,165,192,228, 39, 10,194,214,119,213,130, 69,197, 31, 59,215,224, 99,148,171,189,102,210, 7, 95, 1, 57, 70, 40,110,
+143,167, 19, 74,107, 66, 8,140,227,176, 52, 45,214, 89,130, 23, 58,159,228,149, 55,116,109, 43,175, 83, 77,155, 27,134, 1,165,
+ 52,227, 56,242,120, 58,241,248, 40,123,246, 67,221, 99,159, 78, 61, 15, 15, 39,137,101,173,239,149,107, 27, 92, 99, 69, 3, 17,
+ 60,227,228, 47,156,171, 57,215,105, 67,146, 49,117,235, 28, 41,198,139,201,145,170,150,178,146,197, 63, 46, 59,218, 76, 8,178,
+202, 49,218,138,197,174,239, 9, 49,210,184,202,230, 79, 25,239, 3, 67, 63, 48,140,131,216,219, 98,174,147,185,186,112, 44,146,
+218,166, 20, 52,173,165,109,218, 69, 88, 61,223, 87, 98, 76,114, 13,250,137, 16,197, 50,105,106,174,128, 91, 48,188,185,134, 56,
+173, 57, 9,165, 22,220,206,217,186, 10, 18, 22,127, 74,113, 65, 72,155,154,226,167,181, 2, 45, 93,175,136,229,138,236,213,155,
+ 6,109,100, 55,239, 92,195,224, 61,138, 66,163, 53, 13, 10, 91, 93, 17,227, 56,160,208, 68, 10, 89, 43,122, 31, 72, 33,112,115,
+179,231,208, 26, 14, 10,116,244,160, 51,180, 22, 58, 39,251,126,159, 33, 70, 74,103, 41,173, 67,133, 12,253, 64,251,234, 21,199,
+175,126, 78,110, 29,231,251, 15, 28,154, 14,101, 32,235,128, 13, 35, 77, 10,168,146,217,237, 26,110,119,142,195,161, 99, 26, 78,
+124,254,179,159,242,248,208,243,215,191,252, 13,185,180,245,231, 88,245, 20,101,158, 10, 22,225, 19,104, 37,141, 64,206, 51, 54,
+ 87, 85, 37,124,161,181, 26, 91, 18,157, 51, 52, 22,142,175, 59, 57,212,231,209,187,248, 22,211,133, 16, 72, 95, 5,163, 92,119,
+233,191, 45, 39,254, 69,202, 92, 29, 29,207, 98,168, 37, 61,108,163, 14,159,161, 20,207,133,160, 60,253,190,234,226,240, 85,215,
+155,244, 13,158,244,165, 67, 93,177,181,146,233, 11,180,233, 83,133,245,229,115,152, 21,249,203,115, 47,229, 66, 68, 53,171,184,
+159, 35,221, 61,245, 58,115,217, 29,206, 66, 50,165,159,245,219,219, 90,189, 74, 14,180, 90,246,235,219, 67,105, 43, 54,220, 70,
+135,150, 82,106, 37, 61, 23, 74,106,201,111,118,206,173,150, 47,189,238,247,213,146,215, 94, 69, 48,122,173, 94,148,210,152,202,
+ 62,254, 49,215,195, 53, 25, 80,113, 53,198, 87,215, 59,248,245,128,191,220,155,175,138,255, 85,249,191,238,212,175,119,248,122,
+ 91,148, 94, 23, 87,240, 36,164,103, 59, 42,216,254,189, 45,215,156, 58,169, 81, 37,211, 56, 35, 35,245, 70,186, 25,215,200, 1,
+162,141, 33,166, 64,136, 94,118,192,149,171, 61,122,177,142,133, 24, 25,199, 73, 82,198, 98, 90,146,212,230,231, 26, 83, 66,105,
+217,199, 9,172, 67, 70,145,195, 48, 10,119,101,222,167, 87, 44,232, 56, 78,242, 89,175,187,226,253,126, 39,252,242,174, 91,236,
+103,214,186,101, 34,161,181, 0, 70, 20,138,253,254, 80, 51,211,103,203,148,116, 92,177,134,115,196, 24,241,222,211,117,157,208,
+195,144, 96,151,243,249,188, 68,181, 90, 39,194, 60,141,161,237, 58,252, 36, 59,230,182,254,121,172, 33, 44, 69,149,101, 42, 16,
+ 98,169,234,230,136,228,228,153,250, 90,136,130, 61,215,241,146,143,190, 10,232, 74,245,203, 75, 65, 36,215,181, 98, 10,145,172,
+ 20,177,250,178, 75,129, 20,243,130, 50, 45, 20, 78,231, 51,160,153, 38,143, 49,110,241,199,135, 16, 56,236, 15,116,221,142,182,
+109,150,207,164,247,161,186, 0, 84, 21,131,213, 61,250, 84, 85,250,141, 40,182, 83, 29,173,167, 92,152,188,160, 63, 39, 31,249,
+238,251,239, 9, 33,209,117, 29,135,195,129, 16, 60, 74,201,154, 96,153,238, 88,205,174,109,201, 41, 46,129, 81,135,253, 78, 98,
+101, 85, 97, 43, 5, 94, 20,252, 37, 97,181,174,235, 25, 9, 21,153, 87,166, 49,134,154,179, 30,150,208,155, 92,197,176,198, 26,
+246,187,142,253,161, 99, 95, 25,255,135,195, 78,130,102,118, 2, 29,210, 74,213,128,145,203,251,198,226,236,168, 19,191, 89,127,
+146,147,100,206,207,159,237,153,130,166,107,128, 81,170, 4, 65, 93,212, 98,111,211,245, 90, 22,203,160, 56, 31,140,209, 88,103,
+234,218, 65,209,118, 13, 49, 78,236,246,187, 26,204, 83, 73,146, 70,244, 69,199,166,197, 2,113,154,208,149,231,223,116, 45, 41,
+103, 78,195,128,105, 58, 41, 0, 99,224, 39,175,110,184,177,134, 28, 6,178,202,168,125,135,126,115, 11, 70,147,207, 35, 37, 36,
+104, 27,138, 1, 19, 10,241,254,145,164,193,190, 62, 98,142,123,204, 52, 50,188,127, 79,163, 51,198, 89,194,253, 9,211, 29, 68,
+167, 98, 50, 55,135, 29, 74, 23,126,250,213, 87,164, 18, 81, 89,241, 55,191,252, 53, 37,202, 57, 97, 22,204, 87,169,175, 91, 94,
+214,145, 70,203, 1, 47,241,196, 10,149, 51,173,179,180, 86, 97, 74,164, 53, 10, 75,225,246,102, 71,123,219, 98,222,180, 55,127,
+146,159, 57,212, 37,140,254,249,180,179,114,213,193,252, 54,123,245, 39,228,184,178, 94,148,210,105,234, 11,164,167, 46,171, 50,
+125,126,142, 79, 8, 47, 47, 21, 20,170, 92, 30,234, 75, 55, 86,227, 76,231, 84,174,107,218, 89,125,220,139,113,184, 18,162, 28,
+151,176,185,167,197,192, 85, 55,247, 36,217,174, 42,242,117, 37, 79,149,141,229,233, 73,183,174,120,146, 91,190,116,199,155,160,
+148,203,125,191,194,104,196, 10,100,165, 99, 55,198, 60, 1,164, 92, 68,210, 46,151,211,154, 15,158,106,220,234, 60,169,208,117,
+159,110,230, 20,177,249, 3, 90,132, 2,165, 41,213, 87,187, 5,217, 92,189,174,207,253,140,219,235,162,182,215,121,187,242,216,
+140,201,231,202,110, 45, 34, 55, 34, 56,189, 25,175, 95, 0,104,182,250,138,167,133,128,122,166,184,120, 17,180,116,193, 19, 80,
+151,137,108,218, 96,140,173,227,208,202, 9,200, 66, 98, 91,133,121, 5,165, 51,214,130,181,178,222,144,157,247, 72,136,113, 19,
+188,146,165,123,179, 77,141,208, 21,129,208, 44, 98,114, 78, 2, 84,246,135,189,236,102,219,134,182,109,176,214,212,215,111, 14,
+255,144,204,244,162,192,181, 13,135,227,129, 24, 98, 45,206, 12,135,195, 65,162, 81,181,194, 56, 91,211,179, 4, 16,114, 62,159,
+235, 94, 52, 74,151, 70, 61, 32,140,174,193, 40,138,105,156,232,207, 3, 49, 36, 26,215, 46,121,220,125,223,163,148,226,230, 70,
+ 48,179, 77,211,224, 39,191, 22,104, 5,188, 15,149, 35,110,121,253,250, 86, 10,148,224, 49,214,210, 29, 36, 52, 69, 88,237,162,
+178,119, 77, 75,204,101,153, 38,230, 34,254,108, 41, 62,164,131,159,133, 91, 37,139, 66,126, 28,125,157,178, 25,124, 72, 76, 62,
+138, 55, 29, 33,148,133,154,181, 30,171, 66, 31, 37,132, 55,109,106,177, 21, 35,211, 20, 36, 16, 37, 43,206,253,192, 56,120, 57,
+ 84,114, 33,166, 34,163,238,170, 62, 79, 25, 38, 47, 99,240,219,219, 87,116,221, 94,136,115,122,125, 60,215,182, 52,237,142,113,
+154, 64, 25, 14,135, 35, 57, 37,250,126, 64,107,195,205,205, 17,103, 43, 22, 20, 85,105,128,105,177,248,205,169,126, 50, 2,247,
+181, 88,149, 14,117, 22, 34,230, 34,235,134, 84,164,120,137, 81,108,103, 50,197, 19,187,107, 8,126,129, 26, 45,247, 32, 10,214,
+106,246,251,150,227,113,199,126,223,210,117, 14, 99, 1,189,138,216,134,254, 44, 41, 98, 27,171,166, 28,230,186,194, 98,242,133,
+192, 84, 38, 44,242,120,166,146,236, 74, 46, 75,162, 91,166, 84, 22,124,193, 32, 90,129, 82, 39,160,141, 21,202,158,171,226,220,
+162,114,157,194,236,234, 89,149,232, 90, 87, 93, 22,165, 22,117,243,100,174,208, 90, 3,222, 67,141,163, 53,187, 6,229, 12,193,
+ 7,116,179,227, 60,156, 49, 37,243,229,235, 91,110, 15, 13,205,206, 18, 74,196, 30,111, 80,199, 61, 89, 41,138, 15, 98,227, 53,
+ 26,237, 44,106,138,224, 19, 33,121,148,203,232, 24,136,239, 78,164, 62,114,255,221, 7,226, 24,249,240,238, 61,195,253, 29,199,
+157,163,140, 19,141,113,194,251, 87,144,187,134,221,241, 21,223,125,247,129,119,239, 62,138, 11, 67,203,170,121, 78, 53,157, 9,
+129,148, 66,227, 26, 74,150,201, 5, 73,174,139, 93,211,208,104,133, 45,137,189, 49,116,141,230,230,213, 30,123,179, 19,161, 92,
+126,177, 83,231, 98, 7,251,220,193, 61, 31, 16, 63, 20,216,178,237, 72,175,199,247,139,184,105, 73, 57,231,217, 27,233,156, 41,
+190,165,137, 94,239,137, 47, 29,238,101, 85,208,215,199, 52,219, 3,108, 75,135,187, 62,212,151,128,150, 45,120,164, 92,116,249,
+148,167,126,252,173, 71,121,249,179, 77, 1, 83,170,194,115,217, 95,111, 10,163,235,206, 61,215,178, 99,209, 24,168,213,231, 60,
+ 31, 30,235, 96,121,221,175,201,216, 93, 87, 1, 84,157, 26, 92, 31,162,155, 98,170, 92, 29,186,243,152, 71, 70,240, 53,239, 88,
+155, 69, 28,183,116,233, 84, 69,116,145,204,103, 85, 15, 32,205, 38,107,124, 89,127,232, 85,222, 55, 79, 24,174,117, 20,243, 71,
+113,179,131, 95, 21,243,179, 24,109,142, 69, 45, 27, 49,231,165, 48, 82, 61,243,243,110, 11, 26,253, 66, 17,165,231, 53,137,250,
+ 68,161,120, 85, 64,113, 69, 25,180,198, 8,192, 98,246,208, 87,102,187,117, 85,192,104, 68,253, 14, 18, 45,185,172,141,244, 58,
+170,220, 31, 14,104, 37,156,239,174,181, 52,173,227,246,230,166,166,127, 73,124,102,223,159, 5,191, 26, 60,125, 63,112,238,207,
+ 76,126,146,110,177,190, 71,243,232,184,105, 90,154,122,200, 53,173,140, 78, 99,148, 14,173,235, 90,154,182,173,108,242, 82, 69,
+100,210,221,107,173,107, 87, 42,104,209, 89, 55,144, 82,102, 28, 5,253, 57,142,158,161,159,136, 49, 45, 49,154,165,228,202,243,
+150,164, 52, 10, 11,155, 93, 56,227, 73,152,224,109,199, 48, 78, 76,211,136, 51,134, 55,111,110, 65, 67,168,121,221, 77,215, 50,
+133, 64,136, 34,130,219, 29,246,196,156, 80,100,114,142,213,253,160, 73,169, 84, 15,119, 17,118,124, 81,156,251,145,156, 11,147,
+143,140, 99,144, 93,122, 17,216,138, 79,169,238,214,133,106, 55, 39, 18,230,146,197,250, 85,215, 31, 41,102, 33,213, 41,195, 56,
+ 6,140,182,178,250,240, 82,120,229, 12, 62, 70, 98,146,226,108, 78,122, 68, 25, 30, 78,103, 17,165, 77, 94, 60,243, 49, 50,249,
+ 68,223,143, 82, 28,140,137, 41, 68,250,243, 64,138, 98, 95, 27,199,137,243,233, 76,140, 17,163, 69, 80, 41,207, 45,161, 20,248,
+ 16,228, 51,175, 21, 33,198,197, 34, 82, 80,132,121,250, 64, 17, 46,251, 44,120, 69,214, 48,170,142,203,115,145,112,156, 21, 32,
+181, 5, 88,231, 37,201,177,105, 13,198, 66,209, 25,138,188,230,193, 7,226, 20,136,163, 71,171, 82,109,102,117, 51,153, 87,107,
+141,222,102, 74,104, 85, 71,231, 50,225, 43, 57,227, 22, 2,157,240, 49,172,179,148, 20, 5, 42,163,205, 82, 20, 24, 45, 96,159,
+ 57,184,170,212, 52, 72, 81,210,154, 90, 32, 11,187,160,164,121,237, 80, 73,124,245,177, 72,153, 86,195,109,219,162,141,194, 52,
+ 86, 18,251, 92, 75, 49,150,135,243,137,226, 3, 71,103,249,217,207,126,130,109, 53, 73, 23,236,241,128,186,217,161,172, 70,197,
+132, 74,194, 46, 80,214,194, 48,202,218,164,235,200, 62, 49,254,250, 14, 23, 12,251,195,158, 99,103,216,189,126,195,190, 61,208,
+ 24, 75,158, 38, 60, 82,196, 78,185,240,112,122,228,230,243,207, 48, 62, 50, 60, 78,220,127,255,145,156,164,137,154,207,178, 42,
+ 87, 94,180, 73,206, 90, 97,169, 20,133, 42, 26,163,140,236,208,141,166,211, 26,167, 11,199, 93,203,237,235, 35,246,237, 45,230,
+166, 30,234, 89,201,226,189, 84, 1,134,136,159,234, 78, 69, 61,127, 72, 95,119,128,159,234,214, 95,252,243,138, 8, 44,232,101,
+191,114,193,209, 86,155, 36, 54,189,241,125,235,167,120, 85,197,202, 27,159, 5,113,101,203, 61, 47,101, 1,197,204,182,128, 25,
+ 81,120, 17, 68,162,228,176, 76, 64, 94,118,223,171,209, 90,179,121,109, 94,250,249,180, 92,132,133,117, 6, 63,139,168,180,214,
+ 23,136, 84,165, 85, 21,121,137,114, 83, 40,107, 84,236,234,218,157,207, 7,215, 60,150, 42, 40,138, 22, 22,250, 44,158,171,214,
+229, 26,219,201,242, 97, 82,245,131,118,145, 54, 55, 31,228, 70, 93, 76, 78,114,205,158,206, 40,178, 82, 53, 76, 68,196, 42,182,
+170,215,101,247,147, 81, 89, 32, 9,115, 55,170,180, 17, 70,242,147,235, 98,253, 95, 81,101,131,143,189, 20,167, 73, 72, 78,157,
+ 68,232,109,232,139,140,240,205, 60,109, 41,219,221,156,216, 61,182, 96, 26,181, 73,126, 83, 79,200,188,207,117,230,242, 26, 23,
+ 85,138,204,234,114, 0, 0, 32, 0, 73, 68, 65, 84,126,128,247,187, 41, 26, 75, 90,181, 31,243,104,191,138, 87,114, 73,242,238,
+107, 9,164, 72, 37,147,138,216,156, 36,160, 37,215,226, 67, 87,245,187, 19,255,173,181,149,174, 37, 97, 30,243,170,101, 24, 7,
+252, 36, 42,246,126,156,228, 70, 30, 18, 49, 72,247,227, 42,124,197, 24,179, 80,212,110,110,110,232, 58,129,169,164, 40,140,237,
+155,227, 1, 85,217,232,159,189,126, 69,219, 24,156,209,146,211, 29, 34, 86, 91,250,115,191, 40,180, 37, 29,203,212,253,190,197,
+ 88,199,228, 3,198,184,218, 8,100,172,213, 52,141,149, 48,148,166,145,164, 40, 99, 24,135,158,225,124,166, 84, 15,115,138,185,
+118,180, 18, 21,154,146, 80,199, 74,150,235,200,106, 69,211,218,197,106,216, 52,173,228,103, 27,131,177,154,148, 19,141,115,144,
+ 11,141,109, 72, 94, 32, 38,171, 88,181,160,172,194, 54, 45, 57,105,124, 44,132, 8, 33, 21,178, 82, 76, 41,136,248, 65,205,140,
+125,153,104,148,106,163, 8, 57, 19,115, 65, 91, 71,240,145,146,196, 54, 52,147,232, 6, 31, 64, 25, 98, 86,196, 34, 33, 79,169,
+234, 9,132, 1, 47,107,129,126,152,240, 21,251,169,138,163,100,141, 15,121, 17,233, 57, 39, 83, 21,173,132,241, 30,115,193, 53,
+109,181,125,201,254,223,123, 25,255,135, 16, 32,231,106, 59,213,132,152,201, 74, 30, 55,103, 49,173,151, 84,214,228,200, 44,175,
+181,224, 70,244, 34, 56, 46, 74, 58, 98,173, 65,151, 76,215,200, 4, 73, 96, 38, 85,227,160,213, 66,169,116, 21, 47, 44,186, 38,
+ 75,201,154, 48, 38,226, 20,200, 81,118,252,186,118,217,185,172, 20,199, 25,224,100,230,241,186,210, 23,214,208,162,144,196, 62,
+ 61,143,231, 37,124, 74, 33, 12,140, 57,154, 85, 24,246, 9, 55, 83, 4,141, 90, 44,142, 50, 21, 83, 34, 40,115, 29,170, 24, 82,
+ 82,160,106,144,143,134,144, 35,218, 88,200,137,125,235,184,185,217, 97, 45,148, 52,209, 26, 3, 41,211,180,142, 97,154, 24, 42,
+ 54,247,167, 63,249,140,253,222, 98, 27, 67, 49, 26,181,235,192,106,212, 56, 18,199,158, 96, 18,166, 20,244,144, 40, 41,147,209,
+ 24,221,226,239,123,250,247, 31, 8,231, 7, 78,195,137, 98,246,196,104,240, 65,244, 29,239,223,125,224,179,159,254, 19,138,210,
+188,127,255,145,215, 55,111,216,237,110, 80, 5,190,253,254, 93, 69,246,218, 74,242,148,243, 96,193,239, 34, 46, 38, 87, 68, 48,
+139,113,149,168, 87,216, 91,205,206,193,126,215,210,118, 13,221,109,135,121,211, 98,203, 51,123,233,139, 17,249, 11,135,250,167,
+ 40,114,191,205, 47,181,177,111, 21,202, 51, 7,207, 70,112, 85,244,197, 78,255,186, 83, 42, 27, 50, 27,155, 61,252, 26,242,241,
+242,227,151,109,112,203,140, 74, 93,106,166, 21, 83,251,132, 19,255, 2,111,126, 22,255,189, 24,128, 83,174,204,123,101,149,170,
+173,216,115,189,146,201,212,170,215,151,238, 65, 45, 41, 95,243,115,212,117,132, 80,204,182,224,185, 28, 19,171,151, 8,182, 87,
+170,255,101,204,175, 36, 4, 67,207, 5, 28, 79, 35,106,103,118,247,162,122, 71, 61,203,228, 95, 35, 88,103, 27,203,117,200,203,
+106, 15, 43, 85,176,247,132,173, 95, 46,167, 10, 79,186,241,103, 98,120, 23,197,218, 15,224,140,215,199, 82, 79,156, 9,207, 93,
+215,107,113,182, 78, 21,114,201, 21,214, 83, 81,159,117,135, 63,231, 29,139, 13,141, 42, 8,139, 50,134, 52,114, 3, 16,229,182,
+164, 94,229, 82,240,126, 68,149, 76, 44,165,238,134,165,104,105,156,100, 47,151,250,193,223,215, 61,161, 50,102,141, 98,172,251,
+202,125,215,209,117,187, 69,193, 29, 98,160,219, 53, 18,197,217,117, 76,211,200,135,239,223,211,238,246, 28,142, 71, 82,200, 75,
+216,135,107, 26,166, 48, 49,249,169, 22,124,137,199,199, 51, 41, 38, 92,237, 34,231, 81, 60, 20,148, 83,228, 16, 32, 67,235, 12,
+122,223, 85,224, 75,237, 18,171, 79, 89,198,203, 48, 77,254, 34, 21,240,124,238, 49, 83,157,232,104,133, 31, 83, 61,232, 2,201,
+104,172, 81, 76, 41,211, 53,173,136, 47,231,238,111,214,147,106, 43,138,122, 83, 8, 41, 46,190,250,153,104,102,141,161,237, 90,
+166, 81,188,253, 86, 87, 17, 86, 20, 15, 50, 89,138, 87,103, 12, 89, 73, 17, 49, 77,126, 21,229, 42,141, 79,113, 89, 89,204, 2,
+199, 83,223, 11, 96,199, 53, 40,180,248,219,139,100, 93, 83,132,187,174,150, 60, 6,153,102, 72,225,149,105,186,134, 92,167,144,
+ 51,135, 62, 23,121, 30,227, 40,145,171,183, 55, 29,206, 54,156, 7, 79,202, 2, 89, 41, 27, 47,199,214, 74, 89, 18,149, 3,190,
+138,132,103,205,140, 76,142,228, 30,123,216,237, 32, 39, 70, 99,170, 95, 63,161,138, 94, 92, 1, 33,100, 98,144,209,102,137,153,
+161,159, 72,147,167, 68, 25,115,147,133, 25,143, 46,139, 96,174,222,132,182, 70,150,229,121,204, 34, 57, 99,182,246, 45,181,224,
+173,141,117,171,117, 86, 67,174, 65, 57, 41,229,170, 13,168,187,114,161, 97,213,206,124, 14, 63,210, 24,109, 37,145,210, 32,218,
+131,106,235,157,123,222,164, 20, 93,211, 50,158, 39,206,131, 7, 20,111,111, 95,241,230,230, 13,167, 62,208,135,192,187,199, 7,
+190,252,217,207,200, 12,164, 70, 67,137,232, 32,105,104,212,213,137,138, 25, 6,113,149,168, 61,128,135,161,103,154, 60,185,235,
+120,243,243,223,225,227,253, 68, 76,154,251,247, 35,253,249,145, 98, 44, 95,191,127,228,225,161,199,154,134,239,190,253,134,159,
+124,145, 72,105,228, 39, 95,188,229,241,148, 57,245, 3, 90, 25, 73, 12, 84, 10,165, 45, 62, 38, 58,215, 48,250, 68,215,216,138,
+216, 46,180,173, 35, 17,137,206, 16,116, 70, 91,139,107, 59,112, 14,186,221, 85,158,250, 70,205,254,169, 60,149, 31, 19,230,242,
+143,181,181, 61, 21,142,109, 66,102,174,111,172,121, 69,155,206,187,241,114, 97,111, 43, 75, 98, 25, 87,105,172,101, 91, 9,160,
+158, 36,169,101,158,210,242, 74, 77, 33,123, 78, 52,248, 68, 47,176,148, 6,219, 31,112, 30,121,233, 11,210,157,218,164,180,205,
+232,215,235,252,117,181, 25,215,207,175, 73,121, 98,195,155,131, 80, 54,238,129, 79,228,211,207,175,233,181,109,177,108,128,235,
+114,208,233, 75,252,234,102,116,174, 55,190,240, 11,139,221, 51, 12,131,114, 21,186,162,175, 61,251,155, 46,187,108, 66,216, 46,
+ 53, 6,249, 9,180, 70,158,103,185, 44,238, 54,158,195, 89, 57,189,142,242,205,197,245,165,102,138,224,246, 11, 85,185,120,189,
+159,123, 29,103,164,238,172,218,159,199,250, 70, 43,154,198,162,102,255, 93, 29,237,151,154,239, 93,114, 1,181,238, 29,199, 25,
+154, 81, 59,191, 89,113, 14,144,131,216,175,180, 49,130,115,109, 59,172,117,156, 31, 79,168,182,161,115,142,156, 34,197, 90,178,
+ 86,132,202, 54, 87,200,141, 55,120,129,175,204,147, 22, 9,212,144,197,206,227,233,145,146,197,195,155, 42,192, 69,172,113,242,
+248,143,143,143, 53, 39, 93,196,121, 41, 72, 38,186,146,187, 41, 26,240,125, 79,211, 56,246, 21, 13, 91,178, 40,159, 75,142,117,
+ 71,107,101,167,171,138,132, 84, 88, 73, 50, 27, 39,241,222,155, 58,138, 85,181, 75,179, 56, 82,150,209,119, 12,145,166, 17,229,
+ 52, 26,176,122,225,255, 43,165,112, 78,166,101, 57, 23,148, 49,130, 73, 85, 18, 37, 90, 74,228,112, 56,146,146, 4,181,248,152,
+ 49,198,226,199, 17,146, 20, 92, 74,107, 74, 20, 65, 89, 1, 26,107, 73, 57, 51, 85, 50,156, 36,164, 21,180,113,164, 34, 34, 70,
+ 99,215,195, 52, 4, 33,181,105, 45, 76,238, 16, 2,214, 56, 98,202,132, 44, 2, 62,133,248,253, 67, 12, 56, 55, 39,203,137,104,
+203, 24,205,148, 3, 25,216,117, 59,166, 97,146,199,204,129, 93,231, 32, 43,110,111,143,188,126,125, 36,132,196,240,235,239, 40,
+ 37,214,117, 88,237,170, 85, 94, 2,134,180, 22,132,236, 28,227, 59, 95,159,203,212,171,164, 58, 19, 21,241, 89,152,198,101,170,
+ 35,117,175, 90,114, 33,114,132, 20, 10,105, 10,194, 40,240, 25, 93, 68, 84, 56,115, 44,174,155,156,249,250,151,149,157,172,107,
+ 36,251,189, 46,167,212,122,111, 44,172, 92, 8,106,241,181,181,233,137, 31,187,136,221,115,190, 7, 86, 76,183, 81,194, 67, 87,
+117,186,137,150, 53, 72,161,224, 18, 80, 34,187,227, 1, 85,175,183,182,235,234,193,174,121, 24, 35,247,227,137, 93,187, 39,188,
+127,160, 15, 9,148, 65, 89,197,175,191,251,142, 63,252,163,223,197, 24, 40,173, 76,215, 84,170,132,140, 12, 4,233,150, 75, 31,
+106, 1, 31,120,255,112,226,221,183,247, 40,101,232,240,220,134, 1, 91, 6,110, 14,183,236,204, 45, 15, 39,197, 57, 69, 30, 79,
+ 35,223,223,157,232, 90,205, 52,158,104,218, 14,159, 11, 62,131,178, 66,144, 60,245, 94,158,103, 81, 36,234,193,142,194, 26,199,
+164, 44,100,207,177,115,248,226,113, 78, 19, 90, 71,210,133, 98, 12,218, 25, 76,211, 66,215, 61, 61,212,159,116,108,234,135, 69,
+111,207,117, 60,255,216, 95,159, 26,223,171,162, 22,113,219,117,167,121,209,225, 22, 54, 29,223,147,115,245,242, 64,191,232,246,
+213,122,152, 60, 23,171,122, 81, 8,124,170, 16,185,172, 65,174,197,112,107,200,199,181,135,125, 19,148,179,233, 96,150, 34,227,
+ 42,231,102, 91,143,172,221,253, 11,239,203,246, 48, 87,234,147,173,250, 10, 32, 90, 90,210, 85, 84,166, 69,225,158,235,226,124,
+166,200,109,224,245, 11,176,167,168, 75,240,206,172, 47,152,211,206,244, 92,129,111,244,122,121,169,242,203,179,215,227,133, 8,
+ 7,174, 10,191,106,199,163, 60, 51,250,191, 44,138,182,233, 96, 92, 67,141,158, 74,252, 94,156,110,204, 69,112, 97,118, 13, 36,
+154, 74,113, 75,217,175,128,158,170,226,141, 49,160,116, 17, 48, 75,245,148,207, 56,211,105,154, 8, 57, 45, 58,149,148,228,176,
+ 51, 5,180,177,132, 28,107,184,203, 40,138,244, 12,157,181,132,156,152, 98, 98, 8,158,172,101, 52, 44, 72, 79,195,212,143, 11,
+195,160, 84, 26,151, 86, 66, 84, 59,247,167, 10, 8, 81,164, 82,197, 95, 62, 96,140, 37,214, 52, 48, 73,117,147,104,213,195,110,
+135,171, 34,166, 82, 50, 57, 38,156,181,180,198,144,125, 64,217,122,184, 40,141,216,125, 71, 92,211, 17,234,247,180, 70, 4,107,
+198, 40, 98,244,117, 95,232,240,147,151, 53,133, 54,164,162,200,152, 10, 58, 81,248, 41,208, 58,135, 86, 73, 52, 11, 74, 99, 40,
+ 56,163,105, 93, 43,153,225,192,232, 61, 37, 69, 92, 35,232, 89,171, 21,170, 36, 82, 12, 88, 99,137, 81,236, 79,164, 44,123,219,
+ 90,148,148,186,187, 45, 85,100,214, 26, 65,131,234,106,173, 11, 73,198,192, 93,219,202,158, 61,103,138, 74,139,222, 70, 33, 29,
+182,107, 12, 41, 38, 38,239, 49,214,213,145,180, 8,218,114,138,180,109, 83, 29, 1,171,174, 38,198, 32,160,157, 25,110, 82, 50,
+141,145, 52,180, 67,103,120,125,123,203,225,216, 98, 26,205,195,131,120,254,141,150, 17,109,174,247,102, 99,100, 60,171,116,169,
+215, 97, 38, 71, 93,237,176, 91,183, 11, 27, 43,161,100,169, 79,117,122,147,102,130,164, 42,139,237, 52,165, 68,127,234,235,251,
+ 92, 19,216,230, 38,170,126,163, 25, 90,165,180, 38,215,176,150, 82, 74, 93, 27, 93,179, 36,202,178,107, 55,198,205, 91, 63,225,
+144,168, 88, 17,185,235,223, 55,218, 80,114, 45,250,178, 36, 64,170,185,145,211, 69, 58,117, 45,113,192, 41, 84,247, 65,200,116,
+173,140,167,117,181,126, 53, 78,222, 11,237, 90,134, 20,152,208,156,250, 17,134,140, 61, 9,128, 70, 41, 69, 99, 29,143,195,196,
+187,111,222,243,213, 79,111,101,221, 87,199,223,115,208, 14, 65, 86, 69,105, 26,201,218,240,240,120,230, 55,223,220,241,225, 28,
+240, 89,241,197,151,111,217,159, 60,254,225,129,199,143, 15,148,164,105, 15, 71, 92,183,103,215, 21,134,126,168, 44,132,142,239,
+222, 15,124,247,225,204, 41,105,238,167,192,144, 11, 35, 48,197,140, 79,137, 84, 10, 55,183, 55,188,253,234,103,132,201,115,127,
+247,158,157,150, 20, 55,114, 32,169,150,168, 13,106,231, 72,182,144,173, 22, 27, 94,235,176,107,136,203, 11, 7,115,225,199, 38,
+160,254,246,221,123,185,132,178,106,173, 62,141, 77, 85,151,226, 52,181, 25,243,204,255,175,235,133,155, 54,103,118,121,225,185,
+ 21,181,238,217, 63,249, 51,105,125,161,122, 22,234, 96,121, 49, 47,254, 83, 24,221, 45,152,100,157, 6,108, 44, 83,245,207,103,
+ 4,250,214,159, 46,251, 43, 25, 5, 74, 39, 87,158, 30,200, 23,190,246,234,225, 87,107,144, 13,234,249, 41,244,165, 19, 97, 43,
+241,159, 51,217, 97,235, 74,211, 90, 65,154,133,103, 8,223, 96,230,228,111, 92, 19, 37,151, 11, 68, 42, 85,221, 57,219, 98, 46,
+187,238,149, 42,183, 94, 27, 27,178,239,143, 27,247, 44,169, 93,235, 96, 65, 45, 5,234,246,103, 92,128, 49,207,189,135, 79,150,
+ 82,101,227, 86,216,102,170, 87, 27, 74, 78,203,120, 81, 27,195, 52, 13,164, 28, 22,221,201, 58, 33,145,189,166,132,146,136,106,
+247,124,238, 37, 84,196, 90,218, 86, 72,113, 49, 70, 50,114,192, 27, 20,218, 89,252, 24,233,251,158,125,215, 49, 14, 35,166,192,
+ 99,146, 88,201,199,243,153, 62, 4,176,166,194,106, 12, 67, 74,210,137, 26,197,126,191,227,230,230,149,140, 13, 21,140,253,128,
+ 41,138,186,194, 37,147,165,235,175,108,120, 52, 76, 33, 72,241, 85, 50, 93,219, 98, 54,130,211,105, 18,149, 60, 9,162,151, 44,
+234, 24,164, 35, 52,213,155,222,185, 29, 33, 73,134,123, 74, 89,172,114,198,241,248,120,174,130, 66, 71,169,113,161,109,219, 10,
+ 2, 55, 68,108,211,162,170,149,142,156, 36,151, 61, 77, 24, 13, 93,227, 56,238, 26, 90,103, 80,100,162, 18, 2,154,194,208, 58,
+135, 15,146,217, 46, 13, 96,192,213,196,186,214, 25, 82,206,180,117,114, 48, 11, 79, 37, 83, 92,112,182,143,167,199,101,205,150,
+ 82, 68, 1, 77, 29,233, 15,253, 25,171, 13,164,218,205,166,140,178, 6, 31,163, 28, 40, 41,139,181, 48,122, 81,229, 43, 93,163,
+ 66, 83,245, 93, 75, 65,167,245, 60, 18,207, 34, 30, 12,114, 24,246,253,137,214, 89,116, 78, 28,154,134, 87,135,134, 67,167,104,
+109,146, 9,135, 65,246,240,117, 50,161,141, 20, 29, 95,124,245, 21, 63,251,234, 75,254,246,111,127, 73,223, 15, 53, 83, 93,180,
+ 81,219, 48,161,178, 42,139,137,185, 48,134, 4, 90, 38, 7, 33, 85, 93, 0,226, 45, 87, 40,114,136,203,253, 83, 52, 43, 85, 43,
+146,146,136,111,173,188,110,169, 78,206,174, 45,169,107,225, 93, 46,120, 33,179,245,209,106, 93, 3,176, 36,152,165, 66, 21,228,
+ 83, 89,106, 84,110,181,215,170,146, 43,243,125,221, 66,198,152,100,114,170,221,242,217, 17, 61, 24, 28,218,150,221,126,199,228,
+ 7,193,178,170,217,234,102,193, 53, 4, 21,192, 88,162,150,130,232,246,176,199,168,136, 53,154,111,127,243, 61, 95,190,121, 37,
+ 41, 95,173,220,247, 67, 85,191,107,165, 41, 49,242,120, 58, 49,228, 76,177, 13,183, 55, 55,156,194,153,239,239,123,250,119,143,
+ 60, 76, 19,244,247,188, 61, 28,249,240,254, 76, 81, 31,216, 31, 44,237,174,195, 79, 35,141,187,229,176,127,195,185,143, 60,246,
+247,188,187, 59,113, 55, 4, 62, 62,142,248, 4, 33, 65, 66, 4, 81,231, 83,207,248,238, 61,255,234, 95,254,107,126,247, 15,255,
+123,254,250,255,254, 83, 66, 58, 99,138,166, 36, 69,202,138,162, 45,205, 77, 67,123,211, 80, 26, 13,173, 89, 59,245,173,130,123,
+185,193,171, 79,143,200,159,179, 39,253, 86,219,244,170,156, 80, 92, 90,196,158,222,100,213,179,187,223, 92,245, 86,219,195,123,
+233, 12,235, 23,148,114,121, 64, 92,119, 90,229,170, 88,184,248,186,235,253,241,230,160,251,177, 7,250, 75,175, 83,174, 41, 39,
+235,254, 90, 45, 98,147,178, 57, 44, 46,200,178,149,237,190, 80,224,102,133,127, 97, 1,112, 44,251,219,205, 96,255,162,137,175,
+234,240, 39, 47,228,188,199, 86, 91,187, 86,217,172, 51,202, 37,140,165,238, 61,217, 56, 2,102,211,247,140,127, 84, 23,172,129,
+178, 0, 39,230,145,255,162, 86,159,127,196, 92,214, 84,190,103,166, 8, 79, 34,116,159, 73, 14,124, 50,171, 40, 44,197,226,118,
+ 98,242,252,251,116,249,216,215,182,203, 37, 97,111, 67,249,155,119,154,185,194, 49,164,211, 41,181, 35,209, 21, 11, 42,228,181,
+ 88, 15,128,217,223,173, 40,140,195, 80, 57,217, 98, 9,139, 57, 51, 12,163,236, 41,181, 38, 68,177, 40, 77,125, 15, 74,209, 54,
+ 45,195,121,128,162, 24,106,176,202,161,219,227,189, 68,133, 42,235, 68,236, 24, 35,206,118,216, 70, 67,201,164, 41,114,255,254,
+ 78,108,111, 64, 63,246,180,109, 71,107, 91, 81, 91, 43,200, 51, 73, 12, 48,170,112,232,186, 37,255,192, 79,129,243, 48, 10,173,
+110,156, 68,193, 94,192,216, 88, 89,236,178, 82,152, 5,118, 70, 91,250,177,231,112, 60, 48, 77, 53,166,117, 28,105,218,157,240,
+225,135, 73,210,232,144, 93,119,172,227,211,118,215,226,189,116,176, 41, 38, 84,150, 29,169, 81,176,239, 90, 90,167,233,172,162,
+113,166,194, 86, 12, 40, 77, 72,153,148,225,220, 79,140, 85,252, 53, 76, 1,163,231,171,184, 10,242,148, 8,184, 82,165,178,229,
+ 36,227,232,211,249, 84,163, 87,253,162,158, 78, 41, 75,183,150,178, 92,239, 57, 11, 72,168, 30, 58,122, 94,191, 24, 37, 86,178,
+ 36,135,144,217,136,120,115,146, 12,248, 82,191, 70, 41,203,110,215, 85,143,187,216,252,146,143,236, 92,139, 38, 19,167, 9,239,
+ 50,131, 21, 47,127, 78, 22,218, 6, 48, 11,159,192,106, 85, 99, 76,225,205,171, 55,252,241, 31,255,123, 62,124,120,207,195,195,
+137,198,153,205,103, 99,155, 25,161, 80,198, 98,170,229,241, 60,140,216,106, 45,155,239, 36, 70, 23, 26, 39,169,151, 37,213, 34,
+117,190, 57,150, 88, 39, 15, 90,242,227, 17,129,110,206, 25,178, 76, 59,200,165,218,178,114,117, 37,196, 42,136,148, 21,132, 20,
+118, 2,209,201,117, 34, 5,245, 58,170,211, 64,106, 58,158,174,205,212,204,129,207, 64, 76,226, 70,208,170, 34,172,163,128,157,
+ 26,227,132, 30,104,180, 92,247,135, 22,107,160, 57,236, 33, 37,108,235,234,125,181, 96, 93, 67, 46,103,156,113,188,121,117, 32,
+246, 39, 94,239, 90,142,135, 35,254,241,158, 15,119, 15,244,167,137,221,126, 79, 14, 2,248, 17,224, 86,130,148,137,163, 39,148,
+ 66, 50,150,127,120,247,158,199, 94,241,161,143,124,236, 7,154,156,185, 61, 54,252,228,171, 47,105,156,101,120,244,120,175, 25,
+ 30, 61,249, 49, 50, 14,145,199,199,123, 52, 45, 69, 25,166,193,115,186, 31,248,254,254,204, 41, 2,202, 18,107,104, 77, 65,118,
+249,211,253, 3,255,251,127,249, 47,252,193, 63,255,125,254,248,127,254, 95,248,203,255,227, 63, 19,238,190, 39,103, 35,186,134,
+146,217,191,186,197,236, 20,102,223,146,157,194,188, 62,188,250,147, 82,213,239,215,163,226, 5, 24,162,158, 30,232,207, 89,212,
+126, 59,174,187, 89, 34, 48, 55, 84,149, 11,225,145, 82, 79,163, 51, 47,162,192,183,177,153,219,199, 94,201,164,203,121,174,213,
+ 85, 94,250,214,138,164,212,179,250,170,235,177,249, 74,142, 43,155, 14,244, 25, 45,194, 11, 58,133,139,215,103, 59,125,168, 19,
+ 6,189,224,122, 89,172, 85,170,238, 97, 69, 32,151, 22,168, 73, 89, 16,180,101, 13, 77,169,130, 67,107,196,163,110,141, 84,212,
+ 70,109,168,105,106,139,236, 41,155, 3,182,114,152, 23,162, 92,174,161, 46,106,205, 30, 87,122, 85,211, 47, 35,184, 89, 11, 80,
+ 54, 17,168,215,201,115,235,161,190, 88, 37,203,108, 3, 91, 5, 45,179, 40, 30,117, 9,253,173, 6,150, 53,157,237, 25, 31,249,
+115,215,224,115,239,201,245,251, 80, 54,175,161,186, 40,167,184,148, 23, 46,149,163, 90,197, 73, 91,108, 81,189, 78,119, 93, 83,
+133, 97,165, 90, 0,229,112, 16,254,122,168, 97, 23, 6,107,101, 20,105,173,165,237, 90,177, 95, 77,158, 97,154, 40,185, 16,162,
+ 88,182, 38, 31,164,147, 15, 98,249, 41, 41, 51,244, 35,231, 97, 68,215,100, 47,133,198, 56,199, 52,121,226,224,201, 62, 80, 98,
+ 34,199, 72,244,129, 16, 60, 90,233, 74, 48,155, 3, 81,228,121,165, 10,143, 9, 33,210,247, 35,211, 56,213,113,172,128, 85, 78,
+253, 80,115,215, 53, 41, 75,132,231, 48, 70, 98, 17,103,200, 48, 69,124, 76,100,101,152, 82,198, 39, 24,125, 36,100, 40,202,242,
+240,112,166,104, 41, 86, 10, 90,252,216, 74, 11, 49,207, 7, 40,133,152,196, 14,103,172, 96, 95,115,142,116, 77,131,166, 96,181,
+240,175, 59,103, 56,180,142, 55, 55,123,217,165,171, 82,179, 13,172, 64,104,124,148, 92,240,232,235,148, 67,132,108,186, 38,138,
+205,188,134,110,183,103,242,113,113,153,160,103, 70,127, 21,111,206, 90,134,178, 70,231,206, 10,111,165,205, 2, 48,174, 66,115,
+217, 47,215,117,217, 44, 6, 91, 2,166, 42,191, 97,169,123,149,192,120,102,174,193, 56, 78,210, 85, 83,120,251,246, 53,166,254,
+ 92,243,202, 35,164, 76, 42,154,126, 74,196,168,240, 99, 97, 24,124,141, 93,149,207,237,249,124,230,215,191,250, 21, 31, 62,220,
+ 85,146, 91,185,210, 9,173, 66,228, 57, 24,165, 84,152, 80,140, 17,173,141,100,192, 91, 67,227, 76,117, 34,148,197,154, 58,123,
+215,181,130,182,113,116, 77, 43,244,183, 82, 45, 94, 10, 92,227, 40,185,186,161,138, 90, 92, 27,133,173,152, 81,180, 7,214, 88,
+108,117,180, 58, 99, 48, 21,213,171,171, 29,214, 85, 75,168,174, 62,237, 82, 42, 62, 54, 11,196,102, 22,167,234,250,190, 25,109,
+216,119, 59, 72, 69, 56,240, 90,177,219, 57,154, 78, 86, 29,166, 72,161,162, 75,225,230,230, 72,202,153,135,135, 71,148, 86, 28,
+ 77,225, 95,253,254,239,241,179,159,188,102, 24, 30, 56, 28,118, 52, 74,227,246,142,215,191,248, 9, 49,123,116,169,214,178,209,
+ 67,150, 64,159,187,251,145,119,143, 35,125, 48,124,253,190,231,253,105,224, 28, 34,253, 24,121,247,238, 3,253, 56,224, 67, 34,
+ 38,131,182, 59,188,118,124,253,237, 3, 15,143,137, 16, 19,167,243, 35,239, 63,222,113,247, 48,240,155,239,238,185,247,153,104,
+ 91, 66,150,207, 84, 90, 2,141,132,155,144, 74,225,219,239,223, 49,244, 3,255,225, 63,252, 71,254,254,239,126,133, 33, 97, 75,
+226,216, 25, 14, 59,203,237,235, 3,230,182, 69,127,126,139, 45, 27, 88,246,143, 13,104,121,169, 75,253, 71,237,211,127, 11,177,
+124,217,192,211,203,194, 9, 95,149,235,203,152,105,190,225,110,187,179, 43,222,122, 81,159,126,236,107,202,156,122, 66, 79,122,
+ 57, 97,237,250,128,121,254, 80,223, 48,204,103,220,237,124,192, 84, 33,140,209, 44,248, 67, 17,216, 80, 41, 82,171, 63,127,187,
+127, 86, 27, 49,201,114,232,214, 27,139, 74,229,197,151,187,104,179, 42,242,175,115,239,183, 7,219, 51, 29,238,156,180,164,171,
+130,127,166, 66, 21,214,231,161,230,247,103,254,110,229,234,245,221,168,232,231,226, 66,177,170,214,231,180,120,245,236,166,157,
+ 39, 99,191,151, 10,206,231, 59,251, 53,154,229,130,138,159,213,147, 52,185,121,132,175,212, 42, 22,152, 39, 44,186,218,254,140,
+210,140,211, 64,215,181,160, 5, 79, 25,147, 40,161, 75, 41,116,187,142,166,181,213,114,168,232,218,142,211,249, 76, 74,165, 18,
+190,162,236, 17, 21, 50,230,243,129,146, 51, 59,215, 81, 50,196, 26,147,170,180,163,233, 90,250,254,204,187,251,143,148, 24, 49,
+ 40, 26,237, 42,221,111, 62,172, 50,166,162, 82,115,202,244,253,136,247,147, 8,149,173, 33, 41,241,177,203,224,200,129,179,204,
+239, 94,204, 25, 99, 27,118,199, 29,211, 24,233,135, 65, 70,215,245,112, 83,104,154,195, 13,251,189, 4,195,220,159, 31,107,160,
+144, 1,173,105, 93, 67,242,129, 97, 12, 24, 43, 5, 9,165, 16,166,243,130,160,158, 39, 76, 33, 6, 66, 72, 24, 45, 55,231, 28,
+ 38,156,145,253,121, 99, 45,175, 14, 59,118, 86, 19,189, 39,170, 36, 41,107, 89,222,159,249, 0, 84,115, 68,173,151,207,138,214,
+107,113,158, 82, 18,219,108, 8,100, 10,182,113,104, 43, 58,134, 84, 10,218,154, 5,223,156, 66,168,136, 84,217,181,231, 88,239,
+ 33,198, 80, 66,216, 20,191,114, 80,249,148, 46, 86,149,243,138,134,106,181,220, 94,111,115,152,142,247, 94, 72, 15, 37,139,133,
+202, 41,218,221,129,105,212,236,186,142, 24, 3,221,241, 64, 63, 14,228, 52,113,122,248, 64,201,178, 90,113,214,160,116, 2,165,
+ 8, 83,224,215,191,250, 77,189, 46, 77,157, 6,176,168,203,103,205,139,169,161, 79, 90,131, 51, 14,107,229, 0, 23, 60,171, 88,
+ 40,181,146, 2,101, 94, 97,234, 77,217,106,173, 28,206,185, 90, 31,203,102,172, 46,107, 5, 17, 25,146,100,207, 79,109, 18, 99,
+ 12,116, 93, 71, 74,117,221, 80, 50,170,134,245,176,124,166, 51,141, 53, 56, 35,158,243, 28,203,178,178, 16, 91,243, 44,148,149,
+187, 64,202, 5,227,236,114,159,207, 33, 9,220, 69,131, 53,185,130,104,228, 90,211,198, 44,244,147, 20,228,144,110, 27,121,175,
+127,239,159,126,201,190,201,220,127,255, 27,254,240, 15,255, 57,163,143,124,243, 87,127, 67,127, 58,201, 90,160,181,228,211, 25,
+139,162,164, 76,242,153,243,195,196,175,190,254,192,135, 80,240,201, 96,237,158,198,102,166,152, 40,202,210,238, 94,129,109,249,
+216,103,238,222,223,115, 58,189,163, 61,236,241,169,208,143, 35,218,237, 73, 35,244, 99,224,251,147,231,195,148,137,170,126, 62,
+231, 6, 51,203, 61,158, 20,235,109, 70, 83,140,225,207,255,250,151,188,186,125,197,239,255,209,191,225,175,254,244, 63,115,219,
+ 89, 82,242,168,156,177, 77,131,106,219, 75,245,251,179,184, 87,197,146, 1,190, 29,207,111,179,203,203,188,195,252,209,230,181,
+ 75, 75, 87, 94,110,238,207,135,165, 92, 40,141, 75,185,176, 75, 92,231,100,109,178, 72, 46,215,205,245,224, 41,155, 35,227, 58,
+ 40,237, 66,212,117, 69,149, 83,171,226,109,249,218,124,129,125, 93,179,203,231, 73,195, 86,172, 53,147,180,214,133,118, 97, 77,
+ 87,223,244,164,165,238, 80,171,119,217, 40, 93, 83,164, 10,182,105,112,198, 48,140, 99,237,122,202, 19,205, 91,153,199,245,155,
+220,149,249,176, 93, 11,128,167,111, 75,220, 38,144, 21,208,179, 71, 72,109,115,201,103, 14,116,125,164, 44,149,186,209,171, 96,
+104,123, 98,235,250,125,228,252, 83, 23,175,241, 34, 69,219, 62,217,173, 48,176,108,253,249,151, 9,120,252, 0, 7, 97,254,187,
+ 51,153,105,251,245,235,182,161, 92,141,219,159, 78,106,148,186,108,118,174,115,232,175, 76, 7,203,180, 36,165, 72,211, 24, 92,
+ 99,132, 56,102, 36, 66,113,183,107,100,186,162, 11,218, 66, 76,129,166,233, 24,199,145,148,178, 8,195,148,236,218, 75,129,243,
+169,134,164,236,118,114,128, 77,158,113,154,104,109, 35,226, 46, 52, 31, 63, 62, 72,172,101,206,232, 2,199,182, 67,165, 92, 89,
+218,174,238,115, 69,229, 61,122, 95,129, 41,178, 68, 23, 59,150,252,183,199,243,132,181, 50,238,246,190,178,194,235, 4,193,199,
+196,253,135,123, 1,175,228, 76,211,117, 98,223, 41, 21, 62, 98, 45,166,109,249,240,112, 79, 81,194,118, 80,181,179,114, 74,147,
+ 80,184,198,209, 15,189,248,109,181, 38, 86, 36, 41, 57, 67,204,139,138, 91, 43,161,106, 89, 45, 93,156,213, 50,106,182, 20, 74,
+ 10,164,162,233,118, 29,166, 21,142,185, 50, 18, 38,159,115,194,217,134,126, 26,241,161,160,148,197, 24, 41,132,141,179,232, 34,
+187, 92,153, 62,248, 5,117, 60, 13,211, 18,146,228, 39, 73, 20,235,186,134, 24, 37,254, 84, 25, 57, 88,218,182,193,251, 80,217,
+235,134, 88,146, 8,213,138, 90,174,215,237, 61,108,185,118,106,231, 95,114, 89,226, 98,231,148,182,105,154, 36,124,165, 2,157,
+222,127,248, 64,201,153,166,105,133,116,135,162,219,107,206, 99, 18, 81,224,238, 72,240, 9, 75,170,135,162,166,113,141,224, 87,
+ 81, 53,208, 69,154,135,113, 28,217,237,118, 21,246, 19, 41, 41, 99, 85, 38,165,128, 82,208, 54, 13, 37,167, 26,144,226,171,250,
+ 92, 46, 96, 85,159,179,190,104,108,106, 51, 83,169,109,210,225,215,157,120, 17,209, 94, 65,120, 9, 69,175, 52,200, 5, 12, 85,
+139,134, 28,171, 88, 46, 11, 47,160,212,233,141,208,251, 82, 45, 46, 4,171,172,107, 97, 34, 83,129,117,162,106,141, 37,165, 72,
+172,107, 13, 85, 25, 7, 70, 23,118,109,131,210, 53,105, 46, 38,110, 14,123,116,145,191,183,107, 45,209, 79, 52,198, 96,145,194,
+243,241,244,128, 74,133,127,241,111,255, 5,175,127,241, 79,248,205, 95,254, 13,109,107,121,184,127, 32,140, 30,123,212, 82,200,
+249, 64, 25, 39,252, 57, 50,244,145, 24, 44, 31, 63, 60,144, 77, 87,217, 22,138,157,177,152,198, 50,134, 19, 49, 42,166,146, 57,
+188,126, 77, 86, 35,239,223,125, 96,244, 66, 75,188, 63, 15,180, 77,199,121,128,199,177, 16,180,173,107, 5, 1,134,229, 20, 49,
+181,177,203,245,206,154,171,184, 50, 99,248,211,255,231,255,227,143,254,183,255,149,221,103,159, 17,252,189, 52,121,117, 12,175,
+ 15, 29,229,208,173, 68, 57, 85, 71, 76, 79, 18,215,212,203,254,243,217, 2,177,181,243,188,220,102,111, 47, 19,245, 12,100,125,
+179, 55,189,226,164,173, 35,242, 57,158,177,108,132, 76, 91,202,208,229,141,182,108,210,221,230, 49,236, 2, 23, 41, 60,189, 99,
+207, 55,231,178,238,153,133,103,174,214, 81,183,218,122,168, 87,216,130,252,179,220, 36, 43, 90,173,142,246, 54, 4,186,217, 51,
+ 63, 31,104, 42, 47,199,138,214, 5,103, 53,214, 66,219, 88, 26, 39,162,152, 56, 77,248,105, 92,200, 66,128,112,170,151,168,220,
+188,138,193,106,222,180,169,153,224,115,186,145,218,238,209,175,184,178, 69, 65, 86,171,103,148,122, 3,170,159, 47,138,214, 24,
+ 99, 37,222,179,138,226,102, 34,157, 4,121,232,229,123, 45, 41,113,170, 92,240,210,183,206,193, 39,215,136,122,106,145,188,238,
+230,103, 24,210,133,125,113,126, 63,175,174,203,173,187, 97, 38, 37, 42,173, 54,251,254, 21,251, 59,223,125,117,125, 3, 75, 37,
+214, 93, 25,239,175,126,182,237, 9,191, 38, 25,202, 75,146,104,156,165,237,172, 36,157,133, 32,129, 58, 42,163, 85, 89, 68,124,
+ 41,199,170,126, 22,244, 99,202,146, 82,149,178,236,112, 39, 31,208,104, 14,251, 35,214,138, 32,202, 88, 83, 15, 89, 25,199, 63,
+158, 78, 34, 8, 13, 9,135,230,205,254,136,203, 5, 91, 63, 19, 51, 56, 36,134, 68, 44,153,172, 4,228, 43, 94,110,105, 99,167,
+144, 8, 81, 70,186, 83,136, 88,215,144,178,136,231,124,136,244,163,103,119, 56,146,149, 18,203,144, 0, 18,150,233,145, 8, 3,
+ 13,211, 56,214, 66, 76,124,235,165,166, 1,197,224,241, 33, 16, 98,146, 12,242,146,103,139, 51,198, 57, 41, 78, 92, 83,189,217,
+107,201,157, 98,194,104,203, 97,183, 39, 5,143, 82,121,177,108,233, 89,240, 24, 11, 37,202, 62,215,123, 9, 65,153, 66, 34, 38,
+ 68, 64, 84, 88,210,192,230,189,178, 53, 14,148,194, 40, 91,213,220,176,239,118, 4, 31, 22, 71,202,172, 97,208, 53,192, 72, 86,
+ 5,121,217,151,215,143,136, 76, 0,178, 90, 58, 90,125, 49,211,146, 14,125, 46,130,203, 38, 43, 66,192, 51,150, 87,183,175, 8,
+ 33, 45,215,186,173,145,154, 93,211,146,115,196, 79, 94,152,249, 20,162,156,254, 20,192, 88, 41,236,231, 27, 91, 12,129, 82, 41,
+123,228,132, 74,169,118,221,162, 46, 39, 69, 74, 8,116,141,101,215,136,253, 81, 33, 46, 13,163,168, 43, 14,181,196, 17, 59, 55,
+195,127, 10,214, 25,140, 93,239,237, 37,165,133,228,136,210,228, 13, 1,114,241,224,187, 70,112,168, 26,156, 86,216,106,238,181,
+ 90,215, 85,162, 8,237, 74,201,184,154,230, 54, 67,119, 82,146, 34,129,234, 10, 17,241, 27,148, 36, 86, 58,205, 10,101,202,185,
+200,216,158, 34, 76, 4,149,105, 26,201, 84,208, 26,137, 55,214,133, 93, 99,105,172,162,181,134, 56, 5,118,221, 78, 18, 9,173,
+229,103,191,248,156,127,251,239,255, 29, 55, 63,185,225,244,205,215, 60,222,221,179,239,246,244,247, 15,180,251,134,195,241, 70,
+ 8,114,193, 19, 63, 60,114, 62,123,254,238,155, 59,126,245, 15, 31,249,254,190,231, 52,140,156,199,137,209, 39, 82, 42,248, 48,
+241,246,237,107,190,250,242, 75,162, 79,124,255,205,183,248, 97,162, 20,203,233, 60, 10,144, 40,107, 9, 99, 26, 61,253,232, 25,
+235, 4,137, 26,194, 99, 20, 52,149, 4, 90,106, 68,120, 44,185,186, 40,132,155,239,195,196,127,247,123,191, 67,255,221,215,188,
+114,154, 87,135,150, 87,111,142,152,207,143,164, 47,223,172,209,171,165,168,103, 69, 66, 63, 4,151,121, 2, 24,249, 17, 93,251,
+162, 32,190, 82, 40,175, 85,239, 37, 92,100,153, 16, 92, 61,230,178, 7, 35, 95,126,172,182,171,208,234, 35, 46,172,214,176,203,
+ 40, 23, 54,204,215, 53,214, 52, 47,222, 72,253, 4,167,170,138,146,110,118,182,161,205, 54,173,250, 28,242,147,201, 67, 89, 40,
+119,170, 86, 95,242,113,176,213,195, 44, 97, 40, 78,103,172,134,206, 88, 25,247, 80,104,246, 45, 49,201,152, 80,145,112, 78, 51,
+ 4, 81,138, 42, 10,122,121,126,229, 50, 62,118,166,213, 41,158,188,142, 79,212,249,229,130,109,179,157, 74, 47, 1, 59,106,203,
+116,175,137, 98,242, 94,230, 75,171,158, 90, 85,229,203, 52,228,106, 23,254,156, 96,237, 57,199,192, 75,127,119,134,251, 60,167,
+ 97,184,184,118, 46, 38, 2,155,130,160,158,250,229, 98, 2,115,221,145,255,136,235,120,153, 17,173,184, 60, 31, 2, 33,123,218,
+182,161,212,188,111, 87, 71,187, 40, 77, 63,140,164, 18, 73, 57,160, 21,124,246,230, 51, 98,156,240, 21, 25,171,148, 40,177,115,
+156,247,179,154,221,110,199, 56, 76,220,125,188, 99, 24, 39, 82,202,236,118, 59, 17, 13,105,205,206, 56,180, 81,180,174,195,247,
+103,218,166, 19,161, 82,206, 88,215, 80,148,196,136, 22, 20,198, 88, 26,165,241,201, 75, 65,151,178,236,153,131,103, 24,167, 69,
+247, 96,173, 35, 35,157,109,201, 5,171, 13,161, 6,155,236,118,114, 16,238,247, 59, 38,239, 41, 9, 82,172,169,106, 83, 88, 16,
+159,211,228, 49, 53,107,124, 28, 6,114,202,236,218,150,148,194, 18, 78,147, 82,145,212,169,154, 91, 30, 67,165,229,197,196, 48,
+121,201,139,174,123,217, 5,215,172, 52,198,105,146,207,164,156, 68,173, 79,166, 84,127,123, 41,170,114,207,133,196,102,172, 93,
+162,120,163,143,164, 28,177,149,145, 62, 12,177, 30,138,162, 69, 65,171, 26,188,146, 9, 94, 86, 33, 33,229,186,158, 84,203,186,
+ 73,149, 31,179, 57, 20,155,167, 42,122,249, 12,120,239,151,107, 90, 46,223,170, 81,169,218,148,105,154,208,102, 94, 25,212, 66,
+ 74,107,250, 52, 45,249,226,115,225,158, 82, 38,230, 36,104, 96,192, 42, 57, 0,149,214,164, 81, 4,152, 84,124,235, 48, 77, 50,
+ 22,223,212,170,212,195,210, 89, 43,247, 35, 59,223, 15,179,172, 35,152, 65, 54,114,157, 80,137,145, 37,207,105,130,171, 85, 77,
+ 83,131,139,180,198, 26,161,220,201,142,220,226,189, 71, 27, 83,139,128,153, 29, 34, 59,253,156, 10,141,115,116, 93, 71,156,124,
+157,114, 38,124, 74, 56,230, 12, 11, 7, 41, 74, 48, 85, 1,149, 34,141, 81,228,105,192,238,247, 36,241,199, 18, 74, 33,199, 68,
+131, 97,191,219, 67,154,104,172,229,245,205, 14,157, 19,118,223,178,191,217,163,190,203, 52,187,150,183, 95,188,102,247,229, 23,
+124,252,251,255,202,199, 95,127,205,207,255,224,127,224,187,191,248,111,180,214,114,250,230, 29,159,127,249, 5, 28, 52,202, 54,
+ 36,101,121,127,122,224,239,239,238,249,230,225,132,167, 33, 57,131,143, 9,157, 50, 59,107, 81,177,112,254,120,162, 63,220, 18,
+124,194,180, 29,119, 15,119,248, 73,147,139, 38, 23,120, 56, 13,236,218,150, 88, 20, 83,134, 88,100,154, 5, 66,230,108,173,166,
+209, 90,240,182,206,224, 75,169,235, 36,133, 86,162, 31,249,251, 95,253, 3,255,211,191,249,151,124,237, 51,147, 19,145,102, 44,
+ 5,167, 45,198,117,178, 83, 95, 19,118,202, 39, 15,240, 31,162,197,125,242, 96, 87,249,169,111,250, 98, 6,174,159,168,181,183,
+ 99,253,237,129, 94,100,200,119, 65,148,145, 3,165,200,248,103,190,241,171, 76, 49,165, 90,173,242,213,115,124,106,143, 91,207,
+247,114,169, 24, 47,250,162,131,156,187,248,153,136, 86,230,221,217,179,130,234, 92, 39, 11, 74, 24,202,213, 26, 97,173,195,152,
+134,198, 58, 65, 33,150, 72, 99, 50,135,174,193, 41,217,225,132, 10,242,112,246, 64,201, 82,177, 79, 49, 18,188,103, 76,177,234,
+ 2,158,238,154,159,140,142,159, 75, 64,123,238,189,219,172, 55,158, 22,111, 27, 63,249,102,106,177,170,225, 75, 45,106,202,143,
+178, 58, 62,187,155,255, 45, 24, 8,159, 4, 32,229,114,121,184,151, 21, 65,187,144,242,102,221,219, 6,162,179,216, 0,159,115,
+ 45, 60,103,222,184, 80, 93,214,252,120, 20, 37, 21,114,170, 59,206, 44,220,113,107, 44,227, 56,226,131,136,101,238, 62,222,241,
+230,245,205,178,107,140, 67,172, 66,174, 70,180, 19,133,152, 90, 0, 0, 0, 32, 0, 73, 68, 65, 84, 69, 70,147,135,227,145,143,
+ 31, 63,242,241,227,157,140,128, 43, 8,166,105, 26,166,209,115,115,115,172, 17,147,144,134,177, 50,200, 5, 49,130,145,195,169,
+104, 69,204, 25,107, 26,134,113,228,120,115,164,127,232,133, 55,223,118,194, 13,167, 44,246, 43, 61,115,218, 43, 64,165, 20, 89,
+183,180, 77,203, 20, 60,209, 7, 20, 48,244,131, 8,197,106,103,222,247,103,140, 22,171,147,196,141,139, 35,192,152, 26,226,161,
+ 69,124,215,182,109, 13,155,145, 36,186,237,138, 76, 25,203,238,208, 65,202, 60,156, 78,220, 30, 90,140,181, 88,107,104,172,160,
+ 75,165, 42, 83,196, 28,209,104,156,213,117, 92,105,170,152, 77, 18,211, 82,146, 16,149, 20,163, 80,199,140,174, 48,148, 82, 15,
+252, 58,106,158,113,166, 86, 98, 96,219,174,149, 34, 38,132, 10, 33, 42,117, 65, 47, 58, 2,201, 26, 23, 76,113,190, 26,251,173,
+159,177, 75, 75,164, 18,218,138,184, 26,148, 98,154, 70,108,141, 51,157,166, 9,231,108, 77,104,211,196, 60,227, 85,101, 29, 23,
+179, 8,235, 98, 74, 85, 93, 78,205,123, 79, 75, 92, 39, 91,230, 57,194,192, 31,199, 81, 8,134, 41, 83,116, 33, 35,130,180,146,
+165,139,158,239,117,185, 78,140,108, 85,181,231, 34,190,236, 89, 64, 40,162,184, 66, 46,138, 56,249, 77,161,173, 23, 14,131, 64,
+ 97, 52, 86, 73,138,152, 53, 66, 78,204, 73, 26,174,173,240, 56, 86, 79,187,172, 49, 19, 62,103,178, 15,114,184,183, 29, 33, 77,
+ 21, 64,163, 41, 33,146, 99,164, 49, 6, 93,242, 82, 60,152,170,113,136, 37,129,106, 72, 40,134, 83,207,113,223,112,251,234,150,
+190,239,121,117,104,105,140,166, 49,154,227,177,227,254,227, 61, 93,103, 49, 38,211, 54, 10,237, 61,119,127,251, 55,124,253,237,
+175,248,253,127,247,175,249,248,155,111,249,252,247,126,206,195,247,223,203,117, 83, 2,166, 52, 48,101,250,251,129,239, 63,156,
+232,167, 76,198,145,146,166,143,137, 80, 29, 73, 83, 24,176, 70,209, 30, 26, 62, 60,244,156,206,103,238, 31, 30,171,192,148,117,
+170,161, 50,167,193, 19, 81,248, 12,197,136,200, 80,229,128, 81,138, 22, 69, 83,215,143,101, 94,233,105,232, 99,144,130, 10,197,
+119,239, 63,242,208, 71,134, 41, 51, 58,105, 18, 69,184,106,208,182, 89, 59,117, 25,163,235, 90,245, 62,127, 88,191, 40,142,123,
+134,178,246,169,142,125,190,176, 47,190,159,122,202,234,206, 87, 22,175,203,253,122,190, 18,238,213,248,147,242, 52, 1,236,185,
+238,116,254, 26,189, 29, 33,213, 71, 74, 85, 8,163,102,127,227,117,113, 67,190,116, 51, 43,225,123,151,101,132, 91,255,111,206,
+ 27, 70,201,158,164,118, 48, 77,211,208,180, 59,186,238,200,174,221,201, 46, 81, 23, 12, 9, 83,146,132,206,228, 66,241, 3,217,
+ 75,236,223, 97,191,195, 57, 67, 86, 64,140,188,251,120, 71, 20,155,240,246,152,218, 64,104,214, 53, 1,234, 19, 5,217, 11,244,
+ 84,165,149,236, 34, 89,199,206, 82,145,231,181, 88, 81,207,196,219, 22,117, 1, 55,120, 41, 94,245, 83,197,224, 75,211,160,231,
+172,129, 79,126,174,178, 33,243,109,126,159,187,233, 39,215,194,115,164,184,231, 48,180,207,126, 38, 46, 69, 10,243,254,212, 88,
+ 75, 74,243,154, 66,213, 24, 79, 75, 41,154,224, 51,143,167, 19, 90, 25,186,110,191, 92,123,146,128,103,104,155, 70,194, 84,172,
+ 28,140,239,223,191,103,168,225, 36,146,216,228,100, 76,158, 34,111,222,190, 6, 20, 31,222,125,199,193, 57,210, 56,145, 99,166,
+148,136,155,197, 88,202, 96,156, 67,167,140,115, 13, 41, 23,206,125,143,117,194, 21,239,135,190,102,135,167,186, 75, 45, 52,245,
+ 57, 88,109,232,218,142,105,154, 48,141,147,223,235,225, 86, 42,162,211, 24,201,191,118,173, 99, 28, 71, 73,165,211, 26,239,189,
+ 8,159, 82,174, 9, 99, 18,165, 23, 84,193, 90, 67, 8, 98, 29,155,145,169, 98,247, 3,215,216, 69,109,174,155, 6, 31, 19, 33,
+ 66,115,216, 9,159, 62, 71,108,237,244, 94,191,190,197,143, 19,185, 24, 90,165,208,211,132,154, 2,177, 8,120,164, 88, 71,219,
+ 52, 85,168, 88,234, 88, 23,156, 19,225,214, 28,115,219, 30,246,156,251,179,116, 87, 90, 4,125, 82,224,200,132, 67, 38,124, 66,
+197, 83,185, 44,171,148,116,133, 30, 94,108,181,234,170, 65, 82, 25,133, 89, 28, 20,222,251,165,168,153,179, 22,164, 96, 19,235,
+157, 82,138,118,215,146, 18, 4,159,136, 5, 9,198, 33,131, 86,188, 58,190, 38,165, 72, 74, 18,203, 75, 17,101,248, 76,105, 76,
+ 49,131, 42, 50,218, 46,165, 98, 84, 69,159, 99,180,133, 34,227,226, 57,233,165, 40, 69, 86,133, 56,174, 63,235,124, 88,207,244,
+187, 92, 87, 67,203,250, 93, 43,172,149,207,191,155,215,181, 37, 85,150,127, 66, 18,235,231,155,143, 38,164,128,177, 6, 40,162,
+ 11,169, 84, 69, 83,113,198,170, 64,240,147,172, 14,180, 20, 39,251,174, 37,138,173,128, 28,227,178,106,117, 86,160, 48, 89,105,
+ 6, 31, 73,254, 84,225, 64,158,227,161, 35,133, 72,219, 25, 92, 99,101, 29,102, 13,251,198,113,214,133, 87, 55,123,110,246, 29,
+135,125,199,253,135,119,184,183,154, 63,248, 79,255,145,254,235, 95, 99, 95,223, 96,142,175, 81, 71,199,112,119,150, 68, 52, 99,
+ 9, 15, 35,167,135,137,119, 31, 78,124,253,237, 29, 33, 57, 66,204, 4, 45,244,183, 98, 45, 56,199, 99, 28, 57,189,255,192,237,
+232, 25,207, 61,196,140,228,163,137,138, 63,133, 26, 58, 99,101,140,158, 41, 4,185, 81, 44, 45,173, 46, 96,114, 66,151, 34,171,
+ 79, 50, 86,120, 59,171, 21,214, 88,148,107, 56,188,122,139,230, 81,206, 46,171, 41, 86,161, 92, 83,213,239,179,146,252, 25,236,
+233,143, 97,185,231, 92,150,228,174,151, 60,192,215,138,249,167,170,228,109,101,171,158, 32, 75,179, 2,157,245,114,169,148, 79,
+168,205,185, 98, 14, 95,103,149, 47,148,182, 45,159,189, 54,253,139,178,117,211,237,102,181,138,230, 22, 64,204,156,179, 62,239,
+205,245, 38, 40,166, 42,190,173,169,153,234,179, 18, 19, 85, 5, 35,129,108, 45, 49, 78,140,179, 10,184, 86,161,206, 24, 90,215,
+ 74, 55,102, 91,178, 58, 51,157,206,228,243, 64,215, 56,218,125,203,171,227, 1,239, 71,198, 20, 25,235, 8,142, 92, 3, 70,140,
+ 89,172, 40, 51, 90,244,147, 7,228,124,248,149,205, 72,121,246,170,111,124,230, 90, 75,149, 89, 10,151, 1, 13,139, 77,237,210,
+195,126,205,198,127,113, 7,254, 35,188,254,101,129,237, 60, 93, 35, 60, 41,218,102,235,206, 21,141,224, 7,128,123,207,236,250,
+213,211,108,129,139,107,184, 92, 60, 55,165, 86, 15, 66,170,161, 27,186,226, 71,231,105,207,236, 66,180,214,113,188,121, 45, 62,
+232,250,181,130, 83, 21, 76,171,115,178,251,253,240,225,142, 97, 12,245, 48, 21,109,132,173,100, 54,235, 28, 15,167, 71,130,247,
+ 40,173, 8,100,218,174, 99,240,158,144,100,183,170,148, 33, 27,205, 88,119,120,147,207,180,187, 29,170, 36, 17,131,101, 65,168,
+206, 33, 25, 74,107,186,166, 89, 14,239, 82, 18,211, 52, 96,172, 33, 6,191,248,173,115, 41,236,187, 29,195, 48,224,140, 69,187,
+ 26, 64, 81, 15,232, 69,181, 92, 68,232,180,219,237,152,166,137,113,156,112, 78,138,141,152, 60, 90,107,186,174,163,177, 59, 98,
+140,130,167, 53,178,162,200, 5,246,109, 75,163, 11,186, 36,206,143,143, 52,214,176, 55,210, 69, 91, 45, 49,150,165, 36,188, 31,
+ 73, 49,145, 17,223,178,115, 86,254,217, 8,113,108,244,146,164, 54,142,190,142,248, 71,172,107, 37,168,165,192, 56, 12,180,109,
+203,193, 53,226, 68,168, 66,212,133,219, 95, 69,151,185, 58, 24,230,194, 89, 27,187, 16,216,230, 59,199,156,237,190,220, 63, 55,
+247,152,249,207,140, 17, 21,185,248,213, 51,214,238, 41,133,165,176,153,215, 18, 33, 70,114,202,180,251,189,188, 62,245,241,135,
+ 97, 88,236, 59,199,227,129,113, 28,153,242, 4, 90, 38, 51,169,200,202,209,199, 36,227,106,192,230, 25,230,146, 36,137,179,210,
+232,178, 18,158,206,108,169, 53, 21,215,187,124,206, 42, 81,178,168, 25, 94, 85,150,140,249, 84, 71,253,177,136,102, 68,107,197,
+ 84,243,217,141,145,241,123,140,178,170,211,198,202,247,137, 81,130,131, 54,241,200, 57, 38,156,169, 14,161, 2,157,182,114,136,
+251, 72, 9, 18,244,147,149,150,195, 95, 67, 68,145,178, 38,166, 44,118, 74, 50, 93,215,240,246,245, 13,175,143,123,108,201, 88,
+109, 5,158,164, 90, 94,189, 58,114,187,111,137,121,226,205,155, 27, 94, 29,246,236,187, 29,159,255,222, 27,254,217,127,250, 31,
+185,251,187, 95,162,140,229,245, 63,253,138,111,254,223,191,228,203,223,255, 93,126,245,127,254, 95,232, 8,106, 10,220,191,191,
+231, 55,239, 31,248,219,111,223,243,224, 19, 33, 1, 88,112, 45,177, 82,206,252,224, 73, 64, 28, 60,231,241, 1, 93, 32,142,158,
+ 70, 59,140,201, 53,132,107,109, 90, 83, 73, 20,165,176, 74,236,158,121,131, 5, 87,202, 84,253,129, 76,120, 76, 93,207,196,148,
+153,107,195, 16, 51,187,253, 13,227,199, 59,124,136, 24,103,208,173, 21,193,221, 34,184, 42, 63,188, 7,127,121,223,190,118,102,
+215,118,162,231,124,237,159,178,129, 61,247,152, 89,205,148,184, 79,175, 10, 94,210, 1,204, 23,233,124,209, 92,112,194,244, 60,
+ 26, 95,133, 84,165,212, 15,181,210,181, 68,186, 12, 29,201,245, 13, 81,117,212, 5,114,200,207, 17,129,170,230, 4,139,189,172,
+ 44,144,138, 82,102,250, 84, 98, 26, 7, 66, 72,104,213,215, 61,158, 90,222,192,174,233,100, 47,234, 20, 24, 75,112,150,201,143,
+ 12,211,128, 77,147,120,116,155,134, 93, 49,152,156, 9, 33,203, 46, 55, 9,199,122,157,124,148, 39, 2,198,151,118,234,229,210,
+189, 37,171, 15,163, 37, 75, 93,203, 49,173,183,240, 25,173, 95,164,177, 61,247, 56,243, 14,252, 31,147, 27,240,210,200,253,217,
+159,133,151,189,138,159,154, 4, 60, 41, 50,127,196,243,219,254,221,242,194, 68,202, 88, 81,180, 6,239,235,123,235,232,186, 6,
+148,136,217,230,104,209, 20, 34,187, 58,150,206, 57,243,253,251, 59,198,209, 75, 7, 87,196,154, 40,152, 81,185,126,134,105, 98,
+127, 56,224,167,137,174,107, 48,104, 30,238, 31,104,173,133,144,228,235,180, 8,115,114, 85,251,230, 92,152,198, 81,198,202, 90,
+232, 96,206, 89,116, 13,143,208, 37,147, 83,148,157,170,209,128,112,212,167,193,211,184, 70,214, 4, 53, 68, 38,214,220,117,225,
+214,155,133,227, 30,230,120, 80, 86, 43,217,252,103, 34, 54, 20,250,158,181, 70,242,173,141,162,239,207,164, 24, 37,168,168, 70,
+139, 30,111,110,240,227,192,255,207,218,155,245, 88,150,157,233,121,207,183,166,189,207, 16, 57,212,192,170, 34,217,236,185, 37,
+ 53,108,217, 87,210,157, 33,223,248,255, 10, 16, 4, 24,144,124, 97, 67,144,100,192,118, 11,205,238, 38,187, 73, 22,201,154,178,
+ 42, 43, 43, 51, 99, 56,103,239, 53,250,226, 91,123,159,115, 34, 35,179,170, 27, 34, 81,168,202, 41, 50,226,196, 62,107,125,195,
+251, 62,111,174, 77,207, 79, 99,217,141, 35,227,224,105, 45, 83,115,226,238,168,133, 65,176,142,216, 20, 33,155,146,126,205, 34,
+ 16,167,194,113,154,104,162,254,250, 82,155,162,119,173,229, 56,117,200,140, 83,161, 94, 78,133, 90,163,126,174, 86,249,244,231,
+192, 37, 67,215,230,116, 85,246,105, 80, 88, 47,163, 35,206,118,233,244,169,253,178, 90, 92,109,182, 75, 22,106,143,223, 77, 73,
+217, 5, 49,230, 30, 6,163,207,214,118,187, 99, 58, 30,153, 15, 71,172,181,108, 6, 77,114, 59, 30,142,171,112,116,154, 38, 74,
+171, 88,103, 41,173, 49, 4, 79,237,232, 95,245,208, 55, 76,133,178,144, 54, 91, 82,215, 64,107,148,220,150,116, 84,125,142,115,
+198, 59,189,216, 91, 23, 6,158,107,105,114, 81, 92,174,102, 88,180,181,144, 45,181,246,149, 75,211,179,122, 65,171,138,158,217,
+206,133,110,135, 83,125,137,233,235, 78,239, 92, 95, 79,218, 83,118,131,208, 1, 62,134,105,154, 21,183,220, 20, 96,145,155, 90,
+115, 75,171, 61,158,183, 50, 12,142,253,118,199,213,224,216, 59, 67,160,178,223, 12, 61,207, 65, 51, 8,106,203,236,158,190, 15,
+190, 98,130,101, 55, 14,108, 71,207,163, 39, 79,248,246,215,191, 6,147,121,255, 47,254,146,111,255,230,111,121,255, 95,252, 41,
+ 55, 63,255, 20,139,134,184,212,155,153, 87,207, 95,243,226,118,226, 88, 44,206, 5, 36,120, 68, 28, 38,120,142,181,119,212,147,
+ 96, 91,165,196,130, 51,129, 41, 38,112, 3, 55,113,102,172,130, 51,173,199, 18, 55,189,208,151,169,242,178,192, 17, 33,181, 70,
+ 2, 77,130,235, 80,160, 98, 44,121,217,174,116,176,143, 17,131,183,134,151,223,125,199,163, 16, 24, 55, 35,206,219,222,149,134,
+179,157,186,180,183, 10, 63, 30,186,156,127, 72, 1,176,140,150,190,143,184,246,174,238,173,222,163,213,138,105,103, 56,212,246,
+224,231,248,182,241,238,234,169,238,137,104, 39,197,244,201, 71,189,254,248, 98,180, 86, 79,221,214, 50,153, 53,172,162,183, 19,
+ 76,165, 41,172,160, 87,235,214,117, 21,186, 52, 90,143,211, 91, 62,143,156,213, 95,168, 85,217, 2,119,209, 52,174, 60, 31,153,
+172,215, 44, 95,163,213,126, 73, 51,180,138, 77,125,220, 94, 22, 69, 48, 56, 67,143,137, 61, 75, 74,235,187,206, 38,237,123, 95,
+127,185,231, 6,120,219,183, 88, 68, 35, 58, 87, 96, 14,178,126,127,238,173,241, 31,204, 50,127,107,119,253,131, 9,176,141,115,
+109,220,101,199,222,222,218,136,159,251,215, 31,186,180,229,109, 23,245, 59, 69,161,167,181, 85,123,151,137,179,106,199,158,179,
+142,224,141,133, 16, 60,198,193, 28, 39, 74, 49, 12, 33,232, 52, 7, 77,217,170, 61,195, 59,165, 76,206, 89, 49,152,131, 61,237,
+187, 91, 91, 59,251, 48, 14,236,247, 59,190,253,230, 57, 62,120, 36,235,115,235,189, 35,181, 74,108,149, 57, 39, 90, 21, 66,216,
+146,139,162,107, 83,141, 29,142,163, 74,228,165, 24,148,190, 63,175, 61,113, 14,192,123,183,250,145,107,107,228, 24,149,211, 94,
+ 10, 85, 26, 53,170,198,165, 94,168,205, 79,147, 48, 89,163, 78,117,207, 45, 6,124,119, 83,140,131,103, 51, 14,196, 41,145, 83,
+ 82, 54,124,255,181,101,175, 31,198,145,205,224, 25,188,211,213, 20, 22, 35, 22,164, 80,114, 35, 38,157, 58,148, 82,152,230, 68,
+ 46,112, 55,233,136, 91,140,101, 78, 73,149,213, 29,177,218, 74,165, 26,253,113,154, 38,196,154,213,233, 97,172, 91, 61,222,149,
+ 83,202,155,142,227,101,213, 2, 53,121,211, 73,163, 83,174,179,175, 89,122, 44,106, 47, 14, 26, 93,220,217,227, 65,143,211, 97,
+237,224,230, 57,174,221,250, 50, 97, 84, 54, 69, 89, 95, 11, 13, 95,209,232,214,156,149,240, 86, 74,195, 6, 79,174, 89, 69,105,
+ 41,227,188,235, 83, 58,200, 49,246,207, 87,131,124, 74, 65, 47,140,110, 33, 52,162, 60, 2,233, 78,134, 41, 38,172, 61,185,160,
+172, 57,179,224, 74,235,107, 21,157, 22,149,156,245,210,238, 34,198, 86, 27, 46,168,229, 76,147,254,212, 71,221, 90,237, 96, 41,
+ 57,203, 95,175,250,251,154,206,156, 23, 92,176, 49,134,148, 34,213,232, 69,151,107,111, 76,218,146,128,168, 5,196, 56, 4,182,
+227, 64,176,194,198,130, 47,137, 80, 65,178, 96, 90,192, 25,248,217, 39, 31, 49,221,188, 64,164,224, 6,193, 22,131,219, 58,118,
+ 87, 35,193, 90, 14, 95, 62, 35,108, 62,228, 71,255,250, 95,114,248,226, 51,118, 31,188,135, 9, 6,191, 55, 76,166, 81,110,143,
+ 28,142,145,103,223, 92,243,213,235, 3,183, 51,196, 2, 81, 50, 98, 42,182, 85,170, 53,164,168, 19,149,221,110,207,110,187,229,
+230,230,182, 23,110, 6,235,131,186, 23,154,144, 99,193, 58,213, 72, 44,162,203,214, 22, 52,184, 33,182,194,177, 23, 70,222,168,
+181, 53,150,202, 92, 84, 80, 87,251,235, 87, 75,130,154,121,245,221, 11,254,232,147,189,146, 6,141,129,230,168,243, 25, 38,246,
+135, 66, 96,238,131, 73,218, 61,250,218, 27,168,217, 31, 0,178,185, 56, 48,207, 14,196, 42,239,234,146, 56, 67, 32,242, 86,202,
+221, 15,230,223,200, 9,137,122, 34,211, 40, 89,203,156,109,219,181,140, 86, 43, 77,235,254,244,101, 55,101,209,111,134,119, 90,
+209,121,175, 15,120,138,179,118, 34,157, 41, 93, 75, 65,140,122,153,131,119,120,231,181, 41,110, 25, 67,195,178,164,184, 85,173,
+126,107, 5, 84,233,155, 74, 81,124, 38,234,105,174, 20,173, 90,171,118, 94,173, 84, 16,223, 9,110, 6, 19,204, 69,206,248,219,
+ 96,254,114, 15,167,183,238,226, 47,110,250, 19, 11,192,180, 69,177,219,163, 2,215, 11,241, 28, 91,219,222, 16,183,253, 83, 59,
+117,145, 55, 59,240, 5,255,122,201,136,145,119,142,214,219, 3, 95,239, 67,107,161,239, 19,135, 74,231, 88,191, 91, 36,175,207,
+143,117, 11, 26,182, 48,134,128, 15,142, 84, 98,183, 16,121,157,254, 84, 29, 37,111, 54, 86, 15,102,231, 58,201,207, 50,142,158,
+224,195,154, 80, 54, 71,141,105,173, 52,188,245,188,186,190,166, 9,164, 90, 52, 87,189,154,149,127, 47,214,226,197,146, 83,101,
+158, 38,156,119,170,100, 94,132,165,165,232,231,104,124,255, 53, 85, 25,235,136, 24,194,232,217,237,118,188,126,125,163,222,234,
+222, 49,148,154,251,170,167,173,148, 58,122,103,119,126,153,159, 63, 7, 58,182, 85,197, 74, 74, 17, 99,233, 76,115,215, 67,110,
+ 2, 99, 48, 12,219, 29,223,188,122,221,109,172, 10, 79,178, 34, 12, 33, 16,211, 4, 69, 83,185, 82,170,164, 92,180, 91,173,149,
+134, 37,197,130, 56,143,193,145, 19, 88,103,176,226, 41, 77,216,108,183,228, 90,153,227, 76, 42, 17, 63,248,174, 32,175, 61,214,
+ 91, 47, 14,237, 80,245, 89,177, 86, 45,109,173, 46,233, 99,122,249,183, 94,201, 63, 68,162, 60,105, 85,116, 92,220,218,242,252,
+ 26,134, 97,160,212, 76,173,185,143,234,181,176,223,237,118,220,222, 30,214,226, 25, 78, 5,210,102, 19, 58, 95, 95,139,196,152,
+ 35,214, 90, 21, 75,206, 26,139,235, 67,231, 90,244,177,116,142, 71, 21, 24, 90, 75, 79,251,165,164, 74,179, 70, 47, 13, 55,156,
+248,240,232,153,101,172, 70,148, 26, 49,228, 14, 65,178, 34,212,154,213,174, 25,156, 38,193,233,252,185, 19,221, 52, 12,165,164,
+168, 54,193,166,171, 36,231,140, 66,105, 68,144,142, 17,182, 86,109,115, 53,165, 85, 9, 84,123, 67,228,122, 94, 64, 45,133, 68,
+237,192, 28,167,103, 93,167,231,121,103, 25, 54, 65, 39, 90, 22, 6, 35,132,150,217,136, 96, 91,193,101, 52,229,175, 68, 66,181,
+236,131,229,233,135,239,211,218, 12,174, 48, 62,222, 96,131,225,201,135,143, 56, 94, 31,216,252,236, 35,126,244,175,255, 37,183,
+223,189, 32,123,207,163,199,143,185,125,254,156,221,143, 63, 70,156,225,155,231, 47,184,187,153,249,250,250,142, 47,110, 15,220,
+ 52,141,164,101, 55, 16,134, 64, 44, 9, 83, 18,146, 19,173, 85, 94,223,190, 82,184, 1, 58,228,204, 49,169,101,213, 40, 89, 82,
+125,194,170, 83,210,132,205,178,222, 97,138, 99, 54,204,165, 82, 69, 72,221,185,149, 27,164,210,104, 29, 53,141,129, 31,253,232,
+131,142, 76,214,194,222,249,110, 28, 44,134,103,191,255, 22,167, 21,195,217,200,100, 57,132,151,159, 59, 31,117, 55, 89,149,224,
+ 75, 42,151, 60,184,111,228,141, 93,246, 63,234, 98, 63, 79, 34,107,231, 36,180,122,233,131, 91, 47, 63,222,248,187,223,246,247,
+ 20,234, 41,197,237,141,207,105,249,122,212,211,187,136,231, 26, 26,105, 40,103,145,167,205, 44,185,235,221,135,137, 48, 88,203,
+198,123,198,193,147, 91,101,158,143, 28,167, 89, 35, 26,139, 42, 66,173, 49,108,134, 13,155,237,142,113,220, 49,132,160, 86,154,
+146,145,146, 48,181, 96, 23,209, 94, 7,187,148, 90,152,147,138, 66,230, 90, 41, 82, 41, 13, 74, 19,172,243, 24,235,200, 41,246,
+194,161, 34, 81,244,224, 49, 5, 91, 5, 59,168,144,175,180,170, 19,134,174,192, 95,161,183,114, 1, 36, 56, 19,238, 55,205,102,
+175, 13,204, 18, 18, 81,250, 67,105,168,125,188,111,164, 93, 82,237,228,161,239,249,233, 98, 94,202, 55,189,148,101,221, 67, 66,
+187,215, 85,179,250,222,233,129,162,242,208,133,125, 95,157,222,228, 1,146, 76,189,216,149,223, 95, 30,189,113,177,191, 33,142,
+188,252,175, 38,111,186, 12,206,182,239,171,114,117, 21,161, 90, 81, 43,146, 87, 90,220, 24, 6, 74,243,196,216, 83,215,150, 30,
+176,169, 61,171,228,196, 56, 14,216,172,207,140,247,161,251,222, 61,211, 60,147,211, 12,198,112,156,103,142,243,196,214,121,172,
+ 46, 70,241,214,145,110, 39,164,130, 56,171,113,174, 52,252,232,245,251, 83,192, 25,141, 19,213,253,167, 34,133, 77,183, 60,145,
+ 42, 67,131, 97, 12,188,247,163,167,216,209, 50,205, 55, 28,103,104, 29,214, 37, 98,206, 22, 29, 13,235, 13, 53, 42, 8,102,161,
+128,213, 90,123,200,166,118,169,206,106, 7,153,122,102,123,138,133,217, 22, 68, 60,214, 5, 85,106, 87,184,190,185,165,166, 72,
+ 8,150,150, 35,185, 53,170, 8,243,156,116,146, 17, 51,113, 78,204,169, 49,199,168,217,219,198, 81,138,250,201,155,148,245,251,
+ 35, 86,104, 89,185,224,199,195,129,113,179,193, 25, 75, 69,125,234,214, 40, 98,119,138,113,141,245,213,132,189,210,149,225,101,
+213,207,128,190,239,107, 43,235,247,181,118,246, 64, 93,159, 91,115, 66, 26,117, 11,171, 22, 55, 61,100, 70, 42,185,230, 53, 67,
+188,244, 34,125,154,110, 88,114, 1, 22,135, 67, 74,145,214,191, 54, 63, 56,114, 74,171,152, 81, 3,112,238, 58,138,214, 96,155,
+ 65,172, 80,115,239,230, 93,192, 45,161, 65, 69,161, 66,130, 48,110,134, 53,255, 92,133,187, 14, 35, 66, 78,185, 23,119,134, 86,
+122,247, 93, 27,133,130,179,157, 6, 88, 33,149, 46, 38, 68,213,239, 58, 13, 49, 56,134,142,174,214, 53, 74,156,115, 71,193,106,
+131, 17,172,165,148,172, 90,191,166,158,236, 34, 96,189, 35, 21, 21, 3,182,170,250,142, 82, 53,189,173, 74,211,247,141, 17, 70,
+ 31, 8,222, 51,120,131, 19,195, 96,244, 34, 55, 77,181, 86,206, 26,156,113, 4,231, 9,214,192, 60,177, 29, 71,220, 80, 24,124,
+164, 57,176,143,246,132,221, 35,222, 43, 71, 94,186,198,211,127,246, 71, 76,243,196,225,213,107, 62,248,243, 63,227,249,239, 63,
+229,189,167, 79,184,251,197,231,140,126,207, 47,126,245,140,111,190,187,227,235,151, 7,142, 71, 13, 80, 33, 88, 82,205,164, 73,
+ 19, 10,155,104,164, 43,198,173,176,161,249,112,196, 25,183,130,164, 84,225,159,113, 98,250,253,217, 29, 23, 61, 27, 94,204, 50,
+233,213, 51, 85, 35, 89,187,165,181, 83, 82,109,169, 20, 17,146,129, 79,254,224, 39,252,246,215,191,194, 53, 29,213,235,250,207,
+129,108,249,244,231,255,128, 83, 63,115,125, 99,188,190,142,163,219,219,135,139,242, 61,163,247,119, 9,231,126, 40,122,246, 33,
+160,204, 67,106,232,119,141,223,239,143, 96,223,102,229, 90,238, 52,211,204, 89,231,121, 70, 98,235, 59,118, 49, 74,192,162,123,
+228,173,177, 4,107,216, 14, 58,246,153,231, 35,135, 52,113, 60,196,158,141,237, 24,194,192,126,187, 99, 55,140, 92,109,183,140,
+227, 6,235,134, 62,230, 40,212, 20,169,181,173,157, 60,173,208,233, 16, 26,149,105, 12,197, 10, 41, 47,140,117,165, 29,209,211,
+172,140,117, 24,167, 7, 68,201, 69,189,208,162,192,130, 92, 11, 46, 56, 21,245,181, 14,135, 49, 58,198,212, 58,109, 25, 21,158,
+232,112,235,172, 98,137,152,236,224,144, 85,128,216,116, 50,113, 10,151,233,105,110, 92, 70,217,222, 79, 87, 89,186,175,245,207,
+ 93,252,150,251,118, 32,121,243,110,126, 0, 11,251,230,115,210, 30,152,197,156,121,210,219, 9,121,251,131,158,187,183,205, 52,
+228,173,115,159,206, 46,232,194,185, 5,158,225,180,152,210, 75,218, 17,239, 14,196, 57,146, 98,194,121,181, 92,169, 98, 93, 95,
+207,171,171, 43,238, 14, 7,253,179,125,108, 27, 99, 84,242,212, 2,171, 17,195,163,171,199,140, 70, 11,195,148, 34,187,253, 21,
+ 83, 21,110,174,111, 41, 89, 21,182,202, 86, 55,196,213, 7,141, 94,118, 70, 89,219,214,233,161, 91,115, 97, 48,194,198, 7,130,
+179,152,154,241,214,242,248,241,142,155,219, 9,234,146,192,169, 5,128,181,167,228, 63,231, 23,164, 39,125,140,110, 78, 23,200,
+ 66, 9, 52, 66,206, 42, 98, 27,134,129,199,143, 31, 99,140,225,238,238,150,155,219, 91, 82,204,218, 57, 6,191,146,206,106, 47,
+233, 14,135, 25, 83, 27,241, 48,235,184, 90, 58,181,207,185, 94,104, 42, 62, 52, 47,162, 53, 52,152,198, 57,219,137, 94, 74, 91,
+203,165,224, 71, 79, 42,234,149, 15,189,163, 29,135, 13,133,198,225,120,236, 97, 49,181, 3,115,219,218,165, 91,107,145, 37, 5,
+237,172,176, 89, 92, 64, 70,236,122,118, 46,161, 28,230,140,133, 94, 74, 23,195,181,174,140,174,234, 36, 89,108,127, 75,104,203,
+ 52, 77, 93, 67,161,123,115,205, 12,112, 43, 95, 94,187,230, 29, 55, 55,183, 43, 96,170,244, 11,221, 24,189,224,148, 7,160,221,
+162,174,165,117,162,162, 25, 22,141, 84,244,235,243,214,209,164,145, 82,102,191,221, 18,227,172,251, 95,192,121,191, 58, 93,156,
+ 83,182,187,235, 40, 96, 37,236, 25,156, 49,148,190,163, 87,130,155,218,180, 92,215, 88,184,190, 15,175,247, 28, 77,181, 86,108,
+ 81,159, 61, 73,117, 28,182, 53,188, 31,212,175, 29, 44,222,153, 14, 3,171, 12,214,226,164,170,253,203, 6,181, 21,118,112, 81,
+109,130,119, 14,111, 13,155,224,105, 37,113,123, 56,176, 51,142,159,253,241, 39,180,141,101,248,201,143,176,227, 35,134,249,192,
+123, 41,227,114,229,229,103,159,243,254,159,253, 49,204,145,157,243,152, 87,183,140,135,204,179,111,174,249,221, 55, 55,220,205,
+194,161,168, 29,181, 89,143, 25,148, 47,143, 64, 73, 25, 51, 14, 24,227, 53,123, 96,154, 86,191, 77,234,232, 92, 99, 44, 82,187,
+252,186,235, 73, 26,166,167,206, 73,135, 81,169,224,240,212, 96,235, 61,163, 54,237,218,125,109, 58, 25,217,140, 3,127,249,103,
+127,206, 95,255,199,255,200,199, 64, 8, 14, 27, 60,205, 91,104,133,195, 87, 95,222, 75,105, 59, 83,244,174, 81,149,111,153,205,
+203, 89, 12,227,249, 33,250,125,118,164,127,202,255, 30, 2,145, 60,228,109,190, 63, 29,248, 62,241,214, 59,126,227,217, 13, 34,
+171,117,105,189, 0,170, 42,172,157, 8, 78, 26,206, 20,130, 55,164, 60,113, 59, 31, 59, 69,171, 34, 98,216,110,118, 42,228,216,
+238,217,141, 27,130,115,140, 62, 80,209,234, 88,153,212,141, 56,207, 76,199, 59,226,116,160,214,220, 5,119,170,190, 53, 70,247,
+119,185, 22, 90,110, 43,173, 74, 90,211,253, 74, 23, 82, 57, 52, 87,121,177, 37,150,238, 65, 77,210, 24, 69,247,151,118,129,240,
+ 45,236,120, 49,125, 15,184, 44,228,213,250, 82, 22,126,251, 26,221, 40,103,195,247,123,112, 23,228,108,202, 33,107,175,122,234,
+100,219, 3, 89,238,237,158, 21,168,173, 2,156,115, 95,252,229,253,217,222,196, 13, 63,248,188,180,119,236,147,100, 45, 78,254,
+113,151,249,247, 60, 79,103, 9,114,210, 78,217,214,231,202,121,105,167,215,231,120, 60,118, 47,117,233,204,130, 19, 95,187,181,
+ 74,232, 40, 79,239,221,170, 72,182,214,210,234,164,209,166, 57, 51,134, 1,235,189,190,255, 98,194,134,192,147,247,158, 32,185,
+112,245,222, 35, 74,205, 76, 57, 43,125, 77,132,146, 83, 79,206, 90,114,175,165,147,199,212,126,105, 74,195,117, 8,213,124,156,
+240,118,195,241, 56, 19,182, 35, 87,219, 61, 33,188,102,238, 59,241,218,237, 53, 86, 84,200,100, 68,112, 65, 24, 54,158, 15,127,
+244, 17, 47, 94,124,199,235, 87,175,117, 42,212,167,128,203,138, 97, 24, 6,198,113,195,213,213, 21,222,123,174,111,110,136, 41,
+129,209,252,235,148, 75, 87,195, 71,182,206,232,232,187, 8,121,202,204,135,163,186, 43,108, 80,145, 23, 39, 34, 31,168, 8, 78,
+196, 32, 85, 95,233,121,142,248, 16, 24, 55, 27, 90,131,227,113, 34, 4,175,115, 31, 35,152,102,201, 41, 51,132,192, 52,207,132,
+113,196,117,189,192,210, 57, 25,163,153,222,244,172,120, 99,141,162, 98,123,116,176, 65,131, 74,106, 83, 59, 99,206, 89,215, 35,
+ 85,241,191,138,123,214,142,223,244,247, 84, 24, 71, 98,236, 28,249,123,231,210, 18,252, 98, 59, 47,192,117,146,228,221,221, 93,
+167, 56, 10, 47, 95,190, 84,161,161, 83, 37,125, 41,218,225,135, 16, 16, 3,165,196, 53, 40, 39,151,132,239,214,195, 82,203,250,
+ 44, 45,239, 40, 99, 13, 20, 97, 24,135,174,158,215,184,211, 37, 6,122, 41,194,115,202,122,137, 24,213,214, 44,137,127, 98, 12,
+ 37,118, 40,209,116, 84, 71,133, 49,125, 39, 94,169,198, 80,227,172, 84,180, 14,250, 89,195,165, 68, 8,131, 39, 56,207,102, 28,
+117,173, 96, 45, 70,105, 3,218, 52,137,129,106,176,173, 66, 74,104,253, 58, 43, 9,207, 26, 6,107,241, 29,122, 99,164, 50, 6,
+ 11,110,224,238,112,205,143,255,228,159, 97,158, 62,194,254,248, 9,238,199,159,128,217,225,226, 68,121,241, 29, 55,127,247, 43,
+158,252,229,207,144, 82,152, 62,251,138,253,184, 39,127,241, 53,183, 95,189,230,110,106, 60,187,155, 41,197,112, 59, 39,138,177,
+164, 86,144, 12,214,219, 14,100, 50,228,152, 9,195,134,216, 42,136, 37,166,121,229,151, 72, 7, 43,169,254,164,246, 53,238,137,
+145,177,130, 80,251,138, 85,141,207,221,237,181, 20,133,125,170,152, 59, 33,240, 95,253,143,255, 19,207,126,245, 27,236, 60, 49,
+238, 44,195,110, 64,130, 3,235,120,254,229, 51,230,111, 95,156, 93,234, 15, 53, 36,157, 30,246, 80,215,116,121, 65,190,153, 45,
+254,238,136,203,127,250,229,126,255,239,184, 63, 17,248,190,139,251,251,246,252,230,109, 29,126, 23,147,152,238, 5,245,198, 50,
+120,139,247,234,116,159,230, 35,199,227,113, 69,192,110,198, 13,143,175, 30,243,120,127,197, 54,108,240,189, 61,202,113,230,102,
+ 58, 82, 16, 82,209,192,131, 41,206, 28, 14,183,212,154,201, 57, 98, 68,171,220,209, 7,156,104, 55, 45, 70, 83,140, 68, 26,174,
+ 53,189,140,187,247,183,168, 25,146,234,108, 79,112,202, 93,140,151,213,199, 94,161,206,137, 92,213,242,230,156, 30, 82, 77,212,
+166,118, 46,223,149, 51,202,158,172,137,121,230,108,132, 94, 47,174,217, 21,229,122, 1,150, 63, 93,170,114,206, 33, 48,231,169,
+ 58,247, 25, 5,178, 42, 66,223,128,222,252,163,158,145,118, 26,181,191, 57,172,231,191,239,255,206, 87, 14,103,163,214,158, 40,
+103, 67,232, 29,146,156, 44, 79,221,219, 61, 77,115, 23,161,133,254, 76,170, 64, 44,132,129,227,241,176, 10,225,134, 16,122,151,
+ 14,119,183,119,136, 24, 82, 74, 58,233, 49,174,163,131, 43, 12, 70,211,222, 40, 92, 61,222, 99, 83,101, 48,134, 47,191,252,146,
+218, 45,161, 21,112,219, 45,211, 52, 35, 6, 92,167,131,233,161,146, 9,126, 64, 28,180,162, 23,234,221,225, 72,160, 82,234, 43,
+174, 62,120,202,251,239, 63,229,235,103,223, 17, 99,233,248, 93,179,118,176,181, 65,174,133,199,143,118,252,155,255,245,127,225,
+231,127,253, 55,252,213, 95,253, 55, 37,204, 33, 56,175, 0,153,134,176,219,237,200,165,112,125,125,173, 92,250,121,166,161,216,
+208,148, 35,222, 47,153,231,234, 74, 73,177,112,157,110,105, 41, 19,220,128,115,150, 57, 70,221,185,146,181,120, 21, 13,101,201,
+165,116, 81,152, 16,134, 64, 41,147,122,129,123,158,123, 19,200,237,244,204, 27, 49,228,146,137,243,140, 21, 97,186, 59,104,145,
+ 99,100, 5,214, 24, 99,244,239,243,189, 83, 94, 10, 34,236,218, 76,180, 90, 58,155,220,144,179,186, 12, 88,114, 15, 90, 61,197,
+ 62,208,214,191, 55,116, 62,127, 74,186, 54,139, 81, 59,235, 97, 24, 86, 47,123, 8,129, 97, 8,220,220,220,244, 75, 84, 59,188,
+113, 28,152,230,137,199, 87, 87,157,217,159,152,227,188, 90,206, 82,140,125, 47,109,240,214,118, 31,187,130,128,166, 60, 17,188,
+190, 22,206, 24,156,117,204,117, 34,230,204,102, 28,117, 77,178,216, 49, 57,101,109, 24, 99,212, 66, 25, 84,168, 39, 69, 5,146,
+ 19, 16,134,113, 37, 18,182, 6,228, 66,236,118, 91,215,180,152, 48, 11,168,198,128, 15,129, 77,255,199, 91, 37,218,169, 20,180,
+ 98,234, 98, 75,213,164,193, 97, 24, 59, 78,169,233, 4,167, 21,117, 82,244,241, 53,232,133,110,141,198,243,110, 70,207,221,124,
+199,135, 31, 60,225,233,143,222, 35, 63, 30,241,159,124, 4,126, 4, 25, 96,191, 35,150,200, 78, 60, 55,191,249,156,250,187,207,
+145, 40,124,245,155,159,179,243, 91,254,246,239,126,203,139,219,196,203, 67,164,137, 71,124,128, 18, 89,182, 83, 70,132, 97, 28,
+105,192,205,221,145,231,215,223,130,168, 6,198,186,208,249, 3,244,198,170,116,228,176,215,103,204, 40,147,100,201,126, 55, 52,
+172, 81,193, 35,166,158,173, 3,151, 41, 41,189, 88, 52,252,225, 39,159, 96, 14, 7,190,248,135, 95,242,196, 22,246,251,145, 97,
+ 59, 16,182, 91,252,246, 9,191,254,207,255, 15,207,159, 61,215, 75,125,141, 28,111,114,209,172,182,251,233, 85,194, 15, 18,162,
+253,247,190,208,239,251,230,207,125,203,239,178,180,189, 77,244,244, 46, 32,138,116, 49,202,197,159,109,116,158,178,224,140, 97,
+244,202, 81,246,193, 81,146,250,136,227, 49, 34,205,225, 92, 96,191,219,243,222,227,199, 92,237,118,120,107,105,185, 50, 31,143,
+196,168,251,245,220, 10,169, 86,166, 92,152, 99, 36,119, 30,179,181, 6, 27, 28, 33,184,174,244, 53,189, 74,173,218, 77, 55,131,
+147,182,218,243,140,233, 44,248, 98,200, 93,124, 39, 70,171,231, 82,213,230, 70, 87,154,154, 86,186, 77, 35,105,160, 66,243, 72,
+247,252,170,218, 95,139,149, 42,231, 89,231,103, 23,214, 18,159,186, 8,176,214, 61,245, 61,245,119, 23, 96,157,103,143, 63, 60,
+ 18,127,211, 75, 46,152, 55,132,110,247,229,147,231, 88,218,135,139, 51, 89, 35, 82, 47,252, 28,237,237, 66,186,135, 68,152, 15,
+138,159, 46,168,134,245,226,243, 58,161,128,245,245,171,181, 82, 98,214,157,104, 63,172, 68,132,176,221,104,134,119, 79,222,243,
+ 65, 65, 50, 52, 85, 11,231, 53,165,173, 17,194,134, 6, 28, 14, 71,230,105, 38, 37,101,198,123,231,212,142,102, 28,173,100, 54,
+ 99,192, 7, 79,173,133,113,115,165,129, 40, 24,118,143,119,236,228,199,124,250,249,151,196, 6,177,123,204,141,243,228,146,201,
+ 85,243,178,107,201,235,238,210, 89,139,120, 75,173,142,121, 62,146,143, 19, 83, 74, 36,129,221,227, 39, 60,122,148,121,249,234,
+102,197,206,234, 80,203,210,170,144,114,229,229,119, 55,252,219,127,251,239,214,110,108,179, 25, 9,206, 99,196, 18,227,140, 49,
+158,121,154, 87,120, 77,237, 73, 90, 57, 87,114, 58,170,141,195, 41,255,221, 25,163, 89,217, 57,145, 81,124,242,224, 7,110,143,
+ 7,140, 81,141,136,156,217, 65,157,243,186, 74,106,130,119,190, 23, 80,154, 40, 23,179,218,234,172,215,174,201,121,223,105,118,
+170, 72,223,110,119, 28,142, 7, 54,195,176, 94,226,186,231,173,136, 53, 58, 45, 43, 26,127, 91,187,112,111,177,181,154,174,142,
+119,206,247, 80, 22,229,153,167,152,112, 98, 21,186, 34,144, 75,198, 7,207, 28,147, 2,134,250, 25,102,173,233,163,246,182, 42,
+220,151,172,129,187,187, 91, 98,156, 72, 57,179,221,110,245,178, 15,150, 82,115, 79,199,203, 28, 15,199,213,134, 26,156,195,162,
+137,111,135,227, 1,138,234,111, 90,207, 52,111,165,226,141,226, 99,135,190,111,175, 89,167, 9, 62, 56,189,228,251,148, 33,166,
+164,171,189,222,220, 45,158,236, 84,106,143, 22,214,157,125,234,136, 97, 99,132, 92,162,114,222,251,247,196,216,158, 93, 96, 68,
+ 69,162,206, 48, 4,215,173,136,202,136,175, 57,169, 5,216,138,158, 71,165,210,150, 21,227, 34,188,236,148,186, 92, 50,222,118,
+139,109,127,198, 74,202,212,158,144,168, 69,140, 99,187,223,243,241, 79, 63, 34,132, 74,221,239,177,219,247,105,198, 33,173, 82,
+167, 3, 30,197, 32,231,175, 95,147, 48, 28,239,224,179,223, 93,243,205,243,223,242,249,171, 27,158,191,142,220, 30, 10,195,118,
+160,166,138, 56,135, 51,130,247, 22,191, 9, 76,211,204,225, 56, 67,135, 72,165,164, 34,230, 5, 19,190,196,210,150, 82,176, 85,
+187,116,235, 60,173, 40, 35, 98, 9, 85, 98, 65,180,155, 78, 9,172,218,176,201,197, 26,187,177, 49, 66,185,185,230,139, 23,207,
+217,147,216, 14,150,237,222,241,232,233, 35, 54,219, 71,124,253,197, 11,254,223,191,250,123, 14, 73,250,165, 78,123, 99, 67,190,
+ 94,146,103,167,220,170,212, 59,247,138, 47, 65, 32, 15,208,190, 30,182, 30,189,157, 42,246, 46, 84,232,187, 46,236,119,121,212,
+223, 86,124,156, 3, 22,228, 94, 22,251, 42, 37, 88,187,244,162,185,188,214, 48, 6,199,118,240,108, 67, 96, 74, 73,125,164,115,
+194,138,103, 51,108,216,239,174,184,218, 63,226,209,118,164,149,194,221,221, 13,105,142,196, 56, 19, 80,118, 68,226, 0, 0, 32,
+ 0, 73, 68, 65, 84, 75, 38, 23,237, 44, 20,193,169,246,183, 77,112,120, 55,168,186,211,187,158,141,222, 86,200,205,185,144,237,
+ 20, 41,171,228, 48,103,116, 87,222,138,142,201, 92, 15, 47, 17,175,248,217, 86, 11,148,204,224, 3,193, 91,229,140,231, 72,170,
+145,154, 10, 78, 6,130, 9, 93, 88,212,163, 44,215,212, 53,115,162,203,153,149,183,170,234,233,174,204,215,120,195, 94,252,173,
+236,247,243,189,124,187, 84,212,115,122, 92, 46, 85,233, 29, 55,202,217,154,101, 29,234,247,162,195, 60,164,221,184,188,244,197,
+156,196,156, 23,185,127,114, 38,192,123,147, 81,248,160,125,239,254, 37,127, 49, 21, 66, 71,170,231, 90,185,229, 32, 59, 1,138,
+234, 25, 86,151,213,214, 37,152, 30, 34,195, 26,223,169, 54, 69,237, 98,156, 15, 4,163, 57, 5,223,189,120,181, 50,225, 67, 8,
+253, 98, 87, 48,144,237, 43,149,237,102,208, 24,213,210,253,112,125,191, 88,142, 71,254,232,147,143,105,243,204, 87,223,189,228,
+ 38,102,166, 76, 31,133,235,101, 74,171, 12,195,128,152,158,181,213, 45,111,214, 59,108,211,142,172, 53,184,125,125, 75, 76, 21,
+ 31, 54,108,198, 13,183,135, 99, 23, 58,118,107, 99,210,117, 83, 77,141,219, 87,183, 56,111,248,224,189,247,113,198,242,234,213,
+ 43,230,249,168, 86,185,126,200, 47,182, 60, 69,184,234,193,108,172,238, 81,115,204,248,126, 57,197,105, 34, 56,139, 67, 86,241,
+214, 16, 6,140, 53,196,121, 98, 51, 14, 76, 81, 57,246, 41,198,149,249, 48, 14, 10,146,177,198,144,147,170,176,231, 56, 97,189,
+ 87,191,181,219,146, 75, 37,197,212,199,201,149,193,171,154, 60,117, 24,136,218,194, 4,219, 32, 88, 5,235,120,171,239,183, 20,
+ 35, 88,139,233, 35,232,187,195,157, 34, 88,151,181,149, 17,154, 85,251,236, 24, 2, 83,156,180, 16, 40,122, 65,217,254,121,250,
+165,235,237,239,191, 97, 24,214,160, 36,211,233,147,126,112,248,234, 24,198, 64, 74,115,183,186,169, 37, 45, 37,253,126, 57, 99,
+ 85,184, 85, 27,243, 60,209,156,142,173, 93,103, 11, 96,109,223,132, 41, 75,163,230, 76,233, 83,179, 57,206, 24,171, 52,209, 92,
+219,154,170,232,157, 70, 4, 59,107, 80,196,134, 96,131, 10,235, 90,183,194,149, 24,123, 56, 75,208,103, 39,232,247,212, 32,248,
+174,215, 8,110, 96,236, 65, 49, 99,112,138,123, 53,154, 29, 47, 43,184, 76, 71,208,185,159, 3,210,187,245,101, 98,208, 80, 63,
+ 56, 61,228,132, 69,223,208,161, 55, 53,103,106, 11,180,190, 90,216,239,175, 40, 30,252, 7,123,204,135, 31,211,100,160,181,140,
+ 76,215,212,151, 47,113,227,150,235,215, 55, 56,183,225,248,122,226,197,243, 35, 95, 62,159,248,230, 85,226,213, 12,207, 15, 19,
+ 25, 65, 43, 59,253,199, 57, 65,134,142,210, 21, 52,149,237,152,176, 38,224,188,234, 10,114,201, 29,236,163, 4,201,101,106, 88,
+186, 31,223,152, 37,236, 71,117, 2,182, 55, 76,182,234,200,221,219,158, 34,105, 78,235,109, 35,194,216, 42,110, 58,176,177,176,
+113,194,110,239,217, 61,218,226,198, 17,241, 59,254,175,255,227, 63,243,217,183, 25, 92,192,233, 94, 94,119, 94,156, 71,170,222,
+155,195,171, 42,179,157,237,152, 23,255,229,101, 26,181, 57, 47, 0,206,196,105,230,236, 2,125,168,203,126,232,242,126,219,238,
+252,161, 95, 59, 31,191,127,223,184,254,161,143,119, 94, 24,156,191,240,250,101, 86,130,181,108,188,229,106, 24,216, 14, 30, 99,
+132,155,155, 73, 1, 50,214,179, 25,183, 92,109,175, 84,113, 41, 48, 29, 38,230,249,192,156,102, 82,214,177, 90,105,101,221,159,
+121,107, 48,152,206,241, 30,212, 11, 12, 72, 45,180,162,182,159,218,131,104, 22, 10, 84, 93, 45, 40,178, 18,238,140, 41,235, 3,
+ 34, 93,189,186, 48,165,155, 21,245,223,118,133,190,105,141,193, 57, 6, 39,204,197,144, 74, 70, 98,196, 54,168, 98,176,185, 81,
+ 49, 61,131,125,193, 69, 46,194, 58,211,109, 24,181, 95,174,167,228,186, 78, 13,185, 4,234,223, 7,178, 44,133, 73, 51,103,211,
+ 22,185, 71,243, 59,187, 0, 91,123,131,234,118,238, 15,111,247,162,111,215,144,160,122,138, 91,149, 53, 58,150, 83,228,237, 25,
+ 3,254,126, 91,126,177, 42, 88,215, 18,178,126,153,151,182,192,118,150,208, 38, 23,194,251, 53,194,215,200,197,248, 18,148, 10,
+181,204, 16,140,177, 23,110, 19,245, 36, 59,188,247,108, 54, 3, 95,126,249,165, 78,135, 22,193,212,172,124,108, 45, 41, 12,193,
+ 5, 92,183, 24, 57, 31,244,245,170,149, 74, 37, 74, 98, 28, 3,135,195, 13,127,250,227,143,145, 20,121,118,125, 75, 48,142, 50,
+ 37, 92,240,202, 58,232, 25,219,173,139, 62,189, 15,164,156,104, 98, 17,107, 24,253,134, 52,205, 24, 26,121,154,200,115,193,137,
+101,235, 29, 49,197,117,149,226,197, 98,157,103,179,221,168,158,212,194,213,110,199,179,103, 95,173, 12,114,141,250,204, 26,176,
+210, 69, 86, 10, 58, 41,140, 97, 80, 44,107,206, 61,156, 68,168, 49,225, 4, 28, 13, 39, 2, 37,227,125,192,136,213, 51, 36, 25,
+106, 74, 12,214,174, 57, 8, 85, 52,115, 30,151, 84,180,229, 7,140, 21, 98, 42,157,169,174, 15,219, 60,205, 10, 76,105, 13,111,
+245, 57, 9, 33,172, 23,156, 89,158,161, 14,131,176, 13,230,146,113, 75,212,112, 83, 11,159, 23,207, 20,103,182,195, 64, 41,133,
+ 16,188,210,250, 98,210,247,177, 88,230,121, 34, 39,197,164,230, 78, 0,116,198,145,139, 98, 85,165, 95,206, 11,237,114,121, 38,
+150, 21,204, 28, 35,219,237,150,121,154, 86, 27,155, 49,134, 56,167,149,230,104,141, 78, 59,172,181,132, 97, 32,199,164,236, 11,
+163, 25,242,166,139,233,188,247, 74, 4,220,140,212, 90,152,167, 25, 55,216, 78, 10,236,128,174,218,167, 40, 85, 21,239,154, 79,
+ 94, 48, 24,114,156,207,222,230,109,229,251,151,210, 86, 1,168,244,108,116,103,148, 5, 63, 56, 7, 45,247,181,165, 80,115, 63,
+171,122,208,209,226,197, 87,181,120, 91,167, 23,218, 56,104, 88,137, 69,186,134,161, 82,171,244,105, 64,235, 36, 59, 85,191, 67,
+165,180, 66,204,145,143, 54, 79, 9,251, 1,243,225, 19,216,238,145,102, 33,223,144,126,255, 91,234,171,215,184, 15,159, 18, 30,
+ 61,225,230, 55,191,103, 24,183,220, 92, 63, 39,150,162,201,133, 83,161, 96,152,172, 64, 82,139,167, 18,239,192,123, 67, 76,113,
+165,254,105,194, 92, 98,142, 89,145,204,198,116,145,220,105,101,177,188, 94,170,101,144,211, 68,175,159,113,174, 45, 78, 25,181,
+ 27, 42, 39, 65,135,179,170,193,104, 12,210,240,173, 48, 24,199,110,227,184,218,109,240,195, 64,216, 61,230,151,191,249,138,255,
+239,231,191,231, 54, 15,100, 41,184,122,143,191, 78,123, 64, 55,188, 36, 20,157, 95,249,139, 95,123,133,178,220,103,106,179, 90,
+228, 22, 49,197, 82,125, 62,212,101, 47, 23,236,249,175,203,247,120,142,223, 54, 74,255, 33, 30,251,119, 77, 9,212, 74, 97, 87,
+239,237,162,168,220,245,127,156, 17,142,199,169,191,169, 28, 97,220,176,221,108,241, 14, 90, 58, 82,128,212, 20,122,145,107, 33,
+150, 68,105,170, 94, 13,198,234, 88,170, 63,136,214,185,222,169, 65, 42,153,146,210,250,250,106, 17, 80,116, 79,184,196,189,222,
+159, 9, 75,198,114, 98, 7,215, 86, 25, 59, 13, 47,151,204,113,154,201, 49, 17,172, 16,156, 97,112,162,192, 15, 99,113, 93,200,
+211,114,197, 15,163,130, 77, 82,187,200,143, 95,123,237,123,202,243,197,114,199, 58,209,184,223,205,158,189,222,114,242,255,183,
+181, 30, 84, 1, 84, 79,226, 88, 77,241,235,199,190,199, 63, 56,191,118, 31,178, 44,190, 41,196, 59, 27,251,159, 41,237,245,196,
+144, 7,199,235,237,188, 43,151,115,107,231,249, 34,234,100,253,147, 7, 22, 9,114,110,201, 92,138,143,158,192,213, 58,166, 19,
+192, 56,131,149, 19,153, 13,212,102,102,173,163,230,194,205,205, 77,191,104, 52,188, 37,151,138,239, 93,148, 51, 74,135,163, 54,
+ 44,170, 66,110,237,196,184,111, 34, 28, 74, 66,172, 65,230,153,143,119, 3,127,242,209,123,212,150,120,118,136,236, 7, 71,182,
+142,233, 56, 97,164, 97,169,136,213,206,223,208, 72, 85,145,171,173,195, 83,156,241, 8,149, 82, 51,141, 12,166, 49, 90,195,198,
+141,221,188,161,211, 6, 63, 12,136, 85,168, 74,179,134,155,215,175,186,147, 67, 11,160, 33,140,228,154,215,105, 79,205, 10, 29,
+ 25, 66,160,100, 93, 59, 52,116,140, 77,107,120, 99, 9, 2,222,160, 23,180,177,212, 56, 97,124,160,230,196,102, 8,164, 24,251,
+193, 15, 27, 31,152, 83,210,238, 55,205, 24, 42,121,158,168, 98,240,222, 82, 98,195, 59,229,118, 91,171, 41,114,130,102,199,199,
+ 28, 73, 37, 81,106,233, 62,107, 71,156, 99,215, 29, 20,134, 48,208, 74,237,209,168, 21, 47,150,105,158,144, 82,240, 13,156, 88,
+ 18, 85, 59,174,218,112,214,145, 58, 21,172,246,160,156, 69, 77, 79,109, 84,209, 49,123,238,162,214,229,220, 91, 46,182, 82,202,
+234, 65,111,173,169, 45,182,234,100,111, 24, 6,117, 9,136, 96,140,250,213,167,121,166,181, 70,156, 83,127, 29,181, 80,136,157,
+111,111, 23, 0, 80, 74,218,221, 59,125,243,214, 86,251, 42, 69,207,156,148, 42,166,118, 73,172, 53, 56,175, 49,194,173,104,243,
+ 88, 82, 82,104, 17,130,179, 75, 88,143,254,123,240, 94,155, 10,107,123,246,122, 89, 69,162,166,235,130, 82, 73,171,181,183,182,
+ 74,109, 5,219, 41,137,181,235,150,164, 53, 77,186,148,178,138, 57,151, 73,178,179,210,195, 99, 58,236,171, 71,198,142,155,192,
+102, 59,176,217, 4,182,251,145,156, 39, 30, 61,121, 66, 27,182, 96, 3, 34,141,244,226,107,166,103, 95, 17,252, 64,125,180, 97,
+247,222,143,185,125,246, 45,243,139,175, 41,249,142,199,123,207,198,127,192,223,253,246,115, 74,174,148,230, 72, 2,206,169,215,
+127, 28, 3,219,113,196,198, 72,201,145,220,189,247,165, 67,214,106, 45,189, 96,211,247,103, 46, 73,225, 66,198,244,215, 95,139,
+ 36,211, 39, 78, 70, 12,210,164, 83,226, 84, 11,100, 27,167,175,141,138, 69, 93, 70,174,233,215, 25,188,103, 8,142,237,102,203,
+110,243,136,216, 2,255,254,255,252, 47,124, 55, 21,178,169, 20, 49, 39,161,156,172, 59,245,101,204,219, 78,142,226, 5, 36,191,
+ 28, 82,173,174, 7,224,114,238, 45,135, 74, 59, 15, 79,235, 75, 89,211,195, 98,238,119,206, 15, 41,144, 31, 2,129,188, 75,252,
+166, 73, 65,151,115,133,250,144,199,248,162, 19, 55,111, 87,234,247, 74,105, 17,108, 88, 35,108,156,103, 19,188, 90,214, 68, 72,
+115,226,238, 56,171,144,197, 15,157, 66,165,220,238,133,251, 62, 19, 40,210,200,173, 32,206, 48, 90,221, 45, 74, 93,104,112, 22,
+172,250,223, 99, 78,148, 86,201, 41, 51,167, 89,149,200,214, 96,219, 73,161, 94,155, 90,152,122,144,243,122, 1, 22,150,216,197,
+110,121,202,153,220,170, 70,127, 2,115,202,148, 6,227, 48, 98,173, 42,178, 91, 87, 6, 15,198, 97,105,196,156,176, 54, 43, 13,
+202, 52,102,116,255,218,250,156, 92,150, 84,182,190, 18, 88,211,243,106,237,152,195,118,239, 98,235,242, 57, 89,190, 23,173, 63,
+188, 39, 10,155,118,209,237, 44,104,189,174, 31,160, 33, 23, 44,129,115,238,251,247,173, 91, 46, 7, 76,125,120,223, 22,152,200,
+ 73, 93,127,218,185,159, 42,165,251, 22, 60,125, 75,212, 53, 42,242,162,150, 90, 43,154,203,101,252,249,207, 44,226, 32, 61,176,
+ 59,110,163,251,138,141,152,238, 19,215,103,204, 57,219, 15, 67,221,223,165, 57, 50,142,154,216,230,189, 35, 38, 85,109, 75,211,
+131,128,146,251, 33,216, 39, 15, 58,146,161,212, 70,179,173, 3, 44, 26,222, 91,142,211,129,167,187, 13, 79,183, 59,174,115,227,
+250,246,208,133, 73,181,115,212,181, 11, 42,173, 17,198,141,218,158, 58, 85,204, 26,203,213,227, 71,220, 92,191,194,160,228, 53,
+ 93, 91,203, 58, 33, 52,222, 19,167,153,146, 42,233, 24,123,218,154,231,238,230,154, 86, 42,166, 9,193,122, 54,187, 61,215,183,
+215,228,190,195,205,165,244, 0, 18,117,123,228,121,238,113,161, 5,169, 48, 24,139,167, 96,170, 70, 18, 15,206,246, 20,179,220,
+167, 78,134, 26,245,185, 52, 93, 41,101,204,192,225,112,192, 58, 7, 22,182,251, 61,215, 61,123,222, 25,163, 99,254,254,252, 45,
+234,114,181,139,233,250, 98, 28, 71, 82, 74,171, 59, 4,105,228,164, 23,163,179,138,252,181,214,146,230,132, 55,150, 60, 71,213,
+ 33,148, 74,203,149,148,116, 2,176, 4, 49,231,101,185,105,165, 23,112,170,214, 23,235,250, 37,101, 73,157,249,207, 34,186,235,
+140,136,148,103, 21,199, 25,213, 85,212, 90,217,142, 35, 37,183,190,250, 82, 42,219,178,218, 91,223, 15, 57,234, 37,210,244,125,
+167,239, 31, 13,100,209, 24, 84, 97, 58, 30,214,203,182,118,216,142, 24,233,106,237, 14,214,178,166, 79,211,164,139,209, 12,222,
+ 12, 4,175,120, 87,103,245,236,181,198,116, 44,118, 67,122, 12,172, 17,206,110, 16, 86,149,127, 46,122,174,228,114, 18,221,182,
+ 53,136, 74, 11,111, 47,203, 0,176,172,182, 65,181,225,105, 32,138,233,222,110,189,208, 13,227,224, 24,130, 39, 12,150,253,163,
+ 13,187,237,128,223, 25,220,224,251,218,192, 66,139, 28,191,251, 22,239, 2,245,131,247,185,169, 19,239,111, 60,175, 95,190,228,
+230,243,223,241,201,123,123, 98,118, 60,251,250,134,193,171,157,209,244,177,121,237, 42,116,231,117,186, 53,248,128,136,167,222,
+ 30,184, 61, 76, 90,188,157, 79, 96,141,130,155,242,178,162,172,149,210,237,149,139, 10,222,172,226,235,211,153, 84,155, 22,231,
+ 86,172, 6,187,116,113,160,105,116,235,169, 37, 4,203, 56,142,108, 54,143,168, 50,242,239,255,195,127,226,211,111, 94,146,100,
+ 67,173,122, 31, 56,221, 25,155,179,101,242,217,129,186, 30, 81,186, 67, 53,253,226, 64,186, 48,255,220,175,218, 63,209, 5, 74,
+129, 92, 10,149,222,150,148,246, 67,216,220, 43, 34,180,117, 79,245,153, 86, 93,250, 3, 33,167, 71, 71, 5, 10, 93, 20,212,238,
+117,113, 15,209,205, 46, 4,120,168,175,208, 84, 13,146, 24,156, 97,235, 13,163, 95,160,250,133,169, 20, 74,159, 58, 88,105, 88,
+ 83,168, 37,146,197,208,140,195, 72,135, 18,148,140,115, 70,185,217,162, 99, 39,221, 96, 56, 74,237,145,176,173,146,114,234,200,
+208,210, 61,168, 65, 15,147,170, 30,198,154, 51,181, 38,141, 20, 93,146,224,144, 62,190,237, 56,222,190, 14,113, 70,133,121,216,
+165,123,218,224, 0, 63,238, 9, 33,116, 96, 65,193,180,132, 33, 97,131, 65,230, 10, 49, 98,208,110,231,104,234, 34,243, 84,145,
+ 87,223,135,139,152,254,152, 44,118,181,254,140, 44,118,200, 21, 88, 36,212,118, 30,106,223,247,113,114, 62, 94,172,151,173,242,
+114,225,175,122,130,119,139, 26,223,154, 41,176,236,227,219, 89,205,128, 57, 11,116, 49,171,144,111, 29,207,183, 83, 22,253,165,
+ 16,111,209, 22,180,147,154,116,125, 54,213,149,127, 73, 53,236,207,144, 61, 61,157,102, 81,136,247,255, 47, 14, 6, 13,248,105,
+ 4,111,112,198,234, 37,159,146, 90,219, 68, 83,172,156,115,140,163,134,187, 56,111, 52, 60, 99,174,148, 92, 59,251,201,208,138,
+193, 24,223,189,176,141, 66, 70,170, 16,140, 83, 78,182,179,124,125,188, 69, 70,131,115,129,134, 97,240, 3, 37,169, 10, 31,167,
+184, 79,223,153,227,211, 28,241,222, 18,188,233,192, 28, 75,216, 8, 67, 25, 40,185,118, 47,110, 85,234, 97,211,139,106,202, 71,
+ 48, 22,135,233,157,136, 96, 22,201,125,179,132,160, 30,253,227,225,142,154,116, 44,109,173, 87, 53,243, 16,186, 14,162, 96,139,
+138,209, 44, 66, 16,141,147, 53,165,170,109,180,199,133, 90,111, 25,173,163,161, 95, 79,109, 26, 34, 34,222, 80,170,174,141,156,
+245,164, 57, 43, 49,110,142,122,249,214,162,171,137,214,216, 12, 35, 49, 39,156, 83,108,148,146, 30, 23,171,151,193, 58, 81, 98,
+158,115,228,220, 95, 39,180,216,159,142,135, 30,223,106, 9, 11,249,173,115,206,105,122,240,151,166, 49,201,213,104,161,209,250,
+168, 94,223,247, 74,144, 43, 89, 83,241, 20,189,171, 98,188, 90,171, 2,165,140,213,247, 94, 47,228,151, 66, 74,140, 85,186, 88,
+158,187,120,173,172,161, 82,193,235,217,108,122,148,172,235,180, 55, 75,207, 12, 40, 69, 47,112,235, 86, 93, 73,107, 11, 2, 88,
+ 11, 95,165,161, 73,159, 40,244,243,196, 10, 70, 60,224,122, 66,223, 9, 38,228,157, 50, 24,232,239,247,193, 5, 74,158,200, 53,
+245,241,185, 22,155, 57,118, 68,114, 23, 25, 54,178, 58, 8,172, 69,204,165,240, 89,181, 59,210,105,138, 94,177,190,206,174, 17,
+185,234,186,176, 74, 99,116,150,237, 16, 24,189,193, 7,203,110, 27,120,250,228,138,199,251, 45,110,231,160, 36,218,124,139,173,
+ 51,229,120,131,153, 18, 50, 60, 97,248,240, 15, 57, 60,255, 27,210,231,159, 81,175, 95,242, 23,255,252,207,200, 47,239,248,221,
+111,159, 83, 83,198, 88,199,118, 24,136, 83, 38,231, 70,118, 22,219, 12, 83,201,232, 96,158,142,219,173,132,102,244,194, 30, 61,
+ 37,102,108,169, 24,229, 60, 19,156,161,101, 93,225,232,215, 89, 46,148,237, 86, 26,210,146,246,226,226,122,100,180,244,224,167,
+190,206,148,222,144,228,202, 48, 90,118, 91,195,238,201,158, 54, 62,230, 63,252,151, 95,240,187,103,175,153,197, 82, 68,225, 65,
+ 77, 87, 87,250, 7, 91,189,167, 20, 22, 89, 23,132,122,248, 45,217, 91, 61,169,203,176,118, 99,173,213,183,120,188,121,103, 23,
+126,255,242,190,191,107,127, 67,220,118,207,222,180, 0, 79,222, 64,160,182,126,176,116, 97, 82,251,158, 49,189, 94, 50,102, 45,
+104,164, 63,244, 94,132,193, 7, 6,231,215,220,226,152,146,118,191, 37,227,236,160, 63,159, 51,198, 44, 80, 7, 93, 85,232,190,
+ 77, 48, 70,119,108,115, 41, 10,226,247, 67, 23, 81, 40,236,161, 81,149,160,100, 61,174,199, 86, 66, 31,183,229,220,131, 46, 10,
+214,178,218,107, 84,132,197,250,166, 81,165,232, 34,170, 80,123,210, 60,171, 80,198, 88,135,160, 99,222,230, 3, 98, 53,192,163,
+ 21,237,213,116,100,106,136,199, 3, 37,101, 48,170,128, 53, 61,154,113,225, 23, 40, 17,235,140, 33,214, 78,254, 85, 89, 65, 10,
+230,222,107, 44,111,136, 16, 31, 18, 82, 46, 63,174,235,130,167,173,170,251,239, 3, 24,125, 95, 78,251,131,207,160,112,145,174,
+133,188,219, 70,121,185,207,231,193,164, 54,145,246,134, 74,222,244,175,255, 34,204,166,246, 75,128,165,139,119, 39,181,124, 41,
+ 12,195,118,221,167, 46,171, 6,231, 29,210,160,196,194,102,179,225,230,213, 45,166, 42,232, 68,213,192,125, 4, 47, 11,175,161,
+123,143,105, 52, 3, 71,132,187,220, 85,220,181, 64,138, 72, 85, 43,164, 65,173,111, 78, 23,128,120,163,157,205, 48, 40,124, 68,
+188,103,187,191, 98,138, 25, 36,177, 49, 35, 6, 81, 5,123,133, 57, 39, 42, 16, 92, 87,133, 59,135,115,190,103,125, 27, 82, 85,
+225,208,116, 56,170,158,196, 41,253,108, 28, 6,196, 89,142,243, 68,156,102,188,211, 2,185, 81, 85, 49, 94,128,166,251, 76, 35,
+ 66, 48, 66, 43,133, 98, 13,185,101, 90, 51,108,195, 70,231, 84, 70,245, 41,135,227, 65,223,195,198,224,199,160, 69, 78, 23, 47,
+197,162,243, 99,103, 60,199,227,145,138, 48,184, 13, 41, 30,241,131,210,236, 98,140, 64, 99, 24,130, 6,188, 76,202,199,207, 69,
+145,174, 11,154,185,228, 76,179,141, 27,160, 90, 97,179,217,112,119, 60,178,123,250, 72,167,110,181, 50,205,147,198,240,246, 93,
+170, 17, 84,181,237,122, 60,239,168, 10,243,142,189, 83, 69,126,183, 64,130,244,120,218,172, 94,243,222, 57,174, 51, 48,171, 97,
+ 56,206, 40, 5,176,212,178, 10, 65, 77,239,154,107, 46,212,162,224, 23, 39,203,120,101, 25,239,215, 51, 39, 83, 91, 47,203,229,
+221,103,236,169,248,174, 57, 97,250,179,232,140,103,154,142, 56,103,250, 46,188, 94, 76,205,106,159,134,213, 82,187,163, 67, 71,
+235,234, 14, 72,157, 62, 9, 86, 78,133,179, 93,166, 91,253, 61,178,100,197,203, 66, 58,236,103,162,181,166,239,182,141, 78, 42,
+141,178, 88, 93, 8,140, 59,207,118,235,120,252,222, 21,251, 71, 59,118,143,118,236, 63,120, 76,138, 17,111,129,122,100,250,236,
+119,216,249,136,140, 91,204, 38, 16,194,200,231,255,233,255,230,189, 15, 31,179,223, 61,226,187,151,183,188,190,189,229, 48, 11,
+115,204,186, 94, 16, 75, 66, 85,237,227,232, 85, 28, 74, 83,218, 93,109,164,152,201,177,210,156,165,166,137, 32,130, 41,170, 79,
+243, 65,147,214,194, 96, 16,122,114,161, 49, 20, 17,114, 45,148, 10,217, 88, 74, 85,118,136,171,167,172,248,133,255, 0,165,219,
+128, 27,206, 13,248, 33, 16,182, 87,188,158, 50,127,243,235,255,198,215,223,222, 81,237,160,104,227,245,123, 42,157,149,248, 32,
+186,109, 81, 42,203,137, 30,215,150, 31, 43,106,178,153, 11,246,216, 91,169,109,247, 47,242,183,197,109, 62, 4,151,185,223,149,
+157,255,154, 57,199,146, 46, 36,158,229,243,232, 69,138,109,246,141,204,247,115, 65,242,125, 5, 54,107,232, 75,195, 91,199,198,
+233,155,167,181,166,232,215,172,123, 55,239, 45,173, 21,114,214, 29,145,250,133, 59,213,169,182,117, 82,145,208,195,196,248, 81,
+ 9,112,214,105,248, 74,174,136, 81, 37,232,118,227, 16,169,148, 18, 73, 73,149,242,181,100, 85,221,122,229, 6,235,234,185,116,
+193,226,217,215,221,195,103,150,162,172, 46,170,241, 12, 25, 48, 53, 48,140, 91,160,113,156,142, 36, 81,222,188,180, 12, 37, 51,
+122, 67,112,158, 97,187, 95,201, 85, 34,118, 29,185, 55, 89, 43,184, 55,112,186,102,141,103,237,241,178,247,216, 50,139,103,251,
+124, 60,125,159, 10,119,234,112,251,122,125,117, 92,188,221,249,240,206, 60,245,127,164,167,253,226,130, 62,139,240,123,120, 53,
+211,116,117, 33,114,118,129,183,245,243, 71, 22, 71,197,201,210, 89,115, 89, 51,200,215,137,199,218,236, 11, 74, 35,173, 61,168,
+161,189,225,204, 48,198, 80,114,233,221,161,244,106,190,187, 1,122,132,103,169, 25,135, 87,244,102,213, 46, 56,231,218,167, 40,
+130, 53,129,215,243,204, 31,127,242, 17,223,188,122, 65, 76,134,187, 89, 85,246,214,131,163, 32,166, 82,106, 35, 56,207, 28,103,
+106, 2, 27, 44,143,159, 62,162,138,168,202,188, 22, 76,112,189,163,159, 57,246, 48,148,113, 28,181, 72, 45,203,118, 72, 9, 89,
+105, 78, 43, 54,118,179,217,170, 66,189, 36,230, 28,149, 83,223, 76, 47,100, 6, 30, 95,237, 57,222, 92, 51,140,129, 54, 37,164,
+ 85,156, 24,140,212, 21,216,226,208,212,192,210,132,205,184,227,120,123, 84,239,189,243, 28,166, 59,140,115,154,120,230, 45,169,
+ 19, 16, 75, 85,229,183, 51,150, 57, 69,156, 23,156, 11,122,209,199,136,113,150,121, 78, 56,167,227,105,122,162,155,179,142, 38,
+ 16, 59, 1, 14, 99,116,172,238, 44,227,110,195,225,120, 36,209,192,121,174,211,204,230,106,203,235,195,173, 18,195, 90, 67,172,
+ 16,188,195,148,130, 31, 22, 43,215,160,116, 64,209, 9, 72,235, 33, 37,210,255, 59,198,116, 54,121, 50,212,110,253,202, 85,207,
+ 20, 17, 77, 46, 51,152, 62,230,214, 21, 2,125,210, 32,221,206, 69,105,180,146,217, 14, 3,173,100, 77,110, 67, 40, 57,107, 76,
+243,250, 12,246, 92, 9, 99, 52, 70, 85,206,198,200, 62,172, 12,248,147, 46,234,116,230, 0,164, 84,116,165,215,139,218,148, 52,
+ 42, 85, 47,231,172, 14,145,190,111,214,128,156, 62,185, 66, 48,173,195,194,138,197,186, 19,150,220,116,113,176,237, 33, 66,117,
+117,244,176, 82,249,130,115, 12,222, 18,156,193,142,142,171,167, 87, 60,121, 52,242,222,251, 87,108, 55,129,253,126, 68, 2,248,
+237, 72,187,157, 72,229, 25, 55, 95,124,201,163,237,192,248,241,123, 32, 19,245,230,128, 73, 19, 31,252,225, 31, 83,158,189,228,
+219,175,191,229,245,113,230,217,203,137,235,227, 76,174,186, 30,170, 52, 98, 86, 1,157,237,235,188,185,100,226, 20,187, 47,221,
+ 81, 91,101,227, 2,174, 9,219,161,243, 37, 6,207,213,110, 68,122, 40, 79,112,129,253,230,138,215, 55,175, 48, 94, 56,204, 19,
+ 47, 94, 29,168, 38, 96,113, 26,145, 43,149, 86,123,160, 79,171,171,155,201,121,203,118,187,161, 96,248,251,223,125,197,221, 20,
+153, 19, 36,172,218, 14,173,167, 54,101,244, 27, 99,112,235,156,146,246, 22,212,171, 92, 80,179,206,127,254, 33, 15,239,187,172,
+101,239, 58,128, 31,218,147,126,111,215, 69, 91,119, 46,114,134, 2, 49, 29,180,177, 62,140,103,170,124, 46, 40,105, 15, 11,173,
+ 90,203, 24,129, 96,173,170,110,155,102, 27,151, 90, 73, 77,213,223,173,234,184,195, 59,175,111, 94, 17, 98, 44,212,178,104, 10,
+ 58,211,220,122,154, 88,106,161,191,153,181,243,240,206,244,238,191, 40,233, 43,103,114,154,187,103,180,225,157, 94,172,166, 23,
+ 41,186,127,213,224,150,229,123, 82,123,158,244,217, 82, 24, 74,189,176,163,149, 28,177,197,107,165, 94,133, 88, 33, 87,139, 55,
+170,180, 79, 41, 51,120,203,214,171,122, 57,231,140,109,130, 23, 52, 84, 96,201,150,191,231,134,144, 53,185, 73,206,118,223,239,
+238,166, 31,250,222,182,243,209,247, 25,145,238,109, 68,184,243,105,206,195,207,147,172, 59,253,135,133,116,237, 12, 80,211, 63,
+255, 7, 62,206,249,223,115, 81,168, 46, 41, 92,152, 11, 31,233,233,166, 94,130,128,148, 95, 45,125,103, 94, 22, 69,107, 91,184,
+247, 42,111, 44, 93, 48,179,140,222, 74,202, 12,195, 22, 87, 51,165,229,158,142,150,161,251,221,115, 46,125, 85,161, 66, 35,206,
+ 58, 38, 99, 5,162, 30,206,235,238,187, 9,205, 5, 98,201,248,193,240,211, 15,158,114,119,251, 5, 12, 1,194, 72,169, 19,166,
+214, 85,225, 95,114, 83,200, 70, 41,108,198,173,170,235,123, 18,160,183,234, 99,143, 41,235,222, 91, 56,203, 80, 87,255,123,234,
+123, 65,211, 15, 38, 31, 2,161, 91,197, 20,128,163, 19,131,105,154, 78,226, 88,224,120,125, 67,141,145,106, 12, 38, 87,194,234,
+213,237, 88,100, 84,128, 52,248,129, 54, 39, 72, 9,219,247,241,165,137,138,235,172, 97, 46, 42, 78, 45, 69, 71,211,198, 58, 98,
+201,196, 82, 73,125,171,212, 68,136,109,225,110, 91,154, 21, 98, 79, 99, 51, 78,119,220, 83,154,123, 46,249, 34,102, 85,104,141,
+245,134,155,233, 14, 99, 13,105,206,234, 65, 54,144,110, 11, 65, 26,174, 11,153, 76, 79, 52,116, 86,201,112,187,205,176, 42,251,
+ 23, 65,152,177, 26,190,226,172, 94, 96, 94, 92,183, 60,210,125,204, 3,113,158,113, 34,116,169, 44,251, 81, 61,210,210,244,156,
+ 75, 81, 39, 34, 45,233,234,101, 78,221, 14,103, 13, 57, 23,213, 42,228,140,113,158, 48, 12,184, 14, 19,171,165,244,236,121,117,
+202,196, 24,123, 66, 90,162, 36, 21,236, 22, 78, 43, 44, 99, 85,155,161,222,107,117, 76,136,156, 20,233,165,171,248,109, 53, 29,
+208,107,250,170,169, 94,228, 66,172,197,125,183,216, 45,126,124,133, 19,185,158, 48,121, 54, 25, 89,100,228,221, 77,162, 63, 39,
+120, 99,216,239,119, 60,122,186,101,255,120,203,147, 39, 59,246, 87, 35, 79,222,219,171,183,124, 99, 16, 47,180,155,137,223,255,
+237,175, 56,196,153, 71,255,234,127,166,120, 65,174,191,229,246,215,191,225, 39,127,241, 71,180,187,196,237,151, 47,120,241,236,
+ 37,135, 88,185,142,153,155,105, 38,225,213,223,223,250,132,216,185,190,195,183, 76,135, 3,226, 2, 34, 66,172, 17, 17, 75,142,
+ 32,165,193,182,242,254,211, 13,143, 31,239,153,111,143, 24,175,161, 91, 87,131,229,106,172,252,197, 79,127,194,159,254,241, 71,
+ 20, 18,215,119,145, 95,252,195,103,124,246,197, 53,165,121,134,160,244, 63,154,174, 53,196, 26,182,187,145,253,126,203, 92, 18,
+207,190,126,201,221,220,152,178, 35, 73, 35, 35,212,158, 89,111,140,165,137,161,104, 82,241, 69,166, 84,135,156,220, 27,157, 46,
+130,134, 11, 44,236,137, 18,126,238, 69,126, 23,194,245,221,104,207,119,100,100, 63,176, 67, 61, 83,192,173, 66, 11, 89,243,208,
+219,170, 78, 62,143,217,148,123,221,163,188, 1, 20,161, 43, 17,245,133, 9,206,170,226,179, 7, 34, 52, 81, 48, 64, 41, 42,236,
+113,253, 66,111,173,105,228, 99,174,136,120, 61,124, 69,187,230, 82,117, 12,229,195,168,222, 91, 81,203, 88,201,153, 84,148, 36,
+ 85, 83,164,150,164, 84,170, 86, 49, 86,214,177,119, 42,121, 69, 64, 46,250,128, 69, 43,160,223, 49, 61,120, 52, 57, 77, 78,246,
+168,206,157,110, 34,204, 57,234, 21,214, 59,235, 50,207, 20, 67,199, 49,194,113, 78,148,148, 24,131, 2, 80, 92, 5, 47,130, 23,
+161, 72,123, 11,174,245,116,161,157, 43,223,239,143,204,229, 7,172, 98, 46, 60,222,114,182, 23,191,255,231,133, 11,148,241,178,
+218,150,139,103,240, 68,188, 61, 41,214,219,133,127,124, 41, 66,196,112,225,253, 63,127,230,207,159,185,101,124,126,185,187,239,
+ 31,191,158, 24,239,247,247,242,166, 7,126,180,218,167, 15,237,100,239,180,198,146,146,142,225,164,163,170, 90,133, 24, 19, 33,
+231, 46, 62,242, 43, 45,144,166, 23,245,154,105,180, 48,249,251,123, 49,231, 68,112, 65, 47,241,218,200, 89,237, 85,181,170,178,
+ 29,111, 56, 28,111,249,248,241,158,235,171, 45,175,178, 33, 90,199,148, 12,181, 9,177, 20,196,120,170,104, 20,104, 24, 84,117,
+ 63, 29,238,176, 67, 32,120, 71,188,131, 41,206, 93,240,164,248, 82,245, 74, 23,172,243,218,205, 56,203,102,179, 85, 27,155, 83,
+ 97, 81, 18, 21,130, 25,111, 25,198, 65,189,246, 13, 54,227, 6,151,102,200,153, 50,207,120, 84,199,226,187,101, 83,140, 90,247,
+164,213,213, 6, 20,231,185,107, 76, 42, 77, 44, 33, 56,110, 15,119,152,193, 17,163, 78,205, 74, 41,180,172,194,191, 44,153,140,
+ 16,107, 37, 55,214, 98, 34, 67,223, 21,131, 25,130,250,181,115,162, 54,131, 12, 1,111, 45,116, 46,249, 92, 10, 91, 63, 98, 4,
+101,231,247,181,220,198, 26,198, 94,212,120,163, 83, 19,223,189,255,166, 53,194, 16,104, 6,194, 16,200,113,214, 81,118,191,152,
+ 90,109, 76, 83, 2,107, 59,107,189, 59, 26, 88, 44, 90,142,146, 35,227,232, 41, 8,211, 52,119,172,116,237,236,126, 77,168, 19,
+209,206, 87,196,172, 54,171,148, 83, 23,146,169,199, 60,149, 66, 67,173,122,131, 15, 88,107, 58,209,176,225,230,136,115,110,141,
+225, 85,186,155,118,245,151, 78,165,118,193, 84, 88,166, 75,102, 21, 82, 47,111, 70,179,190, 95, 90, 61,173,182,140,145,206, 55,
+ 63, 59, 35,140,166, 98, 89,107,186,231, 92,223, 67,206, 14, 90, 8,247, 41, 73, 41, 21,223,215, 22, 98, 13,173,170, 6,100,179,
+ 9, 60,190,218,178,223, 13,108, 54,150,237,104, 25, 55, 30, 51,170,184,144, 57, 49, 95, 79,220,125,253,130,237,207,126,194,240,
+209, 71, 28,190,249,146,252,219, 79,121,186,127,130, 15, 35,119,191,249,156,223,254,254, 25, 95,126,119,195,215,119,133,231,215,
+ 7,230,102,250, 68,163,173, 54,212,215, 55, 7,198, 33, 96,165,244, 24, 95,181, 58, 55, 43, 72,169,120, 44,219,237,192,199, 31,
+ 63,162,230,107, 62,120,188,229,117,173,188,124,121,131, 56,157, 98,140, 87,142, 54,221,224,242,158, 71, 59,199,199, 79,158,242,
+ 56, 56, 70,243, 27, 24, 6,126,246,211,159, 34, 2,135,227,204,235,215,119, 28,166,136, 56,167, 92,253, 67,194, 5,135,177,142,
+146,202,137, 95, 34,130,105,102, 53,217, 34,224, 90,123,168, 59,111,103, 59,244, 51,208,204, 27, 49,169,103, 56,208,251,209,169,
+255,132,172,236,239,219,153,222, 31,207, 47, 85,228,162,178, 94, 41,120,237, 50, 27, 94,206, 60,196,230, 30,220,108, 21,114,119,
+ 16,140, 38,219,170,210,213,116,198,117,233,182, 25,233,234,215,101, 52, 63,132, 65, 51,111, 99, 36,149,130, 49,154,152, 86,154,
+ 16,155, 90,128,140,181,120,235,113,182, 81,243,196,156, 53, 73,138,166,145,156,139, 32,209,200,226,107, 54,148,154,200, 69,187,
+141, 82,117, 44,186, 42,248, 47, 22,212,253,162, 40,253, 98,239, 10,173,101, 29, 33, 61, 66,179,149, 68,110,218, 17, 26, 17,172,
+202, 30,105,102,209,174, 11,169, 65,157, 35, 99,208, 55,189,171, 21,215, 17,151,114,241,250,159, 94,231,229,118, 49,139, 63,251,
+ 7,176,246, 31, 90,173, 92, 38,241,201,137, 96, 39,111,238,228, 21,107,219, 46,236,103,151,182,115,233,252,250,203,189,247,253,
+ 96, 25,228, 94, 60, 44,231, 1, 47, 39, 1,104,163,190,117, 74,212,206, 4,130,167, 98,192,188,193,130,175, 93,197,187, 28,110,
+203,132,171,228,178,218, 25,181,211,209, 2, 34,197,196,184,241, 42,174,169, 32,173,244, 2,161,219,249, 22, 27,161, 57, 47, 60,
+186,216,176, 95, 24,244, 24,203, 38, 90,244,122, 35, 92,223,222,240,135, 31,254,136,240, 7, 63,229,139,235, 59,190,190, 59,114,
+157, 26, 45, 4,124,211,172,232, 34, 2,198, 18, 75,161,220,220,226,189,231,238, 48,245,174, 81,243,179, 99,202, 29,244,163, 36,
+ 57,101,125,123,156,245,248, 16,184,187, 61,168,181,199, 58,154, 81,125,136,247, 30,179,140, 84, 75, 97, 51,140,208, 42,190, 99,
+111, 3,122, 24, 57, 4,191,240,226, 87,188,129,238,105, 19, 73,253,200, 94, 52, 94, 52, 21,172,120,114,173,180,163,166,214,229,
+ 84, 25,119, 91,154, 73, 76,243, 76, 42,173,143,201,213, 87, 47, 93,151, 34, 98,216,236,246,196,156,153,230, 25,239, 44,133,202,
+224, 29,211,241, 14, 47,158,150,149, 94,182, 27, 7,166,227,129, 49, 4,246,206,245,136,209,134,113, 6,103, 53,119,193, 72,101,
+179, 9, 29,255,169, 74,241, 70, 5, 99,169, 89,147,248,244,153,182,250,122, 89, 11,162,133,157,113,142, 41,166, 53, 55, 29, 41,
+184,133, 76, 72,197, 88,143,247,125, 20, 95, 50,182,234,107,170, 35,252, 5, 6,165,205, 75,169,181,159, 57,118,125, 70, 21, 18,
+ 84,168, 21, 98,202,216,190,247, 93, 88,240,203,122, 7,129,154,245, 50,243,182,131,171,186,148,189,246,177,253,210,156,153,190,
+ 94,172,114,110, 71, 94, 60, 33,230, 2,255,188,188,159, 23, 39,136, 8,171, 34, 95,241,194,141,150,122, 49,227, 44,197, 10, 86,
+ 84,155, 81, 75, 94,187,121,219, 11, 34,239, 12,227, 38,224,131,176,191, 26,217,239, 3, 67, 16,174,174, 54,136, 87,249,188,136,
+ 1,191,227,250,245, 55, 28,143,119,236,140,234, 33,238, 62,251, 10,249,246,134,167, 63,254, 41,233,155, 27,126,255, 15, 95,240,
+119,207, 94,240,245, 92,249,238, 46, 19,171,161, 25,131,109,150, 96, 32,149,184,162,153,141,177,250,253,198, 32,182,145, 83, 92,
+ 83,243,196, 22,172,207, 60,125,178,101,104,129,173,113,188,152, 39,140,135,155,219, 59, 54,143, 45, 97,180,108,182,142,207,191,
+250,130, 97, 52,124,244,201, 79, 57,198,137,253,149, 5,155, 25,252, 17,193, 48,213, 3, 86, 34, 49,222,225,237,142,195,113, 98,
+138, 89,115,239,173, 54,154, 53, 21,114, 43, 52, 89,232,252, 66,109, 58,197,115,111, 35,179,137,180,123,169, 83,188, 49,174, 62,
+ 79, 40,226,204, 38,118, 30,109,249, 67,144,177,239,218,197,191,139, 44,119,209,185,182,118, 15, 58,186,130,196, 46, 80,183,111,
+196,119,158, 3, 84,186, 29,109,185,212, 27,144,114,234, 24, 77,221,224,219,158,253,235,157,102, 49,207, 81,147,216, 16,139,113,
+142,106, 44,115,210,140,102,231,189,134, 11,212, 66, 58, 78,107,168,133,181,129, 48,104,222,122,138,145,214,199,177,165,119, 88,
+ 41, 87, 77,144,106, 77,115,210,219,105, 42, 98,132, 51,240,137,118, 47,214, 42,196, 99, 57,228, 23, 8,141, 53,202,166,103,193,
+ 15,246,100,169, 38, 22, 49, 14,235, 7, 4,186,223, 94, 31, 24, 5,206,152,238, 1, 78, 93, 47,217,222, 74, 88, 93, 81,178,239,
+248,158,254,144, 2, 79, 39, 17,242, 22, 76,107,123,139, 59,226,242,247, 95,168,214,223,250, 60, 45, 23,245, 41,216, 69,238,117,
+232,154,111,222, 46,104,116,239,244,198,191,241,223,172,174, 1,150, 75,214, 44,187,115, 13,108, 41,165,234,248,188,158, 46,250,
+ 90, 27,206, 43,221,108, 33,134, 25, 81, 15,175,179, 1, 17, 72, 57, 95,188, 17,155,156, 61,236, 61,137,107,233,148,244,130,208,
+ 21, 85,172,141, 36, 96, 82,229, 47,126,244, 17,143, 54,215,228, 79, 63,229,106,191,129, 97,228, 54, 70,110, 99,230, 54, 87, 14,
+169, 48, 39,125,174,157,113,120, 31,184,203,119, 90,252,149, 68,174,141,212, 26,121,142, 93, 83, 97,152, 83, 36,140,174,103, 72,
+119, 75, 87, 31,231, 46,130,167, 82, 11,113,158,184,218,237, 48,136,142, 49,107,101, 52, 22, 82, 98,227,188,122,117, 57,179,150,
+218,229,124,145,117, 21,177,125,178,231, 48, 69,166, 56, 19,231,166,246, 48,107,152, 99, 34, 55,225,246,230,150,108, 96,206,153,
+ 34,134,212, 85,237,181, 51, 16,114, 78,108,119,123, 82,212, 28,118, 47,104,212,171, 1,219, 50,219,142,127,254, 96,191, 93,227,
+ 87,199, 81,247,211,155, 97,232, 93,172,168, 56, 9, 97,179, 25, 58,162,119,232,221,116,102,206,250, 58,180,146,215,130, 45,198,
+220,233,139, 74,169,160,136, 44,238, 0, 0, 32, 0, 73, 68, 65, 84,196, 24,176,110, 29,159,150, 90, 87,172,112,140,185,175,231,
+ 52,153,204, 59, 79,169,202,131,167,175, 55, 90, 67,215,122,193, 17, 99, 86, 31,127,209,104,228,213, 43, 14, 90,176,180,220,117,
+ 4,105,157,175,218,238,102, 18,209,238, 87,137, 83, 58,213,202,173,104,158, 67, 15,187, 88,194,104, 22,126,188,172,154,232, 19,
+ 53,205,208, 16, 83,251, 51,168,151,180,244,162,194, 57,115,154,192, 25, 61,115,189,119,167,224,167,117,234,167,102,192,210, 35,
+ 94,117,106,161,225, 85, 86, 44,222,233,202,192, 15,142,113, 27, 24, 54,158,253,126,228,209,214, 97,130,208, 28, 36,219,240,227,
+134,118,156, 72,199, 59,222,251,201,199,120,132,195, 47,127,205,203, 95,254,138, 63,255,203,255,129,118,125,224,187, 95,126,201,
+ 95,255,252, 55,252,246,213,196,235,104,185,141,149,195, 92,104, 94, 11,177, 16, 70,178, 13,196, 62, 25, 82,132,175,218, 43, 55,
+ 97,100, 12,158,224, 2,211,221, 29,121,190,227,241,147,199,152, 22,121, 20, 6,126,246,241, 39,252,253,175, 62,229,182,100,172,
+245, 28,167, 72,108,149,187, 89, 83, 1,167,187, 66,121,126,131, 88,199,235,155, 59,246,187, 45, 37, 53, 90,203,204, 83,228,112,
+136,228, 98,120,245,221, 13, 83, 42,100,132, 38,150, 38,157, 37,111, 26,148,126, 55, 72,237,107, 99, 61, 19, 28, 77,222,178, 23,
+231, 77,155,219, 57,147,132,149,110,175,234,121, 57,139,221,108,237, 66,113,254,174,131,253, 33,159,250, 67,221,249,253,194, 66,
+ 51,155,251,102,244, 28,103, 43, 15, 40,157,219, 67,145, 52, 39,168, 72,107,229,162, 24, 89, 42,202,218, 10,173, 36, 45,112, 22,
+209,211, 34,138, 19,136,115, 84,113,139, 24, 92,208, 55,232, 28,117, 44, 54, 12, 67, 71, 94, 30,160, 68,141, 87, 5,140, 13,138,
+ 90,244,158,212,119,122,226,132, 20,103,106,105,204, 73, 81,141,165,202, 74,121,170, 11,248,167,223, 19,166, 87,189, 86,192,185,
+126, 41,168, 42,104,237,212,108, 31,159,111,140, 48,132, 0,226,152, 82, 37,150, 74,107, 22, 76,192,249, 43,196,192, 52,125,199,
+ 28, 35,102,116,138, 45,108, 10, 85,216,120,207, 68, 35,215, 19, 19,190,221, 83,124,223,127,101,219, 3, 43,152,243, 9,203,219,
+ 46,194, 31,116, 89,106, 61,122,166,147, 63, 91,163,244,206, 65, 46,168,118,156,141,213,207,201, 50, 92, 90,218,144,139, 75,251,
+ 4,157, 57,241,230,255, 49, 19,167,182,102, 28,215, 55,138,155,165,144,136, 41,246, 31,107, 49,105, 59, 62, 85, 47,174,194,198,
+140, 88, 99, 56, 78,119,218,253,117,203, 86, 45,245,164, 25, 88, 72, 85,189, 8,185,255,122,159,146,226, 12, 77, 60, 49, 21,158,
+127,241, 28,113,223,178,189, 26,248, 56, 8, 7, 49,200,118, 96,116, 66,137,145,187,156,168, 69, 47,151,148,133, 42, 66,205,141,
+216, 42,118,240,220, 77,170,238,198, 10,214,235,100, 42,199,220, 95, 90, 85,237,123,163, 17,178,211, 52, 49,142, 35, 49, 70, 74,
+ 41,108,118, 27,134,234, 25,125, 32, 78, 74, 97,163, 86,242,225,142,189, 15,120, 58,247,186,178, 34,116, 79,233,129,189, 11, 53,
+134,249,245, 45, 41, 22,198,176,225, 38, 70,162, 17,205,149, 47,149,102, 44, 83, 81,161, 94, 13,154,213, 45,214, 66,223,139, 27,
+ 96,240,129,233,238,192,118,187,101,191,219, 50,207, 51, 67,216, 32, 84,230,233,160, 93,174, 19, 90, 60,232, 46, 95, 84,172, 36,
+193, 99,108, 99, 24, 60,212, 70,202,106, 57, 43, 49, 82, 91, 37,138,233,187,105,187,122,205,151,195,182,100, 45, 90,115,174,228,
+170,113,177, 49, 70,140,216,126, 62,149,158, 15, 0,109,137,218,237,191,223,249,165,176,243,204,243, 17,239,125, 7,123,105,103,
+173,234,247,190,135,237,103, 88,140,115,239,198, 43, 53,235, 89,169,161,159,230,132,111,180,189,128,236,207,183,113, 93,223,177,
+172,238,214,127,175,163,191,181,208, 92, 64, 57, 90, 60,230, 53,172,101, 57, 19,150, 70, 99,193,160,122,175,248,216,197,245,161,
+158,120,123, 70, 38, 93, 56, 11, 25,131, 95,143, 20,235,156, 78, 79,173, 78, 27,156, 9, 12,131, 39,140,158,237,126,195,176,241,
+ 60,121,250,136,253,104,177,131,193,236, 7,218,104, 17,231, 56,124,251, 21, 95, 63,251,156,127,254,111,254, 55,190,252,221, 51,
+254,235,191,251,223,249, 23,127,242, 7,184,146,152,190,249,134,223,253,250,115,190,122,113,195,225,104,121,121,200,220,228,138,
+ 53, 14, 91,123,206,123, 59,227, 64,116, 64, 78,140,153,171,221, 6,208, 68,188,124, 60,242,254,163,199, 28,239, 12,135,195, 17,
+247,193,142, 79, 62,216,115, 53,234, 26,235,246, 46,225,176,188,255,201, 99, 82, 74,236,159, 62,101,227,213,161,176,127,180,167,
+182,204,118,220, 80,170,112,156,116,125,132, 88,141, 26,158, 35,119,115,230, 16, 51,205,120,237,214,115, 38,102, 93,149,153,102,
+ 86, 31,189,156,180,134,184,203,222,182,173,214, 8,125,210,250,110,189,157, 93,228,111,156, 98,178,142, 98,219, 26,246,113,106,
+114, 52,162, 81,176,198,245,189,233, 25, 98,246,194, 65,247,118,149,251, 18, 53,218,250, 39,242, 70, 33, 32,167,125,107,187,151,
+254,117,142,197,211, 44,172,210,177, 16,166,191,225,138,118,167, 52, 5,123,116, 33,134,145,110,233, 90,246,161, 61,199,216, 57,
+ 13, 64, 57, 78, 71,166, 57, 33,198,227,188, 71,156, 35,166, 76, 46,234, 51,183,206,146,230,153,146, 34,166,123, 13,193, 98,253,
+128, 49, 78, 21,236, 98, 40, 52,114, 74, 58,106,239,158, 85, 61, 84, 53, 71,215,118, 33, 81, 89,222, 84, 93,227,239,186, 13,201,
+180, 74,237, 60,112,219,133, 28, 75,110,119,240,158,205, 16,216,142, 3,227,168,221,205,225,216, 87, 0, 34,224, 44,214, 41, 17,
+239,238,110,230,238, 24, 97, 27,240,166, 65, 46, 4, 55,146,139,116, 79,125, 81,246,242,210, 9,183,186, 78,115, 78,144,162,246,
+131, 69,142, 15,112, 11, 87,135,133,156,179,219,234,153,144,110,249,239,118, 95,112,215, 78, 84,187,118,190, 24,106,151,122,137,
+101, 82, 35,156,101, 24,240,198,186,166,157,125,172,118, 79,176,119, 6,199,123,167, 13,238, 98,130,116,198,108, 88, 58,145, 5,
+141,169, 62,104,237,204,197,232, 97, 55, 12,129,156, 11, 49, 70, 21, 59,137,209, 78,174,229,179, 98,249, 68,125, 50, 98, 41,185,
+106,178, 25,178,218, 34,151,179,187,137,218,158, 98,202, 84, 12,119,223,188,228,213,231,106,229,114, 98,105,109, 32, 77, 19,243,
+245,145,148, 74, 31,229, 53,108, 51,164,156, 57,150, 8,206,146,226,140, 11, 94,187,222,190,243,182,198,106,140,232,113, 86,125,
+ 72, 41,164,227, 81, 3,134,186,173, 78, 80,254,121,153, 21,138, 50,205,183, 4,235, 8, 86, 69, 71, 91, 49, 4, 17,124, 47, 94,
+ 75,215,138, 44,175, 89, 70, 56,244,125,181, 21,193,250,129, 87,119,215,164,124,224, 80, 43,197, 89,178,181, 72, 24,193, 58,124,
+ 77,196,120,196,136, 97, 52, 78, 71,199, 37, 19,172, 96,187, 32,206, 13,142,150, 38,178,194, 58,104,179,170,148,183,222, 42,101,
+207,219, 85,168,101,157, 91,227, 96,173, 13,196,148,184,186,186,194, 69,181,245,149,162,147,185,156,117,196,157,115,234, 2, 52,
+ 45, 68, 90,101, 13,243, 88, 28, 32,181,170, 69,108,220,108,153,142, 71,226,172, 7,186, 24, 67, 78,165,231, 10, 72, 79,233,154,
+148,106,102,232, 98,214,210,189,233,129, 40,122,118,228, 92,116, 20,159,213, 2,217, 74, 89,119,244,165,244,217, 94, 87,150, 47,
+218,162,149, 45,110, 78, 32,165, 90, 11, 84,197,244,106,230,247, 25, 93,177,135,216,208, 95,151,229,162, 53, 86,180,139,246,182,
+139, 55,181,144,113, 61,100, 69,211, 39, 51,198, 64,112, 1, 76, 91,153,238,230,140,134, 98, 12, 26, 21, 77,195, 6, 79,142, 73,
+209,192,163, 62,115,206, 64, 24, 29,187,171, 13,195, 38,176,127,180,225,233,211, 43,134, 77,192, 14, 30,241, 6,188, 71,106, 97,
+250,246, 21,191,252,219, 79,249,238,117,225, 23,255,245,111,144,146,120,127,191,231,163,247,222,231,240,233,151,124,246,139,207,
+248,245,151, 47, 57,148,129,105, 78,234, 59,119,174,175, 26, 26,243, 28,149, 69,226, 2,214,123,106, 42,148,146,241,110,160,196,
+138, 27, 13,142,198,118, 19, 48,109,230,147, 15,159, 48,184,204,126,227, 24, 7, 67,202, 51,185,162,174, 39, 26,183,199, 35,143,
+118,134,218, 50,165, 52,156, 88,166,219, 87, 93, 72,234,185, 57, 70,166, 84,113,205,112, 59, 69,230, 92, 20,121, 92, 42,185,194,
+221,221,145,105, 74,204,177,174,144,153,218,140,134, 41, 53,205,103,104, 70,217, 37,238, 52, 71,105, 43, 20, 67, 43, 52, 53,192,
+ 27, 78,128,255, 7, 15,176, 37,180,226,172, 59,106,247, 21,234,203,116, 91,218,233, 98, 95,241,163,102, 69, 9,126, 95, 87,207,
+131, 29,252, 66,227,185,188,236, 87,245,242,186,247,236, 15,184, 26, 42, 16, 92, 15,229, 88,138, 1, 29,133,218,254, 49, 59, 76,
+106,197,248,229,154,241, 67, 0,163,118,132,227, 52,129,104,172,161, 6, 60,232, 88,210, 90, 7, 45,145,230,184, 38,187,137,113,
+228, 86,113, 46,232,112,164, 91,210, 74, 43, 43,226,179,245,194,194,138,198,236, 73,223, 11, 47, 67,146,218,119,199,198, 8, 78,
+186, 15, 53,107,117,191,196, 43,186,142, 30,101, 37,102, 57,154, 24, 82,110,132,210,216, 13, 35,131, 13, 28,227,204,221, 28,105,
+ 57,226,130, 35, 12,129, 57,142,204,243,129,187,195,196,126,180,154,114, 85, 19,131, 25,201, 29,130,209, 22, 42,219,186,137,239,
+ 23,162,145, 75,122,212, 59, 47,119,185,231,182, 56, 91,140, 52,222,100, 37,244,203,119, 73,203, 44,185, 94, 88,204,184,200,108,
+103,189,176, 79,204,247,135,166, 0,102, 37, 37,158,196,160,188, 25,205, 38,188, 33,169, 92,212,235,111,142,126,228,225, 15,177,
+ 2,117,160,160,251,240,165, 52,202, 93,140,164, 29, 22, 43,212, 36,247,168, 80,197,111,106, 1,152,123, 66,219, 9, 4,180,208,
+ 29, 79, 83,128, 20,115,143, 27,141, 23, 78,132,126, 77,211,164,145, 74,101,231,247,144, 45,215, 83,230,245,116,228,229,203, 35,
+ 55,198,225,236,192,198, 55,114, 76, 56,103,137, 37, 99,157, 96,194, 70,159,225,164, 59,245,220, 42,185, 53, 90, 81, 17,216,116,
+156,240,198,169, 61,236, 56, 33,173,177, 27, 7, 13, 78,241,106, 11, 93, 80,176, 74,111, 11,216, 10,249,246,192,216,100,117,153,
+ 72,171,228, 86, 41,210,150, 76, 30,196, 24, 98,107, 28, 91,163,149,194,126,183,227,208, 42,119,163, 71, 66, 0,171, 52,177,199,
+155, 45,214, 90,110, 94,191,198,253,255,140,189, 89,175,101, 89,122,174,245,140,110, 54,107, 55,209,100, 87,149,174,114,217, 62,
+166, 57,198, 96,176, 64, 66,112,135,184, 6,241, 11,248, 43,254, 79, 72, 71,112, 4, 66,135, 78, 72, 32, 56,198,174, 99,151,211,
+118,101, 85,182, 17,153, 17, 59,118,179,214,108, 70,243,113,241,141,217,172, 29, 59,179,108, 41,157, 85, 81,153,177, 99,239, 53,
+231, 24, 95,243,190,207,107, 45,179,171, 46, 1, 49, 40, 26,171,172,246,170,122,107, 97,113,148,146,233,187,190, 18,249, 28,109,
+ 27, 48,166,208, 52, 58,202,118, 62,168, 77,174,122,181,231, 57,105, 92,108,229,225,151, 28,177, 54,208, 53, 61,167, 97, 36, 52,
+ 27,230, 85,138,134,229, 8,194, 48, 78,202, 7,219, 25, 37, 82,202,220,190,187,213,172, 6, 44,165,234, 19, 48, 82,119,165,122,
+110,102, 41,244,214, 97,156, 35,229,162,182, 89, 17,156,215,183, 80,127,173,232,174, 23,200, 49,175, 99,244, 98,182,201,147,228,
+154, 99,190,188, 95,245,144, 43, 85,248,230,100,103, 85, 93, 67,139,116, 99,235,188,118,151, 14,139,219,204,195,216,160, 60,131,
+166,237, 41, 73,147,227, 74,205,108,183,117, 13, 96,241,196, 56,227,106,158,186,247,149,211, 81, 3,114, 48,138, 66,165, 6,189,
+ 16, 11,243, 48,211,118,126,211,115, 1,221,161,165,187,104, 8,173,227,242,242, 64,215,120,250, 78,195, 84,104,170,255,126,136,
+156,238, 31,248,236,111,127,205,175,127,115, 3,190,227,219,191,252, 21,159,190,236,249, 79,255,252, 79, 24,191,124,205,171, 47,
+222,240,255,253,242, 75,254,225,251,129,219,177,112, 59,103,230,157,163, 37, 45,209,214, 98,136,113,214,147, 89, 44, 34,174, 22,
+ 71, 86, 49,189, 57,226, 59,199, 79, 63,254,144, 95,252,244, 35,226,241, 45, 23,141, 94,180,221,225,154,148,132,211, 48,168, 16,
+113, 16,134,185,231, 52, 39, 14,215, 45,111,110,222,208, 31, 46, 49, 99,230,246,126,208,149,215,119,239,104,187, 3,111,223, 29,
+153, 98,226, 56,102, 78, 99,228,110,136,204, 17,166, 57,215,233,144,163,236,238, 45,135,186, 35, 64, 27, 48,111,222, 59,199,204,
+ 78,253, 94,145,148,252,136, 21,141,109,103, 46,143,118,237,143,219,101,173, 38,118,193, 49,187, 17,191,236, 51,217,139, 84,130,
+144,173, 80,146,242,163, 9,109,231,199,170, 60, 34,139,153, 29,253,214,236, 40, 54,155,114,123,153, 66, 44,196, 60, 91, 73,106,
+165,198, 32,138,104,245,235,156,230, 56,207, 83, 4, 28,182,230, 14,235,190,101, 9, 0,169,249,200, 24,133,214, 84, 49,138,243,
+ 1,223,180, 43,165, 93,147,170,114, 37, 96,185, 53,155, 89,163,147,116, 47,181,236,237,178,232,139, 87, 25,184, 53, 28,131,218,
+145, 43,248,195, 91,139,165,172,118,167,101,215, 21, 99,245,188, 91,207, 69,119,160,175, 66, 56, 99, 20, 81,235,138,208,212,224,
+133,136,102, 87, 15, 82, 48,189, 2, 61, 66, 40,116, 70,247,145, 82,109,116,166,142,240,206, 83,251,246, 1, 38, 59,111,106,217,
+125,118, 98,215, 75,110,227,186,179, 51,177,237,131, 81, 76,173,226, 13,251,167,100, 15,192, 95,158, 53,179,199,189,150, 13, 81,
+ 91,105, 44, 59, 65,103, 13,137,177, 60,225,166,216,138, 2,131, 57,239,228,247, 33, 45,123, 27,220, 99,214,193,239,176,204,175,
+252,239, 69, 99, 82, 65, 65,206, 57, 66,211,172, 1, 25,160,214,199, 37,216,193, 57,207, 60, 69,130,111,106, 23, 84,214, 36,175,
+115,254, 3,235,126,179, 84,120,199, 42,170, 19,133,210,204, 41, 43,234,210, 90,122, 28,151,190,225, 33, 78,200,162,196,175, 7,
+247, 56, 71,141,234, 44, 25,147,133,241,120,132, 44, 90, 32,120,203,229,197,129, 97,154,144, 57,210,212, 24, 89,193,226, 27,143,
+169, 54,167, 67,219, 64, 61,184, 91, 99,200, 86,159,237,198, 90, 36, 38,130,136, 38,176, 57, 91,199,235,106,221, 20,163, 5,131,
+ 49,134,108, 96,202,194, 40,144,157,129,182,161,185,232,200, 55, 55, 92, 92, 28, 8,214, 49, 14, 39,166,211,132, 55,208,218,140,
+ 69,104, 27,171,188, 0, 49, 85, 15,179,140,191,115,213, 6,100,156,215, 66,101,193,214, 46,200,214,103,215,151,228,162, 5,204,
+233, 56,208,117, 29,215,151,151,188,189,185,225,242,112,224,116, 26,116, 47,223, 6,108,232,117,164,158, 18,125,223, 51, 85, 6,
+251,242,215,195,241,168, 42,248,138,123, 16, 81, 11,155,247,129,135,120,143, 51,144,179, 78,248, 66,208,149,223,146,234, 85,234,
+251,149,146,144,142, 5,239, 93, 29,107, 27,210, 28,153,103,189,224, 87,148,119,245, 81,151,204, 74,199, 91,139,191, 82,118,219,
+168, 74,173, 91,166,109,101, 91,225, 57,239,234, 25, 83, 5,109,206, 42,176,202,105, 86,188, 61, 43,184, 45,226, 44, 62, 4,108,
+ 8,248,166,193, 57, 8, 54,104,250, 94,213,241,216,224, 85,120, 88, 18,166,174,153,150, 4,186,133,139,111,234,154, 71,137,126,
+202,117,152, 83,228,226,208,174, 5,175,247, 94, 59,219, 38,208,245, 45,125,219, 43,141,209, 26,172,205,196,105,100, 26,225,175,
+255,234,215,124,251,250, 13, 83,129,124,127,162,156, 34, 31,252,222,167,220,127,125,195, 55, 95,125,197, 63,252,250, 53,191,121,
+123,228,205, 49,243,246, 52, 51,227, 40, 86,145,193,206,234, 44,212, 25,191,194, 96, 98, 86, 71, 84, 66,170,147,192, 18,135,194,
+213, 69, 79, 99, 12,199,225,129,214,127,200,199, 31,191,196,150,200,231, 95,126, 75,119,145,120,119, 28,152,115,102, 78, 66,223,
+ 6,110,110, 79,124,219, 88,114, 62, 48, 15,145, 25,117, 41,220, 28, 39,181, 91, 78, 35,229,110, 36,166,194, 56, 37,198,164, 59,
+254, 49, 10,243,148,136,185, 16,211,162,114, 55, 20,163,150, 72,231,237, 6,119, 23,193, 27,145, 93,179, 35, 43, 93,109,185,124,
+126,200,199,251, 4,104,123, 61,126,173,181,245,195,218,237,130,205, 6,128,145, 71, 74,228, 21,163, 89,105, 58,152,250,240, 96,
+183, 80,184, 39,132, 79,143, 59, 66,179,156,105, 85, 25,108,216, 49,249,246, 87,255, 78,188, 39,198,214, 11, 85,176,162,253,123,
+ 83,129, 10,185, 42,208,157, 85,252,227,156, 18,199, 97,168,177,145,154, 22, 85,138,172, 2, 10, 5,133,232,126, 73,199,148,154,
+160,133,113,132,208, 41,109, 91, 4,201, 51, 82, 65, 31,193,171,101,167, 24,229, 38, 91,231, 84,237, 92,113,169, 69, 42, 4,193,
+128,243,250,239, 27, 17,124,219,212, 23, 47,235,213,151, 51,162,156,141, 85,153,106, 88,252,160, 22, 73,117,148,213, 52, 32, 70,
+ 43, 83, 41,216,148,233,156, 99,112,158,217, 58,140, 11, 10, 8,153, 34, 29, 6,103,103,154, 16,152, 81, 28,162,160,118, 17, 35,
+182, 42,227,205,147, 64,182,115, 11,216,166,152,223,216, 21, 59,192,209,114,203,155, 45, 4,197,238, 58,240, 85, 24, 81, 47,123,
+ 99, 56, 83,183,139,236,245, 27,143,225, 66,176,207,124, 55,134,117, 7,245,190, 13, 79,206,248,245,143,213,241, 11,245,206,190,
+215,254, 63,138,116,217, 21, 1,194,182,201,178,187,226,117, 81, 4,139, 17,218,174,169, 63, 51, 61, 88,114, 76,120,177, 26, 76,
+146,183,196,167,156,117,242, 83, 12,103, 73,119,234, 72, 88, 46,173,180, 83,211,155, 90, 56,170,181,173, 96,212,175, 28,132, 48,
+ 71, 90,129, 75,231, 57,228,196,109, 22,202, 20, 41,181, 35,181, 5,229,185,163, 66, 49, 35, 21,136, 97, 13, 54,120,166, 56,235,
+207,194, 91,198,147,102,131, 7,107,208,100,209,130,171,171, 33,181, 72, 21,134,251, 59,165,137,149, 68, 17,245,161,187,198,212,
+ 29,162,170,168, 37,203, 70,212, 55, 14,240,204, 89, 72,232, 78,191, 88,199,253, 60,209,123,129,156, 72,167, 35,193, 57,174,172,
+208, 56,131, 53,202, 35, 23, 89, 38, 74, 22, 83,189,223, 26, 92,146,177, 98,136,121, 91,245, 52, 77,195, 60,207,248,160, 99,122,
+231, 44, 83, 13, 79,105,218,142, 97,138,245,189, 63,225,131,103,158, 39, 14,135,142,121,154, 42, 90, 86,159,175, 82,114, 61, 71,
+ 84, 72, 91,170,216,177, 84,168,140,138,203, 68, 89, 19,185, 32,149, 4,152, 75,161, 96,193,234, 59,175, 97, 44,133,148,119,141,
+ 79, 49,170,179,169, 33, 46,193,123, 40, 22,169,227,126,169,129, 60,165, 22,111,212,130,112,177,134,200,217, 52,117, 27,163, 75,
+117,196,152,202,121, 55,245, 0,245,193,214, 96, 29,167,103, 89,219, 16,188, 87,146, 28,130,181,129, 12,100,172,234, 21, 12,124,
+242,147, 79,184,121,253,154, 34,179,134,149,212,124,244, 20, 35, 49,205,170,166,175,163, 51,231,220,250,156,106,252,111,213, 52,
+ 89,167, 38,145,218,116, 57,107, 72, 41,210, 54, 30, 23, 52,151,222, 85,248,143,119, 26,110,130,192,241,238,158, 62, 55,220, 61,
+ 28,249,237, 23, 55,124,246,217, 55, 92, 60,127,193,225,210,242,253,187,111,121,209, 29,232,109,199, 87,191,253,158,223,124,245,
+134, 87,119,137, 87,167,194,109, 20, 38,227,153, 69,227, 83, 84, 20,169, 69,181,179,149,209,111,212,241,100,188,165,105, 60, 49,
+235,243, 96, 49, 48, 70,196, 89,130,205,124,251,221,119,188,248,131,223, 67,162,240,236,195,143,185,125,200,152,182,163,228,145,
+214,119, 28, 79,145,214, 26,134, 4, 99,118, 12,217,112,123,115, 71, 17,199,113, 22,125,206,243,132,111, 58, 78, 67, 98, 28,103,
+230, 2, 99, 18,230, 4, 83, 82,125,149, 24, 75, 46,139,120, 84, 15,187, 92, 1, 66,165, 54,195,126,245, 4,213, 81,179,206,189,
+204, 89,134,250,239,218,142,238,233, 87, 43,195,215,185,243, 36, 43,179,159,158,239, 49,255,155,109,232,108,199, 41,130,216,242,
+ 94,215,244,212,215,221, 32, 51,203,158,113,225,193,239, 57,198,156,141,100,237, 14,158,179,120,164, 87, 24,194, 66, 95,170, 9,
+ 83,214, 7, 98,206,140,227,164, 31,180, 85,212,234,210, 17,149,170, 50, 93, 70,123,190,107,233,218,134, 28, 75, 85, 52, 7, 74,
+ 81,123,152,238,247, 50,173,247, 52,206, 40, 45, 41,163,252, 96,107,241,198, 41,211, 91,114, 77, 58, 82,123,137,113, 58,185,112,
+ 21,116, 19, 66, 61, 56,242, 92, 37,176,106, 3,177,213, 74,100,141,219,253, 44,161,111, 60,135,198,211, 88, 72, 37, 34,105,162,
+ 20, 75,170, 97, 48, 77,227,176, 35,136,243, 26, 50,147, 51, 46, 70, 26, 11,193, 27, 58,235,153,107,151, 91,214,169,204, 10,122,
+ 66,140, 80, 10,239,169,209,101,183,106, 49,166,236,210,196, 88,197,100,155, 8,206,114,166,189, 59,235,230,183,207,206,156,205,
+213,203, 35, 10,162,121, 82,244,185,138,203,164, 84, 23,192, 62,246,245,113,216,176,172,162,187,101, 80,181,239,214,181,243,221,
+127,141,115, 94,252,153,223,238,135,146,220,234,197,222, 52,205, 42, 38,155,231,121,237,176,114, 22, 58,107, 41,149,136,104,173,
+ 93,137, 99,219,218,169,212,145,110, 85, 48, 87, 28,165,243,110,221,159, 82,233, 93, 57, 21,146, 24,230, 44, 92, 92, 94,226,166,
+ 25,226,204, 44,153, 75,223,208,166, 72,107, 33, 25, 75, 52, 6,227, 61,222,192, 92,178,170,200,165, 96, 26,199, 92, 18, 18, 39,
+ 76,112,120, 23, 16, 17,186,174, 37,207,145, 60,142,106,247, 68,187, 94,231, 44, 57,197,213, 14,235, 43, 20,101,129,150, 36,132,
+ 33,199,250, 61,235, 38, 80, 19,218, 52, 8, 37,139, 97, 42,137, 36, 25,231, 12, 86, 10,126,158,104,108,226,195,235, 3,151,109,
+171,240, 23, 81, 18,151,243,174,242,239,181,187, 47, 89, 42,255, 65,227,104,131, 15,164, 52, 87,203,223, 57, 96,104, 78,177,174,
+ 66, 50,211, 41,234, 59,228,155, 74,231, 75, 88,171,216, 85, 99, 12, 37, 38,188, 51, 72, 86, 91,226,242, 46, 76, 21, 13,155,115,
+169, 90, 8,253,124, 87,128, 74, 46, 24,239, 40, 69,167,119,198,154,154,211, 46, 42,142, 74,185,158,134,101,189,228,150, 2,103,
+ 33,243, 33, 64, 90,144,170, 74,166, 83, 36,171, 62, 18,174, 90, 36, 93,219,213, 47, 89,240,182, 81, 86,123,211,208,132,182, 54,
+ 33,250, 28, 24, 3,211, 56,114, 56, 28,106,120, 97, 97, 26, 31,116, 79,107, 52, 24,200,250,128,245, 13,197, 25,125, 70,147, 54,
+ 42,221,101,167, 68,181, 28,121,241,252, 25,247, 55,111, 24, 78, 81,245, 19,185, 40,234,181,250,203,139,148, 10, 0,147,117, 4,
+191,252, 57,154,224, 48,245,156, 94,184, 14,206,110,171, 43,106, 26,155,190, 43, 13,161, 9, 53,130, 53,241,240,240,192,243,235,
+ 11, 94,191,126,224,235, 87,223,243, 15,191,254,154, 40,134,113,142,196,251, 65,237,161,215,207,248,250,155,239,120,247,238,134,
+175,223, 14,124,117, 51,113, 55, 27,142, 73, 24,179, 80,140, 69,114,157,154, 45,199,194,186,242,211,149,149, 49,234,141, 87, 59,
+163, 78,166,134, 49,145, 37,115,209, 92,242,230,110,230,183, 95,189,225, 15, 62,122,193,252,112,228,170,185,166, 76, 17,137, 66,
+113, 58, 61,157,179,240, 48,100,250, 33, 49,156,116, 98,148, 74,161,184,134, 20, 35, 15,227,132,140, 39,230, 57,145, 10, 12, 83,
+ 98,206, 48, 69, 33, 21,213,177,136, 49,164, 42,174, 93, 70,139, 57, 87, 36,184, 85,186,157, 90,218, 76, 57, 83,253,150, 42,140,
+ 50, 59, 60,236,143, 43,126,117,255,179,140, 90, 23,133,228,190, 48,120,188,130, 52,216, 42,162, 91, 66, 74,228,125,122,215,234,
+ 31,183, 63,104,111,123,236,145,183,117, 15,180,128,226, 69,116,172,190, 5,109,213, 3,217,236, 51,177,171,118,160,114,144, 65,
+173, 67,105,217,255,212,125,101,204,234, 55, 94, 8, 80, 75, 39,191,140,236,145, 66,215,182, 28,250, 14,176,250,195,175,227,123,
+ 91, 19,185, 36, 69,218,160, 7,102,235,212,218, 82,114,194,161,163, 72, 35, 66, 78,170,100,183, 70,240,193, 85,149,168,169,149,
+170,175, 2,133,130,145,229,195,172, 81,174, 53,181, 72,213,220, 91, 60,168,119,150,198, 25, 72, 35,227,124,210,238,160,204,122,
+184,164, 68, 49,138,192,244,126,217,233, 25,114, 54,196,148, 40, 1,154,226,232,188, 91, 11, 4,169,186,193,101, 60, 44,219,243,
+181, 2, 93,100,247,139, 75,122, 95,161,108, 85,252,227, 45,244,162, 4, 63,191,189,183,207,236, 17, 20,102,243,128,155,179, 61,
+122, 5, 73,159,221,169,239,185, 59,120,228,248, 48,101,229,215, 27,243,136,156,104,158, 38,226,157,169, 1,126,199, 20,105, 29,
+254,155, 85,137, 80,197, 74, 42,194,122, 56, 30, 53, 87, 92,150,124,230,101,180,110,171,186, 93,237,145,243,156,222,243,247, 75,
+229, 39, 44,248, 96, 74,193,225,107,226,151,236, 96, 62,142, 40,137,177, 20,230,156,184, 52, 66, 35,133, 11,231, 57, 1,151,141,
+ 80,176,164, 82,136,198,104,252,170, 8, 23,135, 3, 50,142,106, 5, 43,153,139,190,175, 93, 65,169, 28,244,172, 41, 82,198,172,
+231, 69,240,158,182,211,208,148,185, 40,169, 44, 75,193,138,238, 41,103, 41, 68, 17,166,172,190,113, 35,224, 98,141, 21,205,250,
+ 44,207, 34, 76, 37, 18, 75,193, 6, 8, 82,184,104, 3, 47, 46, 90, 62,184,238,105,125,192, 91, 32, 27, 74, 49,196, 34, 36, 50,
+ 99, 76,106,183,203,162,130,162, 12,177,234, 65,176,144,196, 16,115,161,233, 58, 82,206,170, 96, 78,137, 41,206,116, 11, 24,167,
+198,100,158, 30, 78,245, 60, 48, 72,170, 43, 49, 32,197, 25,145, 82,167,111,149,235, 93,149,228,169,142,150, 1,250,190, 87,225,
+216,226,182,112,250, 94,166,250, 94,148,229,157, 89, 18,228,164, 18, 34,139,190,199, 49,103,172,111,149,111,239,180, 19,115,174,
+118,199, 8,215, 87,151,120,239, 25,167, 17,235, 29, 93,223, 51,156, 6, 94,190,124, 65,219,182,220,223,222,241,242,229, 11, 68,
+132,219,251,123, 62,254,228, 19,134, 97,100, 56, 13,180, 93,199,225,208, 51, 79, 51,119,247,183,188,124,249, 18,201,145,105, 26,
+ 56,205, 35,199,211, 73,133,183,110,209, 73,204,224,148,133,225,156,234,112,140, 13,204,243,140,164,145, 47,126,243, 57, 18,103,
+218,182,213,239,109, 86,166,128,130, 99,156, 90,230, 22, 69, 78, 93, 49, 57,167,231, 77, 74, 66,168,217, 8, 6, 48,182, 78, 90,
+237,182, 6,208, 9, 1, 52,109,187, 78,184,166, 56, 50,142,153, 57,194,215,223,188,225,239,255,241, 11,230, 92,248,224,195,151,
+ 76,227,196,221,219,119,188,188,190,230,112,125,197, 55, 95,124,201,171,239,222,241,230,126,226,221,152, 25, 18,196, 92,137,164,
+ 53, 6, 22,103,214, 85,111,170,110, 37,138,213,207, 43,101,166, 52, 19,124, 75,215,118,117,205, 7,113,154, 57, 30, 51, 95,167,
+129,119,223,221,114,243,234, 53,127,242,139,159,241,233,167,159, 80,172,231, 56,207, 36, 25,233,131,231,254, 97,192, 42,120,130,
+156,171, 8,214, 5, 4,203,241, 52, 49,198,204,156, 34, 49,234,132,103,138,153, 88, 44,211,148, 17,235,171, 21,178,118,236, 44,
+ 33, 65,218, 96,165, 92, 86, 13,138,103, 53,175, 75, 69, 17,150,243,243,113,133,208,252,176,118,173,156, 5, 85,109,201,104,251,
+ 49,183,221, 29,124,182,216, 13,212,177,116,111,143, 14, 79,131, 86,194,107, 8,236,143, 48,229,159,156,132, 62,134,213,152,141,
+ 46,167,132,170,178, 94,233,206,106,165,104, 37,107, 39, 90, 71,103,212, 76,225, 44,133, 84,197, 31,170,108,215,200,193,178, 8,
+ 86, 42,207,185, 13,129,139,195, 1,239, 2,195, 52, 99, 69, 71,101, 26,179,151,145,156,232,130,167,117,170, 92, 55, 57,146,102,
+205,116,238,186,182, 30, 24,117, 44, 21, 2,222,148, 26,228,162,236,106,237,112,212, 7, 43, 69, 71,212,190, 22, 25,110, 9,117,
+145, 66,138,139, 45, 73,189,163,197,170,191,184, 44,158, 30, 99,112, 38, 49,215,162,106,158, 20, 89,233,157,193, 36,157,142, 88,
+ 87,201,100, 49,210,120, 71,227,131,238,157,170,141, 48, 9,155, 80,203,108, 16, 29,138,121,130, 64,183, 83,153,153,157,135,189,
+ 58, 10,150, 61,157, 61,187, 52,215, 45,250,106,165, 91,158, 9,121,148,223,126, 22,169,186, 48,170,207, 36,120, 79, 57, 54,246,
+127, 70,183, 70,176,136,236,170, 0,171, 96,143,205,142,183, 55,231,203, 57, 89,239, 41, 15,191,216,117,213, 84,100,155, 60, 44,
+243,171,146, 51,190,104,167,166,204,112, 5,120,104, 70,179,134, 52,248,224, 25,199, 89,195, 33,154,134, 24, 79,235,200,116,209,
+ 52, 44,197,244,226,129, 95, 14,205,141,236,165,169,133,198,232,218,229, 56, 78, 60,247, 30,151, 19,185, 8,173,192,243,198, 51,
+ 77, 51,157,181, 68,171, 19, 28, 9,142, 97, 28,176,214,209,121,203, 56, 36,152,102,186,182,195, 90,207, 52, 69, 29, 33,231,140,
+119, 85, 12, 90,167,117,183,119,247,186, 27,183, 48,204, 74, 97, 27,166, 76, 22,171,148,194,224,136, 46,172,225, 33,206, 24, 76,
+214,131, 86, 74, 66,156,101, 50, 5, 19,132, 6,225, 50,120, 62,185, 62,240,241,245, 21,141, 99,141, 39, 30,147,142, 64,139, 49,
+ 76, 73, 56, 85,208, 79, 1,154,174,195, 68, 33,207, 17, 49, 26, 67, 44, 2,198, 7,165,155,165, 68, 8,129, 97, 28,105,219,150,
+211,105,208, 36,195, 16, 56,244, 61,199,219,251,138, 72,213, 34,231,242,242, 66,177,203,206,147,146,218,244, 98, 76,107,178,224,
+146,244, 86, 74,209,105, 73, 61, 28, 75,210, 72,230, 38,120,181,121, 57,200,197, 48,167,132,115,158, 24, 39,172, 11, 56,235,153,
+ 78,199,170,181,128,171,235,231, 92, 94, 63, 35,180, 61,195, 48,112, 56, 28,184,184,184, 84, 91, 83,156,249,248,227,143,152,167,
+145,219,119,183, 60,127,241,146, 82, 10,239,110,223,241,225, 39,159,112,119,119, 79,119,117,137,235, 90,238,239,238,193, 59,166,
+146, 73, 6,142,105,166,109, 46,136, 8,147, 36, 34, 74, 70,203, 2,197, 26,196,123,230, 2,109, 13,127, 50,206,227,172, 39,149,
+204, 56,205,120,171,192, 26,138,238,188, 93,176, 12, 15,119,180, 94, 93, 24,125,219, 65, 8,148,250,243,200,185,208,120, 71,156,
+231,181, 25, 18,145, 53,172, 69,106,161,105, 69, 61,245,203, 57,183, 88,223,188,181, 26, 59, 92,197,116,170,232,215,201,147, 15,
+ 61,255,240,197,107,254,234,175, 63, 35, 38,248,244,211,143, 85,139,144,149,177, 80,114,225,235, 87,175,249,250,251, 27,110, 79,
+145,155,177,112,140,133, 33,150, 53, 52,186, 84,214,199,246, 46,171,154,159, 34,164,152,215, 51,203,123,141, 66, 30,135,137,139,
+195,129, 34,133, 81, 18,199, 2,173, 9,124,252,209, 75, 62,252,232, 0,206,242,230,251,215,164, 89,223,233,148, 11,209,137,250,
+213,231,194,253,113, 38,101,165,124,166,148,212, 53, 33,134,152, 21, 0, 53, 71,117, 64,229, 34, 36,109, 81, 86,192,214,222,218,
+188, 89, 62,245,172,206, 69,239, 14, 47,198,213,145,228,158,231,190, 23, 22,169, 21,235,199,247,233, 63,160,122, 22,221, 63, 26,
+171,135,155,221, 5,194,172,128, 14, 28,197,148,149,142,182,239,228,255, 41, 35,255, 31,251, 19, 45, 99, 75,163, 56,163,247, 96,
+ 41, 70,234,134,116,141,140,205, 27,101, 73, 74, 21,216, 80, 45, 35,105,197, 55, 46, 88, 78, 29,137,233,207,166,105, 90,174,175,
+174, 42, 90,115,196, 20,237,255,125,112,234, 17,205,154,180,214, 58, 71,103, 29,150,204, 52, 30,235, 40, 61, 64, 81,127, 58, 53,
+183,215, 26, 67, 48, 89,153,219,193,173, 16,146, 18, 35,146,150,221,154, 35,216,170, 70,207,153,152, 39, 36,151,149,174, 7, 6,
+177,218,129,121, 11,222,171,221,105,156, 39,172,100, 92, 86, 79,189, 56, 79, 17, 37, 85, 89, 73, 85, 45,172,151,105,206,106, 7,
+ 10,162, 2,175,136, 94, 12, 75,154,164, 44,158,113,243, 20, 8, 70,214,144,147,237, 34,173, 83,156, 82, 25,208,187, 66,172,172,
+110, 71, 89,215, 53,122,161,111, 19,160,205, 59,126, 62,134, 63, 11, 88, 41,156,237,208, 31, 95,236,249,145, 39,253, 44,242,117,
+ 63,130,175, 22, 58, 5,105,236, 81,195,188,151, 70,247,212,255, 45, 4,172, 69, 66,185, 44,130,182,125,187,101,152,226, 25, 55,
+191, 36, 13, 11,194, 64,140, 26, 15,106,173,238,202,251,174,103, 28,166,213,143,188,247,232,111, 56,102,197,182,182,109,139, 72,
+ 90,247,240,186,175,207,204,100,108, 19,112,115,193, 6, 71,202,130,143,145, 75,231, 24,124,224,148, 51,167,146,213, 22, 52, 70,
+ 50, 66,219,117, 76,243, 76,227, 60,109, 8,107,119,222, 58,125,150, 92, 27, 24,243, 76, 82,123, 2, 38, 27,162, 42,221,152,103,
+ 85,142, 91,231, 72,101,198,122, 67,235, 28,138,122, 8,106, 17, 21,203, 92,253,241, 49,102, 82, 73, 42,170, 44,133, 62,120, 14,
+ 22, 94, 30, 90, 62,184,236,232, 61,228,168, 7,162, 88,213,119, 20, 68, 39, 11,176,198,177,230,156,152, 99, 34, 39,221,155,199,
+156,152, 79, 35,198,121,114,222, 88,229,167,211, 73, 71,225,162,239, 97,169,254,235,156, 51,221,161,199, 90,203,241,248,160,185,
+235, 82, 56,158, 78,244,125,143,243, 13,136,197,123,157,164, 44,107, 56, 91,169,144,165, 20,198, 97,192, 89,205,113,104,219, 6,
+ 73, 73,149,212, 89, 42,196, 69,199,165,161,239,244,103, 29,103,157,154, 57,203,135, 31,126,192,207,126,254, 11,230,148,185,123,
+120,224,226,250,138, 23,207, 95, 48, 12, 35,183, 15,247,188,124,249,146,119,247,183, 8,194,152,102, 82, 78, 12,211,192, 24, 71,
+166, 60,145, 72,100, 43,248,190,161, 43, 29,233, 33,242,193, 7,207, 56,158, 78,136, 73,248, 0, 31,127,242,146,211,241, 30, 99,
+ 34, 63,255,197, 79,184,186,186,226,179,207,254, 30,231, 29,183,247,247, 20,171,244, 59, 93, 39, 60,224,172,225,242,112,193,179,
+139, 3, 87,135, 3, 72, 38,151,168,186, 32,167,156,122,165,175,165,117,130,217,120,175, 12, 14,187, 89, 45,237, 78, 80,235,156,
+ 83,150,192,226,242,201,218,201,122,107, 86,109,144,175,200, 94, 83,207, 81, 45,140, 29,195, 36,188,187,123,199, 63,254,250, 75,
+164,105,185,184, 82,167,206, 87, 95,191,230,225,230,134,143, 95,126, 72, 42,112,115,115,203,205,237,200,219,251,153,251,185,112,
+ 74,234,222,136, 8, 88, 95, 99,189, 13,150,178,105,121, 28,120,235, 40, 53,102, 92, 41,120,126, 69,118,223, 31,239,232,251,142,
+ 11,223,208, 97,185,118, 14, 51, 79, 60,127,241, 41, 31, 60,191,226,246,118,170,147, 0,163,132,209, 92, 39,107,198, 96, 71,189,
+ 59, 82, 41,250,133,196,114, 26,103, 50,174, 22,158,166, 58, 33,150, 64, 45, 5, 55,109, 42, 34,187,158,165,171,187,108, 39, 25,
+246, 79,130, 64,140,188,215,121, 63, 25,174, 81,119,142, 26,222, 32,171, 55,119,197, 1, 86, 47,162,148,178, 27,145,234,174,107,
+ 25,201,170,168, 72, 47,159,229, 2,126, 47,146,181,168, 10, 95,156,252, 14,185,158, 89,149,148,102,191,135,223, 31,174, 34,235,
+ 72, 92, 71,152,154, 74,230,216,170,159, 61,167, 62,215, 10,124,185,208, 13,154,169,158, 37, 35,162, 48,154, 54, 52, 92, 93, 94,
+210,182, 93,141, 60, 84,136,129,113,134, 16,156,102, 51,139,238,244,122, 31,104,172, 35,142, 51, 86,132,182, 9,154, 48, 28,103,
+140,115,120,175, 59, 35, 3, 52, 36, 28, 5, 73, 69,247,154,113, 70, 74,161, 9,161,138, 86, 64,210, 76, 41, 73, 35, 61, 37,175,
+ 56, 69, 89,114,207,173,169, 91,186,172,213, 94, 22,130, 51, 24, 27,112, 86, 56, 14,137,185,238,247,140,100, 26, 99,152,150,112,
+ 6, 83,185,219,185,224,235,206,203,162,190,219,117,255, 37, 90,241,238, 17,194,143, 9,130, 43, 24,161,142,221,197, 44, 41,123,
+143, 99, 89, 55, 96,204,234,184, 49, 91,207,110,173,232,248,138, 93, 65,240, 40, 65,110,253,231,215,209,230, 6,143, 49,107,103,
+109, 30,185, 36, 55,146,190, 49,178,121,217,119, 83,133, 21,143,185, 8,232,204, 35,127,199, 35, 61,169, 26, 21,204, 6,153, 53,
+239,255, 51, 27,243, 94,200, 89,125,188,198,194, 48, 77, 74,244,139, 51,165,120,218,182,229, 56, 28, 65,116,162,243,240,112,218,
+198,239,156, 23,227,203,133, 52, 77, 83, 29, 45,171,135,217,213,200,222, 41, 69,220,213, 53,109, 99, 49,131,240,112,127,162,241,
+158,124, 58,209,249,134,166, 0,115,196, 89,135,175,239, 76,142,154, 18,118, 56, 28, 84,107, 34,133, 52, 69,196, 26,162,133,113,
+ 26, 16,175,227,227,214,183,144, 11,105, 69, 20,171,152,206,121,199, 85,219,241,236,186,231,170,235,112,149,207, 94,114,210,192,
+ 21,241,136,117, 28,231,196,195, 48, 65,202,244,237,129, 11,239, 56,120,195,101, 48,184,148,240,109,192,134, 70, 85,252, 21,140,
+146,115,214,182, 35,102, 92, 21,215, 46,239,114,170, 34,185, 41,170,210, 56,198,200,245,197, 21,167,113,212,103,222,168,223,219,
+ 58,171,107, 16,231, 56, 13, 35,215, 87, 87, 20, 18, 41,205,248,202,208, 63, 13, 3,198, 7, 45, 32, 74,198,155,176, 19, 44,218,
+173, 29, 49, 26,157,234,125,160,241, 53,134,217, 26, 8,129,152,245,201, 19, 84, 20, 0, 0, 32, 0, 73, 68, 65, 84,125, 57,157,
+ 70,196,120,166,156,112,141, 37, 27, 40, 86,255,242,222,241,236,197,115, 78,243, 72, 17,195, 48,158,120,241,226, 37,115,156,201,
+162,170,125,172, 38,223,165,148, 48,254,132,177,208,118,129, 41,122, 46, 46,123, 10,153,135,227,204, 71, 63,249,144,225,216,227,
+191,135,255,224, 79,255, 57,199,211,137,223,252,246,183, 12,227,145, 63,255,143,254, 61,190,250,234, 75, 90, 95, 40,105,228,211,
+ 79,255, 25,211,116,226,175,254,242,175,177,214, 48,143, 19,141,183,244,125,203,135, 31,124, 76, 31, 60,125,112,196,225, 68, 99,
+162,142,145, 41,117,121,169, 19,197, 88,213,248, 37, 23,205,186,112,134,132,106, 15,124,213,122,152, 58,245, 92,196,200,214,185,
+202, 48,171,239,158,213,112, 34,231,106,120, 75, 45,108, 77,229, 45,148, 34,140,177,240,245,171,175,249,250,155,239,112,109,224,
+197,135, 47,112,214,112,104, 58,242,156,185,191,121,224,251,155, 91,174,250, 3,119,239,142,220, 31,103,198, 40, 36,156, 70,165,
+162,231,180, 6, 43, 45,247,120,205,208, 48, 26, 75, 61,231,172, 98,226, 5,195, 92,170, 70, 75,244,188, 76,146,112, 53,203,124,
+154, 31, 72, 93,195,191,254, 55,127,197,103,109,199,245,245, 39,140,146, 73, 37, 43,241,176,212, 38, 72, 10, 89,102,156, 61,111,
+102,198, 40,204, 37,214,180,181, 10,226, 17, 77,124,204, 11, 1,115,167, 65, 19,217, 1, 90,106, 2, 94, 29,119, 47,227,119,229,
+ 13, 83,169, 70,103, 23,185, 49,171, 39,238,220,171, 86,200, 75, 87,229,214,223,111, 85,192, 87,173, 45,105,185, 92,106,254,182,
+117,110, 49, 57,238, 44,109,117,191,106,158,238,194,203, 34,152,147, 31,232,210, 69,214,208, 7, 43,118,119,185,215,255, 92,168,
+ 66, 13, 22, 74,174, 10, 35, 86,193,193, 92,125,210,186, 71, 76, 18, 41,166,172,180,164, 66,161,241,129,198, 7,165, 55, 89, 75,
+142, 58,193, 8,190,229,162,191,160,111, 14, 56, 49, 76,211,128, 69,187,235,208,182, 24,107, 24, 6,101,119, 55, 53,219, 56,231,
+153,156, 35,173,215,199, 40, 38,245,170,135,208,208,132,158,166,233,235,169, 52, 48, 77, 3,243,168, 2, 42, 43,134,182,233,116,
+ 68,149, 19,165,204,136,196,213, 29, 96,173, 10,229, 52,236, 66,118, 31,190, 80, 72, 43,156,199, 57,175,251,220, 70,247,180, 57,
+203,163,148, 60,181,162, 24,103, 86, 30,185,149, 66,103,132, 99, 21,229,136,206,173, 40, 69,214, 78,116,173, 23,237,227,207,181,
+170,199,243,238, 51, 53,203,252,199,108,255,222,238, 18,167, 62,141,103,133,130, 20,150, 79,119,165,199,153,178,235,173,205, 89,
+135,111,118,210,115,169, 8,224,149,173,176, 72,244,204, 14, 70, 83,159, 49, 67,169, 26,137,165,248,144,117, 61,148, 41,213,230,
+105,223, 47,118, 31,135, 24, 33, 63, 72,217, 59,219, 13, 44,191,148,151,212, 42,199,156,244,112, 31,231, 25,140,195, 4,199,195,
+112,228,217,179,103,100,150, 40,206, 26, 94,178, 85, 62,235, 79, 77, 35,116,149, 85,144,242,132, 96,112, 57, 19,109,102,122,214,
+208,245,207, 49,111,222, 17, 68, 85,239,210,118,204, 41,227, 16, 46, 27,175,193, 63,177,168,136, 8, 7, 38,115,154, 6,230,152,
+116, 71,237, 2,217, 24,108, 19,200, 49,106,136,136,209, 28,113, 7,186,102, 10,142,143,174, 15, 52,222,208,183, 13,141, 55, 92,
+ 31, 90,156,129,113,200, 76, 69, 24, 99,197,127,198,140, 49,145, 67,223,242,209, 69,135, 41, 66,231, 91, 36, 69,210, 52, 32, 89,
+ 51,212, 53, 35,193, 98,178, 22,151,169, 22,209,161,109, 73,197, 50,166,172,194,174, 92, 35, 60,189,224,155,134, 76,169,124, 7,
+ 21,243, 81, 84, 57, 94,114,225,112, 56,168, 39,223, 90,154,208, 16, 99, 98, 60, 13,120,103,117,138, 6, 76,243,132, 53,190,230,
+ 53,104, 23,151,227,188, 65, 84,140,165, 13, 45,193, 7, 88,180, 52, 37, 65, 54, 56,171,255,251,226, 45, 31,198,204,148, 11,201,
+ 8,184, 90,160,212,204,115, 99, 45,182,113,116,151, 61,130,101,142,122,222, 52, 93,171,148,202, 24, 41, 57,114,125,217,171,222,
+166, 10,213,158,189,188,198, 88, 33,116,150,159,253,236, 35, 78,199,158,223,124,126,228,143,126,246, 9,239,110,110,120,247,250,
+ 43, 74, 30,249,248,163, 23, 60,220,223,240,255,252,235,207,120,251,230,123,198,225,196,221,195, 3,191,250,236,239,121,243,230,
+134,121,140, 12,247,119, 92,245, 13, 57, 24,158, 95, 95,113,232, 90,188, 85, 7, 77,153,103,164, 68,198, 73,199,231, 62,120,189,
+228,168, 62,248,106,111,116,206, 97,157, 35,230, 72,104, 27, 82,156,107, 58, 93,253,249, 85,175,186,212,206,215,186, 80,109,156,
+245,243,243,218, 57, 55,214, 84,108, 55, 88,167, 5,226,237, 48,241,234,187, 91,238,222,221,114,104, 3, 63,249,240, 37,215,215,
+ 87,228,148,248,246,155,215,124,243,197,183, 26,175,139,231,179,223,126,207, 52,213,221,180, 8, 83,169,185, 23,168, 13,174,102,
+ 90,107,190,198, 50, 93,174,119, 85, 65,240,141,215, 96,171,152,241, 14,218,198, 83,138, 22,172,207,159, 95,209, 53,150, 79, 94,
+126,192,112,115, 75,156, 79,124,240,236,154,121, 46,220,142,134, 99, 22,146,181,117, 45,170,124, 3,113,142,211, 20,215,113,191,
+110,104, 44, 99,170,201,158,232,170, 76,170,146, 29,244,103,148,113, 53,107, 97, 59, 87, 77,213, 36, 44,106, 50,169,106, 94,127,
+ 46,229,121, 60,146, 52, 27, 49,110,119, 24, 47,221,146,152, 82, 15, 74,139, 60, 26,123,111, 60,239,154, 36,195,178, 79, 45,154,
+215,109,159,202, 74,251, 17, 92,232,163,224,140,115,194,215,182,112, 88, 58,169,125,183,109,246,195,135,245,255,217,181,165, 91,
+133,126, 82,176, 89, 86, 42,215,146,119,172, 65, 3,126, 29, 15,149,202,218, 13, 62,112,232, 15, 28,250,131,230,236, 78, 51, 37,
+234,238,243,112,113,137,111, 60,227, 60,145, 83,194, 27,165, 52, 25, 10,113, 30,245, 69,119,154,226,150,165,224,124, 67, 8, 13,
+161,105,240, 94,179,177,199,147, 48, 12,170, 54,109,131,163, 13,158,198,219,106,137, 83,244,236, 34, 72,172, 65,134, 42,156, 90,
+108, 46,118,211, 42, 72,169,194,191,154,158,100, 44,180,125, 75,223, 54,204, 67,229,215, 47, 1, 45,102, 71, 89, 91,198,210,162,
+254, 95, 91, 47,124, 41,250,251, 72,165, 27, 89,217,113,215,139, 89,161, 17, 11,174,116, 31,164,178, 60,109, 89,100, 83,155,214,
+221,229, 50,166,151, 61,107,125, 55, 34,183,178,137, 48,247,126,115,150,201,207,218, 77,115,174,165, 88,145,199, 85, 40, 41, 79,
+217, 43,119, 33, 44,121,155, 86,101,246, 25,239, 11,164,233,199,159, 93, 83,179,159,237, 99,170,225,153,104,244,125,103,201,194,
+ 61, 8,162,187,180,156, 11, 15,195,192,197,161,199, 88,237, 34,219,174,227,120, 28,200, 49,157, 7,216,239, 95, 5, 49,228, 41,
+210,245, 61,216,192, 24, 35,141, 24,198, 12,183,211, 68,247,233, 79,137,227,132,153, 51, 99,126, 32, 99, 41, 38,130, 41, 74, 49,
+ 44, 26,110, 34,198,114,204,145, 83,156,170,150, 66,195, 81,196, 26, 82,201,184,172, 1, 27, 37,101,130,129, 67,215,113,209,119,
+ 92,116, 45,109,125, 86, 77,201,180,174,208,133,128,149, 77, 59, 48,140, 35,121, 39,130, 77,211,140, 80,232,250, 14,135,165, 49,
+154, 93, 29,188, 2, 79,140, 44,211, 8, 75,219,182,148, 41, 18, 92,141,127,173,132,187,182,107,137, 69,177,164,243, 60,115, 56,
+ 28, 20,130,211, 31, 24, 78, 19, 93,119, 96, 24, 7,154,106, 15, 77, 20,142,199, 7,124, 19,184,232,123,198,105, 90, 73,114,234,
+ 57, 47, 92, 94, 94,106,163,146,102,226, 56,211,180,170,136,247,206, 86, 33,151,254, 94,173,213,117, 2, 56, 93,145,121, 91,115,
+ 34, 84,245, 31, 83, 98,156, 19, 15,195, 72,198, 18,218, 14,172,197, 22, 85,222, 59,107,153,230,153, 16, 26, 14,253, 5, 93,127,
+224,238,225,158, 92,102, 94,188,184,224,159,253,225, 31,242,112,127,207,171,111, 3,125,223,242,179,159,255,140,148, 51,215, 87,
+ 29,222, 59, 62,248,232, 3,254,230,111,255,134, 82, 18, 63,253,244,167, 60, 60,220,243,219, 47,190,224,217,213, 53,223,189,121,
+195,255,242,191,255,111,252,252,103,191,207,195,253, 3,167,135,129,255,233, 95,254,143,244, 93,199, 56, 12,152, 92,248,230,183,
+ 95,112,209,247, 92,116, 45, 31, 60,187, 98, 60, 30, 85, 44, 39,133, 52,205, 56, 67, 93, 49, 56,166, 73,113,184, 57, 37,125,111,
+139,212,201,237,130, 60, 78, 20,167, 22, 95, 31,194,138,249, 53,133,202, 79,216,208,205,202, 4, 73, 88,231, 85,159, 36, 82,247,
+235,158,182, 11, 56,223,224,187, 3,197,182,124,251,246,129,175, 95,189,102,142,194,139,171, 75, 62,254,248, 39, 4,223,240,237,
+ 55,223, 50,156, 38, 94,191,126,203,187,219, 7,154,230, 64,119,184,226,213,205,145, 57, 9,221,225,160,122, 1, 35,149,200,231,
+ 54, 54, 73, 29,183,151, 82, 40, 6, 98, 78, 43, 63,160,241, 94,173,125,142,245, 92,116,235, 52,210,210,134,192,195,253, 61,151,
+ 93,199,193,121,158, 95, 63,227,251, 55,119,220,221,223, 51,141,137, 8, 24,111, 87,252,182, 58,128, 52,166, 91,245, 4,218,245,
+ 47, 54,181, 82,215,131, 2,216, 82,214,102, 99,117,225,236, 5,233, 98, 43,181,117, 1,129, 41,133,212,111,167,218, 6,156, 57,
+ 15,217,220,237, 61,165,108,244,183,157, 80,200, 60,146,182,239,109,104,171,207,221, 84,214,182,252,211, 16,162,143, 59,155,167,
+ 66, 97, 86,186,215, 89,184,136,249, 17,182,248,102,243, 17,179, 93, 48,219, 28, 68,103,190,154,126,180, 9,142,124, 8, 58, 90,
+154,230,245,162, 55, 34,180,109, 67,219, 52,136,136, 6, 96,196,132,111, 2,125,127,160,109, 59,178, 36,230,113,164,164,168,123,
+242, 82, 84, 92,151, 34,182,209,220,225,152, 18, 66,245, 96, 86,192,141, 49, 26, 17, 57,140, 19, 57, 21, 14, 77,195,161,241,120,
+167, 99,178,146,166,170, 54,174,108, 69,217,138,155,178,208,201,234,197,152,151,139,185,212,236,237,172, 23,186,119,250, 18,118,
+109,224, 52, 39,245, 34, 87,209,218,130,165,149, 34,152,160,225, 1,190,142,195,189, 57,247,254, 75,141, 4, 93,198, 65,203,196,
+197,236,193, 49, 5,246, 94, 53, 49,219,192,123, 25,163, 27, 35, 72, 54,171,104,115,209, 94, 60,250,176,215,180,167, 53,195,124,
+153, 2,152,173,130,205, 43, 19,161, 10,241,204, 35, 28,146,236, 60,242,230,177, 45,109, 55, 57,216, 49,227,247,226, 60,179, 92,
+236,143,116,125,242,136,113, 36,108,110,138,213,103,127,182,217, 50,187,126,127, 81,212,233, 88, 50,141, 51, 49,105,146,223,112,
+ 84, 26,153, 53,142,227,105,226,249,243, 23,164,124,170,138, 87,179, 65,120,170,176,104,111, 11, 45,195, 72,211,181,136,133,113,
+142,132,226,248,254, 56,112,114,134,111, 31,238,249,236,205, 91,190, 24, 50,247, 49,115,140, 51,209, 26,162,181, 76, 2, 15,121,
+224, 84, 10,147, 1,241,141, 38,106,213, 81,119,138, 19,222, 41, 48,195, 55,158,195, 33,112,125,209,115,209,245, 75, 6, 8, 70,
+ 82,237,226, 10,141, 85, 49,167,160,124,244, 41, 70,166,121, 86, 40,147,245,136,213,200,211, 34, 89,105, 93,214,147, 76,170,246,
+ 76,139,201,145,198, 7,188, 49,180,141,103,152, 18, 22, 45, 64,164,166,136, 57,163,122,152, 20,179, 54,203, 37, 51, 79,147, 70,
+148, 86,239,248,225,112,201, 28,147, 62,203,213,110, 69,181,203, 29,186, 70,247,196,185,128, 20,218,182, 33,198, 72,140,177,170,
+183,161, 9, 30,138,208,134,160,226,212, 90,176,174,212,185,162,127, 15,189,230,109, 59,239,215,220,116,113,134, 49,206,204,165,
+224,219, 22,235,213,107,220,250, 78,249,242, 78,147,193,154,182,225, 23,191,247, 9,151,207,159,113,123,127,199, 87, 95,101, 94,
+ 62,235,249,253,159,125,204,195,177,231,208, 25,110,222,189,229,207,254,236,223,229,219, 87,223,114,113, 25,248,155,191,249, 91,
+ 62,250,248, 37, 34,153, 95,254,242,223,240, 39,127,242,167, 28, 79, 51,191,250,187,191,228,195, 15, 62,164,136,229,243,207,191,
+228,221,205, 29,222, 58,130,177,164, 97,100, 78,170, 91,184,188,184,210, 2,180,134,115, 5,106, 98, 95,209,169,102, 26, 71, 92,
+219,110, 46, 17, 50,113,158,201,214, 16, 26,229,179, 47,243, 43, 91,135,174,211,112,210, 98,205, 24, 82, 84,156,172, 53,106,227,
+125, 12, 43,179, 21,150, 21,156,195, 81, 8, 24,218,182,163,233,123, 76,215, 50,137,231,213,171, 27,222,188,187, 81,142,137, 49,
+204,177,240,229,215,223,112,209,181, 4,239,185, 31, 34, 55,199,200,105,182,140, 69, 56,149,153,104, 60,217, 22,138,211,145,123,
+206, 89, 17,171, 41, 86, 61, 85,169,153, 71,149,158, 87, 87,132,172,226,216,138,237,206,153,165,206, 79, 57,114,117,125,201, 52,
+ 76,156, 76,164,247,158, 49, 39,186,222,114,125,125,201,241, 97,100,206,142, 60,103,196, 57,210,186,151,175,220,127, 84,148,104,
+178, 84, 55, 80, 94,207,197, 37,216, 74,113,201,230, 44,195, 98,157,188, 46, 13,243, 26,168,179, 3,164, 27,131, 63,159, 3,154,
+247,243,202,215,147,170,108,151,249,126, 15,105, 30, 9,135,100, 39, 98,218, 93,196,203, 37,233,140,253, 39, 39,119,253,144,149,
+104,191,246, 95, 52,125,118, 31, 7, 43, 63,204, 31,223,243,238,182, 80, 16,187, 27, 1,171,133, 34,149,234, 49,183,170, 60,223,
+126,144, 58,198, 13,193,211, 54, 30,131,104,120, 66, 86, 6,119,211,116,132,182,165,148,194, 52, 77, 21,161,105, 9, 22,172,100,
+114,154,241, 70, 95,128,152, 51, 83,138,244,125, 75,219,245,184, 58,146,154,166,145,113, 28,200, 57,209,181,129,206, 27, 60,137,
+ 50, 13, 80,180, 59, 89,210,149, 20, 48, 82,214,139,214,219,109, 77,146,170,168, 68,119, 86,218, 29,121,235,170,138,188,144,162,
+ 42,121,131,119,164, 28,215, 11,185,236, 49,106, 75,176, 66, 61,168,247, 30,237,101,111,169, 58, 4,251,168, 12,220, 37,176,237,
+ 0, 71, 98,247,209, 98,122, 32, 47,117,159, 90, 53, 42, 55,125,177,146, 47, 97, 53, 75,182,107,217, 32, 49,171,221,109, 23,228,
+ 34,123,100,171, 89,233,217,143,180, 32,118,157, 8,108, 42,122,195,227,169,213, 82, 98,240, 40, 5,206, 84, 27,220, 15,234, 58,
+204,242,115,172,223,196,163,100, 65,115, 70,195, 51, 91,113,106, 52, 4,196, 90,253, 76, 99,142, 52,226,201, 25, 78,131,230, 94,
+207,115,174, 57,203, 13,243,120,220,172,127,236,181, 3,117, 32, 87,247,162,185,122,148,135,148,113, 24,126,123,115,195,169,237,
+248,187,251,123,254,223,239,111,248, 34, 27,230,166, 37, 89,203, 28,163,134,180,228,162, 54, 49, 99, 41,222, 32,113,166,113,142,
+ 38, 88,154,160,207,121, 31,172, 38,136, 57, 75,223, 6,181,174,197, 84,199,207,172,202,101, 95,243,178,157,247, 76,115,226, 52,
+233,133, 46, 21,242,209, 4,207, 92, 53, 0,177, 68,245,126,155,154, 90,150, 19,125, 27,112, 56,154, 16,232,154,166,102, 31, 64,
+ 27, 60, 9,131, 15,158,135, 97, 32,131, 6,160, 88,171,138,251,221,207,164,212, 29,252,195,195,195, 10,188, 50, 69, 3,104, 28,
+ 6,239, 3,195,105, 80, 23, 66, 41,132, 38, 48,167,136, 15,142,121, 26,144,162,249,244, 87,135, 11,221, 5,167, 84,245, 23, 42,
+222,242,214,208,132,138,150,173, 89,230,206,170,235, 37,139,174, 49,176,142, 88,127,239,139,235, 3,253,225,130, 57, 77, 56, 11,
+ 23,109,167, 98,217, 38,112,121,117,193,191,243,199,159,242,242, 39, 31,115,115,127,199,243,235,134, 47,191,252,146,203,203,150,
+ 55,111,191,229,226,170,231,175,255,230, 11,238,238,223, 17,243,204,183,175,190,230,171,175,191, 34,229,194,205,219, 91, 94,125,
+251, 61,243,248,151,140,195,196,241,254,129, 18, 19, 93,104,184,108, 59,134,187,123, 14, 93, 71,223,182,196,148,112, 37, 19, 79,
+ 17,215,181, 96,181,144,247,206, 50,220,159,116,239, 91, 84,245,157,221, 46,209, 45, 87, 97,117, 93,245,197,121, 82,170, 91,237,
+ 70,173,181, 20,163,174,160, 82,138, 22, 69,138, 19, 5,187,100, 73,236,210, 24, 22,208, 86,206,100,132, 16, 28, 62,120,218,190,
+ 71,156,231,148, 10,239,222,126,207,195,241, 68, 22,181,222, 6, 39,116, 93,143,183,194,195,195,192, 52, 71,198, 4,183,247, 19,
+ 15, 67, 2, 91,232, 15,150,236, 2,169, 36,142,243, 76,104, 28, 89, 4,235,124, 13,241,218, 80,196,139,253, 57, 39,221, 96, 75,
+ 73, 56, 87,153, 38, 94, 9,158,174, 78,250,186,198, 33, 41, 34,100,226,100,104,140, 69,172, 35,149,194,231,159,127, 78,211, 92,
+ 82, 68,215, 86,130,230,161, 99, 32, 97,177,171, 16,184, 90, 64,173, 22,124,212, 11, 61,203,249,181,187, 95,215,137,148, 93,179,
+179, 88, 86, 75, 45, 24,150,110, 94,182,232,213,178, 4, 80,236, 58,109, 35,231,244, 46,121, 36, 44,122, 60,126, 52,236, 58, 29,
+ 99,214,250, 97, 17,174,237, 99, 54, 87, 85,250, 63,241, 98,127,250,240,220, 46,246,229,178,149, 71,107,132,125,167, 95,118,217,
+240,123, 65,151, 49, 27, 86,214, 86, 13,193,234,241,174,151,186,170,221, 75, 13, 78,113,180, 62,224, 48,196,121,214,139, 6, 75,
+232, 90,154,118, 17,190, 69,134,211, 17,201, 51, 33,120, 28,130,228, 72,137, 99, 37, 45, 25,230,148,177,198,209,247,151,116,237,
+ 5, 24,221, 71,157,142,247,148,156,232, 91, 71,107, 51,196,137,148, 71, 76,137,234, 69,151, 58, 66, 55, 32, 57, 98, 81,250,210,
+ 62, 9, 45,197, 74,185, 51,154,150, 36, 11,160,162,134,117,140,211, 64, 11,132,238, 64,112, 16,237,246,217, 52,214,129,147,186,
+199, 44,187, 56,211,243,139, 92,100, 71, 75, 53,251,233,206, 15, 67, 87,182,132,180, 45,244,100,241,150, 23,100, 71,142,171,159,
+100,217, 61,226,251,148,190,221,106,218,236, 11,203,189, 26,189,108, 33, 69,123,140,112, 70,158, 48, 65, 62, 70, 15, 47,134,206,
+237,197, 87,114,155,252, 14,119,134,172,123,250, 37, 38, 87,118,156,252,247, 18,221, 96, 71,217, 91,222,177,250,179, 46,234, 61,
+215,226,160,230,129, 99,120,120, 24,104,187,158, 92, 78,155, 31,125,157,152,153,181,192, 73, 73,127, 61,143, 35,161, 8, 56, 77,
+122,250,126,158,120, 53, 28,249,228,223,254, 99,120,123,143, 19,203,148,148, 30, 39,206,144,114, 34, 4, 79,239, 26, 92,240,136,
+ 83, 21,115,235, 28, 33,248, 53,214,211, 27,221, 27, 31,186, 22, 68, 35,131,173,213,209,162, 10,167,188,166,108, 89,149, 83, 72,
+ 42, 28,199, 73,133, 65,227,140, 55,150,190,146, 23, 83,212,209,174, 32,186,199, 94,147,192,124,229,197, 27,156, 55,181,123,158,
+105,131,199, 58,136, 34,186, 18, 52, 90,196, 72, 73, 80,244,211, 41,136,102, 5, 84,142,185,171,180, 57, 99, 84,181, 46, 5,154,
+ 38,212,248,228,188,179, 45,214,252,240,122, 78, 93, 28,122,230,121,162, 9,158, 56,141, 52,109,131, 90,199,149,239,160,205,186,
+163,107, 3,185,184,250,231, 88,244, 73, 5,196, 98,189, 93,167, 61, 23, 23, 61, 31,127,244, 33, 87,207,174,201,146,200,105, 34,
+ 77, 19, 30,143,180,142,182,247,220,223,191,229,167,191,248, 9,151,210, 50,199,200,183,223,190,230, 87,127,247,247,220, 63,220,
+ 51, 76, 19,239,238,142,252,119,255,226,191,167,105, 26, 94,189,254,142,155,155, 59,222,190,185,163,107,122, 90, 27,120,251,205,
+107,174,174, 46,184,106, 2,121,158,232,155, 6, 95,163,163,211,195, 81,221, 60, 70,148,130,103, 13, 37, 69, 10,133,182, 13,148,
+146,104, 26,175,214,216,146, 25,134, 83,181,237, 90,230,105,174,216, 86,187, 2, 80, 82, 76,170, 80,183, 16,156,186, 44,172,217,
+130,186,116,154,225,234, 78,221,214,105,161,172, 81,215,165, 44, 64, 26, 21, 87,251,166,161, 56,199,152, 10, 49,142,188,126,251,
+ 6,193, 16,124,131, 1, 78,199,129, 23,207, 46, 56,158, 6,190,191,125,135, 17, 97,142,153, 49,193,113, 76,196, 98,201, 37, 19,
+143, 15,170,131, 8, 10,223,137,177,168, 77,218, 24, 40, 14,183,238,254,148,124, 39,139,170,172, 34,122, 83, 54, 72,112,164, 18,
+ 41, 41,211, 56,109,206, 16,225,250,226, 64,219, 56,198,168,161, 62,193, 55, 60, 28,111, 49, 18,152, 37,241,229,119,183, 76,198,
+144,140, 37,147,235,106,120,129, 69,149, 21, 24,229,168, 80,153, 37, 13,111,119, 46,218, 37, 30,186, 40,136,237,156,145,181,185,
+126,164, 10,153,150,223,215,239,189,182,178,219, 77,111,121,221, 21,226,178,200,147, 68,216, 64, 76,230,253, 0, 11,161, 6,166,
+152, 21,253,186,170, 66,235,158,122, 11,220,248,113,239,249, 15,102, 98,139, 89,131, 44,206,196,197,214, 60, 25, 62, 35,103, 23,
+182,108, 8,213, 61,220,100,217,243, 22, 77,227,177, 24,154,208,210,134,160,223, 73,206, 4,175, 15,102,168,190,113, 41,133,146,
+171, 55,208, 55, 42, 30,204,137,148, 35,227, 56,168, 42,184, 36, 29,223, 24, 71,137, 83, 13,110, 81, 40,131, 20,225,112,113,224,
+208,245,184,154, 38, 21,199, 1,147, 35,173, 51,144, 7,210, 60,225,115,194, 25,205,241,213,244,184,138,160, 51, 9,231,212, 99,
+238,156, 89,227, 93, 75,141, 77,196,232, 22,124, 73,138, 66, 10,198,234, 75, 88, 68,119, 55,174, 34,105,189,213,127,175,181, 48,
+ 45, 7,182,173, 36, 66,163,184, 89, 49, 22, 49,121,167,133, 56,183,128,253, 56,160,232,124, 60,173, 15,241, 57, 98,181,156,177,
+248,229,233,152,220,197,255,189,143,134,145, 93, 57, 33,238,189,100,181,125,210,219, 30,116,180,159,221, 24,115,206,129, 95,190,
+254, 42,214,171,241,150,219,226, 90,158,164,215,109, 36,206,223,101,202,220,167,195,153, 51,144,205,202,222, 17,136, 73, 87, 8,
+ 99,137, 42,252,178,138,126,245,141,134,253, 40,110,115,191, 50, 43,231,161, 57,178, 8,110,212,189, 17,139, 99, 76,134, 95,253,
+250, 55,252,183,255,205,127,197, 7, 63,249,136,223,220,188, 99, 74,137,185, 20,134, 42,204, 27,199,153,152, 50, 83,154,152,115,
+210,255,125,142,122,225,229,172,209,171,222,225,109,163, 86,185,164,233,135, 74, 92,180,132,208,144, 82, 36, 77,202,144, 55, 86,
+200,243, 72,206,162,214,205,162, 69,210,213,161,175,201, 92, 48,215, 24, 80, 31,220, 74, 70,116, 86, 32, 43, 81,206, 24, 33,167,
+136, 51,202,224,246, 33,112,124, 56,130,115,180, 77,224,225,221, 29,222,122, 93,105, 73,193,121, 79, 78,153,224,131,122,237,173,
+229,254,254,161,142,197, 67,221, 13, 79,122,217,131, 58, 86,234, 46,157, 82,180,227,174, 58,146, 54,120,245,228,163,132, 71,215,
+120, 21, 41,213,175,211,182,202, 59,215, 4, 59, 37,199, 77,211, 72, 27, 26,178,104, 71,219,135, 22,111, 44, 93,119, 32,132,192,
+ 52, 78,100, 41, 76, 83,196,137,165,237, 90,222,188,125, 77,185, 61,241,175,254,213,255,193, 41, 42,205,236,151,191,252, 21,119,
+247, 35,255,195,191,252,159,185,122,118,205,233,116, 98, 24,103, 94,189,250,140,231,207,159, 83,138, 16,124,207,253,187, 59, 90,
+219, 98, 82,228, 16, 28,243,221,173, 70, 48, 91, 67, 62, 30,105,157,215, 29,250, 60,144,227,192,229,229, 37,211, 52,233,247, 60,
+171,251, 34,229, 88,121, 8,154, 52,151,170,125, 54,229, 76,206, 35, 82,137,135,214,250,154, 12,167,186,158,105,158, 9, 21,249,
+ 90,202,146, 79, 80,209,199,117, 98,136,161, 22,154, 5,156, 95, 69,168,118, 21,189, 58, 93,187, 56,229, 8,220,222,222, 51,197,
+ 17, 1,250,190,227,227,143, 62,230, 55,191,254, 28,131,112,127,119,207,241, 93,225, 16, 26,218,166,227,244,112,207,152, 5,219,
+116,204, 15, 3, 24,209,239,197, 83, 3,115, 20,252, 83,196, 82, 82,181,252,150, 92, 99, 97,195,186,154,181,182, 78,241,234, 94,
+ 59, 22,200,166, 84,213,123,169, 77, 91,198,218, 66,219, 52, 52,221, 37,146, 45,119,119, 71, 26,103,152, 50,124,245,205, 27, 30,
+102,167,233,129, 86, 61,228,190,138,222,138,168,237, 81, 86,205,153,146, 3, 75,150,205,125, 37,165, 18, 34,151, 9,230,214, 57,
+109,129, 84, 53,106,103, 97, 80, 47, 19,169,146,241, 91,174,170,108,144,106,179,100,148,155, 51,171,146,156,117, 50,230,108,124,
+178, 16,196, 12,254,220,191, 99,228, 7, 10, 0, 57, 15,251,224,169,144, 22,243,164, 3,125,185,184,109, 29,149, 47,177,168,246,
+177,149,237, 7, 58, 41, 29, 43,149, 45, 99,123,229,129,171,125,129, 82,176,222,209,120,181,186,229,146,215, 92,224,178, 38, 15,
+ 85, 26,220, 34, 90,176,122, 45,205,113, 34,166, 68,140, 19, 57, 71,108,209,232,204, 82,162,254,247, 42,214, 40, 57,209,216,134,
+203,190,199, 27, 75,142,138,160, 37, 71, 28,153, 18, 39,200, 3, 14,197, 43,218,149,164,175, 35, 50, 29,238, 24, 29,237, 7, 85,
+113,164, 82,149,146,165, 40, 75,184, 40,161,202, 89,187,190,160,101,138, 85, 20,104, 72, 89,112, 73,129, 59,142, 92,187,203, 26,
+228, 32,138,233,116,245,215,196,250, 90, 8, 40,139, 91,235,170, 58,242, 41,194,239, 74, 52,217, 20,230,231,234,111,179,203, 5,
+223,227,220,246,228,180,243,130,110,215,205,179,219,205, 21,214,125,252,227, 73,210,166,132,215,191, 23,217,143,212,151,169,204,
+249,247, 96,140, 60,174, 11,206, 20,253,203,215,121,111,146, 84, 47,244, 34, 79, 92,250,200, 15,146,146,100,227,226,174,239,162,
+221,173, 51,114,169, 81,135,222,146,114,164,200, 81,133, 84,119,119,187,241,190,217, 49,239,119, 69, 87,113, 72,118,140,115,228,
+178,235,153,109,195,175,254,241, 43, 98,140,252,231,255,254,191,197, 31,127,247, 45,111,222, 62,240,221,237, 29,239, 70,195,235,
+155, 59,200,145, 56,142, 4,103,177, 65,241, 60,190, 24,172,113, 68, 11,214,121,157, 44, 85,207,183,243,129, 28,149, 65,237,157,
+ 99,174,100, 54,235,116,164, 15,162,151, 37,144,107,224, 72,127,232,184,236, 90,230,169,144,187, 6,155, 11, 65,194,134,106,206,
+ 17, 91,179,199,188, 53, 92,116, 29, 93, 8,154,119, 39, 26, 5,220,132,134, 40,165, 94,176,172,116,199,195,225,192,156, 18, 34,
+105,229,112,228, 44, 4,175,158,255, 56, 37, 66,211,114,113,232, 56, 30,143, 53,229, 46, 86,139,170,171,107, 23,189,144,230, 73,
+163, 79, 67,215,224,125, 77,109, 76,165, 2,181,160,241, 14,139, 16,154,128, 0,167, 97, 0,177, 21, 40,178,217, 37,211, 52, 17,
+156,227,205,235,239,121,247,112,228,112,121,137, 24,207,195,253,131,174, 20,140,101, 26, 7,134,113, 32,127,249, 61, 95,189,186,
+227,217,203, 23,204,115,100, 24, 53,159,254, 56,204,244,125, 15, 18,104, 92,207,215, 95,188,226,162, 63, 16,227,196, 69,219,113,
+188,187,197,145,105,157,231,250,112, 96, 28, 70,250,166,103,158, 70,138, 81,238, 1, 20, 66,208,228,180, 34,162, 43,147, 42, 2,
+246, 65,173,125,135,174, 91, 47,244,113, 28,149, 74, 25, 26,124,211,146, 98, 92,131,107, 64,207, 3, 91,199,200,169, 20,188,215,
+226,136, 82,214,233,210, 18,198,228,188, 95,125,252,166,146,162, 74,213,106,101, 81,246,192,195,148,184, 63, 30,137,113,162,105,
+ 60,109,104, 56, 61, 12,124,113,250,146,148,178,198, 74,119, 29,101, 78,220, 15,153,155,135, 35, 49, 27,230, 92, 16,147,176,222,
+ 83, 82, 36,184, 6,193, 48,214,231,206,212,236,136, 82, 39,171, 66,205, 52,152, 39, 76, 61,215,115,165, 61,218,117, 53, 88,187,
+229, 10, 52,154,178,174, 51,147,192, 24, 19,253, 69,207, 56, 71,174, 47, 46,113, 20,190,251,254, 27, 94,124,244, 41, 55,223,222,
+169, 29,186,100,156,236,135,120, 59,210, 35,103, 67, 72,245,162,239,146, 41,235,141,190, 78, 56,228, 81,230,243, 94,155,180, 52,
+ 20,214,216,165, 83,151,179, 49,251,123,113,147,203,224,114, 39,110, 56,195,206,217, 31,184,184,159,226,180, 23,249,129,196, 53,
+121,226, 82, 48,143,240,160,143,254,157, 29,188, 68,187, 30,187,237,214,159,136, 97, 45, 21,209,119,198,237,174,214, 38,187, 83,
+ 42,219, 42, 90,113,214, 32, 57, 35,185,208,120, 79,202, 81,213,160, 53, 46, 54, 39,189,212, 67, 8, 74,162,147, 72, 74,145, 56,
+ 39, 29,255,164,153, 96, 74, 13,114, 41,107,173,147,171, 40,171,107, 61,141,179,228, 52,147, 74,221, 41,165, 19,146, 38,144, 72,
+ 35, 66,227,108, 29,195,104,252,169,179, 6,239, 12, 1, 8,206,210, 54, 45,214, 25, 82, 73,204, 57,107,186, 79, 44, 76,201, 80,
+112,184,170,118, 39, 41, 97, 73, 42,196,160,160,151,127,202,121,221, 59,107,140,174,199,161,197, 76,145, 82, 27, 63, 85, 65,231,
+122,169, 23,161,242,135, 31,119,189,230,189, 75,252,177, 64,227,204,203, 93, 45,105,155,219,122,201, 30,168,194, 57,121, 63,229,
+207,200, 70,138, 95,215, 61, 70, 7, 91,139,155, 97,251,218,230,252,171,175, 95,220,238,245, 39, 59,242,252,254, 18, 63, 87, 6,
+236, 9,110,250,183,242,131, 81,193,171,206,192,154, 39, 28,111,242, 62, 89,225,189, 95,175, 62, 85, 83,214,100,187, 5, 87, 58,
+199, 76, 19, 60,167,211, 80, 1, 51,114,246,178,201, 46, 85,113,251, 99, 21,181,109, 26,203, 49,142, 92,116, 61,175,134,119,252,
+ 95,191,252, 91,254,235,255,242, 63,227,249,157,101,106,132, 83,103,184,155,102,108,168,133, 99,171, 48,140,156,181, 3, 15,149,
+196,134,117,235,238,175, 32,180,135, 11,238, 31,238,201,149,167,158, 83, 94,211,195,124, 48,149, 42,150,215,174, 25,107, 16, 87,
+150,120, 32, 60, 5, 83, 18,193, 41,132,201, 32,180, 77, 91,147,197,148,147, 16,140,165,177, 78,149,209,206,113,113,232, 24,139,
+ 96, 93,194,137,242,201,251, 92, 56, 77,170, 36,159, 82, 84,155,210, 10,133,209,157,112,215, 6,138,215,139, 36,165,153,241, 56,
+213, 52, 46,139,167,168, 87,217, 65,206,234,249, 47,200,150,142,230, 44,227, 56, 19,188,215,177,251,146,148, 88,241,204,211, 60,
+173,138,234, 84,167, 44,174, 82,214,230,121,194,184,128,179,234,229,190,127,247,192,253,148, 21, 39, 61, 79,235, 40,107,225, 27,
+ 8,134,155,155, 59,134, 41, 41,151,189,170,227,111,111,222,241,253,235,183,154, 83,158, 51,146,133,251,233,158,190,245,152, 38,
+227,200,216,154,197, 62,205,181, 11,143, 42,242,114, 86, 86,143,117,169, 43,215, 84,181, 64, 82,197, 98,227, 48,129,129,113,156,
+ 8,190,170,219,107,134,198, 52,143,148, 82,189,249,213,157,146, 82,162,109, 91,181,128, 26, 67,202,147, 18,244, 68,211, 39,149,
+245,190, 4,237,136, 2,149,156, 87, 39,116, 13,131, 41, 69,253,231,164,194,113,152, 25, 82,133,127, 25, 45,152,126,254,179, 63,
+224,139,223,124,206,195,253, 72, 8, 1,177,112,123,119, 84,135, 74,113,250,174,250,150, 73,198,106, 37,212, 70,202, 88,175,121,
+227,104,250, 93,204, 81, 59, 96,103,171,152,211,177,127, 69, 64, 53, 71, 98,132,148, 19, 41, 23,124,157, 26, 12,243,132,113,158,
+113,206,204, 73, 5,111, 31,126,240,140,241,238,150,171,254,146, 55,239,222,209, 58,120,246,236, 37,159,124,244, 9,159,253,230,
+123, 21, 72, 55, 1,178, 2,135,114,205,152, 55,187,196, 41,133, 22,233, 4,204,216, 69, 79,180,107,104,138,172,209,211,139,136,
+ 93, 19, 54,229,140,186,201,206, 49,228, 46,186,254, 47,148, 96,163, 30,237,117,159,183, 95,147, 26, 89,213,226,231, 65, 21,118,
+ 55, 60,180,187,157,250,102,233, 89, 58,151,179,240,149,250, 0,189,175,114,151, 93,138,154,221, 34, 52,247,165,201, 46,119,123,
+181,171,153,205,147,254,216,150,103,206,196,122,162,227,235,221,142,120, 47,149,179, 70,127,232,222, 64, 27, 84,105,187, 88,104,
+124,208,100,161, 69, 76,103, 81, 15,187, 49, 66,104, 54,127,120, 74,137, 88,242,138,133, 13,198,210,250, 26, 71, 41, 75,170,142,
+ 10,240,174, 46,175,240,193, 19, 99,212, 34, 96,210,177,152,177, 58,254, 14, 21, 0,179,140, 87, 12, 26,207,216, 54,134, 46,168,
+157,194, 59,221, 31,205,177,112,127,154, 25,230,204,152, 68,245,163, 54, 40, 95,191,170, 38,131,215,204,107,106,129, 52,231, 84,
+ 63,115,179,142,151,150, 46,105, 17, 12, 46, 69, 81,104, 59, 70, 44,119, 49,115,202, 66,174,188,216,125, 34,214,142,213,183,165,
+149,237, 70,245,170,175,176,143,220, 12,203,101,189,140,149, 30,113,221,164, 2,229,101,185, 76, 89,121,253,106,136,223,211,149,
+170, 82,221,156,167,192, 61,201, 28,220,233, 60,182,226, 97,107,223,229,189,239,199, 34,178,255,181,167, 59,245, 51, 46,187, 89,
+138,198,221, 63,107, 87,159,225,198, 81, 88, 68, 51,198,156,133, 30,153,250,253,173, 47,248, 66, 33, 43,218, 37,234,152, 52,213,
+154,192,156,175,162,234,123,107,107, 54, 0,100,140, 45,106,139, 48,106,177,137,199,123,254,147, 63,255, 83,122, 47,156, 30,110,
+ 57, 78, 35,167, 42, 96,203,185,212, 67, 90, 13,125,214,120, 82, 41,216,154,133, 80,150, 11, 83, 68, 51, 2,106,183,181,117,197,
+250,204,165,162,255,125, 73,229, 42,213, 41,210, 52,129,174,109,121,118,121,160, 9,122,169,148,221, 84,197, 59, 71,215,170, 63,
+218,228, 72, 31, 44,151,109, 67,227, 52, 86,184,136, 48,206, 51, 11, 18, 73, 5,161, 65, 1, 49, 86, 9,118,193,249,106,127,132,
+254,208, 81, 74,230,208,119,228, 26,119,187,120,199,109,157, 46, 4,239, 85,232,102, 44, 33,248,245,127,115, 78,137,124, 44,161,
+ 85, 78, 15, 96, 87, 19,199,108,253, 76, 67,211,232,148, 44,198,234,160,161, 10, 2,183,200, 83,193, 96,189,142,228,135,113,214,
+245, 93,181,147, 26, 3, 93,215,105, 64,135,179,148, 92, 56, 29, 7,134,211,145,187,219, 59,142,199, 19,113,142, 88,131,126, 62,
+ 69, 73,104,173, 87,157, 67, 41,106,255,203, 49,106, 83,226,155, 45,249,175,100, 92, 21,160,109,170,105,125,158,210,130,207, 69,
+ 89, 25,165, 44, 59, 96,214, 28, 15, 83, 69,111,101, 89,231,212, 61,153, 34,130,221, 58,173,157,162,118,197,243, 52, 43, 29,174,
+ 70, 65, 75,109, 6,150, 48, 29,140,134, 22,197,172,136,212,211, 56, 49, 76, 51,227, 52,147,114,230,208, 29,184,186,184,226,225,
+238, 8, 88,198,152, 24,135, 17, 22, 49, 91,213,155,228,234, 59, 31,102,157,144,106, 80,142,122,230,157,113,245, 71,187,172,246,
+204,154, 8,170,157,185, 37,120, 93, 35,236, 5,174,154,168, 87,237,165, 73, 49,183,203, 59, 81,144,250,117, 11,115, 46, 92, 94,
+246,180,141, 90, 48,167,225,200,241, 52,226,155,150,207,191,252,142,185,100,138, 49,234, 3, 95, 34,144,235, 10,122,217,149,171,
+115, 72,207,182, 92,214, 28,203,237, 92, 92,144,210, 70,125,233,203,100,249,188, 21, 94, 90, 28,253, 30,220, 69,123,249, 23, 82,
+ 67, 35, 22, 11,144,250,182,133, 98, 54,136, 73, 94,149,181,219,101,107,151, 36, 40,177,143,198,232,187, 17,162,181,239,227, 56,
+119, 9, 98, 43, 27,126, 57,196,150,195,206,186,154,109,107,214,106,111, 99,254,176,118, 47,166, 62,112, 44, 17,130,143,162, 85,
+ 31, 31,186,182,114,187, 69, 84,200, 98,173,134, 52,104, 40,133,122,201,131,245, 52, 33, 32,185, 96, 29, 53, 21, 72, 89,221,182,
+122,194, 23,156,172,113,166,162, 46, 75, 13,129,209, 42, 14, 81, 79,230,161,105,233,154,182,238,149,146,142,160,196,208,248,134,
+254,208, 35, 2,113,142, 72,206,164, 56, 97, 40, 56, 35,120,103,112,171,162, 84,199,224,193, 67,240,218,189, 7,163, 9, 78,115,
+154, 57, 77,145,251, 49, 51, 68, 72,120, 18, 86,145,157,182,106, 8,170,162,218, 58,187,243,223, 11,185,142,216,197,184,122,225,
+170, 98, 23, 49,168, 51, 88, 59, 26,235, 28,190, 59,112, 95,132,187, 84,136, 69,255, 25, 10,187,135,240,241,148, 70,167, 34, 43,
+180,104,177, 27, 62,226,164, 47,135,203, 98,135, 59,103,186,111, 69,195, 42, 34, 89, 71,213, 86,105,114,102, 11,126, 89, 5,115,
+ 98,207,166, 60,231,153,227,155,116,255, 28,184,179, 57, 54,222, 43, 78,118, 17,194,108, 16,167, 31, 10, 98,123,148, 26, 40,107,
+ 98,224,246, 13, 45,171,170,243,194,195, 60,230, 68,188, 55,233, 64,247,196, 69, 15, 23, 77,232, 42,171, 47,127,115, 2,232, 95,
+174,234, 88,140,243, 74, 43,116,224,173, 46,200, 90, 31,152,142,119,252,252,195,103,252,209,239,255,148,124, 58,169, 53, 76, 12,
+195,105,196,138,165, 24, 24,115, 2, 99,215,209,180,134,253, 36, 74, 74,202,246, 78,154, 71,174,123,236,188,176,255,200,197, 40,
+126,216, 88,124,232, 42, 3, 91, 15,215,254,186,199,119, 45, 41, 11,125,223,105, 74, 23,133,146, 74,165, 42,186,186,231, 46, 88,
+ 17,156,100, 46,187,150,139, 86,213,239,222, 55, 58, 25,171,107,160, 57,166, 53,211, 60,175,159,175,170,224, 23,127,240,225,226,
+176,238, 76,157,115,116, 77,127,230,210, 1,221,173, 42, 63,159, 10,149, 41,235,229,174, 81, 81,208,117, 77, 77,159,155, 53,203,
+219, 40, 6,218,183, 45, 25, 37,216,177,196,163,214,168, 90, 21,151,153,234,213, 86,237,202,161,235,160, 36,130,211, 75,217,136,
+193, 27,101,172,107, 7, 94, 19,247, 80,181,121,237,132,214,115,110,211, 9,233,247,240,236,217, 51,109, 14,114,161,105,186, 26,
+205,105,234,168,124,196,215,255, 92,138,208,132, 86,139,172, 74, 50,244,222,146, 75,205,147,168,177,217, 77,211, 48, 96,117,191,
+ 36, 0, 0, 32, 0, 73, 68, 65, 84, 78,115, 77,123,172, 23,185,232,232,122, 41,248,150, 32, 26,107,182, 63,158, 22,152,118, 93,
+135,232,168, 91,215, 71,122,238, 87, 97, 24,150, 57, 23,166, 88,184, 63, 13, 76,169, 80,112, 10,218,113,142, 23, 87,215, 60,191,
+184, 98, 28,103,222,222,223, 43,175,160, 9, 4,224,162,105, 8,190,209,124,132,162,177,213, 33, 56,197, 96,171,194, 84,155, 51,
+167, 19,210, 92,249,243,185,200,122,252, 88, 99,112,181, 72, 22, 17, 92,208,248,237,133, 58,168,214, 98,157, 78,142,243, 76, 22,
+ 72, 37,215, 32, 27, 91,127, 63, 56,222, 13, 56, 81,226,233,213,117,207,213,179, 75,102,113,124,254,213, 91,198, 82, 72, 11,220,
+101, 29,227, 87,170, 92,169,127,246, 82,139,210,165, 73,145,205, 67,164, 14, 3, 5,229,136,229,204,171,126,182, 26,204,101,157,
+ 52,136, 8,238,162,189,248, 11, 61,228,115, 21, 55,148,245,176, 93,173, 57,178,199,210,237, 65,242,203, 33,186,247,183,111,251,
+247,253, 1,189, 31,161,155,234, 51, 60,195, 43,154, 39,188,232,178, 9,135,140,177,107, 4,152,212,185, 0,123, 72,206,226, 11,
+254,157, 65,177,139,103, 94,214, 78,114,217,249,248,106,193, 9, 86,133, 58, 57, 38, 92, 5, 72,164,122,120,217,213,134,144,107,
+174,186,170, 71,115, 46,234, 69,173,123,141,224, 44,135,174,231,197,245,115,156, 83,210, 92,169, 73, 69,206, 58,218,166,197,123,
+229,104,151,164,170,197,146,162,242,135, 37,215,151,197,156,173, 33,172, 85, 82, 95, 41, 26,124, 49, 76,145, 83, 13, 39, 24,179,
+ 80,156, 39, 27, 67, 44,137, 84, 18, 38,168,154,116,249,125,204, 46, 68,193, 88,135,193, 49,199,172,233,115, 86, 65, 48,206, 88,
+ 13, 51, 96,163, 27, 25,231, 41,190,227, 33, 21, 78, 69,115,148,151,239, 19,163,254,157,197,205,176, 47,222,224, 60, 69,207, 88,
+ 45, 52,214,201,138,217,243,212,205,153, 80,108,233, 94,109, 21,140,236, 59,123, 83,227,224,222, 91,199,236, 96, 46,123,175,233,
+121,247,251, 88,152,198, 19,194, 77,217, 37,189,201,147,127, 89,126, 92,224,249,131,174, 13,243, 88,224, 41,155,117,110,217,141,
+237,254,251,249,180, 74,214,203,102, 9,181, 88, 45,122,235,215,221, 10,101, 29,217,154, 85, 72,233, 23,143,176,173, 59, 96, 83,
+136, 15,239,248,143,255,236, 79,232,211,145, 84,133,108, 5, 71, 50,150, 41,229,154, 80, 24,215,233,154, 49,134, 24,163,142,175,
+107,120,138,216, 26,240,211, 28, 72, 38, 64,232,233,174,159,227,251, 75,126,246, 71,127, 76,211,247,140,179,174,135, 76,219,144,
+172,112,154, 38,164, 24, 58,239, 56,180,142, 52, 43, 55,188,235, 90, 48, 74,211, 11,222, 97,164,224,141,112,209, 54,180,193,115,
+121,232, 81, 98,167,169,233,107,134, 97,154, 9, 77, 75, 42,153,152, 50,214,187,181,251, 86,138,165, 97, 24,116, 47,110, 87, 56,
+145, 90,236,226,218, 85,107,215,185,233, 26, 20, 62,162, 23,189,161,111,187, 42, 16,211, 88,100,107,181,248,119,174,102, 59, 84,
+209,147,114, 39,244,137,154,231,185,190,111,142,148, 11,243, 28, 41,160,127,175,171,192,182,109,170, 90, 94, 63, 63, 95,187,224,
+ 92, 5,184, 82, 22,136,145,221,105, 72, 42,255,160,104, 94,125,211,132,245, 34, 86, 17,172, 62, 31,193,123,134,211,160,184, 86,
+175, 2,194,121,154, 43, 48,199,236,138, 3,170,245,172,138,126,157, 39,173,145,185, 42,118, 91,158,197, 82, 53, 59,198,154,117,
+149,185, 20, 16, 90, 97,184, 26,157,234,170,125,185,206, 82,156, 37,229, 84,133,188, 48,165,204, 20, 19,195,156,234,133,175,111,
+ 84,219,182, 53, 74, 86, 56,157, 6,230,121,210, 48, 42, 81,171, 96,223,180,152,162,153, 21,169,230,157, 99,171,104,211, 55,213,
+ 53, 34,235,157, 52,205, 81,187,235, 21, 48,182, 9,114,157,221, 38, 53,214,235,247,152,139, 98,107,227, 28,137, 41,175, 77,246,
+226, 48, 41, 53,159, 35,198, 76,215,118, 72, 17, 98, 44, 60,220,159, 40, 24, 66,219, 96,252,129,175, 94,191,101, 42,203,118,122,
+ 3,112, 45, 18,223,197,182, 91, 51, 37,183,213,246,162,214,169,118, 94,121, 47,149, 74,182, 96,168, 29, 43,132,186, 30, 55,123,
+246,251,227,126,225,189, 14, 70,228,189,241,226,249,198,178, 60,218, 9, 10, 79, 81,227, 13,246,189, 14,234,241, 65, 39,251,160,
+138,189, 90,126,103,145, 48,203,110,126,159,251,254,187, 34, 98,183,158,111, 69, 2, 46,251,204, 45,237, 75,163,255, 68, 17, 63,
+ 56,171, 47,117,170, 47,171,181, 22, 49, 66, 38, 87,174, 58,117,212,168,187, 16,205, 7,246, 28,250,158, 23,151,207,104,189,231,
+120,255, 78,209,127,203, 40,165,126,111, 57,234,104, 51, 4, 45, 26,200, 25, 33,211, 52, 26,163, 42,213,139,104,106,101,151, 36,
+107, 44, 33,154, 66, 36, 98,136, 2, 5,175, 73,108,213,138, 17,171, 10,222,155,242, 94,103,158,164,208,248, 6,111, 20, 42, 51,
+165,204, 41,206,106, 37, 49,150, 82,244,193,147,218, 73, 90,107, 40,198, 49, 38,152,138, 37, 27, 91, 31,158,218, 9, 26,237,232,
+164,108,251,114,181,184,219, 77,149,109,182,135,115, 79, 29,116,139, 32,196, 60,242,182,155,109, 2, 80,106,216,194,118, 0,217,
+149,161,188,207,139,223, 95,102,118,181,204,149, 93,176,140,217,180,155,230, 41, 17, 31,251, 87,234, 61,177,220,251, 26,129,167,
+131, 92,206,158,227, 39,240,176,103,239, 21,242,158,124,110,129,199, 88,217,137,235,118,157,187,126, 79,231,251,181,101,194,102,
+118,250, 17, 83,119, 74,102,253,172,118, 74, 2,171,221,210, 92, 28,127,247,213, 43,254,207,191,250, 91,254,139,127,254,251,116,
+ 99, 70,238, 34,161, 63, 96,146,165,105, 10,110,206, 52,161,197,216, 68, 18,225, 56, 77,132, 78,199,141, 38,137,146,209, 66,203,
+203,235,103, 60, 68,193,133,142,166,109,249,238,205, 27, 62,252,232, 35,238, 79, 71,110,238,143,220, 28, 79, 90, 4,215,160,154,
+224, 44, 69, 44,243,194,166,175,218, 17,189, 4,245,157, 42, 57, 87,160,167, 90,168,148,167,238,193, 25,142,167, 35,214,123, 76,
+206,180, 93,199, 56,199, 21,171,233,156, 67, 82, 86,241,153,119, 56,169, 35,232, 24, 9, 93,139,119,202, 96, 79,185, 16,130,210,
+224,108,197,193,230,156,177,222,174,228,192,156, 34,214,168,165,181,109, 91, 82,138, 28,186, 86, 9,141, 41,169,159,218, 55,138,
+243,149,133, 8,168, 7,118, 8,106, 71, 27,199, 17,223, 52, 72, 84, 11, 93, 49,134,177, 90,195,230,121, 84,219, 29, 78, 87, 28,
+ 57, 17,231,169, 54, 28,186, 2,115, 70,170, 59,179,206,196,151, 85,140,213,160, 24,131,212, 16,149,132, 84,226, 91,206, 69, 67,
+120, 58,205, 79,119,198,208,118, 61,243, 56,114, 26, 71,156,179, 92, 94, 28, 16, 41,171,128,209,214, 66, 48,198, 88,181, 66,142,
+148, 51,105, 86,125, 68,223,118,136, 73, 85,143, 80, 21,221,213,122,105,164,104, 71, 90,182, 21,233, 18, 44, 21, 75,194,138,134,
+ 96, 25, 23, 72, 89,163, 66, 99,202,187,233,172,171, 97, 83,122,161,223, 13, 3, 77,157, 68, 4,103,240, 93,195, 69,223, 65,204,
+ 76, 81, 35,123,173,213,233,143,181,158, 24, 19, 41, 77,155,130, 60,107,104, 75, 70,214, 41,209,166,203, 90, 10,243,180, 53, 76,
+ 57,211,180, 1,103, 13,243, 20,193, 24,154,160, 36,198,109,143,168,239,205, 52, 69, 90,223, 48,140, 17,145,168,122, 5, 41,204,
+111,110,185, 59, 29,193,222, 51, 69,213, 39, 25,187, 49,238,183,100, 74,181, 74, 99, 84, 39,101,214,140,116, 30,101,102,236,214,
+198,108,169,152, 91,162,169, 89,223,234, 69,223, 98, 20, 62,179, 63,145,236,218,157,236, 71,147,214,218,141, 14,182, 63,180,138,
+169,126,195,167,174,207,141,243,171, 99, 34,253, 82,214,153,247, 60,187, 91,166,250, 19,221,206, 18,215,186,116,134, 75, 49,241,
+ 20, 97,142,189,218,254,220, 19,127,150, 60,183,231,105, 86,235, 80, 41, 5,217, 49, 61, 75, 29, 69, 53, 65, 3, 28, 98, 76,234,
+ 5,175, 35,109,157,150,108, 72, 90, 77,239, 17,156,209,236,242,103, 23, 7, 46,250,150, 56,197,154,143,173,126,199,165,186, 44,
+ 53,108, 34,132, 6,231,156, 2,108,200, 58, 66,218, 49,215, 23,176,140, 82,236,116, 20,175, 80, 14,237,170,115,133,249,175,123,
+228,101,239,154, 83, 29,115,109,209,168, 81, 4,151, 11,206,105, 22,182,142, 58, 61,228,196,156, 18,193, 54,250,176,217,197,183,
+ 95,125,168, 34,204, 5,141,151,169, 43, 17, 91, 21,242, 88, 83, 59, 13,115, 14, 74,120, 44,145, 91,199,226, 91,149,105,119, 10,
+ 50, 91, 20, 59, 44,108,120, 87,193,104,178,223, 35,101,119, 41,133,146, 99,213, 1,200, 74,211,179,103, 60, 4,115,166,209,216,
+111,161,246, 49,191,123, 82,220, 89, 29,137, 60, 49, 94,151,243, 20, 65,121,130,167,176, 43, 80,203, 89, 71,190, 20, 37,219,126,
+125,121, 49,247, 62,245, 39,102,241, 85, 68,195,186, 26,115,181,179,172, 89, 69, 90, 0,212,175,191, 4, 95,172, 2,209,138, 38,
+ 54, 34,107, 81,179, 56, 54, 38, 60,247, 52,252,139,255,245,255,230, 63,252,227, 63,228,240,252, 19,158,143,133, 50,141,220,158,
+ 78,116,206,112,217,180, 76, 57,147,172, 37,138, 96,250,158,230,226, 25,174,185,224,112,249,130,187,251, 17,219, 29,184,125, 56,
+113, 59,223,241,201,139,107,222,188,125,139,132,150,104, 13,217, 26,166,146, 25,210,204,161, 11, 24,155,171,192,204,209,218,134,
+139,203, 11,140,209,139,200,187,160,112,144, 37,109, 42,120,226, 48, 43,111, 59,103,186,174, 69, 12,140,211,196, 20,103,112,138,
+135,117,222, 97, 82, 66,114,166,109, 27,112,142,113, 60, 97,156, 70,168,206, 41, 34,120,124,141, 3, 53,162,128,149,148,106,113,
+ 81,139, 71,239,125,181,184,185, 85, 88,155,235, 24,220,218, 26,110, 84,181, 4, 75,116,168,113,150, 41,170, 18, 60, 37,253, 62,
+ 48, 48,103,205,147, 8,161, 97,170,240, 21, 91,195,118, 20,110,227,176, 69,104,172,231, 52, 78,196, 57,215,145,172,172,162, 88,
+ 61,231,237,142, 70, 88,211,196,170, 62, 70,119,223,117,207,189,100, 52, 88,213,254,244,125, 79,206, 9,231, 29, 86, 12,211,172,
+174,151, 80,127, 6,167,113,168,150, 65,131, 65, 67,167,108, 22,226, 56,105, 97,101,108,125, 95,243,250,243,200, 69, 35, 95,125,
+ 8,196,170,199,241,117, 92, 79,209, 9,230,194,100,178,214,146,139, 94,184,182, 56,166, 24,137,185, 32, 41,105,188,110,157,150,
+ 44,231,115, 19,130,234, 60,230,137, 38, 52, 4, 11, 14,161, 11,142, 16, 52,229, 83, 98, 34,206, 81,127,206,162,188,248, 34,137,
+ 28, 35,214,123,218,170, 49,241,222,115, 26, 6,181, 18, 98,215,226, 97,111,170,146,122, 6, 59,235,200,213,223,125, 26, 70, 93,
+ 69,228, 76,206, 16,140,163, 20,209,108,142,218,103,231,172,141,197,156, 84,229,239,219,160, 19,205, 52,115,125,232,193, 90,142,
+167,153,152,133,108, 52,163,193, 27,179,118,209, 98, 44, 70,117,203,245,108,114,107,134,251,227,169,182, 78,142,216,176,231,242,
+232,182,147,229,174, 98,213,239, 56,231,182,241,187,200,114,129,108,151,213,126,140,184, 23,243,172,221,198, 46, 76,227,169,132,
+183,243,131,107,219,129,255,144,144,205,214,139,125,237, 54,150, 61,120,141,108, 93,112,130, 11,217,172, 26, 15, 55,200,253, 18,
+216,178, 23,229,189,183,231, 92, 33,241, 85, 20,118,190, 99, 9,117, 76, 41,146,245,225,106,254,127,214,222,109, 73,146, 44, 59,
+207,251,215,218, 7,119,143,200,204,170,234,234,158, 19,160, 25,112, 64,144, 16, 32, 80, 38, 65,124, 7, 93,232, 5,244, 54,120,
+ 32,221,138,102,186,146,104,162,233, 70, 23, 50, 18, 6,145,162, 17,135, 1, 6,141,158,238,233,238,170,202,140,240,195, 62,233,
+ 98,173,189,125,123,100, 86, 79, 15,193,134,149, 97,166, 38, 59, 51, 35,194,221,247, 58,252,255,247,123,108,219,134,109, 91,101,
+ 76, 67,187,114, 84, 82,204,164, 90, 74,122,131, 57, 38,220, 79, 35,222,220,223, 99, 48, 6,219,188, 96,219, 22,228, 20, 17,162,
+ 28, 68,134, 25,214, 57, 21,112,136,136,101, 89,133,102,101,140,144,169, 74, 78,162,238,212,247,218,121,219,232, 67,169, 0, 37,
+ 11,248,194, 57,163, 55,102,214, 67, 77, 7, 16, 89,115,194,169, 75,247,233,188,142,226,221,149, 11, 59, 33, 35,134, 40, 65, 52,
+ 42,122,217, 17,249,140, 8,139,141, 29, 54,102,100, 99,100,164, 95,113,144, 68,173,192, 49, 85, 68,164,161, 27,220,253, 49,196,
+ 32, 35, 65, 8, 68, 80,100,164, 90, 39, 9, 34, 70, 82,198,178, 81, 2, 25, 27, 89,109,176,217,199,133,109,252, 89,181, 31, 37,
+ 35,231,186,207,221, 71,215,245,143,124,198, 69,172, 81,196,106,217,203,251,215,208, 11, 27,116,237,146, 88,179, 15, 72,243,149,
+141,238, 80, 9, 44, 19, 19,110,107,206, 3,182,182,173,120, 24,135,255,206, 26, 63,217,222, 19,102,253,158,199,191,175,218,144,
+138,183,149, 64, 16,232,122, 68, 51,215,213, 7,207, 29,124,167, 22, 43,242,125,250,144,165,210, 58,222,250,151, 18, 94, 35,133,
+236, 50, 95, 49,198, 5,127,242,207,126, 31,101,187, 34,167, 13, 33,110, 8, 33, 99, 43, 6,209,122,164,225, 30,167, 55, 63,134,
+ 57,189,129,127,248, 20, 75, 49,184, 70,224,146, 8,217, 13,120,127,185,226,205,219, 55,176,222, 96, 89,102, 76,211,136,105, 26,
+ 49, 14, 22,203,245, 17, 97,189, 96,242,140,201, 3,222, 51,206,211, 9,247,211, 29, 30,198, 17, 8,171,232,247,178,252,238,214,
+ 49,194,182,194,233, 78,220, 16,112, 30, 61,206,227, 8,102,194,227, 50, 3,108,192,222,225,186,108,141, 43, 46,131,183, 2,235,
+172,114,185,133,219,237,189, 83, 47,249,160, 48, 41,141,235, 32,180, 68,172,122,232, 86,165,190,179, 18, 84, 99,116, 81, 60,141,
+ 3, 66, 78, 48, 78, 14,242, 82, 10,172,151,123,216,123,223, 30,188, 49, 37,120, 63,180,231, 79,204,154,169,173, 92, 6, 50,130,
+142,221, 66,144,195, 16, 5,131, 31,177,109, 1,108,156, 52, 7, 90,196, 23, 18,100,117,189,103,123,152, 75,233, 10,147,251,251,
+123, 44,203, 34,137, 99, 4,156,166,147,168,215,189,131,243, 3, 74,201,194,202,207, 25,219,186,193, 15, 94,130,164, 66, 0,235,
+245, 71, 10, 27,139, 26, 46, 53, 40, 96, 7,196, 96, 54, 77,160, 9,181,119, 49,139, 16,112, 89, 54,148,172,118, 52,141, 65,169,
+250, 43, 57,116,129, 37, 38,172, 33,107,135, 14, 68,226, 93, 0,171, 83, 62,199,132,211, 56,201,225,206,132,201,123,156,198, 1,
+ 49,108, 64,138, 40, 49, 35,108, 27,114,214,228, 61, 84,207,187,232, 20, 98, 44, 88,194, 6, 54, 22,110, 24,229, 57,153,101, 26,
+ 67, 44,133, 91, 1, 53, 71, 79, 13,186, 50,214,180,198, 39,105, 17,199,198,200,180, 35, 23,108, 73, 92, 20,170, 75, 84,161,155,
+ 70,192,106,225,183,109, 58,205,217, 86,252,228,119,126, 7,239,222, 95, 48, 47, 81,154, 17,206,123, 39, 93,121,218,141,160,185,
+ 91, 89, 43, 90, 87,118, 75, 26, 89, 94,246,102, 5, 69,181, 12, 96,157,110,136,254, 0, 0, 72,181, 46, 53, 21,213,182,131, 89,
+231,117, 68,249,128,134, 61,116, 61,186, 63,151, 14, 32,119,149, 79,254,104,198,250,199, 7,149,189,151,182,118,120, 6,124,232,
+181, 36, 97,173, 98, 96, 89,108,176, 13,234,218,119,248,242, 94,149, 54, 57, 32, 42, 47,116,103,188,115,194,245, 27,147, 10, 62,
+228,223,237,247,193, 80, 24, 67,194, 22,130,136,178,152,117, 39,148,218,183, 32, 38, 85, 79,202, 65,229, 13,112,246, 22,158, 19,
+210, 58,195, 32,193, 25, 70, 56,216,177,169,237,118,162,218,127, 82,220, 96, 84,144, 98,152, 17,147, 8,243,140, 38,190, 25,203,
+ 82,225,106,129, 99,141,248,232,157,213,253,159,106, 37,182, 16, 81, 88, 68, 74, 32,219,233, 31,228,117,167, 82, 64, 57, 97,139,
+ 27, 70, 63, 72, 94, 59, 11,249, 40,166,130,144,107, 21, 45, 35,190,150,122,215,132,219, 34, 78,162, 6,166, 1, 50,239,239, 97,
+233, 70,237,229, 16,219, 43,251, 92,232,131,141,178,144,192,192, 93,198,189,158, 80,172,194,199, 82,100, 31, 85, 64, 72,148,219,
+ 3,216, 50, 35,105,204,108,105,124,241,186,246,225, 27,177, 91,214, 7, 72,190,233,198, 75,235,108,143, 32,153,210, 14,135,114,
+ 99,189,235,195, 83,234,254,122,175,172,251, 17,188,126, 79,125, 64,247,179, 3,238,214, 72,212, 7,214,244,182,180,238,134, 49,
+ 58, 6, 62, 80, 16,113, 92, 61, 29,245, 44,183,147, 0, 52,194,193,190,146,147,255, 61, 17, 99,205, 0,101,131,255,253,255,254,
+183,248,147, 63,254, 35,252,224,205, 43, 17, 1,141, 5,143,215, 43,112,255, 6,239,191,126,135,225,238, 45,190,250,250, 29, 94,
+255,224, 51,124,243,248, 14,247,175, 94,227,241,233, 17,167,215, 19,134,209, 35,219, 51,222, 60,156, 49, 58,143,201,201,195,229,
+213,235,123, 60, 60,156, 49,240,134,120,253, 22, 38, 39, 56, 91,112,221,102, 92,158,158,176,166, 25, 27, 17,126,112, 63,202,102,
+145, 25, 22, 5,121, 11,176,100, 96,137,196,156, 85,160,233,103,104,196, 49, 2,176,169, 45,138,141,131,141, 9,110,178,216,162,
+164,200,157, 78, 3, 74,204, 50,242,213, 34,122, 58, 77,130,205,141, 81,104, 75, 20, 52, 54, 90, 58,217,172,133,109,206, 9, 97,
+ 93, 26,219,129, 45, 55,124,105, 67, 94,107, 35,228,189, 7, 51, 99, 24, 68, 69, 29,181,179,111,147,154,178,199, 82, 87,231, 11,
+179,142, 95,229,148,192,178,172, 48,172,214, 44,176,178, 21,117, 42,216,133, 0,213,195,156,154, 43, 71, 4,133, 98, 43,243,186,
+ 19, 39,108, 33,194, 88, 43,241,174,181,139, 95, 55,229, 9, 88,172,235,214, 18, 14, 98, 22,126,126, 85, 97,145,230,155, 99, 13,
+112,222,180,137,196, 60,207, 2,218, 49,220,198,234, 41, 22, 16, 91, 17, 44,170,122, 27,128,218,246, 10,242,182, 10,108, 40,233,
+115,161, 24,137, 34,213,202, 57,107, 36, 45, 27, 57,196, 41, 71,140, 94,116, 70, 98,109,100,197, 69,171, 62,130,141, 62,191,118,
+129,116,202,123, 51,201,100, 48, 47,194,250,183,214, 98,242, 39, 60, 61, 61, 33,103,153,124, 48,237,209,220,165, 8, 88,106, 94,
+ 55, 88, 43,211,210,146, 99,155,150, 24,114, 48,198,234, 22, 60, 54,164,117, 86, 81, 57,215,137, 97, 44,130, 8, 47, 9,198, 27,
+172, 49,226,105,158,117, 71, 94,116, 79,175, 83, 68,222, 93, 35, 92,199,230,122, 28,149,214,137, 31,157, 98,165, 16,146,178, 14,
+146, 62,139,229, 61,201, 93,224, 22,181,201,121,203, 83,175,123,201,221,166, 86, 94,192,103, 82, 39, 50,163,238,235,203,119,166,
+ 85,125, 12, 73, 66, 7,208,200,190,251, 67,215,181, 83, 57, 76,201,219,135,114,224,153,213,191,163, 91, 63,116,105, 99,160,125,
+149,208,219,244,112,192,215,210, 77,145,193,194,157, 84, 81,208, 94, 60,228,110,223,108,138, 28,122, 49, 39,101,246, 8,121,106,
+242, 6,182, 4,108, 90,154, 82,138,109,228,151, 58, 78,121,101,201,231,162, 1, 19,138,164,205,106, 3,226, 2,245,192, 2,140,
+ 4, 36, 9, 31,176,196, 24,188,199,105,112,112, 44,217,206,169, 16,182, 24, 1,199, 64,146,223, 51,170,237,163,168, 0,142,148,
+ 19,156, 11, 97, 11, 1,222,138,226,179,170,254,115, 6,182,148, 52, 48,161, 52,175, 1,149, 44,169,112,148, 65,228,212,223, 89,
+ 14, 42,133,134, 22,238,233,250, 29,198,119, 87,166,235, 67,134,180, 0,211,189,119,211,124, 18, 55,226,210,158,211, 66, 59,228,
+ 40,115, 19, 28,202,205,166, 56, 78,170,215, 8, 20, 87,210, 69,176,242,126, 51, 43,173,168,161,228,247,235, 96,135,204,220, 10,
+ 80, 24,188, 95,159, 45,239, 64, 95, 63,189,188,124,218,179,206,115, 3,236,176,174, 42,154, 24,240, 35, 73,109,253,208, 43,149,
+143,237,247,209,133,107,116, 57,242,180, 91, 74,161,197, 64,170,132,200, 44, 88,215,126,213, 21, 75, 65, 38,135,207, 99,193,191,
+250,243,191,198,255,240,223,254, 17,158, 46, 22,127,251, 1,248,213, 54,128, 7,143,111,105,192,143,206,247,240, 33,193, 76, 35,
+ 78,230, 30, 15,111,238,113,126, 24, 96, 13,240,123,191,247, 51, 92,174, 79,120,247,205,183,120,251,201, 91,156, 79,119,248,197,
+ 47,126,129, 31,253,232, 7,120,251,246, 13, 60, 7,124,253,171,191,195,229,221, 7,204,243,130, 53, 22,124,120,188,128, 54,128,
+ 39,143, 56, 26,140,222,232,117, 38, 55,253,224,156,238,106, 11,172,101, 21, 53,137,109,110, 24, 60,222, 95,174, 8, 69, 44, 96,
+ 50, 94, 37, 56, 99, 53,175, 90, 40,111,185, 22,123,134, 97,189, 64,109,252,232,145, 34, 33, 45, 11, 6, 47, 15,238, 45, 36, 36,
+ 83,164,120, 87,235, 41, 91, 41, 4,196, 61,146,116, 82, 39,227,127,195,131, 8, 93,157, 76,157, 66,221,187,226,104,223,221, 66,
+128,179,131,216, 2, 73,167,141,134, 91,194, 25,177, 65, 41,178, 90, 73, 33,202,254, 90, 5,184,133,208, 10,135,250,161, 87,113,
+ 49,105, 49, 90, 84, 93, 63, 47, 51,188,115,226,225, 46, 2,249,113,206, 41, 83, 66, 32, 89,150,101,244,110,173,197,211,211,147,
+ 78,255, 60, 66,140, 32,235,116,133,166,247,133, 97, 73,151, 76, 22,126,112,216,182,173,137,230, 66, 16, 62,187, 31,134,134,202,
+ 45, 40,141,229, 31,131,176, 5,114, 17, 33, 39, 43,243,190, 62, 59,193,251,189, 68,144,135,147, 33, 6,229,132,211, 52, 73,106,
+163,119,184, 92, 46,178,190, 41, 82, 56, 36,229, 81, 20,136,120, 77,172,122,128,245, 30,166, 64, 53, 21, 5,211, 52, 97, 11, 43,
+230,101,110,150, 69,201,174,224, 86,144, 53,246, 58,139,235, 39, 4, 17, 88,102,109, 20, 88, 5,129, 81, 15,121,249,220,228,235,
+ 69, 8,153,145, 26,180, 74,246,236, 33, 23, 12,198,225,243, 95,253, 26, 75,200, 72,133, 53,195,161,131, 85,117,198,159,172,236,
+249, 94, 80,190,167, 87, 84,250, 41,119,116, 26,238,162,169, 75,123,198,236,107, 63,157,219,149,178, 31,234,245,128,145,206,229,
+ 22,250,121, 11,151,121,222,157,124,231,193, 94, 58, 4,223, 11, 42,224,250,247, 77, 13,223, 44, 64,164, 15, 69,125, 99,168, 42,
+223,123, 30,247,158,247, 78,120, 65, 17, 88,142, 10,236,190, 6,105, 85,155,206, 99,234, 97,148, 75,129, 53,146,117, 35,251,184,
+170, 45,160, 54, 37,224, 34, 24,203,234,231,132,218,193, 70,239,132, 15, 28, 55,148, 45, 72, 38,117,140, 2,217, 80, 18,157, 99,
+ 43, 94,222, 28,213,242, 84,224,157, 19,182,182, 97,101, 7, 73, 81,225,140,140, 93, 5,230, 31, 97,217,193, 58,143,243,105,194,
+121,240,224, 44,202,208, 45,110,226,155, 55, 98,143,217,230, 85, 59, 10, 69,234,114, 69,235,138,224, 14, 89,118,147,163,119,123,
+ 94, 56, 51,162, 10,243,108, 17,251, 19,195,128,114, 22,226, 92,169, 24,222,220, 68,194,234,108,147,117,192,174,246, 58, 48,216,
+ 27, 45,189,200, 43, 43, 90, 94, 87, 48, 8,116,252, 37,221,191,170, 66,107, 4,106,229,194, 55, 33, 98,214,107, 53,117,197,231,
+205, 68,169,187, 94,235,190,125,199,219,212,124,119, 28,172,109, 56,104, 56,142, 41,132, 77, 39,211, 9,220,110,161,133,229,249,
+ 95,236,158,250, 78,133, 95, 57, 16,181,211,111, 22, 55,186, 77, 79,168, 37,118,222,247,244,189, 75,160,174, 23, 8, 93, 40, 6,
+218, 68,166,223,209,237,244, 90,106,164,175, 61,210,150, 81,156,195,167,191,255,199,248,112,126,139,255,237,207,255, 18,159,188,
+122,131,175, 30, 19,166, 79, 63, 5, 13, 30, 63, 26, 45, 94,221, 89,220,191,254, 12, 48,132,207,166,123,164, 20,240,201,195, 91,
+252,253,223,254, 45, 78,222,226,225,244, 22,127,247,139,191,194,235,215,119, 0,143,120,255,248, 53,166,179,131,117,192,178,204,
+ 88,183, 5,151,121,193,229, 26,112, 89,102,132, 45,131, 67,193,130, 77,198,226,136, 48,186, 19, 36, 18, 62,120, 82,219,149, 88,
+199,100, 85, 65, 53,190, 56, 4, 20, 54, 48,131, 81, 37,242, 0,235, 28, 82,145, 8,216,182,175,208, 9,219,116,154, 84, 92,198,
+216, 86,106,215,147,115,140,156, 87, 68, 83, 64, 49,180,148,196,138, 70, 53,214,162,196, 12,239, 69,244, 38,107, 54, 77, 95,171,
+172,121, 8,173, 46, 43, 77, 45,103, 17,169,213,107,199, 24, 3,235, 29,158,174,139,128,116,156, 23, 64, 85, 44,216,194,134,204,
+132,117,139, 66,121,204, 73,236, 75,165, 52, 69, 52, 90, 50, 33,183, 9, 90,214,152, 77, 54,178,134, 11, 33,224,245,235,215,120,
+255,254, 67,115, 40, 48, 51,158,158,158,196,161,227,173,116,162, 41,201,129,175, 9,127,235, 42,152, 97,103,237, 78, 59,211,103,
+114, 76, 9, 88,143,107,163, 45, 70,213,138,200, 10, 42, 69, 89, 57,132,152,176,173,162, 93,144, 52,206, 44,129, 38, 84, 17, 85,
+194, 58, 97, 34,137, 51, 53, 70,226, 86, 75,150,228,199,148,176,205,215,166, 91,114,222, 98, 89, 23,100, 16,230,121,214,213, 30,
+235,193, 75,160,148, 16, 99,193, 26,100, 92,110,172, 19,220,112, 12,162,100,143, 9,169,253,174, 59,225,180, 61,203, 27,251,129,
+117,106, 16, 59,151,141,232,141,136, 8,166,136,253, 57,101, 32,229,112,160,160,102,125, 64, 21, 18, 53, 63,233, 51, 55, 65,200,
+120, 65, 61,243, 92,118, 23, 75,190,213,132,181,162, 77,159,163, 10,104, 75,237,220, 68,203, 97,193,161, 89, 82,247,153, 2,107,
+184,123,102, 88,168,159,184,226, 99,218, 3,144,190,187, 3,167,254,219, 16,190, 83, 5, 44,248, 81,115, 80, 30, 87, 37, 51,158,
+ 5,176,224, 32, 50,162, 67, 58,214, 81, 60,215,143,119, 27, 2,176, 99,115,115, 83, 11,247,138, 38,211, 69,149,106,167, 84,118,
+197, 49,105,190,158,115, 86,144,171, 41, 52,159,183,169,221, 78, 45, 62, 12, 33, 71,165,188,129, 48, 16, 97,100,134, 35,160,196,
+128, 20, 69,217, 74, 58,122,166, 44, 52, 35, 99, 69, 52, 87,171, 70,171,222, 76,203, 69, 15, 82, 37,163,177,116,247, 4, 66,138,
+ 5,156, 25,222, 58, 5, 51,220,193, 91,131,176, 38, 77, 99,147, 11,104,240, 14, 84, 0,179, 5, 24, 85,225,182, 93,186, 90,213,
+ 10, 68, 5, 63,175,162,178,205, 26, 95,201,138,111,140, 65, 20,192, 18,215, 91,246, 89,134,238,147,178, 34,118, 83,173, 54,117,
+132, 75, 53,155, 24,249, 70,197, 94, 63, 67,214, 76,250,164,104, 87,177,144,136, 70,147,193, 9,160, 98,218,100, 4,117,252,168,
+ 25,195, 57,229, 22,169, 89,199,238,160, 10, 21,226,246, 57,102,202,234,237, 39,200,237,193,106,153, 41, 59,126,241, 38, 5,176,
+116,132,167,114, 76, 78,144,130,138,122,141,101, 63, 97, 58,254,255,182,255, 44,187,142,158, 75,238,108,116,164,217, 8,185,179,
+ 88,222,130,100,169,243,250,211, 33,202,181,177,221,137, 0,200,132,166,238,224, 43, 66,185,238,224, 72,133, 85, 81, 91,121, 63,
+ 56, 25,215,174,107,243,241, 26,107, 97, 6,143,159,253,225, 63, 5,149,132,100,129,233,135,159,226,247,254,171, 31, 35,108, 17,
+231,211, 8, 71,192, 23, 95,125,129, 55,159,126,130, 47,191,252, 7,252,248,244, 35,252,221, 23,191, 4,197, 79,241,203,191,255,
+ 37,214,101,197,171,135, 55,248,155,191,249, 59, 60, 93, 87,140,227,132,191,254,155,191,195, 23, 95,254, 26,247,119,103, 60,190,
+251, 22,191,252,252,215,152, 47, 27,114,150,123,200,129,193, 70,162, 76,207,198,226,206, 88,193,178, 34, 99,176, 22,201, 36,153,
+ 60, 1, 56,121,135,147,183, 24,198, 65, 86, 64, 49, 99, 28, 6,100,170,176,152,162,254,109, 29,207,107, 18, 88,213,193,156,198,
+ 81, 82,185,114,193,224,207,200, 57, 99, 36, 96, 93, 55,196,148, 33, 43,201, 44,171, 71, 18,200, 16,147,160,149,151,117,131, 31,
+ 38, 9, 48, 33, 32, 39,130, 49, 64, 78, 65,227, 68,141,128, 84,114,106, 74,230, 2,161,153,165, 20,145, 67,210, 92, 8,153,226,
+ 45, 91,128,177, 30, 9, 25, 75,140,216,130,236,221, 99,202,200,170,124,168,235, 31,106,209,213,162,116, 39, 29, 1,135,176,105,
+ 24, 9,201, 1, 29, 19,182, 20, 36,245,206,122,241,163, 35,194, 89, 43, 8,106, 37, 77,142,131, 19,120,141,177, 58,198,149,124,
+139,235,101,193,224, 19, 70,167, 58, 18,213, 92,164, 28,219,243, 35,231,172,144, 45,233, 6, 99,148, 84, 71, 9, 63, 73,152,198,
+ 17,180,172, 50, 34, 38,129, 70, 73,188,173, 69, 44, 81, 10,114,181, 12,147,142,224,207,131,151, 32,153,176, 85, 15,151,188,254,
+ 84,212,109, 84, 35, 75,101,171, 22,115, 2,140,124, 54,214,141, 40, 70, 86,151,107,136, 96,197, 21, 91,107, 17,214, 40, 57, 4,
+117,146, 86, 58,177, 76,129, 2,100,146,230,174, 37,216,250,126, 20, 93, 99,166,164,207, 93, 52,177, 34,161,128,187,243,166,205,
+ 41, 43, 53, 9, 5, 91,204, 96, 99, 17,144, 53, 55, 29, 66,147, 3,129,171,253,111,255,166,205,166,221,196,186, 93,131,177, 3,
+175,212, 5,193,125,226, 37,239, 1, 87, 73, 27, 31,214, 64,179,146,171,250,189,236, 1, 44,184,149,226,210, 71,161, 92,183,157,
+251,119,167,173, 85,107, 85,122,145,194,245,236,225, 10, 17, 5, 85,139, 79, 37, 77,209, 13,242,147,122,155, 29, 58,254,119, 5,
+124, 80, 1,155,125,244,154,149,237, 75, 29,115,119,207,127,175,176, 35,131,146, 9, 33,110,205,130,192,170,196,102,221,239, 59,
+ 43,203,253, 98,132,252,198, 25, 56, 57,198,228, 25,148, 3,194,182, 42,163,187,136, 93,165,112,163, 91,213,221,113, 86,111,170,
+ 33, 2,114,132, 97, 35, 23,125, 73,218, 89,235, 7,150, 37,195,197, 26,131,193, 89, 29,187, 19,226,182, 96,139, 27, 98, 10, 26,
+175,233,192,206, 2,133,224,109,132, 0,157,170,200, 67, 84,247, 41,203, 56,157,107, 66,218, 22, 96,188, 3,172, 69,214, 4,163,
+172, 93,135, 28,254,202, 35,214,142, 7, 89,160, 8,169, 36, 36,136, 80,173,173,155,169, 60, 75, 43,107,197, 25,147, 80,232, 20,
+170, 32,162, 76, 77,195, 2, 80, 88, 58, 19,168,163,162,212, 28,243,154, 58,151, 21, 61,154,179, 6,233, 40,255,187,163, 20,150,
+238, 38,102,170,182, 55,210, 7,246,115,204,240, 51,174,188,238,249,110,209,175,251, 65,255,252,159,156,159,203,214,219,247,239,
+131,134, 14, 73,113,185, 89, 2, 62,230, 29, 57, 80, 22,251,149, 64, 37, 71,213,174,189, 84,188,100,135,115, 86,133, 52,154, 64,
+ 50,227,247,255,224, 15,240,147,223,253, 9,190,248,135,207,241,205,175,127,141,146, 34,136, 0, 63, 56,176, 55,240, 35,225,205,
+ 39,111, 65,229, 53,194,186,224,238,238,132,191,248,247,255, 30,206, 91,120,231,241,151,127,245,215,120,245,171,175,241,238,221,
+215,248,229, 47,127,133,247, 31,222,225, 63,252,167,191,198, 50,111,248,213, 87, 31, 64,185,224,233,241, 29,190,253,250, 29,140,
+117,202, 83, 7, 78,163,199, 58, 47, 8,171, 88,158,188,181, 24, 89, 34, 40,211, 22,240,230,225, 14,119,163,195,153, 53, 55,130,
+ 1,111, 25, 33, 18, 76, 32,112, 49, 56,123,135,243, 48,192,141, 14, 41,203, 67,107, 28, 70,108, 73, 68, 54,134, 5, 19, 28, 82,
+130,243, 14,131, 17, 33, 90,138, 81, 59, 86, 66, 82,206, 68, 78, 9,195, 56,129, 13, 48,157, 38, 92,231, 5, 88, 54,120,199, 32,
+246,216, 98, 70, 6, 33,198,140,113,114, 8, 23,129,242,220, 13, 19,156,157,176, 45,151,246, 16,222,182,128,113,114, 13,183, 44,
+202,245,164,247, 17,171, 37, 83,212,221,194, 81, 23,129, 88,140, 25,203, 22, 49,175, 2,205,201, 57, 55,125, 73,125,166,182,253,
+111,125, 22,178, 80,237,130, 50,245, 73, 69,159,243,188, 52, 40,209,187,119,143,234,137, 79,250,181, 65, 82,202,140, 67, 73, 1,
+203, 42,147,136,160, 33, 59, 18, 90, 35,145,182, 57, 39, 44,155,164,173, 13,222, 3, 70, 10,233, 24, 99,155,112,228,117,131,243,
+ 2,213, 41,101, 47, 56,157,115,152,198, 9, 12,146,226,164,138, 22,115, 6,114,128,233,179, 30,244, 94,141, 97,195, 28, 3, 70,
+239,133, 92,152, 11,176, 69,120,239, 97,116, 98, 80, 89,232, 69,217, 30, 33, 69,164, 45,170,240, 77, 94, 3, 27, 3,235, 8,219,
+186, 42, 56,167,128,139,172, 15,170,168, 13, 93, 10, 39,186,232,111, 33,221,137, 0,175, 80,222, 39,191, 89, 44,203, 37,239, 90,
+136,166, 81,209,154,122,239,216,119,144, 84,206,132, 88,148, 34, 87, 15,238,194, 40, 44,112, 31,129,157,209, 30,185,212, 89,113,
+119,107, 46,237,141,146,158,228, 57, 23, 40,175,173,149, 19,185,241,136, 88,138, 63, 45,166, 12,153,163,165,237,152, 73,253,155,
+254,249,126, 95,245, 82, 93, 80,109, 12,253,129,222,143,230,203,205,249,208,212,153, 47,248,247, 14,158,247, 92, 14,194,129,227,
+215,118, 93, 17,161,115, 8,239,234,195,140, 93,113,154, 33,226,138,254, 37, 24,125,127, 68,164,198, 26, 49, 40, 69,131, 97, 96,
+ 26, 44,188,147, 20,171,186,143,201,170, 8,181, 70,178,115,136, 73,134, 5,137,224, 13, 3,185,192, 25,130,103, 35, 99, 41,150,
+174, 92, 42, 71, 70,200, 82,142, 17,146,100,159,187, 12,162, 13,203,178, 97,221, 36, 43, 59,235, 41,230,188,131, 29, 61, 56,201,
+ 88,113, 75, 59,194, 36, 70, 73,214,202,200,251,248,135, 13, 66,145,215,206, 70,242,171,201, 74,181, 92,191,175, 20, 75, 2,227,
+ 33, 5,199, 64,132,254, 13,153,200,245, 32,214, 67,182,137, 23,187,137, 75,221, 39,151, 86,168,238,169, 68,213, 66, 72,213, 57,
+202, 59, 61,174, 41, 71,139,218, 6, 83,208, 88, 76,181, 77,182,148,213, 78,104,194,149, 64,215, 31,224,121, 47,220, 74,126,153,
+ 0,119,224, 37,244,194,185,242,140, 76,247, 12, 97,124, 19,217,122,252,199,116,254,124,209, 69, 20, 28,105,102,253,216,190, 60,
+ 75,133, 45,109,100,222,252,234, 93,230,108,205,130, 39,133,148,212,239, 91,239,102,102,194, 79,127,250, 59,226,129, 14, 27,182,
+109,193,122,189,138,165,203, 59,144,181,248,171,191,252,255,240,246,241, 83,228, 24,240,229,231, 95, 96,156, 78,248,252,215, 95,
+ 1,148,193, 57, 99,125, 90, 48,159, 63, 32,196, 13,171,198,159,162, 72, 36,235,246,248, 1,227, 48,224, 68, 64,156,103, 88,159,
+ 49,164,140, 82, 4, 91, 58,121, 15,119,119,135,101, 94,225,172, 48,214,195, 22,144, 12, 99,153, 47, 56,157,126,130,123,206, 56,
+ 15, 3, 82, 22,223,249,101, 93, 96, 17,145,214, 13,159,220,159,113,119,158, 16, 29, 16, 11,195, 17, 99,100,131,240,180, 32, 23,
+ 1,150, 20, 20,196,121,129, 37,134,243, 30,203, 50, 99, 24, 61,156,183,210,113,170,157, 43,165,164, 93,183,193,178, 68,177,117,
+ 89, 35, 4,197, 40, 41,132,203, 58, 35,165,132,203,229, 9,195,224, 81, 72, 66, 65, 38,239, 68,249,158, 9, 65,189,245,178,139,
+ 85,210, 95, 74, 45,219, 34,132, 0,235,100,175,191,109, 43, 80, 24,107, 8, 88,150,128,144, 54,204, 91,108,255,110,233,237,185,
+234,205, 46,101,119, 11,229, 44,233, 96, 45, 78, 89, 15,171, 24,147, 80, 45,181,216,155,198, 65, 21,240,132,109, 91, 68, 60,102,
+ 68,169, 62, 76, 3, 82,148, 32, 22,102, 35, 40, 91,189, 50,173,177, 96,182, 88,182, 89,224, 53,196,234, 65,103,144,181,210, 49,
+ 87,204,105,148,157,255, 96,141,222,219, 34,246,173,191,167, 20,233, 85, 43,179,107, 75,168, 53, 92,178,131,206, 90,144, 93,150,
+ 5,150, 8,198, 16, 66, 46,200,235,186, 99,142,149,220, 6,133,243, 24, 88,121,206, 40,245, 13, 69, 18,216,172, 49,216,180,113,
+204, 73, 44,159,131, 31, 16,147, 60,131,209, 16,189,187, 85,187, 78, 94, 74, 21, 72,107,146, 94, 59, 32,116, 68, 81,106, 71, 92,
+244,121,216, 1,193,154,128,145,164,224, 74, 69,243, 64,148,142,202, 34,140, 64, 33,153, 6, 87,209, 99,133,255,160, 28, 1,155,
+237,222,110,204,143, 26,228,210, 69,173,148, 35,207, 35,183,181,177, 20, 62,165,238,212,191, 79, 12,234,119, 31,238,244,253,206,
+118,218,201,115,183,153,230, 71,117, 47,218,195,191, 77, 79,158,165,197,149, 22,101, 87,167, 12,172,163,228, 74, 80, 99,236, 29,
+ 82, 81,202,210,254, 46,150, 93, 93,212,133,120,168, 82, 66, 71, 79,249, 8,222,209,138,217,177,228, 18, 35, 39,129,184,168,213,
+200, 73,126,169,140,230, 98,148,221, 53,108,219,157,212,124,118,160,192,148,172,147, 8, 96,176, 86,236, 59, 64, 27,241,100,181,
+106,212,168, 91, 99, 8,214, 1,108, 18,182, 32, 15,157,152, 11,162, 30,150,214, 48,220, 96,229, 33,157, 36, 23,121, 75, 34,234,
+200, 40,200, 53, 18, 82,233,119,165, 10,173,148,221, 45, 63, 93,197, 23, 44, 93,100, 76, 73,169,113,212, 84,249,162,120,207,141,
+191, 78,189,110,162, 11, 60,233, 16, 46,187,151,178, 23,100, 22, 58,164,147,245,213,115,179,156,244, 37,102, 17,220, 98,214,212,
+162,146,178, 10,247,168, 1, 63,160, 99,119,148,110,212,222, 21,146,251,205,152,111,166, 69,207,243,213,235,215,244,144,155,151,
+226,100,233, 70,160,185,187, 68,118, 21, 12,181,137,193,158,121,222,227,106, 63, 86, 3,247,128,158,220,125,125,125, 32,212,195,
+187,116, 68,197, 92,175,119,222,137,144, 72, 1,255,230, 95,255, 31, 48,222,201, 1,147,178, 98, 72,165, 80, 50, 46,225, 47,255,
+195, 95,226,155, 47,191,193, 22, 87, 17, 90, 89,139,147, 55,248,227,159,255, 12,247,134,240,248,205,183,184, 92,102,224,126, 66,
+ 97, 66, 76, 64, 90, 3, 82,216,176, 33, 23,165, 82, 0, 0, 32, 0, 73, 68, 65, 84,209,138,180,205, 72,153,144, 9,216,174, 23,
+148,117,133,177,140,247,143,239,241,230,213,107,220,121,139,178,206, 64, 8, 66,184,171,180, 66, 21, 37,221,157, 6,188, 57, 15,
+ 98,109,179, 6, 15,247, 30, 95,165, 5,228, 12, 62, 57,121,220,221,159,241,148, 55,108, 84,112, 9, 66, 26, 99, 35, 15,117,217,
+143, 39,140,222, 99, 13, 2, 96, 25, 71,197,121,230,140,109,219,192, 68,152,166, 73, 87, 53, 34, 8,117,214, 98, 94, 54,237,244,
+229, 29,172, 22,184, 98,101,167,107,136, 48,158, 78,200, 41,136,130,218, 88, 16, 41, 60,101,139, 40,133, 53, 44,165,174,166, 10,
+150,117, 17,219,151,178,228, 69,209,110,176, 44, 43,214, 32, 93,122, 42, 69, 58, 58, 62, 72,117, 91,115, 82, 87,147,222,123,220,
+ 79, 35, 0, 40, 36, 70, 40,116,235,186,201, 72,220,122,164,156,144,227, 14,157, 97, 77,101,156,151, 43, 82, 92,224,221,128, 16,
+ 86,140,131,199,120,154,176,174, 43,166,113,130, 99, 3, 42,192, 60,207, 58, 53,148, 2, 40,101, 32,132, 13, 86,195,106,160, 17,
+159, 57, 10, 38,155,141,132,210,180,235, 91,247,222, 65,167, 33, 86,137,126, 41,103, 25,238,229, 61,223, 33, 35, 99, 24, 39,196,
+ 40,147, 20,195, 44, 43,133, 44,133,107, 98,218, 19, 32,244,123, 88,118,200, 41, 55, 41, 72, 41,164,106,117,224,122,185, 2, 0,
+134, 97,148,192, 32, 45,220,122,145,116,239,247, 38, 52,181, 25, 98, 22,102,130, 49, 98,107,203, 58,109,233,155,132,186, 82,172,
+ 92,145,218,205,139,227,168,104,234, 38,181,160,171,220, 5,152,138,236,129,218,231, 41, 88, 24,109, 46,242,126, 64, 23,220,164,
+182, 85,237, 4,122,222,132,184, 50, 74,161,103, 20,205,138,111,174,108,126,115, 30,167, 63,171, 36,180,186,203,185, 37, 97,244,
+ 54,138,231, 9,107,249, 5, 78,245,243,177,250,158,129, 85,158,121,213,111,191,246,152, 98,213,123,218,203,206,166, 63,236,213,
+203,222, 73, 42, 47,157,111, 34, 93, 75,169,190,116,110, 49,128,205,248, 84,164, 30,226, 2, 88,203,176, 86,128, 10, 57,237,171,
+ 2,203,210, 33, 56,102, 56, 35,152,205,146,178,112,216,153,224, 24, 56,121, 11,203,140, 24, 54,132, 58,142,211, 93,175, 97, 65,
+199, 26, 38, 85,249,102, 56, 61,208, 71,103,155,174,199,114,229,200,103,185,241,145,192, 92,224, 29,193, 90,169,116,162, 62,144,
+ 11, 17,178, 37,176, 37,248,193,226, 52,141,114, 67,105, 62,244, 62,254,215, 7,126, 81,150,112, 75,163,147,139,133, 75,145, 27,
+156, 88, 68,113,149, 41,173, 85,124, 33, 70,246, 3,162, 49, 72, 32,212,108,154, 12,217,233,136, 0,238,134, 59,208, 29, 54,117,
+143,156, 91,135, 91, 29,214, 93,160,137, 98, 48,209, 51, 6,104, 87,129,215, 93,186, 92,216,249, 8,118,121, 9,188, 66,212,186,
+214, 91,208,204, 75, 76,248,151, 83, 3,159, 11, 45,203,205,207,237,209,178, 77, 4,167,255,153, 21,135,204,116,107,121,123,254,
+187,191, 84, 56, 60, 43, 36,154,107,131,143,146,217, 23,180, 45, 68,221,154,170, 20,228, 36, 29, 85, 73, 98,193, 33, 40, 14,152,
+164,243, 76, 33, 99,125,154,225,220,128,203, 60, 35,133, 21,110,158,241,179,113,194,159,252,228,135,112,235, 5,233,250, 1, 3,
+103,216, 28,129,176,194,198,136, 18, 86, 32, 6,108,235,130,184,109,237,105, 22,195, 6,107, 8, 84, 18, 6,231, 52, 50, 56, 75,
+247, 84, 10,114, 45,238, 99,128,203, 5, 63,251,225,167,184,183,132,183,231, 17,167,209,193,178, 80,186, 94,141, 30,247,227,136,
+ 79,222, 60, 0, 92, 36,137,112, 11,136,169, 96,152, 70,248,113,196,186,174,216,182, 13,227, 52, 54,223,160, 81,124,243, 48,140,
+ 42,124,149, 48, 19, 0,216,182, 85,148,223, 65, 34, 91,217, 24,156, 78, 39, 13,166, 41, 42,130,147,221,113,170,160, 36, 35,124,
+132,211,233,164, 15,119, 97,244, 69, 37,211, 13,211,136,109,219,212,191, 92,176, 5,249,154, 58,150,127,186,172,146,160,184, 37,
+ 17, 65, 49,183, 29, 96, 70, 57, 8, 75,169,177,232, 45,222,190,125,139,233, 52, 33,165,140, 16, 54, 68, 61,184,234,158,187,138,
+243, 4, 45, 43, 7,198, 60, 95,101,229,144,162,166, 73,138, 8,108,209,236,244,246,123,150,130,109,221, 58,252,169,140,163,235,
+247,103,210,244, 52, 37,229, 89, 54,242, 61,137,116,202,208, 11,172,185, 81, 55, 99,202,123, 81, 95, 11,245,150, 19, 42, 83,166,
+233,116,198,214,242, 4,208, 1,155,106, 7,138,198, 75,167, 94,167,162, 54,198,156, 74, 99,180,199,152,176,109, 65,201,158,114,
+ 24,199, 36,182, 62,195,220,233,101,106,128, 10,246, 96,151,238, 30,206,116,100, 60,150,162,128, 60,230,253, 94, 34,163,188,120,
+153,144, 85,162,104,245,161,214,247,177,197, 0, 55,231, 78,103, 63, 85,134,126,181,172,181,179, 44,203,127,175,160, 28,210,239,
+ 83,186, 46,130, 94,192, 99,247,235,103,244,152,216, 82,142,170,221, 99,227,178,127, 32,223,119, 4,127, 60,208,143, 76,248,219,
+ 95,230,197,232,202,190, 12,168,221,107,237,182, 95,136,177,172,180, 46,166,174, 35, 2,186,100,175,218,241, 43, 93, 75,119,235,
+245,233,183,219,161,234,135,115, 51,122,103, 21, 75,212,223,171, 64, 59,107,121, 19,189, 49, 90,249, 10,162, 48, 39,141,203, 51,
+ 55, 59,126,245,193, 90, 46,194,109,182, 6, 76, 89,240,142, 18, 47,164, 63,187, 0,136, 0,229, 22,251,152,115,130, 20,200, 18,
+102, 66,204, 48,150,225, 44,195,123, 43,225, 51, 86, 68,123,121,178,216,130,211,247, 41, 41, 65, 73,196, 60,142,149, 98, 36,136,
+ 21,112,142,242,218, 52,125,168, 30, 78,166, 89,193,248, 72, 93, 99, 85, 81,167,170,193,224,254,153,180, 79, 82,218,174,187,171,
+146, 11,117, 29, 46,221, 48,217,161,137,114,249,160, 1,215,153,140,236,208,187,177,253, 94,205,238,236,232,223,224,195,248,200,
+168, 29,207,174,199, 92, 11,199,151,168,113,183, 41,127, 84,186,157, 88,222, 19,147,128, 23,139,136,239,251,123,201,131, 70,255,
+174,243, 98,222,206,198, 42, 40, 50,119,233,133,185, 83,213,115,222,189,234,165, 80,187,198,251, 8, 99,134,236, 57, 63,188,123,
+ 7,107, 13, 16, 35,158,230, 43,254,221,159,255, 5,134,176,225, 15,126,254, 83, 92,174, 23,204, 49,160,164, 8, 19, 18,214, 53,
+ 98,139, 25,133,164,123, 45,180,169, 77,113,143,115, 78, 41, 74, 42, 26, 11,133, 44,228, 4,144,132,210, 76,195,136,112,137,248,
+197, 23, 95,227, 95,252,252,103,248,157,215,175,112, 30, 45,140, 1,238,201, 99, 76, 17,148, 10,188,117,248,228,254,132,252, 24,
+ 49,175, 11,166,193, 33, 22,192,140, 3, 96, 12,182,205,162, 20, 25,135,155, 76,130, 78, 53, 6, 31, 30,159,244, 94, 20, 65,167,
+243, 85,213, 30,192,217,106,188,102, 58, 76,255,172,101,196, 53,138, 77, 52,197,118,232,203, 65,146, 48, 47, 11, 82, 46, 56,159,
+239,241,248,248, 8, 63, 12,120,247,254, 3,202,147,116,183,117, 70,104, 28,171,112,151,177,108, 1,243, 26,176,134,172,193, 29,
+165, 37, 39,150,155,117, 97,189, 57, 74, 41, 56,223,157, 37,168, 37, 69,108,155,236,144,151,121,195,182, 73, 64,204, 48, 12,130,
+108, 77, 17,107,140, 96, 50, 56,159, 78,112,206,234, 20,171,198,113,202,180,209, 24,139,117, 89, 69,220,166, 5, 65,203, 14, 87,
+170,163,181, 78, 29,162,117,175,173,171,175, 16,117,100, 45,215, 78,236, 86,157,165,100,192,200, 20,163,100, 2, 74,148,181,163,
+174,204,196,166,187, 23,244, 91,136,224,117,197,195,171,215,120,255,238, 27,113, 12, 89,215,174, 23,102,106,212, 68, 3, 22, 97,
+108, 86,207,119, 74,210, 97, 27, 9,246, 73, 41, 73,182, 61,147,134,183,200,231,105,140, 65, 12,186,127, 87, 15,125,213,158,212,
+ 41,109,145, 39,163, 10,212,234, 65, 79, 45, 36,169,182,125,169, 86, 26, 36,211,129, 88, 74, 59, 31, 10,237,137,145,213, 45, 87,
+ 61,231,164,118,194,106, 55, 51,120,158, 51,209,175, 7, 73,133,204, 13, 32, 93,202,206,152,208, 52,183, 35, 29, 19, 59,218,184,
+155, 32,216, 23, 78,227,227, 97,169,248, 88, 84,107,194,141, 5,167, 20,188,120, 40,127, 4,174,189, 63,136,152, 95, 12,189,200,
+157,221,166,190,168,221, 95,184, 31,234,109,228,122,224, 95, 83,167,102,239,236,114,148, 59, 91,207,238, 95,110, 21, 84,253, 96,
+116, 95, 5, 37, 11, 53,229,189, 34, 99,185, 31,175,230, 90,137, 9, 6,112,176, 66,170, 74, 73,196, 56, 53, 80,160, 10, 4,171,
+140,175,114,146, 37,230,181,192, 89, 9,142,145,191, 35, 61,188,138,170, 74,163,142,222, 5,130,144,179,240,140,193, 4, 50, 6,
+108, 13,140, 37,120,111,225, 44,193, 17, 96, 89,189,160,236, 16,162, 19,175, 58,138,112,186,115, 61, 48,179,112,219,181, 11,102,
+157, 95, 48, 19, 40,203,205,104,184,203,250,214, 17,147,174,136,118,250,224, 65,127,177,239,154, 75,243, 76,239,108,104,168, 38,
+161, 38, 47,202, 95,229, 27, 29,199,115,238,250,158,119, 94, 14, 2,178, 26,167,104,218,245,154, 59,179,227,127,198, 18,169,191,
+193,212,126, 83,178, 92, 75,135, 46,189, 94,115,124, 68,204,114,239, 29,239,188, 33,245, 58,191,157, 8,188, 52, 37,120, 73, 39,
+ 82,219,124, 42,132, 91, 66,125, 29,219,230,151, 10,220,125, 9,167,235, 8, 29,247, 53, 43,226,254,159,101,221, 20, 80, 56, 35,
+199, 4,155,173,168,106,221,132,119, 92,240,111,254,227,223,224,130,130,127,242, 59,159,129,223,125,139,114,185, 96, 77, 25, 41,
+233, 94,152,140,240, 3,212,166, 40,221,105, 66, 41,182,229, 38,192,176,166,118, 73, 28, 98, 1, 36,162,216, 56, 60, 46, 9,255,
+238, 63,253, 45,126,254,227,255, 30,100, 12, 78,158, 48, 56, 7,159, 51, 6,239, 80,216,226,225,237, 43,172,105,197, 28, 86,108,
+108, 36,253,202, 18, 18, 1,211,201,195, 24,185, 70, 29, 57,217,101,147,148, 46,215,235, 21, 49,170,232, 83,213,244, 0,176, 44,
+139,236,168,115, 70,204, 89,125,236, 98,227, 50, 70,177,199,144,131,125, 93, 23, 24, 67, 24,188,197,182,109, 8, 49, 99,152,146,
+118,165, 17,126, 28, 48, 95,175,152,134, 17,151,167, 39, 93,225, 89,108, 91,196,178, 6, 60, 62, 93, 17,117, 53,209, 62,198, 66,
+207,100,198,189, 8,152,152,225,199, 17, 69,125,240,143,143,143, 40, 89,116, 1,198, 24,253,157, 24,167,243, 9, 79,215, 11, 40,
+ 67,201,148, 43,238,238, 78, 88,230, 11,206,231, 19,182,109, 19,239,120,139,153, 53,200, 17, 10,182,145,194,189,118,175, 76, 4,
+235, 6,132,176,232,192, 69, 14,229,122, 57,110, 41,130, 24,176, 89,119,227,117, 82, 96, 52,121, 45,103, 16, 59, 12,227, 73, 66,
+128,132,138,129,117,139,226, 19, 87,193,151, 33,225,127, 96, 20, 23, 67, 12,155, 92,119,150, 49, 12, 67, 83,129,215,223,217, 15,
+ 3,182,117, 69, 81, 1, 47, 25,131, 45,108,160, 40, 89, 1,206, 89,141, 8,238, 68,165,196, 34,162, 51, 70,108,120,186, 18,203,
+ 45, 71, 66,207,233, 92,154,157, 77, 30,119, 74,159, 43, 59,225, 77,206,164, 74,123, 68,155,136, 52,196, 53,139, 85, 57,150,216,
+165, 74,238,160,169, 94, 84, 91,167,137,194, 92,168, 66,112,170,112,212,102,245, 45, 29,229, 16,154,180,217, 63,111,142, 28,251,
+238,236, 36,192,156,134,241,207,170,218,110,159,239, 31,153,213, 68,166,117,107,245,160, 34,254,120, 26,213, 45,148, 94,186, 96,
+115,168, 50,110, 15,245, 54, 2,145,229, 78,103,203,233,114,211,241, 66, 84,230, 97, 60,127,204,146,166,162, 57,240,221,207,224,
+195,152,118, 87,204, 87, 28,159,181, 12,211,128, 18, 85,157,206,112,218, 81, 83,243,219,139,159,219, 25,192, 25, 17,142,120, 67,
+200, 41, 34,133,136, 12, 77, 66, 83, 94,189, 33, 13,105, 81, 97,139, 49,132,193, 9,162, 49,134, 85, 81,169, 66, 80,138,165,130,
+ 99, 68,141,234,141, 83, 30,180,238, 74,173, 5, 28,195, 56,131,193, 25,140,206,194, 59,249,249,206, 74, 22,180,245,246,128,207,
+132,238,118, 82,218,171,115, 46,250,126,144,236, 18,141,250, 75,137, 68, 72, 66, 70, 70,226,217, 88, 36,231,176, 17, 33,232, 36,
+162,158,111, 89,149,151,141,247, 79,125,150,250,109, 4,106,217, 11, 42,218, 67, 71,250,243,103, 79,111,235,199, 86,212, 37,150,
+150,131,208,141,251, 84,183, 14,151,250,210,248,253, 99,215,232,179, 78, 93,119,136, 69,175,159, 74,127,106,215, 98,243,130,151,
+238, 53,161,161, 93, 91,145,100,204,139, 63,231,176, 58,186, 57,216,111,241,201,141, 14,223,117,242,199,255,187, 73,182, 59,172,
+ 4, 42,102,185, 67,114, 98,103,229, 31, 32, 65,221,238,143, 89,124,191,137, 9, 27, 1, 79,219,134, 95,125,249, 5, 74, 74,248,
+236,205, 39, 40,219,134, 82, 18,230,184, 98, 43, 66,213,202, 33, 73,224, 16, 65, 70,253, 33, 54,166,125, 86,142, 57, 21, 66,137,
+ 98,195, 51, 70, 70,185, 49,137,205,244,233,241, 3, 94,157, 6,252,244,135,175,112,127,242, 56, 91,135,209, 90,248,105,132, 63,
+143, 48,119, 19,182,235, 5,215,121,198, 37, 8, 38, 52, 1, 18,234,162,187, 43,239, 61,182, 16,176,133, 0, 50, 6,243,117, 22,
+ 92,168, 66, 80,166,233, 4,102,113,181, 16, 49, 66, 16, 93,138,168,199, 43,165, 80, 31,176, 57, 99,219, 86,152,150, 63, 78, 42,
+ 86,147, 40,218,117, 19,103,140, 80,228,234,207, 16,168, 83, 76,162, 33,153,151,128,199,167,165, 81, 26, 97,234,253, 88,142,251,
+221, 22, 61,188, 79, 51,115, 41,136,185,224,186,206,248,240,238, 3,150,121, 69,206, 89,199,205,162,149, 25, 70, 65, 88,223, 63,
+ 60, 8,232, 10,114,176, 23,100,141,154, 21,152,143,243, 78,147,246,138,166,206, 97, 23,144,245,130, 47, 35,215,121, 76, 81,207,
+ 1,238,114,224,117,170,192,162,222,207, 74,122,148,120,210,130,243,221, 29, 46,215, 11, 10, 1,119, 15,247,136, 37, 34,198,128,
+113, 26, 17, 53,113,142,106,115,198,122,176,111, 27,206,147,236,248,185, 3,114,229,148, 52, 53, 46,180, 32,148, 10,202,201, 58,
+201,168,135, 96,108, 92,247,234,154, 82,129, 51,147,210, 64, 35,198,211, 40, 59,111, 80,211, 89,196,172,235,177,138,201,165,170,
+ 99,146, 25, 49,105, 33,156, 75,110, 51, 99,249,220,140,250,194,185, 9,218, 36,127, 93, 86, 49,165,151,105,117, 41,160,220,199,
+130,215, 88,213,206, 66,158,177,115, 40, 74, 71,164,169, 76,247,227,212,144, 15,175,185, 54,193, 90,214,192,156,134, 73,216,239,
+ 31, 57,212,113,139,195,160, 58, 18,200,207,193, 46,253,225, 89, 25,214,220, 30,113,135,228,172,190,131,169, 96,151,125,172,186,
+ 87, 83,212,201,173,114, 3,142,124,100,204,175,222,238,126,252, 94,167,150, 7,194, 92, 15,169,193, 78,105, 34, 2,172,209, 46,
+ 75, 71, 83,222,136,186,210, 25, 6,178, 48,199,141, 97,189, 16, 68,185,238, 12,193, 91, 3,107, 8, 49,110, 8, 49, 2, 21, 49,
+168,213, 97,141,193,148, 20, 37, 96,112, 6,131, 23, 47,235, 86, 19,158,140,149, 36,181, 84, 16,146, 20, 16,206, 57, 48, 91,164,
+ 40,163, 59,227,157, 88,208,140,236,254, 39,239, 48, 56,217,203, 59, 35, 44,120,231,165,122,173, 72,199,164, 22,155,152,178, 42,
+104,247, 53,130,209,245,158,179, 6,214,236, 83, 5, 82, 11, 77, 33,131,204, 14,197, 41,251,189,237,105, 43,157, 14,251,197,202,
+244,209, 98, 13, 53,153,145,246,160,209, 22,220, 82,122,161,156, 57,144,216,235, 97, 94,121,251, 69, 31, 90,232,128, 57,125, 36,
+107, 99,196, 19, 55,245,240,111,123,168, 31, 46, 32,213, 92, 84, 96,197, 30,229,186, 67, 57,106, 68,172,196, 77,154,189, 40,225,
+227,193, 45,215, 66,205, 84, 67, 75,245,195, 11,160,164, 61,244,102,183,114, 82, 55, 89,169,120,227,106, 55,108,116, 57,122, 78,
+165,235,116,137,221,255,144,245, 81,162, 61, 69,102, 88,114, 50, 45,114, 22, 75,218, 64,134,154,203, 35,230,140,175,191,121, 7,
+ 3,194,253,249, 30, 49, 37, 44,113, 67,208,225, 74,218, 4,154, 34, 69, 35, 35,133, 8,228, 2, 75, 86,148,203, 44,156,191,176,
+109,146,200,165,137, 85,169, 16, 82, 97,228, 24,241,245, 87, 95,224,167, 63,122,131,159,124,242, 10,167,105, 2, 91, 43, 33, 43,
+105,131,123, 56, 99,187, 94,133, 72, 87, 72, 70,218, 33,128, 12,195, 88, 7,239, 61,230, 69,212,240,203,186,194, 58,135,109, 13,
+109, 28,235,156,111,238,152, 24, 36,255, 61, 68, 97, 31, 12,227, 8,167, 33, 37, 41,139, 87, 61, 5,177, 80,202, 52,204, 33,164,
+ 4,239,164,128,168, 41,111, 53, 48,101,217, 54, 24,150,221,110, 46, 18, 0, 50,175, 1,151,121, 69,200,149,157,166,154,150,166,
+117,168,130, 56, 52, 18, 88,191,162,100, 35,135,207, 60, 95,145, 99,214, 41, 71,110,108,122, 38,241,171,131,128, 16, 35,238,238,
+239,113,189,206, 50,134, 78,169, 37,176, 21,133, 59,213,169, 76,206, 89,116, 1, 49, 98, 24, 7, 61,164,163,138,255, 98,243,135,
+ 19, 51,146, 78,228, 10,246, 46,146,170,104, 65, 97, 52,117, 98,231,189, 19, 88, 87,216,224,188,195,253,171, 7,204,203, 21,172,
+ 22,185, 24, 36,134, 54,107,135,154,115, 22, 91, 99, 74,135,103, 60,119,205, 93,205, 28, 15, 81, 18, 49,173,115,106,181,221, 27,
+ 10, 62,172,204,116, 45,106,141, 22,167,242, 60, 11, 41, 97, 24, 70, 24,107,165,240,139, 81,227,100,115,243,129,231, 44, 35,122,
+225,192,115,167, 82,231,221, 63, 94,167, 19,169, 52,151, 74, 77, 70,204,186, 26,104,161, 11,125,180,217, 13, 56,234,184,102, 46,
+109,101,211,132,188, 85,135, 64,250,254,116,143, 35,174,191,211,173,238,135,118,160,141, 57,249,187, 63, 3,212,119,220,184,188,
+183,103,250, 77, 88, 69,151,147,125,171, 92,239, 31,234,164, 73, 63, 90,163,180,152,205,221,206, 38,170,213,218,101, 8, 45, 44,
+105, 39,189,107,163,107,120,135, 72,175, 59,175,238, 77,199,127, 72,164,237,159,130,232,248,226,165, 66,118,118,112, 24,179,170,
+211, 53,199,153, 74, 65, 14,226,229,246, 76,152, 28,195,147,154,197, 89,160, 44, 34,228, 1,152, 11,140, 33,140,214,194, 22, 17,
+200, 68, 0,100, 37, 84, 35,197, 40,239,143,145,200, 86, 46, 25,174, 20,140,134,192, 86,136, 72,194,233,183, 0, 91, 36, 64, 42,
+253, 66,128,229, 14,214,111, 96,156,129, 29, 28, 42,253,223,123,139,201, 90,140,214, 98,176, 22,131, 55, 24, 29,195, 26, 96,244,
+ 14,131,181, 10,138,216, 90,117,186,133,140, 20,179, 6,101, 8,179,216,177,193,201, 26, 56, 22, 78,113,234, 18,207, 50, 24,197,
+ 14,200,214, 35,234,197, 95, 49,114,185, 16, 40, 21, 56,216,238,189,174,198, 21, 69, 73,148,220,182, 83, 89, 72,230,181,149,222,
+ 71,141, 7,145,208, 81, 73, 78, 85,245,153, 51, 80,162,142, 68, 83, 39,122,131,218,120,228, 98,175,197, 74,173,194, 95, 10, 16,
+250,216,248,251,120,211,241,190, 39,103,193,230,202,189,148,119, 79, 62,239, 33, 71,166, 42, 84, 53,160, 39,117, 30,250, 99,126,
+250,158,184, 83,218,177,186, 43,218,111, 5,164, 5,123, 86,117,193, 65,111,180,199,217, 18, 62, 90,236, 42, 97, 82,245, 34, 59,
+214,102,143,106,228,198,236,175,132, 59, 42,178, 7,117, 78,188,206, 33, 38, 24, 55, 34, 91,143,175, 31, 31,113, 89, 22, 60,156,
+239,224, 51,129,131,176, 3,230,176, 34, 27,131, 88, 42,223,154, 96,141,111, 35,255,164,204,131,168,252, 3,174, 86, 60, 85, 69,
+111, 57,226,154, 10,190,252,252, 75,252,225, 15,127,132, 31,188, 57, 35,143, 44,220, 5,202,160, 31,190, 70, 92, 55,164,235, 21,
+ 33, 17,150, 45,106,158,186,109,123,204,140,130, 57,110, 32, 43, 46,144, 22,159,154,229,240,141, 41, 98,221, 68,108, 70,106,147,
+154, 78, 39, 64, 59,108,231,189,128, 75,212, 75,158,138,164,140,149, 34,116, 59,235, 7,172, 49,194,141,131, 22, 0,178,203, 92,
+183,128,176, 73,248,130,243, 35,214, 80,240,225,178, 32,232,206, 54,215,195, 67,175,211, 26,175, 67,198,168, 32, 76,224, 53, 70,
+195,138,136,234, 7, 93,224,156,132,175, 72, 2, 28,183, 61,110,208,224,145,164,217,229,219, 53,224, 60,157, 16,214, 13, 6,132,
+117,217,240,201,235, 87, 58,145, 88, 49,157,166, 93,212, 5,134,119, 22, 57, 11,144,198, 57, 39, 36, 54, 5, 54, 9,255, 33,119,
+ 2,172,210,174,183,162,207, 6, 38,200, 33, 91,178,164,233, 5, 57, 56,195, 26,129, 2,188,125,251, 22,235,178,128, 80,148,173,
+238,176, 46, 65,187,124,125,118,144,129,101,219,154, 40,153,102, 90, 68,146, 41,140, 64, 91, 44,136,133,169,158,136, 96,134, 1,
+110, 26, 49,157,207, 98, 23, 12,177,137,162,115,145, 96, 25,176, 1, 49, 48, 14, 67,139,216,149, 48,151,128, 97, 28,240,233,167,
+159,224,233,233, 34,122,144, 34, 52,192,162,187,145,214, 12,114, 39, 50, 85,212,114, 19, 52,178, 76,242, 64,132,162, 7,122,204,
+165,193,207,218,215,213,144, 21, 50,250,117,114, 58, 23, 42, 90,144,236, 34,242, 82,117, 12, 69, 2,191,138, 22, 47, 92,160,185,
+244,164, 98,111,179, 23, 49,154,202, 87, 5,117, 85,122,108, 78,227,248,103, 85, 10,255,125,136,175,223,109, 87,187,245,135,247,
+ 9,109,154,108,117,171,110,167,231, 42,120,121,208,176,210,122,202, 33, 80,134,200,236,193, 24,116, 68,112, 10,133,237,246,247,
+224,170,177,110, 99,144,195,238,178,183,192, 49,193, 26,146, 32,142, 44, 97, 42,147,179, 56,121, 39, 43,193,156,181, 27,149,139,
+191,118,185,198, 48, 60, 19, 12,196, 30,150, 32,162, 17, 20, 32, 70,181, 51,177, 80,196, 12, 21,140,198,192,123, 70,166,140,101,
+ 11,210,237,176,145,157,155, 90,125,178,142, 4,157,179, 48,206,128, 44,193, 13, 30,211,105,130,113,226, 27,247,158,225, 7,134,
+247, 6,126,180, 24, 6, 3,127,178,240,163,129, 27, 44,140,229, 86,137,135,152, 16, 82,145,155, 74,171, 99,210,169,131, 33,130,
+183,128, 99, 70, 82,171, 6, 74, 18,223,163,177,136,108,145,172, 65, 32, 32, 21,106,251,157,220,186, 13,179, 39,178,180,216, 84,
+ 28,162, 88,123, 54,157,124, 46, 25,187, 20,130, 14,135,248,237, 5,184, 99,140,243,193, 98,198,140,150,112,214,175,122,234,154,
+232, 88, 96,210,111, 20,207,181,136, 94,106,203,158,206, 26,217, 43, 80,209, 37,209,221, 8, 65, 95, 80,203,223,142,195,219,235,
+ 57,168, 18,232, 0,153,249,174, 98,228,165, 21,215,111,226, 68, 52,106, 98,231, 78, 56,132,205, 40,110,210,232,225, 46, 15,140,
+ 26,229,171,220,134,154, 74, 21, 54, 92, 46, 23, 76,211, 36,200,211,156,113, 93,102, 25,101,103,104, 36,168,140,195, 11, 21, 24,
+125,248, 23, 21, 50,213,189, 99, 85,242,198,156, 17,115,130,245, 30,243,188,225,171, 47,190,198, 63,251,189,159, 97, 60, 1,238,
+100, 16,201,192,156,239,225,137, 16,222, 61, 33,100, 96,205, 25,151, 32, 7,109, 80, 64, 74, 42, 25, 31,158,158, 48,157,207,112,
+222,239,228, 71, 5, 39,173,155,248,180,137,118, 17,155,245, 35,214, 16,112,186, 63,131,140,116,221, 79,151,185,117,211,167,211,
+ 25,243,188,128,141,213, 28,114, 39, 29,121, 46,202,137, 39, 44,243, 38,100,182,235,130, 24, 51,222, 63, 62, 33, 22, 32,182, 73,
+ 83,133,158, 80, 19,116, 86,187, 44, 17, 97, 28, 71, 12,227,128,211,121,194,178,174,187,112,139,128,148,164, 99, 60,159, 79, 48,
+198,194,251,177,137,227,100,244, 12,132, 45, 96,240,131,144, 39,147, 56, 68,188,151,152,215,243,249,132,156, 51,174,215, 25,222,
+ 15,112,118,196, 60,207,184,191,191,195,229,114,129,115, 86, 39,133,117,236, 91,158,137,160,251,156,143,186, 22,101,102,140,211,
+136,235, 44,194, 65,107, 44, 78,227,168, 46,129,140,105, 26,154, 19,231,116,158, 84,207, 32, 46, 12,210,169, 86, 78, 25, 41,198,
+157, 97,161,247,158,117,130,218, 53,234, 59,175, 89, 24,165, 20, 44,203, 34,104, 93, 72, 26,157,215, 9, 75, 84,127,124,209, 0,
+ 21,209, 77, 4,248,113,130,177, 14, 91,216,244,243,223, 48,142, 39, 76,227, 73, 34, 86, 99, 84,187,157, 84, 5, 82,160,239, 72,
+214, 26,203,251, 76,216, 93,233,165, 47,104,200,159,137,112,203,254,140,146,103, 47, 29, 34,163, 27,228,166,123, 15, 82, 93,243,
+214,168,239,156, 95,182,207,190,208,100,183,241,251, 63,246, 80,127,249,128,223,247,162, 53, 25,235,121,164,235, 30, 53, 73, 10,
+192,101,226, 67, 62, 11,181,139,141,219, 40,212, 28,186,176, 46, 48,228, 54,246,181, 10,155,180, 10, 43, 57, 31,228, 93,172,163,
+255,234, 50, 17, 47,118, 6,178,216,213, 6, 67, 56, 15, 22,172, 83,132,154, 34,198,144, 96, 21, 33, 61, 1, 86,173, 97, 49, 69,
+148, 74,185,202,208, 52, 54,106, 81,163,166,136, 56,206,121,139,136,140, 53, 37,100, 13,143,129, 70, 66,130, 36,111,218, 89,134,
+243, 22,214, 59,192, 50,134, 73,110,124, 34, 1, 74,142,206, 98,114, 6,167,193,227,228, 61,166,209,201,127, 30, 60, 38, 47,161,
+ 19,134,185, 85,171,185,136, 21, 69,172, 31, 69,215, 10, 6, 12,134,211,110, 46, 54, 15,187,146,245,216, 32,177, 69,114, 22,129,
+180,218,204,208,209,156,138, 63,176,239, 1,155,142,178, 93,129, 59, 54,114,143,125,201,173,234, 63,206, 93,122,239, 87, 63,130,
+207, 71,100,107,167,174,166,255, 66,135,250,237,212,169, 95,217, 84, 49,158,140,218,107, 88,202, 14, 69, 66,185,245,194,227,163,
+ 63,183,239,220,137,247, 84,153,222, 37,210, 71,176,126,172, 96,126,233,240,127,233,181,236,239, 75,217,187, 16, 58,170,107,235,
+244,175,114, 20,234, 96, 62,163,118, 4, 73,246,162,134,224,199, 17, 91,140, 45,104,195,120, 81,190, 95,175, 87,241,189,235,142,
+179,142,111,141,181, 50,102, 15,241, 96, 69,108,192, 28, 99,177,197, 32, 1, 42,222, 99, 43,192,117, 43,248,213,231,255,128,127,
+241, 95,255, 12,211,235, 19,200, 79,224,243,189, 76,236, 30,103, 92,174, 11,222, 95,174,224, 97,196,154,147,220, 67, 84,148, 63,
+190,105, 16, 11, 16, 66,148,110, 79,243,192, 55, 85, 67,167, 44,215,110, 72, 25,126, 60, 33,149, 44, 48, 22,195, 88,214,165,221,
+227,203,178,106,112,136, 6, 47,105, 87, 92,106, 92,107,202,152,231, 5, 68, 6,243, 18, 16, 83,198,135,199, 11, 50, 17,100, 98,
+190,227, 62,169, 91, 55, 2,123, 44,175,113,146,101, 62,120,135,187,187, 59,177,147,169,247, 39,233,125, 20,226,134, 45, 6, 17,
+225, 2,184,187, 59, 99, 26, 6,196, 45,226,124, 58,225,254,124,198,186,174,200, 57, 97,154,166,134,113,246,222, 97,154, 70,228,
+146,176,204, 1,219, 26, 64,196,184,187,187, 19, 59,219,182,234,253, 99, 16, 67,198, 56,142,240,126,208,233, 88,105, 93, 96, 91,
+ 5,169, 23,191, 6, 28, 89, 63, 32, 70, 89, 89, 16, 10,150,121, 65,138, 17,119,167, 9, 33, 6, 76,211,136,111,223,189,131, 49,
+140,207, 62,251, 20,160,234,137, 47, 48,206,163,164, 44,218, 21, 69,116, 85,107, 94,140, 9,167,113,146, 3, 47,229,102, 87, 46,
+250,186,114, 18,207,248, 26, 36, 55,224,116, 62,107,132,170, 64,180,140,151,152, 93,227, 60, 46,215, 69, 82,206,200, 40,201, 18,
+152, 47, 51, 6, 63,226,114,125, 58, 70,157,162,111, 16,187, 32,231, 93,120,210,156, 63,187,113,196,180,226,180, 41,252,193, 96,
+ 50, 7,135, 73,157, 42,239, 16, 15,157,244,245, 19, 57,162,102,181,171, 80,155,166,140,175,239, 65,165,102, 86,187, 22,117,217,
+ 20,234,166,120,126,168, 83,249,237,104,113,120,169,211, 62, 62,152,233,102,207,126,216,125, 86,146, 92,214,240,144, 94,148,208,
+139,128,244, 66,175, 57,212,242,239,162,177,221,153,123,236, 43,218,206,177, 29,232,117,188,219, 91,124, 25, 77,209, 88,147,143,
+140, 33, 97, 19, 43, 32,230,236, 45, 78,206,128,114, 66, 78, 89, 31, 88, 4, 74, 25, 86,167, 15,204,128, 51,226,117, 79, 73,148,
+190,242, 48,212,176, 25,173, 56, 12,137, 40,205, 25,134,243, 6, 33, 71, 36, 48,200,122, 8,203, 86,107, 77,150,157,214,224, 61,
+134,105,132, 25, 44,216, 18,238, 30,206,184, 59, 13, 32, 74,112,134,112, 30, 29,238, 38, 57,200,207,211,160,127, 60,198,209, 99,
+112, 78,132,121,196,216, 66,194,178,109, 8,185, 96,222,130,132, 77,232, 77,106, 20,246, 96, 72, 58,130,102,255,208,106, 41,179,
+ 65,241, 30,217, 58, 68, 34,185,253, 52, 62,176,237,181,154,169, 10, 7, 34, 91, 41, 56,232, 35,118,219, 64,183,213, 81, 83,106,
+169, 75,247,103, 90,142,253, 32, 47,109,167, 94, 26, 5,240,191,196,161,222,135, 9,213,132,172, 67,224,144, 94,131,220,237,172,
+169,167, 28, 22,124,175,157,253,179, 81,127, 39,170,185,181,126,190,212,137,223, 42,227,191,171, 91,127, 46, 86,165,103, 78,213,
+ 42,134, 98, 34,100, 42,141, 79,144, 75,233,192, 90, 89,119,174, 4, 63, 12, 58, 94, 4,236, 48, 98,217, 54,204,243,130, 97,244,
+ 96, 98,196,173,242,207, 5, 40,146, 74,110,150,178,156,114,235,108,114,150,235, 59,107,183,147,178,132, 12,165, 82, 0,246,152,
+238,223, 96,205, 9, 95,126,254, 75,252,225,207,127,142,225,124, 2, 89,128, 70,143,248,238, 17, 31,222,125, 64, 72,210,169,155,
+105, 4, 57,139, 53, 8, 28, 38,132,168, 2, 52, 70, 8, 26, 96, 50, 12, 66, 84, 68,129,247,131,210,222, 60,150,117, 67,108, 93,
+111,128,113, 6,185,100,132, 24, 36, 48, 6, 56, 76,134, 8,132,117, 93, 81, 98,145,188,245, 24, 17, 66, 68, 72, 5,203,150,112,
+157, 87, 68, 21,100,101,146, 63,189,194,157, 25,237,185,117, 58,143,210, 69,151,140,101,221,192, 36,112,153,211,233,132,235,245,
+138, 92,168,229,187,215,113,109,221,171,111,203,130, 87,175, 94,225,124,154,224,189, 69, 8, 1, 94, 15,216, 92, 34,198,105, 80,
+ 59, 89,196,221,221, 89, 26,136,148, 16, 99, 66, 8,162,225,121,120,184, 71, 41, 73,125,239, 3, 66,136, 66, 28,236, 28, 2,125,
+ 70, 71, 21,136,161, 59, 43,114, 41, 56,157,197,223, 95,114,238,183,157, 34,114,203, 9,195,224, 37,182, 21,192,233,116,194, 56,
+ 78,184, 94,101, 18, 50, 12, 35,114,138, 26,122,195,141,150,151,146, 20,145,131, 31,112,154,100,255, 95,138, 28,216,245,240, 43,
+ 76,205, 97, 19, 82, 68, 33,192,143, 3,252, 48,192, 57,135, 45, 68,204,235,138,187,251, 7, 88, 39, 4,196,148, 69,239,129, 82,
+ 16, 66,132,119, 78, 99,179,105, 95,245,154, 10,123,202,173, 40, 59,232, 98, 42,225,173, 67, 60,191,196,186,232,255,142,123, 12,
+122, 55, 21,167,142,108, 90, 71,246,226,124,160,142,170, 89,208,199,139, 86,161, 96, 81,103, 76,233, 34, 48,179,114,234,219,161,
+158,170,111,145,202, 63,170, 67,191, 69,187,114,247,112,189, 61,204, 15, 15,220,130, 23,199,242,187,162,184,238,164,118,255,250,
+ 94, 59,148,166,198, 63,168,246,129, 99,216,133, 76,185,219, 7,213, 14, 3,173,128,170,207,157, 33,251,244,129, 9,103,239,112,
+114,140,146, 98, 35, 6,201, 4, 32, 43, 74, 81,236, 95,222, 48, 76, 19,195,136, 5, 41,101, 96,203,234, 77,213,149,129,213,194,
+193, 24,131,121, 13,200, 36,123, 72,182, 14,198,186,134,250,100, 54,152,166, 81, 14,117,199, 24, 38,135, 79, 62,121,192,195,221,
+ 4,207,192,253, 56,224, 52,122, 16,139, 90, 62,233,222, 39, 22, 9, 36,189, 44, 27, 46, 75,192,101, 13,248,112, 93,112, 93, 3,
+182, 84, 16, 99,145,142, 5, 34,142, 19, 27, 27, 96, 32, 54,187, 84, 84,112, 66,106,141,179, 30,217, 14, 8,108, 16,137,144,116,
+228,158, 43, 96,162, 0,166,176,238,152,240, 29,135,204,203, 56, 85,234,119,233,116, 28, 21,213, 93,241,126,147, 72,255, 88, 21,
+ 49,183,157,122, 93,161, 84,129, 75,157, 2,125, 12, 24,115,184, 17, 1,192,240,139, 62,114,166,126, 85,115,163,227, 40,191,217,
+ 42,247, 49,251,218,126,168,151,166,112,191,157,102,189,164,104,127,233, 63,223,190,198,103, 30,252, 91,201, 43, 85,143,237,254,
+190,113, 29,211, 19, 61,227, 13,140,227,208, 60,188, 49, 73, 7, 46, 16,164, 8, 6, 97,112,190, 43,220,116,106,195, 59, 76,168,
+130, 73,138, 38,154, 73,254,156, 60,144,147, 10,179, 10, 50,238,238, 30,176,109, 43,150, 28,241,238,155, 39,124,251,229, 59,252,
+241,127,243, 79,225,207, 6,197, 18, 56,100,204, 31,158, 16, 0, 44, 41,227, 26, 3, 54,245, 2, 59,235,192, 16,133,185, 29,188,
+112,215,201,128,141, 81, 85,122,108,234,113, 54,166,145,232,234,252,117,158, 47,173,249,145,177,108, 18,235,148, 66, 88,228,186,
+ 79, 24,134, 1,206, 90, 44,235,138, 66,140,121,141,184,180, 3, 93,197,164, 58,242, 23,108,106,214, 85,154,195,233, 60,226,238,
+254,132,233, 52,224,124,158, 0,146, 40, 89,107, 68,132,229,189,151,117, 89, 8, 8, 49,168,173,137, 26, 86,185, 54, 31,219,186,
+ 98, 89,103, 92, 47,151, 22,217,234,188,149,207,169,100,140,227, 32,180, 49,203,152,166, 17, 4,194,245,186,136, 35, 3,128,117,
+ 12,107, 45,174,215, 43,166,113,194,229,114,213, 78, 83, 15,141, 10,198, 41, 89,216, 6,181, 59,173,194,103,102,132, 40, 66, 61,
+ 99,141, 76,104,180, 37,147,244, 59,135,203,117, 6,105, 94,252,117, 94,154,174, 32, 6,241,221, 27,231, 48,157, 70, 41,232,114,
+108,104, 99,107,101, 58,185,172,139,240,235, 13, 55,161, 97, 5,218,164,140,182, 6, 33,125,158,174,155,136,148,207,231, 51,252,
+224, 1, 2, 46, 79, 87, 16, 73, 74, 95, 41, 25, 49, 4,137,229, 77, 82,204,149, 2,148,148, 58, 87, 87, 31,200, 68,186, 7,231,
+131, 83, 97, 79,117,228,110,226,181,219,176,203, 11,162,113,116, 2,227, 46,180,100, 95,233, 85, 71,149,130,110,110, 11,251, 93,
+123, 81,147,229, 88, 5,125,245, 62,150,135,137, 49, 6,102,242,227,159, 85,148,158,102,226,128,126,203,241,123, 61, 32,123, 75,
+208, 78,145,123, 89, 17,221,146,102, 58,149,243, 81, 33, 72, 7, 79, 57, 83,205,237, 62,194, 63, 62, 54,118,111,197, 3, 58, 64,
+ 72,205, 89,168, 49, 46,109,172,122,204, 81, 55, 5,176, 36, 34,185,179, 53, 24,184,198,132,106,148,169,170, 17,173,126, 16,198,
+ 8, 81,206,212,209, 9,145, 40,128, 11, 16,138,136, 62, 90, 82, 27, 21, 88,245,212,206, 33, 98, 14, 25, 79,203,134,216,217,255,
+ 13, 11,181,200, 88, 85,178,123,131,251,251, 19,126,240,233,107,188,190,155,112, 63, 58,188, 57, 79,152, 6,135,172,157,213, 26,
+ 19,174, 91,196,251,203, 5,239,158,102, 60, 94, 87, 60,205, 1,151, 37, 97, 73,132, 37, 1, 33, 1,107, 16,222,244, 56,142,152,
+166, 65,208,136, 49,195, 40,140, 38,233, 5,212, 42, 98,235,145,157,208,228,130,238,219, 75,202,141,135, 92,189,220, 7, 65, 34,
+ 29, 15,242, 62,207, 30, 55,126,244,190, 75, 61,136,198, 64, 55, 85,111,106, 55, 69,237, 24,136,159,119,234,220,169,212,129,239,
+215,201, 54,187,206, 11, 48, 36,211,171,222,219,181,114,115, 88,190,212,149,211, 17, 1,251, 82,177, 80,139,201,190,155,238,239,
+165,219, 63, 31, 27,179,255,166,105, 68,253,222,124, 67,117, 46, 29,148,206,152,202, 45,168, 19, 45, 77,169, 82, 97,148, 97,171,
+121,218,177, 37,152,165,154, 35,160,118, 28,195, 86, 80,161,186, 63, 39,210,201, 71, 46, 42,144,211, 2,162, 18,185, 64,176,206,
+203,126, 26,178,191,150, 29, 89, 64,138, 5, 79, 51,240,247, 95,252, 10,156,174,248,131, 63,248, 25,220,155, 7, 20, 34,108,239,
+ 31,241, 52, 47,216, 10,240,180, 44,226, 52, 97,134,115, 30, 40,114,168,179, 53, 13,124,148,181,105, 97,102,196,144, 26,245, 45,
+132, 77, 34, 71,153, 16,131, 4, 35,129,128,117, 89, 52,163, 93, 94, 91,202,177,221,155, 81, 59,173,117, 93, 69,167, 18, 11,222,
+ 63,206, 72, 69, 30,178,185,106,127, 12,239,108, 10, 61, 4,152, 9,198,114,235, 74,235,184,156, 0, 12,227, 0,107, 24,215,203,
+ 19, 94,189,122, 85, 75, 35, 76,231, 9,227,224, 97,140, 16,221,106,227, 49, 77,131,174,200,118, 91, 84, 8, 17,235,186, 97,154,
+ 38,164, 20, 48,140, 14,147,118,237,211, 40,158,245,101, 89,112, 58,143, 13,238,178, 44, 11,134, 97, 84,218, 28,169, 40, 84,138,
+ 24, 98,130,183, 78, 1, 39, 53,175,131, 20,146,165,162,125,181,144,237,150,227, 58,206,151,130, 36,108, 81, 17,172, 5,235, 26,
+ 96,140,197,124,157,145,147, 76, 68,188,151,226, 38,167,208,232,113,137, 4,186,228, 7, 47,130, 83, 8,196,139,173, 20,104,213,
+ 42, 90, 84, 67, 16, 66,212,160, 27,209, 45, 60, 61, 93,241,240,112,143,109, 91, 97,173,195,245, 58, 35,132, 13,167,211, 73,172,
+186, 68,106,241, 83, 77, 80,221,119,215, 40,214,166,174, 63, 78,225,122,119,214,115, 21, 59,186, 64, 52, 58, 62, 8,107, 17,208,
+221, 79,253, 68, 25, 55, 58,151,151, 32, 90,153, 68, 52, 93, 35,121,187, 81,243, 94, 4,232,191,104,143, 7, 32,253,103,139,228,
+142,150,156,231, 72,248, 99, 64,203,199, 70,150,183,107,125,218, 83,212, 72,210,203, 8, 71,222,118,191,255,168,130,160,174,129,
+111,158,226, 3, 55,251, 5, 28,232,193, 75, 93,196, 87,207,200, 48, 92,127, 95, 21,182,168,141,195, 40, 19, 94,148,173,117,212,
+190,119,143,181,139, 5,147, 90, 32,128,162,227, 52,176,193,154, 10,214, 76,184,134, 94, 29,114, 55, 0, 0, 32, 0, 73, 68, 65,
+ 84,132, 53, 17, 98,200,136, 37, 98,100,160, 88,192, 21, 2,167, 36, 0, 14, 54,120, 56,143,120,251,112,198,253,224, 96,203,128,
+145, 45, 98,220, 48, 94, 9,151, 37,226,113,222,240,120, 89,176,172, 17,243,178,180,164,159, 76, 35, 66, 54,152,215, 21,243,186,
+233,232,211,224,254,254, 30,222, 25, 44,243,162,133,129,238,255,181,242, 33, 48, 50,239,228,186,157, 42,215,237,132,154, 14, 46,
+239,233,126,157,159,188, 21,107,135, 81,222,203,172,117,165,212,116, 25,166, 29, 18,176,113,251,243,179,137,206,179,177, 52,253,
+118,215,106, 79,253,120,214,209, 87,239,249, 13,104,166, 95, 44,145, 42,224, 43, 52,232, 31,243,207,111,196,196,126,207, 41,217,
+173,168,135,202,158,142,213,143,222,119,107, 76, 55,217,170,130,189, 12,201,148,206, 66, 52, 4, 72,131, 73,178, 64, 77, 82,144,
+162,207, 59,192, 57,204, 49, 34,164, 8,182, 22,105,222, 96,172,228,156,199,146, 5,169,170, 83,182,156,116, 60,206,140,193, 13,
+ 88,182,160, 86, 51,130,179, 30, 79, 79, 31,224, 45,161,132,130,187,183,111,113,157, 25,255,234,255,252,127,240,230,179,183,248,
+ 31,255,231,255, 9,230, 53,193,156, 60,172, 51, 72,215, 89, 83,251,132, 50, 70,196,152,175, 87,185, 26,131,166,178, 17, 99,213,
+ 49,188,181,174,249,159, 73, 31,238,243,188, 52, 11, 84, 74, 5, 41, 5,132, 77, 69,162, 36,197, 14, 17, 35,198,154,153, 46,135,
+182,232, 84, 10, 62, 60,205,162, 59, 73,242,126,181,162,143, 5,189,219, 51, 57,196, 94, 42,162,181,233, 52,226,233,233, 61, 62,
+249,196, 10, 97,210, 48,198,193, 43,248,106,195,143,126,248, 41,230,101,197, 22, 34,166,211,132,111,191,249, 22,254, 60,160, 6,
+ 22, 49, 19,156, 21, 42,222,229,233,210,196, 86,131,134,237,156,207, 39,188,255,240, 45,156, 51, 56,157, 38,248,193,226,205, 39,
+ 15,184,206, 23, 45, 46,228, 51, 22, 43, 90,129, 97,146,252,111,236,136,218,162,188,115,102, 22, 86, 6, 32, 25,235,216,233,110,
+168,187,238, 78,171, 17, 98,128, 51,166,221, 83, 37,100,113, 1,100,224,253,187,247,152,198, 17, 49,206,136, 49,227,241,233, 9,
+126,120,141,243,221, 61, 46, 31, 62, 32, 69, 89,211, 76,131,135,117, 22,227, 52,226,233,233, 73, 44,110, 81, 24, 1,214, 90,209,
+ 10, 92,103, 48, 59, 24,231, 16, 66,192, 50, 7, 57,199,140,129, 97,113, 69, 92,231, 43,172,149,233,204,135, 15,143,152,166, 81,
+ 66, 96, 92,110,209,185,185,164,125,229,132, 42, 88,227, 93,191,115,195, 70, 57,100, 74,148, 35, 20, 43,223, 30,250,186,107, 55,
+149, 89, 81,181, 58,180,135, 47,245,150, 94,113,127,153,125,255, 94,241,177,117, 84,223,101,163, 84, 40, 77, 29,199,203,179, 93,
+137,114, 71,149,242,111, 31,216,242, 18,240,162,239, 98,184, 27,133,191,208,168,189, 60,138,108, 49,146,232, 70, 12,249,176, 55,
+173, 6,190,230,131, 46,180,211,228, 90,100, 30, 14, 65, 27,123,103,212, 31,232,251, 72,184, 31, 10,139,247,152,155, 23,178, 9,
+ 94, 84,237,201,165, 75, 26,171, 40,218, 92, 3, 61,118,113, 71,209, 27,177, 42,138, 11, 17, 98, 1,230, 84,176, 21, 66, 98, 35,
+ 30,116, 50, 8, 37,129, 83, 22, 68, 35,103,176, 99,156,239, 60,238,166, 17,175, 78, 35,238, 71, 7,147, 3, 56, 69,124,216, 34,
+174,115,194, 63,124,249, 14, 95,124,245, 30, 95,127,184, 98, 73, 66, 92, 26,199, 19,134, 97,130, 27,206,200, 84,144,153, 16,178,
+216, 63,136, 19, 10, 65, 30,122, 57, 54,240, 72,243, 71,214,113,122,179,159,113, 43,174,246, 61,114,217, 11,167,210, 28,255, 55,
+ 31,235, 81,205,126, 24, 19,119, 6,234,102, 65, 44,157,229,170,221, 28, 61,119,160,252,198,131,238,187,148,226, 47,217,217,234,
+165,120,219,165,183,238,191, 19,186,244, 1, 46,212,173,151,116,222, 35,170,241, 94, 8,247, 29, 10,248,103,135,246, 71,232,114,
+191,105, 79,255,162,207,254,102,236, 95,241, 89,212,117, 21,212,197,226,102, 20,184, 98, 52, 12,103,175,202,119, 64, 6,169,103,
+184,224, 52,141, 40, 41,193, 25, 3,114, 12, 54,132, 85, 39, 12,103, 67,130, 33,133,230,210,149,253, 94, 78,144,209, 53,103, 77,
+ 53, 52, 14,219, 22, 16,182, 32, 63,223, 59,172,203,138,148, 51, 46,215,132,113,152,176,241,134,149, 11,182,243,167,248, 95,254,
+215,255, 11,191,247,207,255, 57,254,232, 95,254, 62,238, 63,253, 4,159,127,241,107,196, 16,112, 26, 6, 60, 70,177,170, 17, 25,
+181,110, 38,177,163,142, 35, 46,243, 2,103, 77,123, 63,230,121, 70, 12, 1, 84,196, 42, 85, 16,229,208,215,251,212,217, 1,155,
+ 17,127,176, 32,110,245, 97, 73, 50,194,207, 5,216, 86,233, 42,183,144,196,234, 84, 0,235, 61, 10, 0,107, 61, 98, 12,178, 31,
+ 38,128,217,182,157,112, 78,165,121,231,199,113,130,181, 35,190,249,230, 91, 32, 23,220,223,159, 53,152,196, 75, 60,106, 88,241,
+238,253,215,136, 81,168,122, 40,192, 55, 95,127,141,251,251,123,228, 82,176, 69, 97,182,223,223,223,225,213,235, 87,120,124,255,
+136, 16, 36, 72,234,124,150,137,135,115, 22, 49, 6,108,155,140,246, 31, 30, 30,192,252,187,248,234,171, 95,131,200,192,143, 30,
+243,188,182,195,166,141,137, 33,133,207, 52, 77, 34, 48, 92, 55,201,235, 54, 6,167,243, 25,243,229, 34,207,178,218,164,232,181,
+ 66,204,109, 23,188,165, 0,199, 22,198, 24,201, 84, 87, 97, 91, 81,177,156,104, 94,228, 82,187,206, 87,188,126,117, 47,130,198,
+ 44, 79,225,101, 89, 91, 52,236,253,221, 93,179, 86,178,106,143,214, 69, 2,106,182,152,177,174,155, 36,209, 13, 30,204,210,168,
+124,243,245,183,248,244,179,183,136,225, 43, 89, 59,176,193,182, 45,141,211,254,112,255,128,199,248, 36, 97, 86,134,165,177,201,
+ 25, 80,117, 58,202, 13, 37,243,197, 64, 39,153, 40,212, 61,248,158,151,246,124,239,149,251,231,200,174,251,110, 16,168,250, 96,
+ 49,178, 31, 86,170, 92,105,207,133, 98,185,129,120,170, 40,151,250,103, 71, 93, 15,178,233,132,114,109,183,132,151,187,168,239,
+248,135, 85, 1, 88, 15,129, 10,224,104, 15, 61,221, 49,247,138,248,219,239,169,233,195,135,255,149,186,180, 43, 34, 1,248, 21,
+ 58,118,195,253,239, 72, 68, 48,253,136,254, 38,224,162, 89,123,106,240,252, 45,172,163,166,173,145,193,192,132,129, 11,238,189,
+ 64,101,146, 34, 90,147,254,166,214, 8, 64, 35,231, 0, 71,192,104, 13, 44,201,200, 29, 96,245,158, 27,172,186,123, 22,101,167,
+168,190,201, 90, 68, 54,184,196,132,144, 11,130, 38, 18,181,130,197, 84,165,166, 96, 98,239,207, 19, 62,123,115,143,207, 30, 38,
+220, 15, 4, 46, 25,215,203,130, 47,191,157,241,247,223,110,248,171,191,255, 6,159,127,125,197,251,149, 16,202, 0,114,119, 32,
+123, 70,230, 9, 69,189,239,243,188, 96, 94, 22,196,180,193,218,130,209, 25,132,101,197,122, 89,132, 56,134,172, 15,185,218, 49,
+ 23, 36, 50,200,205,163, 78, 50, 86, 77,185, 93,112, 57,151, 99,200, 24,209,115,252, 46,237,220,190,151,188, 86,185,195, 42, 10,
+216, 8, 13,236, 80,244, 64, 47,205,206, 86, 90,218,222, 46, 92,163, 54,206,226, 67,152, 15,181,201, 74,191,154,217, 57,203,221,
+225, 95, 74, 99, 28, 16,237,215,198,161,232, 67, 7, 66, 82,184, 77,221, 69,247,175,191,174, 45,110,125,231, 47, 22, 35,189,148,
+164, 28, 17,202,253,239,219,107, 6, 94, 26,191,127, 31,197,125,211, 39, 52, 12,238, 62,149,227,238, 97, 66,135,162, 87,169,128,
+138, 11,101, 35, 1, 63,206, 89,176, 97,204,203, 34,145,163, 57,195, 15, 35, 88, 15, 69, 98, 86,200, 12, 55,107, 86, 29,193, 54,
+ 80,143, 49,216,182, 13,198, 24, 56, 47, 94,105,231, 61, 46,139,236, 64, 79,231, 19,166,179,135, 51, 30, 33, 49,214,101,195, 23,
+191,248, 37,254,244, 95,254, 41,206, 22,136,203,138,203,227, 19, 2, 10,214, 20,129,194,240,254,132, 68,192, 22, 2,140,119, 32,
+ 54,141, 56,199,198, 98,158, 23, 77, 40, 44,202, 53,207, 13,211, 73, 68, 88,215, 32,221,122, 72,154,217, 77, 72,169,128,201, 98,
+219,130, 82, 29, 5, 14,181,198,132,235,178,194, 79, 35,216, 57,141,229, 20, 27,106, 77,122,107,249,222,108, 96, 21,239, 90,173,
+140,206,123,249,153,203, 10,102,177,181,165, 28,165, 59, 29,134,182, 18,100,150, 36,178, 31,252,224, 51, 12,163,199,195,171, 7,
+ 92,174,210,125, 58,231,164,251, 28, 79,178,187, 94, 37, 97,207, 90,177,169,189,122,245, 10, 49, 5,196, 44,220,120, 2,112, 58,
+ 77, 32,146,213,131, 53, 22,231,187, 51,174,215,185, 9, 9,147,218,186, 10,213,216, 83,134,179, 2,201,202, 58,181,217,214, 21,
+214,116,156,242,220, 89, 37, 11,186,189,178, 90, 95,213,207, 63, 77, 39,161, 90,150,125,178,231,189, 19,222,190,170,229,183,117,
+211,161,157,234,118, 82,106, 83, 82,235, 36, 79, 62, 70, 89, 25, 18,177,118,233, 17, 49,236, 34, 64,239, 7, 13,245, 97,121,221,
+186,215,151,123, 73, 84,242, 49, 36, 88,107,155,189,112, 31,100,117,247, 16,181,248,175,174, 43, 63,176,198,247,251,155,246,200,
+232,231, 77, 6,119, 19, 72,180, 53, 70,123,102, 40, 56,167,234,177, 82, 11,158,209,159, 87, 93, 8, 57, 31, 92, 20,181,251,223,
+169,173,210,132,182,157,122,229,121,223,250,200, 95, 58,208,111, 59, 17,195, 86, 9, 94, 53,117,107,207,116,110,228,176,178,123,
+214, 43,103,184, 79, 73,163,146, 97,114,253,239,162, 49,100,157, 3,178,152, 8, 85,225,222,143,220, 75,227,182,183,152,138,155,
+177, 42, 53, 70,125,110,105,171,245, 97, 85,197, 17,253, 26,132,137,224,137, 49, 26,134, 47, 1,119,222,194, 41,153, 77,246,227,
+ 4, 99,228,245,150,146, 96, 74,198, 64,132, 81, 69,103, 41, 73,254,120, 68, 70, 84,159, 35, 49,161,144, 20, 36, 49, 39, 36, 16,
+ 34, 49,182,146,187, 93,122, 31,158, 34,135,131,161, 2, 99, 9, 15,119,119,120,251,250,140, 55,103,139,129, 18,194,178,225,221,
+227,130,175, 62, 44,248,252,221,140, 47,190,121,143,199,101, 67, 4, 16, 75, 86, 90, 86, 0, 49,193,120,169, 96,115,142, 40,105,
+197, 56, 16,222,190,185,195,221, 52, 98,189, 44,136,215,208,244, 10, 89, 61,202,172, 11,179,200, 6,217, 15, 72,214,137,231, 54,
+103, 85,111,238, 15,198,234, 75,168, 3, 18,234, 68, 86,165,244,249,245,165, 29,132,186,173,214, 27,105,159, 2, 48,145,160,125,
+ 75,217, 73, 41,245, 32, 87,107,162,188,123, 50, 30, 48,109,135, 94, 69, 38,187,176,178,125,248,173, 11,161, 54, 70,219,131, 96,
+168,203, 45, 46,173,179,228, 61,226,172,237,150,247,201,195, 94,168,238,246,176,125, 4, 87,225, 20,232,236,148, 31, 27,173,151,
+155,131,157,110,114, 17, 62, 38,146,251,152, 66,254,163,193, 49, 42,244,171, 89,223,224,227, 62,189,218,121, 42,243,190,199, 91,
+ 86,207, 52, 24,112, 78, 19, 0,153,112,185, 94,193, 4,156,166, 73,252,189,205,127, 47, 10,115, 67, 6,172,225, 29, 49, 38,189,
+ 94,242,174, 19, 34, 18,155, 28, 19, 98,206, 96,235,224, 6,143,101, 91,129,146, 48,120,131,117,222,224,252,132,152,129,167,167,
+ 43,190,252,234,107,132,199, 43,254,244,191,251, 35,240, 22, 16,182, 13, 95,125,251, 13,230, 88,176, 38, 5, 6,145,140,145,253,
+ 48, 32,149,220,246,204, 85, 76,150, 84,140,182,110, 27, 66,136,176,214,106,198,188, 8,226,150,121, 17,149,251,182,105,144,139,
+195,186,108, 96,146, 17,110, 42, 69, 45,116,144,177,123, 41,240,163,135,181, 70, 40,110, 58,110, 90,215, 25,195,224, 17, 21,153,
+107,172,136, 95,157,115, 24,167, 17,198,114, 83,216,135, 20, 80, 80, 48,142, 99, 11, 19, 98,195,136, 65,242,222,147, 42,210,115,
+ 78,184,187,191,195, 22, 54,148,146,177,109, 81, 38, 26, 91,208,239, 41, 93,241,186, 6,204,203,138,233,116, 2, 91, 9,125, 34,
+ 20,133,196,108,120,243,250, 21,190,253,246, 91,237,198, 79,237, 48, 44,250,115, 67, 42, 32, 99,229,208, 52, 70,169,150,132, 82,
+ 36, 33, 78,200,118,165,241, 68,184, 93,163,212,178, 15,118,178,163, 92,101,213,238,232,189,135,113, 22, 91, 16,108,109,136, 1,
+164,113,178, 91, 12,130,235, 77, 9, 92, 20,153, 29,196,199, 94,109,149,117,106, 82, 10, 75,252,172,170,232, 91,230, 64,202,186,
+ 99, 15, 24,207, 39,188,123,247, 14,167,105,194, 48,122,133, 86,201,132,106, 11, 81, 25, 12, 90,188, 60,155, 49,238, 91,192,250,
+ 44, 75,154,214,135, 67, 18,229,203, 61,111, 15,213,170,105,110,149, 78, 71,157,200,174, 38,210,165,220,169,216, 85, 80, 40,207,
+ 18,211, 14,173, 61,102, 58, 31,154,133,198,215, 40,141,253, 62, 41,124, 38,189, 40, 2,248, 62,123, 60,102,115,232, 74,158, 61,
+104, 74,111,225, 57,202,252,119, 6,172, 62, 88,233,165, 7,150, 40,232,249, 70, 16,135,158,141, 13, 1,194,244, 81,173,172,123,
+224, 10, 55,160, 78,188,112, 91, 85,213,239,207, 0, 60, 52, 78,181, 36,156,188,131,211,253, 76, 74, 64, 46,172,156,116,128,114,
+212,216,213, 2,239, 68, 85,154,114, 22,128, 11, 51,182, 44, 74,116,241,160, 43, 25, 77,229,136, 89,143,146,182,203, 45, 2,246,
+168,160, 19, 46, 66,173,243,206,226,213,253,132, 79, 94, 77,184, 27, 12,184, 68, 60, 93,174,248,245, 55,239,241,213,183, 79,248,
+250,253, 5, 79,215, 25, 41, 3,131,247,184, 59,157,112,127,119,194,235, 87,247,248,193,103,159,226,213,195, 25,167,209,194, 34,
+ 98,114,132, 55, 15, 19,206,147, 71,137, 1, 31,190,121,143, 18,119, 49, 98,175,237,200, 96, 36, 99, 1, 55, 32, 25, 39,177,132,
+ 85,129,174,130,193,150,147, 76,251, 14,189,127,143,143, 90,137,189,176,171,127,184,235,162,251, 83,141, 84,153, 93, 1, 48,149,
+106,149,245,231,239, 33, 42,116,176,135,181,216, 93,236,200,196, 58,141,225,103, 12,250, 62,169,172, 28,244, 32,212, 49,227,251,
+ 13, 86,189, 33,249, 70,156,246,108, 63, 79,187,100,245,187, 82,225,202, 17, 61,115, 19, 51, 76,207, 98, 99,191, 11, 74,115,251,
+117,189,103,190,253, 4,253,187,182, 7, 44,181,160,214, 7,148,114, 90, 10,237,211,147,210,145, 25,139, 30, 12,235, 38,185,222,
+175, 94,189, 82, 96,147,209,110, 46, 9, 72,197,187,102, 99, 43, 40,237, 64, 37,237, 80, 72, 31,140,133,196,166,180, 41,178,148,
+141, 17, 91,215, 52, 33,134, 21,126,240, 8,185, 96,217,130, 28,208, 57,224, 87, 95,252, 3,126,120, 26,241,211, 31,255, 24, 79,
+239,223, 99, 94, 3, 2, 15,184, 70, 18,108,108,145,132, 53,176, 1,169, 34, 58,165,210,198,242, 79, 79, 87, 20,144, 32, 98, 65,
+ 88,183,128,235,178, 52,210, 90, 74, 5, 81,189,209,168,150,188, 34,225, 51,243,182, 97,217, 54,181,225, 73, 22, 3,192,112,222,
+227,195,135, 71,204,203,138, 82,128,243,233,132,101, 94, 69,180,118, 18,248,203, 22,130,122,153, 69,144,204,204, 88,215, 5,231,
+251,179,120,208,163,216,207, 88,213,249,243,188,192,235, 56,121, 24,189, 68, 66,123, 39,116, 60, 99,112,189,138,223, 59,132,136,
+105,244, 56,157, 6, 17,131, 77, 3,230,101,129,115, 34,112, 27,252, 32,107,148,172,217, 22, 70, 40,129, 15, 15, 15, 66,215, 75,
+ 25,211,233,140, 53, 6,153,180,120, 39,225, 40,170, 77,178, 70, 82,229, 30,238,238, 0, 0,222,251,110,252,171,204,244,156, 27,
+121,177,145, 30,121, 23,128,177,234, 23, 82, 78, 2, 35,178, 6,134, 89, 15,108, 86, 22, 64, 66, 74, 1,206, 59,105, 16,141,107,
+ 94,239,148,146,250,217, 69, 8, 23, 99,105,177,175,155,234, 37,140,181,250, 51,164,224, 40, 84, 48,207, 11,156,247, 88, 23, 41,
+234, 6, 63,202, 24, 63, 37,133,199, 8, 44, 76,154,174, 23, 26,215,210, 65, 97,106,135,221, 5,140, 20,148,239, 12,134,186, 29,
+120, 87,246, 61,221, 76,228,234,193,124, 59,145, 43, 31, 9,121,234,197,180,135,245,183,190,215,221,248,253,165, 78,253,123, 30,
+234,100, 62, 10,195,216, 3, 48,246, 39, 23, 83,147,161,247,250, 62, 97,183,223,206, 34, 91,231, 15,101,187,211, 77, 80, 76, 7,
+ 13, 40,251, 46,100, 15,221, 56,238, 65,111,137,119,245,125,108, 0,154, 66,240, 16,139,154,103, 96,100,134, 55, 6, 40,172, 33,
+ 6, 18,204, 98, 20,122,234, 88,211,214,212, 11, 19,115, 70, 2, 35, 50, 99, 75, 25, 91,214,189, 75, 29,238,232, 1, 79, 70,217,
+196,245,213,150,157,120, 87, 95,151, 53,192, 52, 58,220,223, 13,120,125, 30,113,114,132,146, 54, 60, 62, 94,240,237,251, 39,188,
+127,188,226,178, 4,160,200,248,238,213,195, 3, 62,121,253, 10,159,188,190,195,253,221, 25, 15,119, 39, 56,206,112,136,120,125,
+242, 56,217,130,187,129,225,168,224,242,254, 17,151, 15,115,211, 32, 84, 16, 74,229, 16,103, 50, 72,198,162,184, 1,137, 77, 27,
+ 7,229,230, 2,232, 96, 11, 29, 15,189,183,169, 29,162, 85,113, 11, 35,210, 34, 65,255,189, 61,247, 93, 29,163, 53, 75,184, 75,
+ 34,170,224, 32,194,243, 67,189,178,231,219, 88, 94, 43, 64, 38,122, 94, 55, 80,133,159,116, 9,128,109,236,108,244, 79,239, 29,
+ 47, 7,110, 2,127,164,139,110, 7,117, 21,215,252, 38,187, 91, 31,250,208, 93,199,125,167,222,239,198, 63,230,125,127,233, 96,
+127, 17,129, 91, 58,219, 77,169,152,140,174, 16, 99,128,120,199,130,214,224,157,210, 74,209, 93,231,112, 58,159,225,156, 1, 74,
+193,224, 61, 12, 27,120,231,132,240,181,109, 88,215, 21,222,249, 54,110, 14, 49,202,123,174,247,153,117,182, 81,224, 10, 8,126,
+240, 45, 32,229,254,238, 14,219,186,224,116,154,176,134,132,167,121, 70, 2, 48,156, 78, 72,165,224,255,253,139,255,136,223,253,
+244, 7,248,193,171, 7, 60, 93,159,240,180, 5,193, 51,111, 98,143,219,114,134,115, 3, 54,245,174,175, 33, 54,216, 81,214, 63,
+ 75,144,131, 43,196,132, 24,146,242,200,119, 13, 15,147,172, 29, 50, 8, 91,202,120,156, 23, 57,252, 91,162, 48,171,199, 95,216,
+ 14, 18, 98,147, 14,153,216,117, 44,107,221,222,237, 18, 23, 65,194,106,186,162, 31, 7, 25, 23, 67,146,227,128,130, 97, 24, 26,
+ 33,142, 85,124,119, 58, 79, 96,102,124,248,240, 1, 70, 5,127,117, 77, 20,182, 5,222, 51,222,188,190, 71,138, 81,118,222, 73,
+156, 41, 41, 38, 76,227, 4,102, 96,158,175,184,187,187,199,178, 44,210, 49, 27,139,235,188,200,148,196,201,148,132,212, 18, 88,
+227, 67,139,166,176,161,100,153, 18,108, 91, 99,174,115, 29,209,163,210, 21,185,101,130, 52,200,142, 62,231,152, 89,128, 90,222,
+ 1,144,131, 87,114,197, 51,206,231, 59, 13,217, 1,144,162,238,230,141,106, 15, 70,164,146,181, 48,204, 8, 73, 32, 67,213, 82,
+ 89,157, 91, 49, 70,253,249,212,148, 89,149,195,191,133,128,117, 13, 88, 55, 1, 4, 53, 32,150, 90,200, 26,223,164, 30,212,229,
+ 56, 73,107,207, 24,238, 18,195, 10,186, 21,100, 57,228,189,239, 58,180, 93,153,202, 68, 74, 57,127,158,171,114,123,223,126,108,
+ 10,183, 91,233,142, 54,222, 29, 7, 45, 83,211,221,167, 94,242,111,223,169, 55,254,186,249, 78, 15, 58,223,120,239,234, 27, 73,
+ 93, 54, 58,183, 32,169,190,123, 54,237,123,203, 11,202, 47,190,216,134,128,173, 94,219, 3, 36,228,166,202,225,170, 88,222,211,
+218,168,223,193,162,192,162,192, 27,192, 19,193, 81,129,183,182, 29, 48,138,225,134, 33,241,156, 51, 21,185,232, 85,196, 23,115,
+ 65, 34,194, 70,132, 37,102, 36, 13,220, 0, 75, 72, 3,171,156,126, 7,243,239,227,153, 82,217,192, 42,168,179, 6,152, 6,135,
+187,147,199,171,179,195,228, 24, 57,108,120,122,154,241,116, 93,176, 6,185, 64,173,117, 2,170,241, 14,167,193, 98, 48,128,161,
+ 8, 46, 17,166, 4,140, 20,113,231, 9,119, 3, 99,114, 70,195, 51,190, 65,152, 53,195,157,143,123, 25,144, 30,234,108,145,173,
+ 71,130,224, 99,143,193, 36,186,147,212,206, 22,207,122,206, 42, 38,229,131,197,108,215, 85, 40,242,181, 19, 50,182,234,244,153,
+200,171,194, 46,242,238, 9,237,144,167,181,227,127,222,225,222, 80,226, 42, 87,155,202,255, 79,217,155,245, 72,150,101, 87,122,
+235,204,119, 50, 51,247,136,200,204,202,202,172,145, 53,144, 34, 27,205,174,150,186,159, 4,189, 72,128,160, 7,253, 38,254,176,
+ 6, 4,234, 69, 16, 32,136, 84,163,155, 68,149, 56, 38,139, 85, 57,196,224,238,102,118,167, 51,233, 97,239,123,238, 53,115,243,
+204, 18,129,200,172, 42, 70,120,152,155, 95, 59,103, 15,107,125,235, 6,107, 30, 5,178, 33,138, 55,125,131,174,229,130, 87,137,
+151, 71,227, 41, 93,170,243,197,183, 40,212,151, 67, 34,151,124,131, 63, 28,148,243,146,136,238,165,241,187,228, 48,149, 11, 21,
+ 47, 54,147,174,165,107,150, 27, 72, 85,198, 69,112,196, 50,141,161,253,175, 99,141, 8,117,114,130, 59, 64,165, 20,144, 19,198,
+113,160,255,204, 73, 89, 2,130,172,100, 44,166,218,239,247,152, 35,121,197, 73,144, 22,161,149,198, 56,141,144, 90,241, 69,176,
+248,219, 61,230, 16, 96,157,131,212, 26, 62, 9, 60,156, 61,254,241,239,254, 17,159,125,250, 49,218, 93,133,121,238,137,248, 24,
+ 51, 2, 4,116, 85,145, 8,207,123, 18, 95,177,255,152, 2,138, 40, 87,124, 24,231,245,226,230,152,229, 16,232, 66,241, 62,112,
+ 18,161,128,143, 25,199,126,194, 83, 63, 17,250, 53, 45, 1, 44,178,164,152, 77,211,140,188, 4,130,112, 72,201,130,196,157,253,
+140,186,166,140,243,148, 34,154,166,130, 49, 10,117,229, 80, 85,142,237,132,180, 11, 29,134,177,252,236, 98,138,148, 4,199, 97,
+ 41, 25, 9, 33,120,140,195,200,147, 16, 98,132, 11, 8, 88,107, 32, 4, 37,184, 53, 77, 13,109, 12, 92,229,214,164,179,228,113,
+216,239, 49,244, 61, 92,181,218,217,230,217,163,110, 26,188,123,255, 30,117, 83, 51,194, 55, 23,114,230,114,113, 73, 41, 8,214,
+226, 12, 7,229, 76,188,187, 54,156, 44,185,156, 5,226,170, 87,203, 5,135,171,141, 97,193,156,135, 49,154, 1, 51, 17, 2, 10,
+ 50, 3, 93, 75,200, 87,185, 36,217, 33,163,109, 91, 60, 29,143,168,234,138, 70,229, 90, 65,105,210, 55,164,148,104, 26,193,221,
+249,114, 62, 40,165,203,133,156,248, 25,142,137,198,217,137,139, 90,181,140,176,197, 85, 33,140, 75,210,227,114, 87,137, 13,111,
+129,206, 17,185, 49,229, 92,222, 65,212,165,200,178,216,186, 44,170,151,144,152, 21, 73,189,109,134,151,233,218, 50, 98, 95,138,
+161, 11, 50,228, 85, 55, 95,254,220,194,153, 71,222,140,223, 11,169,235, 15,163,111,137,140, 77,199, 34,159,141, 4,190, 77,184,
+179,253, 26,200,219, 17, 98,222,140,130,197,133,114,157, 69,216,151,190,222,114,160, 46,121,224,178,136,253,150, 24, 65, 33,174,
+ 70,151,114,129,136, 60,207,115,151, 82,150,177,183,145, 2, 90, 0, 74, 36, 24,173, 75, 0,135, 96, 49,157,214,170,176,144,151,
+203, 73, 74,133, 8,129, 8,137, 33, 3, 99,202,136,160, 48, 22,185, 36,187, 45, 23, 58,143,114,114, 94, 51,198,151,127,210,135,
+ 53,163,178, 10, 77,165,113,104, 45,246,141, 65,109, 21,210, 28, 48,142, 51, 38, 31,145,147, 40, 59, 45,165, 24,245, 26, 39, 68,
+ 63, 64,166, 9, 50,121, 84, 42,225,174, 53,232,156, 68,235, 52,172,148,120,255,238, 61,222,190,125, 0,178, 42,105, 31, 82,174,
+ 34,195, 44, 36,162, 82,240, 82, 83,152,139, 84,148,167,158,211,218,173,103, 20,157,194,234, 45,191,230,254, 95, 91, 29,150,159,
+215,166, 56,219, 20, 86,249, 89, 39,188,170,228, 87,178,215, 58,190, 82, 91,146, 28,127, 16, 87,216,209,101,236,235, 54,201, 45,
+ 97,209, 87,200, 77,133,156,202,179, 76, 16,150,181, 42,222, 10,228,144,241,108, 44,126, 19, 42,147,243,133, 77,238,165,223, 87,
+ 58, 1, 92, 18,229,110,250,233,255,192,162,251,122, 44, 47,165,188, 88, 77,229,226, 25,103, 15, 58,139, 62, 37, 71,248,208,113,
+164,202,143, 78, 73,234,212, 82,166,131, 52,179, 42, 57,204, 51,180, 86,200, 49, 65,107, 13, 41, 4,198,121,132, 86, 26,138, 15,
+220,113,154,161,181,193, 52,205, 16, 82,161,170,107, 72,109,202,207,117,177, 0,105, 77, 9,133, 89, 8,204,243,140,110,215,145,
+205,202, 19,218,180,169, 26, 72,161, 73, 68,164, 12,166, 12,124,241,251,223,195, 88,139, 79, 62,122, 13,129, 4, 31, 3, 32, 21,
+164, 50,172,134,151, 28,154, 66, 29,149,103,177, 87, 96,156,108, 78,177,228, 32, 40, 73, 34,172,152, 8,148, 19, 98, 70, 76, 2,
+ 31,158,122, 28, 7,143,193, 83,162, 28, 61,148, 10, 2, 52,222, 39, 5,120,222,136,173,114,233, 24,181, 49,112,206, 48,139,221,
+ 48,103,125, 66, 85, 59,180, 77, 13, 32, 65, 27,197,208, 16, 9,107, 12,140,117,120,124, 60, 98,183,219, 51, 1,206, 67, 74,160,
+107, 91,162,173, 5, 10, 78,169,170,138, 46,102,239, 49,244, 35,156,115,204,125, 95,167,105,119,247, 7, 72,153,203, 46, 92, 73,
+133,190,239,185, 8, 16,197,178,150, 51, 9,231,170,218, 65,105, 18, 37,230, 12,104,165,153, 77, 78, 8,217, 97, 26,209,180, 13,
+ 34,191,174,152, 40,225, 78, 72,193,235,133,188, 10, 99,151, 53,150, 92,247,200,214, 89, 28,246, 59,204,211,132,182,109,169, 16,
+138, 1, 57, 69, 76,211,184,122,184, 69, 70,215,181,112,174,194,233,116, 36, 17, 93, 83,193, 58,139,166,169,153, 96, 71,223,251,
+ 50, 22,215,252,188,165, 68,100,194, 84,160, 36,107, 74, 94, 6,161,177,149,166,117,209,210,101,175,185,230,184,185,186, 42,145,
+224, 0, 5,191, 92,140,218,193, 97, 43, 98, 51,253,187, 20,131, 11,185,134, 92,101,228,111,213,195,220,162, 96, 94,135,166,221,
+130, 79, 45,218, 24,228,188, 10,229, 18,210, 31,220, 37, 20,158,250,166, 83,202,249,101,241,206, 69, 23,191, 80,145,178, 90, 21,
+232, 5,161,168, 54,227,103,238, 46, 22,219, 26, 95,234,207,246,137, 41,111,224, 26, 98,213, 41,149, 68, 45,113, 17,216,113,169,
+107, 72,197, 83, 47,121,153,184, 0,253,149,148, 48,188, 99,175,140, 89,109, 73, 88, 18,215,104,244, 20, 89,143, 64,240,125, 26,
+202,251, 36,112,142, 25, 83, 76,236,245, 22, 69,160, 37, 23, 53,228,102, 68,180, 48,226,203,254,151,117, 0, 86, 75,236, 26,139,
+ 67, 99,176,175, 53,106,171, 32, 50,224,185,235, 89,242,120,165,148, 48,138,242,212,173,204,112, 50,161, 50, 2,187,202,224,117,
+ 87,225,174, 54, 56, 52, 14,181, 53, 56, 30,123,252,243, 23, 95, 98, 26, 19,219,176,168,203,213, 66, 97,233,183, 3, 4,130,148,
+ 8,202, 34, 73,131, 40, 8,233, 25, 83, 68,202,116, 96, 96,147,199, 76,239, 75, 42,138,234,140,203,117,203,234,106,203,183,193,
+ 70,155,226,236, 2,172,201,112,155, 5,174,177, 20, 4,151,122,141,124, 53,126,191, 13,159,145, 34, 95,252,251, 50,171,125,237,
+212, 23, 17,167,146,185,224,149,203,229,126, 37, 4,188,222,163,149,149, 2,195, 84,114,202,223, 53,234, 42,129, 66,229, 25,222,
+ 22, 42, 87,227,247,239,178,184, 93, 84,244,219, 75,125,165,240,147,118, 99,243,215, 75,158, 62, 44,252, 8,181,208, 27,179, 4,
+199, 16,144, 80,137,121,229, 57,163, 92, 10,222,207,112,188,187, 85, 16,176, 70,193,106, 3,169, 21,193,102,248, 48, 84,218, 96,
+158, 3, 89,218, 88, 25,175, 22,144,200, 18,223, 89,146,182, 34, 94,189,190, 47,233, 89,211, 56,193,106,131,202, 85,212,237,230,
+136, 8,202, 97, 31,147,194, 95,253,250, 31, 48,132,136,239,125,242, 9,106,231, 40,108,166, 31,144, 57,106,120,185,124,230,105,
+166, 73, 15,199,153,250,217,211,184,127,242, 36,200, 10, 20,241,153, 32, 48,135,140,144,128,167,126, 66, 63, 69,196,172, 48, 5,
+226, 75, 8, 8,164,200,248,220, 20,144,114,196,174,219,209,196, 33, 69,134,125,113,214,131, 82,229,189, 34,129, 89, 96,213, 50,
+169,178,115,166,238, 58,134, 64,113,176, 51,225, 86,235,134, 70,237, 77, 83,149, 75, 38,132,136,166,105,137,219,158,104, 10,144,
+ 82,194,110,215, 18, 89, 45,210,255, 70, 42,242, 26, 15, 15, 31,144, 18, 5,186,104,173, 73,253,157, 41,154,121, 24,122, 56,103,
+137, 55, 48,205,216,117, 29, 98,138,208, 90,161, 63,157,177,219,237,145,216,250, 69,205, 26,141,194,169, 81,162,245,128, 96, 20,
+108,206, 20,229,154,115,130,143,137, 38, 78,139, 40,122, 35,250, 93, 84,230, 90, 75,220,223,221, 97,154,102,236,246, 29,137, 37,
+ 5,120,103, 14,102,201, 7, 12,227,132,174,219,163,235,118,220, 52, 37,190,188, 53,199,171,106,134, 79,145,120, 77,107, 67, 98,
+111,108,195,114,104,106,162,148,226, 73,129, 33,119,147,214,208, 90,150,181, 81, 96,189,195,114,198, 8, 62,179,159, 89, 67,147,
+216,120,199, 83, 57,179,190,219,242,189, 74,105, 69, 94, 57,240,215, 35,244, 91,235,188,103,255,219,149,150,166,124,141, 13, 33,
+117,189,212,243,255,143, 75,189,100,160,203, 77,167,126,251, 82, 95,254, 34,153,232,135,189,134, 99,174, 3, 10,201,139,246,226,
+151, 92, 54,176,114,221,121,243,221,243,124, 87,191,100, 78,111,139, 7, 41,202, 14, 30,101, 23, 72,163,213,148, 54,120, 81,254,
+149, 18, 61,140,146,173,120, 82,105, 88,109,225,172,131, 22,146,236, 27,124,137,198, 76,221,119,228,202, 63,196,192, 21,160, 6,
+132, 70,130,196, 28,129, 33, 37,248,188,170, 23,165, 16,208, 60,122,161,127,200,210,165,199, 13, 24, 4,200, 75, 64, 41,156, 85,
+104,173,194,161, 54,232,156,130, 83, 18, 90, 82, 49,177,208,142,100, 94,178,188, 41,215,189, 50, 18,141, 1, 14,117,133, 87,187,
+ 14, 31,237, 26,124,114,183, 67, 91, 87,152,231, 25,255,244,197,239,241,229, 87, 15,240, 81, 1,153, 44, 54, 66,241,212,133, 15,
+252, 0,129,168, 20,162, 52,200,124,169,231, 34,136,225,157,122,140, 69, 36, 39,165, 66, 66, 34, 49,157,192, 70, 23,177,201,183,
+221, 4,220,139,237,186, 73, 92,174,115,150, 93,148,100,177, 32,242, 18,250,144, 47, 24,240,203, 72,249, 98,252, 46,183, 2, 73,
+121, 81,249, 74,177, 6, 3,229,141, 0, 51,231, 75, 63,189, 96, 22,186,100,154, 28,164,216,248,231,175,212,253,219, 14,122,179,
+ 74,219,238,199,183,175,225, 54, 38,150, 15,146, 44, 94,180,168,221,154,122,109, 87, 33, 23, 56,201, 77,250,215,229,122,106,205,
+170,222, 10,244,150, 75, 61,139,205, 74,160,208, 44,215,175,145, 56,226, 5, 0, 66,240,171, 95, 54, 6,236,219,174, 76,201,180,
+214, 24,198, 17,144, 2,211, 60, 65, 73,133,211,233, 12,163, 13,114, 76, 72, 62,150, 49,237,146,129,110, 43,199,192, 19,194, 36,
+ 87,206, 34, 38,224,120, 58, 35,114,226,151,144,132, 35, 61,245, 39, 12,211, 0, 3,133,156, 13, 30, 67,196,239,222, 63,225,139,
+ 47,190,132,146, 26,245,126,135,144, 83, 25,191,135, 20,185,243,142,165, 83,143, 33, 2, 66, 81, 49,157,232,179, 28, 82,198,232,
+ 19, 70, 31,241,112,234, 17, 32,209,251,128, 40, 36, 66,196, 70,103,177, 21,115, 38,152,138,162,144,181, 49,252,203,150,226,215,
+ 88, 77,250, 1,182,178, 57,103,105,109,193,249, 95,222,207, 48, 70,211,200,124,211,245,147, 62,193, 34, 49,147, 62, 38,192,104,
+141, 97, 24, 48, 14, 61,170,170, 34, 49, 30,119,183,198, 24, 8, 41, 17,194,204, 9,105,245, 26, 25, 27,233,191, 63, 60, 29, 17,
+ 83, 66,215,181, 16, 12,142, 89, 38, 36,109,219,210,115,176,232, 28, 98, 66,140, 25,206, 85,124,190, 17,203,160,170, 42,204,211,
+132,110,215,150,116,194, 16, 2,180, 86,112,117,131,113,156, 86,174, 67,230, 73,217,226,247, 6,177,232,199,137,172,101, 77, 93,
+ 65,107,137,221,190,197, 56,244,212,177,103,148,236,128,148, 50,166, 97, 6, 98,198,221,221, 1,206, 82, 17,210,117, 29,249,214,
+ 57, 56,200,213, 22,149,171, 8,224, 99, 45, 92, 85, 81, 55,206,185, 22, 25,180,143, 95,200,134,139,188, 43,250, 25, 70, 25, 42,
+ 66,133,100,110,254,138,162, 93,124,224,165, 65, 72,151, 11, 53,154,146,138,103, 9,109, 43, 2,123, 61,251,178, 88,163,125,178,
+ 88, 34, 86,215,140,215,197,189, 67,150, 65,117, 49, 57, 94,198,235,223,117, 46,108, 27, 87, 85, 25,247, 23,165, 11,248, 3,238,
+115, 81,246, 44,106,163, 20,150, 55, 23,252,101,148,112,113,166,175,152,213,213, 19, 44, 75, 59,183, 12, 76,228,154,248,193,226,
+157,151,217, 56,226, 42, 97,103,201, 99,191,232,208,203, 56,246,226, 15,150,241,139,209,244,112, 28,238,238,241,234,245, 71,184,
+219, 29,176,171, 27,242, 41,198, 88,194, 20, 22,191,186, 79,153, 19,205,200, 47, 40,149,162,189, 77, 2,121, 88, 83, 66, 20,128,
+144,186, 40,235,151,213,194, 22,179,179,248, 19, 87,254, 79,134, 18, 20,176, 82, 59,141,214,105,116,149, 68,231,168, 83, 55,218,
+172,191, 63, 3, 74, 40, 6,228, 72, 84, 70,163,177, 10,251,166,198,171, 67,135,251,125,139,215,187, 6,187,198, 65, 72,141, 47,
+126,251, 37,126,243,247, 95,160,159, 51, 50, 52, 40, 44,150,188,186, 52, 98,165, 3, 61, 74,133,164, 12,146,178,200, 82,151,203,
+154,198,123,169,188,103, 75, 33, 87, 50,191, 11, 44,114,107, 1, 91, 61,210, 37,156,135,127,222, 11, 13,169, 48, 14,182, 29,100,
+209,163, 44, 23, 80,122, 38, 26,187,181, 83,151,155,157,247, 5,177, 17, 40, 43,148, 82, 92,148,240,160, 37,210,117, 83,132, 46,
+132,167,171,238, 55,165,116,161,152, 95,104, 90,242, 5, 62,194,119, 17,226, 50, 86,113, 77, 78,249, 91, 59,242, 91,193, 73,223,
+138,134, 45, 66,214,213,162,150, 83, 42,174, 2,177,245,220,243,216, 83, 44,136,204, 50, 73, 88,121,216,105,233, 68, 5, 39,160,
+165,136,186,170, 54, 63, 7,134,182, 44, 17,197,138,172, 75,211, 98,175, 90, 28, 1,156,200,101,173,225,189, 49, 97,139,141,177,
+ 80,146,138, 6,138,203,164,241,170,171, 29,164,162,209,254,200,144, 25,163, 12,127,127,228, 50, 25, 67,194,111,191,252, 6, 95,
+191,127, 79,246,180,156,201,123,157, 51, 60, 63,183,212,205,210, 69, 55,135,132, 24,129, 57, 68,140, 83,192,105,152,240,240,116,
+198,105, 10, 72, 82,195,214, 13,166, 20, 49,251, 84,214,103,244, 51,143, 37,165, 79,112,138,162, 18,180, 3, 29,199, 17, 85,237,
+160, 13,121,227, 23, 69,246, 18,210, 82, 85,174, 48,221,105,172, 46, 49,141, 3,234,170, 70, 12, 9,193,135,178,243, 30,134,158,
+ 33, 54, 36, 50, 28,134,145,227,150, 13,166,105,162, 12,116,182,221,213,117,197,182, 85, 26,179,211, 94, 63,227,241,241, 4, 1,
+129,186,233, 32,164,198,249,212, 35,197,128,195,221,190,116,218, 66,208,251, 93,213, 53,198, 97,128, 81,154,193,142,146,129, 45,
+243,186,178,148, 18, 57,145, 46,165,174,171,178,254,162,221,124, 75, 81,211,140,107,189, 40,114,229,229,121, 61,142, 51,164, 2,
+218,174,161,117, 68, 85, 33, 69,176, 87,158,121, 9, 73, 32,249, 4, 63,123,156, 78, 39,156, 78, 39, 28,143, 39,122, 54,148, 70,
+202, 18, 31, 62,188,163, 84,183, 72,127,167,177, 6,231,190, 71,202,137,158, 75, 94,113, 6, 62,191, 51,114, 9,225,145, 57,211,
+180, 38,131, 34, 98, 57,141, 47,229, 84,246,214,235,246, 79, 92, 76, 37, 23, 96,204, 66,146, 92, 57, 28, 9,215,145,168, 91, 49,
+ 44,174,224, 93, 37, 5, 15,249, 98,226,184,109, 92,174,207,141,107, 69,252,246, 60, 88,192, 87, 26,101,232, 42,110,192,103,150,
+151,161,174,188,223,137, 68, 34, 5, 32,178, 17,229,108, 72,112, 34,174, 24, 77,185,233, 68, 69,206, 27, 94,123, 44,111, 26,141,
+ 10,175,201,111,185,236, 90, 22,149,125,225,223,230,117,255, 46,151,216, 22,129, 50,117, 88, 20,170,197,131,156,105,231, 68, 94,
+195,197, 82,172,209,181, 7,220,239,239,113,191,191, 67,211,118,244,117, 67,128,159,122, 66, 93,198, 4, 21, 19,114,204,136,136,
+164,104, 7, 71,253, 9, 89,118,129, 89, 0, 30, 9, 62, 39,100,169, 11, 20,101,233, 72, 83, 94,216, 99,114,181,182,101,148,196,
+ 31,178,180,173,177,123, 42, 75, 24, 33,161, 51,237,247, 37, 50,148,204,176,198, 32, 70,210, 36,100,153, 25, 81,155, 80, 89,137,
+198, 57,180,174,197,126, 95, 99,223, 25,220, 53, 2, 74, 25,252,195, 87, 61,126,253, 15, 95,225,233,228, 1,101,139,157, 14, 9,
+ 80,138,118,200, 73, 72,138,129,213, 22, 66, 57, 14,208, 73,208,165,168, 90,184,254,138,137,115, 96, 76, 46,231, 44,151,240,149,
+133,229, 79, 69,195, 66,118,200, 34,110, 84,161, 91,245,255,178, 66, 73,235,120,107,147, 88,135,173, 0,237, 10,209, 40,213,198,
+231,158,101,169, 60, 87,236, 98,134,144,137,158,185,188,142,124,158,107,226,151, 15, 84, 90, 6, 41,165,170,190, 84,183,174,148,
+181,188,176,207,151,108,229,165, 86, 92,198,239,226,182, 63,253,242, 66,222,216,229,228,183,119,225, 47,209,227,110,142,223,183,
+ 89,233,229,243,199,186,151, 76,137,135, 5,170,129,117,210, 32, 32, 33,216, 90, 89, 58,173,226,114,208, 12, 69,162,207,168,171,
+ 42,120, 31, 33,242,140,182, 85, 8,145,190, 90,101, 12,132,146, 24,189,199, 20, 60,116,237,160,173, 70,109, 15, 56,227, 1, 49,
+120, 68,254, 18, 92, 0, 0, 32, 0, 73, 68, 65, 84, 66, 48, 51,134, 53,139, 12,104, 81,208,179,198,210, 84, 73,128, 18, 13, 53,
+ 11,187,194, 28, 33, 50, 80,155, 10, 41, 37,188,249,232, 13,222,190,123, 7,127,156, 16,165,193,172, 45,254,229,193,227,183,111,
+127,135,157, 85,104,154, 10, 90,128,226,139, 53,141,250,125,140,240, 33,225,228, 51,250,113,130, 20, 10, 77,211,225, 20,103,228,
+170,166, 14,207, 26,156,134, 17,211,236,161,141, 70, 76, 64,229, 28,121,185, 19, 93,110, 33, 4, 42,244, 35,125,118,149,162,174,
+209,213,182,120,248, 21,243,216,133, 32, 18,223, 60,122, 82,182, 59,135,190, 63, 67, 9, 13, 31, 3,250,126,196, 60,123,104,109,
+ 48, 78, 3, 42, 87,161,237,106,244,125, 79, 90,153,170, 33, 97,170, 15, 80, 82, 99,232,143, 72, 29,117,224,203,132,201,251, 64,
+ 33, 82, 49, 66, 10,178, 27,126,249,245, 59, 64, 74, 28, 79, 39,104, 99,208,237, 90,156,207, 71,244,195, 72, 19,145,202,225,124,
+ 58,113,183,222, 1, 73,176, 47,190,167,244, 70,165, 80, 85, 6, 62, 16,124,168, 63,159,113,183,223, 99, 24, 38,212, 85,133,166,
+105,248, 9,154, 48,246, 3,118,109,135, 56, 79,240,222, 83,138,200, 50,161, 74,121, 21,211,242,243,252,248,212,195,186, 26,126,
+158,104,186,208,214,168,155, 6, 31, 62, 60, 32,248,196, 77, 20,173, 62, 41, 63, 30,200, 62, 34, 99,194,211,233, 27,188,122,245,
+ 10,109,119,192,211,211, 83, 25,177,183, 66, 65, 65, 66, 27, 5,169,232, 94,170, 42, 71, 69,156,143, 8, 37, 26,149,206,186, 24,
+ 51,226,228, 9,199,237, 88, 92, 56,164,162,247,202, 12,198,194,133,170,157, 66,175,214,169,223,102,114,119,115,124,206,217, 3,
+ 25,208, 82,179,195,139, 68,223, 5,164,181, 85,192,167, 77,193,112, 35, 59, 98,105,102, 22,152,205, 34,168,219,158, 9,122, 81,
+236, 45,249,198,207, 15, 18,113, 33,102, 91,143, 64,249,140,216, 86,252,194,155,142,120,213, 5,230, 2, 34,200, 92,241, 62, 75,
+102,147, 43,133,108, 57,252, 47,196, 2, 41, 95,238, 20,202,168, 99,147, 43,203,163, 94,177, 1, 8, 16,215,217, 67, 73,194, 83,
+230,156,105,244,211,237,240,234,238, 21,238, 15,175,209,214, 29,140, 34, 58,214,196,140,244, 8,129,164, 13,162,210, 16, 82, 35,
+ 75, 79,224, 24, 30, 19,105,165,129,196, 44,228, 44,200,187, 13,129,196, 9, 58, 98,243, 61,164,146, 21,176, 38, 46,229,205, 29,
+ 37, 56,180, 64,228, 85, 81,175,148,128, 89,114,213,181,128,179, 10, 86, 47,126,122,135,160, 3, 82, 92,166, 29, 64,237, 20,106,
+103,113,104, 26,220,117, 21,186, 90,160,173, 37,190,122,154,240,215,191,249, 7,252,211,215, 15, 0, 28, 20, 12, 63,148,236, 25,
+102,232, 72, 6,144,132, 66, 18, 26, 89, 82, 72, 70, 81,130,230, 76,162, 27,102,220, 47,237,116, 73, 89,203, 52, 46, 79, 27,144,
+201,114,185, 62,183, 68, 45, 74,207,197, 20,191,226, 96,243,162,131,120, 14, 92,228, 46, 50,223, 12, 11, 16,183, 12,239, 92, 20,
+ 94, 60, 39, 23,228,227,124,165,200, 95, 45, 91,105, 83,223, 62,191,100,243,205, 48,151,242, 33,204,249,217,222,253, 37,133,186,
+184,170,192,183,106,215, 63,180,219,191, 41, 72,205,219, 85, 25,158, 57, 1,138, 95, 65, 94,254,153,109, 32,211, 51,239,221, 38,
+ 91, 90, 73, 34,176, 73,100,116, 77, 67, 83, 28,145,177,107, 26, 40, 33, 49, 7,143,148, 51,180, 54, 16, 16,232,118, 59,136,144,
+ 16,166, 10,201, 75, 74, 63, 75, 25, 70, 41,140,209, 67, 43, 26, 57,143,243, 12, 87,213,152, 38, 18,225, 85, 85,117, 1, 51,105,
+234, 26,231,211, 80,128, 56,174,114,136,137, 82,191,162,212, 24,115,134,171,118,152, 92,141,119, 79, 79, 16, 41, 98,158,158, 80,
+ 87,150, 97, 52,158,186, 65, 73,185,221, 57, 3, 31,169, 26, 15,167, 1,187,195, 1,167,254, 4,203, 86,167,143,222,124,132,199,
+199, 71, 8, 65,161, 77,149,179, 24,199,177, 76,107,172, 49,144, 25,136,222, 67, 8,130, 60, 77,211, 72,138,240, 24,160,164,129,
+207, 17, 90, 74,184,174,197,251,247, 31,144, 17,209,117, 29,218,166, 69,223,159, 49, 14, 51,159, 79, 9,211, 72,177,169,222, 7,
+218,201, 75, 26,185,183, 59, 11, 35, 21,225,164, 51,193,125,168, 8,144, 56, 30, 79,184,187,187,131, 86, 10,206,209, 36,192, 24,
+139, 24, 3,222,188,190,195,249,220, 99,156, 6,196,254,140,221,110,135,195,221, 1,179,247,168,172, 65, 76, 17, 77,219,224,241,
+225, 17,167,211, 9,187,221, 30,199,167, 39,236,186, 22, 79,167, 19, 98,152, 81, 85, 22, 38,145,142,103, 26, 38,138, 58,157, 41,
+219, 61, 42,129,182,171,161,148,196,135,135, 71, 52,181,195,235, 55,247,120,122,124, 66, 96,235, 25,216, 37,163, 89,152, 38, 57,
+105, 76,164,132,111,190,122, 7, 87, 17, 16,231,124,238,225, 92,133,187,187,123,244,253,128,105, 28, 33, 18,107,189, 4, 21, 8,
+ 41,102, 42, 72,132,192,239,166, 47,241,217,103,159,225,241,241, 9, 66,104, 10,110, 25, 70,238,206, 37, 19,236, 42, 8, 72,204,
+ 35,145, 2, 67,138,101, 90,155, 98, 4, 88,120, 25,125, 64, 72,129,131,118,214,194, 93,109,181, 62,130, 18,208, 66, 76,197,135,
+127,113,134, 45,154, 29, 78,193,139,156,234,185, 6,198,208,189, 33,243,186, 2, 72,200,197, 77,179,101,101, 72, 33,159,157, 31,
+219,253,123,105,162, 10,243, 61, 93,172,187,245, 82,171, 3,107,146,204, 31,242,127,139, 71, 56,149, 46,235,114,151,120,121,248,
+164,165, 31,227, 23,159,110,140, 24,183,140,240,203,113,237,242,123, 35, 82, 17,208, 45,164,221,141,255,134, 42,254,156,150, 92,
+ 17, 62,160, 36,139, 83, 44, 32, 36,148,116,232,186, 22,159,126,242, 6,111,238,239,208,214, 13,180, 52, 44, 62, 35, 79, 99,200,
+177, 16,138,178, 16,196, 5,230,181,138,135, 32, 90, 92,230,157, 43, 36, 87,114, 18, 57, 83,156,100,222,192, 0,176, 73,221, 33,
+242, 90,102,176, 71, 42,128,135,188, 89,218, 82, 37,151,120, 7,159,161, 53, 96,173,132,213, 18, 86, 43,180,149, 35,254,244, 28,
+ 48, 7,129,152, 4,180,208, 48,202,160,173, 12,106, 39,112,215, 25,188,234, 52,106,165,240, 56, 78,248,155,127,250, 29,254,250,
+239,254, 9, 71, 40, 84,210, 66,102, 5,176,219, 97,249, 22, 18, 36,162, 32,104, 78,148, 2, 65, 10, 68, 41,217,251,184,170,197,
+133,204, 64,204, 60,198,221,178,203,169, 3, 84, 5,170,194, 36, 56,206, 64, 7,103,119, 39,134, 12, 9,200,194, 36, 95,187,213,
+244, 7,171,187,159, 67, 92,182,224, 33,108, 52, 30, 40, 58,138,114,113,149, 76,119,121,177,255, 23, 69,101, 47, 46,120,240, 91,
+245,235,181,146,126,153, 54,164, 18, 58,115,107,199,118, 27, 32,113,253,253,172,163,125, 60, 91, 99,125, 87,167, 46,110, 8,123,
+150,162, 33, 67,220,102, 53,240, 39,243, 15, 81,216, 11, 78,202, 91,166, 9,137, 97, 38,164,194, 38, 12,113,187,111, 72, 64, 23,
+124,201,169,182,138, 60,208, 41,101, 36,239,161,148,130, 83, 21, 82,140,152,199, 9,109, 83, 35, 14, 25,253,241,132,174,221, 33,
+ 71,178,196, 85, 85,133,105,154,138,170,251,226,125,202, 11,226,147, 4, 84,117, 83,177,199,158,148,173,170,170, 49, 75,139, 73,
+104, 40,109,144,133, 66, 98, 17, 93, 72,134,168,114, 18, 8, 41,194, 85, 21,166, 24, 81, 53, 13,193, 59,164,194,253,225, 30, 49,
+ 68,244,231,115, 57,160,207,231, 19,239,170, 41, 52, 70,179, 35,166,114, 14, 97,158,145, 66,128,177, 26, 66,211,161,110,117,131,
+ 20, 19,186,182,129,200, 25,253,233,132, 20, 2, 38,239, 81, 89, 74, 88,203, 49, 97,191,235, 96, 93,197,176,154, 9, 49,100,124,
+120,122, 64,211, 82,170, 90,211, 52,116,241,131,242,200, 67,240, 23, 63,167,148, 18, 30, 30, 31,208,181, 59,140, 19, 21, 28,174,
+114,120,122,124,192,253,221, 29,154,218, 33,196,136,119,239, 31, 49,142, 35, 50, 18,246,187, 22, 33, 4, 56,199, 90, 6,235,240,
+254,195, 3, 62,251,172,227, 44,246,204, 59,251, 25,167,115, 15, 8,202,146, 80,175,239,145, 56,173,109,158, 61,219, 62, 21,234,
+214, 66,233, 61,198,113,128,214, 13,108,229,144,167, 25,218,104,132, 16, 81,213, 21,162, 15,152,166,137,253,228,170, 80, 62,251,
+126,228,103, 51, 33,132, 30, 49, 36,236,186, 29,105, 55, 60,105, 33,132, 16,176,150,244, 8,167,211,169, 60,147,239,223,191,199,
+126,191,199,185, 31,161,180,129, 4, 21, 61,195, 56,226,120,242,168,157,195,253,221, 29,172,213, 24,231, 25,134,167,122, 57, 69,
+ 32,210,228,176,144, 47, 3,115, 55,202, 52, 79,172, 49,219,124,209, 10, 41, 81,105,162, 17, 26,109, 24, 32, 52, 33,166,120, 1,
+147,108,154, 6,211, 56,144,232, 47, 46, 94,120, 73,121, 84, 49,173,147,104, 6,120, 81,115,180,218,255,178,196,119, 10, 98, 95,
+226, 83, 0,128, 46, 18,215,151,228,185, 89,124,235,161, 42,144, 87,214,118, 94,199,229,164, 0, 38,197, 55,141,251, 82,185, 96,
+111,119, 34,171,173,232,178,250, 17,151, 9, 92, 75,215,184,177, 24,209,232, 99,237, 12,137, 87,189, 76, 19, 52,132,178,184,127,
+245, 17,222,124,252, 41, 42,215,160,171, 44,246,141, 67,173, 8, 79, 59,207, 30, 72,180,111, 73, 41, 81,215, 17, 61, 66, 32,161,
+ 77, 76,203,248, 88, 34, 36, 65, 17,164,130,176,129, 74,202,181, 96, 17, 2, 73, 10,100,149,203,228, 67,172, 11,221,226,157,132,
+164,223, 47, 5, 85, 11, 66, 0, 72, 1, 82,228,178, 75,150, 82,192, 24, 1,163, 5,172, 86,208,138, 46,117,163, 5,180, 50, 20,
+140,145, 51,146, 82,176, 90,163,182, 14,251,186,194,161,145,104,235,140,166,210, 24, 39,129,255,250,197,123,252,229, 95,255, 61,
+190, 60, 37,104, 83,193, 41,205,106,123,137,196,200, 85, 37, 20, 19,227, 36, 29,128,146,254,123, 92, 46,185,141,208,109, 29,211,
+230,117,123,190,161,201,109, 25,105,203, 52,103,177, 83,197,226,243,220,248, 51,243,170, 50,200,215,241,125,207,198,222, 47, 92,
+ 60,203,123, 44,197,102, 58,179, 22,136,249,134,208, 19, 76,157,218,238,185,182,188,118,154, 38,228, 13,111,254,165,130, 98, 3,
+156,217,210,211,175,254,220,183, 41,215,111,117,218,207,252,239,215, 58,149, 27, 23,251,229,133,254, 18, 3,254, 59,148,186,155,
+116,168,103, 83,134,133,128,184,140, 33, 3,117, 99,185, 31,161,148, 64, 93, 57, 82, 77, 67,192,185, 10,195, 56,163,169, 43, 86,
+ 82, 75, 40,109, 48,132, 35,164, 86,176,214,162, 31, 6,232, 24, 97,164,194, 28,105,199,108,180,193, 48,142,232,218, 22,187,221,
+110,221, 61, 79, 83,241,239, 58,107, 88, 84, 22,113, 60, 29,137,163,174, 4,156,115, 80, 86, 33,198, 0,228,132,186, 98, 71, 71,
+ 50,152, 39, 10,114, 81,202,176, 96, 16, 48,174, 42,197, 91,215,117, 56,157,123,238,188, 3,158, 30, 31,225, 39, 34,156,249,201,
+195, 58,131,202, 90,228, 24,161,165, 96, 0, 21, 16,230,169,144, 40, 21, 67,118,180, 49,200,137, 16,168,218, 24,248,121, 34, 17,
+161,100,236, 42,115,219,165, 32,225, 45,249,174, 35, 77, 62,164,129, 20, 6, 67, 63, 51, 67,159, 10,169,190,239, 49, 14, 19,238,
+ 14,123,186, 0,189,199,227,227, 7,188,126,243,138,186,216,144,120,212, 28,153, 19, 0, 24, 45,209,182, 7,244,231, 1, 90, 91,
+ 60, 29, 79,232,186, 22,143,143,143,184,219,239,225,125, 64,211, 52,216,239, 53,132, 56,226,155,111,190,194,231,159,125, 31,125,
+ 63,192, 24,137,105,206,216,239, 90, 12,211,140,156, 87, 61, 77,219,182, 56,247, 71, 0, 21,140,105, 48,244,103,184,202, 65,204,
+228,144,144, 10, 69,229, 47, 68, 44,248,217,251,251, 59, 60, 60, 60,174, 69,225,178, 10, 90,166,176, 73, 96, 26,166, 50,201,115,
+206, 1,115, 96, 40, 15, 61,251,119,119,119, 56,157,206,228, 60, 72, 9,167,211, 9,227, 28, 24,255,107,160,148, 70, 37, 37,246,
+ 31,127, 12, 37, 5,134, 19,129,120,154,166,194,185, 31, 72,139, 48,209,248, 27,155,213, 95, 74,180, 94, 45,235,100,198, 74,107,
+126,230, 98, 14, 16, 81,192, 89, 9,103, 29,198,113,160,216,222, 2, 87,203,108,103, 4,156,213,232,154,123, 12,253, 25,199,211,
+185, 52,121,129,207,201,229,242, 78, 66,148, 80,176, 91,141,192, 75,197,246,197, 25,112, 99,146,167,106,183,170,223,243,133,229,
+ 72, 20,202,153,192,115,223,156, 84,162,140,246,228, 70, 88,176, 0, 38,197,166,139, 66, 78, 23,251,210,231, 35,210,203, 17,126,
+ 81,174, 95, 77, 0,115, 17, 67,109,132, 73, 27,143,114,102, 86,110, 74, 18, 82, 54,112,213, 1, 31,127,242, 99,252,233,191,249,
+ 15,248,243, 95,253,247,248,252,135,127,140,195,225, 21,180, 50, 80, 66, 66,166,132,232, 35, 89, 74,152,151, 30, 34, 71, 54,206,
+148,175,236,163, 71, 12,158,211,123,136,173, 62,230,128,196,197,140,102,155,156, 84, 2, 89, 74, 68, 41, 49, 49, 35, 62, 95,160,
+ 70,175,178,226,133, 96, 69,237,134,130, 39,105,111,110,132, 64,101, 52,246,149,197,161,117,104,172, 64, 99, 20, 26,103,161, 57,
+227,152,186, 98, 9,103, 12,154,198,226,208, 85,120,211,213,184,115, 18, 77,109,112,138, 10,255,245, 95, 30,241,151,127,251,123,
+252,237,151, 39,204,217,194, 10, 13,195,197,131,103, 53, 3, 36,125, 15, 16,146, 32, 51, 66, 33, 40,131, 36,117,153,175, 72,185,
+128, 85,200,126,151,211,218,185,138,141,102, 32, 95,128, 93, 4,115,221, 21,225,124, 88, 13, 75, 34,156, 27,164,185,188,250,210,
+183,246,176,109,234,217,210, 49,223,178, 74, 46,190,255, 45,148,166, 92,122, 57,179, 88, 76,172, 57, 0, 55, 56,142,151, 89,233,
+114, 93,141,108, 58,243,111,227,173,131,247,212,133, 44,117, 33,178,123, 62,134, 47,164, 45, 41,111,119,199,226,187, 9,115,226,
+102,128,196,154,173,188,242,183,111, 81, 30, 55, 89,206,216, 36, 42,190,116,241,243, 23, 85, 90,195, 48, 76, 68, 74,130,127,236,
+247, 29,156,213, 68, 75,227, 92,115,173, 12,170,170,134, 20, 18,206, 57, 28, 79, 39,132, 28, 48,251,153,249,232, 19, 92, 93,195,
+231, 8, 99, 45,192,144,146,115,191,236,121, 27, 86,112, 7,140,227, 64, 40, 89, 41,209,214, 45,238,238,238, 49, 14, 35,124,140,
+ 80, 74,147,240,206, 57,140,195,136, 24, 3,140, 86,232,154, 26, 49, 70, 74, 5, 99,174,129,226, 29,125,240,129, 14,101, 80, 50,
+154,117, 6,200, 9,175, 95,221, 67,230,140,121, 36, 6,252,110,191,195, 60,141, 48,138,131, 86,216,231,127,216,237,160, 36, 69,
+201, 26, 77, 16, 29,145, 65,214, 48, 73, 20, 56,103, 12,221, 13,145,180, 23,137,115,220,231,121,198, 52,207, 20,140,162, 53,137,
+207, 64,130, 58,239, 41,101, 45,103, 96,215,237, 48,207, 30,243, 52,243,101, 68, 54, 60,103, 41,240,133,236,181,116, 33,146,229,
+207, 32,198,136,190,239,241,225,195, 3,172, 37,242, 92, 93,215,168,170, 10, 31, 62, 60, 64, 8, 80,186,217, 68, 98, 61,173, 53,
+ 79,179, 72, 4, 9,182, 44, 46,151, 71,136,212, 97,187,202, 17,225,111,158,160,148,194, 52, 17,175, 30,137,232,130, 31, 62, 60,
+162,174, 27,212, 77, 77,221,184, 82,120,124,122, 34,155, 31, 4,234,170, 66,140,153,197,121,171,126, 5, 28,244, 35, 75, 17, 46,
+138,163,104,158, 3, 14,135, 61, 71,223, 18,207,221, 90,131,195, 97,143,211,249,180,102,199, 51, 91,160,170,200,203, 14, 1,124,
+253,245, 87,168, 44, 65,185,132, 16,232,207, 3,164,214, 48, 90,226,238,238, 30,135,195, 30,198,145,101,208,251, 64,133, 7,127,
+ 22, 67, 76,229,179,159,175,206,155,133,186, 42,121, 34, 37,132,128,230,247,217,114,236,237, 52,141,184,187, 59,160,170, 28, 77,
+164,102,198, 32, 11, 73, 5,231, 38,162,123,171, 31, 75, 91, 29,204, 11,110,151,103,104,232,171,232,214, 98,105, 35,148, 99,186,
+216, 97,111, 3, 88,174,129, 27,148,205,190,249, 6,153,108,180, 8,224,196,118,159,183,246, 61, 23,168,208, 69,105,188,205,147,
+151,203, 78,125,195,128,223,142,251, 5,199,160,138,188, 46,204, 23, 92,225, 34, 90,203, 80,248,244,211,159,226,143,255,228, 87,
+248,147, 63,253,239,240,179, 95,254, 91,124,250,217, 31, 65,219, 3,134, 9, 56,159, 78,152,230, 17,126, 26,145,252,140,196,136,
+ 65, 31, 72,149, 58,251,153,246, 33, 33,148, 16,129, 24, 60, 4,167,173,249,148, 16, 56, 45, 78, 73, 58, 32,150,254, 52, 9,129,
+ 40, 5, 60,239,214,179, 88, 45, 82, 75, 82, 79,209, 13,108,139,146,204,244, 60, 65,248, 89, 45,128, 90,107,236,107, 71,234,119,
+107,208, 57,131,218, 25, 88,165,139, 32,209, 25,139, 93,211,160,107, 12,186, 70,163,179, 18,181,209,232, 61,240,159,191,248,128,
+255,253, 55, 95,226, 95, 39, 11,209,188, 65,156, 5,108, 10,176, 34, 32, 32, 97, 2, 16, 50,129,113,140, 32, 4,110,148,100, 99,
+139,210, 20,224,204,178,118, 93,104,105, 57,130,146,174,174, 30, 50, 18, 2,198, 18, 92,160, 4,233, 16,132,176, 48,166,129,115,
+ 77, 65, 83, 46,112,140,103, 59,102,185, 66,102, 74, 71,143,181,128, 88, 94,131,220,122,210,175,124,221,242,150, 45, 83,228, 34,
+242,195,173, 93,189, 96, 26, 97,217,103, 47, 98,191,231, 43,162, 91, 19,130,148, 50,112,253,191, 99, 11, 81,146, 47, 42,217,111,
+117,218, 47, 23, 13,183, 71,237, 55,161, 51,121,197,220,110,119,210,184,242,200,230,235, 16,153,111,217,229, 47, 88, 77, 41, 36,
+124,240,197,226,216, 52, 53,148,209,133,230,104, 12,229,126, 59,235, 16, 67,196,221,221, 61,142,231, 19,230,228, 89,216,153,160,
+165, 34,187, 90, 83, 35,114, 74,225, 56,207,128,162, 12,131, 69,252, 84, 85, 14, 33,120,236,246, 59,212, 77,141,121,158, 16, 66,
+194,187,119,239,105,132, 92, 85,152, 61,117,196, 74,107,138,210,228, 48,153,113,246,132, 60,102,218, 91, 18,148,188, 54, 79, 51,
+140, 82,208,114,137,255,204,120,243,234, 30,231,227, 17,109, 93,227,248,116,132, 20, 2,109,215, 97, 28, 7,248,121,230,103, 87,
+209,186,206, 16,148,197, 57, 7,173, 36,206,231, 51, 20,239,154,157,181,100, 89, 10, 1, 90, 40, 68, 63, 35,248, 8,164,204,208,
+ 27,138, 94,157,167, 25,109,219, 98,154,105, 2,209,247, 3,219,240,200,163,221,247, 67,177,157,157,207, 61, 34,239,114,105,122,
+148,202, 37, 94, 87, 13, 20,231,111, 47,159,169,186,166, 61,119, 8,164, 10,159,231, 25, 16,244,243,168,156,133,209, 6, 15, 15,
+143,168,170, 10,138, 49,174,228,101, 31, 16, 67, 36,219,155, 64, 81,210, 39, 6,212,144,135,156, 62,139, 85, 85, 97, 28, 72, 56,
+ 88, 87, 13, 82, 4,180,162,130,172,235, 58,248,224, 1, 1,140, 35,217, 26, 83,202,168,107, 98,175,151, 8,209, 98,141, 94,218,
+ 64,254, 12,107, 85, 8,117,125, 63,160,105, 26, 24, 77,207,196, 60, 79, 80,154,114,214,199,113,196, 52,205,104,154, 22,211, 28,
+ 48,140, 35,101, 7,180, 13, 94,191,122, 69, 77,152,159,145,114,132,171, 44, 5,215,176,251, 96,222,116,247,117, 93,193, 90, 90,
+ 17,209,251, 76, 22, 79,107,233,189,202,200, 43,181, 46,165,226, 6, 16, 82, 20, 52,235,221,253, 61,132, 16,152,103,114, 20, 76,
+195,136,174,109,168,136,145, 2,243, 28, 56,169, 79, 82,215,191, 61, 75,132, 88, 45,157, 27,152,204,246,140, 88,126,182, 37,151,
+ 29, 47,103,173,172,150, 54,220, 78,104,147, 16, 20,205,121,113, 40, 60, 7,203,139,141,178,253,150,249, 94, 93,154,149, 54,161,
+ 25,107,190,118, 73,168,219,236, 43,159, 35, 97,177,250,134, 47,178,173,105,116,248,250,254, 83,252,183,255,254,127,192, 47,255,
+248, 87,112,245, 43, 68,105, 49,204, 1,143,143, 39, 28, 79, 61, 98,244,152,231, 1,211,120, 70,140, 51, 98,152, 8,238, 16, 3,
+119,230, 20, 16,144,249, 66,247,209, 35, 49,245, 40,231,140, 57, 39, 68,222,225, 75,161, 86,187,220, 50, 37,144, 10,203,214, 24,
+ 28, 5,187, 22, 47,220, 41,110,183, 9,188, 46, 88, 26, 77, 9, 34,218,213,206,161,171, 12,246, 13,253,251,110, 87,227,126,223,
+ 65, 49, 53,201,104,141,166,118,216, 53, 14,187,206,162,118, 10,214, 40, 76, 73,225,111,254,229, 61,254,242,191,252, 51,126,253,
+246,132,115, 54, 48,166,129, 85, 26, 26,145,226,107,165,132, 23, 10, 1,160,195, 13,130,176,176, 66,194, 67,193, 11,137, 36, 53,
+143,160, 56, 21, 45, 3, 57,201,210,165,167,148, 47, 40,120,139, 64,196, 89,135,202, 90,220, 29, 14,104,155, 14, 77,219, 97,215,
+ 29,112, 56, 28,176,235, 90,180,109, 13,235, 40,115,154,130, 26, 54,227,115,145, 55,200,214,181,203, 78, 27, 1,154,200,151,184,
+225, 91,157,170,188, 64,210, 46, 81, 75,121, 51, 21,184,125, 25,138, 11, 97,140,188,250,109,226,217,165,190,166, 44,173,194,199,
+242, 51,190, 82,234, 63,203, 98, 23,223,238, 75,127,105,151,190,173,200,175,199,233, 23,164,169, 77, 97, 36,197,183, 20, 4,242,
+234, 53,228, 23, 88, 21,235, 64,137,244, 20,203,212,140,230,219,196, 39,175,107, 8,173, 89, 49, 76, 11,251,218,145,245,233,253,
+135, 15,152,194,140, 44, 51,118, 93, 75,222,237, 24, 97,156, 69, 22, 11,162, 85,241,225, 70, 57,220, 33,132,146, 18,118, 58,159,
+161,141,230,215,205,217,210,124, 25,229, 76, 66, 44,197, 69, 63,144,145, 66, 44, 69,247,241,248,196, 28,244, 0,107, 52, 21,196,
+214, 80,177, 46,232,178,121,243,250, 53,188,247, 56, 30,143, 56,159,123,116,109,135,227,211, 19,198, 97, 36,203, 42, 23,221, 49,
+ 6, 4,239,113, 62,157, 33,244,234,102, 81, 76,224, 75, 41, 83,124, 40,107, 14,132, 92, 38, 91,228, 13, 87,108,123, 93,114,193,
+ 1,224,124, 30, 40,100,102, 14,152,103,154, 60, 80, 54,186, 47, 10,243,192,140,250,170,170, 49,142, 19,206,231, 30,231,243, 25,
+ 33, 4,212, 85, 93,118,235,198, 24, 52, 77, 67, 49,179, 44,228, 34,199,143, 40, 23,106,211, 52,133, 43, 96,173, 69,127, 62, 67,
+105,133,182,107, 33, 0, 60, 60, 60, 96,183,219, 1, 16, 60,141, 97,159, 61,235, 28,170,170,198, 48, 76,232,218, 14,179,167, 73,
+194,126,191,199,219,183,239,176,235,106, 46,240,201,219, 63, 77,212, 97, 23,106,158,179,155, 80,166, 75,244,234,242,134,164,196,
+ 12, 12,169, 10,139,127,154, 39, 74,215,155,102,132, 24, 80,215, 13,142,199, 19,217, 43, 3,217,236, 34,107, 45,230,217,227,116,
+234, 17, 98, 64,215, 53, 80, 74, 32,165,128,170,169, 96, 93, 69,140, 17, 31,145, 64,133,138, 54,244, 44, 34,131, 87, 32,148, 73,
+176,236, 75, 9,144,196,230, 53, 14, 77,137,153, 98,180,181, 50,240,222, 99,154, 70, 72, 37,177,235, 90, 14, 2,138,144, 66, 96,
+191,223, 97,156, 38,196, 16, 41,106,152,167, 55, 82,210,251, 33,164, 42,119,230,194,146, 47,194,223,188, 54,128,219, 38,119,235,
+ 91, 23, 55, 86,111,124,169,199, 27,137, 51,107,167, 46,178, 40,172,104,136, 21,189,122,209, 25,240,254,252, 26, 1,190,118, 11,
+185,160,102, 22,158,123,145,143, 45, 23,218, 21,231,246,154,144, 69,204,222, 92,172, 98,153,233,111, 82,208,174,229, 71,159,255,
+ 24, 63,248,236,103, 56, 28,190, 15,101, 14, 56, 15, 17, 15,199, 39,140, 83, 79,221,249, 60, 34,248, 25, 49,121,204,211, 25,243,
+220,211,174, 40, 71,196,180,142,222, 99, 78, 72, 41, 32,164,132, 57,123,142, 28,205, 28,191,154,216,154,166, 86, 86,120,217,233,
+ 42,238, 6,228,230,189, 18, 23, 66,194, 5, 11, 92,104,101,121,237,146, 20,135,199, 88, 41, 81, 59,135,125, 99,113,191,175,241,
+241,171, 3, 94,223,237,224,140, 68, 74, 20,227,216, 52, 21,218,174, 66,215, 89,116,149,131, 85,228,215,253,155,127,253, 10,255,
+219,127,254,123,252,191,111,207, 56, 71, 96,158, 38,132,121, 42,227, 16,231, 28,148,169, 33,149, 99,240, 1,193,123, 18, 4,130,
+ 16,240,172,178, 77, 74,241,222,137,135,240, 73, 80, 98, 85,202, 72,129,199, 83, 87, 69,160, 18, 18, 77,229,240,241,155, 55,104,
+170, 10, 90, 81,247,166, 88,201, 47,144, 96,140, 70,219,214,152,253,136, 97, 60,175, 52,177,197,203,126,117, 65,229,205,165,190,
+160, 87,203, 74, 67, 94,142,166, 87,177,202,117,119,188, 93,174,139,103,129, 65, 91,164,237,114,169,175,200,199,252, 98,167, 94,
+148,253,207, 18, 10,229,230,159,215,163,116,113, 49,114, 23, 87, 1, 13,183,168,112,223,166,118,127, 9,197, 44, 55,252,125, 1,
+241, 98, 33,145,175, 69,123,249,133,221,123,198,133,102,128,188,235,228,235,117,214, 96,127,216, 65, 49, 30, 53,196, 4,173, 12,
+250, 83,143,125,183,195,219,119,111, 49,135, 9, 80,128,182,228,175, 78,222,243,229,234, 48,135,128,105,158,161,150,220,113,173,
+139,146,187,174,107, 12,195, 0, 41, 5, 38,102,142, 67, 8,124,255,251,223,227, 81, 46, 57, 69, 22,192,139,159, 39,132,105, 38,
+ 11,218, 68, 93, 98,142, 9,200,196, 74,175, 42, 11,196,136, 48,123, 52,109,131,251,215,247,164, 90,247, 30,179, 15,240,115,132,
+177, 14,199,227,137,149,203,244,126, 89, 99, 56, 89,204, 35,204,180,231,119, 77, 69,118,169,113, 42, 68, 74, 2,219, 8,182,151,
+133, 18,237, 41,165, 46, 0, 20,242, 66, 83, 87,215, 52, 59, 76, 19,185, 88,164, 36,247, 77, 85,213, 8,145, 46, 40, 26, 47,211,
+212, 34,248, 0, 99, 12,134,158,217,250,108,233,213, 82, 81,148, 43,119,250,117, 77, 43,143,105,158,139,229,201,104,137,166,118,
+ 92,132, 16, 85, 45,240, 74,209, 57,135,121, 30,161,151, 61,127,164, 21,128,247, 51, 9,243, 50, 61,159,227, 52,161, 31, 38, 52,
+236,118,200,153, 86, 23,231,211, 17,135, 67,139,105, 30, 32,181, 68, 85, 87, 28,142,147, 97,140,197, 48, 80,170,223, 60,123,222,
+179,131,137,132,161,216,138, 47,116, 41, 98,117, 89,128, 1, 58,200, 96, 81, 38,239,246, 65,107,133,113, 28, 1,161, 96,152, 13,
+144, 82,130, 84, 10,221,174,133,179,102, 5,144, 9,224, 60, 12,152, 67,160, 34,128, 65, 98, 57,101, 12, 67, 15,100,160,109,107,
+ 34,102,230, 68,212, 80,166, 89, 46,161, 68,130,173,208, 89,100,216,202, 65, 42, 18, 12, 46, 69,155, 15, 1,198, 16,173,110, 41,
+ 90,157, 99,244,238, 28,160,132,100, 81, 29,193,137,150,179, 76,105, 13,163, 77, 9,199, 81, 66,109, 56, 32,242, 98,101,120, 73,
+113,205,151,147,193,109,167,190,152,238, 47,185,221, 98,123,173,111,198,197,249, 57, 96, 38, 95, 38, 90,149, 68,181,109, 45, 33,
+214, 14,125,129,195,108, 3, 85, 10,244,131, 97, 23, 23,126,188,197,243,184,162,192, 8, 54,160, 13,238,238,238,241,147, 31,254,
+ 4, 63,255,233,207,240,163,207,126,140,251,187,143, 49, 79,192, 48, 5, 68, 0,195,120,198, 60,245, 8, 97, 68,240, 35,124,152,
+224,249,130, 31,167, 1, 41,122,210,240,115,244, 95,140, 52, 30, 75, 49, 34,228,136,152, 99,241, 90,103,246, 35, 47,170,200, 37,
+ 67, 30, 66, 34,243,129,150,174,178,188, 69, 17, 16,202, 11,146,157,224, 64,155,237,250, 66, 73,218,165,215, 70, 98,215, 56,124,
+116, 87,227,147, 55,148,186,230,180, 64,206, 30, 74, 10,116,109,141,174,171,177,107, 45,186, 70,192,217, 26, 33, 74,252,230,119,
+ 95,225, 63,253,223,127,139, 95,127,125,194, 57, 25,242,101, 70,170,148,179, 0,148, 81,208, 82,195, 89,135,186,106,208, 54, 13,
+140, 18,252,128, 19,116, 38, 72,141,164, 53, 37,214, 72,122,128,229,162, 45,227,192,138, 5, 33,121,225, 62,200, 25,149,177,120,
+115,255, 10,181,179,200, 41,192, 90, 10,152,216,237, 26,180,141, 67,229, 12,140,150,176, 86, 97,154, 7, 60, 29,159, 54,112, 25,
+129, 91,195,223,173, 72, 46, 3, 23, 10,247,229,146, 20,151,209,233,235,235,202,249, 50, 63,224, 38,210,113,139,179, 68, 97, 68,
+151, 78,159,109,136, 89, 60, 23,220, 45,191, 51,231, 53,150, 49,109, 46, 64, 81, 72,134,184, 0,225,220,180,166,229, 77,138,223,
+141,162,246,187, 4,118,207, 70,241, 88,127, 62,219, 29,251,133,215, 95,108, 83,167,242,139, 23,255,242,249, 93, 56, 11, 88,132,
+169,228,245, 64,195, 89,222,209, 71,120, 31, 33,161,225,135,128,251,221, 1,211, 52, 32,102,202,209,150, 74, 98, 24, 79, 56,116,
+ 59,120, 86,118, 47, 22,165, 20,137, 76, 22, 35,253, 94,193,197, 32,241,230, 53, 59, 47,248, 34, 64,198, 52, 79, 48, 70,179,154,
+154, 29, 15, 41, 82, 42, 89,221, 32, 39, 64, 41, 77,246,174, 68,176, 27,109, 52,134,129, 60,225,198, 26,236,247,123, 98,133,167,
+ 4,101, 52,142,167, 19,148, 50, 56, 62,157,169,235, 7,137,189, 36,125,113,130,188, 44, 81,166, 57,195, 88, 75,133, 69,166, 61,
+251, 50, 62, 93,222,211,162,102,206,224,221,181, 44,187,211,229, 49, 49,166,194, 60, 71,194,156, 50,169,101,154,102, 26,179,130,
+206, 24,234,244,136,119,190,192,142,144, 19,172,177,164,255,225, 46, 61,241,197,167,148,102, 22, 7,217,199,102,239, 73, 36, 40,
+ 73,228,101,172,197, 56,141,168, 42,242,222, 43, 45, 75,218,217,174,219,225,124,238, 33,165, 66,221,212,240,115, 96, 24,206, 64,
+ 58, 34,169, 48,142, 51, 4,232,103, 85, 55, 14,117,109, 33, 36, 8,107,203,246,188,182,233,240,238,253, 7, 56,231, 80,213, 53,
+ 17,223,148,198, 56,142,240,193, 83,152, 13,143,177,169,224, 95,132,231,236, 86, 50,154, 67,130,116,105, 34,115, 78,208, 11,176,
+ 40,103, 66,230,178, 56, 49,196, 64,182, 72,231, 48, 77, 51,206,167, 51,114, 78, 28, 95,187,120,215, 21,133,187,112,193,174,148,
+ 66, 93,215,212,172,112, 58, 92, 74, 1, 49,103,212, 77, 67, 88, 89,165,233,110,148,121, 45, 28,248,189, 18,155,224, 21,122, 70,
+129,121, 34,113,232,174,109,169,144,241, 51, 77,187, 21,133, 26, 81,126,150, 88,215,209,156, 25,144, 22,209,245,146,228,150,113,
+161, 61, 16, 82,188, 44,174,189,250,172,242, 78, 61,150,253,248,179,157, 95, 89,162, 47,144, 25,193,224,138,213,244,190, 36,196,
+136,107, 58, 40, 54,144, 25, 78, 53,226,192, 50, 6, 97,172,216,206,173, 8, 78, 20, 63,159, 92, 77,253, 82, 34, 39,234, 6,181,
+208,184,223,223,225,167, 63,248, 17,126,249,211,159,227, 39, 63,248, 9,222,220,191, 65,101, 42, 72, 0, 62,206, 24,167, 30, 89,
+ 68,196, 24, 48,244,103,218,143,251, 9, 49, 12, 8,243, 80, 66, 9,188, 15, 96, 67, 33,114,242, 72,193,115,194, 18, 41, 30, 99,
+140,200, 16,136, 72, 69,180, 69,227,163,188, 70,124, 10, 65,221,185,148, 69,133, 15,169,152,101, 47,203,135,115,157, 52,139,178,
+ 67,144, 82, 48,226, 85,194, 42,129,198, 72,180, 78, 96,223, 40,220,181,100, 83,163, 72,227,128,218, 25, 28,246, 20,169,186,107,
+ 29,118,181,134,179, 9, 30, 26,127,255,251, 71,252,167,255,235, 55,248,127,254,233, 27,140,170,129,135, 70,140,203,126,159,254,
+188,145,128, 83,196,148,175,140, 70,101, 29,172,164, 14, 68,104,139, 36, 53, 2,128,188,236,211,249,146, 90,196, 65,197,114,181,
+ 68,139,178,182, 32, 75,130,226,116,109,141,174,169, 8, 64, 82, 59,236,118, 13,132, 0,180, 18,156, 34,149, 33, 68,194,174,163,
+241,223,215,223,188, 69, 90, 92, 10,137,198,117,151,173, 97, 90,129, 54,219, 16,160, 11,193,123, 46,228,186,117,212,206,127,110,
+153, 52,108, 98, 68,215,137,209,178, 10, 89, 43,130,180,241,235, 47,112, 29, 48,211,127,185,207, 50, 19,242, 22, 97, 96,222,114,
+ 34, 51,158,177,235,175, 95,219,182, 72, 89, 14,253,197,166, 89, 58,131, 2, 88,186, 97,118, 7,190, 83,176, 39, 54,110,128, 98,
+ 83, 21,155,181,213,178, 10, 16,107,149, 47,243,202,165,190,117,169, 39, 65,207,132,202, 27,244,165, 0, 20, 18,238,246,123,156,
+ 79, 71,254, 51, 26,141,221, 97,111,106,252,248,243,239,227,155,135,175, 16, 36, 89, 81,179,247,164,202, 86, 26,167,126, 96, 42,
+ 35, 29,206,243, 52, 22,192,148, 20, 2, 66,177, 24, 23, 25,198, 26, 42, 26, 34, 65, 80,134,115,143,148,129,186,174, 17, 2,133,
+165,104,173, 49,251,128,211,121, 64, 91,119,232,218, 22,167,243, 25,231,243, 25,198,104,156,207,103,130,162, 4,186,152,238,238,
+247,152,166, 17,243, 56,194, 79, 51,172,177,120,122, 58, 65,102,137, 48,121, 56, 99,105,130, 21, 2,156,179, 80, 82,144, 3,197,
+ 88,204, 19, 77, 21,140,210,136, 33, 34,250,128,182,105, 80,215,180,223,151, 90,195, 53,212,109, 43,166,134,209, 57, 66,151,187,
+ 15,177,236,144,165,210,152,226, 12, 31, 3,172, 35, 52,108,140, 17, 41, 4,136,156,225,167,137,206,159,152, 10,133, 19,130,176,
+182, 33,121, 36,100,190,164, 3,140,182,232,251, 17,187,253, 30,199,211, 35,132, 18, 48,206, 80,250, 29, 76,185,160, 93,229,240,
+225,195, 7,230,161, 43,140,126,130,171, 44, 82,160,200,218,199,167, 35,124,136, 56, 28,238, 32, 69, 70,140, 30,117, 93,177,162,
+ 93,227,155,175, 63,160,235,118,208,154,248, 31,218, 16, 59,227,155,111, 62,224,254,254, 14, 18, 18,117,229, 48,246, 61, 37,191,
+241,115,223, 46, 97, 48,145,126, 85,141,163,176, 27, 77,194,101,197, 65, 64, 49,120,228, 20, 97, 52, 77, 32,180,209, 80,154, 10,
+ 60,169, 21,113,230, 39,138,217, 53,214,160,237, 26, 8,201,241,190, 41, 97,223,117,152,167,137,109,202,137,200,134, 33,208,234,
+100, 14,100, 1, 54, 14, 49, 4,196, 16, 97,173, 70, 22, 68, 76, 84,134,236,205,193,211, 29,160,180,130,173, 12, 65,146, 50,191,
+ 38, 37,214,207, 74,206,200, 49,195,104,138, 30, 86,156,232,104,157, 33,189,149, 72,220,253,103, 84,117,133,204,147, 45,145, 1,
+167, 45,196, 98,107, 99, 33,165, 42,193, 86, 75,177, 30, 33,182,209,176,215,193, 46, 87,232,118, 1,177,189,212, 47,125,111,219,
+221,218, 18, 52, 81, 84,186, 34,221, 76,150, 17, 87,123, 68,185,157,251,111,186, 43,145, 55,162, 60,145, 55,136, 79,177, 65,103,
+230,149, 5,207,223,149,202, 2,119,221, 30, 63,250,236,135,248,229,207,126,129,159,124,254, 67,188,185,127, 77, 42,211, 76, 34,
+169, 37, 62,113,156,103, 76, 51,135, 57,248, 17,126,158,225,195,132, 24,102,120, 63, 35, 38,250,240, 68,239,145,210, 12, 41, 18,
+114,244, 60,138, 79,108, 99, 88,162, 8, 3,143,206,150, 28,224, 92, 4, 80,101,210,176,101,206,131, 70,130,114, 73,252, 18, 75,
+244, 44,113,157,149,226,139, 30,138,118,238,130,162, 23,141, 20,168,141, 68,227, 20,156, 76,208, 50, 66, 33,162,118, 10,251,174,
+194,221,190,198,253,161,193,174,171,209, 52, 14,150,133, 44,255,250,213, 3,254,143,191,250, 53,254,203, 63,252, 14,167, 32,144,
+140, 99,122,146,100,230, 89,134,226, 8, 89,103, 52,165,104, 73, 69, 2, 27, 86,108,219,186, 65, 85, 55,208,198,113,164,100, 94,
+139, 50,254, 41,134, 68,135, 81,233, 22, 54, 30, 55, 45, 5, 14,135, 61, 37, 77, 41,137,221,174, 67, 78,192, 56,244, 56,159, 79,
+232,135, 30,227,120, 70,152, 39, 84,149,197, 28, 2,190,126,251,150,138,201, 69,140, 41,215, 7,122,173, 12, 5,103, 88,231, 21,
+207, 88, 58,116,222,105,202,149, 91, 32,128,219, 57, 4, 23,115, 35,241,204,132, 81,242,147, 55,114,186,197,199,158, 64,214,147,
+117, 62,141,146,201,190, 77,122,187,230, 45,136, 43, 43,220, 75, 80,153,173,253, 46,110, 39,102, 23,144,165,111, 79, 61,124,105,
+183,126,105, 67, 20, 23,157,228, 82,226,228,205,170,224,165, 78, 93,101, 82, 73, 70,174,135, 84,230, 95, 90, 66,114,174,122, 87,
+181,168,235, 22, 90, 43, 88, 9,212,181,196,135,227, 55,136, 34, 33,228, 4, 31, 35, 62,249,248, 99, 2,155, 48, 95, 92,106,194,
+ 77, 43, 41, 8, 1,106,200, 71, 30,137,170, 84,118,235,206, 57,164, 68,156,243,211,233, 8,163, 53, 94,189,126, 77, 74,119, 14,
+ 92,202, 16, 56,157,122,138, 32,173, 27,188,123,247, 14, 82, 73,132,156, 48,205, 19,237,240,173,193,235,215,175,113, 58,158, 48,
+143, 35, 89, 89, 61, 29,238, 70,107,200, 44,248,146,110, 49,249, 0,109, 45,171,175, 35,164,210, 72, 16, 24,231, 0,173, 13,172,
+ 51,180, 66, 66,226,120, 84, 82,244, 75, 37,169, 9,136, 28,126,196, 48,163, 37, 10, 53,196, 64,249, 13,137,166, 18, 11,126, 57,
+120, 95, 46, 26, 37, 37, 32,152, 24,198,207,164,146, 52,229,164,203,131,170,202,182,110, 41, 83, 79,107, 40, 69, 14, 0,235, 28,
+142,167, 39,156,142, 39,120,159,208,182, 7,140,227,196,175, 39, 22,212,234,216,143,112,117, 5, 8, 74, 47, 75, 33, 65,107, 10,
+ 62, 57,157,142,196,231,103, 29,131, 53,142,203,108, 42, 48, 62,124,248,192, 35,240, 10, 33,122, 88, 77, 58,128,243,208, 99,191,
+ 35,161,221,225,176, 71, 63,246, 68,242, 11, 1, 82, 72,210, 93, 64,160, 31, 39, 18, 93, 66,146, 11, 64, 17, 83,192, 88, 3, 63,
+123,154, 30, 70,234,108,181, 38,176,142, 49,134, 72,131, 66,194, 57,110, 70, 36, 96,172,129,181,150,138, 47, 69, 10,243,166,169,
+139,184,111,156, 38, 88, 75, 78, 13, 74,215, 4, 35,131, 3, 54,149, 18,250,126,224, 96, 24, 96,230, 32,160, 24, 72,107, 37, 0,
+ 88,103,121,237,176, 96,142, 29,233, 18,120, 66, 51,142, 35,140,214, 4, 13, 51, 26, 57, 83,160, 14, 5,243, 8,132,121, 70,211,
+212, 48, 70, 97,154,102, 42, 98,165, 90, 87, 89, 41,153,102,238, 37, 0, 0, 32, 0, 73, 68, 65, 84, 95, 76,236,148,184, 94,255,
+221,248,252,111,180, 71,171,165,237,198,165,142, 77,224,133,192,122,112,109,213,239, 55,243,211,115,162,212, 52, 92,138,115,150,
+195, 80, 94, 76,252,150,236,221, 92,130, 85,202,152,117,147, 53,189, 4, 78, 52,182,198, 15, 62,254, 12,191,252,163, 95,224, 23,
+ 63,253, 35,124,242,250, 13, 42,235, 8,127,153, 88,160,199, 23,111, 6,169, 93,251,113,192, 52, 79, 8, 97,198, 56, 13, 8,193,
+ 35, 69,242,132,166, 20,145, 98, 64,138, 51, 82,156, 65,174,108, 26,181, 39,222,179,231,148,232, 34,203,137,232, 70, 41,174,177,
+161, 87,107, 3, 33, 81,170,121, 99, 20,172,225,177, 82,217,255,175,194, 34, 81, 14,110, 66,216,202, 76,198, 47, 37, 18,172, 74,
+216, 55, 22,149,150, 48, 34,225,110,215,224,123,111,238,240,230,174,195,221,190,194,126, 87,161,118, 26,198, 41,132,156,241,175,
+ 95, 61,226,255,252,235, 95,227, 55,255,252, 53, 30, 39,160,207, 10,210, 85,132,177,205, 43,242, 71,243,104,223,106, 77,170,223,
+141,139, 32, 11, 1, 99, 40,192,166,170, 27,212,214, 81,122, 84,138,180,143,228,253, 14, 93,234,116, 48,164, 28, 23,198, 45,114,
+ 38,155,204,235, 87,247, 52,117,224,253,163, 98,129, 9,169, 84, 71,140,243,136, 20, 2,172,113, 56,245, 39,124,243,246,109, 17,
+203, 20,154,211,102,188,187,144,235,150, 74, 54,231,101, 37, 64, 10, 84, 41,214,220,109, 89, 68, 82,184, 45,160,219, 92,231,171,
+ 80,103,163,184,220,254, 44,151,130,116, 41,110, 46,244, 35,203, 90,233, 50,218,245,242, 67,119, 91, 52,250,236,178, 92, 62, 12,
+ 92,180, 92,115,230,165,146, 37,133,240, 90, 59,240, 93,151,250,197, 90,107,195,170,190, 24,217,111,224, 51,223,117,169, 83,199,
+ 17,232, 57,206, 2, 58,211,126, 49, 34,225,174,235,112,111, 43,252,251, 95,254, 27, 84, 74,115,215,157, 48, 12, 71,204,243,128,
+170,169,224, 99,194,253,171,123,204,179,199,241,216, 99, 24, 73, 92, 21, 66,192, 56,244,168, 27, 26,209,122, 86,108, 15,227,132,
+166,109,203,243,208,117, 59,166,193,101,214,105,104,236, 15,123,204,243, 76,194,166, 24,203,133, 68, 86,181, 53,147, 33,229,132,
+126, 24, 0, 33,240,217, 15, 62,199, 55,111,223, 34,250,176, 34, 58,178, 64,240, 1, 74, 40, 72,144,197,115,154, 70,100, 65,145,
+163,222,207, 80,138,184,235,243, 60,195,105, 13,163,137,132, 38, 4, 17, 40,101, 42,122, 76,130, 86, 17,143,132, 70,223,124, 17,
+ 44, 59,210, 20, 41, 45, 78,114, 22,250, 60,205,100,135,243, 36,214,162, 11,129, 1, 84, 75, 44,174, 0,170,138, 70,255, 93,219,
+162,107, 59,248,121, 70, 78, 9,218,104, 76,158, 18,224,250,115,207,214, 47,130, 2, 5, 31, 33,165, 65,240,158, 98, 94,121, 48,
+213, 53, 45, 32, 36,123,219,201,210, 21,124,132,181, 14,206, 58,164,156, 48, 77, 3, 95,148,170,104, 77,104,159,111,152,188, 57,
+193,123, 74,121,107,155, 26,117,221,224, 60,156, 97,180, 36,251,159,146,232,135,190, 88,163,167,113, 66,206,153,196,127, 2, 24,
+ 39, 15,163, 12,230,113, 70, 76, 25,138, 53, 67,100,197,139, 80,154,216,243,206, 57, 12,195,128,170,114, 48,218, 16,183,126, 34,
+ 28,109,215, 53, 24,198,158, 69,133,117,177, 84, 75, 1,216,202,194, 24, 74,248, 35, 93,130, 40,164,206,170,174,144,114,100,158,
+124,128,214, 22,214, 88, 42,112,149, 42,214, 51, 41, 36,172,113,208,154,210,220,192,145,211,198, 40, 72, 65,194, 96,231, 44, 82,
+142,104,234, 10, 34,211, 4, 24, 34,241,235,149, 80, 34,227,227,143, 62,194,227,195, 3, 23,116, 52, 25,167,116, 62, 79, 83,168,
+ 16,200, 90, 12,172,161, 46, 12,202, 90, 86,123,215,169,148,184,113,185,231,252, 66,167, 94, 50,202,153,162,115, 41, 58,202,207,
+ 98,223,196,114, 97,179, 24, 73,222,234, 36,216, 7, 44, 25, 31, 42,229,149, 63,118, 73,123, 19, 91, 21,179,132, 85, 22,175, 15,
+175,240,179,159,252, 17,254,236,231,127,140,239,125,252, 9,154,186, 38,127,120, 92,138, 8, 86,228, 34,113, 36, 30,199, 16,122,
+ 95, 20,162, 62,204, 60,218, 10,165, 90, 77, 57,176,178,157, 46,123, 41, 87,104,200, 98,187,202, 49,240,202, 56, 94,250,153,197,
+ 86,180, 64,151,166,211, 18,181,211,104,106,139,218, 82,181,182,128, 46,144,214,160, 25,177,120,247, 83, 4,162,135, 72, 51, 68,
+158, 97,100, 66,165, 4, 58,167,208, 85, 6,173,213,184,223,183, 56,180, 21, 26, 43, 97, 21, 96, 52, 96, 45,145,154,126,251,187,
+175,241, 87,127,251,143,248,199,223,190,195,209, 11,156,163,192,144, 0, 97, 28,192,163,255,197,162, 69,175, 79,195,240, 4,129,
+170,126,242,211, 10, 73,187, 43, 41, 20,156, 54,168,108,133,218, 57, 56,107, 75,144, 77,185,208,185,216,201, 11,229, 11, 11,190,
+179,194,221,126,199,171, 12,222,177,115,230,243, 52, 78, 28,211, 8, 62,180, 12, 98, 18,120, 60,158, 16, 83, 42, 32,158,156,183,
+225, 8,171, 96,102,221,169,231, 11,191,184,146, 43, 9, 78, 92,196,166,109, 84, 33, 98, 99,239, 90,190,150, 88,119,236, 98, 27,
+129,138, 69,133,187,238,226,159, 67, 92,196,165,106,247, 5,229,250,181, 80,238, 26,162,179,122, 84, 95, 70,192,230,148,191,179,
+ 43,127,137, 78,119, 97, 45,223,190, 31,120,174,224, 23, 27, 97,221, 75, 95, 39,136,132, 44, 51, 77,196,104,159,131,136,136,218,
+ 8,252,244,254, 30,255,227,159,253, 57,190,223, 29,112,124,120,192,169,239,225, 99,132,113, 21,154,170, 65, 8, 36, 34,218,237,
+ 15,120,247,254, 29, 66,164, 24, 81,178,114,241, 37,100,116, 97,170, 91,206,232,150, 74, 21, 75,163, 82,138, 82,203,188,199,126,
+191, 71,211, 52,120,122,120, 98,194, 93, 46, 89,222, 82,146,186, 61, 70, 18,223,197,148, 10, 54,212, 58,135,243,249, 76, 96,156,
+243, 68,132,175, 68,187,204, 5,102,147, 98, 98,209, 93,128,214,130,161, 80,137, 70,239, 74, 33,199, 64, 80,114,126,254,149,208,
+ 52,210,135,162, 11, 20, 18,209,199,197, 55,132,201,123,132,156, 49,251, 72,191, 38,207,132, 60, 81, 46,248, 20,252,102,165, 5,
+104,197,197,190,146,112,206,114,220,169,197,221,221, 61, 2,199,215,182,109,199,254,106,186, 4,230, 48,163,174,106,204,126,198,
+ 48, 12, 24,250, 1,221,142, 56,237, 86, 87,200, 2,152,231,177,156, 73,203,222,190,170, 42,230, 51,144, 18, 30, 28,244,210,118,
+ 29,142,199, 35, 97,120, 99,164,196, 74,109, 32,132,196,233,116,162,196,182,121, 46,103,105,219,237,160, 36,169,212, 37, 4,170,
+202, 81,236, 44, 4,190,249,230, 1,221,174, 35, 44,111, 2, 98, 10,232,118, 59,244, 3, 17,240,172, 49,208,134,172, 94,218, 18,
+156,135,186,106, 13, 41,129, 16,102, 10,195, 9, 84,192, 33,229,226, 63,143, 41,163,114, 53, 30,159,142, 52,166,103,250, 28, 88,
+ 21, 63, 14, 19,164,210,168, 42,218,157, 43, 6,249,196, 24,240,250,205,171, 18,155, 61,242,107, 81, 82,160,237, 26,210,106,144,
+172,155,220, 24, 82,160,109, 42, 42,162,180, 68,244, 1,134,159, 73,107, 52,194, 60, 51,236,135, 18,236,252, 76, 34, 67,107, 8,
+221, 61,244,103,236,239, 14,155, 88,112,202, 78, 48,198, 34,199, 4,163,245,115,134,139, 72, 37, 7,228,230, 25,176,101,121,136,
+ 21,231,174, 42,227,254, 98,187,239, 43, 6,246,197,123,190,116, 9,114,181,189,221,244,218,178,135, 88,224,217,222,158, 15,141,
+ 92,132, 97, 23,157, 4, 46,199,238, 69, 44,151, 5,218,170,198,231,159,126, 31,127,242,243, 95,224,167, 63,248, 49,246,109,199,
+246, 18, 9,177, 80,222,144,139, 98,145, 82,174,232,131,185, 28,160,211, 52, 97,152,122,206, 45,143,108,151,136, 40, 55, 45,177,
+251,128, 28,168,139, 6,101,133,167,232,153, 44, 23, 47, 48,162,203, 43, 85,155,232, 86, 35, 65,177,167, 78, 98,215, 90, 52,149,
+ 66, 91,105, 34,192, 41, 85,108,104, 57, 38, 40, 86,158, 86,214,160,170, 20, 42, 3, 88,153, 96,101,228, 44,244,140, 74,101, 84,
+154,242,208,187,218,162,177, 10, 93,173,208,213, 6,206, 26,248, 24,241,197,111,127,143, 95,255,221, 23,248,237,219, 51,198,168,
+ 48, 37,131,115,200, 24, 83,130,174, 26, 72, 30,177, 19,252, 1, 48, 82,192, 25, 77, 25,241,130,222, 99, 37, 22,157,131,228, 41,
+131, 34,205, 2,231,179, 59,107, 97, 57,191, 56,196, 8, 31, 72,233, 25, 83,216,164,227,145, 16,172,170, 44,249, 50,231,153, 63,
+140,100, 55, 10, 62,176,138, 54, 18,167, 94, 72, 40,101, 32,164,198,241,120,194,236,195,198,234,184,241,144,231, 85,123, 64, 72,
+221,116, 9,109,184, 88,239,136,139,240, 18,228, 75,171,227,245,127,134,192, 5,185, 80, 44,251,236,139, 16,133,124, 85, 0,200,
+239, 28,129, 95, 99,100,113, 69,194,123,214, 5,111,226, 78,183, 23,238, 75, 64,153, 91,150,180,151,104,116, 36,237,200,101,234,
+ 32, 55,159,231,139, 67, 97,241,173,191,240,119, 44,107,137, 40,104,244,170, 22, 2, 34, 34, 42, 5,252,226,205,107,252, 47,255,
+238, 87,248, 65,211,161,127,124,143,132,140,119,231, 30,193, 86, 72,182,198, 52,147, 2,186,109, 91,134, 59, 69,234, 68,145, 56,
+116,131, 14, 85,173, 40,162,216,199,128,170,174, 96,172, 37, 75,169,247,228, 17,151,178,116,183, 77, 91,227,124,238, 73, 15, 3,
+178,107, 45,233,127,103, 30,191,123, 63, 67, 51, 75, 62,248,136,113,156, 81, 85, 36,252, 18, 66,178, 34,123,101, 33,208,103,157,
+108, 74, 11, 21, 47, 33, 35, 36, 74,118, 91, 96, 68, 49, 82, 58, 35, 32,225, 35,101,136,103, 8,234,148,133,128,143, 25,211, 28,
+248,151,135, 79, 9,222,167,146, 60, 70,133,180,162,169,128,148, 64, 78, 48,122,229,129, 40, 41,160, 52, 37,175,165, 20,209,214,
+ 21, 2,139,183, 40,188,136,248,231, 77,221, 64,105, 77,161, 47, 70,109,194, 83, 80, 10, 33,193, 9,106,222, 71,180, 93,139,105,
+ 28,232,236, 82, 36,240,154,103,234,138,173, 35, 97,162, 99,232, 76, 74, 96, 13,131, 47, 35,237,229,189, 42,206, 39, 0,146,153,
+ 25, 66,208,251,125,216,239,232,156, 96, 88, 78,140, 9, 93,183,131,210, 10,111,223, 61, 82,148,171,159,161,141,130,210,138,173,
+119, 61,139,197, 18,180, 81, 48, 86, 65, 25, 18,188, 9,145, 97,157,197, 60,211,206, 95, 41,192, 57,202, 77, 31,134, 17,135, 3,
+113,236,233, 89, 38, 32,142,171,106, 60, 60, 30,225,170,138,237,133, 30,195, 48,195,251, 0,205,208, 36,201, 13,141,117, 22, 90,
+ 41,104,165,105, 13,146,200,187, 30, 35,121,203, 23,242,179, 53, 26, 82, 72,244,253,153,166, 12, 28, 7,188,116,213,203, 88,127,
+158,105,204, 79, 60,124,129, 48,123, 46,238, 73,171,112,238,123,156, 78,103,244,195,128,113,156,224,125,128, 53, 22, 85, 69,174,
+132, 24,226,198,198,154,110,126,182, 47,197,194,130, 19, 17,101, 65,212, 2, 2,250, 91,128,145, 23,130,165, 91, 4,171,109, 56,
+196,198, 15,179, 42,231,243,213, 82,239,154, 76,119,145,188, 37, 10, 46, 80, 73,129,125,183,199, 79,127,244, 19,252,232,179, 31,
+224,213,254, 64,172, 93,193,204,224,180, 96, 88, 57,229, 89,172,137, 88,145,185,228, 18,128, 85, 64, 99, 5, 78,125,192, 20, 82,
+ 73,220, 41, 66, 42,126,152,114,138, 64, 74,136, 50, 67, 40, 64,164, 72, 40,218,204, 40,209,156, 11, 63, 59, 47,227,222, 13,173,
+ 75,137,140,202, 72,116,149,198,174, 54,168,173,130,210, 25, 49, 0,201, 10, 52, 86,163,210, 2,143,199, 1, 33, 36, 32, 73,216,
+ 74,161,118, 10,141,171, 80,201, 12,153, 35, 12, 50, 42, 37,208, 90,137,187,182,194,199,119, 29, 94,223,181,184,223, 85,184,223,
+ 89,212,149,134,143, 30, 95,125,245, 30,255,242,187,175,113, 26, 2,178,208,200, 34, 33, 35,174, 97, 55,108,138,166, 14,156, 18,
+213, 12,143,221,151,159,167,224,184, 81,177,233,209, 68, 78,229,151, 4, 95,238, 85, 3, 35, 21, 43, 51, 19, 30, 78, 39,200,172,
+ 72, 24,152,137,189, 45,153,212, 21,145, 17, 83,132, 49, 10,198, 88,246,197,178, 42,213,104,132,232,161,132, 70,244, 9,202, 1,
+ 90, 91, 8, 49, 21,165,248,122, 81,173, 19,134,133, 75,183,144,230, 98, 94,215, 53,183,147, 78, 55,217,230, 91,115,248, 69, 75,
+ 44, 46, 82,151,202, 88,158,253,177, 82,138, 77, 78,208, 18, 78,147, 54, 94,218,141,255,253,194,222, 22, 81, 68, 1, 57,111,146,
+ 9,111, 23, 1,215,175,225,219, 66, 91,174,119,229,215,151,250, 5, 70, 50, 95,126,203,151, 41,137,151,159, 93, 37,100,201, 39,
+184,197,143,223,154,236,151,194, 71,138, 4,131,136, 63,253,228, 83,252,175,255,225, 63,162,139, 1, 15, 95,253, 43,101, 6, 76,
+ 61,238,118, 13, 30,143, 3,166, 12,178,148,165,136, 70, 41,192, 39,228,192, 23, 49, 40, 36, 5, 0,195, 70,248,245,104, 67, 78,
+ 13,165, 16,153, 21,190,213,235, 88,107, 32,165, 46,186, 10,163, 13,175,104,168, 96, 23, 32, 14,253,233,116, 66, 85,215, 56,157,
+ 6,228,148,217, 14, 23,208,184, 10,231,225, 76, 90,146,197,123, 28, 98, 33,123,137,148, 32,211, 42, 16, 94,172, 71,144, 9, 66,
+248,205, 27,235,145, 69,102,253, 13,219,174, 22,158,195, 38,119, 64, 75, 10, 97, 90, 70,144,153,125,207, 82,242,122,128, 32,240,
+ 28,224, 34, 56, 40, 74, 97,191,223,195,191,251, 6, 66,146,162,125, 24,103, 72,173,161,165,130,201,192, 20,136,159, 33, 20, 89,
+253,132,148, 56,159, 7,212,117, 3,248, 92,166, 32, 66,144,181,234,233,241,145,114,219, 53,237,156,253,236,105,109,160, 37, 62,
+114,175, 49,142, 19,178, 33,113,111,219,182,248,240,248, 1,119,119, 7,218,135,123, 15,169, 20, 71,149,102, 88,171, 49,140, 39,
+254,220,107, 30,223, 83, 1,100,180,195,152, 6,132, 57, 32,134,128,174,235,240,250,213, 43,252,254,203,183, 37,223,125,158, 39,
+ 10,255,217,237,209,182, 13,158, 30,159,160, 37,224, 67,130,240,130, 93, 4,160,203,127,177, 33,242,211,172, 25,177,235,231,128,
+119, 31,222,227,205, 71, 31,227,233,120,198, 48, 78,168,234,154,198,207,218,224,241,233,136,182,109, 81, 53, 53,194,113,192, 56,
+142,152,231,145, 51,237, 37,180, 84, 56, 31,123, 56,103,225,156,130,148, 30, 66,212, 92, 36, 80, 32,145,176, 18, 41, 8,206, 32,
+176,216,237,118, 23,250, 23, 41, 5,180,100, 78,130,146,200, 12, 96,138,222,163,114,142, 68,112, 49, 98,158, 35,134,225, 17, 93,
+183,199,253,171, 26,253,208, 83, 81, 58, 5,140,195,128,200,223,111,211,212, 56,247,253,115,122,228,245, 25,144,210, 5,125,110,
+253,236,211, 51,164, 47, 69, 66,223, 29,158,113,203, 39, 43,176, 13,135, 95, 85,180,219,242, 66,176,183,245,166,159,118, 57,172,
+181,130, 86, 2,175,186, 3,254,228,231,191,196,231,159,126,142, 93,219,193,176,175, 93,240, 1,180,101,114, 47,202, 66, 26, 67,
+ 8, 68, 14,130, 22, 57, 66, 33, 81, 71,108, 52, 70, 63, 16, 20, 38,173,129, 50, 37,112,132,199,225, 49, 9, 86, 47,242, 5,195,
+225, 48, 5,227, 90, 18,232, 36,123,204,233,114,119, 74,160,182, 10,109,165,176,171, 36, 42, 39,161,116, 70,142, 64, 8, 9,201,
+ 10,180, 85, 5,171, 50,222, 63, 14,240, 49,192, 79, 9, 86, 42, 72, 35, 81, 87, 6,181,117,232,156,193,161,177, 56,212, 6,251,
+218,225,213,190,194,174, 49,216, 53, 10,149, 17,240,126,192,215,111,223,225,237,135, 19,124, 18,200,210, 64,200, 0, 32, 32,243,
+ 88, 92, 20, 40,208,178,115,150,144,138,108,108, 86, 74,192,251, 50,134,206,172,204,102, 51, 30, 95,161,145, 62, 24, 89, 0, 49,
+195, 74, 9,229,170,114,153,133,144,241,212,247,240, 8, 16, 82, 32,100, 2,206, 10,238,150,230, 48, 99,246, 51,237, 10,185, 67,
+239,186, 22,109,219, 2,239, 31,168,107,225, 73,129, 49,134, 27,128,180,177,129, 45, 34,194,205,184,157,127,101, 42, 37, 46,172,
+111, 23, 10, 80,126,214,100,222,122,171,243,198,109, 32, 94,224,159,111, 34,119,196,102, 95,158,243,179, 17,249,154,230,134,203,
+206, 94,172,147,163,101,164,159,211, 37,115, 65,220, 28, 97,137,139,164,190,111, 75,103,187, 21, 10,243,109,137,110,183,138,158,
+188,121,109, 34,103,222,151, 46,141,216, 37,162,119,123,177,203,144,161, 4, 32,178, 71, 37, 19,254,252, 71, 63,194,255,252,239,
+126, 5,219,247,144, 90,224, 52,246, 8,198, 33,142, 19,238,170, 26, 95,197, 17, 73, 4, 76,115, 68, 72, 1,206,237, 17,252, 4,
+ 85, 50,251, 18,130,159, 73, 68,150, 18,180,181,152,198,137, 2,131, 64,227, 97,231, 28,140,214,176,218,176, 7,157,126,191,203,
+153,198,236, 50, 21, 15,175, 82, 10,167,211, 19,250,126,134,144, 10, 83,240, 16,179,225,145,164,130,204, 1,136,192,216,143, 8,
+ 49,210,254, 52,147,218, 24,156, 89,176, 56, 44, 40,161, 79, 81,131,176, 76, 3, 35, 25, 33, 22,241,108,193,156,242, 5,174,181,
+ 44,217, 21, 34,139,213,201, 83, 50, 18,152,124, 73,240, 60,100,100, 24, 43, 0, 78, 89, 76,153,158, 55,178, 72,129, 82, 36,119,
+ 59, 76,222,147, 64,143,215,129,139,246, 99,246, 51, 4, 95, 38, 49, 70,178,151, 57, 10,138,209, 90, 35,129,198,226, 85,101,209,
+117, 7,124,120,120,143, 73, 1, 2,134,246,232,129,190,143, 97, 24,113, 30, 6, 30,255, 46, 93, 60,217, 4, 79,167, 19,246,251,
+ 29,148, 82,232,251,158,130,121, 98,128, 53, 10,206, 25,248, 8, 60, 61,145,187, 32,166,136,167,227, 19,246,251,123, 60,126,248,
+ 64,144, 27, 87,211,202, 36, 38,188,126,117,192,195,195, 17,206, 89,204, 60, 61,161, 72, 85, 98, 17,244,253, 25, 18, 10,105,138,
+168, 42, 98,118,132, 16, 33, 53, 96,180,165, 29,116, 76,232, 79, 3,190,247,233,247, 32,133,194,239,191,252, 26,143,199, 39,212,
+ 77,135,119, 15,143,240, 49, 99,156, 61, 62,250,232, 53,222,191,251,134,246,242, 74,162,221, 19,235, 32,166,136, 97, 26,161,189,
+132, 49,182, 8,232, 14,135, 61,140, 85,200, 32, 49,164, 16, 26, 22,132,210,141, 42, 33,106, 69, 69,129, 39, 0, 14, 17,247, 72,
+199, 49, 13, 35, 50, 50,234,154,118,235,129, 73,164,117, 93,175, 86, 80,161, 16, 82,198,215,111,223,195,186,138,255,206, 3,114,
+204, 72, 49, 97, 24,134,130,193, 93,232,123,101,253,200,122, 44, 5,113, 1,124,219,250,100,179,192, 38,152, 10, 80, 78,219,191,
+ 88,119,153, 43, 0, 70, 10,249, 12, 47,121,185, 71, 23,171, 95,184,116,191,171,101,235, 86,247, 36,228, 21,214,179, 88,189, 8,
+177, 35,132,192,155,195, 61,254,236,151,255, 13,126,248,253,207,113,215,238,160, 32, 87,248, 13, 50,139, 76,152,106,198,130,131,
+229,146, 79,105,217, 2, 80, 50, 88, 94,108,104, 66, 96,152, 38,248, 64, 42, 83,170,174, 35,217,216,114,164,196,178, 68,185,199,
+106, 81,231,167,124,161,168, 22,200,252,250, 41,200, 65,243, 88,211,106,137,202, 42,212, 78,163,171, 21,218, 90,163,113, 18,214,
+ 8, 24, 3, 40,145, 96,148, 64,237, 44,186,182, 3, 24, 95, 25,124,128, 72, 25, 34, 5,168,156,224,100,134, 85, 25,157, 83,216,
+213, 6,109,173,113,232,232,223,206, 0,209,247,120,120,120,135,135,227, 17, 99,200, 24,163,192,148,128,113, 14, 24,167,128, 97,
+246,232,125,192, 20, 34,164,182,208,218, 66, 73,139,140, 4,107,137,131,109,149,100,232,199,130,165, 85,188, 75,150, 43,159,124,
+227,247,150, 0, 52,255,124,148, 50,128, 80, 72, 89, 98, 14,137, 70,241,229,103, 78,226,151,186,114, 24,250,158, 98, 96,171, 26,
+167,211, 9, 74, 81,120, 71, 85, 85,136, 57, 97,158,103, 24,107,161,180, 70, 72, 1,167,254, 92, 18,206, 22,178, 84,161,185,229,
+109,160, 74,226, 17,147,220,216,178,158,143,167,228, 85,167, 42,110,178,204,197, 11,157, 51,127, 96,214,228,160,242,193, 18,133,
+ 82, 39,111,118,234,107, 81,176, 78, 6,174,247,212,215, 59,117,177,161,233, 93, 59,232,111,121,212,191, 13, 62,179, 29,187, 63,
+ 31,217, 95, 22, 66,139,110, 69,222,232, 6,110,193,159,150,113,160, 18, 17, 78, 36,252,199,159,253, 12,255,211,159,253, 91, 52,
+243,140,225,233, 9, 67, 10, 56, 78, 35,178,116,232,170, 6,253,135,247,216,181, 14, 82,120,104, 36,136, 20,208,180, 21,166,105,
+ 64, 10, 36, 12, 2, 50, 38,239, 11,115, 66, 27,135,224,125,121,143,140,177, 69, 48,164,249,247, 75, 1, 22, 25,129, 18,221, 50,
+ 48,207, 19,229, 46,112, 48, 74, 63, 76,176,174,194, 48,142,144, 66, 99,154, 60,140,182, 8,115,228,181, 30,160,132,132, 51,154,
+138, 26,182,148,146, 47, 92, 66, 75,205,174,144, 12,149, 19,172, 18,176,138, 86,105, 36, 48,205, 48,138, 45,168, 66,194, 41, 5,
+ 39, 37,233, 85,216, 37,160, 1, 24, 1,104, 78, 31, 67,206, 48, 70, 17, 93, 46, 39,238,202,233,255,231,156,225,196,183,181,252,
+146, 74,161, 97,238,125, 63,210,164,193,115,150, 58,161, 82,103, 26, 27, 75,137, 48, 17, 88,138,210,204,168, 11,175,154, 10, 85,
+101,225,163, 71, 78,212, 1,142,227,136, 28,105,180, 28, 66, 64,219,118,196,169,183, 26, 16, 20,254, 2, 36, 22,149,101, 4, 22,
+138,145, 82,158,137,114,214, 81,227, 32, 73,188, 26, 67,198, 48,206, 28,175, 75,107,185,221,254,128,211,241, 9, 82,100,178,110,
+ 41, 1, 99, 53, 98,206, 56, 30,143,168,170, 6,125, 63,208,232, 91,107, 76, 19, 9,237,250,126, 68, 74, 64, 8, 20,121,186,248,
+251,115, 2, 1,108,250,129, 98, 84,103,143,121,246,248,222,167, 31,227,233,244,132, 24, 19,246,135, 3, 38,239, 49,249,153,201,
+160, 1,119,135, 29,134,177, 71,213, 16,188,167, 90,192, 59,146,124,244,203,202,141,146,212, 60,172, 83, 56, 28,118, 20,136, 51,
+145, 62, 33,179,254, 71,107, 77, 28,247, 68,225, 95,195, 48,194, 90, 83, 20,246, 11, 46,153, 72,136,178,252, 29,146, 9,137,153,
+237,220, 0, 21, 7,231,115, 79, 17,190, 49,113, 2,157,227,175, 1,104, 99,138,142,105,205,222,144,151,107,196,101,213,178,209,
+ 26, 73,182,210, 1, 88,136,114,105,173, 50, 55, 7,134, 90, 14, 56, 33, 55, 81,147,156,188,182,228,192,114,133, 73,191,214, 42,
+245,154,243, 94,208,155,114, 81,237,109, 59, 95, 58, 63, 95, 29,238,241,167,191,252, 19,252,224,211,207,209, 86,148,203,124, 1,
+250, 40,136, 82,218,117,151,157,247, 34,106, 75,139,199, 55,208,142,125, 19,170,225,189,135,159, 71,218,109,179,119,146,130,102,
+ 56, 70, 52, 5, 72,228,226,169, 22,136,107, 22,119,185,232,200, 26,166, 4,249,178,173, 18,112, 70,160,118, 26,109,165,202, 46,
+189,182, 10,206,106,152, 37, 62, 85,102, 88, 35,209, 53, 14,119,135, 14, 90,100,204,195, 25,113,246,168,180,130, 85, 2, 90, 2,
+ 86, 75,212, 86,160,113, 10,109,101,176,171, 13,156,165,108,230,243,233,140,211,121,196,232,129, 49, 8,140, 62, 97,242, 9,227,
+ 20, 49, 76, 1,253, 28, 49,250, 4,159, 37,180,117, 48,214,177,208, 40,194,106,141,125, 83, 67,231,140, 48, 17,253,106, 75,233,
+ 19, 25, 5,121,187,116,248, 74, 8,202,159,151,228, 5,151,203,222, 55,211, 72,114,152, 71,132, 24, 72,245, 47, 4,186,166,129,
+179, 6,231,227,145,195, 21,106,250, 64, 24, 69,138,120,107,136,186,228, 3,180,209,208, 70, 34,137,140,199,167, 35,179,211, 11,
+148,152, 45,141,145,125,230,155,139, 16,204, 44,207,155,188,128,109,130, 31, 4, 54,203,117,138,105, 23,155,238,116,137,241,221,
+120,211, 23,208, 76,206,236, 80, 40, 59,173,124,179,219,189,178,119,111, 46,194, 53,135,156,222, 95,254, 32, 47, 95,115, 83, 28,
+172, 34,190,245,245,138, 43,228,227,173,208,154, 91, 23,249, 22, 37, 43,113,201,190,191, 16,157, 94,152,249, 86, 53,124,230, 68,
+170, 92, 80, 18,139, 22, 96, 93, 61,252,127,148,189,105,143,109,219,117,158,247,204,110,181,123,239,170, 58,205,109, 72,145,186,
+164, 72,137, 38, 37, 33,254, 18,219,177, 12, 73, 22, 12,197, 65,128, 32, 65,146, 79, 49, 16, 32,200,255,240,175,115, 62, 57, 8,
+ 98, 39,176,101, 73,142, 76,138,188,247,116, 85,181,187,213,204, 46, 31,198, 92,107,239, 58,205,189, 50,137,131,115,238,105,170,
+219,181,230,152, 99,140,247,125,222,172, 51, 48, 83,165,153,255,242,119,127,194,159,252,252,247,105,199, 17,237, 61,129,204,155,
+253,129, 33,102,218,190,231,225,221,189,116,145, 70,241,248,248, 64,211, 72,110,247,233,124, 46, 59, 67, 35,126, 98,165,201, 74,
+139,213,171,252, 48,218, 72, 28,106, 93, 83,215,245, 37,142, 82, 35, 30,240,217, 99,157, 93,115, 39,150,248,213,227,225, 32, 20,
+ 59, 43,204,249,251,135, 71,198, 81, 24,241, 49,102,180, 50,226, 44, 40,157,155,117, 26, 83,116, 48, 26, 73,226, 90,190,243,108,
+129,206,168,156,138, 13, 84, 83, 59,141, 53, 98,233,211, 69, 79, 35, 86, 84,112, 70, 99,138, 95,223, 26, 65,106, 47,138,245,133,
+125,224, 42,209, 20,132, 24, 10,155, 66,179,217,110,200, 57,115,115,119, 87, 24, 28,107, 71, 34,222,124,231,240,193, 83, 57,193,
+144, 90,103,153,166, 9, 99,197,242, 21,188,103,211,245,140,227,185,228,111, 11, 45,210,207,158,219,219,173, 60, 55, 49, 22,175,
+125, 36, 45,217,230, 37,172,164, 45, 84, 56,165, 33,196, 80,152,245,208,212, 13,195, 48,174,121,241, 49,202,107,176,219,108,201,
+ 36,198,113,164,105, 59,225,216,151,245, 90,140,242,186,182,109,195,110,187, 99, 60,159,136,193,211,246, 45,214, 89,124,144,241,
+253,227,227, 30, 87,213,196,132,196,202,246, 61,243, 56,173,207,204,188,104, 36,148,188,222, 90,233, 53,165,239,116, 58,163,140,
+ 5,165, 56,156,142, 24,171,121,254,252, 5, 15,143, 7,172,115,116,125,203,227,254, 88,120,243, 30, 31, 2,125,223,113, 60,158,
+176,136,102,168,107,154, 75,189, 41, 26, 34, 93,244, 5, 49,200,228,177,237, 90,114,138,156,143,103, 89,227,106,153,194,104,163,
+112, 86,132,139,199,211, 64,140,137,182,233, 8, 81,166, 26,231, 97, 44,196,191, 74,198,245,174, 90, 45,141,179, 23, 97,100, 12,
+ 34, 56, 52,250, 2,251, 25, 70, 89, 49, 69, 31, 8, 33, 17,188, 48,226,175, 9,154, 57, 21, 0, 88,121,222, 83,129, 90, 93, 84,
+242, 18,238,181,172, 95,237, 19,130,220,251, 99,117,165,100, 44,180,250,204, 63,164, 97,228,140,168, 97,211,123, 17,141, 31,116,
+ 23, 23,106, 87,206, 98,234, 39, 94, 14,237,103,187,103,252,236,199, 63,225, 7, 95,126,159,174,106, 46, 7, 78, 33, 48,165,156,
+209,107, 81, 15, 23,117,122, 25, 53,171,226,119, 22,128,224, 18,115, 90,212,164, 42,211, 85,142,193,138, 16,103,217, 37,167,197,
+223,167, 46, 89,218,185, 20, 6, 93,210,143, 84, 25,209, 43,173, 74, 50,154, 8, 86,172,145,157,125,101, 21,181,147,194,237,140,
+198, 26,133,211,154, 74, 57,176,137,168, 0, 2, 74, 37,172,245,220,117, 13,207, 55, 47,121,177,177,124,253,205, 61, 42,103, 25,
+191,215,166,140,225, 43,218,170,162, 41, 74,212,121,158,137,209, 51,249, 76,200,142,152, 33, 17, 73, 73,210,133,134, 57, 50,197,
+196,156, 50,190,140, 14,215, 80, 84,157,139,175,213, 96, 53,132, 40,163,114,209, 53,202,229, 37,165,128,213,245, 21, 5,112,217,
+ 99,199, 34,168, 91, 94,211, 76,107, 52,222, 89,206,117,205,182,235, 4,173,155,164, 35,105, 10,172, 35, 20,159,237,233,116,226,
+ 71, 95,253, 54,183, 55, 91,130,159, 57,143, 35,231, 65, 58, 19, 87, 87, 84,181, 33,107, 9,246,240, 37,222,117, 77, 9,204,203,
+ 14,251,210, 13,231, 84,246,238,165,123,126, 42,142,227,106,132,124,201, 14, 16,203,213,101, 4,175, 11, 49,110,161, 57, 93,190,
+ 31,185,166,177, 92,105, 64,158, 2,147,101, 52,187,236,120,205,147, 81,245,117,135,158,159, 4, 19, 47,221,125, 94,173,116,151,
+ 75, 0, 79, 58,180, 79,229,174,127, 27, 14,118,253,243,204,186,122, 89,158,215,247,179,221,223,223, 54,228,171,232,220, 44, 15,
+ 26, 73,103,178,214,168,152,177,121,121,162, 2, 77,246,252,211, 63,248, 67,254,241,207,126,142,122,120,196, 40,197,155,253, 61,
+131,214, 76, 40,180,169,121,220, 63, 50, 17, 25,114,226,124, 56,241,252,249, 11,222, 28, 30,168,156, 19,104, 75,136, 76, 49,130,
+177,156,167, 9,227,156, 76,150,140,140, 28,131,247, 84,174,146,144,150,105,162,109,107,114, 2,239,103, 82,170,113,181, 16,208,
+172,202,108, 54, 66, 14,203, 57, 18, 99,194, 40,139,247, 17, 91,213,178, 99, 70,175,221,100, 52,162, 46,142, 42, 99,172,162,107,
+ 42, 81, 49, 43,133, 31,207, 56, 35, 0, 16,101,220, 42,142,140, 36, 92,101,113, 78,184, 18, 49, 37,114, 10, 24,173,203,138, 79,
+ 60,210,198, 80,252,196,226,192,145, 24, 88,199, 28, 35,196,136, 9,134,190,223,176,187,217,202,164,202,251,130,102,149,226,105,
+172, 92,118,141,157,201, 33,136,127,124,154,153, 39,177,225,110,182, 29, 62,122,234,186, 89, 59,103,177, 87, 5, 65,230, 22, 54,
+ 7, 74,166, 25, 77, 91, 49,141, 35,211, 60,200,186, 68, 65,156,101, 58, 39, 1, 38,162, 12, 31, 75,225, 62, 30, 78,244,155, 30,
+109, 45, 41, 4, 81,232,151,221,185, 66, 52, 11, 98,229,149,230,167,235, 58,129,164, 24,131,181,154,186,113,156, 79, 35,227, 40,
+140,252, 20, 34,181,171,136, 69, 92,103,173, 37, 76,113, 37, 4,158,207,103,154,182,101,255, 56, 23, 77,147,136,249,250,190,231,
+120, 62,163, 53, 56,167,159,184,132, 98, 12,114, 9, 42,207,142,143,129, 87,175,222,240,139, 95,124,129,179,142,183,111,222,241,
+219, 95,253,144,174,173, 57,157, 7, 97,231,135,204,253,253,129,155,237,150,241,116, 66, 13,153,237,110, 67,215, 54, 84,181,229,
+120, 58, 49,143, 94, 38, 66, 90,190,119,200,154,253,227,190, 92, 42,243,234,198, 64, 65,215, 52,160,228,115,237,251, 6,239, 3,
+ 15, 15, 15,236,110,101,226,161,141, 97, 24, 38,234,186,161,170, 26, 89, 41, 25, 35, 31,143,173, 75, 72, 16, 12, 49, 82,149,162,
+ 45,105,135, 53,211, 48,174, 57,245,185, 88,128,157, 19,235,158,179,118, 77,200,188, 94,115,103,205,154, 47,177, 78,212,175,208,
+ 90,223,178,205,187, 20,113, 93,186,244, 15,186,151, 18, 6,243, 93, 59,248, 39, 64,145,114,128, 44,251,211,109,191,229,199, 63,
+250, 17, 63,248,173,223,146,253, 89,190,236, 63,151, 49,251,226, 25,143,233, 35, 9, 97,235, 78, 61,149, 61,247,149, 80, 47,201,
+ 39,221, 84, 21, 77, 85,203,104,237,186, 91, 90, 80,158,198,160, 48, 69, 12, 37,247,118,249,255,229,109, 25, 40,202,112,168,157,
+116,227,181, 51, 43,101,232, 66, 12, 75,232, 69, 36,163, 53,181,182,212, 90,211, 89, 69,163, 60,207,122,195,207,127,250, 5,255,
+224,239,255, 14,127,239,167, 95,240,253,207,123, 94,222,181,220,109,106,250,214, 21, 66,147, 34,134,192, 52,205,204,147,151, 56,
+192,133,112,166, 52, 33,101,102,159, 8, 49, 10,156,101, 97,144, 23,127,179, 50, 26,227,100,180,102,157, 89, 97, 8, 75,161, 94,
+ 17,189,168, 69,110, 8, 73, 68,114, 38,231, 85, 5,111,173,112,163, 43, 39, 83,137,166, 22,235, 94, 95, 11,252, 70, 23, 18, 84,
+ 85, 85,100, 50, 33, 74, 16,206,225,176,103, 26, 71,218,166,165,109, 26,230,113, 40,176, 13, 71, 83, 59, 54,125, 79,215,212, 88,
+205, 26,139,170,184,160, 93,213, 90,161,243,202,109,207,101,205,162,222, 27, 35,175,122,179,180,136, 31, 47,194, 47,115, 53,170,
+ 90,210,222,242,199,138,226,199,188,159,239,141,205,175,115,205, 63,165, 66,121,106, 93,203, 79,152,238,215,121, 7, 79,178,215,
+191,229,109,253,157,246,229,233,162,180,191,126, 30,212, 39,214, 15, 31,227,186,235,114, 57, 47,155, 39,162, 2,159, 3, 58, 69,
+ 54, 9,254,236,103,191,207,159,255,236, 15,232,207, 19,225, 60,112,156, 70,238,253, 76,172, 28,231, 24,240, 57,128, 81, 28,134,
+ 19,119, 47,158, 97,172,140,108,141,210,236,186, 94, 52, 26, 5,215,234, 42, 87,166, 95,153,105, 30, 11,140, 41,175,130, 55,233,
+100, 22,104, 75,186,140, 25, 75, 81,106,219,174,136, 48, 19, 49, 65, 85, 75,192,200,188, 22, 58,181,230, 86, 27,163,203,249,177,
+ 76,228,100, 34,208, 54, 13,206, 10,198, 88,169, 76, 93, 59,250,174,193, 26, 13, 57,210,212,142,182,177, 52,149,197, 25, 69,142,
+129,202,105,156, 85, 52,141,163,174,229,217,111,172,165,118,142,202, 89,140, 53,104,163,176,149,124,142, 77,219,138,189,201, 79,
+146,127,176,184, 12,202, 26,175,170,196, 63,190,219,116,216,242,123,214, 24, 98, 22,193,105, 86,138,172, 13,174,170, 10, 20, 37,
+ 99,173, 91,207,227, 5,113,171,141, 66, 91,205,105, 56, 1, 89,240,215, 41, 16, 83, 40, 45, 78, 44, 31,155,120,246,181,214,156,
+202, 56, 59, 39,228,140,153, 61,167,243, 32, 22,177,166,149, 93,112,193, 66, 87,117, 77, 76,153,211,233,188,194, 91,154, 69,239,
+224,100, 71,111,173, 41,188, 9,153,162,244,125, 79,211,212, 12,227, 72,215,245,228, 4, 55, 55,183,162,164,207, 25,235,204,106,
+ 45, 91,206,162,229,109, 56,231, 72, 41,172,141,198,233,116, 64,145,216,244, 29, 49, 6,182,155,158,105,138,188,121,243,150,155,
+221, 13,155,190,229,237,155, 55,124,241,217, 75,156, 17, 90,219, 34, 38,155,189,167,219,108, 72,100,206,195, 64,136,126, 21,238,
+118, 93, 43, 74,119,165, 10,216,198,211,182, 29,195,121,162,239, 55, 88,235,104,154, 70, 10,107,142, 76,211, 72,215, 53,220,220,
+244, 82,216,131,164,124,198, 57,112,179,149,208,170, 80,108,134,199,211, 68,202,224, 92, 45, 28,255,162, 93,145,201, 75,192,123,
+177,103,250,217,211, 52,109,105,160,243,170,153, 88, 62,166,235,179,103, 57,127,100,141,148, 63,212,217,148,103,223, 52,182,164,
+180,173,105, 57,165, 43, 71,175,194, 14,197,135, 30,246,133,105, 78, 33,143,125,204, 70,116, 25, 17,170,213,223,190,130,107, 80,
+144,160,182, 53, 95,253,240, 43,190,250,193,111,179,109, 55,235,206, 52,151, 84,163,229,199,154, 76,163, 46,170,162, 69,244,246,
+228,172,188, 58, 7,151, 27,206,242, 57,101, 40,226, 45,177, 81, 41,125, 21,115, 87, 58, 56,173,148, 60,128,106,185,129,167,117,
+127,110,181,236,158,156, 81,212,149,252, 92, 25,133, 53,106, 29, 83, 59, 3,206, 26,172, 21,209,157,252, 59,249, 97, 72, 50,138,
+ 55, 80, 91,104,107,205,166,171,232,155, 10,171,197, 19,111, 84,146,191,107, 52, 42,199,149, 62,229,125,100, 10,137,209, 39, 78,
+163,231,116,246, 12,115, 96,142, 16, 51,248, 8, 83,204,132,172,112,117,131,169,108,217, 93, 42,186,182,166,177,154,241,120, 32,
+133,112, 97,140,103,228, 50, 83, 46,108, 86, 43,156,210, 56,163,169,173,166, 42, 5,221, 57,133,179,242,119,146, 82,140,179,103,
+152, 69,163,176,176,186, 55, 59, 9,128, 56, 28, 14,107, 66, 81,206,226,193, 61, 30, 14,178,211,203,148,236,107,195,102,219,145,
+ 82,226, 55,191,249,102,205, 51,190, 98, 30, 94,141,221, 75, 87,187, 80, 91,243,147,217,251, 90,216,197, 50,116,177,188, 93, 23,
+232, 5, 32,115,217, 41,235,167, 22, 17,117,101,215, 33, 63, 9, 79,200,239, 61, 60,107,152,194, 85,161,126, 95, 92,246,254,152,
+124, 45,242,234,170,149,127, 47, 28,230,227,243, 45,190,179, 32, 63,177,237, 93,107, 94,158,216, 73, 65,125,171, 12,111, 25, 24,
+ 20,178, 95,166,112,190, 19, 45,145, 63,253,217, 47,248,111,254,240,191, 32,221,191,195,251,153,153,196,246,197, 11,142,227, 72,
+ 70, 49,140, 35, 63,250,209,143,185,191,127,195,205,237, 13, 83,144,220, 5, 25, 81, 54,236, 79,103,230, 16,232,182, 91,162,130,
+195,241, 72, 86,114, 1, 92,198,192,193,207, 98,171,180, 86,232, 95,139,101, 84, 43,130,247, 52, 69,132,196,138,216,149, 81,242,
+233,116, 38,134,132, 47,248,209,105,242, 34,194, 42,170,116,173,236,122, 78,144, 83,217,215,138, 23,220, 89, 67, 87, 87,196,224,
+233,154, 86, 10, 65,177,220, 85, 70,211, 86,110, 45,182, 75,251, 99,173,147, 68,194,130,118, 54,229,237, 40,205,250,253,104,156,
+195, 22,194,217, 56, 12,164, 40, 33, 43,222,123,250,174, 99, 26, 71,172,177, 37, 24, 6,166,225, 76,244,179, 92,226,103, 79, 68,
+161, 93,181, 38, 0, 58, 91, 49,207, 50,158,149,100, 58,233,158,231, 73, 70,215, 33, 10,187,126, 9, 78,114,206, 92, 89, 50, 11,
+ 35, 10, 69, 85,215,107, 56, 73, 42, 86, 40, 87, 9, 68,167,174,157, 56, 9,202,197,220, 90, 87, 2, 82, 68, 76,217,247, 61,111,
+223,189, 17, 86,122,185,116, 8,237, 78,216, 34, 41, 73, 39,126,179,219, 48, 7,121, 45, 33,179,223,239,217,108, 37, 23, 62, 4,
+153,204,161,138, 98, 95,201,235, 45, 8,213,150,169,184, 29,118,219, 94,152,244, 90, 46,229,195, 56,150,143, 89,180, 22, 25, 9,
+146,121,245,234, 45,191,247,123,191,199,219,183,111,153,231,192,110,183,145,240,148, 81,178, 46, 66,188,160,204,251,141, 76, 24,
+ 42,231, 4, 97, 59,141,162,222,215,162,166, 95, 38,105,195, 48, 18, 66, 96, 24,166,149,250, 39,174, 12, 83,104,165,170,136,224,
+ 18,125,223, 49,156,135,146, 4,120, 68,107, 83, 86, 36, 18, 25, 60,205,190,100, 16, 8, 39,127,179,118,199,246, 3, 0, 0, 32,
+ 0, 73, 68, 65, 84,233, 75,140,111,189, 2,147, 82, 65, 31, 47,228, 68, 85, 50, 3,188,151,104, 99, 73, 33,188,136, 86,245, 18,
+189,154, 63,174,191,201, 57, 99,106,219,252,203,204,197,138,182, 14, 27,181,190,242,206,242, 94, 44,229, 5,228,161,174,186,121,
+165,213, 7, 69,125,165,168,105,181,172, 24,139, 64,197,226,180,229,139,207,190,228, 39, 95,253,132,187,237,205,138, 62, 76,177,
+228,215,190, 39,226, 81, 92,143, 99,151, 79,180,116,102, 41,173,137,114,226, 93,191,194,138,114,217,165,134,146,159,158,214,110,
+142,146,244, 86, 48,174,229,191,109,177,234,217,133, 96,165,165,120, 59, 35, 5,174,178, 10,187, 8,235, 22, 4,108,217,181,155,
+ 2, 14, 16, 62,188, 46,127, 39, 99,149, 70, 23, 34,219,162,234,139, 33, 50,142, 19,227, 56, 74,104, 66, 74,194, 59, 46,140,227,
+224, 35,115,136,140,179,103,244,137,227, 48,113, 60,143, 82,208, 67, 36,103, 65,193,134,172,240, 33,225, 83,162,170,106,170, 66,
+133,179,214,210,119, 13,206,128, 63,159, 74,103,124,137,139, 21, 40, 92, 44,126,123,189,238, 16,107,103,169,156,150,238,196,136,
+214, 64, 23, 11,210, 28, 34,135,243,200, 84,246,106,117, 83,179,221,246,156,207, 39,206,231,243, 26,159, 89, 57, 43,151,157,242,
+218, 25, 99,176,218,209,118, 13,183,119, 59,198,105,228,111,126,249, 27,124, 72,235,101,237,137,150,125,193,172,230,188, 96,224,
+ 47,176,152,171, 44,227,101,146,162,242,123, 50,142,235,215,254,189, 96,244,203, 0, 64,173, 17,192,215,148,185, 39, 20,167, 53,
+ 51, 94, 61,221, 74,231,111,207, 65, 79, 87, 83,165,139, 66, 62, 61, 21,235, 41,158,216, 59,243,119, 32, 97, 63, 84,208,171, 15,
+ 45,126,234, 90,215,242, 52,249,238,195, 73, 64, 94,119,191, 20,125,133,201,178, 35,174,178,231,143,126,254,115,254,236,103,191,
+207,173,213,188,122,251, 27,166,228, 9, 40,148,171,184,127,124,196,218,138,195,195, 3, 63,252,254,111,225,199,129,103,207, 95,
+112, 26, 70,234,182,103,127, 60,224,170,138,215,239,222,209,223,220, 96,154,154,195, 48,112,158, 70, 41,138,117,181,174, 75,130,
+159, 75,166,117, 42,121,234, 18, 64, 66, 74, 5, 85,154, 46,175, 75,193, 86, 15,227, 12,104,137,203,180,174, 20,125, 41, 24,178,
+143,212,229,224,190,208, 6, 41,250, 33,107, 53,219,190, 43,171,152, 76, 83, 11, 92, 37,198, 64, 83, 88,239,206, 25, 92, 93,173,
+ 17,166, 25, 4,101, 90,104,105, 18, 90,100,217,238, 54, 84,117, 37,226, 81,224,230,246,150,156,132, 70, 55, 20,254, 57, 57,161,
+148,124,110,227,112, 38, 69,137,123, 78, 49,200,199, 20,101,239, 29,114,190, 68, 55, 27,195, 56, 77,164,152, 25,167,105,189,158,
+ 57,231,152,166,113,125, 29,171,166, 34, 36, 41, 8, 77, 43, 94,240,156, 19,117, 93,139, 75, 58,171,245,123,222,251, 80,160, 54,
+117, 17,187,102,234,186,193, 88,203,205,110,203,241,120, 90, 11,161, 40,222, 37,136, 38,149,209,187, 46, 13,135, 56, 14,116, 41,
+100, 51,135,195,145,174,235,176, 70, 9, 28,203, 79, 69, 13,238,139,117,207,112, 60,158,200, 89, 70,217, 62,132,130,222, 53,132,
+ 32,137,116, 41,165, 21, 9,172, 77, 81,191,107,225,235,135,144, 10,231, 95, 94,167,148,147, 96, 93,141,161,105,218,149, 0,151,
+163,236,253,231, 16,160, 20, 78,128,105,156,104,154,122,137, 67, 96,211,111,152,198, 9,173, 5,192,211, 52,205, 90,216, 37,238,
+ 87,224, 54,211, 52,202,219, 80, 2,231, 89, 48,180,117,237,152,231,137,166,170,202, 19,166,169, 42,199, 56,142,132,224,201,200,
+196, 67, 27,187,242,252,115, 89, 91, 44, 14, 5,113, 19, 45,250,174, 75,241, 95,143,188,178,211, 79, 41,173,172,137,143,113, 43,
+ 46, 43,244, 66,164,171, 77,253, 47,223,183, 8, 73,156,159, 45,153,182,242, 2, 94, 19,224,180,214,130, 15, 45,221,243,117, 39,
+191,136,143,150,183,185,102,137, 95,131,103, 10,247,229,238,230,142,159,124,245, 59,188,120,246, 2, 87,242,184, 99, 76, 43, 60,
+102, 9,163, 88, 74,123,138, 97, 29, 65, 92,139,149,214,159,139,255, 56, 47,227,228, 44,133,246,130,207,150,157,108, 8, 98,179,
+ 72, 11, 82, 84, 23, 5, 63, 98,243, 48, 90, 50,205, 85,142,232,156, 10,119, 89, 58,117,163, 51,214, 8, 80,192, 60,153,214, 94,
+194, 68,228, 27, 39,173, 7,182, 94,237, 8,170,120,164, 53, 41,194,236, 51,167,243,196,233, 60,113, 60, 14,204, 62,144, 81, 24,
+ 39,183,215, 16, 2,147, 15, 12,163,103,152, 60,195, 52,115, 56,141,156, 7,207, 28, 18, 10,129, 78,200, 67,171,153, 99,194,135,
+132,171,235,114, 27,148, 48,132, 77, 87, 99,178, 71, 71, 79, 91, 89, 9,192, 40, 17,151,210,132,164, 18, 95,169,101,164, 88, 89,
+154, 74, 83, 87,134,218,137, 64, 68, 62,111,185,149,205, 33,177, 63,157, 57,207,158,144, 34,219,221,134,182,171,121,120,120, 96,
+154, 38,156,147, 7,101,187,217, 8, 42,209,136,223,212, 88,139,181,142,205,182,103,123,179,225,221,253, 3,191,250,213,215,132,
+ 88, 10,233, 74,100,121,223, 39,253,148,121, 32, 20, 49,181, 10,208,158, 40,199, 11, 20,238,178, 99,190, 42,240,107,145, 54, 79,
+ 69,104, 87, 64,135,156,179,124, 77, 47,184,164, 39,233,124,121, 41,238,239,141,186, 63,237, 69,127,154, 99,176, 88,222,244, 21,
+202, 86,125, 42,148,229, 59,212,238, 79,144,182,239,179,160, 87,231,194, 53, 71,255,170,131,215, 87,107,132, 50,245, 16,166, 76,
+196,168, 68, 71,228,143,126,250,187,252,207,255,228,143,201,251, 71,190,126,243, 27, 84,107,139, 23,186,231,120, 58,115,251,252,
+ 57,167,113,100, 60,143,188,184,123,206,233,112, 96,119,123,199, 28,225,111,191,249,134,126,187,163,106,106, 78,211, 68,182,134,
+195, 48, 50,204, 19,177,136,220,198,121,194,186,170, 8,146,116, 1, 22, 57,114, 25,155, 43,181,168,210, 37,172, 67,151, 92,243,
+133,205,157,179,140,142,143,231, 97, 5,203, 24, 99, 25,199,153,174,235,105,138,130, 57,198, 88,158, 75, 85,162,142,129,152, 4,
+198,164, 21,164,200,102,219, 67,166,228,151,203,168,179,223,244, 84,117, 93, 46,174, 45, 33,102,182, 55,183,160, 20,214, 85, 43,
+243,161,109,155,117, 7,234,189,132,195,248, 81, 58,239,113, 30, 47, 96,151,156, 72, 49, 23, 32,147,151, 46,184, 52, 79,169, 76,
+ 35, 19, 10,159, 51, 33,178, 70, 11,167,144,137,197,223, 62,205, 94,208,169, 69,137,190,136,165,146,202, 56,235,164,139,188,210,
+162,248,152, 49,214, 17,202, 84, 77,105,197,118,187, 43,248,218,176,142,125,251, 77,143, 45,162,177,119,239,222,177,217,108, 56,
+157, 78,236,247, 7,172, 21, 53,254,233,116, 20,129, 89, 1,211, 52,149, 0, 94,206,167, 51,227,228,177,149,163,107,106, 92,101,
+ 57, 30,143,244, 93, 87,138,117, 46, 5,218,112, 60, 30,185,189,189,193,207,146,134,105,172, 91, 31, 80, 99,132,105, 96,221, 18,
+ 67,170, 49,218,174,170,119, 31, 34, 41,102,110,159,221, 18,163, 20,249,199,199, 71, 94,190,124, 9, 36,198, 97, 88,117, 95, 41,
+179,174,191, 20, 18,184, 50, 79,243,149, 2, 62,178,219,109, 72, 41,113,127,255,184,198,252, 26,163, 75,162,222, 21, 22, 90,171,
+213,139, 47,107, 76, 4,150, 84,214,189,146,201,238,136, 49, 10,202, 55,103,134, 97, 94, 73,136,203, 52, 56,145, 80, 89,116, 17,
+242,182,106, 81,186,151, 38,212,185,234,234, 28, 74, 43,239, 32,167,247,178, 86,174,234,226,117, 81, 95, 48,196,250,169,207, 69,
+125,152, 49,157, 47,105, 89, 31, 30, 92,139,191,249,189,201,247,226,157, 83,234, 73,188,229, 37, 4, 94,216,192,223,251,226, 11,
+158,221,222,137, 15, 29,201,235,142,197,118,182,224, 65, 99, 94,136,113,241,195,189,230, 34,146, 43, 4,188, 69, 80,124, 73, 62,
+ 45, 86, 40,196,186,226,172,166,169, 28,109,137, 0, 93, 71,107,171,221,206,148,131, 55, 21,148, 45,133, 23,188,228,182,231,226,
+ 99, 47,232,212,210,245,199, 24,241, 62, 49,135,204,236, 51,211, 28,153,198,192, 56, 6,166, 41, 72,134,111,148, 64,139, 41, 38,
+ 6,159, 56,207,145,227,217,115, 56,206,236,143, 51,231, 41, 49, 71, 69, 72,138, 97, 10,236, 79, 19,247,135, 51, 15,135,129,135,
+227,192,227,113,226,241, 56,114, 56, 79,140, 62,144,115, 9, 3, 16, 55,224,250,205, 40,187, 59,179,118, 40, 86, 65,165, 97, 83,
+ 59,158,221,116, 60,187,233,184,217, 84,244,181,128,121,186, 90, 44,121, 77,109,112, 14,180,201, 24,155,169,107, 41,232,173, 83,
+180, 86,130,102, 26, 11,173, 83, 52, 86, 97,149,172, 27,140, 81, 66, 87,202,137,224, 39,185,236, 24, 67,215,182,212,101,239,238,
+156, 91,147,182,172, 53, 37, 90, 51,175,233,121,139,218, 90,152,255, 11, 71, 32, 94,232,113,215,185,244, 87,186, 14,149, 64,167,
+101, 52,175,214,239,187, 15,108,102, 31, 89, 77,235,124,249,241,145,127,242,193,239,229,171, 48,153,107, 29,202,199,160, 76, 31,
+ 3,184,100,226,101, 15,127,229, 9,191, 78,118,187, 30,245, 47, 41,109,239, 95, 28,190,149, 98,247,254,199,176, 8,252,138, 19,
+ 32, 82,126, 86,200,222,182,168, 97,178,202, 2, 9,202,242,189, 82,229,192, 63,252,233, 79,248, 23,127,250,103,124,158, 20, 15,
+239,222,146,157,229, 60,122,154,237,142,183,251, 61,253,102,203,195,187,123, 26, 87,241,163,159,254,148, 73,131,174, 26,148,109,
+248,213, 55,175, 24, 67,102,119,247,156,183,239, 30, 49,214,210,111, 68,232,100,157,163,223,108,164,227,180, 18,210,177,216, 30,
+115,241,205, 11,178,186,132, 94, 88, 75, 68,137, 90, 62, 95,194,145,150,174,254,241,241,192, 52, 78,114,153,172, 29,174,182,220,
+222,221,136,167,121, 24,100,247, 94,220, 46, 49, 73, 78, 54, 40,124, 8, 28,143, 71, 98,233,158,114,230, 73,162,152,177,154,166,
+107,203,229,215,113,123,123, 43, 49,160,203, 89,153, 97,187,217,148,221,118, 42,120, 87,131,202,112,218, 31, 32, 70,210,236, 37,
+ 67, 59, 8, 82,148,156, 9,179, 68,113, 42, 9,168, 32,139, 32,166,164,130, 73,250, 90, 70, 10,109,215,246, 76,211, 76,140,153,
+ 24, 18,227, 44, 35, 89,231, 36,126, 52,149, 81,163,177, 18,210, 20, 67,228,116, 56, 73,247,151, 97, 28,167,114, 86,229,117,218,
+160,148,102, 28, 71, 98, 76, 18, 75, 27, 19,195, 89, 46,102,203,100,111, 28,231, 18,105,171,137, 49, 51,142, 51, 57,101,218,182,
+229,112,216, 99,173,185, 80, 70,115, 17,205, 57,195,233, 52, 10,193, 82,201,120, 60, 37, 73,158, 91, 46,177,214,138, 7, 62, 71,
+ 73, 70, 67,201, 40,123, 24,134, 21,156,178,219,237, 10,138,118, 96,154,102, 66, 76,212,109, 75,221,246, 36, 12,227, 60, 51,142,
+ 51,179,247,108,119, 27, 66,200,188,122,253,170, 92, 10, 89,119,254,187,109, 79,223,117, 52,117,117,101, 45,213,156, 78, 35,231,
+243,196, 60,123,166,105,228,230,118,203,243,231,119, 76,211,200,126,191,199, 90,129,233, 44, 22, 70,185,172,137, 48,118,158,101,
+181,115, 60, 30, 49, 74,227,140, 45,194, 95,203,121, 56,130, 74,156,206, 7, 66,244,116, 93, 45, 92,131,224, 87, 55,136,224,202,
+195, 90,199, 66, 8, 40, 35,130,109,165, 53, 33, 69, 66,138, 5,234, 99,214,218,164,175,116, 65, 10, 85, 86, 79,113,157, 66,166,
+116, 65,101, 75, 67,158, 21,105, 25,125, 22, 63,248,197, 66, 36,135, 94,250,216, 33,146, 47, 66, 57,190, 51,100, 66,173,235, 68,
+173, 13, 58,195,179,219, 59, 62,123,241,114,181, 82,164,235, 14,189, 20,232, 68,126,111, 76, 40, 93,239, 37,138,179,192, 97,202,
+126,232,186, 27,201, 2,161,135, 88,152,208,133, 79, 47, 56,215,138, 97,246, 4,194,218,153,169,210,210,201, 56,182, 88, 25,148,
+198, 44,184, 77,181, 4, 5, 44,208, 27, 10, 66,163, 40,181,201,196, 36, 66, 59,149, 51, 36, 91, 68,103,145, 89, 37,178, 53, 36,
+173,209,217,144,179, 96, 86,103, 31, 57, 15, 35,211, 36, 24, 72,103, 12, 33, 41,142,167, 81,236,100, 11,205, 46,101, 98,150,155,
+233, 56,207, 34, 76,179,166,220,202, 68,165,171,117,197,209, 39,140, 55, 34,146,179, 22,109,140,236,248, 85,166,171, 52,109,211,
+ 98,179,224, 33,207,154,226, 55,135, 16,202, 3,225, 52,198, 10, 61,203,152, 68,227, 12,213,178, 82, 49,197,126,164,192,153, 44,
+249,111, 9,233,202,219,154,241,124, 36,148,116,165,202, 58,218,182,145, 46,221, 85,197,215, 42,220,107,103, 37, 78, 48,172,135,
+106, 66,105,241, 12,103,226,123,163,226,107,171, 88,217,119, 47, 58,136,252,116,205,147, 21,151,152, 81,242,199, 25,232, 34,227,
+192,228,111, 1,180,228, 15,125,221,215, 59, 32,157,191, 29, 16,243, 49,148,235, 21,231,142,107,255,136,122, 47, 39, 94,103, 72,
+239,231, 36,103,190, 19, 75,251, 1, 51,126,189,140, 95, 50,228,151,168,212,245,153,186, 98, 58,231,229, 82,156, 19, 85, 8,252,
+253, 31,253, 54,255,235, 63,255,231, 60,211,154,255,243, 95,253, 31,220,126,254,146,199, 97,162,169, 28,199,121, 36, 87,150,100,
+ 20,109,211,240,189,239,255,144,127,243, 23,255,158, 47,191,250, 10,234,134,255,248,155,175,177,155, 29,214,142,188,219, 31, 9,
+ 9, 94,126,246, 5,239,206, 7,178, 82,104,227, 56, 15, 3, 89,137, 80, 44, 71, 17,191, 29, 14, 7,188,247,156,207, 35,119,119,
+119,146, 87, 96,237,170,169, 89,180, 12,137, 76, 76, 30,231, 58,230,121, 90, 15,197,165,211,159,125,224,213,235,215,104,229,138,
+ 87, 88,254,205, 34, 6,140, 49, 98,156, 69,147,241,243,204, 60, 59,113,135, 88, 75,111, 36,105,173,174, 28,231,211,145,170,114,
+ 76,227, 88,226,152, 51,214,106,230,113,146, 24,234,148,200, 24,156,210,204,195,200,120, 30, 74,161, 21, 70,134,178,134,121,217,
+139,106, 25,227, 86,198,226,227,194, 20, 95,114,185, 19, 23,173, 99,105,108,178, 88,127, 31, 30, 30,200, 49, 17,178,160,109,115,
+148, 75,199,233,116,150,175, 93, 46,234,254, 20, 37, 41,175,188,248, 41, 72,224, 82, 74,226,120, 73, 73,146, 43,171,186, 18,114,
+ 92,134,148, 19,181,173,215,175,235,233,116, 98,179,105,214, 81,180, 28,195,154,174,171,201, 57, 50,140, 3, 77, 83,173,108, 3,
+173,138, 5,208,106,170,218,209,199,150,199,131,216,235, 98,200, 84,174, 42,106,238, 72,211, 86, 60,220,239,105,154,142, 23,207,
+159, 23, 6,189, 20, 75,107, 29,179, 95,112,192,150,166,105,120,216, 31,208, 78, 51,249, 25,165, 21, 77, 91, 99, 12, 50, 33,213,
+ 2,186, 57,158, 7, 42,235,120,249,249, 11,246, 15,247, 52, 77,141, 49,154,121, 30,233,187,150,199,227, 9,165, 68,196,168,107,
+135, 46, 81,185,135,195, 94,242, 5, 42, 65,236,206,243,204,179,103, 47,105,219,150,105, 26, 73, 57, 80, 87, 86,194,108,154, 22,
+ 77, 69, 74,153,113,156, 48, 70,201, 5, 39, 36,246,251, 3,183,183,183, 12,197,161, 0,186, 52,163, 77,113, 95,164, 2,235,145,
+231, 46,198,248, 68, 52, 27,130, 68,123,175,240, 39, 22,205,134, 93, 5,193,215, 52, 71,165, 13,196, 82,192,139,251,102, 65,116,
+167,229,250, 94,234,133,229, 63,227,127,203, 72, 92, 95,197,163, 62,153,233, 93, 31,200, 87, 81,148,178, 23, 16, 56,130,216, 62,
+106, 94,190,120, 41,252, 98,173,139,101,226,106, 20,184,140,204,214, 0,143,139, 39,249,125, 5,113,140,113,141, 92,213,250, 98,
+ 29, 18,252,107,186, 98,188, 95,138,178,179, 26, 99,132,146,149,150, 61, 93,202, 43,248, 68,233,136, 50,200,216, 56,137, 62,220,
+ 44,159, 82,129,221,168, 98,132, 78, 41,175,217,219, 41, 5,177, 94, 69,131, 10, 25,157,196,106,151, 18,228, 74,110,179, 90,233,
+226,159, 77, 76,147,140,213,231,144, 68, 75,224, 64, 77, 51, 86, 37, 72,113,221,243, 46, 22, 37,161, 21, 81,118, 59, 86,172,117,
+218,208,186,154, 41,107,236,105, 16, 42,159,147, 63, 83,101,101, 80,105,176, 68, 44, 17,167, 18,214, 42,116, 99,152,188, 34, 24,
+240, 86,186, 35,227, 12, 77, 93, 81, 21, 38,183,181, 53,149, 22,181, 48, 70, 75,119,167,196,190,167, 72,144, 3, 77,219, 98,140,
+ 97, 24,134, 21,222,178, 48,150,171,202,225,156, 41,147, 12, 47,157, 67, 35,135,240, 52,207, 28, 78,167, 75, 32,193, 90,128, 82,
+ 33,110, 45,249,226,165, 24,235,242, 50,114,217,131,155,197,102,118, 61,125, 94, 8,109,249,218,191,145, 63, 22,186,250,180,224,
+ 95, 67,134, 62, 18,162,144,151,142, 57,165,167, 59,159,247,186,242,235, 7,247,186,204, 46,105,114, 79,222,105,190,138,237, 45,
+ 31,162, 1,146, 86, 79,181, 36,139, 56,239, 35, 84,185, 39, 99,254,229,102,191, 50,205,121, 50,185,200, 87,142,149,203, 5, 88,
+151,130,151,209, 41,240,139, 31,252,128,255,237,191,254,111,217,248,192, 95,254,242,175,120, 51,237,209,167,150, 47, 62,255, 1,
+255,234, 95,255,107, 62,255,242, 51,134,227,129, 99, 45,201,106,255,241,151,127,195,237,246,134, 78, 59, 94,165,196,193,123, 84,
+ 85, 51,237, 15,108,183, 27,110,158, 61,227,205,219,123,188, 17, 12,232,148,102,108,229, 74,226,154, 32, 80,207,231,243,218,129,
+100,165, 56,157,207,220,221,238,240,243,149, 21,118, 73,177, 11,145,190,223,176,127, 60, 50,207, 1,173, 13,119,119,119, 12,195,
+128,171,106, 94,191,126, 45,153, 7,177,156, 1, 87, 95,128, 84, 58, 11, 17,159, 89,252, 60,178, 63, 30,185,187,217, 48,142, 19,
+187,221,142,227,241, 68, 93, 89,200, 25, 63, 14, 28, 15, 7,113,183,168,140, 85, 48,205, 35,214, 85, 56,173, 25,142, 71,108, 9,
+161,154,130,140,159,125, 8,132,156,241,243, 68, 76, 98,191, 50,229,156,138, 74,210,224, 4, 45,191,104,127, 32,133,180, 78,255,
+114,217,125,199,194,185,183,214,226,231, 88,148,209,165, 49, 42, 20, 57, 41,176,229,169, 73,137,166,110, 25,142, 71,180,146, 0,
+170, 24,210,202, 2,128,200,249,124, 46,227,240, 72,221, 52,235,153,105,140, 33,248,180, 10,180, 94,190,124,190, 94,164,154, 70,
+162, 89, 99, 12,120,175,232,251, 94,148,220,235,199, 32,108,139,186,174, 80,135,147, 76, 4,230, 25, 16, 66,103,142,162, 37,216,
+237,118,188,126,243,142,190,219, 96,235,154,227,249,140, 43,156, 1, 87, 89,206,231, 19,183,183, 95,202,238, 89,101, 54,155,158,
+183,111,223,137, 63,127,158,216,238, 54,196, 20, 36,200,231,176, 95, 21,251, 33, 4,250,237,150,195,241,200,221,237, 22,239, 35,
+227, 56,210,214,149,156,175,167, 51,125,223, 83, 85,134,211,233,196,118,179, 33,167,196, 52,207,136,179, 76,243, 87,127,245, 87,
+220,222,222,138, 19, 34,149, 60,244,202, 50,156,143,244,219, 29,219,237, 6,231,100,133,113, 58,157,105,107,199,249, 60,114,115,
+ 35,240,163,195,241, 92, 38, 71,145,166,169,168,107, 87, 64, 64, 9,156, 66, 71,195,249,116, 18, 0, 87, 17, 42,107, 37,226,231,
+ 16, 66, 25,233, 11, 60, 73, 28, 59,151,139,125, 74,233, 74, 71,162, 46,246,182,101, 66, 84,254,238,210,185, 3,216,168, 89, 23,
+241, 11,232, 97,249, 53, 37,140, 84, 27,123,213,144,151,145,145, 74, 69,245, 30,177,201,200, 24,207,232, 82,224,196,223,173,244,
+146,132,149,200, 74, 70,172, 86, 89,158,239,158,241,108,251, 12,171,172,116,232, 69,166,191, 50,156, 11, 41,142,171, 64, 10, 99,
+204,218,197,152,245,144, 74, 5, 80, 34, 12,235,101, 12,161,115, 46,145,161, 73,222,119, 10,114,104,169, 76,206, 30,151, 61, 85,
+ 78,204, 57,163,140, 37, 46,226, 8,171, 32,136,216,205,149,155, 97,237, 20, 58,229, 98,187, 50,164, 36, 46,238, 20, 3, 41,148,
+220,228,148, 72, 44,169,110,160,147, 33,153,153, 68,196,103, 75,159, 13,106,201, 70,214, 22,239,229, 5, 28,166,153,105,142,140,
+179, 60, 64,117, 18,225,132, 5,156,214, 96, 82, 81,220, 75, 40, 76, 93, 89,148,214, 52,109,141, 86,178,194, 48,214,160, 76,197,
+126,240,104, 2, 77,109,169,107,139,117,166,112,144, 53, 85, 83, 97,152,137, 83, 40,250,188,146,229,172, 29,181, 51,208,152,149,
+234,230,172,160, 34, 43,173,228,237, 53,181,232, 18, 12,132, 36,179, 9,107, 18, 49, 15, 96, 2, 55,155,158, 20, 60,167,243, 9,
+138,122,185,174, 37,220,165,107, 91, 72,145, 56,207,228, 50,133,137, 89, 20,190,251,227,153,253,126, 44,241,179,146,134, 84, 84,
+ 14,228,101,187,174, 47,118,187,245,254, 24,245,186, 28,138, 87,115,242, 85,104,150, 46,158,242, 15, 16,178, 75,162,159,142, 31,
+133,196,234,178,203, 72, 92, 21,239,235,130,112,245, 92, 88,165, 63, 80,197,191,143, 87,205,165,155,129, 84,112,160, 23,207,250,
+245,197, 33,189,103,207,188,140,251,213, 19,184,204, 19,187,218, 19, 61,192,133, 53,159,175,208,185,145,242, 49, 40,233,172, 18,
+186, 64,242,162,176, 14,180, 34, 5,133, 67, 99,243,196,239,191,184,227,127,255,103,127, 66,123,124,203,215,251, 71,230,156,209,
+ 85,203,243,207, 62,231, 47,254,250, 47,249,234,119,127, 76,136,145,231,141, 64, 78,106,215,225,110,122,126,243,234, 21,223,251,
+106,203,223,254,251,255, 64, 74,153,231,187,150, 47,187, 29,219,110,203,191,251, 79,111, 24,180, 98, 63,142, 68,163,152, 19,212,
+ 24,170,198,202,193,159, 19, 49, 75, 56,136, 49,226, 29,143,222,163,114,166,182, 74, 58,205,178,122,211, 73,190,231,227, 44, 23,
+162,148, 21,109,219,113, 56, 30, 57,157, 71,212,121, 38,121,133, 78, 26, 85,246,144, 57, 39,148, 81, 43,136, 74,105,139,143,137,
+164, 34, 85,227, 24,194,132, 26, 78,160, 51,214, 42,198,195, 17,221,117,152, 4,135,251,135, 18,232, 4,199,135,123,136,129, 28,
+ 3, 62,203,234, 77,165, 76, 86, 90,242, 34,180,248,236, 83, 92, 50, 2,100,231,106, 11,170, 25,165, 57, 79,158,144,210,154, 61,
+144,148, 41,182,177,114, 48, 39, 85,214, 33,172,206,163, 57,148,131,187, 88, 58,149,149,201, 88, 12,145, 48,123,177,179,206, 17,
+219,200, 72, 62, 22, 33,171,209, 66,142, 90,189,214, 73,244, 74, 40,201,136,152,102, 81,119,107, 37, 30,124,109, 53,227, 28,217,
+110,183, 28,246,143,107,161,142, 11, 74, 59, 69, 12, 14,171, 37, 89, 46,132, 36,147, 66,109, 11, 61, 17,158,223,238, 72, 97,190,
+116,250, 69,151,162,148,248,211,187,182, 33,196, 9,165,165,139,183,149, 52, 61, 93, 93, 23, 78,189, 98, 14, 30, 98,192, 85,150,
+231, 55, 91,188,159,201, 58, 51,207,194,231,232, 55, 29,143,135, 3,218,192, 60, 75,129,172,235,134,148, 20,223,188,122,199,110,
+183, 99,219, 24,198,113, 96,179,169, 57, 30, 2,126, 30,164, 1,169, 45, 16, 10, 16, 7,218,118,139, 15,129,221,205, 29,147,159,
+ 24,222, 13,124,249,197, 23,168,130, 48,222,110, 5,139,171, 20,244,109,205, 48,207, 76,147,198,199, 72, 66,115, 60, 79,180, 77,
+ 71, 78, 39,252, 56,163,140,244,134,243,228, 87,107, 94,223,247, 50, 29,105, 42, 66,136, 56, 91,173, 13,144, 49,165,193,243,146,
+ 84,151, 72, 37,138,119, 42, 77, 64,177,117,166,136, 74,225, 42, 4,106,209,230,232,203,179,175, 47,103,157,253,168, 71, 86, 61,
+ 29,195, 95, 44, 59,229,212,204, 23,149,242, 34,175,127, 63, 55, 99,217,117, 47, 40, 76,165,100, 74,109,180,225,249,221, 51,154,
+186, 89,111,152, 11,223,115,121,159,113, 77, 83, 19,191,180,210,250,189,176,143,244,244, 19, 76, 2, 5,185, 56,235, 18, 90,103,
+ 65,191,146,208, 38,175,202,121,185,180,134,210,109, 74,177, 78, 8, 53,168, 50, 6,229,228,240, 55, 42, 99, 93,146,252,241,204,
+ 37,175, 29, 35,152, 89,109, 72, 58,161,163, 18, 81, 75,202,228,164, 87, 10, 86, 52,153, 57, 6,116, 80,248, 8, 54,202, 33, 60,
+205, 51, 49, 82,196,111,194,198,246,169,188, 40,211, 68, 50,210, 21,107, 35,180,170,202, 25,218,202, 81, 87, 22,109, 53,174, 50,
+ 37,175, 92, 82,212,148, 49, 36,229, 56,207,137, 24, 18,117,213, 22,162,156, 35, 6,201, 90,134, 84,190, 62,145, 28,242, 58,146,
+ 51, 74, 18,136,172, 17, 12,172, 0,119, 82,209, 27, 72,232,132,179,154,202,200, 46, 59, 36, 89, 15,148,228, 89,172, 21,171,203,
+195,254, 65,184,197,198,208,214, 53,125,223,173,220,235,180,162, 24, 99, 25, 23, 6,198,113,228,221,253,129,113,144, 32, 10, 93,
+ 20,252,170, 76, 64,210,149, 11, 92,189, 55, 63, 87,234, 59, 40,233,249,226, 33,127, 98, 41, 83,223, 62,194,126, 31, 21, 43,235,
+150,242, 93,158, 21, 20,164,163, 70,173, 10,147, 39,153,229,235,126,235, 34,106, 73, 31, 68, 35,229,167,252,135, 79, 88, 83, 62,
+ 37,138,251,164,165, 45,243,225,215,235,201,133, 68, 72,103, 85, 42,159,138,214,228,171, 76,116, 75,226, 71,183,119,252,143,255,
+236,207,121,124,253,138, 57, 39,246,195,192,235,227,153, 57,193, 95,255,242, 87,204, 41, 96,140,163,113, 45, 95,127,253, 13,182,
+105, 56,198,196,155,135, 71,220,166,231, 47,127,245, 43,230,156,216,244, 27,246,199, 35,174,170,240, 72, 20,240,209, 7,166, 4,
+ 62,122,121, 29,181, 46,254,100, 56, 31, 79,248, 16,112, 85, 93, 38, 88, 97,205,100,168,170,154,249, 28,228,252,200,170,140,178,
+ 13,115, 8,226,179,214,134, 99,137, 86,142, 49, 98,148,248,174, 99,188,176,217,181,186, 26,207, 35,122,147, 16, 19, 49, 43,124,
+ 0,167,107,230, 16,217,159, 70,172,182,226,139, 62, 31,214,195,114,201,190, 70,153,245,123,104,242,190,116, 70,154,168, 46,225,
+ 78,185, 56, 60,252, 24,113,181,193,123,209,211,136,240, 74, 18,221, 22,162, 91, 6,113,249,228,139,107, 40,149, 11,158, 41,228,
+ 52, 97,116,128,169, 45,201, 11, 4,197, 88, 17, 11,186,198,114, 10,146, 1, 31,128, 24, 34,174,173, 24,131, 88, 71,179, 86,184,
+ 2,176, 82, 41,149,181,131, 89,163, 60, 23,107, 91,200, 23,162,226,249, 60,162, 94, 72,106,217, 48,158,105,218, 94,116, 57, 70,
+178, 46,102,239,105,219,237,170, 80,151,177,244, 76,229, 28,243, 60, 20, 37,125,205, 28, 60,117, 93,139,134, 65,129, 53,150,205,
+166,146,194,173,149,136,202, 80,184, 24, 56,159,207, 60,123,246,140, 99, 65,167,118,125,187,218, 24,111,110,132, 59,127, 56, 28,
+214,250,179, 63, 28,184,187,189,229,225,112,160,109, 97,158, 2,211, 40,162,180, 24, 19,175, 95,191,161,109,235, 34,210,173, 80,
+ 40, 66,240,235,212,215, 57,187,162,135, 79,167, 35,125,223,151,179, 73,177,217,108,153,166,145,186, 18,127,250,227,227, 35,149,
+179,101,124, 30,128,196,102,211, 51, 77, 19, 90, 71,198,113, 96,219,223, 65, 11, 3,131,136,175,163, 68, 78,123, 47, 83,132,113,
+ 28,233,186,142,121,246, 24, 83, 68,117,214,136, 85, 57,164, 43,209,106,166,239,219, 21,226,179,138,191, 75,119,190,140,239, 87,
+ 55,206,251, 43,191, 43,104,214,135,227,247, 92,102,243,239, 83,181,174,186, 20,197,181,157,237, 3,101,206,147,236,102,174, 18,
+217, 36,103,183, 97,179,217,136, 8, 99, 37,194,233,245,109, 47,254,210,235, 11, 69, 44, 89,233,198,184,130,139,101, 61,116,229,
+224, 77, 37,123,186,216,200, 72, 18, 50, 98, 19,214, 44, 93,156,236,236,231, 32,118, 50,149,164,232,107,172, 68, 31, 42, 81, 57,
+ 58,109,129, 74,212,226,197,123,190, 8,206, 22,239,103, 44, 10,246, 28,115, 1, 96,152,181,104,105, 16,127,186,137,197,227, 45,
+ 99,240, 92,236, 99, 11,186,210,135, 36, 59,237,184, 40, 53, 19,104,129,216,212,181,165,113, 2,191,232,155,138, 77,215,178,221,
+ 54,104, 3, 89, 95, 60,212,206, 90,180,173,152,163,198, 7,143,143,137,122,211, 97,171, 26,140, 65,165, 68, 93,203, 65, 37,135,
+ 80, 46,214, 37,181,106, 2, 28, 98,167, 49,214,209,214, 77,233,254,228, 33,182, 78,227,156,161,178,242, 85, 54, 89, 49, 37,189,
+190,174, 77,211,160,149, 28,204, 11,253,168,174, 43, 25, 95,150, 56,203, 92,252,172, 33, 9,249, 43,229,192,225,112,226,213,171,
+215, 18, 97,169,101, 37,177, 76,139,214,113,105,202,171,176, 71, 61, 81,117,124, 58,150,116,233,122,175, 47,167, 23, 76,251,183,
+171,212, 63, 40,132, 49, 61, 13, 42, 84,121,157, 17,169, 75, 20,215, 7,244,183,235,143,115,189,124,126,132, 57,127,189, 86,121,
+127, 31,255, 93,177,174, 79, 63, 15,245, 1, 8,231,125,196, 13,101, 68,107,138, 93, 42,100,133,210, 21, 42, 5,108, 10,124,239,
+102,199,255,244, 95,253, 19, 54, 9, 14,195,196,201,123,222, 60, 60, 80,111,118,204,231, 51,159,223,222,242,248,235,175,241, 62,
+242,238,176,167,187,185, 5,107, 57,143,129,237,237, 51,190,126,251,150,144, 6,186,182,199, 26, 71,181,169, 57, 14, 3,141,173,
+249,230,237, 3,147, 6,229, 12, 62, 69,154,206,174, 41,130, 97,158,215,169,145,216,136,140, 68, 39, 7,138,194, 91, 64, 84, 90,
+ 25,217, 63,150,203,147, 15,158,170,114,188,253,230, 13, 85, 45,244,174,190,235,184,127,183,151,238,197,200,186,111, 89, 89,152,
+ 34,236,234,154,150,211,225, 36,164,193, 40, 33, 45,202,106, 66,132,224, 61,112,230,166,111,132,152, 86,236,181, 49,137, 90, 61,
+164, 1, 99, 45, 62,137,189, 42, 21, 33,175, 86, 74, 52, 26,106,177, 47,202,235, 39,214,166,136,210,178,182,202, 5, 30, 37,193,
+ 36,185, 76,163,202,107,183, 76, 94,180,198, 46,194,208,162,208,206,203,129,110,173, 92,250,163,160,110,115,138, 34, 70, 11,144,
+202, 37,163,170,107, 76,129,155,132,144, 48, 54,209,180, 13, 67,241,100, 91,107, 11,180, 39,174,150, 94, 17,220,202, 84, 32,248,
+192,219, 55,239,120,118,119,195,187,251, 7,148,169,169,234, 74,200,112,198,144,162,127, 15,112,148, 86, 53,185,179,142, 16, 70,
+ 98,146,232,217,186,145, 16,168, 24, 19, 49, 78, 52, 77, 67, 93,215,188,122,253,154, 23,159,117,164, 73, 44,140, 15,247, 39,110,
+111, 45,155,109,199,121, 56, 97,172,124,222,135,195,161,248,180,165,113, 16,168,150,101,127, 56, 64, 35,143,205, 56,206,244,157,
+112,227, 67, 12,130, 12,211,150, 24,225,113,127,100,154, 29,125,225, 32, 44, 5, 61, 4, 97, 6,200,184, 27,201,140,175,107,154,
+ 70, 58,232, 20, 43,234, 74,148,236,155,190,231,237,219,183,180, 93, 71,211,182,168, 20,137,133,102,186,164,215,221,223, 63,208,
+247, 29,214, 85, 40, 45,107, 69,193,100, 55,242, 62,252,196, 60, 79,108,183, 91, 30, 31, 15,107,170,101, 87,183, 37, 81, 84, 49,
+ 13, 3, 74, 11,109, 51, 4, 97,219, 63,101,188,200, 5,115, 97,240, 47,171,151, 85,208,158,159,174, 3,237,199,163, 31,129,143,
+ 28,164,234,170, 37, 80, 43,141,150,167, 55,133,172, 86,161, 82,190,194,107, 46, 69,126,187,217, 80, 55,245,250,129,230,171,110,
+ 93,175, 36,169,116,249,198, 41, 35,255,148,203,141,243, 74,205,172, 68, 66, 42, 15, 69, 46,248, 79,149, 10, 49,109,241,141,151,
+140,244,162,246, 21,111,185, 64, 96,156, 82, 76,126,198, 86,173,252, 59,163, 4,173,170,140, 20,241,228,201, 74,248,230, 90,151,
+104, 82, 37, 49,150, 57,107,178,201,152,168,100,108,150, 46,123, 94,103, 20,218, 68, 33, 77, 89, 93,108, 97,101,252,155, 53,211,
+ 24, 86,176,134,144,231, 4, 96,209, 54,134, 93, 87,211,183, 21,155,166,102,211, 57,182, 93,203,110,187,161,235,106, 66,242,156,
+167,179,116, 4,202, 8,153, 75,107,246,239,206,188,189,127,192,216, 6, 83, 53, 24, 87, 19,115, 64,107,217, 3,170, 20, 80, 41,
+226,172, 41,168, 69, 77,133,145,110,223, 54,232, 60,211,212,134,214,137, 7, 54, 68,249, 26,214, 86, 83, 55,150,214, 42, 72, 30,
+159, 20, 54,102,146, 18, 55, 66,215,239,240,126,100, 26, 79, 88,173,168, 43, 71, 91, 87,212,149,252,168, 42,135,159,211,133,161,
+ 15, 40,101, 57,159, 71,246,135, 99,217,155,151,105,229, 85,124,224,194, 26, 88, 70, 47,215, 80,164, 92, 46,115, 60, 65,190,191,
+ 23,161,154,151, 93,242,199, 11,185,202,124, 68, 37,255,180,104,170, 43, 22,194,106, 19, 83, 75,194,220,199,213,241, 31, 43,202,
+ 79,117,164,151,105,131, 34,127,235,229,228, 83, 23,144, 15, 69,113,249, 91,121,144,170, 8, 96, 33, 19,244,242, 60,149,139, 91,
+130,207,186,134,255,238, 31,254, 3,190,208, 6,117, 30, 72, 57,243,230,112,164,221,222, 48,199,196,151, 95,126,143,166,237,121,
+249,197,151, 76, 49,177,123,249,130,186,235, 56, 30,206,236, 31,222,113,251,252, 37, 97, 78,220,188,120,198, 97,154,152, 66,224,
+225,176,231,225,120,226,255,254,245,223,242,183, 15,143,236,158,221,225, 39,207, 56, 30,113,213, 86, 46,108,234, 34,132,147, 81,
+243, 5, 37, 26, 53, 69, 64, 89, 10,219, 85,144, 69,202, 18, 38,212,118, 66,225,242, 62, 20,175,180,167,170,106,198,211, 84,178,
+217,165, 49,113,206, 97, 43,153,108,121,239, 69,180, 25,101,103,109,180, 38,162, 81,202,144,147,226, 52, 6, 96,194,154, 44,142,
+156, 84, 60,252,202,200,212, 75,165,213,230,232, 67,148, 95,103, 89,145, 45,214,178, 24, 34, 33, 9, 1, 91, 8,139,233, 42, 1,
+ 78,222,239, 42, 18, 90, 6,212, 75, 72, 71,121, 6,170,178, 15,142, 37, 86,186,107, 36, 18,116, 17, 3,230, 28,133, 72,215,181,
+ 28,246, 39, 92, 93,225,207,231, 98, 39,173,240, 62,144, 0, 31, 34, 55, 77,131, 62,158, 8,133,191,174,138,234,122,153, 22, 44,
+ 54,203,140,194,251,196,249, 60,242,252,217, 29,231, 97, 34,100,205,247,119, 91,252, 60, 50, 78,129,166,118,235, 36,202, 24,181,
+ 94, 20,166,147, 68,154, 46, 17,176,251,211,137,186,107, 48, 74,232,114, 77,211, 16, 83,100, 44, 65, 40, 33,134,117, 68,223,182,
+ 39,222,221,191,229,238,238,150,135,135, 71,230,121,194, 20,174,121, 8,161,132,207,244,156, 79, 3,109,219,210,214,181,164,187,
+ 5, 25,139,239,247,143,180,109, 79, 85, 85,197, 38, 39, 23,154, 37,138,215, 90, 71, 46,151,146,105,154,104,219,150,253,254,129,
+187,103,207, 48,122, 94,139,179, 82, 34,160,134,204, 48, 12,212,149,184, 50,250, 77,207, 60,123, 65,183,214, 85, 57, 31,148,176,
+235,219,134,113,154, 9,135, 19,169,208, 18, 37, 4,198,150, 73,156, 76, 42,166,121,162,174, 52, 85,101,153, 38,185, 8,121, 63,
+161,148,193,185,154,202,245, 12,231, 65,254, 94, 35,208,161,224,227,202, 90,112,214, 97,136, 79, 38,143,105, 37,111,230,117, 18,
+190, 92, 52,109,126, 15,134, 33,197,248, 2,126, 89, 65, 83, 57, 94,118,148, 87, 16, 26, 74, 38,177,190,246,210,114, 73,158,186,
+196, 74, 10,142,117,211, 11, 53,142, 28, 65, 61,165,229, 72,113,207, 31,137,149, 76,101, 60, 27,151, 88,143,162, 12,103, 13,102,
+ 17,160, 83,129,199, 24,176,203,104,180,168,214,115,177,118, 44,176, 25, 91, 44,110,231,113,194, 81,137,218,220, 92, 91,168,244,
+147,139,203, 50,170,151,102, 65,246,247,165,185, 94,131,106,180,134,170,228, 39, 59, 39, 40,194,198, 89,218, 90, 70,220, 57, 69,
+252, 28, 57,171,113,125,144, 43, 29,112,198,210, 54,150,109, 95,115,179,173,217, 52, 53,125, 91,179,233, 44,219,190,163,239, 90,
+148,209,156,198,136,196,143,139,127,211, 40,205,121,158,121, 60, 28,120, 60, 28,113,221,115, 92, 85,163,172,129, 16,113,149,163,
+115,150, 86, 69,116, 82,212, 90,163, 11, 13, 38,203,113, 70,101, 20, 93,221,178,233,219, 66,194,179,204,211, 76,202,137,202, 26,
+234,198,208,152,140,198, 48, 39,195, 33,120,102, 63,160,141,162,221,116,188,122,251,134,148, 38,106, 87,211,214, 21,109, 83, 83,
+ 45,204,108, 13, 83,140,101,228, 40, 94,122,109, 13,195, 73, 60,249, 23, 42, 96, 92,245, 26, 31,100,156, 63,157, 79,175,221,141,
+226,219, 59,218, 53,225,237, 83,163,235,156, 63, 16,188,165,116,185, 76, 94,255, 67,117,165,198,127,223, 63,254,233,236,243,229,
+130,123,193,156,170, 18, 33,252,105, 40,251,119, 43,219,245,213, 42,106,233, 20,249, 86,184,140,148,240,136,112,142, 51, 25, 34,
+232, 24,185,113,142, 63,249,131, 63,228,119, 54, 27,190,172, 27,254,250, 87,191,228,241,124, 34, 25, 69,210, 26,167, 68,136,121,
+115,115,203,219,195,137,118,187,197, 40,195,253,235,119,204, 33,162,157,227,254,176,231,116, 60,242,249,231, 95, 50,218,204,111,
+222,220, 19,148, 97, 63, 5,126,249,205, 27,250,237, 29, 49, 8, 89,236,238,110, 35,152,204,224, 5, 74,164,229,172, 89, 20,191,
+151,203,141,140,201,167,201, 99,140, 20, 1, 83,236, 69,139,194,220, 7,137,183,124,251,246, 1,208, 88, 99,209, 90, 83, 53, 53,
+126,158, 36,157,208,213,212,109, 11, 10, 81,186, 79, 51,117, 85,113,154, 79,104, 43, 52, 56,227, 12, 36, 77,152, 60,100, 56, 12,
+ 1,107, 50,181,147, 52, 70, 99,116,201, 85, 23,165,185, 82,194,133, 8, 37, 21,114,157, 14, 5,233,158,174, 65, 53,233,202, 38,
+164,203,120, 93,197, 18,144, 85,132, 84,170,128,160,124,241, 65,107, 99,208,214, 50,159,134, 2,124,233, 87,100,104, 76, 9,231,
+164,216, 25,171,145,141,163,140,123, 39, 47,132, 71, 84, 68, 41, 3,200,184,223,135,200,237,237, 13,175, 94,191, 38,101, 41, 60,
+ 97,161, 74, 46,141, 87, 33, 36, 74, 23,111,177,182,194, 89,199,225,112,224,124,190, 65,171, 68, 91, 87,156, 78, 39,186,182,121,
+ 34,224,210,229, 50, 97, 64, 75, 38, 0, 0, 32, 0, 73, 68, 65, 84,127, 56,157,233,251,142, 80, 40,104, 33, 68,162, 18, 71,143,
+247,194,118,223,239, 15,216, 98, 11, 52,133, 57,208,245, 45,191,252,229,111,184,189,189,161,109,107,177,183,105, 75, 83, 82, 30,
+119,187, 45,160, 56, 30, 79,178,222,107, 91,134,225,204,166,107, 75, 54,187,103, 24, 78, 56, 87, 11, 70,182,184,108, 4, 19, 27,
+138,125, 47,112,119,123,131, 82, 21, 49, 5,218,174,229,240,248,192,166,223,173,160,172, 16,130, 92, 40, 10,211, 62,147, 87, 79,
+189,171, 60,231, 97,196,150, 26,229, 42, 43, 26, 3,173,169,170,106,221,237, 47, 83,144, 5,208,179,124,141,189,159, 5,182,230,
+ 92,193, 24,231, 98,165, 84, 76,243,200,110,179, 41,112, 34,169, 43,186,208,248,174,167,214,174,150, 41,203, 7, 41,138,133, 19,
+179,216, 61,149, 2,187, 46,228,212,251,227,244, 43,122, 91, 17,118, 72, 66, 86,254,176,131,127, 47, 56,114, 65,192,138, 56, 78,
+110,229, 70, 41, 42, 91,209,182,173,140, 89,139,184,236, 34,148, 87,107,182,249, 37,244, 98,233,210,179, 36,177, 17,113, 74,198,
+201,194,113, 81, 79, 2, 71,132,224,150,177, 74,226,251,196,164, 47, 15,217, 34,170,178, 86, 81, 59,195,228,147,216,178,114, 34,
+250,169,192, 90, 40, 0, 6, 3, 89,148,161, 42,153,226, 49,102,117,228,231, 98, 37, 96,177, 62,233, 92,186,103,181, 90, 47,156,
+ 81, 52, 86,211, 88, 77, 87, 57,234, 74,196,114,222, 71,156,214, 56, 39,183,183,156, 42, 42, 91,209, 53,142, 77, 87,177,219, 84,
+116,109, 69, 87,215,180,173,161,107, 28,174, 50, 76,179,112,130,151,203, 70, 40,252,224,115, 12,236, 79, 35, 83,140,212,206,130,
+ 41, 66,178, 28,105,140,163,181,154, 94, 27,180,178, 84,165, 55, 48, 78,176,135, 42,131, 85,134,190,115,220,236, 90,154, 74, 98,
+ 39,135, 81,198,249,198,104,172, 73, 88,167, 36,176, 37,106,194, 97,228, 60,141, 84,109, 35,233, 68,167, 35,149, 85,180, 77,197,
+182,111,217,109, 58, 33,216,149, 8,193, 24,202,216, 61,229, 53, 56,225,112, 56,174,217,208,215,164,192,252, 94, 81,204, 87, 44,
+248,203,104,253, 90, 28,246,241, 45,242,117,238,208,229,118,123,161,187,105,174, 11,235,133, 19,127, 81,205,151,223,191,178,164,
+171, 53,230,141, 39, 94,243,139, 58,245,227, 93,191, 86, 2,106,146,189,233, 50, 61,184,110,225,243, 71, 45,112, 31, 43,238, 31,
+187, 68, 92, 39, 17,190,175,196, 95, 24,216,217,232,117,106,145, 10,179,161, 79,153, 63,250,217,207,249,197,231,159,179, 45,224,
+165,253,241, 64,179,217, 48, 14, 35, 95,253,248,199,252,197,191,251, 11,108, 85,243,246,221, 35,111,223,188,229,247, 94,124,198,
+255,243,111,254, 45,159,125,254, 37,227, 52,113,156, 70, 92,223, 83,239,182,252,250,221, 91,222, 29,143, 60, 14, 3,251, 57,240,
+102,127,192,117, 59, 76, 85,243,205, 55,191,166,235,133, 15, 62,156, 7,182,219,110,205,186,134,140, 46,154, 13, 83, 46,209,125,
+215,149,241,232, 44, 29,240, 2,227, 32, 51,249, 25,180,230, 52, 12,226, 42, 73,229,172, 50, 50, 66,215, 90, 68,162,218, 90,186,
+190,199,185,154,119,247,247,204,243,204,118,187,229, 88, 96, 42,153, 32,228,197, 90, 84,205, 62,148,253,183,214, 50,117, 75, 69,
+228, 24, 67, 33,168, 41, 82,152, 37,103, 61, 95,246,226, 57, 39,113, 97, 80,176,210, 70,175,138,125,141, 70, 59, 41, 16,190,168,
+147, 77,165,241, 62,136, 46,167, 8, 50,141, 46, 99,254,148,104,156, 35,148, 63, 91, 92, 34, 97, 8,236,118, 59,137, 48,141,129,
+166,173,153,166,179, 92,102, 74, 64,139, 82,138,152,163,196,217,162,133,243, 30,197, 35, 45,121,225, 50,150,223,237,182,178, 59,
+191, 70, 30,103,161,165, 77, 41, 48,122,207, 52,207,244,253,150,211, 48,113,127,191,231,251, 95,190, 36,103,225,234,135, 40, 99,
+255,211,241,192,102,179,145,110,209, 40,156,147, 75, 85, 14, 34,174,157,231,153,190,107, 37,187, 61, 6,142,199, 3,159,125,246,
+146, 55,111,222,202,186, 45, 68, 66,246,108,251, 30, 99, 52,227,112,102,211,247, 12,231, 83, 57,167,133,100,231,125, 20, 62,128,
+ 18,219,221,221,221, 45,206, 89, 78,143, 66,176,163, 56, 25,134, 97,228,225,225,158,205,166,163,105,156,236,189, 17, 50,156, 53,
+134, 16,102,170,186, 34,132, 25,163, 52,205,102,203,249,124,162,105, 58,198, 34, 76,235,251, 94,166, 24,229, 16,169,170,138,199,
+199, 71,218,182, 43,107,147,184, 78,151, 42,103, 87,203,228, 18, 41, 62, 14,146, 99,224,189, 47,107, 4, 79, 85, 85, 34,142,158,
+ 3, 96,232,186,158,148,202,159, 7,209, 79,104,173,202,228, 65, 23,187, 91, 40,126,127,105,192, 82,138,120, 47, 17,173,195, 48,
+ 60,201, 96,121,186, 22, 47,238,163, 11,105,227, 99,221, 67,126,210,212, 92,135,105, 92,139,228,158,230, 80, 46,214,179, 75, 98,
+214,114, 32, 59, 87,173,164, 51, 57, 96,227, 85, 39,191,248,207, 47,114,125, 74, 81, 94, 66, 93,180, 46,106, 59, 45, 42,112,137,
+140,204, 43,104,198,148, 12, 99, 81,251, 74,116,226,147,128,141,114,142, 90, 91,210,212,172,194, 57, 69,240, 51,138, 10,141,100,
+224,230, 84,118, 65,106,193,129,234,117, 34,176,140, 56,174,169,118,166,252, 61,173,192,154,140,213, 50, 41,176,106, 73,110,211,
+ 84,133,203, 92, 25,233,128,234,202,210,123, 15, 89,124,221, 77,229,104, 27, 67,215, 90,218,202,209,212,150,202,128,213, 2, 86,
+246,243, 2,132, 48,164,132, 60,236, 57, 51, 97, 9,217,128,173,208,214,149,238, 55, 64,140,212,166,166,214,224, 52,130,124, 85,
+170,176,151, 19,182, 82, 52,214,209, 86, 45,117,173,169, 43, 69,109,193,232, 68,119,211,173, 7, 75, 78, 1, 87, 25,154,182,197,
+143,153, 97, 10,204, 49, 81, 53, 45,251,211, 81,110,145,214,210,182, 21, 55, 55, 27,110,110, 54, 5, 79,169,214,180, 39, 9, 47,
+136,104,171, 56,157,199,226, 83,190,158,133,151, 21, 9,122, 13,250,200, 87,236,234,245,210,169, 46, 34,206,111, 13, 56,249,192,
+200,118,197, 74, 80,215,187,238,197, 86,198, 26, 53,122,133, 1,188,242,174,191, 7,156, 89, 22, 80,234,211,185,236,215,112,154,
+245, 93,101,117, 85,212, 63,238,167,255, 88, 97,255,246,177,252,135, 65, 46,235,174,183, 8,107, 98,113, 15,216, 44,121, 2, 46,
+ 78,252,241, 31,252, 33,127,252,179,223,227, 38, 39,172,201,124,253,248,128,106, 90, 30, 14,103,190,248,173, 31,240,245,235,215,
+220,188,120,193, 55, 15,143,156, 39,143,113, 29,175,190,126, 69,187,187,225,205,241,200, 48,207, 96, 43,178,182,124,179,127,195,
+152, 4,101, 60,132,196,227,228, 57,121, 65,122,190,125,243,150,218, 25,140, 74,228,232,177,181, 93,191,118, 70,107, 25,205, 22,
+255,181,181, 34, 2,157,134, 81,138, 90,200,107,182,182,177,174,124, 13, 19,202, 84,196, 56, 51, 12,211,122, 16, 46,144,153, 24,
+ 35,117,219,208,182, 21,198, 58, 78,167, 3,177,136,213, 98, 20, 44,105,140, 1,107,228,227, 48,214,144,114,196,212,138,182,239,
+ 57,159,206,132,152,113,181, 46, 7,244,180,102,156, 95,248, 20,194,109, 16, 60,239, 37, 96, 5, 37, 69,218,186, 74, 60,234,229,
+220, 19, 44,181,124, 71, 90,103, 8, 25,198, 73,232,119, 49, 37,178, 54,216,166, 97, 62,159, 37,101,110, 22,226,165, 66,139, 90,
+190,136,212,154,166,102,127, 24,216,108,110, 24, 39,177,167,205, 62, 20,114, 94,162,105, 91,102, 31, 68,179, 83, 86, 13,211, 52,
+ 51, 12, 3,207,110,239,248,230,213,107,234,170,194, 89, 67, 76, 23,220,246,114,225,173,235,154, 20,133, 31,209,117, 61,153, 55,
+ 88, 43,156,251, 20,229,153,220, 31, 14,188,172, 95, 20, 64,142, 52, 92,117, 93,227,125, 44,196,204, 76,101, 29,179,159, 48,229,
+ 34,235,253, 92, 88, 23,138,113, 26, 69,139,163,165,159, 52, 70,113,187,235, 72, 49,136,158,168,170, 57, 28, 79,220,220,220,209,
+182,173, 92, 36, 66,164,239,123,134,225, 36,196,190,170, 98,183,237, 25,134,129,182,235,152,166,137,155,221, 6, 31, 2,167,147,
+ 20,189,126, 35,180,184,227,225,200,205, 77,143,171, 28,206,218,130,250,150,206,124,211,111, 10,151,160, 98,156, 38,230,121,150,
+200, 91, 63,227,181,162,109,218, 53,234,181,105,219,146,255, 46,204,250,186,170,152,230, 89, 10,175,207,101,189, 81, 86,170, 90,
+151,122,181,216,254,132,170, 55, 77,179,136,228,194, 36,235, 39,103,139,173,219,150,144,151,101,197, 34, 1, 92,214, 56, 98,193,
+233,138,221, 48,148,144,151,244,100,170,184, 64,155, 40, 53,212,242, 45, 41, 81,223, 73,176,186,238,140,212,211, 99, 47, 95,135,
+ 86,148, 49,100, 93,213,162, 80,205,151, 67,123, 85, 38,231,139,114, 57,175, 93,153, 20,210, 92, 18,106, 76,241, 91,162, 18,202,
+ 22,210, 79, 41,244,186, 20,215, 5,218,162, 85, 42,194, 57,177, 98, 45,248,240, 84, 80,177,170, 80,216, 76,177,119,248,105,164,
+178, 53, 58, 27, 73,169, 42,246, 45,101, 45, 57,249,210,164,169, 21, 62, 34,170,227, 11,109, 79, 43, 25,197, 11,185, 52, 23,218,
+155, 36,152,153,178, 11, 51, 86,161, 83,193,249,105,168,156, 34, 39, 41,180,181, 19,238,186, 81, 11, 68, 32,162,112,228, 36,129,
+ 25,199,227, 25,159, 34,166,170, 65,101, 82,142,132, 0,231, 16, 57, 13,158,172, 12,182,170,100, 15,233, 39, 42, 5, 78,129, 70,
+190, 22,149,213, 52,218,208, 84, 53, 77,235,168,106, 69, 95,215, 56,227, 68,249,239, 68,164, 35,147,196, 72, 85, 11, 1,238,116,
+ 62,225,172, 67,105,203,228, 39, 30,246, 39, 18, 22,101, 43, 14,111,223,145, 19, 52, 93, 75,219,212,116,157,140,222,181,134, 16,
+ 22,218,158,168, 82, 67,140,196,224,121,220,239,203, 78,175, 64,127,212, 69,112,179, 20,226,172,174,129, 67, 79, 77,231,234,239,
+ 48,182,126, 26,197, 42,251,252,244, 9,127,247,229, 66,121, 37,234,252,224,239, 61,221,128,103,117, 21, 87,250,169, 93,119, 78,
+176, 6, 34, 93, 44, 85,121,205, 76, 16,103,199,119, 21,244,191,203,239,169, 43, 11,221,106,117, 75,249,226, 2,184, 2,231,180,
+ 1,254,241,223,251, 3,254,251,127,244,143,208,199, 61,141, 49,188,122,247,150,250,230,150,183,127,243,107,190,255,195, 31,115,
+ 60, 14,244, 55, 91,206,222, 51,105,205, 92, 53, 28, 30, 30,241, 86, 51, 5,207,225, 52,112,247,252, 37,131, 15, 60,156, 71,246,
+231, 1, 83,215,196,164, 10,119, 33,163,176,248, 41,224,135,137,221, 93, 7,106, 38, 5, 79, 48,151, 93,127,244,129,166,111,120,
+120,124,192, 58,183, 14, 47,172,115, 68,239, 25,134,145, 86,119,104, 35,107,163, 20, 99, 65,116, 58,252,124, 32,196, 88,138,137,
+ 76,233,150,110,177,239, 27,198,105, 36,207,179,216,137, 82,166,237, 26, 78,167,211,170, 30, 94,226, 49,155,166,102, 14, 19,155,
+109,207, 48,156, 65, 71,234,170, 17,110,120, 17,150,250, 84,166,122,139, 55,219,232, 53, 16,105, 73,131, 75,139,112, 76, 21,138,
+ 88,240, 88,231, 8, 94, 66,102,116,129, 55,101, 5, 49, 10, 68,197, 47,112,156, 34,230, 83, 90,177,217,110,121,247,238, 30, 99,
+109,161,144,230,114,198, 81,178,187, 37,221,236,197,139,231,156,134,145,227,249, 72,204, 2,240, 73,100,249, 58,114,241,181,199,
+ 20,100,135,237,106,250,174,227,176, 63,240,242,197, 11, 94,189,126, 3,234,138,141, 62, 77,236,118, 27,180,170,216,239, 15, 60,
+123,246,188,240,235,107,198,113,192, 25,137, 10, 29,167,169, 36, 63,186, 53,129,109,137, 13,141, 81, 50,216, 83,140,168,146, 48,
+ 22, 99, 16,209,162, 49,196, 28,217,238,182,101,210,232,139, 51, 71,138,170, 82,154,121, 28,185,189,189, 97,152,102,142,167,147,
+ 20,221,178, 50, 16, 28,172,128,107,150, 9, 79, 83, 87, 24,149,169,107, 91, 46,231,134,246,197, 45,227, 56, 49,205, 19,125,223,
+113,107,183,236,247,143, 40,181,161,109,106,201,129, 47, 2, 77,149, 65, 91,137,214,109,219,150,113,154,228, 82, 88, 87,132, 24,
+228, 2, 82,213, 43,108,104,113, 89,180, 77,187,174,194,198, 89, 46, 91, 41, 37,230,201, 23,220,175,172, 64, 86,135,152,177,244,
+253,134,227, 81, 8,154,206, 57, 80, 2, 1, 27,199,145,218, 53,180,133,192, 41,239,191, 94,131,116, 84, 22,125,201,253,195, 97,
+ 13,124,201,139,197,243,138, 5,191,136, 29, 83,138,133, 60, 81, 74,105, 86,241, 73,140,234,199, 37,181, 34,100, 90, 14,190,164,
+196, 50,115,153, 76,230, 21,179,186, 36,178,105,173, 36, 13,167,114,171, 85, 99, 9, 93, 89,126,142, 69,213, 23, 74, 36, 93, 8,
+242,195, 7,177, 6,164, 24,203,152, 44, 50, 39,207, 28,133, 93, 28, 83, 40,194,186,132, 82, 81, 4,114,186, 8,228, 84, 94, 85,
+169,210,237, 39, 82, 12,228, 20, 5,173,186,168,218, 83,100, 30, 39,130,151,183,191,124, 60, 33, 37, 98, 22,159,190,214, 6, 99,
+ 92,129,190, 44,255,189,124,110, 11,146,213,148,184, 86,158,112,239,245, 50, 15,206,203, 78, 95,198,243,149, 53, 52,206,148, 4,
+ 52, 41, 4,105, 77,166,147,155,217,121,154, 57, 14, 19,227, 28, 36, 66,214, 26,106,103,176,194,116,101,156,102, 78,103,241,126,
+ 46,197, 68, 84,163,154,174, 50,244,149,102,215, 86,108,219,150,190,171,105,187,138,231,207,110,248,193,247, 62,227,203, 47,238,
+120,118, 83,177,235, 12,155,109, 75,221, 56, 66,244, 28, 79, 39,134,113, 36,248,128,209, 6,227, 28,167, 57,240,234,241,192,215,
+247, 7,134,144, 57, 30, 79,156,143, 7,156, 49, 52,117, 43, 56, 88,107,174,172,108,129,113, 28,240,126,150,207, 39, 37,142,231,
+129,113,156, 73, 42,163,172,190,162, 17,231,171,206,249,146, 53,174,174, 40,135,107,148,174,186,124,191, 62, 73,114, 81,233,201,
+143, 37,208,111, 65, 39,234,171,144,147, 39, 23,131,245,151,105, 77,242, 34,167,171,113,251,149, 17, 94,229,171, 81, 60, 79, 28,
+ 27, 31, 67,185,234,114,113,201, 11,203,247, 58, 31,225, 35, 29,250, 71,187,116,190,203,214,246, 84, 39,160,150,224,224,114, 97,
+200, 90, 17, 75, 30,129,203,145, 95,124,241, 5,255,203,159,252, 83,238, 80,196,224, 73, 85,197,187,211,192,235,251, 61,187,187,
+151,140, 83, 96,119,251,140,211,232,121,179, 63,240,246,112,100,127, 60,178,185,189,161,221,238, 56,157, 69, 88,234,209,252,237,
+219, 55,188, 57, 60,178,185, 17,150,247,224, 3, 65, 41,142,195,153,110,211,146,137, 52, 93, 77,221, 84,235,254, 53, 35, 92,119,
+ 95,186,215,241, 44,137,101, 41,196,149,176,103,202, 94, 57,150,152,208, 16,101,210,179, 8,145, 98,217,167,215,117,181,158, 87,
+ 41, 75, 55,125,115,123,195,233,116,102,179,217, 49, 14, 19, 41, 10, 86, 53, 20, 49,148, 60,151, 98,237,114,149, 35,102, 25,103,
+143,243,136,209,150,221,238,150,217,207,235,248,155, 18,203, 28, 35,160, 12,174,170, 49,214,149,238, 56, 51,206, 19,211, 28,240,
+ 33, 49,204,129,243, 28, 56, 79,158,105,138, 12, 99,224, 60, 70,230, 8,131,151,132,197,113, 10,196,164,152, 87,177,154,252, 90,
+124,250,150, 97, 56,243,236,217,141,172, 5,114, 36,144, 37, 27, 1,197, 48,140,108,250,158,121, 22,123,225, 60,138,181,108, 56,
+157,113,149, 67, 41,216,109, 55, 8,150, 60, 96, 16,231, 78,240,129,211,120,230,246,217,173, 56, 7,234,186, 20,142,244, 36, 48,
+ 97, 24, 38, 54,155, 13,199,211, 17, 99,117,177, 86,137,238, 40, 2, 85, 85,147, 11,199,189, 42,171,128,156,162,116,243,165, 56,
+203, 88, 58, 10,203,164, 4, 86,237,118, 91,172,214, 4, 31,169, 92,181,118,177, 41, 70,252, 60,113,123,123, 67,136, 94, 38,102,
+ 49,177,219,108,208, 42, 19,227, 76,191,145,120,212,221,110,195,195,195, 61,219,157,140,252, 99,105, 24, 82, 18,235, 99,221, 84,
+184, 74,236,187, 77,227,216,109, 27,252,124,102,211,183,108,183,194,177,127, 60, 28,112,182, 18,210, 91,185,244,143,227,136,247,
+ 51, 90, 43,218,166,190,154,195, 21,155,223, 48, 22, 55, 65, 36, 37, 89, 9,249, 73, 2,184,154,166,198,106, 45, 92, 5, 96,211,
+183,226,216, 40, 34, 76,103, 29, 57, 73, 94,188,247,129,170,114,107,190, 65, 93,183,116,173, 4,209,132, 56,175,239,183,114, 21,
+ 49,200,215,237,176, 63,112, 60, 30,153,231,137,231,207,239,168, 42,183,190, 94, 43, 83,126, 45,232,105,157, 64,106,181,132,174,
+ 83, 0, 42, 57, 93,117,221,234,130,227,188,106,156, 84,190, 48,183,151,244,170,180, 22,244,184, 64,185,229,231, 28,158,132,185,
+ 80, 2, 4, 98,217,239,197, 53, 11, 61,175,196,174,156, 36,134, 52,133, 64, 10, 81, 94,192,178,155,141, 89,236, 81, 62,151,188,
+224, 24, 32, 5, 20, 30,173,147,116,232, 58,163,244,146,207,156,196,134, 16,203,219,137,130, 80,148,152, 84, 69,237,108,121, 97,
+228,193,244, 81,108, 11,145, 68, 82,153,116,181,123, 50, 37,208, 69, 68, 62,194,134,119, 90,227, 74, 65,151,162, 46, 32, 28, 83,
+ 68, 11,228, 40, 93,119,206,232, 84, 14,250, 34,236,179, 74,172, 99, 40,129,178,196, 28,241, 49,224,189, 16,216,230,121,150, 91,
+235, 48, 49,249,136,202,224,200,232, 36,194, 51, 31, 51,195, 48,113, 30,102,148,169, 10, 83, 90,188,233,149,211,108, 91,195,203,
+222,242,249,174,227,217,174,227,197,221,150,187, 93,205,174,183,180, 93,133, 49,137,156, 71, 82, 24, 57, 31, 30,121,245,230, 13,
+223,188,125,199,105,242, 76,115, 96, 28,103, 72,112, 30, 38, 14,227,196, 49, 40, 38,237,200,198, 73, 70, 52,129,202, 10,238,211,
+ 24, 35, 64,158, 24, 72, 41,160, 85, 38,132,249,194,222,206,153,113,246,132,245, 50, 71, 81,178,231,213,107,189,228, 12, 25, 52,
+ 90,153, 75,196,239,117,113, 95,217,254,185,224,124, 47, 63,148, 14,160,228,146,247, 62,240,125, 45,242,232,167,187,248, 92, 38,
+ 50,139,152, 51,101, 72,145,148,194, 10, 61, 89,133,158,197,121,161, 22,139,249, 26, 3,250,137,139,112,185, 96,101, 20, 49, 75,
+ 68,238,133, 0, 95,194,126, 83,250, 36, 94,118, 21,157,230,143, 43,236,151,139, 71, 78, 69,143,146,196,158,184, 62, 79, 11,164,
+ 66, 43, 28,137,223,222,118,252,139, 63,255,167,108,226,196,233,221, 59, 30, 15, 39,116,183, 97,192,240,249,247,126,200, 20, 18,
+155,155, 27,190,121,251,142,175,223, 61, 96,155,158,113, 42,105,105, 49,114,222, 31,233,250, 27, 30, 79, 19, 95,191,187, 39,148,
+130,180, 63,236,185,127,184, 39, 34, 64,141, 20,188,104, 82, 84,228,230,118,203, 28,230, 85, 20,230, 42, 75,204, 17,101, 12, 89,
+ 41, 30,246, 71,156,169, 10, 3, 61,173, 23, 54,235, 44, 93,223, 74, 6,131, 82,248, 89,198,237,214, 86,156, 79,103, 82, 9,207,
+ 80,122,161, 91, 66,191,217, 20,156,105,203,105, 63,160, 17, 49,214,133, 60,169, 86,175,186,113,154,170,117,248, 50, 10, 37, 65,
+223,237,120,124, 56,161,144,113,130, 36,159,105, 20,150,156, 52,243,228,169, 43, 1,239,100, 52,198, 57, 66,202,132,164, 72, 88,
+162, 50,132, 44,249, 13, 40,135,213, 13, 73, 91, 18,150, 16, 53, 25, 75,202,197, 78,154, 10,107, 94, 84, 99,132,148,168,234,154,
+211,233, 64,221, 8,127, 34, 38, 1,243,164,172, 36, 47,126, 22,205,192, 60, 69,156,169, 57, 31, 7,156,118, 12,195, 88,190,175,
+ 51,109, 83,177,219,116,152,210, 36, 84,174, 34,120, 9,114, 57,141, 39,238, 94, 60,231,254,113,207,221,179, 91,121, 38, 52,229,
+236, 21,152,203, 48,142,180,125,135,182,138,155,219, 27, 41,108,167,145,170,233,196,174,151, 20,113, 14,168, 4,125,211,150,213,
+101,166,235, 26,140, 17,120,214, 56, 78,171,213, 42, 23,187,161,236,219, 35,211, 56,173, 54,184, 37,114, 57,248,145,187,187,173,
+ 8, 13, 99,160,109, 43, 32, 16,227, 92,236,198,145,166,117,180, 93,197, 52,141,107,208,142, 54,182,116,245, 66,249, 91,130,102,
+156, 83,232, 28,217,116, 45,190,104, 41,154,182, 99, 24, 38, 14,231, 1,109, 37, 26,119,246,178,243,118,206,173,129, 86,109, 93,
+161,114,166,111,133,163,162,141,140,193,181, 50, 43,240, 75, 40,112,142,121, 18, 5,188,179, 6, 98, 64,229,196,221,237, 13, 93,
+ 83, 19, 11, 67,192, 25,187, 78,146, 98, 20, 93,194, 56, 78,204,147, 88,215, 50,137,113, 28, 48, 70, 62,247, 97, 24, 25,206, 35,
+ 49, 36,180, 18, 81,228,117,242,229, 69, 84,188,136, 13,175,187,117, 57, 31, 53,159,116, 0, 95, 41,127, 11, 55,217,228, 75,173,
+150,230,168, 28,130,159,136,158, 92,118,162,226,142,189, 14,117, 73, 79, 14,179,165,152, 47, 94,239,101,156,149, 96, 45,250, 75,
+200,135,196, 82, 68,114,156, 73,113,186, 36,169,229, 92,118,226, 25,173,115, 73, 90, 10,132, 40,221,254,228,103,102, 63,227,131,
+ 47,251,122,217,173, 87,149,163, 46,225, 16,193, 11,112,127, 81,162,174, 65, 8,165,168, 91, 45,100, 55,163, 86,242,238, 26,137,
+167,175, 33, 60,234, 82, 68, 46, 77,104,225, 79,163, 49,202,172,161, 43,139, 26, 58, 39,137, 89, 93, 16,178, 62, 70, 25, 47,206,
+158,217,123, 34, 34,182, 74, 57,147, 98, 98,154, 61,135,195,192,227,195,137,217, 39, 52,134, 24, 34, 42, 69,172, 78,108, 58,199,
+203,103, 29,159, 63,111,120,118, 99,233, 58,205,205,109,205,203,231, 45,109,157,200, 97,228,254,225,200, 95,255,237, 61,255,246,
+ 63,189,225,255,250, 15,191,226,255,253,255,126,205,175,223, 61, 74, 1, 31, 70, 78,195,192,105, 24,184, 63,156, 56,205,153,179,
+ 79,156, 39,143,182, 22,235, 28, 77,219,210,245,221,130,234, 39,248, 64, 10,137, 28, 50, 26,141,202,162,252, 92, 70, 72,222,135,
+ 15,196,231,151,238,245, 19,195, 33,117,125, 33, 92,138,185, 92,168, 62,174, 79, 83,159,236,112, 63, 9,112,201, 79,135,236, 23,
+ 45,200,127,254, 90,234, 99,221,247,178, 2,200, 43,184,233, 19, 16,153, 79, 69,163,126,228,227, 80, 75, 38,193, 50, 21, 91,130,
+ 57,149, 92, 32,178,181,164,178, 46,170, 83,226,101,229,248, 31,254,244,207,216, 88,203, 56, 13,156,253,196, 15,126,240, 67, 84,
+ 86,124,254,197,151, 4, 5, 94,101,134, 20, 24, 83,194,182, 45,135,211,192,233, 60, 80,183, 45,191,250,230, 27,206,100, 94, 31,
+ 31,121, 28,207, 12,193, 19,114,226,116, 58,201, 8,177,170,215,164, 49,173, 20, 77,211,174,250, 19,239, 61, 77, 91, 23, 90,165,
+ 38,167,139, 10,123,201, 21,208,214, 74,161, 47,221,199, 2, 51,186,142,228,156,231, 89, 18,210,172,227,241,241,145,205,102, 83,
+ 68, 84, 10, 87,153, 85,113, 60, 77, 51, 99,201,224, 22,216,137, 93,227,101,181,213,100, 36,150, 84,101,240,147, 80,224,118,187,
+ 27,246,251, 67, 25, 21,107, 33,173, 69,153,212,229,162,177,168,107, 17, 42,133, 20, 49,214, 72,162, 98, 73,145,147,149,146, 90,
+125,233, 74,169, 50,230, 13, 69, 47, 96, 47,209,213, 43,105,205,202,200,186,170, 57,159,103,154,182, 67, 41,195, 56,206,171,126,
+ 36,167, 37,238, 88,196,117, 18, 34,149, 56, 28,142,124,254,249,231, 76,255, 63,107,111,214,100, 87,150,158,231, 61,107,218,211,
+ 25, 50, 19, 9,160,166,174,234, 46,118, 53, 73,113, 38,109, 7,109, 93, 73,214,133,111,245,147,244,183,124,225,144,239, 44,135,
+ 34, 44, 89, 38, 21,146,217,236,177,170, 26, 83, 78,103,216,227, 26,124,241,173,189,207,201, 4,208, 44, 69,184, 43, 50, 80, 3,
+ 26, 64,102,238,189,214, 55,188,239,243,246, 29,198,104,246,199, 30,109,172,136,237,154,154,122,213, 8, 92, 38, 36,172, 43,240,
+ 97, 90,206,196,148, 60,218, 40,182, 23,235,101,117, 40,207,144,206,224, 30, 41,127,174,159, 93,209,181,109, 38,101, 38,166,113,
+194,230,196,183,132, 34, 7,117,230, 32, 41,179,116,125, 74, 33, 10,113,192,216, 76,147,107, 26,134,126, 16,224, 88,134,250,184,
+162,192, 90,151,153,255, 45,117, 45,220,139,162,112,121,127,221, 51,140,195, 18, 4, 5,208,117, 29,239,222,221,176,217,110,176,
+ 86,225,172, 89,194, 88,140, 49,148,101, 73,223,143, 24,155,185,239, 11,200,102,139, 82,208,181,199,133, 99, 63, 71,157,206,163,
+236,162, 40, 40,179,173,205,123,159, 35, 99, 85,158,242,200,121, 83, 21,229,226,115, 47,138, 34,131,120,138,197,157, 48,140, 61,
+155,237, 70, 34,112,243,154, 49,165,176,100,163,207, 9,112,195, 48,101,159, 58,217,205,225,241,115, 52,107, 94,201,204,246,198,
+ 25,190,214,247,253, 71, 29, 55,243,125,170,148,250, 16,251,253, 76,245,126,150,104,165,158, 68, 85,235,147,214,231,163,110,217,
+101,238,159, 78, 23, 93, 8,129,160,195, 35,145,145, 28,122,143,237, 76, 41, 65, 72, 2, 95,152, 75, 91,163,158, 56,227, 83, 86,
+227, 39, 45,127,198, 28, 59, 39,242,186, 64, 76,158, 41,140, 57,187, 87,212,165,129, 68, 76,106,129, 68, 24,163, 49,214,192, 36,
+192, 11, 12,121,140, 44, 76,250,209, 79,120,151, 61,165, 89, 31, 48,171,237,245,185,104, 75,205, 36, 59,181, 68,227, 45, 7,237,
+147, 9,243,204,241, 93, 8,100,103,187,185,164, 51, 81, 45,201,225, 60,197, 68,136,185, 18,155,225, 3, 73,124,176,109, 63,114,
+232, 60,163, 7, 27, 34,227, 56,162,147,166,136,208, 20, 21, 23, 43,199,170,138,172, 43,233, 20,154,218,225,156,102,234, 70,190,
+253,246, 53,255,254,239,127,201,175,127,119,207,164, 36, 59,122,211,148, 92,109,215,244,193,176, 26, 35, 77, 93,202, 3,109, 11,
+118,195,192,175,223,236,121, 56,180,148,235,107,108, 81,136, 32,169, 17,168, 68, 97, 13, 70,153, 60, 82,155, 80,218, 48,141,158,
+ 48, 9,108,163,109,251, 28, 94,145,137, 72,243, 14,248,145,212, 93, 45, 79,146,226, 20,153,123, 26, 77,207,147, 32,181, 88, 42,
+ 83, 58,223, 49,235, 39, 86, 76,181, 48,206,159,190, 7,122,201, 23,124, 74,174,251, 39,175,234, 31,108, 71,211,217, 42,244, 84,
+193,174,206,242, 17, 62, 70,141, 91,222,141, 89, 40,255, 1,220,237,233,113, 18, 98,156, 81,138,100, 12,104,133, 79, 96, 81,216,
+ 24,185,114,154,127,249,231,127,206, 31, 62,127, 65, 49, 13, 68,149,184,184,126,134, 54, 6,107, 29,117, 89,243,234,237, 91,190,
+248,250,107, 94,223,220,242,208,247,220,238,118,172, 54, 91,162, 54,124,255,230, 45, 94, 43,190,191,187, 97,152, 18,186, 46, 73,
+214,210,247, 45, 67,182,217,148, 69,205,224,167,172,230, 21,255,173,214,150,190, 23,223,184,181,162,228,213,202, 96,109, 65,223,
+ 75,247,177, 90, 55, 76,126, 90,234,187,217,119,174,242,190,119,238, 70,180, 49,180,125, 71,189, 94, 51,236, 14,114,105,207,244,
+ 63, 29,104,154,102,177, 20,137,224,200,136,159,125, 85, 51,140,189, 88, 56,157, 88,216, 98,144,175,222,126,119,192, 88,184,184,
+184, 32, 38,197,161, 61, 8,233, 50,167,216,197, 20,137, 83,194,213, 25,192, 82, 56, 66,128, 66,201, 65, 43,233,100, 2, 12, 9,
+ 62,162,139, 76,157, 59, 35, 14, 90, 99, 69,228, 86, 23,180,199,142,209, 79, 50,250, 21, 47, 44,198,104,134,110,144,157,120,136,
+146, 23,158, 5,116, 50,198,117, 75, 38,134, 66,136,148,115,178,217,229,229, 37,206, 57,209, 13,168, 72,140,150,195, 97,207,213,
+213, 5, 87, 87,219,165,168, 0,208, 86, 49,142,131,164,193, 5,225,163, 75, 68,114, 65,215,143,226,152,143,105, 17,151,125,242,
+220,211,212, 21,101,225, 80, 72,196,233,186,174,185,187,185,229,234,234,146,190, 31, 9, 94,138,181,121, 15, 28,188, 71,107, 69,
+213,148,132, 20,114, 22,187,162,109, 91, 94, 60,127,193,209,118,236,247, 71,202,170,166,235,123,201,113, 55, 10, 91, 20,164, 97,
+ 56, 1,117, 98,162,105,154,133, 69,191,223,239,185,184,184,200,233,142, 98,111,123,253,250, 21,159,125,246, 41,183, 55,247,108,
+ 86, 53,211, 52,177,123,216, 97,172, 97,181, 90,211,181, 71,234,178, 98,229, 28,109,223, 19,166,145,151,215,207,121,216,223,211,
+247, 45,113, 26,185,186,186, 98, 24,134, 5,128,164,148,228,106,104,163,179,211, 40,187,190,148,216,201,134,110, 92,132,157, 50,
+ 1, 22, 86,255, 20, 2, 49,235, 12, 4, 31, 28, 40, 42,241,205,247,253,152, 57,250, 35,214, 22, 89,103,112,178,208,196,140,239,
+157,178,163, 66, 92, 18,249,217,207,169,155, 33, 37,246,251,125, 78,223, 19, 65,233,178,254,206,238,155,115,124,180,229, 3,146,
+ 32, 69,122,143, 82,181, 36, 84,229, 51, 45, 60, 69,120,158,129,105,210, 98, 67,122,212,170,230, 79,104, 34,230,135,246, 81, 71,
+127,242,136,136, 34,147,147,207,120,249, 51,133,176, 32,242,100, 12,126,202,102, 87, 24, 25,219,230,160,149, 20,101,127, 78, 12,
+185, 96,200,187, 86,201,121,203, 74, 86,121,253,140, 22, 56,193,228, 61, 54, 56,148,201,194,148, 24,137,227,192,218, 25,162,229,
+ 44, 47, 93, 47,160,153, 83,238,149, 90,252,168, 42,171,223, 77,222, 35,170,243,245,111,134,205,204,171, 1,173,165,218, 77,137,
+188,195, 82,203,133,174, 80,248, 40,126, 83, 99,178, 63, 54,138,128, 39, 68, 24, 99,162,157, 2, 99, 12, 52, 54,211,182,198, 73,
+ 34, 29,189,199,146,176, 74, 83,104, 67,153, 63,199,113, 76,252,215, 95,189,229,223,254, 31,127,199,223,253,234, 45,237,100, 72,
+ 86, 81, 87,150,109, 83,113,181,243,108,154,150, 85, 45,251, 34,239, 39,140, 43,241,170, 96,194,177,189,184, 98,253,236, 57, 1,
+197,221,195, 61, 93,223, 73,164,162,145, 75,114, 10, 18,150,224,167, 72,215, 15,248,148,232,253, 68, 55,244,115,235, 45,223, 10,
+157,139,178, 57,100, 67,197, 71, 45,252, 92, 16,129, 90, 2, 91,210, 12,119,103, 94,227,228,108,245,200, 50, 5, 58, 69,157,158,
+136,116, 75, 62, 59,115,241,120,190,175, 78,239, 67,224,207, 89,242,249, 57,148, 41,110, 90, 2, 81,126, 72, 15, 31,127,143, 69,
+ 77,125, 96,114,240, 52,172,229, 67,225, 45, 42, 61, 14, 72, 94,236, 23, 97, 22,225, 65,152,159,107,160, 81,154,127,245,215,127,
+197,255,248,135,127, 8,199, 61, 87,215,207,232,195,132, 93,173,248,197,175,127,203,197,197, 53, 97,152, 80, 73,243, 95,255,223,
+159,243,110,183,167,155, 38,108, 89, 17,208,132,236,163, 78, 10,238, 31,246,188,252,244,115,238,118, 7, 30, 30,222,162, 52,184,
+178, 36,250,147, 61,107,202,251, 69, 65,113,202, 46,187,110,106,146,150,145,165, 51,178,103,236,186, 65, 88, 14, 85,157, 51,189,
+167,124,145,157,112,152, 90, 75, 76,168,202,251, 87, 63,201,251,219,182,189,128, 84,148,164, 4, 66,202,240,147,145,174,235,243,
+136, 60,176, 90, 53,140,126,202,108,115,187,112,208,139,162, 96,191,219, 49, 77, 35, 87,235, 43,137, 55,157,197,171,117, 73,223,
+245,216,252, 62,218,194, 9, 73,206,251,101,194, 88,175, 26,180,177, 12, 97, 98,202, 9,145,218,230,142,187,107,115, 65, 18, 41,
+ 11,161, 64,134,156, 68, 7,176, 63,118, 25,211,154, 50,210, 54, 98, 50,195, 66,172, 93,178, 14,216,110,214,244,237, 64, 76,137,
+ 49, 39,185, 37, 37,214,184,117,211, 64,138,188,126,253,154,151, 47, 95,114, 56,182,196, 8,125,223, 49, 78,138,151, 47,159, 17,
+163,103,187, 93,113,127,191,231,242,162, 33, 50, 49,180,178, 63,190,126,246, 44, 79, 73, 36,167,189,170,106, 64,146,228,116,126,
+238, 14,199, 3, 69,105,115, 74,155, 4,163, 92, 95, 92, 73,209,225,196,239,125, 60, 30, 72, 57, 79, 62,165,124, 30,171,236,155,
+ 31,134,156, 27, 46,168,235,113,236,169, 43,199,241, 40, 58,143,110, 28,113,174, 88,236,204,226, 99, 63,112,113,113,137,143,137,
+205,102,179, 20,198, 51,245,109,142,231,125,246,236,138,227,241, 64,215,181,252,248, 39, 95,242,171, 95,254, 82,232,152,182,204,
+ 74,248,130,242,210,113,119,115,195,139, 23, 47,168, 11, 97,203,147, 2,207,175,174,104,219, 22,239, 61,183,183,183, 98,139, 35,
+ 49, 12, 82, 88, 37, 4, 85,172,180,202,148,188,120, 70,129, 84,203,179, 57,249, 41,195, 98,170,101,146, 52,255,156, 37, 40,199,
+ 26,138,210, 50,249, 97,233,180,199,209,103, 69,188,201, 1, 47,146,216,198,252, 76,164,176,232,120,130, 79,132,100,196,138, 55,
+250,220, 8,126, 36,218,249,108, 53,103, 67,182, 51, 24,117,150, 83,117,238,123, 61,139,171, 92, 82,212,180, 38,233, 60,242,139,
+ 31, 83,207,171, 71,243,126,137,136, 19,193, 84,204,187,198,112,118,160,205, 23, 94,204, 23,186,236, 34,197, 71,174,114, 48,139,
+ 85,224,116,162, 48, 9,171, 2,133,145,127,214, 42,123,250,146, 33, 37, 3, 73,118, 59,130, 37, 21,132,163,210,114,200, 73,132,
+ 33, 11,215,217,135,184,236,237,114, 38, 33, 49, 38, 98, 16,193, 94, 28, 6, 54, 85,193,182,114, 34,252, 35,200,195,155, 1,181,
+106,217, 96, 36,180,210,146, 0,167, 78, 60,231,185,151,215,203,232,248,236,235,178, 80,203, 78,200, 81, 53,199, 75,166, 68,152,
+ 34,131, 15, 18, 64,145,192,135,136, 53,150,148,180,216,217,124,160, 29, 71,146, 49,172, 54,107,234,186,100,154, 38, 44, 30,131,
+ 70,133, 72,138,178,223,215, 86,252,210,191,252,246,134,255,245,255,252,207,252,199, 95,188,163, 79, 21, 30,141,138,138,190,131,
+ 93,215,243,246, 97,164, 46, 45, 77, 41,162,151,162, 44,216,108, 43, 46,182, 13,206, 22,216,216,227, 71,121, 97,199,105,192, 25,
+ 77,215,247,242, 96, 59, 1, 20, 77,163,167,235, 69, 15, 48,133,200,113, 24,241,103,143,136, 49, 38, 79, 35,210,147, 78,155,179,
+148,189, 39,194,177,133,119,172, 30,101, 17, 44, 62,241, 39,232, 84,158,178, 19, 84, 6,135,132,244, 65, 78,252,153,172,253, 20,
+150,154,167, 76,105,241,125,103, 21,125,142, 7,126, 44, 84, 73, 31, 28,169,127, 80,181,126, 70,173, 91, 8,118, 79, 2, 93, 30,
+133,196,168, 83,108,241,194,115,152, 65, 76, 90,101, 69, 64,182,130,166,132, 78, 18, 10,212, 36,248,235,111,190,225, 47,191,252,
+138, 75,107, 57, 30,142,132, 8,211, 20,249,213, 47,127,141,110, 86,252,238,221,141,132, 24,217,146,227, 94,132,140,159,254,232,
+ 71,188,122,251,142, 99,219,209, 15, 35,201,104,234,186,228,147,231, 47, 37, 42,115, 28,169,138,130,245,197,134,221,110,151, 41,
+111,158,203,203, 75,222,222, 63, 16, 83,228,112, 60, 48,140,131,228, 82, 23,197,242,253,242, 49, 18,198,145,105,156,184,188,220,
+230,177,176,128,104,180, 53, 20,115,247, 97,204, 2, 23,177,206,190,151,185, 94, 55,117,126,143, 34, 69, 37, 99,214, 16, 38,234,
+186,100,236, 61, 69, 89, 18, 73,140,126,164,168,202,147,213,111, 57,148,125,134,214, 20,185,112, 16,109,200,106, 85, 51, 14, 3,
+227, 52,161, 84,100,189, 89,179,219, 29, 50,234, 56,130, 86, 98,201,204, 84, 49,148,216,206,156,117,121,100, 42, 10,121,239, 3,
+101,153, 69,125, 85,201,241,120,160,174,155, 92,196,207,128,150,184,156, 59,218, 36,124, 28, 49,133, 37, 41, 89, 53, 22,165, 97,
+154, 2, 42,164,229,153,153, 11, 11,178,143, 95, 34, 75, 29,227, 36,176,149,232, 3, 55, 55,247, 92, 95, 95,226,125,100,181,138,
+180, 93,203,229,213, 22, 63,121, 52,145,187, 91, 81,146,107, 99,184,127, 56, 72,238,121, 81,178,217,172,232,250,142,171, 43, 25,
+ 85, 63, 60,220,114,121,121,137, 82,210, 41,222,221,223,242,252,249,245,162, 97,152,133,132, 49, 68,146,159, 71,199,130,139,246,
+126,202, 22,174, 18,107,101,239,111,148,161,112, 14,109, 69,111,180, 59, 30, 88,215, 13,174,176,140,121, 79,189, 63, 28,242,254,
+187,163,201,136,215,178, 44,217,239,247,146, 16,151,139,179,148,207,111, 66,224,199, 95,126,197,183,223,126, 71,219, 30,105, 86,
+107,246,251, 61,207,175,159,113,121,121, 73,219,182,108, 54, 27, 25,189,119, 93, 22,197,105, 46, 47,179, 74,126, 24, 78,133,164,
+158,177,172,115,106,218, 64, 89,214,103,156, 11,205,126,191,227,242,242, 10,159,117, 66,211, 36,147, 19,107,141,104, 27,242, 59,
+127, 2,209,136, 96,110,118,105, 8,226, 87,236,173,109, 43, 17,180,195,228,115,208,147,172, 50,130, 23,166,193,204,143, 7, 40,
+140, 93,180, 59,231,103,205, 57,140,106,233,220,159,166,165,235,244,129,225,226,251, 14,159, 69,237,158, 22, 75, 82, 92,236, 93,
+143,227, 81,103, 35,153,140,125, 38, 47, 73, 69,115, 78,242,188, 11,152,213,166, 11,205, 75,202, 88,201, 36, 87,145,210, 42, 74,
+ 27, 41,180,167, 80, 19,181,243,148, 54, 80, 23,145,186, 76, 20, 38, 0, 19, 41,139,205,124, 8, 12, 83, 96,152,252,242, 5,213,
+ 89,129,124, 14, 36, 9, 62, 64, 2,103, 11, 52, 50,118,153,134,137,161,159,152, 38,177, 37,133, 40, 99,112,159, 32, 42, 9, 31,
+ 89,246,230,249,195, 24, 35,140,105,165,196,155,110,197,151,110,140,206, 74,124, 50,164,128, 69,160, 50, 23, 47, 79, 69, 15,126,
+ 10,140,163,103,202, 23,186,207,187,180,144, 25,234, 62, 37, 17,201, 13, 3, 65, 37,154,205,138,102,211,176, 90,213,108,214, 13,
+171,170,102,211,212,108, 86,226,215, 77, 42,128, 78,188,189,123,224,223,254,251,255,155,255,248,203, 87, 28,116, 77,139, 34, 89,
+141,199,224,113, 76,148,244,177,160,245,142, 99, 40,104, 83,197, 64,195,161, 75,220,239, 91,218,174, 99,179, 90,209, 84, 37, 85,
+ 85, 82, 22, 57,109,201, 24, 92,233, 40,235, 42,219,212, 20,211, 40,156, 47,195, 13, 0, 0, 32, 0, 73, 68, 65, 84, 47,117,136,
+114,224,207, 89,232, 42, 79, 50, 84,246, 28,207,207,135,202, 35,151, 57,203, 92,127, 96, 43, 62, 7,106, 60, 46, 22,207,224, 11,
+203,247,246,164,234,148,119, 37, 46, 10,247,247, 4,116, 89, 47,162,211,123,255,233,212,173,159,143,244, 19, 63, 72,181,254,209,
+ 29,123, 60,165, 15,170, 15, 90,225, 30, 19, 22, 23,136,140,210,153, 23,158, 63,148, 89,138, 13, 61,227, 76,115,125, 89, 38, 40,
+135,137, 63,253,209,231,252,171,191,249, 43,190,184,184,160, 41, 43,202,139, 13,177, 44, 24,162,226,221,221,129, 55, 55,247,152,
+178,166, 29, 35,119,119, 59, 54,151, 87, 84,171, 53,111,239,238,105,187,158,139,139,173,136,143,162,236,190,159, 93, 93,113,247,
+238, 29,171,170,160, 42, 28, 70, 65, 89, 58,172, 49,124,241,249, 23,140,227, 72,138,137,170, 42,105,143,123,188, 31,169,155,154,
+178,172,240, 65,188,217,109, 55,240,176,219, 83, 84, 98, 27,115,206, 73, 90, 91,240, 89,131,225,151, 92,131,243,226, 45,132, 64,
+ 85, 85,188,123,247,142,237,118, 75,204,251,203,178, 46,101,108, 31, 4,216,161,243, 88,187,170,107,142,237,145, 85,211, 44, 74,
+225,105, 18,213,248,126,127, 36, 69,121,231, 83,132,105,244, 12,195,192,170,169,232,142, 71,166, 81,132,125,214, 74,178,214, 52,
+ 78,139,231, 88, 8,101,217, 22, 69,162, 89,173,228,157,205, 7,120, 34,219,211, 20,139, 5,106,204, 41,133,117, 93, 81, 88, 33,
+ 77, 46,156,251,232,137, 41,102, 12,172,146,216, 78, 29, 25,199, 78, 44,102, 90, 99, 51,175,194, 25,139, 31, 60, 67, 39, 22, 87,
+173, 13, 55, 55,119,108, 86,107,225, 82, 88,139, 85,134,238,112,164,114, 21,165,117, 92,110, 86, 84,133,193, 89, 75, 85, 53,172,
+ 86, 27,180,182, 60, 60,236,177,198,240,226,197, 11,180, 22,133,123,159,125,218,135,195,145,126, 28,104,154, 21,119,119, 55, 84,
+ 85,193,231,159,127,142, 82, 98, 75,155,166, 9, 87, 88, 92, 81,228,104,214,220,161,142,163, 76, 70,227, 76,124,148,172,240,113,
+ 58,165,150, 53,171, 6,231, 44,171,213, 74, 26, 16,107, 57, 30,164,115, 46,235, 44,198, 51,102, 1, 15, 25, 99,114, 55,205,114,
+ 95,180,173,196,169,238,247,123,190,253,246, 91, 72,145, 47,127,244,185,100,162,143,114, 73,223,223,223, 83, 85,245, 18,119, 90,
+ 22,197,130,158,157, 98,224,216,119, 2, 10,178,134,213,122, 35,112, 31, 91, 80,215,141, 52, 90, 49,178,106, 42,130, 31, 37, 76,
+ 43,211, 70,103,162,157,206,191, 86, 8, 97,233,252,157,179, 56,103, 41,138, 98,217,157,119, 93, 39, 43,216,148,112,198, 82, 24,
+ 71,229, 74, 9,136,138, 18,187,107,116, 33,226,204,164,113,182, 60, 27,165,235, 60,197,157,131,192, 30,223,153, 39, 10,235,227,
+ 38, 64,127, 80, 48,148, 62,178, 53, 76, 31,243, 4,167,143,118, 39,143,144,154, 49,226,195,136,247,227,123,127,184,115,239,122,
+204,222,116, 9,225, 12,194,105,215,137,202, 6,106,231,169,138, 64, 93, 66, 83, 65, 93, 26, 10, 43,180, 54, 31, 35,173, 15,236,
+251,145,187, 99,199,253,177, 99,223, 14,180,227,196,224, 35, 99,144, 32, 7,137, 16, 61,237,182,141,177, 25, 51,105,240, 62,102,
+111, 43,184,178, 98,181,185, 32,105, 67, 63,121,198,204, 84, 94,168, 51,234,148, 23, 47,214,182,211,143, 38,123,107, 77,166,101,
+205, 63, 71,101, 2,209, 41,103,155,211, 14, 94, 25, 64, 19, 82,100,156, 70, 70,239,241,121,167, 62,133, 72,200, 49,141, 73, 18,
+ 31,152,124, 66, 69, 40,172,101,234, 91,218,118,143, 78,145,186, 80,212, 78,177, 93, 59,154,181,195, 84,142,195, 16,248,119,255,
+233, 31,248,127,126,254, 61, 93, 44, 24,163, 38, 97, 22, 11,159,143, 17,143, 34,106, 71,208, 78, 20,188, 72,206,188,115, 5,117,
+179, 98,187,221, 74, 62,252, 52,176,170, 43,154, 74,128, 12, 85, 85,177, 94,173,104,154, 74,224, 22, 69,177,116,224,147,247,146,
+ 33,172,222,139, 25,201, 23,183,122,124, 33,159, 63,123, 31,124, 14,213,146, 42,245,248,209, 60, 83,112,158,117,233,231,100,194,
+167, 44, 25,217, 26,157,172,107, 39, 78, 58,232,116,234,160,197, 22, 25, 31, 65,135, 62, 28,174,242,131, 21,116,121, 2, 32,223,
+199,148, 11,197,164, 78,255,156,148, 38,207,252, 79, 85,116, 22, 88,165,217,113, 50,107, 11,114,192,235,188,100,176, 33,242,213,
+213, 21,255,203,223,254, 15,188,168, 10, 76,140,180, 93,143,118, 5,175, 30,118,180, 40, 76, 81, 51, 13,145,155,187, 61,177, 44,
+137,165,227,174,109,185,239, 59,246, 93, 75, 81,150,220,222,220, 82, 89,203,139,171, 43, 46, 47, 54,124,255,250,123,202,170, 16,
+213,118,140, 12, 93,203,231,159,188,164, 42, 28,199,221, 3,199,195, 1,235, 44, 33, 76, 76,190,199,149,134,110,232, 8, 41,209,
+182, 3,253, 48, 17, 35, 98, 11, 51, 70, 98,134,179,120,168, 40,138,197,254, 56,219, 50,141,145, 9,147, 50, 58,231, 89,123,233,
+190, 71,217,135,206,194,161,166,169, 25,199,129,170,170, 25,199,137,245,118,205,126,255, 64,211, 52,184, 92,120,198, 24, 41,140,
+163,111,123, 8, 9,165, 13, 38,147,200,108, 81,230,177,125,129,159, 70, 10,235, 8,147,160, 69,199,113,200, 65, 67, 50,161,113,
+ 86,194, 62,186,126,200, 64,154,140, 89, 77,208, 30, 91, 9,129, 9, 81, 70,203,200, 69, 60,141, 35,206, 25,156, 53, 20,133,149,
+ 51, 65, 33,162,172,164,176,153,161, 30, 66,228,112, 56, 96,140,197, 21,142,237,246, 2, 98, 98,221, 52,212,165,131, 24,168,171,
+138,113,244,164,152, 24, 7,207, 56, 76,248, 16, 49, 86, 45, 0,153,170,106,248,249,207,127,201,197,197, 5,214, 9, 11,226,205,
+155, 55,172,215, 13,117, 83,242,252,249, 21,253, 48,240,238,230, 29,205,170, 98,123,181, 69,233,136,177,134,209, 7,124,128,105,
+ 74, 57,144,198,208,118, 61,195, 48,177,189,216,208,182, 50,150, 79,217, 19,239,115, 90,221, 60, 65,216,172, 86,226, 40, 9, 17,
+107,140,104, 44,148, 69, 41,203,110,119,160, 61, 30, 41,157,101, 26,122,154,170,162,159, 70,108, 89,112,104,123,124, 76,172,183,
+ 27,142,199,227,130, 84, 85, 74,229,207,169,226,120,108,151,226, 74, 68,113, 21,187,221,158,227,241,200,106,181,162, 44, 10, 66,
+ 16,132,174,113,150, 87,175,223, 8,206, 91, 9,100,168,105, 42,154, 92,228,141,147,167, 61,118, 76, 99,224, 97,183,163,237, 58,
+142,199, 35, 36,104,234, 26,231, 10, 66, 72,203,202,166,174,196,242,235,156, 35, 32,176,153,170, 42,113, 70, 50, 2,116,130,210,
+186,211,234, 83, 41,116, 74, 52,101, 69,140, 57,200,203,203,228,169, 44,203, 60,133,144,166,178, 42,203,229,252, 59, 30,143, 57,
+ 30,251,100, 93, 83,153,142,122,178, 73, 63, 62,119,100, 50,116, 74,194, 52,206,152,127, 51, 19,145,150,191,212,227,196, 10, 53,
+ 43,223,231,161,179, 62,177,221,245, 76,251,210,106,145, 16,205,254,236,243, 99, 88, 43,189,236, 69,140, 22, 28,233, 83, 65, 16,
+249, 11, 33, 15,136,140,138,204, 98, 61,131,210,142,148, 69,162, 42,228, 50, 47,173, 4,161, 56, 43,123,191,193, 39,238,246, 29,
+ 55,247,123,110,238, 15,236,143, 61,253, 20,241,249, 82,244, 25,130, 50,249,144, 47,119,137, 93,149,210, 65,225, 67,146,138, 27,
+197,106,221,176,222,174, 89,175,106, 12, 9, 21, 39,170, 66, 94, 74,149, 47, 99,147, 47,116,163, 69,121,107,140,116,233,206,168,
+ 76,199,178, 88, 35, 35,121,107, 52, 54,131, 14, 78,170,247, 51,200,238,108,247,203, 95, 11, 31, 68, 97, 26,209,248,236, 48,168,
+115, 87, 52, 69, 56, 12, 19,111,110,118,236,143, 3,245,122,131,210,112,220,223, 67,240, 52,133,230,243,103, 21, 95,189,104, 40,
+108,196, 71,197,127,254,199, 87,252,111,255,238,191,240,253,109,192,211,144,148, 67, 37,233,178, 83,182,152, 24, 43, 15,109, 97,
+173,116, 20, 6, 44, 1,149, 2,195, 48,112,220,239, 56, 28,118, 88,235, 88,111, 47, 24, 70, 15, 49,113,121,177,101,181,146, 11,
+ 62,133,196, 52, 76,210, 13, 41, 37,153,241,211,116,118,207, 42,206,128,107, 11,104,102,185,104,151,121,247, 28, 86,240, 88,153,
+161,158,116,199,239,217,192,102,167,246, 57, 17,137,147, 24, 36,157,161,102,207,152, 54,239,219,223,150,191, 17,181,180, 58, 75,
+ 31, 84,185,154, 75,191,103,247,253,209,203, 92,157,222, 49,149,139,188,223, 87, 16,159,160,184, 58,143,232,212, 73, 31,160, 82,
+118,165,204, 57,220, 10,157, 34, 23,198,241,175,255,229,191,224,235,103,151,216,177,199,143, 35,171,139, 11,238,118, 7,188, 45,
+248,254,221, 45,171,102,203,212,203, 36,104, 48,138, 95,126,251, 61,155, 23,215,188,221,221, 99,139, 66, 32, 72, 49,241,236,242,
+ 2,165, 21,251,246,200, 20, 60,125, 86, 35,239,246, 15,160, 18,187,251, 7,246,187, 29,133, 43,216,183, 61,117,211, 72,192, 72,
+244, 76,126, 68, 27,205,241,112, 16, 60,114, 81, 96,172,202,158, 98,185,164,186,174,149,247, 34,175, 58, 66,144, 93,111, 93, 55,
+103,130, 55,217, 81,142,121, 28, 57,228,108,130,178, 44,115,114,149, 40,236,155,186, 17, 63,187,115,132, 24, 40,202, 2,109,140,
+232, 62, 50,213,107, 26,252, 50,182, 95,109, 54, 36,230,245, 81,192,185,172,158,238,164, 99,189,122,118,201,187,183,239, 68,120,
+ 27,163,160,167,141,202,208, 22,143,118,194, 40, 31,250,129, 24,230, 51, 48,101, 70,187,120,146,171,162,160,235,123,156, 53,172,
+ 55,141,216,112, 99, 90,128, 44, 85, 41,222,111, 57, 63, 12,222,139, 26,127,191, 63, 74,241,161, 68, 3, 52, 83,241, 98,136,143,
+ 46, 1,242,126,119,166,115,134, 32, 74,251,178, 44,232,186,150,205,102, 69, 74,129,195,225,184,116,154, 85, 41, 5,212,177,149,
+113,244,122,179,102,189,222, 48, 77, 81,132, 91, 83,192, 79, 19, 69, 85,176, 94, 53,220,221, 61,176, 89, 11,155,189,239,142, 50,
+165,171, 10,110,111,111, 36,113,172,105,168,171, 98,137,203,174,202,154,224, 35,222, 7,234,186,146,232,211, 36, 28,120, 97, 22,
+200, 25,208,181, 3,202,104,218,182, 91, 24,247,199,182, 99,181,106,150, 17,246,220,137,214,117,205,225,112,148, 64,152, 76,214,
+148, 40,103,185, 92,171,170,226,246,238, 86,116, 54, 74,177,106,214,248, 16,216,239,143,108,183,235, 69,227, 98,173,149, 21,149,
+ 49, 11,253,180,170,100,173, 19, 67, 32,134,144, 93, 21,230,209,185, 49, 39,253, 25, 99, 51,106, 89,196,212,214, 88,166,105, 92,
+ 28, 0,243, 62,125,142, 95,205,176,136,252,245,200,133, 18, 51,154,183,100,202,194,206,201,135, 37,236, 73,127, 32,220, 41,197,
+240,104, 77,119,190,174, 59,223,249, 43,165, 48,206,184,127,115, 26,119,170,133,169,206, 83,181,251,252,139,104,136,231,151,122,
+206,131,125,250,243,230,206,104, 62, 12,173, 54, 20,174,164,176, 37,214,184,133,143,172,208, 39, 21,116,182,252, 68,239, 69,144,
+102,192,153, 68, 97, 19,133,133,210, 69,170, 18,234,210, 82, 59, 67,229, 52, 70, 71,146, 74,244,163,226,219,183,123,254,225,183,
+111,248,238,221,142,219,195, 68, 59,105,250, 73, 17,130, 40, 20,167,224, 25,130, 92,242, 62,137, 37, 35, 36,185,216, 67,138,130,
+153,140, 19,218, 70, 46, 47,214, 92,108, 86, 40, 13,227,208, 67,244,172,202,130, 50, 39,191,153,156,176,102,102, 5,189,209, 88,
+ 45, 1, 41,165,179, 20,198, 96,181,150,203, 49, 91, 50,140,145,189, 13, 90,157, 93, 28,144,244,201, 83, 28,179,254,123,166, 79,
+161, 5,242, 31, 1,235,196, 63, 27,147,226,208,245,188,187,187,231, 56,193,243,207, 62,229,226,242, 18,167, 13, 86,121,182,101,
+226,143,191,124,206, 39, 87, 53, 58, 77,220, 61,244,252,239,255,215, 47,248, 15, 63,127,203,168, 75, 66,222,207,206,249,224, 38,
+251,235,109,214, 9,104,228, 33, 82,209,163, 8,148, 70,243,108,187,225,139,175, 62,229,235,175,191,228,250,242,138,117,189, 33,
+ 38,232,186, 35, 47,158, 93, 80,150, 37,206, 20,248,193,211,119, 61, 93, 63, 50,250,192,254,216,137,162, 83,155, 71,221,245,121,
+ 44,105, 74,167,110, 19,222, 79, 57,123,146,187,114,218, 39,161, 30, 37,166,205,246,115, 53, 59, 16, 30,217, 14,212,105,188,175,
+206,126,189,108,223, 81, 79,158,249, 83,230,121,134,225,204,239,133,154, 59,102,254,201,168,212,144,102,145,231, 9,177,172,243,
+175, 49,119,229,234,108, 23,246,244,243, 83,249,247, 58, 37, 31,166,156,234,149, 5,155,233,177,245, 79,167,196, 10,248, 23,127,
+243, 55,252,201,151, 63,130, 97,144,213,151, 41, 24,163,226,102,127,224, 63,252,221,223, 83,111, 47,121,115,123,207,148, 18,175,
+111,110,217, 62,123,198,195,177,101,119, 60,112,108, 15,108, 55,107, 41, 14,182, 27, 54,151, 27, 30, 14, 59,146,145, 41,193,177,
+237, 24,166,145,132, 98,189,222,202,197,224, 61, 49, 37,234, 74, 84,200,227, 48, 44, 40,214,186,174, 50,122, 57,162, 85,162, 89,
+ 23,184,210,224, 39, 17,109,197, 24, 68, 20,149, 20,193,135,197, 87, 63, 39,172,197,152, 24,250, 33, 75,101,229,107,114, 60, 28,
+113,214, 98,172,140,149,125, 30,227, 26,101, 56,236,247,108, 47,182, 18, 20, 83,184, 60,142, 77, 40,101, 24,250,158,148,228,125,
+ 45, 42,139,113,142,194, 57, 14,251,157,140, 90,131, 23, 76,233,254,200,245,245, 11,246,251, 3, 99, 14,122, 1, 48,121,183,175,
+180,162,112, 22,173,116,238,226,227, 82,156,133, 16, 73, 33, 46, 98,184,102, 45,164, 58, 25, 87, 91,214,171, 85,246,113,107,250,
+ 97,164,174,106,194, 52, 82, 86,114,185,207, 92,130,105,148,220,237,170, 42, 24,179,202, 60, 38,225,116,172,215, 43,124,240,226,
+ 26, 72,121, 82,168,172,196,163,198,200, 56,140,172, 86, 21, 90,195,232,199, 37,119,160,235, 36,227, 98, 24, 58, 94, 62,191,100,
+183, 59, 16,124,100,232, 71, 46,182,235, 12, 7, 74, 76,121,146, 58,121,207,122,213, 80, 56,203,216,119, 92,110, 86,168,108,247,
+ 42,138, 18, 63, 5,186,182,229,217,213, 21,211, 56, 96, 92,198, 18,251, 0, 74, 51, 78, 35, 40, 40, 11,183,172,216,148,150,238,
+115, 28, 39, 41,220, 6,201,180, 40,203,154,162,112, 12, 67, 79, 93,150,164, 40,254,237, 38,199,174,250,105, 98,189,110,114, 66,
+102,202, 8,224,158,162, 44, 25,167,137,245,102,195,246,242, 66,104,155, 49,230, 16, 32,131,177,138,113,154, 40,235, 42,139,163,
+ 69,247, 99,114,206, 71, 85, 56, 74,231,100, 52,238, 36, 93, 50,229,247,201, 58,113,109,196, 36,250,172,185, 91, 54,243,243,140,
+146, 96, 32,107, 25,166,145, 16, 3, 85, 93, 19, 98,160,237,122, 76,118, 62, 20,149,160,209,167, 48,201,228, 72, 41,161, 3,230,
+ 53,147,143,225, 17,109, 93,171, 39,197,254,188,110,204,171,165,249, 93, 56,111,108,230, 70,241,164,126, 79, 79,248,210,234,108,
+119,120, 18,165,147,102,119,154, 18, 59,210,210,233, 36,149,187,153,211, 62,243,164,128, 63, 29,185,146, 5, 43,233, 70, 33, 6,
+116,152,187, 84, 75,202,145,150,230, 12, 47,171, 85, 18,106,155,202,152,198,156,154,100,141,201,138,117,149,137,116,138, 93,215,
+241,219,223,189,227,245, 93,203,148, 20,104, 75,145, 96,140, 17, 31, 71,220, 36,169,108,202,198,156,145,158, 48,198, 45, 54,170,
+ 16, 78, 89,241,179,234,181,237, 59,118, 15, 15,196,113,224,114,149, 41, 68,232,252,255, 7,157, 98,238,216,101,228,238,140,206,
+ 49,140,250, 81,135, 62, 83,231,102, 49, 70, 58,247, 32,235, 25,242, 35, 25,222,243,222,216, 24, 67, 76, 62, 35, 45, 69, 72, 50,
+ 78,147, 28,116,103,241,123,155,139, 45,207, 94, 92,227,180, 97,229, 12,133,105,248,242,178,228,229,229, 86,162, 15,167,196,119,
+175,110,249,251,159,127,199,160, 10,166, 56,143,109, 37,152, 38,229,139,199,204,211,133,194, 80, 22,142,170, 44, 88, 21,150,235,
+237,138,207,159, 95,243,197,103,207,217, 92,173, 32, 6,218,125,143, 87,138,207, 62,123,193,221,195, 91,156,147,172,234, 16,225,
+198,203, 30,125,189, 89,115, 24,238,152,188, 71,105,155,125,185,167,207, 91,163,136, 42, 61,138, 38, 61,165,250,165,243,120,192,
+217,175,176, 40, 52,244,217,168,254, 49,237,240,177,211, 98,190,162,165, 51,155, 69,121,241, 52, 1, 56, 71, 29,115,162, 50,157,
+ 34, 96,231, 44,130,244, 8, 23,155,126,160,173,109, 1,235,156, 21,172,167,252,244, 83, 18,250,211,228,183, 71,255,124,158,151,
+158,226, 82, 0,159, 2,111, 36,206,211, 42, 40, 82,226,155, 31,125,201, 95,253,236,143,152,142,173,248,143,157, 97, 28, 6,186,
+187, 3,175,111,222,177,222, 94, 18,129, 33, 76,236,187,142,168, 18,251,221,142, 55,175, 95,241,197, 87, 95,210,172, 42,142,135,
+ 29, 77, 93,211,212, 21, 55,183,183,130, 13,110, 26, 30,178, 96, 76,105,195,122,189, 34, 69, 89, 25,205, 98,162,105,232,100, 44,
+107,128, 62,208, 13, 61,211, 56, 96,157,163, 61,236, 89,173, 43,148, 46, 73, 73, 14,108,173,117,246, 5,171,197,253,145,136,184,
+236, 83, 22,146, 87,206, 59,200,249,246, 38, 91,246, 66,138,194, 52,127,246, 76,246,175,218,114,115,115,131, 54,210,121, 13, 83,
+159, 15, 99,233,112,251,126, 88,146,217,172, 53, 96,210, 98,183,138, 33, 81,184, 18, 31, 70,238, 31,118,146,107,238, 28, 55,183,
+239,228,247, 77, 73, 38, 90,185,208,118,214,161, 85,196,251,136,213,134, 62, 3,111,124,110, 70,202,178, 88, 2,176,130,140, 67,
+179,190, 49, 46,177,156,210,145,105,186,174,197, 24, 77, 89, 72,158,119, 93, 85,146, 84,150, 18,214, 58,142,199, 22, 87, 73,119,
+ 90,213, 37, 62, 4, 14,199, 3,155,245, 70,212,234, 70,229,188,115, 73, 70,147,128, 21, 56, 30, 91, 94,188,188,166, 31,123,124,
+136,140,222,163,180, 97,232, 7, 92,161,136, 42,114,113,177,102,191,239,137, 62,242,112,127,207,246, 98,139,209,138, 20, 2, 93,
+219, 17, 67,228,254,254,129,207, 62,125,142, 74, 50, 65, 25,199,145,122,213, 44,246,175,253,254, 64,123,108,105, 42,151,145,179,
+242,190,213,141,156,159,105,214,133,104,149,223,129, 89,136, 28, 81, 58,100,198,135, 40,220,235,230, 57,219,237,134,190,109,185,
+216, 94,112,127,127,159, 85,245,154,118,232,217,172,215,196,132, 76, 42,180,101,247,176,227,199, 63,254,138, 55,111,222,242,238,
+246,142,151, 47,159,139, 77,114, 85,115, 56,180,164,152,208, 89,200,219,254, 78, 4,115, 77, 83, 83, 20,154,182, 61, 46,228,203,
+ 20,163,112,248,131,103,154, 70, 86,235, 21,126,156, 64, 37, 54,235, 53, 54,137, 62,194,229,103, 82, 25, 13,206,201,196,200, 7,
+177,247, 82, 48,142, 19,195, 48,200,247, 98,106,241,105,202,129, 68, 9, 91, 24,234, 88, 73,129,153,196,213, 65,158, 96, 27,163,
+ 23,225,157, 60, 99,234,125,150,197,217,100,112, 70,148,159,219, 99,103,109,145, 4, 86,253,240, 69,224,201,175,158,206, 24,232,
+168, 15,116, 23, 31, 23, 10,205, 33,239, 62,155,237,125, 14, 97, 8, 25,227, 26,242,177,169,243,168,203,206, 23,163, 74, 88,171,
+ 79,248,203,172, 6, 15, 82, 3,114,236,122,118,199, 30, 31, 53, 81, 89, 60, 48, 4,207,224, 61,131,143, 12, 83,162, 27, 35,195,
+ 8, 62,104, 66, 48,120, 47,187,163,224, 65, 37,141, 74,154, 20, 53, 49, 57,246, 15, 61,119,183,123,186,182, 71, 41, 77, 85,175,
+112,101, 5,198,229,130,131,133, 66,100,173, 94,246,232,214,154,236,203, 21,154,144, 20, 32,153,253,158,227, 6,103,193, 94,124,
+132, 24,125,108,203,210, 90,227, 76,177,236,225, 10,171,229,161,139, 33, 79, 25, 52, 90, 23,124,242,201, 39, 92, 63,187,162,174,
+ 28, 23,235,154, 23,215,151,188,184,190,100, 85, 57, 72,129, 99,239,249, 47,191,126,197,187,125,135, 79,134,168, 28, 9, 33, 95,
+197, 60,153,137,134,133, 44,100, 76,182, 11, 18,176, 68,240, 3,253,241,129,187,155,215,220,125,247, 91,250,119,175,209,195, 30,
+167, 71,154, 90, 70,169,199, 99, 75, 85, 87, 52, 77, 45, 7,178, 19,228,229,177,149, 17,188, 84,154,234,241,216, 60, 95,150, 74,
+101,128, 10, 49, 63,168,137,199,162,119,245,113,197,166, 58,173,109, 78,151,161,154,207,142,101, 88, 46,191,183,122,100,148,123,
+ 42,116, 59, 7, 34,189,167,123,155, 41, 96,103,106,253, 68,226,108, 29,255, 97,139, 91, 74, 79,130,145,226, 34, 20,152,167, 8,
+143,104,141,203,190, 61,101, 54, 3,143,220, 35, 11,251, 49,157,168,124, 32, 22, 73, 19, 18,151, 85,205,255,252, 63,253,115, 76,
+136, 84,182, 4,101,153,162,166,157, 18, 15,237, 72,179,189,100,244,137,239,190,251,158,205,102,131,207,157,114,223,117,124,243,
+ 7, 63,225,249,245, 21, 54, 37,214,117,195,151, 95,124,193,237,237, 29, 26, 77, 83,175,184,191,125,160,169, 87, 92, 63,123,206,
+245,245,115,172,117,188,121,243, 86, 10, 96,147,249, 4,211,136, 31, 71, 82,240, 40, 34,235,166, 34, 76, 35, 67,119,164,112,134,
+166, 46,177,130, 58,195, 89, 17, 89,109, 54, 91, 98,228, 36,126,204,249,214, 67,230,112,135, 16, 22,118,255,172,120,158,131, 62,
+108, 22,164, 25, 99,164, 73, 48,154,231,207,159,139,240,235,120, 36,120,159,147,185, 38, 25,175, 23,133,196,106,230, 3,209, 57,
+ 71,219,117,146,218,150, 16,230,123,102,136,207, 30,233, 5, 67, 27,188, 96, 81,103,234, 93,190,108, 72, 49,199,145,138,127,216,
+ 58,121, 79, 77, 86,211, 79,163,100,120, 23,133, 69, 27,177,136,206,161, 82,242,255,113,203, 51,238,156,193, 57,131,210,179,248,
+ 88,209,182,157, 88, 1,157,164, 83, 22,133,101,242, 35,101, 89, 44, 4,177, 89,156,108,172,202, 83, 9, 69, 89,214, 12,253, 36,
+171, 4, 91, 80, 20, 18,162,114, 56, 28,209, 90,156, 5, 9,242,206, 89, 2,162,118,247,247,148,133,216, 16, 69, 0, 39,233,113,
+ 51, 32,200,135,192,243, 23,207,151, 78, 91,224, 43,129,182,237, 51, 58,182,100,200,190,236, 24, 66, 86,157,159, 86, 97,214, 22,
+ 57,154, 54, 91,213, 14,123,154,166, 17, 64, 76, 16, 0,141,192,104, 36, 6,117,179, 94,101,151,146,151,134, 39,196,229,235,170,
+141,226,242,106, 75,219,182,172, 87,141, 56,149, 66,128,220, 65, 87,133, 8,121,195,228,177, 90,214,130, 15,119,247,220,221,222,
+179,187, 63,176,174, 55, 34,220,107, 26,202,170,148,233, 77,233, 40,243, 26,193, 57,139,159, 60,251,221,145,174,237,101,138, 50,
+167, 5,138,125,138,170,146, 4, 56,173, 88, 72,162, 68, 89,149,212, 85,181,232,200,134, 65,120,245, 23, 23, 91,177,255,197, 64,
+ 89, 58, 98, 12, 57,141,141,197, 39,111,172,121, 36,146, 93, 88, 38, 79,198,238, 11, 15,229,172, 9,248,160, 80,238,247,121,106,
+ 23, 65,220,172,220, 77, 79, 77, 67, 31,191,208, 83,222,247,205, 22, 36,225,186,135,133,246, 54,121,225,184,203, 5,239, 51,170,
+ 54, 98,180, 36,158, 21, 86, 83, 58,123, 26, 95, 47,112, 26, 25,159,246, 62,208, 15, 19, 33, 41,124,202,162,163,217,142,167,192,
+ 39, 25,183, 15, 94, 49,122, 24,189,168,199, 99,210,104,109, 69,144,148, 71,192,218, 56,188, 23, 64,128, 53,142,117,179, 98,187,
+221,240,236,250,138,170,169,115, 32,140, 90, 70,191, 86,131,155,187,116,163, 40,156,193, 25,179, 92,246,250, 92, 36,167, 78, 83,
+136,185,178, 18,193,224,201, 2, 56, 31,224, 70,159, 40,118,133, 21,206,252, 56, 77,116,163,199, 39,205,190,155,112, 85, 35,135,
+152, 74,148, 78, 98, 90, 55, 77,201,213,102,133,115,226,237,125,117,123,224, 31,191,187,161, 15,146,228,134, 50, 40,107, 37,183,
+217,200, 33,226, 10, 75, 93, 21, 52,149, 21,129, 93,105,120,190, 46,120,185, 45,249,100, 91,241,197,117,195, 79, 62,185,224,143,
+190,124,193, 31,254,232, 57, 63,251,209, 53, 21, 45,253,221, 43,174, 54, 13,183,119,247,220,220,220,144, 72,172,154, 21, 85, 93,
+179,111,143, 34, 38,202,156,237, 15, 61,116,179,141, 81, 58, 97, 41,207, 72,115,102, 0,203,216,112, 62, 20,116,250,192, 51,166,
+206,158,189,229, 33,215, 39, 65, 93,190,228,103,161,217,233, 98, 63, 89, 17,231,164, 63,173, 79, 23,232,163,232, 85,212,114,215,
+158, 32, 57,138, 71,188, 55,245, 49,114,221, 73,100, 39, 23,242,153,232,238,236, 50,127,132,117, 72, 79,139,130,211,148, 64,160,
+ 40, 39, 81,156,209, 74, 4, 84,198,242,183,127,241,151,188,220, 92, 80,104, 77,215, 15,236,219, 17, 83,109,120,187, 59, 96,234,
+ 6, 83, 86, 84,117, 67, 81,148,188,123,247,142,203,203, 75,174,159, 93,243,233, 39, 47, 49, 70,243,221,183,191,229,120,216, 99,
+180,230,112,108,217, 31,143,148, 77, 67, 63, 76,248, 32,123,238,245,122,195, 97,127,228,254,238,129,186,170,105,170, 70, 20,228,
+147,167, 44, 69, 48, 89,151,181,164,150,132,200,186,169,105,170,138,194,185,220,201,140, 11,175,187,170,234, 60, 98,143,185,203,
+148, 67, 83,246,153, 39, 33,162,206,137,104,227, 56,114, 56, 28,208,198,176, 94,175,151, 47, 86,140,242,236,136, 48, 78, 72,100,
+ 48,239, 33, 69, 89, 63,191,127,222, 79, 11,121,108, 24,250, 60,114,134,139,171,103,140, 83,160, 27,228, 66,187,185,185,201, 99,
+ 80, 89, 12,105,163, 50,201, 80,103,110,121,204, 23,137,151,194,219, 57, 17,192, 33, 68,203,178, 20, 37,116, 8, 35, 90,167,236,
+217,142,121,252, 44,207, 94, 81, 56,182,155,117,134,138, 68,138,210,138,230,160,116,121,122, 40, 80,157,217, 37,226, 10, 39,225,
+ 33, 33,100,198,121,153, 45, 79, 9, 31, 38,202,114,166,164,201,207,223,239,247, 20,101, 77,219, 74,132,170, 49, 22,180,102,242,
+129, 20,161,109,123, 54,219, 45,147, 23, 86,185, 92,198,113, 17, 22,162,160, 31, 7,118,135, 3, 49, 41,222,222,188,195, 7, 9,
+ 36, 17,177,223, 28, 79,186,199,185, 18,133, 89,112, 35,174, 40,168,202,146,113, 28,114, 81, 36, 49,163, 83, 38, 3, 78,126, 90,
+152,229,235,245,122,121, 39,140,209, 84, 85,153,255,253, 42, 79,106, 5, 8, 6,113, 89, 99, 66,162,174, 43,166,113, 96,187, 89,
+ 17,166,137,190,237,184,220, 94, 48,116, 61, 85, 89,209,212, 21, 77, 93, 19, 67,192, 26, 75, 89,148,132,201, 51,244, 61,195, 48,
+162,141, 4, 86,105,163,169,234,114,217,163,123, 47,104,228,186,170, 49,198, 48, 12,227,146, 56, 41,171,178, 64,211, 84,185, 8,
+179, 98, 25, 86, 96,141,121, 4,167,169,170, 12,230,114,142,238,120, 92,144,186,106, 17, 76, 75,161,132, 82, 57,185, 78, 63,194,
+192, 46,246,197,167, 96,170, 15, 8,212,207,155, 65,251,223,162,220, 85,103,135,106, 58, 27, 11,136,149, 35, 62,198,116, 46,135,
+227,105,119, 60,143, 95, 5,222, 47,236,238,148, 4,237,154,146,176,160, 83, 78, 21, 51, 90, 68, 34,210,225, 74, 21,107,180,146,
+139, 62, 7, 8,144,196,103, 62, 77,129,126, 10, 57,248, 32,231, 25,107,185, 20,230,144,148,168, 12,218, 26, 98, 86, 13,167,217,
+255,155,245, 0,218,106,148,151,130, 37,248,137,186,190, 96,187, 42,129,137, 85, 83,178, 89,215, 52, 78,113, 8, 45,105,154,150,
+132, 49,157,215, 4,214, 74, 64,139,179, 6,103, 20,206, 40, 25,105,107,157,171,242,179,205,238, 34,120,200,106,230, 36,171,135,
+217,218,150,116,142,147, 77,154,152, 34, 42, 73,117,106,139,146, 99, 63, 49, 30,119, 60, 28,123,158,191,248,132,213,170,194,135,
+137,194, 36, 10,163, 88,213, 37,235,117,131, 66, 88,246,111,119, 45,191,187, 63, 18,181,203,197, 67, 58,185, 28, 84, 64, 39,176,
+ 24, 74,109,184, 94, 87, 60,219,148, 92,173,107,158,173, 43,158,173, 75, 94,108, 27,158, 95,173,185,184,168, 41, 10,131,115,194,
+201, 31, 70,184,187,109,169,147,163,174, 27,126,253,155,223, 50, 76,145,186, 94, 17,147,230,246,238, 1,148, 89,180, 1, 49, 43,
+202, 85,174,106,163,146,184, 85, 57,232, 4, 57,124,222,126,159,210, 78,243, 62, 57,239,149,181,122, 28,109,250,254, 3,175,151,
+ 46,253, 67, 40, 57,153,134,196, 39,161,172,143,145,174,139,149, 42,103, 98,203,165,175, 79,129, 70, 74,157, 73,104,206, 52,112,
+ 31, 44,104,115, 17,172, 37, 52,227,247,145,233,206, 43,238,211,190,236, 9, 82, 55,205,164, 70,149,109,129, 2, 24,250,228,234,
+ 25,255,253,159,255, 37,161, 31,208, 49,209,249,192,230,226, 25,191,125,245, 22,229, 42, 14,253,192,223,253,221,127,226,249,179,
+ 43,126,246,205, 55, 24,171, 41, 43, 73,166, 58,142, 35,223,189,250, 29,198, 73,177, 23, 83,226, 23,191,254, 53, 47, 62,255,140,
+135, 99,203,205,221, 61,171,205, 6,165, 12,175, 94,189,161,159, 70,174, 46,175,152,188, 23,167, 72,182,132,150,101,201,225,120,
+ 96, 10, 19,165, 45, 8, 41,230,164, 66,141, 73,145, 49,140,144,164, 67, 86, 73, 70,222, 18,118, 49, 73, 86,130, 62,185, 33,140,
+ 49, 76,147,167,105, 26,186,126, 0,242, 46,212,216,236,253,181,140,163,168,160,157,147,209,179,104,159, 18, 33,202,161,218, 52,
+ 13,247,247, 15,185, 51,118,121, 23,107, 88,175, 27,250, 73, 60,202, 33, 6, 25,157,135,192,177,237, 72, 9,246,199, 35, 41, 6,
+154,170, 18, 74,163,213,144, 2,198,234, 37,209,172,176, 70,240,183,198,100, 56, 77, 88,246,251, 90,105, 89, 47,152, 9,101,212,
+ 89, 72, 83,200, 41,114, 13, 15, 15,123,140,209,217,186, 37,244,202,210, 22, 89,197, 95, 98,244,129, 97,144, 20,180,113,236, 41,
+ 74,139,202,133, 64, 81, 88,198,113,228,197,139,231, 28, 14,191,206, 30,125, 17, 92,213,181,164,209, 73,161, 64, 38,197, 73,134,
+ 71,215,117, 56, 39, 35,243,103, 87, 23, 57, 50, 85, 48,167, 74, 65,229, 12,125,215,113,117,121, 73,219,118,116,131,156,195,211,
+ 52,137,130,220, 57,250, 97,144,175,119,240,108,214, 23,108,214, 91,190,251,237,247,178,138,200,205, 66, 72, 2, 99,169,235,122,
+ 89,113, 92, 94, 94,210,118,109,166,200,105,218, 99, 71, 85, 85, 75, 94,249,179, 12,196, 57, 28, 14, 24, 45,152,224,102,181,162,
+237, 90,225, 19, 84,130,242,118,206,113,119,119, 79,189, 90,211,212, 53,237,254, 64,219, 30,151, 88,212,194, 57,174,174,174, 56,
+ 30,219,188,174,209, 92, 93, 93,226,189,207,140,117,141,247,129,174,235,105, 86,149,144, 10,143,146,205,190, 94,175,217,239,119,
+ 40, 69,142, 88,213, 24, 83,100,209,230, 40,171,135,186,162,235,123, 80,121, 63, 63, 11, 87, 99, 36,120, 73, 93, 91,231,216, 87,
+ 65, 29,107,156,171, 8,147, 95,194,162,202,186,164,187,223,161,141,100, 42, 72, 30, 73,202,246, 78,114,206, 73,202, 36, 58,181,
+112, 56, 78,115,198,244,222,133,126,158,173,174,127,176,114,151,167, 66,162,247,173,108, 79,193, 25,143,157,112,167,238,212,103,
+191,250,228,229,133,158,166, 81,188,161,211, 68,240, 94, 66, 41, 98,128, 40, 63,198,124, 8, 27,235, 80, 90,216,184, 70,155, 44,
+190,146, 79, 53,166, 19,193, 75,205, 99,222,108, 53,144,241,157,252, 90, 41,206, 97, 23, 73,208,138,130,122, 17, 46,156,150,124,
+ 95,107, 20, 85,161,185,188,104,120,118,181, 97,181, 42, 73,113, 34, 38, 47, 73, 64, 38,239,165,103, 38,188,149,206,220,100, 69,
+188,157,195, 95,230,245, 65, 78,113, 59, 87, 53, 10,100,103,230,225,179,192, 28,206, 69, 15, 73,197,156,150, 36,170, 75, 87, 53,
+140, 65,241,234,230,142,178, 89,241,197, 87, 95,178,202,225, 13, 86, 43,170,178,144,220,223,178,198, 43,199, 97,132,239,222,237,
+217, 15,129,164, 29,164, 12,224, 73, 34,184, 50,100, 80, 73, 72, 84, 40, 54,206,114, 85, 58, 94,172, 44, 47,214,134, 79,215,154,
+ 79,183,154,231,171, 68,227, 70, 92, 49,129, 27,177,149,231,249, 69,193,231,235,130, 50,140, 92, 95, 94,128, 54,188,121,243,150,
+253,177,229, 97,127,224,208,118,114,113, 47,147,135,179,113,243,211, 61, 50,103, 76,119, 53,203, 5, 63,188, 47, 87,233, 35, 76,
+244,165, 75,231, 9,116,230, 67,127,175,150,174,251,156,169,160,158,162,139,159, 20, 3,167, 81,226,188,134, 74,203,184,252,247,
+ 37,188,171,179, 80,160,211, 52, 70, 63,250,253,230,241,243,121, 81,177, 96,112, 79,124,188,229,175,232, 69,141,173, 66,196, 42,
+197,159,255,241, 63,163,113, 37,126,242,116, 33, 18, 10,199,205,241,128,171, 87,244,227,196,161,237,216,108,182,124,246,217,231,
+ 60,127,126,141,181, 98,205,217,181, 45,175,222,189,131,194, 17,180,226,242,250,154,183,119,119,108,158, 93, 49,132,200,187,251,
+123,182, 87, 87, 40,109,184,189,191,163, 31, 71, 46, 47, 46,217,237, 15,220,222,222,101,160,135,128, 54,238,238,239,233,199, 9,
+146,216,144,156,117,148, 69, 41,145,203,182, 0,116,206, 54,144, 46, 81, 68,112, 99,238,144, 98,134,127,156,198,227,114, 97, 75,
+250,216,152,197,112,101, 89, 16,147,116,170,206, 73,222,180,188, 91,178,222,176,121,124,185, 94,175, 25, 51, 88, 68,118,244, 6,
+173, 21,235,237,134,174, 23, 95,113,204,151,255,102,179,230,176, 23,133,190,224, 63,131, 32, 97,103,191,181,214, 20,101,185,252,
+185, 66,214, 6,205, 29,107,221, 8,124,100,134,152, 44,191, 95,102,120, 24,163, 40, 74,183,112,236,171,178, 92,108,150,214,138,
+ 93, 79,105, 73, 97,155, 61,206,117,211, 96,172, 94,196,132,162,218,150,177,175,117,150,253, 65, 40,107,171, 85, 13, 89, 19, 20,
+ 99, 88, 32, 61, 51, 33,205,135,176, 0, 91,102,231, 64,225,100,127, 47, 90,131, 46,119,151,158, 42, 7,145,116,109,139, 54, 54,
+123,187,237,162, 55,218,110, 47, 50,180, 71,190, 79,227, 56,178,221,172,120,241,242,138, 99,123,200, 22, 68,147,173,104,162, 94,
+ 55, 26,154, 70,244, 6,214,136, 3, 97,182,153,121,239,243,168,125,196,100,199,212, 60,110,182, 86, 38, 29, 41, 39,158,173, 50,
+249, 13,160,172, 74, 72,145,105, 28, 50, 75, 65, 2,165, 30, 30, 30, 56,182, 45, 33, 38, 92, 33, 95,175,113,234,137,209,163, 20,
+ 98,123, 43, 75,214,235, 85,102,224,203,247,203, 58, 81,176, 79,211,200,118,187,205, 92, 3, 57,163,103, 77, 71, 93,215,139, 38,
+170,105,170,229,251,202, 89,132,120, 85,149, 34,224,204, 76,249,249,189,152, 87, 61,178,179, 31, 24,199,129,166,169,168,234,234,
+ 44,219, 64, 24, 8,195, 48,200,164,195,137,213,243, 60, 3, 66,101, 61,144,250, 39, 4,186,250,135,109,211,255,255,251, 95,156,
+ 5,115,222,203, 24, 62,248, 37,102, 53,120, 79,244, 19,193, 79,132, 12,147,152, 71, 66, 49, 36,249,200,102,124,109, 44,214,138,
+197,235,220,199,135,138, 11,237,110, 49,231,199, 83,134, 92, 82,103,251,253,148,233,118,139, 76, 95,102,176,214,137, 79,180,172,
+ 74, 82, 10, 28,143, 7,110,238,238,217, 31, 90,116, 81, 97,138,154,128, 70, 91, 39,136,200, 44,222,115, 86,231, 46, 29,108,134,
+ 76,204,251,246, 57, 52,129,165,200, 56,223,223,102,241, 72, 82,156,255, 81,208,121,252,103, 52, 74, 25,166, 0,247,251, 22, 76,
+193,231, 95,125,201,213,245, 21,133,211, 56,171, 40, 11, 67, 89,149, 40,227, 80, 69, 67,112, 13, 55, 93,228,237,126, 32, 32,204,
+106,155,243,121,151, 68,180,236,169,111, 10,203,166,114,172, 10,195,186, 52,108, 10,195,182,212,108,107,195,182,210,148, 46,161,
+109, 66,217,132, 42, 21,212,154,122,107,249,236,197,134,149,139,164,225,200,102,189, 33, 41,195,183,191,123,205,247,175, 94, 51,
+ 78, 97, 17,193,233,115, 39,197,233, 30, 60, 27,131,171, 71, 17, 44, 74,241, 36, 13,231, 44,177, 76,125,128,212,182,172,120, 88,
+132,109, 90, 63,185,156,213, 19,114,220,227,122,224,227, 20, 56, 37,207,219,163, 24,214,101,136,175,150, 15,245, 17, 54,195,226,
+ 33, 87,167,137, 69,122,164, 3, 76, 31,236,214, 79,250,131,184,160,136, 83,154,125,252, 10,147,144, 11, 29,197,245,122,195,215,
+ 95,124,201,238,110,199,221,195,158,253, 48,241,250,225,129,251,227,145,195,241, 64,138, 17,103, 52,127,252,205,207,248,250,171,
+175, 68,149,190,106,232,134,145,100, 44,183,135, 3, 83,130,155,187, 7, 30, 14, 71,154,205,150,119,183,119,124,247,234, 53,101,
+211,208,172,215, 28,142, 71,218, 78,144,173,251,195, 81, 46,186,162,200, 33, 24, 37, 93,223,102, 23, 73,194,229, 92,232,152, 47,
+217,152,164,144, 87,218,146,146,201,188,235,108, 21,202, 86, 46, 25, 75,171,133,196,184, 92,160,185,187, 85,103, 30,221,162,144,
+174,187, 46, 43,250,238,152,133,171,162,111,153,166,145,245,122, 37, 10,242, 73, 84,218, 46, 31,142,101, 89, 50,142,194,127, 16,
+203,212,192,122, 45, 23,242,177,109,179,125, 81,180, 60,101, 85, 16, 65,118,201, 94,236,103, 51, 64,219, 24,139,182,162, 27, 73,
+217, 22,149,178, 77, 74,212,254,114,137,235,101, 28,175,115,241,111,151, 80, 26,165,101,140,107, 44, 84,149,203,163,106, 15, 24,
+186,110, 96,187,221,144, 82,160, 44, 69,159, 51,123,249, 67, 8, 18,167,234, 5,152,179,217,108,242,250,129, 71, 32,171,148,210,
+130,106, 45, 10,183,232, 90,166, 65,210, 31,157,115, 18,191,154, 27, 40, 17,116, 9,223, 62, 1,251,253,195, 89, 96, 73,201,208,
+ 15, 57, 75, 93, 49,228,145,186, 82,224,195, 68,211, 8,116, 74, 66,178, 76,246,220, 75,202,218,213,213, 37, 83,246, 7,236, 28,
+ 24, 0, 0, 32, 0, 73, 68, 65, 84,155, 91,107, 25,135, 17,173, 68, 61, 62,179, 8,228,249,233,100,138,187,100,134, 39, 65, 12,
+215, 37,126, 18, 23,135,179,150, 24, 3,133,115,160,146,104, 52,178,117,216,100,150,193, 48,142,236, 15, 7, 89, 85,205, 57,247,
+ 74, 62, 38,239, 49,214, 18, 83, 20,173, 69,110,240, 92, 33, 44,255, 97, 24, 56, 30,143,121,207,175,115,188,182, 17,123,117, 46,
+ 54,187,174, 91,130,134,206,209,176,114,105, 11,187,126, 28,199,108, 73,150,223,179,235,132,115, 47,159,159,192,136, 68,251, 35,
+107, 40,249,112,143,104,116, 98, 51, 62,219,163,159, 37, 66, 62, 10, 66,251, 80,228,243, 63,121,161,191, 79,220,124,255,191,255,
+128, 30, 95, 47,187,206,211,165, 42, 35, 41,185,192,163,159, 8, 97,202, 73, 86, 39, 81,140,207, 31,131,159,178, 26, 54,230,170,
+ 52, 46,232, 76,147,119,207, 74, 37, 81, 84,231,161,167, 36, 28, 25,162, 50,143,214, 5,234, 28,137,123,246, 99, 72,154,164, 12,
+205,122,133,173, 74,238,119, 59,246,135,150,182, 27,232,199, 64, 55, 65, 80, 5,174, 90,163,141,147,236,185,101,247,173,150, 61,
+186,181,162,124,215,249, 50, 95,240,131,231, 37,210,217,229,150,146, 58, 83, 69,207, 32,158,184, 20, 33, 17, 69,215,143,220,220,
+ 62, 48,248,200,151, 95,255,132,151,159,125,130, 54,114,232,203, 46, 95,198,243,182,172,136,166,192,109,174, 73,197, 26,183,186,
+228,242,197,103, 96, 12,167,248,100, 5,218,160,180, 69,103,159,127, 85, 58,170,194, 80,149,150,170,116,212,101, 65, 85, 22,114,
+ 32, 26, 3,198,145,116, 65,114, 37,169, 48,168, 70,179,125,222,112,181,118, 60,188,249,142, 20, 2,235,237, 37,247, 15,123, 30,
+118, 7, 89, 80,167, 51, 53,251,163,192,158,133,104, 32,172,254,217,135,157,212,227, 77,181, 58, 71,196, 62,206, 65,255,125,250,
+ 13, 84, 58, 41,217, 31,161,226,226, 25,132, 70,189,215,229,127,248, 98, 85, 31,129, 32,191,255,241,126,242,234, 44,190, 83, 75,
+229,127, 18,241,229,127, 62,231,213,127,224, 37, 77,138, 71,207, 6, 57, 43,221,100, 93, 71, 83, 20,252,245, 63,251, 83, 54,101,
+141, 31, 60, 9, 67,208,134, 67, 63,210, 15, 35,187,251, 7,234,194,113,177,217,240,226,249, 53,135,221,142, 87,175,126,199,205,
+205, 45,191,250,205,111,120,125,123, 71, 31, 19, 73, 27,124,130,135,251, 29,199, 99,203, 56, 5,214,155, 13, 85, 85,113,216, 31,
+ 48,198,176, 90,175, 41,138,130,113, 26,152,252,136,143, 30,180,236,186, 83, 30, 43,110, 47, 55,140,211,144,191, 7, 30,148,144,
+223,180,145, 11, 96,154, 60, 68,141,179,197, 35,241,172, 49, 74, 58,167,179, 73,213, 44,168,149, 78,246, 36,164, 19, 1, 82,202,
+ 99,252,115,109,134, 98,204, 29,170,160, 54,133,223, 45,225, 50, 50,237, 26,134, 33, 95,238,242,227,197,197,150,253,126,151,187,
+170,152, 33, 37,141,164,173,229,169, 98, 89, 85, 28,187, 78,242,180,115,210, 96, 89, 86, 98,115, 50, 46, 79, 16, 21,174,112,104,
+ 43,103,205, 12, 2, 57, 79, 1, 59,145,237, 36,194,213, 24, 81, 97, 23,165, 69,105,201, 35, 87,104,186, 86,132, 85, 69, 97, 41,
+ 43,217,163,207,200,208, 34,147,209,166,113,134,119,201, 25, 40,187,102, 73, 44,235,251,126,233,164,143,199,227,137, 3, 16,229,
+162,136, 33, 46,201,151,117, 93,139, 39, 61,219,255,154,166,206,136, 92,185, 88, 11,231, 24,135, 65,118,238, 62, 82, 20,242,121,
+247,125,135,177, 10,165,162, 96, 94,167,129, 41,140, 89, 63,148,117, 50, 49,224,172, 68, 50,203,222,223, 83,213, 85,190,224, 93,
+118, 63,148,203,243,174,181, 94,220, 1,211, 36, 83,150,170, 42, 49, 54,175, 39,242,154, 32,132,128, 81, 48,141, 35, 69,233,132,
+ 53, 63, 14,242,181,207,205, 80,219, 15,244,131, 23,205,213, 48, 49,102,213,250, 48,141, 40, 99,151,226, 90, 44,113, 82,184, 72,
+122,218,192,195,195,142,178,172,242,197, 46,221,248, 56,246, 39,196,117,126,175,103, 77,200, 60, 9,217, 29, 14, 68,230, 9,142,
+ 89, 28, 75,125,223, 11,216, 6,177,105,166,236,151, 63,182,173, 92,224, 89, 71, 34, 83, 41, 41,116,103,251,221, 76,210, 83, 31,
+ 40,248, 63,184, 50,252,160,250,253, 3,184,204,199,147,206,243, 67, 46,125, 16,251,245,126,220,197,185, 98,239,244, 2, 46,140,
+247, 28,226,178,112,215, 57,101,172, 79, 49,228,140,243,132, 79, 66,131,155,124,202, 0, 25,201, 24,151,172, 91,117, 22,157,153,
+ 63,249,185,229,205,149,137,202, 99,112,163, 77,174,188, 13, 49,106, 98, 50, 68,164, 27,118, 69,201,106,179, 37,248,200,237,221,
+ 3,109, 55,226, 3,248,168, 24,167,196, 56, 65, 50, 5,182,106, 64, 91, 17,158, 41, 17, 61,232,249,215, 55, 57, 90,245,236,243,
+ 94, 48,176,143,140,213,105,137, 88,140,103, 95, 55,129, 72,136,197,109, 24, 38,238, 30, 14,124,255,246,150,135, 67,199, 23, 95,
+126,205,143,127,242, 7,148,249, 65, 86, 68,234,178, 92,196, 72,226,101, 52,152,106,205,103, 63,253, 35,254,230,111,255, 57,159,
+124,246,153,216,130,146,164,192,165, 51, 46,189,209, 6,109,245,162,188,117, 78, 2, 24,202,194, 81, 88,135,182,150,100, 29,201,
+ 58, 84, 81,162,138, 18,170,130, 84, 23,216, 77,193, 39,159, 92, 16, 71, 73, 77,186,185,189,231,120,108, 23, 95,250,172,106, 84,
+191,119,220,163, 79, 10,245, 71,183,227,227, 78, 61, 61, 42, 8,210,239,153, 39,157, 43,218,210, 89, 23, 30,255,137,202,243,241,
+165,190,252, 10,191, 47,148, 37,157, 62,206,203,132,152, 5,154, 74,157,208,191,179, 16,243, 60, 11, 93, 41,253,145, 81,191,250,
+ 96,178,219, 66,148, 74,162,229,168,141,229,191,251,179, 63,227,143,127,250, 53, 26,185, 44,180,113,188,125,251,142,103, 87,215,
+ 20,206,242,197,231,159, 82,151, 5,171,170,224,251,239,127,203,221,253, 29,227, 56,241,221,171, 87, 68,165, 88,109,215, 66, 0,
+ 68,241,252,250, 57, 62, 38,108, 81, 9,198, 85, 41,238,238,238,184,187,187, 37,166,196,126,191, 19,127,109,126,150,173,181,116,
+125,199, 20,132,127, 61,211,230, 70, 63,160, 76, 66,105, 57,200,125,158,186,137, 45,168, 16,108,112, 98, 25,143,235,243,201, 74,
+254,156, 79,216,228,132,205, 46,146, 20,211,233,114, 82,138, 20,252, 34,196,180,198, 44,171,170, 25,116,165,206, 14, 81, 17,127,
+ 9,106,118,222, 99,111, 54, 27,166,105,162,239,250, 76,176,148,139, 85, 68,116,131, 20, 14,214, 49,100, 56,136,143, 49,135,219,
+200,251,174,140,166, 40, 5, 92,226,172,205,211, 2, 75,225, 28, 85, 85,231, 14,172,144, 98, 65,219,101,141,115, 78, 74,155, 67,
+174,172, 49, 2, 35,241, 1,157,199,212,206, 57, 18,113, 73, 39, 75, 73, 84,234, 85, 93,163, 52, 11,178,214, 57,137, 12,157,199,
+235, 51,113,141,108, 1, 30, 51, 28,101, 86,238,143,163,240,207, 31, 30,238, 69, 32,102,205, 82, 48, 79,211,196,106, 45,223, 75,
+149,157, 21,115,100,178,202, 86,212,170,170, 25,251,129,105, 24,151, 36, 54,242,212,105, 24, 6,170,170,194,231,207, 49,197,112,
+ 10,109,138,178, 70,245, 62, 44,162,191,148,247,239,115, 17,183, 90,205,233,108,210, 29, 79,227, 68,233, 10,170,162, 92, 84,245,
+ 42, 87,113,137, 72,244, 98, 19,108,154,102,105, 6,231,203,121,213,172, 49, 90,214, 62, 49,230, 21, 69, 72,244, 93,207, 56,100,
+116,173, 41, 40, 93, 33, 86, 63, 39, 22,231,105,242,180, 25,204,147, 50,228,104,190,124,103,174,255,140,243,158,215,106,198, 26,
+ 73,125,235,123, 98,138, 11,120,104,118,180, 72, 33, 0,198,216,133, 18, 87, 87,242,156,197,224,153, 6,137,165, 53,153, 93,225,
+ 39,177,218,169, 60,133,122,234, 71,255,152,187, 76,126, 78, 86, 21,167,108, 25, 80, 79, 66,171, 84, 74,168, 40,153,229,179, 26,
+ 84,250,195, 32, 88,206, 89,181, 60, 39, 80,171, 51,184, 72, 2,163,236,242, 47,181,150,112, 17,171, 53,202,136,124,223,204,150,
+ 47, 99, 23,115, 61, 74, 19,146, 34,228,205,111, 68,147,180, 33, 68,205,228, 21, 83, 80,120,159, 59, 49, 36,200, 37,198,180, 92,
+ 10, 82, 92,201,159, 45, 18, 73, 90, 14, 88,163, 11, 10, 91,160,141, 67,153, 18,116, 73,210, 13, 73,215, 36, 10,140, 21, 69,174,
+138,138,195,174, 99,232, 35,253, 24, 25,199, 64,244, 66,155,235, 71,207,113,242,164,178,130,178, 38, 26, 71, 68, 84,244, 38, 43,
+202,103, 30,186, 49,106,217,247,201,206, 48,157,216,239, 51,132, 4, 73, 95,155,115,231, 39, 47,130,191, 24, 12,227, 0,247,247,
+ 3,191,249,221, 3,239,246,158,235, 47,126,194, 87,127,240, 13, 46, 31, 58, 67,223,163, 82,164,180,150,202, 90,234,194, 97,173,
+ 34,229,108,231,205,167,159,243,197, 79,127,140,138, 19, 58,142,104,147,136, 38,130, 78,216,148, 48, 49, 98,146,194, 26,151, 65,
+ 57,154,210, 41,106,151,168, 85,160, 52,137,100, 21,201, 42, 40, 52, 84, 10,138, 0,133, 34,214, 37,106, 85,112,113, 85, 81,149,
+134,215,175,126,199, 63,254,227, 47,216, 29, 15, 96,100,202, 96,180, 91, 96, 54, 26, 37,122,136, 71,112,162,120, 6, 41,146,239,
+181,143, 42,247,237,130,120,209, 42, 46,126,111,209,202,169,179, 34, 81, 47,163,250,167, 9,109, 42,119, 11,143, 98, 89,159,168,
+222, 31,187, 51, 36, 61,106,233,140,207,104,111,239, 93,236, 42, 61, 81,211,255,158, 91,255, 9,151,249,188, 72,153, 1, 60, 31,
+179,131, 62, 77,111, 59, 23,156, 58,165,249,211,159,126,195, 95,252,244, 27,202, 4,109,123, 32,106,197,232, 61,127,244,245,207,
+184, 40, 43, 94, 94, 61,227,208,237,177, 86,113, 56, 60,208,142, 3,161,112,252,195,111,127, 67,212,154,102,189, 18,177,105,127,
+ 68, 5, 79, 34,210,251,145, 87, 55,111, 9, 73, 44,166, 41, 38, 46,175,174,168,155,154, 16,229,130,118, 69, 65,210,134,110, 20,
+ 1, 85, 89,150,148,149,112,211,135,238, 72, 74,146,114,165,108, 65, 55, 76,178, 75, 31, 61,165,171,136, 62, 17, 39, 57,152, 67,
+ 24,113, 78,137,192, 45,197,101,114,193, 25,195, 95, 10,226,217, 62,106, 33,202,193,183,221,110, 57,180, 29,202, 88, 70, 31,233,
+ 71,143, 82, 18, 37, 59,243,245,157,115,178,171, 77, 1,103, 20, 42, 5,140, 81,196,232, 89,111, 86,148,182,224,184,235,208,201,
+160, 34,148, 86,179, 94,173, 24,186,145,228,229,249, 51,198, 50, 76,129,148,223,115,208, 66,216,212,185,189,137, 30,103, 64,235,
+148, 51,186,101, 93, 38,221,187, 93,116, 4,202, 56, 38, 47,148,187,152,228,253,112,206,209,212,181,140,164,243,185, 17, 82,206,
+106, 79, 98,133,138, 33, 80,216, 2,103, 75,140,118, 28,246, 7, 89,125, 84, 5,129,136,143, 94,152, 1,128, 79, 57,255, 61, 23,
+ 30,174, 40,112,198, 18, 70,161,237,105,163, 37, 44, 70, 43,166,168,232, 70,207, 48,141,140,211, 72, 76, 98,131,243,222,179,110,
+ 42, 74, 39, 74,236,126, 28,169,154,154, 46,135, 56,169, 24, 41,180,101, 85,173,196, 98,150,245, 16, 72, 80, 32, 90, 41, 10,107,
+169,235, 58, 79, 96, 12,117, 85,229,130,204, 44, 60, 14,163,181,140,181, 13, 76,209, 11,170, 59,163,114,235, 85,141, 45,132,220,
+118, 60,182,196,164,228,115,201, 19,208,178, 48, 4, 21, 40,234,134, 99,219,209,182, 29,117, 85, 80, 87, 37, 4,143, 31, 6, 10,
+227,136,126,194, 25, 69,229, 74,156,182, 16,160,176,142, 85,221,160, 81,132, 97,160,107, 15,217,185, 96,233,186,145,186, 94, 1,
+154,113,156,242,206, 95,244, 1, 77,211,200, 26, 70, 89,134, 94, 82, 40,103,151, 64,140, 30,173,160, 46,157,216,240, 98,192,144,
+ 40,109, 65,229, 74, 86,171,149, 36, 14,118, 3, 49, 40, 42, 87, 97, 16,199,212,102, 85, 82, 21, 22,167,228,207, 99, 85,166, 86,
+133, 8, 62,162, 83, 66,167,199, 56,245,217, 53,117,142,141, 61,255,159,253, 96, 20,228,147, 94, 72,125,228,223, 63, 78,187, 58,
+237, 76, 23,105,220,114, 88,105,156, 19, 1,136, 83, 54,119,172,210,225,107, 76,190,232,237,114, 1,206,202,248, 57, 58, 83,144,
+124,230,212,225,103,172,168,248,189, 5,249,184, 4,173, 44, 27, 72,185,104,149, 41, 80,166, 64,219, 10,227,106,180,115, 24,227,
+ 36,108, 32, 95, 52,204,219, 50, 37, 40,217,221,254, 72, 24, 71,140,133, 36, 12, 2,156, 53,248, 28, 43,234,138,154, 41, 25,172,
+ 45, 1, 67, 80, 19, 33,223,214,115,128, 11, 90,161,149,193,156,209,203,164, 27,136,121, 30, 31,137,103,173,158, 28,104,179, 61,
+ 89,209,247, 3, 55,199,142,119,247, 59,162, 46,248,209, 31,252,148,175,191,249, 6,165, 21, 15,119,239, 8,126, 20, 32,143,147,
+ 17,185,120, 55,201,144,140,148,149,153,146,131,252,246,205,155,247, 84,146,179, 14, 65, 33,107,131, 98,166,224, 25, 65,239, 22,
+214,138,216,199,106, 40, 12,170,116, 80, 89, 40,228, 80, 32, 42,168, 52,205,197,154,205,118, 69,138,119, 76,113, 34,101,106, 20,
+225, 44,156,132,152,175,117,253,232,217, 72,105, 6,187,164,101,106,241, 62, 34,254, 49, 97, 70,205,113,187,255, 68,167,125,206,
+162, 21,241,232,185,255,252,195, 33, 44,106, 78, 64,123,178, 38,120,175, 50, 78,234, 17,193,238,233,159, 84,167,143,115, 26,222,
+ 83,172,126,160, 40,120, 36, 64,157,119,204, 49, 45, 0, 19, 69,226,179,231, 47,249,147,159,126,195,186,172, 80,147,196,237, 22,
+174,164, 40, 43,140,179, 28,218,150,113,236,233,251, 3,101, 97,121,115,115,195,143,126,242, 19,126,247,230, 45, 30,201,126,238,
+135,158,187,183, 15,148,101,193,171, 55,175,217,108, 46,153,124,224,197,203,151, 12,195,200,205,205, 13, 87, 87, 87, 56,231,120,
+119,115,195, 56, 77,108,235,102, 9,232,216,110,215,104,165,216, 63,220,179,222,172, 24,253, 68, 89,174, 24, 38, 67, 64,172,104,
+ 83, 55,202,104, 63,239,109,167,105, 98, 28, 61, 85,178,212,171,117,246,141,203,138, 66,246,146,137,201, 79, 75, 17, 51,227, 86,
+ 85, 38, 19, 21, 69,185,192,128,230,105, 65, 68, 98, 45,231, 52,183, 25,137, 90,228, 46,125,177,250, 88, 67, 24, 6, 54,219, 85,
+238, 96,167,101, 5,102,157,165,105,106, 72, 73,212,205,200,136,116,244,147, 8,151,230, 78,119, 9,134,177, 25, 70, 50,177,217,
+172,177,214, 48, 12, 19, 70, 91, 18,211,130, 14,141,209, 46,235, 9,239, 35,219,237,134,195,113,143, 43,156,160,101,179, 70,160,
+109,143,148,101,195,205,253, 61, 77, 83, 47, 35, 93,107,100, 28, 93, 88, 75, 23,134, 44, 44,158,100,231, 30,131,128,164,141, 76,
+ 13,172,113, 76, 81,138,168,174, 27,184,188,220,160,213,105,215, 94, 87, 21,109,215,162,173,101,200,221,122,200, 88, 83, 97, 3,
+ 8,143,126,242, 35, 77,179, 34,198, 68,219,118,236,246, 71, 62,255,252, 5, 4,207,177,109, 89,173, 87,184,178, 64,145,112,218,
+112, 8,129, 85,221, 8,103, 36, 91,214,230,119,102,254,123, 17,236, 57,148, 53,144, 60, 73, 37,241,241, 79,129, 24,167,156,138,
+ 54, 82,215, 37,164,176,228,169,199,188,199, 22, 86,126, 73,140,129,209,143, 18, 38,133,163,200,208, 30,103,215, 2,196, 41, 11,
+140,113,164, 40, 83, 3,173,221, 41, 99, 35, 7,238,104, 13,235, 77, 67,244,114,113,119, 93,183, 76,114,198,113,226,242,242, 50,
+115, 18,124, 46,174, 38,234,186, 22,242,165,210,121, 5,144, 56, 28, 14,249,207, 36,130,199,213,106,181,172,217,166, 32,176,154,
+152, 34,109,219, 99,243,189,115,123,123,143,115, 69,102,199, 87, 56, 87, 82, 58, 69, 10,173,172,163,125, 88, 68,213,231, 13,192,
+121,102,250,204, 52,153,119,236, 79,155,134,255, 6,248,204,249,233, 23,159,140, 85,159,140, 74,211, 41,243, 36,165,136, 65,229,
+189,143,197, 90,249,162, 91, 83, 8, 84,193, 90, 73, 72,179, 89,124,146,109, 17,198, 22,121, 95, 46,150,145,217,222, 38,240, 22,
+ 9, 95, 81, 90,236, 55, 49,219,196,150,191,230,104, 76,109, 49,174,166,168,182,216,114,139,182, 13,145, 18, 31, 53,163, 79,244,
+163,151,209, 90, 10, 76,105,162, 31, 91, 14,135,221,146, 3, 62,250,204,139,143,146, 59,156, 25,164,248,144,232,199,200,144, 52,
+163,113, 4, 91, 49,105,203,148, 83,235,180, 57, 19, 56,204,251,165,121,154,145, 87,203, 81,130,104, 9, 41,102, 81,135,162,159,
+ 34,251,206,243,246,225,200,111,222,222,243,237,125,199, 84,110,248,241, 31,255, 9, 95,255,244,103, 40,173,216, 61,220,113,216,
+221, 19,167, 17,151,253,187, 58, 91, 55,156,179,178,203,119, 26,109, 21, 49,120,238,111,239, 56,118, 61, 9,157,163, 59,207, 90,
+ 83,228, 1,181,138,172, 9, 0,155,167, 11,198,106,148,213, 40,103, 80,133, 5,103,193, 26,112, 6, 85, 90,116, 97,160,208,216,
+166,164,110,202, 92,132,165,101,125, 46, 15,221,217,165, 13, 79, 68,110, 89, 0,166, 30,203, 40, 5, 70,115, 46,150, 59, 75, 95,
+225,195, 54,142,243,212,179, 71, 53,128, 74,103,233,111,231,158,241,143,232, 62,222, 27,125,115,102,143,211,143,132,125,231,208,
+153,244, 3,197,164,231, 10,119,165, 62, 62,126,127,111,175, 30, 79, 90, 1,157, 18,165,210,252,205,159,253, 41, 54, 6, 24, 39,
+136,137,178, 40,120,249,201, 75, 17, 2, 17,233,134, 30, 79,100,125,121,197,183,175, 95,211,135,192,253,241,200, 67,123,228,229,
+103,159,114,191,223, 81, 86, 21,174,112,248, 40, 73,134,104,197,197,229,197, 2,126,249,228,147, 79, 24,199,145,251,124,209,108,
+ 55,155, 44, 8, 21, 21,250,118,187,149,177,124,123, 92, 92, 45,194, 62, 40, 8, 94, 70,157, 9,217, 77,219,162,160,168, 74, 48,
+ 90, 0, 83,106,126,206,220,242,117,152,199,146,230, 44, 74, 23, 18,211, 56, 97,141, 93, 46, 64, 87, 88,180,134,170, 46, 64, 69,
+166,124, 65, 9, 84, 69,124,198, 40,150, 48,151,186,172,150,221,228, 52, 73,160,134,247,158, 99,215,201,133,168,193, 22,142,106,
+213,112,191,127,200,175,185,206,162,176, 17,235,236,162,200,158,245, 60, 49,158,132, 75,195, 56,101, 93,140,196,123, 54,117,147,
+149,203, 2,204,138, 25,173, 26, 99,164,110,234, 5, 5, 58, 14,125, 70,193,214, 34, 20, 14, 98, 47,243,211, 72,223,119,108,183,
+219,101,244, 11,145,170,176, 20,214,226,199,145,117,211, 16,131,164,210,237, 15, 7,202,162,202,251, 88, 39, 84, 74,163, 24,199,
+ 9,109, 13, 62, 73,113,223, 52, 13,101, 89, 81,184,130,169, 31,240, 99, 88,120, 9,235,213, 26,239, 39, 14,135,163,196,221,230,
+ 51,119,181,106, 40,139,130,190,159,176,182,164, 27,196, 10,104,157, 99,244,226,177,158, 11,144, 89,204,120, 30,214, 53,199, 73,
+ 75, 88,143, 7,212,226, 82, 50, 90, 83, 20,178, 19, 95,158,247,152, 50, 54, 86, 86, 19,101, 85, 18,147,140,206, 39, 31, 48,198,
+178, 94,109, 25,251, 1,165, 18,151, 23, 23, 66,156,235, 90,121,150, 67, 96,204,133,207,156, 11,178,106,202, 12, 62, 18,171,177,
+ 66,210, 63,203,186, 18,151, 67,146,244,203, 72, 98, 10, 35, 15,251,123,148, 81,148,101,181,236,185,103, 21,251,252, 12,205,239,
+179,247, 62, 23, 36,158,155,155,219, 12, 10,146, 9,229, 48,244,226,117,183,194, 14,152, 5,118,242,220,192,126,215, 74, 26,168,
+151,239,131,117,197, 2,185,250, 80, 19,112,114,132,216, 69, 68,247,116, 44,175,181,254, 33,151,250,249,152,113, 38,127,125, 64,
+ 40,148,206,108, 71,231,135,109,134,137,232,188,203, 22,171,130,168,214,173, 41,176,249,139, 32,182, 4,139,177, 14, 84, 38,175,
+ 41,185,192,141, 54,185,147,211,203, 69,175,179, 7, 58, 68, 73, 47,243, 57,115, 92,165,179,131, 55, 9, 99,119,138,158,193, 79,
+ 28,135,142, 99,223,114,232, 90,218,161, 99,152, 6,250,161,163,239, 90,250,174, 99, 26,199, 60, 26, 19, 21, 44,218, 16,114,154,
+123, 0, 66, 76,167,145, 75,138,140, 62,210, 77,145, 46,105,186,100,232,177,116,104,198,148, 73,250,234,188, 19,147,219, 78,198,
+140,226, 67,140, 73,198, 96,253, 24,217,183, 19,119,251,129,215,247, 71,126,245,230,142,183,237, 68,115,253,146,111,254,228, 47,
+120,254,233,103,116, 67,207,237,205,141, 96,107, 39,159, 95, 8, 1, 27, 56,103,176,206,136,176,205, 24,193, 82,150, 34,112, 27,
+134,145,161, 31,243, 78,215,160, 49, 39,224,201, 98,179,146, 37,135,205,190,122, 99, 20,198, 25,140,179, 96, 52,209,104,146,157,
+ 19,108,242,135,213,130,218, 44, 21,117,105,177,250, 68,111, 63,239,186,213,226,237,214,185,103,143,143,186,245, 83, 48,197,217,
+173,156,211,214,212, 19,101,250,227, 86,254,247,167, 3,159, 4, 34,241,204, 2,247,254,114,255, 28,230,240,168,211,215,122,169,
+202,207,105,120,115,165, 44,203,157,180,124,196, 31,112,173, 63, 21,197,241, 3, 98, 91,117, 6,122,204, 95, 34,147, 18, 95,125,
+254, 57,219,170,162,113, 5,165,115,212,205,138,178,174,121,119,251,142,164, 19,175, 94,191,166,237,123,124,140,188,187,189,195,
+ 86, 53,151, 47, 94,240,155,239,191, 39, 26,197, 47,126,243, 43,186,105, 96, 12,130, 33,222,239,143, 84,205, 10,107, 29,125, 55,
+176,123, 16,225,216,219,155,119,130, 99,237,123,186, 94,200,104,251,195, 30,109, 36,196,163,235, 58,218,246,192,229,229, 5, 81,
+193,118,189, 65, 39, 77, 12, 48,244, 99,198, 65, 71,172, 43,100,165,150,197, 82,206, 89,172, 43,240, 17,198,113, 90,222,171, 16,
+ 2,201, 7,194, 56, 17, 38, 79, 97,100,138, 55, 3,138,170,178, 32, 70, 47,226,218,232,177, 86, 58,204,224,195,162,108,159,233,
+148,214,101, 11, 88, 38,189,137, 94,103, 6,157,136,254, 64, 41, 41,174,147, 98, 17,204,157, 3, 63, 66, 12,152,194,102,225, 82,
+ 34,248,144,197,186,242,163,182, 5,221, 32,106,246,182,237,168,202,154,152,146,176,198,203,114,201, 87, 72, 9,134, 97,204, 92,
+244, 60, 46, 79,129, 58,171,183,101, 95,171, 8, 81,254,221, 60,138,154,213,238,126,156,240,163, 4,189, 92, 94,110, 23, 65,113,
+ 89, 8,179, 60,228, 75,172,170,170,211,133,105, 36, 38,117,158,238,132,140,124,189,216,110,169,202, 82, 10, 33, 5,227, 48, 81,
+231,162,162, 44, 27,172, 53,236,118,187, 37, 68,229,120,236,152,166,128,159,100,215,111, 93, 33, 57, 26, 94,200,126,253,208,179,
+170,106,166, 97,196, 40, 77, 83,175,169,170,250,145,125,211, 89, 39, 93, 44,167,247,122,222, 77, 23,133,156, 89,201,123,156, 22,
+ 17, 90, 89, 22, 75, 44,235,255, 71,219,155,246, 88,118,165, 87,122,107,143,103,186, 67, 68,206, 36,171, 52,203,144,208,176,253,
+179, 13, 27,253, 73,112,255,130, 6, 12, 72,238, 6, 4,184, 33,187, 27, 82,151,170, 74, 85, 69,102, 70, 70,220,233,140,123,242,
+135,247,221,251,158, 27,140, 44,146, 82, 53,129, 68, 50,201,204,140,136, 27,231,238,253, 14,107, 61,139,254, 46,197, 76,129,136,
+ 97,162, 66,108,187,217, 98,236, 7, 72, 9,188,122,117,207,211,134,133, 58,103,208,180, 39,198,196,224,152, 5,214, 90,180,109,
+ 77, 69,161,209,180,138,140,145,191, 79,215,162, 18, 0,119,239, 3, 66,244,104,219,166, 4,188,228,149, 80, 78, 12,204,224,164,
+245,165,250,249,243, 35, 82, 74,104,219,174,216, 28,201,175,159,144, 16,176,221,110, 86,170,118,186,171, 22,231, 48, 47,203,141,
+215, 60,198,116, 83, 24,173,199,236, 47, 49,223,215,211, 79,141, 31,219, 97,176,183,240,234,199,185,149,205,221,166, 98,137,188,
+144, 47,113,163, 69, 60, 38,115,199,173, 33, 84, 14, 20,209,188, 11,207,214,180, 76,248, 98, 17, 85,186, 6,166,232,178,235,100,
+ 86, 46,200, 55, 26,179,218, 61,177,138, 58, 81,151,140, 20,225,221,136, 0,199,159, 7, 5, 49,228, 93,130,228,170, 54,165, 8,
+173, 64,185,182,200,116, 50,185,130, 11,128,131, 86,136,226,101,181, 64, 12, 14, 83,140, 36,150,147, 26, 34, 42,192,211,248, 89,
+203,116, 77,188,131, 64, 44, 73,113, 36,244,155,151,132, 97,138,152,166,136, 83, 63,227, 60, 76, 56, 79, 19, 46,139, 67,181,219,
+227,253, 87, 63,195,155,183,239,176,219,110, 48,244, 3,220, 60, 64,196, 8,196, 4,109, 13,180,182,168,235, 6, 77, 99,208, 86,
+ 6,214, 40,212, 21, 33, 90,117, 93, 65, 84, 21,146,214,232,251, 17, 62,144,192, 39,196,120,163,254, 95, 37,200,210,222, 58, 81,
+199,174,152, 85,159, 47,111,161, 69,185,208,147, 22,100, 25, 12, 9,208,128, 48, 18, 93, 93, 65,130, 53, 23, 49, 71, 81,230,195,
+ 49,178, 21, 77,114,178,152, 40,143, 81,222,147,139,213, 51,147,255, 95, 90,105,222,174,191,255,246,150,207,135,175, 44, 94,255,
+116,195, 75,160, 49,187,224,221,250,181, 67, 79,207, 59,254,248,236,178,149,215,157,110,124,102,239,184,174, 20,158, 37, 25, 10,
+241,131,237,122, 62, 0,158,239,185,214, 40,200,117, 71,127,219,213, 83,110,186, 17, 2,127,245,167,127, 14,145,157, 32, 49, 96,
+113,180, 22,114, 62,224,241,233, 4,109, 13,148,214, 72, 62, 33,184,128, 79,231, 51,118,119,123, 12,222,161, 69,133, 36, 21,162,
+144, 24,198, 9,167, 75,143,144, 4,218,174, 5, 36, 93,188, 77,211, 64,105,139,243,101,128,119, 20, 82,225, 22,186, 72,172, 33,
+245,245,249,124,198,211,211, 19, 54,155, 22,109,215,112, 68,169,194,227,225, 51, 92, 12, 48,166, 34, 8,185,160,120,223,102,211,
+240,133,110,208,180, 21,172,145,124, 1,201, 27, 33,224, 85, 72,152, 99,111,169, 32,179,134,220, 38,139, 91,200,194,102, 77, 1,
+186,212,141,101,145,214, 84, 84,213,154, 71,227,130,195, 51,132, 4,172,162, 6,194,197, 64, 30,127, 69,239,203,122,211, 96,152,
+ 6, 76,203, 72,246, 59, 31,209,116, 29,173, 1, 98,196,180, 44,168,140, 33,141, 1, 18,146,143, 32, 36, 60,117,119, 77,215,226,
+112, 58,114, 58,155,166, 64, 42,198, 73,143,211,132,182,109, 48, 12, 35,172,189,199, 52,205,228,247, 94, 28, 60,171,174,201, 10,
+101,224,220, 2, 83,213, 80, 74, 23,252,109,127, 89,138, 95,218, 88,226,139,231,130,170,107, 59,164,152,240,116, 56,162,239,123,
+220,221,223, 67, 42, 98,185,211,115, 67, 56,215,170,105,208, 95, 38, 56,231,240,240,240,128, 15, 95,125,192, 52,141,116,121, 77,
+ 51, 22, 94,119, 52, 77,205,144, 31,224,124, 57,227,221,219, 15,168,235, 6,151,203, 25, 66, 36, 84,181, 69,109, 45, 82, 12,100,
+237,234,218, 82, 88, 89, 67, 90, 6, 93,145,248, 77,152, 28, 34, 51,114, 17,181,160,170,106, 8, 33, 49,197, 8, 91, 91,204,203,
+196,150, 57,131,203,153, 68,140,209,123,152,186, 45,182,185,174,219, 80,160, 79, 4, 18,175, 40,199,113,160,201, 13,128,190,239,
+ 81,215, 53,154,182, 70,223, 95,208,118, 53,102,231, 10,110,150,168,123, 20,167,221, 52, 21, 23,234,100, 45, 75,194, 67, 41, 18,
+236,245,253,192,201,105,182, 92,238,206,205,152, 89,236,105,173,165,144, 32, 67, 66, 76,169,192,128,157,154,232,116,124,175,213,
+181,198,211,211, 83,225, 51, 64, 74, 44,227,200,221,117,132, 86,153,160, 72,197, 97,140,190, 88,224,192, 77,107, 74,223,143,169,
+142, 43,188,238, 45,199,226, 5,170,220,143,195,196, 62, 7,207, 68, 50,194,167, 76,201, 34, 31,224,247,253, 62,164,234,166,144,
+ 20, 13,165, 12,141,225,133, 46, 57,202,138,205,250, 42,143,145,121,191, 46,215,254,101, 65, 10,247,220,253,226,153,148, 63, 38,
+142, 42, 77,130, 77, 82,153, 66, 70, 48, 19,186,112, 60,148,240,144,112,128,240, 0, 60, 32, 2,139,172,200, 92, 37,161,137,255,
+206, 10,122, 41, 20, 91,136, 52,100, 86, 45, 2,132,132, 21, 36,164,137,222, 99, 90, 60, 46,139,199,105,137, 56, 57,129,227,162,
+112, 92,128,227, 18,113, 92, 2,206, 75,196,105, 14, 56, 76, 1, 15,253,130,239, 14, 3,126,247,249,130,127,249,238,140,127,254,
+237, 35,126,249,237, 35,126,251,212,227,236, 5,182,111,222,227,235, 63,249,115,220,189,121, 3,129,136,254,124,192,112, 57,193,
+ 45, 51, 41,102,173, 37,127,190, 49, 48,214,160,107, 26,116, 13, 85,160, 85, 69,202, 93,211, 84, 16, 21, 29,130,167,243, 5, 62,
+ 68,164,103,249, 99, 55,214, 50, 46,160,100,193,223, 94, 81,169, 81, 68, 64, 70, 8, 25,145, 84, 66, 82,162,248,231,161, 37,160,
+129,166,178,208, 28,216, 32, 86, 57,230,105, 53,152, 22,105, 5,126,225,130, 41, 62,235,145,111,213,239, 55, 25,129,183,132,182,
+159,146, 93,190, 94,201,220,168,237, 81,198,125, 47, 67,147,210, 45, 93, 65,252,128,125,243, 71,204,223,159,243,155, 95, 4, 53,
+ 61, 3, 58,229,194, 57,133, 0,149, 18,222,238,239, 80, 75,137,133,121,212,211,188, 96, 92, 28,164, 49,120, 58,159, 16,101, 68,
+183,221, 96,187,221,192,133,136,211,249,130,105,118, 56, 13, 3, 46,227,136,167,227, 1, 31,190,249, 6,218, 24,156,250, 30, 62,
+ 1,155,221, 14,218, 84, 56,247, 67,129, 34, 81,183,209,162,235, 54,104,219,142,179, 8, 12,172,169, 48,141, 19,162,247,188, 19,
+ 52, 24,199,145,132,155,222,193,212, 21,218,174,131, 54,116,168, 10, 78,235, 74, 44,158,149, 74, 16, 84, 4,185,243,117, 55, 56,
+ 62, 31, 3, 61, 31, 74, 33, 34, 21,247, 72,211,146,240, 74, 48,115, 93,172, 58, 82,165, 20, 98, 32,154,154, 16, 2,218, 40, 42,
+232, 5, 1, 65, 4, 68, 57,111,178,213, 75, 73, 98,214, 91,163, 89, 73, 62,148,105,154, 53, 26,117, 93,149,157,112,197,126,109,
+ 91, 87, 52,118,151, 18,167,126,192,226, 29,199, 21, 91,142,134, 93, 56,135, 59,178,170, 31, 24, 71, 34,140, 81, 68,167, 43,151,
+ 82,182,103,121,239, 48, 78,212, 73, 42,173,184, 59,172,153, 8,119, 61,188,167,105,130,177,134, 41,101, 26,227, 56, 23, 20, 41,
+125,218,129, 72,152, 12,182,137, 49, 66, 74, 82,114, 79,227,140,166,235, 0, 65, 23,209,233,120,130, 49, 22,239,222,189,131, 82,
+ 10,211, 52, 97, 28, 71,124,254,252, 25, 91,182, 49, 14,195,128,113,236,241,238,221, 27,104, 77,145,162,195, 48, 92, 1, 95, 82,
+150, 60,123,161,136, 6, 26,216,129, 97,217,174,151,197, 92,121, 68, 63, 12, 3, 49, 61, 52,173, 87,172, 49,244,223, 56,170, 52,
+134,171,133, 75, 10, 89,156, 14,132, 21,182,236,138,208,112, 46, 64,107,133,237,110,139,148, 18,134, 97, 64,101, 45, 23,163,146,
+187,105,130,215,208,235, 32, 25,238,178,176,251,192, 35, 49,221,145, 60,227,169, 76, 77, 50,192, 39,187, 47,180,209,252,125,162,
+ 84,181,113, 28, 32, 36,174, 86,236, 24,112,127,191,103,221, 78,100, 55,130,193,249,114,193,233,116, 46,216,221,124,241,135,232,
+ 33,100,194,102,211,161,170, 40, 34, 88,107, 13, 1,137,224,195,138,249, 30, 11,172, 44,242, 58,227,247,157, 41,235, 6, 64,227,
+ 39,253,147,158, 9,230,196, 23,176,151,215,223,145, 16, 1,137,242,134,146, 82,173,138, 4,113, 83, 48,144, 74,250,153,144, 75,
+ 48,121, 77,146, 39, 82, 66,114,132,223,117,196, 79,113,131, 51, 11,232,242, 37,125, 37,114, 69,128,139, 6,121, 69,135, 62, 39,
+132, 49,124, 1,171, 20, 46,165, 52,188, 99,159,233,250,247,114,194,151,144, 84,237, 39,208,222,125,246,233,154,151, 46, 53, 68,
+112,240,203,140,101, 30, 49, 79, 51,230,217, 97,152, 22,140,227,140, 97,116, 88, 60, 16,160, 0,213,160,217,119,184,123,125,135,
+186,107, 16, 83, 68,127, 57, 67, 35,113, 82, 29,211,232,180,228,136, 73,192, 26, 82,171,215, 21, 37,170, 37, 17, 8,228, 80, 87,
+136,117, 5, 88,139,120,161, 81,106, 96, 63, 43,141,123,174,185,189,133,113,158,114,252,233, 77,236,121,217,171, 36, 73, 77, 23,
+ 20, 32,180, 88, 89, 5, 19,132, 6, 1, 55, 50,175, 62, 73,132, 20,215,132,215,149,215, 92,174,194,101,197, 53,227,124, 93,112,
+136,107, 42, 89,137, 30, 93, 9,197,158, 91,211,196,247,188,227,162, 92, 32, 47, 14,233,211, 42, 45,110,245, 35,189,232,125, 79,
+215,144,152,231,151, 61,179,177,197,218,130,247, 3,197,198,243,202,250, 37,161,220,243, 17,155, 82,128,247, 1, 90, 8,232, 4,
+252,252,253, 87,168,181,129, 8, 2,210, 88, 4, 33,160,180,198,249,124,193,165, 63,227,235,111,126,134,167,227, 1, 49, 8,124,
+122,252,140,105,154,209,237, 55,240, 41,160,221,116,104, 55, 27,124,251,241, 59,156, 14, 71,132,152, 80, 55, 45,180, 5,134,158,
+128, 29,145,115,176, 83, 34,107,210,226, 29,142,159, 62, 66, 10,160,107, 91,204, 57,108, 37, 70,236,239,239, 32, 68,194,124,158,
+ 48, 12, 3,234,138, 4,103,211, 60, 99, 94, 28, 98,162, 29,100, 93,213,101,223,106, 45,237, 3,231,105, 70, 93,105, 40,105,224,
+157,135, 81, 38,231, 78,242,235, 77,150, 86,197, 5, 96,240,142,138,233,166, 65, 76, 1,222,121,248, 68,151,218, 52, 77, 12,176,
+ 33, 95,177, 54, 6,199,243,133,194, 51,124,160, 39, 34, 69, 40,101,138,157,139,138, 2,114,168,156,135,254, 42, 66,148, 2,109,
+219,194,205, 20, 78, 83, 25,139,105,156, 24, 53,171,233, 44,208,138, 34, 53,153,254,150, 57,237, 82, 74, 72,158,250,197, 24,139,
+162,221,179,191,251,116, 60, 99,183,219, 32,133,200,241,170, 20, 63, 74,209,164, 40,175,119,126, 3,122, 79,175,221, 60, 59, 76,
+243, 25, 41, 9, 52, 77,203,132,183,132,126, 24, 80,215, 13, 94,189,190,195,229, 50, 34,177,101,111,228,179, 48,239,253,231,121,
+129,181, 21,170,186,193, 60,142, 8, 33,225,120, 60,226,195,135,247,168,234, 26, 19,219,169, 98, 76,212,217, 87, 53,180, 38, 27,
+162, 21, 9, 31, 62,188,199,241,120,192, 60, 77,152,172, 65,101, 73,208,104, 42,131,167,167, 39,188,121,243, 6, 46, 46,152,134,
+ 17,122, 67, 33, 43, 74,211,247, 94,107, 77, 19, 66, 45, 16,199, 1, 11, 91,222,134,137,208,174, 82, 72,120,231,208,181, 45,250,
+126,128,224, 95,103,196,236,178, 44,216,111,119, 24,134,190,176, 62, 50, 40, 39,173, 70,225,211, 56,150,192,175,202, 90,136, 36,
+ 16, 35,223, 33,146,166,121, 33, 6, 40, 40,104, 99,152,194, 71, 23,117, 6,130,109, 55, 29,169,237,131, 71,246,224,184,197,163,
+174,218,162,228, 71,154,113, 58,246,133,193,175, 21, 77,147,104,172, 79,249, 6, 66, 4,102, 34, 44,144,114, 66, 20, 9,243,236,
+ 48,207, 14,109,219, 80, 2, 94, 20, 69, 81, 63,141,243, 53, 11, 93,105, 72,153,184, 32,138,120, 73, 0, 36, 87, 22,183,117,115,
+155,255,251,191, 66, 40,151,110, 15,209,244,188, 39,186, 78,223,243,225, 44,149, 98,161,139,188,249,132,174, 9,111, 88,117,214,
+ 40,217,238,215,139, 52,149, 14, 61,135,200, 43,246,132, 19,110,144, 12,254,241, 89,114, 86, 54,197,167, 36,232,128,137, 18, 49,
+ 74,226,204,231,221,187, 80, 20,232, 34, 37,237,205,197, 21, 55, 75,224,136, 60,246, 16, 72, 44,146, 89, 66,132, 11, 52,242, 47,
+150, 60,222,185, 59, 31, 49, 44, 17,167,168, 49,200, 13,122,217,224,130, 26,231, 84,225,148, 42, 28, 67,133, 81,109, 33, 54,175,
+177,121,247, 21, 94,253,236,231,184,255,230, 27,108,222,190,133,100,117,234,229,124,192,116, 57,193,185,153,198,211, 82, 65, 26,
+ 67, 65, 44, 90,193,104, 1, 37, 35,140, 2,172,165,177,187,181,134,148,231, 90, 19,233,206, 90, 44,206,227,120, 60,149,157,240,
+250, 1, 17, 55,183, 46, 71,155,166, 43,202, 85, 0,197,214, 37, 40, 64, 30, 66,145,120, 78, 26, 5,104,222,179, 27,133,186,109,
+216, 70,152,158,137,209,211, 85,236,150,110, 53, 26, 73,200, 18,253,154, 94,240, 90, 18,195,253,150, 52,119,155, 90, 38,174,193,
+ 66,107, 84, 66,206,199, 92, 23,150, 69,249,190,170,104,159, 93,168, 55,201, 72, 55, 31, 44,125,185, 21,191,154,217,127,112, 55,
+254, 82, 39,254, 67,191, 39,191, 89,137, 4,152,208, 84, 21,190,126,247, 1,141,174, 81, 87, 53, 66, 2,206,151, 1, 41, 68,252,
+226,191,255, 19,241,208,221,130,126,236,177, 68, 15,143, 8,221,212,104,186, 22, 79,143,143,132,248, 20,192,101,232, 97,235, 10,
+221,102,131,170,110,224, 67,194,238,238, 30, 66, 72, 56, 46, 98, 73,201, 75, 74,111,178, 94,181,144, 74,193,241,110,119,187, 33,
+ 97,213,211,225,137, 70,165,242, 74,237,202, 33, 21, 49,210,228,134,246,209,190, 4,230,120, 79,113,168,109,211,150,221,182,214,
+154,147,222, 28,141,131,149, 42,151, 18,216,254, 87,215, 85, 17, 91,105, 77, 19,171,188,123,206, 14,150,170,182, 36,110,211,122,
+ 21,117,203, 74,246,101,230,139,132,248, 12,214,104, 76,227, 8,201,126,110, 41, 37,118,187, 45,154,182, 97, 69, 53, 21, 28, 4,
+105,161,160,142,146,174,200,171, 56, 41, 37,156,247,168,234,171, 24, 47,119,121, 25,178,130, 4, 2,160, 44,174,164,193,101, 10,
+ 25, 41,250, 77,225,183, 3, 64, 93,209,228,173,239,123, 10, 97, 97,110,194,195,195,103, 24, 99,153,138, 70,211,207, 97, 24,209,
+182, 29, 20,195,174,134,113,196,166,107,137,188,102, 43,214, 0, 37, 12,227,132,166,161, 20,197,121,153,136,210, 25,249, 44,213,
+138, 39,157, 52, 46,175,171, 26,167, 19,165,220,133,224, 97,140, 66,211, 86, 20, 91,106, 44,250, 75, 15,239, 60,117,208,188,195,
+ 38,193,224,140,105, 36,239,124,215,110,158, 21,172,244, 76, 17,163, 32, 22,126, 64, 83,215, 69, 19, 97,173, 33, 31, 58, 4,230,
+105, 34, 1, 29, 99,117,115,203,161, 88,215,176,254, 0, 0, 32, 0, 73, 68, 65, 84, 74,161,116,253,123,242,247,110, 94,102,110,
+222, 88, 80,105,100,153,218, 72, 69, 41,118,203, 50,195, 86,164,229,178,198, 64,128,166,159, 41,102, 65,166,226, 92,129,153,195,
+ 93, 18,188, 7, 82,146, 24,134, 5, 85,213,194,152, 10, 90, 87,180,222,112, 11, 82, 74,148, 72,201,214, 51, 89,104,139, 21,113,
+ 3,124,130,119, 17,211, 56, 35, 69, 74,124, 28,199, 9, 79, 79, 71, 44,139, 47,193, 56,198,216, 21,176, 40,174, 52, 56,233,230,
+140,122,169, 75, 95, 55, 36, 82, 94,147,217, 11, 24, 37, 61, 67,131,228,195, 45,137, 91,172, 76, 66,226,140,117,174, 20, 86, 80,
+149, 24, 67, 57,211,181, 80,208, 66, 93,199,226, 44, 66,202, 7,237,117, 50, 42,202, 40,127,205,233, 22,156,238, 6,182, 75, 73,
+ 5,246,174, 38, 32, 5, 4, 79, 17,171, 20,212, 34,203,155, 32,174, 34, 27, 75,178, 22,163, 32,215,167,114,209, 3, 8,201, 29,
+171,224, 74,217, 23, 65,131, 18,100,121, 72,156,123, 27, 67,198, 3, 90,174,108,137, 34, 20, 1,204,206,225, 50,206,184,204, 11,
+ 28, 52,116,123,135,106,255, 26,221,253, 91,108, 95,191,193,254,237, 59,236,222,190,129,217,180, 16,214, 64,104, 1,231, 22,244,
+ 61,101, 19, 7, 23,201, 14, 39,105,220,153, 81,151, 90, 82, 18, 28,137, 54, 20,185, 5, 88, 61,218, 88, 11,105, 13,146, 82, 16,
+214, 0,149, 65,112, 30,253,113, 96,101,110, 68, 76,190, 60, 36, 41, 43,193,113,133,246, 64, 16, 15, 94, 51, 1, 15, 74, 66, 88,
+ 5,161, 21,146, 17, 72, 6,180, 91, 87, 18, 48, 52, 57,128, 53,176,149,134, 22, 57,185, 44, 3,103,120,255,152,196, 77,176,137,
+ 44,185, 36, 89,142,152,174,222, 48, 22,142,164,231,184,220,140,126, 21, 47, 88,195, 50, 40, 38,231, 13,139,239,247,238, 72,234,
+ 42,244, 20, 28,241,202, 76,117, 72,218, 32,173,159,227,226,107, 23,217,134, 39,110, 62, 30,110, 70, 94,184,121,142,111, 21,243,
+ 47,195, 33,214,149, 79,252,158,253, 83, 20, 2,163, 22,146, 41,116, 9, 42, 38,124,120,253, 14,247,247,175,112,158, 38,244,222,
+225,227,211, 19, 92,138,248,197,175,126,133,118,179, 65,221,180, 5,115,249,219,223,253, 6,178,178, 8, 10,248,246,227, 39, 8,
+161, 81,219, 6,253,105,128,155, 60,154,186,131,213, 21,172, 50,112,211, 12, 37, 19,198,177, 39, 46,117,215,160,110, 8,110, 68,
+177,165, 17, 33, 69, 76,243, 4,165, 37, 62,124,245, 30,117, 75, 56,212,190,239, 97,171, 10,218, 84,104,154, 22,219,253, 14,139,
+119,100, 45,226,149, 76, 70,198,210,100, 45,194, 47, 11,186,118,131,133, 49,174,243,226,177,120, 10,181,200, 20,177, 24,232,192,
+118, 46, 64, 43, 3,107, 91, 44,236,139,207,120, 81, 41, 36,243, 53, 18,106, 91,163,107, 41, 29,142,178, 27, 72,129, 76,212, 55,
+ 85,168,133, 49, 68, 32, 82, 42,214,226,102, 72, 77, 36, 56,163, 12,148,164, 66,195, 47,180, 18,144, 66, 81,124,171,181,212,189,
+ 59, 26,147,167,152, 74,122, 23, 0, 12,253,128, 29,219,218, 74, 50,100,244,156,147,174, 17,162,131,173, 13,180, 53,172,175,137,
+ 56,158,206, 72, 66, 96,156, 23,220,191,186,227,209, 61, 13, 78,149, 86, 92,168,128,105,124,116,152, 79,243, 12, 91, 53, 72, 32,
+113,157,177, 22,167,243, 5,227, 52,225,213,253,107,184,197,193,112, 68,243,166,107, 41,166,213,185, 82, 12,157, 78,103, 52,109,
+ 87,112,169,227, 48,160,174, 42, 72, 0,141,181,240,193,227,120, 62, 67, 72, 74, 27, 59, 28,143,132, 92, 21, 2,214,214, 28,172,
+ 35,208,182, 29, 66,200,200, 84, 70,240, 90, 82,213, 63, 30,143, 8,137,180, 30,182,178,236, 26,160,175,155, 98, 87,175,235,176,
+ 24, 34,137,123,141, 68,138,158,249,252,146, 39,139,137,186,111,163, 33, 36,141,199, 37,159, 89,149,181, 72, 33, 80, 74, 94,116,
+101,159, 77,130,106,186,111, 66,233,182,169, 1,164, 14,159,180, 38,243, 60,179,149,151,210,245,202,235, 32, 4,217, 26,145,208,
+180,117, 73, 84, 92,150,153,199,255,177,208,221, 82, 76,196,240, 79, 2, 79,159,159, 96,117, 5, 64,162,170, 26,108, 54, 91,104,
+ 94,215, 54, 77, 5, 41,128,237,118, 11,165, 52,150,197, 67, 43, 91, 66, 90,230,105,134,115,158,189,231,190, 68,176,174, 83, 39,
+ 37,175, 3,214, 83,188,236, 85,207,196,194,219, 88,214,107,118, 37, 93,134, 66,124, 81, 69,252, 61, 52,152, 72,108,202, 21, 37,
+ 28, 99,141,249,204,217,235, 70,106, 24,169, 41, 23, 93, 82, 54, 47,214, 68,173, 28,252, 33, 37, 2,167,168, 65,102, 17,221, 85,
+180, 68,211,115, 10, 57,209,146, 47,142,232, 48,187, 5,179, 75, 4,169, 89,229,104, 95, 83,229,210,205, 15,178, 77,173, 79, 96,
+198,111,178,144, 79, 9, 93,126, 45,132,162, 80,131,213,139,136, 72,127, 70, 41, 13, 99,236,234, 98,215, 84,176, 24, 9, 5, 32,
+ 58, 10, 44, 24,198, 17,227, 56,225, 50,244,152,150, 9, 46,204, 36, 18,137,228,209,156,167, 17,203, 60, 34,250, 0,163, 43,212,
+117, 7,169, 45, 89,247, 4, 49,173,141, 82, 52,126,148,138,161, 61,154, 97, 46, 10,218,104, 84, 77, 3,101, 13,132, 53, 32, 58,
+174, 66,127, 62,227,116,186,176,101, 59,191,126,204,223, 79,177,144,251,232,235, 15,180,222, 16,128, 22,130,252,233, 70,130,125,
+110,128, 81,128,145, 72, 82,210,100, 67,145,144, 78, 40, 5, 91,105,216,124, 91, 11,201, 82, 67,246, 85,151, 24, 84,178, 99, 61,
+ 11, 44,189,221,112, 39,121, 21, 42, 22, 26, 92, 40,176,142,194,206,127,166,134, 79,215,201,250,106,250,144,138,192,241, 22, 58,
+ 19, 75, 57, 23, 17,233,181,226,130, 54,221,184,231,196, 21,239,138,171, 2,254,185, 56,174,164,237,229, 80,158, 76, 69,140,233,
+135,119, 96, 32,224, 13,196,237,234, 33,166, 68, 83, 33, 31,232, 61,226, 35, 42,105,240,103, 63,255, 99,132, 24, 49,199,136, 67,
+223, 3, 90,145, 31, 61, 80, 81, 75, 24,215, 10,191,254,245,191, 64, 40,122, 46,102,239, 17, 18, 80, 87, 45,230,209,225,243,227,
+ 1,117,221, 97, 28, 23,124,247,241, 19, 98,136,120,255,246, 29,220, 60, 67, 43,137,186, 38, 1,218,195,195, 39,246, 99, 43,116,
+ 93,135,221,110,199,144, 18, 58,176, 31, 62, 63,224,233,233, 9,219,221, 14, 2, 18,219,237, 30,227, 56,226,225,225, 51,117, 73,
+154,240,153, 90, 41, 74, 46, 83,154,190, 46,182,134, 17,255,156, 0, 54, 82, 42, 58,200,133, 64,211, 52, 64, 4,130, 11,228,227,
+230, 34, 47, 37,178,149,230,195, 85,107,206, 49,224, 67, 91, 43,133, 20, 18,140,162, 40,204,192, 86, 35,239, 29, 18, 4, 22,231,
+ 97,140,197, 50,123,220,237,246,232,199,161, 64,138, 2, 71, 62,223,223,221,195, 45, 30,211, 48,162,169, 42,120, 71,140,116,242,
+ 40,211,247,215,123,135,166,174,232, 92, 74, 52, 77,236, 47,103, 66,177,106, 69,244,203, 20, 33,165,130,177, 6, 77, 91,179,248,
+ 55,150, 9, 32,117,115, 10,117,219, 65, 25,133,105,158, 0,166,144,245, 61,117,193,164,124,247,144, 90,160,109, 43,108, 54, 13,
+234,166,197,199, 79,159,161,149, 65,221,116,184,244, 3,180, 85,152,151, 25,195, 48, 96,191,223, 99,153, 40,192,164,235, 90,182,
+197,109, 74,198, 67, 74,145, 85,229, 22, 62, 68, 28,143, 39,108, 54, 27,154, 50, 6, 18,237, 41,169,209, 15, 35,170,186,134,210,
+ 6, 82, 41, 28,158, 14,172,230,182,248,248,240,176,138, 10,213, 24,121,175,190,204, 11,220, 52,227,238,254, 30,199,211, 25,227,
+ 52,160,105,106, 52, 13, 17,252, 34,127,205,218, 80,188, 44, 18, 96, 52,117,217, 90, 1,222, 83, 58,157,173,106, 36, 33, 33, 53,
+197,180, 82, 81,232,168,137,211,170, 0,137, 36,128,166,174,224,252,130,121, 25, 32,181,130, 53, 21,175, 58, 44, 78,199, 19, 3,
+199, 36, 41,243, 89,124,232, 25,145, 59, 14, 99,241,234,103,214,123,224, 28,146,221,126,139,170,174,202,247, 52, 68,143,113, 26,
+ 96,173, 97,166,125,128, 91,102,254,217, 83, 10,158,144, 56,157, 46, 24,199, 9,142,189,238, 41, 69,156, 47,103,132,232, 32,100,
+ 66, 85,181,228,122, 98,213,125,182, 13,102,218, 30, 77, 10, 35, 7, 13,133, 50, 53,204,107,226, 92,188,172,161, 51,107,151,193,
+ 79, 18,202,253,216,161,252,245, 71, 42,157,139,144, 18,218,152,226, 7, 21,171,124,113, 89, 20,239, 44,207,207,221,124, 90,197,
+181, 38, 38, 59, 9, 64,164,200,255, 78,104,201,252,145,198,105, 46,233, 65,207, 18,224,139,202,250, 58,206,140, 72, 43, 40,254,
+173,112,233,122,177,231, 84, 46,197, 80,255, 16, 72, 77, 10,200,178,163, 86,138,118,104,148,210,166,138,170,158,176,129,186,248,
+100,137, 76,228,110,162,244,140, 49,208,130,232, 84,185, 98,172,170, 10,166,178, 69, 60, 40, 57,102, 86,114,124, 43,137, 63, 8,
+225,106,140, 46,107, 8,161, 13, 68,101,168, 88,178, 10,194, 40, 36, 23,240,248,240, 25,167,203,133, 63,239,188,138, 64, 9, 5,
+ 17,171,139,235, 42, 74,188,166,207, 9,201, 33,227,188,175, 20, 89, 32,199, 69, 87,190,216,173, 53,132,154, 92, 21, 72,224,172,
+123,177,194, 4,255, 40,203,215,139, 75, 30,220,196,158,254, 62,254,123,186, 98,144, 86,221,115,252, 30,114, 54, 23, 0, 95, 26,
+135,199,130,118, 92, 79,123,240,130,253, 13,171, 2, 36,221,238,216, 95,216,133,173,223,124,235,212,185,148, 18, 49, 11,178, 86,
+131, 3, 50, 16, 41,141,237,245,253, 61, 54,155,142, 4, 53, 49, 97,179,217, 97, 89,104,237, 4, 8,236,118,119,232,251, 1, 15,
+159, 31,209,118, 91,188,123,247, 30,206,121,116, 93, 7, 83, 85, 72, 74,226,216, 95,240,246,253,123,248, 24,176,120,135,237,126,
+ 7,161, 21, 78,253, 5,191,251,246, 59,236,118,123, 74,111, 11,129, 57,232, 26,219,221, 14, 82, 74,156,207,103,116,221, 6,219,
+237, 14, 33,208,222,125,183,223,195, 24,139,237,150,125,195, 16,104,170, 10,187,205,142,236, 62,129,230, 51, 74,106, 76,195, 8,
+191,120,184,197,209,184,215, 59, 62,188, 8, 59,155,223,167,130,167, 19, 42,171,215, 37, 32, 36,113,228,105,149,154, 74,160, 75,
+206, 72,207,136,217, 60,112,179,214, 96, 89,230,114, 81, 1,100,147, 90,220,130,253,126,135,190,239, 25, 44,146, 74,140,107,215,
+117,172,242, 22, 55,171,163,182,105, 56, 51,252,192,186, 32,194, 66, 47,243, 66, 41,110, 82,149, 21, 23,157, 65, 52,114,207,207,
+ 76,101, 43, 44,203,132,101, 89, 80,215, 85,249, 92, 51,216,164,109, 91,154, 72,240, 84, 48, 70,130,246, 12,195,128,186,166, 49,
+125,221, 52,216,237,118, 72, 41,225,116, 60,151,125,254,211,211,129,119,176, 10,195,208,163,235, 90,128,189,212,199,227, 19,246,
+251, 29,249,245,141,198,118,187,129, 82,146,195, 69,200,254,167,181,198,233,120,194,253,253,171, 82,180,214,117,195,236,120,226,
+200,207,243,140, 77,215, 98,153, 38,188,123,251, 6, 41, 70, 60, 61, 61, 22, 75,151, 53, 22,167,211,153,252,211,108,193,171,234,
+ 10,211, 52,227,114,185,176,194, 59, 66, 10, 82,201,167, 72,202,243,121, 89,120,218, 49, 83,129, 83,215,133,235,190,182,105,101,
+ 95,119, 78,138,203,172,128,108,131,110, 26,162,224,101,145,157, 49, 26,125,127,193,253,253, 61, 46,151, 51, 82,140,252, 60, 76,
+ 68,250, 99,123,162, 49, 26, 66, 10,248, 24, 11,235, 94,107,133,101,158,113, 56, 28, 8, 23, 92, 91,104,163,209,180, 13, 18, 0,
+231, 29, 66, 12,112,193, 33,138, 4,161, 4, 54,155, 14,214, 86, 56,159, 47,136, 49,226,233,233, 9,195, 56,224,116, 58,225,237,
+219,183,216,237,182,156,192, 55,150,179, 33,211,234, 72,187, 18,191,200,171, 88, 55, 6, 47, 37, 72,190, 68,160,252,131, 93,234,
+233, 25,110, 51,166, 84, 58, 40, 33, 73,152, 32,164, 92,141, 71, 83, 73,239,146, 0,193,105,196, 58, 88, 50,127,146,169, 4, 60,
+ 72, 14, 76, 49, 74, 80,100, 40,247, 79, 49, 1,227,188,240, 55, 93,124,241,179, 75,153,179,254, 12,185,119, 67, 43, 19, 87,200,
+ 72,126,161,165, 82,101, 15,114, 29,209, 99, 5, 52,225,189,148,144, 12, 59,160, 49,188,210,178, 16,174,242, 30, 72,101,143,190,
+214,168, 12, 41,215,219,166,129, 49,186,136,110,136,182,199,197,143,202, 9, 77, 68,195,178,214, 80,128, 65, 85,161,170, 12,180,
+150,176, 90, 67, 24,141,100, 52, 96, 12, 96,233,231, 56, 46,248,237,111,191,197,101,156, 41,141, 8, 2, 33, 93,167, 34,229,162,
+ 73, 2, 49,208,142, 48,173,118,214,185,235, 46,137, 52, 98, 37,144, 83,178,136,210,147, 4,116,101, 74, 12, 33, 86,252,250,235,
+119, 51,253, 43,202,195,231,164,183,151,163,125, 95,170, 21,200,166,151,187,126,249,236, 57, 16, 37,109,107,237, 63,127, 89,140,
+ 34, 56, 30, 87, 60, 39,191, 22,168, 13,189, 41,113,243, 67,202,235, 69,243,146, 79,189,124,188, 18,222,179, 26, 73, 50, 69, 43,
+242,231,167, 33, 97,165,198,207,191,254, 6, 86,155,146,215,252,233,225,129, 82,194,248, 43,107,218, 6, 79,199, 51,148,177,168,
+235, 22,135,195, 9, 31, 31, 30,136,200, 53, 79,120, 60, 60, 33, 9,224,233,233, 9,227, 52,209, 46, 52, 37,252,250, 55,255,130,
+199,195, 1,175, 95,191,193,102,187, 67,219,118, 16, 66,161,109, 59,116, 93,199,190, 93, 18,254,188,123,247, 30,117,221,160,109,
+ 91,220,221,221,195,154, 10, 90,105, 92, 46, 61, 98, 4,255,153, 13,148, 84,148, 91,176, 56,206, 92, 80,176,166,166, 1, 56,179,
+196,179, 8,170,170,106, 72,173,139,109,241,234,237, 94,143, 20,105, 39,106, 43, 3, 99,105, 71, 74,130,183,235,247, 38, 71, 85,
+ 70,238,186,109,101,177,221,110, 96,173, 46,177,151,214, 82,186, 87,136, 30,214, 16,220, 10,145, 14,248, 44,182,115,110,166,180,
+ 56,145,208, 52, 22,109, 87, 97, 28,122,116, 93,199,127,135,197,194, 57,236,244,190, 32,210,100,136,192,225,120,161, 17,181,148,
+ 88,120,109,145,231, 60,235,189,121, 74, 17,247,175,238,160, 53,165,186, 57,231,176,217,108,112, 56, 92, 10,195, 61,147,244,242,
+142, 85,107,131,154,147,190, 30, 30, 30,176,221,110, 17, 66,228, 31, 1,154, 51,206, 77,165, 81, 85, 84,244,159, 79, 71, 24, 67,
+157,102, 74, 1,117,109,209, 52,150, 5, 88,116,185, 12,195, 4, 1,137,253,110, 15,169, 40, 54,213,251, 0, 37, 21, 54,221, 6,
+243, 56,225,116,120,194, 56, 92, 48,141, 3,222,189,127, 11, 33, 40,239,156, 50,203,101, 57, 19,133, 32,149,119, 2,104, 90,161,
+232,204, 90,167, 25,130, 53, 34, 82,136,194, 80, 15, 33,114,200,141,133,100, 31,123,246,221,103, 17, 98,142,224, 37,245,191,226,
+ 41, 92, 66, 91, 55,104,155, 22,137,109, 98, 74, 73,118, 11,140,120,245,234,142,154, 13,214, 80,196, 16, 8,216, 37,105,221, 25,
+248,189,225,131,135, 91,133,229,164, 16,209, 95, 46, 68,243, 75, 9,193, 59,196, 64, 92, 4, 74, 83, 35, 1,248, 60, 79, 20,110,
+179, 44,104,218, 14,139,163, 12,249, 97, 24,224,188, 67, 63,246,148,156,201,103,216,249,124, 38, 24, 82,125,229,139, 72,214,132,
+121,239, 11,222, 56, 91, 50,115, 16,207,115, 20,236,139,205,204, 90, 48,247, 7,235,211,159,227, 50, 69, 30, 27, 40, 34,198, 61,
+ 51,207,139,152, 86, 62,247,184,202,165, 78, 55, 70, 38, 41,105,199,171, 21, 80, 25, 5,171, 5,172, 18, 80,124,186,186,144, 48,
+206, 11, 92, 76, 55, 42,234,151,173, 77,177, 4, 70, 60, 23, 35,221, 84, 72,129,177,173,252,181,248, 64, 21,102, 90, 81,175,214,
+234,104, 98, 61, 83,199,218, 84, 22, 86, 17,182, 53, 39, 39,229,136, 74,107, 76,249, 57, 91, 46,140, 81,168,140, 38,102,180, 36,
+239,107, 74,145, 66, 86,172,230, 67,137, 46,253,156, 72, 84,213, 22, 77, 93,243,229, 94, 17,237,205, 90, 8,109,144,180,132, 48,
+ 26,227,227, 9,255,240, 15,255, 13,147, 11, 76,220, 3,239,180, 86,187,223,130,166, 77,136, 81, 60,211, 75,228,113,118,190,192,
+229,234, 7,239,214, 5, 0, 45,160, 43, 2,116, 96,197, 51,191,237,178, 25,188,243,251,124, 96,207,109, 94,235,190, 88,188, 92,
+149,102,119,195,151,186,245,244,162, 7, 77, 60, 79, 94,189, 10,236,110,126,185, 10,153,121, 86, 49,188,196,114,255,146, 69,237,
+165, 55,222,139,140,119, 94, 63,209,132, 68, 94, 47,179,152,240,106,183,199, 31,125,243, 51, 52, 85,141,221,118,139,167,167, 39,
+116,219, 13,193,119,141,193,238,110,143,203, 48, 98,241, 30,151,126,192,231,167, 39,204,110,225,206, 41, 98,113, 11, 94,189,126,
+ 13, 0,184,191,191, 47,251,218,188, 54,218,108,182, 8, 49,226,215,191,254, 53, 90, 30,225,231, 3, 85, 8,137,221,110,143, 63,
+253,211, 63,195, 60,207,152,166, 9,191,249,151,223, 20, 27,155,146,138,208,150,138, 46,242,101,156,145, 66,194,216, 83, 78,183,
+228,124,243,124,153,143,243, 84, 32, 49,229,107,228,201, 4, 9,197,200,105, 18, 87, 76, 5,185,122, 61,180,210,229,215,116,105,
+134,242, 30,145, 82,194, 26,139, 24, 34, 91, 63, 21, 23, 11,161, 4, 22, 81,218,214,213, 78, 71, 0,145, 0,169, 4,154,182,134,
+119, 11,218,166, 70,219,214,216,109, 59,156, 78, 7,104, 77, 7,111,142, 78,245,206, 83,241,174, 53, 66, 34,184,142,247,129,222,
+ 99, 33,209, 72,150,217,243, 90, 43, 36, 36,180, 29,169,246, 19,104,125,145, 5,130, 57,188,134, 10, 28,189,122, 93, 4,123,219,
+ 45, 43,170,169,147,172,106, 18,147, 37,134,113,101,210, 26, 37,148,229, 41, 70,228,179, 71, 64,177,253,202, 88,242, 71, 91,107,
+ 81,215, 21, 9,200, 56, 27,254,227,199, 79, 80, 70, 99,154, 39,154, 64, 74,250, 58,165,144,216,239,182,204, 46, 39,145, 89, 94,
+ 71,228,156,139,156, 72, 23, 19,104, 92, 47,201,254, 22, 60,173,205,148,214,164, 54, 79,188,131, 38,100, 26,234, 28,207, 27, 81,
+ 72,105, 82, 10,180, 77, 3, 1,186,248, 73, 59,161,203, 37,151,131,109, 28,127,110,118,197,249, 23, 72,197, 70,183,221,110, 96,
+ 43, 67, 72, 92, 41,208,118,204,198,247,129,119,217,180,203,151,146, 69,114,172,217,210,122, 5,147, 17,178,104, 43,144,128,224,
+ 61,148, 84,232,218, 22, 93,211,192, 40, 13,239, 28,250, 97, 40,182,206,186,174, 73,175,160,200, 74, 71, 30,125,106, 48,172, 49,
+120,117,119, 15,196,136,121,162,212,187,202, 90,158,188,210,157, 64,227,248, 21, 12, 43, 95,212, 49,222, 64,145,114,209,155,201,
+125,121,175, 94, 62,247, 31,171,218,253, 65, 64, 77, 25,101, 70,218,223,176, 5, 41,143,101,214,244, 27, 33,196, 53, 79,252, 5,
+ 14,119, 70,171,230, 8, 63, 33, 35,148, 76,208, 90,208,154, 87, 94, 59,180,197, 71,244,147, 67, 18, 57, 21,236,165,139,253, 26,
+197,185, 86, 80,223,136, 14,120,103,151,177,179,185, 74,150, 82,192,199, 0, 81, 4,106,162,140,161,229,179,100, 54,202,150,182,
+133, 82, 68,170, 94,170,238, 26,238,202,155,170, 66, 93, 85,229,162,207,163,248, 28,215,151, 56,129, 75, 51, 14,208, 90,186,192,
+ 43,107, 56,142,145,247, 80, 90,209,254, 80, 73, 70,226, 42, 36,169, 0,109,128, 40,240,171,127,252, 5,254,241, 31,127, 73, 33,
+ 20, 66, 20,208, 71, 74, 98, 53, 98,164, 61,219,149,228, 38,138, 18, 30, 18,136,249,130, 38, 36, 96, 65,103,102, 6, 65, 82, 2,
+ 66, 11, 8, 35, 57,243,253,217, 85, 30,227,109, 55,205, 59,233,252, 44, 32,221,134,149,172,145,178, 98, 5, 96, 33, 22,130,248,
+222, 24,191,252,187,184, 85,217, 10,188, 36, 88,139, 87, 75, 27,110,199, 88,249,243, 76,156,176, 22,112,181,184,125,121,109, 32,
+ 94, 36, 58,253, 84,159,250, 77,113,153, 13,127, 49, 21,177,156, 18, 18,127,252,179,159,163,174, 42, 12,125, 79, 29,186,214,152,
+150, 5, 62,134,162,245, 88,156,135,177, 21, 92,136, 24,198, 17, 1, 2,111,222,188, 37, 13, 69,136,232,251, 30, 41, 37,124,251,
+237,183,184,191,191,199,253,253, 43,180,109,135, 87,175, 95,227,213,171, 87, 16, 66, 97,127,247,138, 64, 38,227,136,115, 79,184,
+ 80,107, 13,182,219, 14,199,227, 1,159, 62,125,194, 48, 12,216,237,119,216,110,183, 28, 65, 90, 97,191,219,225,110,183,167,116,
+172,105,194, 50, 78,216,111,119,204,218,150,208,182, 34,101,177,160,200,208,190,239,203,133, 10, 16,206, 52,198, 4,231, 2,241,
+ 34, 86, 44,138,236, 87, 15, 49, 32,122, 18,197, 26, 77,239,159, 24, 61,180, 81,220,189,115,172,104, 76, 55,168, 89, 89,242, 34,
+ 88,176,199,157,124,140, 17, 93,219, 66, 41,197,130, 88,122, 2,170,138,138,103,218, 73, 19,177,172,109, 27,216,202,112,135,234,
+161,185,128,168,172,197, 60, 47, 52,178,158, 23, 52, 77,139,166,109,203,179,147, 85,208,249, 44,104,154, 26,227, 48, 32,248,128,
+134,197,107, 57, 82,149, 8,110, 53,191, 30, 75,185,128,215, 66, 40,231, 73,244,150,187,215,251,251, 61,134, 97,162, 75,135,157,
+ 57,217, 89,144,199,216, 25, 22,228,157, 67, 93, 25, 44,243,136,186, 34, 18, 97, 68,128, 84, 64, 18,244,218, 88, 91,193,185,229,
+166,177, 89,102, 7,231,169, 3,237, 54, 29, 42, 78,165, 27,199,145, 20,227,206,113, 10, 26,169,233,181,210, 8, 62,176, 80,174,
+194, 48,142,148,135,161, 20,154,170, 46, 17,220,148, 68,201,170,247,202,150, 41, 11,100,130, 46,130, 65, 89,114, 26,188,119, 5,
+115, 77,171, 10, 94,147, 38,194,205,230, 66,206,123, 15,201, 25,237,198,144, 40,206, 57,143,205,102,139,101, 89, 48,241,154,104,
+ 94, 22, 14,145, 2, 7,232,208,107,218, 52, 13, 93,176,146,186,104,153,128,202, 24,212,182,194, 52,142,156, 18, 39,208,212, 84,
+ 96,135, 16,112, 62,159, 41, 75,129,133,132,158,223,143,243,180,192, 45, 30,175, 94,191,134, 49,182, 92,242, 49, 6, 92, 46,180,
+ 2,202,119,200,151, 80,209,241,217,133,190,134,209,228, 98,121,125, 6,133, 16,254, 0,157,122,194,179,228, 45, 20,172, 35, 98,
+ 66,101, 44,148,212, 4,114,137,162,192, 62, 4,110,111,128,178,199,226,174, 78, 32, 66,138, 4,173, 18, 89,184, 20,239,224,101,
+130, 18,164,156,142, 41, 97,152, 23, 92,198,153,112,174,233,251,187,135,132,240,204, 42,148, 85,244,215,233, 66, 66,174,134,242,
+248,147,246, 38, 36,162,241, 5,100, 33, 57,161, 14, 9,101,231,153, 99, 85,181,214, 37,182,209, 90, 93,170,174,156, 17,108,173,
+ 41, 35,118,205, 59,243,188,159,206,196,189,140,208,181,133,137, 79,191, 55, 87,113,154,255, 27,141,244,137,207, 30, 37,200, 94,
+150, 0, 88, 13, 81, 85, 24, 30, 14,248,219,255,235, 63,225,243,231, 51,184,144,189,122,242, 89,121, 14,166,117,229, 34,230,102,
+ 71, 44,104,108, 40,175,196, 93,118, 14,100, 81,153,188,170,224, 37, 8,165,201,111, 64,113, 67, 27, 20, 63, 26,204,242,147,162,
+ 7,158, 93,136,184, 73,246,186,245,164, 63, 47,240, 18, 91,208, 72,171,129, 2,120,184,126,237,180,102,200,241,169, 47,108,219,
+ 11,199,255, 15,253,143,128,128,224, 11, 61,250, 0, 17,129,215,251, 59,252,241, 55, 63, 35, 84, 40,143, 8, 61,139,202,146,144,
+216,238,118, 8, 49, 96,154, 7,120,239,240,120,120,194,219,247, 31,224,189,199,249,114,193, 48,244,104,218, 22, 77,219,224,237,
+219,183,120,243,230, 13,154,166,197,249,124,193, 52,207, 24,167, 9,255,252,235, 95, 98,152,136,166,182,217,108, 96, 12, 61, 95,
+ 31, 62,188,199,219,183,111, 17, 35, 21, 5,116,176,202,114,217,196, 16,248,191,123,156, 78, 39,204, 51,217,128,148, 16,168, 88,
+ 27, 34,181, 42, 99,242, 80,252,217,190,236,206,151,101,161,144,146,197,115, 60,112, 34,197,183, 20,204, 4,143,101, 68,155, 47,
+173,121,154, 48, 14, 3,140,214,168, 45,117,127,209,211,231,131,148,232, 64,102, 45, 75,224, 68,176,252,188,208,193, 93, 51,100,
+133,246,177, 34, 81,228, 42, 82,132,209,170,100,153,167,148,208,118,100,187,171,109,133,190,239,241,246,205, 43,108,183,155,194,
+139,191, 12, 3,139, 97,137, 72, 70,251,104, 42,202,231,121, 44,171, 55, 18, 98, 69,158, 48,144,127, 59,119,142,199,227, 17, 21,
+ 71,139,210,197,158,185, 30,130,129, 53,148, 16,153, 11, 8,107,171,114,121, 75, 33, 48,207, 11,195, 93, 38, 0, 18,166,100,158,
+207,240,222,163,173,169,251,205, 77, 82,140, 1,202,208,106, 47,231,151, 15, 67,143, 77,219,150,157,111, 63,140,232,251, 17, 33,
+ 81,184,212,239,126,247, 29,101, 86,132,136,215,175, 95, 23,216,206,178, 44,232,199, 17,144, 10,138, 59,103, 37, 37,154,154, 96,
+ 65,195, 56, 98, 24, 71, 76, 19,209,227,242, 5, 70,248,106,135,121,113,152,231,165,228,137,123,231,233,252,179, 6, 51,255, 25,
+130,194,120,246,131,219, 50,201,201,217,230,119,187, 61,106,107,225,157,131, 86, 2,193, 47,180,174, 52, 21,220, 18, 48,143, 51,
+ 41,237,235,166,172, 43,168, 40,140, 5, 64,181, 38,181, 69,166, 74,206,243,140,161,239,225, 23, 71,223, 83,173,121, 55, 78,255,
+ 47, 1,184,191,191,131, 16, 2,231,211,165, 76,114,242,156, 89, 8,133,105,154, 57,203,196, 80, 99,164, 36,148, 49,144, 90, 98,
+241, 30,211, 60, 99,113,142,116, 90,223, 19,255,178,165,152,239,135,245, 61,246,252, 50, 95, 23, 5,127,152,241, 59,207, 51,139,
+ 24,158, 15, 38, 36,192,154,138, 46,244,180,254,144, 87, 53,114,182, 21,199,213,222, 91,148,203, 18,229,135,214, 76,156,227,241,
+ 73, 66, 66,136, 17,227,226, 48, 45,129,232,100, 66,188, 40, 34, 88, 99, 67,145, 40,206, 46,183,114,107,111,114,102, 36,167, 20,
+105, 15, 21, 35,188, 95,174,251, 83, 65,189, 20,173,219, 73, 65,174, 20,121, 33,141, 38,209,136,201, 57,208,207,147,115,248, 27,
+179,222,149, 37,238, 72,213,234,194,110,170, 10, 77, 85,195,106, 82, 16, 91,107,217,210, 32, 57, 87,154, 88,248,165,227,227, 78,
+ 29, 41, 65, 86, 21,194,236,240, 95,254,239,191,199,223,254,221,127,198,236,249,154, 37,198,226,205,208, 59,219,253, 2, 66,177,
+ 44,145,197, 45, 94, 87, 36,217,230,120, 35,154,227, 61,123, 1,210, 72, 8,173,202,107,114, 27, 95, 38,126, 18,113,237,167, 92,
+234,235,239,115,202, 23,226,247,236,108, 18,207, 36,237, 55, 26,139, 23,151, 1, 2,191, 7, 34, 19,241, 63,226,159,117,118,123,
+182, 86, 27,161,160,133,192,159,253,201,159, 66, 73,133,101,154, 75,126,121,221, 54,152,157,195,183, 31, 63,178, 10,253, 17, 93,
+215,225,116,185,160,110, 26,124,250,252,128,158, 1, 32,247,247,119,104,183, 45,126,247,241, 35, 54,187, 45,102,183,224,243,211,
+ 35, 22,239,224,130, 67,146, 18, 66, 41,116,155, 13,154,166,193, 56,246,101,122, 20, 99,196,195,195, 3,126,243,155,127,129,181,
+ 26,155, 77,135,182, 37,208,208,120, 57, 99,211, 54, 20, 52, 82,219,114, 97,108,186, 14, 77, 91, 99,113,174, 28,142,224, 75, 53,
+240,136,186,105, 90, 56,231,145, 4, 93,214, 82, 42,184, 16,209,117, 91, 30, 51, 19,105,146,200, 98, 10,151,115,207, 23,179,224,
+110,208,176, 10, 94, 20, 53,240,181,120, 85,180,167,103,138,152,181,213,149,180,197,145,160,217, 43, 31, 60,217,158,148,186,190,
+127,173,181,140,254, 36, 32, 75,165,201,221, 50,207,115,209,195, 0, 17,243, 50, 18, 85,140, 87, 15, 70, 81,172,179, 95, 34, 54,
+ 45,197,146, 78,172, 93,104,154, 6,227, 48,209,234,128,147,234, 46,253,128,105,162,142,124,191,223, 83, 44,106,226,224,151, 16,
+ 49, 12, 67,233,242,105,223, 79, 34,175,105, 26, 81,215, 21, 46,151, 30, 41,145,213, 44,231, 72, 44, 46, 64, 72,141,113,156,176,
+223,223, 33,132,136,113,156,217,127,191,131,214, 26,155,205, 22,211, 52,194, 24,137,221,126, 3,169,128,170, 54, 16,130,186,238,
+ 92,180, 85, 21,101,187, 95,250, 1, 85,211, 1, 74,225, 50,244,184,244, 23,108,186, 14,117, 93,243,250,129,186,246,105,154, 88,
+ 23, 5, 10, 29, 50, 6, 67, 63,148,231,219,167,136, 37,120,104, 99, 80, 91, 91,248,240, 84,216,232,146,148,214,214,213, 53,125,
+ 47,198, 82, 72,102, 95,251, 60,207, 44,180,244, 37, 76, 37, 49, 53,206,114, 3,148, 93, 74,134,201,128,203,226, 40,139, 32,128,
+ 59,120,130, 16,181,220,149,135, 24,202, 30, 63,165, 84, 66,116, 98, 74,152,189,195,101, 28, 32,164, 68,219,117,128, 16,232,167,
+ 17,144, 18, 62, 82,195,120,255,106,143,186,161,105,116, 93,215,168, 42,242,167,159, 47, 3,134, 97,196,111,127,251, 59,124,251,
+237, 39,134,228,204, 88,230, 5,222,199,226,176,137, 49,221,160,161,159,115,221,215,231,221,243,117,241,173, 8, 60,253,148, 75,
+ 61,221, 30,122,207, 89,114,207, 46,210, 4, 18,188,208,232,221,112,142, 46,131, 88, 5,253, 16,185, 27, 90,155,156,210, 85,120,
+164,181,228, 24, 83,138, 50,205,254,108,178,210, 19, 96,212,199,132,211,101, 96,143, 43, 94,228,224, 94, 71, 24,225,122,175, 39,
+ 42, 8,202,133, 30, 83,177, 42, 36, 14,107, 73, 41,194,249, 5, 46, 44, 8,209,149, 49,117,174,182,115,247,107,120, 63,110, 43,
+205, 85,175,184,218,159, 20, 93,134, 89, 44,183, 22,195,105, 30,183, 87,121,223, 94,118,237,164,130,175, 56,170,182, 48,218,179,
+244, 75,169,171, 58, 94, 73,206, 24, 79, 80,166,130,144, 10,255,244, 15,255, 21,255,225,111,254, 3, 62, 63,158,224, 67, 30, 93,
+223,234, 10,114,183,126,251,160,196,103, 78, 49,238,196, 21, 11, 26, 86,147,133, 27,130,218, 51, 5,121,222, 5,137,127,243,101,
+ 46, 94,228,197,125,233,153, 19, 55,123,119,241,162,240,174,144,243,152, 56, 40,211, 85,248, 86, 46,213, 31,194,193,254,193,187,
+243, 23,226,147, 18, 21, 98, 31,222,190,199,215,239, 63, 96,102,219,208, 60,207,168,155, 26,135,195, 1,159, 30, 62, 65, 72,137,
+227,249,140,118,179,193, 48,140,197, 82,153,132,192,235,183,111,176,217,108, 48, 78, 19,158,142, 71,188,253,240, 14,199,203, 25,
+223,126,250, 4, 83,215,216,221,223,193, 50,193,108,127,127,135,186,109, 32, 52, 93, 44,155,205, 6, 95,127,253, 53, 41,200, 35,
+141,155,115,146,214,249,124,198,175,126,245, 43,178,158, 1, 16, 49,225,240,249, 17,143, 15,159, 75,180,170, 82, 10,110, 33,223,
+245,200,140,113, 82, 24,211, 25,160, 88, 92, 55, 12, 35,237,131, 37, 93,196,243,188,148, 93,116,166,145,205,243, 76, 0,143, 0,
+ 26,207, 75,205, 99, 97, 95, 28, 42,249, 89, 8, 62, 18, 84, 70, 91,200, 36, 41, 83,155,187,177,124,137,208, 8,158,248,246, 11,
+ 7, 56,101, 68,178,229,244,171,140, 23,181,188,151,167,189,246,130,166, 38, 0, 11,141,168, 51,197, 11,215,207,217,147, 32, 77,
+242, 68,140, 98, 96, 47,120,245,234, 85,249, 60,180,162,215, 82,107,141, 77,215,224,116, 58,161,170, 42,156, 78,103,246,125,171,
+155, 51, 99, 89, 28,124, 72,120,120,120, 68, 93,213,104,219,134, 41,122,115,153,188,117,155, 13, 62,127,126, 98,161,161,196, 60,
+123, 44, 46,176,173, 42,225,116,186, 96, 89, 72,120,230,253,130,166,161, 63, 31, 66, 64,215,117, 68,249, 83, 2,221,166, 45, 34,
+184,148,136,112, 87,215, 53, 46,151, 30,117,211,224,112, 56, 34,248,128,199,167, 39,188,125,247,142,178, 51,164,198,166,221,226,
+116,188,160,239, 39, 84,198, 66,128,206,197,105,154, 8, 28,195,160,157,121,158,203, 52, 44, 99,173,179,226, 61,143,148,149,162,
+112, 42, 41, 36, 23,110, 28,141,203,194,177, 28,198,227, 98, 96,110,124,197,177,174, 26,167,211,105,149, 7, 33,216,137,160,177,
+219,109,153,254,166, 40,152, 70,106,198,210, 70,248,197,145, 14,131,239, 3,210, 25, 4,216,186,162,228,190,166,129,144, 18,143,
+199, 3,206,253, 5,117, 71, 74,248,203, 56,208,186,150,201,129,148,128,103,209, 52, 45,172,169,176,219,238, 80,217, 10,211,188,
+224,124,190,176, 38,193, 97, 28,167,178,130, 12,252,241,110,117, 90,120,177, 11,207,107,152,231, 22,182, 92,220,196,149,163, 75,
+ 70,241, 12,156,181, 82,249,170,148,169,141, 9, 81, 8, 68,153, 16, 50,171, 38, 1, 34, 31,130,217,200, 36,174,248, 87, 4, 10,
+106, 49,138, 70, 68, 34,195, 34, 82, 40,227, 75,210, 39, 11,136, 40, 24,129, 34,120,124, 7,168, 20, 97,101, 68,165, 19,197,120,
+203, 4, 37, 19, 68,242,144,140,142, 93,124, 66, 63, 56,120,159, 10,161, 46, 36,226, 71,251,228, 17, 57,161,139, 72,115, 4, 70,
+185, 25,171,174,246,109, 41,120,202,249, 77, 30,136, 14, 18, 1, 33, 82,151, 78, 2, 23,162,107,105,109, 33,160,175, 30,117, 91,
+ 81, 52,172, 18,136, 8,215, 44,119, 33,138, 95,155, 46, 28, 82,209, 39, 8, 68, 65, 95, 99,165, 13,239,107, 44,154,170,134,209,
+228, 19,213, 90, 67, 25, 66,208, 74, 45,145,164,128, 80,154,169,110,140, 72,148, 18,145,127,208,165, 11,124,251, 79,191,194,223,
+252,239,127,131,255,239,191,254, 10,206,107, 72, 65,212,163, 43,197, 69, 20,194, 87, 76, 52,121,136, 32,117,103,128, 71,132, 71,
+ 72,129, 69,189,226,170, 86, 84, 9, 73,103,238,123, 30,207, 7,234,254, 35,217,159,124, 10, 72,130, 2,101, 75,215,158, 86, 29,
+174,224,152,213, 68, 23, 65, 74, 9, 73, 10,242,105,231, 66,128, 89,253,215,184, 84,172,118,219,248, 94,184, 65, 17, 90, 9, 81,
+ 2, 93,168,219,141, 16, 34, 64, 72,207, 15,182, 4, 18, 23, 72, 34, 33,202,132, 40,185,239,142, 20, 1,160, 34, 89, 11,233,113,
+ 95,237,246, 25, 85,172,144,160, 94, 76, 63,255, 55,232, 80,178,125, 99, 21, 68,163, 32,160, 98, 66,171, 43,252, 47,127,253,239,
+208, 24, 11,132,132, 97, 28,240,120, 58, 96,156, 71,124,122,248, 22, 70, 43,244,227, 8, 99, 27,116,205,150,242,200,173,101,244,
+107,131,186,109, 16, 19,112,120, 60, 96,215,237,240,246,205, 59,156,207, 61,190,254,234, 27,116, 13,165,106,105,169,208,213, 53,
+ 54,117,139,233, 50, 33, 44, 1,117,213, 96,211,118, 24,134, 11, 30, 15,143,232,167, 30,170, 82, 56,143, 23,244,211,128,207, 79,
+143,184,123,253, 26,119,175,223,192, 54, 45,160, 52,102,231,209,108, 54, 88, 98, 64, 20, 64,223,143,144, 9,120,179,191, 71,171,
+ 45,144, 0, 31,232,253, 87, 91,141,176,204, 80, 66, 98,236, 71, 30,145,123, 32, 6, 44,115,102,207, 43,120,198,213,198, 24,209,
+182, 29,231,110, 3,243,226, 17, 24,100, 83, 25,131,200,236,120, 31, 2,117,142,206,195, 59, 79,193, 71,138,188,236,214, 90, 24,
+173,232,217, 74,192,253,126, 95, 20,204, 70, 19, 89,206,154,204,209, 72, 72,240, 48, 86,243, 65, 9, 84, 70, 66,201,136,202,200,
+ 98,165,205, 2, 46, 82, 63,123,204,139,227, 12, 11,192,242, 78, 88,155, 10,139, 15,148,187,109, 20, 42,173,208, 54, 53,180,182,
+152,134, 25,136, 64,215, 52,136,136,112, 33, 0, 66,163,178, 21, 18,127,221,206, 69,120,167,177,120,141, 99, 63,193,115,234,220,
+241,120,162, 34,104, 9,128, 82, 24,166, 11, 82, 92, 16,252,130,170,182, 80, 58,225,241,233, 1, 77,215, 66, 41, 1,239, 23,140,
+243, 0, 31, 29,217,179, 18,104,220,239, 34,206,167, 11,140,174,225, 93,194,120, 25,177,219,110, 97,173,134,210, 9,202, 10,232,
+138,128, 58,116,246,105, 40, 69,156,252,121, 30,177,223,111,161, 68, 66, 83, 25, 52,117, 13, 31, 60, 38,239,208,110, 55,152, 70,
+135,228,129,105,152,161, 57,220, 38, 38,202, 25, 23,146, 76, 58,214, 8, 84, 21,233, 33,206, 67, 79,157,110, 85,177, 6,151, 89,
+ 4,172,105,242, 49,209,101,108, 12, 11,168, 85,233,254,125,138,144, 70, 67, 87,150,210, 4,235,150,158,163,228, 33, 84,194,226,
+ 39,212,109, 5,201,178,171,203,212,163, 95, 38, 44,110, 97,187, 50,145, 2, 29, 91,237, 4,103,171,251,224, 89,252,167, 97,148,
+133, 95, 2,230, 97,129,134, 65,152, 34,220,228,233,162,238, 73, 95,224,157,131,155, 39,156, 79, 7, 72, 68,108,218, 10, 93, 91,
+115,134, 72,164,181,172,145,204,227,144, 76, 76,197,247, 92, 61,235,253,121,161,200,241, 68, 52,111, 20,215,116,185, 53,193, 16,
+140,203,250,193, 78, 34,119,232, 81,136,223,219,120, 93,119,156,116,200,210,110,216,148, 3, 57,138, 21,215, 93,174, 88,227,226,
+ 42,130,186,170, 92,217, 34,166, 36,180, 22,156,243,125,221,123,146, 85,199,225,233,120,102,232,140, 40, 80, 58,113,211,169,135,
+162,108,206, 47,194,245,255,209,254, 60,139,246,168,138,207, 99,247, 0, 36,129,224, 19,144, 36,121,110,121, 61,160, 20, 80, 85,
+ 36,126,203, 42,219, 44, 82,112,206,193, 5, 18,222,249, 72, 56,217,197, 69, 44,206, 23, 97,147,128, 40, 23, 90, 82,146,216,234,
+ 90, 33, 73, 1,105, 12,176,170,212, 37, 87,114, 16,128,145, 10,136,177,236,173, 52, 43, 75, 19, 36,190,253,197,239,240,239,255,
+183,191,193,223,253,237,127,193,228, 21,146,182,116,121, 33,222, 8,198, 74, 32, 3,114,122, 92, 42,107,135,152,109,127,121,148,
+157,147,218,212,213,191,126,149,206, 11,144, 23, 46, 2, 33, 82,130, 85,202, 80,151,151,144,197,233,167, 58,217,190,220,206,222,
+136, 69,190, 36,244, 72,207,246,223,226, 75, 91,163,239,205, 3,190,112,253,254, 15, 25,187, 23,154, 97, 18, 20, 27, 28,233,231,
+ 63,250,230,143,240,230,254, 53,230,113, 98,111, 44, 65, 77,126,249,235, 95,193, 86, 67, 42, 5,208, 0, 0, 32, 0, 73, 68, 65,
+ 84, 21,132, 36,154, 33,164,196,231,195, 1,237,102, 3,239, 35,218,174,131, 53,196,228, 62,159,122,236,247,247, 0, 4,198, 97,
+196,119,223,125,135,221,126,135,205,102, 75,254, 93, 99,208, 53, 45,144, 18,166,121,160, 72, 76, 79,123,242,105,154, 96,181, 41,
+120,231, 97, 24, 9, 25,107, 45,118, 59, 82,224,207, 51, 99, 87,121, 61, 52,142, 3, 46,151, 11, 37,122, 85,134,121,235,196,122,
+160, 98,148, 56,232,198, 84, 36, 26, 2,237,212, 19, 18,166,105,224, 20, 71,218, 53,135, 64, 52, 56,205,121,235,203,226, 49,114,
+ 32, 71, 74,137, 24,235,220, 93, 57,142,202, 76, 41, 64,241,132,143,192, 55,215,224,168,124, 88,110,183, 29,180, 98,150, 60, 79,
+203,242, 58,204, 23,235, 20,237,227, 41, 46,149,222,215,214, 24, 22,237,138,226,109, 15,156,103,158, 65, 33,222,123,108,183,155,
+219,245, 95, 78,168,100,117,119,126,110,115,172,232, 48, 12, 8, 46,192,106, 3,183, 44,164,140,182, 6,202, 24, 26,169,123,143,
+143,159, 62,211, 68, 67, 73,194,215, 26,130,247, 76, 51, 37,175, 73,173,201,110, 42, 5,166,113,134,146, 20,117, 26,188,199,110,
+183,131,228,175,125,230, 8,210,121,158,208,117, 45,141,166,103,178,176, 85,117,141, 97, 24,233,251, 39, 81,148,243, 74, 0,155,
+174, 35, 22,194,102,135,254, 66,161, 44,100,233, 3,180,164,238, 89,107, 89, 38,173, 49, 37, 24,166,231,121,231,139, 16, 85, 43,
+197,140, 3, 22, 42,118,180,235, 55,214, 34,197,136,243,229, 2, 33, 37, 44,235, 26,138,170,155, 99, 90, 83,162, 9, 75,182,149,
+ 45,203, 82,166, 58,121,189, 73,185, 4,137,241,190, 96, 76,110, 96,194,105, 36,123,176, 33,189,196, 50, 47, 24,199, 17,222,135,
+226, 29,167,176, 24,154, 50, 16,204,198,151,239, 89, 8,161,136, 24,145, 18,166, 97,130,247, 36,122,187, 92, 46, 8,254,250,121,
+140,211, 8,169, 72, 91, 98,141, 45, 22,233, 12,152,202, 69,124, 6,206,188,116,177,175, 99, 93,149,224,188, 2, 38, 76,222, 58,
+128,114,147,150,161,109,207, 7,156,226,167, 31, 77,235,106, 99,253,243,250, 13,243,195,170,224, 91, 37, 61, 61, 84, 60,130, 23,
+138,109, 6,215, 55,139,143,192,121, 24,209, 79, 11, 34, 36, 4, 43, 35,139,150, 11,130, 38, 9, 41, 19,228,192, 85,118, 44, 63,
+ 82, 10, 5,128, 65,217,203,148,142,157,147,125,178, 17, 91, 66, 35, 70,208, 42, 65, 11,216, 90,163,169, 13, 42,171, 75,176, 76,
+ 76,100, 45,153, 22, 79, 2,139,105, 65, 63,204,232,199, 9,227, 60, 99, 90,150,146, 67,236, 67,132, 7, 48, 35, 96, 73, 30, 14,
+ 17, 75,244,152,131, 47,163, 55,138,225,163,139, 84,177,178, 60,239,221,172,177,216,116, 91,116,109,139,224, 35,254,233,255,249,
+111,248,247,255,199,255,137,255,248, 31,255, 30,203,108,145,208,192, 65,192,203, 76,141,123,193, 35,189,254, 94,241, 78, 50,239,
+ 37,203,131,144,247,161,236, 87, 23,101,125, 65,127, 32,133,196,244, 47,143, 16, 86,208, 23, 6,207,224, 70, 40, 39,126,218,180,
+253,247, 5, 10,137, 31,130,217,136, 31, 40, 38,196, 23,234,137,223,239,255,252, 67, 57, 69,110, 68,123, 66,150,234,130,245,152,
+216, 52, 45,254,226,207,255,188, 0,124,165, 86,232,199, 1,253, 48, 82,135,194,170,233,105, 30,241,240,244, 25,194, 90, 36,169,
+ 80, 53, 13,217,107,166, 25, 90, 91, 40,166, 11,126,126,122,196, 47,126,241, 11,188,127,255,158,210,184, 30, 63,151,221, 97, 8,
+129, 20,237,187, 29, 94,221,223,161,109, 41, 32,101, 26,102,116, 93, 7,173, 52,218,186,229,221,177,198,155, 55,111, 75, 7,125,
+ 62,159,113, 60, 62, 97,187,237,224,150, 5, 90, 74,218,185, 43, 58, 86, 62,125,250,200, 5,118,164,137,157, 50,112, 81,192, 39,
+208,197,165, 53,230,121,226,117, 13,197,180,134, 16, 17,124, 38,242, 17,197, 98, 89,232,235,149, 66, 51,114, 52, 93,199,182, 44,
+ 62,106,186, 22, 82, 43, 40,163, 89, 23,114, 27, 79,153, 47, 0, 33, 5, 66,164, 78,188,156, 79,172,168,166, 88,211, 13, 21,187,
+ 60, 18,166, 75,225, 42,202,210,138, 64, 41,214, 26, 46,140, 40,106, 85, 74, 58,192,137,101,238, 89, 24, 24, 80, 49,183, 34,143,
+152,179,152,110,154, 38, 12,227,136,126, 24,224, 29,217,165,148, 20,104,155,182,116,181,195, 56, 82, 62, 55, 8,160,146,133,102,
+ 89, 27, 20,188, 99, 24,143, 69,211,109,176,184,192,176, 41,138,161, 30,135, 17, 74, 72,178,164, 9, 32,134,128,121,158,112,183,
+223, 34,120, 71, 64, 22, 73, 19, 11,231, 23, 52, 93,131,197, 17,208, 40, 37,242,118,247,125, 79,226, 92, 65,233,118,109,219, 17,
+235,129, 77, 51,185, 72,200,194,190,101,153,233,220, 74,169, 20, 87, 62,120, 30,171,107,246,144,207, 37,225,205, 90,139,224, 61,
+182,219, 45, 57, 3, 88,196,102,180,226, 51,156, 67,154,184,153,161,124,242, 26, 70,170, 66, 12,205, 14,130,138, 93, 69,125,223,
+195, 48,160, 40,132,192,193, 41,180, 94, 93,143,188, 37,195,126,168, 96, 0,206,231, 30, 33, 68, 28, 15, 39,104, 93,241, 90,150,
+190,111, 57,201,142,210,175, 73,143, 36,100,134, 5, 41,244,253,128,203,101,128,115, 17,134, 89, 17,211,188,240,189, 65,168,239,
+235,121,152, 74, 97,243,252, 28,123,110,183,198,202, 73,148,158, 69, 68,223,238,211,179, 0, 26,208, 41,165,231, 18,244, 31, 39,
+140, 43, 60,239,116,147, 99,157, 85,214, 66,210, 56, 80,200,219, 36,153, 40,210, 45, 26,180,140,134, 19,123, 84, 51,219, 36,225,
+170,211, 34, 15,183, 34,131, 22, 66, 76, 88, 66,196,225, 52, 98,114, 17, 81,152,107,231,243,236,142, 16, 0, 82,160,174, 91, 40,
+138, 26, 75, 69, 65, 40, 86,127, 42, 34, 70, 89, 38, 1,130,248,161, 48, 74, 33,196,128, 74,106,182,167, 41, 52,141, 65,221,214,
+ 48,214, 20, 10,212, 60, 59, 76,227,194,187,170, 72,235, 10,182,207,208, 5, 77,133,200, 60,207,136,209, 67, 25, 5,176,198, 77,
+ 43, 69, 35,170, 36, 75, 96,132,139, 1, 22,134,112,174, 41,193, 26, 13, 83, 87,208, 66,160,110,106, 36, 0, 31, 63,126,198, 47,
+126,245,107,252,167,191,255, 7,252,221,127,254,127, 49, 78, 9, 16, 21, 2, 18, 60,104,244, 44,217,105,112,179,131, 78,226,198,
+143, 77, 13, 55, 67, 79,210, 51,193,216,106,116,143,117, 78, 74, 14, 56, 23, 18,222, 5, 4,255, 18, 39, 64,148, 78, 55,221,110,
+245,191,215, 85, 63, 7, 1,253, 88, 5,252,143,101, 39,124,249, 47, 74,215,156,247,155,143, 47,190, 52,179,250,131,119,234,153,
+ 62, 43, 25, 54,243, 87,127,249, 87,120,247,230, 29,146,243,240,129, 2, 82, 2,103, 31, 72, 41, 41,241,111,153,201, 78, 36,129,
+ 57, 6,232,224, 81, 53, 45,164,247,120, 58,158, 48, 44, 51, 90, 78,190,170, 42,242,157,191,122,245, 10,199, 35,101,111,127,243,
+213,215, 56, 28, 14,165,147,253,240,254, 29,206,167, 19, 31, 92, 17, 85, 67, 65, 27,222, 5, 76,105,194,118,179, 69,221, 52,136,
+ 49,225,241,241,145,194, 65,140, 65,215,209,110,122, 94,102,188,123,247, 22,138,187,179,211,249,132, 97, 28, 97,154, 14,154, 11,
+ 67, 31, 34, 32, 13,134,121,193,253,253, 22,227,116, 66,219, 53, 68, 23, 19,146, 25,237,156,236,184, 58,208,134, 97, 96,125, 14,
+ 81,206, 22, 63, 65, 1, 72, 90,195, 50,171, 33,242, 97, 41, 1,222,183, 11,196, 20, 72,127,147, 18,106, 91,209,112, 41,239, 30,
+133, 64,215,181,184, 92, 46, 64, 4, 57, 10,184,195,116,195, 66,170,241,182,225,169, 33,217,177,188,247,240,110, 1, 18,101, 64,
+248,144, 80, 85, 53,172,214,184,156, 78,184,219,239,160, 13,117,139, 21,235,103, 32, 18,166,121,164,169,163,161,110,221, 90,131,
+105, 14, 48,150, 58,248,121, 89, 10,243,190,170, 44, 46,135, 1,109,211,226,112,248, 12, 33, 64,133,146, 20, 28,162, 66, 23, 27,
+249,204, 19,148, 36,180,238,227, 52, 97,154,103,138,129,213, 26,195,229, 2, 41, 18,166,105,196,219,215,175,240,240,244,136, 97,
+ 28,161,165, 68,183,223, 35,248, 19,148, 4,234,198, 34, 38, 15,200, 4, 23, 28,108,109, 17, 99,192, 48,142,184,219,111, 41,116,
+103,158, 97,180, 66,138, 1,203,180,144, 5,172,161,181,164,181, 26, 93,215, 22, 98,158,227,188, 0,176,189, 44,167,218, 53, 90,
+ 67, 70, 73,160, 21,231,209, 54, 13,230,121, 65,101,107,248, 56,150,174,124,158, 38, 88,187,129,209, 26,209, 82, 1, 20,125, 40,
+196, 78,169, 8,251,154,197,139, 90, 73, 90,119,240, 74,198, 90,131,197,121, 44,243, 82,224, 95,212, 40,145, 40, 79,115,120,141,
+ 16, 10, 81, 0, 73, 36, 44,110,225,156,115,176, 53,212, 96, 28, 39,214, 46, 25, 40, 41,177,217,236,112,185,156,139,237, 45,132,
+ 64,217, 8,145, 18,248,186, 13, 77,115, 47,253,192,103, 44,221, 49,222, 5, 44,252, 58,144, 8,251,138, 84,255, 33,186,230,186,
+ 33, 94,223,151, 47,137,193,179, 96, 56,165, 4,157, 63,129,223, 59, 82, 23,171,234, 32, 51,219, 83,188, 54,101,207,192, 27, 49,
+ 70, 24,197,163,119,200, 27, 99,124, 90,141,199,111, 4, 79, 92, 32,136,148,253,185, 2, 90,230,125, 65,198,115,243,200, 92, 72,
+140,139,199,105,152, 49, 57,202, 55,142, 47,116,101,197,194,197, 42,246, 24, 37,164,178,132, 86, 21,130, 5,225, 98,117,192,114,
+215, 45, 19, 82, 80,144,194, 0,130, 60,225,109, 91,163,174, 13,186,109,141,186,109,174, 96,143,101,193, 50, 77,184,244, 61,250,
+203, 64, 7,153,169, 96,235, 26, 82,209,133, 15, 17,225,221,130,203,185,199,227,227, 35,148, 0,238,246, 27, 52, 77, 5, 32, 64,
+ 41, 1,107, 27,212,117,131,228, 3,144, 2,108,101,200,198,226, 28,133,159,168, 10,151, 97,132, 76, 17,143,135, 39,156,143, 39,
+ 60, 62, 29,240,187,135, 3,126,249,235,239, 48,204, 14, 1, 9, 72,196,186,150,130, 87, 7, 47,161, 4,139, 98, 80,176,231, 53,
+242, 24, 62, 19, 1, 25,173,154,194, 85, 57, 95, 46,121, 94,175, 72,197,119,189, 44, 15,236,181, 96,138, 69,160, 39,120,159, 84,
+ 2,124, 50, 69, 54, 82,183, 69, 59,212,103, 36, 58, 33,111,208,174,185,240,204, 19,145,151,124,234,233,197,135,152,125,241,248,
+ 2, 14,118,253, 53,241,106,226,185,126,244, 90, 17,139,103,140,154,244, 19, 10,140, 47, 21, 38, 40, 49,180, 34,210,133,244,205,
+ 87, 31,240, 23,127,242,103,208,202,224,241,241,128, 16, 61,206,253,137,246,149, 51, 93,230, 74,107, 40,173, 40, 43, 92, 27,244,
+243, 8,239, 28, 94,223,191,193,211,225,128,152, 18,246,251, 59,204,206,193,197,136,251,205, 14,155, 77, 87, 60,217, 95,125,245,
+ 21, 14,167, 35,230,113,194,215, 95,127, 13,107, 12,166,113,196,127,255,231, 95, 96,191, 35,196,235,221,221, 29,217,144, 78, 1,
+ 41, 38,108,119, 59, 28,142, 71,108,183,219, 34, 34, 3, 18,190,251,248, 29, 0,178,126,229,212,171,105, 89,224, 98,128,177, 26,
+ 66, 36,108,187, 22,167,126,130, 47, 88, 32, 89,118,224, 74, 83,193, 55,140, 19,150,217, 99,183,107,177, 44, 35,251,148,175,194,
+ 40,218,173, 55, 24,134, 30,202, 82, 2,219, 52, 45, 80,218, 96,114, 30, 49, 17, 79,219, 71, 79,226, 62,101,216, 74,167, 74,225,
+125,253, 59,232,146,205,108, 5,109,136, 41, 30, 4,241,197, 51,234, 52, 7,109,180,117, 75, 96,157,101,193, 6,192,221,118,135,
+143, 15,159,224, 22, 2,141, 40, 9,204,211,136,205, 55, 95, 33,196,128,121,158,177, 44, 11,236, 42, 51, 93, 8, 20, 43,234,250,
+215,117,221, 20,214,187, 97, 37,246, 50, 59,104,229, 32,165,134,214, 9, 77,109,153,234,167,120, 21, 50, 65, 91, 42,168, 98,240,
+ 84, 84,205,142, 2,104,184, 8, 52,172,228,159,166,137,212,234,214, 98, 24, 7, 38,164,121, 84,149,129, 15, 14,186, 34, 68,173,
+159, 2,198,105,194,110,183, 3, 0,140,125,143,121, 94, 72,127,177, 44,204,142,151,220,164, 92, 47,157,188,130,201, 72,219,106,
+211,178, 48,177, 94,165,169,145,192,114,179,221,160,170,106,156,143, 39, 68,203,205, 32,239,247,199,105, 68,219,182,152,230, 25,
+ 93, 36,126, 64, 85, 9,122,221,103,130,181, 4,239,161,249, 92, 52, 70, 48,221,111, 66,219,212, 8,140,162,205, 81,175,203,226,
+ 48,141,148, 65, 95,215,121,162, 74,231,142, 20, 2,218, 88, 4, 65,147, 15,183,120, 68, 73,235, 23,130,231, 4, 78,140,139,236,
+ 61,167,152,220,152, 0,231, 3, 52, 39,212,229,243,108, 28,168, 0, 72,145,224, 67,203, 66, 86,194,156, 52, 26, 10,158,252,122,
+ 78,228,201,207,247, 59,238,244, 61,215, 84, 78,216, 20,207,214,223,235,223,155,196,245,156,212, 63,220, 77, 92, 79, 98,241,133,
+166, 93,172, 84,229,249,178,200, 76,226,239,143, 49,129, 64, 3,243,103, 99,224, 4, 41,215,209,170,121, 2,204,168, 88,228, 49,
+ 55,224,163,192,121, 90,240,120, 26, 16,160, 24,113,154,243,198,174, 61, 97,140,171, 41,112, 81,188, 39,164, 66,165,122, 54,210,
+205,246,152, 20,233,122, 18, 2, 74, 89,212,149, 70, 93,147,202,221,121,143,195,241,140,167,199, 39, 12,125,143,203,153, 84,171,
+211, 56, 97,154, 23, 72,169,177,191,187, 67,203, 20, 38, 33, 37, 34,143,118, 62,125,247, 17,167,227, 17,247,119,123, 88,165, 33,
+ 3,121,193,147,150, 16, 30,240, 51,137,126,108,109,161,140,196,209, 26, 24,173, 72, 52,162, 20,132,136, 37,216, 69, 64,194, 71,
+133,195,197,227,183, 31, 31, 49, 46, 4,224, 17,201, 19,120, 55, 82,202, 87, 38,185,149,139,135, 95,158,192,253,115, 2,117, 41,
+ 49, 37,122,248,214,223,220,144,138, 24, 46,197, 8, 81,210,206, 88, 76,198,247,174,243, 1, 33, 94,115,216,138, 24, 82,144,250,
+159, 30,230,156,192,247,108, 64, 35,226, 74,125, 47,190,172,233,248,177,172,226, 23,198, 88,171, 80,247,162, 39, 40, 95,169,100,
+118, 66, 38, 56, 9,249,189,207, 35, 71,136,190, 12, 70,198,247,222,136, 63,229,159, 24, 3, 52, 20, 84, 74,232,234, 22,255,235,
+191,251,159,113,183,223, 99, 25, 38, 76,227,136,113,185, 16,146,114,153,139,157, 39,132,128,205,102,131, 20, 19, 78,151, 51,148,
+ 49,216,236, 91,156, 78, 39, 92, 46, 23,216,182, 70, 63,244, 8, 49,162,169,107,216,202,226,112,120, 66,215,181,104,219,134,157,
+ 30, 30,218,106,132, 20,112, 60, 13,240,203, 76, 73, 82, 90, 99,179,219,225,120, 62,225,225,211, 3,172, 49,216,110,183,228,143,
+247, 14,143,143,143,204, 29,127,130, 15, 30,253, 64,169,112,247,247,247,136,142,152,242, 79,199, 3,132, 0,222,191,123,139,223,
+126,251,145,130, 53,120, 2, 55, 79,148, 55, 29,131, 69,136, 17, 94, 0,182,169, 33, 68,196,226, 3,134,113,130, 82,228,149,142,
+105, 34,165,246,236, 80,215, 36,100, 50, 21, 29,224,199,211, 9,187,205, 6, 9, 18,159, 63, 31,176,221,111, 81, 65, 34, 4,183,
+154,252,241,235,171, 52,130,136, 48, 82,115,115, 1,196,152, 47, 63,205, 7, 52,117,189,222, 57,182, 69,145,170, 88, 49, 95, 62,
+197, 8,173, 52,134,190,199,118,187,197,221,126,143,223,124,251, 17,206, 59, 64, 73,180,109,195,187,102, 95,242,212,243, 51, 65,
+205, 13,138,250,222,121,143,170,178,101, 71, 91, 91,138, 68,165,137,135,131,214, 6,227,200,222,104, 75, 89, 15, 20, 13, 74,123,
+245, 24, 35,134,161,199,235,215,175,113, 58,158, 32, 5,185,132,178, 94,166,109, 91, 76, 61,185, 11,218,166,194,226, 28, 18,211,
+231,172,173,112,185,156,177,221,110,177,221,108, 48,177,215,188,109,106,204,211,204, 73,136,130,115,202, 29, 22,199, 34, 66, 41,
+225,184,152, 91,150, 9,231,243, 25,219,109, 87,214, 19,132, 19,246,104, 27,178,240, 65, 8,230,238,147,109,119,156,105,124, 93,
+177,162,126, 89, 28,218,166,161,181,138, 97,148,175, 15,112,126,161,139,189,109, 48,142, 51, 77, 49, 91,154, 4, 44,129,166, 27,
+ 77,219, 32, 56, 15,173, 36,147, 62,105,149, 52, 12, 35,229,117, 40,242,118, 71,166, 6, 54, 77,205, 23, 98, 68,240,129,232,133,
+222, 67, 10, 58,226, 20, 67,122, 0, 96,153,201,181,225,150,165, 12, 35,115,210,223,167,239, 62, 65, 41,137,237,102,135,166,173,
+ 17, 34,112, 57,159, 1,154, 27,149,160, 30,234,129,228,141,134,233, 57, 60, 43,143,245, 95,212,164, 61,179,237,230,139,253, 86,
+ 32, 44,174, 41,164,160,179, 88,112, 88,215, 15, 94,234,226,102, 37, 42, 94, 94,126,166,239,119, 44, 25,119,153,138,149, 40,219,
+203,168,179, 22,223, 27,165,230, 47, 64,144,152, 59,243, 77, 68, 86,224,115, 39,149,136, 34,119,238,103, 28, 47, 3, 2,232,210,
+132, 72, 16,130, 50,206,229, 74, 20,166,147,188, 2,103,104, 57, 65, 59,244,120,187,203, 23, 2, 8, 17, 69, 8, 19, 34, 89, 73,
+220, 2, 92,206, 14,126,233,241,244, 8, 56,191, 32,120, 7,239,151, 18, 31,152, 85,211, 49, 1,214,106,124,126, 58,226,225,233,
+ 68,133,138,162, 0,142,105,114,152,135, 9, 82, 86,240, 1,120,248,252,132,222,144, 26,184,237,106, 84, 76,221,139, 49, 98, 26,
+ 21, 18,184,242,228,177,227,221,126, 75, 89,207,117, 5,163, 13,130,143, 56, 31,123,124,252,120,192,185,119,164,205, 22,170,140,
+214,197, 13, 95,141,225, 49,105, 5,135,201,177,227,140,141,141,121, 13,147,167,236,249, 27,231, 3, 82,136,164, 88,143,145, 96,
+ 8,145, 46,252,228, 3,132, 19,112,227,140,232,175,224,161,196, 68,193,117, 70,123,190,208,175,124,249,231, 69, 99,250,130,141,
+237,217,115,242,111,158,128,191,208,213,179, 0, 48,177,113, 48,189,192, 56,184, 29,121,137, 50,213,249, 82,184,194,143, 29,192,
+ 43, 65,149,181,145, 10,127,253, 23,127,137,159,125,248,138, 38, 63,231, 51,139,183,124, 97, 67,103,116,171,155, 38,182,140, 25,
+124,120,251, 22, 82, 91, 24,165, 49,187,153,198,191,188, 23,221,237,118,232,218, 14, 33, 44, 72,137, 0, 50, 66, 8, 28, 14, 79,
+208, 90,227,221,187,119,116,121, 69,178,156,109,119, 59,196,148,240,116, 60, 64, 41,133,182,235,240,225,253,123,244,151, 11, 30,
+ 62,125, 42, 84,175,166,233, 48, 12, 3, 32, 5,246,251, 59,238,110, 35, 62, 61, 60,160,105, 27,212, 77,131,174,107,208,247,103,
+ 32, 56,204,227,128, 8,137,170,170, 17,162,134, 54, 21,134,126, 68, 76, 14,213,221, 22,211,228, 32,164,130, 18, 10,144, 36, 14,
+243,145,220, 55,227,236,208, 15, 19, 32, 36,238, 95,147,176,235,116,190,176, 24, 87,225,112,188,192,214, 45,170,170,197, 52,205,
+136,129, 46,150,105, 36, 37,119, 85, 17,102,213, 26,195,176,170,137, 73,102, 52,105, 75, 70, 97, 26,103, 52, 13, 89,175,130,247,
+136,193,163,107, 91, 58,179, 2,176,112,228,234,208, 79,176, 70, 96, 26, 71, 84,117,197, 93,183, 7, 18, 80,217, 22,145,237,162,
+ 90, 43, 56, 79,112, 29,164, 84,172,170,217,235, 78, 29,233, 4,109, 12, 42, 83,151, 14,126, 24, 71, 84,182, 65,223,143,104,155,
+ 14,243,178,224,245,155, 59,140,227, 64,227,226, 8, 44,203,204, 72, 93, 90, 5,236,182,244,250, 73,238,252,171,186,194,229,124,
+134,150,180, 3, 79, 41, 97,179,221, 64, 27,139,105,114,164, 14,175,168, 64,147, 66,194, 72,133,218, 90, 56, 31,176,233, 90,164,
+ 72, 46,131,170,170,208,247, 23,180,117, 67, 62,240,156, 61, 97, 44,148, 18, 88,220, 66,177,187,150, 26,164,236, 91,207, 22,189,
+190,191, 92,189,229,110, 41, 19, 11, 29, 52,154,174,197,120,238,203,229,150,152,141,191,196,132,168, 53, 46,125,143,221,110, 91,
+108,179,153, 37,176,184, 25, 49, 37, 74,116,144,215, 75,114,156, 39, 52,204,153, 15,188,243,214,154, 10, 72,136, 88,194,107,134,
+254, 2,109, 42,206, 30, 80, 69, 40, 72,162, 60,135,187,253,190, 8, 17,221,226,176,184, 5, 66, 42, 4, 31,209,181, 27,108, 55,
+ 59,156,207, 61,158,158, 78, 16, 74,195,249, 0,107,235,210,205,123, 23,160, 20,217, 42,165,210, 76,219,123,174, 1,190, 69,140,
+175, 3,158,214,133,224, 13,135, 35,165, 50,193, 44, 92, 45, 92, 69,201,249, 60, 74, 12,176,209, 63,106, 70,248,130,162,105,157,
+195,157, 86, 42,246,117, 40, 72, 25,123,138,116, 19,248,158,253,192,226, 38,215,156,179, 66, 4,195,255,139, 48, 14,183, 24,205,
+ 4, 44,222,227,112,186, 96,246,137,243,209,193,217,220,162,200,224,178, 74, 54,164, 88,178,179,165,188, 34, 99,197,106,236, 42,
+ 56,150, 16,137,197, 98,158, 84, 75, 62, 69,244,126,198, 60, 73,104, 38, 10, 9, 8, 64, 94,191,150, 24, 19,124,204, 93, 65,194,
+236,103, 86, 71, 82, 8,133,144,156,225, 30,129, 36, 52, 53,134, 81, 96, 90, 60, 82,162, 29,145, 13, 17,202, 57,104, 41, 41,131,
+218, 57,202,109, 23, 26, 65, 70,104, 8, 36, 23,145, 92,132,131,199,176,140, 88, 22,135,199, 99,143,195,231, 39,132, 57, 2,202,
+ 0,146, 2, 62, 68, 2,146, 8, 44, 16, 20,101,124,115, 51,182, 89,125,227, 18,152, 77,195,204, 99,153, 31,158, 72, 93,186, 8,
+ 17, 8, 1, 34, 23,151, 4,146, 7, 66, 64, 92,128, 48,249,155,209,122,174,138, 19,219,218, 18,178, 58, 83,254,168, 75,247,182,
+178,205, 75,254,244,163,246,237,162,164,243,229,103, 42,173, 42, 24,241,114,239, 47,202, 44,124, 21, 26,252,220,199,143,155,160,
+ 17, 82,172,226, 95,221,161,103,241,139,224,159,223,190,253,128, 63,250,250,107, 12,231, 11,150,105,134, 53, 85, 25, 61,167, 20,
+ 9,136,178, 44, 24,199, 9,155,110, 3,173, 37,234,170,194,249,124,198, 52, 46,192,187,247, 20, 4, 82, 91,156,143, 39,212, 29,
+165,127, 33, 6, 60,126,126, 36,145,167, 82, 24,134, 1,175, 94,189, 66, 8,228,243, 61, 28, 14,168,235, 26,253, 48,161,217,108,
+ 49,140, 35,188,119, 4,154,233, 90, 28, 14, 7, 24,173,113, 56, 62, 97,179,219, 66, 73,133,113,236,169, 8,140, 9,222,147, 66,
+221,123,143,101, 38, 37,246,228, 39,156,250, 19, 68, 32,129,153, 72, 36,230,154, 83, 32,149,116,140, 84,148,158,123,236,183,148,
+ 36, 54, 46, 35,137,205,234, 14, 33, 56, 76,147, 71, 74, 10, 49, 58,104, 67,133,240, 60,147,208,116,158, 22,236,119,119,152,102,
+ 7,109, 45, 98,138, 60,190,159, 72,117,207,221,154,181,150,163, 70,105,207, 29, 19, 10, 96, 69, 73, 74,100, 28,199,249, 26, 15,
+ 26,105,213,164, 36,141,200,173, 49,112,137, 70,173,121,159, 93,158,239, 24,209,117, 27,244,227,200,214,208, 88, 18,194,148,209,
+208, 33,192,185, 5,155,174, 33, 68,174,214,240,222,227,114,185,160,110, 27,138,115,101,129, 30,248,140, 84,156,230,149,189,199,
+ 53, 83,217, 98, 76,104,219, 26,199,241, 66,172,130,186,194,188, 56, 98, 2, 72,195, 88, 92, 98,195,199, 64,182,172,168, 52,180,
+ 37,174,189,115, 30,155,221, 14,198, 26,156, 47,103, 84,246,158, 40,121, 85,133,138,215,136,193, 5,116, 13,141,191,199,121,132,
+ 49,166,124,252,217, 19, 27,127,215,109,112, 60, 28,177,217,110, 86,103, 58,157,123,231,203, 5,247,175, 94, 65, 36,102,234, 43,
+162,171, 93,211,214,136, 93, 32,149, 66,101,175, 0,152,188, 10,245,142,138, 86,114, 51, 80,183, 94,213, 21,166,113,130,150,154,
+206, 73, 73,123,244,166,105, 41, 82,117,113, 80, 70,195,104,195,235,142,170,248,192,149, 84,156, 70, 71,104, 87,205,148,187,217,
+185,114,239, 12,195,192,226,190, 80,132,126,251,253,158,119,231, 36, 94,156,231, 25,227,228, 33,132,198,253,253, 43, 76,147,199,
+188,204, 56,158, 46,232,186, 22, 62, 57,108,186, 13,124,240,152, 49, 23, 17, 92, 62, 27, 40,111, 67,222,136, 99,115, 26,161,148,
+226, 69,152,204,243, 64,163,245,250,145, 6,168,177, 52,203, 57,200, 77,176, 37, 24, 0,180, 76,183, 99,244,239,229, 99, 37,222,
+ 49,198, 72,227,228,155,197,168,224, 96,150, 84, 22,248, 41,239,196,165, 42, 34,185,152,200,151,157, 45, 97,105,213, 21,230,143,
+147,119,230,178, 8,228, 68,129, 66,208, 72,136, 14,192,144,128, 97,241,120, 60, 93, 48,135,136,112, 19, 1,195, 99, 97,145,120,
+252, 65,133,128, 92,101,178, 95, 63,236,181,184,144, 43,225, 88, 30,190, 42,102,186,107, 73,133, 6,196, 85, 25, 78,150, 2,193,
+ 17,172,196,250,165,106, 91, 23,102,187, 20,146,242,186, 99,162, 9,128, 22,136, 50, 64,196,192,190, 88, 10, 92, 0, 63,212, 70,
+107,104, 41,160, 4,141, 12, 3, 18, 68,164,143, 45, 66,196,120,238, 17,150, 5, 49,177,121, 92, 40,124,122,120, 34,176,129,146,
+112,145,253,218, 55,187,226,196,223,191,231,221,251, 42, 81,143,215, 13,217,138, 18, 18, 21, 51, 49, 70, 8, 31, 32, 92, 34, 75,
+186, 79, 16,129,255, 36,197,186,209, 19,229,242,216, 94,177, 45,139, 8, 4, 73,144,150, 32,242, 8, 35, 9, 89,160, 52,105,181,
+155,206,223, 39, 33, 82,177,196,137,213,234, 39,173,171,213, 31, 49,123, 79,107,218, 48, 23,122, 55,192, 28, 60,203,100, 47,246,
+146,181,214,227, 86,156, 66,206, 11,241,226,152,172, 92,254,171, 34,181,216, 43,229,122, 71,149, 86,226,210,108,191, 84,144, 49,
+160,171, 27,252,245, 95,254, 79,184,219,239,225,103, 15, 31, 22,156, 46, 7,156,206,103, 64, 36,140, 19, 17,187, 8,228, 68,175,
+227,110,187,195,225,240,132,227,211, 1,119,247,175,105,132,218,117, 56,156, 79, 80, 90, 66,178, 21,232,243,225, 0, 99, 52,170,
+186,198, 50,207,104,234, 6, 34, 1,187,237,142, 49,178, 35,148,210,248,230,231,223,208,126,112, 28, 49,207, 11,238,238,238,224,
+131,199,241,120, 68,140,100,101, 67, 4, 22, 79, 22,168,124,192,236,247,123, 24,182,208, 9, 45,113, 25, 46,104,187, 6,195,255,
+ 95,219,123,245, 72,150,101, 89,122,235,200,171,204,204, 85,100, 70, 86, 85,139,170,174,233,230,176,197,160, 89, 51, 32, 7, 4,
+136,121,224, 31,171,255, 70,240,129, 36, 8, 18,131, 1,134, 28, 73,150, 72, 25,225,238, 38,174, 58,146, 15,123,159, 99,215, 60,
+162, 68, 79,131, 72, 56,144, 25,233,225,194,236,222,187,207,222,123,173,111, 57, 71, 15,111,101,224, 98,194,176, 31,112,254,238,
+ 59,100,165,145, 5,152, 90,214,194,249,132, 24, 9,114,211,118,150,238,151, 40, 32,165,193,229, 76,241,163,198, 52, 88,215,133,
+149,226,132,225,164,248, 77,139,203,101,132,210, 10, 58,179, 99, 68, 72,196, 64,226,165,242, 96,156,151,153,198,174,172,202, 39,
+130,156,198,234, 29,233, 89,140, 70,138, 1,166,109,185,155,214, 88, 47, 23,180,253, 0,100, 73,171, 0, 0,166,209, 12, 96, 34,
+145,173, 53, 26,139,147, 72,209,211,154, 43,209, 33,191,109,104,151, 45,100,177, 66,177,192,141, 73,152, 25,148, 37, 62, 77,180,
+227,166,152, 89, 18,212, 46, 43, 65,132, 74, 40,203,178,144,178, 92, 21,239, 52,191,246, 90,155,250,251, 27, 99, 33, 20, 37,195,
+ 41, 69, 84,181,224, 3,250,190, 65, 78,132, 42,109, 58, 7,219, 24,164, 64,226,214,152, 50,219,228,136,119, 79,214, 94, 58, 88,
+ 12,125,203,182,183, 1,110, 89, 48,244, 29,188, 91,113, 74, 39,220, 63,220,241,129,160,133,243, 43, 91,250, 18,164,210,152,167,
+ 9,187,190, 71, 74,180,214, 88,152, 52, 55,236,119,112,222, 97, 89, 9, 7,236, 87,135, 97, 24, 48,142, 35, 86,190,174,181,209,
+149, 5,159, 82, 64,224,131,129,214,196,146,151,138,228,213, 49,208,228, 74, 25, 11,169, 8,196,162, 5,224,188,135,140,148, 46,
+ 87,240,187,133, 35, 16, 19,139,115,165, 36,187, 90,112, 80, 41,213,240, 25,128,192, 70, 33,174, 48, 38,160, 31,122,198, 17,175,
+ 72, 73, 98, 89, 60,188, 59, 33,236,129,251,251,123,188, 30,143, 20,110, 36, 22, 36,166, 30,106, 77,169,118,151,203, 5, 74,209,
+ 84,136,108,127,226,118,121,189,157, 92,102,124, 70,187,115,187, 58, 44, 63,159, 20,106,195,225,192,173,182, 72,242,131,156,191,
+135, 22,249, 42,134, 78, 27,240,140,168,163, 81, 9,153, 36, 32, 18, 37,163,229, 34,117, 81, 87, 47,148,188, 29,110, 10,228,234,
+201,204,226, 74, 88,163, 4, 50,121,197,168, 22,235,155,144, 27, 72, 11,179,221, 69,190,102,179, 11,208,104, 61, 5,248,152,113,
+ 26,103,188,142, 11,124, 77,220, 42,187,220, 92,225, 16, 98, 99,181,203,155,177,173, 40,106,231, 58,182,184, 42, 12,165,144, 4,
+ 54, 96, 1, 71,230, 56,215, 36,202,215, 74, 85,241, 95, 60,210,214, 18,171,217, 52,133,215,174,160,149, 4, 68,134, 91, 51,141,
+ 18, 61,249,225,115, 34, 5,128, 81, 9, 70,117,176,182,229,155,149, 59,217,124,109, 28,181,208, 16, 28, 35,152, 98,196,186, 68,
+204,243, 10,161, 53, 76,211, 35,228,128,231,227, 5,179,247, 68,183, 23, 2, 89, 68, 26,125,151,195, 77,206, 92, 96,100,229,246,
+109, 15, 86,145,127,223,148, 50,124,202, 88, 99,196,226,201,150,231,157,135, 88, 21,212, 28,144,155,136,108, 50, 96,248,112,148,
+ 37, 67,100, 36, 68,144,144,194, 32, 11, 67,224, 20, 0, 49, 43,134,253, 4,250,158,124,209,137,156,144, 33,107,130, 31,237,170,
+ 21,131,136, 74,144, 74, 70,190, 25,204, 51,181,174, 28,170,242,239,219, 17,149,115,155,172, 35,117, 42,216,183,199,213, 44,182,
+192,151,171,167, 79, 8, 74,212,146, 72,181, 48,127, 78, 73,178, 21,206,213, 33, 88, 61, 43, 72,206,168,231, 4, 63, 72, 62, 81,
+ 71,100, 73,163, 14, 37, 20, 16,121, 34,149, 51,254,242,167,255, 4,127,254,227, 63,197,114, 33,172,230,101,186, 32,164,128,211,
+244, 66,157,140,164, 93,173,159,124,189, 94,231,121,193,186, 56,220, 63, 60,160,105, 27, 76,227,132,251,199, 7,232, 89, 35,172,
+ 1,141, 53, 88,215, 25,182, 33, 43,217,241,116, 65,138, 17,187,182,131,150, 26,211,121,194,241,120, 68,215,245,248,242,203,247,
+ 72,193,227,187,239,190,133,210, 22, 63,249,209, 79,208,116, 13,190,253,246,107,140,203, 8,169, 36, 58,165, 48,141, 51, 89,178,
+152,108, 23, 98,128, 91, 86, 60,127,248,136,195,221, 30,115, 48,128,207,184,156, 79, 56, 12,123,104,105,176,172, 4,101,249,248,
+195,119, 16, 57, 64,100,129, 12,133, 36, 37,238,238,239, 33,181,198,188, 78,208, 10,136,222,195,173, 26,171,163,128,149,144, 2,
+164, 38, 52,170, 84, 18,151,113, 68, 10, 52,197, 58,198, 35, 30,159,190, 64, 18, 10,110, 13, 80,193, 67,138,132,156, 2, 36,128,
+195,195, 3,143,170,105, 28, 43, 53, 41,240,141,166,123, 42,178,221,169,181, 13,148,148,232,153,242, 22,130,163,113,114,211, 82,
+195, 34, 0, 23, 35,132, 86,104,100, 11, 81,216, 15,156,197, 29,131,199,110,104, 97, 52, 61, 15,101,190,138,242,246,251, 1, 57,
+ 71,196,224, 73, 79,176,174,196,161,224, 78, 13, 9,184,187,219,115,199,168,160,149, 69, 76, 68,149, 75, 57, 65,101,129, 20, 34,
+164,213,240,193, 49,127,156,114,201,239,239, 31,136, 51, 46, 36, 98,162,164,184,148, 29,164, 84,136,222,147, 39,220,147,149,172,
+181, 6, 2, 9, 79, 15,247,248,238,155,239, 17,124, 36, 63,179, 1, 16, 3,238,246, 59,164,236,225,214,128,190,181,112,145,196,
+126,228,229,167,125,186, 84,134,199,223, 17, 77, 75,122, 0, 3, 74,141,244,222,211, 36,132,133,113, 69,171,148, 82, 68, 22,164,
+ 40, 23,210,192, 90, 18,246,249,213, 97,134,224,221, 58, 29,232, 16, 50, 12,239,224,181, 82, 8,206, 67, 55,116,128,141,153,188,
+227,101,202, 34, 33,224, 99, 64,195,161, 56,165,139, 37, 41, 15, 55, 33, 41, 0, 72,244, 57, 41, 67, 72, 18,101,166,236,107,162,
+ 36, 33,113, 91,228,164,224, 99, 64, 88, 87,226,217,123,135,221,110,143,182,215,240, 1,200,233,130,144, 34,206,231, 11, 0, 42,
+236, 31,157,163,120,225,213, 3, 57, 84,141,214, 48, 12, 56,158,206,117,181,153, 54,104, 77,145,105,157,252, 54,148,229,115,129,
+ 80,114,147, 87,144, 56, 93, 51,150,198,186,172,175, 55,141,116,226,116,195, 79,169, 26,226,247, 88,136,243,231, 60,191, 91, 85,
+112,174, 29,120, 17,110,148,121, 67,133,192,108, 69, 76, 55,191, 80,174,118, 20, 37,175,157,155,100,227,110,230,200,194,144, 3,
+ 92, 8, 56,141, 11, 46,243, 74, 29, 97, 22,155, 84,174, 79, 13, 83,111,247,161,159, 4,205,191,113, 64,145, 42, 85,144,136,172,
+162,100,169,240,133, 72,158, 70,239, 35,156,139,240, 62, 97,156,103,204,206, 97,154, 87,246, 50, 46, 12,113, 24, 49, 49, 34,179,
+156,180,180, 54, 12,234, 32,229,109,204,128,103,108,101,226, 55, 41,150, 14, 83, 73, 40, 35, 33, 20,144,101, 70, 4,241,217, 93,
+140, 24,215, 5,231,121,194,184, 44,220, 37, 83,225,139,197,174,147,242,141, 48,241,106,239,186,254,146,133,181,159, 50, 16,133,
+198,228,128,243,148,112, 28, 3, 94, 79, 43,206,175, 11,252,197, 35, 79, 30, 98,244,144, 83,130, 88, 2,178, 11, 52,170, 79, 2,
+240, 25,112, 25, 93,214,144, 50, 33, 33, 32,139, 68, 97, 57, 55,193, 42,138,222,171,183, 81,166,242,170,230,188,158, 90,197,239,
+214,110,252,209,254,239,252, 95, 0,144, 17,248, 47,199,197, 9,220, 68,218,110,198,146,249, 38, 93, 86,222,184, 72,100, 18,120,
+119,247,132, 95,252,221,127,131,232, 72,196,227,220, 10,173, 21,156,119,244, 96,141, 17,243, 60, 51,247,157, 64, 52,101,116, 88,
+ 80,195,207,207,207, 72, 41,225,251,239,191,199,120,190, 64, 74,137,211,233, 68,221, 41, 31,214,181,209,184,191,187,195,253,211,
+ 35, 81,200,220,130,144, 18,132, 82,120, 61,159,112, 60, 29, 33,164,196,176, 31, 96,172,198,243,199,143, 16, 66,224,225,238, 30,
+247,251, 3,114,206, 56, 94,206,128,146,184,123,184,195,195,227, 3,134, 93,143,132, 8,101, 37,180, 53,112,171, 35, 78, 57,167,
+164,245, 61,229, 92,207,211, 8,183, 46,104,173,165,131, 93, 8,144, 25, 53, 62,179,239,118,104,108,143,105,114,152,166, 21,227,
+ 56, 98,158, 23, 8,161,177,174, 1, 41, 9,120,151,176, 78, 30,206, 37, 44, 43,221,123, 68,152,115,112, 97,197, 52, 79, 88,150,
+153, 14,206, 74,194, 88,131, 16, 3, 98,138, 28,103, 74, 99,127,163,245,245,192, 37, 73,212, 73, 9,106, 29,230,121,162,103, 23,
+167, 33, 74, 41, 17,124,224,188,114,197,168,233,235,254,115, 93,102, 14, 69, 49,252,222,230, 10,165, 41,251,228,243,249,140,221,
+110, 7,239, 61,137,228,120,204,223, 48, 62,181, 96,117,141,214, 12, 37, 41, 89,241,242, 77,174,122,162,136,103,165, 43,254,116,
+ 94,104, 76,158,145, 43,126, 90,176, 39, 95,177,128,173,216,139, 99, 34, 69,255,221,221, 1,231,243,185,186,152,230,121,169, 41,
+108,206, 17, 97,109,232,123, 2,194,228,140,198,104,182,208, 81, 54,133,115, 14,151, 11, 93, 99,196, 56, 95, 43, 2,123, 97, 91,
+ 29,253,190,196,221,167, 36, 62, 90, 49, 21,244,175,170,177,170,170, 34,115,233,185,149,106, 2, 90,201,158, 47,159, 23, 99,228,
+233,169,170,255, 77, 69, 94, 85,174, 72, 96,160, 16, 5,192,208,123, 77,254,255,114,216,160, 6,201, 26,203,239, 97,196,229,114,
+134,177,154, 50,217, 51, 96,152, 89,191, 46, 43,230,105, 70,215,118, 24,134, 93,133, 11,173, 43, 9, 11,133,162,198,165,136,193,
+139, 94,140, 2, 92,228,141,168,237, 45, 29,238,115,245,232, 45, 30,118,139,134,205, 57, 83,195, 35,192,205,210, 85,105, 44, 74,
+243,178, 89,123,255,255,132,202,218, 68, 82,138, 63,210,107, 92, 35, 57,197,213,222, 86,201,240, 4,138,137, 57, 97,241, 30, 47,
+167, 17,139,163,174, 31, 60, 49,160, 29,110,250, 52,198,245,205, 11,151, 19,117,154,169,230,136,223, 70,192, 22,241,136, 42, 22,
+ 58, 6, 16,196, 72, 40, 71, 23,136, 16, 71, 35,102, 73,194, 12,254, 28, 23, 18, 66,140,240,145, 96,253,106,147, 3, 92, 62, 10,
+159,219,121,143,211,120, 34,142, 52, 63,132,148, 86, 76,147,147,180,143, 39, 94, 46, 32,169,248,175, 49, 96, 90, 87,156,167, 25,
+199,113,194,236, 92, 21, 15,214,105, 75,101,215,111,121,250,121, 35,176,200, 20, 76, 83, 70,239, 66,192, 67, 99,116, 2,207,151,
+136,111, 62,174,248,245,119, 51,126,245,205, 5,223,124,125,194,135,223,156, 48,125,253,138,248,221, 11,242,135, 11,240, 50, 66,
+156, 29,176, 36, 50,222, 39,143,108, 18,132, 1,146, 8, 72,155,126, 91,108,130,123, 40,155, 92, 92, 73,110,226, 77,220,232, 70,
+212,247, 15, 46,232,249,247,231,151,255,177,123,252,252,143,197,213,127, 2, 83,202,155,216,196,107, 94, 0,135,217,195, 40,141,
+191,255,235,127,134,199,187, 7, 40, 8,228, 64, 64,151,121,154,225,189, 71,223,247, 21,150,177,174, 43, 21, 26, 69,254,107,239,
+ 87, 28, 14, 7, 56,239,209,216, 22, 63,250,209,143, 24, 40, 67,227,234,148, 50, 82, 8, 72, 49,227,120, 58, 33,129, 58,161,148,
+ 51,190,251,225,123,116,125, 79, 66,186,253, 14, 25, 25, 31,158,159,113,184,191,131, 98,129, 79, 8, 1,231,227, 9,110,117,164,
+ 6,231,177,111,136, 1, 66, 74,156,206, 71, 28, 79, 71,188,156, 94, 97, 26,139,175,191,253, 26,203, 50,163,239,122,104, 99,145,
+ 1,188,188, 60,195,185,133, 52, 44,124,172,211, 18, 72, 97,133,202,145, 58,174,213, 67, 43, 11,165, 26, 40,221, 66, 8,141,198,
+246,200, 73, 64, 73,139, 20,129, 24,128, 24, 50, 4, 52,114, 82, 80,170,133, 84, 22,227, 60, 99,154, 71,164,228,161, 20,112,119,
+127,144,119, 90,210, 0, 0, 32, 0, 73, 68, 65, 84,192, 48, 12, 36,128,242,142,197,179,130, 25,226, 87,110,118, 14, 17,193,211,
+190, 87,105,234,130, 51, 34,156,119,213, 62, 87,120,220, 20,231, 26,217,195,174, 33, 65, 95, 47,197, 8,193,255, 94,190,135,100,
+183,135,224,110,211, 24, 83,185,241,198, 24,236,119, 59, 28, 14, 7,180,109,139,121,158, 25,120, 67, 63,199,194, 92,116,242,178,
+ 83, 6,186,181,186, 78, 23,181, 54, 0, 23, 29, 33, 0, 31,168,227,244,193,193,218,134,146,215, 56,233, 81, 41, 5,207, 7, 2,
+130, 20,209, 65,113, 93, 22,236, 15, 59,104, 37, 17,188,167,249, 93,206, 88, 23, 7, 41, 52,250,158, 70,226, 16, 2, 15,247, 7,
+210,163,240,132,108,154,103,116,125,207, 26, 5,141,151,151,151, 10, 24,243,222,227,225,225,129,192, 71,211,196,154, 0,207,137,
+117,180, 59, 86,156,214,151, 57,105,143, 44,145,168,212,183, 90,184, 11, 46,121, 43, 52,227,251,184, 28, 92,242,155,113,245, 53,
+245, 18, 53, 4,166,229,174, 95, 41,130, 59,103,230,188, 55,182,169,247,104,202, 17, 82, 10,166,232, 9, 60, 61, 61, 66, 10,178,
+ 25,206,243, 66, 25, 5,227,136,199,199, 7, 40,171, 17, 50,173,112, 46,243,116,155,242,182,121,222,172, 43, 37,194,137,223, 67,
+ 95,253, 28,204,170,116,230,111,179,210,171,134,135,169,106, 89, 20,141, 82,174,193, 53,111, 71,247, 85, 40,151, 54,245, 55,139,
+ 63,158,221,241,201,130, 63,149, 61,168,172,200, 81,148, 40,214, 55, 2,188, 43,209,108, 99,155, 43,235,118,121,165,213, 21,101,
+ 95, 72, 9,227,178,226,245, 60,193, 39,137,156, 37, 79, 94,153, 37, 47,197,239,180, 7, 92, 59,164, 92,199,238, 34, 23, 72, 0,
+217, 92,132,102,169, 29,191, 89,133, 42, 37,148,164, 93, 54,143,114, 83,206,236,113,207,196, 90,102,210, 27,157, 70,175,137, 59,
+101,159,155,145,169, 67,225, 67,132,181, 22,125,219,194,187, 5, 90,137, 58,178,111,140,130, 64,134,174, 66, 10, 82, 98, 79,211,
+ 12,231, 23, 36,161, 16,147,192, 18, 2,166,197, 81, 42,147,210,228, 17, 47, 23,216,141,224, 11,245,112, 68, 57,234, 87, 97, 28,
+ 21, 89,137, 40, 36, 2, 36,230, 0,124,127, 92,225,215,136,215,227,130,223,124, 47,209, 91,137,174,215,120,184, 27,240,238,113,
+192,195,151, 7, 28, 30, 15, 24,238,118,208,131,130, 52, 2,240, 18, 16, 26,218, 54,128,140, 55,222,255,106, 31,123, 35,212, 67,
+ 77,130,139,219, 19, 29,240,123, 11,240, 31,103,110,219,238,172, 63, 95,252,243,239, 59, 7,224, 31,134,192,121, 59, 29, 16,245,
+215, 16,228,155,170,158, 94,210,159, 16, 41, 81, 32, 35,249,128,159,255,229, 95,225,231,127,246, 83,132,197, 17,144, 73, 10,216,
+166,193,225,254,128,127,255,159,254, 61, 46,151, 11,118,187, 61, 94, 95,143, 84,152,144,161,141,193,229, 50,226, 47,126,246, 83,
+156,207,103, 52,141,197,253,221, 19, 46,151, 11,145,195,164,198,180, 46,216,113,224, 74, 8, 52,142,110, 53, 21,162, 15, 47, 47,
+ 20,134,228, 61,250,161,199,180, 44, 24, 47, 23, 44, 75,137,199, 76,184, 92, 46,240,222, 99,232, 90, 32, 38,188,124,120,198,135,
+231,103,252,217,159,255, 20,222, 59, 52, 70,227,227, 15,223, 67, 25, 69,226,169,151,143, 36,124,146,148,118,214,237, 6,180,166,
+193,235,235, 9,113,156, 32,149,128, 54,138, 56,223, 62, 99, 69,132, 18, 9, 41,172,124, 40, 54,116,232,208, 13,188, 95, 25,108,
+ 99,161,148,198, 60,205, 64, 34,250, 87,140, 25, 93,191,199,226, 87,154,216,253,240,129, 82, 28, 53, 77,193,188, 91,209, 49,195,
+125, 27,185,220, 52, 77,165,202,229,156,209,180,180,183, 85,165, 64, 8,242,214,199,156, 97,148,166, 53,146, 84,176, 67,139, 35,
+ 79, 62,114,206,208,138,108, 99, 82, 72, 90, 25, 24, 69,118, 57,239,209, 12, 29, 89,166,248, 0, 64,208, 43,234,200,151,121,102,
+ 97, 98, 68,204, 30,119, 93, 7,151, 60, 2,139, 32,201, 79,159, 97,109, 3, 53,205,140, 92,229,206, 77,129, 15,116,116,109,164,
+152, 72,139,131,140,253,126,135,215,215, 35,101,191,175,158, 8,111, 77, 91, 19,207,230,121, 65,223,119, 88,150, 5,235,106,241,
+238,241, 9,223,126,253, 13,158,158, 30,112, 60,157, 49,205, 35,118,195,142, 2,115,186,140,253,126, 79,175,211, 60,195, 52,212,
+213,143,231, 11, 55, 39, 10,211, 52, 98, 24, 6, 42,222,188, 47,223,239,247, 8,193,225,124, 62,226,203, 47,191,192,215,191,253,
+ 53,148, 82, 53,112, 38,103,186,214,140,229, 46,148, 11,216,150, 0, 23, 34,219,234,250,190, 62, 59,181, 82, 8,245, 80, 69,207,
+205,101, 89, 48,116, 61, 9,223, 88,120,184, 45,134, 69,192, 74, 9,115, 1, 41, 69, 90,169,106,178, 34,151, 34,223, 88, 11,183,
+174,144, 90, 84, 77,205, 52,141,144,146, 38, 7,199,227,145,118,239,171, 67, 22,192,101, 30,241,254,253,123,124,248,240,145, 39,
+ 19, 18, 41, 39,210,104, 36, 84,221,152,172,209,214,252,228,147,183, 28,119, 41, 37,100,198, 39,135,129,162,217, 73,165, 43,127,
+ 67, 51, 20,146,190,214,117,141,125, 61, 16, 40,165, 72,112, 43,174, 8, 98,213, 74,253,203, 13,132,253,147,193,186,172, 98,185,
+ 18, 57, 90,254, 84,214, 5,188,144,229, 68,161,104,219, 46, 52,134, 97, 95, 35, 16,101, 77,205,201,181, 88,145, 24,142,199, 74,
+ 60,242, 86, 34,193,106,192,168,140,198, 72, 24, 69,208,127, 37, 34, 82, 12, 88, 92,196, 15,167, 25,255,225,215, 31,112,113, 2,
+144,150,119,243, 36,196,163,127, 87,252,179,137,155, 9,192,141, 48,170, 20,145, 98,223,146,160,145,157, 38,193,131, 20,215, 4,
+ 55, 72, 42,228,185,236,225, 82, 38,171, 30,243,167,173,213,204,229,165,155,173, 4,128,212,253, 6,199,197,106,173, 72,112,151,
+136, 79,109,140,132,165,140, 22, 24, 5,244,157,133,173,251,248, 2,107,163, 78,119,245, 17, 19,103, 15, 47, 62, 97, 94, 3, 78,
+231, 17,243,178, 34,161,252, 60,229,226,144, 27,134, 62, 71, 33, 10,201,157,121,233,210,175,225, 46,130, 5, 24, 9, 25, 33, 75,
+ 44, 1, 56,175, 25, 47,115,198,215, 47, 11,126,243, 97,198,175,126,152,240,171,239,103,124,251,205, 5, 31,191, 91,112,121, 77,
+240,103, 1,229, 13,116,234,176, 56,141,127,251,255,124,143,111, 63,156,144,133, 69,228,224,154,194, 93, 46,123,124, 8, 18,208,
+ 85, 17, 8, 59, 19,182,157,114,126, 43, 28, 41,152,200,223,105, 49,147, 55, 34, 58, 33, 4, 29,214, 54, 32,155,235,120,255,202,
+227,174,208,151,141,210,148,126, 72,201,221,244, 63,108,244, 94,243,234,235,100, 76,178, 96, 83,212, 12,119, 37, 37, 82, 12,208,
+ 89,226,253,227, 23,248, 31,255,135,127,133,199,253, 61,220,186, 96,188,156,177,186, 5,199,243, 17, 31, 62,126, 64, 63,244, 56,
+157,206, 68, 39,107, 26, 64,146, 32,211, 90, 11,193,145,149,151,243, 5,251,253, 30,167, 51,113,167,127,248,240,140,110, 55,144,
+133,199, 90,104,163, 57,170,179,197,126, 63, 96, 93,102,234,214,246, 3, 98,138,120,121,126,198,229,124,134, 82, 2, 95,125,245,
+ 21,246,135, 61, 78,199, 35,150,101,198,227,227, 3, 4,227, 49,115,206,248,234,253,151,184, 59,236, 97,181,198,119,223,124,131,
+ 16, 61, 30, 31, 31,177,223, 15,152,198, 17,227,249,130,174,223,225,225,241, 1,200,192,175,126,245,107, 26,133, 26,141,182,107,
+ 33, 68,134,115, 51,188, 91,121, 60,174, 48,141, 23,196, 20, 17,130,195, 50,207,149, 17, 30,153,210, 5,208,120, 58,113,150,184,
+148, 18,199,215, 19, 46,211,136, 24, 3, 39, 39, 82, 80, 70,203, 48, 28,163, 53,134,161,131, 15, 30,227, 56, 66, 10, 74,230,242,
+ 46,208,179, 73,211, 53,233,156,195,110,183,171,184,210, 16, 2, 89,147, 50,141,226,155,166,193,233,124,198, 60,175,132, 2,213,
+170, 82,203,180, 34,116,109,219,180, 72, 57,193, 26,133,221,110, 7, 33, 36, 11,219, 56,167,156, 39, 5,203,188,192, 24, 67,113,
+168, 41, 97, 89, 23,196,152, 24,220, 66, 86, 44,183, 58, 52,109, 11,169, 21,188,119, 92,188, 37,134,190, 39,148, 46, 31, 52,200,
+135, 45, 48, 94,206,120,184,191,167,245, 64,138, 48,250,154,130,214,182, 13, 89,116, 67,160, 4, 73,107, 16, 35,101,141,239,247,
+123,156,207,164,147,200,165, 8, 8, 98,139, 43,173,224,156, 99,127, 62,145,219,186,182,165, 14,154, 89,245,231,241, 2, 8,160,
+239,187,106,209, 75, 41,214,215,112,183,219, 83, 58,223, 76, 44,127,165,105,106, 96,109, 83, 69,139, 74,211, 14, 27,188,110,157,
+151,137, 86, 53,236,246, 40,196, 54,112,199, 62,207, 51,139, 9, 57, 26,214, 88, 44, 51, 69,227, 26, 22, 17, 74,113, 61, 48, 44,
+203,194,211,153, 4,231,214,122,159, 26, 99,224,248,126, 10,129,128, 69, 49,101, 24,211, 0,137,210,249,104,252, 79, 81,185, 33,
+ 16,203, 32,231,204,211, 21, 82,203,247,195, 14,151,113,170,100,194,188, 33,108,166,162, 90,199, 45,152,141,166,196, 87, 45,207,
+ 54,133,109, 43,141, 47,190,118,169, 20,178, 32,252,121, 6,213,158,244,153,134,101, 27,217, 90,190,223, 63,174,168,139, 43,230,
+179,122,232, 50, 96,148,193, 48,236, 96,109, 83,133, 13, 85,205, 46, 21,125,212,140,245, 84, 21,238, 90, 1, 86, 11, 24,149, 96,
+ 13,160,117,134,150,212,105,134, 16,176, 4,224,255,253,246, 5,191,254,254,140, 53, 41,100,169,168,203,206,165, 39,189,142,118,
+ 83,174, 4,232,155,143,235,100,151,148,252,148, 48, 74, 55,170,214, 4,189, 41, 78,126,194, 86, 82,183,156,217, 5, 80, 0,252,
+ 90, 9,104, 41, 48,116, 29,246, 67,135,190,111, 48, 12,228,207,221, 13, 61, 26, 78,126,106,172, 65,215, 90,236,134, 30,125,223,
+ 66,107,137,213,173,216,245, 13,246,125,135,198, 42, 12, 93,139,182,161,236,228,196,251,147,144, 50,124,204,240, 33,193,249,136,
+121,117, 88, 92,196,101,114, 24,231, 5,227,180, 34,196,196,158,128,207,139,185,202,238,246,138, 95,103, 43,162,144, 84,204,121,
+ 34, 32,232, 42, 66, 76,128,203, 2, 46, 75, 44, 73, 97,142, 26, 43, 44, 22, 52, 88, 34, 48,173, 17,175,147,195,135,243,130,143,
+227,130,211, 56,193,103,160, 59, 60,226, 39,127,241, 87,200,210,224,183,191,253, 30, 46, 36,102,241,243,148,160, 92,140, 55, 52,
+182, 50, 93, 16,159, 20,117,113,187,100, 71,222,152, 39, 63,183, 94,185, 85,198,139,218,145,231,188,157,210,108,190,100, 81,164,
+110, 28, 31,185,226,115,197, 39,183,206,118,188,245, 15,131,192,110,130,115, 5, 93,111, 50,103,236,219, 30,255,221, 47,254, 5,
+190,122,250, 2,211,229,132, 20, 3,142,167, 87,184,224, 16,145,112, 58,159,112,190, 92, 24, 43,153,153,174,213,146,203, 66, 74,
+216,198,194,173, 14, 67,223,195,114,188,227,188,204,213,103, 94,199,128,172,190,181,198,224,244,250,138,101,154,113,199,185,218,
+211, 60, 81,145, 60, 30,145, 98, 66,219,181,248,205,111,126, 67,185,209, 93,143,182,109,241,252,242,130,203,120, 65,215,247,212,
+145, 38,143, 31,126,248, 30, 82, 74, 60, 62, 61, 98,117, 14,211, 52,211, 3,211, 90,236,246, 7,204,243,140,121, 89, 16,120, 28,
+ 12, 8,156,207, 39,178, 43,229,136,182,239,200,119,239, 40,190,212,187,181, 98, 80, 95, 79, 47,152,152,139, 78,133, 40,192, 45,
+ 11,214,117,134,115, 11,137,170, 98, 64,211,104, 88,173,161,140, 36,120, 76,240, 4,142, 9, 1, 95,190,123,130, 84,154, 10,127,
+ 18,208,166,161,215,206,123, 46, 60, 84, 24,186,166,165,123, 95,107, 44,171,195,234, 61,220,234,168,160,132,136,174,109,113,153,
+ 70, 4,190,150,125, 8, 24, 24, 27,155, 56,195,161,109, 26,228,148,208,182, 77,141,107, 13,158, 70,188, 41,209,104,119, 94,215,
+ 26,245,219,182, 61,125, 78, 36,203, 83, 12, 84,184,154,198, 82,166,183,224,135, 57,119,239, 57, 39, 30, 5,143,172,126, 22,117,
+ 26,169, 88,140, 59,244, 61,142,175,175, 80, 90, 85, 80, 74, 25,101, 75, 37,161,153,191,158,249,192,131, 68,147, 10,165, 85, 21,
+ 43, 75,214, 65, 17,191,222, 32, 36, 74, 82,107,172, 69,136,129, 99, 84,215, 26, 74, 35, 4,208,112, 20,111, 99,105,196,111,173,
+ 5, 68,194,186,208, 78, 61,243,206, 59,115,129,210, 90,211,202,128, 3,112, 74, 94,186,228,108,139,210, 68,149, 98,103,217, 38,
+ 25, 99,168, 43, 40,128, 14, 42,109,211,213, 32,157, 45,197,148, 70,214,164,159,144, 74, 85,221, 80,253,135, 65, 51,100, 77, 20,
+208, 70,227,249,249, 21,222, 71,180, 13, 9,254,202, 52,167,235,218,202,223, 39, 93, 64, 70,223,119,120,121, 57,242,225,138, 51,
+ 72, 66,228,168, 11, 82,218, 23, 45,217,103, 39,129, 5, 7, 93, 32,103,111,137,114,117,160, 40,106,150, 73,185,159,139,253, 85,
+124,166,152, 23,171,101,230,106,160,183,223, 60,255,142, 24,214,223, 15,175,222, 62, 92,217,164, 36,137, 38,119,237, 22,197,205,
+ 23,173,158,223, 42,106,203,245,217,158,216,131,151, 82, 66,138, 2, 33, 82,193,143, 73, 96,154, 19, 94,142, 19,214,144, 16,178,
+132,100,132, 41,125, 29,141, 66,149,223,118,101,197, 19, 72,197, 32,109, 60,245,220, 61, 50,175, 94, 41, 81,199, 96, 9, 68,188,
+201, 73, 32, 51,180, 38,179, 55,181, 76, 25, 4, 18,186,182,195,195,221, 30,187,161, 67,129,231, 53,141, 37,223,174,247,240,171,
+171,184,203,190,239, 97,140,198, 52, 77,248,246, 91,242,154, 30,238, 40, 45, 75, 2,136, 89, 32,184,194,138,167,145,147,224,184,
+216,105,113,120, 29,103, 76,139, 71, 76, 18, 62, 2,158,249,242,185,160,132, 68,177,147,241,107,154,229, 6, 60,179,169,167,204,
+107,207,140,113,205, 82, 85,177,157,224,232,207,200,165,200,104, 13,169, 13,172, 54,104, 76, 70,219, 72,216,174, 1,154, 14, 94,
+ 24,140,139,199,243,203, 9,187,251, 71,252,237, 47,254, 6, 95,254,236,103,184,204, 14,255,243,255,242,127, 32,179, 40,229,186,
+ 14, 16,159, 92, 51,127,116, 35,204, 43,157,219,122, 46,254, 96,247,252,118, 52,254,199, 92,206,111,132,242,255,136, 16, 23,222,
+163, 51, 86,183,192,124,140, 84,248,217,159,252, 57,246, 77,135, 31,190,253,134, 70,186, 49,225,120,166,221,116, 55,116,216,199,
+ 61,190,254,250, 91, 52,214, 34, 69, 26,221, 47,139,131,146,148, 67,254,248,244, 72, 69, 33, 38,188,190,190, 34, 68, 74,186, 58,
+157, 47,240, 49, 84, 17, 83,136, 30,251,253, 30,145, 19,174, 86,239,160,173,193,215,223,126, 3, 33, 37,198,113,196,225,254,174,
+ 10,185,200,206,182,226,253,251,247,248,238,135,239, 17, 83, 68,191,223, 97,119, 56, 96,153, 39,124,120,253, 64, 33, 47, 90, 99,
+ 94, 87,104,109,112, 58, 95,208,180, 13, 30,238,238,145,165,192,233,124,194,178,210, 8,189,239, 7,156, 79,103,132, 72, 2, 34,
+109, 45,156,139,128, 80,200, 41,192, 42,133,172, 4,199,218, 38,104,214, 87,196,156,240,225,195,119,232, 88, 68,165,141,132,177,
+ 45,114, 78, 80, 90,163,107, 91,248, 64,216, 92, 9, 9, 72, 3,239, 19,238, 14, 3, 76,211, 96,113, 14,206, 69, 40,105,240,250,
+114, 66,215, 53,176, 90,145,141,106, 58, 19,194,148, 81,181,231,243,165,114,223,133,148,104,154,142,227, 91,201, 30,101,173,133,
+ 80, 26,238,124,162, 98,233, 29,167,199,105, 94, 9, 68, 52,205,174,142, 77,135, 97, 64,240,129, 59, 74,131,211,121,132,200, 25,
+139, 15,216,239, 35,188, 99,106,164,177, 88, 72, 9, 92, 87,114,108, 86, 66,215,117,104,219,140,203,101,164,226,218, 52, 88, 23,
+ 66,187,122, 31, 88, 1, 77,107,195,166,181,148, 63, 46, 11,174, 57,212,231, 46,137,240, 4,194,186,224,176,223, 97, 89, 86,100,
+ 75,119,226,254,112,192,183,223,127, 15,219, 80,212,171,247, 30, 41, 71, 60, 60,220, 65, 47, 26, 82,100,138, 9, 21, 6, 41,102,
+216,182, 1,132,128,209, 4,174, 89,215, 21,182,105,120, 31, 46, 49,205,180,254, 73, 57,225,116, 58, 97,104, 59,140,227,136,214,
+104, 4, 38,231, 41,165, 16,146,227,194, 78, 34, 77,194,186, 82, 49,143, 12,186,242, 41,192,116,150, 18,251,188,135,224, 40, 94,
+ 74,199, 83, 53, 95,189,248,249, 53, 11,248,154,166, 33,150, 63, 64,113,222, 92,184,147,247,144, 9,252,218, 73,116,109,139,249,
+124,134,182, 6,143,143, 79,248,240,195, 51, 86,231,208, 54, 22, 96,222,128, 16,244,254, 53,214, 98,158,151,170,157,120,122,186,
+ 71, 8, 5,228, 36, 97,140,197,226, 28, 29,216, 21, 3,135,196,231,181, 99, 66,138,107,236,244,134, 22, 39, 54, 90, 35,228, 77,
+163,177,125,146, 8,241, 25, 96,219,109,126, 74,249, 12,213, 40,253,203, 27, 0,199, 39,250,227,178,231, 78,236,187,101,159,116,
+ 22, 85,165, 94,198, 76,229,129,218,152, 6,187,221,174, 42, 55,149, 20,236, 21, 87, 87,227, 61, 68, 29,189, 75,201,221,178, 22,
+ 52,114,231, 14, 93, 43, 9, 37,168, 79, 11, 33,224,135,215, 9,255,241, 55,223,227,236, 18,178,182,117,188, 93,205, 71, 82,177,
+ 26,254, 26,111,119, 59, 22, 21,204, 49,207,215, 16, 13, 30,167, 25,163,104,161,144,169,168, 39, 62, 24,164,148,170, 48,129, 26,
+ 90, 42,234, 70, 73, 60, 62,222, 99,232, 91, 12,157, 37,159,185, 18,104,223,220,100, 90, 43, 30,235,203, 58, 10,243,222, 35,120,
+ 87, 99, 11, 67,138, 88, 61,217,245,200, 80, 37,169,200,167,140,217, 5, 92,150, 21,151,121,197,234, 3,132,182,240,145, 34, 93,
+107, 33,202,105,227,185,190,218,248,110, 46,132, 26,206, 34,175,162,180,204, 7, 30,144,162, 86,129,118,190, 90, 9, 72,126,200,
+138, 72, 9,118, 49, 71, 72, 36,216,198,162, 31, 6,220, 13,123, 60,237,118, 56,180, 29,164,144,104, 15, 45, 30,126,242, 35, 32,
+ 68,252,239,255,231,191,230, 68,214,196,227,169,173, 96,142, 68, 98, 87,159, 37,143,203,111, 66,130,176,129, 2,136, 55, 26,140,
+219, 2, 93,225, 12, 69,139,177,253, 90,249,246,186,196, 77,167,158,111,227,100,203, 21, 95, 87, 19, 87, 65,203,246, 84,252, 15,
+233,212, 19,175, 56,144,137,183, 32,114,198, 79,222,191,199, 63,251,175,255, 26, 22, 10, 47, 31, 62, 64, 42,129,211,233,136,140,
+140,217, 81,135,251,195,135, 15,124, 40, 86, 56, 28,238,177,174,164,132, 55,214, 50,122, 83, 84, 80,199,101, 28,161,173,197,226,
+ 86, 76,243,140, 97, 24,208, 51, 86,147,186, 55,129,151,151,103, 52, 45,141,138, 35, 72, 56, 71,164,177, 61,118,251, 61, 78,231,
+ 51, 62,124,160,130, 45,132,192,241,120,132,115, 14,211, 52,113,218, 88,194,241,244,138,197,209,110,120,245, 14, 47,175,175,220,
+145, 39,216,134,120,234,211, 60,225,124, 57, 87, 53,248, 52, 47, 88, 87,242,149, 91,107,209, 48,252, 35,134, 72, 93,113,107, 57,
+ 46,115,169,105, 93,166,163,142,169,168,216,231,121,130, 15, 43, 39,108,121,196, 24,208,183, 29, 41,176, 5,217,187,186,182, 67,
+ 78,180,154,184,191, 59,224,116, 58,225,124, 26, 33, 4,221,135, 41, 82,178,151,247,132, 0, 53, 70, 35,248,200,202,121, 62, 68,
+199,140, 97, 24,160, 36, 41,209,189,243,240,161,128,111, 18,127,159, 6, 57, 17, 31,188,236,183, 83,138,216,237, 6, 8,145, 49,
+ 47, 19, 19,252,168, 75, 54, 90, 97,245, 1,109,211,112, 71, 74,202,248,107,200, 21, 16,248,103,210, 60,166,214,154, 16,165,146,
+ 87,106, 69,104, 87,166,107, 84,188, 44,197,136, 26,205,182, 44,139,105,154, 96,140, 37,104, 74,197, 96,211, 51, 58,132,128,174,
+107, 33,153,135, 49, 79, 19,164, 82, 24,134, 30,207,207, 47,216,239,118, 12,238, 74,156, 62, 71, 62,111,205, 17,162, 74,105,242,
+176, 27, 93,121, 38, 41,197, 58,250, 46,190,250,148, 18,186,150,200,126,187,161,167,189,120, 12, 12,183,162,221,176,226,103, 94,
+ 81,109,103,230,241, 95,199,237,244, 12, 47,136,217,146,172,150,185,201, 16, 60, 70,151, 82,178,168,177,196,229, 94, 59,118, 33,
+105, 12, 46, 57, 44,167, 80, 66,137,204, 24, 33, 57, 3, 65,155, 6, 41, 18,218,117, 93, 72,136, 58,207, 35, 5,136, 9,226, 19,
+ 0,140,148,149, 2,211, 60, 19, 74, 89, 17, 87, 32,248, 72,177,183,165,147,254, 3, 32,170, 50, 21,217, 22,243,237, 46, 60,111,
+176,178,165,151, 40, 82,113,185,197,153,227,202,212,184, 89, 31,242, 36, 83,181, 90,254, 18, 34,111, 16, 46, 36,234, 18, 27,127,
+ 56, 68,102,152,136,184, 42,218,249,207, 11,116, 67,224,186,215,237,154, 22, 67, 63, 16, 82, 80,104, 30,237,148, 15,190,224,144,
+ 42,100, 70, 41, 1,173, 1,171,128, 70, 75, 40, 69,163,119,171, 51, 52,251,202,167, 16,241,219, 31, 78,248,230,195, 17,107,146,
+200,210, 16, 58,145,125,201,229,240, 33,184,139, 46, 5, 59,191, 97,115,211,239, 39, 25,182,127, 21, 41,148, 7,124,213,220,215,
+148, 28,238,239,121,239,174,148,128, 17, 2,173, 53,184,219, 15,104,141, 70, 99, 45, 71,197, 10, 74,103,146,101,132,182,225,203,
+243,215, 83, 74,163,107, 90, 52, 77, 3,169, 21,180,177, 48,198,194,216, 6,109, 63,192,182, 29,160, 52, 0, 5, 31, 19, 22,231,
+ 49,205,174, 90,123, 32,232,130,242, 62,112, 29, 75,184,113, 84,111,118,195,159, 96, 86, 63, 9,223,185, 10,250, 4,239,192,181,
+ 50, 80,252, 48, 84,124,128, 65, 38,100, 45, 88, 8, 41,114,198, 48, 52,184,127,216,227,171,175,222, 97,223, 55, 8,110, 65,163,
+ 0,155, 51,254,221,255,245, 31,241,253,135, 19,144, 21,141,143, 68,201,229, 35,191,254,239,178,154,101,108, 80,173,184,254, 14,
+ 73,224,166,160, 23,141,198, 91,122,220,237, 88,226, 26, 20,147,197,245,144,246,230,156,112, 21,159, 36,108, 94, 11, 84,127,105,
+126,243,186,225, 6,191,123,179,237,223,172, 59,168,144, 11,246,147,145,213, 8,184, 27,118,248,251,191,254, 91, 28,218, 30, 8,
+161, 74, 60,231,121,193,101, 26,241,122, 58, 97,117, 43,241,248, 3,101,120, 7,208,161, 79, 42,197,163, 61,193,176, 12,135,151,
+151, 23,236,239,238, 32,148, 38,240,145, 38, 78,123, 66,134,181,212,229, 36,239,137, 44,198, 19, 35,183, 58,196, 24,241,248,240,
+128,253,110,135,227,241,200,156,235,140,126,183,195,196,221,186, 98,107, 86,223,117, 56,241,207, 37,164, 68, 66,198,233, 76,255,
+ 29, 51,249,183,143,231, 35, 66,240, 56,189,158, 32, 65,105, 85,235, 76, 66, 41, 74,187, 34, 69,241,234, 29, 94, 95,159,235, 40,
+148, 70,179, 26,145, 11,130, 20,244,192, 6,195,144, 72,109, 31,145,133, 98, 88, 74, 38,178,220, 50,115,131, 64, 1, 66,109,219,
+210,158,119,232, 32,164,160,195,132,243,208,198, 48,220, 69, 85, 98,155,101,165,116,102, 17,225,186, 44,149,106,182,235,123, 42,
+ 78,200, 24,231, 25, 41,147,117,108, 89, 22,228, 20,208,183, 45, 11, 78,233,153,177,250, 21,109, 71, 94,233,142, 61,215,187,221,
+ 0,207,145,168,137, 51,235, 51,255, 12, 82,210, 78,223, 90, 11,193,150, 42,129, 12, 99, 20,131,153, 4,140,210, 4,171, 9, 17,
+ 86, 91,122,178,213, 41,161, 66,102,171,175,210,178,250,188,133, 80, 28,230,146,234, 61, 97,141, 33,188, 51, 63,227,154,134,112,
+180, 49, 69,216,198, 98,158, 39,236,119, 3, 69, 40, 35,163,237, 58, 8, 13,216,214, 86, 60,170, 82, 26, 62,198,186, 74,209, 74,
+ 33,103, 2,196,140, 23, 82,185,239,119,123, 88,163,225,189, 35, 75,178,178,172, 98,151,176, 13, 5, 15,101,118,228,164,148,249,
+ 25, 74,133,221,104, 77,194,194,148, 97, 56,227, 60,229, 4,211,152,138,242, 93, 22,186, 31, 34,143,236,233,115, 9,238,226, 67,
+ 64, 22, 25, 74,203,171, 77, 56,209,189, 28, 57, 90,248,124, 58,195,104, 11,173, 12,214,101,173,235, 71,239, 61,230,105, 65,215,
+210,129,194,232,235, 56,127, 93, 61,186,190,163,140,117,118, 66, 56,231,200,177,116, 58, 35,198, 76,169,133,109,207,147,131,140,
+ 20, 3,215, 32, 81, 54,210,155,124,147,124,141,145, 45, 46,140, 77,214, 72,206,249,186, 30,102,120,213,205,242,145,153,242, 66,
+ 8,126, 92,230, 26, 72,150, 19,115, 56, 18, 55, 39, 25, 80,189, 86,191, 44, 17,167, 90, 16,209, 76,178,138,183, 60, 60, 41, 57,
+145,126, 8, 89,197, 87,162, 10,179,228,102,204,174, 36,137, 59,250,174,131,209,134, 61,235,138,233, 63,186, 6,190,215,239,169,
+ 37,172, 86,176, 90,192,106,129, 70, 73,104,157, 97, 52, 96,100,130, 22,212, 37,159,150, 21,255,233,183, 31,240, 50, 46,200,202,
+ 64, 8,141,204,224,150, 92, 85,221,215, 49, 68,253,119, 41, 63, 73,145, 19,178,196,223,201,122,106,162,113,154, 98,175,120, 38,
+116, 29,119,252, 74,147,224,195, 26, 34,198,181,172, 94,239,218,150,232,112,214,112,118,176,226, 61, 98,174, 57,232,219,228, 29,
+242, 76,210,205, 98,140,102,161,157,133,109, 26, 66, 91,106,141,148,233,162,242, 33,193,185,128,105, 92, 48, 78, 51,188, 35,153,
+ 68, 74, 25, 62, 6,184, 64,227, 50, 81,124,250,226,141,234, 92,108,137,128,121,115, 24,147, 69, 41,113,243,186, 72, 37,161,165,
+169,171,147,242,218,101, 41, 32,181, 70,219,117,176,198,242,137,215, 65,138,128,198, 72,252,228,253, 59,188,255,234, 11, 24,161,
+225,231, 11, 58, 99,176, 44, 17,255,230,223,253,103,114,188,137,132,164,174,105,127, 25,121,163,228,188,145,227,111, 70, 78,114,
+211,157,127,126,151,126,229,251,227,138,171,225,139, 90,148,118, 66, 94,111,169,156, 55,154,145, 27,241,228,166,211,175,234,117,
+113,195, 87, 22,159,141, 74, 20, 5, 53,115, 45,236,114,163, 55,201,215, 41,128,200,128, 17, 18,127,243, 87,255, 20, 63,254,226,
+ 75, 68,231,224,230,133,121,252, 2,243,178,192, 39,194,138, 26,206,223, 78,137, 44, 60,171,247,128, 20, 28,107,233, 48,244, 67,
+141, 71,237,251, 30,198, 54,228, 98, 8,212, 57,181,109,139,121, 93, 48,141, 23,242, 82,207,212,109, 55,109,195,142,142,132,187,
+195, 29,158, 30,159,112, 62,157,112,100,226, 28,152, 21,238,156, 67, 99, 45, 30,238,239,241,238,233, 9,200, 64,207,163,116,109,
+ 57, 28, 36,101, 8,165, 32, 88, 0,186,174, 43,197, 89,110,237, 58, 2,152,151, 5,198,106,228,148,224,157,195,233,124, 70,200,
+100,195,209,138,224, 74, 62, 6,196, 76,150, 45,205, 5,205,104, 77,118,190, 24, 41,178,149, 81,155, 84,188, 36,239, 88,175,197,
+193, 7, 7,205, 59,101, 32, 99, 93, 29,117,151, 41,145,166,165,107, 25, 43,186, 98,232, 7, 26,191, 46,107,141,116,213, 90, 3,
+ 57,163,103,129,150,247,164, 21,216,237, 14, 20,175, 25, 60, 26, 75,169,111, 53, 87, 93,107,228, 76, 9,139, 57, 69,242,236,243,
+ 24, 61, 4, 7,107, 44,230,121,198, 48,244,100, 91, 45,246, 42,246,203,151, 41,101,228,130, 89, 58,197, 2,165,201,153, 14, 4,
+235,186,160,109, 91, 4, 79,162, 45,169,104, 69,216,117,109, 21,216, 5, 23,234,142,187, 20,140,226,147, 7,119,251,222,123, 38,
+199,145, 6, 64, 74, 26, 77,151,195, 4, 69,101,107, 52,182,129,115,158, 70,220,138,176,179,158, 67,110,148,146, 60, 81, 37,202,
+ 91,185, 73,250,129, 20,233, 33,120, 36,182,242,118,172,186,111, 26, 74, 0,148, 82,242,129, 13,245,245, 43,185,230,193,121,116,
+ 61, 77,146,180,214,172, 97, 74, 87,254, 8,223,135, 82, 82, 20,182,228,233, 17, 0, 44,203,204,175, 27,119,180, 66, 18,219,157,
+245, 73,229,177,145,153,220, 55,142, 51,135,191, 76, 88,150, 21,195, 48,212,134,129,210,243,100,213,223, 72,165, 41, 7,157,191,
+ 54, 89, 29,105,236,127, 62, 95, 16, 83,224,104,220, 30, 67, 63,144,243, 43, 38,164, 16, 57, 3, 62,215, 70, 75,150,169,252,150,
+ 78,185,137, 43,167, 3,219,198, 9,244,217, 6, 44, 87, 91,114,237, 78,120,103, 88,219, 81, 1,168, 59,107,126, 89,213,143, 12,
+141, 80, 82,194, 40,122, 1, 21,143,207,149,228,255,207,197,138, 16,170,252,231,138,189,136, 82,194, 40,141,221,176, 67,215, 13,
+208, 60, 6,162, 46,131,138,133, 82,234,166,168, 91, 30, 79, 91, 35,208,104, 1,171, 72,253,174, 53, 96, 24,155, 26, 82,194,135,
+227, 9,255,249,187, 87,204, 62, 65,152,134,242,202, 51,141,191,136, 58, 71,232,212,250, 2, 8,177, 17,243,189,177, 43,109, 98,
+237, 20, 7, 1, 20, 96, 64,241,164,163,210,111, 69,221,163,151,159,189, 49, 6, 77, 67, 30, 84, 58,121,107,226, 13, 43,186,112,
+ 19,174,152,219, 2,128, 40,223,171,188, 97,137,163, 69,149,210,200, 89,212, 4, 57, 31, 2,229, 1, 59,135,101, 94, 49,142, 51,
+150,197,209,174,134, 73, 74,129,197, 35,249, 77,175,184,213, 55,136, 77, 70,125,141,248,172,194,184, 66,224, 99,235, 33, 63,216,
+196,246, 53,205,101,143, 45,144,149,130, 52,188, 91,111, 27, 52, 93,131,135,195, 14, 77, 78,208, 57, 96, 55, 12, 24,158, 30,160,
+122, 11,169, 20,172,233,240,111,254,239,255,128,215,203, 25, 96,104, 78,174, 7,140,173,248, 76, 94,199,112, 57,223, 76,200,111,
+ 71,230,249, 54,224,224, 77,130, 96,218,132, 14, 93,245, 20,226, 26, 66,180,249,243, 58,118,191, 21,157,110, 8,131, 87,184,131,
+ 16,226, 6,234,240,251, 44,118, 37, 92, 33,111,186,253,204,233,122, 6, 2,127,254,227, 63,193, 63,253,139,191,132, 76, 64,116,
+ 30,235,178,214, 46,112, 94, 38, 74,251, 2,141, 12,205,102,228,234,188, 39,225, 78,219,193, 40,141,187,187,187,170,240, 37,126,
+246, 90, 11,109,223,247, 56,159,207,120, 57,190,226,231, 63,255, 57, 46,103, 2,208, 20, 85,236,233,120,194,126, 24,208,117,148,
+ 35,126, 58,157, 0, 0,195,126, 7,173, 20,142,199, 35,223,207,116,223, 75, 8, 56,231, 8, 5,107, 13,132,164,132,172,182,109,
+ 49,244, 59, 12,125,143, 20, 41,200,194, 40, 3,219,183,220, 9, 72,204,203,140,142, 51,217, 75, 92,103, 76, 9,146, 71,243,141,
+181, 88,157, 7,196, 53,229,143, 0, 79,158,152,222,146,180, 6,195,208,115, 92,102, 70,142, 1, 74, 0, 66, 93, 51, 38,148, 82,
+ 8,209,179, 82,188, 69,211, 24,140,151, 11,237,141,119, 59, 40, 41, 96,148,194, 52,142, 80, 74,226,233,233, 9,227, 52,113,225,
+ 87, 55, 32,154,190,239,107, 58, 23,120,199, 78, 34,179, 84, 11,135,115,174,198,206,230,156,106,110,196,126, 55, 96,225,221,171,
+ 98,145,104,226,244,195,194, 57,151, 82,113,113, 37,102,127,199,182, 67,101, 52, 86,183,162, 31, 6, 38,196,209,100,166,105,169,
+248, 52, 77, 91, 89, 5,138, 29, 58,186,116,192,252,172, 50,214,144, 34, 33,165, 26, 89, 75,227,121,142, 43,206,168,211, 2,183,
+174, 20,199,202,226,176,242,140, 66, 6,235,103, 44,220,178,192, 26,178,126, 81,114,157, 37,239,183, 40,207, 44,226,225,211,250,
+148, 96, 61, 36,206, 20,232,186, 22, 77,219, 96,158, 73, 68,169,140,161,164,179,194,121,231, 56, 86,195, 56, 91,193,147,167,174,
+235,234,186,147,166,185,130, 86, 10, 41,209, 65, 14,130, 14,131,140,133, 37, 65, 96,168,216, 92, 74,218, 83,204,143, 15, 85,216,
+ 71,196,206, 92,213,245,197,189,244,250,122,172,235, 11, 18,239,113,142,186,162,189,253, 52, 78,220,217,211, 33,201,242,228,167,
+109, 44,180, 38, 48,209,178, 44, 24,167, 17,235,178,226,241,241,137,166, 39,171,171, 66, 73,193,206,163,183, 25,143,185,118,232,
+ 87, 8, 87, 25,193,191,229,171,200, 55,150,236, 26,129,142,109,214, 10, 45,110,133, 0,212,189, 53,191, 84,146,138,117, 81,161,
+151, 29,184, 4,167,164,201,107, 90, 90,121, 19,181,226,191,195,133, 87, 49, 52, 69,107, 75,136,189,182,133, 54,134,132, 46, 74,
+ 87, 18, 80,161, 2,105, 45,107,192,189, 53, 10,141,145,104,141,130,149, 2, 70, 75,104, 67,197, 94, 9, 10, 63,249,238,249, 5,
+191,121, 30, 17,133, 38,213,187, 0,219, 90, 50,191,112, 36,110,168, 97, 36, 37,247,125, 83,232,202,133, 34, 4,161, 55,133,100,
+ 53, 39, 68, 29,253,208,233, 74,113, 33,167, 78, 68, 42, 81, 79, 88, 82, 72, 52, 70,195, 88, 98,183, 75, 37, 56,234,175, 64, 16,
+216,203, 42,213, 77,238,112,129, 38, 4,246, 32,198, 68,160,154,178,223,117,222, 35,196,196, 5,221, 99, 26, 39, 76, 19,161, 64,
+ 19, 39, 15,197, 76,153,191,180,167,202, 85, 16,119,131,197,251, 68,224,117, 5,175, 82, 17,149,181, 88,146, 23, 86,177,202,159,
+126,255,196,177,169,213,107,203, 83,139,228, 35,114, 12, 48, 70,226,126,215,225,253,227, 29,238, 15, 29,132, 34, 91, 81,119, 24,
+208,252,244,199,144,109, 3,119, 26,241,171, 95,127,141, 95,253,246, 27, 42,138, 9, 53,106,239,106, 29, 19,117,180,253, 22,142,
+115, 45,152,226,150,175,190, 9, 24,202,111,167,237, 55, 10, 83,113,163,132,207,216,230,180,231, 55,148,167, 55,161,172,219, 80,
+162,237, 87, 18,226,179,121,111, 55, 34,211,122,224,184, 38, 5,138,148,241,180, 63,224,159,255,221,223,163, 21, 10, 8, 17,129,
+195, 56, 98, 8, 88, 87,178,235,208,184,153,174, 17, 23,104,116, 76,133,219, 82,128, 6,231, 96, 23, 91,143,247, 30, 79, 79,143,
+ 88, 87,135,182,109, 41,147,250, 50, 34, 1,248,233, 79,127,138,105,158, 48, 77,211,109,148,100,164,145,254,249,124,130, 15,158,
+108, 71,156,203,126, 62,159,233,160,174, 40, 40,198,106,234, 18,187,174, 5,144,113, 25, 71,188,188,188, 16, 79,193, 90,244, 93,
+143, 47,158,222,225,245,229, 21,239,191,124, 15,163, 45, 98, 78,240,129,246,222, 20, 32,163, 25,190, 19,153,153, 46,144,138,106,
+ 56, 70,250, 72,169,218,117, 50,163,153,115, 78,149, 22, 70,172,123,154, 34,106, 41, 73,204, 36,101,125,240, 38,100,134,171,200,
+186, 47, 95,215, 21, 70, 73,154, 48, 2, 48, 70,227,112,216, 51, 75,125,133,181, 77,157, 74,208,131, 95,214, 14,220, 90,203, 60,
+242, 6,227, 52, 49, 16, 70,163,237,232,239,100,100,104, 46,106,130,131, 74, 4, 8, 15,186, 46, 11,233, 75,154,134,178,191,149,
+162,130,196, 76,115,173,205, 13, 85,173,132,144,152,198,194, 7, 34,215,245, 67, 15,231,121,242, 32, 69,229,172, 23,134,124,230,
+223,167, 76, 1, 5,235,124, 32,233, 89, 28, 83,160,255,135,180, 65,141, 94, 11,165,214, 10, 57, 68,182, 54,238, 43,185,109, 93,
+ 87,180, 13,189,215, 52,214,119, 88, 87,135,253,129, 48,182, 70,107, 6,103,137, 27, 58,154,109, 72, 11, 97,139,123,135,211, 25,
+193,225, 57, 11, 7,176,104,182,164, 85, 30,255, 60, 67, 8,210,134, 32,101,206, 59,167,206, 29,146,106,207,202,130,203,121, 89,
+217,147, 78,122,159,138, 42,151,146,240,203, 12,166, 73,188,162, 0,255, 93,202,179, 23,181, 9, 42, 77, 75,211,118,228,166,154,
+215,106,159, 43,226, 71, 2, 47, 69, 62,124,181,240, 62, 96,158, 38,164,250, 30,170,106, 93,238,187,134, 26, 22, 22,173,158,207,
+103,238,218,123, 90,163,229,223, 29, 91, 94,237,112,165, 33,133,248,108,128, 90,190,125, 64,109,158,245,242, 83,176, 6,163,213,
+181,146,183,227,218,107,119, 87, 68,102,249,211,232,203, 26,135, 42,110, 71,189, 28, 21,170,181,174, 56, 84,205,185,234,154,247,
+180,146,223, 12,195, 7, 5,163, 5,172,150,176, 54,195, 42, 64,230, 4,101, 5,164, 74, 16, 42, 34, 5, 15, 31, 5,198, 37, 32,
+ 68, 64, 40, 77, 93,102, 10, 16, 41, 67,129,224, 39,129,189,228,185,142, 47,242,213,186,198, 84,163,235,200, 84, 94, 33, 36, 28,
+ 18, 35,114, 98, 0,136,134, 16, 10, 90, 10, 10,152,209,146,118,135,108,147, 83,197, 54,199,136, 87,157,104, 28,168, 64, 29,111,
+100,165,119, 65,182, 86,189, 87,181, 38,208,247,117,222,179,199, 95, 34, 68, 48, 96,129, 48,180,203,188, 98, 89, 28,188, 11,136,
+145, 58,209,152,249, 32,144, 98,205, 63,191,102,164,139, 26, 45,187,141,237,123,203, 42,223,230,150,147, 74,147,201,235, 28, 32,
+ 35, 11, 9,141,125,218,215,113,118,130,204, 9, 73, 39,136, 20, 48, 8, 96, 48, 18,247,143, 59,188,127,127,143,187,161,135,247,
+ 43,194,178, 64, 53, 29, 18, 18,250,222,242, 1,193,114, 82,221,149,179,158,182,156,153,124,165, 86,165,155, 36,212, 91, 13,104,
+185,198,210, 70, 30,122, 83,208, 63, 35,162,171, 83,245, 58, 86,207,127, 16, 55, 83,239,161, 92,206, 30,226, 77,120, 11, 54, 88,
+159,107,152, 17, 54,167,230, 34,184, 20, 57,163, 55, 13,254,219, 95,252,115,188,187,187, 67, 90, 61,141,147,151,133,237, 58,148,
+153,237,130, 7, 32, 48, 47, 43,141,218,187, 14, 46,120, 8,102,128,159,207,103, 72,144,160,179, 76,147,136, 54,151, 49,236,118,
+156,201,109,145, 66,196,238,254, 14,235,178,226,114,161, 36,181,210,157,121,183,226,254,241,158,166, 68,107,132, 85,154, 10,182,
+ 20,184,156, 79, 88,230, 9, 90,209, 42, 9, 57, 97, 89,103,210,164,228,136,243,121, 4,164,132,148, 9,214,104, 4,239,144, 83,
+192, 60,157, 97, 52,179,197,115,134,209, 10, 13, 19,198,148,214,184,140, 23,218, 95,134, 8,169, 13, 18, 72,244, 36,121,159,173,
+181,174, 7, 91, 18,144,129,167,125, 4,254, 16,144, 8,129, 14,218, 33, 20, 27, 84,134,150, 10,107,240, 85,123, 65,221, 95,100,
+136,200, 12,203,214,173, 28, 34,118,135, 3,246,251, 29,166,105,164,238, 92, 27, 72,229,171,248, 85,137, 43, 12,165,216, 7,219,
+182,197,137, 99,106, 73, 27, 67,227,113,163,245, 53,195,164, 23,236, 0, 0, 17,119, 73, 68, 65, 84,172,100, 89,120,244, 94,198,
+192, 11,218,166,229,238, 57,242, 24, 62, 32, 7, 18,174,209, 56,127,207, 49,159,129,167,116,212,105, 74,126,143,168,184, 4, 88,
+107,170,117,182, 8,141, 27,107, 73, 75,195,192,149,200, 48, 21,173, 53,214,213,179, 29,205, 34, 70, 26, 33,211,235,139,218,101,
+134, 16,232,138,101, 44,181, 82, 18,227, 56, 17, 37,143,139,128, 15, 68, 49,235,122,192, 54, 13,156,191, 32, 35,163,235,123, 64,
+ 0, 33, 6,138,145,101,177,111,209, 13, 68,239,145, 82,199,197,137, 14, 15, 33, 70, 24,107, 49, 29, 39, 60, 63,191,224,225,225,
+190,174, 84, 78,167, 19,186,174,140,231,155, 10,217,241,222, 87,251, 88, 89,231, 22,113,227,178,174, 88,221,138,174, 49,108,147,
+138,245,126, 36, 52,111,170, 7,179,156,105,178,226,220,202, 56, 94, 2, 93,197,136,122,128,110, 26,139, 97,216,177, 62,197, 87,
+ 12,236,253,253, 61,190,249,230, 91, 0, 18, 33, 78,216,237,246, 85,101, 95,112,205,153,211, 6,189,247,184,191, 59, 96,156, 22,
+ 92, 46, 19,124, 10,120,125,125,193, 97,191,199,187,119,143,120,126,126,102,183,195,166, 25,169, 90,173,107,125, 42, 40,114, 8,
+241, 89, 10,102,126,243,172,207,137, 87,153,169, 8,190, 5,242,198,250,171,149,150, 55, 34,170,124,157, 85,210, 73,119, 27,134,
+130, 98,165,184,182,252,219,206, 75,128, 60,177,214, 88, 24,109, 96,120, 79, 38,133,132,150, 12, 9,216,236,212,149, 96,239,187,
+ 32, 32,132,231, 37,105, 0, 32,100, 66,144, 25, 58, 11,248, 40,177,122,226,167, 71,238,188, 82,200, 76,148, 99, 81, 18,179,164,
+111,206, 68,101, 60, 38,128,196,189,147,200,180,211,149, 66, 86,254, 47,193, 98, 88,184,192, 54,136,146, 24,167,180, 64,228, 40,
+ 86, 33, 4,211,229,184,115,142, 9,177, 8,233, 32,233,225,195,228,184,124,131,249,147, 53,166, 85,112,222,109,241, 74,122, 31,
+249,130,242, 8, 62, 50, 4,195,115,160, 2,248,123,209, 71, 8,145, 88,241, 27,174,187,216, 56, 15, 18, 47,131,228, 27,198,253,
+214, 1, 16, 83,102,193, 26, 21, 9, 72,193,193, 53,212,244, 67, 74,228, 36,106, 36,168, 84,138,196,146, 50,163, 49, 10,187, 78,
+ 97,223, 43,220,183, 10,247, 70,226,177, 49,216,189,187, 67, 82, 18,113, 93,160,108,131, 57, 56,204,211,136, 4,129,144, 37,178,
+148,136,252, 14,188,221,115,221,174,168,243, 31,166, 22,230,202,121,216,122,222, 88, 84,159,175,224,153, 82,160,171,126, 66, 84,
+151,192, 86, 53,154,243, 22,253, 46,234,154, 99,219,153, 95,255,238,213, 5,241,214, 84,151, 55,130,195,114,157, 89,161,240,139,
+191,251, 59,252,197,159,254, 41,226,188, 66, 52,192,154, 2, 66, 88,208,247, 22, 49,145, 86, 99,252,225, 7,184, 16,233,250,147,
+ 18,243,186, 34,112,244, 35, 37, 73, 81,196,164, 20,146,168, 95,220,137,156,206,167, 58,182, 27, 47, 35,250, 97, 7,183,174,248,
+248,250,130, 53,120,124,249,238, 29, 94, 95,158,177,172, 11, 21, 87,102,143, 55,109, 87,167, 92,116,205,121,246, 90,211, 62,127,
+ 28, 71,164,148,176,219,237,176,186,149, 70,231,193,163,111, 91, 60, 61, 61,224,227,135,143, 64,206, 56,190,190,226,112, 56,224,
+248,250, 2, 64,224,244,122,134,177, 6,251,253, 14, 66,210,110,211, 5,143, 97,183,103,177, 83, 34,125, 45,175,249,180,210,240,
+236,217,214, 90, 83,120,137,228,131, 49,191,254,116,248,165,240, 20,201,239, 41,197, 98,106,172, 43, 89,244, 40, 82, 53, 32, 4,
+ 10,157,114,193, 99,104, 91, 88,219,194,218, 6,227, 56, 50, 64,197, 16, 33,108,154, 32, 4, 17,193, 40,148,133, 58,179,253,126,
+ 95,223,239, 24, 2,148,214, 0,174, 44,117,197,234,235, 34,226, 19,124,232, 49,198,220,168,145, 11, 98, 54,114,106,152, 16,146,
+118,179, 72,245, 80, 45, 57,250,213,249, 80,247,218,101,116,108, 13,117,152,151,203,185, 62,131,181,102,155, 98,240,212,204,112,
+ 66, 89,138, 36, 0, 4, 18, 82, 36,165,253, 82, 14, 32, 49, 85,174,186,110, 26,214, 93,152, 26, 35, 75,197, 63,214,145,183,243,
+142, 41,123, 20,149,171,141,129,243,142,214, 0,243, 4, 25, 1,221,182,200,145,214, 74,129, 39, 59, 57, 10,162,189, 13, 3,243,
+ 0,174, 58, 37,165, 40,239,226,116, 58,227,225,225, 1, 41, 70,178, 89,114,178,229, 52,142,104,109, 67,186, 34, 48, 77,109,131,
+150, 45, 7,173,235,243,139,189,216, 70, 49,152, 40, 35, 73,186, 38, 96, 24,253,170, 36, 21,221,121, 69,100, 76,108,138,137,234,
+ 76, 76,144,146, 56, 0,125,223, 85,140,243, 56,142, 24,134, 29,124, 8,216, 31,238,240,241,227, 75, 69,200, 22,190,202, 60, 47,
+144,146,214, 11, 5,227,186,174, 43,134, 97, 7, 41, 21, 94,158,143, 53, 94,183,239,123, 60, 60, 60,112, 18,157, 35, 39, 80,190,
+ 54,119, 69, 23, 82, 38,200, 33, 38, 62, 68,223, 78, 18,197,134, 47,178,125,210,164,156, 55, 77,205, 53,107,130, 82,218, 68,190,
+229, 85,151, 24,201,250,223,168, 10,204,183, 17,235,117,238, 47,175, 15, 53,107, 27, 88, 67,106, 67,173, 12, 76,233,212,249, 34,
+ 46, 44, 94,228,107, 10,155,139,137,132, 97, 5, 72, 34, 51, 32, 3,140,136,176, 2,136, 89,163,105, 15, 80, 98, 68, 72,145,226,
+ 65,147, 64, 98, 47,162,132,224,131,130,124,115,194,145, 87, 68,103, 1,128, 8,108,138, 92,162, 3, 1,147,141, 8,140, 67,187,
+113,193, 66, 22, 33, 50,140,166,131,129, 81, 4,189,160,145, 27,105, 9,104,164, 75, 47,114, 8,137,199,136, 36,152, 40, 97, 46,
+165,153,203,213,178,145, 57, 96,128, 4, 78,196, 43, 38, 47,167,247, 1,222, 69, 6,143, 92,209,187, 33, 70,248, 68,187,199, 43,
+130, 23, 55, 54,176, 44, 54, 29,106,161,184,161,120,210,115,189, 56,232,193,194, 0,132, 34,182, 19, 10, 66,106, 72, 69,163, 65,
+ 35, 37, 68,142,208, 82, 32,193, 65, 26, 96,232, 12,118,157,134,177, 25, 8, 35, 90,111, 32,166, 51,176, 52, 80, 95, 60, 64, 12,
+ 22, 98,215,194, 30,122,188, 30, 95,161,165, 70,136, 10, 42, 73, 68,145, 89,212,118, 59, 77,200,159,233,154, 63, 91,244,111, 22,
+ 82,249, 70, 76,146,147,164, 3, 92,150,159, 57, 22,136, 63,232, 53, 47, 59,170,207, 89,230,174,159,147,110,161, 18,249, 54,194,
+149,183, 93,100, 14,204, 2, 6, 18, 63,251,201,159,226,239,255,230,111, 17,151, 21,110,158, 32,145, 16,194, 2, 30, 54,193,187,
+132,243,249, 66, 34,185,232,145, 89,160,184, 46, 43,169,145,185, 64, 20, 23, 5, 69,109, 94,176, 58, 71, 2, 51, 86, 87, 91,107,
+113,184,191,195,249,114, 70, 98,161,231, 87, 95,125,133,233, 66,187, 62,199, 29,208, 56,205,252,146, 16, 66, 51,198, 12,239,137,
+195, 61, 12, 29, 21,176,149,174,193,135,135, 7, 30,159, 46,120,122,124,130,247, 52,230, 63, 29, 95, 49,142, 23,104,173,208,182,
+228,250, 56, 79, 19,114, 34,178,219, 48, 12, 80, 90,227,229,245,149, 68, 89, 77,131,166,109,113,124,125,133,110, 59,100,145,224,
+150, 21,186, 33,219, 93,219,112,226,151,214, 88,124,184,233,102, 18,135, 88,164,156, 32,181, 98,237,161, 64,112, 68, 91,203, 66,
+ 64, 42, 90,187, 41, 41,113, 62,143,120,122,184,131, 18, 18, 9, 2,218, 88,124,248,248,140,199,199,187,186,190,114,108,177,235,
+186,166,146,229,202,189,154, 82, 98,208,202, 66,251, 83,169, 72, 19, 18, 2,175, 35,214,235,154,142, 71,167,229,253, 9, 33,208,
+ 46,154,237,104,214, 26,204,203, 68, 15,111,206,147,167,212,220,124,115,168,140, 33, 64, 52, 45, 23,227,133, 85,211, 60, 98,103,
+161,234, 21,202,130, 58, 2, 47,133, 51,114, 80,137,148, 2,193,123, 90, 3,204,107,221,227, 35,229, 58,225, 81,155,176,144,226,
+236,161,223,119,166,164, 52, 41, 97, 53, 17,220,238, 14, 7,152,117, 33, 44,176, 53,176, 86,211,225,159, 11, 82,219, 52,112,235,
+138,196, 83,163, 98,187,148, 18,104, 27,139,105, 94,152, 85,208, 99,158,103, 24,173, 49,141, 35,134,190,175, 44,133,242,255,138,
+246,136,166, 24, 52, 21, 21, 9, 60, 97,160,204, 15, 41, 73,187, 17,124, 32,183,145,144,112, 21,180,147,170,134, 97,113, 43,118,
+251, 29,173, 74,249,231, 83, 44,238, 38, 97,155,168,200, 89, 36, 85, 17,194,165,123, 22,130, 38, 24,214, 26,126,118, 36, 10,105,
+ 17, 10, 90,211,170,129,206, 29, 4, 92,154, 23,143,188,172,104,154, 22,247,247, 2,231,211, 25,222,123, 28,143, 71, 52, 77, 75,
+ 19,129, 93,207,182, 53, 96, 93, 86, 98,218, 11, 65,165,174,120,219,111, 88, 49, 98,147,152,129,171, 34, 62, 95, 39,154,185,130,
+105,210, 13,234, 10,220, 52,126,158,151, 14,241, 71, 69,107, 20,176, 71, 98, 54,114,217,165, 25,109, 96,148,169, 98, 59,193, 88,
+216,171, 29, 40, 95,139, 77, 78,200, 89, 34,112,250, 87, 66, 0, 68,198,154, 2, 12,200,178,208,245,119, 24,250, 87, 44,167, 17,
+ 62, 0, 33, 43, 8,150,249,231,140, 79, 10,250,118,236,172,132,102,209, 66, 81,233,167,107, 82,150, 84,164, 33,224,255, 95,148,
+176, 20,202, 64, 55,143,209, 6, 16,180, 75,179,197,123, 95,196,101, 16,136, 33, 33, 32, 80,158,242, 38,177, 39,134,192,220,247,
+130,141,189, 38, 60,133, 16, 40,119, 55,209,200, 45, 4,218, 35,122, 23,121,175, 40,234,216, 62, 68, 26,187, 69, 30,183, 92, 45,
+122, 28, 35,250, 38,255,251,118,148, 44,174, 59,245, 55,211,228, 34,136,147,176,208,170,129,182, 29,180,105,232,176,146, 34,114,
+ 88,144, 69,130,130,128,230, 88, 91,129, 8, 35, 50,172, 4,180,204, 80, 26, 72,126,130, 8,134,176,189, 6,216,189,127,130, 79,
+132,229, 20, 74, 3, 41, 65,214,208,218, 63,156, 33,144, 55,177,168, 91,129,220,246, 20, 80,186,236,171,114, 93, 66,178, 83, 34,
+191, 21,193,101, 81,201, 82, 55, 20,186,173, 8, 79,252, 97, 64, 77,186,225, 61,228, 55, 66, 21, 81,109, 44, 50, 39, 60, 28,238,
+241,175,254,229,127, 15, 3,137,209,173,120,125,249,128,174,179,112,235, 2, 41, 51, 86,183, 16, 33,206,104,216,174,225, 20, 38,
+133,101,117,220, 33,210, 3,124,158,103, 70, 84,142,232,251, 30,199,243, 9,195, 48,160, 83, 18, 11, 99, 58,219,190, 33,202,128,
+164,180, 52,165, 20,190,254,250,107,156,143, 39, 52,198,162, 29, 58, 40,173, 16, 67,192, 52, 78, 53, 46, 51,112, 68,167,146,138,
+174, 97, 78,161,186,191,123, 64, 78,192,101,156,234,116, 71, 8,133,156, 50,150,197,177,106,184,199,110,183,195, 60,207,156,162,
+ 8,180,187, 30, 75,116, 16, 46, 96, 90, 70,244,195,128,161,239,240,252,241, 35,117,118,129,118,237,237,126, 7,164, 12,163, 20,
+ 34, 40,186,217,175, 43, 90, 75, 12,248,182,107,112, 25, 71, 86,188,231,202,104,175, 36, 48, 69,135,207,180, 58, 86, 69,147,126,
+101,157, 87,200, 39,133,215,227,153,118,236,156,205, 61, 47,107,189,151,214,149, 30,208,125,223,214, 46, 77, 73, 81,199,176, 0,
+224, 89,164, 40,149,130,247, 17,141,177, 55,196, 51,163, 27, 56, 63,177, 51, 70,215, 93,172,212, 10,113, 38,129, 84, 6,169,204,
+231,117,172, 74,116,173,205, 39,227,212,174,235,106,122, 92,212,154,184,252,193, 99,183,235,177, 27,122,222, 61,243,131, 94, 16,
+202, 52,101, 34,167, 53,182,193, 18, 22, 66,176, 42,130, 61,153,205,243, 41,132, 8,163, 45,167,148,249, 42,112, 43,207, 69,250,
+ 26, 61, 70, 81, 31, 8, 16, 25, 8,171,199, 58,207,232,172,133, 95,103, 74, 63,227, 67, 84, 78,169, 10, 91, 75, 7, 77,163,120,
+ 9, 37, 84,213,125, 12,253, 0,239, 2,118,195,129,166, 40,206, 65,101,212,107,160, 8,244,202,207, 91,238,201,174, 35,235,227,
+ 53, 38,250,106,183,133, 16, 52,130,111,201,158,167,148,130, 95, 28,180, 33, 4,109, 98, 1,178,247, 30,141,177,104,140,197, 56,
+141,232,122, 6, 38,157,207,104,251,190, 34,172,231,121,173,171,172,113,154, 48, 78, 19, 98,202, 56, 28, 14,248,237,111,190,161,
+157,188, 18,100, 51, 6, 77, 6,178, 84, 72,160,194,223,117, 77, 85,195,143,227, 68, 48,178,135, 7,172, 51, 57, 43,214,197,193,
+173, 43,251,228, 9, 29,220,182, 45,172,181, 24,231, 5,142,147,251, 74, 32, 80,105, 12, 69,153,234,110,104,153, 41, 3, 49,225,
+134,158,153,111,160, 94,185,174,202,213, 99,107,126, 41, 54,162,160,237,135, 20,146,189,117, 37,156,228,119, 61,136,233,115,181,
+ 50, 24,134, 61,186,118,128, 49, 77, 29,189,151,177, 61,237, 3, 82,197,181,222, 32, 62,217,115,142,140,122, 34, 47,138,122, 72,
+130,242, 11, 9, 28,199, 9,107,200,200, 82, 67, 72,195, 86,128,171,117,173,124,148, 11,133, 78,210,234, 42, 10, 19,183,161, 27,
+114,227, 73, 47,150, 21,129, 4, 37,169,168, 55,214, 64, 40,130, 54, 88, 62,164,208,196,129,227,101,243,213, 46, 22, 67, 68, 98,
+ 88, 2, 54, 39, 43,200,114, 51,144,133, 41, 4,234,196, 83,202,112, 43,141,221, 99, 76,240, 28,243,152, 34,174, 60,246, 24,217,
+ 43,154,106,193, 18,159,141, 11,205,213,147,122, 77, 71,147, 87,101, 56, 54,250,135,124,181,149,145, 99,192, 66,155, 22, 74,119,
+144,138, 79,199, 33, 32,121, 15, 32,226,208, 26,188,127, 56,224, 71, 95,189,195,251,119,247,248,179, 47,223,225,221,195, 30,135,
+135, 29,204,190,133,106, 13,132, 17, 16, 74, 67,180, 45, 36, 52,254,183,255,233,127,197,175,126,251, 1, 43, 52,162,224, 72,220,
+ 98, 23, 17, 21,113,240,230,148,121,251, 81,166, 13, 69,189,143, 92,148,160,226, 54,209, 45,179, 48,173, 96, 94, 75, 98, 93,254,
+252, 36,224, 58,117,202,117, 55, 47,110,246, 87,216,184, 7,176,113, 43,108,195,135, 80,157, 4,153,175, 55,228, 12,145, 50,118,
+ 77,135,127,249,139,127,129, 31, 63,190,195,124, 57,227,229,249, 35,140, 81, 24,167, 17,211, 60, 50,222,212,192,167,136, 44, 4,
+ 66, 76,128, 32, 80,201,234, 28,180,214,245, 97, 95,214, 98, 77, 67,150,165,195,221,158,186,206,148, 96,155, 6, 33, 6,122, 24,
+197,132,213, 81, 23, 42, 20,225, 95,165,148,248,226,139, 47,144,145,177,122,122,184, 4, 31,216, 34,229,107,242, 90,121, 29,215,
+149, 45, 61, 16,112, 62, 18, 46,181,235,209,182, 61,130,247, 56,159, 78,117,183,173,141,134,143,212,201,167,156,176,219,239,224,
+ 82,196,188, 46,152,215,133,186, 37, 37,177,172, 11,142,199, 87,104, 41,235, 61, 31,188,231,180, 47,133,213,205,176,134,136, 96,
+ 5, 2, 37,144, 9,120,196,197, 78,148, 45, 74,142,124,201, 83, 54,250,178,146,208, 44, 35, 35,167, 88, 11,226,178,174,144, 82,
+225,238,110,127, 85,130,107,141,121,166,232, 90, 89,129, 41, 60, 43, 76,153, 0, 53,125, 71,157, 46, 71,222,114,107, 13,195, 16,
+ 31, 33, 9, 29,157, 65,241,168,164, 66,215,213, 73, 83,120,226, 69, 60,214,245, 61,214, 98, 15,211,154, 50,210,185, 51,163,130,
+ 70,191,119,215,209,174, 57,179,174,165,140,247, 1, 48,201,236,218,205, 85,165, 58, 50,145,245,120,103,107,180,102,145, 30, 29,
+216,148,148,112,139,171,201,144,137, 85,241, 21, 89,204, 13, 76,215,181, 8, 33,144,227, 64, 40,158,218,209,149,110, 25,150, 19,
+ 24,160,163,164,130, 91, 87, 42,202,193, 19, 74,149, 19, 42,131,167,209,190,210, 10,203, 60,195, 88, 11,173,136,160,105,173,198,
+229,114,225,230, 73,162,105, 73,116, 88, 18,198, 80, 66,118,184,192,229,146, 17,194, 19,201,204, 16, 26,193,252,116,195, 2,236,
+101, 93,107,129,166,189,188,132,243,174, 30,214,140,210,200,153,226,121,155,166, 67,224,213,165,226,137, 88,240,177,238,245,207,
+231, 11, 82,206,152,231, 5, 67,191, 71,223, 15, 85, 96, 55,142,172,199, 16, 18,109,219, 1, 60,105,157,166,137,213,248,244,122,
+142, 35, 9,234,138, 37,211, 90,131,204,135,197,192, 66, 72,210, 13, 88, 52,109,139,149,215, 58,197, 82, 28, 82, 98,141,134,216,
+216,196,137,151, 86, 86,190, 37, 46,187, 88,121,183, 83,115, 5,176, 22,172,140,208, 83, 9,113,231,157,247,198,130,180,141,202,
+124,171, 2, 22,130, 71,223, 41, 67,102, 64, 11, 69,254, 71,149, 17,101, 66, 20, 17, 73,144,192,203, 39,207,227,233, 72,208,131,
+ 68, 35, 83,145, 20,141,208,217, 59,105,180, 70, 99, 12,172,105, 96,218, 6,182,213, 24, 58,131,119, 79, 15,120,188,219, 67,203,
+ 4, 45, 2, 4, 60,241,215,114,134, 72,180,115, 47, 80,138, 50, 94,174,187, 47, 73, 16,147,200,177,163,108,194, 7, 74,232,188,
+ 40, 49,125, 44,118,210, 18,210, 40, 72,163, 33,165,134,210, 22, 82,107, 64,169,234,217,143, 57, 19,242, 82, 40,164,204,249,232,
+ 41, 87, 65, 91,228, 66, 32,179, 0,146, 68,138,132,158,141, 81, 32, 37, 9,183, 4,172, 46,194, 39,129,144, 4, 34, 20, 34,138,
+ 6,128,196,107, 73,210,206, 62,229,171, 34,253,102, 74,146,232,107, 3,148, 36,151,178, 64, 68, 70, 20,244,218,103,145, 64, 47,
+ 7, 3,132, 50, 29, 88, 84,193,231, 18, 85, 7, 89, 88, 36, 24,190,193,103,196,117,134, 76, 1,143,125,139,175,190,120,192,211,
+227, 29, 84,142, 88,214, 25, 31,221,140,179, 86,152, 97,144, 85, 11,217,239, 33,146, 70,158, 86,164,121,132,105, 12,254,236, 79,
+254, 4, 26, 30, 90, 80,122,148,204,134,126,247,242, 61, 33,160, 75,176,174, 84,200,194, 80,140, 46,120,157,145, 18,151,208,128,
+ 4,135, 44, 19,146, 76, 52,198, 71, 68, 74,225,170,172,231,196,185,196,193, 7,101, 52, 46,106,104, 93,186, 73,237,170, 54, 38,
+102, 44, 40,113,245,121, 42,153, 33, 69, 2,178, 71, 78, 1, 25, 1, 33,251, 13,124, 73,114, 49,167,157, 83,226,175, 77, 19, 15,
+ 5, 35, 52,254,250,159,252, 37,254,171,159,253, 20,110,190, 32,186, 21, 50, 1,211, 56, 99,154,102,248,156,176, 6,250, 72, 41,
+227,114,185,208, 94, 48,210,184,145, 30, 6,182, 30, 74,250,190,131, 0,101, 13,164,224, 17,125,192,235,203, 11,166,121,198,101,
+ 36, 96,141,177, 13, 46,211,136,253,221, 1,243, 74,177,144,198, 24, 60, 62, 61, 2,146,246,195, 41, 68,204,211,140,182, 37, 94,
+121, 10,129, 40,138, 26,184,123, 60,224,114,161,238,182,235, 26,184,117, 1, 88, 28, 42, 36, 16,130,131,243, 43, 66, 10, 8, 57,
+ 2, 90, 98,114, 51,198,101, 70, 18, 2,237, 48, 96, 13, 1,211,116, 70, 12, 30,214, 42, 40,171,240,114, 58,226, 52,158,161, 27,
+ 13,105, 21,148, 81,152,166,153, 14, 65, 90, 19,165, 80,102,172,110, 66,206,180,130,176, 70, 99, 93,103, 88,171,209, 53, 6,119,
+ 93,135, 94, 73,116,146, 24, 22, 86, 11,208, 51, 57,161,233, 44,144, 35,180, 68,157,134, 93,198, 5,128,134,115,180,207,151,138,
+ 58,118, 31, 51,230,197,195,135, 8,109, 13,197,195,102, 9,153, 37,214,133, 2,112,164, 49,152,220, 2,159, 60,164, 85,240,209,
+ 65, 42,114,202, 16,226,148,214, 0,228,139,151,168,167, 13, 65,197, 55, 33, 35, 75, 81, 15,224,193,123,244,173, 5, 16, 97, 12,
+233, 39,200,117, 67,207,157,152, 57, 40, 70,210, 53, 45, 9, 18, 2,205,157,108,103, 27, 68,231,209, 54,154, 52, 0,252,220, 81,
+202,208, 20, 35, 11, 88,169,208,106,139, 28,129,198, 16,254,182,181, 13, 36, 8,115, 90,108,127,133, 20,103,141, 65,103, 27, 40,
+242, 24, 2, 41, 65, 11, 3, 45, 45,173, 15, 83, 70, 74, 2,211,228,224,214,128,174,221, 33, 39,129,224, 51,148, 52,136, 1, 80,
+176, 8, 46, 67, 9, 42,226,182,209,208,141,130, 79, 1,182,109, 17, 65,236, 5, 72, 64,106,129,197,173,184,123,188,131,207, 1,
+ 33, 5,100,102,113,148, 28,244,105, 93,176,186,192, 1, 62, 1,128,134, 98, 60,109, 78,168, 90, 44, 8, 1,101,168, 51,118,158,
+106, 73,146, 9, 73,102,248,228,153,234, 70,214,230,243, 56, 97,241, 17, 80, 26, 66,107,172,193, 67,107, 11, 64, 65,106, 3, 41,
+ 8, 79, 11, 33, 49,205, 43,229,107,204,116, 24, 36,162,163, 36, 26,157, 0, 30,239, 30,112, 55,236,145, 99,194,249,120, 68,219,
+118, 48,218, 2, 17,152,206, 23,248,121, 5,144, 41, 27, 0, 25,243,124,193, 52,157, 0,153, 48, 28,122,220, 31, 14,232,154,166,
+106,201,166,113,132, 72, 17,119,187, 1,217,123, 8, 14, 53, 66, 12, 92,131, 55,154,168,196,200,240, 44,160,202, 63, 82, 65, 75,
+ 69, 58, 53, 81, 62, 72, 80, 41,132,192,255, 7, 3,238,150, 17, 62,123,156,230, 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..0a7f5b3ba7b
--- /dev/null
+++ b/source/blender/editors/datafiles/startup.blend.c
@@ -0,0 +1,11468 @@
+/* DataToC output of file <startup_blend> */
+
+int datatoc_startup_blend_size= 366764;
+char datatoc_startup_blend[]= {
+ 66, 76, 69, 78, 68, 69, 82, 95,118, 50, 53, 51,
+ 82, 69, 78, 68, 32, 0, 0, 0,136,108,137,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,160,107,137,191,
+202, 0, 0, 0, 1, 0, 0, 0, 32, 32, 32, 49, 1, 0, 0, 0,250, 0, 0, 0, 1, 0, 0, 1, 24, 81, 88, 10, 16,228, 90, 10,
+ 0, 16, 0, 0,128, 32, 4, 0, 47,114,111,111,116, 47, 46, 98,108,101,110,100,101,114, 47, 50, 46, 53, 51, 47, 99,111,110,102,
+105,103, 47,115,116, 97,114,116,117,112, 46, 98,108,101,110,100, 0,108,137,191,224,108,137,191, 0, 0, 0, 0, 1,128,173,251,
+220,117,137,191, 42,230,132, 8,176, 8, 93, 10,136,108,137,191, 32, 0, 0, 0,255,255,255,255,224,108,137,191,255,255,255,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,236,127,188, 8,104,108,137,191,115,232,132, 8,176,100, 64, 10,136,108,137,191,
+ 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 14, 45,190, 82, 69, 78, 68, 32, 0, 0, 0,136,108,137,191,
+ 0, 0, 0, 0, 1, 0, 0, 0,224,104, 78, 9,220,117,137,191,184,108,137,191, 49,239,132, 8,176,100, 64, 10, 82, 69, 78, 68,
+ 32, 0, 0, 0,136,108,137,191,128, 63,168, 8,236,127,188, 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, 0, 0, 0, 0, 24, 81, 88, 10, 0, 0, 0, 0, 87, 77, 0, 0,168, 0, 0, 0,
+ 0,140, 81, 9,110, 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,
+160,180, 80, 10,160,180, 80, 10,160,180, 80, 10,160,180, 80, 10, 3, 0, 0, 0, 0, 0, 0, 0, 16,163, 79, 9,136,145, 79, 9,
+ 0, 0, 0, 0, 0, 0, 0, 0,184,141, 88, 9,184, 35, 81, 10, 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, 8,177, 64, 10,
+ 8,177, 64, 10, 8,177, 64, 10,248, 54, 88, 9,248, 54, 88, 9,248, 54, 88, 9, 68, 65, 84, 65,148, 0, 0, 0,160,180, 80, 10,
+111, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 81, 82, 9, 1, 0, 0, 0, 0, 0, 0, 0, 24, 81, 88, 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, 5, 5, 56, 0,246, 4,226, 3, 0, 0, 0, 0, 1, 0,238, 3, 0, 0, 1, 0, 0, 0, 0, 0,168, 48, 84, 9,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,232,200, 87, 9,208,185, 87, 9,208,185, 87, 9,112, 55, 88, 9,
+232, 55, 88, 9, 96, 56, 88, 9, 96, 56, 88, 9,216, 56, 88, 9,184, 58, 85, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,
+140, 0, 0, 0, 88,159, 78, 10,196, 0, 0, 0, 1, 0, 0, 0,224,212, 60, 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, 15, 55, 10,192, 37, 85, 10,192,225, 87, 9,136,149, 60, 10,208,149, 60, 10, 0,205, 60, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 16,228, 90, 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, 15, 55, 10,197, 0, 0, 0, 1, 0, 0, 0, 88,180, 84, 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, 88,180, 84, 10,197, 0, 0, 0, 1, 0, 0, 0, 40,197, 80, 9,248, 15, 55, 10,
+ 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 40,197, 80, 9,197, 0, 0, 0, 1, 0, 0, 0,
+ 16,160, 78, 10, 88,180, 84, 10, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 16,160, 78, 10,
+197, 0, 0, 0, 1, 0, 0, 0, 16,228, 79, 9, 40,197, 80, 9, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0, 16,228, 79, 9,197, 0, 0, 0, 1, 0, 0, 0,184, 29, 79, 9, 16,160, 78, 10, 0, 0, 0, 0, 0, 0, 70, 4,
+ 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,184, 29, 79, 9,197, 0, 0, 0, 1, 0, 0, 0, 48,141, 84, 10, 16,228, 79, 9,
+ 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 48,141, 84, 10,197, 0, 0, 0, 1, 0, 0, 0,
+240,152, 88, 9,184, 29, 79, 9, 0, 0, 0, 0, 44, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,240,152, 88, 9,
+197, 0, 0, 0, 1, 0, 0, 0,240,203, 80, 9, 48,141, 84, 10, 0, 0, 0, 0, 44, 6, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0,240,203, 80, 9,197, 0, 0, 0, 1, 0, 0, 0,208,171, 79, 9,240,152, 88, 9, 0, 0, 0, 0, 44, 6,220, 1,
+ 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,208,171, 79, 9,197, 0, 0, 0, 1, 0, 0, 0, 96,211, 87, 9,240,203, 80, 9,
+ 0, 0, 0, 0,118, 7,220, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96,211, 87, 9,197, 0, 0, 0, 1, 0, 0, 0,
+ 88, 68, 81, 10,208,171, 79, 9, 0, 0, 0, 0, 0, 0,132, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 88, 68, 81, 10,
+197, 0, 0, 0, 1, 0, 0, 0,160,154, 61, 10, 96,211, 87, 9, 0, 0, 0, 0, 44, 6,132, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0,160,154, 61, 10,197, 0, 0, 0, 1, 0, 0, 0,224, 27, 77, 10, 88, 68, 81, 10, 0, 0, 0, 0,160, 2,132, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,224, 27, 77, 10,197, 0, 0, 0, 1, 0, 0, 0,104,177, 80, 9,160,154, 61, 10,
+ 0, 0, 0, 0,160, 2, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,104,177, 80, 9,197, 0, 0, 0, 1, 0, 0, 0,
+104, 32, 59, 10,224, 27, 77, 10, 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,104, 32, 59, 10,
+197, 0, 0, 0, 1, 0, 0, 0, 8, 40, 82, 9,104,177, 80, 9, 0, 0, 0, 0,160, 2,140, 1, 0, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0, 8, 40, 82, 9,197, 0, 0, 0, 1, 0, 0, 0,192, 37, 85, 10,104, 32, 59, 10, 0, 0, 0, 0, 44, 6,100, 3,
+ 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,192, 37, 85, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8, 40, 82, 9,
+ 0, 0, 0, 0,118, 7,100, 3, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,192,225, 87, 9,198, 0, 0, 0, 1, 0, 0, 0,
+248,115, 56, 10, 0, 0, 0, 0, 40,197, 80, 9, 88,180, 84, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+248,115, 56, 10,198, 0, 0, 0, 1, 0, 0, 0,112, 2, 84, 10,192,225, 87, 9, 16,228, 79, 9, 88,180, 84, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112, 2, 84, 10,198, 0, 0, 0, 1, 0, 0, 0,240,180, 81, 10,248,115, 56, 10,
+184, 29, 79, 9, 40,197, 80, 9, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,240,180, 81, 10,198, 0, 0, 0,
+ 1, 0, 0, 0, 96,181, 80, 10,112, 2, 84, 10,184, 29, 79, 9, 16,228, 79, 9, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0, 96,181, 80, 10,198, 0, 0, 0, 1, 0, 0, 0, 16,143, 60, 10,240,180, 81, 10,248, 15, 55, 10, 48,141, 84, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 16,143, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 88,143, 60, 10,
+ 96,181, 80, 10, 16,160, 78, 10, 48,141, 84, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 88,143, 60, 10,
+198, 0, 0, 0, 1, 0, 0, 0,160,143, 60, 10, 16,143, 60, 10,184, 29, 79, 9,240,152, 88, 9, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0,160,143, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,232,143, 60, 10, 88,143, 60, 10,240,203, 80, 9,
+ 48,141, 84, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,232,143, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,
+ 48,144, 60, 10,160,143, 60, 10,208,171, 79, 9, 16,160, 78, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+ 48,144, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,120,144, 60, 10,232,143, 60, 10,208,171, 79, 9,240,203, 80, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,120,144, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,192,144, 60, 10, 48,144, 60, 10,
+ 96,211, 87, 9,248, 15, 55, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,192,144, 60, 10,198, 0, 0, 0,
+ 1, 0, 0, 0, 8,145, 60, 10,120,144, 60, 10,240,152, 88, 9, 88, 68, 81, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0, 8,145, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 80,145, 60, 10,192,144, 60, 10, 88, 68, 81, 10, 48,141, 84, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 80,145, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,152,145, 60, 10,
+ 8,145, 60, 10, 96,211, 87, 9, 88, 68, 81, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,152,145, 60, 10,
+198, 0, 0, 0, 1, 0, 0, 0,224,145, 60, 10, 80,145, 60, 10, 96,211, 87, 9,160,154, 61, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0,224,145, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 40,146, 60, 10,152,145, 60, 10,160,154, 61, 10,
+ 88, 68, 81, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 40,146, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,
+112,146, 60, 10,224,145, 60, 10, 16,228, 79, 9,224, 27, 77, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+112,146, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,184,146, 60, 10, 40,146, 60, 10,240,152, 88, 9,224, 27, 77, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,184,146, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 0,147, 60, 10,112,146, 60, 10,
+160,154, 61, 10,224, 27, 77, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 0,147, 60, 10,198, 0, 0, 0,
+ 1, 0, 0, 0, 72,147, 60, 10,184,146, 60, 10,104,177, 80, 9, 96,211, 87, 9, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0, 72,147, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,144,147, 60, 10, 0,147, 60, 10,104, 32, 59, 10,160,154, 61, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,144,147, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,216,147, 60, 10,
+ 72,147, 60, 10,104,177, 80, 9,104, 32, 59, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,216,147, 60, 10,
+198, 0, 0, 0, 1, 0, 0, 0, 32,148, 60, 10,144,147, 60, 10,240,203, 80, 9, 8, 40, 82, 9, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0, 32,148, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,104,148, 60, 10,216,147, 60, 10, 8, 40, 82, 9,
+240,152, 88, 9, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,104,148, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,
+176,148, 60, 10, 32,148, 60, 10,184, 29, 79, 9,192, 37, 85, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+176,148, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,248,148, 60, 10,104,148, 60, 10,208,171, 79, 9,192, 37, 85, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,248,148, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 64,149, 60, 10,176,148, 60, 10,
+ 8, 40, 82, 9,192, 37, 85, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 64,149, 60, 10,198, 0, 0, 0,
+ 1, 0, 0, 0,136,149, 60, 10,248,148, 60, 10, 16,228, 79, 9,104,177, 80, 9, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0,136,149, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64,149, 60, 10,104, 32, 59, 10,224, 27, 77, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,208,149, 60, 10,200, 0, 0, 0, 1, 0, 0, 0,176,152, 60, 10,
+ 0, 0, 0, 0, 16,228, 79, 9, 88,180, 84, 10, 40,197, 80, 9,184, 29, 79, 9, 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, 0, 0, 0, 0,128,212, 60, 10,
+128,212, 60, 10, 96,150, 60, 10,136,151, 60, 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,150, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,136,151, 60, 10, 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,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, 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, 68, 65, 84, 65,248, 0, 0, 0,136,151, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 96,150, 60, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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,152, 60, 10,
+200, 0, 0, 0, 1, 0, 0, 0,216,173, 60, 10,208,149, 60, 10, 48,141, 84, 10,240,203, 80, 9,208,171, 79, 9, 16,160, 78, 10,
+ 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,219, 1, 0, 0, 4, 4, 74, 1,220, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,208,172, 60, 10,208,172, 60, 10, 64,153, 60, 10,104,154, 60, 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, 64,153, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,104,154, 60, 10,
+ 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,165, 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, 73, 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, 74, 1, 31, 0, 74, 1,
+ 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0,189, 1, 0, 0,219, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 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, 68, 65, 84, 65,248, 0, 0, 0,104,154, 60, 10,
+201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64,153, 60, 10, 0, 0, 0, 0, 0, 0,165, 67, 0,128, 86,196, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1,128,156, 67, 2,128,222,195, 0, 0, 0, 0, 57, 1, 0, 0, 74, 1, 0, 0, 0, 0, 0, 0,188, 1, 0, 0,
+ 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 0, 0,188, 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, 74, 1,189, 1, 57, 1,189, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,
+118, 7, 0, 0, 0, 0, 0, 0,188, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 1,189, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,155, 60, 10, 96,171, 60, 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,144,155, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 0,157, 60, 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, 57, 1, 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, 0,157, 60, 10,
+199, 0, 0, 0, 1, 0, 0, 0,112,158, 60, 10,144,155, 60, 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, 57, 1, 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,112,158, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,224,159, 60, 10,
+ 0,157, 60, 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, 57, 1, 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,224,159, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 80,161, 60, 10,112,158, 60, 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, 57, 1,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, 80,161, 60, 10,199, 0, 0, 0,
+ 1, 0, 0, 0,192,162, 60, 10,224,159, 60, 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, 57, 1, 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,192,162, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 48,164, 60, 10, 80,161, 60, 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, 57, 1, 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,
+ 48,164, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,160,165, 60, 10,192,162, 60, 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,
+ 57, 1,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,160,165, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,
+ 16,167, 60, 10, 48,164, 60, 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, 10,253, 57, 1,130, 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, 16,167, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,128,168, 60, 10,160,165, 60, 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,242,252, 57, 1, 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,128,168, 60, 10,
+199, 0, 0, 0, 1, 0, 0, 0,240,169, 60, 10, 16,167, 60, 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,218,252, 57, 1, 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,240,169, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 96,171, 60, 10,
+128,168, 60, 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,194,252, 57, 1, 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, 96,171, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240,169, 60, 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,170,252, 57, 1, 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,216, 0, 0, 0,208,172, 60, 10,165, 0, 0, 0,
+ 1, 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, 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,
+ 96, 0, 0, 0,216,173, 60, 10,200, 0, 0, 0, 1, 0, 0, 0,160,177, 60, 10,176,152, 60, 10,248, 15, 55, 10, 96,211, 87, 9,
+ 88, 68, 81, 10, 48,141, 84, 10, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0,131, 0, 0, 0, 15, 15, 44, 6,
+132, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,176, 60, 10,184,176, 60, 10,104,174, 60, 10,144,175, 60, 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,104,174, 60, 10,201, 0, 0, 0,
+ 1, 0, 0, 0,144,175, 60, 10, 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,128,197, 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, 43, 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, 44, 6, 26, 0, 44, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 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, 44, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+248, 0, 0, 0,144,175, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,104,174, 60, 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, 43, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0,
+ 18, 0, 0, 0,105, 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, 44, 6,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 26, 0, 0, 0,131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 44, 6,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,188, 0, 0, 0,184,176, 60, 10,176, 0, 0, 0, 1, 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, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,
+160,177, 60, 10,200, 0, 0, 0, 1, 0, 0, 0,128,182, 60, 10,216,173, 60, 10,240,203, 80, 9, 8, 40, 82, 9,192, 37, 85, 10,
+208,171, 79, 9, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0,221, 1, 0, 0, 99, 3, 0, 0, 3, 3, 74, 1,135, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,180, 60, 10,128,180, 60, 10, 48,178, 60, 10, 88,179, 60, 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,178, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,
+ 88,179, 60, 10, 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,165, 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, 73, 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, 74, 1,
+ 26, 0, 74, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0, 74, 3, 0, 0,
+ 99, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
+ 88,179, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 48,178, 60, 10, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,128,156, 67, 0,128,173,195, 0, 0, 0, 0, 57, 1, 0, 0, 74, 1, 0, 0, 18, 0, 0, 0,
+108, 1, 0, 0, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 56, 1, 0, 0, 18, 0, 0, 0,
+108, 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, 6, 0, 0,
+ 2, 0, 3, 3, 0, 0, 0, 4, 6, 0, 74, 1,109, 1, 57, 1, 91, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 45, 6, 0, 0,118, 7, 0, 0,221, 1, 0, 0, 73, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 74, 1,109, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,252, 0, 0, 0,128,180, 60, 10,169, 0, 0, 0, 1, 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,152, 41, 82, 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, 1, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0,152, 41, 82, 9,
+224, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0,168,181, 60, 10, 68, 65, 84, 65,168, 0, 0, 0,168,181, 60, 10,
+223, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 16,228, 90, 10, 19, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10,
+ 20, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 21, 0, 1, 0, 1, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,
+224,243, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,152,250, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,240, 74, 92, 10, 0, 0, 0, 0,
+ 1, 0, 1, 0, 40, 4, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0,224,168, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0, 96,255, 90, 10,
+ 0, 0, 0, 0, 1, 0, 1, 0,112,240, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,208,245, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,
+216,239, 90, 10, 21, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 68, 65, 84, 65, 96, 0, 0, 0,128,182, 60, 10,200, 0, 0, 0,
+ 1, 0, 0, 0,120,193, 60, 10,160,177, 60, 10,160,154, 61, 10,224, 27, 77, 10,240,152, 88, 9, 88, 68, 81, 10, 0, 0, 0, 0,
+161, 2, 0, 0, 43, 6, 0, 0,133, 0, 0, 0, 69, 4, 0, 0, 1, 1,139, 3,193, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 80,192, 60, 10, 80,192, 60, 10, 16,183, 60, 10,176,187, 60, 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,183, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 56,184, 60, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,117, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 98, 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,138, 3, 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,139, 3, 26, 0,139, 3, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0, 43, 6, 0, 0,133, 0, 0, 0,158, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 56,184, 60, 10,201, 0, 0, 0,
+ 1, 0, 0, 0, 96,185, 60, 10, 16,183, 60, 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,161, 2, 0, 0,161, 2, 0, 0,
+159, 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,167, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+248, 0, 0, 0, 96,185, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,136,186, 60, 10, 56,184, 60, 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,161, 2, 0, 0, 43, 6, 0, 0,159, 0, 0, 0,159, 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, 68, 65, 84, 65,248, 0, 0, 0,136,186, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,176,187, 60, 10,
+ 96,185, 60, 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, 43, 6, 0, 0, 43, 6, 0, 0,159, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 60, 10,
+201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136,186, 60, 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,161, 2, 0, 0,
+ 43, 6, 0, 0,159, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139, 3,167, 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,216,188, 60, 10,
+ 68, 65, 84, 65, 72, 3, 0, 0,216,188, 60, 10,159, 0, 0, 0, 1, 0, 0, 0,107, 82,144, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 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,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, 89,180,236, 62,209,249,224,190, 48,180, 81,191,
+184,158, 81,191, 65,158,131, 63,142,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62, 38, 11,117,188,207,156,122, 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,211, 48,186, 62, 11, 16, 79, 63,144,199, 64,188,
+ 0, 0,135,180,163, 15,188,190,102, 75, 53, 62,223,125, 81, 63, 0, 0,104, 51,207,107,117,194, 81,204,216, 65, 40,156, 5,194,
+136,247,159,192,121, 62,114, 66,214,253,213,193, 94,225, 3, 66,236, 7,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, 89,180,236, 62,209,249,224,190, 48,180, 81,191,
+184,158, 81,191, 65,158,131, 63,142,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62, 38, 11,117,188,207,156,122, 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,181, 12, 64, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 99,181, 12, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99,181, 12, 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, 14, 43, 0, 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, 30, 33, 12, 66, 85,152,137, 66,116, 27,126, 66, 0, 0, 0, 0, 68, 65, 84, 65,
+248, 0, 0, 0, 80,192, 60, 10,160, 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, 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,208,245, 90, 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, 3, 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, 96, 0, 0, 0,120,193, 60, 10,200, 0, 0, 0, 1, 0, 0, 0,240,199, 60, 10,
+128,182, 60, 10, 96,211, 87, 9,104,177, 80, 9,104, 32, 59, 10,160,154, 61, 10, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,
+133, 0, 0, 0,139, 1, 0, 0, 2, 2,160, 2, 7, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,198, 60, 10,
+168,198, 60, 10, 8,194, 60, 10,128,197, 60, 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,194, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 48,195, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,100, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 40, 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, 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,160, 2, 26, 0,160, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,133, 0, 0, 0,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,160, 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, 68, 65, 84, 65,248, 0, 0, 0, 48,195, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 88,196, 60, 10,
+ 8,194, 60, 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, 91,195,
+ 0, 0, 0, 0,200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0,236, 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,236, 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,237, 0,200, 0,
+219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0,159, 0, 0, 0,139, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0,237, 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, 68, 65, 84, 65,248, 0, 0, 0, 88,196, 60, 10,
+201, 0, 0, 0, 1, 0, 0, 0,128,197, 60, 10, 48,195, 60, 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,159, 2, 0, 0,
+159, 2, 0, 0,159, 0, 0, 0,139, 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,
+ 68, 65, 84, 65,248, 0, 0, 0,128,197, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88,196, 60, 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,236, 0, 0, 0, 18, 0, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,
+198, 1, 0, 0, 18, 0, 0, 0,236, 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,199, 1,237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0,159, 2, 0, 0,159, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,199, 1,237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,208, 0, 0, 0,168,198, 60, 10,164, 0, 0, 0, 1, 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,168,199, 60, 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,168,199, 60, 10, 23, 1, 0, 0,
+ 1, 0, 0, 0, 16,228, 90, 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,
+ 96, 0, 0, 0,240,199, 60, 10,200, 0, 0, 0, 1, 0, 0, 0, 0,205, 60, 10,120,193, 60, 10,104,177, 80, 9, 16,228, 79, 9,
+224, 27, 77, 10,104, 32, 59, 10, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,141, 1, 0, 0, 69, 4, 0, 0, 12, 12,160, 2,
+185, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,203, 60, 10,248,203, 60, 10,128,200, 60, 10,208,202, 60, 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,200, 60, 10,201, 0, 0, 0,
+ 1, 0, 0, 0,168,201, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,106, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
+ 0, 0, 40, 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, 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,160, 2, 26, 0,160, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,
+141, 1, 0, 0,166, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 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, 68, 65, 84, 65,
+248, 0, 0, 0,168,201, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,208,202, 60, 10,128,200, 60, 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, 64, 35,196, 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,158, 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, 4, 0, 0, 2, 0, 3, 3, 0, 0, 2, 4, 6, 0,200, 0,159, 2,200, 0,141, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0,167, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,200, 0,159, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,208,202, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+168,201, 60, 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, 64, 35,196,
+ 0, 0, 0, 0,199, 1, 0, 0,216, 1, 0, 0, 18, 0, 0, 0,158, 2, 0, 0, 0, 0, 0, 0,198, 1, 0, 0, 0, 0, 0, 0,
+ 17, 0, 0, 0, 0, 0, 0, 0,198, 1, 0, 0, 18, 0, 0, 0,158, 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,216, 1,159, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 0, 0, 0,159, 2, 0, 0,167, 1, 0, 0, 69, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 1,159, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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,248,203, 60, 10,
+ 24, 1, 0, 0, 1, 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,
+ 16,228, 90, 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, 96, 0, 0, 0, 0,205, 60, 10,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240,199, 60, 10, 8, 40, 82, 9,
+240,152, 88, 9,184, 29, 79, 9,192, 37, 85, 10, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0,101, 3, 0, 0, 69, 4, 0, 0,
+ 1, 1, 74, 1,225, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,211, 60, 10, 88,211, 60, 10,144,205, 60, 10,
+184,206, 60, 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,144,205, 60, 10,
+201, 0, 0, 0, 1, 0, 0, 0,184,206, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0,165, 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, 73, 1, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0,
+ 0,128,164, 67, 0, 0,200, 65, 0,128,164, 67, 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, 74, 1, 24, 0, 74, 1, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,
+118, 7, 0, 0,101, 3, 0, 0,101, 3, 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, 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,
+ 68, 65, 84, 65,248, 0, 0, 0,184,206, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,144,205, 60, 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, 45, 6, 0, 0,118, 7, 0, 0,101, 3, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 74, 1,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,224,207, 60, 10, 68, 65, 84, 65, 72, 3, 0, 0,224,207, 60, 10,159, 0, 0, 0, 1, 0, 0, 0,
+ 24,255, 13, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 66, 80, 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,
+ 3,201,194, 63, 34, 49,132,191,244,250, 39,191, 8,165, 39,191,143,164,206, 63,124, 38,130, 63,180,164, 28, 63,149, 84, 28, 63,
+179,153,196,188, 42,119, 58, 64, 8,108,228,190, 50,247,227,190, 82, 21, 64,191,204,230,156,191,216, 49, 49, 65,152, 9, 52, 65,
+231, 70,158, 62, 23,234,167, 62,128,206,159,187, 0, 0,168,180, 59,189,199,189,147,167,196, 61,206,223,140, 62, 0, 0,248, 51,
+211,120, 21,194,145, 5, 2, 66, 10,136,213,193,193,214,159,192,219, 38, 19, 66,197,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,
+ 3,201,194, 63, 34, 49,132,191,244,250, 39,191, 8,165, 39,191,143,164,206, 63,124, 38,130, 63,180,164, 28, 63,149, 84, 28, 63,
+179,153,196,188, 42,119, 58, 64, 8,108,228,190, 50,247,227,190, 82, 21, 64,191,204,230,156,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, 3, 35,171,190, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+202, 4, 51, 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, 88,211, 60, 10,160, 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, 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,208,245, 90, 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, 3, 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, 83, 78, 0, 0,140, 0, 0, 0,224,212, 60, 10,
+196, 0, 0, 0, 1, 0, 0, 0, 24, 81, 88, 10, 88,159, 78, 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,152,213, 60, 10,
+216,216, 60, 10, 24,217, 60, 10, 0,223, 60, 10, 72,223, 60, 10,200, 43, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 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,152,213, 60, 10,
+197, 0, 0, 0, 1, 0, 0, 0,216,213, 60, 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,216,213, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 24,214, 60, 10,152,213, 60, 10, 0, 0, 0, 0, 0, 0, 97, 4,
+ 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 24,214, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 88,214, 60, 10,216,213, 60, 10,
+ 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 88,214, 60, 10,197, 0, 0, 0, 1, 0, 0, 0,
+152,214, 60, 10, 24,214, 60, 10, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,152,214, 60, 10,
+197, 0, 0, 0, 1, 0, 0, 0,216,214, 60, 10, 88,214, 60, 10, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0,216,214, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 24,215, 60, 10,152,214, 60, 10, 0, 0, 0, 0,118, 7, 70, 4,
+ 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 24,215, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 88,215, 60, 10,216,214, 60, 10,
+ 0, 0, 0, 0, 24, 6,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 88,215, 60, 10,197, 0, 0, 0, 1, 0, 0, 0,
+152,215, 60, 10, 24,215, 60, 10, 0, 0, 0, 0,118, 7,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,152,215, 60, 10,
+197, 0, 0, 0, 1, 0, 0, 0,216,215, 60, 10, 88,215, 60, 10, 0, 0, 0, 0, 24, 6, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0,216,215, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 24,216, 60, 10,152,215, 60, 10, 0, 0, 0, 0, 0, 0,172, 1,
+ 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 24,216, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 88,216, 60, 10,216,215, 60, 10,
+ 0, 0, 0, 0, 24, 6,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 88,216, 60, 10,197, 0, 0, 0, 1, 0, 0, 0,
+152,216, 60, 10, 24,216, 60, 10, 0, 0, 0, 0, 0, 3,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,152,216, 60, 10,
+197, 0, 0, 0, 1, 0, 0, 0,216,216, 60, 10, 88,216, 60, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0,216,216, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,152,216, 60, 10, 0, 0, 0, 0, 24, 6, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 24,217, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 96,217, 60, 10, 0, 0, 0, 0,
+216,213, 60, 10, 24,214, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 96,217, 60, 10,198, 0, 0, 0,
+ 1, 0, 0, 0,168,217, 60, 10, 24,217, 60, 10,216,213, 60, 10,152,214, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0,168,217, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,240,217, 60, 10, 96,217, 60, 10, 24,214, 60, 10,216,214, 60, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,240,217, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 56,218, 60, 10,
+168,217, 60, 10,152,214, 60, 10,216,214, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 56,218, 60, 10,
+198, 0, 0, 0, 1, 0, 0, 0,128,218, 60, 10,240,217, 60, 10, 88,214, 60, 10, 88,215, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0,128,218, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,200,218, 60, 10, 56,218, 60, 10, 24,215, 60, 10,
+ 88,215, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,200,218, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,
+ 16,219, 60, 10,128,218, 60, 10,216,214, 60, 10,152,215, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+ 16,219, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 88,219, 60, 10,200,218, 60, 10,152,214, 60, 10,152,215, 60, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 88,219, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,160,219, 60, 10, 16,219, 60, 10,
+ 24,215, 60, 10,152,215, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,160,219, 60, 10,198, 0, 0, 0,
+ 1, 0, 0, 0,232,219, 60, 10, 88,219, 60, 10,216,214, 60, 10, 88,215, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0,232,219, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 48,220, 60, 10,160,219, 60, 10,152,214, 60, 10,216,215, 60, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 48,220, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,120,220, 60, 10,
+232,219, 60, 10,152,215, 60, 10, 24,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,120,220, 60, 10,
+198, 0, 0, 0, 1, 0, 0, 0,192,220, 60, 10, 48,220, 60, 10,216,215, 60, 10, 24,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0,192,220, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 8,221, 60, 10,120,220, 60, 10,216,215, 60, 10,
+ 88,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 8,221, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,
+ 80,221, 60, 10,192,220, 60, 10, 24,216, 60, 10, 88,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+ 80,221, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,152,221, 60, 10, 8,221, 60, 10,152,213, 60, 10,152,216, 60, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,152,221, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,224,221, 60, 10, 80,221, 60, 10,
+152,216, 60, 10,216,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,224,221, 60, 10,198, 0, 0, 0,
+ 1, 0, 0, 0, 40,222, 60, 10,152,221, 60, 10, 88,214, 60, 10,216,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0, 40,222, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,112,222, 60, 10,224,221, 60, 10, 24,215, 60, 10,216,216, 60, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112,222, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,184,222, 60, 10,
+ 40,222, 60, 10, 88,216, 60, 10,152,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,184,222, 60, 10,
+198, 0, 0, 0, 1, 0, 0, 0, 0,223, 60, 10,112,222, 60, 10, 24,216, 60, 10,216,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0, 0,223, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,184,222, 60, 10,152,213, 60, 10,
+216,215, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 72,223, 60, 10,200, 0, 0, 0, 1, 0, 0, 0,
+ 40,226, 60, 10, 0, 0, 0, 0,152,214, 60, 10,216,213, 60, 10, 24,214, 60, 10,216,214, 60, 10, 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, 0, 0, 0, 0,
+240, 8, 61, 10,240, 8, 61, 10,216,223, 60, 10, 0,225, 60, 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,223, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0,225, 60, 10, 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,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, 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, 68, 65, 84, 65,248, 0, 0, 0, 0,225, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,216,223, 60, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,226, 60, 10,200, 0, 0, 0, 1, 0, 0, 0,240,229, 60, 10, 72,223, 60, 10,216,216, 60, 10, 24,215, 60, 10, 88,215, 60, 10,
+ 88,214, 60, 10, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 15, 15, 94, 1,100, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8,229, 60, 10, 8,229, 60, 10,184,226, 60, 10,224,227, 60, 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,226, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,
+224,227, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,110, 68, 0, 0, 0, 0, 0, 0,208, 65, 0,128,161, 67, 0, 64, 40, 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, 93, 1, 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, 94, 1,
+ 26, 0, 94, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 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, 94, 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, 68, 65, 84, 65,248, 0, 0, 0,
+224,227, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,184,226, 60, 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, 93, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 18, 0, 0, 0,
+ 73, 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, 94, 1, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 25, 6, 0, 0,118, 7, 0, 0, 26, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 94, 1, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,188, 0, 0, 0, 8,229, 60, 10,176, 0, 0, 0, 1, 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, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,240,229, 60, 10,
+200, 0, 0, 0, 1, 0, 0, 0, 24,251, 60, 10, 40,226, 60, 10, 24,215, 60, 10,152,215, 60, 10,216,214, 60, 10, 88,215, 60, 10,
+ 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0,101, 0, 0, 0, 69, 4, 0, 0, 4, 4, 94, 1,225, 3, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 16,250, 60, 10, 16,250, 60, 10,128,230, 60, 10,168,231, 60, 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,230, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,168,231, 60, 10,
+ 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,175, 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, 93, 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, 94, 1, 31, 0, 94, 1,
+ 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 39, 4, 0, 0, 69, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 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, 68, 65, 84, 65,248, 0, 0, 0,168,231, 60, 10,
+201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128,230, 60, 10, 0, 0, 0, 0, 0,128,174, 67, 0, 64,112,196, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,127,166, 67,254,127,112,196, 0, 0, 0, 0, 77, 1, 0, 0, 94, 1, 0, 0, 0, 0, 0, 0,193, 3, 0, 0,
+ 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0,193, 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, 94, 1,194, 3, 77, 1,194, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,
+118, 7, 0, 0,101, 0, 0, 0, 38, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1,194, 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,208,232, 60, 10,160,248, 60, 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,208,232, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 64,234, 60, 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, 76, 1, 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, 64,234, 60, 10,
+199, 0, 0, 0, 1, 0, 0, 0,176,235, 60, 10,208,232, 60, 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, 76, 1, 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,176,235, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 32,237, 60, 10,
+ 64,234, 60, 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, 76, 1, 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, 32,237, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,144,238, 60, 10,176,235, 60, 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, 76, 1,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,144,238, 60, 10,199, 0, 0, 0,
+ 1, 0, 0, 0, 0,240, 60, 10, 32,237, 60, 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, 76, 1, 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, 0,240, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,112,241, 60, 10,144,238, 60, 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, 76, 1, 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,
+112,241, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,224,242, 60, 10, 0,240, 60, 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,
+ 76, 1,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,224,242, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,
+ 80,244, 60, 10,112,241, 60, 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, 10,253, 76, 1,130, 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, 80,244, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,192,245, 60, 10,224,242, 60, 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,242,252, 76, 1, 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,192,245, 60, 10,
+199, 0, 0, 0, 1, 0, 0, 0, 48,247, 60, 10, 80,244, 60, 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,218,252, 76, 1, 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, 48,247, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,160,248, 60, 10,
+192,245, 60, 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,194,252, 76, 1, 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,160,248, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 48,247, 60, 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,170,252, 76, 1, 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,216, 0, 0, 0, 16,250, 60, 10,165, 0, 0, 0,
+ 1, 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, 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,
+ 96, 0, 0, 0, 24,251, 60, 10,200, 0, 0, 0, 1, 0, 0, 0, 16, 6, 61, 10,240,229, 60, 10,152,216, 60, 10, 88,216, 60, 10,
+ 24,216, 60, 10,216,216, 60, 10, 0, 0, 0, 0, 1, 3, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0,171, 1, 0, 0, 1, 1, 23, 3,
+172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 4, 61, 10,232, 4, 61, 10,168,251, 60, 10, 72, 0, 61, 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,251, 60, 10,201, 0, 0, 0,
+ 1, 0, 0, 0,208,252, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
+ 0,192, 69, 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, 22, 3, 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, 23, 3, 26, 0, 23, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 23, 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, 23, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+248, 0, 0, 0,208,252, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,248,253, 60, 10,168,251, 60, 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, 1, 3, 0, 0, 1, 3, 0, 0, 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0,146, 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, 68, 65, 84, 65,248, 0, 0, 0,248,253, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 32,255, 60, 10,
+208,252, 60, 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, 1, 3, 0, 0, 23, 6, 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, 68, 65, 84, 65,248, 0, 0, 0, 32,255, 60, 10,
+201, 0, 0, 0, 1, 0, 0, 0, 72, 0, 61, 10,248,253, 60, 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, 23, 6, 0, 0,
+ 23, 6, 0, 0, 26, 0, 0, 0,171, 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,
+ 68, 65, 84, 65,248, 0, 0, 0, 72, 0, 61, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 32,255, 60, 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, 1, 3, 0, 0, 23, 6, 0, 0, 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 23, 3,146, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 61, 10, 68, 65, 84, 65, 72, 3, 0, 0,112, 1, 61, 10,159, 0, 0, 0, 1, 0, 0, 0,
+ 36,101,230, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118,171, 98, 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,
+ 3, 6,158, 63, 92,224,143,191,244,250, 39,191, 8,165, 39,191,170,164,167, 63,132,167,141, 63,180,164, 28, 63,149, 84, 28, 63,
+ 0,127,159,188,126,242, 74, 64, 8,108,228,190, 50,247,227,190,221,212, 27,191, 39,197,170,191,216, 49, 49, 65,152, 9, 52, 65,
+ 25, 25,195, 62, 12,250,206, 62, 0,247,196,187, 0, 0,150,180,203,132,183,189, 61,175,180, 61,245,110,129, 62, 0, 0,120, 51,
+211,120, 21,194,144, 5, 2, 66, 9,136,213,193,193,214,159,192,219, 38, 19, 66,196,173,255,193,157,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,
+ 3, 6,158, 63, 92,224,143,191,244,250, 39,191, 8,165, 39,191,170,164,167, 63,132,167,141, 63,180,164, 28, 63,149, 84, 28, 63,
+ 0,127,159,188,126,242, 74, 64, 8,108,228,190, 50,247,227,190,221,212, 27,191, 39,197,170,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, 3, 35,171,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+162, 30,184, 58, 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,232, 4, 61, 10,160, 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, 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,208,245, 90, 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, 3, 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, 96, 0, 0, 0, 16, 6, 61, 10,
+200, 0, 0, 0, 1, 0, 0, 0,200, 43, 88, 10, 24,251, 60, 10,216,215, 60, 10,152,214, 60, 10,152,215, 60, 10, 24,216, 60, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0,173, 1, 0, 0, 69, 4, 0, 0, 16, 16, 24, 6,153, 2, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,168, 42, 88, 10,168, 42, 88, 10,160, 6, 61, 10,200, 7, 61, 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, 6, 61, 10,201, 0, 0, 0, 1, 0, 0, 0,200, 7, 61, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 41, 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, 23, 6, 0, 0,173, 1, 0, 0,198, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,200, 7, 61, 10,
+201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,160, 6, 61, 10, 0, 0, 32,193, 0, 0, 0, 68, 0, 0, 32,193, 0, 0, 0, 68,
+128,195,217,195,192,225,108, 68,240,130,178,193, 24,148, 5, 68, 7, 6, 0, 0, 24, 6, 0, 0, 18, 0, 0, 0,126, 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,126, 2, 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, 24, 6,127, 2, 7, 6,109, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 23, 6, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6,127, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,168, 42, 88, 10,177, 0, 0, 0, 1, 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, 16,228, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,123,246, 98, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,200, 43, 88, 10,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 16, 6, 61, 10,152,213, 60, 10,216,215, 60, 10, 88,216, 60, 10,152,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,255, 2, 0, 0,
+ 0, 0, 0, 0,171, 1, 0, 0, 6, 6, 0, 3,172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 47, 88, 10,
+208, 47, 88, 10, 88, 44, 88, 10,168, 46, 88, 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, 88, 44, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,128, 45, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 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,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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,128, 45, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,168, 46, 88, 10,
+ 88, 44, 88, 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, 26, 0, 0, 0,171, 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, 68, 65, 84, 65,248, 0, 0, 0,168, 46, 88, 10,
+201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 45, 88, 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,146,190, 0,128,164, 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,146, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 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,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,146, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 33, 0, 0,208, 47, 88, 10,170, 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,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, 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,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, 83, 78, 0, 0,140, 0, 0, 0, 24, 81, 88, 10,196, 0, 0, 0, 1, 0, 0, 0,
+168, 85, 89, 10,224,212, 60, 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,208, 81, 88, 10,144, 84, 88, 10,208, 84, 88, 10,
+152, 89, 88, 10,224, 89, 88, 10, 24, 35, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 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,248, 74, 84, 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,208, 81, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,
+ 16, 82, 88, 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, 16, 82, 88, 10,
+197, 0, 0, 0, 1, 0, 0, 0, 80, 82, 88, 10,208, 81, 88, 10, 0, 0, 0, 0, 0, 0,226, 3, 0, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0, 80, 82, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,144, 82, 88, 10, 16, 82, 88, 10, 0, 0, 0, 0,246, 4,226, 3,
+ 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,144, 82, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,208, 82, 88, 10, 80, 82, 88, 10,
+ 0, 0, 0, 0,246, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,208, 82, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,
+ 16, 83, 88, 10,144, 82, 88, 10, 0, 0, 0, 0, 0, 0,199, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 16, 83, 88, 10,
+197, 0, 0, 0, 1, 0, 0, 0, 80, 83, 88, 10,208, 82, 88, 10, 0, 0, 0, 0,246, 4,199, 3, 0, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0, 80, 83, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,144, 83, 88, 10, 16, 83, 88, 10, 0, 0, 0, 0, 20, 4, 0, 0,
+ 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,144, 83, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,208, 83, 88, 10, 80, 83, 88, 10,
+ 0, 0, 0, 0, 20, 4,199, 3, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,208, 83, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,
+ 16, 84, 88, 10,144, 83, 88, 10, 0, 0, 0, 0, 20, 4, 24, 3, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 16, 84, 88, 10,
+197, 0, 0, 0, 1, 0, 0, 0, 80, 84, 88, 10,208, 83, 88, 10, 0, 0, 0, 0,246, 4, 24, 3, 0, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0, 80, 84, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,144, 84, 88, 10, 16, 84, 88, 10, 0, 0, 0, 0, 0, 0, 92, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,144, 84, 88, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 80, 84, 88, 10,
+ 0, 0, 0, 0, 20, 4, 92, 0, 1, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,208, 84, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,
+ 24, 85, 88, 10, 0, 0, 0, 0, 16, 82, 88, 10, 80, 82, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+ 24, 85, 88, 10,198, 0, 0, 0, 1, 0, 0, 0, 96, 85, 88, 10,208, 84, 88, 10, 16, 82, 88, 10,208, 82, 88, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 96, 85, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,168, 85, 88, 10, 24, 85, 88, 10,
+ 80, 82, 88, 10, 16, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,168, 85, 88, 10,198, 0, 0, 0,
+ 1, 0, 0, 0,240, 85, 88, 10, 96, 85, 88, 10,208, 82, 88, 10, 16, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0,240, 85, 88, 10,198, 0, 0, 0, 1, 0, 0, 0, 56, 86, 88, 10,168, 85, 88, 10,208, 81, 88, 10, 80, 83, 88, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 56, 86, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,128, 86, 88, 10,
+240, 85, 88, 10,144, 82, 88, 10, 80, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,128, 86, 88, 10,
+198, 0, 0, 0, 1, 0, 0, 0,200, 86, 88, 10, 56, 86, 88, 10,208, 82, 88, 10,144, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0,200, 86, 88, 10,198, 0, 0, 0, 1, 0, 0, 0, 16, 87, 88, 10,128, 86, 88, 10, 16, 83, 88, 10,
+144, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 16, 87, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,
+ 88, 87, 88, 10,200, 86, 88, 10, 80, 83, 88, 10,208, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+ 88, 87, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,160, 87, 88, 10, 16, 87, 88, 10,144, 83, 88, 10,208, 83, 88, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,160, 87, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,232, 87, 88, 10, 88, 87, 88, 10,
+ 16, 83, 88, 10, 16, 84, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,232, 87, 88, 10,198, 0, 0, 0,
+ 1, 0, 0, 0, 48, 88, 88, 10,160, 87, 88, 10,144, 82, 88, 10, 16, 84, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0, 48, 88, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,120, 88, 88, 10,232, 87, 88, 10,208, 83, 88, 10, 16, 84, 88, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,120, 88, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,192, 88, 88, 10,
+ 48, 88, 88, 10,208, 81, 88, 10, 80, 84, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,192, 88, 88, 10,
+198, 0, 0, 0, 1, 0, 0, 0, 8, 89, 88, 10,120, 88, 88, 10,208, 82, 88, 10, 80, 84, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0, 8, 89, 88, 10,198, 0, 0, 0, 1, 0, 0, 0, 80, 89, 88, 10,192, 88, 88, 10,144, 83, 88, 10,
+144, 84, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 80, 89, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,
+152, 89, 88, 10, 8, 89, 88, 10, 80, 83, 88, 10,144, 84, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+152, 89, 88, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 80, 89, 88, 10, 80, 84, 88, 10,144, 84, 88, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,224, 89, 88, 10,200, 0, 0, 0, 1, 0, 0, 0,192, 92, 88, 10, 0, 0, 0, 0,
+208, 82, 88, 10, 16, 82, 88, 10, 80, 82, 88, 10, 16, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,246, 4, 0, 0,200, 3, 0, 0,
+226, 3, 0, 0, 7, 7,247, 4, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 8, 0,160,135, 60, 9, 72, 85, 89, 10, 72, 85, 89, 10,
+112, 90, 88, 10,152, 91, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 32, 57, 88, 9,208, 57, 88, 9, 68, 65, 84, 65,248, 0, 0, 0,
+112, 90, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,152, 91, 88, 10, 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,158, 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,246, 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,247, 4, 26, 0,247, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,246, 4, 0, 0,200, 3, 0, 0,225, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+247, 4, 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,
+224,136, 60, 9, 16,134, 80, 10, 16,134, 80, 10, 0, 0, 0, 0, 0, 0, 0, 0,112, 58, 88, 9,216, 59, 88, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,152, 91, 88, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,112, 90, 88, 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,226, 3, 0, 0,226, 3, 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, 88,136, 60, 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, 68, 65, 84, 65, 96, 0, 0, 0,192, 92, 88, 10,200, 0, 0, 0,
+ 1, 0, 0, 0, 32,149, 88, 10,224, 89, 88, 10, 80, 83, 88, 10,208, 83, 88, 10, 16, 84, 88, 10,144, 82, 88, 10, 0, 0, 0, 0,
+ 21, 4, 0, 0,246, 4, 0, 0, 0, 0, 0, 0, 23, 3, 0, 0, 4, 4,226, 0, 24, 3, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0,
+184,132, 60, 9, 16,143, 88, 10,184,148, 88, 10, 80, 93, 88, 10,120, 94, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,200, 97, 81, 10,
+ 8,197, 65, 10, 68, 65, 84, 65,248, 0, 0, 0, 80, 93, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,120, 94, 88, 10, 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, 98, 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,225, 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,226, 0, 31, 0,226, 0, 31, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0,246, 4, 0, 0,249, 2, 0, 0, 23, 3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 0, 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, 24,135, 60, 9, 8, 84, 78, 9, 8, 84, 78, 9, 0, 0, 0, 0, 0, 0, 0, 0,
+200,244, 80, 10, 48,246, 80, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,120, 94, 88, 10,201, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 80, 93, 88, 10, 0, 0, 0, 0, 0, 0, 98, 67, 0,128, 86,196, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 81, 67, 0, 64, 62,196, 0, 0, 0, 0,209, 0, 0, 0,226, 0, 0, 0, 0, 0, 0, 0,248, 2, 0, 0, 0, 0, 0, 0,
+ 74, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,208, 0, 0, 0, 0, 0, 0, 0,248, 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,226, 0,249, 2,209, 0,249, 2, 0, 0,216, 14, 82, 9, 11, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0,246, 4, 0, 0,
+ 0, 0, 0, 0,248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 0,249, 2, 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,112,133, 60, 9,224,115, 84, 10,
+ 32, 15, 76, 10,160, 95, 88, 10, 8,150, 84, 10,240,246, 80, 10, 88,248, 80, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 64, 1, 0, 0,160, 95, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 16, 97, 88, 10, 0, 0, 0, 0,248,133, 60, 9, 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,209, 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, 16, 97, 88, 10,199, 0, 0, 0,
+ 1, 0, 0, 0,128, 98, 88, 10,160, 95, 88, 10,152,106,165, 9, 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,209, 0, 61, 0, 0, 0, 0, 0,
+ 0, 0, 2, 0, 0, 0, 0, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,240, 99, 88, 10, 16, 97, 88, 10,
+136,110,165, 9, 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,209, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 64, 1, 0, 0,
+240, 99, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 96,101, 88, 10,128, 98, 88, 10,168,147,165, 9, 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,
+209, 0,203, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,
+208,102, 88, 10,240, 99, 88, 10, 32,137,165, 9, 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,209, 0, 58, 0, 20, 0, 0, 0, 0, 0, 2, 0,
+ 0, 0, 0, 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,
+ 68, 65, 84, 65, 64, 1, 0, 0,208,102, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 64,104, 88, 10, 96,101, 88, 10,112,141,165, 9,
+ 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,209, 0, 0, 0, 20, 0, 0, 0, 4, 0, 2, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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,104, 88, 10,
+199, 0, 0, 0, 1, 0, 0, 0,176,105, 88, 10,208,102, 88, 10,160,114,165, 9, 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,209, 0,102, 0,
+ 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 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, 68, 65, 84, 65, 64, 1, 0, 0,176,105, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 32,107, 88, 10,
+ 64,104, 88, 10,160,126,165, 9, 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, 10,253,209, 0,130, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
+ 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 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,107, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,144,108, 88, 10,176,105, 88, 10,144,118,165, 9, 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,242,252,209, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 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, 68, 65, 84, 65, 64, 1, 0, 0,144,108, 88, 10,199, 0, 0, 0,
+ 1, 0, 0, 0, 0,110, 88, 10, 32,107, 88, 10,176,122,165, 9, 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,218,252,209, 0, 0, 0, 0, 0, 0, 0,
+ 4, 0, 2, 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, 68, 65, 84, 65, 64, 1, 0, 0, 0,110, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,112,111, 88, 10,144,108, 88, 10,
+192,151,165, 9, 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,194,252,209, 0, 0, 0, 20, 0, 0, 0, 4, 0, 2, 0, 0, 0, 0, 0, 40, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,111, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,224,112, 88, 10, 0,110, 88, 10, 40,158,165, 9, 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,170,252,
+209, 0, 0, 0, 0, 0, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,112, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,
+ 80,114, 88, 10,112,111, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,111,110,116,101,
+120,116, 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, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,111,110,116,101,
+120,116, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41,255, 7, 1,179, 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, 5, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,114, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,192,115, 88, 10,224,112, 88, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,112,112,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, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,112,112,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, 77, 97,112,112,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,102,254, 7, 1,171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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,115, 88, 10,
+199, 0, 0, 0, 1, 0, 0, 0, 48,117, 88, 10, 80,114, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,105,110,102,108,117,101,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, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,105,110,102,108,117,101,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, 73,110,102,108,117,101,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, 0, 0, 42,253, 7, 1, 36, 1,
+ 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,117, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,160,118, 88, 10,
+192,115, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,
+111,112,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, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,
+111,112,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, 67,117,115,116,111,109, 32, 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, 18,253, 7, 1, 0, 0, 0, 0, 0, 0, 4, 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, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 64, 1, 0, 0,160,118, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 16,120, 88, 10, 48,117, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,114,101,118,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,
+ 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,114,101,118,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,
+ 80,114,101,118,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, 87,254, 7, 1,186, 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, 68, 65, 84, 65, 64, 1, 0, 0, 16,120, 88, 10,199, 0, 0, 0,
+ 1, 0, 0, 0,128,121, 88, 10,160,118, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,253, 7, 1, 36, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,121, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,240,122, 88, 10, 16,120, 88, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,115, 97,109,112,108,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, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,115, 97,109,112,108,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, 73,109, 97,103,101, 32, 83, 97,109,112,108,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, 84,252, 7, 1,212, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,122, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 96,124, 88, 10,128,121, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84,
+ 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,109, 97,112,112,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, 84, 69, 88, 84,
+ 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,109, 97,112,112,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, 73,109, 97,103,
+101, 32, 77, 97,112,112,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,251,
+ 7, 1, 0, 0, 0, 0, 0, 0, 4, 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, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 96,124, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,
+208,125, 88, 10,240,122, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,111,108,111,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, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,111,108,111,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, 67,111,108,111,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, 63,254, 7, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,125, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 64,127, 88, 10, 96,124, 88, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,108,111,117,100,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, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,108,111,117,100,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, 67,108,111,117,100,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,161,253, 7, 1,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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,127, 88, 10,
+199, 0, 0, 0, 1, 0, 0, 0,176,128, 88, 10,208,125, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,119,111,111,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, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,119,111,111,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, 87,111,111,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,139,253, 7, 1,180, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 32,130, 88, 10,
+ 64,127, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,108,117,103,105,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, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,108,117,103,105,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, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,108,117,103,105,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,254, 7, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 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,130, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,144,131, 88, 10,176,128, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,118,111,114,111,110,111,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 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, 88, 84, 85, 82, 69, 95, 80, 84, 95,118,111,114,111,110,111,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 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,111,114,111,110,111,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,123,253, 7, 1,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,131, 88, 10,199, 0, 0, 0,
+ 1, 0, 0, 0, 0,133, 88, 10, 32,130, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,
+111,105,110,116,100,101,110,115,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, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,
+111,105,110,116,100,101,110,115,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, 80,111,105,110,116, 32, 68,101,110,115,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,140,253, 7, 1,179, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,133, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,112,134, 88, 10,144,131, 88, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 95,
+116,117,114, 98,117,108,101,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, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 95,
+116,117,114, 98,117,108,101,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, 84,117,114, 98,117,108,101,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, 0, 14,253, 7, 1,102, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,134, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,224,135, 88, 10, 0,133, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84,
+ 85, 82, 69, 95, 80, 84, 95,109,117,115,103,114, 97,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, 84, 69, 88, 84,
+ 85, 82, 69, 95, 80, 84, 95,109,117,115,103,114, 97,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, 77,117,115,103,
+114, 97,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,139,253,
+ 7, 1,180, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,135, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,
+ 80,137, 88, 10,112,134, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,114, 98,108,
+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, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,114, 98,108,
+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, 77, 97,114, 98,108,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,136,253, 7, 1,183, 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,
+ 68, 65, 84, 65, 64, 1, 0, 0, 80,137, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,192,138, 88, 10,224,135, 88, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 27,254, 7, 1, 36, 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, 68, 65, 84, 65, 64, 1, 0, 0,192,138, 88, 10,
+199, 0, 0, 0, 1, 0, 0, 0, 48,140, 88, 10, 80,137, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,100,105,115,116,111,114,116,101,100,110,111,105,115,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, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,100,105,115,116,111,114,116,101,100,110,111,105,115,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, 68,105,115,116,111,114,116,101,
+100, 32, 78,111,105,115,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,211,253, 7, 1,108, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,140, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,160,141, 88, 10,
+192,138, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 98,108,101,110,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, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 98,108,101,110,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, 66,108,101,110,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, 2,254, 7, 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,160,141, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,216,242, 87, 9, 48,140, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,115,116,117, 99, 99,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 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, 88, 84, 85, 82, 69, 95, 80, 84, 95,115,116,117, 99, 99,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 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,117, 99, 99,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,183,253, 7, 1,136, 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,216,242, 87, 9,199, 0, 0, 0,
+ 1, 0, 0, 0,128, 20, 85, 10,160,141, 88, 10,112,180,163, 9, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,109,111,100,105,
+102,105,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, 68, 65, 84, 65, 95, 80, 84, 95,109,111,100,105,
+102,105,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, 77,111,100,105,102,105,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,160,255,209, 0, 36, 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,128, 20, 85, 10,199, 0, 0, 0, 1, 0, 0, 0, 32,118, 88, 9,216,242, 87, 9,
+ 80,127,163, 9, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,109,101,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, 68, 65, 84, 65, 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,109,101,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, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,255,209, 0, 36, 0, 0, 0, 0, 0, 0, 0, 4, 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,
+ 32,118, 88, 9,199, 0, 0, 0, 1, 0, 0, 0,216,168, 85, 10,128, 20, 85, 10, 64,131,163, 9, 0, 0, 0, 0, 68, 65, 84, 65,
+ 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 95,109,101,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, 68, 65, 84, 65,
+ 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 95,109,101,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, 67,117,115,116,
+111,109, 32, 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,160,255,
+209, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 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,168, 85, 10,199, 0, 0, 0, 1, 0, 0, 0,
+ 56,155, 87, 9, 32,118, 88, 9, 48,135,163, 9, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,110,111,114,109, 97,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, 68, 65, 84, 65, 95, 80, 84, 95,110,111,114,109, 97,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, 78,111,114,109, 97,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, 0, 0, 0, 78,255,209, 0, 58, 0, 0, 0, 0, 0, 0, 0, 4, 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, 56,155, 87, 9,199, 0, 0, 0, 1, 0, 0, 0,232, 33, 81, 10,216,168, 85, 10, 32,139,163, 9,
+ 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,101,116,116,105,110,103,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, 68, 65, 84, 65, 95, 80, 84, 95,115,101,116,116,105,110,103,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,101,116,116,105,110,103,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, 18,255,209, 0, 36, 0, 0, 0, 0, 0, 0, 0, 4, 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,232, 33, 81, 10,
+199, 0, 0, 0, 1, 0, 0, 0,152,148, 84, 10, 56,155, 87, 9, 64,143,163, 9, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
+118,101,114,116,101,120, 95,103,114,111,117,112,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, 68, 65, 84, 65, 95, 80, 84, 95,
+118,101,114,116,101,120, 95,103,114,111,117,112,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, 86,101,114,116,101,120, 32, 71,
+114,111,117,112,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,174,254,209, 0, 76, 0,
+ 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5, 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,152,148, 84, 10,199, 0, 0, 0, 1, 0, 0, 0,232, 43, 84, 10,
+232, 33, 81, 10, 48,147,163, 9, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,104, 97,112,101, 95,107,101,121,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, 68, 65, 84, 65, 95, 80, 84, 95,115,104, 97,112,101, 95,107,101,121,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, 83,104, 97,112,101, 32, 75,101,121,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, 74,254,209, 0, 76, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0,
+ 6, 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,232, 43, 84, 10,199, 0, 0, 0, 1, 0, 0, 0, 8,150, 84, 10,152,148, 84, 10, 32,151,163, 9, 0, 0, 0, 0,
+ 68, 65, 84, 65, 95, 80, 84, 95,117,118, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 95, 80, 84, 95,117,118, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 85, 86, 32, 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,237,253,209, 0, 69, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 7, 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, 8,150, 84, 10,199, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,232, 43, 84, 10, 64,155,163, 9, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,118,101,114,116,
+101,120, 95, 99,111,108,111,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, 68, 65, 84, 65, 95, 80, 84, 95,118,101,114,116,
+101,120, 95, 99,111,108,111,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, 86,101,114,116,101,120, 32, 67,111,108,111,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,144,253,209, 0, 69, 0, 0, 0, 0, 0,
+ 0, 0, 4, 0, 0, 0, 0, 0, 8, 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,216, 0, 0, 0, 16,143, 88, 10,165, 0, 0, 0, 1, 0, 0, 0,184,148, 88, 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, 2, 0, 1, 0, 0, 0, 0, 0,
+ 96,139, 79, 9,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 24,144, 88, 10,201, 0, 0, 0,
+ 1, 0, 0, 0, 64,145, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
+ 0, 32,209, 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,136, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0,209, 68,
+ 0, 0,200, 65, 0, 0,209, 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,137, 6, 26, 0,137, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 6, 0, 0,
+149, 3, 0, 0,174, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,137, 6, 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, 68, 65, 84, 65,
+248, 0, 0, 0, 64,145, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,104,146, 88, 10, 24,144, 88, 10, 0, 0, 0, 0, 0, 0,112, 67,
+ 0, 64,101,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 67, 0, 64,101,196, 0, 0, 0, 0,223, 0, 0, 0,240, 0, 0, 0,
+ 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 0, 0, 0,
+ 0, 0, 0, 0,148, 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,240, 0,149, 3,223, 0,149, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,240, 0,149, 3, 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, 68, 65, 84, 65,248, 0, 0, 0,104,146, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,144,147, 88, 10,
+ 64,145, 88, 10, 0, 0, 0, 0, 0, 32,179, 68, 0, 0, 0, 0, 0, 0,112, 66, 0, 0, 0, 0, 0, 32,179, 68, 0, 0, 0, 0,
+ 0, 0,112, 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, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,152, 5, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0,179, 68, 0, 0,108, 66, 0, 0,179, 68,
+ 0, 0,108, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,153, 5, 60, 0,153, 5,
+ 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0,136, 6, 0, 0, 89, 3, 0, 0,148, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 5, 60, 0, 0, 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, 68, 65, 84, 65,248, 0, 0, 0,144,147, 88, 10,
+201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,104,146, 88, 10, 0, 0, 0, 0, 0,128,175, 68, 0, 0,137,195, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,177, 68, 0, 64, 86,196, 0, 0, 0, 0,136, 5, 0, 0,153, 5, 0, 0, 0, 0, 0, 0, 88, 3, 0, 0,
+ 0, 0, 0, 0,135, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,135, 5, 0, 0, 0, 0, 0, 0, 88, 3, 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, 2, 0, 3, 3,
+ 2, 0, 0, 4, 6, 0,153, 5, 89, 3,136, 5, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0,
+136, 6, 0, 0, 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 5, 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,
+ 68, 65, 84, 65, 60, 0, 0, 0,184,148, 88, 10,168, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 16,143, 88, 10, 24,144, 88, 10,
+144,147, 88, 10, 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, 5, 0,255,255,255,255, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 32,149, 88, 10,200, 0, 0, 0,
+ 1, 0, 0, 0,232,152, 88, 10,192, 92, 88, 10,208, 81, 88, 10, 80, 84, 88, 10,144, 84, 88, 10, 80, 83, 88, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 15, 15, 20, 4, 92, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 32,104, 60, 9, 0,152, 88, 10, 0,152, 88, 10,176,149, 88, 10,216,150, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,208,248, 80, 10,
+128,249, 80, 10, 68, 65, 84, 65,248, 0, 0, 0,176,149, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,216,150, 88, 10, 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,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,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, 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, 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, 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, 96,105, 60, 9, 16, 28, 82, 9, 16, 28, 82, 9, 0, 0, 0, 0, 0, 0, 0, 0,
+ 32,250, 80, 10,136,251, 80, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,216,150, 88, 10,201, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,176,149, 88, 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,
+ 19, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 19, 4, 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, 20, 4, 66, 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,
+ 26, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 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,216,104, 60, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,252, 80, 10, 40,254, 80, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+188, 0, 0, 0, 0,152, 88, 10,176, 0, 0, 0, 1, 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, 31, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,232,152, 88, 10,200, 0, 0, 0, 1, 0, 0, 0,
+ 24, 35, 89, 10, 32,149, 88, 10,208, 83, 88, 10,144, 83, 88, 10, 16, 83, 88, 10, 16, 84, 88, 10, 0, 0, 0, 0, 21, 4, 0, 0,
+246, 4, 0, 0, 25, 3, 0, 0,198, 3, 0, 0, 3, 3,226, 0,174, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0, 88,102, 60, 9,
+200,155, 88, 10,200,155, 88, 10,120,153, 88, 10,160,154, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,160,254, 80, 10, 80,255, 80, 10,
+ 68, 65, 84, 65,248, 0, 0, 0,120,153, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,160,154, 88, 10, 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, 98, 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,
+225, 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,226, 0, 26, 0,226, 0, 26, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0,246, 4, 0, 0,173, 3, 0, 0,198, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,226, 0, 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,152,103, 60, 9,232,161, 84, 10,232,161, 84, 10, 0, 0, 0, 0, 0, 0, 0, 0,240,255, 80, 10,
+ 88, 1, 81, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,160,154, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,120,153, 88, 10, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 67,
+ 0, 0, 2,195, 0, 0, 0, 0,209, 0, 0, 0,226, 0, 0, 0, 18, 0, 0, 0,147, 0, 0, 0, 0, 0, 0, 0,208, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,208, 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,226, 0,
+148, 0,209, 0,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0,246, 4, 0, 0, 25, 3, 0, 0,
+172, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 0,148, 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, 16,103, 60, 9, 96, 94, 84, 9, 96, 94, 84, 9,
+ 0, 0, 0, 0, 0, 0, 0, 0, 24, 2, 81, 10, 8, 3, 81, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,252, 0, 0, 0,
+200,155, 88, 10,169, 0, 0, 0, 1, 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,
+128, 11, 65, 10,128, 11, 65, 10, 0,142, 88, 9, 0,115,101, 32, 83, 99,117,108,112,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, 3, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0, 0,142, 88, 9,224, 0, 0, 0, 1, 0, 0, 0, 42, 11, 0, 0,
+ 42, 11, 0, 0,240,156, 88, 10, 68, 65, 84, 65,248,133, 0, 0,240,156, 88, 10,223, 0, 0, 0, 42, 11, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 16,228, 90, 10, 19, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 20, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10,
+ 21, 0, 1, 0, 1, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,224,243, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,
+152,250, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,240, 74, 92, 10, 0, 0, 0, 0, 1, 0, 1, 0, 40, 4, 91, 10, 0, 0, 0, 0,
+ 1, 0, 1, 0,224,168, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0, 96,255, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,112,240, 90, 10,
+ 0, 0, 0, 0, 1, 0, 1, 0,208,245, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,216,239, 90, 10, 21, 0, 0, 0, 1, 0, 1, 0,
+ 16,228, 90, 10, 30, 0,255,255, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 1, 0,
+ 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0, 16,228, 90, 10,
+ 31, 0, 4, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0,
+ 16,228, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 9, 0,
+ 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 10, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 11, 0, 1, 0, 0, 0, 16,228, 90, 10,
+ 31, 0, 12, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 14, 0, 1, 0, 0, 0,
+ 16,228, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 17, 0,
+ 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 18, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 19, 0, 1, 0, 0, 0, 16,228, 90, 10,
+ 31, 0, 20, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 21, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 22, 0, 1, 0, 0, 0,
+ 16,228, 90, 10, 31, 0, 23, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 24, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 25, 0,
+ 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 26, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 27, 0, 1, 0, 0, 0, 16,228, 90, 10,
+ 31, 0, 28, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 29, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 30, 0, 1, 0, 0, 0,
+ 16,228, 90, 10, 31, 0, 31, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 32, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 33, 0,
+ 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 34, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 35, 0, 1, 0, 0, 0, 16,228, 90, 10,
+ 31, 0, 36, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 37, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 38, 0, 1, 0, 0, 0,
+ 16,228, 90, 10, 31, 0, 39, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 40, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 41, 0,
+ 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 42, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 43, 0, 1, 0, 0, 0, 16,228, 90, 10,
+ 31, 0, 44, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 45, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 46, 0, 1, 0, 0, 0,
+ 16,228, 90, 10, 31, 0, 47, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 48, 0, 1, 0, 0, 0, 16,228, 90, 10, 30, 0,255,255,
+ 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0, 16,228, 90, 10,
+ 31, 0, 2, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0,
+ 16,228, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 7, 0,
+ 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0, 16,228, 90, 10,
+ 31, 0, 10, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 11, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 12, 0, 1, 0, 0, 0,
+ 16,228, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 14, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 15, 0,
+ 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 17, 0, 1, 0, 0, 0, 16,228, 90, 10,
+ 31, 0, 18, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 19, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 20, 0, 1, 0, 0, 0,
+ 16,228, 90, 10, 31, 0, 21, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 22, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 23, 0,
+ 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 24, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 25, 0, 1, 0, 0, 0, 16,228, 90, 10,
+ 31, 0, 26, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 27, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 28, 0, 1, 0, 0, 0,
+ 16,228, 90, 10, 31, 0, 29, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 30, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 31, 0,
+ 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 32, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 33, 0, 1, 0, 0, 0, 16,228, 90, 10,
+ 31, 0, 34, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 35, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 36, 0, 1, 0, 0, 0,
+ 16,228, 90, 10, 31, 0, 37, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 38, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 39, 0,
+ 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 40, 0, 1, 0, 0, 0, 16,228, 90, 10, 30, 0,255,255, 1, 0, 0, 0,232, 84, 92, 10,
+ 30, 0,255,255, 1, 0, 0, 0,168, 90, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 48, 95, 92, 10, 30, 0,255,255, 1, 0, 0, 0,
+184, 99, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 64,104, 92, 10, 30, 0,255,255, 1, 0, 0, 0,200,108, 92, 10, 30, 0,255,255,
+ 1, 0, 0, 0, 80,113, 92, 10, 30, 0,255,255, 1, 0, 0, 0,216,117, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 96,122, 92, 10,
+ 30, 0,255,255, 1, 0, 0, 0,232,126, 92, 10, 30, 0,255,255, 1, 0, 0, 0,112,131, 92, 10, 30, 0,255,255, 1, 0, 0, 0,
+248,135, 92, 10, 30, 0,255,255, 1, 0, 0, 0,128,140, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 8,145, 92, 10, 30, 0,255,255,
+ 1, 0, 0, 0,144,149, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 24,154, 92, 10, 30, 0,255,255, 1, 0, 0, 0,160,158, 92, 10,
+ 30, 0,255,255, 1, 0, 0, 0, 40,163, 92, 10, 30, 0,255,255, 1, 0, 0, 0,176,167, 92, 10, 30, 0,255,255, 1, 0, 0, 0,
+ 56,172, 92, 10, 30, 0,255,255, 1, 0, 0, 0,192,176, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 72,181, 92, 10, 30, 0,255,255,
+ 1, 0, 0, 0,208,185, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 88,190, 92, 10, 30, 0,255,255, 1, 0, 0, 0,224,194, 92, 10,
+ 30, 0,255,255, 1, 0, 0, 0,104,199, 92, 10, 30, 0,255,255, 1, 0, 0, 0,240,203, 92, 10, 30, 0,255,255, 1, 0, 0, 0,
+120,208, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 0,213, 92, 10, 30, 0,255,255, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 0, 0,
+ 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,232, 84, 92, 10,
+ 31, 0, 3, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,
+232, 84, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 8, 0,
+ 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,232, 84, 92, 10,
+ 31, 0, 11, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,
+232, 84, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 16, 0,
+ 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,232, 84, 92, 10,
+ 31, 0, 19, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,
+232, 84, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 24, 0,
+ 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,232, 84, 92, 10,
+ 31, 0, 27, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,
+232, 84, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 32, 0,
+ 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,232, 84, 92, 10,
+ 31, 0, 35, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,
+232, 84, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 40, 0,
+ 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,232, 84, 92, 10,
+ 31, 0, 43, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,
+232, 84, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 48, 0,
+ 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,232, 84, 92, 10,
+ 31, 0, 51, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,
+232, 84, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 56, 0,
+ 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,232, 84, 92, 10,
+ 31, 0, 59, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,
+232, 84, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 64, 0,
+ 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,232, 84, 92, 10,
+ 31, 0, 67, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,
+232, 84, 92, 10, 30, 0,255,255, 1, 0, 0, 0,216,239, 90, 10, 30, 0,255,255, 1, 0, 0, 0,112,240, 90, 10, 30, 0,255,255,
+ 1, 0, 0, 0, 40, 4, 91, 10, 30, 0,255,255, 1, 0, 0, 0,240, 74, 92, 10, 30, 0,255,255, 3, 0, 0, 0,208,245, 90, 10,
+ 30, 0,255,255, 1, 0, 0, 0,152,250, 90, 10, 30, 0,255,255, 1, 0, 0, 0, 96,255, 90, 10, 30, 0,255,255, 1, 0, 0, 0,
+ 88,159, 78, 10, 30, 0,255,255, 1, 0, 0, 0,224,212, 60, 10, 30, 0,255,255, 1, 0, 0, 0, 24, 81, 88, 10, 30, 0,255,255,
+ 1, 0, 0, 0,168, 85, 89, 10, 30, 0,255,255, 1, 0, 0, 0,248, 63, 90, 10, 30, 0,255,255, 1, 0, 0, 0, 64,130, 90, 10,
+ 30, 0,255,255, 1, 0, 0, 0,232,191, 90, 10, 30, 0,255,255, 1, 0, 0, 0,224,168, 91, 10, 30, 0,255,255, 1, 0, 0, 0,
+ 0,140, 81, 9, 30, 0,255,255, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 1, 0,
+ 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,168, 90, 92, 10,
+ 31, 0, 4, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
+168, 90, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 9, 0,
+ 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,168, 90, 92, 10,
+ 31, 0, 12, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
+168, 90, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 17, 0,
+ 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,168, 90, 92, 10,
+ 31, 0, 20, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
+168, 90, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 25, 0,
+ 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,168, 90, 92, 10,
+ 31, 0, 28, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
+168, 90, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 33, 0,
+ 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,168, 90, 92, 10,
+ 31, 0, 36, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
+168, 90, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 41, 0,
+ 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,168, 90, 92, 10,
+ 31, 0, 44, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
+168, 90, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 49, 0,
+ 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,168, 90, 92, 10,
+ 31, 0, 52, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
+168, 90, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 57, 0,
+ 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,168, 90, 92, 10,
+ 31, 0, 60, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
+168, 90, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 65, 0,
+ 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,168, 90, 92, 10,
+ 31, 0, 68, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
+ 48, 95, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 3, 0,
+ 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 48, 95, 92, 10,
+ 31, 0, 6, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
+ 48, 95, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 11, 0,
+ 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 48, 95, 92, 10,
+ 31, 0, 14, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
+ 48, 95, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 19, 0,
+ 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 48, 95, 92, 10,
+ 31, 0, 22, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
+ 48, 95, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 27, 0,
+ 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 48, 95, 92, 10,
+ 31, 0, 30, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
+ 48, 95, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 35, 0,
+ 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 48, 95, 92, 10,
+ 31, 0, 38, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
+ 48, 95, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 43, 0,
+ 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 48, 95, 92, 10,
+ 31, 0, 46, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
+ 48, 95, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 51, 0,
+ 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 48, 95, 92, 10,
+ 31, 0, 54, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
+ 48, 95, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 59, 0,
+ 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 48, 95, 92, 10,
+ 31, 0, 62, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
+ 48, 95, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 67, 0,
+ 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 48, 95, 92, 10,
+ 31, 0, 0, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
+184, 99, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 5, 0,
+ 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,184, 99, 92, 10,
+ 31, 0, 8, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
+184, 99, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 13, 0,
+ 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,184, 99, 92, 10,
+ 31, 0, 16, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
+184, 99, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 21, 0,
+ 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,184, 99, 92, 10,
+ 31, 0, 24, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
+184, 99, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 29, 0,
+ 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,184, 99, 92, 10,
+ 31, 0, 32, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
+184, 99, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 37, 0,
+ 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,184, 99, 92, 10,
+ 31, 0, 40, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
+184, 99, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 45, 0,
+ 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,184, 99, 92, 10,
+ 31, 0, 48, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
+184, 99, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 53, 0,
+ 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,184, 99, 92, 10,
+ 31, 0, 56, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
+184, 99, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 61, 0,
+ 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,184, 99, 92, 10,
+ 31, 0, 64, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
+184, 99, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 69, 0,
+ 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 64,104, 92, 10,
+ 31, 0, 2, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
+ 64,104, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 7, 0,
+ 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 64,104, 92, 10,
+ 31, 0, 10, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
+ 64,104, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 15, 0,
+ 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 64,104, 92, 10,
+ 31, 0, 18, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
+ 64,104, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 23, 0,
+ 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 64,104, 92, 10,
+ 31, 0, 26, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
+ 64,104, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 31, 0,
+ 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 64,104, 92, 10,
+ 31, 0, 34, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
+ 64,104, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 39, 0,
+ 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 64,104, 92, 10,
+ 31, 0, 42, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
+ 64,104, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 47, 0,
+ 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 64,104, 92, 10,
+ 31, 0, 50, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
+ 64,104, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 55, 0,
+ 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 64,104, 92, 10,
+ 31, 0, 58, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
+ 64,104, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 63, 0,
+ 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 64,104, 92, 10,
+ 31, 0, 66, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
+ 64,104, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 1, 0,
+ 1, 0, 0, 0,200,108, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,200,108, 92, 10,
+ 31, 0, 4, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
+200,108, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 9, 0,
+ 1, 0, 0, 0,200,108, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,200,108, 92, 10,
+ 31, 0, 12, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
+200,108, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 17, 0,
+ 1, 0, 0, 0,200,108, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,200,108, 92, 10,
+ 31, 0, 20, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
+200,108, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 25, 0,
+ 1, 0, 0, 0,200,108, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,200,108, 92, 10,
+ 31, 0, 28, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
+200,108, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 33, 0,
+ 1, 0, 0, 0,200,108, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,200,108, 92, 10,
+ 31, 0, 36, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
+200,108, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 41, 0,
+ 1, 0, 0, 0,200,108, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,200,108, 92, 10,
+ 31, 0, 44, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
+200,108, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 49, 0,
+ 1, 0, 0, 0,200,108, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,200,108, 92, 10,
+ 31, 0, 52, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
+200,108, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 57, 0,
+ 1, 0, 0, 0,200,108, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,200,108, 92, 10,
+ 31, 0, 60, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
+200,108, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 65, 0,
+ 1, 0, 0, 0,200,108, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,200,108, 92, 10,
+ 31, 0, 68, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
+ 80,113, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 3, 0,
+ 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 80,113, 92, 10,
+ 31, 0, 6, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
+ 80,113, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 11, 0,
+ 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 80,113, 92, 10,
+ 31, 0, 14, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
+ 80,113, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 19, 0,
+ 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 80,113, 92, 10,
+ 31, 0, 22, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
+ 80,113, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 27, 0,
+ 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 80,113, 92, 10,
+ 31, 0, 30, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
+ 80,113, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 35, 0,
+ 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 80,113, 92, 10,
+ 31, 0, 38, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
+ 80,113, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 43, 0,
+ 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 80,113, 92, 10,
+ 31, 0, 46, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
+ 80,113, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 51, 0,
+ 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 80,113, 92, 10,
+ 31, 0, 54, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
+ 80,113, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 59, 0,
+ 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 80,113, 92, 10,
+ 31, 0, 62, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
+ 80,113, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 67, 0,
+ 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 80,113, 92, 10,
+ 31, 0, 0, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
+216,117, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 5, 0,
+ 1, 0, 0, 0,216,117, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,216,117, 92, 10,
+ 31, 0, 8, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
+216,117, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 13, 0,
+ 1, 0, 0, 0,216,117, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,216,117, 92, 10,
+ 31, 0, 16, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
+216,117, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 21, 0,
+ 1, 0, 0, 0,216,117, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,216,117, 92, 10,
+ 31, 0, 24, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
+216,117, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 29, 0,
+ 1, 0, 0, 0,216,117, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,216,117, 92, 10,
+ 31, 0, 32, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
+216,117, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 37, 0,
+ 1, 0, 0, 0,216,117, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,216,117, 92, 10,
+ 31, 0, 40, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
+216,117, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 45, 0,
+ 1, 0, 0, 0,216,117, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,216,117, 92, 10,
+ 31, 0, 48, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
+216,117, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 53, 0,
+ 1, 0, 0, 0,216,117, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,216,117, 92, 10,
+ 31, 0, 56, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
+216,117, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 61, 0,
+ 1, 0, 0, 0,216,117, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,216,117, 92, 10,
+ 31, 0, 64, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
+216,117, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 69, 0,
+ 1, 0, 0, 0,216,117, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 96,122, 92, 10,
+ 31, 0, 2, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
+ 96,122, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 7, 0,
+ 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 96,122, 92, 10,
+ 31, 0, 10, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
+ 96,122, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 15, 0,
+ 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 96,122, 92, 10,
+ 31, 0, 18, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
+ 96,122, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 23, 0,
+ 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 96,122, 92, 10,
+ 31, 0, 26, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
+ 96,122, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 31, 0,
+ 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 96,122, 92, 10,
+ 31, 0, 34, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
+ 96,122, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 39, 0,
+ 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 96,122, 92, 10,
+ 31, 0, 42, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
+ 96,122, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 47, 0,
+ 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 96,122, 92, 10,
+ 31, 0, 50, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
+ 96,122, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 55, 0,
+ 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 96,122, 92, 10,
+ 31, 0, 58, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
+ 96,122, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 63, 0,
+ 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 96,122, 92, 10,
+ 31, 0, 66, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
+ 96,122, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 1, 0,
+ 1, 0, 0, 0,232,126, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,232,126, 92, 10,
+ 31, 0, 4, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
+232,126, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 9, 0,
+ 1, 0, 0, 0,232,126, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,232,126, 92, 10,
+ 31, 0, 12, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
+232,126, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 17, 0,
+ 1, 0, 0, 0,232,126, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,232,126, 92, 10,
+ 31, 0, 20, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
+232,126, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 25, 0,
+ 1, 0, 0, 0,232,126, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,232,126, 92, 10,
+ 31, 0, 28, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
+232,126, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 33, 0,
+ 1, 0, 0, 0,232,126, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,232,126, 92, 10,
+ 31, 0, 36, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
+232,126, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 41, 0,
+ 1, 0, 0, 0,232,126, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,232,126, 92, 10,
+ 31, 0, 44, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
+232,126, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 49, 0,
+ 1, 0, 0, 0,232,126, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,232,126, 92, 10,
+ 31, 0, 52, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
+232,126, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 57, 0,
+ 1, 0, 0, 0,232,126, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,232,126, 92, 10,
+ 31, 0, 60, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
+232,126, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 65, 0,
+ 1, 0, 0, 0,232,126, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,232,126, 92, 10,
+ 31, 0, 68, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
+112,131, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 3, 0,
+ 1, 0, 0, 0,112,131, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,112,131, 92, 10,
+ 31, 0, 6, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
+112,131, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 11, 0,
+ 1, 0, 0, 0,112,131, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,112,131, 92, 10,
+ 31, 0, 14, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
+112,131, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 19, 0,
+ 1, 0, 0, 0,112,131, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,112,131, 92, 10,
+ 31, 0, 22, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
+112,131, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 27, 0,
+ 1, 0, 0, 0,112,131, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,112,131, 92, 10,
+ 31, 0, 30, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
+112,131, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 35, 0,
+ 1, 0, 0, 0,112,131, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,112,131, 92, 10,
+ 31, 0, 38, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
+112,131, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 43, 0,
+ 1, 0, 0, 0,112,131, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,112,131, 92, 10,
+ 31, 0, 46, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
+112,131, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 51, 0,
+ 1, 0, 0, 0,112,131, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,112,131, 92, 10,
+ 31, 0, 54, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
+112,131, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 59, 0,
+ 1, 0, 0, 0,112,131, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,112,131, 92, 10,
+ 31, 0, 62, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
+112,131, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 67, 0,
+ 1, 0, 0, 0,112,131, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,112,131, 92, 10,
+ 31, 0, 0, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
+248,135, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 5, 0,
+ 1, 0, 0, 0,248,135, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,248,135, 92, 10,
+ 31, 0, 8, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
+248,135, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 13, 0,
+ 1, 0, 0, 0,248,135, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,248,135, 92, 10,
+ 31, 0, 16, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
+248,135, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 21, 0,
+ 1, 0, 0, 0,248,135, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,248,135, 92, 10,
+ 31, 0, 24, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
+248,135, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 29, 0,
+ 1, 0, 0, 0,248,135, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,248,135, 92, 10,
+ 31, 0, 32, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
+248,135, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 37, 0,
+ 1, 0, 0, 0,248,135, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,248,135, 92, 10,
+ 31, 0, 40, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
+248,135, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 45, 0,
+ 1, 0, 0, 0,248,135, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,248,135, 92, 10,
+ 31, 0, 48, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
+248,135, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 53, 0,
+ 1, 0, 0, 0,248,135, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,248,135, 92, 10,
+ 31, 0, 56, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
+248,135, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 61, 0,
+ 1, 0, 0, 0,248,135, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,248,135, 92, 10,
+ 31, 0, 64, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
+248,135, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 69, 0,
+ 1, 0, 0, 0,248,135, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,128,140, 92, 10,
+ 31, 0, 2, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
+128,140, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 7, 0,
+ 1, 0, 0, 0,128,140, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,128,140, 92, 10,
+ 31, 0, 10, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
+128,140, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 15, 0,
+ 1, 0, 0, 0,128,140, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,128,140, 92, 10,
+ 31, 0, 18, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
+128,140, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 23, 0,
+ 1, 0, 0, 0,128,140, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,128,140, 92, 10,
+ 31, 0, 26, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
+128,140, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 31, 0,
+ 1, 0, 0, 0,128,140, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,128,140, 92, 10,
+ 31, 0, 34, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
+128,140, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 39, 0,
+ 1, 0, 0, 0,128,140, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,128,140, 92, 10,
+ 31, 0, 42, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
+128,140, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 47, 0,
+ 1, 0, 0, 0,128,140, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,128,140, 92, 10,
+ 31, 0, 50, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
+128,140, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 55, 0,
+ 1, 0, 0, 0,128,140, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,128,140, 92, 10,
+ 31, 0, 58, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
+128,140, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 63, 0,
+ 1, 0, 0, 0,128,140, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,128,140, 92, 10,
+ 31, 0, 66, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
+128,140, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 1, 0,
+ 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 8,145, 92, 10,
+ 31, 0, 4, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
+ 8,145, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 9, 0,
+ 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 8,145, 92, 10,
+ 31, 0, 12, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
+ 8,145, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 17, 0,
+ 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 8,145, 92, 10,
+ 31, 0, 20, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
+ 8,145, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 25, 0,
+ 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 8,145, 92, 10,
+ 31, 0, 28, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
+ 8,145, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 33, 0,
+ 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 8,145, 92, 10,
+ 31, 0, 36, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
+ 8,145, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 41, 0,
+ 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 8,145, 92, 10,
+ 31, 0, 44, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
+ 8,145, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 49, 0,
+ 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 8,145, 92, 10,
+ 31, 0, 52, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
+ 8,145, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 57, 0,
+ 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 8,145, 92, 10,
+ 31, 0, 60, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
+ 8,145, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 65, 0,
+ 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 8,145, 92, 10,
+ 31, 0, 68, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
+144,149, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 3, 0,
+ 1, 0, 0, 0,144,149, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,144,149, 92, 10,
+ 31, 0, 6, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
+144,149, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 11, 0,
+ 1, 0, 0, 0,144,149, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,144,149, 92, 10,
+ 31, 0, 14, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
+144,149, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 19, 0,
+ 1, 0, 0, 0,144,149, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,144,149, 92, 10,
+ 31, 0, 22, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
+144,149, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 27, 0,
+ 1, 0, 0, 0,144,149, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,144,149, 92, 10,
+ 31, 0, 30, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
+144,149, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 35, 0,
+ 1, 0, 0, 0,144,149, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,144,149, 92, 10,
+ 31, 0, 38, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
+144,149, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 43, 0,
+ 1, 0, 0, 0,144,149, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,144,149, 92, 10,
+ 31, 0, 46, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
+144,149, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 51, 0,
+ 1, 0, 0, 0,144,149, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,144,149, 92, 10,
+ 31, 0, 54, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
+144,149, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 59, 0,
+ 1, 0, 0, 0,144,149, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,144,149, 92, 10,
+ 31, 0, 62, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
+144,149, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 67, 0,
+ 1, 0, 0, 0,144,149, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,144,149, 92, 10,
+ 31, 0, 0, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
+ 24,154, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 5, 0,
+ 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 24,154, 92, 10,
+ 31, 0, 8, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
+ 24,154, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 13, 0,
+ 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 24,154, 92, 10,
+ 31, 0, 16, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
+ 24,154, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 21, 0,
+ 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 24,154, 92, 10,
+ 31, 0, 24, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
+ 24,154, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 29, 0,
+ 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 24,154, 92, 10,
+ 31, 0, 32, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
+ 24,154, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 37, 0,
+ 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 24,154, 92, 10,
+ 31, 0, 40, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
+ 24,154, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 45, 0,
+ 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 24,154, 92, 10,
+ 31, 0, 48, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
+ 24,154, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 53, 0,
+ 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 24,154, 92, 10,
+ 31, 0, 56, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
+ 24,154, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 61, 0,
+ 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 24,154, 92, 10,
+ 31, 0, 64, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
+ 24,154, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 69, 0,
+ 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,160,158, 92, 10,
+ 31, 0, 2, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
+160,158, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 7, 0,
+ 1, 0, 0, 0,160,158, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,160,158, 92, 10,
+ 31, 0, 10, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
+160,158, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 15, 0,
+ 1, 0, 0, 0,160,158, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,160,158, 92, 10,
+ 31, 0, 18, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
+160,158, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 23, 0,
+ 1, 0, 0, 0,160,158, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,160,158, 92, 10,
+ 31, 0, 26, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
+160,158, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 31, 0,
+ 1, 0, 0, 0,160,158, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,160,158, 92, 10,
+ 31, 0, 34, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
+160,158, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 39, 0,
+ 1, 0, 0, 0,160,158, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,160,158, 92, 10,
+ 31, 0, 42, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
+160,158, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 47, 0,
+ 1, 0, 0, 0,160,158, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,160,158, 92, 10,
+ 31, 0, 50, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
+160,158, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 55, 0,
+ 1, 0, 0, 0,160,158, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,160,158, 92, 10,
+ 31, 0, 58, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
+160,158, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 63, 0,
+ 1, 0, 0, 0,160,158, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,160,158, 92, 10,
+ 31, 0, 66, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
+160,158, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 1, 0,
+ 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 40,163, 92, 10,
+ 31, 0, 4, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
+ 40,163, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 9, 0,
+ 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 40,163, 92, 10,
+ 31, 0, 12, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
+ 40,163, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 17, 0,
+ 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 40,163, 92, 10,
+ 31, 0, 20, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
+ 40,163, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 25, 0,
+ 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 40,163, 92, 10,
+ 31, 0, 28, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
+ 40,163, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 33, 0,
+ 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 40,163, 92, 10,
+ 31, 0, 36, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
+ 40,163, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 41, 0,
+ 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 40,163, 92, 10,
+ 31, 0, 44, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
+ 40,163, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 49, 0,
+ 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 40,163, 92, 10,
+ 31, 0, 52, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
+ 40,163, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 57, 0,
+ 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 40,163, 92, 10,
+ 31, 0, 60, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
+ 40,163, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 65, 0,
+ 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 40,163, 92, 10,
+ 31, 0, 68, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
+176,167, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 3, 0,
+ 1, 0, 0, 0,176,167, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,176,167, 92, 10,
+ 31, 0, 6, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
+176,167, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 11, 0,
+ 1, 0, 0, 0,176,167, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,176,167, 92, 10,
+ 31, 0, 14, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
+176,167, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 19, 0,
+ 1, 0, 0, 0,176,167, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,176,167, 92, 10,
+ 31, 0, 22, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
+176,167, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 27, 0,
+ 1, 0, 0, 0,176,167, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,176,167, 92, 10,
+ 31, 0, 30, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
+176,167, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 35, 0,
+ 1, 0, 0, 0,176,167, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,176,167, 92, 10,
+ 31, 0, 38, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
+176,167, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 43, 0,
+ 1, 0, 0, 0,176,167, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,176,167, 92, 10,
+ 31, 0, 46, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
+176,167, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 51, 0,
+ 1, 0, 0, 0,176,167, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,176,167, 92, 10,
+ 31, 0, 54, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
+176,167, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 59, 0,
+ 1, 0, 0, 0,176,167, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,176,167, 92, 10,
+ 31, 0, 62, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
+176,167, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 67, 0,
+ 1, 0, 0, 0,176,167, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,176,167, 92, 10,
+ 31, 0, 0, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
+ 56,172, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 5, 0,
+ 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 56,172, 92, 10,
+ 31, 0, 8, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
+ 56,172, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 13, 0,
+ 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 56,172, 92, 10,
+ 31, 0, 16, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
+ 56,172, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 21, 0,
+ 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 56,172, 92, 10,
+ 31, 0, 24, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
+ 56,172, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 29, 0,
+ 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 56,172, 92, 10,
+ 31, 0, 32, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
+ 56,172, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 37, 0,
+ 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 56,172, 92, 10,
+ 31, 0, 40, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
+ 56,172, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 45, 0,
+ 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 56,172, 92, 10,
+ 31, 0, 48, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
+ 56,172, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 53, 0,
+ 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 56,172, 92, 10,
+ 31, 0, 56, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
+ 56,172, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 61, 0,
+ 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 56,172, 92, 10,
+ 31, 0, 64, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
+ 56,172, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 69, 0,
+ 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,192,176, 92, 10,
+ 31, 0, 2, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
+192,176, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 7, 0,
+ 1, 0, 0, 0,192,176, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,192,176, 92, 10,
+ 31, 0, 10, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
+192,176, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 15, 0,
+ 1, 0, 0, 0,192,176, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,192,176, 92, 10,
+ 31, 0, 18, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
+192,176, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 23, 0,
+ 1, 0, 0, 0,192,176, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,192,176, 92, 10,
+ 31, 0, 26, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
+192,176, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 31, 0,
+ 1, 0, 0, 0,192,176, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,192,176, 92, 10,
+ 31, 0, 34, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
+192,176, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 39, 0,
+ 1, 0, 0, 0,192,176, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,192,176, 92, 10,
+ 31, 0, 42, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
+192,176, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 47, 0,
+ 1, 0, 0, 0,192,176, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,192,176, 92, 10,
+ 31, 0, 50, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
+192,176, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 55, 0,
+ 1, 0, 0, 0,192,176, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,192,176, 92, 10,
+ 31, 0, 58, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
+192,176, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 63, 0,
+ 1, 0, 0, 0,192,176, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,192,176, 92, 10,
+ 31, 0, 66, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
+192,176, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 1, 0,
+ 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 72,181, 92, 10,
+ 31, 0, 4, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
+ 72,181, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 9, 0,
+ 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 72,181, 92, 10,
+ 31, 0, 12, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
+ 72,181, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 17, 0,
+ 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 72,181, 92, 10,
+ 31, 0, 20, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
+ 72,181, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 25, 0,
+ 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 72,181, 92, 10,
+ 31, 0, 28, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
+ 72,181, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 33, 0,
+ 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 72,181, 92, 10,
+ 31, 0, 36, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
+ 72,181, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 41, 0,
+ 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 72,181, 92, 10,
+ 31, 0, 44, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
+ 72,181, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 49, 0,
+ 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 72,181, 92, 10,
+ 31, 0, 52, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
+ 72,181, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 57, 0,
+ 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 72,181, 92, 10,
+ 31, 0, 60, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
+ 72,181, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 65, 0,
+ 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 72,181, 92, 10,
+ 31, 0, 68, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
+208,185, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 3, 0,
+ 1, 0, 0, 0,208,185, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,208,185, 92, 10,
+ 31, 0, 6, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
+208,185, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 11, 0,
+ 1, 0, 0, 0,208,185, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,208,185, 92, 10,
+ 31, 0, 14, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
+208,185, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 19, 0,
+ 1, 0, 0, 0,208,185, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,208,185, 92, 10,
+ 31, 0, 22, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
+208,185, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 27, 0,
+ 1, 0, 0, 0,208,185, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,208,185, 92, 10,
+ 31, 0, 30, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
+208,185, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 35, 0,
+ 1, 0, 0, 0,208,185, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,208,185, 92, 10,
+ 31, 0, 38, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
+208,185, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 43, 0,
+ 1, 0, 0, 0,208,185, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,208,185, 92, 10,
+ 31, 0, 46, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
+208,185, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 51, 0,
+ 1, 0, 0, 0,208,185, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,208,185, 92, 10,
+ 31, 0, 54, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
+208,185, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 59, 0,
+ 1, 0, 0, 0,208,185, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,208,185, 92, 10,
+ 31, 0, 62, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
+208,185, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 67, 0,
+ 1, 0, 0, 0,208,185, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,208,185, 92, 10,
+ 31, 0, 0, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
+ 88,190, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 5, 0,
+ 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 88,190, 92, 10,
+ 31, 0, 8, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
+ 88,190, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 13, 0,
+ 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 88,190, 92, 10,
+ 31, 0, 16, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
+ 88,190, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 21, 0,
+ 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 88,190, 92, 10,
+ 31, 0, 24, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
+ 88,190, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 29, 0,
+ 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 88,190, 92, 10,
+ 31, 0, 32, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
+ 88,190, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 37, 0,
+ 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 88,190, 92, 10,
+ 31, 0, 40, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
+ 88,190, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 45, 0,
+ 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 88,190, 92, 10,
+ 31, 0, 48, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
+ 88,190, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 53, 0,
+ 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 88,190, 92, 10,
+ 31, 0, 56, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
+ 88,190, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 61, 0,
+ 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 88,190, 92, 10,
+ 31, 0, 64, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
+ 88,190, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 69, 0,
+ 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,224,194, 92, 10,
+ 31, 0, 2, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
+224,194, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 7, 0,
+ 1, 0, 0, 0,224,194, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,224,194, 92, 10,
+ 31, 0, 10, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
+224,194, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 15, 0,
+ 1, 0, 0, 0,224,194, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,224,194, 92, 10,
+ 31, 0, 18, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
+224,194, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 23, 0,
+ 1, 0, 0, 0,224,194, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,224,194, 92, 10,
+ 31, 0, 26, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
+224,194, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 31, 0,
+ 1, 0, 0, 0,224,194, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,224,194, 92, 10,
+ 31, 0, 34, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
+224,194, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 39, 0,
+ 1, 0, 0, 0,224,194, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,224,194, 92, 10,
+ 31, 0, 42, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
+224,194, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 47, 0,
+ 1, 0, 0, 0,224,194, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,224,194, 92, 10,
+ 31, 0, 50, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
+224,194, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 55, 0,
+ 1, 0, 0, 0,224,194, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,224,194, 92, 10,
+ 31, 0, 58, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
+224,194, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 63, 0,
+ 1, 0, 0, 0,224,194, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,224,194, 92, 10,
+ 31, 0, 66, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
+224,194, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 1, 0,
+ 1, 0, 0, 0,104,199, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,104,199, 92, 10,
+ 31, 0, 4, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
+104,199, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 9, 0,
+ 1, 0, 0, 0,104,199, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,104,199, 92, 10,
+ 31, 0, 12, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
+104,199, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 17, 0,
+ 1, 0, 0, 0,104,199, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,104,199, 92, 10,
+ 31, 0, 20, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
+104,199, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 25, 0,
+ 1, 0, 0, 0,104,199, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,104,199, 92, 10,
+ 31, 0, 28, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
+104,199, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 33, 0,
+ 1, 0, 0, 0,104,199, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,104,199, 92, 10,
+ 31, 0, 36, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
+104,199, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 41, 0,
+ 1, 0, 0, 0,104,199, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,104,199, 92, 10,
+ 31, 0, 44, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
+104,199, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 49, 0,
+ 1, 0, 0, 0,104,199, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,104,199, 92, 10,
+ 31, 0, 52, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
+104,199, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 57, 0,
+ 1, 0, 0, 0,104,199, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,104,199, 92, 10,
+ 31, 0, 60, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
+104,199, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 65, 0,
+ 1, 0, 0, 0,104,199, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,104,199, 92, 10,
+ 31, 0, 68, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
+240,203, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 3, 0,
+ 1, 0, 0, 0,240,203, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,240,203, 92, 10,
+ 31, 0, 6, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
+240,203, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 11, 0,
+ 1, 0, 0, 0,240,203, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,240,203, 92, 10,
+ 31, 0, 14, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
+240,203, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 19, 0,
+ 1, 0, 0, 0,240,203, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,240,203, 92, 10,
+ 31, 0, 22, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
+240,203, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 27, 0,
+ 1, 0, 0, 0,240,203, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,240,203, 92, 10,
+ 31, 0, 30, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
+240,203, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 35, 0,
+ 1, 0, 0, 0,240,203, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,240,203, 92, 10,
+ 31, 0, 38, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
+240,203, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 43, 0,
+ 1, 0, 0, 0,240,203, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,240,203, 92, 10,
+ 31, 0, 46, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
+240,203, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 51, 0,
+ 1, 0, 0, 0,240,203, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,240,203, 92, 10,
+ 31, 0, 54, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
+240,203, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 59, 0,
+ 1, 0, 0, 0,240,203, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,240,203, 92, 10,
+ 31, 0, 62, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
+240,203, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 67, 0,
+ 1, 0, 0, 0,240,203, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,240,203, 92, 10,
+ 31, 0, 0, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
+120,208, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 5, 0,
+ 1, 0, 0, 0,120,208, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,120,208, 92, 10,
+ 31, 0, 8, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
+120,208, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 13, 0,
+ 1, 0, 0, 0,120,208, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,120,208, 92, 10,
+ 31, 0, 16, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
+120,208, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 21, 0,
+ 1, 0, 0, 0,120,208, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,120,208, 92, 10,
+ 31, 0, 24, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
+120,208, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 29, 0,
+ 1, 0, 0, 0,120,208, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,120,208, 92, 10,
+ 31, 0, 32, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
+120,208, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 37, 0,
+ 1, 0, 0, 0,120,208, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,120,208, 92, 10,
+ 31, 0, 40, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
+120,208, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 45, 0,
+ 1, 0, 0, 0,120,208, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,120,208, 92, 10,
+ 31, 0, 48, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
+120,208, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 53, 0,
+ 1, 0, 0, 0,120,208, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,120,208, 92, 10,
+ 31, 0, 56, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
+120,208, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 61, 0,
+ 1, 0, 0, 0,120,208, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,120,208, 92, 10,
+ 31, 0, 64, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
+120,208, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 69, 0,
+ 1, 0, 0, 0,120,208, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 0,213, 92, 10,
+ 31, 0, 2, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
+ 0,213, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 7, 0,
+ 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 0,213, 92, 10,
+ 31, 0, 10, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
+ 0,213, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 15, 0,
+ 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 0,213, 92, 10,
+ 31, 0, 18, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
+ 0,213, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 23, 0,
+ 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 0,213, 92, 10,
+ 31, 0, 26, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
+ 0,213, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 31, 0,
+ 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 0,213, 92, 10,
+ 31, 0, 34, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
+ 0,213, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 39, 0,
+ 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 0,213, 92, 10,
+ 31, 0, 42, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
+ 0,213, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 47, 0,
+ 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 0,213, 92, 10,
+ 31, 0, 50, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
+ 0,213, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 55, 0,
+ 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 0,213, 92, 10,
+ 31, 0, 58, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
+ 0,213, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 63, 0,
+ 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 0,213, 92, 10,
+ 31, 0, 66, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
+ 0,213, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 1, 0,
+ 1, 0, 0, 0,136,217, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,136,217, 92, 10,
+ 31, 0, 4, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
+136,217, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 9, 0,
+ 1, 0, 0, 0,136,217, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,136,217, 92, 10,
+ 31, 0, 12, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
+136,217, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 17, 0,
+ 1, 0, 0, 0,136,217, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,136,217, 92, 10,
+ 31, 0, 20, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
+136,217, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 25, 0,
+ 1, 0, 0, 0,136,217, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,136,217, 92, 10,
+ 31, 0, 28, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
+136,217, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 33, 0,
+ 1, 0, 0, 0,136,217, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,136,217, 92, 10,
+ 31, 0, 36, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
+136,217, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 41, 0,
+ 1, 0, 0, 0,136,217, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,136,217, 92, 10,
+ 31, 0, 44, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
+136,217, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 49, 0,
+ 1, 0, 0, 0,136,217, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,136,217, 92, 10,
+ 31, 0, 52, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
+136,217, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 57, 0,
+ 1, 0, 0, 0,136,217, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,136,217, 92, 10,
+ 31, 0, 60, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
+136,217, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 65, 0,
+ 1, 0, 0, 0,136,217, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,136,217, 92, 10,
+ 31, 0, 68, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
+216,239, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 3, 0,
+ 1, 0, 0, 0,216,239, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,216,239, 90, 10,
+ 31, 0, 6, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,
+216,239, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 10, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 11, 0,
+ 1, 0, 0, 0,216,239, 90, 10, 31, 0, 12, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0,216,239, 90, 10,
+ 31, 0, 14, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0,
+216,239, 90, 10, 31, 0, 17, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 18, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 19, 0,
+ 1, 0, 0, 0,216,239, 90, 10, 31, 0, 20, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 21, 0, 1, 0, 0, 0,216,239, 90, 10,
+ 31, 0, 22, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 23, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 24, 0, 1, 0, 0, 0,
+216,239, 90, 10, 31, 0, 25, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 1, 0,
+ 1, 0, 0, 0,112,240, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0,112,240, 90, 10,
+ 31, 0, 4, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0,
+112,240, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 9, 0,
+ 1, 0, 0, 0,112,240, 90, 10, 31, 0, 10, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 11, 0, 1, 0, 0, 0,112,240, 90, 10,
+ 31, 0, 12, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 14, 0, 1, 0, 0, 0,
+112,240, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 17, 0,
+ 1, 0, 0, 0,112,240, 90, 10, 31, 0, 18, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 19, 0, 1, 0, 0, 0,112,240, 90, 10,
+ 31, 0, 20, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 21, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 22, 0, 1, 0, 0, 0,
+112,240, 90, 10, 31, 0, 23, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 24, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 25, 0,
+ 1, 0, 0, 0,112,240, 90, 10, 31, 0, 26, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 27, 0, 1, 0, 0, 0,112,240, 90, 10,
+ 31, 0, 28, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 29, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 30, 0, 1, 0, 0, 0,
+112,240, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 1, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 2, 0,
+ 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 3, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 4, 0, 1, 0, 0, 0, 40, 4, 91, 10,
+ 31, 0, 5, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 6, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 7, 0, 1, 0, 0, 0,
+ 40, 4, 91, 10, 31, 0, 8, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 9, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 10, 0,
+ 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 11, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 12, 0, 1, 0, 0, 0, 40, 4, 91, 10,
+ 31, 0, 13, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 14, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 15, 0, 1, 0, 0, 0,
+ 40, 4, 91, 10, 31, 0, 16, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 17, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 18, 0,
+ 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 19, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 20, 0, 1, 0, 0, 0, 40, 4, 91, 10,
+ 31, 0, 21, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 22, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 23, 0, 1, 0, 0, 0,
+ 40, 4, 91, 10, 31, 0, 24, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 25, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 26, 0,
+ 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 27, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 28, 0, 1, 0, 0, 0, 40, 4, 91, 10,
+ 31, 0, 29, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 30, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 31, 0, 1, 0, 0, 0,
+ 40, 4, 91, 10, 31, 0, 32, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 33, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 34, 0,
+ 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 35, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 36, 0, 1, 0, 0, 0, 40, 4, 91, 10,
+ 31, 0, 37, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 38, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 39, 0, 1, 0, 0, 0,
+ 40, 4, 91, 10, 31, 0, 40, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 41, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 42, 0,
+ 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 43, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 44, 0, 1, 0, 0, 0, 40, 4, 91, 10,
+ 31, 0, 45, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 46, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 47, 0, 1, 0, 0, 0,
+ 40, 4, 91, 10, 31, 0, 48, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 49, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 50, 0,
+ 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 51, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 52, 0, 1, 0, 0, 0, 40, 4, 91, 10,
+ 31, 0, 53, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 54, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 55, 0, 1, 0, 0, 0,
+ 40, 4, 91, 10, 31, 0, 56, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 57, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 58, 0,
+ 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 59, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 60, 0, 1, 0, 0, 0, 40, 4, 91, 10,
+ 31, 0, 61, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 62, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 63, 0, 1, 0, 0, 0,
+ 40, 4, 91, 10, 31, 0, 64, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 65, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 66, 0,
+ 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 67, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 68, 0, 1, 0, 0, 0, 40, 4, 91, 10,
+ 31, 0, 69, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 70, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 71, 0, 1, 0, 0, 0,
+ 40, 4, 91, 10, 31, 0, 72, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 73, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 74, 0,
+ 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 75, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 76, 0, 1, 0, 0, 0, 40, 4, 91, 10,
+ 31, 0, 77, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 78, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 79, 0, 1, 0, 0, 0,
+ 40, 4, 91, 10, 31, 0, 80, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 81, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 82, 0,
+ 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 83, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 0, 0, 1, 0, 0, 0,240, 74, 92, 10,
+ 31, 0, 1, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,
+240, 74, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 6, 0,
+ 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,240, 74, 92, 10,
+ 31, 0, 9, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,
+240, 74, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 14, 0,
+ 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,240, 74, 92, 10,
+ 31, 0, 17, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,
+240, 74, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 22, 0,
+ 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,240, 74, 92, 10,
+ 31, 0, 25, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,
+240, 74, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 30, 0,
+ 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,240, 74, 92, 10,
+ 31, 0, 33, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,
+240, 74, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 38, 0,
+ 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,240, 74, 92, 10,
+ 31, 0, 41, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,
+240, 74, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 46, 0,
+ 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,240, 74, 92, 10,
+ 31, 0, 49, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,
+240, 74, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 2, 0,
+ 1, 0, 0, 0,208,245, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0,208,245, 90, 10,
+ 31, 0, 5, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0,
+208,245, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 10, 0,
+ 1, 0, 0, 0,208,245, 90, 10, 31, 0, 11, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 12, 0, 1, 0, 0, 0,208,245, 90, 10,
+ 31, 0, 13, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 14, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0,
+208,245, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 17, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 18, 0,
+ 1, 0, 0, 0,208,245, 90, 10, 31, 0, 19, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 20, 0, 1, 0, 0, 0,208,245, 90, 10,
+ 31, 0, 21, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 22, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 23, 0, 1, 0, 0, 0,
+208,245, 90, 10, 31, 0, 24, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 25, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 26, 0,
+ 1, 0, 0, 0,208,245, 90, 10, 31, 0, 27, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 28, 0, 1, 0, 0, 0,208,245, 90, 10,
+ 31, 0, 29, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 30, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 31, 0, 1, 0, 0, 0,
+208,245, 90, 10, 31, 0, 32, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 33, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 34, 0,
+ 1, 0, 0, 0,208,245, 90, 10, 31, 0, 35, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 36, 0, 1, 0, 0, 0,208,245, 90, 10,
+ 31, 0, 37, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 38, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 39, 0, 1, 0, 0, 0,
+208,245, 90, 10, 31, 0, 40, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 41, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 42, 0,
+ 1, 0, 0, 0,208,245, 90, 10, 31, 0, 43, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 44, 0, 1, 0, 0, 0,208,245, 90, 10,
+ 31, 0, 45, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 46, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 47, 0, 1, 0, 0, 0,
+208,245, 90, 10, 31, 0, 48, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 49, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 50, 0,
+ 1, 0, 0, 0,208,245, 90, 10, 31, 0, 51, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 52, 0, 1, 0, 0, 0,208,245, 90, 10,
+ 31, 0, 53, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 54, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 55, 0, 1, 0, 0, 0,
+208,245, 90, 10, 31, 0, 56, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 57, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 58, 0,
+ 1, 0, 0, 0,208,245, 90, 10, 31, 0, 59, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 60, 0, 1, 0, 0, 0,208,245, 90, 10,
+ 31, 0, 61, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 62, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 63, 0, 1, 0, 0, 0,
+208,245, 90, 10, 31, 0, 64, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 65, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 66, 0,
+ 1, 0, 0, 0,208,245, 90, 10, 31, 0, 67, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 68, 0, 1, 0, 0, 0,208,245, 90, 10,
+ 31, 0, 69, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 70, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 71, 0, 1, 0, 0, 0,
+208,245, 90, 10, 31, 0, 72, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 73, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 74, 0,
+ 1, 0, 0, 0,208,245, 90, 10, 31, 0, 75, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 76, 0, 1, 0, 0, 0,208,245, 90, 10,
+ 31, 0, 77, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 78, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 79, 0, 1, 0, 0, 0,
+208,245, 90, 10, 31, 0, 80, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 81, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 82, 0,
+ 1, 0, 0, 0,208,245, 90, 10, 31, 0, 83, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 84, 0, 1, 0, 0, 0,208,245, 90, 10,
+ 31, 0, 85, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 86, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 87, 0, 1, 0, 0, 0,
+208,245, 90, 10, 31, 0, 88, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 89, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 90, 0,
+ 1, 0, 0, 0,208,245, 90, 10, 31, 0, 91, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 92, 0, 1, 0, 0, 0,208,245, 90, 10,
+ 31, 0, 93, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 94, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 95, 0, 1, 0, 0, 0,
+208,245, 90, 10, 31, 0, 96, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 1, 0,
+ 1, 0, 0, 0,152,250, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0,152,250, 90, 10,
+ 31, 0, 4, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0,
+152,250, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 9, 0,
+ 1, 0, 0, 0,152,250, 90, 10, 31, 0, 10, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 11, 0, 1, 0, 0, 0,152,250, 90, 10,
+ 31, 0, 12, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 14, 0, 1, 0, 0, 0,
+152,250, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 17, 0,
+ 1, 0, 0, 0,152,250, 90, 10, 31, 0, 18, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 19, 0, 1, 0, 0, 0,152,250, 90, 10,
+ 31, 0, 20, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 21, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 22, 0, 1, 0, 0, 0,
+152,250, 90, 10, 31, 0, 23, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 24, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 25, 0,
+ 1, 0, 0, 0,152,250, 90, 10, 31, 0, 26, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 27, 0, 1, 0, 0, 0,152,250, 90, 10,
+ 31, 0, 28, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 29, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 30, 0, 1, 0, 0, 0,
+152,250, 90, 10, 31, 0, 31, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 32, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 33, 0,
+ 1, 0, 0, 0,152,250, 90, 10, 31, 0, 34, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 35, 0, 1, 0, 0, 0,152,250, 90, 10,
+ 31, 0, 36, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 37, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 38, 0, 1, 0, 0, 0,
+152,250, 90, 10, 31, 0, 39, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 40, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 41, 0,
+ 1, 0, 0, 0,152,250, 90, 10, 31, 0, 42, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 43, 0, 1, 0, 0, 0,152,250, 90, 10,
+ 31, 0, 44, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 45, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 46, 0, 1, 0, 0, 0,
+152,250, 90, 10, 31, 0, 47, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 48, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 49, 0,
+ 1, 0, 0, 0,152,250, 90, 10, 31, 0, 50, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 51, 0, 1, 0, 0, 0,152,250, 90, 10,
+ 31, 0, 52, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 53, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 54, 0, 1, 0, 0, 0,
+152,250, 90, 10, 31, 0, 55, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 56, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 57, 0,
+ 1, 0, 0, 0,152,250, 90, 10, 31, 0, 58, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 59, 0, 1, 0, 0, 0,152,250, 90, 10,
+ 31, 0, 60, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 61, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 62, 0, 1, 0, 0, 0,
+152,250, 90, 10, 31, 0, 63, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 64, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 65, 0,
+ 1, 0, 0, 0,152,250, 90, 10, 31, 0, 66, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 67, 0, 1, 0, 0, 0,152,250, 90, 10,
+ 31, 0, 68, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 69, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 70, 0, 1, 0, 0, 0,
+152,250, 90, 10, 31, 0, 71, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 72, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 73, 0,
+ 1, 0, 0, 0,152,250, 90, 10, 31, 0, 74, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 75, 0, 1, 0, 0, 0,152,250, 90, 10,
+ 31, 0, 76, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 77, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 78, 0, 1, 0, 0, 0,
+152,250, 90, 10, 31, 0, 79, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 80, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 81, 0,
+ 1, 0, 0, 0,152,250, 90, 10, 31, 0, 82, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 83, 0, 1, 0, 0, 0,152,250, 90, 10,
+ 31, 0, 84, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 85, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 86, 0, 1, 0, 0, 0,
+152,250, 90, 10, 31, 0, 87, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 88, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 89, 0,
+ 1, 0, 0, 0,152,250, 90, 10, 31, 0, 90, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 91, 0, 1, 0, 0, 0,152,250, 90, 10,
+ 31, 0, 92, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 93, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 94, 0, 1, 0, 0, 0,
+152,250, 90, 10, 31, 0, 95, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 96, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 0, 0,
+ 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0, 96,255, 90, 10,
+ 31, 0, 3, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,
+ 96,255, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 8, 0,
+ 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 10, 0, 1, 0, 0, 0, 96,255, 90, 10,
+ 31, 0, 11, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 12, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0,
+ 96,255, 90, 10, 31, 0, 14, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 16, 0,
+ 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 17, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 18, 0, 1, 0, 0, 0, 96,255, 90, 10,
+ 31, 0, 19, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 20, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 21, 0, 1, 0, 0, 0,
+ 96,255, 90, 10, 31, 0, 22, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 23, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 24, 0,
+ 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 25, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 26, 0, 1, 0, 0, 0, 96,255, 90, 10,
+ 31, 0, 27, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 28, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 29, 0, 1, 0, 0, 0,
+ 96,255, 90, 10, 31, 0, 30, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 31, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 32, 0,
+ 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 33, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 34, 0, 1, 0, 0, 0, 96,255, 90, 10,
+ 31, 0, 35, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 36, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 37, 0, 1, 0, 0, 0,
+ 96,255, 90, 10, 31, 0, 38, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 39, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 40, 0,
+ 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 41, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 42, 0, 1, 0, 0, 0, 96,255, 90, 10,
+ 31, 0, 43, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 44, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 45, 0, 1, 0, 0, 0,
+ 96,255, 90, 10, 31, 0, 46, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 47, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 48, 0,
+ 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 49, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 50, 0, 1, 0, 0, 0, 96,255, 90, 10,
+ 31, 0, 51, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 52, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 53, 0, 1, 0, 0, 0,
+ 96,255, 90, 10, 31, 0, 54, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 55, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 56, 0,
+ 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 57, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 58, 0, 1, 0, 0, 0, 96,255, 90, 10,
+ 31, 0, 59, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 60, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 61, 0, 1, 0, 0, 0,
+ 96,255, 90, 10, 31, 0, 62, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 63, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 64, 0,
+ 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 65, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 66, 0, 1, 0, 0, 0, 96,255, 90, 10,
+ 31, 0, 67, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 68, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 69, 0, 1, 0, 0, 0,
+ 96,255, 90, 10, 31, 0, 70, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 71, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 72, 0,
+ 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 73, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 74, 0, 1, 0, 0, 0, 96,255, 90, 10,
+ 31, 0, 75, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 76, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 77, 0, 1, 0, 0, 0,
+ 96,255, 90, 10, 31, 0, 78, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 79, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 80, 0,
+ 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 81, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 82, 0, 1, 0, 0, 0, 96,255, 90, 10,
+ 31, 0, 83, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 84, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 85, 0, 1, 0, 0, 0,
+ 96,255, 90, 10, 31, 0, 86, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 87, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 88, 0,
+ 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 89, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 90, 0, 1, 0, 0, 0, 96,255, 90, 10,
+ 31, 0, 91, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 92, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 93, 0, 1, 0, 0, 0,
+ 96,255, 90, 10, 31, 0, 94, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 95, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 96, 0,
+ 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 1, 0, 1, 0, 0, 0, 88,159, 78, 10,
+ 31, 0, 2, 0, 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 3, 0, 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 4, 0, 1, 0, 0, 0,
+ 88,159, 78, 10, 31, 0, 5, 0, 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 6, 0, 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 7, 0,
+ 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 8, 0, 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 9, 0, 1, 0, 0, 0, 88,159, 78, 10,
+ 31, 0, 0, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 1, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 2, 0, 1, 0, 0, 0,
+224,212, 60, 10, 31, 0, 3, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 4, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 5, 0,
+ 1, 0, 0, 0,224,212, 60, 10, 31, 0, 6, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 7, 0, 1, 0, 0, 0,224,212, 60, 10,
+ 31, 0, 8, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 9, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 0, 0, 1, 0, 0, 0,
+ 24, 81, 88, 10, 31, 0, 1, 0, 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 2, 0, 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 3, 0,
+ 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 4, 0, 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 5, 0, 1, 0, 0, 0, 24, 81, 88, 10,
+ 31, 0, 6, 0, 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 7, 0, 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 8, 0, 1, 0, 0, 0,
+ 24, 81, 88, 10, 31, 0, 9, 0, 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 0, 0, 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 1, 0,
+ 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 2, 0, 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 3, 0, 1, 0, 0, 0,168, 85, 89, 10,
+ 31, 0, 4, 0, 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 5, 0, 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 6, 0, 1, 0, 0, 0,
+168, 85, 89, 10, 31, 0, 7, 0, 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 8, 0, 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 9, 0,
+ 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 0, 0, 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0,248, 63, 90, 10,
+ 31, 0, 2, 0, 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0,
+248, 63, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 7, 0,
+ 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0,248, 63, 90, 10,
+ 31, 0, 0, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0,
+ 64,130, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 5, 0,
+ 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0, 64,130, 90, 10,
+ 31, 0, 8, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0,
+232,191, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0,232,191, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0,232,191, 90, 10, 31, 0, 3, 0,
+ 1, 0, 0, 0,232,191, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0,232,191, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,232,191, 90, 10,
+ 31, 0, 6, 0, 1, 0, 0, 0,232,191, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0,232,191, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,
+232,191, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0,232,191, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 1, 0,
+ 1, 0, 0, 0,224,168, 91, 10, 31, 0, 2, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 3, 0, 1, 0, 0, 0,224,168, 91, 10,
+ 31, 0, 4, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 5, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 6, 0, 1, 0, 0, 0,
+224,168, 91, 10, 31, 0, 7, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 8, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 9, 0,
+ 1, 0, 0, 0,224,168, 91, 10, 31, 0, 10, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 11, 0, 1, 0, 0, 0,224,168, 91, 10,
+ 31, 0, 12, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 13, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 14, 0, 1, 0, 0, 0,
+224,168, 91, 10, 31, 0, 15, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 16, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 17, 0,
+ 1, 0, 0, 0,224,168, 91, 10, 31, 0, 18, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 0, 0, 1, 0, 0, 0, 0,140, 81, 9,
+ 31, 0, 1, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 2, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 3, 0, 1, 0, 0, 0,
+ 0,140, 81, 9, 31, 0, 4, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 5, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 6, 0,
+ 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 7, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 8, 0, 1, 0, 0, 0, 0,140, 81, 9,
+ 31, 0, 9, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 10, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 0, 0, 1, 0, 0, 0,
+224,243, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 3, 0,
+ 1, 0, 0, 0,224,243, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,224,243, 90, 10,
+ 31, 0, 6, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,
+224,243, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 10, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 11, 0,
+ 1, 0, 0, 0,224,243, 90, 10, 31, 0, 12, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0,224,243, 90, 10,
+ 31, 0, 14, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0,
+224,243, 90, 10, 31, 0, 17, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 18, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 19, 0,
+ 1, 0, 0, 0,224,243, 90, 10, 31, 0, 20, 0, 1, 0, 0, 0,224,243, 90, 10, 68, 65, 84, 65, 96, 0, 0, 0, 24, 35, 89, 10,
+200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,232,152, 88, 10, 80, 84, 88, 10,208, 82, 88, 10,144, 83, 88, 10,144, 84, 88, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 93, 0, 0, 0,198, 3, 0, 0, 1, 1, 20, 4,106, 3, 1, 0, 0, 0, 0, 0,
+ 0, 0, 8, 0,232,105, 60, 9,120, 66, 89, 10,224, 84, 89, 10,168, 35, 89, 10,216, 61, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+128, 3, 81, 10, 56, 5, 81, 10, 68, 65, 84, 65,248, 0, 0, 0,168, 35, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,208, 36, 89, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,113, 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,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, 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, 19, 4, 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, 20, 4, 26, 0, 9, 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, 64,113, 60, 9,192,146, 84, 10,192,146, 84, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0,216, 5, 81, 10,184, 7, 81, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,208, 36, 89, 10,
+201, 0, 0, 0, 1, 0, 0, 0, 24, 58, 89, 10,168, 35, 89, 10, 0, 0, 0, 0, 0, 0, 32, 67, 0, 0, 30,196, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 15, 67, 0, 0, 30,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,119, 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,119, 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,120, 2,143, 0,120, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+159, 0, 0, 0, 79, 1, 0, 0,198, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,120, 2,
+ 10, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0,160, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,111, 60, 9,
+ 8, 52, 82, 9, 8, 52, 82, 9,248, 37, 89, 10,168, 56, 89, 10,176, 54, 85, 10, 24, 56, 85, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0,248, 37, 89, 10,199, 0, 0, 0, 1, 0, 0, 0,104, 39, 89, 10, 0, 0, 0, 0,144,184,170, 9,
+ 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, 42,254,143, 0,190, 1, 0, 0, 0, 0, 0, 0, 39, 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,104, 39, 89, 10,
+199, 0, 0, 0, 1, 0, 0, 0,216, 40, 89, 10,248, 37, 89, 10,224,234,170, 9, 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,211,254,143, 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, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,216, 40, 89, 10,199, 0, 0, 0, 1, 0, 0, 0, 72, 42, 89, 10,
+104, 39, 89, 10,248,238,170, 9, 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, 88,252,143, 0,213, 1, 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, 72, 42, 89, 10,199, 0, 0, 0, 1, 0, 0, 0,184, 43, 89, 10,216, 40, 89, 10, 0,247,170, 9, 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, 66,254,143, 0,121, 0, 0, 0, 0, 0, 4, 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,184, 43, 89, 10,199, 0, 0, 0,
+ 1, 0, 0, 0, 40, 45, 89, 10, 72, 42, 89, 10, 24,251,170, 9, 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,164,253,143, 0,231, 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, 40, 45, 89, 10,199, 0, 0, 0, 1, 0, 0, 0,152, 46, 89, 10,184, 43, 89, 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, 97,112,
+112,101, 97,114, 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, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95, 97,112,
+112,101, 97,114, 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, 65,112,112,101, 97,114, 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, 0, 96,253,143, 0,133, 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,
+152, 46, 89, 10,199, 0, 0, 0, 1, 0, 0, 0, 8, 48, 89, 10, 40, 45, 89, 10,232,242,170, 9, 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, 55,254,
+143, 0, 36, 0, 0, 0, 0, 0, 4, 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, 8, 48, 89, 10,199, 0, 0, 0, 1, 0, 0, 0,
+120, 49, 89, 10,152, 46, 89, 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,115,121,109,109,101,116,114,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, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116,
+ 95,115,121,109,109,101,116,114,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, 83,121,109,109,101,116,114,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, 52,253,143, 0,225, 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,120, 49, 89, 10,199, 0, 0, 0, 1, 0, 0, 0,232, 50, 89, 10, 8, 48, 89, 10, 8,255,170, 9,
+ 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,145,253,143, 0,132, 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,232, 50, 89, 10,
+199, 0, 0, 0, 1, 0, 0, 0, 88, 52, 89, 10,120, 49, 89, 10, 40, 3,171, 9, 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, 39,254,143, 0,124, 0,
+ 0, 0, 0, 0, 4, 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, 88, 52, 89, 10,199, 0, 0, 0, 1, 0, 0, 0,200, 53, 89, 10,
+232, 50, 89, 10, 64, 7,171, 9, 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,181,253,143, 0,190, 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,200, 53, 89, 10,199, 0, 0, 0, 1, 0, 0, 0, 56, 55, 89, 10, 88, 52, 89, 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,241,252,143, 0, 9, 1, 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, 56, 55, 89, 10,199, 0, 0, 0,
+ 1, 0, 0, 0,168, 56, 89, 10,200, 53, 89, 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,197,253,143, 0,146, 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,168, 56, 89, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 56, 55, 89, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,105,109, 97,103,101,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, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,105,109, 97,103,101,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, 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,146,253,143, 0, 80, 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,
+ 24, 58, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,176, 60, 89, 10,208, 36, 89, 10, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 90,195,
+ 0, 0, 0, 0, 0, 0, 0, 0,227,102, 16, 67, 24, 30, 90,195, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,
+215, 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,
+215, 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,216, 0,143, 0,216, 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, 78, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+160, 0,216, 0, 11, 0, 6, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+152,111, 60, 9, 16, 42, 84, 10, 16, 42, 84, 10, 64, 59, 89, 10, 64, 59, 89, 10,216, 56, 85, 10, 64, 58, 85, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 64, 59, 89, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 32,112, 60, 9, 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, 82,101,109,111,118,101, 32, 86,101,114,116,101,120, 32, 67,111,108,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, 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,
+176, 60, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,216, 61, 89, 10, 24, 58, 89, 10, 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,
+ 19, 4, 0, 0, 19, 4, 0, 0,119, 0, 0, 0,198, 3, 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,
+ 40,107, 60, 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, 68, 65, 84, 65,248, 0, 0, 0,216, 61, 89, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,176, 60, 89, 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,160, 0, 0, 0, 19, 4, 0, 0,119, 0, 0, 0,198, 3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,116, 3, 80, 3, 12, 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,160,106, 60, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+240, 68, 85, 10,120, 68, 85, 10, 0, 0, 0, 0, 0, 63, 89, 10, 68, 65, 84, 65, 72, 3, 0, 0, 0, 63, 89, 10,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,130,241,145, 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,158,210,111,193,
+ 0, 0,128, 63, 68,239,209, 62, 70,119,105, 63,192, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,144, 74, 70, 62,166, 33,101, 63,
+ 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 42, 61,228, 62, 0, 0, 0, 0,164, 95, 68, 65,141,120,173,192,225,208,213, 64,
+ 0, 0,128, 63,177,157,229, 62,212,134,234,190,222,160, 81,191,184,158, 81,191,115, 90,127, 63,152, 22, 98, 62, 9, 46,185, 62,
+ 35, 44,185, 62,143,180,109,188, 56,160,130, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,220,161,108, 65,
+158,210,111, 65,130,240,191, 62,105,116, 85, 63, 64,183, 70,188, 0, 0, 2,180, 25,103,180,190,101,233, 45, 62,215,245, 72, 63,
+ 0, 0,128, 50,230,117,117,194, 59,213,216, 65,167,161, 5,194,236,254,159,192,240, 49,114, 66,196,242,213,193,140,218, 3, 66,
+145, 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,158,210,111,193,
+ 0, 0,128, 63,177,157,229, 62,212,134,234,190,222,160, 81,191,184,158, 81,191,115, 90,127, 63,152, 22, 98, 62, 9, 46,185, 62,
+ 35, 44,185, 62,143,180,109,188, 56,160,130, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,220,161,108, 65,
+158,210,111, 65,204,210, 20, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,204,210, 20, 64, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,204,210, 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,158,210,111, 65,215,134, 91, 65, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1,144, 7, 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, 30, 33, 12, 66,
+ 85,152,137, 66,113, 27,126, 66, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,120, 66, 89, 10,160, 0, 0, 0, 1, 0, 0, 0,
+240, 69, 89, 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,208,245, 90, 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, 3, 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, 68, 65, 84, 65,248, 0, 0, 0,
+160, 67, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,200, 68, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 48, 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,197, 68, 0, 0,200, 65, 0,224,197, 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, 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, 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, 68, 65, 84, 65,248, 0, 0, 0,200, 68, 89, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,160, 67, 89, 10,
+ 0, 0, 0, 0, 0,128,241, 67, 0,128, 90,196, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,195, 68, 0, 64,111,196, 0, 0, 0, 0,
+ 31, 6, 0, 0, 48, 6, 0, 0, 18, 0, 0, 0,206, 3, 0, 0, 0, 0, 0, 0, 30, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0, 30, 6, 0, 0, 18, 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,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0, 48, 6,207, 3, 31, 6,189, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 6,207, 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, 68, 65, 84, 65,252, 0, 0, 0,240, 69, 89, 10,169, 0, 0, 0,
+ 1, 0, 0, 0, 96,241, 89, 10,120, 66, 89, 10,160, 67, 89, 10,200, 68, 89, 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,
+ 8,140, 79, 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, 11, 0, 1, 0, 0, 0,
+ 68, 65, 84, 65, 12, 0, 0, 0, 8,140, 79, 9,224, 0, 0, 0, 1, 0, 0, 0, 93, 0, 0, 0, 93, 0, 0, 0, 24, 71, 89, 10,
+ 68, 65, 84, 65, 92, 4, 0, 0, 24, 71, 89, 10,223, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 10,
+ 19, 0, 0, 0, 1, 0, 0, 0, 16,228, 90, 10, 20, 0, 0, 0, 1, 0, 0, 0, 16,228, 90, 10, 21, 0, 0, 0, 1, 0, 0, 0,
+ 16,228, 90, 10, 0, 0, 0, 0, 1, 0, 0, 0,224,243, 90, 10, 0, 0, 0, 0, 1, 0, 0, 0,152,250, 90, 10, 0, 0, 0, 0,
+ 1, 0, 0, 0,240, 74, 92, 10, 0, 0, 0, 0, 1, 0, 0, 0, 40, 4, 91, 10, 0, 0, 0, 0, 1, 0, 0, 0,224,168, 91, 10,
+ 0, 0, 0, 0, 1, 0, 0, 0, 96,255, 90, 10, 0, 0, 0, 0, 1, 0, 0, 0,112,240, 90, 10, 0, 0, 0, 0, 1, 0, 0, 0,
+208,245, 90, 10, 0, 0, 0, 0, 1, 0, 0, 0,216,239, 90, 10, 30, 0,255,255, 0, 0, 1, 0, 0, 0, 0, 0, 31, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 8, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 31, 0, 11, 0, 0, 0, 1, 0, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 16, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 24, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255,
+ 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
+ 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255,
+ 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 3, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 31, 0, 6, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 11, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 31, 0, 14, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 19, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 31, 0, 22, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 27, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 31, 0, 30, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,160, 75, 89, 10,201, 0, 0, 0,
+ 1, 0, 0, 0,200, 76, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67, 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,197, 68,
+ 0, 0,200, 65, 0,224,197, 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, 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, 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, 68, 65, 84, 65,
+248, 0, 0, 0,200, 76, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,240, 77, 89, 10,160, 75, 89, 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,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, 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, 68, 65, 84, 65,248, 0, 0, 0,240, 77, 89, 10,201, 0, 0, 0, 1, 0, 0, 0, 24, 79, 89, 10,
+200, 76, 89, 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, 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, 7, 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, 68, 65, 84, 65,248, 0, 0, 0, 24, 79, 89, 10,
+201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240, 77, 89, 10, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 38,192, 0, 0,102, 64, 0,192,179,191, 0,224, 25, 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, 48, 6, 0, 0, 0, 0, 0, 0,207, 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,
+ 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, 48, 6,207, 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,
+ 68, 65, 84, 65, 24, 33, 0, 0, 96,241, 89, 10,170, 0, 0, 0, 1, 0, 0, 0,224, 84, 89, 10,240, 69, 89, 10,160, 75, 89, 10,
+ 24, 79, 89, 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, 1, 0, 0, 0, 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,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, 68, 65, 84, 65,248, 0, 0, 0, 64, 80, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,
+104, 81, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 32,209, 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,136, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0,209, 68, 0, 0,200, 65,
+ 0, 0,209, 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,137, 6,
+ 26, 0,137, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 6, 0, 0,149, 3, 0, 0,
+174, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,137, 6, 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, 68, 65, 84, 65,248, 0, 0, 0,
+104, 81, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,144, 82, 89, 10, 64, 80, 89, 10, 0, 0, 0, 0, 0, 0,112, 67, 0, 64,101,196,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 67, 0, 64,101,196, 0, 0, 0, 0,223, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 0,
+148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 0, 0, 0, 0, 0, 0, 0,
+148, 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,240, 0,149, 3,223, 0,149, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+240, 0,149, 3, 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, 68, 65, 84, 65,248, 0, 0, 0,144, 82, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,184, 83, 89, 10,104, 81, 89, 10,
+ 0, 0, 0, 0, 0, 32,179, 68, 0, 0, 0, 0, 0, 0,112, 66, 0, 0, 0, 0, 0, 32,179, 68, 0, 0, 0, 0, 0, 0,112, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,152, 5, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0,179, 68, 0, 0,108, 66, 0, 0,179, 68, 0, 0,108, 66,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,153, 5, 60, 0,153, 5, 60, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0,136, 6, 0, 0, 89, 3, 0, 0,148, 3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 5, 60, 0, 0, 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, 68, 65, 84, 65,248, 0, 0, 0,184, 83, 89, 10,201, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,144, 82, 89, 10, 0, 0, 0, 0, 0,128,175, 68, 0, 0,137,195, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,177, 68, 0, 64, 86,196, 0, 0, 0, 0,136, 5, 0, 0,153, 5, 0, 0, 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0,
+135, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,135, 5, 0, 0, 0, 0, 0, 0, 88, 3, 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, 2, 0, 3, 3, 2, 0, 0, 4,
+ 6, 0,153, 5, 89, 3,136, 5, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0,136, 6, 0, 0,
+ 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 5, 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, 68, 65, 84, 65,
+ 60, 0, 0, 0,224, 84, 89, 10,168, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96,241, 89, 10, 64, 80, 89, 10,184, 83, 89, 10,
+ 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, 5, 0,255,255,255,255, 0, 0, 83, 78, 0, 0,140, 0, 0, 0,168, 85, 89, 10,196, 0, 0, 0, 1, 0, 0, 0,
+248, 63, 90, 10, 24, 81, 88, 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, 96, 86, 89, 10,160, 89, 89, 10,224, 89, 89, 10,
+128, 95, 89, 10,200, 95, 89, 10,184, 58, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 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, 86, 89, 10,197, 0, 0, 0, 1, 0, 0, 0,
+160, 86, 89, 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, 86, 89, 10,
+197, 0, 0, 0, 1, 0, 0, 0,224, 86, 89, 10, 96, 86, 89, 10, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0,224, 86, 89, 10,197, 0, 0, 0, 1, 0, 0, 0, 32, 87, 89, 10,160, 86, 89, 10, 0, 0, 0, 0,118, 7, 97, 4,
+ 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 32, 87, 89, 10,197, 0, 0, 0, 1, 0, 0, 0, 96, 87, 89, 10,224, 86, 89, 10,
+ 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96, 87, 89, 10,197, 0, 0, 0, 1, 0, 0, 0,
+160, 87, 89, 10, 32, 87, 89, 10, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160, 87, 89, 10,
+197, 0, 0, 0, 1, 0, 0, 0,224, 87, 89, 10, 96, 87, 89, 10, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0,224, 87, 89, 10,197, 0, 0, 0, 1, 0, 0, 0, 32, 88, 89, 10,160, 87, 89, 10, 0, 0, 0, 0, 0, 0,172, 1,
+ 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 32, 88, 89, 10,197, 0, 0, 0, 1, 0, 0, 0, 96, 88, 89, 10,224, 87, 89, 10,
+ 0, 0, 0, 0, 24, 6,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96, 88, 89, 10,197, 0, 0, 0, 1, 0, 0, 0,
+160, 88, 89, 10, 32, 88, 89, 10, 0, 0, 0, 0, 24, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160, 88, 89, 10,
+197, 0, 0, 0, 1, 0, 0, 0,224, 88, 89, 10, 96, 88, 89, 10, 0, 0, 0, 0,118, 7,172, 1, 0, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0,224, 88, 89, 10,197, 0, 0, 0, 1, 0, 0, 0, 32, 89, 89, 10,160, 88, 89, 10, 0, 0, 0, 0, 56, 5,172, 1,
+ 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 32, 89, 89, 10,197, 0, 0, 0, 1, 0, 0, 0, 96, 89, 89, 10,224, 88, 89, 10,
+ 0, 0, 0, 0, 56, 5, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96, 89, 89, 10,197, 0, 0, 0, 1, 0, 0, 0,
+160, 89, 89, 10, 32, 89, 89, 10, 0, 0, 0, 0, 64, 1,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160, 89, 89, 10,
+197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96, 89, 89, 10, 0, 0, 0, 0, 64, 1, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0,224, 89, 89, 10,198, 0, 0, 0, 1, 0, 0, 0, 40, 90, 89, 10, 0, 0, 0, 0,160, 86, 89, 10,224, 86, 89, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 40, 90, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,112, 90, 89, 10,
+224, 89, 89, 10,160, 86, 89, 10, 96, 87, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112, 90, 89, 10,
+198, 0, 0, 0, 1, 0, 0, 0,184, 90, 89, 10, 40, 90, 89, 10,224, 86, 89, 10,160, 87, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0,184, 90, 89, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 91, 89, 10,112, 90, 89, 10, 96, 87, 89, 10,
+160, 87, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 0, 91, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,
+ 72, 91, 89, 10,184, 90, 89, 10, 96, 87, 89, 10,224, 87, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+ 72, 91, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,144, 91, 89, 10, 0, 91, 89, 10,224, 87, 89, 10, 32, 88, 89, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,144, 91, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,216, 91, 89, 10, 72, 91, 89, 10,
+ 32, 87, 89, 10, 96, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,216, 91, 89, 10,198, 0, 0, 0,
+ 1, 0, 0, 0, 32, 92, 89, 10,144, 91, 89, 10, 32, 88, 89, 10, 96, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0, 32, 92, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,104, 92, 89, 10,216, 91, 89, 10, 96, 86, 89, 10,224, 87, 89, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,104, 92, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,176, 92, 89, 10,
+ 32, 92, 89, 10, 96, 86, 89, 10, 96, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,176, 92, 89, 10,
+198, 0, 0, 0, 1, 0, 0, 0,248, 92, 89, 10,104, 92, 89, 10,160, 87, 89, 10,160, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0,248, 92, 89, 10,198, 0, 0, 0, 1, 0, 0, 0, 64, 93, 89, 10,176, 92, 89, 10, 32, 87, 89, 10,
+160, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 64, 93, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,
+136, 93, 89, 10,248, 92, 89, 10, 32, 88, 89, 10,160, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+136, 93, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,208, 93, 89, 10, 64, 93, 89, 10,224, 88, 89, 10, 32, 89, 89, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,208, 93, 89, 10,198, 0, 0, 0, 1, 0, 0, 0, 24, 94, 89, 10,136, 93, 89, 10,
+160, 87, 89, 10, 32, 89, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 24, 94, 89, 10,198, 0, 0, 0,
+ 1, 0, 0, 0, 96, 94, 89, 10,208, 93, 89, 10,160, 88, 89, 10,224, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0, 96, 94, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,168, 94, 89, 10, 24, 94, 89, 10,224, 87, 89, 10, 96, 89, 89, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,168, 94, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,240, 94, 89, 10,
+ 96, 94, 89, 10,224, 88, 89, 10, 96, 89, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,240, 94, 89, 10,
+198, 0, 0, 0, 1, 0, 0, 0, 56, 95, 89, 10,168, 94, 89, 10, 96, 87, 89, 10,160, 89, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0, 56, 95, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,128, 95, 89, 10,240, 94, 89, 10, 32, 89, 89, 10,
+160, 89, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,128, 95, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 56, 95, 89, 10, 96, 89, 89, 10,160, 89, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,
+200, 95, 89, 10,200, 0, 0, 0, 1, 0, 0, 0,168, 98, 89, 10, 0, 0, 0, 0, 96, 87, 89, 10,160, 86, 89, 10,224, 86, 89, 10,
+160, 87, 89, 10, 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, 0, 0, 0, 0,152, 63, 90, 10,152, 63, 90, 10, 88, 96, 89, 10,128, 97, 89, 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, 88, 96, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,
+128, 97, 89, 10, 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,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, 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, 68, 65, 84, 65,248, 0, 0, 0,
+128, 97, 89, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88, 96, 89, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 98, 89, 10,200, 0, 0, 0, 1, 0, 0, 0,240, 36, 90, 10,200, 95, 89, 10,
+ 96, 88, 89, 10, 32, 88, 89, 10,160, 88, 89, 10, 32, 87, 89, 10, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,
+171, 1, 0, 0, 4, 4, 94, 1,172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 35, 90, 10,232, 35, 90, 10,
+ 56, 99, 89, 10, 96,100, 89, 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, 99, 89, 10,201, 0, 0, 0, 1, 0, 0, 0, 96,100, 89, 10, 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,175, 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, 93, 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, 94, 1, 31, 0, 94, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 25, 6, 0, 0,118, 7, 0, 0,141, 1, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 94, 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, 68, 65, 84, 65,248, 0, 0, 0, 96,100, 89, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 56, 99, 89, 10,
+ 0, 0, 0, 0, 0,128,174, 67, 0,128, 86,196, 0, 0, 0, 0, 0, 0, 0, 0,255,127,166, 67,255,127,198,195, 0, 0, 0, 0,
+ 77, 1, 0, 0, 94, 1, 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0,140, 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, 94, 1,141, 1, 77, 1,141, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 18, 90, 10,120, 34, 90, 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, 18, 90, 10,199, 0, 0, 0,
+ 1, 0, 0, 0, 24, 20, 90, 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, 76, 1, 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, 24, 20, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,136, 21, 90, 10,168, 18, 90, 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, 76, 1, 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,
+136, 21, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,248, 22, 90, 10, 24, 20, 90, 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,
+ 76, 1, 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,248, 22, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,
+104, 24, 90, 10,136, 21, 90, 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, 76, 1,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,104, 24, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,216, 25, 90, 10,248, 22, 90, 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, 76, 1, 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,216, 25, 90, 10,
+199, 0, 0, 0, 1, 0, 0, 0, 72, 27, 90, 10,104, 24, 90, 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, 76, 1, 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, 72, 27, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,184, 28, 90, 10,
+216, 25, 90, 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, 76, 1,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,184, 28, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 40, 30, 90, 10, 72, 27, 90, 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, 10,253, 76, 1,130, 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, 40, 30, 90, 10,199, 0, 0, 0,
+ 1, 0, 0, 0,152, 31, 90, 10,184, 28, 90, 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,242,252, 76, 1, 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,152, 31, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 8, 33, 90, 10, 40, 30, 90, 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,218,252, 76, 1, 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,
+ 8, 33, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,120, 34, 90, 10,152, 31, 90, 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,194,252,
+ 76, 1, 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,120, 34, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 8, 33, 90, 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,170,252, 76, 1, 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,216, 0, 0, 0,232, 35, 90, 10,165, 0, 0, 0, 1, 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, 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, 96, 0, 0, 0,240, 36, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,
+200, 42, 90, 10,168, 98, 89, 10, 96, 86, 89, 10,224, 87, 89, 10, 32, 88, 89, 10, 96, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 23, 6, 0, 0, 0, 0, 0, 0,171, 1, 0, 0, 17, 17, 24, 6,172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+104, 42, 90, 10,104, 42, 90, 10,128, 37, 90, 10, 64, 41, 90, 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, 37, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,168, 38, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,151, 67, 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,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, 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, 23, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168, 38, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
+ 64, 41, 90, 10,128, 37, 90, 10, 0, 0, 0, 0, 0, 0, 92, 67, 0, 0,201,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 67,
+ 0, 0,201,195, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,145, 1, 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,145, 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,220, 0,
+146, 1,203, 0,146, 1, 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,
+171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0,146, 1, 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,
+208, 39, 90, 10,208, 39, 90, 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,
+208, 39, 90, 10,199, 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, 64, 41, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,168, 38, 90, 10, 0, 0, 0, 0, 0, 0,160, 68, 0, 0, 0, 0, 0, 0,112, 67, 0, 80, 31,195, 0,234,179, 68,
+ 1, 0,224,194, 0, 0,176, 67, 43, 5, 0, 0, 60, 5, 0, 0, 18, 0, 0, 0,145, 1, 0, 0, 0, 0, 0, 0, 42, 5, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 42, 5, 0, 0, 18, 0, 0, 0,145, 1, 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, 60, 5,
+146, 1, 43, 5,128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0, 23, 6, 0, 0, 26, 0, 0, 0,
+171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 5,146, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,
+104, 42, 90, 10,178, 0, 0, 0, 1, 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,
+ 68, 65, 84, 65, 96, 0, 0, 0,200, 42, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,136,101, 89, 10,240, 36, 90, 10,224, 88, 89, 10,
+ 32, 89, 89, 10,160, 87, 89, 10,160, 88, 89, 10, 0, 0, 0, 0, 57, 5, 0, 0,118, 7, 0, 0,173, 1, 0, 0, 69, 4, 0, 0,
+ 9, 9, 62, 2,153, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 45, 90, 10,168, 45, 90, 10, 88, 43, 90, 10,
+128, 44, 90, 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, 88, 43, 90, 10,
+201, 0, 0, 0, 1, 0, 0, 0,128, 44, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,210, 67, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0,128, 15, 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, 61, 2, 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, 62, 2, 26, 0, 62, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 5, 0, 0,
+118, 7, 0, 0,173, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 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,
+ 68, 65, 84, 65,248, 0, 0, 0,128, 44, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88, 43, 90, 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, 78,176, 16, 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,
+ 61, 2, 0, 0, 0, 0, 0, 0,126, 2, 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, 62, 2,127, 2, 62, 2,127, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 57, 5, 0, 0,118, 7, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 62, 2,127, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,168, 45, 90, 10,172, 0, 0, 0, 1, 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, 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,
+ 96, 0, 0, 0,136,101, 89, 10,200, 0, 0, 0, 1, 0, 0, 0,184, 58, 90, 10,200, 42, 90, 10, 96, 89, 89, 10,160, 89, 89, 10,
+ 32, 89, 89, 10,224, 88, 89, 10, 0, 0, 0, 0, 65, 1, 0, 0, 55, 5, 0, 0,173, 1, 0, 0, 69, 4, 0, 0, 1, 1,247, 3,
+153, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 57, 90, 10,144, 57, 90, 10, 80, 48, 90, 10,240, 52, 90, 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, 80, 48, 90, 10,201, 0, 0, 0,
+ 1, 0, 0, 0,120, 49, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
+ 0,192,125, 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,246, 3, 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,247, 3, 26, 0,247, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 1, 0, 0, 55, 5, 0, 0,
+173, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+248, 0, 0, 0,120, 49, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,160, 50, 90, 10, 80, 48, 90, 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, 65, 1, 0, 0, 65, 1, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0,127, 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, 68, 65, 84, 65,248, 0, 0, 0,160, 50, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,200, 51, 90, 10,
+120, 49, 90, 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, 65, 1, 0, 0, 55, 5, 0, 0,199, 1, 0, 0,199, 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, 68, 65, 84, 65,248, 0, 0, 0,200, 51, 90, 10,
+201, 0, 0, 0, 1, 0, 0, 0,240, 52, 90, 10,160, 50, 90, 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, 55, 5, 0, 0,
+ 55, 5, 0, 0,199, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 52, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,200, 51, 90, 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, 65, 1, 0, 0, 55, 5, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,247, 3,127, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 54, 90, 10, 68, 65, 84, 65, 72, 3, 0, 0, 24, 54, 90, 10,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, 41, 49,123, 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,128, 0, 0, 0,128, 0, 0, 0,128, 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, 41, 49,123, 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, 51,115,130, 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, 41, 49,123, 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,
+240, 11, 81, 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,144, 57, 90, 10,160, 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, 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,208,245, 90, 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, 3, 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, 96, 0, 0, 0,184, 58, 90, 10,
+200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136,101, 89, 10,224, 87, 89, 10, 96, 87, 89, 10,160, 89, 89, 10, 96, 89, 89, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0,173, 1, 0, 0, 69, 4, 0, 0, 3, 3, 64, 1,153, 2, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,152, 61, 90, 10,152, 61, 90, 10, 72, 59, 90, 10,112, 60, 90, 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, 59, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,112, 60, 90, 10,
+ 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,160, 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, 63, 1, 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, 64, 1, 26, 0, 64, 1,
+ 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0,173, 1, 0, 0,198, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 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, 68, 65, 84, 65,248, 0, 0, 0,112, 60, 90, 10,
+201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 72, 59, 90, 10, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,128,151, 67, 0, 64, 27,196, 0, 0, 0, 0, 47, 1, 0, 0, 64, 1, 0, 0, 18, 0, 0, 0,126, 2, 0, 0,
+ 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 46, 1, 0, 0, 18, 0, 0, 0,126, 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, 18, 6, 0, 0, 2, 0, 3, 3,
+ 0, 0, 0, 4, 6, 0, 64, 1,127, 2, 47, 1,109, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63, 1, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1,127, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,252, 0, 0, 0,152, 61, 90, 10,169, 0, 0, 0, 1, 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,173, 79, 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, 1, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0, 0,173, 79, 9,224, 0, 0, 0,
+ 1, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0,192, 62, 90, 10, 68, 65, 84, 65,168, 0, 0, 0,192, 62, 90, 10,223, 0, 0, 0,
+ 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 16,228, 90, 10, 19, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 20, 0, 0, 0,
+ 1, 0, 1, 0, 16,228, 90, 10, 21, 0, 1, 0, 1, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,224,243, 90, 10,
+ 0, 0, 0, 0, 1, 0, 1, 0,152,250, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,240, 74, 92, 10, 0, 0, 0, 0, 1, 0, 1, 0,
+ 40, 4, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0,224,168, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0, 96,255, 90, 10, 0, 0, 0, 0,
+ 1, 0, 1, 0,112,240, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,208,245, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,216,239, 90, 10,
+ 21, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 83, 78, 0, 0,140, 0, 0, 0,248, 63, 90, 10,196, 0, 0, 0, 1, 0, 0, 0,
+ 64,130, 90, 10,168, 85, 89, 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,176, 64, 90, 10, 48, 68, 90, 10,112, 68, 90, 10,
+160, 74, 90, 10,232, 74, 90, 10, 88,124, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 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,176, 64, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,
+240, 64, 90, 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,240, 64, 90, 10,
+197, 0, 0, 0, 1, 0, 0, 0, 48, 65, 90, 10,176, 64, 90, 10, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0, 48, 65, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,112, 65, 90, 10,240, 64, 90, 10, 0, 0, 0, 0,118, 7, 97, 4,
+ 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,112, 65, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,176, 65, 90, 10, 48, 65, 90, 10,
+ 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,176, 65, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,
+240, 65, 90, 10,112, 65, 90, 10, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,240, 65, 90, 10,
+197, 0, 0, 0, 1, 0, 0, 0, 48, 66, 90, 10,176, 65, 90, 10, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0, 48, 66, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,112, 66, 90, 10,240, 65, 90, 10, 0, 0, 0, 0,232, 5, 70, 4,
+ 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,112, 66, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,176, 66, 90, 10, 48, 66, 90, 10,
+ 0, 0, 0, 0,232, 5, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,176, 66, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,
+240, 66, 90, 10,112, 66, 90, 10, 0, 0, 0, 0, 0, 0,184, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,240, 66, 90, 10,
+197, 0, 0, 0, 1, 0, 0, 0, 48, 67, 90, 10,176, 66, 90, 10, 0, 0, 0, 0,232, 5,184, 1, 0, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0, 48, 67, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,112, 67, 90, 10,240, 66, 90, 10, 0, 0, 0, 0,244, 2, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,112, 67, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,176, 67, 90, 10, 48, 67, 90, 10,
+ 0, 0, 0, 0,244, 2,184, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,176, 67, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,
+240, 67, 90, 10,112, 67, 90, 10, 0, 0, 0, 0,232, 5, 44, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,240, 67, 90, 10,
+197, 0, 0, 0, 1, 0, 0, 0, 48, 68, 90, 10,176, 67, 90, 10, 0, 0, 0, 0,118, 7, 44, 3, 0, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0, 48, 68, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240, 67, 90, 10, 0, 0, 0, 0,244, 2, 70, 4,
+ 1, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112, 68, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,184, 68, 90, 10, 0, 0, 0, 0,
+240, 64, 90, 10, 48, 65, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,184, 68, 90, 10,198, 0, 0, 0,
+ 1, 0, 0, 0, 0, 69, 90, 10,112, 68, 90, 10,240, 64, 90, 10,176, 65, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0, 0, 69, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 72, 69, 90, 10,184, 68, 90, 10, 48, 65, 90, 10,240, 65, 90, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 72, 69, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,144, 69, 90, 10,
+ 0, 69, 90, 10,176, 65, 90, 10,240, 65, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,144, 69, 90, 10,
+198, 0, 0, 0, 1, 0, 0, 0,216, 69, 90, 10, 72, 69, 90, 10,240, 65, 90, 10, 48, 66, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0,216, 69, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 32, 70, 90, 10,144, 69, 90, 10,112, 65, 90, 10,
+112, 66, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 32, 70, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,
+104, 70, 90, 10,216, 69, 90, 10,176, 64, 90, 10,176, 66, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+104, 70, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,176, 70, 90, 10, 32, 70, 90, 10,176, 65, 90, 10,176, 66, 90, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,176, 70, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,248, 70, 90, 10,104, 70, 90, 10,
+ 48, 66, 90, 10,240, 66, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,248, 70, 90, 10,198, 0, 0, 0,
+ 1, 0, 0, 0, 64, 71, 90, 10,176, 70, 90, 10,112, 66, 90, 10,240, 66, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0, 64, 71, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,136, 71, 90, 10,248, 70, 90, 10,176, 64, 90, 10, 48, 67, 90, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,136, 71, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,208, 71, 90, 10,
+ 64, 71, 90, 10,112, 66, 90, 10, 48, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,208, 71, 90, 10,
+198, 0, 0, 0, 1, 0, 0, 0, 24, 72, 90, 10,136, 71, 90, 10,176, 66, 90, 10,112, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0, 24, 72, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 96, 72, 90, 10,208, 71, 90, 10,240, 66, 90, 10,
+112, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 96, 72, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,
+168, 72, 90, 10, 24, 72, 90, 10, 48, 67, 90, 10,112, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+168, 72, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,240, 72, 90, 10, 96, 72, 90, 10,112, 66, 90, 10,176, 67, 90, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,240, 72, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 56, 73, 90, 10,168, 72, 90, 10,
+ 48, 66, 90, 10,176, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 56, 73, 90, 10,198, 0, 0, 0,
+ 1, 0, 0, 0,128, 73, 90, 10,240, 72, 90, 10,240, 65, 90, 10,240, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0,128, 73, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,200, 73, 90, 10, 56, 73, 90, 10,112, 65, 90, 10,240, 67, 90, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,200, 73, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 16, 74, 90, 10,
+128, 73, 90, 10,176, 67, 90, 10,240, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 16, 74, 90, 10,
+198, 0, 0, 0, 1, 0, 0, 0, 88, 74, 90, 10,200, 73, 90, 10,176, 65, 90, 10, 48, 68, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0, 88, 74, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,160, 74, 90, 10, 16, 74, 90, 10, 48, 66, 90, 10,
+ 48, 68, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,160, 74, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 88, 74, 90, 10,112, 67, 90, 10, 48, 68, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,
+232, 74, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,200, 77, 90, 10, 0, 0, 0, 0,176, 65, 90, 10,240, 64, 90, 10, 48, 65, 90, 10,
+240, 65, 90, 10, 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, 0, 0, 0, 0,224,129, 90, 10,224,129, 90, 10,120, 75, 90, 10,160, 76, 90, 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, 75, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
+160, 76, 90, 10, 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,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, 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, 68, 65, 84, 65,248, 0, 0, 0,
+160, 76, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,120, 75, 90, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,200, 77, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,240, 98, 90, 10,232, 74, 90, 10,
+112, 66, 90, 10,176, 67, 90, 10,240, 67, 90, 10,112, 65, 90, 10, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,
+ 43, 3, 0, 0, 4, 4,142, 1, 44, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 97, 90, 10,232, 97, 90, 10,
+ 88, 78, 90, 10,128, 79, 90, 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,
+ 88, 78, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,128, 79, 90, 10, 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,199, 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,141, 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,142, 1, 31, 0,142, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+233, 5, 0, 0,118, 7, 0, 0, 13, 3, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+142, 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, 68, 65, 84, 65,248, 0, 0, 0,128, 79, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88, 78, 90, 10,
+ 0, 0, 0, 0, 0,128,198, 67, 0,128, 86,196, 0, 0, 0, 0, 0, 0, 0, 0,254,127,190, 67,254, 63, 67,196, 0, 0, 0, 0,
+125, 1, 0, 0,142, 1, 0, 0, 0, 0, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0,126, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 12, 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, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,142, 1, 13, 3,125, 1, 13, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 1, 13, 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,168, 80, 90, 10,120, 96, 90, 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, 80, 90, 10,199, 0, 0, 0,
+ 1, 0, 0, 0, 24, 82, 90, 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,124, 1, 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, 24, 82, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,136, 83, 90, 10,168, 80, 90, 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,124, 1, 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,
+136, 83, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,248, 84, 90, 10, 24, 82, 90, 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,
+124, 1, 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,248, 84, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,
+104, 86, 90, 10,136, 83, 90, 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,124, 1,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,104, 86, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,216, 87, 90, 10,248, 84, 90, 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,124, 1, 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,216, 87, 90, 10,
+199, 0, 0, 0, 1, 0, 0, 0, 72, 89, 90, 10,104, 86, 90, 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,124, 1, 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, 72, 89, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,184, 90, 90, 10,
+216, 87, 90, 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,124, 1,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,184, 90, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 40, 92, 90, 10, 72, 89, 90, 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, 10,253,124, 1,130, 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, 40, 92, 90, 10,199, 0, 0, 0,
+ 1, 0, 0, 0,152, 93, 90, 10,184, 90, 90, 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,242,252,124, 1, 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,152, 93, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 8, 95, 90, 10, 40, 92, 90, 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,218,252,124, 1, 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,
+ 8, 95, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,120, 96, 90, 10,152, 93, 90, 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,194,252,
+124, 1, 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,120, 96, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 8, 95, 90, 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,170,252,124, 1, 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,216, 0, 0, 0,232, 97, 90, 10,165, 0, 0, 0, 1, 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, 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, 96, 0, 0, 0,240, 98, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,
+184,103, 90, 10,200, 77, 90, 10, 48, 67, 90, 10,112, 67, 90, 10,240, 66, 90, 10,112, 66, 90, 10, 0, 0, 0, 0,245, 2, 0, 0,
+231, 5, 0, 0, 0, 0, 0, 0,183, 1, 0, 0, 18, 18,243, 2,184, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 24,102, 90, 10, 24,102, 90, 10,128, 99, 90, 10,168,100, 90, 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, 99, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,168,100, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,192, 77, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 60, 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,
+242, 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,243, 2, 26, 0,243, 2, 26, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,231, 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,243, 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, 68, 65, 84, 65,248, 0, 0, 0,168,100, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,128, 99, 90, 10, 0, 0, 0, 0, 0,128, 60, 68, 0, 0, 0, 0, 0, 0, 48, 65, 0, 0, 0, 0, 0,128, 56, 68,
+ 0, 0, 0, 0, 0, 0,207, 67,226, 2, 0, 0,243, 2, 0, 0, 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,225, 2, 0, 0, 0, 0, 0, 0,157, 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,243, 2,
+158, 1,226, 2,158, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0, 26, 0, 0, 0,
+183, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2,158, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 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,
+208,101, 90, 10,180, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,208,142, 85, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,208,142, 85, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,112, 1, 0, 0, 24,102, 90, 10,181, 0, 0, 0, 1, 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,208,101, 90, 10,208,101, 90, 10, 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, 96, 0, 0, 0,184,103, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,176,114, 90, 10,240, 98, 90, 10,
+112, 67, 90, 10, 48, 68, 90, 10, 48, 66, 90, 10,240, 66, 90, 10, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0,185, 1, 0, 0,
+ 69, 4, 0, 0, 1, 1,243, 2,141, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,113, 90, 10,136,113, 90, 10,
+ 72,104, 90, 10,232,108, 90, 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,104, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,112,105, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0,
+ 0, 0,208, 65, 0, 0, 0, 0, 0,192, 60, 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,242, 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,243, 2, 26, 0,243, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+245, 2, 0, 0,231, 5, 0, 0,185, 1, 0, 0,210, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+243, 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, 68, 65, 84, 65,248, 0, 0, 0,112,105, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,152,106, 90, 10, 72,104, 90, 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,245, 2, 0, 0,245, 2, 0, 0,211, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,115, 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, 68, 65, 84, 65,248, 0, 0, 0,152,106, 90, 10,201, 0, 0, 0,
+ 1, 0, 0, 0,192,107, 90, 10,112,105, 90, 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,245, 2, 0, 0,231, 5, 0, 0,
+211, 1, 0, 0,211, 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, 68, 65, 84, 65,
+248, 0, 0, 0,192,107, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,232,108, 90, 10,152,106, 90, 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,231, 5, 0, 0,231, 5, 0, 0,211, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,108, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+192,107, 90, 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,245, 2, 0, 0,231, 5, 0, 0,211, 1, 0, 0, 69, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2,115, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,110, 90, 10, 68, 65, 84, 65, 72, 3, 0, 0, 16,110, 90, 10,
+159, 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,159,148,168, 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,180,157,229, 62,180,115, 7,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 12,148,130, 62,
+ 9, 46,185, 62, 35, 44,185, 62,147,180,109,188, 27,227,150, 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,116,234,191, 62,189,117, 85, 63,128, 32, 71,188, 0, 64,130,182,126, 42,156,190, 75,140, 22, 62,
+123,250, 45, 63, 0, 0, 2, 54,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,180,115, 7,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 12,148,130, 62,
+ 9, 46,185, 62, 35, 44,185, 62,147,180,109,188, 27,227,150, 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,143,185, 30, 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,136,113, 90, 10,160, 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, 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,208,245, 90, 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, 3, 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,
+ 96, 0, 0, 0,176,114, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,120,119, 90, 10,184,103, 90, 10,176, 64, 90, 10,176, 66, 90, 10,
+112, 67, 90, 10, 48, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0, 0, 0, 0, 0,183, 1, 0, 0, 18, 18,244, 2,
+184, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,117, 90, 10,216,117, 90, 10, 64,115, 90, 10,104,116, 90, 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, 64,115, 90, 10,201, 0, 0, 0,
+ 1, 0, 0, 0,104,116, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
+ 0, 0, 61, 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,243, 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,244, 2, 26, 0,244, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 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,244, 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, 68, 65, 84, 65,
+248, 0, 0, 0,104,116, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64,115, 90, 10, 0, 0, 0, 0, 0,192, 60, 68,
+ 0, 0, 0, 0, 0, 0, 65, 67, 0, 0, 0, 0, 0,192, 56, 68, 0, 0, 0, 0, 0, 0,207, 67,227, 2, 0, 0,244, 2, 0, 0,
+ 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 2, 0, 0,
+ 0, 0, 0, 0,157, 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,244, 2,158, 1,227, 2,158, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0, 26, 0, 0, 0,183, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,244, 2,158, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,144,117, 90, 10,180, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,112, 60, 44, 9, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,
+112, 60, 44, 9, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,112, 1, 0, 0,216,117, 90, 10,181, 0, 0, 0,
+ 1, 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,144,117, 90, 10,144,117, 90, 10, 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, 96, 0, 0, 0,120,119, 90, 10,
+200, 0, 0, 0, 1, 0, 0, 0, 88,124, 90, 10,176,114, 90, 10,176, 67, 90, 10, 48, 66, 90, 10,240, 65, 90, 10,240, 67, 90, 10,
+ 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 45, 3, 0, 0, 69, 4, 0, 0, 3, 3,142, 1, 25, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 88,122, 90, 10, 88,122, 90, 10, 8,120, 90, 10, 48,121, 90, 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,120, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 48,121, 90, 10,
+ 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,199, 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,141, 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,142, 1, 26, 0,142, 1,
+ 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 45, 3, 0, 0, 70, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 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, 68, 65, 84, 65,248, 0, 0, 0, 48,121, 90, 10,
+201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8,120, 90, 10, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,128,190, 67, 0, 0,109,195, 0, 0, 0, 0,125, 1, 0, 0,142, 1, 0, 0, 18, 0, 0, 0,254, 0, 0, 0,
+ 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 18, 0, 0, 0,254, 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,142, 1,255, 0,125, 1,237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,
+118, 7, 0, 0, 71, 3, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 1,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,
+ 68, 65, 84, 65,252, 0, 0, 0, 88,122, 90, 10,169, 0, 0, 0, 1, 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,184, 16, 55, 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,184, 16, 55, 10,224, 0, 0, 0,
+ 1, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0,128,123, 90, 10, 68, 65, 84, 65,168, 0, 0, 0,128,123, 90, 10,223, 0, 0, 0,
+ 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 16,228, 90, 10, 19, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 20, 0, 0, 0,
+ 1, 0, 1, 0, 16,228, 90, 10, 21, 0, 1, 0, 1, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,224,243, 90, 10,
+ 0, 0, 0, 0, 1, 0, 1, 0,152,250, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,240, 74, 92, 10, 0, 0, 0, 0, 1, 0, 1, 0,
+ 40, 4, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0,224,168, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0, 96,255, 90, 10, 0, 0, 0, 0,
+ 1, 0, 1, 0,112,240, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,208,245, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,216,239, 90, 10,
+ 21, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 68, 65, 84, 65, 96, 0, 0, 0, 88,124, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,120,119, 90, 10,176, 66, 90, 10,176, 65, 90, 10, 48, 68, 90, 10,112, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+243, 2, 0, 0,185, 1, 0, 0, 69, 4, 0, 0, 9, 9,244, 2,141, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 56,127, 90, 10, 56,127, 90, 10,232,124, 90, 10, 16,126, 90, 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,232,124, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 16,126, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,210, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 61, 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,
+243, 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,244, 2, 26, 0,244, 2, 26, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0,185, 1, 0, 0,210, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,244, 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, 68, 65, 84, 65,248, 0, 0, 0, 16,126, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,232,124, 90, 10, 0, 0, 0, 0, 0,224,189, 68, 0, 0, 0, 0, 0,192, 22, 68,248,150, 23, 68, 8, 41,100, 68,
+120,125, 46, 67, 68, 65,214, 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,243, 2, 0, 0, 0, 0, 0, 0,114, 2, 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,244, 2,
+115, 2,244, 2,115, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0,211, 1, 0, 0,
+ 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2,115, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,
+ 56,127, 90, 10,172, 0, 0, 0, 1, 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, 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,140, 0, 0, 0, 64,130, 90, 10,196, 0, 0, 0, 1, 0, 0, 0,232,191, 90, 10,
+248, 63, 90, 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,248,130, 90, 10,184,132, 90, 10,248,132, 90, 10,200,135, 90, 10,
+ 16,136, 90, 10,176,177, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 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,130, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 56,131, 90, 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,131, 90, 10,197, 0, 0, 0,
+ 1, 0, 0, 0,120,131, 90, 10,248,130, 90, 10, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,
+120,131, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,184,131, 90, 10, 56,131, 90, 10, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0,
+ 68, 65, 84, 65, 20, 0, 0, 0,184,131, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,248,131, 90, 10,120,131, 90, 10, 0, 0, 0, 0,
+118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,248,131, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 56,132, 90, 10,
+184,131, 90, 10, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 56,132, 90, 10,197, 0, 0, 0,
+ 1, 0, 0, 0,120,132, 90, 10,248,131, 90, 10, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,
+120,132, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,184,132, 90, 10, 56,132, 90, 10, 0, 0, 0, 0,196, 3, 70, 4, 1, 0, 0, 0,
+ 68, 65, 84, 65, 20, 0, 0, 0,184,132, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,120,132, 90, 10, 0, 0, 0, 0,
+196, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,248,132, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 64,133, 90, 10,
+ 0, 0, 0, 0, 56,131, 90, 10,120,131, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 64,133, 90, 10,
+198, 0, 0, 0, 1, 0, 0, 0,136,133, 90, 10,248,132, 90, 10, 56,131, 90, 10,248,131, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0,136,133, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,208,133, 90, 10, 64,133, 90, 10,120,131, 90, 10,
+ 56,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,208,133, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,
+ 24,134, 90, 10,136,133, 90, 10,248,131, 90, 10, 56,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+ 24,134, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 96,134, 90, 10,208,133, 90, 10,248,131, 90, 10,120,132, 90, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 96,134, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,168,134, 90, 10, 24,134, 90, 10,
+248,130, 90, 10,184,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,168,134, 90, 10,198, 0, 0, 0,
+ 1, 0, 0, 0,240,134, 90, 10, 96,134, 90, 10,248,130, 90, 10,248,131, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0,240,134, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 56,135, 90, 10,168,134, 90, 10,120,132, 90, 10,184,132, 90, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 56,135, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,128,135, 90, 10,
+240,134, 90, 10, 56,132, 90, 10,120,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,128,135, 90, 10,
+198, 0, 0, 0, 1, 0, 0, 0,200,135, 90, 10, 56,135, 90, 10,184,131, 90, 10,184,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0,200,135, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128,135, 90, 10,184,131, 90, 10,
+ 56,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 16,136, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,
+240,138, 90, 10, 0, 0, 0, 0,248,131, 90, 10, 56,131, 90, 10,120,131, 90, 10, 56,132, 90, 10, 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, 0, 0, 0, 0,
+136,191, 90, 10,136,191, 90, 10,160,136, 90, 10,200,137, 90, 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,136, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,200,137, 90, 10, 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,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, 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, 68, 65, 84, 65,248, 0, 0, 0,200,137, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,160,136, 90, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,
+240,138, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,176,177, 90, 10, 16,136, 90, 10,248,130, 90, 10,248,131, 90, 10,120,132, 90, 10,
+184,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,195, 3, 0, 0, 0, 0, 0, 0, 69, 4, 0, 0, 6, 6,196, 3, 70, 4, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,144, 90, 10,104,144, 90, 10,128,139, 90, 10, 64,143, 90, 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,139, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
+168,140, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,113, 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,195, 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,196, 3,
+ 26, 0,196, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 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,196, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
+168,140, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 64,143, 90, 10,128,139, 90, 10, 0, 0, 0, 0, 0, 0, 91, 67, 0, 96,133,196,
+ 0, 0, 0, 0, 0, 0, 0, 0,254,255, 74, 67,254,127,133,196, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,
+ 43, 4, 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,
+ 43, 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, 3, 0, 0,
+ 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,220, 0, 44, 4,203, 0, 44, 4, 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, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+220, 0, 44, 4, 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,208,141, 90, 10,208,141, 90, 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,208,141, 90, 10,199, 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,174,255,202, 0, 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, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
+ 64,143, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,168,140, 90, 10, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0,
+ 0, 0,128, 67,154,153, 41,191,205,204,212, 63,154,153,149,191,205,204, 10, 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,232, 2, 0, 0, 0, 0, 0, 0,
+ 44, 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,
+220, 0, 0, 0,195, 3, 0, 0, 26, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+232, 2, 44, 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, 68, 65, 84, 65, 24, 33, 0, 0,104,144, 90, 10,170, 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,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, 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,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, 68, 65, 84, 65, 96, 0, 0, 0,176,177, 90, 10,200, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,240,138, 90, 10,184,132, 90, 10,120,132, 90, 10, 56,132, 90, 10,184,131, 90, 10, 0, 0, 0, 0,
+197, 3, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 69, 4, 0, 0, 1, 1,178, 3, 70, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 96,190, 90, 10, 96,190, 90, 10, 64,178, 90, 10,192,185, 90, 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, 64,178, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,104,179, 90, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,108, 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,177, 3, 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,178, 3, 26, 0,178, 3, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,118, 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,178, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,104,179, 90, 10,201, 0, 0, 0,
+ 1, 0, 0, 0, 0,182, 90, 10, 64,178, 90, 10, 0, 0, 0, 0, 0, 0, 32, 67, 0, 0,109,196, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 15, 67, 0, 0,109,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,179, 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, 0, 0, 0, 0,179, 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,160, 0,180, 3,143, 0,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,100, 4, 0, 0,
+146, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,180, 3, 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,144,180, 90, 10,144,180, 90, 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,144,180, 90, 10,199, 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,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, 42,254,143, 0,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, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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,182, 90, 10,201, 0, 0, 0,
+ 1, 0, 0, 0,152,184, 90, 10,104,179, 90, 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,197, 3, 0, 0,100, 4, 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, 40,183, 90, 10, 40,183, 90, 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,183, 90, 10,199, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,152,184, 90, 10,201, 0, 0, 0,
+ 1, 0, 0, 0,192,185, 90, 10, 0,182, 90, 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,118, 7, 0, 0,118, 7, 0, 0,
+ 26, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,185, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,152,184, 90, 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,101, 4, 0, 0,118, 7, 0, 0, 26, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 18, 3, 44, 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,232,186, 90, 10, 68, 65, 84, 65, 72, 3, 0, 0,232,186, 90, 10,159, 0, 0, 0, 1, 0, 0, 0,161, 58,190, 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,169,255, 27, 63,
+208,249,224,190, 48,180, 81,191,184,158, 81,191,254,123,173, 63,140,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62,150,126,161,188,
+206,156,122, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,100, 98, 82, 64, 0, 25, 95, 64, 97, 66,141, 62,
+204, 23, 29, 63,192, 60, 18,188, 0, 0, 96,179,195, 15,188,190,130, 75, 53, 62,216,125, 81, 63, 0, 0,192,179,115, 77,100,193,
+ 16,173,201, 64,181,148,248,192,203,247,159,192,233, 74, 87, 65,246, 46,190,192, 88,106,234, 64, 45, 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,169,255, 27, 63,
+208,249,224,190, 48,180, 81,191,184,158, 81,191,254,123,173, 63,140,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62,150,126,161,188,
+206,156,122, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,100, 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, 18,106,224, 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,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, 96,190, 90, 10,160, 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, 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,
+208,245, 90, 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, 3, 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, 83, 78, 0, 0,140, 0, 0, 0,232,191, 90, 10,196, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 64,130, 90, 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,160,192, 90, 10, 96,195, 90, 10,
+160,195, 90, 10,104,200, 90, 10,176,200, 90, 10,120,221, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 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,160,192, 90, 10,197, 0, 0, 0,
+ 1, 0, 0, 0,224,192, 90, 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,
+224,192, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 32,193, 90, 10,160,192, 90, 10, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0,
+ 68, 65, 84, 65, 20, 0, 0, 0, 32,193, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 96,193, 90, 10,224,192, 90, 10, 0, 0, 0, 0,
+118, 7, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96,193, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,160,193, 90, 10,
+ 32,193, 90, 10, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160,193, 90, 10,197, 0, 0, 0,
+ 1, 0, 0, 0,224,193, 90, 10, 96,193, 90, 10, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,
+224,193, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 32,194, 90, 10,160,193, 90, 10, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0,
+ 68, 65, 84, 65, 20, 0, 0, 0, 32,194, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 96,194, 90, 10,224,193, 90, 10, 0, 0, 0, 0,
+118, 7, 16, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96,194, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,160,194, 90, 10,
+ 32,194, 90, 10, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160,194, 90, 10,197, 0, 0, 0,
+ 1, 0, 0, 0,224,194, 90, 10, 96,194, 90, 10, 0, 0, 0, 0, 76, 3, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,
+224,194, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 32,195, 90, 10,160,194, 90, 10, 0, 0, 0, 0, 0, 0, 16, 2, 0, 0, 0, 0,
+ 68, 65, 84, 65, 20, 0, 0, 0, 32,195, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 96,195, 90, 10,224,194, 90, 10, 0, 0, 0, 0,
+ 76, 3, 16, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96,195, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 32,195, 90, 10, 0, 0, 0, 0,118, 7,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,160,195, 90, 10,198, 0, 0, 0,
+ 1, 0, 0, 0,232,195, 90, 10, 0, 0, 0, 0,224,192, 90, 10, 32,193, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0,232,195, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 48,196, 90, 10,160,195, 90, 10,224,192, 90, 10,160,193, 90, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 48,196, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,120,196, 90, 10,
+232,195, 90, 10, 32,193, 90, 10,224,193, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,120,196, 90, 10,
+198, 0, 0, 0, 1, 0, 0, 0,192,196, 90, 10, 48,196, 90, 10,160,193, 90, 10,224,193, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0,192,196, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 8,197, 90, 10,120,196, 90, 10,224,193, 90, 10,
+ 32,194, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 8,197, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,
+ 80,197, 90, 10,192,196, 90, 10,160,192, 90, 10, 96,194, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+ 80,197, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,152,197, 90, 10, 8,197, 90, 10,160,193, 90, 10,160,194, 90, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,152,197, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,224,197, 90, 10, 80,197, 90, 10,
+ 96,194, 90, 10,224,194, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,224,197, 90, 10,198, 0, 0, 0,
+ 1, 0, 0, 0, 40,198, 90, 10,152,197, 90, 10,224,194, 90, 10, 32,195, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0, 40,198, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,112,198, 90, 10,224,197, 90, 10,160,194, 90, 10, 32,195, 90, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112,198, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,184,198, 90, 10,
+ 40,198, 90, 10, 32,194, 90, 10, 96,195, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,184,198, 90, 10,
+198, 0, 0, 0, 1, 0, 0, 0, 0,199, 90, 10,112,198, 90, 10, 96,193, 90, 10, 96,195, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0, 0,199, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 72,199, 90, 10,184,198, 90, 10, 96,194, 90, 10,
+ 96,195, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 72,199, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,
+144,199, 90, 10, 0,199, 90, 10,160,192, 90, 10, 96,193, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+144,199, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,216,199, 90, 10, 72,199, 90, 10,224,193, 90, 10,160,194, 90, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,216,199, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 32,200, 90, 10,144,199, 90, 10,
+ 32,194, 90, 10, 32,195, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 32,200, 90, 10,198, 0, 0, 0,
+ 1, 0, 0, 0,104,200, 90, 10,216,199, 90, 10,160,193, 90, 10,224,194, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0,104,200, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 32,200, 90, 10, 32,194, 90, 10,224,194, 90, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,176,200, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,144,203, 90, 10,
+ 0, 0, 0, 0,160,193, 90, 10,224,192, 90, 10, 32,193, 90, 10,224,193, 90, 10, 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, 0, 0, 0, 0,176,227, 90, 10,
+176,227, 90, 10, 64,201, 90, 10,104,202, 90, 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, 64,201, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,104,202, 90, 10, 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,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, 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, 68, 65, 84, 65,248, 0, 0, 0,104,202, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 64,201, 90, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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,144,203, 90, 10,
+200, 0, 0, 0, 1, 0, 0, 0, 88,207, 90, 10,176,200, 90, 10,160,192, 90, 10, 96,194, 90, 10, 96,195, 90, 10, 96,193, 90, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 15, 15,119, 7,100, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,112,206, 90, 10,112,206, 90, 10, 32,204, 90, 10, 72,205, 90, 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, 32,204, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 72,205, 90, 10,
+ 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,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,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,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,118, 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,119, 7, 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, 68, 65, 84, 65,248, 0, 0, 0, 72,205, 90, 10,
+201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 32,204, 90, 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,118, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 18, 0, 0, 0, 73, 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,119, 7, 74, 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, 26, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 74, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,188, 0, 0, 0,112,206, 90, 10,176, 0, 0, 0, 1, 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,
+ 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 88,207, 90, 10,200, 0, 0, 0,
+ 1, 0, 0, 0, 0,215, 90, 10,144,203, 90, 10, 96,194, 90, 10,224,194, 90, 10, 32,194, 90, 10, 96,195, 90, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0,118, 7, 0, 0,101, 0, 0, 0, 15, 2, 0, 0, 8, 8,119, 7,171, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,248,213, 90, 10,248,213, 90, 10,232,207, 90, 10,208,212, 90, 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,232,207, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 16,209, 90, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 28, 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, 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,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,118, 7, 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,119, 7, 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, 68, 65, 84, 65,248, 0, 0, 0, 16,209, 90, 10,201, 0, 0, 0,
+ 1, 0, 0, 0,168,211, 90, 10,232,207, 90, 10, 0, 0, 0, 0, 0, 0, 92, 67, 0,128,200,195, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 75, 67, 0,128,200,195, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,144, 1, 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,144, 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,220, 0,145, 1,203, 0,145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,155, 6, 0, 0,118, 7, 0, 0,
+127, 0, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0,145, 1, 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, 56,210, 90, 10, 56,210, 90, 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, 56,210, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83, 69, 81, 85, 69, 78, 67, 69, 82, 95, 80, 84, 95,112,114,101,118,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,
+ 83, 69, 81, 85, 69, 78, 67, 69, 82, 95, 80, 84, 95,112,114,101,118,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,
+ 83, 99,101,110,101, 32, 80,114,101,118,105,101,119, 47, 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,171,255,203, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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,211, 90, 10,201, 0, 0, 0,
+ 1, 0, 0, 0,208,212, 90, 10, 16,209, 90, 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,154, 6, 0, 0,
+ 15, 2, 0, 0, 15, 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, 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, 68, 65, 84, 65,
+248, 0, 0, 0,208,212, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,168,211, 90, 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,144, 1, 0, 0, 18, 0, 0, 0,154, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,154, 6, 0, 0,
+ 18, 0, 0, 0,144, 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,155, 6,145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,154, 6, 0, 0,127, 0, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,155, 6,145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,248,213, 90, 10,166, 0, 0, 0, 1, 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, 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, 96, 0, 0, 0, 0,215, 90, 10,
+200, 0, 0, 0, 1, 0, 0, 0,120,221, 90, 10, 88,207, 90, 10,224,194, 90, 10,160,193, 90, 10,160,194, 90, 10, 32,195, 90, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0, 17, 2, 0, 0, 69, 4, 0, 0, 2, 2, 76, 3, 53, 2, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 48,220, 90, 10, 48,220, 90, 10,144,215, 90, 10, 8,219, 90, 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,144,215, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,184,216, 90, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,128,100, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 83, 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, 75, 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, 76, 3, 26, 0, 76, 3,
+ 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0, 17, 2, 0, 0, 42, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,184,216, 90, 10,
+201, 0, 0, 0, 1, 0, 0, 0,224,217, 90, 10,144,215, 90, 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, 64, 2,196, 0, 0, 0, 0,200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0, 26, 2, 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, 26, 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, 10, 6, 0, 0, 2, 0, 3, 3,
+ 0, 0, 0, 4, 6, 0,217, 0, 27, 2,200, 0, 9, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+216, 0, 0, 0, 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 27, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,248, 0, 0, 0,224,217, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 8,219, 90, 10,184,216, 90, 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, 75, 3, 0, 0, 75, 3, 0, 0, 43, 2, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,219, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,224,217, 90, 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, 26, 2, 0, 0, 18, 0, 0, 0,114, 2, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,114, 2, 0, 0, 18, 0, 0, 0, 26, 2, 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,115, 2,
+ 27, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0, 75, 3, 0, 0, 43, 2, 0, 0,
+ 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 2, 27, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,208, 0, 0, 0,
+ 48,220, 90, 10,164, 0, 0, 0, 1, 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,
+ 48,221, 90, 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, 48,221, 90, 10, 23, 1, 0, 0, 1, 0, 0, 0, 16,228, 90, 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, 96, 0, 0, 0,120,221, 90, 10,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0,215, 90, 10, 32,195, 90, 10,160,194, 90, 10,224,193, 90, 10, 32,194, 90, 10, 0, 0, 0, 0, 77, 3, 0, 0,118, 7, 0, 0,
+ 17, 2, 0, 0, 69, 4, 0, 0, 8, 8, 42, 4, 53, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,226, 90, 10,
+168,226, 90, 10, 8,222, 90, 10,128,225, 90, 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,222, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 48,223, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 67,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 64,133, 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, 41, 4, 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, 42, 4, 26, 0, 42, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 77, 3, 0, 0,118, 7, 0, 0, 17, 2, 0, 0, 42, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 42, 4, 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, 68, 65, 84, 65,248, 0, 0, 0, 48,223, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 88,224, 90, 10,
+ 8,222, 90, 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,118, 7, 0, 0,118, 7, 0, 0, 43, 2, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,224, 90, 10,
+201, 0, 0, 0, 1, 0, 0, 0,128,225, 90, 10, 48,223, 90, 10, 0, 0,240,195, 0, 0,240, 67, 0, 0,135,195, 0, 0,135, 67,
+ 96,187,216,196, 96,187,216, 68,244, 43, 91,196,244, 43, 91, 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, 41, 4, 0, 0, 0, 0, 0, 0, 26, 2, 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, 42, 4, 27, 2, 42, 4, 27, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 3, 0, 0,
+118, 7, 0, 0, 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 4, 27, 2,
+ 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,
+ 68, 65, 84, 65,248, 0, 0, 0,128,225, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88,224, 90, 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, 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, 68, 65, 84, 65,216, 0, 0, 0,168,226, 90, 10,166, 0, 0, 0, 1, 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, 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, 83, 67, 0, 0,120, 5, 0, 0,
+ 16,228, 90, 10,157, 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,184,233, 90, 10,
+ 0, 0, 0, 0,208,245, 90, 10,224,243, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,152,235, 90, 10, 40,236, 90, 10,152,235, 90, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,236, 90, 10,240, 64, 80, 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, 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, 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, 96,239, 90, 10, 96,239, 90, 10, 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, 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,176,203, 64, 10, 0, 0, 0, 0, 0, 0, 0, 0,144, 10, 85, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 76, 0, 0, 0,184,233, 90, 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, 48,234, 90, 10, 32,235, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 76, 0, 0, 0, 48,234, 90, 10, 16, 0, 0, 0, 1, 0, 0, 0, 32,235, 90, 10, 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,168,234, 90, 10,168,234, 90, 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,168,234, 90, 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,152, 39, 59, 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,152, 39, 59, 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, 76, 0, 0, 0, 32,235, 90, 10, 16, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 48,234, 90, 10,
+ 6, 0, 0, 0,112,111,115,101, 95,116,101,109,112,108, 97,116,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, 68, 65, 84, 65, 28, 0, 0, 0,152,235, 90, 10,133, 0, 0, 0, 1, 0, 0, 0,224,235, 90, 10, 0, 0, 0, 0,
+ 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,186, 1,168, 1,152,250, 90, 10, 68, 65, 84, 65, 28, 0, 0, 0,224,235, 90, 10,
+133, 0, 0, 0, 1, 0, 0, 0, 40,236, 90, 10,152,235, 90, 10, 1, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 59, 2,109, 2,
+ 96,255, 90, 10, 68, 65, 84, 65, 28, 0, 0, 0, 40,236, 90, 10,133, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,224,235, 90, 10,
+ 1, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 97, 0,228, 1,208,245, 90, 10, 68, 65, 84, 65,152, 1, 0, 0,112,236, 90, 10,
+153, 0, 0, 0, 1, 0, 0, 0, 56,238, 90, 10,136,238, 90, 10,216,238, 90, 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,120,208, 92, 10,
+ 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,
+ 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,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, 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, 17, 0, 0, 0, 35, 0, 0, 0,204,197,121, 63, 0, 0, 0, 63,
+ 68, 65, 84, 65, 36, 0, 0, 0, 56,238, 90, 10,152, 0, 0, 0, 1, 0, 0, 0, 96,122, 92, 10,152, 75, 85, 10,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, 36, 0, 0, 0,
+136,238, 90, 10,152, 0, 0, 0, 1, 0, 0, 0, 96,122, 92, 10,248,175, 88, 9,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, 88, 0, 0, 0,216,238, 90, 10,151, 0, 0, 0,
+ 1, 0, 0, 0, 72,181, 92, 10,216,191, 75, 10,255,100,100,128, 1, 0, 0, 0,128, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 0, 0,124, 7,231, 65,255, 74, 20, 65, 54, 86,123, 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, 68, 65, 84, 65,
+ 72, 0, 0, 0, 96,239, 90, 10,139, 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,104, 0, 0, 0,
+216,239, 90, 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,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, 76, 65, 0, 0,108, 1, 0, 0,112,240, 90, 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, 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, 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,242, 90, 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, 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,144,243, 90, 10, 68, 65, 84, 65, 16, 1, 0, 0, 8,242, 90, 10,
+ 82, 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, 72,243, 90, 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,
+ 72,243, 90, 10, 80, 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,144,243, 90, 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,112, 1, 0, 0,
+224,243, 90, 10,132, 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,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,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,128,245, 90, 10, 68, 65, 84, 65,
+ 32, 0, 0, 0,128,245, 90, 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, 79, 66, 0, 0,220, 3, 0, 0,208,245, 90, 10,121, 0, 0, 0,
+ 1, 0, 0, 0,152,250, 90, 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,216,239, 90, 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,216,249, 90, 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,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,216,249, 90, 10,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,
+ 2, 0, 0, 0, 79, 66, 0, 0,220, 3, 0, 0,152,250, 90, 10,121, 0, 0, 0, 1, 0, 0, 0, 96,255, 90, 10,208,245, 90, 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,
+112, 83, 78, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 74, 92, 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, 24, 32, 60, 9,
+192, 93, 44, 9, 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,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,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,160,254, 90, 10, 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,232,178, 61, 10, 40, 53, 85, 10, 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, 24, 32, 60, 9,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,192, 93, 44, 9, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,144, 0, 0, 0,160,254, 90, 10,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, 72, 0, 0, 0, 79, 66, 0, 0,220, 3, 0, 0, 96,255, 90, 10,121, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+152,250, 90, 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,112,240, 90, 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,104, 3, 91, 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, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,
+104, 3, 91, 10,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, 2, 0, 0, 0, 77, 65, 0, 0,
+160, 2, 0, 0, 40, 4, 91, 10, 43, 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, 0, 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,128, 63, 0, 0,128, 63,248, 6, 91, 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, 48, 8, 91, 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,248, 6, 91, 10, 32, 0, 0, 0,
+ 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,168, 91, 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,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, 32, 0, 0, 0, 48, 8, 91, 10, 19, 0, 0, 0, 1, 0, 0, 0,
+ 32, 0, 0, 0, 96, 0, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, 1, 0, 1, 0, 49, 0, 49, 0,128, 8, 91, 10,176, 24, 91, 10,
+ 68, 65, 84, 65, 0, 16, 0, 0,128, 8, 91, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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,176, 24, 91, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 1, 0, 0,224,168, 91, 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, 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, 7, 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, 64,170, 91, 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, 64,170, 91, 10, 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, 14, 0, 13, 0,144,170, 91, 10,192,186, 91, 10,
+ 68, 65, 84, 65, 0, 16, 0, 0,144,170, 91, 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, 68, 65, 84, 65, 0,144, 0, 0,192,186, 91, 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, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
+ 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 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,240, 74, 92, 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,128,233, 80, 9,120, 82, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0,200, 77, 92, 10, 56, 80, 92, 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, 72, 76, 92, 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,184, 78, 92, 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,248, 80, 92, 10, 1, 0, 0, 0, 5, 0, 0, 0, 20, 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, 68, 65, 84, 65, 4, 0, 0, 0,128,233, 80, 9, 0, 0, 0, 0, 1, 0, 0, 0, 40, 4, 91, 10, 68, 65, 84, 65,
+ 84, 1, 0, 0, 72, 76, 92, 10, 87, 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,200, 77, 92, 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,200, 77, 92, 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,
+184, 78, 92, 10, 87, 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, 56, 80, 92, 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, 56, 80, 92, 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,248, 80, 92, 10, 87, 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,120, 82, 92, 10, 6, 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, 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, 88, 84, 92, 10,
+ 6, 0, 0, 0, 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,
+ 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,
+ 88, 84, 92, 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,120, 82, 92, 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, 66, 82, 0, 0,188, 2, 0, 0,
+232, 84, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,168, 90, 92, 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, 1, 0, 0, 2, 12, 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, 0, 8, 89, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 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,
+ 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 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, 8, 1, 0, 0, 52, 85, 92, 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, 16, 1, 0, 0, 8, 89, 92, 10, 82, 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, 72, 90, 92, 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, 90, 92, 10, 80, 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,188, 2, 0, 0,168, 90, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,
+ 48, 95, 92, 10,232, 84, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,108,111, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 13, 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, 0,144, 93, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0,
+ 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0,
+ 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65,
+ 8, 1, 0, 0,244, 90, 92, 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, 16, 1, 0, 0,
+144, 93, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 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,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,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,208, 94, 92, 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, 94, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,188, 2, 0, 0, 48, 95, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,184, 99, 92, 10,168, 90, 92, 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, 1, 0, 0, 2,
+ 14, 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, 0, 24, 98, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 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, 8, 1, 0, 0,124, 95, 92, 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, 16, 1, 0, 0, 24, 98, 92, 10, 82, 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, 88, 99, 92, 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, 88, 99, 92, 10, 80, 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,188, 2, 0, 0,184, 99, 92, 10,
+ 86, 1, 0, 0, 1, 0, 0, 0, 64,104, 92, 10, 48, 95, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,114,117,115,104, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 30, 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, 0,160,102, 92, 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, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 35, 0, 0, 0,
+ 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62,
+ 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0, 4,100, 92, 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, 16, 1, 0, 0,160,102, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+ 1, 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,224,255,127,191, 46, 95,255,186,224,255,127,191,
+114, 97,255,186,224,103, 92, 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,224,103, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0, 64,104, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,200,108, 92, 10,
+184, 99, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,108, 97,121, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 3, 15, 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, 0, 40,107, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 4, 4, 8, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,
+140,104, 92, 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, 16, 1, 0, 0, 40,107, 92, 10,
+ 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 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,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,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,104,108, 92, 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,108, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63,
+ 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,
+188, 2, 0, 0,200,108, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 80,113, 92, 10, 64,104, 92, 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, 1, 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,176,111, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 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, 8, 1, 0, 0, 20,109, 92, 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, 16, 1, 0, 0,176,111, 92, 10, 82, 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,240,112, 92, 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,112, 92, 10, 80, 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,188, 2, 0, 0, 80,113, 92, 10, 86, 1, 0, 0,
+ 1, 0, 0, 0,216,117, 92, 10,200,108, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,114,101, 97,115,101, 0, 48, 48, 49,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 17, 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, 0, 56,116, 92, 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, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 6, 4, 0,
+ 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63,
+ 68, 65, 84, 65, 8, 1, 0, 0,156,113, 92, 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,
+ 16, 1, 0, 0, 56,116, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 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,228, 97,175,190, 50,131,112, 63,218,243,127,191, 10,183,157,188,
+120,117, 92, 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,120,117, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0,128, 62, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215, 35, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,216,117, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 96,122, 92, 10, 80,113, 92, 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,
+ 1, 0, 0, 2, 18, 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, 0,
+192,120, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 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, 8, 1, 0, 0, 36,118, 92, 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, 16, 1, 0, 0,192,120, 92, 10, 82, 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, 0,122, 92, 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,122, 92, 10,
+ 80, 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,188, 2, 0, 0,
+ 96,122, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,232,126, 92, 10,216,117, 92, 10, 5, 0,109, 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, 30, 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, 0, 72,125, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,
+ 35, 0, 0, 0, 0, 4, 0, 8, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62,
+ 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,172,122, 92, 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, 16, 1, 0, 0, 72,125, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 3, 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,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186,136,126, 92, 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,126, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,232,126, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,
+112,131, 92, 10, 96,122, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 70,105,108,108, 47, 68,101,101,112,101,110, 0, 48, 48,
+ 49, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 19, 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, 0,208,129, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0,
+ 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0,
+ 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65,
+ 8, 1, 0, 0, 52,127, 92, 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, 16, 1, 0, 0,
+208,129, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 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,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,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 16,131, 92, 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, 16,131, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,188, 2, 0, 0,112,131, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,248,135, 92, 10,232,126, 92, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 66, 82, 70,108, 97,116,116,101,110, 47, 67,111,110,116,114, 97,115,116, 0, 48, 48, 49, 0, 0, 1, 0, 0, 3,
+ 20, 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, 0, 88,134, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,
+205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,188,131, 92, 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, 16, 1, 0, 0, 88,134, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 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,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,
+224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,152,135, 92, 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,152,135, 92, 10, 80, 1, 0, 0,
+ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,
+143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,248,135, 92, 10,
+ 86, 1, 0, 0, 1, 0, 0, 0,128,140, 92, 10,112,131, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 71,114, 97, 98, 0, 48,
+ 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 21, 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, 0,224,138, 92, 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, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 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, 75, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 68,136, 92, 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, 16, 1, 0, 0,224,138, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 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,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,224,255,127,191, 46, 95,255,186,224,255,127,191,
+114, 97,255,186, 32,140, 92, 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,140, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,128,140, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 8,145, 92, 10,
+248,135, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 73,110,102,108, 97,116,101, 47, 68,101,102,108, 97,116,101, 0, 48, 48,
+ 49, 0, 0, 0, 1, 0, 0, 3, 22, 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, 0,104,143, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0,128, 62, 0, 0,128, 62, 0, 0,128, 62, 68, 65, 84, 65, 8, 1, 0, 0,
+204,140, 92, 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, 16, 1, 0, 0,104,143, 92, 10,
+ 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 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,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,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,168,144, 92, 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,144, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63,
+ 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,
+188, 2, 0, 0, 8,145, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,144,149, 92, 10,128,140, 92, 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, 1, 0, 0, 3, 23, 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, 0,240,147, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 84,145, 92, 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, 16, 1, 0, 0,240,147, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 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,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,224,255,127,191,
+ 46, 95,255,186,224,255,127,191,114, 97,255,186, 48,149, 92, 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, 48,149, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,144,149, 92, 10, 86, 1, 0, 0,
+ 1, 0, 0, 0, 24,154, 92, 10, 8,145, 92, 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, 1, 0, 0, 2, 24, 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, 0,120,152, 92, 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, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 4, 0, 0,
+ 0, 0, 0, 0, 10, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 33, 0, 0, 0, 0, 0, 0, 62, 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, 8, 1, 0, 0,220,149, 92, 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,
+ 16, 1, 0, 0,120,152, 92, 10, 82, 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,
+184,153, 92, 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,153, 92, 10, 80, 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,188, 2, 0, 0, 24,154, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,160,158, 92, 10,144,149, 92, 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,
+ 1, 0, 0, 2, 25, 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, 0,
+ 0,157, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,
+102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 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, 8, 1, 0, 0,100,154, 92, 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, 16, 1, 0, 0, 0,157, 92, 10, 82, 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, 64,158, 92, 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,158, 92, 10,
+ 80, 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,188, 2, 0, 0,
+160,158, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 40,163, 92, 10, 24,154, 92, 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, 1, 0, 0, 2, 26, 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, 0,136,161, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 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,
+ 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 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, 8, 1, 0, 0,236,158, 92, 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, 16, 1, 0, 0,136,161, 92, 10, 82, 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,200,162, 92, 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,200,162, 92, 10, 80, 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,188, 2, 0, 0, 40,163, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,
+176,167, 92, 10,160,158, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 78,117,100,103,101, 0, 48, 48, 49, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 27, 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, 0, 16,166, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0,
+ 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0,
+ 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 8, 1, 0, 0,116,163, 92, 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, 16, 1, 0, 0,
+ 16,166, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 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,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,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 80,167, 92, 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, 80,167, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,188, 2, 0, 0,176,167, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 56,172, 92, 10, 40,163, 92, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 66, 82, 80,105,110, 99,104, 47, 77, 97,103,110,105,102,121, 0, 48, 48, 49, 0, 0, 0, 0, 0, 1, 0, 0, 3,
+ 28, 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, 0,152,170, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,
+205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0, 64, 63, 0, 0, 64, 63,
+ 0, 0, 64, 63, 0, 0,128, 62, 0, 0,128, 62, 0, 0,128, 62, 68, 65, 84, 65, 8, 1, 0, 0,252,167, 92, 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, 16, 1, 0, 0,152,170, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 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,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,
+224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,216,171, 92, 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,171, 92, 10, 80, 1, 0, 0,
+ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,
+143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0, 56,172, 92, 10,
+ 86, 1, 0, 0, 1, 0, 0, 0,192,176, 92, 10,176,167, 92, 10, 65,119, 13, 0, 0, 0, 0, 0, 66, 82, 80,111,108,105,115,104,
+ 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 20, 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, 0, 32,175, 92, 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, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 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, 35, 0, 0, 0,
+ 4, 4, 4, 1, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,132,172, 92, 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, 16, 1, 0, 0, 32,175, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 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,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,224,255,127,191, 46, 95,255,186,224,255,127,191,
+114, 97,255,186, 96,176, 92, 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,176, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,192,176, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 72,181, 92, 10,
+ 56,172, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83, 99,114, 97,112,101, 47, 80,101, 97,107,115, 0, 48, 48, 49, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 3, 29, 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, 0,168,179, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,
+ 12,177, 92, 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, 16, 1, 0, 0,168,179, 92, 10,
+ 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 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,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,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,232,180, 92, 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,
+232,180, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63,
+ 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,
+188, 2, 0, 0, 72,181, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,208,185, 92, 10,192,176, 92, 10, 52,195, 13, 0, 0, 0, 0, 0,
+ 66, 82, 83, 99,117,108,112,116, 68,114, 97,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 30, 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, 0, 48,184, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0,160,119, 78, 63, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62,
+ 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,148,181, 92, 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, 16, 1, 0, 0, 48,184, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0, 3, 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,224,255,127,191,
+ 46, 95,255,186,224,255,127,191,114, 97,255,186,112,185, 92, 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,185, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,208,185, 92, 10, 86, 1, 0, 0,
+ 1, 0, 0, 0, 88,190, 92, 10, 72,181, 92, 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, 1, 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,188, 92, 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, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 4, 0, 0,
+ 0, 0, 0, 0, 10, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 33, 0, 0, 0, 0, 0, 0, 62, 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, 8, 1, 0, 0, 28,186, 92, 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,
+ 16, 1, 0, 0,184,188, 92, 10, 82, 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,
+248,189, 92, 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,189, 92, 10, 80, 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,188, 2, 0, 0, 88,190, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,224,194, 92, 10,208,185, 92, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,109,111,111,116,104, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 3, 32, 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, 0,
+ 64,193, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 75, 0, 0, 0,
+102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0, 64, 63,
+ 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,164,190, 92, 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, 16, 1, 0, 0, 64,193, 92, 10, 82, 1, 0, 0,
+ 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 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,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,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,128,194, 92, 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,128,194, 92, 10,
+ 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0,
+ 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,
+224,194, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,104,199, 92, 10, 88,190, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,110,
+ 97,107,101, 32, 72,111,111,107, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 33, 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, 0,200,197, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 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,
+ 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 44,195, 92, 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, 16, 1, 0, 0,200,197, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 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,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,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186, 8,199, 92, 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, 8,199, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,104,199, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,
+240,203, 92, 10,224,194, 92, 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, 1, 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,202, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0,
+ 10, 0, 0, 0, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0,
+ 0, 0, 0, 62, 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,
+ 8, 1, 0, 0,180,199, 92, 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, 16, 1, 0, 0,
+ 80,202, 92, 10, 82, 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,144,203, 92, 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,203, 92, 10, 80, 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,188, 2, 0, 0,240,203, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,120,208, 92, 10,104,199, 92, 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, 1, 0, 0, 2,
+ 35, 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, 0,216,206, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 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, 8, 1, 0, 0, 60,204, 92, 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, 16, 1, 0, 0,216,206, 92, 10, 82, 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, 24,208, 92, 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,208, 92, 10, 80, 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,188, 2, 0, 0,120,208, 92, 10,
+ 86, 1, 0, 0, 1, 0, 0, 0, 0,213, 92, 10,240,203, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,101,120, 68,114, 97,
+119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 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, 63, 0, 0, 0, 0, 96,211, 92, 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, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 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, 35, 0, 0, 0,
+ 4, 4, 0, 8, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62,
+ 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,196,208, 92, 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, 16, 1, 0, 0, 96,211, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+ 3, 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,224,255,127,191, 46, 95,255,186,224,255,127,191,
+114, 97,255,186,160,212, 92, 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,160,212, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0, 0,213, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,136,217, 92, 10,
+120,208, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,104,117,109, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 3, 37, 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, 0,232,215, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 75, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,
+ 76,213, 92, 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, 16, 1, 0, 0,232,215, 92, 10,
+ 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 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,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,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 40,217, 92, 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,217, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63,
+ 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,
+188, 2, 0, 0,136,217, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,213, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 84,119,105,115,116, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 38, 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, 0,112,220, 92, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 75, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,212,217, 92, 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, 16, 1, 0, 0,112,220, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 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,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,224,255,127,191,
+ 46, 95,255,186,224,255,127,191,114, 97,255,186,176,221, 92, 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,221, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 85, 83, 69, 82,240, 12, 0, 0, 32, 31,246, 8,195, 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, 48,235, 92, 10, 48,235, 92, 10,104, 69, 85, 10,
+104, 69, 85, 10,168, 70, 85, 10,168, 70, 85, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 29, 0, 0, 48,235, 92, 10,
+192, 0, 0, 0, 1, 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,192,226, 0, 0,
+ 80,179, 85, 10, 0, 0, 0, 0, 1, 0, 0, 0, 83, 68, 78, 65, 78, 65, 77, 69,204, 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, 99,104, 97,
+110,103,101,100, 95,116,105,109,101,115,116, 97,109,112, 91, 50, 93, 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,112, 97,100,
+ 49, 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,115, 0, 42,107,101,121,105,110,100,101,120, 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,115,109, 97,108,108, 99, 97,112,115, 95,115, 99,
+ 97,108,101, 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,122,101,110,114, 0,122,101,110,103, 0,122,101,
+110, 98, 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, 98,114,117,115,104, 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,
+114, 97,100,105, 97,108, 95,115,121,109,109, 91, 51, 93, 0,108, 97,115,116, 95,120, 0,108, 97,115,116, 95,121, 0,108, 97,115,
+116, 95, 97,110,103,108,101, 0,100,114, 97,119, 95, 97,110, 99,104,111,114,101,100, 0, 97,110, 99,104,111,114,101,100, 95,115,
+105,122,101, 0, 97,110, 99,104,111,114,101,100, 95,108,111, 99, 97,116,105,111,110, 91, 51, 93, 0, 97,110, 99,104,111,114,101,
+100, 95,105,110,105,116,105, 97,108, 95,109,111,117,115,101, 91, 50, 93, 0,100,114, 97,119, 95,112,114,101,115,115,117,114,101,
+ 0,112,114,101,115,115,117,114,101, 95,118, 97,108,117,101, 0,115,112,101, 99,105, 97,108, 95,114,111,116, 97,116,105,111,110,
+ 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,112,114,111,112,111,114,116,105,111,110, 97,108, 95,111, 98,106,101, 99,116,115, 0, 97,117,116,111, 95,110,
+111,114,109, 97,108,105,122,101, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,115,101,116,116,105,110,103,115, 0,115,
+ 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,105,101,100, 95,115,105,122,101, 0,115, 99,117,108,112,116, 95,
+112, 97,105,110,116, 95,117,110,105,102,105,101,100, 95,117,110,112,114,111,106,101, 99,116,101,100, 95,114, 97,100,105,117,115,
+ 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,105,101,100, 95, 97,108,112,104, 97, 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, 42, 97,114,101, 97, 0, 42,115,111,117,110,100, 0,115,
+110,100,110,114, 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,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,115, 99,117,108,
+112,116, 95,112, 97,105,110,116, 95,111,118,101,114,108, 97,121, 95, 99,111,108, 91, 51, 93, 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,115, 97,116, 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, 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,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,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, 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,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, 97,120,115,112,101,101,100, 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,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,103, 97,109,109, 97, 95,105,110,118, 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,104, 97,110,103,101,
+100, 95,116,105,109,101,115,116, 97,109,112, 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, 42,105, 99,111,
+110, 95,105,109, 98,117,102, 0,105, 99,111,110, 95,102,105,108,101,112, 97,116,104, 91, 50, 52, 48, 93, 0,110,111,114,109, 97,
+108, 95,119,101,105,103,104,116, 0,111, 98, 95,109,111,100,101, 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,112,108, 97,110,101, 0,112,108, 97,110,101,
+ 95,111,102,102,115,101,116, 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,117,116,111,115,109,111,111,116,104, 95,
+102, 97, 99,116,111,114, 0, 99,114,101, 97,115,101, 95,112,105,110, 99,104, 95,102, 97, 99,116,111,114, 0,112,108, 97,110,101,
+ 95,116,114,105,109, 0,116,101,120,116,117,114,101, 95,115, 97,109,112,108,101, 95, 98,105, 97,115, 0,116,101,120,116,117,114,
+101, 95,111,118,101,114,108, 97,121, 95, 97,108,112,104, 97, 0,117,110,112,114,111,106,101, 99,116,101,100, 95,114, 97,100,105,
+117,115, 0, 97,100,100, 95, 99,111,108, 91, 51, 93, 0,115,117, 98, 95, 99,111,108, 91, 51, 93, 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, 98,111,114,100,101,114, 95, 99,111,108,108,105,115,105,111,110,115, 0,116,105,109,101, 95,115,
+ 99, 97,108,101, 0,118,111,114,116,105, 99,105,116,121, 0,118,101,108,111, 99,105,116,121, 91, 50, 93, 0,118,101,108, 95,109,
+117,108,116,105, 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,211, 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, 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, 69,100,105,116, 78,117,114, 98, 0, 71, 72, 97,115,104, 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, 83,112, 97, 99,101, 83,111,117,110,100,
+ 0, 83, 99,114, 65,114,101, 97, 0, 98, 83,111,117,110,100, 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,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, 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, 83,111,117,110,100, 51, 68, 0, 98, 83,111,117,110,100, 65, 99,116,117, 97,116,111,114,
+ 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, 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, 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,
+ 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,104, 0, 36, 0,
+120, 5,156, 1, 0, 0, 0, 0, 0, 0, 8, 1, 48, 1, 84, 1, 24, 0, 8, 3,168, 0, 0, 0, 72, 0, 32, 1,152, 0,132, 0,
+108, 1, 16, 1, 88, 0,160, 2, 76, 0, 60, 1, 0, 0,108, 0,104, 0,148, 0, 56, 0, 8, 0, 16, 0, 12, 0, 0, 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, 64, 0,
+ 80, 0,100, 0,108, 0, 80, 0,108, 0,128, 0, 76, 0, 72, 0,120, 0, 72, 0, 84, 0,204, 0, 48, 0,168, 0,160, 0,172, 0,
+ 72, 0,104, 0,116, 0,196, 0,112, 0,224, 0, 64, 0, 92, 0, 0, 0,144, 0, 32, 0,240, 1,112, 0, 0, 0, 88, 0, 0, 0,
+ 0, 0, 76, 0, 8, 0, 8, 0,244, 0, 88, 0,124, 1, 84, 0, 76, 0, 72, 0, 72, 0,176, 1,120, 0,116, 0, 64, 0,120, 0,
+ 92, 0,220, 0, 40, 0, 0, 0, 92, 0,148, 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,112, 1, 28, 0,176, 0,144, 0, 64, 0, 60, 0, 24, 0, 72, 0,232, 3, 56, 0,
+ 20, 0, 16, 0,100, 0, 84, 0, 16, 0,188, 2, 36, 0, 16, 0,156, 0, 80, 0, 88, 0, 36, 0,152, 1, 32, 0, 8, 0, 24, 0,
+ 56, 2, 0, 0, 0, 0, 72, 0, 72, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 0, 40, 0,140, 0, 48, 0,140, 0,208, 0,
+ 24, 0,216, 0,216, 0,200, 1, 60, 0, 0, 0,120, 0, 0, 0,252, 0, 12, 0, 12, 0, 24, 33,112, 16, 24, 16,192, 0,124, 2,
+ 80, 2, 40, 0, 36, 0,188, 0,244, 0, 52, 0,140, 2, 28, 0,112, 1, 88, 0,188, 0, 96, 0, 92, 1, 16, 1, 32, 0,224, 0,
+ 32, 0, 32, 0,112, 2,104, 1, 16, 0, 48, 29, 72, 0, 56, 0,240, 12, 20, 0, 24, 0, 64, 1, 0, 0, 0, 0, 0, 0,248, 0,
+ 0, 0, 16, 1, 80, 0, 28, 0, 16, 0, 8, 0, 44, 0,252, 0,240, 0,168, 1,216, 0, 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, 32, 0, 68, 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, 24, 0, 16, 1,
+144, 0, 16, 0,204, 1, 4, 0, 40, 0,104, 0,216, 0, 64, 0, 44, 0, 72, 0,116, 0, 60, 0,112, 0, 16, 0, 52, 0, 44, 0,
+ 44, 0, 44, 0, 8, 0, 36, 0, 68, 0, 64, 0, 44, 0, 44, 0, 20, 0, 52, 0, 96, 0, 12, 0,108, 0, 92, 0, 52, 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, 44, 0, 8, 0, 8, 0, 64, 0, 32, 0, 24, 0, 8, 0, 24, 0, 32, 0, 8, 0, 96, 0, 20, 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, 36, 0,200, 1, 96, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 20, 0, 24, 0,172, 0, 24, 0, 28, 0, 20, 0,168, 0,148, 0,152, 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, 20, 0, 48, 0,
+208, 1, 28, 1, 16, 0, 68, 0, 0, 1, 20, 0,160, 0, 88, 0, 96, 0,152, 0, 20, 0, 56, 0, 48, 0, 68, 0, 56, 0, 92, 0,
+ 64, 0, 56, 0, 96, 0, 0, 0, 0, 0, 0, 0, 83, 84, 82, 67,152, 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, 5, 0, 4, 0, 39, 0, 4, 0, 40, 0, 2, 0, 41, 0, 2, 0, 42, 0,
+ 4, 0, 43, 0, 31, 0, 6, 0, 32, 0, 44, 0, 2, 0, 45, 0, 2, 0, 46, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0, 47, 0,
+ 33, 0, 21, 0, 33, 0, 0, 0, 33, 0, 1, 0, 34, 0, 48, 0, 35, 0, 49, 0, 24, 0, 50, 0, 24, 0, 51, 0, 2, 0, 45, 0,
+ 2, 0, 46, 0, 2, 0, 52, 0, 2, 0, 53, 0, 2, 0, 54, 0, 2, 0, 55, 0, 2, 0, 19, 0, 2, 0, 56, 0, 7, 0, 11, 0,
+ 7, 0, 12, 0, 4, 0, 57, 0, 7, 0, 58, 0, 7, 0, 59, 0, 7, 0, 60, 0, 31, 0, 61, 0, 36, 0, 7, 0, 27, 0, 31, 0,
+ 12, 0, 62, 0, 24, 0, 63, 0, 2, 0, 45, 0, 2, 0, 64, 0, 2, 0, 65, 0, 2, 0, 37, 0, 37, 0, 16, 0, 37, 0, 0, 0,
+ 37, 0, 1, 0, 7, 0, 66, 0, 7, 0, 60, 0, 2, 0, 17, 0, 2, 0, 46, 0, 2, 0, 67, 0, 2, 0, 19, 0, 4, 0, 68, 0,
+ 4, 0, 69, 0, 9, 0, 2, 0, 7, 0, 70, 0, 0, 0, 20, 0, 0, 0, 71, 0, 7, 0, 72, 0, 7, 0, 73, 0, 38, 0, 13, 0,
+ 27, 0, 31, 0, 39, 0, 74, 0, 37, 0, 75, 0, 0, 0, 76, 0, 4, 0, 77, 0, 7, 0, 60, 0, 12, 0, 78, 0, 36, 0, 79, 0,
+ 27, 0, 80, 0, 2, 0, 17, 0, 2, 0, 81, 0, 2, 0, 82, 0, 2, 0, 19, 0, 40, 0, 6, 0, 40, 0, 0, 0, 40, 0, 1, 0,
+ 0, 0, 83, 0, 0, 0, 84, 0, 4, 0, 23, 0, 4, 0, 85, 0, 41, 0, 10, 0, 41, 0, 0, 0, 41, 0, 1, 0, 4, 0, 86, 0,
+ 4, 0, 87, 0, 4, 0, 88, 0, 4, 0, 89, 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, 74, 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, 79, 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, 56, 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, 66, 0,
+ 4, 0, 63, 0, 55, 0, 5, 0, 2, 0, 19, 0, 2, 0, 36, 0, 2, 0, 63, 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, 74, 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, 69, 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, 89, 0, 45, 0, 57, 1, 60, 0, 58, 1, 36, 0, 79, 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, 44, 0, 62, 0, 72, 0,
+ 27, 0, 31, 0, 39, 0, 74, 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, 69, 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, 89, 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, 79, 0, 51, 0,122, 1, 2, 0,123, 1, 0, 0,124, 1, 30, 0,148, 0,
+ 64, 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, 65, 0,124, 0, 27, 0, 31, 0, 39, 0, 74, 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, 64, 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, 79, 0, 66, 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, 69, 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,
+ 67, 0, 4, 0, 27, 0, 31, 0, 0, 0,250, 1, 68, 0, 2, 0, 43, 0,147, 0, 69, 0, 26, 0, 69, 0, 0, 0, 69, 0, 1, 0,
+ 70, 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,
+ 71, 0, 20, 0, 27, 0, 31, 0, 39, 0, 74, 0, 70, 0,251, 1, 12, 0, 13, 2, 12, 0, 14, 2, 12, 0, 15, 2, 36, 0, 79, 0,
+ 65, 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, 69, 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, 54, 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, 72, 0, 21, 0, 72, 0, 0, 0, 72, 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, 48, 0, 35, 0, 49, 0, 2, 0, 44, 2, 2, 0, 45, 2, 4, 0, 46, 2, 73, 0, 5, 0,
+ 2, 0, 47, 2, 2, 0, 33, 2, 0, 0, 19, 0, 0, 0, 37, 0, 2, 0, 69, 0, 74, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0,
+ 7, 0, 8, 0, 7, 0, 48, 2, 75, 0, 2, 0, 12, 0, 49, 2, 76, 0, 50, 2, 77, 0, 68, 0, 27, 0, 31, 0, 39, 0, 74, 0,
+ 70, 0,251, 1, 12, 0, 51, 2, 12, 0, 14, 2, 75, 0, 52, 2, 32, 0, 53, 2, 32, 0, 54, 2, 32, 0, 55, 2, 36, 0, 79, 0,
+ 78, 0, 56, 2, 38, 0, 57, 2, 65, 0, 16, 2, 12, 0, 58, 2, 7, 0, 64, 1, 7, 0,169, 0, 7, 0, 65, 1, 2, 0,171, 0,
+ 2, 0, 89, 0, 2, 0, 59, 2, 2, 0, 60, 2, 2, 0, 61, 2, 7, 0, 62, 2, 7, 0, 63, 2, 2, 0, 64, 2, 2, 0, 18, 2,
+ 2, 0, 19, 0, 2, 0, 65, 2, 7, 0, 66, 2, 7, 0, 67, 2, 7, 0, 68, 2, 2, 0, 36, 2, 2, 0, 37, 2, 2, 0, 69, 2,
+ 2, 0, 70, 2, 4, 0, 71, 2, 9, 0, 72, 2, 2, 0, 23, 0, 2, 0, 95, 0, 2, 0, 66, 0, 2, 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, 7, 0, 81, 2, 7, 0, 82, 2,
+ 7, 0, 83, 2, 0, 0, 84, 2, 79, 0, 85, 2, 80, 0, 86, 2, 0, 0, 87, 2, 67, 0, 88, 2, 67, 0, 89, 2, 67, 0, 90, 2,
+ 67, 0, 91, 2, 4, 0, 92, 2, 7, 0, 93, 2, 4, 0, 94, 2, 4, 0, 95, 2, 74, 0, 96, 2, 4, 0, 97, 2, 4, 0, 98, 2,
+ 73, 0, 99, 2, 73, 0,100, 2, 81, 0, 41, 0, 27, 0, 31, 0, 39, 0, 74, 0, 70, 0,251, 1, 12, 0,101, 2, 36, 0, 79, 0,
+ 38, 0, 57, 2, 65, 0, 16, 2, 82, 0,102, 2, 83, 0,103, 2, 84, 0,104, 2, 85, 0,105, 2, 86, 0,106, 2, 87, 0,107, 2,
+ 88, 0,108, 2, 89, 0,109, 2, 81, 0,110, 2, 90, 0,111, 2, 91, 0,112, 2, 92, 0,113, 2, 92, 0,114, 2, 92, 0,115, 2,
+ 4, 0, 53, 0, 4, 0,116, 2, 4, 0,117, 2, 4, 0,118, 2, 4, 0,119, 2, 2, 0,171, 0, 2, 0,120, 2, 7, 0, 64, 1,
+ 7, 0,169, 0, 7, 0, 65, 1, 7, 0,121, 2, 4, 0, 59, 2, 2, 0,122, 2, 2, 0, 19, 0, 2, 0,123, 2, 2, 0,124, 2,
+ 2, 0, 18, 2, 2, 0,125, 2, 93, 0,126, 2, 94, 0,127, 2, 84, 0, 8, 0, 9, 0,128, 2, 7, 0,129, 2, 4, 0,130, 2,
+ 0, 0, 19, 0, 0, 0,131, 2, 2, 0, 69, 1, 2, 0,132, 2, 2, 0,133, 2, 82, 0, 7, 0, 4, 0,134, 2, 4, 0,135, 2,
+ 4, 0,136, 2, 4, 0,137, 2, 2, 0, 33, 2, 0, 0,138, 2, 0, 0, 19, 0, 86, 0, 5, 0, 4, 0,134, 2, 4, 0,135, 2,
+ 0, 0,139, 2, 0, 0,140, 2, 2, 0, 19, 0, 95, 0, 2, 0, 4, 0,141, 2, 7, 0, 25, 2, 87, 0, 3, 0, 95, 0,142, 2,
+ 4, 0,143, 2, 4, 0, 19, 0, 85, 0, 6, 0, 7, 0,144, 2, 2, 0,145, 2, 2, 0, 33, 2, 0, 0, 19, 0, 0, 0,140, 2,
+ 0, 0, 61, 2, 88, 0, 4, 0, 0, 0,233, 0, 0, 0,179, 0, 0, 0,180, 0, 0, 0,181, 0, 96, 0, 6, 0, 47, 0,128, 2,
+ 0, 0, 19, 0, 0, 0,131, 2, 2, 0, 69, 1, 2, 0,132, 2, 2, 0,133, 2, 97, 0, 1, 0, 7, 0,146, 2, 98, 0, 5, 0,
+ 0, 0,233, 0, 0, 0,179, 0, 0, 0,180, 0, 0, 0,181, 0, 4, 0, 37, 0, 89, 0, 1, 0, 7, 0,147, 2, 90, 0, 2, 0,
+ 4, 0,148, 2, 4, 0, 17, 0, 83, 0, 7, 0, 7, 0,129, 2, 47, 0,128, 2, 0, 0, 19, 0, 0, 0,131, 2, 2, 0, 69, 1,
+ 2, 0,132, 2, 2, 0,133, 2, 99, 0, 1, 0, 7, 0,149, 2,100, 0, 1, 0, 4, 0,150, 2,101, 0, 1, 0, 0, 0,151, 2,
+102, 0, 1, 0, 7, 0,129, 2,103, 0, 3, 0, 4, 0,152, 2, 0, 0, 92, 0, 7, 0,153, 2,104, 0, 4, 0, 7, 0,233, 0,
+ 7, 0,179, 0, 7, 0,180, 0, 7, 0,181, 0,105, 0, 1, 0,104, 0,130, 2,106, 0, 5, 0, 4, 0,154, 2, 4, 0,155, 2,
+ 0, 0, 19, 0, 0, 0, 33, 2, 0, 0, 61, 2,107, 0, 2, 0, 4, 0,156, 2, 4, 0,155, 2,108, 0, 10, 0,108, 0, 0, 0,
+108, 0, 1, 0,106, 0,157, 2,105, 0,158, 2,107, 0,159, 2, 4, 0, 53, 0, 4, 0,117, 2, 4, 0,116, 2, 4, 0, 37, 0,
+ 85, 0,160, 2, 93, 0, 14, 0, 12, 0,161, 2, 85, 0,160, 2, 0, 0,162, 2, 0, 0,163, 2, 0, 0,164, 2, 0, 0,165, 2,
+ 0, 0,166, 2, 0, 0,167, 2, 0, 0,168, 2, 0, 0, 19, 0, 92, 0,113, 2, 92, 0,115, 2, 2, 0,169, 2, 0, 0,170, 2,
+ 94, 0, 8, 0, 4, 0,171, 2, 4, 0,172, 2, 82, 0,173, 2, 86, 0,174, 2, 4, 0,117, 2, 4, 0,116, 2, 4, 0, 53, 0,
+ 4, 0, 37, 0,109, 0, 9, 0,109, 0, 0, 0,109, 0, 1, 0, 4, 0, 17, 0, 4, 0, 69, 1, 4, 0,175, 2, 4, 0, 37, 0,
+ 0, 0, 20, 0, 46, 0,129, 0, 0, 0,176, 2,110, 0, 7, 0,109, 0,177, 2, 2, 0,178, 2, 2, 0,161, 2, 2, 0,179, 2,
+ 2, 0, 90, 0, 9, 0,180, 2, 9, 0,181, 2,111, 0, 3, 0,109, 0,177, 2, 32, 0,161, 0, 0, 0, 20, 0,112, 0, 5, 0,
+109, 0,177, 2, 32, 0,161, 0, 0, 0, 20, 0, 2, 0,182, 2, 0, 0,183, 2,113, 0, 5, 0,109, 0,177, 2, 7, 0, 87, 0,
+ 7, 0,184, 2, 4, 0,185, 2, 4, 0,186, 2,114, 0, 5, 0,109, 0,177, 2, 32, 0,187, 2, 0, 0, 71, 0, 4, 0, 69, 1,
+ 4, 0, 19, 0,115, 0, 13, 0,109, 0,177, 2, 32, 0,188, 2, 32, 0,189, 2, 32, 0,190, 2, 32, 0,191, 2, 7, 0,192, 2,
+ 7, 0,193, 2, 7, 0,184, 2, 7, 0,194, 2, 4, 0,195, 2, 4, 0,196, 2, 4, 0, 90, 0, 4, 0,197, 2,116, 0, 5, 0,
+109, 0,177, 2, 2, 0,198, 2, 2, 0, 19, 0, 7, 0,199, 2, 32, 0,200, 2,117, 0, 3, 0,109, 0,177, 2, 7, 0,201, 2,
+ 4, 0, 90, 0,118, 0, 10, 0,109, 0,177, 2, 7, 0,202, 2, 4, 0,203, 2, 4, 0, 37, 0, 2, 0, 90, 0, 2, 0,204, 2,
+ 2, 0,205, 2, 2, 0,206, 2, 7, 0,207, 2, 0, 0,208, 2,119, 0, 3, 0,109, 0,177, 2, 7, 0, 37, 0, 4, 0, 17, 0,
+120, 0, 6, 0,109, 0,177, 2,121, 0,209, 2,122, 0,210, 2,123, 0,211, 2, 7, 0,212, 2, 4, 0, 17, 0,124, 0, 11, 0,
+109, 0,177, 2, 52, 0,213, 2, 7, 0,214, 2, 4, 0,215, 2, 0, 0,208, 2, 7, 0,216, 2, 4, 0,217, 2, 32, 0,218, 2,
+ 0, 0,219, 2, 4, 0,220, 2, 4, 0, 37, 0,125, 0, 12, 0,109, 0,177, 2, 32, 0,221, 2, 47, 0,222, 2, 4, 0, 90, 0,
+ 4, 0,223, 2, 7, 0,224, 2, 7, 0,225, 2, 7, 0,226, 2, 7, 0,227, 2, 0, 0,219, 2, 4, 0,220, 2, 4, 0, 37, 0,
+126, 0, 3, 0,109, 0,177, 2, 7, 0,228, 2, 4, 0,229, 2,127, 0, 5, 0,109, 0,177, 2, 7, 0,230, 2, 0, 0,208, 2,
+ 2, 0, 19, 0, 2, 0,231, 2,128, 0, 8, 0,109, 0,177, 2, 32, 0,161, 0, 7, 0,230, 2, 7, 0,248, 0, 7, 0,106, 0,
+ 0, 0,208, 2, 2, 0, 19, 0, 2, 0, 17, 0,129, 0, 21, 0,109, 0,177, 2, 32, 0,232, 2, 0, 0,208, 2, 52, 0,213, 2,
+ 32, 0,218, 2, 2, 0, 19, 0, 2, 0, 37, 0, 7, 0,233, 2, 7, 0,234, 2, 7, 0,235, 2, 7, 0, 66, 2, 7, 0,236, 2,
+ 7, 0,237, 2, 7, 0,238, 2, 7, 0,239, 2, 4, 0,217, 2, 4, 0,220, 2, 0, 0,219, 2, 7, 0,240, 2, 7, 0,241, 2,
+ 7, 0, 89, 0,130, 0, 7, 0,109, 0,177, 2, 2, 0,242, 2, 2, 0,243, 2, 4, 0, 69, 0, 32, 0,161, 0, 7, 0,244, 2,
+ 0, 0,208, 2,131, 0, 10, 0,109, 0,177, 2, 32, 0,161, 0, 0, 0,245, 2, 7, 0,246, 2, 7, 0,247, 2, 7, 0,239, 2,
+ 4, 0,248, 2, 4, 0,249, 2, 7, 0,250, 2, 0, 0, 20, 0,132, 0, 1, 0,109, 0,177, 2,133, 0, 7, 0,109, 0,177, 2,
+ 46, 0,129, 0,134, 0,251, 2,135, 0,252, 2,136, 0,253, 2,137, 0,254, 2, 12, 0,255, 2,138, 0, 13, 0,109, 0,177, 2,
+ 85, 0, 0, 3, 85, 0, 1, 3, 85, 0, 2, 3, 85, 0, 3, 3, 85, 0, 4, 3, 85, 0, 5, 3, 82, 0, 6, 3, 4, 0, 7, 3,
+ 4, 0, 8, 3, 7, 0,212, 2, 7, 0, 37, 0,139, 0, 9, 3,140, 0, 7, 0,109, 0,177, 2, 85, 0, 0, 3, 85, 0, 10, 3,
+141, 0, 11, 3,142, 0, 9, 3, 4, 0, 12, 3, 4, 0, 7, 3,143, 0, 4, 0,109, 0,177, 2, 32, 0,161, 0, 4, 0, 13, 3,
+ 4, 0, 37, 0,144, 0, 2, 0, 4, 0, 14, 3, 7, 0, 25, 2,145, 0, 2, 0, 4, 0,120, 0, 4, 0, 15, 3,146, 0, 24, 0,
+109, 0,177, 2, 32, 0,161, 0, 0, 0,208, 2, 2, 0, 16, 3, 2, 0, 19, 0, 2, 0, 69, 1, 2, 0, 37, 0,144, 0, 17, 3,
+ 4, 0, 18, 3, 7, 0, 19, 3, 4, 0, 53, 0, 4, 0, 20, 3,145, 0, 21, 3,144, 0, 22, 3, 4, 0, 23, 3, 4, 0, 24, 3,
+ 4, 0, 25, 3, 4, 0, 15, 3, 7, 0, 26, 3, 7, 0, 27, 3, 7, 0, 28, 3, 7, 0, 29, 3, 7, 0, 30, 3, 9, 0, 31, 3,
+147, 0, 8, 0,109, 0,177, 2,148, 0, 32, 3,141, 0, 11, 3, 4, 0, 33, 3, 4, 0, 34, 3, 4, 0, 35, 3, 2, 0, 19, 0,
+ 2, 0, 56, 0,149, 0, 8, 0,109, 0,177, 2, 32, 0, 44, 0, 2, 0,252, 0, 2, 0, 19, 0, 2, 0,198, 2, 2, 0, 56, 0,
+ 7, 0, 36, 3, 7, 0, 37, 3,150, 0, 5, 0,109, 0,177, 2, 4, 0, 38, 3, 2, 0, 19, 0, 2, 0, 39, 3, 7, 0, 40, 3,
+151, 0, 8, 0,109, 0,177, 2, 0, 0, 41, 3, 0, 0, 42, 3, 0, 0,167, 2, 0, 0, 43, 3, 0, 0, 44, 3, 0, 0, 90, 0,
+ 0, 0, 61, 2,152, 0, 3, 0,109, 0,177, 2,153, 0, 45, 3,137, 0,254, 2,154, 0, 10, 0,109, 0,177, 2, 32, 0, 46, 3,
+ 32, 0, 47, 3, 0, 0, 48, 3, 7, 0, 49, 3, 2, 0, 50, 3, 2, 0, 51, 3, 0, 0, 52, 3, 0, 0, 53, 3, 0, 0,183, 2,
+155, 0, 9, 0,109, 0,177, 2, 32, 0, 54, 3, 0, 0, 48, 3, 7, 0, 55, 3, 7, 0, 56, 3, 0, 0, 69, 1, 0, 0,198, 2,
+ 0, 0, 57, 3, 0, 0, 37, 0,156, 0, 1, 0,109, 0,177, 2,157, 0, 8, 0,109, 0,177, 2, 0, 0,208, 2, 7, 0,120, 0,
+ 7, 0, 58, 3, 7, 0, 59, 3, 7, 0, 60, 3, 7, 0, 61, 3, 4, 0, 19, 0,158, 0, 9, 0,109, 0,177, 2, 32, 0, 62, 3,
+ 4, 0, 63, 3, 4, 0, 64, 3, 4, 0, 65, 3, 7, 0, 66, 3, 7, 0, 67, 3, 2, 0,198, 2, 2, 0, 19, 0,159, 0, 28, 0,
+ 27, 0, 31, 0, 2, 0, 34, 2, 2, 0, 35, 2, 2, 0, 68, 3, 2, 0, 19, 0, 2, 0, 69, 3, 2, 0, 70, 3, 2, 0, 71, 3,
+ 2, 0, 69, 0, 0, 0, 72, 3, 0, 0, 73, 3, 0, 0, 74, 3, 0, 0, 17, 0, 4, 0, 37, 0, 7, 0, 75, 3, 7, 0, 76, 3,
+ 7, 0, 77, 3, 7, 0, 78, 3, 7, 0, 79, 3, 7, 0, 80, 3, 34, 0, 81, 3, 36, 0, 79, 0, 38, 0, 57, 2, 87, 0,107, 2,
+ 0, 0, 71, 0, 7, 0, 82, 3, 7, 0, 83, 3,159, 0, 84, 3,160, 0, 3, 0,160, 0, 0, 0,160, 0, 1, 0, 0, 0, 20, 0,
+ 70, 0, 3, 0, 7, 0, 85, 3, 4, 0, 19, 0, 4, 0, 37, 0, 32, 0,126, 0, 27, 0, 31, 0, 39, 0, 74, 0,161, 0, 86, 3,
+ 2, 0, 17, 0, 2, 0, 87, 3, 4, 0, 88, 3, 4, 0, 89, 3, 4, 0, 90, 3, 0, 0, 91, 3, 32, 0, 38, 0, 32, 0, 92, 3,
+ 32, 0, 93, 3, 32, 0, 94, 3, 32, 0, 95, 3, 36, 0, 79, 0, 78, 0, 56, 2, 70, 0,251, 1,162, 0, 96, 3,162, 0, 97, 3,
+163, 0, 98, 3, 9, 0, 2, 0,164, 0, 99, 3,165, 0,100, 3,166, 0,101, 3, 12, 0,102, 3, 12, 0,101, 2, 12, 0, 14, 2,
+ 12, 0,103, 3, 12, 0,104, 3, 4, 0, 69, 1, 4, 0,105, 3, 65, 0, 16, 2, 0, 0,106, 3, 4, 0, 18, 2, 4, 0,107, 3,
+ 7, 0, 64, 1, 7, 0,108, 3, 7, 0,109, 3, 7, 0,169, 0, 7, 0,110, 3, 7, 0, 65, 1, 7, 0,111, 3, 7, 0, 4, 2,
+ 7, 0,112, 3, 7, 0,113, 3, 7, 0,114, 3, 7, 0,115, 3, 7, 0,116, 3, 7, 0,117, 3, 7, 0,246, 2, 7, 0,118, 3,
+ 7, 0,237, 0, 4, 0,119, 3, 2, 0, 19, 0, 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, 2, 0,128, 3, 2, 0,129, 3, 2, 0,130, 3, 4, 0,131, 3, 4, 0,132, 3,
+ 4, 0,133, 3, 4, 0,134, 3, 7, 0,135, 3, 7, 0, 93, 2, 7, 0,136, 3, 7, 0,137, 3, 7, 0,138, 3, 7, 0,139, 3,
+ 7, 0,140, 3, 7, 0,212, 0, 7, 0,141, 3, 7, 0,142, 3, 7, 0,143, 3, 7, 0,144, 3, 2, 0,145, 3, 0, 0,146, 3,
+ 0, 0,147, 3, 0, 0,148, 3, 0, 0,149, 3, 7, 0,150, 3, 7, 0,151, 3, 12, 0,152, 3, 12, 0,153, 3, 12, 0,154, 3,
+ 12, 0,155, 3, 7, 0,156, 3, 2, 0,148, 2, 2, 0,157, 3, 7, 0,130, 2, 4, 0,158, 3, 4, 0,159, 3,167, 0,160, 3,
+ 2, 0,161, 3, 2, 0,244, 0, 7, 0,162, 3, 12, 0,163, 3, 12, 0,164, 3, 12, 0,165, 3, 12, 0,166, 3,168, 0, 61, 1,
+169, 0,167, 3, 66, 0,168, 3, 2, 0,169, 3, 2, 0,170, 3, 2, 0,171, 3, 2, 0,172, 3, 7, 0,122, 2, 2, 0,173, 3,
+ 2, 0,174, 3,153, 0,175, 3,141, 0,176, 3,141, 0,177, 3, 4, 0,178, 3, 4, 0,179, 3, 4, 0,180, 3, 4, 0, 69, 0,
+ 12, 0,181, 3, 12, 0,182, 3, 12, 0,183, 3,170, 0, 14, 0,170, 0, 0, 0,170, 0, 1, 0, 32, 0, 38, 0, 7, 0,246, 2,
+ 7, 0, 66, 1, 7, 0,247, 2, 7, 0,239, 2, 0, 0, 20, 0, 4, 0,248, 2, 4, 0,249, 2, 4, 0,184, 3, 2, 0, 17, 0,
+ 2, 0,185, 3, 7, 0,250, 2,171, 0, 12, 0,171, 0, 0, 0,171, 0, 1, 0, 32, 0, 44, 0, 4, 0,186, 3, 4, 0,148, 2,
+ 4, 0,187, 3, 4, 0, 17, 0, 4, 0,188, 3, 7, 0, 66, 1, 7, 0,189, 3, 7, 0,190, 3, 7, 0,146, 2,168, 0, 40, 0,
+ 4, 0, 19, 0, 2, 0,191, 3, 2, 0,192, 3, 2, 0,239, 2, 2, 0,193, 3, 2, 0,194, 3, 2, 0,195, 3, 2, 0,196, 3,
+ 2, 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, 7, 0,222, 3, 7, 0,223, 3, 7, 0,224, 3, 52, 0,162, 0,172, 0,225, 3, 7, 0,226, 3, 4, 0,186, 2,
+173, 0, 5, 0, 66, 0,229, 1, 7, 0,227, 3, 7, 0,228, 3, 2, 0, 19, 0, 2, 0,229, 3,174, 0, 9, 0,174, 0, 0, 0,
+174, 0, 1, 0, 4, 0,230, 3, 4, 0,231, 3, 4, 0,232, 3, 4, 0, 19, 0, 4, 0,233, 3, 9, 0,234, 3, 9, 0,235, 3,
+137, 0, 19, 0,137, 0, 0, 0,137, 0, 1, 0, 4, 0, 19, 0, 4, 0,236, 3, 4, 0,237, 3, 4, 0,238, 3, 4, 0,239, 3,
+ 4, 0,240, 3, 4, 0,241, 3, 4, 0,231, 3, 4, 0,148, 2, 4, 0, 56, 0, 0, 0,242, 3, 0, 0,243, 3, 0, 0,244, 3,
+ 0, 0,245, 3, 12, 0,246, 3,175, 0,247, 3, 9, 0,248, 3,176, 0, 1, 0, 7, 0, 32, 2,167, 0, 30, 0, 4, 0, 19, 0,
+ 7, 0,249, 3, 7, 0,250, 3, 7, 0,251, 3, 4, 0,252, 3, 4, 0,253, 3, 4, 0,254, 3, 4, 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, 7, 0, 15, 4, 7, 0, 16, 4,
+ 7, 0, 17, 4, 4, 0, 18, 4, 4, 0, 19, 4, 7, 0, 20, 4, 7, 0,141, 3,169, 0, 54, 0, 4, 0,231, 3, 4, 0, 21, 4,
+177, 0, 22, 4,178, 0, 23, 4, 0, 0, 37, 0, 0, 0, 24, 4, 2, 0, 25, 4, 7, 0, 26, 4, 0, 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, 7, 0, 34, 4, 7, 0, 35, 4, 7, 0, 36, 4,
+ 2, 0, 37, 4, 0, 0, 38, 4, 2, 0, 39, 4, 7, 0, 40, 4, 7, 0, 41, 4, 0, 0, 42, 4, 4, 0,121, 0, 4, 0, 43, 4,
+ 4, 0, 44, 4, 2, 0, 45, 4, 2, 0, 46, 4,176, 0, 47, 4, 4, 0, 48, 4, 4, 0, 81, 0, 7, 0, 49, 4, 7, 0, 50, 4,
+ 7, 0, 51, 4, 7, 0, 52, 4, 2, 0, 53, 4, 2, 0, 54, 4, 2, 0, 55, 4, 2, 0, 56, 4, 2, 0, 57, 4, 2, 0, 58, 4,
+ 2, 0, 59, 4, 2, 0, 60, 4,179, 0, 61, 4, 7, 0, 62, 4, 7, 0, 63, 4,137, 0, 64, 4, 12, 0,255, 2,173, 0, 65, 4,
+ 7, 0, 66, 4, 7, 0, 67, 4, 7, 0, 68, 4, 0, 0, 69, 4,153, 0, 51, 0,152, 0, 70, 4, 2, 0, 17, 0, 2, 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, 2, 0, 78, 4, 2, 0, 79, 4,
+ 7, 0, 80, 4, 7, 0, 81, 4, 7, 0, 82, 4, 7, 0, 83, 4, 7, 0, 84, 4, 4, 0, 85, 4, 4, 0, 86, 4, 7, 0, 87, 4,
+ 4, 0, 88, 4, 7, 0, 89, 4, 7, 0, 90, 4, 7, 0, 91, 4, 81, 0, 92, 4, 81, 0, 93, 4, 81, 0, 94, 4, 0, 0, 95, 4,
+ 7, 0, 96, 4, 7, 0, 97, 4, 36, 0, 79, 0, 2, 0, 98, 4, 0, 0, 99, 4, 0, 0,100, 4, 7, 0,101, 4, 4, 0,102, 4,
+ 7, 0,103, 4, 7, 0,104, 4, 4, 0,105, 4, 4, 0, 19, 0, 7, 0,106, 4, 7, 0,107, 4, 7, 0,108, 4, 85, 0,109, 4,
+ 7, 0,110, 4, 7, 0,111, 4, 7, 0,112, 4, 7, 0,113, 4, 7, 0,114, 4, 7, 0,115, 4, 7, 0,116, 4, 4, 0,117, 4,
+180, 0, 76, 0, 27, 0, 31, 0, 39, 0, 74, 0, 2, 0,172, 0, 2, 0, 70, 1, 2, 0,104, 1, 2, 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,124, 4, 7, 0,150, 1, 7, 0,152, 1, 7, 0,151, 1,
+ 7, 0, 69, 0, 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, 79, 0, 51, 0,122, 1, 2, 0,123, 1, 2, 0,178, 4, 30, 0,148, 0,181, 0, 8, 0,181, 0, 0, 0,181, 0, 1, 0,
+ 4, 0,119, 3, 4, 0,179, 4, 4, 0, 19, 0, 2, 0,180, 4, 2, 0,181, 4, 32, 0,161, 0,182, 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,183, 0, 5, 0, 9, 0,194, 4, 9, 0,195, 4, 4, 0,196, 4,
+ 4, 0, 69, 0, 0, 0,197, 4,184, 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, 89, 0,185, 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,186, 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,187, 0, 11, 0,187, 0, 0, 0,187, 0, 1, 0, 0, 0, 20, 0,
+ 65, 0,230, 4, 66, 0,231, 4, 4, 0,119, 3, 4, 0,232, 4, 4, 0,233, 4, 4, 0, 37, 0, 4, 0,234, 4, 4, 0,235, 4,
+188, 0,111, 0,182, 0,236, 4,183, 0,237, 4,184, 0,238, 4,185, 0,239, 4, 4, 0, 12, 3, 4, 0,121, 0, 4, 0, 43, 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, 69, 0, 42, 0, 77, 5, 0, 0, 78, 5,
+189, 0, 9, 0,189, 0, 0, 0,189, 0, 1, 0, 0, 0, 20, 0, 2, 0, 79, 5, 2, 0, 80, 5, 2, 0, 81, 5, 2, 0, 89, 0,
+ 7, 0, 82, 5, 7, 0, 69, 0,190, 0, 7, 0, 2, 0,203, 2, 2, 0, 69, 1, 2, 0, 67, 3, 2, 0, 83, 5, 7, 0, 84, 5,
+ 7, 0, 69, 0, 42, 0, 85, 5,191, 0, 5, 0, 7, 0, 86, 5, 0, 0, 17, 0, 0, 0, 89, 0, 0, 0, 69, 0, 0, 0,226, 1,
+192, 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,191, 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,190, 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, 89, 0,193, 0, 6, 0,193, 0, 0, 0,193, 0, 1, 0,
+ 4, 0,230, 3, 0, 0,242, 3, 4, 0, 19, 0, 32, 0, 93, 5,194, 0, 4, 0,195, 0, 94, 5, 9, 0, 95, 5, 0, 0, 96, 5,
+ 4, 0, 90, 0,196, 0, 8, 0,194, 0, 97, 5, 2, 0, 19, 0, 2, 0, 37, 0, 2, 0, 98, 5, 2, 0, 99, 5, 2, 0,100, 5,
+ 4, 0, 89, 0, 9, 0,101, 5,197, 0, 6, 0, 2, 0,106, 0, 2, 0,236, 3, 2, 0,102, 5, 2, 0,197, 2, 4, 0, 19, 0,
+ 7, 0,214, 2,198, 0, 14, 0, 2, 0, 19, 0, 2, 0,103, 5, 2, 0,104, 5, 2, 0,105, 5,197, 0,106, 5, 9, 0,101, 5,
+ 7, 0,107, 5, 7, 0, 56, 0, 4, 0,108, 5, 4, 0,109, 5, 4, 0,110, 5, 4, 0,111, 5, 46, 0,129, 0, 32, 0,161, 0,
+199, 0, 4, 0,199, 0, 0, 0,199, 0, 1, 0, 0, 0,112, 5, 7, 0,113, 5,200, 0, 14, 0,194, 0, 97, 5, 4, 0, 90, 0,
+ 4, 0,114, 5, 7, 0,115, 5, 7, 0,116, 5, 7, 0,117, 5, 4, 0,118, 5, 4, 0,119, 5, 7, 0,120, 5, 7, 0,121, 5,
+ 4, 0,122, 5, 7, 0,123, 5, 7, 0,124, 5, 4, 0, 37, 0,201, 0, 7, 0,194, 0, 97, 5, 2, 0, 19, 0, 2, 0, 37, 0,
+ 4, 0, 36, 0, 4, 0,125, 5, 87, 0,126, 5, 9, 0,101, 5,202, 0, 80, 0,201, 0,127, 5,201, 0,128, 5,200, 0, 86, 3,
+ 7, 0,129, 5, 2, 0,130, 5, 2, 0,131, 5, 7, 0,132, 5, 7, 0,133, 5, 2, 0,236, 3, 2, 0,134, 5, 7, 0,135, 5,
+ 7, 0,136, 5, 7, 0,137, 5, 2, 0,138, 5, 2, 0,108, 5, 2, 0,139, 5, 2, 0,140, 5, 2, 0,141, 5, 2, 0,142, 5,
+ 7, 0,143, 5, 7, 0,144, 5, 7, 0,145, 5, 2, 0,146, 5, 2, 0,147, 5, 2, 0,148, 5, 2, 0,149, 5, 2, 0,150, 5,
+ 2, 0,151, 5, 2, 0,152, 5,196, 0,153, 5,198, 0,154, 5, 7, 0,155, 5, 7, 0,156, 5, 7, 0,157, 5, 2, 0,158, 5,
+ 2, 0,159, 5, 0, 0,160, 5, 0, 0,161, 5, 0, 0,162, 5, 0, 0,163, 5, 0, 0,164, 5, 0, 0,165, 5, 2, 0,166, 5,
+ 7, 0,167, 5, 7, 0,168, 5, 7, 0,169, 5, 7, 0,170, 5, 7, 0,171, 5, 7, 0,172, 5, 7, 0,173, 5, 7, 0,174, 5,
+ 7, 0,175, 5, 7, 0,176, 5, 2, 0,177, 5, 0, 0,178, 5, 0, 0,179, 5, 0, 0,180, 5, 0, 0,181, 5, 32, 0,182, 5,
+ 0, 0,183, 5, 0, 0,184, 5, 0, 0,185, 5, 0, 0,186, 5, 0, 0,187, 5, 0, 0,188, 5, 0, 0,189, 5, 0, 0,190, 5,
+ 2, 0,191, 5, 2, 0,192, 5, 2, 0,193, 5, 2, 0,194, 5, 2, 0,195, 5, 0, 0,196, 5, 0, 0,178, 4, 4, 0,197, 5,
+ 2, 0,198, 5, 2, 0, 89, 0, 4, 0,199, 5, 7, 0,200, 5, 7, 0,201, 5,203, 0, 8, 0, 4, 0,202, 5, 4, 0,203, 5,
+ 4, 0,204, 5, 4, 0,205, 5, 4, 0,206, 5, 4, 0,207, 5, 4, 0, 53, 0, 4, 0,117, 2,204, 0, 3, 0, 7, 0,208, 5,
+ 2, 0,209, 5, 2, 0, 19, 0,205, 0, 4, 0, 7, 0,210, 5, 4, 0, 19, 0, 4, 0,211, 5, 4, 0, 56, 0, 46, 0, 42, 0,
+ 27, 0, 31, 0, 39, 0, 74, 0, 32, 0, 93, 5,180, 0,212, 5, 46, 0,213, 5, 47, 0,235, 0, 12, 0,214, 5,181, 0,215, 5,
+ 32, 0,216, 5, 7, 0,217, 5, 7, 0,218, 5, 7, 0,219, 5, 7, 0,220, 5, 4, 0,119, 3, 4, 0,221, 5, 4, 0, 89, 0,
+ 2, 0, 19, 0, 2, 0, 63, 1, 60, 0, 58, 1,206, 0,222, 5,202, 0,223, 5,207, 0,224, 5,188, 0,179, 0,186, 0,225, 5,
+ 12, 0,100, 0, 12, 0,226, 5, 9, 0,227, 5, 9, 0,228, 5, 9, 0,229, 5,208, 0,230, 5, 2, 0,231, 5, 2, 0,232, 5,
+ 2, 0,244, 0, 2, 0,233, 5, 4, 0,234, 5, 4, 0,235, 5, 12, 0,236, 5,191, 0, 88, 5,192, 0,237, 5,204, 0,238, 5,
+164, 0, 99, 3,205, 0,239, 5,209, 0, 11, 0,209, 0, 0, 0,209, 0, 1, 0, 47, 0,235, 0, 45, 0, 57, 1, 7, 0, 81, 2,
+ 7, 0, 82, 2, 7, 0,106, 0, 7, 0,240, 5, 2, 0,241, 5, 2, 0, 19, 0, 7, 0, 69, 0,210, 0, 39, 0, 7, 0,242, 5,
+ 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, 76, 1, 7, 0,251, 5, 7, 0,252, 5, 7, 0,253, 5, 7, 0,254, 5, 7, 0,168, 0, 2, 0,255, 5, 2, 0, 0, 6,
+ 2, 0, 1, 6, 2, 0, 37, 0, 2, 0, 2, 6, 2, 0, 3, 6, 2, 0, 4, 6, 2, 0,241, 5, 7, 0, 5, 6, 7, 0, 6, 6,
+ 70, 0, 7, 6,164, 0, 99, 3,210, 0, 8, 6,211, 0, 9, 6,212, 0, 10, 6,213, 0, 11, 6,214, 0, 12, 6,215, 0, 13, 6,
+ 7, 0, 14, 6, 2, 0, 15, 6, 2, 0, 16, 6, 7, 0, 17, 6, 7, 0, 18, 6, 7, 0, 19, 6,216, 0, 55, 0,217, 0, 0, 0,
+217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6, 7, 0,250, 5, 7, 0, 76, 1, 7, 0, 89, 0,
+ 4, 0, 24, 6, 2, 0, 4, 6, 2, 0,241, 5, 32, 0, 93, 5, 32, 0, 25, 6, 12, 0, 26, 6,209, 0, 27, 6,216, 0, 8, 6,
+ 0, 0, 28, 6, 4, 0,119, 3, 4, 0,221, 5, 2, 0, 29, 6, 2, 0, 69, 0, 2, 0, 30, 6, 2, 0, 31, 6, 2, 0,226, 1,
+ 2, 0, 19, 0, 2, 0, 17, 2, 2, 0, 32, 6, 7, 0,111, 0, 7, 0, 33, 6, 7, 0, 17, 6, 7, 0, 19, 6, 7, 0, 34, 6,
+ 7, 0, 35, 6, 7, 0,168, 0, 7, 0,217, 5, 2, 0, 36, 6, 2, 0,248, 1, 2, 0, 37, 6, 2, 0, 38, 6, 2, 0, 39, 6,
+ 2, 0, 40, 6, 2, 0, 41, 6, 2, 0, 42, 6, 2, 0, 43, 6, 2, 0, 1, 6, 4, 0, 44, 6, 12, 0, 45, 6, 2, 0, 46, 6,
+ 2, 0,131, 2, 2, 0, 47, 6, 0, 0, 48, 6, 0, 0, 49, 6, 9, 0, 50, 6,164, 0, 99, 3,218, 0, 24, 0, 24, 0, 36, 0,
+ 24, 0, 63, 0, 23, 0, 51, 6, 23, 0, 52, 6, 23, 0, 53, 6, 7, 0, 54, 6, 7, 0, 55, 6, 7, 0, 56, 6, 7, 0, 57, 6,
+ 2, 0, 58, 6, 2, 0, 59, 6, 2, 0, 60, 6, 2, 0, 61, 6, 2, 0, 62, 6, 2, 0, 19, 0, 2, 0, 63, 6, 2, 0, 64, 6,
+ 2, 0, 65, 6, 2, 0, 66, 6, 2, 0, 67, 6, 2, 0, 31, 6, 7, 0, 68, 6, 4, 0, 69, 6, 4, 0, 70, 6,217, 0, 6, 0,
+217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,219, 0, 8, 0,217, 0, 0, 0,
+217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,220, 0, 71, 6, 46, 0,129, 0,221, 0, 14, 0,
+217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,218, 0, 72, 6,222, 0, 73, 6,
+ 12, 0, 74, 6, 2, 0, 69, 1, 2, 0, 75, 6, 4, 0, 19, 0, 7, 0, 76, 6, 4, 0, 31, 6,223, 0, 20, 0,217, 0, 0, 0,
+217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,211, 0, 9, 6,218, 0, 72, 6, 2, 0, 77, 6,
+ 2, 0, 78, 6, 2, 0, 79, 6, 2, 0, 80, 6, 2, 0, 63, 6, 2, 0, 81, 6, 0, 0, 19, 0, 0, 0,178, 4, 9, 0, 56, 2,
+ 4, 0, 82, 6, 4, 0, 83, 6, 27, 0, 84, 6,224, 0, 18, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6,
+ 7, 0, 22, 6, 2, 0, 23, 6,218, 0, 72, 6, 7, 0, 81, 2, 7, 0, 82, 2, 2, 0, 77, 6, 2, 0, 85, 6, 2, 0, 86, 6,
+ 2, 0, 87, 6, 4, 0, 19, 0, 7, 0, 88, 6, 4, 0,241, 5, 4, 0, 37, 0,164, 0, 99, 3,225, 0, 15, 0, 0, 0, 89, 6,
+ 0, 0, 90, 6, 0, 0, 91, 6, 0, 0, 92, 6, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 93, 6, 2, 0, 94, 6, 2, 0,169, 1,
+ 2, 0, 95, 6, 4, 0, 96, 6, 4, 0, 97, 6, 2, 0, 98, 6, 2, 0, 37, 0, 0, 0, 99, 6,226, 0, 16, 0,217, 0, 0, 0,
+217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 4, 0,100, 6,225, 0,101, 6,227, 0,102, 6, 12, 0,103, 6, 12, 0,104, 6,
+228, 0,105, 6,215, 0,106, 6,229, 0,107, 6, 2, 0,108, 6, 2, 0,109, 6, 2, 0,110, 6, 2, 0, 69, 0,230, 0, 17, 0,
+217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,218, 0, 72, 6, 12, 0,111, 6,
+231, 0,112, 6, 0, 0,113, 6,232, 0,114, 6, 4, 0,115, 6, 4, 0,116, 6, 2, 0, 19, 0, 2, 0,117, 6, 2, 0,118, 6,
+ 2, 0, 37, 0,233, 0, 32, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,
+ 47, 0,222, 2, 45, 0, 57, 1, 63, 0,119, 6, 2, 0,128, 0, 2, 0,120, 6, 2, 0, 69, 0, 2, 0,121, 6, 4, 0, 19, 0,
+ 2, 0,122, 6, 2, 0,123, 6, 2, 0,124, 6, 2, 0,226, 1, 0, 0,125, 6, 0, 0,126, 6, 0, 0,127, 6, 0, 0, 31, 6,
+ 7, 0,128, 6, 7, 0, 81, 2, 7, 0, 82, 2, 7, 0, 88, 6, 7, 0,248, 1, 7, 0,129, 6, 7, 0,130, 6,164, 0, 99, 3,
+234, 0,131, 6,235, 0,132, 6,236, 0, 11, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6,
+ 2, 0, 23, 6, 2, 0, 75, 6, 2, 0, 19, 0, 4, 0, 37, 0,222, 0, 73, 6,218, 0, 72, 6,237, 0, 27, 0,217, 0, 0, 0,
+217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6, 42, 0,133, 6, 4, 0,134, 6, 4, 0,135, 6,
+ 2, 0, 90, 0, 2, 0,128, 0, 2, 0,136, 6, 0, 0,137, 6, 0, 0,138, 6, 4, 0,139, 6, 4, 0,140, 6, 4, 0,141, 6,
+ 4, 0,142, 6, 2, 0,143, 6, 2, 0,144, 6, 7, 0,145, 6, 23, 0,146, 6, 23, 0,147, 6, 4, 0,148, 6, 4, 0,149, 6,
+ 0, 0,150, 6, 0, 0,151, 6,238, 0, 10, 0, 27, 0, 31, 0, 9, 0,152, 6, 9, 0,153, 6, 9, 0,154, 6, 9, 0,155, 6,
+ 9, 0,156, 6, 4, 0, 90, 0, 4, 0,157, 6, 0, 0,158, 6, 0, 0,159, 6,239, 0, 10, 0,217, 0, 0, 0,217, 0, 1, 0,
+ 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6,238, 0,160, 6, 2, 0, 90, 0, 2, 0,128, 0, 4, 0, 89, 0, 9, 0,161, 6,
+240, 0, 9, 0,240, 0, 0, 0,240, 0, 1, 0, 4, 0, 17, 0, 4, 0, 19, 0, 7, 0,162, 6, 4, 0, 23, 0, 4, 0,238, 3,
+ 4, 0,239, 3, 4, 0,124, 0,241, 0, 11, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6,
+218, 0, 72, 6, 12, 0,163, 6, 4, 0,164, 6, 4, 0, 37, 0, 4, 0, 19, 0, 4, 0,165, 6,242, 0, 25, 0,217, 0, 0, 0,
+217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,218, 0, 72, 6, 27, 0,166, 6, 27, 0, 80, 0,
+ 2, 0, 19, 0, 2, 0,128, 0, 7, 0,167, 6, 9, 0,168, 6, 7, 0, 81, 2, 7, 0, 82, 2, 7, 0, 88, 6, 7, 0, 19, 6,
+ 7, 0,169, 6, 7, 0,170, 6, 60, 0, 58, 1, 60, 0,171, 6, 4, 0,172, 6, 2, 0,173, 6, 2, 0, 37, 0,164, 0, 99, 3,
+243, 0, 10, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6, 2, 0, 19, 0,
+ 2, 0,128, 3, 4, 0, 37, 0,164, 0, 99, 3,244, 0, 42, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6,
+ 7, 0, 22, 6, 2, 0, 23, 6,218, 0, 72, 6,227, 0,102, 6, 0, 0, 89, 6, 0, 0, 90, 6, 0, 0, 91, 6, 2, 0, 17, 0,
+ 2, 0,174, 6, 2, 0, 19, 0, 2, 0, 93, 6, 9, 0,168, 6, 4, 0, 96, 6, 4, 0,175, 6, 4, 0,176, 6, 4, 0, 97, 6,
+ 23, 0,177, 6, 23, 0,178, 6, 7, 0,179, 6, 7, 0,180, 6, 7, 0,181, 6, 7, 0,167, 6, 2, 0,182, 6, 2, 0,234, 0,
+ 2, 0,169, 1, 2, 0, 95, 6, 2, 0, 37, 0, 2, 0, 89, 0, 2, 0,183, 6, 2, 0,184, 6, 9, 0,185, 6, 9, 0,186, 6,
+ 9, 0,187, 6, 9, 0,188, 6, 9, 0,189, 6, 2, 0,190, 6, 0, 0,191, 6, 57, 0,192, 6,245, 0, 7, 0,245, 0, 0, 0,
+245, 0, 1, 0, 4, 0,193, 6, 4, 0, 23, 0, 0, 0, 83, 0, 4, 0,194, 6, 4, 0, 17, 0,246, 0, 16, 0,217, 0, 0, 0,
+217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6, 4, 0, 17, 0, 4, 0,195, 6, 4, 0, 19, 0,
+ 4, 0,136, 6, 12, 0,196, 6, 12, 0,197, 6, 0, 0,198, 6, 0, 0,199, 6, 4, 0,200, 6, 4, 0,201, 6,247, 0, 6, 0,
+217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 4, 0, 37, 0, 0, 0,202, 6,248, 0, 15, 0,217, 0, 0, 0,
+217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6,249, 0,203, 6,218, 0, 72, 6,250, 0,204, 6, 2, 0, 69, 1,
+ 2, 0,205, 6, 2, 0, 81, 2, 2, 0, 82, 2, 2, 0, 19, 0, 2, 0,123, 6, 4, 0, 69, 0,251, 0, 7, 0,251, 0, 0, 0,
+251, 0, 1, 0, 0, 0,206, 6, 2, 0,207, 6, 2, 0,208, 6, 2, 0,209, 6, 2, 0, 37, 0,252, 0, 12, 0, 2, 0,208, 6,
+ 2, 0,210, 6, 2, 0,211, 6, 0, 0,183, 2, 2, 0,212, 6, 2, 0,213, 6, 2, 0,214, 6, 2, 0,215, 6, 2, 0,216, 6,
+ 2, 0, 63, 6, 7, 0,217, 6, 7, 0,218, 6,253, 0, 18, 0,253, 0, 0, 0,253, 0, 1, 0, 0, 0,242, 3,252, 0,219, 6,
+252, 0,220, 6,252, 0,221, 6,252, 0,222, 6, 7, 0,223, 6, 2, 0,224, 6, 2, 0,225, 6, 2, 0,226, 6, 2, 0,227, 6,
+ 2, 0,228, 6, 2, 0,229, 6, 2, 0,230, 6, 2, 0,231, 6, 2, 0,232, 6, 2, 0,233, 6,254, 0, 10, 0, 0, 0,234, 6,
+ 0, 0,235, 6, 0, 0,236, 6, 0, 0,237, 6, 0, 0,238, 6, 0, 0,239, 6, 2, 0,240, 6, 2, 0,241, 6, 2, 0,242, 6,
+ 2, 0,243, 6,255, 0, 8, 0, 0, 0,244, 6, 0, 0,245, 6, 0, 0,246, 6, 0, 0,247, 6, 0, 0,248, 6, 0, 0,249, 6,
+ 7, 0,240, 5, 7, 0, 37, 0, 0, 1, 18, 0,254, 0,250, 6,254, 0,251, 6,254, 0,252, 6,254, 0,253, 6,254, 0,254, 6,
+254, 0,255, 6,254, 0, 0, 7,254, 0, 1, 7,254, 0, 2, 7,254, 0, 3, 7,254, 0, 4, 7,254, 0, 5, 7,254, 0, 6, 7,
+254, 0, 7, 7,254, 0, 8, 7,254, 0, 9, 7,255, 0, 10, 7, 0, 0, 11, 7, 1, 1, 92, 0, 0, 0, 12, 7, 0, 0, 13, 7,
+ 0, 0,238, 6, 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, 0, 0, 90, 7, 0, 0, 91, 7, 0, 0, 92, 7,
+ 0, 0, 93, 7, 0, 0, 94, 7, 0, 0, 95, 7, 0, 0, 96, 7, 0, 0, 97, 7, 0, 0, 98, 7, 0, 0, 99, 7, 0, 0,100, 7,
+ 0, 0,101, 7, 0, 0,102, 7, 2, 1, 5, 0, 0, 0,103, 7, 0, 0, 36, 7, 0, 0, 38, 7, 2, 0, 19, 0, 2, 0, 37, 0,
+ 3, 1, 25, 0, 3, 1, 0, 0, 3, 1, 1, 0, 0, 0, 20, 0, 0, 1,104, 7, 1, 1,105, 7, 1, 1,106, 7, 1, 1,107, 7,
+ 1, 1,108, 7, 1, 1,109, 7, 1, 1,110, 7, 1, 1,111, 7, 1, 1,112, 7, 1, 1,113, 7, 1, 1,114, 7, 1, 1,115, 7,
+ 1, 1,116, 7, 1, 1,117, 7, 1, 1,118, 7, 1, 1,119, 7, 1, 1,120, 7, 1, 1,121, 7, 1, 1,122, 7, 2, 1,123, 7,
+ 4, 0,124, 7, 4, 0, 37, 0, 4, 1, 3, 0, 4, 1, 0, 0, 4, 1, 1, 0, 0, 0,125, 7, 5, 1, 5, 0, 4, 0, 19, 0,
+ 4, 0, 37, 0, 7, 0,130, 2, 7, 0,126, 7, 7, 0, 32, 2, 6, 1, 86, 0, 4, 0, 19, 0, 4, 0,127, 7, 4, 0,128, 7,
+ 0, 0,129, 7, 0, 0,130, 7, 0, 0,131, 7, 0, 0,132, 7, 0, 0,133, 7, 0, 0,134, 7, 0, 0,135, 7, 0, 0,136, 7,
+ 0, 0,137, 7, 0, 0,138, 7, 4, 0,139, 7, 2, 0,140, 7, 2, 0,141, 7, 2, 0,142, 7, 2, 0,143, 7, 4, 0,144, 7,
+ 4, 0,145, 7, 4, 0,146, 7, 4, 0,147, 7, 2, 0,148, 7, 2, 0,149, 7, 4, 0,150, 7, 4, 0,151, 7, 4, 0,152, 7,
+ 4, 0,153, 7, 4, 0,154, 7, 4, 0,196, 6, 4, 0,155, 7, 2, 0,156, 7, 2, 0,157, 7, 2, 0,158, 7, 2, 0,159, 7,
+ 12, 0,160, 7, 12, 0,161, 7, 12, 0,162, 7, 12, 0,163, 7, 12, 0,164, 7, 0, 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,173, 7, 5, 1,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, 69, 0, 4, 0,182, 7,
+ 4, 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, 2, 0,193, 7, 2, 0,194, 7, 2, 0,195, 7, 2, 0,196, 7, 2, 0,197, 7, 2, 0,198, 7,
+ 2, 0,199, 7, 2, 0,200, 7, 2, 0,178, 4, 0, 0,201, 7, 0, 0,202, 7, 7, 0,203, 7, 2, 0,158, 5, 2, 0,159, 5,
+ 55, 0,204, 7, 7, 0,205, 7, 4, 0,226, 1,220, 0, 21, 0, 27, 0, 31, 0, 12, 0,206, 7, 12, 0,207, 7, 12, 0,208, 7,
+ 12, 0, 20, 6, 46, 0,129, 0, 46, 0,209, 7, 2, 0,210, 7, 2, 0,211, 7, 2, 0,212, 7, 2, 0,213, 7, 2, 0,214, 7,
+ 2, 0,215, 7, 2, 0,216, 7, 2, 0,217, 7, 2, 0,218, 7, 2, 0,219, 7, 4, 0, 69, 0,215, 0,220, 7, 9, 0,221, 7,
+ 2, 0,222, 7, 7, 1, 5, 0, 7, 1, 0, 0, 7, 1, 1, 0, 7, 1,223, 7, 13, 0,224, 7, 4, 0, 19, 0, 8, 1, 7, 0,
+ 8, 1, 0, 0, 8, 1, 1, 0, 7, 1,225, 7, 7, 1,226, 7, 2, 0, 27, 5, 2, 0, 19, 0, 4, 0, 37, 0, 9, 1, 25, 0,
+ 9, 1, 0, 0, 9, 1, 1, 0, 10, 1,227, 7, 11, 1,107, 6, 0, 0,228, 7, 0, 0,229, 7, 0, 0,230, 7, 2, 0,231, 7,
+ 2, 0,232, 7, 2, 0,233, 7, 2, 0,234, 7, 2, 0,235, 7, 2, 0, 37, 0, 2, 0, 19, 0, 2, 0,236, 7, 2, 0,237, 7,
+ 2, 0,238, 7, 4, 0,239, 7, 9, 1,240, 7, 9, 0,241, 7, 4, 0,242, 7, 4, 0,243, 7, 4, 0,244, 7, 4, 0,245, 7,
+ 0, 0,246, 7,249, 0, 22, 0,249, 0, 0, 0,249, 0, 1, 0, 7, 1,225, 7, 7, 1,226, 7, 7, 1,247, 7, 7, 1,248, 7,
+220, 0,249, 7, 23, 0, 51, 0, 0, 0, 21, 6, 0, 0,250, 7, 2, 0, 64, 6, 2, 0, 65, 6, 2, 0,251, 7, 2, 0, 37, 0,
+ 2, 0,213, 7, 2, 0,194, 6, 2, 0, 19, 0, 12, 1,227, 7, 12, 0,252, 7, 12, 0, 20, 6, 12, 0,253, 7, 12, 0,254, 7,
+ 13, 1, 24, 0, 13, 1, 0, 0, 13, 1, 1, 0,218, 0, 72, 6, 23, 0,255, 7, 23, 0, 0, 8, 2, 0, 64, 6, 2, 0, 65, 6,
+ 2, 0, 1, 8, 2, 0, 2, 8, 2, 0, 3, 8, 2, 0, 19, 0, 7, 0, 77, 2, 2, 0,233, 7, 2, 0,234, 7, 2, 0,212, 7,
+ 2, 0, 4, 8, 2, 0,217, 7, 2, 0,178, 4, 14, 1,227, 7, 12, 0, 5, 8, 12, 0, 6, 8, 12, 0,253, 7, 0, 0, 7, 8,
+ 9, 0, 8, 8, 15, 1, 12, 0, 0, 0, 9, 8, 2, 0, 10, 8, 2, 0, 11, 8, 2, 0, 12, 8, 2, 0, 13, 8, 2, 0, 14, 5,
+ 2, 0, 9, 5,220, 0, 14, 8, 46, 0, 15, 8, 4, 0, 16, 8, 4, 0, 17, 8, 0, 0, 18, 8, 16, 1, 1, 0, 0, 0, 19, 8,
+ 17, 1, 8, 0, 57, 0, 20, 8, 57, 0, 21, 8, 17, 1, 22, 8, 17, 1, 23, 8, 17, 1, 24, 8, 2, 0,124, 0, 2, 0, 19, 0,
+ 4, 0, 25, 8, 18, 1, 4, 0, 4, 0,134, 6, 4, 0, 26, 8, 4, 0,139, 6, 4, 0, 27, 8, 19, 1, 2, 0, 4, 0, 28, 8,
+ 4, 0, 29, 8, 20, 1, 5, 0, 7, 0, 30, 8, 7, 0, 31, 8, 7, 0, 32, 8, 4, 0, 19, 0, 4, 0, 37, 0, 21, 1, 6, 0,
+ 0, 0, 33, 8, 0, 0, 91, 6, 49, 0,132, 0, 2, 0,106, 0, 2, 0, 13, 5, 4, 0, 37, 0, 22, 1, 21, 0, 22, 1, 0, 0,
+ 22, 1, 1, 0, 4, 0, 56, 0, 4, 0, 23, 0, 4, 0, 28, 0, 4, 0, 34, 8, 4, 0, 35, 8, 4, 0, 36, 8, 16, 1, 37, 8,
+ 0, 0, 33, 8, 4, 0, 38, 8, 4, 0, 39, 8, 21, 1, 93, 3, 18, 1, 40, 8, 19, 1, 41, 8, 20, 1, 42, 8, 17, 1, 43, 8,
+ 17, 1, 44, 8, 17, 1, 45, 8, 57, 0, 46, 8, 57, 0, 47, 8, 23, 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, 48, 8, 9, 0, 49, 8, 9, 0,229, 0,
+ 9, 0,231, 0, 24, 1, 48, 0, 24, 1, 0, 0, 24, 1, 1, 0, 9, 0, 50, 8, 9, 0, 26, 0, 0, 0, 27, 0, 4, 0, 19, 0,
+ 4, 0, 17, 0, 4, 0, 23, 0, 4, 0, 87, 0, 4, 0, 51, 8, 4, 0, 52, 8, 4, 0, 35, 8, 4, 0, 36, 8, 4, 0, 53, 8,
+ 4, 0,243, 0, 4, 0, 54, 8, 4, 0, 55, 8, 7, 0, 56, 8, 7, 0, 37, 0, 7, 0, 57, 8, 7, 0, 58, 8, 4, 0,121, 0,
+ 4, 0, 59, 8, 22, 1, 60, 8, 36, 0, 79, 0, 46, 0,129, 0, 32, 0, 61, 8, 49, 0,132, 0, 7, 0, 62, 8, 7, 0, 63, 8,
+ 23, 1, 59, 1, 24, 1, 64, 8, 24, 1, 65, 8, 24, 1, 66, 8, 12, 0, 67, 8,250, 0,204, 6, 9, 0, 68, 8, 7, 0,251, 3,
+ 7, 0, 69, 8, 7, 0, 70, 8, 4, 0, 71, 8, 4, 0, 72, 8, 7, 0, 73, 8, 9, 0, 74, 8, 4, 0, 75, 8, 4, 0, 76, 8,
+ 4, 0, 77, 8, 7, 0, 78, 8, 25, 1, 4, 0, 25, 1, 0, 0, 25, 1, 1, 0, 12, 0, 79, 8, 24, 1, 80, 8,206, 0, 11, 0,
+ 12, 0, 81, 8, 12, 0, 67, 8, 12, 0, 82, 8, 24, 1, 83, 8, 0, 0, 84, 8, 0, 0, 85, 8, 4, 0, 86, 8, 4, 0, 87, 8,
+ 4, 0, 88, 8, 4, 0, 37, 0, 24, 0, 89, 8, 26, 1, 4, 0, 7, 0, 90, 8, 7, 0, 67, 3, 2, 0, 91, 8, 2, 0, 92, 8,
+ 27, 1, 6, 0, 7, 0, 93, 8, 7, 0, 94, 8, 7, 0, 95, 8, 7, 0, 96, 8, 4, 0, 97, 8, 4, 0, 98, 8, 28, 1, 13, 0,
+ 7, 0, 99, 8, 7, 0,100, 8, 7, 0,101, 8, 7, 0,102, 8, 7, 0,103, 8, 7, 0,104, 8, 7, 0,105, 8, 7, 0,106, 8,
+ 7, 0,107, 8, 7, 0,108, 8, 4, 0,228, 2, 4, 0,109, 8, 4, 0,110, 8, 29, 1, 2, 0, 7, 0, 86, 5, 7, 0, 37, 0,
+ 30, 1, 5, 0, 7, 0,111, 8, 7, 0,112, 8, 4, 0, 90, 0, 4, 0,184, 2, 4, 0,113, 8, 31, 1, 6, 0, 31, 1, 0, 0,
+ 31, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,114, 8, 2, 0, 56, 0, 32, 1, 8, 0, 32, 1, 0, 0, 32, 1, 1, 0,
+ 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,114, 8, 2, 0, 56, 0, 7, 0, 23, 0, 7, 0,121, 0, 33, 1, 45, 0, 33, 1, 0, 0,
+ 33, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,114, 8, 2, 0,239, 0, 2, 0, 37, 4, 2, 0,115, 8, 7, 0,116, 8,
+ 7, 0, 88, 0, 7, 0,241, 2, 4, 0,117, 8, 4, 0, 81, 0, 4, 0,186, 2, 7, 0,118, 8, 7, 0,119, 8, 7, 0,120, 8,
+ 7, 0,121, 8, 7, 0,122, 8, 7, 0,123, 8, 7, 0,238, 2, 7, 0, 56, 1, 7, 0,124, 8, 7, 0,125, 8, 7, 0, 37, 0,
+ 7, 0,126, 8, 7, 0,127, 8, 7, 0,128, 8, 2, 0,129, 8, 2, 0,130, 8, 2, 0,131, 8, 2, 0,132, 8, 2, 0,133, 8,
+ 2, 0,134, 8, 2, 0,135, 8, 2, 0,136, 8, 2, 0, 17, 2, 2, 0,137, 8, 2, 0, 14, 2, 2, 0,138, 8, 0, 0,139, 8,
+ 0, 0,140, 8, 7, 0,237, 0, 34, 1,141, 8, 66, 0,229, 1, 35, 1, 16, 0, 35, 1, 0, 0, 35, 1, 1, 0, 2, 0, 17, 0,
+ 2, 0, 19, 0, 2, 0,114, 8, 2, 0,239, 0, 7, 0,233, 2, 7, 0,234, 2, 7, 0,235, 2, 7, 0, 66, 2, 7, 0,236, 2,
+ 7, 0,237, 2, 7, 0,142, 8, 7, 0,238, 2, 7, 0,240, 2, 7, 0,241, 2,232, 0, 5, 0, 2, 0, 17, 0, 2, 0, 25, 8,
+ 2, 0, 19, 0, 2, 0,143, 8, 27, 0,166, 6,231, 0, 3, 0, 4, 0, 68, 0, 4, 0,144, 8,232, 0, 2, 0, 36, 1, 7, 0,
+ 36, 1, 0, 0, 36, 1, 1, 0, 0, 0, 20, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 22, 0, 9, 0,145, 8, 37, 1, 5, 0,
+ 0, 0, 20, 0, 7, 0, 76, 1, 7, 0,146, 8, 4, 0,147, 8, 4, 0, 37, 0, 38, 1, 4, 0, 2, 0, 17, 0, 2, 0, 19, 0,
+ 2, 0, 89, 0, 2, 0, 69, 0, 39, 1, 4, 0, 0, 0, 20, 0, 65, 0,148, 8, 7, 0, 76, 1, 7, 0, 37, 0, 40, 1, 6, 0,
+ 2, 0,149, 8, 2, 0,150, 8, 2, 0, 17, 0, 2, 0,151, 8, 0, 0,152, 8, 0, 0,153, 8, 41, 1, 5, 0, 4, 0, 17, 0,
+ 4, 0, 37, 0, 0, 0, 20, 0, 0, 0,154, 8, 0, 0,155, 8, 42, 1, 3, 0, 4, 0, 17, 0, 4, 0, 37, 0, 0, 0, 20, 0,
+ 43, 1, 4, 0, 2, 0,156, 8, 2, 0,157, 8, 2, 0, 19, 0, 2, 0, 37, 0, 44, 1, 6, 0, 0, 0, 20, 0, 0, 0,158, 8,
+ 2, 0,159, 8, 2, 0,238, 2, 2, 0, 69, 1, 2, 0, 69, 0, 45, 1, 5, 0, 0, 0, 20, 0, 7, 0, 67, 3, 7, 0,128, 4,
+ 2, 0, 19, 0, 2, 0,198, 2, 46, 1, 3, 0, 0, 0, 20, 0, 4, 0,186, 2, 4, 0,156, 8, 47, 1, 7, 0, 0, 0, 20, 0,
+ 7, 0,128, 4, 0, 0,160, 8, 0, 0,161, 8, 2, 0, 69, 1, 2, 0, 89, 0, 4, 0,162, 8, 48, 1, 4, 0, 0, 0,163, 8,
+ 0, 0,164, 8, 4, 0, 17, 0, 7, 0,202, 2, 49, 1, 3, 0, 32, 0,165, 8, 0, 0,166, 8, 0, 0,167, 8, 50, 1, 18, 0,
+ 50, 1, 0, 0, 50, 1, 1, 0, 2, 0, 17, 0, 2, 0,168, 8, 2, 0, 19, 0, 2, 0,169, 8, 2, 0,170, 8, 2, 0,171, 8,
+ 2, 0, 89, 0, 2, 0, 69, 0, 0, 0, 20, 0, 9, 0, 2, 0, 51, 1,172, 8, 32, 0, 44, 0, 2, 0,102, 5, 2, 0, 69, 8,
+ 2, 0,173, 8, 2, 0, 37, 0, 52, 1, 11, 0, 0, 0, 20, 0, 0, 0, 17, 0, 0, 0,174, 8, 2, 0, 19, 0, 2, 0,198, 2,
+ 2, 0,175, 8, 4, 0,176, 8, 4, 0,177, 8, 4, 0,178, 8, 4, 0,179, 8, 4, 0,180, 8, 53, 1, 1, 0, 0, 0,181, 8,
+ 54, 1, 4, 0, 42, 0,133, 6, 0, 0,125, 7, 4, 0, 69, 1, 4, 0, 19, 0, 51, 1, 18, 0, 51, 1, 0, 0, 51, 1, 1, 0,
+ 51, 1,182, 8, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,183, 8, 2, 0,171, 8, 2, 0,168, 8, 2, 0,184, 8, 2, 0, 69, 0,
+ 2, 0,226, 1, 0, 0, 20, 0, 9, 0, 2, 0, 55, 1,172, 8, 50, 1,185, 8, 2, 0, 15, 0, 2, 0,186, 8, 4, 0,187, 8,
+ 56, 1, 3, 0, 4, 0,212, 2, 4, 0, 37, 0, 32, 0, 44, 0, 57, 1, 12, 0,162, 0,188, 8, 2, 0, 17, 0, 2, 0, 19, 0,
+ 4, 0,116, 8, 4, 0, 88, 0, 0, 0, 20, 0, 0, 0,189, 8, 2, 0,190, 8, 2, 0,191, 8, 2, 0,192, 8, 2, 0,193, 8,
+ 7, 0,194, 8, 58, 1, 8, 0, 7, 0,195, 8, 7, 0,196, 8, 7, 0,197, 8, 7, 0,198, 8, 7, 0,199, 8, 7, 0,200, 8,
+ 7, 0,201, 8, 7, 0,202, 8, 59, 1, 13, 0, 2, 0, 19, 0, 2, 0,205, 6, 4, 0, 89, 0, 4, 0, 69, 0, 2, 0,203, 8,
+ 7, 0,251, 3, 7, 0,204, 8,250, 0,204, 6, 58, 1,205, 8, 2, 0, 17, 0, 2, 0,248, 1, 2, 0,234, 5, 2, 0,206, 8,
+ 60, 1, 11, 0, 4, 0,212, 2, 2, 0, 17, 0, 2, 0, 19, 0, 32, 0, 44, 0, 81, 0,207, 8, 0, 0, 20, 0, 7, 0,208, 8,
+ 7, 0,209, 8, 7, 0,136, 3, 2, 0,210, 8, 2, 0,211, 8, 61, 1, 5, 0, 2, 0, 17, 0, 2, 0, 89, 0, 4, 0, 37, 0,
+ 46, 0,129, 0, 32, 0, 93, 5, 62, 1, 5, 0, 4, 0, 37, 0, 4, 0, 17, 0, 0, 0, 20, 0, 0, 0,154, 8, 32, 0, 44, 0,
+ 63, 1, 13, 0, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0,168, 8, 2, 0,137, 3, 7, 0,212, 8, 7, 0,213, 8, 7, 0,178, 4,
+ 7, 0,149, 3, 7, 0,108, 3, 7, 0,111, 3, 7, 0,214, 8, 7, 0,215, 8, 32, 0,216, 8, 64, 1, 10, 0, 2, 0, 19, 0,
+ 2, 0, 17, 0, 4, 0,116, 8, 4, 0, 88, 0, 0, 0, 20, 0, 0, 0,189, 8, 2, 0, 89, 0, 2, 0, 69, 0, 2, 0,226, 1,
+ 2, 0,248, 1, 65, 1, 8, 0, 32, 0, 44, 0, 7, 0,235, 2, 7, 0,217, 8, 7, 0,218, 8, 7, 0, 37, 0, 2, 0, 89, 0,
+ 2, 0,198, 2, 7, 0, 69, 0, 66, 1, 12, 0, 2, 0, 17, 0, 2, 0, 69, 1, 2, 0, 19, 0, 2, 0,238, 2, 2, 0,212, 2,
+ 2, 0,219, 8, 4, 0, 37, 0, 7, 0,220, 8, 7, 0,221, 8, 7, 0,222, 8, 7, 0,223, 8, 0, 0,224, 8, 67, 1, 9, 0,
+ 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,116, 8, 4, 0, 88, 0, 0, 0, 20, 0, 2, 0,178, 4, 2, 0, 63, 0, 2, 0,225, 8,
+ 2, 0,226, 8, 68, 1, 7, 0, 4, 0,186, 2, 4, 0,227, 8, 4, 0,228, 8, 4, 0,229, 8, 7, 0,230, 8, 7, 0,231, 8,
+ 0, 0,160, 8, 69, 1, 7, 0, 0, 0,232, 8, 32, 0,233, 8, 0, 0,166, 8, 2, 0,234, 8, 2, 0, 89, 0, 4, 0, 69, 0,
+ 0, 0,167, 8, 70, 1, 6, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,116, 8, 4, 0, 88, 0, 0, 0,235, 8, 0, 0,236, 8,
+ 71, 1, 1, 0, 4, 0, 19, 0, 72, 1, 6, 0, 0, 0, 92, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0,237, 8, 7, 0,238, 8,
+ 42, 0,133, 6, 73, 1, 4, 0, 0, 0, 61, 2, 2, 0, 19, 0, 4, 0, 17, 0, 32, 0, 44, 0, 74, 1, 2, 0, 4, 0, 17, 0,
+ 4, 0, 53, 6, 75, 1, 6, 0, 0, 0,163, 8, 0, 0,164, 8, 4, 0, 17, 0, 7, 0, 25, 2, 32, 0, 46, 3, 32, 0,239, 8,
+ 55, 1, 10, 0, 55, 1, 0, 0, 55, 1, 1, 0, 55, 1,182, 8, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,168, 8, 2, 0,240, 8,
+ 0, 0, 20, 0, 9, 0, 2, 0, 32, 0, 44, 0,250, 0, 16, 0, 27, 0, 31, 0, 0, 0, 34, 0, 43, 0,147, 0, 9, 0,220, 0,
+ 43, 0,241, 8, 36, 0, 79, 0, 7, 0,251, 3, 7, 0,242, 8, 7, 0,204, 8, 7, 0,195, 8, 7, 0,196, 8, 7, 0,243, 8,
+ 4, 0, 90, 0, 4, 0, 37, 0, 9, 0,244, 8, 9, 0,245, 8, 76, 1, 6, 0, 76, 1, 0, 0, 76, 1, 1, 0, 32, 0, 44, 0,
+ 9, 0,246, 8, 4, 0,244, 0, 4, 0, 37, 0, 66, 0, 4, 0, 27, 0, 31, 0, 12, 0,247, 8, 4, 0,126, 0, 7, 0,248, 8,
+ 77, 1, 27, 0, 77, 1, 0, 0, 77, 1, 1, 0, 26, 0,249, 8, 77, 1, 38, 0, 12, 0,250, 8, 0, 0, 20, 0, 7, 0,251, 8,
+ 7, 0,252, 8, 7, 0,253, 8, 7, 0,254, 8, 4, 0, 19, 0, 7, 0,255, 8, 7, 0, 0, 9, 7, 0, 1, 9, 7, 0, 76, 1,
+ 7, 0, 25, 2, 7, 0, 2, 9, 7, 0,184, 2, 7, 0, 3, 9, 7, 0, 4, 9, 7, 0, 5, 9, 7, 0, 6, 9, 7, 0, 7, 9,
+ 7, 0,169, 0, 4, 0,126, 0, 2, 0,139, 5, 2, 0,178, 4, 78, 1, 25, 0, 27, 0, 31, 0, 39, 0, 74, 0, 12, 0, 8, 9,
+ 12, 0, 9, 9, 12, 0, 10, 9, 77, 1, 11, 9, 9, 0, 12, 9, 9, 0, 13, 9, 4, 0, 19, 0, 4, 0, 29, 6, 2, 0,242, 2,
+ 2, 0, 82, 6, 4, 0, 37, 0, 4, 0,126, 0, 4, 0, 14, 9, 2, 0, 15, 9, 2, 0, 16, 9, 2, 0, 17, 9, 2, 0, 18, 9,
+ 4, 0, 19, 9, 4, 0, 20, 9, 4, 0, 21, 9, 4, 0, 22, 9, 4, 0, 23, 9, 4, 0, 24, 9, 79, 1, 2, 0, 7, 0,144, 2,
+ 4, 0, 19, 0,166, 0, 5, 0, 79, 1, 25, 9, 4, 0,184, 2, 4, 0, 26, 9, 4, 0, 27, 9, 4, 0, 19, 0,165, 0, 16, 0,
+ 4, 0, 28, 9, 4, 0, 29, 9, 4, 0, 30, 9, 4, 0, 31, 9, 2, 0, 32, 9, 2, 0, 33, 9, 2, 0, 34, 9, 2, 0,244, 0,
+ 2, 0, 35, 9, 2, 0, 36, 9, 2, 0, 37, 9, 2, 0, 38, 9, 4, 0, 39, 9, 4, 0, 40, 9, 4, 0, 41, 9, 4, 0, 42, 9,
+ 80, 1, 44, 0, 80, 1, 0, 0, 80, 1, 1, 0, 26, 0,249, 8, 12, 0,163, 3, 0, 0, 20, 0, 2, 0, 19, 0, 2, 0, 43, 9,
+ 2, 0, 44, 9, 2, 0, 45, 9, 2, 0,122, 3, 2, 0, 46, 9, 4, 0, 64, 2, 4, 0, 21, 9, 4, 0, 22, 9, 77, 1, 47, 9,
+ 80, 1, 38, 0, 80, 1, 48, 9, 12, 0, 49, 9, 9, 0, 50, 9, 9, 0, 51, 9, 9, 0, 52, 9, 7, 0, 64, 1, 7, 0,169, 0,
+ 7, 0, 53, 9, 7, 0, 4, 2, 7, 0,113, 3, 7, 0,115, 3, 2, 0,145, 3, 2, 0, 37, 0, 7, 0, 54, 9, 7, 0, 55, 9,
+ 7, 0,118, 3, 7, 0, 56, 9, 7, 0, 57, 9, 7, 0, 58, 9, 7, 0, 59, 9, 7, 0, 60, 9, 7, 0, 61, 9, 7, 0, 62, 9,
+ 7, 0, 63, 9, 7, 0, 56, 2,166, 0,101, 3, 32, 0, 64, 9, 80, 1, 65, 9,163, 0, 14, 0, 12, 0, 66, 9, 76, 0, 67, 9,
+ 2, 0, 19, 0, 2, 0, 68, 9, 7, 0, 93, 2, 7, 0, 69, 9, 7, 0, 70, 9, 12, 0, 71, 9, 4, 0, 72, 9, 4, 0, 73, 9,
+ 9, 0, 74, 9, 9, 0, 75, 9,165, 0,100, 3, 0, 0, 76, 9, 81, 1, 1, 0, 4, 0, 73, 9, 82, 1, 12, 0, 4, 0, 73, 9,
+ 7, 0,180, 8, 2, 0, 77, 9, 2, 0, 78, 9, 7, 0, 79, 9, 7, 0, 80, 9, 2, 0, 81, 9, 2, 0, 19, 0, 7, 0, 82, 9,
+ 7, 0, 83, 9, 7, 0, 84, 9, 7, 0, 85, 9, 83, 1, 7, 0, 83, 1, 0, 0, 83, 1, 1, 0, 12, 0, 86, 9, 4, 0, 19, 0,
+ 4, 0, 87, 9, 0, 0,242, 3, 2, 1, 88, 9,162, 0, 7, 0, 27, 0, 31, 0, 12, 0, 89, 9, 12, 0, 66, 9, 12, 0, 90, 9,
+ 12, 0,100, 0, 4, 0, 19, 0, 4, 0, 91, 9,222, 0, 5, 0, 27, 0, 92, 9, 12, 0, 66, 9, 66, 0, 93, 9, 4, 0, 94, 9,
+ 4, 0, 19, 0, 84, 1, 13, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,
+218, 0, 72, 6,162, 0, 96, 3,222, 0, 95, 9, 0, 0, 69, 1, 0, 0, 75, 6, 2, 0, 19, 0, 7, 0, 96, 9, 85, 1, 8, 0,
+ 85, 1, 0, 0, 85, 1, 1, 0, 83, 1, 97, 9, 36, 0, 79, 0, 12, 0,102, 3, 4, 0, 19, 0, 0, 0, 20, 0, 4, 0, 98, 9,
+ 86, 1, 5, 0, 86, 1, 0, 0, 86, 1, 1, 0, 36, 0, 79, 0, 2, 0, 19, 0, 0, 0, 99, 9, 87, 1, 14, 0, 87, 1, 0, 0,
+ 87, 1, 1, 0, 9, 0, 2, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0,100, 9, 0, 0,101, 9, 0, 0, 99, 9, 7, 0,102, 9,
+ 7, 0,103, 9, 4, 0, 37, 0, 36, 0, 79, 0, 7, 0,104, 9, 7, 0,105, 9, 88, 1, 9, 0, 88, 1, 0, 0, 88, 1, 1, 0,
+ 32, 0,106, 9, 0, 0,245, 2, 7, 0,107, 9, 2, 0,108, 9, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0,109, 9, 89, 1, 7, 0,
+ 42, 0,133, 6, 26, 0,249, 8, 4, 0, 19, 0, 4, 0,110, 9, 12, 0,111, 9, 32, 0,106, 9, 0, 0,245, 2, 90, 1, 15, 0,
+ 32, 0,106, 9, 2, 0,112, 9, 2, 0, 19, 0, 2, 0,113, 9, 2, 0,114, 9, 0, 0,245, 2, 32, 0,115, 9, 0, 0,116, 9,
+ 7, 0,117, 9, 7, 0, 25, 2, 7, 0,118, 9, 7, 0,119, 9, 2, 0, 17, 0, 2, 0, 69, 1, 7, 0, 76, 1, 91, 1, 6, 0,
+ 32, 0,106, 9, 7, 0, 25, 9, 2, 0,120, 9, 2, 0,121, 9, 2, 0, 19, 0, 2, 0,122, 9, 92, 1, 6, 0, 32, 0,106, 9,
+ 4, 0,123, 9, 4, 0,124, 9, 4, 0, 90, 0, 4, 0, 37, 0, 0, 0,245, 2, 93, 1, 4, 0, 32, 0,106, 9, 4, 0, 19, 0,
+ 4, 0,123, 9, 0, 0,245, 2, 94, 1, 4, 0, 32, 0,106, 9, 4, 0, 19, 0, 4, 0,123, 9, 0, 0,245, 2, 95, 1, 4, 0,
+ 32, 0,106, 9, 4, 0, 19, 0, 4, 0,123, 9, 0, 0,245, 2, 96, 1, 2, 0, 4, 0, 19, 0, 7, 0,251, 3, 97, 1, 2, 0,
+ 32, 0,106, 9, 0, 0,245, 2, 98, 1, 10, 0, 32, 0,106, 9, 4, 0,125, 9, 7, 0,120, 0, 4, 0, 19, 0, 2, 0,126, 6,
+ 2, 0,126, 9, 2, 0, 89, 0, 2, 0, 69, 0, 7, 0,127, 9, 0, 0,245, 2, 99, 1, 10, 0, 32, 0,106, 9, 2, 0, 17, 0,
+ 2, 0, 45, 4, 4, 0, 87, 0, 4, 0, 88, 0, 7, 0,217, 8, 7, 0,218, 8, 4, 0, 37, 0,162, 0,188, 8, 0, 0,245, 2,
+100, 1, 4, 0, 32, 0,106, 9, 4, 0,123, 3, 4, 0,128, 9, 0, 0,245, 2,101, 1, 4, 0, 32, 0,106, 9, 4, 0,123, 3,
+ 4, 0, 37, 0, 0, 0,245, 2,102, 1, 6, 0, 32, 0,106, 9, 7, 0,120, 0, 7, 0, 58, 3, 4, 0,129, 9, 2, 0,123, 3,
+ 2, 0,124, 3,103, 1, 6, 0, 32, 0,106, 9, 4, 0,130, 9, 4, 0,131, 9, 7, 0,132, 9, 7, 0,133, 9, 0, 0,245, 2,
+104, 1, 16, 0, 32, 0,106, 9, 32, 0, 48, 9, 4, 0, 17, 0, 7, 0,134, 9, 7, 0,135, 9, 7, 0,136, 9, 7, 0,137, 9,
+ 7, 0,138, 9, 7, 0,139, 9, 7, 0,140, 9, 7, 0,141, 9, 7, 0,142, 9, 2, 0, 19, 0, 2, 0, 37, 0, 2, 0, 89, 0,
+ 2, 0, 69, 0,105, 1, 3, 0, 32, 0,106, 9, 4, 0, 19, 0, 4, 0, 17, 2,106, 1, 5, 0, 32, 0,106, 9, 4, 0, 19, 0,
+ 4, 0, 37, 0, 7, 0,143, 9, 0, 0,245, 2,107, 1, 10, 0, 32, 0,106, 9, 0, 0,245, 2, 2, 0,144, 9, 2, 0,145, 9,
+ 0, 0,146, 9, 0, 0,147, 9, 7, 0,148, 9, 7, 0,149, 9, 7, 0,150, 9, 7, 0,151, 9,108, 1, 5, 0, 32, 0,106, 9,
+ 0, 0,245, 2, 7, 0,192, 2, 2, 0,152, 9, 2, 0, 19, 0,109, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0,
+ 7, 0, 12, 0, 7, 0,153, 9, 7, 0,154, 9, 2, 0, 19, 0, 2, 0, 17, 2,110, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0,
+ 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,153, 9, 7, 0,154, 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,153, 9, 7, 0,154, 9, 2, 0, 19, 0, 2, 0, 17, 2,112, 1, 7, 0,
+ 32, 0,106, 9, 0, 0,245, 2, 7, 0, 76, 1, 7, 0, 85, 1, 2, 0, 19, 0, 2, 0, 69, 1, 4, 0, 37, 0,113, 1, 5, 0,
+ 32, 0, 46, 3, 7, 0, 76, 1, 2, 0, 50, 3, 0, 0, 52, 3, 0, 0,155, 9,114, 1, 10, 0,114, 1, 0, 0,114, 1, 1, 0,
+ 2, 0, 17, 0, 2, 0, 19, 0, 0, 0,156, 9, 7, 0, 19, 1, 7, 0, 20, 1, 2, 0, 86, 9, 2, 0,157, 9, 32, 0, 44, 0,
+115, 1, 22, 0,115, 1, 0, 0,115, 1, 1, 0, 2, 0, 19, 0, 2, 0, 69, 1, 2, 0,158, 9, 2, 0,159, 9, 36, 0, 79, 0,
+162, 0,188, 8, 32, 0,161, 0, 7, 0, 87, 0, 7, 0, 88, 0, 7, 0,160, 9, 7, 0,161, 9, 7, 0,162, 9, 7, 0,163, 9,
+ 7, 0,231, 2, 7, 0,164, 9, 7, 0,190, 8, 7, 0,165, 9, 0, 0,166, 9, 0, 0,167, 9, 12, 0,104, 3,116, 1, 8, 0,
+ 7, 0, 32, 2, 7, 0,217, 8, 7, 0,218, 8, 9, 0, 2, 0, 2, 0,168, 9, 2, 0,169, 9, 2, 0,170, 9, 2, 0,171, 9,
+117, 1, 18, 0,117, 1, 0, 0,117, 1, 1, 0,117, 1,172, 9, 0, 0, 20, 0,116, 1,173, 9, 2, 0, 17, 0, 2, 0, 19, 0,
+ 2, 0,174, 9, 2, 0,175, 9, 2, 0,176, 9, 2, 0,177, 9, 4, 0, 89, 0, 7, 0,178, 9, 7, 0,179, 9, 4, 0,180, 9,
+ 4, 0,181, 9,117, 1,182, 9,118, 1,183, 9,119, 1, 33, 0,119, 1, 0, 0,119, 1, 1, 0,119, 1,184, 9, 0, 0, 20, 0,
+ 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 34, 8, 2, 0, 69, 8, 2, 0,185, 9, 2, 0,128, 0, 2, 0,175, 9, 2, 0, 25, 8,
+ 12, 0,183, 8, 12, 0,186, 9, 27, 0,166, 6, 9, 0,187, 9, 7, 0,178, 9, 7, 0,179, 9, 7, 0, 66, 2, 7, 0,188, 9,
+ 2, 0,189, 9, 2, 0,190, 9, 7, 0,191, 9, 7, 0,192, 9, 2, 0,193, 9, 2, 0,194, 9, 9, 0,195, 9, 24, 0,196, 9,
+ 24, 0,197, 9, 24, 0,198, 9,120, 1,148, 0,121, 1,199, 9,122, 1,200, 9,118, 1, 8, 0,118, 1, 0, 0,118, 1, 1, 0,
+119, 1,201, 9,119, 1,202, 9,117, 1,203, 9,117, 1,182, 9, 4, 0, 19, 0, 4, 0, 37, 0, 60, 0, 22, 0, 27, 0, 31, 0,
+ 39, 0, 74, 0,164, 0, 99, 3, 12, 0,204, 9, 12, 0,205, 9,116, 1,206, 9, 12, 0,207, 9, 4, 0, 17, 0, 4, 0,208, 9,
+ 4, 0,209, 9, 4, 0,210, 9, 4, 0, 19, 0, 4, 0, 37, 0, 12, 0,211, 9,122, 1,212, 9, 4, 0,213, 9, 9, 0,214, 9,
+ 9, 0,215, 9, 4, 0,216, 9, 9, 0,217, 9, 9, 0,218, 9, 9, 0,219, 9,123, 1, 6, 0, 4, 0,119, 0, 4, 0,121, 0,
+ 4, 0, 25, 8, 0, 0,220, 9, 0, 0,221, 9, 2, 0, 37, 0,124, 1, 16, 0, 2, 0,233, 7, 2, 0,234, 7, 2, 0,222, 9,
+ 2, 0,223, 9, 2, 0,224, 9, 2, 0, 67, 0, 7, 0,230, 2, 7, 0,225, 9, 7, 0,226, 9, 2, 0, 91, 1, 0, 0,227, 9,
+ 0, 0,228, 9, 2, 0,229, 9, 2, 0, 37, 0, 4, 0,230, 9, 4, 0,231, 9,125, 1, 9, 0, 7, 0,232, 9, 7, 0,233, 9,
+ 7, 0,243, 8, 7, 0, 67, 3, 7, 0,234, 9, 7, 0, 88, 6, 2, 0, 65, 3, 0, 0,235, 9, 0, 0, 37, 0,126, 1, 4, 0,
+ 7, 0,236, 9, 7, 0,237, 9, 2, 0, 65, 3, 2, 0, 37, 0,127, 1, 3, 0, 7, 0,238, 9, 7, 0, 56, 8, 7, 0, 15, 0,
+128, 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, 43, 4,
+129, 1, 9, 0, 7, 0,239, 9, 7, 0,240, 9, 7, 0,241, 9, 7, 0, 77, 2, 7, 0,242, 9, 7, 0,243, 9, 7, 0,244, 9,
+ 2, 0,245, 9, 2, 0,246, 9,130, 1, 4, 0, 2, 0,247, 9, 2, 0,248, 9, 2, 0,249, 9, 2, 0,250, 9,131, 1, 2, 0,
+ 7, 0, 5, 0, 7, 0, 6, 0,132, 1, 2, 0, 0, 0,163, 0, 0, 0,251, 9,133, 1, 1, 0, 0, 0, 20, 0,134, 1, 10, 0,
+ 0, 0,252, 9, 0, 0,253, 9, 0, 0, 81, 6, 0, 0,254, 9, 2, 0,222, 9, 2, 0,255, 9, 7, 0, 0, 10, 7, 0, 1, 10,
+ 7, 0, 2, 10, 7, 0,164, 9,135, 1, 2, 0, 9, 0, 3, 10, 9, 0, 4, 10,136, 1, 11, 0, 0, 0, 13, 5, 0, 0, 17, 0,
+ 0, 0, 65, 3, 0, 0, 67, 3, 0, 0, 5, 10, 0, 0,106, 0, 0, 0, 61, 2, 7, 0, 6, 10, 7, 0, 7, 10, 7, 0, 8, 10,
+ 7, 0, 9, 10,137, 1, 8, 0, 7, 0,149, 8, 7, 0,120, 0, 7, 0,228, 9, 7, 0,149, 2, 7, 0, 10, 10, 7, 0,233, 0,
+ 7, 0, 11, 10, 4, 0, 17, 0,138, 1, 4, 0, 2, 0, 12, 10, 2, 0, 13, 10, 2, 0, 14, 10, 2, 0, 37, 0,139, 1, 8, 0,
+ 7, 0, 15, 10, 7, 0,192, 2, 7, 0, 16, 10, 7, 0, 30, 8, 7, 0, 31, 8, 7, 0, 32, 8, 7, 0, 17, 10, 7, 0, 18, 10,
+140, 1, 6, 0, 2, 0, 19, 10, 2, 0, 20, 10, 7, 0, 21, 10, 7, 0, 22, 10, 7, 0, 23, 10, 7, 0, 24, 10,141, 1, 1, 0,
+ 0, 0, 20, 0,142, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 2, 0, 19, 0, 2, 0, 25, 10,143, 1, 10, 0, 2, 0,231, 3,
+ 2, 0, 19, 0, 7, 0,128, 4, 7, 0, 26, 10, 7, 0, 27, 10, 7, 0, 28, 10, 7, 0, 29, 10,142, 1, 30, 10,142, 1, 31, 10,
+142, 1, 32, 10, 63, 0, 11, 0, 4, 0, 19, 0, 4, 0, 63, 0, 4, 0, 33, 10, 4, 0, 34, 10, 24, 0, 35, 10, 24, 0, 36, 10,
+143, 1, 37, 10, 7, 0, 38, 10, 7, 0, 39, 10, 7, 0, 40, 10, 7, 0, 41, 10,235, 0, 10, 0, 4, 0, 86, 9, 4, 0, 42, 10,
+ 7, 0, 43, 10, 7, 0, 44, 10, 7, 0, 45, 10, 7, 0, 46, 10, 7, 0, 10, 0, 7, 0, 12, 0, 4, 0, 69, 1, 4, 0,235, 2,
+234, 0, 18, 0, 4, 0,124, 0, 4, 0, 47, 10, 4, 0, 48, 10, 7, 0, 49, 10, 4, 0, 50, 10, 7, 0, 51, 10, 7, 0, 52, 10,
+ 4, 0, 53, 10, 7, 0, 54, 10, 4, 0, 55, 10, 7, 0, 56, 10,235, 0, 57, 10, 7, 0, 58, 10, 7, 0, 59, 10, 7, 0, 60, 10,
+ 7, 0, 61, 10, 4, 0, 62, 10, 4, 0, 37, 0,144, 1, 4, 0, 47, 0,222, 2, 7, 0, 63, 10, 7, 0,158, 1, 7, 0, 37, 0,
+195, 0, 33, 0, 27, 0, 31, 0,144, 1, 64, 10, 63, 0, 30, 10, 51, 0, 65, 10, 57, 0, 66, 10, 30, 0,148, 0, 0, 0, 67, 10,
+ 7, 0, 68, 10, 2, 0,240, 5, 2, 0, 69, 10, 4, 0,106, 0, 4, 0, 19, 0, 7, 0, 70, 10, 4, 0, 74, 2, 4, 0, 71, 10,
+ 7, 0, 72, 10, 7, 0, 73, 10, 7, 0, 74, 10, 7, 0,158, 1, 4, 0, 75, 10, 7, 0, 76, 10, 0, 0, 77, 10, 0, 0, 78, 10,
+ 0, 0, 79, 10, 0, 0,226, 1, 7, 0, 80, 10, 7, 0, 81, 10, 7, 0, 82, 10, 7, 0, 83, 10, 4, 0, 84, 10, 7, 0, 85, 10,
+ 7, 0, 86, 10, 7, 0, 87, 10,145, 1, 10, 0, 4, 0, 17, 0, 4, 0,120, 0, 4, 0, 19, 0, 4, 0,185, 3, 4, 0, 88, 10,
+ 4, 0, 89, 10, 4, 0, 90, 10, 0, 0, 92, 0, 0, 0, 20, 0, 9, 0, 2, 0,146, 1, 1, 0, 0, 0, 18, 8, 92, 0, 7, 0,
+145, 1, 91, 10, 4, 0, 92, 10, 4, 0, 93, 10, 4, 0, 94, 10, 4, 0, 37, 0, 9, 0, 95, 10,146, 1, 96, 10,147, 1, 5, 0,
+ 7, 0,144, 2, 7, 0,212, 2, 7, 0, 25, 2, 2, 0,120, 2, 2, 0, 37, 0,148, 1, 5, 0, 7, 0,144, 2, 7, 0, 97, 10,
+ 7, 0, 98, 10, 7, 0, 99, 10, 7, 0,212, 2,149, 1, 5, 0, 32, 0,100, 10,150, 1, 22, 0, 7, 0,210, 5, 7, 0,101, 10,
+ 7, 0, 56, 0,151, 1, 7, 0, 4, 0,102, 10, 4, 0,103, 10, 4, 0,104, 10, 7, 0,105, 10, 7, 0,106, 10, 7, 0,107, 10,
+ 7, 0, 56, 0,152, 1, 8, 0,152, 1, 0, 0,152, 1, 1, 0, 32, 0, 44, 0, 4, 0,252, 0, 2, 0, 19, 0, 2, 0, 69, 1,
+ 7, 0,212, 2, 7, 0,157, 8,153, 1, 6, 0,153, 1, 0, 0,153, 1, 1, 0, 32, 0, 44, 0, 2, 0,197, 2, 2, 0, 19, 0,
+ 2, 0,108, 10,154, 1, 17, 0,148, 1,179, 3,148, 1,109, 10,147, 1,110, 10,148, 1,141, 8,149, 1,111, 10, 4, 0, 81, 0,
+ 7, 0,212, 2, 7, 0,241, 2, 7, 0,112, 10, 4, 0,102, 10, 4, 0,113, 10, 7, 0,106, 10, 7, 0,107, 10, 7, 0,106, 0,
+ 4, 0,114, 10, 2, 0, 19, 0, 2, 0,115, 10,155, 1, 9, 0, 7, 0,116, 10, 7, 0,248, 0, 7, 0,117, 10, 7, 0,118, 10,
+ 7, 0,119, 10, 7, 0,120, 10, 7, 0,121, 10, 7, 0,122, 10, 7, 0,123, 10,156, 1,111, 0, 27, 0, 31, 0, 39, 0, 74, 0,
+157, 1,124, 10,155, 1,125, 10,173, 0, 65, 4, 4, 0, 19, 0, 2, 0, 17, 0, 2, 0,144, 9, 2, 0,126, 10, 2, 0,127, 10,
+ 2, 0,145, 3, 2, 0,128, 10, 2, 0,129, 10, 2, 0,130, 10, 2, 0,131, 10, 2, 0,132, 10, 2, 0,133, 10, 2, 0,134, 10,
+ 2, 0,135, 10, 2, 0,110, 5, 2, 0,136, 10, 2, 0,137, 10, 2, 0,138, 10, 2, 0,139, 10, 2, 0,140, 10, 2, 0, 14, 2,
+ 2, 0,134, 8, 2, 0,109, 8, 2, 0,141, 10, 2, 0,142, 10, 2, 0,195, 3, 2, 0,196, 3, 2, 0,143, 10, 2, 0,144, 10,
+ 2, 0,145, 10, 2, 0,146, 10, 7, 0,147, 10, 7, 0,148, 10, 7, 0,149, 10, 2, 0, 61, 5, 2, 0,150, 10, 7, 0,151, 10,
+ 7, 0,152, 10, 7, 0,153, 10, 7, 0,116, 8, 7, 0, 88, 0, 7, 0,241, 2, 7, 0,122, 8, 7, 0,154, 10, 7, 0,155, 10,
+ 7, 0,156, 10, 4, 0,117, 8, 4, 0,115, 8, 4, 0,157, 10, 7, 0,118, 8, 7, 0,119, 8, 7, 0,120, 8, 7, 0,158, 10,
+ 7, 0,159, 10, 7, 0,160, 10, 7, 0,161, 10, 7, 0,162, 10, 7, 0, 56, 0, 7, 0,163, 10, 7, 0,164, 10, 7, 0,165, 10,
+ 7, 0,166, 10, 7, 0,136, 3, 7, 0,106, 0, 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, 7, 0,176, 10, 7, 0,177, 10, 7, 0,178, 10, 7, 0,179, 10,
+ 7, 0,180, 10, 7, 0,207, 0, 7, 0,181, 10, 7, 0,222, 3, 7, 0,220, 3, 7, 0,221, 3, 7, 0,182, 10, 7, 0,183, 10,
+ 7, 0,184, 10, 7, 0,185, 10, 7, 0,186, 10, 7, 0,187, 10, 7, 0,188, 10, 7, 0,189, 10, 7, 0,190, 10, 7, 0,191, 10,
+ 7, 0,192, 10, 7, 0,193, 10, 7, 0,194, 10, 4, 0,195, 10, 4, 0,196, 10, 66, 0,168, 3, 12, 0,197, 10, 66, 0,198, 10,
+ 32, 0,199, 10, 32, 0,200, 10, 36, 0, 79, 0,168, 0, 61, 1,168, 0,201, 10,148, 0, 44, 0,148, 0, 0, 0,148, 0, 1, 0,
+156, 1,202, 10,154, 1,203, 10,151, 1, 48, 9,175, 0,247, 3, 9, 0,248, 3,158, 1,204, 10,158, 1,205, 10, 12, 0,206, 10,
+ 12, 0,207, 10,133, 0,208, 10,141, 0,209, 10,141, 0,210, 10, 32, 0,211, 10, 32, 0,212, 10, 32, 0, 38, 0, 12, 0,111, 9,
+ 0, 0, 20, 0, 7, 0,237, 0, 7, 0, 12, 3, 7, 0,213, 10, 4, 0,186, 2, 4, 0, 56, 0, 4, 0, 19, 0, 4, 0,117, 8,
+ 4, 0,214, 10, 4, 0,215, 10, 4, 0,216, 10, 2, 0,244, 0, 2, 0,217, 10, 2, 0,218, 10, 2, 0,219, 10, 0, 0,220, 10,
+ 2, 0,221, 10, 2, 0,222, 10, 2, 0,223, 10, 9, 0,224, 10,137, 0, 64, 4, 12, 0,255, 2, 12, 0,225, 10,159, 1,226, 10,
+160, 1,227, 10, 7, 0,228, 10,135, 0, 37, 0,161, 1,244, 8, 7, 0, 34, 4, 7, 0,229, 10, 7, 0,230, 10, 7, 0,210, 5,
+ 7, 0,146, 3, 7, 0,136, 3, 7, 0,231, 10, 7, 0, 76, 2, 7, 0,232, 10, 7, 0,233, 10, 7, 0,234, 10, 7, 0,235, 10,
+ 7, 0,236, 10, 7, 0,237, 10, 7, 0, 35, 4, 7, 0,238, 10, 7, 0,239, 10, 7, 0,240, 10, 7, 0, 36, 4, 7, 0, 32, 4,
+ 7, 0, 33, 4, 7, 0,241, 10, 7, 0,242, 10, 4, 0,243, 10, 4, 0, 90, 0, 4, 0,244, 10, 4, 0,245, 10, 2, 0,246, 10,
+ 2, 0,247, 10, 2, 0,248, 10, 2, 0,249, 10, 2, 0,250, 10, 2, 0,251, 10, 2, 0,252, 10, 2, 0,178, 4,173, 0, 65, 4,
+136, 0, 9, 0,161, 1,253, 10, 7, 0,254, 10, 7, 0,255, 10, 7, 0,230, 1, 7, 0, 0, 11, 4, 0, 90, 0, 2, 0, 1, 11,
+ 2, 0, 2, 11, 66, 0,229, 1,162, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 7, 0, 3, 11,163, 1, 6, 0,
+163, 1, 0, 0,163, 1, 1, 0,162, 1, 25, 9, 4, 0,250, 0, 2, 0, 4, 11, 2, 0, 19, 0,164, 1, 5, 0,164, 1, 0, 0,
+164, 1, 1, 0, 12, 0, 5, 11, 4, 0, 6, 11, 4, 0, 19, 0,165, 1, 9, 0,165, 1, 0, 0,165, 1, 1, 0, 12, 0,119, 0,
+164, 1, 7, 11, 4, 0, 19, 0, 2, 0, 4, 11, 2, 0, 8, 11, 7, 0, 91, 0, 0, 0, 9, 11,164, 0, 6, 0, 27, 0, 31, 0,
+ 12, 0, 29, 5, 4, 0, 19, 0, 2, 0, 10, 11, 2, 0, 11, 11, 9, 0, 12, 11,166, 1, 7, 0,166, 1, 0, 0,166, 1, 1, 0,
+ 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 23, 0, 0, 0, 13, 11, 0, 0, 14, 11,167, 1, 6, 0, 12, 0, 15, 11, 4, 0, 16, 11,
+ 4, 0, 17, 11, 4, 0, 19, 0, 4, 0, 37, 0,215, 0, 18, 11,168, 1, 3, 0, 7, 0, 86, 5, 7, 0, 19, 11, 7, 0, 20, 11,
+169, 1, 17, 0, 27, 0, 31, 0,170, 1, 21, 11,170, 1, 22, 11, 12, 0, 23, 11, 4, 0, 24, 11, 2, 0, 25, 11, 2, 0, 26, 11,
+ 12, 0, 27, 11, 12, 0, 28, 11,167, 1, 29, 11, 12, 0, 30, 11, 12, 0, 31, 11, 12, 0, 32, 11, 12, 0, 33, 11,171, 1, 34, 11,
+ 12, 0, 35, 11,215, 0, 36, 11,170, 1, 31, 0,170, 1, 0, 0,170, 1, 1, 0, 9, 0, 37, 11, 4, 0,211, 7, 2, 0, 38, 11,
+ 2, 0, 37, 0,220, 0, 71, 6,220, 0, 39, 11, 0, 0, 40, 11, 2, 0, 41, 11, 2, 0, 42, 11, 2, 0,233, 7, 2, 0,234, 7,
+ 2, 0, 43, 11, 2, 0, 44, 11, 2, 0,185, 3, 2, 0,194, 6, 2, 0, 45, 11, 2, 0, 46, 11, 2, 0,213, 9,172, 1, 47, 11,
+173, 1, 48, 11,174, 1, 49, 11, 4, 0, 50, 11, 4, 0, 51, 11, 9, 0, 52, 11, 12, 0, 28, 11, 12, 0,253, 7, 12, 0, 53, 11,
+ 12, 0, 54, 11, 12, 0, 55, 11,175, 1, 17, 0,175, 1, 0, 0,175, 1, 1, 0, 0, 0, 56, 11, 26, 0, 30, 0, 2, 0, 57, 11,
+ 2, 0, 17, 0, 2, 0, 15, 0, 2, 0, 58, 11, 2, 0, 59, 11, 2, 0, 60, 11, 2, 0, 61, 11, 2, 0, 62, 11, 2, 0, 19, 0,
+ 2, 0, 63, 11, 2, 0, 31, 0, 2, 0, 37, 0,176, 1, 64, 11,177, 1, 10, 0,177, 1, 0, 0,177, 1, 1, 0, 12, 0, 65, 11,
+ 0, 0, 56, 11, 2, 0, 66, 11, 2, 0, 67, 11, 2, 0, 19, 0, 2, 0, 68, 11, 4, 0, 69, 11, 9, 0, 70, 11,171, 1, 7, 0,
+171, 1, 0, 0,171, 1, 1, 0, 0, 0, 56, 11, 0, 0, 71, 11, 12, 0,163, 7, 4, 0, 72, 11, 4, 0, 19, 0,228, 0, 14, 0,
+228, 0, 0, 0,228, 0, 1, 0, 0, 0, 56, 11, 26, 0, 30, 0,178, 1,227, 7, 9, 0, 73, 11, 9, 0, 74, 11,176, 1, 64, 11,
+167, 1, 75, 11, 12, 0, 76, 11,228, 0, 77, 11, 11, 1,107, 6, 2, 0, 19, 0, 2, 0,178, 4,179, 1, 8, 0,179, 1, 0, 0,
+179, 1, 1, 0, 9, 0, 2, 0, 9, 0, 78, 11, 0, 0,242, 3, 2, 0, 17, 0, 2, 0, 19, 0, 7, 0, 79, 11,180, 1, 5, 0,
+ 7, 0, 80, 11, 4, 0, 81, 11, 4, 0, 82, 11, 4, 0, 69, 1, 4, 0, 19, 0,181, 1, 6, 0, 7, 0, 83, 11, 7, 0, 84, 11,
+ 7, 0, 85, 11, 7, 0, 86, 11, 4, 0, 17, 0, 4, 0, 19, 0,182, 1, 5, 0, 7, 0,217, 8, 7, 0,218, 8, 7, 0,212, 2,
+ 2, 0, 28, 2, 2, 0, 29, 2,183, 1, 5, 0,182, 1, 2, 0, 4, 0, 53, 0, 7, 0, 87, 11, 7, 0,217, 8, 7, 0,218, 8,
+184, 1, 4, 0, 2, 0, 88, 11, 2, 0, 89, 11, 2, 0, 90, 11, 2, 0, 91, 11,185, 1, 2, 0, 42, 0,160, 6, 26, 0,249, 8,
+186, 1, 3, 0, 24, 0, 92, 11, 4, 0, 19, 0, 4, 0, 37, 0,187, 1, 6, 0, 7, 0,106, 0, 7, 0,214, 2, 7, 0, 93, 11,
+ 7, 0, 37, 0, 2, 0,243, 0, 2, 0, 94, 11,188, 1, 5, 0, 7, 0, 95, 11, 7, 0,120, 0, 7, 0, 26, 9, 7, 0, 27, 9,
+ 4, 0, 19, 0,189, 1, 6, 0, 27, 0,166, 6, 0, 0, 96, 11, 0, 0, 97, 11, 2, 0, 98, 11, 2, 0, 19, 0, 4, 0, 99, 11,
+190, 1, 7, 0,190, 1, 0, 0,190, 1, 1, 0, 0, 0,242, 3,189, 1,100, 11, 2, 0,101, 11, 2, 0, 17, 0, 7, 0, 60, 0,
+191, 1, 7, 0, 12, 0,102, 11, 0, 0,103, 11, 9, 0,104, 11, 7, 0, 60, 0, 7, 0, 79, 11, 4, 0, 17, 0, 4, 0, 19, 0,
+192, 1, 3, 0, 7, 0,105, 11, 4, 0, 19, 0, 4, 0, 37, 0,193, 1, 15, 0,193, 1, 0, 0,193, 1, 1, 0, 83, 1, 97, 9,
+191, 1, 61, 0, 12, 0,104, 3, 35, 0, 49, 0,192, 1,106, 11, 4, 0, 53, 0, 7, 0, 60, 0, 2, 0, 19, 0, 2, 0, 12, 1,
+ 4, 0,107, 11, 0, 0, 96, 11, 4, 0,108, 11, 7, 0,109, 11,194, 1, 2, 0, 0, 0,110, 11, 0, 0,111, 11,195, 1, 4, 0,
+195, 1, 0, 0,195, 1, 1, 0,162, 0, 46, 3, 12, 0,112, 11,196, 1, 24, 0,196, 1, 0, 0,196, 1, 1, 0, 12, 0,113, 11,
+162, 0,188, 8,195, 1,114, 11, 12, 0,115, 11, 12, 0,104, 3, 0, 0,242, 3, 7, 0, 79, 11, 7, 0,116, 11, 7, 0, 87, 0,
+ 7, 0, 88, 0, 7, 0,160, 9, 7, 0,161, 9, 7, 0,231, 2, 7, 0,164, 9, 7, 0,190, 8, 7, 0,165, 9, 2, 0,117, 11,
+ 2, 0,118, 11, 2, 0, 89, 0, 2, 0, 17, 0, 4, 0, 19, 0, 4, 0, 69, 0,197, 1, 6, 0,197, 1, 0, 0,197, 1, 1, 0,
+ 12, 0,113, 11, 4, 0, 19, 0, 4, 0,148, 2, 0, 0,242, 3,198, 1, 11, 0,198, 1, 0, 0,198, 1, 1, 0, 27, 0,166, 6,
+ 0, 0,119, 11, 4, 0, 99, 11, 2, 0,120, 11, 2, 0, 37, 0, 0, 0, 96, 11, 4, 0,107, 11, 2, 0, 19, 0, 2, 0,121, 11,
+199, 1, 8, 0,199, 1, 0, 0,199, 1, 1, 0, 12, 0,122, 11, 0, 0,242, 3, 0, 0,123, 11, 2, 0, 19, 0, 2, 0,121, 11,
+ 4, 0,124, 11,200, 1, 5, 0,200, 1, 0, 0,200, 1, 1, 0, 0, 0, 96, 11, 4, 0,107, 11, 7, 0,202, 2, 39, 0, 12, 0,
+162, 0, 96, 3,162, 0,125, 11,195, 1,114, 11, 12, 0,126, 11,196, 1,127, 11, 12, 0,128, 11, 12, 0,129, 11, 4, 0, 19, 0,
+ 4, 0,244, 0, 2, 0,130, 11, 2, 0,131, 11, 7, 0,132, 11,201, 1, 2, 0, 27, 0, 31, 0, 39, 0, 74, 0,202, 1, 5, 0,
+202, 1, 0, 0,202, 1, 1, 0, 4, 0, 17, 0, 4, 0, 19, 0, 0, 0, 20, 0,203, 1, 6, 0,202, 1,133, 11, 32, 0, 44, 0,
+ 4, 0,134, 11, 7, 0,135, 11, 4, 0,136, 11, 4, 0, 86, 9,204, 1, 3, 0,202, 1,133, 11, 4, 0,134, 11, 7, 0,137, 11,
+205, 1, 8, 0,202, 1,133, 11, 32, 0, 44, 0, 7, 0, 64, 1, 7, 0,138, 11, 7, 0, 12, 3, 7, 0,243, 8, 4, 0,134, 11,
+ 4, 0,139, 11,206, 1, 5, 0,202, 1,133, 11, 7, 0,140, 11, 7, 0, 69, 8, 7, 0,237, 2, 7, 0, 56, 0,207, 1, 3, 0,
+202, 1,133, 11, 7, 0,243, 8, 7, 0,141, 11,150, 1, 4, 0, 7, 0,142, 11, 7, 0,169, 10, 2, 0,143, 11, 2, 0, 69, 1,
+208, 1, 14, 0,208, 1, 0, 0,208, 1, 1, 0, 12, 0,144, 11, 12, 0,145, 11, 12, 0,146, 11, 0, 0, 20, 0, 4, 0, 31, 0,
+ 4, 0, 19, 0, 4, 0,147, 11, 7, 0,148, 11, 4, 0,136, 11, 4, 0, 86, 9, 7, 0,251, 3, 7, 0,239, 2,157, 1, 23, 0,
+ 4, 0,134, 11, 4, 0,149, 11, 7, 0,150, 11, 7, 0, 56, 0, 7, 0,151, 11, 7, 0,235, 2, 7, 0,142, 11, 7, 0,152, 11,
+ 7, 0,214, 2, 7, 0, 49, 10, 7, 0,128, 4, 7, 0,153, 11, 7, 0,154, 11, 7, 0,155, 11, 7, 0,156, 11, 7, 0,157, 11,
+ 7, 0,158, 11, 7, 0,159, 11, 7, 0,160, 11, 7, 0,161, 11, 7, 0,162, 11, 7, 0,163, 11, 12, 0,164, 11,121, 0, 40, 0,
+120, 0,165, 11,209, 1,125, 10, 66, 0,166, 11, 66, 0,198, 10, 66, 0,167, 11,210, 1,168, 11, 48, 0,162, 0, 48, 0,169, 11,
+ 48, 0,170, 11, 7, 0,171, 11, 7, 0,172, 11, 7, 0,173, 11, 7, 0,174, 11, 7, 0,175, 11, 7, 0, 98, 9, 7, 0,176, 11,
+ 7, 0,158, 1, 7, 0,177, 11, 4, 0,178, 11, 4, 0,179, 11, 4, 0,180, 11, 4, 0, 90, 0, 4, 0, 37, 0, 4, 0,181, 11,
+ 2, 0,182, 11, 2, 0,183, 11, 4, 0,184, 11, 7, 0,214, 2, 4, 0,185, 11, 7, 0,186, 11, 4, 0,187, 11, 4, 0,188, 11,
+ 4, 0,189, 11,137, 0,190, 11, 12, 0,191, 11,173, 0, 65, 4, 4, 0,192, 11, 7, 0,193, 11, 7, 0,194, 11, 4, 0, 69, 0,
+122, 0, 12, 0,120, 0,165, 11,148, 0, 32, 3, 7, 0,125, 1, 7, 0, 98, 9, 7, 0,195, 11, 7, 0,196, 11, 7, 0,197, 11,
+ 2, 0,198, 11, 2, 0,199, 11, 2, 0,200, 11, 2, 0, 17, 0, 4, 0, 90, 0,123, 0, 13, 0,120, 0,165, 11,139, 0, 9, 3,
+141, 0, 11, 3, 7, 0, 25, 9, 7, 0,201, 11, 7, 0,202, 11, 7, 0, 66, 1, 7, 0,203, 11, 4, 0,120, 9, 4, 0, 7, 3,
+ 2, 0, 17, 0, 2, 0, 37, 0, 4, 0, 69, 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/subtract.png.c b/source/blender/editors/datafiles/subtract.png.c
new file mode 100644
index 00000000000..475f20b3eff
--- /dev/null
+++ b/source/blender/editors/datafiles/subtract.png.c
@@ -0,0 +1,324 @@
+/* DataToC output of file <subtract_png> */
+
+int datatoc_subtract_png_size= 10173;
+char datatoc_subtract_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0, 1,
+ 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,252, 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0, 0,
+ 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116,
+ 73, 77, 69, 7,218, 7, 21, 0, 4, 18, 61, 67, 90, 24, 0, 0, 32, 0, 73, 68, 65, 84,120,218,237,125,107,144,101,215, 85,222,
+247,173,189,207,125,245, 99,186,123, 52, 15, 73,150, 61,163, 7,214, 3, 84,150, 98, 25,108,112, 98, 10,227, 84,153,184,192,174,
+178, 9,166, 98, 8,143,144, 63, 38,188, 13,150, 13, 69,112, 66, 32,127,120, 36, 36, 85,137, 19, 72, 12, 1, 12, 85,240, 43,132,
+ 10, 69, 72, 72, 72, 48,182, 83,216,178,101,189, 40,235, 57, 51,210,204,244,244,227,190,206,217,107,229,199,218,251,156,115, 91,
+ 45, 33, 7,147, 10, 85,186, 83,234,190,125,187,239,185,251,236,199, 90,223,250,214,183,150,128, 47,244,113,246,250,235,207,159,
+191,249,249,175, 19,192,251,126,248,253, 41, 53, 4, 68,132, 34, 49,198, 42,198, 88, 85,247,191,255, 71,252,143,194,119,255,131,
+239,169,235,101, 74,141,170, 38, 85,213,116,237,218,181,221,221,221,139, 23, 46,168,166, 24,227,254,254,126, 92, 46, 23, 48, 0,
+144, 32, 66,249,221,223,253, 79,170, 26,130,144, 52,200,183,254,221,111,251,167, 63,253, 83,241,242,238,236,211,143, 76,247,103,
+137,148, 48,123,144,169, 9,129,170, 8,129, 48,133,225,254,251, 63, 16,174, 54,175, 92,212,201,204, 76,237,217, 11,143,204,230,
+105, 80,137, 8, 0,188,250,213,175,222,217,217, 49, 51, 81, 77,166,106,170,254, 36,169, 61,183,187,104,172,186,227,142, 59,206,
+157, 59, 95, 55,117, 83,215, 17,166,106, 70,210,239,212,204, 70, 27, 55, 52,227, 87, 61,115,109,124,118, 89, 15, 96, 48,132,181,
+173, 91, 72, 3,140,192, 98,250,236,218,214,249,225,218, 41,146, 7,135,233,145, 39,103, 77,194,117, 91, 21, 79,221,252, 53, 68,
+128, 0, 70,144,164,144, 32, 2, 67, 32,133, 20, 72,140,166,102, 76, 72, 20, 33, 76, 12, 9, 16, 64,125, 94,140, 12,208,151,180,
+ 92,161,125, 54, 30, 79,110,186,233, 38, 17,206,102,179,163,107,119,239,189,247,126,205,155,191,214,204,132,164, 72, 8,193, 23,
+238,119,126,231, 63,254,247, 63,252,195,124,165,119,190,243, 93, 77, 83,107, 74,170,170,154,230,179,217,238,238,238,213, 43, 87,
+154,212,140,134,163, 75,151, 46, 2,136,203,229, 18, 0,133, 34,242,208,231, 30,122,236,207, 30, 19, 97,144, 96,160, 16,255,240,
+ 39, 62,244,163, 31,252, 0,223,244, 55,191,249,145, 39,231, 36,163, 64,247,254, 36,132, 16, 72,138,144,114,250,244,233, 55,189,
+233, 77,195,209, 40, 44,226,121, 0,170, 54,221,191,116,245,202,101, 85, 29, 84, 2,160,170,170, 55,190,241,141, 66,170, 89, 84,
+168,168, 2,162,245, 12,208,195,153,153,133,155,207,157,121,205,107,190,212,204,150, 77,109, 64, 52, 85, 3, 65, 5, 9,133,196,
+170, 58,241,234,203,139,141,253, 41, 6,131,218,204,215,110,231,102,192, 12, 0,116, 57,125,238,196,217,187, 37, 14,146,218,147,
+ 23,150, 79, 94, 90,156,217, 25, 84, 21,121,234,252,155, 41, 2, 10, 1, 3,132, 2, 33, 24,136, 64, 9, 65, 2, 36, 70,133,138,
+ 25, 13, 6, 64,104,170, 4, 41, 2, 36, 2, 6,138, 41,190, 88, 15,246,127,248,158,239,253,190,181,201,154,193,136,252,143, 66,
+161, 72, 16,146, 65,194,207,253,220,207, 92,188,120,241,248, 11,253,192, 15,254, 80,210, 4, 3,212,252,178, 4, 40, 36,132, 66,
+128, 20, 4, 9, 20, 6, 9,126,192,133,114,225,226,133, 95,248,231,255,172,127,161, 56,157, 78, 1,191,123, 0, 96,239, 1,226,
+169, 39,159,122,234,169, 39,175,237,237,165,166, 1, 72,162,124,197,157,119,222,245,174,111,252,198, 95,254,229,143, 60,252,208,
+ 67, 0, 98,189, 92, 2, 80,179,197,210,246,167,141, 26,215,198,225,196,122,188,116,241,210,167, 62,245,167,102, 6, 80,196, 47,
+155, 47, 1,243, 79,182,212, 52,239,126,247, 55,135, 16,126,244,131, 31,224,185,187,223,145,212, 82,242,155, 34, 0, 19,166,249,
+254,193,149,135, 5,245,218, 40, 12,135, 18, 68, 72,136,136,143, 84,213, 98, 12,175,127,253,235, 79,157, 62, 19, 68, 68, 36, 84,
+ 49, 46,230, 13,104, 32, 13, 20, 51,136, 88,178,229,226, 90,106, 22, 9,118,237,192,194, 12, 85, 37,227, 97, 24, 84, 54,168,226,
+250,198,198,217,179,103,111,184,254,134,141,141,245,166,174, 85, 68, 68,146,106, 52, 36,152, 65,197,104, 70,129, 54,102, 52,109,
+204,140,132, 65,155, 68, 53, 38,140, 55, 71, 39,111,186,233,250,155, 95,185, 51, 26,134, 42, 74,221, 52, 66, 17, 17, 10, 69, 53,
+154, 54, 48,129, 36, 51,154, 53,160,152, 41,165, 2,168,154, 36, 84,147,205, 87, 12,198, 59, 12, 3, 21, 62,246, 76,250,179, 11,
+207,141, 71,241,149,103, 71,175,186,126, 60,172, 66,140,126, 53,229,169, 91,190, 22, 32, 65,243,111, 20, 0,166,233,224,202,163,
+195,241, 78, 53,185,142,190, 19, 64,131, 80, 4,230,198, 43,248,132,146,178, 62,137, 59, 91,195,168,154,124, 65, 0, 0, 98,154,
+ 32, 48,114,253,228,173,244, 21, 2,168,102, 36, 8, 36,131,228, 79,242,205,166,134,131, 89,115, 56,215,104,166,190,147, 65,129,
+ 41, 8, 83, 10, 45, 95,195,104, 66, 49, 64,220, 48, 10, 44, 1, 66,136, 65, 97, 36,205, 20, 38,134,255,239, 30, 60,246,213,237,
+237,237,173,173,109, 0,139,197,124,119,119,119, 58,157,126, 1, 23,186,245,182,219,222,249,206,119,181,199, 41, 47, 9, 69,130,
+136, 72, 8, 97,119,247,218, 63,253,233,127,242, 98, 23,250,225, 31,121,191, 38, 53,183,135,249,244,251,193, 39, 37, 63,130, 95,
+ 76, 66,172,226,251,126,232, 7,143,241, 55,223,247,253, 63,144,154,148, 52,185, 55, 85, 51,115,127, 9, 51, 83, 3,160, 90,126,
+ 86, 53, 75, 77,186,251,203,238, 62,119,254,252, 3, 15,124,122,197,140, 52, 77,227,239,205, 91,134, 36,105, 44, 35, 82,155, 45,
+151,203,122,169, 73, 85, 83, 93, 55,187,187, 87,159,120,226,201,186,169,255,246, 55,189,251, 87,255,195,175,172, 92, 40, 27,118,
+191,213,114,194, 9,166,148,158,126,250,169, 39,158,120,114,111,111, 15,176,108, 68, 72, 33, 72, 46, 23,139,159,248,208, 63,250,
+224, 7,238,247, 55, 74,113,125,170,170,106,106,106,166,102,170,251,251,251,159,249,204,103, 62,253,233, 79,239,238, 94, 53, 51,
+186,137, 32,105, 52,133,170,165,148,234,229,242, 39,127,242,167,242,133, 82, 74, 73,211,108, 94, 95,120,110,246,212,197,249,229,
+221,249,124,209, 92,187,118,237,137, 39,158,120,252,137,199, 83, 74,128, 25, 76,205,124,224, 70,115,172, 32, 66,144,203,122,249,
+222,239,254,110, 0,113,247, 96,249,240,227,243,203,187,117,158, 33, 48,136, 5,189,170,179,103,180,105, 68,168, 10,138, 9, 73,
+ 90,222, 46,170, 27, 91, 91,227,241, 88, 83,130,217,117, 39,175, 35,200,115,119,191,163,110,204,204,237,168, 1, 76,245,124, 57,
+189,180,156, 62, 43, 76,147, 81, 24, 13, 67, 16, 58,118,162,136,169,133, 32,175,190,253,246, 87,188,226, 21,155, 27,155,190, 43,
+ 6,195, 97, 92, 44,147, 91,144,188,137,136,148,230, 77,179,104,154,134,176, 3, 69,147,108,109, 28, 42, 31, 79, 74, 85, 85,189,
+242,149,175, 60,117,221,169,209, 96,148, 52,249, 16,150,203,101,132,153,249,152,243,102,132,166,100,154,204,204, 8, 36,157, 47,
+ 12,192,218, 8, 33,112,243,196,137, 51,103,206,158, 61,123,118, 60, 30, 27, 77,147, 66,128,166,129, 33,170, 37,130,132,193, 8,
+ 49, 53,194,146, 89,242,181, 86, 51, 36, 76,231, 41,198,120,102,123,231,134, 27,206,156, 57,115,102, 60,153,144,212,148,140,101,
+ 9,208, 68,250, 90,128,160,193, 64, 67,111,127, 90,158, 97, 86, 11,221, 28,108,220,180,125,221,169, 88, 5, 83, 83,170,169, 4,
+ 49, 85,245,251, 8,107, 39,111, 53, 51, 16,221,160,154, 69, 90, 78,181, 94, 0, 48, 72,168, 6,163,141,235, 39, 39,110, 58,152,
+203,225, 44,141,135, 18,131,111,124,199,150,121, 37,195,218,246, 45, 20,150, 19, 76,192, 52,213,169,158,107, 51, 51, 82, 66, 53,
+222,188,105,180,118,202,135, 61,155,235,179,215,234,101,173, 85,148, 24,203,251,232, 35,218,185,197, 64, 88,177,218, 0, 76, 53,
+ 45, 82, 51, 23, 9,147,173,115,195,241, 54, 0,250,176,193, 38,233,181,189,116,113,183,217,221,111,150,141,141, 6, 18, 3, 65,
+242,244,205,111, 1, 13,144,214, 33,171,105, 61,187,218, 44,246, 6,227,173,193,228, 58,152,123, 22, 97,129,137, 0, 8, 49,146,
+100, 8, 97,125, 18,119, 78, 12,120,234,230, 55,103, 12, 3,177,226, 79,172, 51, 87, 36,197, 15, 89,190, 7, 7, 2, 32,253,179,
+ 69,128, 32,194, 8, 51,248, 70,162,250,212,169, 27, 71,144,102, 32,220, 71,152, 1, 2,128,180,124,132, 77, 76, 72, 24, 32,166,
+128, 24,212,151,221,242,178, 27, 13, 84,131,169, 18,102, 70,152,154,219, 54,133,153,194, 64, 5, 64,133,101,115, 97, 52,136, 25,
+ 96,166,166, 6,131,169, 42, 12, 10, 26, 0,154,250, 7,148, 97,148,193,107,222,101, 62, 17, 68, 25,195,203,143, 47,220,207,182,
+143,155,111,190,229,206, 59,239, 60,127,203, 45, 59,219,219,221,171,150, 79, 1, 29, 60,231,111,178,187,187,251,208, 67,159,251,
+212,167,254,244,209, 71, 31,253,226, 12,104,125,125,253,157,239,124,215,245,215,223,160,170,214, 1,102, 43, 24,181, 96,120,244,
+ 96,114,239, 33,221, 51, 17, 10,136, 88, 85,191,241,235,191,254, 39,127,242,177,151,190, 57,248,182,183,189,237,206, 59,239, 82,
+119, 53,217,243,175,188,187,152, 9,174, 98,245,252,100,117, 72, 30,112,116,195, 42, 3, 21,146, 23, 46, 94,248,181, 95,253,213,
+139, 23, 47,188,248,128,226, 45,183,126,201, 98,177, 44,243,113,204,141,176, 13,110,122,176,191, 63,184,186,174, 65,164,166, 41,
+247, 4,148, 51,219,164, 4,179,253,253,125, 51,123,250,233,167,207,157, 59,119,203, 45, 55,199, 88,253,209, 31,253,143,186,174,
+143, 31, 80,106,234, 50,136, 46,168,233,141,134,182, 50,160,110,241, 82,147,118,119,175,154,225,185,231,158, 83,213,217,108,166,
+154,138, 15,113,183, 6, 53,245, 17,155,217,124,190, 48, 83, 7, 93, 95,255, 13,111,191,231,158,123,254,205,135, 63,252,232,163,
+143, 28, 29,144,223,196,241,187, 43, 3, 15,182, 70,210,173, 99, 93, 47,247,247, 15,154,166,126,230,153,167, 85,109,111,111, 79,
+ 85,253, 83,219,187, 48, 72,241, 37, 14, 21,252, 34,230, 62, 42, 53,205,124, 62,255, 59,239,121,207,112, 56,252,151,255,226, 23,
+ 62,255,249,207,247,103,168,233,157,158,124,201,166,201, 3, 2, 17,131,128,136, 66, 6,106,147,154, 38, 77,167,211,199,159,120,
+ 60, 53,233,242,229,231, 12, 6, 53, 3, 68,104, 70, 17, 90,246,114,101, 36,249, 66, 86,176,160, 2,162,170,154, 26, 0,245,114,
+249, 29,223,249,247, 6,213,224,125,239,203,120, 52,214, 77, 2,144,212,212,160,201,150, 9,150,236,112,150,204,193, 39, 57, 26,
+136, 8,199, 67,198,200,233,193,193,225,225,222,116,122,120,225,153,103,156,112,112,223, 40,238, 31,104,150,125,187, 16,170,160,
+120, 0, 9,154, 99, 0, 90, 21, 29,100, 11, 41, 48,107,154,134, 34,170,250,161, 15,253,227,143,124,228,223, 63,248,224,103,227,
+238, 94,109,176,231,118,155,189,131,102, 94,235,193,212,209, 71,198, 54, 38,160,145, 48,210, 64, 11,233,106,154, 63, 75, 75,166,
+137, 57,188, 33, 64,165, 49,123, 78,245,216,211, 77,149,195,106, 22, 75, 1, 96, 99, 99, 99, 52, 26, 79, 70,227,148, 82, 62,146,
+166,170, 98, 98,223,244, 77,239,254,131, 63,248,125, 94,127,199,215,103, 34,169,133, 15,190,208,171,103,188, 89, 78,205,154,229,
+236,202,114,122,217, 84, 5, 74,193,100, 20, 88,166,144,204,254, 28, 64, 6,135,100,223,252, 56,181,115,199, 29,119,158, 60,121,
+114, 52, 26,141, 39, 99, 41,142, 91,178,233, 34, 69,220, 77, 3, 44,228,131,105, 47,166,247,235,209, 12,154, 22,154, 22,169, 89,
+104,106, 72, 52,102, 76,220, 63, 72, 16,155, 47,132,130,181, 81, 12, 65,131,144, 68, 65, 92,234,150,169,138, 81, 68,110,189,245,
+214,209,104,188,115,114,103, 50,158, 0,208,164, 70, 43,193, 69,187,218, 22,225, 36,141,101, 88, 7,131,137, 90, 94, 50,136,154,
+101, 52,221,104,170, 29,151, 22,107,105, 74, 19,229,162, 81, 24,155,166, 1,108, 60, 10,195, 74, 68, 24, 2, 7, 85,117,242,228,
+201, 24,227,185,115,231, 68,194,250,250,186, 4, 18,162,154, 28,224,101,155,233, 70,215, 73, 57,179, 88, 80, 7, 64,152, 41, 73,
+ 24,125,107,192,104,204,219,194, 76,213, 18, 76,203,145,201, 38,192,193, 4,161,141, 10, 13,179, 69, 92,164,184,177,177,117,211,
+185, 27,199,195,234,214, 87,157,244,149,200,168, 88,141, 80, 51,144, 2,154, 64, 84,146,219, 58, 2, 52, 10, 45,170, 25,115,196,
+ 64,230, 99, 73, 24,141, 48, 40, 65, 26, 97, 70, 80, 76, 82, 14, 62, 60,158,207,166, 93, 68, 0, 25,174,237, 72, 24, 86,163,173,
+106,176, 6,242,243, 23, 57,168,236,218,116,175, 10,124,213,141,227, 24,184, 54,138, 65,252,148, 8,153, 64, 1, 82, 62, 53, 66,
+ 38, 35,105,194, 88, 78,164,127, 35,213, 90,186,214,143,172,185, 91,161, 88,136,144,144, 71,171, 52, 64, 36, 80, 56, 90,191, 94,
+ 66,140,195, 19,148, 40, 12,134, 12, 12,151,181, 93,188,188, 0,121,101,191, 22,242,236,201, 97, 85,241,186,173,193,120, 20,130,
+ 72, 21, 77, 41, 68, 2,200,148, 9, 93,170, 68, 67,114,158,131,166,238,173,204, 20, 45,131, 68,245,201, 19, 6,132, 74, 25,132,
+162,102, 10, 13, 18,135, 27,215, 11, 67, 53, 58, 65, 4,100,150, 69,205,196, 12,100, 50,136,170,145, 56,156, 41,192,249, 82, 41,
+120,250,217,101,140,156,140,226,198, 36,140, 6,225,228, 86, 21,132,195, 65, 96, 33,116, 98, 49, 91,176, 22,202, 59,248,148,236,
+222, 50,253, 36,145, 38, 12, 3,178, 10, 33,132,106, 68,198,106,120,130, 20, 48, 66,114,128, 96, 16,152,163,105, 49, 83, 2,102,
+162, 73, 77,168, 75,184, 95, 35,185,127,208, 60, 23, 37, 6, 62,126, 41, 4,114, 60, 12, 34,178, 62, 14, 18,196,121,110, 35, 72,
+ 37,169, 80, 26,105,254, 13, 52, 53,159, 36,136,208, 24, 7, 19,143, 18, 36, 14, 1,161, 84, 20,231,219, 13,102, 38,198,140,147,
+197, 84, 37, 27, 67,117,236, 14,168, 1, 73,133,166, 41, 9,150, 10, 16,135, 73,128,170, 10, 36, 71,195, 16, 68, 98,222,162,166,
+ 6,154,145, 80,154,144, 78, 41,161,132, 11,150, 15,103,156,132, 56,233, 12, 38, 13, 6, 69,134,248, 48, 51,163,137, 9,140, 6,
+ 19,122, 44, 65,183,220, 30, 9,153,111, 82,203,177,151, 66, 5,203,101,162,200,178, 54,128,177,236,103,231,203,124,231,104,193,
+168, 96,246, 65, 4,204,138,207, 46, 48,133,240,165,246,115, 97, 38, 37,106,209,124,147, 70,136,230,168, 67, 8,168,106,158, 81,
+ 24, 32, 48,191, 37,102, 47, 8,152, 32,194,105, 57,161, 65, 13, 66, 85,182,254, 2,166,153, 68,204,198,180,184,111,203,215,202,
+ 23,119, 42, 79, 90, 44,148,143, 39,125,103,102, 11,151,157,153,209,119, 8,160, 70, 18, 2, 51,131, 18, 98,226, 97,154, 27, 34,
+ 53,152,229, 0,202, 93,134, 89,119,242, 97,112, 56, 96,166, 25,231, 90, 70,251, 78,181, 16, 48,133,153, 91, 81,100,143, 3, 53,
+ 5, 1, 45,134, 63,131,182, 2, 79, 51,222,177,188, 70,118, 12, 66,124,249,241,242,227,139, 29,185,118,216,187,138,147,241,100,
+ 48, 24,140, 70,227,170,170, 50,106,107,234,249,124,177, 88,204, 15, 15, 15,147,103, 61,254, 82, 7, 84, 85,213,107, 94,115,207,
+237,119,220,241,170, 87,190, 42,196,146,113, 52, 66,242, 57,243,116,160,195, 61, 51,123,236,177,199, 62,251,153, 7, 62,254,241,
+143,123,178,240,139, 57,160,175,251, 91,111,187,235,174,187,170, 88,181,177, 2,187,164, 15,142, 68,142,109,108,154,113,170,112,
+185, 92,126,242, 19,159,248,237,223,254,173,191,208,128, 98,140,119,221,117,215, 91,223,250,117,214, 98,215,146,180, 64, 47,164,
+239, 71,248,171,145,253,106,104, 79,138,200,222,222,222,207,253,236,207, 28, 30, 30,126, 97, 3,218,217,217,121,235, 91,223,122,
+195, 13,175,112,206,168,135,166,123,127,212, 7,253,189,175, 47, 56, 38, 71,167, 64,136,225,210,197,139,191,244,139,191,120,229,
+202,149,151, 52,160,247,190,247,189,227,241, 90, 49,159, 71, 35,252, 46,146,239,130,232,254, 44, 21,182, 79, 36,103,252, 58,130,
+161,191,152,172,235,230,147,159,252,248,111,255,214,159,191,136,225,141,127,253,111,104, 82,131, 37, 75,217,152,103,135,208,254,
+144, 71,168,217,147,228, 31,114, 44,166, 14,164,108, 37, 66, 69,123, 37,103,249,108,185, 92, 12,170,234, 13,111,248,202, 79,125,
+250, 83, 47, 68, 51,148, 80, 58, 37,148, 79,213, 99, 87,180, 44, 13, 8,237,239,106,133,130,170,234, 7,190,105,154,194, 46, 80,
+ 77, 1,106, 74, 6,204,231,179,229, 98, 49,157,206, 46, 94,186, 40,148,123, 94,115,207, 51,207, 60,253,216, 99,143,189,224,128,
+ 84, 53,231, 32, 50, 53,214,251,165,161, 77, 23,244, 95,234, 63,245, 1, 25,172,105, 26, 18, 41, 37,128,170, 10, 32,165, 70,205,
+102,179,249,124, 54,155, 78,167,211,195,169,199, 62, 59, 39, 79,126,245, 87,127,205,135, 63,252,175,142, 31,144,169, 90, 75,212,
+ 97,229,195,145,129,148,241,136,117, 48, 24,236,224, 96,127,177, 88, 76,103,179,189,189, 61, 83,157,205,102, 64,198,227, 25, 44,
+169, 1,150, 60, 57,147, 84,181,241,152, 86, 83, 58,123,253,217, 31,255,241,159,248,177, 31,251,224,113, 75,166,138,227,153, 42,
+180,251,182,195, 48, 61, 91, 52,159, 47,166,211,233,193,193,193,149, 43, 87, 84,245,240,224,160,108,163,204, 62,116,167,162, 99,
+ 1, 53, 37,170, 33,165,100,149, 29, 59, 38,177,156,152,122,209,135,231,249, 52,239,209,221,221,221,231,158,123,238,217,103,159,
+189,244,236,165,221,221,171,139,249,124,185, 88,180,147, 76,146, 45,179,196, 78, 27,208, 25, 54,211,212, 36, 53,163,240,135,127,
+228,253,207, 27,208, 11,141,167,152,129,124,234,218, 87,212,174, 92,189,242,236,165,103, 47, 93,186,120,241,194,133, 43, 87,174,
+204,231,243,197, 98,161,106,109,130,255,232, 52, 23,136,231,176, 79,205,146, 38,109, 26, 83,219, 88,223,248,246,239,248,206,149,
+ 1,105,239,145, 82,106, 52, 45,150,105,190, 72,243, 69, 51,155, 55,243, 69, 90,214,218,212,201, 53, 74,243,249,124, 62,159,207,
+166,179,217,108,218, 52,141,106,223,140,230,128,169,183,231,203,147,156,102,128,153, 81, 50, 18,247,233, 78,154,206,159, 59,255,
+218,215,222,215,219,212,221,238,177,186, 49, 3, 14,167,218,168, 31, 62,198,128,225, 48, 68,225,250, 4, 41,233,213,171, 87, 82,
+210, 75,151, 46,206,166,179,140,222,187,124,123, 11,252, 61, 5, 39,173,217,232, 29, 89,192,224,217,220, 24,130,153,153,170, 10,
+222,254,142,119,124,230, 51, 15,120,214, 89,154,164, 77,210,217, 50,205,230,122, 56, 79,211, 89,154, 45,211,124,174,243,133,206,
+ 23, 58, 91,170,191,126, 48,109,166,179, 52,157, 45,167,179,121,210,146,208, 0,125,122,156, 81, 65,206,141,148,175,101, 28,106,
+ 80,117, 73, 19, 67, 8, 18, 68, 93,134,101,166,170,166,218, 52,205,247,126,223,247,231, 25, 58,152, 53, 77, 99,159,191,176, 80,
+197,238, 94,221,104,207, 32,118, 12,176, 5,130, 76, 54,125,210,172,177,102,145,153, 51, 15,112,224, 49,157, 82,196, 79,171,115,
+183, 78, 55, 58,175,225, 14,187, 10,213,214,214, 86, 53,168, 0,154, 26, 68, 21, 98,170, 65,100, 56, 28,222,119,223,235, 62,246,
+177, 63,150,186,214,186,209,148, 44,165,148,178,161, 55, 83, 51,207, 17,155,169,106, 74,214,184, 57,209,148, 82,249,131, 28,152,
+244,162,140, 34,184,241, 8,164,252,157, 58, 95,225,228, 99,136, 65, 36,192, 74,242, 89,213, 84,147,170,169,125,195,219,223, 78,
+ 50,204,227, 45, 23,175, 44, 15,103,105,182,112, 3,155,189,103,182, 60,230,145,151, 54,139,195,186, 94,236, 95,123,110, 54, 91,
+206, 22,245,124,169, 41,127, 16, 68, 8,215,184,149,128,142, 34, 57, 81,233, 12,152,193,117, 63,227,209,232,246, 87,223,190,179,
+179, 61,153,172, 21,147,208,227,105,213, 54, 79,108,198, 69,157,186, 20,163,103,222, 84,139, 51,207,113,171,199,114, 6, 95,120,
+ 21,223,241,177,164, 93, 91, 2,182, 92,166,248, 90,109,189, 99,230, 6,201, 16, 66, 8, 33, 71,100, 10, 80, 33,180, 18, 46,222,
+119,223,235, 34,172,253,115, 20,149,139,167,253,114,116, 75, 82, 53,165,122,225,171,103,214, 36, 51,128,243,101, 90,214, 12, 34,
+203,202,130, 96, 52,140, 68, 22, 36,170,170,179,190, 6,248, 8,214,214,214,206,158, 61, 91, 85,131,245,245,117,199, 73,106, 42,
+ 20, 51, 80, 97, 98, 65, 85, 41, 41,165,232, 9, 61,235, 72,189,124, 94, 60,221, 13, 80,221, 76, 67, 97, 41,219, 53,167,124, 19,
+154,204, 2, 10, 66, 97,149, 58,144,169, 90,152, 92, 51,196, 16,199,147,201,160,170, 92,194,145, 33,140,106, 22, 51, 42, 84,132,
+ 80, 42, 99,222,144,142, 44,140, 57,215,220,243,145,164, 42, 76,181,177,162,236,160,223, 33,243, 9,175,147,169,153,205, 33,228,
+120, 8,130, 33, 16,192,100, 50,142, 49,110,108,110,108,172,111, 12,135,163,205,205, 19,193,117, 63, 62,243, 61, 87, 77, 49, 83,
+117,227, 17, 93,140,198, 50, 69,206,100,104,222,158, 70,205, 60,136,185, 37,233, 49,158,249, 62, 12, 72,170, 10, 85, 19,225, 32,
+194, 67, 16, 82, 6,131,225, 96, 56,220,222,218,222,222,222,174,170,106, 60, 30, 23,224, 6,201,185,224, 54,220, 55,241,235, 58,
+ 11,235,172,130, 31, 9,131, 49, 15, 39,143,204,247,228, 11,103,104,205,169, 26, 53, 64,209,104, 16,147, 19,155, 27,177, 10, 91,
+ 91, 91,227,241,104, 60,158,132, 24, 69, 66,127,153, 20,164,150,251,162,155, 88,122,142, 33, 58, 77, 1,131, 81,173,147,121,100,
+188,234, 83,167,200,118, 7,102, 43, 89,244,214, 39,152,121, 98,100,182,140,148,112,195,230, 13,227,225,240,236, 13, 91, 39, 54,
+ 70,109,234, 47, 39,101,172, 80, 77,118, 4, 98,229, 44, 91,244, 84,123,217, 24,190,125, 44,123,130, 76, 12,175,142,193,250,190,
+147,121,131,139, 72,136,132, 72, 28, 81, 66,157, 40, 13,102,115, 13,161,169,162,196, 32, 20,132, 32,206, 79,201,234, 56,164,189,
+170,106,150,127,250, 13, 88,150,193, 20,138, 26,218,203,149, 25,133, 80,194, 50,143,157, 83,116,158,223, 16, 6, 25, 14,215, 78,
+ 82,226,112,237,180, 80,174, 28, 16,148,101, 90, 12,170,250,212,206,224,228,102, 21,163,140, 71,206,207, 49, 51, 98,197,184,228,
+205,236,233, 53,213, 88,148, 39, 78,188,177,165,242,152, 67,139,110,127,183, 27, 25, 45,189,110,158,152,142,148, 0,134,204,210,
+ 73,203,237, 91, 72, 90,215,186,108,212, 12, 49,128,100, 12,146,231,133,153,143,207, 14, 47,107,139,252,216,231, 79,101,161, 38,
+137, 44,100,202, 3, 51,128, 18,178, 0,161,176,106,100, 16, 50, 12, 54, 6,147,109,145, 42, 14, 55, 51, 74, 85,223,121,188,182,
+223,144,184,118,152,158,188,180, 24,143,194,169,173,170,138,114,230,228, 80,136, 65, 5,168,148, 73,234, 80, 29, 85, 99, 15, 77,
+ 59,243, 38,112,134, 46,187,154, 50, 21,214,201, 65,114, 22,172, 64, 28, 66, 0,241, 40,209,204, 72,133,137,154, 66,132,202,148,
+180, 38,171, 70,155,198,200, 44,237, 78,106,194, 36, 18,124,167,187,164,208, 32, 32, 99, 81, 34,154,147,166,158,168, 51,192,148,
+ 57,207,224,235, 18, 43,203,134,213, 25,113,171,198, 91,113,176, 30,194, 40, 84, 19,138,228, 48, 67, 28, 56, 58,111,171, 6,105,
+ 18,146, 54,203, 90, 14,231, 41, 80, 46, 94, 94,138,112,231, 68, 21, 69, 78,109, 15, 6, 3,169, 34, 99,132, 66, 4, 6,179, 88,
+196, 75,142,205, 11, 2,116,198, 26,160, 58,235,219,197,139,208, 54,211, 27,201, 10, 33, 82,130,111, 2, 99, 89,124, 87,158, 72,
+230, 10, 12,164,234, 82,133, 33,129, 22, 68,214,198,161, 9,150, 84, 53,193,130,155, 40, 53,136,154, 69,120, 34,129,229, 27,128,
+ 60, 19,217, 16,101,159, 34, 21, 76,132,209, 2, 7,113, 19, 12,113,184, 17,171, 73,182,184,150,133,218, 38, 6, 79,240, 0, 90,
+168, 98, 24,148, 20, 83, 75, 50, 95,170,192, 46, 94, 94,146,184,186, 87, 75,144,209, 32,196,192, 97, 21, 70,195, 64,145, 88, 80,
+157, 50, 39,157,138, 79, 84, 43, 26, 2, 87, 16, 7, 40, 33, 1,201, 36,142, 40, 49,132,129,132,170,213,130,100,207,163,128,168,
+159,231,178,193, 73,143,174,133, 2,213,134, 42, 86,207, 64, 98, 58, 83, 35, 70,195, 16,133,227, 81, 92, 27, 27,201, 2,242, 75,
+182,172,168, 0,178,230,206, 47, 89, 34, 20, 86,163, 45,104,114,235, 7, 6, 55, 34,190,191, 11, 43, 79, 31, 83,206,116,137,148,
+152,132, 84, 83, 55,117,133,132,247,227,216, 52,102, 2, 93,164,164, 0, 37,118,212,120,155,141,214, 66,214,147, 37,167, 64, 82,
+ 12, 24,140,119,250, 17,151, 26,197,127,237,129, 6, 51,111,239, 86,163,252,178, 20, 75, 64,114, 98,181,203, 49, 27,200,186,209,
+134,130, 70,103, 51, 35, 41,238,242,178,251,242, 92, 78,139, 96, 29,252,144,173,254,205, 60, 56, 66, 89, 8,170,171,185,178, 74,
+170,120,219, 76, 8, 20, 5, 85, 14,217,104, 62, 98,115,114,191, 68,158,101,138, 29, 45,155,160,133,153, 84,207,119,100,117, 60,
+ 21,157, 69, 80,133,170, 59,144, 22,164,102, 99,164, 78, 49, 20, 75,101, 57,243,226,126, 49,251, 99,144,150,211,201,102,180,146,
+ 86, 45,191,118,121, 25, 29,125, 27, 91,210, 44,231,116,161, 68,155,141,128,162,104, 1,216,202,248, 50, 7,235,225,150,123, 16,
+ 67,201,129,228,208, 25,132, 26,203,116,100, 47, 81, 54, 90,206, 46,187,173,200,113, 93,222,201,194, 60, 1,158,104, 67,190,186,
+150, 74, 21,135,250, 62, 44,181, 50, 56, 20,251,130,108,150, 60, 25,153, 35,107,127,115, 70,228,176,156, 97,204,121, 25,247, 71,
+214, 70, 79,180,156, 78,134,153, 41, 85, 10,132, 53, 45, 14,206,138,232, 47,203,242, 90,224, 81,146,195, 94, 47, 4, 99, 86,232,
+161, 68,101, 62, 9,237, 28, 21,108, 80,162, 19,151, 85,180,105,101, 67,209,237,193,247,106,206, 69,250, 59,125,122,253, 28,107,
+ 59, 8,203,159,234, 49, 75,135,206, 88,210,214, 68,151,173,202,233,227, 82, 6, 84, 20, 19, 30, 40,177,139, 40, 29, 55, 48, 79,
+161,101,126,185,148,133,136, 79,122, 62, 19, 6, 66,149,104,233,151, 76, 92, 24, 77,169,128,154,235, 75,242, 58,101, 87,147,103,
+ 86, 51,255, 87,206, 11,243,194,117,138,239,172,139,205, 57, 90,150,197,233,139,237, 94, 78,152,189,252,120,249,241,242,227,175,
+ 68,190,245,197, 46, 65,174,111,108,108,110,108,172,173,173,159,216, 58,177,179,189,115, 98,107,235,196,230,230,100,109,125,109,
+109, 60, 24, 12, 61, 71,213,203,228,172, 36, 45,154,166,153,205,166,123,251,123,251,251, 7,151, 46, 93, 60,216, 63,184,182,119,
+109,127,111,111,119,119,119,127,127,255,175,222, 4, 77, 38,147, 91,111,251,146, 27,111,188,241,204,233,211, 39, 78,108, 77,214,
+ 38, 49,198, 99,217,251,126, 78,228,121,201,147,213, 39,173,184,245,121,122,232,166,105,166,135,211,107,123,215,158,126,250,169,
+135, 62,247,185,135, 31,122,168,249, 34,101,190,191,104, 19,116,250,244,233,123,238,189,247, 75,191,244,238,225,112, 80,202,132,
+236, 37, 93,183,132,180, 61, 94, 42,255,200,142,175,245, 64,157,232, 37, 75,251, 9,221, 92,203,201,156, 95, 53,152, 87,117, 61,
+254,248,231,255,203,239,255,254,131, 15,126, 86, 85,255,159, 78,208,250,250,250,153, 51,103,190,236,203,238,190,245,214,219,156,
+209,177, 54, 49,220, 99,132,142,204, 17,143,221, 52,157,138,117,133,113,230,106,194,253, 5,191,174, 86,205,229, 90, 87,118,153,
+232, 54, 23,127,245,234,213,255,246, 95,255,224,193, 7, 31,188,124,249,242, 95,202, 4,157, 62,125,250,174,187,238, 58,127,254,
+252,233, 51,103, 82,210, 44,166, 93,153, 20, 3, 94,108,219,176,111,144,122,150,166,255,250,138,241,193, 49,178,254, 99,197, 0,
+127,222,139, 57,228,244,162, 67, 0,143, 62,250,232, 31,255,175,255,249,192, 3, 15, 52, 61,125,248, 95,104,130,238,191,255,254,
+197,178,110, 51,186, 29,239,216,227, 32, 95,218, 60,175,222,237,145, 23,143,249,179, 35,178,141, 23,217, 74, 71,164, 11,253, 99,
+216,158, 62,144, 98,176,229,124,177,127,176, 95, 55, 77, 93, 47, 63,241,241, 79,124,236, 99,127,252, 23,156,160, 56,155, 47, 90,
+193,137,181, 2,183, 99,102,229,121,150,167,159,154, 94,157,151,222,139,207,223, 74, 71, 15, 97,183, 83,201,254,167, 20, 34,162,
+119,229,222, 83,235, 81,193,158,224,242, 48,117, 62,159,239,239,237, 45,235, 37,193,219,110,187,237,206,187,238, 50,213,223,251,
+189,255,252,212, 83, 79,253, 95, 78, 80,150, 67, 29, 41, 45, 57,142,169,183, 35, 22, 43,151,124,117,242,134,146,122, 88,253,187,
+ 30, 99,148,231, 57,167,223,188,247,128,105,210,124, 28, 72,115,113, 68, 9,169,188, 8, 7,173,220,220, 82, 97,196, 45, 37,175,
+140,132,169,205,230,179,197,124,225, 97,230,108,122,120,245,234,213,229,114,217, 47,254, 56,121,242,186, 27,111,124, 69,136,225,
+193, 7, 31,188,250,210,148, 57,199,201, 43, 94, 72,211,240, 34,103,108, 53, 43,192, 86,128,101,171,147,186,250,170,153,105, 74,
+185, 69, 3, 80,215, 77, 93, 55, 46,112, 87,213, 38, 53, 94, 53, 92,242,231,218, 6,206,101,120,244, 12,182,251, 47, 51, 44,151,
+139,197,114,233, 1,104, 93,215, 41,103,236, 11, 43,100,102,176,148,210,249,243,231,223,242,150,183,212,203,230,163, 31,253,181,
+135, 31,126,248, 37,239,160, 85,185,199,138,238,231,216, 23, 90,134, 26,173, 8,196,201, 50,116, 52, 74, 46,188,183, 35,135,209,
+205,127,147,154,189,189,189,249,108,230,217,192,195,195,195,189,189,107, 77,211,144, 76, 41, 45, 22,139,190,125,181, 78,179,113,
+140, 87,224,113, 40,165, 88,136, 14, 68,136, 79,125,211, 44,151,245,104, 52,124,207,123,190,213,128,127,247, 75,255,246,145, 71,
+ 30,121, 73, 59,232,121, 59,197,142,223, 60,199,168,116,218, 74,148,222,111, 45,167,133,142,252,117,210, 12,240,154,212,212,117,
+ 93,215,181, 79, 80,211, 52, 41,165, 34, 50,242,167,109,142, 46,167,151, 74,193,166, 87, 91,116,226,222,146, 95, 46,228, 18, 51,
+ 37,200,150, 74,105, 41, 25,223,115, 73, 85,205,152, 68,228,219,190,253, 59,166,211,233,111,124,244,163, 15, 62,248,217, 23,157,
+160,206, 95, 29,185,203,231,193,223,231, 21,158,149,218,227, 94, 29, 50, 74, 90,167,144, 43, 4, 84,109, 62,155, 93,190,124,121,
+177, 88, 2,214, 52,205,238,238,238,225,116,234, 18, 39, 51, 75,170,153,127,182,231,221,121, 95,146,125, 12,172,101,145,106,183,
+105,164,204,237,228,105, 83,104,201, 23,154,105,211,212,169,137, 36, 85,196,204, 70,195,209,183,124,203,183, 62,253,204,211,191,
+242,203, 31,121, 33, 12, 21,254,218,107, 95,219,171,246,178,149,218,175,254, 79,157,168, 40,111,158,162, 40,180, 30,112, 94,165,
+155,252, 77, 48, 51, 91, 44,151,135, 7, 7,203,229, 82, 85,235,166,158, 78,103,139,197, 92,181,105,213, 21,249,210,189,105,206,
+ 66, 40,172, 72, 36,208,137,162, 86,162,193, 14,179,163,208,214,133, 54,244,123, 8, 18,183,182,182,183,183,183, 67, 8, 86,250,
+ 45,120,122,119, 99, 99,243, 43,191,234,171,214,215, 54, 62,247,185, 7, 95, 64,148,119,172, 79,207, 42,120, 0, 72,138,101,163,
+ 77,147,111, 32,191, 78, 16, 12,194, 24,115,229,181,144,131, 1,163,100, 59,234, 98, 39,159,204,131,131,131,139, 23, 47,206,231,
+115,159, 83, 63, 86,153,198,239,234,188, 74,158,208,186, 68,102, 87, 69,213, 21, 36,148,120,101,229,228,247,215,137, 45, 78, 0,
+ 32, 18,144, 75,186,233,189, 5,124,202, 97, 89, 27,144, 52,169,233,125,247,221,247,186,215,189,238,231,127,254,103, 47, 92, 88,
+ 41, 43, 13,247,222,123,239,177,126, 75,205, 84, 51,151,169,106,139,165, 11,120, 44,153, 37,181, 70,205,107, 6, 91, 12,229, 94,
+ 41,102, 97, 41,204,180,174,151,243,249,162,105,154,166, 73,243,249,108,239,218,181,217,124,222, 52,141,139,113,242, 20,231, 35,
+218,202, 35, 45, 87, 19,174, 36,228, 74,193,101,241, 11, 57, 71, 93,182, 71, 91, 18, 81,210, 24,101,223,103,189, 43, 92,180,188,
+181,189,189,179,179, 19,171,170,243,169, 61, 61,170, 63,190,226,203, 95, 63,158, 76,188,169, 78,222, 65,211, 89,182,157, 73,205,
+ 37, 67,126,120,154,198,230, 11,109,249,229,148,250, 54,185, 71, 78,211,183,106, 70,131, 33, 34, 72, 38,205,155,229,254,114,126,
+205, 11,226, 52, 45,231,139,101,219,248, 32, 59,110,101,183, 27,172, 28, 8,148,130,186, 44, 94,201,162,195,222, 62,178,190,206,
+237, 8,138,200, 4,180,139,206, 69, 70,163, 81, 21, 43, 18, 85, 85, 13, 6, 67, 79,131,180, 26, 47,191,100, 42,210, 97, 5, 76,
+236, 13,175,127,195,169,235, 78,253,230,111,126,212,201,150,184,172,253,136,177, 73,182,119,216,236, 31,230,229, 93, 52, 54,157,
+165,164,207,243, 97,180,118, 80, 61,133, 67,238, 91, 32,244,218, 36,146, 38,105,170,203,125,213,134, 70, 34,153, 37, 20,236,211,
+154,212,236,158,138,195, 54,205,123, 37, 87,197, 48,207,134,176, 21,131, 20,136,109,157,127,232,251, 3,230,220,142,121,206,166,
+138,213,104, 52, 4, 24, 99, 12, 34, 46, 2,117, 84,226, 45,126,218, 82, 72, 35,133, 52,213, 70,245,214, 91,111,253,174,239,250,
+251, 31,254,240,191,190,122,245,106,216, 62,123,251,193, 84, 15,166,205,193, 52,237, 79,211,108,161,117,178, 38,105,221, 88,163,
+197,135, 48,215, 31,185,253,203,206,180,228,150,208,214, 13,153, 90,106,212, 5,143,169,105,150,211,229,252,176,169, 83,147, 82,
+157, 82,106, 82,157, 52, 37,164,146,158,241,222, 9,158,136,205, 14,160,131, 59, 69,215, 80, 18,218, 37,190,183,246, 85,182,133,
+111,232,135, 34, 89,229, 14,160,170,134, 39,182, 78,108,110,110, 78,198,227,201,100,178,177,177, 49,153, 76,188,215, 80, 31,169,
+ 88, 15, 59, 21,117,146,141,199,227, 47,255,138,175,248,223,159,252, 36,175,191,253, 27, 86,125, 38,143, 65,209,171,225, 85, 11,
+ 80,217, 53,250,240, 87, 82,106, 22,150,106,247,122,205,124,119, 57,223,181, 12,127, 60, 41,229, 6, 4,131, 74, 98,200,142, 42,
+ 8,243,115,152,137,183,197, 96, 41, 8,205,231,160,245, 98,157,186,110,101, 76, 69,224,106,222, 25, 43, 23,213, 77, 38,147,115,
+231,206,109,111,239,120,121,194, 96, 56, 24,141, 70,210,231, 76,112,132, 23,232,177, 5,164, 4,177,148, 37, 12, 71,208,142,245,
+ 68,170,171,113, 88, 81, 7, 23, 33, 79, 73,101, 34,203,153,161,234,193,129, 89, 82,104,139, 6,202,101, 77,205,113,173,119,126,
+ 49, 2, 22,172,176, 98,121, 98, 68,114,121,166, 21,145,153, 67,199, 86, 44, 3, 35, 4,236,166,134,237,164,196, 24, 7,131, 97,
+ 16, 49, 98, 60, 26,199, 88,121,251,194,226, 59, 58,198,162, 36,142,179, 78, 54,187,182, 86,186,101,166, 6, 9, 18, 75, 14,213,
+218, 82,190,110,223,244, 96,106,150, 19,180, 25,248,226,154,173,111,177,161,170,203,212, 44,115,140,157,106,211,198,235,203,243,
+ 97, 53, 2,150, 20, 41, 25,208,248,101,130, 48,132,220,170, 37, 4, 14, 43, 9,193, 45,141, 9, 91,107,215, 6, 85, 25, 44, 81,
+205, 74, 33,179,247,137, 35, 32,194,245,141,205, 51,167,207,140, 70, 35, 16, 85,172, 54, 54, 55,198,227,113,187, 95,124,125,217,
+253,203,194,207,220,145,204,122, 53,218, 36,161, 72,136,244,104,240,104, 77, 2,122,105,212,236,246, 59,104,209, 7, 33, 89, 84,
+215, 9,208,243, 89,110,147,203, 40, 50,176, 46,172,207, 92,108,217,122,174,202,244,219,134,154,229,162, 12, 2,226,230,185, 67,
+216, 44, 41,221, 82,102, 77,239,145, 25, 66, 36, 33,100, 21, 99, 8, 34, 94,223, 34, 36,160, 73, 69,164,171, 29, 56, 26, 99,246,
+ 78, 9,219, 34,203,108,122, 85, 16, 59,208,220,227, 36,242, 86, 98, 87, 36,170,171,244, 13,173, 55, 95, 89, 21, 81, 68,245,218,
+ 56, 8, 43,248,216, 37, 80, 96,207, 89,101, 10,131, 52, 99, 65, 91,222, 10, 17,203, 58,183, 93, 18,225,176,146, 42,102,139, 43,
+132,132,172,161, 10, 33,172,175,175, 87, 89,174, 26,182,182,183, 78,108,110,134, 16,189,208,108, 56, 26,198, 32,165, 87,207,209,
+110, 3, 47, 68,222,160, 5,170,185, 14, 21, 52, 19, 48,106,161, 5,216, 73,131,209,106,108, 74,118, 61, 55, 87,202, 83, 70, 88,
+145,198,162,156,225, 82, 51, 4,152, 30,249,108,242,200, 22, 45,141,145,114, 62,188,173,135,207,101,185,101,235,231,173,227,178,
+160,190, 42,219,155,177,133, 16, 0,132,144, 91,178, 73, 16,162,173,207, 96,235,237, 58,201,245,234,233,234,254,229,174, 78,108,
+ 83, 9,249, 37,210, 52, 69,182, 58,235,172, 50,237,109, 22,235,240,152, 65, 75,227,211,190,102, 81,179,197, 46,231,170,212,231,
+104,174,181,181, 86,109,105,171, 97, 65, 75, 53, 50,203, 97,178,135, 96, 46, 16, 55,170, 49,241, 80,159, 0, 0, 7, 46, 73, 68,
+ 65, 84,209,150,161,142,149,215,182,175,173,173,109,159,218, 25, 14, 7, 4,135,131,120,234,228,198,100, 28, 69,132,160,196, 16,
+ 36, 20,132, 37, 45, 19,185, 82, 11, 87,100, 66,207,231,175,218, 40,197, 74,184, 76,235, 26,101, 69, 80,143,242,238, 90, 74,179,
+139,162,142, 61,167, 86, 48,125,158,200,182, 19, 76, 91, 74,147,101,241, 71,121,209, 35,103,190,167,117,228, 10, 1,238, 42,162,
+226, 50,153,212,119, 12,213,196, 88, 81, 6, 0, 36,196, 16,171,225,112,208,231,242,209,231, 54, 13, 29,175,224, 45, 18, 88,240,
+ 99,249,111, 37,123, 85, 0,142, 29,225,108, 66,136,153,185, 97,143,198, 97, 47,222,179, 14,136,185,108,205, 86, 89, 25,162,204,
+175,153,171,182, 10,130,211,231, 29,242,190,149,180,142, 55,114, 92,103, 52, 66,164,138,131,137,248,168, 24,227, 96, 18,170, 81,
+238, 72, 22,195,181,233,240, 96, 46, 32,170,200,105,189, 24, 13, 26, 82, 66,192,250, 36,172,143, 67, 8,185,250,112,224,102,203,
+ 37,242,230,146,204,172,153,114,121, 16,148, 40,146,113,151, 51,230, 70, 30, 34,157,101,242, 77,148, 82,204,131,109, 59,205,181,
+187,162,109,200,198,214, 31,117,182, 39,219,155, 50,181,165, 92, 44,171,154,228,136, 85,212, 23,224,106,217,127, 15,104, 66, 17,
+ 9, 3, 9, 3,239,137, 17,170, 73,168,198,126,187, 6, 44, 50,209,200,170, 49,145,180,172, 13, 64,140, 18, 2,134,149,119,164,
+ 96,136,226, 29, 2, 50,224, 97,150,150,247,165,139,230,181, 13, 94, 25,103,214, 14,198, 11, 22, 87, 1, 61,162, 15,255,136, 19,
+212,220, 30,176, 68,167, 68, 23,118,177,103, 65, 92,219,148,207,124, 86,181,130, 1, 4, 44,229,198, 23,176,188, 92,214,219,187,
+ 38,109,234, 84,226, 48,196, 49,157,148, 8, 85, 28,172, 81, 42, 87,249, 74,136,200, 70, 95,219,136,198,204,146, 98,186, 72,139,
+ 70, 9,138,164,186,209,131,105,242,120,127, 88,201,218, 88,170, 64, 35,162,200,104, 40, 85,108,155,103,153, 59,196,174,247, 80,
+ 71,250, 61,175,224,173, 76,113,236,142, 66, 79, 13,215, 85, 37,248, 49,104, 29, 31,209,243,131, 64,219,223,166,107,152, 32, 69,
+180, 37, 46,242, 43, 62, 93, 11,143,142, 46,172, 2, 40, 18,194, 48, 14, 55,252, 88, 5,169, 66, 53,166, 68,228, 58,171, 98,199,
+145,209,144,175, 76, 50,232,194,218,188,197,108,161,215, 14, 26,247,113,227, 81,216, 90,143, 85, 20,208, 6, 49, 0,129, 12, 25,
+ 33, 11, 87,107,141,250,145,246,241,233,116, 2, 49, 83, 14,174,242,179,182,221,134,181, 68, 37,250,199,204,138,140,177,168,223,
+105,253, 98, 9,203,126, 4,200, 44, 66, 7, 52,189,159, 71, 9, 12,194, 32, 72,149,121,189, 56, 10, 97, 64, 6, 8, 40, 1,109,
+113, 78,145,201,150, 36, 71, 47,171,164,102, 93,122,205, 52, 33, 21, 93,238,162,230,193, 52,197,168, 36, 98, 80, 53,157, 46,114,
+191,164, 42,202,160,242,209, 33, 10,171, 40,185, 67, 50,225,253,125,218, 77,210,221, 23,219,214, 57,173,222,145, 93,204, 85, 98,
+244,118, 40,218,203,110,181,213, 75,154, 19, 93, 30,231, 73,200, 93,170,130, 80, 2, 68,160, 86, 96,124, 14, 55, 68, 66, 53,220,
+140,131,245,188,243,101, 32,113, 88,244, 49,185,252, 32,251, 74, 23,180,183,100, 90,143, 35, 51,230,234, 36, 5,213, 52,105, 30,
+235, 98, 97, 7,211, 38,119,219, 22, 14, 34, 29, 30, 9,177, 54, 10,107,227,224,212,226,104, 40,219, 27,113, 48, 16,223,243, 85,
+ 37,161,101,151, 90, 82,211, 12,170,177, 5,107,108, 69,174,160,118,129,156,245, 92, 61,209, 37, 11,172,212,193,184,106,212,221,
+ 93, 47,202,181, 54, 31,196,210, 14,190, 72,132, 24, 61,122,234,107, 85,187, 47, 69,138,155,223,157,219,199,168,177, 37,206, 74,
+175,180,174,207,101,209,179,146,232, 74,132, 0, 47,254,241,209, 8,154,100,139, 70,165,108,130,131,216, 12,154,224, 24,189,138,
+ 33,134,146,192, 46,205,178, 65, 8, 36, 22, 16,219,134,169,109, 45, 97, 41,120, 68, 97,207,189,210, 45, 75, 85,218,196,134,118,
+140, 61, 4, 82,185,132, 31,170, 12, 67,198,129,104,130,153,132, 42, 84, 19,250, 58, 49,196,193, 26,195,144,108,131,158, 92, 81,
+163, 52, 41,213, 79,204, 21, 0,180,214, 26,169,182,105,157, 82,117,167, 43, 49,181,151, 45,229,115,163,154,184, 80, 0,222,209,
+142,135,243,132,189,214, 29,149,150, 89,204, 59, 40,230,162, 19, 14, 7, 28, 15,131, 87,185,129,140,154,123, 64,181, 27,215,143,
+148,182, 56,144,197, 81,107,143, 25,179, 44,203,230,106,250, 46,135,169, 5,184, 33, 43,123,189, 87, 54, 5,222, 24,187,120,183,
+ 85, 93,130,122, 47, 84,165,177,107,186,147, 71,194,220, 50,201,235, 56, 50,172,200,152, 44,151,180,117, 17, 59, 75,239, 32,119,
+227, 61, 35, 97,240,235,171,135,234,154,243, 69, 98, 49,243,140, 76, 38, 41, 49, 53,102, 33, 79, 11, 79,221,252,230, 86,239,143,
+182,125, 33,250,221, 0,203, 44,172, 70,168, 40,137,172,174, 76,116, 53, 6, 52,239,134,102,125, 78,182,229,253,164,196, 62,165,
+ 18,195,250,253,136,218,238, 74,165, 6,190, 28,186,194, 36,247,159,173, 32,187, 54,162, 42,193,167, 71,113,189, 86, 0, 37,100,
+151,156, 30, 98,169, 67,110,123,130,228,201,246,121,136,109, 8,202,174,115, 23,114,123, 59, 95,166,150, 69,211,118,193, 11,236,
+233,183,211,107, 13,143,181, 61, 28,104,125, 9,144,172, 74, 26,242, 10,176, 56,132, 82, 3,208, 21,211,101,242,137,109,166,167,
+212, 87,195,178,149, 44, 84,127, 75,223,101,158,191, 53, 2,212, 18, 31, 20,254,187,245,244, 89, 45,215, 2,223, 78, 92,226,126,
+ 39,223, 79,180,182, 2,146,157,171,206, 77,187,114,189,154,161,167,172,207,139,220, 43,242,177, 18,214,246, 99, 80, 31,248, 74,
+149,161, 42,251,121, 62, 22,159,208, 26,251,214,103,229,181, 86,122,129,195, 74,159, 69, 15,248,141,237,252,162,180,174, 47, 8,
+174,203, 25,101,167, 45, 93,174,183,224, 29,230,122,155,174,162, 32,151, 76,119,241,155, 47,139,198, 46, 48,180,182, 86,148,173,
+ 59,243,113,106, 41,244, 45,251,191,155, 77,180, 77, 25, 91, 92,144,111,187, 31, 99,180, 91,187,253, 95, 50,104,169, 7, 37, 90,
+ 76, 67,159, 38,235, 25,196,242, 14, 69, 41,144,235, 78, 11,219, 8,157,185, 96,190, 59, 67,150,219, 70, 50,215,142,117, 25, 52,
+ 43,155, 38,159, 69,107, 27, 35,244, 66, 80,107,139,157, 25,139,155,236, 66,233,150,161, 45, 29,204,138,132,195,237, 88, 57, 76,
+109,189,117,143,130,180,213,248,190,195, 76, 37, 56,239,218,184,161, 21, 36, 20,107,156,131, 22,138,149,196, 88, 1,240,190,149,
+218,140, 87,169,247,213,174,166,173,157,149, 46, 54, 44,229, 78, 45,119,211, 58, 77,143,139, 97,173,129, 66,187, 28,165,253, 64,
+167,125,138,221, 42,103,100,150,249, 29,239, 61, 73, 48, 27,202,214,249,230,214, 52, 93, 40,210,210,187,199,169, 30,218,158,108,
+ 71, 80,190,217,106,115,242, 82, 42, 95, 28, 62,218, 3,215,118, 76, 40,117,171,229,185, 21,213, 77,233, 65,199,174,220, 56,179,
+128,217,176,161,205,200,230,183,150, 76, 36, 74,179,143, 50,183, 69, 25,128,246,134,162,181, 65,167,246, 67, 3,181, 54, 66,247,
+153,234, 42,140,181, 53,248,208, 54,123,103,173, 65, 93,161,155,142, 36,208, 59,190, 40,187, 69, 53,244,132,138,102,109, 77,161,
+ 83, 43,121,232,173,153,212,150, 4, 87,168, 64,202, 28,161, 80,111,210,217, 80,118,205, 40, 80, 14, 19,139,244, 68,115,148,184,
+114,206, 58, 69,161,177,148,141, 51,230,150,135,109,138, 59, 55, 51,237,247, 9, 44,182,172,109, 99,128, 35, 51,101, 37, 58,200,
+ 52,124, 30,197, 17,101,112, 75,139,247,236, 87,219,176,200,218, 70, 1, 29, 88,176, 35,134,169,141, 78,253,134,181,164,174,209,
+137,172,188,187,164, 21,203,226,141,107,197,186,201, 42,149,214,130,174,153,112,161,155,133,221,206,108,241,104, 68,103,165, 75,
+231,250, 92,188, 70,176,175,148,207,160, 37, 27, 14,162,139, 18,218,179,214,235, 4,217, 63,106,218, 2, 42, 98,133,123,165,117,
+ 96,161,221,119, 44, 0,190,164,179,243, 54,178, 62, 52, 45, 81, 77, 11, 80,122,103, 35,199,209, 61, 97,104,107,141, 90,128,148,
+157, 96,255,207,108,165,155, 84, 59,202,255, 3, 12,217, 15,142, 80,147,252, 33, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/texdraw.png.c b/source/blender/editors/datafiles/texdraw.png.c
new file mode 100644
index 00000000000..42f9f08d1d7
--- /dev/null
+++ b/source/blender/editors/datafiles/texdraw.png.c
@@ -0,0 +1,302 @@
+/* DataToC output of file <texdraw_png> */
+
+int datatoc_texdraw_png_size= 9462;
+char datatoc_texdraw_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 96, 0, 0,
+ 0, 96, 8, 2, 0, 0, 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143, 11,252, 97, 5, 0, 0, 0, 6, 98,
+ 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,
+155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7, 21, 0, 4, 18, 61, 67, 90, 24, 0, 0, 32, 0, 73, 68, 65, 84,120,218,237,
+124, 89,140,101,215,117,221, 90,251,222, 87,213, 53,177,122, 98, 55,123,160, 40, 78,146,200,166, 68, 54, 69, 89,116, 34, 91, 1,
+100,249, 67,142,156,200,128, 12, 88, 9, 16,219,178,243, 39,217,150, 7, 13,148, 29, 32, 81, 44, 39,254,113,236, 12, 6,226, 64,
+118, 2, 36,158, 62,226, 32, 48,132,124, 68,113,108,121,136, 6,202,146, 69, 54, 71,113,234,110,178,217, 67,117,205,245,222, 61,
+123,229, 99,159,115,238,125, 85,221, 20, 21, 75, 1, 12,232,117,163,234,189, 91,247,221,123,238, 57,123, 92,123,237, 3,124,163,
+175,155,142, 29,187,245,214,219,246, 30, 39,128, 15,127,228, 99, 41,117, 4,204,140,102,109,219,142,218,182, 29,141, 30,250,216,
+ 71,243, 73, 31,252,137,159,148, 4,200,104, 52, 51,227,129,253,155,183,222,118,254,200,209,171, 51,163,209, 15,253,208, 95,157,
+ 63,119,174, 57,125,255,105, 79,201,147, 11,146,235, 45, 15,254,233, 77, 55, 93,184,225,134, 29, 51, 73,233,232,145, 31,252,236,
+103,255,164,157, 76, 38,140,107,122,243,192, 3, 95, 24,111,211,224,105,198, 73,235, 58,237,140,199, 15, 61,244,241,182,155,116,
+ 4, 73,154,249,100,226,238, 0, 65,235, 70,173,253,249,159,253, 45,114, 44,247, 54,165,142, 4, 96,116, 78, 38,158, 18,165,110,
+107,115,223, 35, 95,125,179, 53,147,166,113, 72,109,151, 58, 3,105, 34,109, 50, 73, 77, 99, 15,127,241,116,211,182, 77, 51,105,
+212, 72,130,208,122, 74,162, 25, 0,120, 74,250,203, 47,189,209,204,129, 14, 18, 4, 72, 20,219,148, 18, 9, 73,102,246,165,135,
+ 79,145, 73,114,176, 5, 32, 0,104,193,174, 77, 93, 50, 19,208, 72, 34, 41, 37,160, 97,114, 8, 0,157,201,220, 94,213,114, 53,
+245,221,220,220,252,205, 55,223,108,198,173,173,173,221,107,119,255,253,247,191,227,123,222, 41,201, 72,154, 53, 77, 19, 11,247,
+233, 79,127,250,179,127,242,199,101,237, 62,248, 19,130, 8,154, 25,141,198,246,245,111,120,230,240,161,245,253, 7,183,215,215,
+142,124,255,187,127, 27, 64,115,250,244,253,158,220,229,146,110,191,237,177, 59, 95,127,102,255,254,245,185,249,206, 61,153,141,
+223,240,250, 31,253,204,103,254,103, 59,233, 38,177, 44, 52, 91, 88,186, 56, 30,219,168, 85, 26,137,192,231,254,226,158, 46,141,
+ 63,241,207,127,177,237, 38, 19,210, 72,156, 60,121,126,188,147,148, 96,132, 75, 4,215, 54, 70,173,141, 5,180, 93, 74, 70, 55,
+179,197,165,139,227,177,187,195,229,127,241,231,223, 1,140,154,102,226,173, 11,101, 89,228,190,114,101,225,224,161, 43,227, 29,
+ 59,115,230,222,166, 77,141, 65, 82, 94,187,148,146,209,101,246,236,179,199,151,150,174, 60,242,200, 93,102,157, 4, 52,121, 93,
+ 64,182, 41,185,140,148, 72,126,249,203,167, 72, 7, 64,118,137, 18,133, 68, 26, 91,247, 14,104,204, 12,128,148,204,152,146, 72,
+ 18, 78,154,211,221,133,111,214,139,195, 15, 63,249, 83, 31, 90,152, 95,136, 69,138,127, 12, 61,107,140,100, 99,205,175,254,234,
+175,188,244,210, 75,215,190,208,207,252,236,207, 37, 79, 16,224,138,203, 18,160,145, 48, 26, 1, 90, 67, 51, 35,173,105, 26, 35,
+155,166,161, 53,223,253,246, 63,127,251,119,253,183,225,133,218,205,205, 77, 64, 40,207,200,193, 11,196,137,227,231,111,189,253,
+185,166,229,168,177,182,165,153, 89, 3, 51,166,100,159,254, 31,239,250,252,231,222,246, 91,191,245,155, 79, 60,254, 56,128,118,
+ 50, 30,215,135, 20, 65,210, 72,146, 75,139,235,119,221,115,198,140,227, 49, 90, 55,155,145, 53, 52,200,157,238,130,186,181,117,
+238,108,111,191,239,125,255,160,105,154, 95,248,249,143,243,135,127,228, 71,242, 3, 17,140, 31,180,209,104,114,239,125, 95,134,
+193,104,109,195,118,132,153,145,141, 70, 77,211,194, 72, 1, 18,254,244,179,111, 35,173, 49, 51,179,102,212,182, 41,117,136,165,
+ 4,104,128,104,244, 59,238,124,108, 60,150,153, 72, 36, 67,215,113, 50, 81,219,168,105,184,189, 61,255,149, 47,223, 75,163,113,
+ 66,154,155,153, 89,114,111,187,206,141,121,249, 76, 0,204,161,201, 36, 77, 38, 78,130, 76,102, 52,195, 35, 15,191, 41,117,251,
+ 66,225,204, 38,161, 49,217,112, 26,205,189,245,212, 9,164, 65,162, 59,205, 4,233,249,231,142,223,126,199,211, 18, 82,106,207,
+ 60,122,143, 25,105, 70,116,214, 24, 65,107,140,176,166,241, 68,107,104,108,104,230,109,215, 37, 35, 40, 3, 65,152,119, 50,179,
+213,213,125,151, 46, 46,158, 61,123,179,212, 0,201, 29,102, 70,210,221,154,134,238,214,152,185,104,102, 34, 41,107,172,105, 83,
+ 74, 78,210, 69,194,204, 73, 75, 41,145,124,246,217,147, 0, 72, 39, 33, 81,130, 25,105, 82, 50, 51, 40,201, 96,146,100,141,193,
+ 9,182,201,147, 21,193, 9, 43, 24, 19, 31, 47, 51, 3,104,161,120, 48,130, 36, 40,201,140, 14,144, 2,129, 70,252,230,233,218,
+183, 70,105,235,235,192,129, 3,251,247, 31, 0,176,179,179,189,178,178,178,185,185,249, 13, 92,232,142, 59,239,124,239,123,127,
+ 48, 75,102,249, 21,170,111,102, 77,211,172,172, 92,253,229,127,249, 75,175,116,161,143,124,244, 99,158, 60,219,195,172,253, 70,
+100,255, 25,175, 38, 46,102, 77, 59,106, 63,252,115, 63,123,141, 11,125,232,167,127, 6,138,127, 2, 66, 91, 66,111, 65,128,108,
+104,108,154,108, 70, 26, 51,154, 29, 59,246,242,250,250,151,126,234, 39,255,104,202,140,116, 93, 39,197,226,169,154, 17,177,142,
+ 72,163,198,143,220,120,113,121,121, 99,126, 97,188,184,184, 61, 55, 55,161, 53,228,220, 39,127,233,151, 63,250,145,159,157,186,
+ 16,212, 75, 65, 54, 34,116,130,102,120,240,173,255,167,109,217,182,108, 90,180,173, 53, 13, 83,162,161, 51,106, 50, 30,255,226,
+ 39,127,233, 99, 31,253, 72,150, 56, 79,201, 7, 47,185,228,146,187,212,189,249,129, 63,115,143,191, 11,162, 32, 57, 4,165,164,
+228, 93,151,186,174,235, 62,249,201,127,145, 47,148,250,151,187,123,125,127,223,233,207,165,164, 46,197,215,228,138,105,148, 28,
+158,212, 77,144,186,212, 77, 38,227,201,248, 3, 31,252, 32,128,214,229, 0, 8, 1,134,248, 41, 46, 31, 88,145, 82, 74, 20, 64,
+192,146, 60,193, 27,101,255, 9, 64,146,146,187,161,235, 14, 31, 58, 76,176,185,247,222,123, 1,193,243,210,197,164,191,254, 13,
+143,130,121, 13,138, 92, 9,160, 4,185,220,245,197, 47,220, 59, 30,143,234,204,190,243,123,191,183,149,187,226,220,176,253,110,
+ 4,132, 46,117, 52,139,167, 33,201, 49, 36,135, 53, 36,112,241,229,195,171,171,115,180, 20,207, 10,114, 60, 30,183, 82,156,234,
+146,133,117, 3,149, 18,204, 36,193, 4, 52, 28,195, 91,209,221, 27,195,153, 71, 78,173,173,239,143,101,205,243,209,117,225,216,
+ 61,198,109,150, 28,164, 32, 67, 74,113, 39, 72, 8,129,119,199,185,179,175,121,249,229, 99, 70,144,137,164,137,162,178, 28,163,
+107, 35, 26, 53,131,187, 1, 50, 35,220,221, 35, 4,176,152,213,149,203,203,207, 60,123,167, 25,105, 41,244,144, 70,185, 53,166,
+ 28,125, 2,173,146,195,232, 14, 32,145,230, 46,128,238,146, 8,200, 76, 79, 63,117,219,230,230, 50, 45, 73,164, 20, 6,214,100,
+ 48, 37,193, 20,106,175,214, 33,184, 19,102, 6,151, 83,164, 33, 37,146, 48,211,163,143,188,110, 60,158, 55, 38,201,104, 4, 41,
+ 37, 71, 3,115,138, 4,225, 4, 9,184,121,242, 8,133,220, 37,119, 64,238,190,185,177, 15,240,103,190,118,114,107,107,214,221,
+ 93, 2,228,146,220, 93,114,121,114,185, 43, 84,193, 61,201,213,220,125,247,221,202, 10, 27,113,171, 0,172,173, 46,202,121,233,
+210,225, 28, 4, 0,146,178,216,130, 16,136, 48,211,170, 62,186, 13,253, 33, 41,208,165,248,210,120,220,158, 63,127, 83,118,206,
+146,153,145,144,220,105,230, 14, 51,119,192,156,106, 76,249,213,186,156,180,124, 9,119,101,207, 1,119,207,102,128,116,119,154,
+ 81, 50, 72,150,227, 39, 9, 12, 99, 40, 73,222,202, 5,246,223,175,151, 40, 70, 42, 66,250,134,241, 21, 48,155, 63, 65, 12,173,
+ 98,136, 90, 43, 57, 64,130,238, 94,220,169, 23, 55,151, 67, 77, 41, 70,108,114,137,132,229, 47,185,212, 32, 39, 19,248,246,235,
+255,201,207,214,215,109,183,221,126,247,221,119,223,122,251,237, 7, 15, 28,232,143,134, 93, 64,132,155,198,252,203, 86, 86, 86,
+ 30,127,252,177,175,124,229,203, 79, 61,245,212, 55,103, 64,139,139,139,239,125,239, 15, 30, 59,118, 60,156, 70, 9,152, 21, 58,
+ 80, 84,161, 88,222, 93,145,116,137,133,107, 72, 8,162, 29,141,126,255,119,127,247,243,159,255,156, 94,181,112,240,221,239,126,
+247,221,119,159,114,207,114, 30,154,171, 61, 67, 38,217, 15,162,198,245,187,135, 20, 9, 71, 63,172, 50, 80, 51,179,174,235, 62,
+245,169, 95,123,250,233, 23, 95,121, 64,237,237,119,188,110,103,103, 92,230,227, 26, 15,194,154,220,128,187, 70,131, 62,205,232,
+ 71,224,117,144,230, 70, 52,173,246,205,111,222,242,218,231, 15, 29,188,242,221,111, 63, 45, 52, 23, 47, 30,255,135,239,251,143,
+219,219,219,215, 30, 80,234, 38,101, 16,125, 82, 51, 24, 13, 53, 53,160,169,197, 19, 48, 63,191,125,219,109,207, 44,239,191,218,
+ 54,176, 6,102, 48,210,154,152,169,136,142, 16, 51, 5, 89, 82, 50,216,194,252, 75, 15, 61,244, 79, 70,163,230, 55,126,227,223,
+ 63,249,228, 19,187, 7,212,165,116,109,237, 39,194,100,230, 73, 97, 89, 34, 8, 32,205,239,188,227,169, 67,135, 46,179,129,145,
+ 18, 60, 89,118,237, 6, 58,101,222, 68, 46, 2,164,206, 35, 99,128, 32, 35,141, 41,117, 66,250, 71, 63,252,195,109,219,254,250,
+191,251,183,207, 62,251,236,112,134,186,235,137,187, 33, 28,178,209, 4, 15, 55, 73,128, 39, 79, 62,119,252,196, 57,107,144,156,
+ 4, 69, 81, 64,227,141, 91, 56,112, 25,195,116,210,225,113, 45, 23,195,240, 38,159,140,217,165,206,194, 49,186,255,216,143,255,
+227,153,209,204,135, 63,156,131,190,230,244,253,247,103,203, 93,144,151, 60, 97, 66, 47, 88,245, 39,211, 93,119,253,213,129,131,
+ 87, 0,120, 53,248,168, 41,176,216, 39,141,156,214, 96,201,227, 6,122,225,185,227, 43, 87,151,161,254,149, 60,125,207, 59,222,
+121,238,220,185,139, 23, 47, 54,247,221,119, 58, 32,145, 8, 54,228,249, 30,200, 49, 30,114, 16, 34,136,186,253,246, 39,230, 23,
+214, 34, 36,137,152, 3,160,138, 83,205,254, 33,198, 39, 72,240,236,134,229, 14,119,184,107,109,125,225,209, 71,238,202,142,171,
+222, 84,130,240,198, 55,190,201,140,173,187,135,176, 0,128,135,195,203,239, 68, 17,112, 17, 6,136,251,151, 86,150, 22, 86,228,
+ 76, 16, 9, 56,104,144, 68, 65, 78,153,187,152,220, 91,193,147,153,201,108, 74, 47, 37, 63,251,194,137,231,158,125, 45,152,168,
+108, 32, 82,142,228, 21,136,211,119,125,247,219, 91,247, 4,130, 78, 69,174, 31,227,112,138,130, 74,148,224,128,236,224,225, 11,
+ 73, 82,151,179, 65, 51,193,225, 36, 13, 70,210,208,200,140,242, 4, 51,208, 96,150, 19, 34,137,231,206,158,120,254,249,155, 65,
+ 18, 94,236, 71, 86,194,252,166,224,109,109, 89,144,144, 2, 41,166,136, 66, 14, 48, 25,193, 52,169, 81,187,149, 82,120,127, 2,
+ 46, 49, 75,140,228,144, 53,225,231, 97, 70, 99, 2,217, 77,102,206,157, 61,121,233,242,141,144,129, 36, 20,234, 71,131,152, 51,
+166, 28,176,229,140,150,148, 90, 79,174, 12, 34,193, 61,199, 81,200,177, 45,144,143, 16,150,146, 35,165, 42,222,138, 51,205,172,
+ 60, 33, 72, 31,167,209,133, 11, 55, 93,124,249,168,148,109, 17,160, 88,153,226,120,196, 64, 22, 40,131,121,196,179, 34,129, 88,
+187, 54, 73,132, 67,161,225, 0, 92,158, 39, 90,101,198, 37, 82,216,222, 30,141, 70, 59, 17,214, 88, 36, 4,144,187,204,228,206,
+151,206, 31,123,249,226,209,226, 78, 16,147, 20, 90,103,217,166, 91,224, 45,148,145, 9, 52, 32, 81, 22, 3, 97, 10,236,129, 45,
+220,197,176, 25,202, 3, 85, 32,190,148, 59, 24, 33,176, 75,188,122,101,113,110,110,205, 12, 36,106, 92, 62,153, 52,207, 63,123,
+235,230,214, 2, 64,179,156,126, 64,116,203,235, 77, 42, 5, 6, 28,169, 67, 34, 45, 81, 70,198,122, 36, 68,230, 96, 36, 72,183,
+152,161, 88, 35, 18,238,234,103, 7,253, 1,146,186,178,178,124,248,200, 75, 77, 19,243,143,148,154,103,190,246,218,173,173,197,
+200, 7, 4, 41, 85,247, 42, 36,154,133,137, 44, 56, 20, 74,204,130, 44, 33, 64,196, 4,197, 45,131, 52,180, 49, 13,164,220, 51,
+ 34, 25,191, 36, 65, 6,134,195, 21,192,241,164,189,244,242,161,195, 71, 46, 16,186,248,242,141, 47, 93, 56, 22,114, 67,196,132,
+ 1, 89,146,100,102,128,220, 73, 36,153, 1,146,211,152, 4, 35, 32, 7, 41,138,180, 36, 55, 3,100, 50,143,123,121, 43,169,168,
+ 12, 99, 58, 88,164, 71,112, 43,233,103, 60,195,249, 23,143,190,248,210, 17,228, 83,178,182,138,132,187,153,197, 91,137,201,195,
+167, 24, 0,203,206, 35,188,138,195, 16,106, 42,196,236,184,131,116, 42,252,158,163,117,143, 5, 12,241,164,187,194,197,196, 83,
+ 38,247, 88,222,154,246, 73, 10,143,239, 69, 39, 3, 52, 9, 39, 96,102,146,147,160, 89,104,135, 36,193, 44,166,197, 4,183, 28,
+245, 19,238,160, 85,207,162,200, 97, 91,149,201, 37,178,218,199,189, 7,201,135,163,204, 83, 22,147, 88, 24,149, 12,204, 29,229,
+ 38,145, 85, 72,121,178, 5,185, 44,223, 58,194,135,234,102, 66,198,179,110, 20,127, 9,180, 74,169,172,189, 65,217,186, 84,203,
+185, 43,155,137,143, 53, 50, 75, 41,153,153,187,155,101, 72, 15,178,108,225, 64,129, 20, 97,249,158,161,178, 40,153, 97, 8, 39,
+ 11, 26,159,179,229,152, 33, 40,124,164, 27,203,146,169,207, 63,135,225,240,174, 35,197, 91,195, 29, 8, 87,211,191, 11,113,138,
+ 15,204,254, 22, 49, 39, 22, 46, 74, 78, 88,201,119,161,234, 71,191,253,250,246,235, 91,153,185,246,177,247,168,157,159,155,159,
+153,153,217,183,111,110, 52,202, 80, 92,215, 77,182,183,119,118,118,182, 55, 54, 54, 82, 74,223,242, 1,141, 70,163,251,238, 59,
+253,134,187,238,186,229, 53,183, 52,109,169, 56,138,176, 28,124, 71, 10, 24,153,170,164,167,159,126,250,209, 71,190,250,133, 47,
+124, 97, 92, 10, 60,223,180, 1,125,223,223,125,247,169, 83,167, 70,237, 72, 21, 55, 46,201,216, 32,161,174, 9, 98,206,240, 1,
+ 52, 77, 67,227,120, 60,126,248,139, 95,252,131, 63,248,175,127,173, 1,181,109,123,234,212,169,119,189,235,251, 84, 45, 77, 65,
+183, 48, 72,233,135, 25,254,116,102, 63,157,218,147,102,182,186,186,250,171,255,234, 87, 54, 54, 54,190,177, 1, 29, 60,120,240,
+ 93,239,122,215,241,227, 39, 35,134,197, 46,107,136,105,116, 97,250,231,117,199, 20,209, 41,208,180,205,133,151, 94,250,173,223,
+252,205,203,151, 47,191,170, 1,125,224, 3, 31,152,155, 91,112,249, 84, 34,182,107, 2, 75, 2, 63,200,234, 7, 11, 22,254, 53,
+215, 54,109, 26, 9,201,112, 77,211, 52,207,124,237, 43,191,254,235,255,233,235, 14,200,102,102,247,117, 93,231,238,157,119, 3,
+ 92,191,226,154, 30,112,167, 92, 73,174, 2,125, 42,197, 71,151, 39,185,123,242,242, 41,197, 23,147,123,138, 11,165,228,201,201,
+173,191,247,158,237, 63,249,211,247, 44, 47,239,251, 58,213,250,183,190,245,193, 0, 97, 17,249,226,244,171,122,175,138, 70, 84,
+204,102, 8, 78, 12,214, 55,231,141,225,194, 73,159,153,217, 57,114,244,165,187,238,122,100,118,223,182,164, 31,122,223,157, 47,
+190,120,219,147, 79, 62,121, 93,251,226,238, 80,133,116, 53,165,118,202, 11,164,233, 67,195,183,225,150,231,231, 54, 23, 22,183,
+150,150, 54,102,103, 38,163, 89, 31,181,221,104,148,102,102,211,204,204,164, 29,165, 40, 74, 22, 8,216,191,247,157, 15,222,126,
+251, 29,255,230, 95,255,218,181, 7,164, 90, 61,239, 53,107, 10, 0,185,134, 23, 22, 20, 40, 13,252,248,177, 23, 79,156, 60, 63,
+ 59, 59,105, 90, 25, 13,166, 38, 36, 7, 96, 3,163, 1,114, 69,124, 99, 49,252,166,221, 58,113,252,196, 39, 62,241,139, 31,255,
+248,199,174, 33, 67,185, 38, 52, 93, 27,218, 85, 39, 42,210,228,105,112,112,102,180,121,207, 27,191,124,243, 45, 95, 27,141,118,
+ 4,121,130,187,195,163,112, 41, 17,114, 38,119,137, 65,107,112, 36, 41, 73,221,104,180,149, 60,129,248,167,255,236, 19,215, 24,
+144,114, 97,234, 21, 95,129,116,120,255, 97,113,113,229,212, 27,191, 50, 55,183, 17,193, 80, 65, 43, 42,136,192, 0, 27,114, 64,
+ 39, 65, 84,145, 83,160,147,123,196,187, 31,249,232,199,246, 12,232,122,227, 41,168, 71, 15,179,151,194,225,226,226,213, 59, 94,
+247,152,217,196,229,114,148, 11,160, 72,123, 64,234,181,202, 68, 1,201,221, 29,114, 8, 73,234,234, 52, 47, 45, 46,189,255,199,
+126,124,106, 64,215, 93, 41, 5,136,146,239,233,165,186,209,216,248,182,219,159, 48,166,228,242, 20,127, 65, 12, 75,187, 13, 42,
+ 60,229,255,145, 30, 39,119, 79,220,217, 25,185,203,227, 2,158,110,125,237,173, 15, 60,240,150,225,146, 93,103,122,188,174, 85,
+ 94, 16,151,128,116,203,173, 79, 53,205, 88,146,156, 46,121, 66, 62,193, 37, 7, 16,211,144, 77, 2, 35,153,207, 41,186,228,112,
+215,230,230,172, 71,181, 39,165,120,208,247,252,192, 15,204,207,207, 15, 6,132, 93, 8, 26, 74, 45, 76,125,161, 80,144,176,188,
+124,105,233,134,149, 82,195,114,136,249,183,211, 75,253,178, 18,109,242, 60, 3,217,132, 10,146, 82,194,230,198,190, 90, 78,141,
+137,239,186,238,167, 62,244,211,101, 64,152, 22,155,236, 68,202,148,148, 63,187, 36,164,163, 55,157,143, 83, 92,144, 24,235, 25,
+182, 89, 14, 87,145, 39,135, 59,178,104, 59, 80, 70,236,142,171, 87,151, 60, 46,157, 61,128,146, 59,164,217,217,217,183,188,229,
+ 59,166,100, 40,251,132,124, 90,118, 23, 85,235,229, 62, 63,183, 49,187,111, 83,130, 39,184,163,200,144,148, 24,112,157,135, 35,
+ 73, 97, 36,144,220,187, 20, 62, 68, 41, 10,107,174,175, 61,125, 11, 6, 94,201,139,159,145,235,239,191,231, 61, 36,219, 2, 81,
+229,196,199,115, 2, 51, 0,136, 2,217, 19,246, 47, 95,166,164,114, 32, 50,109,115,186, 57,220, 8,209,123, 8,207, 36, 90,182,
+167, 37,243,242,171, 43, 7,174,174, 46, 21, 37, 68,164, 68, 14,152,123, 2, 52,214,187,191,255,251, 91, 8,130,163, 36,189, 1,
+ 94, 1, 84,225, 23, 85,199,180,180,180,226, 81, 5,140,146, 27, 97, 78,207, 8,143,187, 27, 83, 31, 67,101, 52,180, 86, 34,132,
+201,184,125,236,177, 59,242,101,195, 31, 57, 64,135, 81, 48, 72,130,191,229, 45,223,209, 66, 94, 92, 6, 75, 42, 89,252, 69, 92,
+216, 36,161,109, 82, 51, 26,231, 42, 94,224,145,100, 98,198, 13,144,128, 70,112, 9,185,230,235, 25, 89, 51,194, 1,164,212,126,
+245,175,238,222,217, 30, 1,110, 52, 88, 96,232, 38,129, 14,153, 26,119,167,165,148, 90, 15,240,192,233, 37,219,206,248,162,136,
+200,208,157, 0,218,217, 49,233, 1,217,132, 9, 70,153,117,135, 96, 68, 10, 77,119,136,222,176, 81,172,159, 19,216,222,158,123,
+236,204,235,183,182,231,153,231,196, 99, 73, 10, 92, 65, 56,220,140,112, 58, 91,197, 41,204,178, 3,201,115,160,234,238,117,150,
+ 56,106,199,114,193, 88,102, 40,123, 6, 51,193,233,168, 64,134,114,169,193, 8,192,197,151, 47, 28, 61,251,194, 73,247, 81, 64,
+ 13,185, 98, 49,116,226, 2, 77, 1, 83,137,108, 51,166, 24,227, 18, 11, 82, 45,151, 2, 0,130, 83,144, 53,147,129, 29,166, 59,
+154, 38,103,245,102, 80, 2, 26, 71, 50,135, 26,137,134,228, 88, 89, 57,112,246,249,215,140,119,230,162, 54,162,126,200,176,128,
+ 94,170, 65,151,172, 8, 77,155, 45, 16,251, 80, 3,185, 26, 27, 71,242, 31, 73, 79, 25,113,132,228, 36, 83, 65, 53,131,248,228,
+ 9, 50,183,196, 9,176,182,186,124,238,236,205,219,219,243, 1,159, 0,153, 87,232, 37, 8,247, 56,194,252, 63,163,120,102,238,
+222,122, 22, 95,167, 51,107,116, 6,119,242,170,197, 45, 61,213, 48,142, 5,128, 84,185,100, 84,208,165,196,181,245,197,179,103,
+111,222,218, 94, 36,242, 80, 84, 10, 72,101,177,114,112,178,171, 20, 86,104, 37,106, 33, 40,132,168,192,194,129, 91, 35, 20, 52,
+ 36, 65,236,146,185, 98,154, 3,191,202, 50, 29, 81, 4,224, 59, 59,163,115, 47,156, 92,185,122, 40,170, 70, 96, 37,185, 76,229,
+ 20,130,108,122, 28, 86,140, 64,148,251,195, 48,106,176, 66, 33, 80, 10, 4, 44, 32,123,128,147,201, 40,206, 82, 33,176,196,194,
+145, 76,201,183,183, 22,158,125,246,214,241,120, 95, 48,206,242,156, 40, 89,158,201,160,122,132, 62,208,115,166,146, 71,156,133,
+217, 66, 11,188, 69, 65,126, 49, 20,111, 71,121,227, 1,252, 79, 38,173, 18,100, 94, 19,178,140,186, 38, 93, 94, 57,116,238,236,
+205,174,166, 32,116,189,116, 56, 81,140,132, 50,226, 88, 16,222, 33,160,149,197, 2, 16,217,102,131, 92,141, 66,145,176,188,102,
+129, 90,187, 38, 19, 27,119,237,104, 52,137,147,226,236,148,112,229,210,161,115,231, 79,230,213,201, 92,205,140,207,149,196,132,
+153,186,107,232,147, 62,230,149, 71,134,208,122,237,109, 3,107,206,163,201, 86, 59,202, 41,128,101, 48, 63, 8,213, 59, 59, 51,
+109, 59,169, 53,123, 64,151, 95, 62,116,238,197, 19,129,178,102,254, 80, 84, 18, 97,130, 12,245, 61,242,161,140,189,154, 73,178,
+112, 2,206,176,213,144, 96, 25,232,204, 97, 24,228, 53, 12, 26,148, 18, 51, 28, 41,108,110,204,245, 1,182,116,249,242,129, 23,
+206,157, 8,203, 20,174, 27,146, 23,182, 77, 84,247, 74, 73, 16,168, 49,132, 4,149,104,202,107,120,227, 30,166, 70, 50, 40, 80,
+248,248, 29,194,238, 21,208, 12, 69, 10,206,206,250,250, 66,160,252,146, 54,214,231,207,190,112, 60, 22,160,112, 72, 2,106,206,
+105, 85,133, 8, 34,228,243,105,200, 84,152,170, 37,246,228,152, 76, 98, 21,242, 87,138,210,171,255, 88,164, 88,218,218,220,215,
+ 77, 26,119, 77,118,218, 23, 94, 56,153, 82,227, 57,102, 85, 69,183, 75,117, 52,207,142,231, 31, 57, 36, 70,189,125,120,192,202,
+ 94, 40,149, 94,186, 55,119,223,125,119, 1, 61, 56,149,185,230,148, 53, 43,148, 36,151, 37, 55, 72,231, 95, 60,190,181, 53,151,
+ 75,102, 69,166,128,222,102, 68, 48,147, 47,145,143,177, 74,124, 1,206, 57,164, 77,176, 92,165, 85,248, 64,230, 39, 37, 16, 53,
+134, 82,148,129, 42,218, 14, 94,190,124,232,242,229,131, 40,148, 87,101,149,246, 98,156, 2,230, 14,206, 30, 45,164,156,153, 9,
+ 37, 25,227, 30, 81, 64,161, 23, 80, 93, 46, 55, 88, 32, 78, 38,215,112,205, 60,207,191,134, 75,150, 3,190, 28,165, 10,211,197,
+243,154,249,196, 59, 47, 50,229,142,190,194,237, 83,186,130, 26,120, 85,186, 87,184,125,151,213,154,120,176,186,170, 32, 74,125,
+121, 37,131, 50,253,226,160, 10, 89,172,127, 63,110,120,113, 83,222,123, 40, 40, 34,208, 72,207,132,162, 97,170,238,187,230,162,
+200, 60, 49,213,135,233,181,204,195, 92,214,242, 84,166, 18,198,249, 69,219, 89, 13,124, 49, 17,229,169,144, 11, 95,145,169, 57,
+242, 80,156, 10, 71,215,231,198,168,137,156, 36,171,143, 18, 15, 25, 90, 86,150,204,251,144,165,228, 38, 37, 27,208,160, 30,194,
+242, 12, 57,188,139,177,245, 92,200, 28,208,213,146, 59,250,180, 59,236, 31,188,180,179,208, 84, 20,180,136, 78,240, 28, 85,133,
+ 35, 38,169, 18,132,194, 44, 97,247, 92,230,239,214, 55,138, 55, 89, 30, 6,179, 5, 22,122, 93, 15, 0, 81, 44,243,164,200, 92,
+123,209, 25,216, 52,148,193, 97,119,158,189,103, 52,152,134, 38,149, 35,188,106,232,131, 26, 88,171,111,121, 25, 7, 67, 82, 77,
+153, 45,166, 44,155,227,162,101, 67,155,139,222, 88,151,162,243,148, 53, 47, 81, 91,141,177,138, 12,168,136,181,215,133,202,202,
+ 51,192,155, 81,197, 40,175,161,161,103,196,176,146, 61, 7,224,162,170, 80,103,173,118, 31, 50, 29, 75,189,204,217,135,220, 89,
+192,195, 42, 10, 34, 60,142,149,124, 75,117, 40,194,110,192,240,219,175,111,191,190,253,250,246,235,111, 66,189,245,149, 46, 65,
+ 46, 46, 45,221,176,180,180,176,176,184,188,127,249,224,129,131,203,251,247, 47,223,112,195,252,194,226,194,194,220,204,204, 44,
+ 11,147,169,148,221,166,138, 22, 93,215,109,109,109,174,174,173,174,173,173, 95,184,240,210,250,218,250,213,213,171,107,171,171,
+ 43, 43, 43,107,107,107,127,243, 38,104,126,126,254,142, 59, 95,119,226,196,137,163, 71,142, 44, 47,239,159, 95,152,111,219,118,
+208, 94,178,235,234,220,123,147,105, 42,237,160,149,176, 86, 79, 7,175,174,235, 54, 55, 54,175,174, 94, 61,119,238,236,227,143,
+ 61,246,196,227,143,119,223,164,202,247, 55,109,130,142, 28, 57,114,250,254,251,239,185,231, 77,179,179, 51,170,196,146, 87,115,
+ 93, 21, 16,191,199,165, 88,138,107, 42,212,236, 12, 27, 98, 80, 44, 29, 22,116,115, 47,103,161,177, 10,138,174,174,231,158,123,
+246,127,125,230, 51,103,206, 60, 58,136,155,255,191, 76,208,226,226,226,209,163, 71,223,248,198, 55,221,113,199,157,214, 54, 70,
+147,124, 74, 64,116, 13,206, 53,175, 41, 52,228,174, 18,242,224,227, 30, 14,253,222,159,211, 93,115,145, 28,245,132,223,202, 21,
+ 48,187,114,229,202, 31,255,239, 63, 58,115,230,204,165, 75,151,190, 37, 19,116,228,200,145, 83,167, 78,221,122,235,173, 71,142,
+ 30,205,141, 75,210,244,164,232,149,163, 38, 14, 13,210,192,210, 12,143, 79, 25, 31, 92,131,214,127, 77, 50,192,215, 59,200,204,
+231,162, 89, 99, 0,159,123,246,153,207,127,238,115, 95,124,248,225,174,155,124,115, 38,232,161,135, 30,218, 25, 79,122, 34,247,
+174, 56, 93,175, 46,158,156, 18, 24,114,239,193,107,156,182,139,182,241, 10,162,180,139,186, 48, 84,195,170,125,133, 36, 8,142,
+ 70,233,232,177, 11, 55,220,240,252,239,252,246, 35,255,229, 63,159,249,235, 78,208,135,126,250,103, 52,100,186, 95, 87, 94,246,
+ 88,158, 33, 77,102,122, 94, 6, 7,247,138,210,180, 18,238,225,181,244, 84,240, 93, 76,142,235,107, 98,136,149,153,239,155,219,
+185,241,240,165, 35, 71, 47,204,205,109,211, 12, 50,107,108,125, 13, 31,127,232, 75, 95,248,194,243,195,108,247,213,191,218, 76,
+135,218,213, 90,114,173,110, 10,237,178, 88,202,156,166, 30,117, 0,185,247, 60,101, 10,101,197, 53, 50,243, 64, 5,148, 14,212,
+ 93,125,137,133, 20, 12,134,220, 65, 78,147, 17,102, 50, 19, 77,141,201,168,118,148,218,153,110,166,157,204,204, 78,230,230,182,
+227,127, 59,138, 61, 34,172,228, 95,201, 19,231,230,155,159,255,133,191,243,228,147,175,255,203, 47, 61,246,135,127,248,223,191,
+ 81, 59, 53,160, 87,224,186, 61,102,122, 5,205,210,158, 79,195,131,186,230, 81,212,142, 59, 33, 86,126,123,113,113, 99,105,105,
+125,110,110,123,102,118,220,142, 82,219,120,211,120, 76, 13, 1, 35, 96,160,129, 65,191,204, 4,231,218,245, 82, 84, 49,216,224,
+ 72,170, 76, 86, 18,210,104,180, 97,182,249,134,187,238, 62,117,207,169,213,213,181,223,251,221,223,121,226,137,199, 95,181, 4,
+101,176, 82,195,135,220,243,212,218, 27,224,228,166,134,232, 34, 8, 48, 81, 83,187, 18, 12,182, 76, 24,124, 37,215, 92,104, 77,
+183,188,124,245,200,145,139, 75, 55,172,141, 70, 29, 41, 51,128,104,162, 27,209,130,190, 93,104,170,102, 65,145,160,130, 88,155,
+231,151,164,213, 82, 67, 80,172,163,104,161,204,255, 23, 8, 87,211,108,207,140,182, 54,214,231, 33, 44,204,207,253,232,143,190,
+223,165, 79,125,234, 63, 60,249,196, 19,175, 74,130,246, 72,202,117, 18,254, 61, 44,157, 66, 26,210,148, 90,245,245,218, 93,202,
+ 25,242,162,133,133,245, 35,135, 95, 94, 62,180, 50, 59, 59,102,113, 77,202, 72, 13, 83, 52,135, 68, 65,153, 8,202,174, 43,207,
+151, 35,100,138,114,132, 77, 78,185,102,150, 11, 23,174,194, 76,142, 98, 73,198, 55, 58,107,118, 2,208, 33, 41, 79, 36,223,255,
+254, 31,219,216,216,248,253,223,251,189, 51,103, 30,125, 37,142, 87,101,126, 76, 27, 97, 93, 59, 38,158, 62,179, 55,183,234, 79,
+ 24, 58,244,193,223, 65,106,113,113,237,228,205,207, 29, 63,249,194,226, 13,235, 77,147, 66,245, 6,174, 51, 46,100, 5, 31,207,
+237, 78, 54,236,173,235,187, 8,242,189, 74,235, 73,174,169, 85, 62, 78, 6,189, 8, 64,201,237,202,149,253,235,235,139,195,231,
+242,228,163,209,232,244,233,251,239, 62,117,234,169, 39,159,220,187, 15, 77,158,160, 55, 63,240,128, 48,132,142,116, 29,155, 51,
+245,167, 74,246,212,215,141,199, 5, 65,243,115, 27, 55,223,252,252,137, 19, 47,204, 45,108,152, 13, 5, 47, 58, 9, 88,120, 47,
+181,139, 78, 28,120,195,210,160, 83, 92, 34,251,205, 41, 88,119, 79, 97,229, 77, 72,125,157,152, 16, 38, 93,123,233,226,161,141,
+141,121, 12,220,116, 41,232,248,210,210, 13,127,251,109,111, 91, 92, 88,122,236,177,107,196, 4,205,253,247,191,249,235, 51,188,
+ 6, 29,157, 5,211,155,170,146, 76,253,125, 80,214,145, 96,150, 14, 29,184,116,243,107,158, 95, 92, 94, 45,197,179,178,224,185,
+ 63, 43,170,135,236,169,242,196, 32, 18, 64,109,149,171,147, 55,152,142,126,225,242,172, 56, 49,232,180,143, 27,237,108,207,188,
+244,226,209,157,237,125,125, 92,151, 75,184,253, 3,156, 56,113,226, 29,239,248,158, 71, 30,249,234,250,250,250,174, 9,186,255,
+213, 38, 35,197, 17, 21,149,138, 54,237,162,108,131,174,220, 82,217,193,204,104,251,166, 99,231,143, 29, 59, 63,154,217,137, 83,
+170, 66, 21, 62, 77,111,164,138,214,228, 66, 81,105,210,201, 21, 24, 98,224, 0,202, 54, 23,152, 6,160,243, 20,105, 88,178, 3,
+ 18,174, 92,222,255,226,139, 55,185,219,174,147, 75,201,171, 87,153, 7,223,250,157,115,243,243,177,169, 78, 47, 65,215,115,237,
+ 28,218,163,129,105, 17, 6, 45, 16,187,213,171,132, 59,194,236,204,206,177,155,206, 31, 58,124,209,154,174, 84,105, 11, 97, 79,
+ 53,238,225,192,196, 15,219,102,167, 53,167,244,208,214,150,180,216,190,193, 43, 39, 13, 8,193,169, 27,150,196,141,220, 53,233,
+ 70,207,191,112,243,250,218, 98, 38, 11, 13, 59, 62, 6, 31, 75,245, 31,183,188,230,150,215,188,230,150,167,158,122, 50, 56,233,
+205,125,247,157,190,150, 54,169,215, 37,214,245, 40,157,254, 3,109, 66, 22,165,202, 89,204,218, 53, 26, 77,110,188,241,229,131,
+135, 47,133, 49, 86,222,158, 38,138,103,121,134,226,187,170,225,102,189,222, 32,118, 66,127, 76,189, 81,175, 10,165, 97, 13,130,
+125,109,161,108,225,144,220,158,127,254,228, 75, 47,222,164,178,241, 66, 29, 35,123, 29,211,128, 60, 12,119, 63,124,248,240, 61,
+247,220,243,232,163,143,110,111,111, 55,247,221,119,122,151, 54,105,202, 65,245,189,147, 44, 27, 32,212, 53,166,122,242, 1, 7,
+124, 93,179,180,127,121,229,240,145, 11,163,153,113,126, 10, 14,116, 64,153, 83,161, 50, 77,253, 61,250, 13,103,178,178,229,185,
+ 25, 54,254,102, 25,100, 45, 68, 40,183,207, 70,177,139,117,214, 82,215,156, 63,119,236,236, 11, 39,220,219,222,195,104, 24,198,
+ 78,177,215,203, 52, 81,210,220,220,220, 91, 31,124,240, 75, 15, 63,220,156, 62,125,223,180,103,175,225,222,192,162,228,193,150,
+ 29,187, 6,188,105, 85, 66, 3,170, 37,213,190,125, 91, 55, 30,190, 48, 63,191,153,249,220,177,135, 71,221, 92,162, 92, 43,134,
+ 50, 29,106,103, 29,210,160, 54, 84,181, 72,197,250,214, 10,186,132,235,120, 20,108,111,237,251,218, 51,183,156, 59,119, 60,229,
+217,153,182, 31,211, 76,193,169, 50, 84,185, 42,141, 15,190,245, 59, 91,185, 52, 21,232,212,241, 23,102,111,212,246,195, 76, 6,
+195, 41,102, 81,238, 12,242, 25, 74, 91, 27, 73,153,165,249,249,245,217,185,205, 82,145, 84,223,138, 82, 74,244, 46, 49,111,160,
+ 66,243,184,151, 44, 64, 52,115,166,192,104,229,177,213,134,101, 2,165, 49,183,145,246,105, 6,175,145, 18,117, 93,115,233,226,
+225,115,103,143,111,239,204,149,176,106, 15, 7,189,200,123,105,105,171,237,194,181,169, 91, 46, 88, 99,173, 52, 37,188,131,182,
+239, 92,127,172,129, 85,175,130,213, 48,230,210,110,233,165, 70,108, 35, 51,153,159, 95,107,155, 73,207,148, 40,115,111,166,126,
+181, 60, 11, 75, 42, 76, 38, 55, 64,110,193, 40, 40,101,227,224,119,132,163,151,169,196, 64,153, 48, 57,148, 5,129,105,210, 94,
+ 94, 57,112,225,197,155,214, 55,150, 74,123,161,188,154,127,245, 65,169,114,239,119, 25, 61, 88,113,206,190, 89, 27,142,132, 54,
+183,127, 86,199,148,203,195,136, 94,207, 65,219, 30, 21, 76, 74, 15, 98,157, 74,154,148,121, 62, 44,172,132,182, 29,143,102,130,
+ 87, 93, 49, 9,175,156,194,190,227, 1,153,143,136,146,204, 71, 19,114,148, 68, 45,199,203, 42,192,172,140,240, 76, 11,172,172,
+144, 82,199, 79,205,230,198,194,197,139, 55, 94,185,114, 96, 50,153,201, 67,239,249,177,188, 86,232,203,222,230,244,122, 87, 92,
+106, 37, 32, 26,218,202,172,203, 9,103,232, 66,144, 38, 11,134,156,165,163,231,235, 85,153,130, 42,223, 50,214,216,124,212,142,
+205,146, 15,146,143,194,203,200,150,151,185, 48,158, 27,192,251, 0, 56,139,183, 7, 61, 14,140,142,125,193,138, 15,200,115,147,
+ 73, 87,221,100,102,117,117,105,229,202,129,245,141,165,201,100,148, 89,125,187, 16,115, 94, 15,139,208,222,220, 50,211,139, 43,
+ 4, 35, 25, 24, 18,132,216, 68, 78,213, 72,136,154,186,194, 0, 46,202,209,112,213,203, 41, 6,171, 75,100, 2, 82,225,120,244,
+ 33, 71,105,141,173, 88,169, 23, 38, 47, 51, 11, 40,247,234,147, 68,217,161,169,242, 44, 51,115,174, 75,163,173,141,197,213,171,
+203,171,107, 55,236,140,103,161, 6,125,104,224,152, 34, 69, 23, 14, 99, 13,174,122,205,154,254,151,125, 5,123, 90,104,105,194,
+150,167, 54, 58, 9,178,164,135,155, 64, 15, 51,136, 94, 29, 79,161,196,130,193,206,157,138,247, 75, 86,149, 55, 53, 83,105, 33,
+ 71,109,239,174,100,235,154,239, 3, 85,137,234,249,101,166, 19, 4,209, 32,183,174, 27,109,109, 44,172,173, 45,109,108, 44,237,
+108,239, 75,222, 84,172, 21,185, 21,190,239,255,185,150,108,244,150,243,154,248, 85,159, 30, 84, 26,229,128,125,212,102,115,238,
+133, 98, 95,194,165, 26,155,170,238, 23, 17, 54,105, 10, 16,116, 12,167, 15,112,209, 19,221, 89,152,199, 40,107, 83, 98,136,158,
+137,150, 5,174, 80, 70, 84,152, 98, 33,113, 54, 30,207,174,173, 46,175,174, 46,111,109,205,167,212, 14, 64, 86, 13,170, 79,123,
+227,248,222, 26, 86,186,104,222,135,131, 61,191,109,119,245,106, 15,145, 59, 79, 83,211,180,240, 48,187, 44,168,151, 19,168,205,
+ 7,197,128,171, 82, 97,213, 67,167,153, 39, 87, 73, 49, 33,149,169,179,201,196,154, 81,159, 39, 4,205, 59,247, 25, 20,250, 51,
+251, 29, 17,242,118, 7, 16,146, 48,153,204,172,174, 46,175, 92, 57,184,189, 61,231,110, 5,117, 86,225,163, 98,232,148,119,187,
+238,168,191,197, 32,153, 13,133, 25, 10, 99,170,236, 60,233,133,233, 26,116,236,210,216, 96, 25,103, 24, 0,200, 41,181,234, 57,
+138,232, 27,109,166, 2,139, 98, 77,250,196,110,176, 75,227,128, 57, 29,246,120,103, 50,154, 76,218,125,249,162,213, 8, 49,194,
+188,186, 11, 72,217,159,163,162, 51,205,198,198,194,149,149,131,235,107, 75, 41,141,106, 74, 55,104,170, 43, 91,230,105,136,129,
+215, 13, 2, 67,201, 61,118, 68,170,180, 35,148, 77,123, 81,187,244,197,186, 74,145, 35,213,112,200,229,165, 5,164, 15,176, 90,
+ 71,133, 48, 93,189,235,170,198,181,158, 94,165,164, 28, 41,183,173,153, 13,115,156,214,238,108,207, 46, 44,172, 91,211,155,169,
+ 74, 81, 85, 33,137,123,110, 94, 65,234,154,213,213,229, 43, 87, 14,110,109, 45,184, 71,187,105,201,104, 80,226,139,188, 69,237,
+ 32,179, 44,187, 48, 84, 46, 85,153,152,169, 32, 57,147, 83, 75, 83, 65,133,238,250,185,221, 91, 41,102,239,135, 4,148, 36,197,
+235,230,135,197,124,248,174, 78, 72, 47,188,238,190,183,193, 33, 78,151, 79, 37,165,196,141,141,185,133,197,153,217,125,219,232,
+ 79, 24,226,141, 81, 40,224,100,220,174,174, 46, 95,185,114,104,123,107, 78,176, 2, 13,102,102, 98,111,146, 88,218,118,114,124,
+ 86,102,198, 7, 32, 82,198,197, 89,211,197, 42, 73,177,239, 80,142, 30,234,108,230,188,169,112,223,175, 83, 78, 39,208,150,202,
+242,180,113, 87, 73,226,243,151,171, 31,204,168,110, 78, 80,138,115, 34,250,118,191,148,184,181,189,111,107,123,118, 52, 19,219,
+146,107, 32,126,153, 67,155, 82,187,182,186,124,241,226,225,237,237,125,213,235,103,153,234, 97,176, 32,216, 87, 95, 62,247, 29,
+ 89, 0, 0, 4,103, 73, 68, 65, 84,147,239, 68, 13, 87, 42,111,200,212,231,117, 25, 79,202,156,219,210,160, 17,141, 23, 17,251,
+ 70,252,144,191, 68, 71, 52,135,244,113,101,237,122, 34, 64,182, 37,210, 43, 65, 2,228, 62,160, 20,132,215, 30,250,243,194,192,
+237,247,115, 84,109, 77,202, 71,199,227,209,198,250,194,252,252,230,104, 52, 46,156,101, 47, 94,204,214,215, 23, 47, 95, 58,180,
+177,190,232,170, 82,195,190,199, 73, 94,195,129,220,173,225,117, 7,224,114,119, 86,210, 50,167, 70, 69, 40,228, 42,199,113,225,
+117, 98, 27, 30,213,108, 25,101,127,201,204,121, 21, 7, 40, 59,106,155, 68,172,103, 59,132,156,171, 90, 21,187, 49,192,121, 57,
+216, 8, 6, 85, 77,134,181, 81, 84, 10, 46,201,141,245,185,249,249,185,165, 27, 58,179,222,217,143,199,179, 87, 46, 29, 88,185,
+122,160,235,218,129,187, 80,191, 9, 74,217,190,165,234, 87,109,128,168,155,175,228,111,168, 98, 73, 67,238,123,207,241, 29,164,
+ 4, 89,112, 48,220,240,196,203, 30,161,170, 37,135, 34, 94,101,215,182, 24, 68, 59, 69,183,141,199,151, 15, 63, 50,243, 77, 69,
+214,118, 42,159, 14,255,122,242,105,209, 64,236,236,204, 94, 93, 89,110,218,110,110,110,139, 84, 74,163,141,245,133, 75,151, 14,
+109,109,205,215,148, 48,179,134,107, 93,162,108,222,131,126,151,207,193, 78, 48, 28, 52, 37, 69, 93,144, 86,244,146,213, 89,169,
+148, 16,163, 91,174,198,134,158,205, 87,217, 7, 44, 82,185,176,188,189, 57,203, 96,208, 48,142,108, 81,207,171,201,106, 9,112,
+122,226, 51,114, 58,237,131, 20,171, 44,178, 15,189, 98, 53,173, 73,182,178,122,195,250,198,252,104, 52, 49,250,164, 27,149,116,
+105,104,167,203,166,229,234,247,156, 26,200,109, 47,179,101, 87,157,188,153, 82,110, 85,200,253, 65, 83,252,228, 10,164, 21,138,
+ 74,197,106, 51,200,147, 63, 69, 99, 39,138, 33,231,148,191,239,131, 64,160,205,101,201, 92,170,244,234,194, 49,220,144,175, 40,
+ 15, 89,107,234,253,196,144,123, 16, 94,102,111,210,117,109,215,181, 3,128, 93,213,205, 23, 1,156,202,249,134, 51, 50,168,204,
+160,223,224, 44, 47,218,112, 58,250,202, 88,191, 65, 91,126,186, 48,210, 97,133, 43, 40, 17, 5,204, 2,206,213, 93,155,140,112,
+200, 6,233, 25,137, 65,155, 91,222, 47,180,224, 60,158,219,116, 80,197,164, 90,101,247,218, 28, 49, 32,153, 87, 9,226,148, 69,
+ 31,246, 14, 12,133, 55, 31, 67,191, 22, 61, 31,188,146,198,170, 71, 80,101, 16,168, 86,130,189,239, 72,202, 16,116,105, 98,240,
+210, 56, 18, 93, 79, 94, 64,117, 85,192, 85, 24, 66,212, 40, 8, 54,119,111,228, 8, 21, 27,164, 62,190,173,205,125, 57,155,241,
+221,187, 66, 85, 35,202,193, 3,104,239,202, 79, 23, 13,114, 40,144,187,211, 6, 6, 94,197, 14, 85, 91, 86,206, 41,130,168, 97,
+ 99, 29,106,175,157, 13,122,239, 50, 83, 97,208, 41,227,101, 11, 66,102,180,170, 48, 62,152,253,181, 77, 51,254, 65, 70, 79, 86,
+117,243,225,200,218, 60,146, 58, 71,165, 91,181,191,109,201, 75,166,173,131,166, 42,191,154,138,119,246,176, 96,167, 38,108,152,
+116, 14,171,163, 53, 71, 27,168,118,222, 92,109, 24, 65,123,169, 22, 13, 12,101, 69, 30,250,142, 93, 14,246,108, 6,122, 16, 48,
+ 3,149,209, 74, 62,149,153, 42,182, 34, 45,179,147,115, 27,243,126, 22,179, 24, 23, 11, 51,236, 36,241,129,140,212, 22,160,190,
+217,101, 56, 19,211,155, 67,100,221,169, 90,179,107, 66,209, 43,201,112, 16,172,157, 19, 28,180,101,213, 47,201, 75,251,142,250,
+ 86,151,108,123, 7,237, 40, 67, 58,134, 6, 70, 85,136,198,234, 82, 49,170, 59,168, 12, 48,252,138,228, 91,193,240,189,180, 29,
+106,208,104, 51,236,176,193,180,117,216,245, 81,195, 46,156,225, 14, 28,187, 97, 25,105,216, 16, 88,155,171,234, 22,146, 3, 21,
+ 28, 52,173,101, 43, 88,192,244, 26, 89, 99,112,114,233,166,244, 65, 65, 28,253, 46, 36, 25,232,201, 7,157, 61, 55, 32,171,164,
+247, 38,170,230, 5, 82,219, 3,129,125,159, 87, 5,119,250, 60,184,166, 2,117,180,149,129, 90, 31,152,123, 88,138,195,121,153,
+ 78,146, 49, 8,118,170,159,231,148, 35,171, 33, 78,209,166,108, 12,242,223,204, 6, 59, 51,100,197, 43,123, 96,202, 75,200,232,
+ 44,101, 13, 49,239, 62, 26,118, 52,123,172,156,197,229,221, 91,221,242, 65, 86,204,172,237,239, 90, 58,148,243,186,168,175,135,
+228,251,151,197, 29,198, 41,187, 56,131,123,119,248,219, 53, 95, 67, 75, 52,180,121,131,202, 63,135,117, 26, 47, 86, 8, 83,219,
+ 12,129,125, 31,123,223,242,148,183,253,239,243,241, 72, 52,172,135,137,132, 10,216, 13,206, 41,225, 79,222,227,162, 79,143,115,
+135, 64,237,187,202,122,239,185,169,110,215, 19,198,158,191, 67,137, 24,206,203,208, 24,237, 98,203, 15,191, 50,252, 86,153,223,
+124, 1,105,154,234,152,125,123, 45,154,199, 73,125,122,194,254, 75,131,125,104,114, 64,153,153, 21, 37, 20,232,107,206,220,179,
+239,120,245,252,224, 52,179, 87,146,251,255, 5, 5, 25,118,136, 86,164,160,133, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/thumb.png.c b/source/blender/editors/datafiles/thumb.png.c
new file mode 100644
index 00000000000..132ee0788fa
--- /dev/null
+++ b/source/blender/editors/datafiles/thumb.png.c
@@ -0,0 +1,291 @@
+/* DataToC output of file <thumb_png> */
+
+int datatoc_thumb_png_size= 9098;
+char datatoc_thumb_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0,
+ 0, 13, 73, 72, 68, 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0, 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0,
+ 0,177,143, 11,252, 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,
+115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7, 19, 0, 34, 14,207,247,218,
+175, 0, 0, 32, 0, 73, 68, 65, 84,120,218,237,124,123,208, 93, 87,117,223, 90,107,239,115,206,189,223,251, 37,125,210,103, 75,
+223,167,151,223, 22, 66,182,121,197, 22,114, 18, 8, 49,133, 16, 48, 73, 27,167, 6,146, 97, 74, 27, 90, 72, 39,227,166,195, 36,
+105, 59,147,153, 38, 77, 66,167,147, 87, 73,219, 60, 11,100,218, 48,147, 54,208,192,132,242, 10, 73, 1, 27,131,177,141, 9,150,
+173,135, 45,217,178,164,239,253,221,123,206,222,107,173,254,177,247, 62,231,220, 79,178,229, 39, 54, 25,238, 92, 93,157,239,222,
+115,207, 93,103,237,245, 94,191,181,241,208,161, 67,112,209,199,211, 57,137,234,163,183,188, 54,158,125,199,167,206,109, 58,201,
+214, 71,119,252,232,225, 27,119, 79,220,127,252,212,175,190,126,106,211, 73,102,126,126,254,216,177, 99,255,233,125,239,190,230,
+229,135,119,205,239, 91, 63,119, 98,231,204,196,125,143,156,102,150,230, 74, 34,242,141, 63,253,136,205,187, 72, 6,200,188,230,
+134,155, 58,249,151, 10,107, 86,251,213, 31,126,230,206,134,166,172, 51,204,190,220, 88, 62,221, 95, 61,195,174,191,111,110,235,
+203,247,238,156, 25, 29,122,231,205,215,183, 9, 87, 21, 81, 97,118,125,223, 95,101,225,137,225,238,229, 59,182,111,155, 28,189,
+253,240,117,145,112,246, 78,216,137,175,216, 87,204, 37,139, 42, 64,102,104,235,196, 24,179,190,253, 53,215, 18, 0,112,213,231,
+170,199,174, 39,213, 58, 59,199, 34,158, 89, 84, 17, 49,207,237, 80,145, 91, 0,240,229,154,239,175,187,222,138,235,175, 86,222,
+ 85,206, 59,207,222,179,103, 97, 17, 66,180, 0,224, 54,150, 93,185,230, 54,150,250, 85, 85, 58, 46, 61, 59,207, 21,179,243,222,
+179, 48, 11, 62,173,181,123,102,143,159, 56,116, 29, 0, 28,252,145,119, 63,213, 73,247,254,233,135,255,249, 45,223, 55, 57, 58,
+116,253, 91,255,233,230,181, 11,255,221,247,103,255,211,218,124,223,182,201, 17,170,134,151, 30,254,218,195, 39, 7, 78,186,231,
+163,255,253,189,255,240, 39,108, 94,168, 10, 32,206,118,252,218, 70,127,207,236,212,221,173,243,204,251,223,241,211, 34,236,250,
+107,229,250,146,219, 88, 1,245,163, 29,131,128,187,182, 76, 92, 54,183,229,222,227,143, 1, 0, 33, 0,128,138,176,248,202, 85,
+235,190, 90,207, 50,123,201,204,196,158,185, 45,147, 35,221,183,189,234, 26, 0,176,204, 78,188, 19,239,132,157,250, 74, 88,132,
+133,136,198,135,135,182, 77,248,202,249,195, 87, 45,144, 84,125,113,125,118, 61,174,214,125,181,225,153,153, 89, 68, 0, 52,179,
+102,164, 91, 76,142, 14, 91, 87,174,251,106,195,247, 87, 93,111,197,185,190, 99,174,152, 43,207,206,179,103, 81, 85, 66,180,213,
+198,178, 47,215, 93,127,165,236,175,151,206,151,206, 87,142, 43,239,157,103,207,236, 88, 68, 4,158,175,181,163,231,107,229,237,
+249,111,253,245,111,124,224,129,135, 31,252,234,183,143,247, 42,255,251,255,247, 43, 0,240,179,255,235,145,172,232,254,234, 15,
+ 77, 63,197,133,240,208,161, 67,159,255,252,231, 27, 10, 9,239,250,111,191, 75, 54,247,190,252,204,231, 62,126,234,236,202,242,
+ 70,175,114,252, 71,159,187,235,169, 41,194, 67,135, 14,189,251,198, 3,151,239,218, 87, 12, 79, 20,195, 19,182,232, 34, 0,187,
+178,234,175,185,222,234,210,169, 7,238, 61,242,208,233,197,149, 39, 86,215,202,202,123,129, 63,254,236,157, 23,188,144,217,177,
+ 99,199,123,222,126, 91,222, 29, 37,178,202,206,149,235,174,191,238,202,117,118,125,241, 21,153,108,203,248,240,150,209,206,104,
+167, 83,100, 86, 85,175,217,185,109,255,252,246,110,167,120,228,204,210,102, 30, 25, 91,136,120,118,149,170,138,175,216, 85,194,
+ 21, 87, 61,239,122, 82,245,184,234, 21,153,221, 62, 53, 54, 54,212,217, 54, 53,126,102,101,237,236,202, 90,145,217,203,183, 79,
+247,171,234,163, 95,188,167,185,144,136, 87,246, 32,172,236, 85, 88,197, 43, 59, 97,167,236,153, 43,246,142, 69, 68,213, 26, 26,
+ 42,242, 45,227,163,195,157, 98,121,109, 99,181,215, 95, 90,239,223,118,211,203,151,214,215, 63,254,213,191,179, 0, 32,174, 20,
+246,194, 94,124, 37,190, 98, 95,138,235,179, 43,197,245,196,245, 88,132, 89,194,181, 68, 21, 1, 44,209, 80,167, 64, 68, 36, 50,
+132, 0,122,203,193,203, 44, 0,248,170,167,222,177, 56,113, 78,124,233, 93, 95, 92,223,187, 30,187,158,247,226,216,123, 22,239,
+213,113,176, 85,220,190,168, 33,202,179,172,155, 7,251,214, 95,101,231, 84, 28,251,138, 93,159, 93,159, 93, 47,104,148, 19,246,
+ 94, 60,139,243,222,177,120,230,202,115,229,217, 51,123,150, 96, 0, 85, 69, 85, 45, 0,150,107,231, 84, 28,187, 74,124,201, 92,
+121,207,172,226,189,120, 17,207,226, 37,126,199,121, 31,108, 99,229,125,229,124,208, 53,231,217,177,248, 23,198, 78, 62,135,199,
+206,157, 59,159, 55,165,189,200,133,206,183,207,207,224,241,239,223,241,166,177,225,161,198, 97,127,234,220, 91,255,221,135, 47,
+122,107, 23,120,247,129, 63,255,243,127,253,182, 31,120,247,235, 94,217, 92,235,147,103,207,143, 13, 54, 93, 8, 55,189,245,187,
+ 63,243, 99,215,237,127,213,226,217,147,159,187,251,107,167,151, 86, 43,231,255,240,179,119,141,204,108, 95, 59,115,234,153, 49,
+251,218,189,151, 23,163,211, 91,119, 92,113,205,252,220, 37, 83,227, 67, 69,254,174,239,191, 94,215, 23, 47,202, 16, 83, 31,109,
+155,154,248,194,127,254,173,209,173,187,178, 98, 24,201, 76, 77,109,115,235,167, 89,196,121,190,108,110,230,192,194,220,215,142,
+158,124,178,171,140,143,143,227,158,185,217, 15,255,226,191,178,221,209, 98,120,162, 24, 26, 67,147,169, 56,223,223,112,253,213,
+114,109,241,129,251,191,252,200,153,165,211,203,171,171, 27,125,207,252,145, 47,222, 83, 86,238,130,183,102, 62,255,123, 31,178,
+157, 17,155,119,137, 44,128, 40,179, 48,107,136, 83,216,141, 14,117,165,234, 17, 33,139, 56,230,171,119,108,187,102,199,236, 61,
+199, 30, 59,159, 34,155, 15,141, 50,179, 10,131,178,175,156,170, 42,179,138, 99,239, 68, 4,209, 92,186,101,138, 16, 50, 99,140,
+161,165,213, 13, 4,184,253,240,193, 63,250,236, 87, 55, 11, 36,153,220,144, 69, 50, 0,168,194,236, 74,239,122,174,220,240,253,
+ 53,174,122,194, 14,128, 38,199,134,167,199,134,119,206, 76,206,140,143,116,139,204, 16,221,126,248, 32,209,192, 66, 17, 34, 42,
+ 34, 34, 2,168,170,130, 42, 4, 35,199, 21,187,158,184,158,136, 35,192,225, 78, 49, 50,212,153,155,158,152, 26, 29, 30,237,118,
+ 12,209,109, 55, 29,184,114,225,210, 1,155,141,170,170, 10,160,160,170, 42,162,170,194,233,233, 89, 85, 84, 9,177,176, 86, 10,
+217, 58, 62,138,136,134,104,105,125,227,229, 59,102,148,253, 3, 39, 30, 3, 0, 27, 66, 68, 21, 9,102, 15,210, 83, 85, 84, 88,
+ 69, 18,169,128, 8,134,168,200,179,241,225,110,248,225,179, 43,235,215,238,216,114,122,121, 21, 0, 72,153, 85, 88,162,205,103,
+ 21, 22,246, 42,193, 11,176, 4, 19,152, 30, 33,202,201,141, 25, 42,242,161,162, 24, 27,234,100,198,188,102,239, 14, 17,177, 34,
+ 78,197,131,120, 21, 22,241,194, 78,197,135,181, 23,169,194,157,166, 39, 40,168, 2, 0,130, 49,100,141,201,243,172,155,231,165,
+243,123,183, 77, 91, 97,175,236,133,157,120,167,236,148,157,248, 74,188, 83,174,212, 59, 81, 21, 17, 81, 16, 81,137,156, 84, 80,
+ 0, 5, 34, 48,136,214, 80,102,140, 81,178,234, 43, 97,207, 62,196, 89, 21,251, 74,184, 18, 46,217,149, 44,193,188,107,112, 28,
+ 34,225, 86, 85, 90,119,138, 8, 68, 72,136,150,189, 99,239,132, 43,102,167,174, 20, 95,138, 47,217,245, 89, 60,199,111, 50,139,
+178,138,168,134,171,132,117, 12,175, 26, 34, 8, 0, 43,174, 47,222,137, 56,113,129,156, 62,187, 30,251,138, 69,131,183, 9,212,
+ 48,107, 60,144,244, 86, 32, 44,188, 2, 90,239,251,236,157,122,199, 92,137, 47,185,234,121, 95,177,136, 99,241,202,204,226, 69,
+ 19,105,245, 83, 89, 85, 68, 89, 34,141, 0,106,185,236, 49, 59,241,149,114,197,174,244,236, 35,107, 88,194, 85, 68,194,181,152,
+ 85, 61,107,112,223,137, 88,102,141,164,193, 75,202,175,237,216,177,131,224,165,244, 64,196,151, 22, 65,207, 67,180, 62, 61,127,
+249, 29,159, 60,123,203,207,253,230, 11, 24,245,159,255,248,210,135, 62,120,250,209, 7,191,116,255,183, 22,215, 54, 42,207,255,
+251,206,111, 62,182,184, 18, 62, 58,123,236, 91,191,250, 67,211,239,250,221, 47,220,241,201,179,128, 8, 0,223,254,155, 79,124,
+226,215,126,166, 92, 91,126,161, 8,250,129, 3,151,151,139,143,204,239,187,110,246,146,125,127,251,229,207, 61,190,184,242,182,
+ 87, 94, 93, 49, 51,203,201,197,181,191,188,251, 1, 0,248,253,247,220, 84,215, 31, 62,253,219, 63,255,172,169,185, 64, 58,115,
+254,227,147,255,246,159, 77,206,238,182, 89,129, 38,163,188,123,228, 27,159, 63,114,234,244,202, 70,127,117,163,223,171,156,103,
+102,209, 39,214,250, 31,255,202,189,207, 75,240, 24,203, 35, 79,118,198,103,126,253, 23,167,182,239, 45, 70,167,243,238,168,201,
+ 58, 0, 48, 57,115,233,165,219,182, 83,181, 98,141, 41, 50,107, 13,129, 66, 55, 55, 47, 91,152, 59,176,176,125,108,120,232,216,
+ 19,139,207,154,160,241,241,241,129, 37,123,253,193,171,127,246,237,111,154,156,216,146, 15,143,231, 67, 19, 89, 49, 68, 54,195,
+224,122,153, 85,188,120,199, 84,117,136,174,216,127,227,206,197, 71,143, 30,127,232,220,234,198, 90,191,191,209,175,214,250, 85,
+191,114,251,182, 77,237,153,157, 84,128, 71, 22,215,255,234,238,111, 62, 27, 25, 18,145,175,254,193,135, 0, 17,208,144, 49,104,
+172,161, 12,109, 70,198,134, 74, 79, 16, 85, 0,128,232, 40, 16,144,136,108,119,108,118,223,190,145,245,197,147, 39,207,156, 89,
+237,245,215,122,213, 90,175,191, 94, 86,189,178,170, 60,239,156, 26,121,215,205,215, 43,232, 87, 30, 58,117,223,177,147,207, 76,
+168,139,177,105, 21, 13, 63,136,170,138,168,226, 69, 69, 33,185, 42,133,232,109, 36,133, 4, 42, 0,128,100,186,163, 51,243,121,
+103, 99,125,249,204,202,218,122,191,187, 81,150,107,189,114,173, 95,246, 74, 87, 58,231, 69, 95,177,231,146, 27,118,207,177,240,
+103,238, 59,246,200,153,115, 79,139,160, 44,239, 42,139,132, 16, 6, 20,133, 85, 85,196, 67,140,110, 84, 36, 4,132, 42,202, 32,
+ 82,147, 21, 41, 67,211,233,116,103,137, 54,202,106,173,215, 31,237,118,123,149, 91,235,245, 87,123,253, 94,233,250,206, 57,207,
+ 68,248,131,251,119, 11, 47, 56,209,143,124,225,238,139, 16, 68,100, 4,128, 4, 68, 17,149, 21, 9,148, 81, 65, 84, 33, 36,176,
+194, 34, 30, 84, 98,184, 34, 62,228,208,194, 94,197, 9, 87,202, 12, 8, 69,102,137,186,121,230, 58,185, 29, 46,178,241,225,238,
+106,175,191,214, 43,123, 85, 85, 86,190,116,222, 3, 18,233,237,135, 15, 58,207,159,190,239,232,233,197,229,167,178, 67, 10,128,
+ 16, 34, 80,141,111,196, 35, 85, 21, 76,124, 10,175,202, 78,216, 43, 59,241,165,176,171,227, 37, 4,200,173, 69, 4, 66, 52,214,
+228,214, 14,119,138,245, 94,185, 94, 86,125, 87, 85, 21,247,157, 43, 29, 83, 70,175,223,191,187,114,124,228,137,149,187,190,125,
+116, 51, 65, 33,122, 5, 17, 5, 5, 16, 80,137, 33, 30,196, 56, 52, 44, 86, 19,244,133,248, 72, 66, 88,212, 4, 51, 77,188, 5,
+104, 13, 1, 0, 90, 69,204, 66,208,218, 43,109, 47,243, 69,101, 43,207,165,243, 27,101,137, 25,238,219, 58,190, 99,226,202,187,
+ 30,126,236,196,153,197, 54, 65,241,199, 64,235, 98,128,168, 48,212,252, 16, 6,145, 16,228,130,112, 56, 80, 77, 5,143, 68,166,
+170, 42,130,106,237,185, 17, 17, 9,193, 18,169, 53, 8,133, 49, 38, 51, 84, 57,206,172,201, 44,245, 74,167,160, 67, 88,220,176,
+123,251,229,115, 83,159,255,230,177, 80, 48, 0,101, 14, 34, 12, 73,143, 66,121, 48,253,188,151, 80,111,209, 40, 64, 49,234, 14,
+225,183,138, 40, 72,124,141,153, 66,136,125, 35,187, 32, 36, 37, 64, 8,153, 33,200, 44, 32, 2, 6,122,137, 16, 55,170, 42,215,
+108, 68,225,230,171,118,173,155, 78, 32,200, 69, 30,132, 24, 90, 25, 36, 44, 10,171,120,169, 67,127,102, 17,151,194,240, 42, 70,
+242, 18,126, 59,174, 51, 11, 72,204, 94,162, 88, 53, 97, 51, 98, 32, 35, 4,227, 44, 98, 13,102,214, 20,154,105,186, 25, 71,198,
+ 2, 64,248, 61,145, 32, 61, 41,126, 22, 86,150,200,143,112, 66,208, 47,246,202,149,176,139, 57, 79,124, 13, 95,144,200,158,250,
+153, 36, 64, 91,111,214, 4, 18, 32, 17, 26, 66, 99,200, 10,177, 33,131,100, 1, 64,124, 21, 66,121, 80, 85,101, 97, 6, 21,142,
+153, 81,204,108,148, 93, 84,120,239, 84,189,136,176,138, 10,164,100, 9, 88, 53,150,163, 0, 36,165, 21,225,206, 68,129,165,201,
+168, 18,173,218, 44,106, 35,117,177,206, 95,178, 68, 41,142,119, 37, 12,226, 67,194, 38,204, 42, 73,201,195, 10, 54,130,162,162,
+194,113,213,218,127, 70,237, 96, 17, 73, 41, 65,164, 50,100, 46,146,210,210,148,234, 38, 3,131, 22, 0,216,149, 34, 94,155,172,
+ 85, 84,147, 44, 7, 3, 24, 8,138, 43, 18, 50,181,102,117, 56, 81,195, 41,137, 11,233, 13,135,196, 41, 81,230, 89, 99,250, 35,
+ 42,172,137,110,173,179, 81, 81, 5, 84, 11,128, 92,245,162,122, 71, 27, 19,114,149, 64,147,211,120,145,182, 6,133,188, 89, 5,
+106,202,164,254,136,181,197,161, 84,170, 12, 36,250,118, 50,165,202,170,161, 64, 24,188,129,168, 42,168, 69,132, 79,221,115,159,
+138, 2, 72,210,138,152,160, 71,126, 66,253,218,252, 89,191,132,111,136,106,180,232,154, 28,113,252, 62, 4,238,197, 36, 90, 55,
+173, 32,176, 24, 22,100, 37, 70,203, 70, 60,218,151, 88,189, 49,228,102, 47, 29, 98, 14, 29, 58, 68,136,248,247, 42, 47,251, 30,
+ 65,223, 93, 4,189,241,142,223, 25,223, 54,255,252, 23,246,159,203,215,127,238, 19,143,223,241,169,115,157,145,137,231, 77,203,
+ 46,158,219, 2,252,201, 29,239,126,255,155, 15,223,120,245,222,243, 63,253,181, 91,102, 1,224, 95,124,236,161,247,125,236,225,
+ 75,175,121,245,119, 98,201,182, 77, 77, 92,247,234, 91, 22,182,140, 95,191,123,251,123, 94,255,170,155,175,221,183,233,132,223,
+120,211, 28, 0, 20, 35,227, 63,241,235,127,113,199,167,206, 45, 28, 60,252, 92, 8, 50,227,227,227,203,203, 79, 85, 27,248,229,
+127,252,198,157, 59,118,143, 22,102,105,101,177,172,252, 88, 55, 63,176,107, 46,207,139, 71,207,198,198,160,176, 63,122,215,103,
+246,191,225, 39, 67, 74,105,178,226, 91, 95,248,243,103, 71,205,252,252,252,197, 9,122,223,155, 94,155,219,108,250,210, 43,253,
+242,163, 27,101, 37,162, 94,100,203,104,247,218,249,237, 15, 61,190, 88,121, 15, 0,171, 79, 60,154,117,134, 46,185,234, 21, 75,
+143, 29,251,240,191,188,229, 89,179,103,126,126,254, 34, 75, 54, 58,212, 45,242, 66,216,151,235,231, 46,123,217,225,185,233,137,
+137,209,161,177,110, 55,179, 38,179,230,214, 87, 95,115,248,154, 40, 88,159,253,189, 95, 90, 58,117,244, 67,239, 56,248,194,202,
+208,117,123, 46,237, 12, 79,100,157, 17,241, 37,128, 94,125,213,117, 91,198, 71,198,135, 59,227, 67,221, 78,102, 13,209,238,217,
+201,119,220,124, 93,145,103, 0,240,161,119, 94,247,220,133,250, 34, 75,246, 31,126,234, 45,211, 91,231,179,238,152,201, 58, 42,
+146,229, 67,163, 5,173,174,175, 40, 40, 33, 73, 10, 60,174,217,177,117,199,214,153,191,123,244,244,115,164,230, 34, 50,116,245,
+194,165,239,120,243,143, 22,195,147,182,232, 26,155, 35, 89, 0,205,187,163, 93,168, 54,250, 61, 5, 32, 66, 80, 16, 21, 64,236,
+102,102,255,194,220,177, 51,203,253, 11,181,159,158, 62, 65, 23, 40,233, 13, 21,249,117,151,239,249,229,127,242, 83, 19,211,151,
+218,162, 64, 32, 34, 84, 85, 36, 6, 4, 5,157,154,219,183,203,149,199, 30, 59, 77,136,132,104,136,214,203,210, 3,160,232, 91,
+110,184,242,232,185,213,207,126,253, 91,207, 79,209,243, 55,223,123,251,254,189,251,186,163, 83, 89,119,172, 24, 26, 55,121, 97,
+208, 40,136,170, 40,179, 0, 16, 89, 69, 54,182,152,153,187,140,197,227,153, 69, 10, 68, 17,246,250,101,201, 2,204, 11, 83, 35,
+183,191,246,186,143,124,241,235,206,251,103, 67,144,103,121,239, 91,222,112,219,235, 14,155,188, 75, 38, 55, 89, 97,243,142,201,
+187,100, 45, 34, 1, 33,128, 69,101, 80, 5, 33, 64, 68, 34, 32, 34, 91, 76,207,238, 18, 17, 12, 76, 66, 52,136, 88, 86, 21,128,
+ 23, 65,212,219, 14,189,236, 91, 39,207,253,237, 3, 15, 63, 99,161,254,192, 79,223,126,235,205,135,109, 62,108,242,174,205, 58,
+ 38, 43,208,228,100, 44, 2,214,181, 42, 72,205, 48, 80, 9, 9, 36,168, 0, 64,158,101,192, 37,171,214, 89,105,138,187, 1, 20,
+167, 71, 59,251, 23,230,238, 59,113, 90, 82,186,255,180,100,136,108,110,139, 33, 0, 4,164,144,111, 67, 40,229, 9,160, 10, 74,
+ 11,197,197,172, 34, 16,250,125,160,136,104,178,206,212,196,180,170, 18,128, 33, 36, 66, 66, 48,132,253,202, 59, 96, 86, 52, 10,
+183,221,116,224, 75, 71, 78, 62,112,226,212,211, 93, 50, 50, 25,217, 78, 44, 32, 42, 32, 40,128, 42, 51,160, 72,200, 41, 99, 59,
+ 48,100,109, 34,236,235, 20, 15, 0, 77, 86, 76,140,142, 40, 0, 34, 25, 34, 67, 68,225,190, 42,168, 60, 48, 9, 10,190,114,207,
+220,158,173, 19, 31,191,235,155, 79,143, 32, 50,198,102,161, 8, 4, 80,103, 52,162, 45,238, 55, 89, 81,200,254, 82, 18, 7,170,
+138, 68, 54, 31,235, 22,170, 26,150,205, 24, 36, 12, 84,185,202, 51,131,168,194,204,232,208,109, 55, 29,248,216,151,239,239,149,
+213, 69, 8, 66, 34, 34,163, 64,161,250,161,164,164, 34, 26,179, 44, 85,142,237, 83, 17, 17, 78, 7,177, 9, 26, 42,107, 8,100,
+140, 25, 46,114, 85, 13, 50, 30, 95, 16, 13,249,126,229, 60, 51, 17, 90, 52,111,123,229,213, 95,248,246,163,199, 78,157,126,106,
+181, 71, 64, 2, 21, 64, 2, 85, 66, 80,197,192, 22, 4, 81, 21, 8,201, 93,200, 54,153, 65, 88, 52,148,102, 66,205,132, 85, 69,
+ 1, 12, 81, 39,207, 68, 21, 66, 61,143, 48, 20,246, 16,161, 95,161,243, 76, 8, 64,116,211,190, 75,246,110,155,249,244,221,247,
+ 63,185, 47,139,250,129,161,254, 16, 58,212,177,234, 24,215,176,110, 48,135, 18, 91,232,128,199,254, 62,136,135, 96, 20, 16, 12,
+ 81,110,109, 97,109,145,219,161, 34,159, 24,238, 14,119,138,110,145, 15, 21,121,145,153, 64,156, 53,180,125,180,120,243,171,247,
+ 63,133,115, 85, 8,109,119,128,230, 25, 84, 9,131, 60, 65,170, 80,164, 66, 79, 40, 23, 71,202,124, 44, 84,168, 2,128, 33,204,
+ 66,175,217,154, 78,158,141, 15,119,134,139,162,147,219,110,145,119, 66, 31, 2,192, 16,141,101,230,214,215,236,127,114,111, 31,
+126,114, 48, 97,212,196,161,244, 47,200,184,164,228,159, 85, 20,148, 67, 1,180,174,244, 0, 0, 17,217,134,166,124,164, 91, 12,
+ 21,121, 39,203, 58, 69,222,201, 50,107, 12, 32, 18, 81, 70,248, 35,175,184,234, 66, 4,213,235, 83, 23, 84,131,213,139, 69, 27,
+ 85, 84, 76, 53, 28,141, 26, 23,126, 95, 52,125, 15, 0, 20, 49,149, 96, 33,250, 56, 99,172,161, 34,179, 97,225, 58,153,237, 20,
+121,183,200,114, 67, 0,106,173,233,100,246, 31, 92,127,229, 5, 56,132,218,148,117, 49,150, 48,106, 3, 8, 88, 87, 65, 34, 4,
+ 64, 1, 20, 21,180,117,142,170,130,132,187, 64, 13,229, 58,162,128,234,178,100,114,107,187, 69, 86,228,182,176,166,147,101,157,
+ 60, 43,178, 76, 21,172, 49, 29,107,222,112,224,178,205, 50,164,170,168,128,162, 0, 18,126, 47,217,201,186,192, 34, 45, 25, 10,
+ 28,148, 26,155,161,173,206, 76,253, 63,166, 50,103,168, 34,102,214, 22, 54,203, 51,155, 89,211,201,179,194,218,142, 53, 8,144,
+103,182,147,219,239,191,102,119, 67, 80, 42,244,132, 31, 14,213,243,184,110,113,117, 98, 37, 41,214, 90, 33, 86,174, 2,123, 2,
+161, 65,201,146,177, 79, 56,143, 84, 56, 4, 34, 50,132,153, 53,185, 53,185,181,214, 80,167,176,121,102, 51, 99, 16,160,176,182,
+155,103, 55,236,221,209, 42,156,139, 52,186, 19,129, 1, 18,127, 50, 21,175, 98,141, 86, 21, 52, 52, 98,234,210,101, 52,231,146,
+234,171,155, 89, 6, 0,160,132, 72, 68,134,200, 26,101, 49,170, 80,100, 89, 93, 74, 43,172,153, 28, 46,118,205, 78, 5,161, 78,
+197,218, 96, 6, 65, 84, 56,150,228, 85, 68, 20,161,109,138, 88,146, 9, 0,101, 85,129, 36,234,181,216,183,244,161, 41,176, 2,
+ 0,130, 18, 33, 17, 26, 67,245, 58,102,153, 13,180,102,198,204,207,140, 69, 45, 11, 77,133, 88,103,147,228, 40, 66,119,161,230,
+ 7, 8,136,128, 50, 36,240, 71,170, 59, 38,180, 75,162, 40, 22, 6,163,129,213, 1,148, 0,196,224, 41, 82, 70,100,137,172, 49,
+198,144, 53,148,147, 85, 0, 27,251, 2, 53,234, 39,149, 62,211,129,196,130,100, 42,170,198, 26,109,160,181,105,185, 68, 14, 53,
+118,160, 6,211, 12, 6, 67, 33,112, 34, 64,130, 16,171, 80, 8,130,173, 49,198,112,224, 80,114,230, 3,109,151,200, 33, 77, 61,
+ 6,168, 91, 31,161, 86,220,212,193,227, 2, 73,124,213,218, 60, 52,210, 84,115,178, 49,180, 65, 9, 9, 17,130, 79, 33,138, 13,
+ 36, 27, 76, 72,236, 56, 5, 34, 84, 84, 67, 47, 38,112,194,167,242, 57,215,181,253, 32, 76, 81,238, 84, 3, 70,166,221,220, 72,
+ 13,144, 16, 56, 68, 35, 6,181, 57,133, 16,120, 69,219, 64,105, 53, 19, 92, 75,124,210,112, 78, 77, 76, 81,142,112,161, 72, 74,
+116,248,109,106, 6, 30, 18, 73,169,123,103,129, 86,128,218,180, 71, 14, 97,160, 47,152,121,108,140, 86,248, 7, 54,208, 17, 20,
+ 93,153, 67,163, 66, 57,182,195,132,155,190, 88,130,131, 57, 17,142,191, 23,144,232,173,198, 69, 98, 82, 34, 47, 26, 46, 24,160,
+189, 17, 51,168, 59, 88,233, 37, 44, 89,146, 27, 8, 87,102, 31,242,158, 36, 46, 9,162,166,177,105, 20,106,236,161,207, 18,241,
+101,181,109,141,138, 6,233, 83,221, 36,106, 45, 58, 20, 90, 14,161,182, 92, 86, 85, 98, 35,161,150,161, 22, 78, 47, 50, 41,244,
+ 24,184,238,188, 72,224, 64,221, 78, 24, 92,187,218,247, 54,212,200, 96, 4,147,208,108,218, 16,147,200,179,161,215, 28,237, 97,
+144,232,212, 5, 7, 21, 73, 93, 41,229,176, 82, 81,128, 7,251, 95,160,109,219,170,173, 14, 69, 3,168,139,212, 67,171,125,150,
+ 16,139,208, 54,237, 54,234, 84, 92, 35, 81,136, 82, 12,202,161,121,168,226,106, 61,111,186,113,210,178, 63,209,221, 36,106, 0,
+ 3, 35,147, 83,132,205,178, 95,103, 49,186, 73,190, 2, 65,177,123, 26,205,157,138,168,250,212, 11,247, 17,142, 40,172, 9,164,
+ 87, 31,164,227,216,104,225,122,237, 68,107, 73,111,119,236,218, 43, 42, 77,250,217,102,149, 38, 25,242, 46,217,235,160, 95, 97,
+201, 92,221, 53,107, 4,165,213, 24,108,173, 29,180,126, 58,182, 96,155, 94,103,125, 90, 10, 24,154, 11, 52, 81, 31, 52, 28, 2,
+ 17, 85,151, 90,190,131,173, 59,241, 50,176,228,161,245, 12, 44,237,251,134,214, 57, 65,185, 80, 6,160,157,205, 71,210, 58,185,
+181,112, 3,107,102, 31,124,252,140, 10, 43, 72,242, 33,245, 57, 2,122,129, 78, 89, 18, 89,208,193,150, 89, 91,158,234,119,218,
+242,219,234,240, 73,232, 37,138, 16,139,245, 74,130,134, 77,230,129, 35,194,106,113,113,113,105,105,233,165,214, 22,122,113, 31,
+170, 58, 49, 49, 49, 57, 57,105, 1, 96,121,121,249,196,137, 19,223, 99,202,249, 32,207,201,201, 73,250, 30, 35,190,203,186,119,
+223, 99,208,247, 24,244,244, 30, 35, 83,179, 1,184,244, 18,127,188,104, 36,174,157,123,188, 59, 62,125,219, 7,255,143,205,138,
+135,238,252,244,255,251,232, 7, 87, 30, 63,241,247,153, 65,134,104,118,114, 44,183,118,189,172,150,214, 54,158, 78,203,165,183,
+124,246,191,252,212, 43,246,190,250,135,223,250,111,254,228,192, 27,223, 25,222,188,243, 99,191,115,223, 95,253,233,227, 71,190,
+ 1, 79,187, 19,241,194,250,178, 67,135, 14, 29, 61,122,244,248,241,227,207,229, 42, 69,150,253,197,127,252,181, 49, 43,247,220,
+243, 55,143,156, 89, 94,235,245, 43,207, 94,228,161,211,203,159,187,247,219, 23,109,229, 33,210,155, 63,240, 95, 47,191,233,205,
+ 49, 73, 84, 13, 7,167, 30,184,235, 47, 63,248,190, 39, 30,190,255, 69, 97,205,206,157, 59, 23, 22, 22,158, 31, 6,253,248,107,
+175,127,255,173,111,153,220,249,178,213, 51,199,255,238,254,191, 61,121,118,121,113,109, 99,189, 95, 57,239,189,136, 42, 84,158,
+ 31, 91, 94,251,242,183, 79, 44,174,174, 63,217, 69,134, 39,183,220,254, 91,159, 25,157,153,107,135,107,129, 83, 42,252,177, 95,
+250,201, 35, 95,250,228,119,158, 65,102,126,126,126,105,105,233,169, 17, 4, 79,253,152, 30, 27,249,133, 31,123, 93, 70,136,160,
+ 67,227,219,102,182,238,200,120, 13,148, 13, 34, 17, 17, 66, 24,114, 31, 31, 42,174,152,219,242,242,221,115,123,183,111,233, 85,
+110,105,189,183,233, 58,174,191,113,231,159,253,118,185,190,178,235,250, 31,168, 89, 3,136,199,191,254,215, 31,122,199,193,197,
+ 71,143,124,135, 37,104,124,124,124, 98, 98,226,121, 96,208,207,223,250,131,123,182, 77,231,121, 7, 0, 84,188,205,187, 83,219,
+247,140,229,164,126, 29, 0,195,108,157, 33, 76,209, 41,230,214, 44,108,157,124,217,174,185,107,119,110, 91, 43,221,242,122,175,
+109,108, 78,126,243,206, 47,254,241,175,204, 93,121,195,228, 37,187,153,221,199,126,225, 31,125,225, 15,126,249, 69, 81,177,192,
+160,231,106,164, 23,102,167, 47,191,100, 75,222, 25,177,157, 81, 50, 57,251, 10,122, 75,134,135, 39,102,247, 92, 53, 54,115,242,
+232,189,167,206,156, 93,222,232,247,171,170,244,190,172,194,180,118, 68,238, 18,226,107,175, 90, 56,116,229,124,207,249,111, 28,
+ 63,125,255,241,166, 23,251, 63, 62,240,246,209,153,185,213, 51, 39, 95,116, 35,253,156, 36, 8, 17,111,125,205,129,215, 92,181,
+175, 51, 50,147,117, 70,109,103,200,216, 2,201,134, 82,128,201, 58, 99, 83,219,199,135,187, 86,251, 1,138, 97,141,201,172, 13,
+ 67,183, 88,215,133, 1, 51,107, 46,153, 26, 61,176,176,253,138, 29,219,156,232,217,149,117, 0,168, 54, 86, 95, 92,214, 60, 15,
+ 42,118,235,247,189,252, 61,111,126, 93, 62,178, 37,239, 78,216, 98,200,100, 29,147, 21,148, 21,198,100, 72, 70, 65, 17, 32,239,
+142,142, 79,108, 29,201,128,148,195,160,109,104,232,101,214, 24, 34,131, 4,161,125,137,136,136,150,112,199,244,248,129,133,237,
+215,204,111, 95,238, 87,171,189,254,139,232,235,159,189,138,229,121,254,227,223,127,227, 59,111,249,225,169,137, 73, 52,153, 33,
+139,241,102, 41,180, 87, 66, 37, 8, 67, 11, 64, 56,203,113,106,110,223,240,196,236,242,153,227,167,207, 45,174,246,250,253,202,
+ 85,206, 23,153,175, 88,156,243,149, 79,251,200,164, 50, 88,102,240,230,171,118, 41,236, 42, 61,223,249,240,169, 7, 31,121,236,
+ 37, 26, 40,110,157, 24,187,110,223,194,238,185,217,253,187, 23,174, 88,152, 31,234,142,216,206,136, 41,134,108,222, 37, 99, 3,
+ 6, 6, 99,133, 89,155, 62, 70, 40,152, 33, 41, 50, 33, 10, 34, 49, 20, 67,227,211,219, 47, 27, 25, 59,183,116,238,212,185,149,
+213,181,126, 85, 86,174,242,190,202,172,243,222,249,172, 12, 59, 73, 48, 51, 99,172,247,169,118, 51,115,227,190, 75,111,220,119,
+233,122,197,119, 63,252,232,131, 39, 79,127,231, 25,212, 8,241,232, 80,119,126,118,230, 71,111,188,254,240,254,171,135,134,134,
+208,228,136,198,100, 5,145, 37,155,135,167,177, 25, 25,139, 20, 32, 25,148,188,113,171, 4, 46,130,200,194,169,227,174,138,164,
+ 0, 22, 21, 76, 6,197,200,204, 76, 49, 60, 50,122,102,121,233,236,242,250,198, 70,233, 74,231,194,158, 54,133,183, 97,251,155,
+202,123,199,204, 28,219, 62,161, 84, 56, 82,152, 27,175,216,121,227,229, 59,215,157,255,220,189, 71,158, 88, 94,211,239,136,250,
+ 89, 81,248,201,215,189,246,245,215, 94,217, 29, 26, 38, 50,136, 9, 52,133, 81,107, 2,232, 6,201,164, 3, 2, 68, 0, 9,173,
+105,136,248,135,129, 94, 97,236,100,214, 3,131, 74, 0, 18, 58,116,100, 12, 64,167, 51,186,197, 22,195, 35,107,231, 86,214, 86,
+194,236,103,218,247, 39,168,155,141, 59,157, 4,129,210,212,211, 82, 85,132,225,204,190,241,224,101, 34,184,230,220,167,191,254,
+224,210,218,250, 11, 44, 65,170,227,227,211,147, 51,115,169, 63,139, 72,209,104, 2, 80, 48, 43, 1,251, 3,128,161,107, 14, 1,
+132,131, 20,206,110, 23, 42, 83,139,163,105,225,135,254, 52, 0, 0,214,163,248, 64,104,173,237,224,200,116,150, 15, 13,119,150,
+ 87, 55, 54,214,251, 85,233, 92, 45, 65, 97,227,150,202,115,229,216, 51, 59,207,126, 96, 12, 31,137,116, 52,183,111,185,225, 74,
+ 5,125, 98,165,247, 55,223, 58,186,180,182,241, 66,217, 32,178,153, 45,186,173, 62,127,148, 2,172, 39,134, 98,208, 47, 32, 40,
+168, 77,103,173,221,101,131, 6,122, 21,186,252,113, 50,173, 6,207, 72,221, 40, 79, 46,158,172,201, 58,157, 33,204,178,124,184,
+179,177,222,175, 54,202,170,116,222,179,117,158, 75,199,206,251, 50,227, 36, 86, 97, 15, 28, 78,173,239,128, 44, 1, 80,216, 58,
+ 54,244, 35, 55, 92, 41,162, 71, 78, 47,125,245,200,137,231,130,226,124, 18, 6, 25,107,108,193, 42,117, 63, 47,128, 90,106, 96,
+ 11,168, 6,173, 18, 12, 51,148,218,150,153,150, 94, 53, 77,135,216,249,175,155,139,145, 71, 13,250,161,169, 72, 25,163, 90, 20,
+136,134, 76, 39,207, 54, 74,215,175,170,202,113,158,177, 99,219,241, 92, 57,174,156,175, 77,184,247, 28,182, 13, 10,173, 54,150,
+ 48,216, 9,134,112,223,236,228,222,217,137,202,241, 61, 39, 6,194,206,231,202, 32, 68, 34,155, 65,108,221, 70, 49,160,180, 27,
+ 73,224, 21, 32, 40, 8,134,110, 50, 40,198, 62,160, 34, 66,221,214,106,183,150,218,179, 76, 0, 65,124,106, 68, 95,187,243, 30,
+182,173, 64, 68,178, 54, 11, 88,158,194,154,210,185,210,121,199,226, 44,119, 50,169,124,220, 51,169,244,222, 57,118, 97, 23, 38,
+207, 94, 24, 17,155,171, 40,168, 98,145,227,245,187,183, 31, 92,216,182,212,171,238, 60,242,232, 99,231,150,158, 59,131, 16,137,
+ 2, 80,146, 0, 20, 4,195,125,163, 82, 61,161,170, 10, 74, 10, 2,160,152, 76, 38, 70, 36, 97, 51,240, 5,173,102, 84,187,177,
+213,192,176,164,198,213,112,195,172, 8,150, 66, 32, 50,160,121,102, 67,216, 93,121,118,236,157, 23,107, 77,193,198,101,153, 99,
+ 95, 58, 95, 86,190,242,236,172,247,108,146,222, 33,167,145,242,176,158,100,116,106,184,248,193,107,118, 9,192, 3,143, 47,125,
+253,193, 99,237,141, 11,159,105, 28,132, 41,232, 71, 5, 69,192,104, 42,194,150,130, 0,113,128,156, 34, 80, 41, 58,239,228,216,
+ 17, 84,133, 35,198, 81, 89,235,182,189, 52, 35,223, 53, 35, 82,211,149, 19,246, 40, 54,116, 65, 2, 60, 50, 0,195,212, 16,170,
+ 53,136,104, 8, 13,137,103,102, 67,214, 72, 46,166,200,178, 42,243,165, 15,123,222,121,207,236,188, 97,149,196, 41,101,145,192,
+ 38, 2, 36,163,170,112,213,236,196,229, 91,198,214,156,124,246,190,135, 87,215,214,158, 57,131, 16, 16, 80,234,144, 47,140, 17,
+215, 27, 7, 5,143,166, 26,118,231, 1, 0, 1, 12, 55,131, 80, 59, 95,168,251,168,208,112, 65, 48,182,119,185, 6,106, 69,172,
+172, 8,212,216,164,122,156,183, 65, 64, 40, 0, 18,134,189, 9, 77, 24, 99,102, 33, 34, 17, 17, 75, 98, 13,230,108, 59,153,143,
+ 91, 3,214, 91,159,137,225,120, 16,182,161,137,234, 27,176, 63,227, 68,111, 60,176,167, 20,253,202,145,147,143, 60,126,230, 89,
+ 68,210,105,249,106,200,107,148,174,184,127, 27, 34, 6, 4, 32,160,168,214,160,131, 6, 15, 80, 71,210, 45,232,210, 32,119,154,
+253,144, 26,172, 68,152, 11,143,211,225,241,103,177,193,244, 37,112,127, 88, 60, 9,225, 6,161, 33, 53, 68,214,218,220, 70, 30,
+ 85, 33, 89,177,196,172,181, 33, 15, 96,182,152,234,169, 34,162, 33,253,190,189,115,229,194,182,111,156, 56,125,228,212, 19, 23,
+ 45,236, 14,164, 26, 24,108, 93,194, 58, 97,130,253,212,228, 70,164,138, 0,212,104,169, 22,158,165,134,145, 0, 68,148, 12, 54,
+188,171,221,153, 70,241,105,176,216, 65,227,218, 60,110,163,193, 52,206,194, 19, 24, 32, 16, 65, 99, 80,132, 65, 16, 13, 49, 26,
+ 68, 99, 40,243,156,123, 19,182,192,243,196,150,136, 85,211, 30,125,234,153,189,136, 2, 16, 2,106, 8,223,240,224,252,236,213,
+151, 76, 31, 59,187,122,207,195,143, 62, 69, 80,110,107, 15, 13, 45, 84, 88, 91,112, 32, 56,120, 80,132,136,236, 68,108,112,185,
+ 3,207, 22,244, 45, 28,203, 0, 86, 66,161,129, 8,213,152,161, 6,242, 5,136, 42, 18,194, 81,109,144, 67, 24,192, 86,225,246,
+ 20, 81, 0,194, 86, 98,168,138, 72,200, 65,202, 40,192,249, 44,147,115,228,140, 48,179, 33,202, 36, 88,113, 10,251,180, 86,158,
+ 5, 52,104, 92,136,242,118,207,140, 93, 58, 49,124,244,220,218,125, 71, 31,125, 10, 9,170,189,187,164,200, 38, 80,154, 16, 90,
+160,160, 34,160, 13, 74,184,193, 34,214,184, 68,109, 97, 82, 19, 52,119, 0, 45,219, 48,171, 57, 51,200, 81, 75, 98,180,165,176,
+ 33, 28,132,182,190,161, 34,164,242,136,106,216,246, 68, 65, 12, 80,192,176, 7,200,168,241,236, 13, 25,102,207, 72,136,214,144,
+103, 49, 68,198, 24,239,185,242,172,170,134,144,130,238, 34,238,158, 25,221, 62,182,247,158,227,167, 79, 47,173, 60,137,138,105,
+216, 45, 3,106, 48, 45, 38,220, 72, 61,182,141, 13,168, 45,222,191, 36, 70,212,160, 93,109, 1,183,130, 42, 66, 27, 99,213,240,
+ 78, 90, 81, 82, 27, 17, 26,192,228, 56,176,155, 71, 99, 35,195,230,109,218,148,111, 65, 65,129,130, 52, 32, 66,144,172,112,200,
+ 1,148, 41,158,132, 89, 8,209, 24, 50,204,129,137, 33,125, 97, 84, 3,212,177,232, 16, 17,240,224,194,214,141,114,234, 43, 71,
+ 78,246,170,106,128, 65, 53,250, 70, 2, 52, 27, 84, 37, 72,181, 64, 90,202,232,235,181,133,165, 14,113,163,138,130,160, 38,102,
+165, 60, 35,150,132,226,236, 64,120,159,161, 5, 44,106, 28, 89,130,202, 2, 70, 9, 78, 40,198, 56,234, 19,205,227,160, 33,104,
+236,102,218, 88, 46,101,143,168, 68, 38, 70,115,128, 28, 49,153, 36, 72, 34, 20,148, 17,125,152,227,112,222,123, 20, 32, 52, 74,
+121, 22, 37,243,213,251, 46,121, 98,173,255,141, 99,167,194, 42,215, 42, 22,240,190, 42,160, 40,141, 99,138,137,133, 10, 4,244,
+123, 11, 99, 94, 79,243,107,130, 94,182,118, 6,104,237,222, 87, 3,153, 85, 65,227,102, 29,113,203,142, 40,142, 81, 91,235,109,
+244, 68, 18,147, 90, 74, 9,208, 88, 51, 29,200, 27, 49, 33, 66, 21,163, 69, 15,222,138, 80, 65,169,117, 86, 52,183,138, 96, 17,
+ 57,110,132,226,189,103, 81, 66, 21,178, 4, 96,128,114,156, 29,165,177, 43,118,174, 98, 23,195,110,209, 16, 49,106,130,245,246,
+ 5, 80, 35, 68,219, 73, 67, 13, 5,100,104, 5,202,173,251,151, 54,143, 6,249,213, 98, 95, 68, 54,135,188, 12, 20, 33,102,102,
+117,200,144, 28,105, 11,121, 13, 45,156, 94, 29, 89,192, 32,108,125, 64,172,162,162, 97,180,237,138, 4, 38,212, 21, 8, 90,187,
+100, 68,102,121, 4, 96, 85, 36, 69, 2,178, 10, 29, 80, 91, 20, 50,168, 98,162, 45,193,105,204,106, 26, 12, 80, 5, 72,254, 56,
+ 97,189,181, 45, 44, 17,197, 27,211,119,142,188,171,177,225, 49, 83,101, 80, 78,199,117,174, 87, 59, 54,136,147, 89,141,183,219,
+132, 15, 31,200,148, 55, 97, 64,181,150, 38, 12,153,126,212,187, 16,106,106, 12, 24, 48,132, 14, 68, 72, 66, 68, 96, 84,213,132,
+178, 30, 54,144, 14, 99,132, 72,146,155,111, 76, 3,194, 0,144, 24, 90,137, 21,180, 3,229,246, 16, 69, 0,186,139,192, 32, 44,
+ 29,234,116,180, 78,226,211, 86, 30, 90, 15,206, 68, 70,196,200, 51, 77,137,161,182,210,230,182,215,108,113,173, 29,150,104, 91,
+146, 90, 5, 96,104, 11, 25, 98,170,206, 32, 80,208, 67, 66, 2, 36, 37, 82, 37, 85,131,170,132, 22, 12, 0, 42, 72, 68,147, 67,
+218,194,172, 53,217,211, 64,139,161, 13,234,173, 13,144,164,215,100,110,195, 6, 40,205,104,135, 72, 51,229,144,152, 37, 3,239,
+ 52,170, 91,163,170, 5,106, 12,124, 27,127,169, 3,210, 4, 13,172, 57, 5, 17,208,150,178,198, 38,212,115, 18,208, 66, 98,107,
+189,177, 81,204,102, 4,227,172, 26, 33, 9, 1,106,152, 19,131, 24, 42, 37, 21,107,240,177,168, 42, 49,217, 75,140, 80, 21, 16,
+ 28,136, 95,194, 71,181,185,141,154,122, 0,245,192, 0, 0, 2,251, 73, 68, 65, 84, 5, 16,124, 86,154,106,104,164, 70, 65,106,
+163,211,108,224, 35,218,216, 23, 77,116,132, 76, 99, 0, 43, 15,144,120, 8,137, 5, 3, 27,192, 36,178, 34,103,164, 29,114, 13,
+236, 25, 3, 77, 20,219, 12, 76,164,153, 57, 4, 2, 32, 68,129,102, 92, 17, 90, 42,198, 17,171, 27, 36,157,107,179, 32,245,254,
+180,237, 0, 79,131, 1,106, 56,146,166, 44, 6,236, 78, 45, 47, 41, 29,131, 1,128,238, 32, 26,184,149,200, 73,226,194, 38, 21,
+ 27, 28, 31,104,237,255,163, 50,144, 17,214, 46,175,197,153, 90, 39,234,218,239,133, 26,161, 81, 19,235, 32,171,150, 32,137,192,
+246, 22,217, 18,135,200,210,178,166,173,127, 82,160,168,109,121, 73,158,123,147,102, 13, 84, 54, 0, 67, 65,168, 61, 30, 4, 97,
+158, 42, 69,220,225,134, 68, 54,107,123,237,182,100,147,224,180, 96,211, 82,103,128,105,216, 32, 70,107,205, 80, 11,198,203, 98,
+107,183, 90,104,219,252,243,222, 74, 18, 36,202, 94, 64, 99,241,176, 38, 48,213, 52, 82,249,189,237,179, 82,245, 11, 6,103,206,
+130, 66,105,152,190,229, 88,247, 8, 69,146, 24,240, 64, 93,140,148,148, 20,183, 66,161,118,112, 93,255, 25,203,152, 77, 28, 52,
+ 40, 77, 82,139, 56, 12,204, 26,180, 49,234,210,250,146, 8, 12, 0,210,117,160,112,188,137, 73,141,155, 15, 64,250, 68,136, 12,
+ 0,213,245, 60,220,187, 4,171,172,210,216,154,182,243,226,166, 14,208,214,142,129,131,122,234, 76,106,163, 42, 73, 69,164,205,
+136, 36, 26, 33,225,169,199, 23, 68, 55,113,109, 96,135, 55,105,205,207, 52, 3, 91,218, 6,230, 67, 43,205, 1,109,217,244,214,
+244, 98,154, 60, 12,163,232,173,219,105,124,121, 12,145, 55, 43,218,249, 82,195,233, 52,142, 99,202, 0,231,141, 10,212,142, 6,
+154, 65,169, 1, 61,130,129,113,137, 20, 88, 55,100, 13, 76,236,192,249, 3, 26,173, 73,141,129, 96,165, 53,240, 10,178,105, 36,
+170,101,242,181, 53,208, 9,181, 13,130, 48,205, 44,173,185,221, 84,105,199,104, 41, 90,227, 50,173,202, 97, 26,165, 23, 17, 65,
+168,119, 56,211, 52,130, 27, 92, 85,168,154,132,141, 11,176,214,185,116,130,138,132,184, 7, 68, 2,223, 32, 49,164,169,198,139,
+ 14, 88, 37, 25,152,152, 27, 16,156,214, 0, 77, 51, 5,217,244,124, 7, 69,104,224,139, 45,185,106, 13,152,130, 13,219,186, 11,
+187,129, 32, 16, 6, 38, 63, 6,203,239, 45, 6,213, 60, 2,229, 88,191,111, 12,123,187, 73, 22,228, 28,218,187,141, 55, 21,178,
+ 86,236, 9,237, 48,172, 30, 80,106, 2,107,105, 21,151,218,190, 44, 14,210, 52, 99,135,131, 31,165, 17,191, 40,113, 48, 48,130,
+ 36, 58,216,138,105,139,116,203,139, 57, 9,229,212,232,158, 90, 49,116,171, 24,168, 3, 41,232,192,160, 83,109, 59, 0, 46,176,
+ 69, 93,138,114, 96, 64,249, 47,156, 73,108,118, 79, 77, 87, 68,234, 90,193,192,144, 90,173, 29, 45,181,109, 20,173, 45, 54,155,
+ 38,181, 54,205,255, 36,115, 62,176,120, 54, 56, 24, 16, 7, 10, 77,107,172, 73,217, 67, 18,159,118, 57,213,122, 63, 78, 73,236,
+104, 68,180,101,224, 90, 26,212, 74,169, 66,181, 22, 54,111,251,215,200,116, 99,171, 90,150, 40,197,102, 3, 5,217, 77,243, 80,
+146,196, 73,146, 14, 15, 76,170, 53,179,108, 23, 26, 98,211,218, 79, 65,237,196,235,202, 33, 30, 58,116, 72,117,176, 38,251, 93,
+ 53, 22,133,207,215, 55, 46,244, 54,170,254,127,136, 44, 69, 54,247,214,151,234, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/twist.png.c b/source/blender/editors/datafiles/twist.png.c
new file mode 100644
index 00000000000..ee5f6a105ba
--- /dev/null
+++ b/source/blender/editors/datafiles/twist.png.c
@@ -0,0 +1,347 @@
+/* DataToC output of file <twist_png> */
+
+int datatoc_twist_png_size= 10889;
+char datatoc_twist_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0,
+ 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0, 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65,
+ 0, 0,177,143, 11,252, 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72,
+ 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7, 20, 5, 32, 44,179,189,
+ 3,155, 0, 0, 32, 0, 73, 68, 65, 84,120,218,237,125,121,180,165, 87, 85,231,222,251,156,239,187,111,172,247,106, 78, 42,149,
+ 87,153, 67, 37,129, 4, 8, 24, 66,165, 80, 32,129, 24, 20,193,197,160, 66, 3, 45,189, 80,108, 17,167,232,106,249,195,181,218,
+ 70,141,141,141,237,128, 40, 14,140,203,169, 69, 68,198, 32, 67, 24,132, 5,100, 36,132,140, 85,169, 34, 53,215,155,238,244,125,
+231,236,161,255, 56,231,251,238,125,149, 74, 72, 65, 80,232,213, 55, 85,245,238,244,190,123,238, 62,123,252,237,223, 62,193,221,
+187,119,195,183,186,121, 0,184,233,166,155,218,199,215,127,236, 56, 32, 2,192, 13,215,108, 24,189,107,252, 74,215,127,124,241,
+228,151, 74,111,122,222, 83,118,110,223,188,190,125,242, 93,111,252,201,183,191,254,165, 91,214,175, 75, 15,113,215,174, 93,127,
+240, 95, 94, 37,117,191,119,108, 79,111,208, 95,238, 87, 29,239, 88,100, 24,184, 95,133, 55,189,247, 67,221, 97, 77, 0, 80, 78,
+204,148, 83,243,179, 91,206, 23,209,167,237,126,241,161,165,174,136,153, 41,162,189,233, 37,207, 5, 0, 2, 0, 36, 50,101, 87,
+ 20,151,236,122,201,234,225, 7,186,131,225,173,251,151, 68, 13,129,136, 40,127,187,186,183, 24,135,221,114,106, 93, 28,246, 14,
+236,187,235,200,106,119,121, 40,123, 22, 7, 95,255,198,109,155,214,205,228, 55,113,221, 23,174,235,222,162,137,172,244, 6,203,
+189,225,209,229, 85,166,169, 39,236,188, 56, 46, 31,205, 31,167, 28, 52, 12, 66,255,120,247,200, 61, 71, 87,251, 83,101, 49,209,
+ 41, 99,181,242,181,175,221, 97, 96, 79, 63,247, 12, 15,128,113,184, 82, 87,221, 97, 29,122,195,122,178,240,115,211,147,206,209,
+198,217,233,153,201, 78,136, 92, 56, 34, 64, 24, 14, 86,251, 85,232, 87,161, 10, 17, 9, 39, 59,229, 68, 89, 76,117,202, 77,235,
+102,147,244,241,177,236, 29,142, 63,120,221,187,111,157,219,186, 32,177, 54,131,223,127,193,233, 39,121,251,171,223,246, 25, 87,
+116, 30,241, 74,151,159,191,224,157,255,226, 55, 30, 72, 79, 61,253,130,179, 94,247,188, 43,234,200,175,255,211,127,200,111,186,
+249, 93,127,161, 92,215,189,227,221,197,135,186,195,154,133, 17, 41, 48,247,171, 48,172,195, 47,253,229, 7, 0,128,202,201,217,
+114,114,174, 51,179,105,114,122,253,101,207,122,249,114,191,122,224,232,138,136,130,153,170,190,249, 21,215, 2, 0,145, 47, 76,
+217, 57,183,241,172, 75, 1, 96,165, 63, 24, 12,235,187,143, 13, 13,192, 59,247,153,111,236, 3, 0,207,195,110,221, 95, 52, 21,
+ 87, 78,134,222,210,234,160, 58,188,220,173,112,106,190,152,249,226, 93, 15,124,236, 43, 95, 7, 0, 10,195, 85, 13, 21,215,253,
+225,242,161,254,226,190,238,176, 90,234,246,143, 28,222,255,169,187,143,171,217, 51, 47, 92, 0, 0,175,177, 18,174, 56, 12, 98,
+181,178,218, 93, 45,156,155,158, 40,251,117, 56,122,104, 79,167, 44,166, 59, 37, 0,248, 88,247,194,112,169,174, 67,175,170,187,
+131,106,253,204,180,153, 77,150,229,150,185,217,135,142, 47,155,217, 83,206, 58,205, 87,221,163, 85,136,195, 16, 7,117,136, 34,
+147,157,162,172, 61, 34,122,231,102, 38, 58,221, 65,117,162,181,124, 39, 55,122,164, 23,174,255,248,226,245, 31, 59,254,157, 94,
+232,103,223,123, 7, 0,220,240,188,141, 15,127,233,202, 39, 62,129, 8, 79,162, 39,187,118,237,250,131,215,190, 82,133,149,171,
+ 88,245,194, 96, 41,132,170, 14, 49,176, 84, 33, 62,120,100,233,112,119,248,204, 39, 44,152,154,168,138, 72, 96,101, 85,102,185,
+225,253,159,220,127,108,185,189,144, 91, 88, 88,248,145,103, 92, 73,190,116,197, 68,209,153,246,229, 52,152,152, 4, 0,115,228,
+ 46,126,202,179, 58, 97,177, 63, 12, 19,133, 51, 0, 3, 80, 51, 51,101,181,167,157,127,230,115,159,116,254,141,183,221, 51,242,
+ 95, 69,103,202, 84, 36, 6, 53, 43, 38,102, 59,179,155,182, 78,173, 67, 68,242,197,112,229,232,202, 96, 24, 89,142,118,135,203,
+149,238, 60,109, 86,212,212,128, 16, 16,192, 16,222,252,138,107, 1,240,191,189,231,195, 30, 0, 76,133,195,128,195, 80, 57, 40,
+135, 98, 98, 86,124,233, 59,147, 26,227,225,251,190,180,216,237, 71,150, 42, 90,173,238,115,247,199, 43,206, 90,151, 44,167, 91,
+203,111,190,239, 67,107, 60,106,221, 91,148, 56, 84, 14, 34, 76,136, 18,171,186,191, 40,113, 82, 99,181, 58,232,247, 6,245,234,
+ 96,216,171, 66, 96, 22, 55,245,145, 59,135,195, 24,143, 31,122,112, 97,243,250,171,159,116,222,151,238, 63,176,218, 31,228, 11,
+ 73, 72, 87, 9, 38, 49, 42,199,186, 79,228,156,239,212,189,227,251,143, 44,177,170,154,137,234,160, 14,117, 28,136, 40,144, 91,
+191,113, 83, 21,235,201,178,120,234, 89, 91,191,113,104,241,224,241, 21, 15,128, 18, 43,137, 67,137,149, 72, 48, 14,162, 22, 69,
+ 2,115,119, 80,137,234,244, 68, 9, 0,133,247, 83,157, 50, 68,142, 34,221, 97,125,232,200,145,137,210,175,155,154, 32,196,179,
+ 55,204, 30, 93,238,122, 0, 8,131, 69, 9,195, 40,204,162,129,153, 89,163, 72,250,157,137, 78,177, 97,118,186,240,190, 14, 49,
+ 78,148,162,166,170,155, 69,183,204,205, 46,118,123, 81,205,140, 9,241,210, 51,183,122, 64, 24,244, 87, 69, 53,176,176, 40,139,
+ 68, 17, 22, 21, 17, 86, 85, 53, 0, 32, 68, 5, 48, 3, 4, 75, 94,145, 28,121,239, 98, 29,213,204, 0, 0, 31,155,159,252,247,
+187, 45, 44, 44,248, 71,121,185, 13,157,117,127,181, 51,189, 14, 0,126,239,121,155,204,244, 20, 62,161,156,154,189,254,227,139,
+175,123,215, 45, 15,127,169,232, 76,158,116, 69, 39,183,254, 55,190,127, 47, 0,188,253, 63, 61,249,225, 47,197,122,120, 42,254,
+ 8,241,189,191,120,237,201,158,198,183,253,220,203, 30, 45,112,157,181,117,227,121,167,111, 22,149, 3,139,171,251,143, 45, 15,
+170,250,132,247,253,229, 27,126, 2, 1, 88, 84, 84,213,172,141, 68,237, 87,195, 91,222,249, 14,145,168, 18, 37, 12,195,112, 37,
+ 12,151, 67,228,192, 92, 71, 94,234, 13, 63,113,251,125, 47,123,230,165,166, 42,102, 44, 18, 69, 89, 52,178,152,217,207,255,249,
+ 63,174,145, 17, 58, 71,190,112, 69,233, 39,166,203,169,185,206,228, 92,225, 93,233,125,167, 40,214,207, 76, 61,255,210,243, 52,
+107, 28, 32, 34, 17, 34, 34, 32,136,217, 91,254,243, 11,215,200,200,249,142, 43, 58,174,152,244,229, 84, 57,177,206, 79,204, 58,
+114, 6, 0, 96, 14,241, 89, 63,252,154,238,160,234,214,172, 0, 6,205, 95, 3, 51, 83,149,223,126,229,117, 99, 23, 42, 74,114,
+ 37,249, 2,169, 64,231,203,201,185,153,205,103,139, 8, 21, 83,151,238,126,233,226,209,253,129,121,101, 80,245,130,153, 90, 90,
+ 29,128, 1,152, 2,154,217,203,159,245,212,236,143,200, 21, 0,160, 98, 6, 12,128,190, 51, 53, 57,183,249, 9,167, 95,136,206,
+155,196,227,135,247,214,145,131,216,254,227, 43,103,111,156, 86, 53, 53, 0, 68, 68,116, 0,138,240,196, 51,183,254, 31,239, 0,
+128,144,200, 0, 76,197,140, 17, 77, 57,132,170,167,202, 68,164,194,135,142, 29,169, 66, 12, 33,198,200, 95,121,112, 89,213,192,
+ 12, 1, 8,145, 16,189,163,223,120,207,135, 35, 11, 0,120, 83, 81, 14, 28,134, 18, 43,225,128,228, 38, 59, 83, 96,170, 28,227,
+176,219,171, 98,191, 10, 81,164, 98, 16,245, 31,191,235,240,115,158,176, 25, 17, 8,233,157, 55,125,245,182,251,247,141, 92,173,
+132,138,235,228,176,107, 21,246,157, 41,225,136,177, 6,131,186,119,124,249,248,145,192,220,175,234, 65, 20,134,210,251,114,223,
+ 16,255,229,147, 55,129,217, 25, 27,231,111, 71,106, 77,143, 56, 12, 36, 86,198, 65,149, 65, 69, 99,144, 56,224,170,207,117, 63,
+ 14, 22,135,117,232,215,161, 59,172,251,131, 97,175,183, 90, 85,213,157,123, 14,171,200,121,167,111, 46, 28, 93,121,193,246,209,
+138,148,131, 10,155,177,169,152,178, 69, 85,101, 95,178,196,138,195, 32,138,196, 40,145,165,138, 92,135,104,117,192,114,118,225,
+156, 11,187, 43,135,102, 58, 19, 19,101, 49, 63, 51,185,220, 27, 2,128, 55, 73,151, 16, 83, 81, 97, 48, 65,137,166, 17,205,122,
+189, 30, 33, 18,161,115, 72, 8,162,202,113, 40,195, 1,145,143, 28,166, 59,157,194,209, 69,219, 54,125,225,158,253, 0,224, 85,
+ 25,148, 85,216, 56, 40, 7, 48, 53,168,176,182, 16,234,227,221,190,119,228, 29, 77, 20, 5,139,138, 90, 21, 98,168,194,241,213,
+229,201, 78, 89,133,232,136,188,163,185,153,169,180,162, 40, 18,133,107,141,181, 72,173,162,162, 18, 68,135, 85, 93,133, 48, 81,
+150,117,100, 4, 64, 0,239,220, 84,167,156,158,232,120, 71,171,131, 97, 20, 1, 4, 4, 60,111,243,220, 81, 1, 47, 28,148, 43,
+ 13, 21,115,149,178,131,192, 82, 71, 14,204,106, 48, 61, 81, 70,102, 71, 68, 68,222, 59, 81, 21,177, 78,225, 74,239, 16,193,204,
+ 0,129, 16, 84,213, 75, 28,114,221,231, 24,218,248, 17,152, 89, 68, 68,205,172,112,110,162, 44,213, 12,192,136, 80, 69,213,155,
+ 35, 20,209,126, 29, 69, 36, 69,144,237, 27,230, 40, 14, 87, 98,168, 99,186, 10, 75,136, 28, 89, 88, 68, 52, 71, 26, 71, 72,128,
+ 0, 72,136, 68, 14,147, 78,123, 71, 96, 6, 0,102,136,104, 96, 62, 68,102,213, 28,209, 88,162,136,136,138,154,168,169,153, 53,
+246,174,150, 30,130, 2,136, 25,152, 1,162, 89, 54,226,199, 51,135,124, 92,110,103,158,121,166,255,182,127,121, 98,102,254, 57,
+ 63,247, 59, 23, 63,231,165,249,177,229, 96, 14, 0, 31,254,159,255,245,238,207,188,255,145,194,205,163, 85, 62,136,254,219, 88,
+199, 27,254,241,129,180, 95,128,248,161, 27,126,246,206, 79,252,237, 73,223,185,109,231,229, 79,122,254, 43, 79,187,240,201,127,
+253, 51,167,176, 9,167,182,160, 54, 21,224, 80,255,254,143,108,123,244, 55, 31,184,235, 43, 7,238,250,202,227, 86, 62,156,112,
+115, 69,231,148, 86,243,109,223, 30,171,132, 36,214, 55, 92,179,129,156,191,234,213,191,241,197,191,125,235,183,124,255,107,175,
+190,226,178,115,206, 40,157,227,180,185,102,191,252,151, 31, 24,134,248,173,213,232,170,171,174,122,209,165, 23,236,122,226, 69,
+ 0, 36,202,104, 38,202, 26, 43,174, 7, 49, 12,146, 39, 97,205, 25,106, 96, 25,212,252,145,155,191,254,137, 91,239,169, 98, 76,
+ 73,106,202, 9, 94,120,229,101, 47,127,230,165,102,166,102,170,154,204, 91,212, 84, 76,147,181,171,153,233,111,255,195,191, 30,
+ 88, 92,121,148,228, 17,119,237,218,245, 71,175,123,141,170, 54, 62, 66, 77, 85, 37, 42, 71,149, 32,177,146, 88,113,172, 68, 68,
+ 84, 53, 85, 89, 77,110, 83,135, 56,168,234,237,155,215,135, 40,152,115,103,131,102, 53,105, 17,249,183,204, 68,213, 76, 69, 1,
+ 1,126,247,253,159, 62,112,124,233, 17,179, 89,114, 5,160, 26, 24, 90,186, 41,185,194, 10, 85, 9,228, 74, 34,135, 0, 8, 67,
+ 68, 20, 16, 53, 36, 0, 66,244, 68,212, 41,183,156,113,254,210,161,251,213, 0,137, 58,142, 16,209, 90, 11, 6, 0, 52,132, 84,
+137,165, 36, 8,205, 84, 84,127,233, 71,119,153,193,175,254,245, 7, 79,174, 67,174,232,160,106,118, 38,166,166, 9, 92, 16,114,
+ 5, 82, 65,190,164, 98, 2,250, 75, 92,117,197,204, 16, 8,177, 67,254,156,167,188,160, 40,138,225,176,123,104,255,221,169,198,
+ 88, 20,155,158,154,158,242,150, 54, 46,249, 97,131, 84,112,142,254, 36,191,172,170,191,253,202,235,204,236,191,189,231,195, 39,
+ 46,136,124,137, 89,204,134,166, 10, 98,170,136,106, 0,228, 10,114, 69, 49, 57, 59, 53,183,205,149, 29,242,101, 49, 53,139, 42,
+ 96,160, 42,113,216, 93, 58,188,183,138,162,166,162,198, 10, 71, 87,186, 85,144,133,205,235, 28,152,229,239,151,238,101,169, 33,
+ 32, 34, 90,242,162,166, 6,240,223, 95,241,195,127,247,217, 91,239,120,240,192,200,236,137, 28, 16, 1, 18, 32,166,228, 18, 76,
+192,140, 8,201,121,231, 75, 87,116,124, 89, 2, 24, 18,130, 48,162, 67,114, 96, 18,134,221,195,135,246,214, 33,132,200,237, 31,
+ 53,251,198,129,165,155,247, 45,169,168,136,169,230, 37,101,168, 10,145,112,116, 35, 4, 7,118,206,182,205,107,205, 62,127, 23,
+ 49,137,170,172, 34,160,162, 41,191, 49, 1, 3,242, 5,148, 83,190, 51, 73,232,154,175,173, 28,170,238,145,251, 22,123,195, 97,
+136,170, 38,166,106,192,138, 81, 33, 42,138,194,231, 31, 88,188,100,251,252,180,135,166, 30,180, 36, 34, 34, 34,176,251,142,245,
+255,240,159,110, 60,185, 14,169, 4,225,168, 28, 84,162, 74, 52, 97, 51, 81, 17, 48, 5, 4,242, 29, 34,143,136, 42, 12, 9, 41,
+ 32, 81,225,186,191,212,237, 46,117,187,221, 42,178,168, 70, 22, 81,141,172,108,164, 72,108,164,230,190,186,119,145, 85,158,125,
+193, 38, 67, 64,160,229,126,253,190, 79,126,177, 44,220,250,233,201, 91, 30, 60,252,136,142,145,195, 64, 56, 10,199, 36, 33, 83,
+ 81, 19, 84, 83, 83, 36,135, 34,130, 1,208, 80,188, 57, 54,141,136, 78,226, 48,244,142,213,117,236,174,174,138,106, 21, 98, 29,
+ 57,138, 84, 33,154, 25,155, 83,116,224, 74, 67, 39,134, 31,186,227,208,189, 15,220, 13, 42,165,119,219, 55,207, 79,150, 69,100,
+185,108,199,214,229, 65,125,203,158, 3, 39, 89,144,196, 90, 36,170,176, 42,131,176,170, 2,164, 82,202, 82, 13, 96,202, 42, 30,
+145,156, 47,136, 75, 64,144,186,207,117, 95,193, 42,230, 16,185,142, 92,199, 88,231,100, 74,197, 84,196,144, 10,117, 37,184, 2,
+201,159,115,246,133,251,246,222,181,113,195,124,202, 7, 28, 81,167,240,115,147,240,180,115,182,125,249,129, 3, 39,217, 50, 19,
+ 49, 97,200,233,148,162,170,153,128,170,162,161, 68, 69, 66, 34, 4, 82,239,145, 60,168, 72,232,199,186,119,120,185,155,172, 88,
+155, 50, 41,161, 38, 81, 36,178,152, 69,128, 1, 32,130,235,144,239,108, 59,227,172, 45,219, 78,123,232,158, 59, 61, 57,239,201,
+ 59, 87, 22,102, 86, 60,237,236,211,191,188,231,224,154, 5,153, 36,123, 16, 83, 1,149,244,216, 84,193, 68, 85, 0,172,181, 16,
+138, 14, 0,148,235,186,234, 47,247,135, 85,136,228,136, 4,189, 39, 3,151,180, 55,187, 64,181,168, 42,170,194, 26,171,202, 12,
+ 68,101,121,241,176, 48, 59,162, 9,243, 68,228,137,196,185,137,178,184,252,156,109, 95,105,228,228, 1, 80,149, 77, 89, 69, 76,
+163,169,168,178, 73,178, 47, 85,149, 81,218,105, 32,102,106, 26, 34, 15,235,208,171, 2, 0,116,188, 79, 78, 16, 1, 28,145,115,
+ 82, 56,199,226, 99,169, 41, 14,138, 72, 21,165,138,177, 10,177,215, 93,157,158,156,232, 13,107, 3, 40, 28, 37,199, 68,142, 10,
+165,203, 22,182,222,186,239,112,179,101, 28,146, 2,153,178,114, 76,117, 76,250,122,201,225,170, 42, 55,129, 44,101,240,201,166,
+ 60,209, 84,167, 76, 30, 69, 84, 84,141,197,113,145,150, 98,106, 9,247, 50, 51,171, 35, 87, 33,246,170,186, 14,209, 59, 7,102,
+154, 50,242,198, 67, 21,142,206, 63,109, 99,101,230, 1, 64,179, 82, 71,149,104, 26, 85, 53,165,248, 57,148,170,169,153,136,178,
+170,153,114, 78,221,213,204,188,119, 19, 0,136,224, 8, 35, 11,171,122, 73,223,195,105,206,237,147,142, 89,250, 14,211, 19,229,
+176,142,129,179, 26,168,230,172, 55,185,239,217, 78,161,228, 60, 32,112,232, 9,135,180,140, 20, 4,204,172,149, 79, 94, 83, 35,
+177,156, 90,168,153,181,101,181, 75,206,216, 12,140, 12,209, 33,162, 81, 27,179,204,204, 8,137,114,198,141,128, 33, 21, 36, 0,
+102,170, 89, 69, 17, 1, 97,211,236,148, 7,128, 80, 15, 82,146, 96, 57,137,209,241,204, 97,252, 25,205,129, 32,215, 55, 41,128,
+166,154, 31, 17, 0,193, 12,198,194,106, 10, 86,109, 13, 96, 72,152,138,122,105,222,168,134,205, 21, 44,229, 7, 30, 1, 62,125,
+223,225,124,145,124, 57,107,226,190, 1,180, 31, 96,163,207,111,222,161, 6,106,106,106,172,166,170, 44,154, 74,173, 22, 43, 73,
+ 63,213, 0,140,196, 64,148, 24,137,189, 40,169,182,245,154, 25, 42, 56, 51, 52,165,114,242,123, 12,111, 76,181,217,247,206, 98,
+118,239,222, 77,136,248, 61, 37,160,111,191,114, 61,243,137, 87,254,248,111,253, 77, 57, 57,115,194,243,123,191,250,169, 79,252,
+241,245,139,223,188,255,219,187, 44, 46, 44, 44,236,219,183,239,148,126,103,219,206,203, 95,241,214,143,229,194,185,169,160,235,
+254, 42, 0, 36, 32, 57,105,252,231,223,125,195, 23,222,115,195,169,110,217, 41, 75,232, 37,111,254,135,179,159,250, 67,105, 17,
+ 71, 30,248,218,251,127,243,149, 43,135, 30,124,248,219, 38,231, 54,158,251,244,107, 94,255, 55,119,125,240,205,175,221,127,251,
+231,191, 91, 18,122,213,159,124,106,235,185, 79, 74,171,121,207, 47, 92,243, 24, 43,101, 95,118, 56,212,143,191,132, 46,126,238,
+203,182,158,119,105,186,255, 39, 63,113, 81,239,248,161,199,248,139,143,113, 53,167, 86,219,251,206,196,117,215,191, 45,221, 95,
+ 62,176,231,177,175,230,187, 5, 54,188,252,134,127,110,239,255,217,171,159,250,221, 51,251,199,186,160, 47,253,221,255, 54,149,
+ 83,118, 42,142, 94,119,237,174,159,190,250,138,199,223, 15,221,251,249,127,249,189,231,111,222,176,253,188, 23,190,233,175,190,
+229,155,119,110,223,250,202, 31,186,124,243,186,153, 4, 60, 0,226,214,249,117,111,254,251,143,159,178,149,173,159,157, 62,109,
+126,118,243,220,204,100, 89, 42, 88, 29,120,165, 63, 92,233, 15,122, 85, 56,182,218,251,150,215,234, 20,254,181,215, 92,249,140,
+ 11,206,140, 41,113, 80, 85,131, 6,117,208, 61,135,143,191,229,159, 62,253, 45,173, 12, 95,116,245,179,127,229,199,158, 87,248,
+ 34,199,105,101,149,192,161,146,186, 27, 98, 20, 81, 54, 21,150, 90, 68, 69,235, 40, 95,219,127,232,253, 95,188,253,161, 99, 43,
+129,185,189,208,204, 68,231,237,175,127, 41, 17,168,129,141,112,143,132,164,164,226, 21, 76,161, 91,213,191,254,174, 15,126, 11,
+179,255,129, 75, 46,153,152, 94, 15, 38,205,151, 98, 36,135,228,144, 60, 21,169,155,202,236, 92,161, 42,162,157, 82,127,224,194,
+ 29, 79, 61,247,204, 42,132,238,176, 62,184,220,125,239,167,191,250, 91, 63,121,237,212, 68,153,155, 71,166,169,173, 9,104,150,
+155,154,233, 31, 51,208,169,137,226,119, 95,245,130, 95,123,231,191, 60, 26, 84,119,245,149, 87,156,123,218,105, 13,122,130,185,
+ 13, 5,132,148, 58, 45,136, 25,181,200, 47, 34,128, 67,240, 68,133,119,179, 19,229,115, 47,191,116,221,100,105,166,109,136,182,
+244,241,102, 0,152,193,233,166, 26, 81, 5, 71,248,244, 11, 22, 62,115,231,201, 35,221,142, 29, 59,168,105,135, 57,164, 12,217,
+147, 47,200,151,206,119, 92, 49, 65,190, 67,174,112,132,142,136, 8,157, 35, 34, 2, 68, 34, 42,188, 47,189,159,232,148,117,168,
+ 13,169, 65, 56,160, 5,104, 1,108, 60,145,200,200,158,217,220,244,228,175,252,216, 15, 61,162,217, 99, 2, 36,136,210, 54, 33,
+121,116, 5,249, 2,125,233,124,233, 92,137,174, 64,164,212,168, 24, 33, 43, 0, 4,224, 8, 61,185, 40,210, 31, 14, 21, 41,231,
+136, 99,249, 12, 54,192, 85,179, 24, 51, 68, 51,219, 58, 63,243, 51,215, 94,249, 8, 11, 66, 74, 32, 16, 57,143,222,147, 47,136,
+ 60,185,194,249,146,138, 14, 21, 19,206,119,208, 21, 56,214, 0, 72,221, 29,242,197, 51,174,121, 85, 61,236, 39,248,113,185,219,
+211,241,196,181, 45, 57, 64,215, 8, 73,115, 58,125,246,150, 13,151,159,191,112, 50, 63, 68, 68,206,153, 25, 0,165, 98,222, 16,
+ 77, 69, 17,201, 12,124, 9, 48,109,166, 18,235,196,187, 64, 0,239,168,152, 90,127,254,147,175,142,213, 32,198, 58,117,100, 89,
+236,224, 82,119,235,220, 84,171, 49, 96, 99, 77,205,164, 93,169, 30,104, 82,244, 23, 95,113,201,190, 99, 43, 71,150,214, 96,160,
+ 68, 72, 64, 14,137,128, 40, 1, 72,136,132, 72,152,208, 28,231, 93, 49, 57, 49,187,105,106,253,118,231, 72,213, 84,229,204, 75,
+158,123,222,165,207,150, 80,115, 28, 36, 48, 84, 52, 21,222,182,239,120, 63, 9,103, 28,196,107,251, 6,227,187,153,108,239,141,
+215, 61,243, 97, 18,194, 12,106,153,154,162, 0, 1,104,163,153,136, 72, 62,117,128,202,169,245,235,182,158,235,202,137,178, 51,
+ 37, 28,193, 76,149,165,174,196,128, 69,213, 84, 20,204, 32,170, 62,112,108,184,176, 97,210, 18,134,210,148, 68, 89,159,218,142,
+120,194,243, 12, 13,224,183,126,234,218, 55,189,247, 35, 99,177, 12,145,144,114,231, 11,176,209,190,116,143,200, 57,231, 75,223,
+153, 42, 38,166,125,103, 10, 1,132, 3, 18, 1,162,169,114,221,151,124, 75, 21,173,130,218, 48,196, 67,221,168, 73,121,218,229,
+ 36,101,111,161, 60, 0, 74,149,163,129, 1,252,236,117, 87,173,177, 50, 32, 36,162,180,191,205, 14, 43, 34, 16,229, 75,152,169,
+134, 74,234,126, 18, 90,146,188, 42,215,189,197, 40,194,170, 81, 68, 52, 87,217, 96,118,112,169, 63, 96, 83, 83,203,114,193, 49,
+163,203, 14,173,145,155, 17,226, 95,221,248,197,147, 96,140, 0, 96,214,128, 50,208, 86,142,198, 28, 17,201,138,137,178,236,100,
+ 20, 21, 64, 77,149,195,202,202,145,132, 80,105, 66,211,149,162,152, 24, 2,216,109,251,150,175, 56,123,189,168, 2,102, 34, 74,
+227,137,144, 82,215, 15,145, 21,254,224,159,111, 58, 33, 74,250,166,177,175,109, 11, 55,223, 81, 1, 21, 3, 3, 68, 95, 76,146,
+115, 77, 86,175, 9, 60,230,122,208, 15, 49,178,176,138, 40, 88, 66, 79,196,216, 72, 21,136,240,166,251,142, 61,243,156, 13,166,
+136,168,134,136,218,168, 53,146, 41,188,227, 51,183,220,179,119,255, 73,211, 15,131,164,148, 18,149, 89, 37,154,113,198,175, 76,
+ 16,144,124,137,228, 16, 16, 76, 85, 57, 75,136, 67, 28,174, 12, 3,143,109,150,170, 65, 96, 16, 64, 6, 50, 69, 3,188,127, 57,
+158, 51,239, 0, 18, 48,109, 8, 72,104,127,251,133, 59, 62,119,231,125,143,232,169,155, 8, 31, 85,162,106, 48,141,202,209, 50,
+222, 40, 0,136,148,160, 96, 81, 97, 80, 49, 97, 85, 17,174,185,234, 86,145,185, 97,115, 4,150, 16, 98, 29, 67,136, 28,163,164,
+ 50,127,207,161,229, 94, 68, 48, 32,196,210, 23, 31,248,210, 29,127,248,207,159,156,242,116,229,133,143, 88, 46,123, 83,149,220,
+106, 97, 21, 54, 97, 19, 78, 72, 99, 14, 72,154, 86, 76, 35,165, 4,211, 80,113,172,204,176,197, 73, 34, 11,179,212,194, 10, 94,
+128, 0,189,130, 67,162,155,238, 61,122,221, 69,155,191,112,215,222,207,220,113,247, 84,167,220,182,101, 99,233,104,194,251, 39,
+158,181,237,142,189, 7, 78,182, 32, 83,229,180,148,152,249, 0, 73,159, 76, 1,208,136,204, 68,197, 1,112, 42,255, 28,152,154,
+113, 24, 10, 7,174, 7,170, 26, 69, 2, 75,136, 28, 88, 34,179,130,176, 57,112, 6,104,138,206, 1,220,184,103,245,182,175,223,
+ 55,213, 41, 39,203, 98,227,244,100,100, 46,188,159,235,200,100,167, 28,214,225, 97, 91,166, 98, 18, 19,186,152, 87, 99, 10,169,
+ 51, 4,154, 41, 15, 26, 85, 66, 34,100, 40,179,198, 74,185, 86,229, 97, 93,179, 90,100,137,204,145, 51,101, 44,198, 24, 99, 21,
+234, 42,196,200,204, 98, 86,247, 43, 34, 44, 28,205,205,206,152,105, 74, 47, 10,239, 46, 62, 99,227,201,116, 72,213, 82, 95, 32,
+245, 95, 84, 18,149, 70, 65,179,178, 51,107, 12, 26,131,112, 48, 9,194,181,196, 90, 56,128, 89,191,170,165, 81,106, 22, 17, 77,
+ 4, 2,225, 24, 57, 12, 99,168, 66,168,133,163,170,158,125,222,206,194, 57, 66,100, 73,170,141,142,104,162,240, 91,230,103, 79,
+ 98,101, 54,130, 90,147,187, 87, 48,195,132, 84,137,161,169,153, 67,117,100, 14, 12,144,216, 36, 42,215,106, 22, 89, 45,217,104,
+238,216,129,170,101, 70,156, 25,176,128,235,160, 47,129, 10, 68,114, 68,189, 94,183, 51,183,174, 44, 60, 17, 58, 34,239,220,142,
+ 13,179, 71,150,187, 15,183,178, 22,248, 53, 88, 3, 13, 42, 88, 82,243,104, 18,148,131,114,157,186,159, 82,247,135,117, 76,221,
+186,212,163,107, 66, 66,246,178,162, 38, 34,137, 36, 35, 97,168, 18,230, 54,109, 1, 87,136,168,169,165, 48, 78, 68,133,119,219,
+ 54,111, 88, 43,161, 54, 0, 38,188,217, 52,161,120,208, 52, 42, 17,209, 20,129, 28,105,234,163,129,132, 97, 8,131, 94, 85,167,
+110, 33, 33, 80,202,240,168,161, 98, 37,175,175,233,251, 9,196,138,156,175,196, 68, 76,204,196,204, 33, 18,145, 39,115, 68,167,
+207,116, 14, 28, 61,193, 83,155,130,106, 94, 83,106,190,174, 85,112, 0, 68, 97, 35, 66,140, 0, 26,135,189, 65, 85, 39,242, 54,
+165,116,147,212,147, 19,178, 68,153,105, 4,174,162, 32, 42, 44, 34,117,232, 14,170, 13,235,166,251, 85,237,157,195, 20, 67, 17,
+ 28, 81,225,221,220,244,228, 74,127,216,154,125, 75, 17,145,172, 76,202, 42,130, 32, 96, 10, 9,223, 78, 50, 19, 64, 64,145, 80,
+135, 56, 8,145, 89, 8,144, 40, 37,228,104, 14,189,145,153, 51,176, 20, 77, 73,144, 80,205,140, 69,234, 16, 35, 75, 29, 34, 33,
+214, 49, 2, 20,142, 16, 1, 9,129, 16,207,221, 60,119,115,187,160,180, 26, 72,134,102,106,202, 38, 12,166,162, 2, 38,173,134,
+101, 92, 86,141, 85,170,192, 33, 70, 86, 37, 66, 79,200, 68,226,168,192, 20, 69, 19,240,171,142, 48,197, 19, 71,148,140, 43,136,
+ 12,234, 48,213,233,176,168,119, 77,206,133,136, 8,142,104,118,114,162, 59,172, 0,192, 39,216, 57, 69, 46, 75,228, 38,101,211,
+228, 27, 57,119,169, 83, 7, 94, 83,170,170, 85,228,200, 10, 6,142,168,112,142,157,154, 81,170,131, 16, 1,209, 19,138,119,148,
+128,246, 78,161,157,194, 19,161,119, 84,133, 64,132,185,127,169,185,127,157,170,173,133,141, 51,119,126,179,106,148, 90,197, 84,
+115,191, 76,217,154,230,139, 26, 72,198,147, 33,121, 26, 53, 99, 22, 22, 73, 61,203,212, 98,138,146,251, 16,152, 43, 24,113, 68,
+ 25,116, 7, 19,209,210, 59, 68, 76,124, 45, 83,243,148,251, 9, 48,150, 77, 78,120, 63,138,101,102, 73, 42,108,146,156, 50, 91,
+211, 52, 17, 85, 85,101,205, 29, 43,145,166,255, 96,134,136,222, 59, 53,237, 20, 14, 0, 68, 21, 37, 91, 63,137, 58,162,220, 44,
+119, 38,106,136,232,136, 16,145, 89, 91, 75, 76,169,119, 83,154,194,214,185,105, 51,243, 96,106,204, 42,172, 26, 85,130, 9,139,
+101,230, 98,234, 40,100,162, 84,179,154,140,192,167,207, 64,244,206,121,159,197, 3, 0,160,154,182, 64, 91,228,223, 76,205, 40,
+123, 41,171,144,179, 55,176,177, 84, 18, 0, 17,183,206,205, 32,162, 55,147,220, 4,106,250, 47,214, 52,167,242,150, 37, 16, 35,
+253,108,158, 73,101, 69,138, 0, 30, 81, 28, 41,128, 51, 3, 67, 32, 2, 52,210,156,195,171, 25,170,162,119, 25, 58, 80, 11, 34,
+106,134,154,195, 66,211, 64, 7,143,208,176, 34,165, 86, 73, 93,169, 70,133,115, 28, 72,134, 7,163, 38, 85,219, 10, 89, 75,139,
+162, 6, 26, 0, 4, 52, 32, 68, 69, 68, 64, 5, 37, 64,203,221,113,116,228,136,132, 84, 77, 49, 39,200, 57,187,197,182,120,243,
+ 42, 44, 92,171,130,168, 66,219,116,109, 86, 48,222,149,106, 87,211,196,152, 81,193,140,136, 52, 38,255, 92,187,166,229,217, 24,
+ 25, 4,129, 26,141, 86, 29, 75,230,155, 86, 16, 0,120, 53, 21,209,148,106, 36, 93, 94,211,155,210,100,129, 77, 88,201,255,170,
+182,189,161,177, 50,217, 70,125,163,166, 68,109,111,237,238, 52, 59,100, 99,192,196, 8,140, 72,158, 58,227, 92,186,134, 99, 51,
+218,187,230,195,199,214,212,180,195, 70,157,170, 52,224, 0,163,199,184,182,126,109,118,122,172,252,111,159, 88, 83, 42,249,189,
+ 75,125,213,166,228,105,107,159,209,253,230,251,105,187, 89, 39,166, 4,105, 79,147,207, 28,251,224,102,179, 12, 21,200,204, 68,
+ 81,140, 34, 57, 46, 84,157,182,226, 68, 51, 50,243,106,148, 68,184,123,247,238,165,165,165,229,229,229,239,181,182,208,127,236,
+205,204,230,231,231,215,175, 95,239, 1, 96,101,101,101,255,254,253,255, 95, 40, 15, 39,121,102, 1,253, 7,222, 54,159,115,241,
+ 57,151, 63,103,211,217, 23,109, 62,251,162,233,249, 45,228, 61, 18,197, 97,127,245,232, 67,171, 71,190,121,240, 27, 95,221,119,
+235,103,143, 60,240,181,239,203,254,230,183,243, 97,157,137,167,191,228, 13,231, 61,227,249,167,157,127, 25,156,136,215,142,232,
+189, 19, 51,243,179,155,207, 56,227,162,167,239,252,193, 23,143, 19,126, 99, 61,124,232,206, 47,237,249,242, 39,110,251,200,187,
+195,160,251,255,142,128, 92,209,121,230, 43,175,191,226,229,191,184,134,225,220,224,105,221,163, 15, 45, 62,116,255,254,219, 62,
+255,224, 45,159, 89,252,230,125,195,213, 19, 39,104,167,215,111, 94,183,101,251,150,115,159,116,250,133, 79,217,116,214,206,203,
+ 94,240,154, 43,127,234, 87, 59, 51,115,117,111,229,163,255,235, 23, 30,248,242, 39, 98, 53,248,126, 21, 16, 34,189,238,221,183,
+174,219,178,125,252,169,244,243,163,111,125,227,237, 31,121,247, 99,185, 72,127,233,104,127,233,232,193,187,111,185,237,195,239,
+ 60,225,226,128,184,113,225,130,167,253,248,235,247,221,254,249, 59,111,252,155,239, 39, 1, 33,210,143,254,198, 95, 92,184,251,
+133,163,220,194, 12, 16,123,199, 14,190,239,151,175, 91, 62,184,247,241, 8, 52, 10, 6,199,246,222,245,145,183,252,252,247,153,
+ 6,109, 92,184,224,167,223,241,197, 53, 42, 99,102, 96,255,250,199,191,126,243, 7,254,252,251, 43,150,209,227,126,197,139,159,
+243,210,215,188,253,115, 15,215,168,143,188,229, 13,223,119,210,121,252, 53,232,220, 31,120,222,117,191,246,182, 76, 66, 27,203,
+ 60,111,254,192,159,127,237,227,239,251,126,204,134, 30,103, 1,221,255,165,143,221,112,205, 70, 0,184, 96,215,143, 92,114,245,
+203,119, 60,249, 89,197,196,148,114,252,220,187,126,231,241,250,136,169,178, 56,115,243,252,121,219, 78,187,100,199,233,103,110,
+ 92, 87, 16, 26,128,152, 17,226,151,239,221,247,206, 79,126, 89, 84, 31,199,111,132,187,119,239,222,187,119,239,169, 50,171,254,
+253, 92, 0,161, 67,124,209, 85,151,255,224, 69, 59,166, 10,175, 6, 98,134, 6,106,154,244, 84, 97, 84, 20, 26, 34, 1, 28, 89,
+233,254,222, 63,126,170, 87,213,223,225, 71, 47, 44, 44,156,117,214, 89, 30, 0, 88, 50,213,101,219,198,245, 79, 60,103,251,249,
+103,156,126,241,142,237, 51, 19, 19,147,157,162,244,222, 19,122,135, 4, 6,198,166, 44,194, 44, 38,146, 96, 44,101,150,212, 78,
+ 96,209,154,165, 14,177, 14,188,216, 31,236, 57,188,120, 96,105,117,207,225,227, 71,151, 79, 61,163, 67,252,241, 43, 47,123,198,
+133, 59,182,204,207, 56,196, 76,235, 76,189,105, 0, 4, 80, 4, 50, 74,252, 4,108, 82,205, 84,103, 26,192,198,117, 51,191,251,
+234, 23,244,134,241,143, 62,252,217,253, 71,151,190, 83, 13,218,181,107,215,143, 62,237,201,215, 92,246,196,196,255,197,182,199,
+158, 90,103, 25,114,205,210, 48, 17,213, 52, 59, 16, 77,162,168,180,240,154,181,128, 64,134, 5,214, 96, 22,105,228,177, 31,226,
+193,197,213, 61,135, 23,247, 29, 93,254,230,226,242,161,165,110,140,121, 98,105,199,150,141,207,120,194, 89,207,121,210, 5,243,
+211, 19,170,218,234, 5,180,221,236, 49,156,162,197, 22,154,143, 72, 84, 91,109,137, 29,205,239,225,241,110,255,237, 31,251,183,
+ 71, 25, 64,122, 76, 26,100, 64,128, 14, 9, 17, 8,199,150, 1, 72,185,223,137,100, 74, 68, 94, 73, 72, 11,115,156,132,229,140,
+ 85,216, 11, 55, 83, 75, 32, 13, 37,223, 64, 19, 23, 57, 67,101, 0,166, 58, 51,209,217, 52, 51,189,115,251,150, 24, 37,136, 4,
+102, 17,241,229,228, 89, 91, 54, 12,171, 42,245,223, 18, 94,137,102, 8,160, 77, 51, 90,205,172, 69, 34, 51,143, 4, 27, 58, 66,
+238,102,167, 55, 88, 75, 43, 1, 48,213,249,233,169,235, 95,252,236,126, 85,255,209,135, 63,119,112,113,245,219,117,210,152,211,
+ 82, 51, 4,180,134,198,162,134,169,135, 76,128,138,228,212,148,140, 76,156,169, 67,243,230, 68,133,209,177, 9, 35, 71,132,152,
+230, 27, 52, 3,174,148,204, 82, 21, 82,215, 93,140,144,140, 8, 72,209, 17,121,113,101,225,153,121,122,102,182,174,135,206, 33,
+128, 83, 97, 24, 27,184, 26,175,215,208,198, 49,186, 4,253,101, 76, 46,207,187,140,209, 38, 44,163,204,105,182, 28,167, 58,229,
+175,189,232,217,221, 42,252,143,191,187,177,138,241,148, 5,148,250, 37,137, 57, 3, 35, 26, 14, 97,102, 33,153,129,166, 89, 48,
+ 48,167,100, 96, 98, 34,170, 2, 72, 38,164,128,148,117, 60,102,132,211,144,146, 2, 25, 98,219,167, 71, 75,110, 53, 97,212, 25,
+144, 86,245,158, 66, 45,102,102, 16, 29, 57, 71,152,190,149,166,239,253, 8, 78, 42,129,114,121,206,183, 81, 58, 91,131,231,140,
+128,197,196,246,154, 40,253,111,189,226,218,123, 14, 30,255,179,143,158, 2,245,213, 45, 44, 44, 92,120,230,246,243,207, 56,163,
+ 97, 49, 17, 18, 66,195,104, 34, 36, 64, 66,114,233, 85, 64,151, 27, 80,232, 48,145,103,218,174, 0, 52, 40, 99,174, 2, 96,140,
+221,181,182,112,207, 80, 52,109, 60,253,220,167,236,250,177, 3,123,191, 30, 67,149, 0,249,200, 92,197,168,128,142, 40,185,147,
+ 60,193,103,102,227, 68,154,230, 24,131,180,125,136, 96,176,246,115, 90,196,179, 65, 29,161, 65,236,215,207, 76, 94,115,217, 5,
+157,194,223, 51,222,148, 59,217,109,110,110,110,126,126, 62,107, 16,145,211,150,180, 2,105,183, 19,169,194,154,147, 26, 72, 51,
+ 59,203,208,212, 72, 77, 9,145,210, 12,156,178, 3,116,136, 21,128, 26,179, 54,251,102, 99, 91,158,142,144, 50, 48, 95, 76,238,
+184,120,247,204,186, 13, 38, 28,170, 94, 93, 13, 56,117,101, 18, 33,192, 32,112,221,171,170, 78, 81, 78, 79,120,203,232,117,114,
+ 78,163,248, 49, 38,163,113, 45,179, 53,181, 90,251,100,246, 81,137,155,133, 98,118,213, 69,103, 95,117,209, 57,111,253,224, 77,
+ 7,151, 86, 31,155,137, 57, 79,173,111, 78,251, 98,128,100,102, 70,105,255, 32,207,137, 36,150,211,168, 74, 65,116,232,201,151,
+164,108, 60, 41,113, 50,214, 61,171, 7,121,120,162, 25, 62, 73,156,147,249, 51,118,110,217,190,211, 57,167,194, 26,131,114,168,
+170,158, 48,183,253, 11, 51, 83, 5, 53, 80,176, 42,214,203,253,106,118,106,114,166,147, 34,122, 98, 31,141,161,220, 99,232,252,
+ 90,233, 24,160,161, 1,142,203,104, 45, 99, 48, 77,123,188,225, 5,187, 30, 90, 92,125,199,141, 95,170, 30,121,252,215,167,108,
+140,200, 37, 83, 69, 92, 35,166, 28, 22, 70,198, 49,182, 20, 68, 34,103, 70, 64, 0, 96, 14, 74, 40, 17, 0, 38, 17,205, 84,170,
+222,234,202,209, 1,139,243,157,217,249,173,219, 22,118, 18,130,138, 32,130, 8,155, 70,225, 32,161, 26,244,151,217, 52,147,158,
+ 52,181,122,211,234,193,204, 88,236,232, 74,255, 40,225,105,115, 83, 29, 7,205,145, 1,102, 48,110,205, 54,210, 22, 27, 39, 39,
+ 90,107,206,208,244, 4,114,155, 73, 21,146, 59, 52, 60,109,126,246, 55, 95,118,245, 71,111,189,247,211,119,220,251, 40, 26,132,
+ 72,148,114,210, 68,132, 3, 52, 2, 80,211,236, 13,113,172,189,144, 59, 17,136,237, 4,102, 50, 31, 36, 36, 71,228,201,121,116,
+133,243,197,134, 29,205, 84,165, 25,170,164, 38, 94,234,187,171,168,114,228, 48, 28,246,150, 19, 85,173, 73, 8,146,140, 72, 21,
+ 20, 82, 55,222,152,237,129, 35,171,147,157,114,251, 92,167,253,218, 10, 41,226, 54,255, 1,142,187,232,204,152,109,115,130,102,
+219,199,202, 67,204,130, 66,100,181,171, 47, 61,255, 25, 23,238,248,211,143,126, 97,169, 55, 56, 73, 53,223, 68,121,164,212,223,
+ 66,164,113,215,155, 59, 43,169, 91,159,141, 46, 45,129,146, 35,119,158,168,200,196, 80,114,128, 8, 38, 18,134,177,234,113, 24,
+130, 25, 16, 37, 37, 77,202, 6,102,160, 34, 18,227,112,165,223, 93, 76,228, 39, 78,115,149,137,215, 39,194,150,199,194,219,198,
+205,202,160,190,253,161,213,227, 67,205, 99, 79,233,167,142,251, 34, 24, 7, 42,161, 29, 49,182,134, 1,136,136, 13,239,181,121,
+ 29, 40, 9,218,108,118,178,124,227, 11,127,112, 97,203,198,147, 22,171,141,196,155,119,231, 92, 53,141, 57, 54,116, 11, 77,227,
+ 94,102, 45,219, 55, 79,101, 41, 42, 42, 24, 34,131, 34, 0, 56,116,206, 21, 29, 34,151,230,154, 51, 67, 19, 16, 65,193,204, 76,
+ 69,162,212,253,254,234,209, 94, 85,165,147, 55,154,158, 87, 30, 19, 83, 0, 85, 84, 48,209,108,113, 41,177,217,115,100,245, 96,
+233, 47,216, 50, 77,208, 26, 21, 26,166,145,181,108, 86, 77, 75, 46, 39, 9, 72,136,154,245,142, 16, 45, 53,163, 85, 83,247,190,
+ 91,241,221, 7,142,125,242,246,123, 22, 31,129, 59,239, 91,165, 52,205,221,199,164,218,137, 70, 5,150, 88,188,105,216, 54,251,
+103, 85,197, 38, 85,205, 65, 53, 73,129, 13,121, 25, 42, 0, 0, 9,250, 73, 68, 65, 84,156,115, 5,122,231, 92, 65, 13, 39,188,
+229, 74, 54,102,170, 42, 34,177,170,122,199, 86,122,171,131, 42, 68, 22, 81, 1, 64,205, 13, 67,208, 20,177, 0, 89, 77, 13, 20,
+ 64,148, 52, 55,208,173, 55,140,159,191,247,216, 5,219,231, 79,155,164,180, 86, 52,107, 12,206,192,176, 73,185, 70,217, 55, 34,
+165, 4, 76, 84, 19,123,238,174, 67, 43,127,255,217,175, 12,134,213, 99,132, 59, 44, 87,122, 57,146, 72, 67,241,200, 36,157,164,
+ 68,102,146,100,212,254,219,120,111, 34,114, 72, 72,228,208,249,196, 60,111, 82, 95,179,148, 79, 26, 98, 26,133, 20,214, 88,199,
+ 97,183,238, 47, 85,172,193, 44, 50,171,129,154,180,228,130,156, 2, 27,138,154, 24, 40, 96, 34,108, 72, 18, 5,152,247,238,238,
+135,150,191, 57, 81, 62,105,219,180, 3, 83, 4, 64, 69, 64,107,147, 81,200, 26,155,118,220, 17,162,115,247, 31,237,126,238,235,
+247,223,118,255,131, 33,196, 83,203,164, 51,195,168,165, 5,106,203,132,107, 73, 57,210, 88,156, 90, 34, 47, 52, 89, 14,145,107,
+184,190, 4, 68,141,162,136,170, 33, 16, 96,170, 57,210,166, 38,249, 4,142, 3,174, 86, 67,168, 6, 85, 93, 87,117,100, 25, 17,
+201, 70, 85,110,162, 41, 36, 13, 66, 0, 84, 32, 5, 84, 3, 53, 74, 42,187, 58, 8, 55,222,213,127,242,217,155, 79,155, 76,231,
+ 74,180,229, 89, 34,218, 0, 1, 30, 88,236,222,182,247,224, 93,123,247,207, 76,118,230,166, 38,143, 30, 95, 57, 37,233,180,148,
+ 96, 85,201,199, 39, 89,162,247, 38, 97, 73,162,118, 73, 83, 34,103, 15,210,232, 14,102,151,156, 15, 80, 0, 80, 53, 96, 48, 2,
+115, 64, 6,102,144, 37,166, 57,226,168,104,172, 36, 12,185,238,215,129,217,176, 30, 12,180,225,123, 55,103,117,140,168, 1, 44,
+218, 8,136, 12,201, 12, 20,156,161, 26, 98, 10, 64,165,247,183,236, 57,186,101,126,250,210,211,167, 93, 62,255,206,234, 40,255,
+246,141, 7,191,114,247, 3,133, 71,135,174,240,238,220,109, 91, 61, 90,100,217,177, 97,110,203,186,233,175, 62,112,224,177,131,
+106,233,196, 67, 77,100,156,196,158, 55, 17, 77, 39,150, 52,100, 60,104,136,131, 54, 98,173, 24, 2, 66,242,218, 42,185, 82, 76,
+ 98, 36,135, 96,152, 40, 59,166,249, 16,177,196, 4,231,192,177,146, 48, 20,174, 69,196, 36, 86,117,101,136,121,131,204, 88, 68,
+ 50,147, 67, 69, 45,209,164, 44,219, 14, 41,144, 1, 3, 58, 32, 2, 32, 5, 52, 67, 71,116,120,177,247,217,136, 37,198,155,111,
+185,121, 24, 56, 17, 33, 39, 75,239, 28, 77,117, 58,219, 54,204,101,233, 59, 43, 0, 0,225,105,231,110,219,191,216,123,232,248,
+242, 99, 21,144, 38,215, 48, 34,223,106, 67,193, 29, 63,198,201,214,144, 26,243,145, 38,154, 11,103, 1,112,105,248,217,208, 36,
+ 85, 33,128, 76,228, 16, 29,146, 2,130,137, 8,215, 18, 42,137, 3, 97, 86,128, 80, 13, 89, 36,209,142, 88,148, 53,211,247,155,
+105,121,225,134, 48,162, 96,106, 96, 64, 0,100,232,128, 28,146, 51,160, 36, 59, 36, 26,116,123,125,128,233,249,141,225,216, 17,
+231,200, 19,121,231, 38, 59,229,150,245,235, 48,243,223,208, 57,215, 6,223, 51, 55,204,148,222,237, 57,124,252, 49,106,144, 24,
+199,116, 56, 71,227,146,181, 61,149, 37, 7, 53, 51,108,224, 77,104,217, 43,170,102, 14, 49, 89,189, 2,146, 33,167, 34, 54,141,
+125, 0, 41, 58, 1, 37, 0, 51, 97,229, 96, 92, 43, 71, 51, 65,128,126, 85,139, 36,246, 95,202,128, 68,212, 88, 84, 84, 36,241,
+218, 26, 91,107,232,128, 96,128, 6, 14,156, 3,244,128,173,129, 39, 73,193,214,205,219, 66,168,226,176, 95,120, 87,120,183,113,
+211, 38,169,251,232,124, 58,211, 36,177,190,156, 97,225, 29, 0,108,157,157,152,155,220,118,235,201, 88,219, 15,247, 65,166, 38,
+ 38,210, 56,154,230, 79, 59,122,145,206,189,105,196,211, 22,207,150, 17, 79, 74,120, 67,170, 89, 76, 18, 81, 10,145, 28,152, 67,
+165,156,251, 10,155, 4,225, 96,202, 0, 16,152,135,117,204,234,218, 80,216,164,185,151,168, 91,105,218, 97,228,191, 51,118, 24,
+ 65, 8,192, 3, 57,200,169,150, 3,114,136, 24, 85, 79,219,178,125,121,245, 24,247, 86, 54,110, 57,125,233,216,225,233,201, 9,
+ 68, 77, 67, 34,105, 28,194,136,200,212, 59, 50,243, 8,188,243,140,205,247, 30, 58,206,162,143, 30,197, 52,113,127, 27, 78,176,
+230,180,176, 65, 23,115, 19,211, 12, 50, 38, 59,198,218, 74,241,212,192,144, 0,208, 52, 3, 61, 73,143, 44, 77, 21, 37, 51,150,
+168, 82, 75, 28, 10,135,200,178, 58,168,173, 45, 34, 83,250, 99,227, 51, 85,163, 18,211,198,143, 60,104,230, 75, 0, 35, 2, 2,
+ 58, 67,135,228,147,209, 33, 18, 32,205, 78,207, 85,160, 51,243, 27,142, 31,250,102,148,130, 8,139,140,203, 16,161, 1,170, 17,
+129,153, 57, 2,112,115,147,229, 69,219,183,222,254,224,161, 71,130,158,124,147, 6,229, 8,213,136,105,156,205,165,205,185, 7,
+ 45,151, 79,219,227, 68,108,140, 26,152, 16,190,156,201, 43, 33, 17,170,203,185,154,138, 73,148, 88, 73, 28,132, 24,122, 85, 21,
+ 98,108, 82,248, 84,222, 0, 97,147,210, 17,153,170, 34, 18,162,162, 1,158, 64,171,107, 79, 88, 0,128,102,178, 22, 9,208,147,
+ 43, 18,204, 55, 61,183,113,229,248, 81, 55, 49, 35,194,234, 76, 84, 17, 40, 79, 84,228, 3,128,200, 37,233, 59,152, 4,120,202,
+ 57,219,110,221,123, 80, 79, 22,218,154, 68, 49,107,208,184, 18, 89,126,152, 38,147,198, 51, 73, 48, 28, 79, 20,243, 37, 48, 3,
+ 55,205, 84, 85, 26,103,130,102, 78, 72,185,146, 88, 71,230,126, 21, 6,117,140,162, 9,112, 83,179, 36, 84, 2, 50, 26,241,131,
+ 1,128,193, 28, 16, 24, 0,129,169, 38, 9,230, 34,209,198,105,119, 96, 38, 6, 17,113,152,182,251,232,177, 35,155, 55,111,150,
+ 80, 5, 77,196, 90,200,211, 88,121, 47,140, 8,205, 80, 9, 29,144, 1,128,241,133,167,111,188,247,208, 98,219,224, 57, 49, 81,
+ 28,139,229,121, 68, 55, 69,255,166,162,110,146,184, 38,216,103,199,212,160, 87, 0,227,219,220,144, 34,145, 26,233,139, 74, 72,
+164,230, 58,114, 21, 67, 29, 89,213, 18, 12,128,169, 68, 66, 52, 50, 80, 66, 74,254, 76, 27,221, 82, 68, 32, 69, 18, 20, 84,194,
+ 53,124,202, 84,126, 36,158,119,242, 98,145, 69,205,134, 33, 30, 58,116,104,221,212,164,153,245,171,160,102,165, 55,239,156,195,
+ 92,176,166,225, 65, 2, 72,135,162, 24,209, 76,233,119,110,223,218,158,147, 53, 46,160, 84,180,231,124, 45,149, 93,173,171,206,
+163, 9,144,234, 15,107,207,111, 28,227,144,142, 33,160,163,147,124,198, 24, 24, 54,162,161, 7,230,116,216,165,136, 24,130, 67,
+114,142, 90,192, 2, 0, 0, 20, 45,183, 52,144, 80, 20,137, 72, 68,149, 76,156,170,168, 36,166,185, 53,171,108, 56,167,196,192,
+ 72, 44, 12,205, 40, 69, 37,140, 84,151,206, 1,104,136,156,170, 14, 77, 39,208,143, 99, 30, 13, 39,223, 57, 42, 77, 46, 94, 56,
+253,206,125, 7, 79,166, 65, 77, 93,106, 77,152, 79,248,103,190,211,168,146,154,102,216, 51, 21, 28,201,224,208, 18,132,148, 48,
+188,228,177,160, 97, 66,167,141, 77,228,120,102,137,170, 41, 63, 78, 58,239,243, 81,228,104,156, 12,148,204,192,153, 41, 33,169,
+ 17,162,145, 9,145,168,122,163,228, 77,204,155,142, 60,100,115,186, 79,161,162, 22,197, 23,158,163,168,119, 46, 48,171,170, 32,
+ 34, 82,158,182,161, 28,139,243, 39, 54, 24,121, 59, 0,227,156,235,128,156,185,113,110,255,241,149, 19, 75, 13, 27, 37, 62,109,
+ 14, 45,109,116,107, 13,208, 90, 51,108, 66,141, 90,142,112,144, 78,223,109, 77, 49,115,139, 19,253, 92, 84,141, 91,210,117,234,
+145, 18,122, 34,240,142, 4,193, 12, 60,145,128, 52,232,143,170, 17,170,115,168,106, 78, 19,132,214,124,182,142,183,238, 26,152,
+205, 76, 85,163,104,233, 89, 84, 67,225, 3,115,130,186,211, 7, 33,141,186,106,154,167,190,112, 52,205, 10,214, 76,163,227,166,
+217,201,238,176, 94, 30, 84,107,163, 88,158,168,201,185, 98, 83,181, 54, 82,131, 60,102, 15, 35, 74, 63,140,245, 57,155, 26,100,
+204, 53,140, 50,151, 92,242,154,182,140,107,128,212, 21, 41,188,145, 2, 35, 26, 0,170, 48, 18, 53, 24,152,161, 42,161, 26, 88,
+115,226,143,182, 0,194, 88,235,180,193,105, 33,145,224, 75,213,210, 59, 81,141,133, 79,230,156,182, 42,159,201, 75,148, 49,175,
+230, 52,163,182,161,144,207,156, 71, 64, 64, 2, 59,123,203,252,109,251, 14,167, 15,105, 76, 76, 88,243,160,141, 53, 71,227,229,
+220, 13,155,243,150,180, 37,101, 91, 83,218,235, 26, 6,119, 58,172, 48, 87, 6, 13, 27, 92,109,228,213, 91,217, 33, 66,242, 62,
+216,160,127, 44, 72,168,162, 40,152,210, 45,164, 36, 83,112,154,134,237, 40, 95,191, 61,176, 54,153,180, 54,243,249, 73,144,133,
+247, 34, 18,189, 20,236, 75,201, 13,129, 81,240, 64,104,164,131, 6, 99,125,109,204, 39, 66,166, 31,168,186,243,244, 77,203, 99,
+ 2, 18,205, 7, 43,107, 51,251, 35,201, 91,235,216,169, 95, 89, 34, 13,249,109,172, 81, 99,163, 84, 50, 13,230, 52,161, 78,155,
+ 81, 20,107,244,171, 77, 13,146, 62, 3,129, 3, 50,151,159,194,180, 58, 5,164,140, 92, 38,228,139,242, 32,164, 81,158, 27, 24,
+249,245,214,210,129, 80, 13,156,169,164,193,109, 18, 47, 20,137, 88,114,137, 96,163,110,226,201, 40,243,216, 52,100, 1, 0,177,
+112,184,113,106, 18, 0, 60, 32,152,138,198,160,105, 20,202, 56,127,253,102,231, 97,173, 77,173,169,140, 50,204,216,160,214,107,
+ 95, 26,191, 51, 82, 31, 88,123, 38, 37, 0,165,233,116, 66, 3, 2, 3, 75,224, 15,128,166,198,128, 26, 53,237,112,108,206,143,
+132,241,108,219,154,254,162, 25,154,161, 81, 35,129, 38,190,166,179,224, 19,234,150,253,243,216,137, 8, 99, 19, 19,205, 52,125,
+ 62,126,124,162, 44,218, 98,149,149,171, 20, 67, 27,209, 96,235,100, 70, 90,211, 58,197, 70,197,181, 61, 20,163, 33,168,228,131,
+ 68,154,103, 32, 25, 5,172, 57,138, 12,218,110,231,120,135, 1,113,237,144,189,225,216,241,158,227,147, 39,150, 24, 4,205, 95,
+179,212, 96, 25, 17,174, 41, 89, 40, 18,146,145, 26, 17, 17, 89, 54,206,172,206,216, 72, 24,173, 77,114,219,163, 7,210,248, 84,
+ 59,239, 3, 0,170,194, 28,218,184,160,185,152, 0, 61,241,140, 53,104,121, 58, 99,150, 53, 46,181,241,129,160,209,209,170,109,
+203,118,236, 37, 91,155, 47,229,110, 46,226,168,131,213, 72,176, 61,246, 52,255,155,239,102,172, 30,198,155, 95, 99, 77,194,156,
+210, 35,174, 61,190, 35,229, 64,169,143,155,168, 13, 0, 15, 91, 8,140, 55,250,147, 6,153,140,177,148,198,190,146,173, 61,138,
+110,220,196,224, 97,207, 52,190, 96,252, 72,187,118,122, 10,214,156,118, 55, 86,142, 54,165,234, 88,227,207,210, 49, 6, 9,224,
+109, 43,154,246,136,137,166,208,200, 77,206,209,100, 85, 83, 88,143, 55,164,109,212, 53, 28, 85,197, 77,163, 81, 1, 79,156, 55,
+ 67, 56, 65,220,190,217,173,124, 54,242,200,124,160,189, 51,230,107, 96,141,116,116,228,160, 96,220,107,218,248,255, 37, 97,172,
+153,126,226,106,218,239,156,150,142,185,163, 10,173,220,199, 88, 83, 10, 13,106,169, 13,255,101,236,115, 70, 9,189,141, 57,189,
+145,224,146,114,106, 91, 21,217, 88,131,118,188, 47,157, 93,244,216,255,223, 3,119,239,222,253,240,177,189,127,191,137,154,239,
+210,123, 79,241, 55,240, 17,185,234,246,127, 1,113,167, 34, 48, 36, 75,123,196, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 0};
+
diff --git a/source/blender/editors/datafiles/vertexdraw.png.c b/source/blender/editors/datafiles/vertexdraw.png.c
new file mode 100644
index 00000000000..65977d10d99
--- /dev/null
+++ b/source/blender/editors/datafiles/vertexdraw.png.c
@@ -0,0 +1,327 @@
+/* DataToC output of file <vertexdraw_png> */
+
+int datatoc_vertexdraw_png_size= 10253;
+char datatoc_vertexdraw_png[]= {
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73,
+ 72, 68, 82, 0, 0, 0, 96, 0, 0, 0, 96, 8, 2, 0, 0, 1, 26,253,208,249, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,143,
+ 11,252, 97, 5, 0, 0, 0, 6, 98, 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0,
+ 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 7, 21, 0, 4, 18, 61, 67, 90, 24, 0, 0,
+ 32, 0, 73, 68, 65, 84,120,218,237,125,105,176,101,215, 85,222,247,173,125,238,189,111,236,225,169,213,173,209,178, 60,202,150,
+ 44,100, 97, 25, 12,132, 36,101,187,138, 24, 76, 2, 21,243,131, 84, 2, 4,200,143, 36, 54, 96, 6,131,141, 73, 42, 6,131,147,
+144, 98,168, 2, 42,144, 64, 8, 73, 5,108,170, 24,138, 64,254, 0, 33,102, 50,120, 32,128, 53, 11, 73,150, 90,234,185,251,141,
+247,158,179,247,250,242, 99,239,125,206,185,175, 91,182, 12, 38, 85, 84,249,232,245,235,115, 79,223,123,238, 62,107,175,189,134,
+111,125,107, 11,248,116,143, 27,110,188,241,246,219, 95,116,245,117, 2,120,199,119,190, 51,165, 72,192,204,104,214, 52,205,164,
+105,154,201,228, 93,239,252,174,252,166,230,109,223,244,205,251,251,123,128,140, 70, 51,163, 29, 93, 59,119,244, 72,187,117,100,
+255,220,199,110,190,251,239,233,153,103, 78, 55,109,187,128, 0,192,130, 25,237,107,190,236,231,214, 39,190,126, 52,204, 38,112,
+226,173,255,242,159,255,171,127,253,190,166,235, 58,230, 47,246,240,166, 47,248, 95,237,194, 27,195, 74,244, 22,166, 78,187,123,
+120,215,187,190,187,137, 93, 36, 72,146,166,149,112,249, 96,145, 71,170, 73,240,143, 62,122,111,215,117,146, 55, 41, 69, 18,128,
+209,173, 75, 73, 11,200,121,229,242,230, 99,103, 94,254,224, 83,119,133,208, 66, 77, 19, 83, 52,144, 38, 82, 93, 84,234,120,255,
+227, 47,253,248, 19,175, 14, 33,132, 16, 37, 65,104, 60, 37,209, 12, 0,180,187, 63,253,179, 71, 63,231,217,139,183,134, 16, 33,
+ 65,128, 68,177, 73, 41,145,144,100,102,255,243,119,223, 72,154, 89, 4, 27, 32, 63,116, 3,198, 38,197,100, 38, 32, 72, 34, 41,
+ 37, 32, 48, 57, 4,128,206,100,110,207,107,186, 66,127,182,186,186,118,235,173,183,154,241,224,224,224,240,220,221,123,239,189,
+175,127,195, 27, 37, 25, 73,179, 16, 66,158,184,223,248,141, 95,255,221, 15,126,176,188,233,109,111,251, 38, 65, 68,158, 55,110,
+172, 45,182, 54, 15,142,108,182, 47,190,229,169, 87,188,232,201, 83,119, 61, 6,160,105,219, 22, 64,158,220,207,127,229,135,238,
+126,241, 67,235, 27, 88, 93, 51, 2,161,211,123,222,243,189,239,126,247,119, 55, 93,236,242,180, 76,154,116,251,205,247,207,163,
+ 77, 34,167, 9, 18,158, 56,119,115,219,182,223,251,125,239,109, 98,215,145, 70,226,182, 27,159,152,239, 33,206, 64, 66, 93,106,
+125,229,151,127,231, 13, 80, 43,160,137, 41, 25,221,204,166,182, 51,159, 35, 72,109, 27, 30,217,185,229, 79, 30,126,205,188, 69,
+104, 58,161, 78,139,220, 23, 45,218, 14, 93, 55,251,131, 63,255,226,221,249, 86,176,209,220,165,148,140, 46,179, 51, 23,183, 94,
+118,139,126,237, 15,222, 0, 76, 66, 72, 8,101, 94, 64,134, 59,238,120, 5, 0, 73,251,243,213, 7,158,188,195,157, 36, 72,129,
+ 16, 65,144,198,198, 61, 2,193,204, 0, 72,201,140, 41,137, 36,225,164, 57,221, 93,248, 76, 29, 28,191,248,230,111,121,251,250,
+218,186,202, 88,202,120,140,102,193, 72, 6, 11, 63,242, 35, 63,116,230,204,153,107,223,232,219,190,253, 59,146, 39, 8,112,229,
+219, 18,160,145, 48, 26, 1, 90,160,153,145, 12, 33, 24,205, 66, 48,179,151,223,246,196, 87,253,227,255, 56,190, 81,179,191,191,
+ 15, 8,245, 25, 57, 58, 64,220,113,219, 35,119,220,246,240,137,173,203,235,211,110, 26,212, 24, 44, 32, 24, 56, 11,231, 63,118,
+234, 39,127,253, 95,252,231,159,254,185,135, 31,122, 8, 64,211,181,109,255,144, 34,152,213,129,124,209, 77,143,127,225, 61,191,
+215, 72, 97,106, 74,136, 98, 8,102, 13, 28,136, 0,119, 83, 10,182,191,159,190,250,171,255, 81, 8,225,123,222,253,221,225,238,
+207,185, 91,238,238,114,185,242, 47,225,250, 99,207,190,230, 21,127, 96, 49, 38,154, 28, 2, 33, 73, 76, 9, 49,201,231,126,208,
+ 77,126,245,131, 95,114,121,119, 67,238,238,254,119, 95,255,250, 38,165,136, 60,149, 0, 13, 16, 73, 63,178,122, 78,222,206, 35,
+ 77, 48, 67,211,169, 93, 96, 18, 92, 12, 59,243,227,159, 56,243,130,199,159,125,209,238,254, 49,178,115, 51, 51, 75,238, 77,140,
+110, 44,211,103, 2, 96, 0,132, 69,156, 59, 72,139,226, 20,251, 62,221,222,221, 58,127,229,228,211,231,110,219,155, 31, 51,203,
+134, 44, 26, 45,175, 64,115,111, 60, 69,129, 52, 72,116,167,153, 36,108,239,173, 30, 36, 11,174,200,230,129,135,239, 60,125,225,
+230, 46,174, 17,180, 96, 68,103,193, 8, 11,193, 19, 45,208, 24,104,230, 77,140,201, 8,202, 64, 16,230, 81,164, 61,117,230,228,
+173, 39, 55,158, 58,251,130,199,159,185, 93, 50, 18,102,145,164,187,133, 64,119, 11,102, 46,154,153, 72,202,130,133, 38,165,228,
+ 36, 93, 36,204,156, 52, 41, 45,218,201,111,127,248,139, 0,146, 34,147, 68, 9,102,249, 31,205, 12, 74, 50,152, 36, 89, 48, 56,
+193, 38,121,178,170, 56,217, 10,102,193,231,195,204, 0, 26, 37, 10, 48,130, 36, 40,201,140,142,178, 40, 17,196,207,220, 90,251,
+235, 89,180,253,113,252,248,241, 99,199,142, 3, 88, 44,230,151, 47, 95,222,223,223,255, 52,110,244,146,151,190,244, 45,111,249,
+170,162,153,245,175,188,244,205, 44,132,112,249,242,149,127,247,111,127,224,147,221,232, 59,191,235,157,158, 92,217, 30,150,213,
+111,204,183,179,114,132,124, 51, 11,205,164,121,199,119,124,251, 53,252,205,219,191,245,219, 82, 76,201,147,123,146,187, 75,202,
+ 38, 19,146, 60,255, 5,244,103,114,247,175,251,234, 59, 94,126,199,237, 31,252,189, 63, 95, 50, 35, 49,198,252,217,108,127,139,
+ 30,176,140, 8,196,145,149,253,245,217, 98,182, 26, 87,167,113,117,165,187,233,196,153,151,221,252, 23, 95,242, 58,188,241,139,
+255,225,235,223,252,129,165, 27, 65,131, 22,176, 40,149, 19,156, 77,187,151,190,224,177, 59, 94,248,200,169,173, 11, 43, 84, 51,
+ 65, 19, 64,194,102,198,104,106, 15,126,224,125,239,253,206,119,188,179,104,156,167,228,163, 35,219, 18,185,111,172, 92,122,205,
+ 29,191,255,185, 47,251,195,227, 43,231,208,185, 55, 84, 99, 41, 88,164,197,136, 36,135,230, 30, 23,223,255,253,239, 43, 55, 74,
+195,225,238,158,207, 54, 86, 47,222,126,243,195,183,156,124,220,219,212,137, 29,204, 29, 18, 36,128,240,133, 47,156,139,136,249,
+130,109,215,190,245,109,111, 3,208,184, 60, 7, 52,128, 1, 2,140,244,235,142,156, 57,181,245,148, 60,117,193,224,112, 87,114,
+166,122, 47, 38,156,187,178,117,113,231,136,123, 66,212,137,235, 78, 16, 53, 40,161, 8, 38,130, 52, 63,178,126,101, 99,245,242,
+204,246,227, 66, 97, 38,146, 22, 97, 45, 36, 5, 83, 72,234, 82,120,232,137, 23, 62,113,250,134,148, 82,158,168,247,124,223,247,
+ 53,114, 87, 86,190,108,251,221,166, 97,127,210, 28, 0, 93, 76,240, 14, 53,160,145, 58, 5, 67,139,233,163, 79,189,228,241,103,
+110,222,222, 91, 7,147, 36,144,109,219, 54, 82,126,167, 75,150,173, 27,173, 53,182,201, 5,193, 45, 79,169,156, 64,208,246, 98,
+235, 19,103,111,125,242,236,109, 87,118,143,184,100,116, 24, 16, 99,118,236, 78, 82,128, 89,242, 98, 23,146, 39,119, 7, 36, 38,
+119, 55, 73,243, 56,189,188,127,226,194,149, 83, 79,158,125,225,254,124, 83,160, 89, 18,203, 4, 0,177, 17, 36,151, 25,220, 13,
+144, 25, 83, 66,114,164, 86,110, 12, 2, 39,190,179, 88,187,184,125,242,161, 79,220,113,101,247,132, 25, 73,208, 92,110,193,228,
+238,121,157, 53, 74, 14,163, 59,128, 68,154,187,220,225,174, 72, 50, 42, 25,219,118,237,145,167, 94,246,232,233,151, 25, 73, 75,
+146,153,201,100, 48, 37,193,148,151,189, 26,135,224, 78,152, 25, 92, 78,113,209, 54,109, 55,137, 17, 38,155,119, 43,247, 63,113,
+231,233,179,183,130, 78, 35, 72, 41, 57, 2,204, 41, 18,132, 19, 36,224,141, 39, 55,131, 32,119, 0,162,217,254,124,186,123,176,
+210,117, 77,114,251,147, 71,239, 62,123,241, 6, 51, 25,229,130,185, 59, 73,185,220, 12, 32, 29, 70, 56,136,208, 72, 74, 14,194,
+ 73,152,153,187,239,205, 87,183,247,214,207, 92, 58,113,230,226, 13,103, 46,156,202,161,111, 74,201, 44, 64, 78, 51,202,205, 36,
+ 25, 76, 14, 35,232, 84,163,236,146, 73,129, 46, 17,136,209, 30, 63,253,130, 39, 78,223, 6,102, 55, 39, 51, 35, 33,185,211,204,
+ 29,102,238,128, 57, 21, 76,229,104, 92, 78, 90,190, 5,220, 85, 60, 7, 92, 78,208,157, 36,221,243, 64,100,144,172,196, 79, 18,
+168, 98,183, 36,111,228, 2,135,207, 3, 40,114,168,182, 69,146, 89,160,202, 58,203,250, 73, 65,132,160,124, 42,161,145, 28, 32,
+ 65,119,207, 1, 85,190,209,232, 94,148,242,136, 77, 46,145,176,242, 33,151, 2, 74, 50,129,207, 30,127, 41, 63,219, 31, 47,122,
+209,139, 95,249,202, 87,222,254,226, 23,111, 29, 63, 62, 92,149, 80,189,168,101, 95, 97, 52,218,229,203,151, 31,122,232,193, 63,
+253,211,255,251,232,163,143,126,102, 6,180,177,177,241,150,183,124,213,141, 55,222,228,238, 26, 2,102, 1,172,241, 55,203,233,
+224,215,135,195,134, 51, 51, 26,136,102, 50,249,192, 47,252,194, 31,255,241, 31,233,121, 43, 7,223,252,230, 55,191,242,149,119,
+122,113,199,121, 16, 75,159,102, 13,226,135, 65,244,113,253,225, 33,229,132, 99, 24, 86, 29,168,153,241,186,163, 79,191,239,223,
+255,252,163,143,157,253,228, 3,106, 94,252,146,151, 45, 22,109,149,199, 53, 30,132,125,114, 3, 30, 26, 77,142,124, 86,103, 11,
+ 51, 77,155, 24, 2,154, 38, 53, 65,193,208, 4, 15,166,233,180, 51, 98,107,243, 74,104,240,194, 27, 63,241,134,159, 63,233,126,
+115,210,234,189,175,255,208,222, 94,188,246,128, 82,236,234, 32,134,164,102, 52, 26,106,105, 64,195,228, 53, 22, 79,109,157, 13,
+ 65,183,156, 60, 61,105,210,145,141,221,198,212,152, 7, 34, 24,130,137,166,208,184, 25, 86,155,133, 5,172,109,204,141, 18, 27,
+ 34,252,210,207,126,233, 71, 30,121,221, 79,254,212, 79, 61,242,240, 35,135, 7, 20, 83,186,246,234, 39,178,201, 44, 66, 97,157,
+ 34,104, 58,105, 79, 28,189, 48,157,116, 47,186,249,241, 96,186,238,200,197, 73,240,181,149,197,100,226, 77, 80, 8, 52, 67,254,
+225,224,186,243,147,200, 98, 7, 25,113,144,210,193,215,125,237, 63,177, 48,251,137, 31,255,177, 39,158,120, 98, 44,161,248, 92,
+234,110,160, 19,132,209, 4, 39,141,193,226,108,210, 30, 93,223,126,241, 45, 15, 78, 39,241,134,173,179, 77,147, 2, 96, 0, 65,
+ 37,120, 0, 41, 6,138,148,101, 91, 12,119, 0, 8,169,248,124,163, 98, 74,177,139, 32, 82,106,191,225, 27,255,217,116, 50,125,
+199, 59, 74, 60, 26, 94,125,239,189,197,114, 87,228,165, 8, 76, 24, 20,171,196,159, 56,190,113,241,212,214,179,215, 31, 63,251,
+194, 27, 30, 95, 91,217,181,148,224, 72, 52, 25, 65,184, 85, 61, 46,107,129, 99,173, 84, 43, 37, 44,124, 18,221, 78,159,191,241,
+ 19,103,110,117,207,254, 66,201,211, 27, 94,255,198,211,167, 79,159, 63,127, 62,220,115,207,171, 75,214,153,255,228, 55,161,198,
+193,101, 60, 48,139,193,186, 83, 91,207,188,232,166, 71,143,174, 95,158, 78, 22,217, 30,168,100, 51, 5,189, 82,191, 16, 36, 1,
+ 41, 49, 57,146, 35,185,148,152,132,243, 87,182, 46,110, 31,123,230,220,169,115,151, 79,244,129,118,126,218, 87,189,234,110, 51,
+ 54, 57,250, 41, 83,237, 69,200,249, 76, 20, 1, 23, 65, 30,221,188,180, 50,105, 55,215, 46, 77,155,125,163,167,133, 0,113, 98,
+ 38,152, 36,135, 11,202,193,101,163,152,104,164, 25, 72,145,176,232, 34, 58, 76, 8,220,255, 23, 47,121,246,194, 13,251,237,122,
+ 74,201,204, 82,137,228,149, 17,167,191,245,197,127,187,113, 79,200,174, 63,231,250,121, 28, 78, 81,217, 34, 10,132, 48, 13, 7,
+235, 43,187, 43,211, 61,179, 5,201,152,161, 52,194, 12,150,127, 59,220,196,196, 24, 25,204,131,148,195, 48,128, 11,173,200,237,
+207, 30,187,107,190, 88,125,230,226, 77,123,243, 13, 22,151,170,154, 92,144, 53, 60,109,178,184,212,203, 60,139,136,130, 51,143,
+134,112,137,134,174,105, 22,242,228, 46, 51,165,148, 83, 12, 73, 76, 0,137, 96,136, 68, 67, 23,225,134, 72,116, 62,189,176,115,
+ 34,122,243,241,199,238, 74,106,182,119,143, 58, 2,101,180, 36,102, 76,129,198,113, 70, 75, 74,141, 39, 87, 1,145,144,129, 39,
+ 64, 40,177, 45, 80,174,192,225, 41, 42,117, 74,173, 84,140, 34,232, 50,115, 52, 70, 66, 9, 6,236,182,235,173,175, 92,186,178,
+245,196,153, 23, 38,159, 92,222,221,234, 13, 7, 73,208, 9, 49, 35, 11,148,193,220, 82, 73,222,129, 60,119, 77,146, 8,135,242,
+ 10, 47, 33, 21,137, 18,226,231, 19, 89, 86, 79, 39, 18, 24,133,160, 1, 90,138,177, 1,241,244,217, 23,204,219,213,179,151,110,
+184,180,179, 69, 88,245, 41, 9,164, 21,155,110, 25,111,161,140, 76,160, 1,137,178, 60, 16,166,140, 61,176,129,187, 50, 16,151,
+131, 38, 48, 71, 77, 32,229,142, 12,213,201,219, 69,216,231,202,124,165,233, 18,141, 66,130, 12, 81, 19,239,194, 99, 79,191,184,
+243,233,217,139, 55,180,221,170, 96,128, 8,207, 32, 67,214,144,148, 49, 96,129,132, 18,105,137, 50,230, 48, 18, 9, 32, 83, 69,
+169,220,178,132,242, 28,145,112,215, 32, 29, 12, 23, 56,111,167, 14,109, 46,166,237,188,177,224,147,105,108,219,233,131, 79,188,
+220,213,156,189,116, 42,169, 73,113, 34,128,116,210, 72, 33,209, 12, 25,143, 41, 56, 20,208, 79,117,214, 16, 32,199, 4,213, 45,
+131, 52, 52, 89, 12,164,220, 11, 34,153,255,146, 4, 25,152, 77,155, 14, 22,179, 54, 54,251,235,171,139, 56,105,231,147,157,115,
+155, 93,156, 61,125,254, 70,201,186, 56, 43,120, 28, 93, 2, 41, 51, 3,228, 78, 34,201, 12,144,156,198, 36, 24, 1, 57, 72, 81,
+164,165,156, 47,200,100,158,191,203, 27, 73,128,103,241,102,113,176,106,143,224,134, 18, 17,207,219,134, 54, 57,119,105,171,139,
+ 22, 83,179,187,191,225, 8,243,197,172,132, 74,114, 51,147,148,141, 65,114,103, 70,178, 0,131,231, 5,233, 4,225, 48, 72,102,
+132,144,165,227, 14,210, 41,203,107, 8,141,123,158, 64,185,203,140,238, 50, 51,185,231,167, 76,158,167, 0,238,130,235,226,246,
+241,139,219,199, 48, 40,189,114,242, 84, 84, 63,231,109,114, 18, 52,203,171, 67,146, 96,150,197, 98,130, 91,137,250, 9,119,208,
+250, 32, 84, 57,167,111, 84,133, 75,148,101,239,238,203,201,135,163,202, 73, 74,121, 58, 49, 88, 50,193, 29,245, 75,114, 86, 33,
+ 21, 97, 11,114, 89,249,234, 28, 62,100,111, 84, 66, 9,168,228,172, 40,247, 7, 26,165, 4, 82, 61,234, 72,100,155,213,155,209,
+113, 54,147, 95,246,177,107, 54,255,238,110,101, 77, 9,178, 98,225, 64,129, 20, 97,229, 59,243,146, 5, 85,131, 98, 72, 57,198,
+ 41, 3, 98, 25, 80,241,200,204,210, 44, 83,214, 63,125, 29,123, 47,216,241,149,154, 38,194, 29,200,174,102, 56, 43,190,133,130,
+ 74, 84,151, 61,145,103,188, 81,148,156, 5,185, 45,177, 5, 63, 85,206,241,217,227,179,199, 95, 61,115, 29, 98,239, 73,179,182,
+186, 54,157, 78, 87, 86, 86, 39,147, 73,190, 24, 99, 55,159, 47, 22,139,249,222,222, 94,202, 17,201, 95,235,128, 38,147,201, 61,
+247,188,250,142, 87,188,226,182, 23,220, 22,154, 90,113, 20, 97, 37,248, 46, 41, 32,153, 23,230, 99,143, 61,118,255,199,255,252,
+195, 31,254,112, 91, 11, 60,159,177, 1,125,233,151,189,249,206, 59,239,156, 52, 19,245,184,113,205,164, 71, 9, 53,171, 99, 44,
+ 25, 62,128, 16, 2,141,109,219,126,244, 35, 31,249,229, 95,254,165,191,210,128,154,166,185,243,206, 59,223,244,166, 47, 85,111,
+105,132,190,138,216,167,244,227, 12,127, 57,179, 95, 78,237, 73, 51,219,222,222,254,145, 31,254,161,189,189,189, 79,111, 64, 91,
+ 91, 91,111,122,211,155,110,186,233, 22,176, 31,202, 85,233,253, 56,177, 31,253,126,206, 49,229,232, 20, 8, 77, 56,123,230,204,
+127,249,153,159,185,120,241,226,243, 26,208, 91,223,250,214,213,213,117,151, 47, 37, 98,135, 4, 88,234,132, 28,101,245,163, 9,
+203, 69,137, 82,219,180,101, 36,164,192, 53, 27,171,237,233,167, 62,252,190, 31,252,149, 79, 57, 32,155,206, 86, 98,140,238, 30,
+ 61,142,112,253,242,227,185,124,225, 46, 87,146, 75, 42, 5,141,148, 95,186,114,137, 35,213,178, 98, 74,249, 83,201, 61,185,187,
+146,167,228, 41, 9,139,123,239, 62,249, 63,254,235,219, 54, 55,215, 62,197,114, 78, 41,245, 46,202,175, 57,163,117,106,144, 33,
+215, 94, 60, 14, 7, 67,227,211,105,219, 24, 38, 77, 52,195,180,233, 44,112, 26, 18,200,217, 52, 26,181,190, 58, 95, 95, 57,216,
+ 88,219,191,229,212,179, 52,251,232,111,222,249,227, 63,125,246, 7,127,236,137,231,164, 15,188,246,243, 62,175,166,173, 37, 56,
+ 28,126,164,171,214,225,216,209, 2, 98,176, 52, 9, 29,169,105,211, 5,243,166,137,193, 20, 66,108, 66,154, 78, 22, 77,147,214,
+ 87,246,214,215,118, 55, 87,119, 79,110,158,157,134,118,182, 50,127,237,189,235, 92,251,251,191,255,251, 31,185,182,132,212, 87,
+207,135,149,181, 4,128, 92,195, 11, 11,130,142, 31,185,180,190,122,112,116,125,231,186, 99,151,154,224, 71,215,119,205,208,192,
+205, 24,130,140, 8, 19, 15,166, 73,136,147, 16,155,153,115,218, 10, 13, 32,122,123,219,173, 55,188,247,189,239,121,231, 59,223,
+125,173, 41,203,216,196,115, 32, 50, 89,111, 75, 86,189,100,139,184, 50, 61,216, 88,217, 62,186,121,249,196,209,179,211, 73, 58,
+190,126,197, 26, 76,160, 96,176, 80,128,152,156,215,150,236, 7, 70, 70,180,169,139,141, 43,146,211,127,243,158,247,124,207,187,
+ 15,143,201, 84, 10, 83,159,244,200,117,190,250,174,173,163,231,110,220,122,250,198,173,167, 78, 93,119,250,248,250,249,153, 29,
+ 76, 57, 23, 32,135,136, 68, 58, 40,163,140, 34, 19,232,164,131,121,113, 0, 14, 36, 41, 18,110,102,223,249, 93,239,188,106, 64,
+207, 53,158,130,192,104,128,217, 43, 62,114,234,216,233, 23,156,124,252,198,235,159,190,229,228,147,215, 31, 59,187, 58,221,155,
+ 77, 14,144,156,201,221,152,211,101, 25, 17,202,185,147, 9, 76,137, 74,144, 18, 20,225,238,158, 32,223,220,216,252,250,111,248,
+198,165, 1,249,115, 28, 82, 46,197,200,229,240,188,216,125,214,236,175, 76,247,103,211,249,116,122,208,216,194,144, 98,162, 92,
+238,116, 49, 11,105,124, 36,135, 11, 73,200, 79, 29,165, 14,150,132,232, 74, 73, 41,121,242,116,251, 11,111,127,205,107,238, 27,
+ 41,245,115,225,121,158,211,146,250,155,128,252,250, 99,103, 66, 19,111, 57,245,228,250,202, 62,129,212,194, 76,113, 98,129, 18,
+ 13,228, 20,144, 59,130,229,187, 86, 52, 16, 18,208,194, 13, 9,161, 85,232, 98,104, 99, 48, 42, 87,180,190,226, 43,191,242,227,
+ 31,255,243, 92,117,182, 49,124, 86, 17,180, 90,140,132,132, 98,193,243,149, 16,218, 73, 88,120,100, 74,148, 35,195, 66,238,112,
+103, 6,189, 92,144,152,215,173,251,240,163, 34, 42, 38,103, 76,148,187,202, 31,151,123,140,241, 91,222,254,173, 85, 66, 99, 70,
+ 9,160,188,202,115,113, 69,176, 28,164, 11, 77,232, 38, 77,119,219, 13,127, 49,157,180, 43, 43,123, 57,173, 72,102, 36,130,195,
+ 11,197,128,238,185,246,165, 84, 97,210,190,210,204,164, 46,134,179,219, 39,218,110,214, 37, 43, 5, 47,152,220,131,217,108, 54,
+187,239,190,215,254,209, 31,125,200,198,238,162, 40,183, 23, 23, 33, 87,207, 53, 1, 28,244, 92,201,141,157,185, 35, 57,139,119,
+144, 60,193,157,238,202,149, 68, 47,213, 90,197, 84,240, 60, 23, 28,140,145, 49,134, 24,131,138, 91, 42, 18, 74,238,114,253,131,
+175,248, 10,146, 77,133,168, 74,226,227, 37,129, 25, 1, 68,162,133,116,108,227,226,116,210,173,205,246, 38,147, 22,158,212, 58,
+ 38,116,163,185,188,162, 26,116,128, 98,130, 68, 43, 80,148,211, 1, 87,162,165, 20,118, 15,214, 63,246,224,171,146, 55,109, 23,
+114, 21, 31, 48, 7,204, 61, 1,106,245,230, 47,255,242, 6,130,224,168, 73,111, 6,175, 0,170,242,139,178, 46, 17, 9,200,166,
+132, 34, 28,164, 23,132, 33, 87, 8,225, 96, 2,129, 8,152, 43, 4,122,198, 61, 92, 25,142,139, 98, 76, 60,104, 39, 41, 53,238,
+ 2, 4, 7,232, 48, 10, 6, 73,240,251,238,123,109, 3,121,117, 25,172,169,100,245, 23,217,167,153,192,180, 50,219,159, 54,209,
+216, 25,163,164,148, 51,211, 4, 51,144, 68, 18,192, 4, 73, 12, 66,227, 66, 80,134, 88, 58, 52, 73,205,206,254,198,147,207,190,
+160,237,102,151,182,143, 58,130, 59, 65, 55,154, 4, 58,100, 10,238, 78, 75, 41, 53, 46,101,208,211,107,182, 93,240, 69, 17, 57,
+ 67,119, 66,110, 22,205, 58,192,115, 93, 48,235,173, 5,184,128, 4, 4, 32,121,206,237,165,156,243,150, 0, 51,138, 9,152,183,
+147,203, 59,155,109,156,181,109, 3, 22, 68,222, 11,132, 72, 56,220,140,112, 58, 27, 1,116, 56,139,238, 64, 89, 39,144,223,143,
+194,165, 81, 64, 52,166,146, 72,139,146,104, 76, 9,102,117, 61, 26, 67, 33, 19, 42, 2, 38,236,118, 27,209, 39, 87,118,142, 93,
+222, 61,118,176, 88, 59,115,241,132,100, 25,184,224, 82,216, 0,154, 50, 76, 37,178, 41,152, 98, 30,151, 88,145,106,185,148,225,
+ 90, 56, 36, 89,136,100, 89,119,116, 9,185, 72,174,148, 96, 70, 21,109,227,196, 61, 5,203,211,189,119,176,210,198,233,179, 23,
+174, 63,115,241, 84,244,233,206,254, 17,203,136, 97, 38,100,141,216,149, 46, 89, 85,154,166, 56, 46, 14,161, 6, 74, 53, 54, 95,
+201,236, 22,121,130,215,101,159, 28, 36, 61, 9,150, 81,191, 98,145,205,185, 31,167,164, 93,217, 63, 14,242,226,238,117, 93, 55,
+187,178,187, 49, 95, 76,162, 38,114,247, 26,132,231, 53, 1,150,159,130,226,153,185,123,227, 69,125,157,158,225,242,170, 58,117,
+214,202, 68, 66, 46, 42,149,233, 34, 51,220, 2,132, 76,146,162,146, 34,108,123,190, 9,183, 7, 62,241,210, 69,183,186,189,119,
+172, 75,179, 62,218,228,128,131, 28,154,179, 97, 45, 75,106, 32, 40, 43, 81,133,133, 51,110,141,188,238,153,203, 12,217,241,187,
+171, 64, 76, 82, 22,185,228, 52, 67, 20, 23,221,170, 20,182,119,215,221,155, 69, 59,233,146, 37, 7,228, 26, 96, 25,100,164,198,
+150,199, 97,168, 40,145,187,178,115,205,201, 79,157,161,172, 80,229, 78, 4, 92,114, 71, 76,141,209,157, 76,102,140, 3,132,233,
+ 8,105, 30,218,184,250,212,217, 91,186, 52,121,252,153,151, 72,161,175,174, 25, 11,167,132, 68, 94,227, 20,189,100, 42,133,150,
+ 83,148,217, 44,163, 90, 86, 6, 86, 32,115,212,177,246, 39,222, 43, 94,242, 44,213, 84, 29, 42, 28,236, 34,163,135,182, 11,109,
+215,116, 93,227, 9, 62, 68, 87,240, 10, 30,150, 20, 98,200,250, 84,210, 81, 13,215,242, 89, 83, 12,114,111, 20,170,134,149, 57,
+203, 39,142,131,118, 58, 73,150,156, 72, 33,192, 33,117,104,208,217,165,221,173,103,207,223,212,198,217,153, 75, 55, 0, 6,101,
+100,176,208, 84,160,161, 90, 82, 88, 74,125,230,224,189,144, 6,247, 78,247, 70, 2,251,209, 20,171,205, 76, 9,129, 21, 48, 63,
+ 19,132,242,218,115, 21, 0, 81,160, 8,119,107, 83,104,213,164, 20, 64, 88,182, 27, 48, 65, 86, 22,173,101, 68,209, 74,117,201,
+ 29,153,132,162, 28, 64, 51,219,234, 18, 91,176, 41, 64, 97,173,191, 17, 61,162, 58,130, 94,101, 7,243, 89,215,132,197,124, 50,
+153, 68, 78,220, 26,157,126,230,198, 75,187, 91,123, 7,235,151,247,142, 75,150,165,226,162,153,128,252, 53, 52, 1,200, 72, 98,
+169, 83, 8, 48, 20,108, 26,197,208,101,104, 50,211,116,100,133,170,147, 63, 49,210,155, 60,206, 30,128,118,167,187, 57,173,200,
+ 41,162,141,205,124, 49,155,119,211,174,155,196, 24,170,182,148,180,106, 80, 22, 64, 37,178, 29, 49,248,176, 84, 75, 28,200, 49,
+ 21,133, 5, 80,172, 91,134,207, 85, 42, 66, 5,173,118, 15,123,139,181, 73,236,218,174,145,116,246,210,245, 73,225,204,133,147,
+ 87,246,142, 58, 38,133,187,233, 62,192,183,249,129,145,167, 65,185,162,224, 69, 95, 40,136,162,155,204,145, 45,116,149, 19,205,
+115,105,161, 47,220,229, 53, 56, 64, 49,142, 74,208,233, 98,128,171,139, 13,128,189,249, 90,219,205,246, 22,171,139,110,198, 90,
+247,203,163, 55,179, 92,166, 48,119,229, 18,128,104,230,101, 76,132,101, 8,154,164,155, 83, 86,236,114,161,106, 85, 9,149, 18,
+ 80,177,136, 69, 72,165, 40,147,215, 43, 99,108, 20,236,233,115, 55, 5,243,157,189, 13, 87,104,187,105,246, 57,101, 17, 1, 44,
+ 48,119, 14,117,104,244,140,161,103, 38,148,100,204,223,145, 11, 40,244, 10,170,203,229,134, 82,229,111, 84,220, 4,114,225,161,
+175,120,148,139,131, 49, 64,231,225,137,103,110,205,201,132,161,134, 7, 82, 79, 7,169, 92, 61, 24,242,210,133,229, 18, 65, 25,
+ 83,153, 6,214,143, 20,207,153, 89, 6,217, 57,187,172,175,137,103, 86, 87,175,136,210, 48, 26,175,225,246,144,214,192, 7,128,
+ 77, 35,251, 9,175,110,202, 7, 15, 5,229, 8, 20, 18,115,249, 26,114, 21,104, 99, 72,123,106,253, 5,153,173, 95, 77,106,191,
+202, 60,155,203, 98, 19,202,244,229, 53,234, 82,149, 95,173,137,214,199, 96,125, 42,148,194, 87, 78,177, 29,101, 40, 78, 9,197,
+166,245, 5,232,146,125, 65,146,245,143,146, 31, 50,187,214,234, 77,134, 60,180,207, 77,208,179, 45,135,122, 8,235, 51,148,240,
+ 46,143,173, 60, 64,249,126,228,202, 37,203,215, 21,146, 66, 97,236,194,107, 59, 11, 77,125,108,145,139, 98,144,215,137,235,197,
+208, 87,134,178,210,244, 19, 52,146,101,249,108,127,162,124, 82,244, 97, 36, 45,176,210,235, 6, 0,136, 98,149,147,108,217, 9,
+142,109, 26,234,224,112, 24,134,184,106, 52, 88,134, 38, 85, 34,188, 58,139,121, 24,234,171,111,101, 26, 71, 67, 82,159, 50, 91,
+ 22, 89,193, 14,203,148, 97,108,115,243,128,250, 44,178, 87,243,193,107,231,224,179,143,177,170, 14, 12,177, 67, 63, 81,101,241,
+140,240,102,244,106, 84,230,208, 70,232, 93,209, 71,119, 31, 97,124,234,149,186,183,126, 99,166, 99,173,151, 57, 7, 44,185, 40,
+120, 14, 13,133,156,198,169,215,154,161,102, 7,105, 25,179,251, 44,139,241,179,199,103,143,207, 30,127, 67,234,173,159,236, 22,
+228,198,230,230,145,205,205,245,245,141,163,199,142,110, 29,223, 58,122,236,216,209, 35, 71,214,214, 55,214,215, 87,167,211, 25,
+ 43,147,105,196, 36, 28,138, 22, 49,198,131,131,253,237,157,237,157,157,221,179,103,207,236,238,236, 94,217,190,178,179,189,125,
+249,242,229,157,157,157,191,121, 2, 90, 91, 91,123,201, 75, 95,118,243,205, 55,159, 58,121,242,232,209, 99,107,235,107, 77,211,
+ 64,215,226,208,142,234,179, 87, 21, 79,150, 79, 70, 28,181, 67,124,232, 24,227,254,222,254,149,237, 43,167, 79, 63,253,208,131,
+ 15, 62,252,208, 67,241, 51, 84,249,254,140, 9,232,228,201,147,175,190,247,222,187,238,186,123, 54,155,170, 39,150, 60,159,251,
+170, 4,202, 35, 92,170,188,100, 37,147,229,232, 58,215,146,251, 98,233,184,160, 91,122, 57, 89,234,171,130,114, 87,215,147, 79,
+ 62,241,219,191,245, 91, 15, 60,112,255, 40,110,254,255, 34,160,141,141,141, 83,167, 78,189,234, 85,119,191,228, 37, 47,181, 38,
+ 24, 77,125, 97,120, 20, 27, 28,146, 17,175,169, 52,228,161, 18,242,232,229, 85, 28,250,171,127, 47,119,205,177,100, 57, 67, 37,
+186,175,197, 95,186,116,233,255,252,206,255,126,224,129, 7, 46, 92,184,240,215, 34,160,147, 39, 79,222,121,231,157,183,223,126,
+251,201, 83,167, 74,227,146,180, 44, 20,125,242,168,137, 99,131, 52,178, 52,227,235, 75,198, 7,215,160,245, 95,147, 12,240,169,
+ 46,178,240,185,104, 22, 12,192,233,167, 31,253,200,135,255,224, 67, 31,250,179,182,251, 12,113, 80,222,245,174,119, 45,218,110,
+ 32,114, 31,138,211,245,252,226,201, 37,133, 33,175,190,120,141,183, 29,162,109,124, 18, 85, 58, 68, 93, 88, 34,213, 86,157, 42,
+157,149,107, 43,251, 91, 71,174, 76, 38,233,224,160,251,165, 95,253,200,175,252,218, 31,255, 85, 5,244,246,111,253, 54,141,153,
+238,207,169, 47, 87, 89,158,113,105,122, 89, 46,163,139, 87,171,210,242, 34, 36, 72, 24, 43,237,152, 50, 86,112,180,252, 83,145,
+131, 81,134,194,118, 36, 21,130,122, 21,106, 66, 10,150,204, 72,106,125,229,224,196,177, 11,179,105, 36,152, 60,116,105,109,239,
+192,255,195,143,254,230, 31,254,241, 51,127, 57, 99,213, 20, 58,212,161,214,146,107, 85, 95,117,200, 98,169,112,154, 56,124,134,
+188,250,125, 42, 20,202, 30,215, 40,133,255, 66, 96, 68,104,226,116,210, 25, 5, 34, 80, 77, 19,131, 57, 65, 35,154, 38,133,144,
+202, 66, 50, 53,150,169,171, 8,196,100,210,101, 9,134,224,235,179,253,141,181,189,252,158,141,149,189, 83, 71,207,207,166, 45,
+ 50,252, 76, 35,237,239,252,244,230, 65,119,195,207,126, 96,250, 67, 63,241,240,249,243, 23, 63, 61, 1,105,188, 57,193,115,180,
+ 17,233,147,172, 44, 93,245,106,124, 81,215,188,138, 16, 98, 8, 41,131,170,147, 73, 92,153, 45,242,195, 7,211,108,178, 48, 2,
+132, 17,193, 60, 4,207,134, 39,208, 45, 40,131, 81, 52, 53,150, 26, 19, 32, 11, 90,155, 30, 76,195,194,232, 36, 38, 54, 39, 91,
+176, 19, 67, 41,191,137, 64,100,180,215,221,119,251,230,117, 95,114,230,124,122,255, 47,252,252,195, 15, 63,252,188, 53,104,153,
+238,193, 81,122,123,237, 11,117,161,148,166,134,220, 69, 64, 1, 21, 29,100,253,215,113,129,187,255, 8, 48,157,180,215,109, 94,
+216,220,216, 11,150,140, 58,186,177,125,221,209,139, 77, 19,131,161,177,184,190,118, 48,177,206, 8, 26,140, 40,125, 43,203, 63,
+ 0, 66, 63, 96, 67,174, 91,100,232,141,185,168, 89,128, 85,162, 3, 68,209, 12, 1,222, 18,237,145,141,213,111,252,134,175, 77,
+194,127,250,169,159,121,228,145,135,159,151, 6, 93,165, 41,207,145,240, 95,131,165,147, 91, 61,180,180,172,134,122,237,184, 74,
+ 8, 50,102,163,106,214, 77,154,182,177,121, 99, 10,150, 26,107,205, 34,145, 32, 26, 19,114, 17, 62,228, 77, 36, 96,133,157, 92,
+154,157, 32, 24,203,164, 89,207,128, 7,232,181,198, 37,106, 82,192,226, 33,152,146, 67,209, 61,165,220, 49,239, 9, 8,255,244,
+ 27,190,126,127,111,255, 3,239,127,255, 3, 15,220,255, 73, 5, 52,248,171, 67, 79,121, 85,248,123, 85,227, 89,207, 70,206,165,
+184,210,169,207, 81, 69,142,101,149,109,174,108,223,124,226,244,218,108, 95,228,108,210,158, 56,126,225,200,198, 54, 5, 26, 2,
+ 20,232,217, 78, 91,128, 81, 20, 24, 69, 66, 13, 20,138,108, 50,170,198, 92,211, 45, 56,113, 97, 35,249,208, 25, 3, 16,150, 10,
+106,101, 25, 8, 76,185, 0, 22,137, 88,200, 56,160,224, 41,249,202,202,202,215,124,205,215,158,126,230,244,127,255,111, 63,247,
+ 92, 49, 84,248,220,215,188, 70, 24, 67, 71,122, 14,155,179,244, 79, 61, 25, 77,207, 29,143,247, 36, 54, 66,211,233,252,216,198,
+229,217,244,192, 44, 77,154,184,185,182,179, 50,157,195,100,230,141, 37, 74,165,219, 5,165,207, 2,130, 81, 8,165,181,133, 86,
+156,159,245,123,165,112, 28, 96,149,106,109, 63,155,153, 6, 83,154,129, 37, 0, 41,133,115,151, 79,156,189,116,170, 77, 77, 38,
+180,184, 44, 3,216,155,155, 71,190,240,139,190,104, 99,125,243,193, 7, 31,184,134, 6,121,173,249, 60,143,136,155, 35,157, 46,
+181,184,225,100,120,149, 27, 23,180,177,186,187,177,186, 27,204, 73, 63,182,177,125,211,201,167,143,172,237,228, 27, 77, 67,244,
+232,217,184, 36, 3, 67,105, 46,204, 13, 39,129, 32,161,192, 80,138, 1, 67,121,160,122,202, 97, 14,250, 18,248,224,103,218,242,
+ 56,201, 40,154,216, 80,104,101,209,217, 69,235,186, 80, 36,108,185,183,156,201,147,203,239,187,239,190,215,190,246,181, 63,250,
+163, 63,252,236,179,207, 46,105,208,189,247,222,251,124,147,145,165,117,147,109,116, 53,238, 99,155, 92,106,126,190, 50, 61, 88,
+157,237, 55, 33,134,144, 86,103,251, 39,142,158, 95,153,206, 73, 5,115,203,196,137,106,177,124,136,179,115, 69, 47,135,199, 53,
+ 82,174,177,226, 33,186, 98,223,124, 57, 6,159, 5, 40,229, 33, 64,153,140, 7, 0,232,226,228,220,165,235,159,185,112, 67, 27,
+167,227,112, 88,203,254,245,243, 63,239,117,171,107,107,121, 83,157,162, 65,207,165, 61,189, 65, 42, 15, 94, 77, 11,106,173, 86,
+189, 49,214, 56, 67, 83,142,104,204,226,250,234,206,201, 99,103, 38,147,142,208,234,236,128,140,146, 7,203,136, 60,243,174, 55,
+185, 18,158, 43,172,133,215,208,119,172, 64, 18, 83,190,154, 75, 92,227,248,225,234, 64,182,206, 86, 33,147,128, 93, 12,251,139,
+181, 46,206,204,212,198,201,206,193,106,242,218, 91, 4,244,109, 49,169, 82,135, 29,144,233, 11, 94,247, 5,215,159,184,254, 23,
+127,241,253, 25,108, 9,247,220,243,234,107,144, 21,235,111,149,250, 35, 6,208, 95,172,253,211, 42,118,157,245,146,104,116,154,
+ 19,106, 66,220, 58,114,241,250,227,231,214,215,246, 86,166,139,217,116, 62,181,150, 33, 23,128, 12,163,248, 91,189, 37, 95, 10,
+200, 75,190, 95, 48,129,122,177,148, 65, 36, 87,173,139,151, 26,132, 4,150,218, 68,130, 4, 39,187,212, 28, 28,172,206,227, 52,
+198,102,209, 78, 47, 93, 57,126,225,202, 86,114, 43,228,136,222, 94,212, 2, 10,107,121,228,196,137, 19,119,221,117,215,253,247,
+223, 63,159,207,195, 61,247,188,250,208,106,210, 82, 82, 62,120, 8,214, 13, 16,106, 10,149,175,100,161,229, 86,172, 52,155,182,
+211, 73, 59, 9,113, 58,105,143,109, 92, 57,182,113,169,105, 58,163, 2, 83, 8,201,114, 35, 95, 41, 26,114,144, 57,176, 36, 38,
+ 13, 75,167, 80,116, 84, 93,184, 10,235, 68, 85,129,251, 10,183, 82,158, 84, 58,205, 65, 23,231,221,236,220,229,235, 46, 92,222,
+218,222, 63,178,189,183,121,113,231,248,238,254,102, 74, 65,203,145,138, 48, 30, 70, 97, 2,172,174,174,126,222,231,127,254,199,
+ 62,250,209, 6,135,189,119, 14,247,202,134, 68,197,254,130,116, 8,165, 58, 58, 10,129, 10, 75, 37,155,209, 0,159, 77,247,103,
+147,150,192, 36,116, 43,147,189, 73,179,152, 88, 7,194, 76,136,222, 83,108, 20,152, 3,188,188, 17, 93, 94,169,181,219,174,120,
+116,137,116, 88,112,137, 86,170,135,185,109,183,199, 66,234,188,122,102,109,230, 94, 61,211,130,105, 98,148,246,231,179,211,231,
+ 79,157,189,120,131, 68,201, 14,186, 89, 23,173, 84,206,200, 94, 30,165, 15,173,246, 76, 59, 5, 50,239,134,242,205,223,252,246,
+ 70, 46, 45,101,157, 85, 52,172,237,140, 14,193,243,150, 63,200, 12,167, 44, 69,121,110,202, 44, 91,118,201, 36, 55, 36, 99, 52,
+136,140, 64, 97,228,231,122,162,135,106,191,115,151,163,143, 93, 53, 9, 48,137, 4,141,162, 92, 12,153,167, 37, 6, 67, 38,243,
+160,210,182,250,120,154,189, 81, 76,153,141,192,216, 78, 14, 22, 43, 73, 1,192,238,193,198,124, 62,105,187, 32, 80,178,148, 66,
+174,176,177,164,132,131,210, 14,221,160, 99, 73, 9, 22,172,209, 40,151,207,202,210,191, 35,219,177,190,220, 59,182,218,234, 41,
+ 14,181,222, 75,136,230,147,176, 88,157,238,129,152,132, 56,157,204,131,117, 22, 98,105,181, 78, 46, 99,173,112,103,174, 57, 0,
+ 40,149, 7,206, 45,147, 38,207,105, 39,106,159,178, 27, 72, 26, 20,178,229,224, 8,110,132, 0, 70, 52,209, 67,182, 7,151,118,
+143, 63,117,246,150,131,249, 42,192, 54, 78, 47, 92,185,110,127,190,177,132,179,176,246,159,171,239,197,206, 46, 18, 28,247,104,
+103, 34,105, 66,211,211, 0, 56, 54,130, 40,253, 16,163,182, 61, 42,115, 70,157, 94, 22, 98, 85,169,236,211, 74, 23,170, 56,112,
+173,115, 57, 54,191,207, 37,120,170,177, 20, 15,109,146, 80,220, 34, 89,182,134, 43, 36,159, 28, 25,169,132,136, 3,233, 46, 87,
+169,235,230, 10, 93,154,116,105, 82,250,128, 23,211,249,162, 89,116, 13,129, 54,154, 11,181,127, 25, 16,113,141, 28,115,148, 60,
+176,152,220, 76,187, 0,233,134,102,160,185,176,134,199,165, 35, 89,125,134,161,108,141, 7,190, 94,175, 83,197,100,176, 58,151,
+ 16, 58, 90, 12,230,102, 94,235,222, 94,156,132, 23,160, 35,147,188,122, 22, 1, 71,109,201,227,112, 49,139,201, 10,135, 15, 94,
+100, 39,144, 93,154,236,204,143,116,113, 34, 48,166,201,249,203,215, 95,184,114, 93, 74, 13,192,182,155,238, 47,214,146, 55,172,
+ 11,250, 57,240, 8, 93,163, 47,165,108,209, 40, 84,133, 50, 48,107, 16,242, 38,114,101,231,129, 44,146,165, 59,140,224, 34, 22,
+229, 31,217,240,234,130, 60,215,196, 11,197, 50,199,251,169, 6,234,230,101,195,131,108, 0,232,125,131,105,222, 55,168, 54,254,
+143, 36, 37,140, 66,103, 14,111,201, 16, 0, 0, 7,126, 73, 68, 65, 84,179,210,210, 78,116, 30, 22, 93,232, 98, 3,177, 75,205,
+ 98, 17, 22,109,147,188,129,216,121,232,162,245,150,129, 84, 38, 7, 12, 51,125,245,127,185, 80, 95,247,216,203, 45,184, 57, 74,
+146,167, 6, 25,147, 47,114, 99,191, 55, 92,181,100, 78,229,154,127, 79,137, 5, 51, 59,119, 4, 34,102,237, 40,122,146,121,188,
+148,146,208, 41, 43, 16, 43,239,187, 64, 20,157,242, 46, 20, 2, 97, 98, 83, 54, 65, 67,202,137,164,114,184,180,159, 86, 59,159,
+230,221, 13,118, 14,142,156,187,116,125,219,173,208, 20,227,100,239, 96,163,141,179,186, 45, 98,112,133,202, 57, 15,153, 91,120,
+ 77,240,225,154,248,213,144, 30,244, 73,205, 40,163,105,138, 57,247, 74,177, 7, 7, 46, 78,150, 87,191, 95, 4,138,171, 31, 1,
+130,245,202, 40,150,205,174,220, 84, 50,198,164, 18,132, 19,189,238, 22,146, 93,245,150, 84, 38,196,231,111,139, 53,177, 16, 99,
+ 98,140, 33,147, 78,219, 69,115, 48,159, 45,186,153, 64,247,176, 55, 95,137,105,122, 21,208, 91, 40,107, 82,255,188, 68,191, 15,
+ 71, 49, 67,229,207, 82,245,106,180, 12,150, 48,155, 16, 26,120, 54,187,172,168,151, 19, 80,161, 42,215, 6,114,170,103,122,107,
+128, 78, 11, 79,174,216, 78, 65, 80,114,166,196, 76,242,140, 98, 26, 21, 4,205, 51, 77,188, 56,248,222, 7, 73,244, 24, 16, 72,
+215, 34,206,182,247,142,117,113, 10, 32,121,115,121,231,248,238,124,195,189,201, 47, 23,221, 76, 10,217, 48, 39,239, 55,126, 29,
+131,184,134,222,133,179, 24, 10,179,190,147,161,238, 60,233,149,233,154,233,216, 80,221,154,210, 6,187,146,149, 40,165,226,230,
+ 57,222,162,230, 80, 13,172, 54,218,140,240,211,209, 46,141,245,175,158,186,230, 66,144,195, 84,188, 88,141,174,146,171,150, 2,
+107,251,124, 30,131, 81, 78, 68,128, 33,201,246,231,171,243,118, 6, 49,250,244,210,238,145, 43,187,199, 37,187, 86,157, 40,235,
+136,106, 20, 87,152,239,121, 71,164,158,118,132, 66, 90,172,251,230,100,169,161,144,212,115,142,212,135, 67,121, 83,182,129, 5,
+ 85,224, 14,244,105,178,107,112, 93, 61,117,170,127,123,225, 43, 14, 87,234,215,170,210,145,221,145, 82, 72, 41,120, 50,137, 41,
+ 5, 12, 35, 40, 91, 56,228,237, 61, 28,161, 95,186, 7,251,107, 59, 7, 71,220, 3,169,182,157, 93,220,185,110,222,174,128,148,
+236, 96,190,234,222, 79,222,120, 11,183,236,148, 75, 44, 80,218, 50,138, 96,150,252, 86, 33, 20,215,166,130,154,218,213, 61, 28,
+ 14,225, 16, 99, 24,176, 26,220,166,132, 3, 78, 31, 44, 11,234, 22,119,227,207,121,229,117, 15,189, 13,142,165,109, 85, 37,122,
+ 98,151, 66,222,231, 32, 37, 75,202, 49,110,222, 50, 83, 86,186, 46,144,148,187,107, 32,218,238,124,253,220,165,235, 98,156,192,
+176, 88,172,108,239, 31, 93,180, 43,163, 90,152,138,207,173, 58,128, 26,221, 13,233,127, 1,196,251,206,147, 66,231,237,119,125,
+240, 28, 57,136,222, 75,179, 20,100,106,103,196,115,148,211, 9, 52,181,178,188,108,220, 85,147,120, 12, 97, 96, 79,146,204, 61,
+ 84, 67, 70, 89,183, 73,113,169, 75, 22,218, 64,163, 11, 93, 12, 49, 6,203,253,105,102, 65, 73, 38, 23, 82,178,253,118, 53,249,
+ 68,176,148,108,103,119,125,255, 96, 37,166,169,136,148, 38, 41, 89, 69,105, 92,232, 19,250,146,175,147,160,198, 51, 85, 56,227,
+172,190,186,228, 10,204,140,226, 10, 47,149,198,139, 28,251, 82,100,229, 25,147,142,220, 28,210,167,201,236,187,158, 42, 21,120,
+ 20,251,212, 20,107,160, 20,228,109,170, 6, 61, 25,154, 96,250, 37,215, 15,221,157, 93,156,228,173, 83,166, 19,107,187, 73,236,
+154,172,169, 22, 28,193, 13, 98, 64,140,205,153, 75,167, 46,110, 31,151, 12,178,253,118,117,239, 96,195, 61,140, 80,246, 98,227,
+ 74,183,134,247, 59, 0,215,111,103,101,192,214,245,212, 95,207, 13, 96, 53,142,203, 94, 39,135,157, 37,254,170, 27, 19,144, 61,
+231, 85, 28,161,236,125,119, 33, 33, 33, 59,136, 30,114,238,151,213, 50, 79,186,218,176,250,154,133,158,175,165,194,129, 0, 33,
+ 57,187, 24, 72,116,157,197,100,209,141,209,114, 89,193,211,196, 76, 0,230,221,180,235, 66,138, 37,120, 73,201, 52, 20, 12,122,
+ 30,248, 16, 55,140, 59,126,122, 49, 21,207, 51, 24,155,234, 47,122,143, 53,164, 4, 69,113, 48,222,240,196,235, 30,161,234,193,
+ 98, 14,177,126, 6, 75,201,190,170, 49, 44,240,186, 81,202,240,146,133,111, 42,178,111,167,170, 11,172,154,191, 60,131,201,121,
+176, 88, 89,132, 41,169,198,226, 70,187,186,232,166,128, 92, 54,111, 87,182,119,143,100,255,221,197,230,242,238,214,222,124,195,
+243, 94,248,133,129, 32,176, 80,217,251,201, 89,218, 9,134,163,166,164, 44,114, 26,139, 97,100,239,172, 42,188,166,220,188,213,
+199,134, 94,204, 87,221, 7, 44,231,162,217,242, 14,230,108,104, 11,233, 93,116,131,254,125,125,178, 90, 3,156,129,248, 92,109,
+129,247,189, 82,195, 36,123,239, 21, 51, 5, 89,117,155,235,152,172,237, 26,185, 92,161,139, 77, 23,155,148, 76,100,242, 38, 57,
+221,139, 87,206,125, 16,101,207,169,161,189,102,153,235, 95, 10, 73, 5,138, 45,173, 10,165, 63,104,137,159,156, 21,176,247, 82,
+ 5, 0, 43,102,168,210,155, 80, 50,224,226,172, 52, 50,221, 61, 68, 90,195,205, 38,119,245,212,205, 87,189,119,225,149,203,221,
+219,174,234,197, 42,130,226,131,255,239,251, 85, 20,147, 33, 25,136, 14,205,211,103,111,124,246,252,169,130,154,203,114, 99, 40,
+ 4,135, 85,247, 60,254,142,195, 18,233,215,126,223, 21, 85,165,211,111,196,230,253,125, 10, 11,187,223,160,173, 60, 93, 54,210,
+217, 10,247,160, 4,164,220,253,195, 26, 6,148, 94, 74, 56,100,163,244,140, 4,212, 44,141,173,194, 65,114, 31,216, 96,181, 51,
+161, 14,189, 54,118, 93, 21, 41, 29, 98,187,184, 55,135,216,114,203, 4,153,186, 60, 70,166, 62, 55,233,244, 55, 28, 85,123,250,
+150,177,170,221, 40,221, 41,213, 60,179,246,125,169,174, 78,175,106,103,125,254,193,222, 69,201,170, 49,174, 70,200,115,199,247,
+ 32,157,108,231,155,190,205,130, 21,245, 40, 0, 69,205,102,252,240,174, 80, 25,180, 41, 12,246,222, 6, 93, 61,243,203,123,166,
+176, 87,230, 67, 6, 62,175,219,156,124,140,164,163, 94, 97,115,199,197, 82, 51,164,188, 90,160,126,214,150,235,188,213,153,229,
+ 22,155, 10,229,104, 8,166, 41, 91,102,252,131,148, 3,166, 65,134, 36,164,166,239, 47, 27,218, 66,106, 11,142,234, 86, 95,249,
+210,178,117,168,150,105, 20, 95,143,115,129,195,178, 25,245,140,245,129,185, 70,219, 86, 14,126,187,239,162, 67,209, 6, 91,142,
+160,189, 50, 31, 71,134,178, 71, 30, 10,153,118, 8,103, 80, 91,159, 43, 8, 88, 90, 47, 61,255,111, 13,198,153,169,242,255,190,
+161,223, 68,160,108,104,230,131, 20, 11, 17,166, 90,152,113, 39,137,143,116,164,111, 1, 26,154, 93,198,146, 88,214,156,220,231,
+225, 61,213,242,144, 64,235, 59,198, 77, 41, 61,146, 94,227,197,250,217,254, 67,242,218,190, 51,244,117,214,116,106,212,142, 50,
+166, 99,104,100, 84,133,220, 88, 93,187, 86,250, 29, 84, 52, 42,185,213, 16,194,106,119, 84, 95,130,214,168,209,102,220, 97,179,
+212,233,115,213, 75,141,187,112,198, 59,112, 92, 85,222, 27, 90,118, 48,106,174,170, 86, 86,163, 37, 56, 52,241,228,105, 25,192,
+244, 62,178,198,232,205, 42,157, 70, 94,125,241,168,187, 69, 61,208, 83,247,226, 97,223, 69,163,178, 36,189,175,236,140, 90,107,
+213,168,134,103, 28,250,188,170,118,140,242, 96,114,200,197, 70,113,208, 82,235, 15,175, 98, 41,142,229,178,156, 36, 99, 20,236,
+160,138,134,203,109,124, 53,196,169,171, 73,125, 29, 62, 55, 90,142,118,102, 40, 11,175, 34, 47,242, 26, 50,122,238,237, 45,254,
+203,135,116,169,120,172,146,197,149,221, 91,221,202, 69,246,152, 89, 51,124, 43, 75, 96, 82, 65,246,161, 30, 50,242, 98,195,147,
+244,162, 57,148,236, 95,181,202,176,156,208, 14,150,104,108,243, 70,149,127,142,235,202, 94,173, 16,150,182, 25, 2,135, 62,246,
+161,229,137, 86, 21,139,125, 71, 99,222,102,164,199,141, 80,218,205,151,222, 83,195,159,108,152,122, 72, 58,111, 58, 94,191,211,
+107, 91, 86, 62, 93,170,126,247,201, 79, 79,182, 58,100,149,251,142,178,241, 71,134,125,186, 71, 31, 25,127,170,202,183,220, 64,
+ 90,166, 58, 74,213, 30,121,223, 40, 60, 44,175, 90,129, 30,122,207,107, 5,161,194,158, 53, 50, 28,154,137, 11,216,126,104, 43,
+ 48,245, 27, 42,114,153,217, 43,201,253,255, 1,198,119,120,131, 48,187, 25,202, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+ 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/Makefile b/source/blender/editors/gpencil/Makefile
index 9bc5f491a83..f3e781a0369 100644
--- a/source/blender/editors/gpencil/Makefile
+++ b/source/blender/editors/gpencil/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c
index fca525c0313..4867c5233bb 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -32,7 +32,6 @@
#include <math.h>
#include <float.h>
-#include "MEM_guardedalloc.h"
#include "IMB_imbuf_types.h"
@@ -43,12 +42,11 @@
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "DNA_view3d_types.h"
-#include "BKE_blender.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_gpencil.h"
-#include "BKE_sequencer.h"
#include "BKE_utildefines.h"
@@ -59,6 +57,7 @@
#include "ED_gpencil.h"
#include "ED_sequencer.h"
+#include "ED_view3d.h"
#include "gpencil_intern.h"
@@ -167,8 +166,8 @@ static void gp_draw_stroke_point (bGPDspoint *points, short thickness, short sfl
co[1]= (points->y * winy) + offsy;
}
else {
- co[0]= (points->x / 100 * winx);
- co[1]= (points->y / 100 * winy);
+ co[0]= (points->x / 100 * winx) + offsx;
+ co[1]= (points->y / 100 * winy) + offsy;
}
/* if thickness is less than GP_DRAWTHICKNESS_SPECIAL, simple dot looks ok
@@ -268,8 +267,8 @@ static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness,
glVertex2f(x, y);
}
else {
- const float x= (pt->x / 100 * winx);
- const float y= (pt->y / 100 * winy);
+ const float x= (pt->x / 100 * winx) + offsx;
+ const float y= (pt->y / 100 * winy) + offsy;
glVertex2f(x, y);
}
@@ -308,10 +307,10 @@ static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness,
s1[1]= (pt2->y * winy) + offsy;
}
else {
- s0[0]= (pt1->x / 100 * winx);
- s0[1]= (pt1->y / 100 * winy);
- s1[0]= (pt2->x / 100 * winx);
- s1[1]= (pt2->y / 100 * winy);
+ s0[0]= (pt1->x / 100 * winx) + offsx;
+ s0[1]= (pt1->y / 100 * winy) + offsy;
+ s1[0]= (pt2->x / 100 * winx) + offsx;
+ s1[1]= (pt2->y / 100 * winy) + offsy;
}
/* calculate gradient and normal - 'angle'=(ny/nx) */
@@ -456,8 +455,8 @@ static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness,
glVertex2f(x, y);
}
else {
- const float x= (float)(pt->x / 100 * winx);
- const float y= (float)(pt->y / 100 * winy);
+ const float x= (float)(pt->x / 100 * winx) + offsx;
+ const float y= (float)(pt->y / 100 * winy) + offsy;
glVertex2f(x, y);
}
@@ -709,7 +708,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);
@@ -735,25 +734,44 @@ 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, View3D *v3d, ARegion *ar, short only3d)
{
bGPdata *gpd;
int dflag = 0;
+ rcti rect;
+ RegionView3D *rv3d= ar->regiondata;
/* check that we have grease-pencil stuff to draw */
gpd= gpencil_data_get_active_v3d(scene); // XXX
if(gpd == NULL) return;
+ /* when rendering to the offscreen buffer we dont want to
+ * deal with the camera border, otherwise map the coords to the camera border. */
+ if(rv3d->persp == RV3D_CAMOB && !(G.f & G_RENDER_OGL)) {
+ rctf rectf;
+ view3d_calc_camera_border(scene, ar, rv3d, v3d, &rectf);
+ BLI_copy_rcti_rctf(&rect, &rectf);
+ }
+ else {
+ rect.xmin= 0;
+ rect.ymin= 0;
+ rect.xmax= ar->winx;
+ rect.ymax= ar->winy;
+ }
+
/* draw it! */
if (only3d) dflag |= (GP_DRAWDATA_ONLY3D|GP_DRAWDATA_NOSTATUS);
- gp_draw_data(gpd, 0, 0, ar->winx, ar->winy, CFRA, dflag);
+
+ gp_draw_data(gpd, rect.xmin, rect.ymin, rect.xmax, rect.ymax, CFRA, dflag);
}
-void draw_gpencil_3dview (bContext *C, short only3d)
+void draw_gpencil_view3d (bContext *C, short only3d)
{
ARegion *ar= CTX_wm_region(C);
+ View3D *v3d= CTX_wm_view3d(C);
Scene *scene= CTX_data_scene(C);
- draw_gpencil_3dview_ext(scene, ar, only3d);
+ draw_gpencil_view3d_ext(scene, v3d, ar, only3d);
}
/* ************************************************** */
diff --git a/source/blender/editors/gpencil/editaction_gpencil.c b/source/blender/editors/gpencil/editaction_gpencil.c
index dff0839b5bd..d76e5fcf17c 100644
--- a/source/blender/editors/gpencil/editaction_gpencil.c
+++ b/source/blender/editors/gpencil/editaction_gpencil.c
@@ -31,23 +31,9 @@
#include <stddef.h>
#include <math.h>
-#include "MEM_guardedalloc.h"
-
#include "BLI_math.h"
#include "BLI_blenlib.h"
-
-#include "BKE_global.h"
-#include "BKE_utildefines.h"
-#include "BKE_blender.h"
-#include "BKE_fcurve.h"
-#include "BKE_gpencil.h"
-
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
-
-
-
#include "gpencil_intern.h"
#if 0 // XXX disabled until grease pencil code stabilises again
diff --git a/source/blender/editors/gpencil/gpencil_buttons.c b/source/blender/editors/gpencil/gpencil_buttons.c
index e719d9ab392..87a9c3cd52f 100644
--- a/source/blender/editors/gpencil/gpencil_buttons.c
+++ b/source/blender/editors/gpencil/gpencil_buttons.c
@@ -30,7 +30,6 @@
#include <stdlib.h>
#include <stddef.h>
-#include "MEM_guardedalloc.h"
#include "BLI_math.h"
#include "BLI_blenlib.h"
@@ -41,15 +40,12 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_gpencil.h"
-#include "BKE_utildefines.h"
#include "WM_api.h"
#include "WM_types.h"
#include "RNA_access.h"
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "ED_gpencil.h"
@@ -126,7 +122,7 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
/* locked */
icon= (gpl->flag & GP_LAYER_LOCKED) ? ICON_LOCKED : ICON_UNLOCKED;
- uiItemR(subrow, &ptr, "locked", 0, "", icon);
+ uiItemR(subrow, &ptr, "lock", 0, "", icon);
/* when layer is locked or hidden, only draw header */
if (gpl->flag & (GP_LAYER_LOCKED|GP_LAYER_HIDE)) {
@@ -164,7 +160,7 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
/* frame locking */
// TODO: this needs its own icons...
icon= (gpl->flag & GP_LAYER_FRAMELOCK) ? ICON_RENDER_STILL : ICON_RENDER_ANIMATION;
- uiItemR(subrow, &ptr, "frame_lock", 0, "", icon);
+ uiItemR(subrow, &ptr, "lock_frame", 0, "", icon);
uiBlockSetEmboss(block, UI_EMBOSS);
@@ -194,11 +190,11 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
/* color */
subcol= uiLayoutColumn(col, 1);
uiItemR(subcol, &ptr, "color", 0, "", 0);
- uiItemR(subcol, &ptr, "opacity", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(subcol, &ptr, "alpha", UI_ITEM_R_SLIDER, NULL, 0);
/* stroke thickness */
subcol= uiLayoutColumn(col, 1);
- uiItemR(subcol, &ptr, "line_thickness", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(subcol, &ptr, "line_width", UI_ITEM_R_SLIDER, NULL, 0);
/* debugging options */
if (G.f & G_DEBUG) {
@@ -212,7 +208,7 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
/* onion-skinning */
subcol= uiLayoutColumn(col, 1);
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
+ uiItemR(subcol, &ptr, "ghost_range_max", 0, "Frames", 0); // XXX shorter name here? i.e. GStep
/* additional options... */
subcol= uiLayoutColumn(col, 1);
@@ -221,13 +217,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_on = 0;
+ short v3d_stroke_opts = STROKE_OPTS_NORMAL;
/* make new PointerRNA for Grease Pencil block */
RNA_id_pointer_create((ID *)gpd, &gpd_ptr);
@@ -259,7 +262,9 @@ static void draw_gpencil_panel (bContext *C, uiLayout *layout, bGPdata *gpd, Poi
/* 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_on = 1;
+ v3d_stroke_opts = STROKE_OPTS_V3D_ON;
+ else
+ v3d_stroke_opts = STROKE_OPTS_V3D_OFF;
}
/* drawing space options */
@@ -267,12 +272,12 @@ static void draw_gpencil_panel (bContext *C, uiLayout *layout, bGPdata *gpd, Poi
uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "VIEW", NULL, 0);
uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "CURSOR", NULL, 0);
row= uiLayoutRow(col, 1);
- uiLayoutSetActive(row, v3d_stroke_opts_on);
+ 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, v3d_stroke_opts_on);
+ 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 9e3ebedba0a..e0d257ca3bf 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -45,21 +45,15 @@
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_view3d_types.h"
+#include "DNA_gpencil_types.h"
-#include "BKE_armature.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_object.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -441,38 +435,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);
}
@@ -493,7 +509,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
*/
@@ -539,16 +555,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:
@@ -560,10 +576,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_paint.c b/source/blender/editors/gpencil/gpencil_paint.c
index c4df1bde1c2..083a90efb25 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -40,10 +40,10 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_gpencil_types.h"
#include "UI_view2d.h"
@@ -68,6 +68,9 @@ typedef struct tGPsdata {
ScrArea *sa; /* area where painting originated */
ARegion *ar; /* region where painting originated */
View2D *v2d; /* needed for GP_STROKE_2DSPACE */
+ rctf *subrect; /* for using the camera rect within the 3d view */
+ rctf subrect_data;
+
#if 0 // XXX review this 2d image stuff...
ImBuf *ibuf; /* needed for GP_STROKE_2DIMAGE */
@@ -271,8 +274,14 @@ static void gp_stroke_convertcoords (tGPsdata *p, short mval[], float out[], flo
/* 2d - relative to screen (viewport area) */
else {
- out[0] = (float)(mval[0]) / (float)(p->ar->winx) * 100;
- out[1] = (float)(mval[1]) / (float)(p->ar->winy) * 100;
+ if(p->subrect == NULL) { /* normal 3D view */
+ out[0] = (float)(mval[0]) / (float)(p->ar->winx) * 100;
+ out[1] = (float)(mval[1]) / (float)(p->ar->winy) * 100;
+ }
+ else { /* camera view, use subrect */
+ out[0]= ((mval[0] - p->subrect->xmin) / ((p->subrect->xmax - p->subrect->xmin))) * 100;
+ out[1]= ((mval[1] - p->subrect->ymin) / ((p->subrect->ymax - p->subrect->ymin))) * 100;
+ }
}
}
@@ -704,8 +713,14 @@ static void gp_stroke_eraser_dostroke (tGPsdata *p, int mval[], int mvalo[], sho
}
#endif
else {
- x0= (int)(gps->points->x / 100 * p->ar->winx);
- y0= (int)(gps->points->y / 100 * p->ar->winy);
+ if(p->subrect == NULL) { /* normal 3D view */
+ x0= (int)(gps->points->x / 100 * p->ar->winx);
+ y0= (int)(gps->points->y / 100 * p->ar->winy);
+ }
+ else { /* camera view, use subrect */
+ x0= (int)((gps->points->x / 100) * (p->subrect->xmax - p->subrect->xmin)) + p->subrect->xmin;
+ y0= (int)((gps->points->y / 100) * (p->subrect->ymax - p->subrect->ymin)) + p->subrect->ymin;
+ }
}
/* do boundbox check first */
@@ -761,10 +776,18 @@ static void gp_stroke_eraser_dostroke (tGPsdata *p, int mval[], int mvalo[], sho
}
#endif
else {
- x0= (int)(pt1->x / 100 * p->ar->winx);
- y0= (int)(pt1->y / 100 * p->ar->winy);
- x1= (int)(pt2->x / 100 * p->ar->winx);
- y1= (int)(pt2->y / 100 * p->ar->winy);
+ if(p->subrect == NULL) { /* normal 3D view */
+ x0= (int)(pt1->x / 100 * p->ar->winx);
+ y0= (int)(pt1->y / 100 * p->ar->winy);
+ x1= (int)(pt2->x / 100 * p->ar->winx);
+ y1= (int)(pt2->y / 100 * p->ar->winy);
+ }
+ else { /* camera view, use subrect */
+ x0= (int)((pt1->x / 100) * (p->subrect->xmax - p->subrect->xmin)) + p->subrect->xmin;
+ y0= (int)((pt1->y / 100) * (p->subrect->ymax - p->subrect->ymin)) + p->subrect->ymin;
+ x1= (int)((pt2->x / 100) * (p->subrect->xmax - p->subrect->xmin)) + p->subrect->xmin;
+ y1= (int)((pt2->y / 100) * (p->subrect->ymax - p->subrect->ymin)) + p->subrect->ymin;
+ }
}
/* check that point segment of the boundbox of the eraser stroke */
@@ -849,7 +872,8 @@ static tGPsdata *gp_session_initpaint (bContext *C)
/* supported views first */
case SPACE_VIEW3D:
{
- //View3D *v3d= curarea->spacedata.first;
+ View3D *v3d= curarea->spacedata.first;
+ RegionView3D *rv3d= ar->regiondata;
/* set current area
* - must verify that region data is 3D-view (and not something else)
@@ -864,6 +888,12 @@ static tGPsdata *gp_session_initpaint (bContext *C)
return p;
}
+ /* for camera view set the subrect */
+ if(rv3d->persp == RV3D_CAMOB) {
+ view3d_calc_camera_border(p->scene, p->ar, NULL, v3d, &p->subrect_data);
+ p->subrect= &p->subrect_data;
+ }
+
#if 0 // XXX will this sort of antiquated stuff be restored?
/* check that gpencil data is allowed to be drawn */
if ((v3d->flag2 & V3D_DISPGP)==0) {
@@ -1481,6 +1511,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 */
@@ -1515,6 +1546,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";
@@ -1531,6 +1564,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/ED_anim_api.h b/source/blender/editors/include/ED_anim_api.h
index 23cb697b453..5fb7fa41752 100644
--- a/source/blender/editors/include/ED_anim_api.h
+++ b/source/blender/editors/include/ED_anim_api.h
@@ -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)
diff --git a/source/blender/editors/include/ED_armature.h b/source/blender/editors/include/ED_armature.h
index 81ceaffaa5e..52db36e188d 100644
--- a/source/blender/editors/include/ED_armature.h
+++ b/source/blender/editors/include/ED_armature.h
@@ -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,
@@ -121,7 +120,7 @@ void ED_armature_edit_bone_remove(struct bArmature *arm, EditBone *exBone);
void transform_armature_mirror_update(struct Object *obedit);
void clear_armature(struct Scene *scene, struct Object *ob, char mode);
-void docenter_armature (struct Scene *scene, struct View3D *v3d, struct Object *ob, int centermode);
+void docenter_armature (struct Scene *scene, struct Object *ob, float cursor[3], int centermode, int around);
void ED_armature_apply_transform(struct Object *ob, float mat[4][4]);
@@ -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 3710d4bc4cc..0ff98b504d0 100644
--- a/source/blender/editors/include/ED_curve.h
+++ b/source/blender/editors/include/ED_curve.h
@@ -37,6 +37,10 @@ struct Text;
struct View3D;
struct wmOperator;
struct wmKeyConfig;
+struct Curve;
+struct EditNurb;
+struct BezTriple;
+struct BPoint;
/* curve_ops.c */
void ED_operatortypes_curve(void);
@@ -55,6 +59,8 @@ void load_editNurb (struct Object *obedit);
void make_editNurb (struct Object *obedit);
void free_editNurb (struct Object *obedit);
+void free_curve_editNurb (struct Curve *cu);
+
int mouse_nurb (struct bContext *C, short mval[2], int extend);
struct Nurb *add_nurbs_primitive(struct bContext *C, float mat[4][4], int type, int newname);
@@ -71,5 +77,11 @@ 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);
+ListBase *ED_curve_editnurbs(struct Curve *cu);
+
+void ED_curve_beztcpy(struct EditNurb *editnurb, struct BezTriple *dst, struct BezTriple *src, int count);
+void ED_curve_bpcpy(struct EditNurb *editnurb, struct BPoint *dst, struct BPoint *src, int count);
+
#endif /* ED_CURVE_H */
diff --git a/source/blender/editors/include/ED_datafiles.h b/source/blender/editors/include/ED_datafiles.h
index 136d46cdc91..2c352abcd00 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[];
@@ -52,5 +52,93 @@ extern char datatoc_bfont_ttf[];
extern int datatoc_bmonofont_ttf_size;
extern char datatoc_bmonofont_ttf[];
+/* Brush icon datafiles */
+/* TODO: this could be simplified by putting all
+ the brush icons in one file */
+extern int datatoc_add_png_size;
+extern char datatoc_add_png[];
+
+extern int datatoc_blob_png_size;
+extern char datatoc_blob_png[];
+
+extern int datatoc_blur_png_size;
+extern char datatoc_blur_png[];
+
+extern int datatoc_clay_png_size;
+extern char datatoc_clay_png[];
+
+extern int datatoc_clone_png_size;
+extern char datatoc_clone_png[];
+
+extern int datatoc_crease_png_size;
+extern char datatoc_crease_png[];
+
+extern int datatoc_darken_png_size;
+extern char datatoc_darken_png[];
+
+extern int datatoc_draw_png_size;
+extern char datatoc_draw_png[];
+
+extern int datatoc_fill_png_size;
+extern char datatoc_fill_png[];
+
+extern int datatoc_flatten_png_size;
+extern char datatoc_flatten_png[];
+
+extern int datatoc_grab_png_size;
+extern char datatoc_grab_png[];
+
+extern int datatoc_inflate_png_size;
+extern char datatoc_inflate_png[];
+
+extern int datatoc_layer_png_size;
+extern char datatoc_layer_png[];
+
+extern int datatoc_lighten_png_size;
+extern char datatoc_lighten_png[];
+
+extern int datatoc_mix_png_size;
+extern char datatoc_mix_png[];
+
+extern int datatoc_multiply_png_size;
+extern char datatoc_multiply_png[];
+
+extern int datatoc_nudge_png_size;
+extern char datatoc_nudge_png[];
+
+extern int datatoc_pinch_png_size;
+extern char datatoc_pinch_png[];
+
+extern int datatoc_scrape_png_size;
+extern char datatoc_scrape_png[];
+
+extern int datatoc_smear_png_size;
+extern char datatoc_smear_png[];
+
+extern int datatoc_smooth_png_size;
+extern char datatoc_smooth_png[];
+
+extern int datatoc_snake_hook_png_size;
+extern char datatoc_snake_hook_png[];
+
+extern int datatoc_soften_png_size;
+extern char datatoc_soften_png[];
+
+extern int datatoc_subtract_png_size;
+extern char datatoc_subtract_png[];
+
+extern int datatoc_texdraw_png_size;
+extern char datatoc_texdraw_png[];
+
+extern int datatoc_thumb_png_size;
+extern char datatoc_thumb_png[];
+
+extern int datatoc_twist_png_size;
+extern char datatoc_twist_png[];
+
+extern int datatoc_vertexdraw_png_size;
+extern char datatoc_vertexdraw_png[];
+
+
#endif /* ED_DATAFILES_H */
diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h
index 05534bd584c..6c5a0cc3bf3 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 View3D *v3d, struct ARegion *ar, short only3d);
void gpencil_panel_standard(const struct bContext *C, struct Panel *pa);
diff --git a/source/blender/editors/include/ED_keyframing.h b/source/blender/editors/include/ED_keyframing.h
index 86a1f5c4031..fc5e3a43a62 100644
--- a/source/blender/editors/include/ED_keyframing.h
+++ b/source/blender/editors/include/ED_keyframing.h
@@ -257,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/editors/include/ED_lattice.h b/source/blender/editors/include/ED_lattice.h
new file mode 100644
index 00000000000..bebd6c5f3ab
--- /dev/null
+++ b/source/blender/editors/include/ED_lattice.h
@@ -0,0 +1,33 @@
+/**
+ * $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.
+ *
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+struct Object;
+
+void free_editLatt(struct Object *ob);
+void make_editLatt(struct Object *obedit);
+void load_editLatt(struct Object *obedit);
diff --git a/source/blender/imbuf/intern/IMB_ham.h b/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_mesh.h b/source/blender/editors/include/ED_mesh.h
index 43c11206bbe..564fe04ca4d 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -147,7 +147,7 @@ struct UvVertMap *EM_make_uv_vert_map(struct EditMesh *em, int selected, int do_
struct UvMapVert *EM_get_uv_map_vert(struct UvVertMap *vmap, unsigned int v);
void EM_free_uv_vert_map(struct UvVertMap *vmap);
-void EM_add_data_layer(struct EditMesh *em, struct CustomData *data, int type);
+void EM_add_data_layer(struct EditMesh *em, struct CustomData *data, int type, const char *name);
void EM_free_data_layer(struct EditMesh *em, struct CustomData *data, int type);
void EM_make_hq_normals(struct EditMesh *em);
@@ -209,16 +209,19 @@ int editface_containsEdge(struct EditFace *efa, struct EditEdge *eed);
short sharesFace(struct EditMesh *em, struct EditEdge *e1, struct EditEdge *e2);
/* mesh_data.c */
+// void ED_mesh_geometry_add(struct Mesh *mesh, struct ReportList *reports, int verts, int edges, int faces);
+void ED_mesh_faces_add(struct Mesh *mesh, struct ReportList *reports, int count);
+void ED_mesh_edges_add(struct Mesh *mesh, struct ReportList *reports, int count);
+void ED_mesh_vertices_add(struct Mesh *mesh, struct ReportList *reports, int count);
-void ED_mesh_geometry_add(struct Mesh *mesh, struct ReportList *reports, int verts, int edges, int faces);
void ED_mesh_transform(struct Mesh *me, float *mat);
void ED_mesh_calc_normals(struct Mesh *me);
-void ED_mesh_material_add(struct Mesh *me, struct Material *ma);
+void ED_mesh_material_link(struct Mesh *me, struct Material *ma);
void ED_mesh_update(struct Mesh *mesh, struct bContext *C, int calc_edges);
-int ED_mesh_uv_texture_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me);
+int ED_mesh_uv_texture_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me, const char *name, int active_set);
int ED_mesh_uv_texture_remove(struct bContext *C, struct Object *ob, struct Mesh *me);
-int ED_mesh_color_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me);
+int ED_mesh_color_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me, const char *name, int active_set);
int ED_mesh_color_remove(struct bContext *C, struct Object *ob, struct Mesh *me);
#endif /* ED_MESH_H */
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index 709e36bccb2..f243b4cc497 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -28,24 +28,25 @@
#ifndef ED_OBJECT_H
#define ED_OBJECT_H
-struct wmKeyConfig;
-struct wmKeyMap;
-struct Scene;
-struct Object;
-struct bContext;
struct Base;
-struct View3D;
struct bConstraint;
+struct bContext;
struct bPoseChannel;
+struct Curve;
struct KeyBlock;
struct Lattice;
+struct Main;
struct Mesh;
-struct Curve;
-struct ReportList;
struct ModifierData;
-struct wmOperatorType;
-struct wmOperator;
+struct Object;
+struct ReportList;
+struct Scene;
+struct View3D;
struct wmEvent;
+struct wmKeyConfig;
+struct wmKeyMap;
+struct wmOperator;
+struct wmOperatorType;
/* object_edit.c */
struct Object *ED_object_active_context(struct bContext *C);
@@ -55,7 +56,13 @@ void ED_operatortypes_object(void);
void ED_operatormacros_object(void);
void ED_keymap_object(struct wmKeyConfig *keyconf);
-/* generic editmode keys like pet */
+/* generic editmode keys like pet
+ * do_pet
+ * 0: No
+ * 1: Object
+ * 2: Edit
+ * 3: Edit with connected
+ * */
void ED_object_generic_keymap(struct wmKeyConfig *keyconf, struct wmKeyMap *keymap, int do_pet);
/* send your own notifier for select! */
@@ -63,10 +70,10 @@ void ED_base_object_select(struct Base *base, short mode);
/* includes notifier */
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_base_object_free_and_unlink(struct Main *bmain, struct Scene *scene, struct Base *base);
/* 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);
+struct Base *ED_object_add_duplicate(struct Main *bmain, struct Scene *scene, struct Base *base, int dupflag);
void ED_object_parent(struct Object *ob, struct Object *parent, int type, const char *substr);
@@ -84,14 +91,14 @@ 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);
+void ED_object_single_users(struct Main *bmain, struct Scene *scene, int full);
/* cleanup */
int object_is_libdata(struct Object *ob);
@@ -110,7 +117,7 @@ void object_test_constraints(struct Object *ob);
void ED_object_constraint_set_active(struct Object *ob, struct bConstraint *con);
void ED_object_constraint_update(struct Object *ob);
-void ED_object_constraint_dependency_update(struct Scene *scene, struct Object *ob);
+void ED_object_constraint_dependency_update(struct Main *bmain, struct Scene *scene, struct Object *ob);
/* object_lattice.c */
int mouse_lattice(struct bContext *C, short mval[2], int extend);
@@ -126,11 +133,11 @@ enum {
MODIFIER_APPLY_SHAPE,
} eModifier_Apply_Mode;
-struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Scene *scene, struct Object *ob, char *name, int type);
-int ED_object_modifier_remove(struct ReportList *reports, struct Scene *scene, struct Object *ob, struct ModifierData *md);
+struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, char *name, int type);
+int ED_object_modifier_remove(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, struct ModifierData *md);
int ED_object_modifier_move_down(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
int ED_object_modifier_move_up(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
-int ED_object_modifier_convert(struct ReportList *reports, struct Scene *scene, struct Object *ob, struct ModifierData *md);
+int ED_object_modifier_convert(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, struct ModifierData *md);
int ED_object_modifier_apply(struct ReportList *reports, struct Scene *scene, struct Object *ob, struct ModifierData *md, int mode);
int ED_object_modifier_copy(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
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 6100ecd436f..f34670da471 100644
--- a/source/blender/editors/include/ED_render.h
+++ b/source/blender/editors/include/ED_render.h
@@ -78,6 +78,7 @@ 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);
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 4a4c546ec92..3478447b058 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -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,8 +98,8 @@ 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);
diff --git a/source/blender/editors/include/ED_screen_types.h b/source/blender/editors/include/ED_screen_types.h
index 03ea9a8f976..c55dafa6f51 100644
--- a/source/blender/editors/include/ED_screen_types.h
+++ b/source/blender/editors/include/ED_screen_types.h
@@ -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 db2013fb411..506813ce626 100644
--- a/source/blender/editors/include/ED_sculpt.h
+++ b/source/blender/editors/include/ED_sculpt.h
@@ -49,7 +49,7 @@ void ED_keymap_paint(struct wmKeyConfig *keyconf);
#define UNDO_PAINT_IMAGE 0
#define UNDO_PAINT_MESH 1
-void ED_undo_paint_step(struct bContext *C, int type, int step);
+int ED_undo_paint_step(struct bContext *C, int type, int step, const char *name);
void ED_undo_paint_free(void);
#endif
diff --git a/source/blender/editors/include/ED_util.h b/source/blender/editors/include/ED_util.h
index cc4f906ad37..7bf3ec88a4b 100644
--- a/source/blender/editors/include/ED_util.h
+++ b/source/blender/editors/include/ED_util.h
@@ -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_view3d.h b/source/blender/editors/include/ED_view3d.h
index 7f90575acc0..f5a84aa4c19 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -51,7 +51,7 @@ struct ViewContext;
/* for derivedmesh drawing callbacks, for view3d_select, .... */
typedef struct ViewContext {
- Scene *scene;
+ struct Scene *scene;
struct Object *obact;
struct Object *obedit;
struct ARegion *ar;
@@ -72,7 +72,7 @@ typedef struct ViewDepths {
float *give_cursor(struct Scene *scene, struct View3D *v3d);
-void initgrabz(struct RegionView3D *rv3d, float x, float y, float z);
+int initgrabz(struct RegionView3D *rv3d, float x, float y, float z);
void window_to_3d(struct ARegion *ar, float *vec, short mx, short my);
void window_to_3d_delta(struct ARegion *ar, float *vec, short mx, short my);
void view3d_unproject(struct bglMats *mats, float out[3], const short x, const short y, const float z);
@@ -101,10 +101,11 @@ void viewline(struct ARegion *ar, struct View3D *v3d, float mval[2], float ray_s
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_viewplane(struct View3D *v3d, struct RegionView3D *rv3d, int winxi, int winyi, struct 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]);
void view3d_project_float(struct ARegion *a, float *vec, float *adr, float mat[4][4]);
+void view3d_calc_camera_border(struct Scene *scene, struct ARegion *ar, struct RegionView3D *rv3d, struct View3D *v3d, struct rctf *viewborder_r);
/* drawobject.c itterators */
void mesh_foreachScreenVert(struct ViewContext *vc, void (*func)(void *userData, struct EditVert *eve, int x, int y, int index), void *userData, int clipVerts);
@@ -153,16 +154,14 @@ 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_copy(struct View3D *v3d, struct Scene *scene);
-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);
+struct ImBuf *ED_view3d_draw_offscreen_imbuf(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, int sizex, int sizey, unsigned int flag);
+struct ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, int width, int height, unsigned int flag, int drawtype);
void view3d_clipping_local(struct RegionView3D *rv3d, float mat[][4]);
diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h
index 30560687702..6a139b124a6 100644
--- a/source/blender/editors/include/UI_icons.h
+++ b/source/blender/editors/include/UI_icons.h
@@ -27,8 +27,8 @@
*/
/* Note: this is included twice with different #defines for DEF_ICON
- once from UI_resources.h for the internal icon enum and once fro interface_api.c for
- definition of the RNA enum for he icons */
+ once from UI_resources.h for the internal icon enum and
+ once for interface_api.c for the definition of the RNA enum for the icons */
DEF_ICON(ICON_BLENDER)
DEF_ICON(ICON_QUESTION)
@@ -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_MOD_SCREW) // XXX, needs drawing
+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)
@@ -869,6 +869,37 @@ DEF_ICON(ICON_BLANK345)
DEF_ICON(ICON_BLANK346)
DEF_ICON(ICON_BLANK346b)
+ /* brush icons */
+
+DEF_ICON(ICON_BRUSH_ADD)
+DEF_ICON(ICON_BRUSH_BLOB)
+DEF_ICON(ICON_BRUSH_BLUR)
+DEF_ICON(ICON_BRUSH_CLAY)
+DEF_ICON(ICON_BRUSH_CLONE)
+DEF_ICON(ICON_BRUSH_CREASE)
+DEF_ICON(ICON_BRUSH_DARKEN)
+DEF_ICON(ICON_BRUSH_FILL)
+DEF_ICON(ICON_BRUSH_FLATTEN)
+DEF_ICON(ICON_BRUSH_GRAB)
+DEF_ICON(ICON_BRUSH_INFLATE)
+DEF_ICON(ICON_BRUSH_LAYER)
+DEF_ICON(ICON_BRUSH_LIGHTEN)
+DEF_ICON(ICON_BRUSH_MIX)
+DEF_ICON(ICON_BRUSH_MULTIPLY)
+DEF_ICON(ICON_BRUSH_NUDGE)
+DEF_ICON(ICON_BRUSH_PINCH)
+DEF_ICON(ICON_BRUSH_SCRAPE)
+DEF_ICON(ICON_BRUSH_SCULPT_DRAW)
+DEF_ICON(ICON_BRUSH_SMEAR)
+DEF_ICON(ICON_BRUSH_SMOOTH)
+DEF_ICON(ICON_BRUSH_SNAKE_HOOK)
+DEF_ICON(ICON_BRUSH_SOFTEN)
+DEF_ICON(ICON_BRUSH_SUBTRACT)
+DEF_ICON(ICON_BRUSH_TEXDRAW)
+DEF_ICON(ICON_BRUSH_THUMB)
+DEF_ICON(ICON_BRUSH_ROTATE)
+DEF_ICON(ICON_BRUSH_VERTEXDRAW)
+
/* vector icons */
DEF_ICON(VICO_VIEW3D_VEC)
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index dfc89ea16df..9601cdc3f21 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 */
@@ -671,14 +678,15 @@ void uiTemplateAnyID(uiLayout *layout, struct bContext *C, struct PointerRNA *pt
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 *uiTemplateModifier(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
uiLayout *uiTemplateConstraint(uiLayout *layout, struct PointerRNA *ptr);
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 uiTemplateTriColorSet(uiLayout *layout, struct PointerRNA *ptr, char *propname);
+void uiTemplateColorWheel(uiLayout *layout, struct PointerRNA *ptr, char *propname, int value_slider, int lock, int lock_luminosity, int cubic);
void uiTemplateLayers(uiLayout *layout, struct PointerRNA *ptr, char *propname,
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);
@@ -687,7 +695,7 @@ 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);
diff --git a/source/blender/editors/include/UI_resources.h b/source/blender/editors/include/UI_resources.h
index 273071f94bf..af3f91f8ba8 100644
--- a/source/blender/editors/include/UI_resources.h
+++ b/source/blender/editors/include/UI_resources.h
@@ -180,6 +180,7 @@ enum {
TH_HANDLE_SEL_ALIGN,
TH_ACTIVE_SPLINE,
+ TH_LASTSEL_POINT,
TH_SYNTAX_B,
TH_SYNTAX_V,
@@ -227,6 +228,8 @@ enum {
TH_DOPESHEET_CHANNELSUBOB,
TH_PREVIEW_BACK,
+
+ TH_EDGE_CREASE,
};
/* XXX WARNING: previous is saved in file, so do not change order! */
@@ -277,6 +280,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/Makefile b/source/blender/editors/interface/Makefile
index 115740a8403..7b5d4e60fbd 100644
--- a/source/blender/editors/interface/Makefile
+++ b/source/blender/editors/interface/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 1267a1c1737..021dcc940e6 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -41,15 +41,10 @@
#include "BLI_dynstr.h"
#include "BKE_context.h"
-#include "BKE_idprop.h"
#include "BKE_library.h"
-#include "BKE_screen.h"
-#include "BKE_texture.h"
-#include "BKE_utildefines.h"
#include "BKE_unit.h"
#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "BLF_api.h"
@@ -230,7 +225,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;
}
@@ -1464,13 +1459,13 @@ static void ui_get_but_string_unit(uiBut *but, char *str, int len_max, double va
bUnit_AsString(str, len_max, ui_get_but_scale_unit(but, value), precision, scene->unit.system, unit_type, do_split, pad);
}
-static float ui_get_but_step_unit(uiBut *but, double value, float step_default)
+static float ui_get_but_step_unit(uiBut *but, float step_default)
{
Scene *scene= CTX_data_scene((bContext *)but->block->evil_C);
int unit_type= RNA_SUBTYPE_UNIT_VALUE(RNA_property_subtype(but->rnaprop));
float step;
- step = bUnit_ClosestScalar(ui_get_but_scale_unit(but, value), scene->unit.system, unit_type);
+ step = bUnit_ClosestScalar(ui_get_but_scale_unit(but, step_default), scene->unit.system, unit_type);
if(step > 0.0) { /* -1 is an error value */
return (step/ui_get_but_scale_unit(but, 1.0))*100;
@@ -1633,7 +1628,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])
@@ -1644,7 +1639,7 @@ int ui_set_but_string(bContext *C, uiBut *but, const char *str)
value= atof(str);
#endif
- if(!ui_is_but_float(but)) value= (int)value;
+ if(!ui_is_but_float(but)) value= (int)floor(value + 0.5);
if(but->type==NUMABS) value= fabs(value);
/* not that we use hard limits here */
@@ -1770,9 +1765,11 @@ static void ui_free_but(const bContext *C, uiBut *but)
}
if(but->func_argN) MEM_freeN(but->func_argN);
if(but->active) {
- /* XXX solve later, buttons should be free-able without context? */
+ /* XXX solve later, buttons should be free-able without context ideally,
+ however they may have open tooltips or popup windows, which need to
+ be closed using a context pointer */
if(C)
- ui_button_active_cancel(C, but);
+ ui_button_active_free(C, but);
else
if(but->active)
MEM_freeN(but->active);
@@ -2376,7 +2373,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;
@@ -2533,8 +2530,10 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
}
}
}
- else
+ else {
+ printf("ui_def_but_rna: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
str= (char*)propname;
+ }
/* now create button */
but= ui_def_but(block, type, retval, str, x1, y1, x2, y2, NULL, min, max, a1, a2, tip);
@@ -2563,7 +2562,7 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
/* If this button uses units, calculate the step from this */
if(ui_is_but_unit(but))
- but->a1= ui_get_but_step_unit(but, ui_get_but_val(but), but->a1);
+ but->a1= ui_get_but_step_unit(but, but->a1);
if(freestr)
MEM_freeN(str);
diff --git a/source/blender/editors/interface/interface_anim.c b/source/blender/editors/interface/interface_anim.c
index 207230a914d..c99622c7518 100644
--- a/source/blender/editors/interface/interface_anim.c
+++ b/source/blender/editors/interface/interface_anim.c
@@ -3,7 +3,6 @@
#include <stdlib.h>
#include <string.h>
-#include "MEM_guardedalloc.h"
#include "DNA_anim_types.h"
#include "DNA_scene_types.h"
@@ -12,7 +11,6 @@
#include "BLI_listbase.h"
#include "BLI_string.h"
-#include "BKE_animsys.h"
#include "BKE_context.h"
#include "BKE_fcurve.h"
@@ -111,7 +109,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 893c479c7e9..2a9a1335b1f 100644
--- a/source/blender/editors/interface/interface_draw.c
+++ b/source/blender/editors/interface/interface_draw.c
@@ -44,6 +44,8 @@
#include "BIF_gl.h"
#include "BIF_glutil.h"
+#include "BLF_api.h"
+
#include "UI_interface.h"
#include "interface_intern.h"
@@ -466,7 +468,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;
@@ -685,6 +687,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)
{
@@ -692,10 +752,8 @@ 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 scaler_x1, scaler_x2;
- float alpha;
+ //float alpha;
GLint scissor[4];
if (hist==NULL) { printf("hist is null \n"); return; }
@@ -706,8 +764,7 @@ void ui_draw_but_HISTOGRAM(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *
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);
@@ -726,70 +783,327 @@ 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);
+
+ 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);
+ }
+
+ /* 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;
}
- glEnd();
-
- glColor4f(0.f, 0.f, 0.f, 0.25f);
+ }
+
+ 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) {
- 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));
+ /* 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);
}
- glEnd();
- glDisable(GL_LINE_SMOOTH);
+
+ /* 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);
+}
- /* restore scissortest */
- glScissor(scissor[0], scissor[1], scissor[2], scissor[3]);
+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];
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+ 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;
- /* height scaling widget */
- scaler_x1 = rect.xmin + w/2 - SCOPE_RESIZE_PAD;
- scaler_x2 = rect.xmin + w/2 + SCOPE_RESIZE_PAD;
+ w = rect.xmax - rect.xmin;
+ h = rect.ymax - rect.ymin;
+ centerx = rect.xmin + w/2;
+ centery = rect.ymin + h/2;
+ diam= (w<h)?w:h;
- 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);
-
+ alpha = scopes->vecscope_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.5f);
+ glColor4f(0.f, 0.f, 0.f, 0.3f);
uiSetRoundBox(15);
- gl_round_box(GL_LINE_LOOP, rect.xmin-1, rect.ymin, rect.xmax+1, rect.ymax+1, 3.0f);
+ 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)
{
ColorBand *coba;
@@ -832,7 +1146,7 @@ void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *wcol, rcti *rect)
glColor4fv( &cbd->r );
glVertex2fv(v1); glVertex2fv(v2);
- for( a = 1; a < sizex; a++ ) {
+ for( a = 1; a <= sizex; a++ ) {
pos = ((float)a) / (sizex-1);
do_colorband( coba, pos, colf );
if (but->block->color_profile != BLI_PR_NONE)
@@ -849,19 +1163,8 @@ void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *wcol, rcti *rect)
glDisable(GL_BLEND);
/* outline */
- v1[0]= x1; v1[1]= y1;
-
- cpack(0x0);
- glBegin(GL_LINE_LOOP);
- glVertex2fv(v1);
- v1[0]+= sizex;
- glVertex2fv(v1);
- v1[1]+= sizey;
- glVertex2fv(v1);
- v1[0]-= sizex;
- glVertex2fv(v1);
- glEnd();
-
+ glColor4f(0.0, 0.0, 0.0, 1.0);
+ fdrawbox(x1, y1, x1+sizex, y1+sizey);
/* help lines */
v1[0]= v2[0]=v3[0]= x1;
@@ -917,6 +1220,7 @@ void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *wcol, rcti *rect)
}
}
glEnd();
+
}
void ui_draw_but_NORMAL(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 fc69fc6fafa..ac06f635975 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -24,9 +24,11 @@
*/
#include <float.h>
+#include <limits.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
+#include <ctype.h>
#include "MEM_guardedalloc.h"
@@ -42,7 +44,6 @@
#include "BKE_idprop.h"
#include "BKE_report.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
#include "ED_screen.h"
#include "ED_util.h"
@@ -176,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);
@@ -184,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;
}
@@ -197,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;
}
@@ -208,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;
@@ -220,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;
@@ -229,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;
@@ -777,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);
@@ -801,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;
@@ -926,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;
}
@@ -951,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);
@@ -993,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 {
@@ -1131,7 +1155,7 @@ static int ui_textedit_delete_selection(uiBut *but, uiHandleButtonData *data)
int len= strlen(str);
int change= 0;
if(but->selsta != but->selend && len) {
- memmove( str+but->selsta, str+but->selend, len+1 );
+ memmove( str+but->selsta, str+but->selend, len-but->selsta+1 );
change= 1;
}
@@ -1139,6 +1163,7 @@ 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
@@ -1149,7 +1174,7 @@ static void ui_textedit_set_cursor_pos(uiBut *but, uiHandleButtonData *data, sho
uiStyleFontSet(fstyle);
if (fstyle->kerning==1) /* for BLF_width */
- BLF_enable(BLF_KERNING_DEFAULT);
+ BLF_enable(fstyle->uifont_id, BLF_KERNING_DEFAULT);
origstr= MEM_callocN(sizeof(char)*data->maxlen, "ui_textedit origstr");
@@ -1172,17 +1197,19 @@ static void ui_textedit_set_cursor_pos(uiBut *but, uiHandleButtonData *data, sho
while (i > 0) {
i--;
- if (BLF_width(origstr+i) > (startx - x)*0.25) break; // 0.25 == scale factor for less sensitivity
+ 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 (startx + BLF_width(origstr+but->ofs) > x) {
+ 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;
@@ -1192,7 +1219,7 @@ static void ui_textedit_set_cursor_pos(uiBut *but, uiHandleButtonData *data, sho
}
if (fstyle->kerning == 1)
- BLF_disable(BLF_KERNING_DEFAULT);
+ BLF_disable(fstyle->uifont_id, BLF_KERNING_DEFAULT);
MEM_freeN(origstr);
}
@@ -1508,6 +1535,19 @@ static void ui_textedit_begin(bContext *C, uiBut *but, uiHandleButtonData *data)
data->str= MEM_callocN(sizeof(char)*data->maxlen + 1, "textedit str");
ui_get_but_string(but, data->str, data->maxlen);
+ if(ELEM3(but->type, NUM, NUMABS, NUMSLI)) {
+ /* XXX: we dont have utf editing yet so for numbers its best to strip out utf chars
+ * this is so the deg' synbol isnt included in number editing fields: bug 22274 */
+ int i;
+ for(i=0; data->str[i]; i++) {
+ if(!isascii(data->str[i])) {
+ data->str[i]= '\0';
+ break;
+ }
+ }
+ }
+
+
data->origstr= BLI_strdup(data->str);
data->selextend= 0;
data->selstartx= 0;
@@ -1634,7 +1674,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;
@@ -1740,7 +1780,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) {
@@ -1970,14 +2014,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 */
@@ -2011,15 +2058,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;
}
}
@@ -2028,7 +2071,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;
@@ -2095,8 +2138,13 @@ static int ui_do_but_EXIT(bContext *C, uiBut *but, uiHandleButtonData *data, wmE
}
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) {
@@ -2189,7 +2237,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 */
@@ -2249,15 +2296,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 {
@@ -2265,8 +2315,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);
@@ -2278,7 +2327,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;
@@ -2926,6 +2975,8 @@ 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);
@@ -3009,7 +3060,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;
@@ -3023,13 +3074,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;
@@ -3056,7 +3123,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;
@@ -3107,7 +3174,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);
}
}
@@ -3183,24 +3250,8 @@ static int ui_do_but_COLORBAND(bContext *C, uiBlock *block, uiBut *but, uiHandle
if(event->ctrl) {
/* insert new key on mouse location */
- if(coba->tot < MAXCOLORBAND-1) {
- float pos= ((float)(mx - but->x1))/(but->x2-but->x1);
- float col[4];
-
- do_colorband(coba, pos, col); /* executes it */
-
- coba->tot++;
- coba->cur= coba->tot-1;
-
- coba->data[coba->cur].r= col[0];
- coba->data[coba->cur].g= col[1];
- coba->data[coba->cur].b= col[2];
- coba->data[coba->cur].a= col[3];
- coba->data[coba->cur].pos= pos;
-
- ui_colorband_update(coba);
- }
-
+ float pos= ((float)(mx - but->x1))/(but->x2-but->x1);
+ colorband_element_add(coba, pos);
button_activate_state(C, but, BUTTON_STATE_EXIT);
}
else {
@@ -3460,7 +3511,7 @@ static int ui_do_but_CURVE(bContext *C, uiBlock *block, uiBut *but, uiHandleButt
return WM_UI_HANDLER_CONTINUE;
}
-static int in_histogram_resize_zone(uiBut *but, int x, int y)
+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);
@@ -3480,7 +3531,7 @@ static int ui_numedit_but_HISTOGRAM(uiBut *but, uiHandleButtonData *data, int mx
dy = my - data->draglasty;
- if (in_histogram_resize_zone(but, data->dragstartx, data->dragstarty)) {
+ if (in_scope_resize_zone(but, data->dragstartx, data->dragstarty)) {
/* resize histogram widget itself */
hist->height = (but->y2 - but->y1) + (data->dragstarty - my);
} else {
@@ -3548,6 +3599,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)
{
@@ -4061,7 +4262,7 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
return WM_UI_HANDLER_BREAK;
}
/* reset to default */
- else if(event->type == ZEROKEY && event->val == KM_PRESS) {
+ else if(ELEM(event->type, ZEROKEY,PAD0) && event->val == KM_PRESS) {
if (!(ELEM3(but->type, HSVCIRCLE, HSVCUBE, HISTOGRAM)))
ui_set_but_default(C, but);
}
@@ -4132,11 +4333,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:
@@ -4569,7 +4777,7 @@ static void button_activate_init(bContext *C, ARegion *ar, uiBut *but, uiButtonA
button_activate_state(C, but, BUTTON_STATE_WAIT_FLASH);
}
-static void button_activate_exit(bContext *C, uiHandleButtonData *data, uiBut *but, int mousemove)
+static void button_activate_exit(bContext *C, uiHandleButtonData *data, uiBut *but, int mousemove, int onfree)
{
uiBlock *block= but->block;
uiBut *bt;
@@ -4579,7 +4787,8 @@ static void button_activate_exit(bContext *C, uiHandleButtonData *data, uiBut *b
button_activate_state(C, but, BUTTON_STATE_EXIT);
/* apply the button action or value */
- ui_apply_button(C, block, but, data, 0);
+ if(!onfree)
+ ui_apply_button(C, block, but, data, 0);
/* if this button is in a menu, this will set the button return
* value to the button value and the menu return value to ok, the
@@ -4594,7 +4803,7 @@ static void button_activate_exit(bContext *C, uiHandleButtonData *data, uiBut *b
}
}
- if(!data->cancel) {
+ if(!onfree && !data->cancel) {
/* autokey & undo push */
ui_apply_autokey_undo(C, but);
@@ -4627,7 +4836,8 @@ static void button_activate_exit(bContext *C, uiHandleButtonData *data, uiBut *b
but->active= NULL;
but->flag &= ~(UI_ACTIVE|UI_SELECT);
but->flag |= UI_BUT_LAST_ACTIVE;
- ui_check_but(but);
+ if(!onfree)
+ ui_check_but(but);
/* adds empty mousemove in queue for re-init handler, in case mouse is
* still over a button. we cannot just check for this ourselfs because
@@ -4636,7 +4846,7 @@ static void button_activate_exit(bContext *C, uiHandleButtonData *data, uiBut *b
WM_event_add_mousemove(C);
}
-void ui_button_active_cancel(const bContext *C, uiBut *but)
+void ui_button_active_free(const bContext *C, uiBut *but)
{
uiHandleButtonData *data;
@@ -4646,7 +4856,7 @@ void ui_button_active_cancel(const bContext *C, uiBut *but)
if(but->active) {
data= but->active;
data->cancel= 1;
- button_activate_exit((bContext*)C, data, but, 0);
+ button_activate_exit((bContext*)C, data, but, 0, 1);
}
}
@@ -4712,7 +4922,7 @@ static void ui_handle_button_activate(bContext *C, ARegion *ar, uiBut *but, uiBu
if(oldbut) {
data= oldbut->active;
data->cancel= 1;
- button_activate_exit(C, data, oldbut, 0);
+ button_activate_exit(C, data, oldbut, 0, 0);
}
button_activate_init(C, ar, but, type);
@@ -4870,7 +5080,7 @@ static int ui_handle_button_event(bContext *C, wmEvent *event, uiBut *but)
postbut= data->postbut;
posttype= data->posttype;
- button_activate_exit(C, data, but, (postbut == NULL));
+ button_activate_exit(C, data, but, (postbut == NULL), 0);
/* for jumping to the next button with tab while text editing */
if(postbut)
@@ -4974,20 +5184,21 @@ static void ui_handle_button_return_submenu(bContext *C, wmEvent *event, uiBut *
if(menu->menuretval != UI_RETURN_OK)
data->cancel= 1;
- button_activate_exit(C, data, but, 1);
+ button_activate_exit(C, data, but, 1, 0);
}
else if(menu->menuretval == UI_RETURN_OUT) {
if(event->type==MOUSEMOVE && ui_mouse_inside_button(data->region, but, event->x, event->y)) {
button_activate_state(C, but, BUTTON_STATE_HIGHLIGHT);
}
else {
- if(event->type != MOUSEMOVE) {
+ if (ISKEYBOARD(event->type)) {
+ /* keyboard menu hierarchy navigation, going back to previous level */
but->active->used_mouse= 0;
button_activate_state(C, but, BUTTON_STATE_HIGHLIGHT);
}
else {
data->cancel= 1;
- button_activate_exit(C, data, but, 1);
+ button_activate_exit(C, data, but, 1, 0);
}
}
}
@@ -5420,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 d08ec2f92c5..499c676bf6f 100644
--- a/source/blender/editors/interface/interface_icons.c
+++ b/source/blender/editors/interface/interface_icons.c
@@ -44,12 +44,15 @@
#include "BLI_blenlib.h"
#include "BLI_storage_types.h"
+#include "DNA_brush_types.h"
+#include "DNA_object_types.h"
#include "DNA_screen_types.h"
-#include "DNA_userdef_types.h"
+
+#include "RNA_access.h"
+#include "RNA_enum_types.h"
#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_image.h"
#include "BKE_icons.h"
#include "BKE_utildefines.h"
@@ -57,7 +60,6 @@
#include "IMB_imbuf_types.h"
#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "ED_datafiles.h"
#include "ED_render.h"
@@ -451,36 +453,76 @@ static void vicon_move_down_draw(int x, int y, int w, int h, float alpha)
glDisable(GL_LINE_SMOOTH);
}
+static void init_brush_icons()
+{
+
+#define INIT_BRUSH_ICON(icon_id, name) \
+ bbuf = IMB_ibImageFromMemory((unsigned char*)datatoc_ ##name## _png, \
+ datatoc_ ##name## _png_size, IB_rect); \
+ def_internal_icon(bbuf, icon_id, 0, 0, w, ICON_TYPE_BUFFER); \
+ IMB_freeImBuf(bbuf);
+ // end INIT_BRUSH_ICON
+
+ ImBuf *bbuf;
+ const int w = 96;
+
+ INIT_BRUSH_ICON(ICON_BRUSH_ADD, add);
+ INIT_BRUSH_ICON(ICON_BRUSH_BLOB, blob);
+ INIT_BRUSH_ICON(ICON_BRUSH_BLUR, blur);
+ INIT_BRUSH_ICON(ICON_BRUSH_CLAY, clay);
+ INIT_BRUSH_ICON(ICON_BRUSH_CLONE, clone);
+ INIT_BRUSH_ICON(ICON_BRUSH_CREASE, crease);
+ INIT_BRUSH_ICON(ICON_BRUSH_DARKEN, darken);
+ INIT_BRUSH_ICON(ICON_BRUSH_SCULPT_DRAW, draw);
+ INIT_BRUSH_ICON(ICON_BRUSH_FILL, fill);
+ INIT_BRUSH_ICON(ICON_BRUSH_FLATTEN, flatten);
+ INIT_BRUSH_ICON(ICON_BRUSH_GRAB, grab);
+ INIT_BRUSH_ICON(ICON_BRUSH_INFLATE, inflate);
+ INIT_BRUSH_ICON(ICON_BRUSH_LAYER, layer);
+ INIT_BRUSH_ICON(ICON_BRUSH_LIGHTEN, lighten);
+ INIT_BRUSH_ICON(ICON_BRUSH_MIX, mix);
+ INIT_BRUSH_ICON(ICON_BRUSH_MULTIPLY, multiply);
+ INIT_BRUSH_ICON(ICON_BRUSH_NUDGE, nudge);
+ INIT_BRUSH_ICON(ICON_BRUSH_PINCH, pinch);
+ INIT_BRUSH_ICON(ICON_BRUSH_SCRAPE, scrape);
+ INIT_BRUSH_ICON(ICON_BRUSH_SMEAR, smear);
+ INIT_BRUSH_ICON(ICON_BRUSH_SMOOTH, smooth);
+ INIT_BRUSH_ICON(ICON_BRUSH_SNAKE_HOOK, snake_hook);
+ INIT_BRUSH_ICON(ICON_BRUSH_SOFTEN, soften);
+ INIT_BRUSH_ICON(ICON_BRUSH_SUBTRACT, subtract);
+ INIT_BRUSH_ICON(ICON_BRUSH_TEXDRAW, texdraw);
+ INIT_BRUSH_ICON(ICON_BRUSH_THUMB, thumb);
+ INIT_BRUSH_ICON(ICON_BRUSH_ROTATE, twist);
+ INIT_BRUSH_ICON(ICON_BRUSH_VERTEXDRAW, vertexdraw);
+
+#undef INIT_BRUSH_ICON
+}
+
static void init_internal_icons()
{
bTheme *btheme= U.themes.first;
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 */
@@ -518,12 +560,14 @@ static void init_internal_icons()
else
icontype= ICON_TYPE_BUFFER;
- for (y=0; y<ICON_GRID_ROWS; y++) {
- for (x=0; x<ICON_GRID_COLS; x++) {
- def_internal_icon(bbuf, BIFICONID_FIRST + y*ICON_GRID_COLS + x,
- x*(ICON_GRID_W+ICON_GRID_MARGIN)+ICON_GRID_MARGIN,
- y*(ICON_GRID_H+ICON_GRID_MARGIN)+ICON_GRID_MARGIN, ICON_GRID_W,
- icontype);
+ if(bbuf) {
+ for (y=0; y<ICON_GRID_ROWS; y++) {
+ for (x=0; x<ICON_GRID_COLS; x++) {
+ def_internal_icon(bbuf, BIFICONID_FIRST + y*ICON_GRID_COLS + x,
+ x*(ICON_GRID_W+ICON_GRID_MARGIN)+ICON_GRID_MARGIN,
+ y*(ICON_GRID_H+ICON_GRID_MARGIN)+ICON_GRID_MARGIN, ICON_GRID_W,
+ icontype);
+ }
}
}
@@ -553,14 +597,14 @@ static void init_iconfile_list(struct ListBase *list)
char icondirstr[FILE_MAX];
char iconfilestr[FILE_MAX+16]; /* allow 256 chars for file+dir */
char olddir[FILE_MAX];
-
+ char *datadir= NULL;
+
list->first = list->last = NULL;
+ datadir = BLI_get_folder(BLENDER_DATAFILES, NULL);
-#ifdef WIN32
- BLI_make_file_string("/", icondirstr, BLI_gethome(), "icons");
-#else
- BLI_make_file_string("/", icondirstr, BLI_gethome(), ".blender/icons");
-#endif
+ if (!datadir) return;
+
+ BLI_make_file_string("/", icondirstr, datadir, "");
if(BLI_exists(icondirstr)==0)
return;
@@ -570,8 +614,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; i<totfile; i++) {
if( (dir[i].type & S_IFREG) ) {
@@ -742,6 +785,7 @@ void UI_icons_init(int first_dyn_id)
init_iconfile_list(&iconfilelist);
BKE_icons_init(first_dyn_id);
init_internal_icons();
+ init_brush_icons();
}
/* Render size for preview images at level miplevel */
@@ -766,6 +810,7 @@ static void icon_create_mipmap(struct PreviewImage* prv_img, int miplevel)
prv_img->w[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");
}
}
@@ -964,6 +1009,43 @@ void ui_id_icon_render(bContext *C, ID *id, int preview)
}
}
+static int ui_id_brush_get_icon(bContext *C, ID *id, int preview)
+{
+ Brush *br = (Brush*)id;
+
+ if(br->flag & BRUSH_CUSTOM_ICON) {
+ BKE_icon_getid(id);
+ ui_id_icon_render(C, id, preview);
+ }
+ else if(!id->icon_id) {
+ /* no icon found, reset it */
+
+ /* this is not nice, should probably make
+ brushes be strictly in one paint mode only
+ to avoid this kind of thing */
+ Object *ob = CTX_data_active_object(C);
+ EnumPropertyItem *items;
+ int tool;
+
+ if(ob && (ob->mode & OB_MODE_SCULPT)) {
+ items = brush_sculpt_tool_items;
+ tool = br->sculpt_tool;
+ }
+ else if(ob && (ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT))) {
+ items = brush_vertexpaint_tool_items;
+ tool = br->vertexpaint_tool;
+ }
+ else {
+ items = brush_imagepaint_tool_items;
+ tool = br->imagepaint_tool;
+ }
+
+ RNA_enum_icon_from_value(items, tool, &id->icon_id);
+ }
+
+ return id->icon_id;
+}
+
int ui_id_icon_get(bContext *C, ID *id, int preview)
{
int iconid= 0;
@@ -971,6 +1053,9 @@ int ui_id_icon_get(bContext *C, ID *id, int preview)
/* icon */
switch(GS(id->name))
{
+ case ID_BR:
+ iconid= ui_id_brush_get_icon(C, id, preview);
+ break;
case ID_MA: /* fall through */
case ID_TE: /* fall through */
case ID_IM: /* fall through */
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index f90b711cc09..84d6605651b 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;
@@ -183,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;
@@ -227,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;
@@ -443,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);
@@ -450,7 +456,7 @@ void ui_draw_but_IMAGE(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, rct
/* interface_handlers.c */
extern void ui_button_activate_do(struct bContext *C, struct ARegion *ar, uiBut *but);
-extern void ui_button_active_cancel(const struct bContext *C, uiBut *but);
+extern void ui_button_active_free(const struct bContext *C, uiBut *but);
extern int ui_button_is_active(struct ARegion *ar);
/* interface_widgets.c */
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index 2ae1a549db9..1d98b1f22c1 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -38,9 +38,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_idprop.h"
-#include "BKE_library.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "RNA_access.h"
@@ -431,18 +429,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;
@@ -462,11 +456,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);
@@ -514,7 +511,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);
@@ -614,6 +611,9 @@ PointerRNA uiItemFullO(uiLayout *layout, char *idname, char *name, int icon, 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)
@@ -624,7 +624,10 @@ PointerRNA uiItemFullO(uiLayout *layout, char *idname, char *name, int icon, 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);
@@ -946,7 +949,7 @@ void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index
}
/* 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);
@@ -973,7 +976,7 @@ void uiItemR(uiLayout *layout, PointerRNA *ptr, char *propname, int flag, char *
if(!prop) {
ui_item_disabled(layout, propname);
- printf("uiItemR: property not found: %s\n", propname);
+ printf("uiItemR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -986,7 +989,7 @@ void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr,
if(!prop || RNA_property_type(prop) != PROP_ENUM) {
ui_item_disabled(layout, propname);
- printf("uiItemEnumR: enum property not found: %s\n", propname);
+ printf("uiItemEnumR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1001,7 +1004,7 @@ void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, char *propname
if(!prop || RNA_property_type(prop) != PROP_ENUM) {
ui_item_disabled(layout, propname);
- printf("uiItemEnumR: enum property not found: %s\n", propname);
+ printf("uiItemEnumR_string: enum property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1105,12 +1108,30 @@ 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);
-
- name= RNA_struct_name_get_alloc(&itemptr, NULL, 0);
-
+
+ /* use filter */
+ if(RNA_property_type(but->rnaprop)==PROP_POINTER) {
+ if(RNA_property_pointer_poll(&but->rnapoin, but->rnaprop, &itemptr)==0)
+ continue;
+ }
+
+ if(itemptr.type && RNA_struct_is_ID(itemptr.type)) {
+ ID *id= itemptr.data;
+ char name_ui[32];
+
+#if 0 /* this name is used for a string comparison and can't be modified, TODO */
+ name_uiprefix_id(name_ui, id);
+#else
+ strcpy(name_ui, id->name+2);
+#endif
+ name= BLI_strdup(name_ui);
+ iconid= ui_id_icon_get((bContext*)C, id, 1);
+ }
+ else {
+ name= RNA_struct_name_get_alloc(&itemptr, NULL, 0);
+ iconid = 0;
+ }
+
if(name) {
if(BLI_strcasestr(name, str)) {
cis = MEM_callocN(sizeof(CollItemSearch), "CollectionItemSearch");
@@ -1119,9 +1140,9 @@ 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++;
}
RNA_PROP_END;
@@ -1204,7 +1225,7 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, char *propname, st
prop= RNA_struct_find_property(ptr, propname);
if(!prop) {
- printf("uiItemPointerR: property not found: %s\n", propname);
+ printf("uiItemPointerR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1217,7 +1238,7 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, char *propname, st
searchprop= RNA_struct_find_property(searchptr, searchpropname);
if(!searchprop || RNA_property_type(searchprop) != PROP_COLLECTION) {
- printf("uiItemPointerR: search collection property not found: %s\n", searchpropname);
+ printf("uiItemPointerR: search collection property not found: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname);
return;
}
@@ -1289,8 +1310,10 @@ 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 *menuname, char *name, int icon)
@@ -1993,6 +2016,7 @@ uiLayout *uiLayoutRow(uiLayout *layout, int align)
litem->enabled= 1;
litem->context= layout->context;
litem->space= (align)? 0: layout->root->style->buttonspacex;
+ litem->w = layout->w;
BLI_addtail(&layout->items, litem);
uiBlockSetCurLayout(layout->root->block, litem);
@@ -2012,6 +2036,7 @@ uiLayout *uiLayoutColumn(uiLayout *layout, int align)
litem->enabled= 1;
litem->context= layout->context;
litem->space= (litem->align)? 0: layout->root->style->buttonspacey;
+ litem->w = layout->w;
BLI_addtail(&layout->items, litem);
uiBlockSetCurLayout(layout->root->block, litem);
@@ -2031,6 +2056,7 @@ uiLayout *uiLayoutColumnFlow(uiLayout *layout, int number, int align)
flow->litem.enabled= 1;
flow->litem.context= layout->context;
flow->litem.space= (flow->litem.align)? 0: layout->root->style->columnspace;
+ flow->litem.w = layout->w;
flow->number= number;
BLI_addtail(&layout->items, flow);
@@ -2050,6 +2076,7 @@ static uiLayoutItemBx *ui_layout_box(uiLayout *layout, int type)
box->litem.enabled= 1;
box->litem.context= layout->context;
box->litem.space= layout->root->style->columnspace;
+ box->litem.w = layout->w;
BLI_addtail(&layout->items, box);
uiBlockSetCurLayout(layout->root->block, &box->litem);
diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c
index 419de8eb898..caee3c1c2fe 100644
--- a/source/blender/editors/interface/interface_ops.c
+++ b/source/blender/editors/interface/interface_ops.c
@@ -39,7 +39,6 @@
#include "BLI_math_color.h"
#include "BKE_context.h"
-#include "BKE_utildefines.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -322,6 +321,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;
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index e4088a64a17..9d22f3c5212 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -43,7 +43,6 @@
#include "BKE_context.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -285,32 +284,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;
@@ -656,6 +629,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;
@@ -864,6 +841,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)) {
@@ -954,7 +933,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);
@@ -966,7 +945,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) {
@@ -1019,6 +1002,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);
@@ -1027,11 +1013,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;
@@ -1049,7 +1030,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) {
@@ -1066,9 +1065,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, RETKEY);
+ break;
+ }
+ }
+ else if(event->type == LEFTMOUSE) {
if(inside_header) {
- ui_handle_panel_header(C, block, mx, my);
+ 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 35add45b10a..50b85360196 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -38,11 +38,7 @@
#include "BLI_ghash.h"
#include "BKE_context.h"
-#include "BKE_icons.h"
-#include "BKE_report.h"
#include "BKE_screen.h"
-#include "BKE_texture.h"
-#include "BKE_utildefines.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -453,10 +449,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; a<data->totline; 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;
}
@@ -1559,12 +1555,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) {
@@ -1591,7 +1596,7 @@ void ui_update_block_buts_rgb(uiBlock *block, float *rgb)
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", (unsigned int)(rgb_gamma[0]*255.0), (unsigned int)(rgb_gamma[1]*255.0), (unsigned int)(rgb_gamma[2]*255.0));
+ sprintf(col, "%02X%02X%02X", FTOCHAR(rgb_gamma[0]), FTOCHAR(rgb_gamma[1]), FTOCHAR(rgb_gamma[2]));
strcpy(bt->poin, col);
}
@@ -1630,7 +1635,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)
@@ -1646,7 +1651,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;
@@ -1667,7 +1672,7 @@ static void do_hex_rna_cb(bContext *C, void *bt1, void *hexcl)
srgb_to_linearrgb_v3_v3(rgb, rgb);
}
- ui_update_block_buts_rgb(but->block, rgb);
+ ui_update_block_buts_rgb(but->block, rgb, NULL);
if(popup)
popup->menuretval= UI_RETURN_UPDATE;
@@ -1736,11 +1741,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, 0, 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, "Color");
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, 0, 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, "Value");
uiButSetFunc(bt, do_picker_rna_cb, bt, NULL);
}
@@ -1751,11 +1756,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, 0, 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, "Color");
uiButSetFunc(bt, do_picker_rna_cb, bt, NULL);
/* value */
- bt= uiDefButR(block, HSVCUBE, 0, "", 0, 0, PICKER_TOTAL_W, PICKER_BAR, ptr, propname, 0, 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, "Value");
uiButSetFunc(bt, do_picker_rna_cb, bt, NULL);
}
@@ -1770,6 +1775,7 @@ static void uiBlockPicker(uiBlock *block, float *rgb, PointerRNA *ptr, PropertyR
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;
@@ -1785,6 +1791,10 @@ static void uiBlockPicker(uiBlock *block, float *rgb, PointerRNA *ptr, PropertyR
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);
@@ -1818,28 +1828,37 @@ 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, "Red");
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, "Green");
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, "Blue");
uiButSetFunc(bt, do_picker_rna_cb, bt, NULL);
+
// 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 */
uiBlockBeginAlign(block);
- bt= uiDefButF(block, NUMSLI, 0, "H ", 0, -60, butwidth, UI_UNIT_Y, hsv, 0.0, 1.0, 10, 3, "");
+ bt= uiDefButF(block, NUMSLI, 0, "H ", 0, -60, butwidth, UI_UNIT_Y, hsv, 0.0, 1.0, 10, 3, "Hue");
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, "");
+ bt= uiDefButF(block, NUMSLI, 0, "S ", 0, -80, butwidth, UI_UNIT_Y, hsv+1, 0.0, 1.0, 10, 3, "Saturation");
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, "Value");
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, "Alpha");
+ 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_gamma[0]*255.0), (unsigned int)(rgb_gamma[1]*255.0), (unsigned int)(rgb_gamma[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);
@@ -1874,7 +1893,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;
@@ -2095,13 +2114,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 */
@@ -2305,7 +2324,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 aaebdf5693a..03676ae5e06 100644
--- a/source/blender/editors/interface/interface_style.c
+++ b/source/blender/editors/interface/interface_style.c
@@ -38,12 +38,8 @@
#include "BLI_rect.h"
#include "BLI_string.h"
-#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_utildefines.h"
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "BLF_api.h"
@@ -147,34 +143,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 */
@@ -187,7 +183,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;
@@ -195,7 +191,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 */
@@ -206,29 +202,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 ************************ */
@@ -241,13 +237,13 @@ int UI_GetStringWidth(char *str)
int width;
if (fstyle->kerning==1) /* for BLF_width */
- BLF_enable(BLF_KERNING_DEFAULT);
+ BLF_enable(fstyle->uifont_id, BLF_KERNING_DEFAULT);
uiStyleFontSet(fstyle);
- width= BLF_width(str);
+ width= BLF_width(fstyle->uifont_id, str);
if (fstyle->kerning==1)
- BLF_disable(BLF_KERNING_DEFAULT);
+ BLF_disable(fstyle->uifont_id, BLF_KERNING_DEFAULT);
return width;
}
@@ -258,13 +254,13 @@ 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 ************************ */
-/* called on each .B.blend read */
+/* called on each startup.blend read */
/* reading without uifont will create one */
void uiStyleInit(void)
{
@@ -299,14 +295,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);
}
}
@@ -319,7 +314,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 200ef1fa501..45ebc9bf136 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -35,11 +35,11 @@
#include "BKE_colortools.h"
#include "BKE_context.h"
-#include "BKE_icons.h"
#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_utildefines.h"
+#include "BKE_texture.h"
+#include "BKE_report.h"
#include "ED_screen.h"
#include "ED_render.h"
@@ -52,6 +52,8 @@
#include "UI_interface.h"
#include "interface_intern.h"
+#include "BLF_api.h"
+
void ui_template_fix_linking()
{
}
@@ -67,64 +69,6 @@ void uiTemplateHeader(uiLayout *layout, bContext *C, int menus)
else ED_area_header_switchbutton(C, block, 0);
}
-/********************** DopeSheet Filter Template *************************/
-
-void uiTemplateDopeSheetFilter(uiLayout *layout, bContext *C, PointerRNA *ptr)
-{
- Main *mainptr= CTX_data_main(C);
- ScrArea *sa= CTX_wm_area(C);
- uiLayout *row= layout;
- short nlaActive= ((sa) && (sa->spacetype==SPACE_NLA));
-
- /* more 'generic' filtering options */
- row= uiLayoutRow(layout, 1);
-
- uiItemR(row, ptr, "only_selected", 0, "", 0);
- uiItemR(row, ptr, "display_transforms", 0, "", 0); // xxx: include in another position instead?
-
- if (nlaActive)
- uiItemR(row, ptr, "include_missing_nla", 0, "", 0);
-
- /* datatype based - only available datatypes are shown */
- row= uiLayoutRow(layout, 1);
-
- 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, ptr, "display_mesh", 0, "", 0);
- if (mainptr && mainptr->key.first)
- uiItemR(row, ptr, "display_shapekeys", 0, "", 0);
- if (mainptr && mainptr->mat.first)
- uiItemR(row, ptr, "display_material", 0, "", 0);
- if (mainptr && mainptr->lamp.first)
- uiItemR(row, ptr, "display_lamp", 0, "", 0);
- if (mainptr && mainptr->tex.first)
- uiItemR(row, ptr, "display_texture", 0, "", 0);
- if (mainptr && mainptr->camera.first)
- uiItemR(row, ptr, "display_camera", 0, "", 0);
- if (mainptr && mainptr->curve.first)
- uiItemR(row, ptr, "display_curve", 0, "", 0);
- if (mainptr && mainptr->mball.first)
- uiItemR(row, ptr, "display_metaball", 0, "", 0);
- if (mainptr && mainptr->armature.first)
- uiItemR(row, ptr, "display_armature", 0, "", 0);
- if (mainptr && mainptr->particle.first)
- 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, ptr, "only_group_objects", 0, "", 0);
-
- /* if enabled, show the group selection field too */
- if (RNA_boolean_get(ptr, "only_group_objects"))
- uiItemR(row, ptr, "filtering_group", 0, "", 0);
- }
-}
-
/********************** Search Callbacks *************************/
typedef struct TemplateID {
@@ -163,15 +107,26 @@ static void id_search_cb(const bContext *C, void *arg_template, char *str, uiSea
for(id= lb->first; id; id= id->next) {
if(!((flag & PROP_ID_SELF_CHECK) && id == id_from)) {
- /* hide dot-datablocks */
+ /* use filter */
+ if(RNA_property_type(template->prop)==PROP_POINTER) {
+ PointerRNA ptr;
+ RNA_id_pointer_create(id, &ptr);
+ if(RNA_property_pointer_poll(&template->ptr, template->prop, &ptr)==0)
+ continue;
+ }
+
+ /* hide dot-datablocks, but only if filter does not force it visible */
if(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);
-
- if(!uiSearchItemAdd(items, id->name+2, id, iconid))
+ char name_ui[32];
+ name_uiprefix_id(name_ui, id);
+
+ iconid= ui_id_icon_get((bContext*)C, id, 1);
+
+ if(!uiSearchItemAdd(items, name_ui, id, iconid))
break;
}
}
@@ -418,13 +373,17 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
if(!id_copy(id, NULL, 1 /* test only */) || (idfrom && idfrom->lib))
uiButSetFlag(but, UI_BUT_DISABLED);
}
+
+ if(id->lib == NULL && !(ELEM4(GS(id->name), ID_GR, ID_SCE, ID_SCR, ID_TXT))) {
+ uiDefButR(block, TOG, 0, "F", 0, 0, UI_UNIT_X, UI_UNIT_Y, &idptr, "use_fake_user", -1, 0, 0, -1, -1, NULL);
+ }
}
if(flag & UI_ID_ADD_NEW) {
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 {
@@ -481,7 +440,7 @@ static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, char
prop= RNA_struct_find_property(ptr, propname);
if(!prop || RNA_property_type(prop) != PROP_POINTER) {
- printf("uiTemplateID: pointer property not found: %s\n", propname);
+ printf("uiTemplateID: pointer property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -490,7 +449,7 @@ 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(newop)
flag |= UI_ID_ADD_NEW;
if(openop)
@@ -508,7 +467,6 @@ static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, char
}
MEM_freeN(template);
-
}
void uiTemplateID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop)
@@ -543,11 +501,11 @@ void uiTemplateAnyID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
propType= RNA_struct_find_property(ptr, proptypename);
if (!propID || RNA_property_type(propID) != PROP_POINTER) {
- printf("uiTemplateAnyID: pointer property not found: %s\n", propname);
+ printf("uiTemplateAnyID: pointer property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
if (!propType || RNA_property_type(propType) != PROP_ENUM) {
- printf("uiTemplateAnyID: pointer-type property not found: %s\n", proptypename);
+ printf("uiTemplateAnyID: pointer-type property not found: %s.%s\n", RNA_struct_identifier(ptr->type), proptypename);
return;
}
@@ -586,7 +544,7 @@ void uiTemplatePathBuilder(uiLayout *layout, bContext *C, PointerRNA *ptr, char
/* check that properties are valid */
propPath= RNA_struct_find_property(ptr, propname);
if (!propPath || RNA_property_type(propPath) != PROP_STRING) {
- printf("uiTemplatePathBuilder: path property not found: %s\n", propname);
+ printf("uiTemplatePathBuilder: path property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -608,12 +566,8 @@ void uiTemplatePathBuilder(uiLayout *layout, bContext *C, PointerRNA *ptr, char
#include "DNA_object_force.h"
#include "BKE_depsgraph.h"
-#include "BKE_DerivedMesh.h"
-#include "BKE_global.h"
#include "BKE_modifier.h"
-#include "BKE_object.h"
#include "BKE_particle.h"
-#include "BKE_report.h"
#include "ED_util.h"
@@ -675,13 +629,13 @@ static int modifier_can_delete(ModifierData *md)
return 1;
}
-static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, ModifierData *md, int index, int cageIndex, int lastCageIndex, int compact)
+static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, ModifierData *md, int index, int cageIndex, int lastCageIndex)
{
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
PointerRNA ptr;
uiBut *but;
uiBlock *block;
- uiLayout *box, *column, *row, *col;
+ uiLayout *box, *column, *row;
uiLayout *result= NULL;
int isVirtual = (md->mode & eModifierMode_Virtual);
char str[128];
@@ -709,65 +663,31 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
}
else {
/* REAL MODIFIER */
- uiLayout *split;
-
- split = uiLayoutSplit(box, 0.16, 0);
-
- col= uiLayoutColumn(split, 0);
- row = uiLayoutRow(col, 1);
-
+ row = uiLayoutRow(box, 0);
block = uiLayoutGetBlock(row);
uiBlockSetEmboss(block, UI_EMBOSSN);
-
/* Open/Close ................................. */
- uiItemR(row, &ptr, "expanded", 0, "", 0);
+ uiItemR(row, &ptr, "show_expanded", 0, "", 0);
/* modifier-type icon */
uiItemL(row, "", RNA_struct_ui_icon(ptr.type));
-
uiBlockSetEmboss(block, UI_EMBOSS);
-
- /* 'Middle Column' ............................
- * - first row is the name of the modifier
- * - second row is the visibility settings, since the layouts were not wide enough to show all
- */
- col= uiLayoutColumn(split, 0);
-
- row= uiLayoutRow(col, 0);
- uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_EXPAND);
-
- block = uiLayoutGetBlock(row);
-
/* modifier name */
uiItemR(row, &ptr, "name", 0, "", 0);
- if (compact) {
- /* insert delete button at end of top row before splitting to second line */
- uiBlockSetEmboss(block, UI_EMBOSSN);
- if (modifier_can_delete(md))
- uiItemO(row, "", ICON_X, "OBJECT_OT_modifier_remove");
- uiBlockSetEmboss(block, UI_EMBOSS);
-
- split = uiLayoutSplit(box, 0.17, 0);
- col= uiLayoutColumn(split, 0);
- uiItemL(col, "", 0);
- col= uiLayoutColumn(split, 0);
- row = uiLayoutRow(col, 1);
- }
-
/* mode enabling buttons */
uiBlockBeginAlign(block);
/* Softbody not allowed in this situation, enforce! */
if ( ((md->type!=eModifierType_Softbody && md->type!=eModifierType_Collision) || !(ob->pd && ob->pd->deflect))
&& (md->type!=eModifierType_Surface) )
{
- uiItemR(row, &ptr, "render", 0, "", 0);
- uiItemR(row, &ptr, "realtime", 0, "", 0);
+ uiItemR(row, &ptr, "show_render", 0, "", 0);
+ uiItemR(row, &ptr, "show_viewport", 0, "", 0);
if (mti->flags & eModifierTypeFlag_SupportsEditmode)
- uiItemR(row, &ptr, "editmode", 0, "", 0);
+ uiItemR(row, &ptr, "show_in_editmode", 0, "", 0);
}
if ((ob->type==OB_MESH) && modifier_couldBeCage(scene, md) && (index <= lastCageIndex))
{
@@ -785,12 +705,10 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
uiItemO(row, "", ICON_TRIA_DOWN, "OBJECT_OT_modifier_move_down");
uiBlockEndAlign(block);
- if(!compact) {
- uiBlockSetEmboss(block, UI_EMBOSSN);
- if (modifier_can_delete(md))
- uiItemO(row, "", ICON_X, "OBJECT_OT_modifier_remove");
- uiBlockSetEmboss(block, UI_EMBOSS);
- }
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+ if (modifier_can_delete(md))
+ uiItemO(row, "", ICON_X, "OBJECT_OT_modifier_remove");
+ uiBlockSetEmboss(block, UI_EMBOSS);
}
@@ -815,6 +733,7 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
}
}
else {
+ uiLayoutSetOperatorContext(row, WM_OP_INVOKE_DEFAULT);
uiItemEnumO(row, "OBJECT_OT_modifier_apply", "Apply", 0, "apply_as", MODIFIER_APPLY_DATA);
if (modifier_sameTopology(md))
@@ -824,7 +743,7 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
uiBlockClearButLock(block);
uiBlockSetButLock(block, ob && ob->id.lib, ERROR_LIBDATA_MESSAGE);
- if (!ELEM4(md->type, eModifierType_Fluidsim, eModifierType_Softbody, eModifierType_ParticleSystem, eModifierType_Cloth))
+ if (!ELEM5(md->type, eModifierType_Fluidsim, eModifierType_Softbody, eModifierType_ParticleSystem, eModifierType_Cloth, eModifierType_Smoke))
uiItemO(row, "Copy", 0, "OBJECT_OT_modifier_copy");
}
@@ -843,7 +762,7 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
return result;
}
-uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr, int compact)
+uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
{
Scene *scene = CTX_data_scene(C);
Object *ob;
@@ -874,7 +793,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr, int
for(i=0; vmd; i++, vmd=vmd->next) {
if(md == vmd)
- return draw_modifier(layout, scene, ob, md, i, cageIndex, lastCageIndex, compact);
+ return draw_modifier(layout, scene, ob, md, i, cageIndex, lastCageIndex);
else if(vmd->mode & eModifierMode_Virtual)
i--;
}
@@ -900,6 +819,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr, int
void do_constraint_panels(bContext *C, void *arg, int event)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
@@ -911,7 +831,7 @@ void do_constraint_panels(bContext *C, void *arg, int event)
break; // no handling
case B_CONSTRAINT_CHANGETARGET:
if (ob->pose) ob->pose->flag |= POSE_RECALC; // checks & sorts pose channels
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
break;
default:
break;
@@ -938,88 +858,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)
{
bPoseChannel *pchan= get_active_posechannel(ob);
bConstraintTypeInfo *cti;
uiBlock *block;
- uiLayout *result= NULL, *col, *box, *row, *subrow;
- uiBut *but;
+ uiLayout *result= NULL, *col, *box, *row;
PointerRNA ptr;
char typestr[32];
- short width = 265;
short proxy_protected, xco=0, yco=0;
int rb_col;
@@ -1052,38 +899,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, &ptr, "expanded", UI_ITEM_R_ICON_ONLY, "", 0);
-
- /* name */
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+ uiItemR(row, &ptr, "show_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, &ptr, "name", 0, "", 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,30 +957,32 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
show_upbut= ((prev_proxylock == 0) && (con->prev));
show_downbut= (con->next) ? 1 : 0;
+ uiLayoutSetOperatorContext(row, WM_OP_INVOKE_DEFAULT);
+
+ /* up/down */
if (show_upbut || show_downbut) {
uiBlockBeginAlign(block);
- uiBlockSetEmboss(block, UI_EMBOSS);
+ if (show_upbut)
+ uiItemO(row, "", 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(row, "", ICON_TRIA_DOWN, "CONSTRAINT_OT_move_down");
uiBlockEndAlign(block);
}
-
+
+ /* enabled */
+ uiItemR(row, &ptr, "mute", 0, "", 0);
+
/* 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;
@@ -1149,101 +990,9 @@ 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);
@@ -1286,7 +1035,6 @@ 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
@@ -1386,7 +1134,6 @@ void uiTemplatePreview(uiLayout *layout, ID *id, ID *parent, MTex *slot)
/********************** ColorRamp Template **************************/
-#include "BKE_texture.h"
typedef struct RNAUpdateCb {
PointerRNA ptr;
@@ -1405,60 +1152,51 @@ static void rna_update_cb(bContext *C, void *arg_cb, void *arg_unused)
#define B_BANDCOL 1
-static int vergcband(const void *a1, const void *a2)
-{
- const CBData *x1=a1, *x2=a2;
-
- if( x1->pos > x2->pos ) return 1;
- else if( x1->pos < x2->pos) return -1;
- return 0;
-}
-
-static void colorband_pos_cb(bContext *C, void *cb_v, void *coba_v)
+static void colorband_add_cb(bContext *C, void *cb_v, void *coba_v)
{
ColorBand *coba= coba_v;
- int a;
-
- if(coba->tot<2) return;
+ float pos= 0.5f;
- for(a=0; a<coba->tot; a++) coba->data[a].cur= a;
- qsort(coba->data, coba->tot, sizeof(CBData), vergcband);
- for(a=0; a<coba->tot; a++) {
- if(coba->data[a].cur==coba->cur) {
- coba->cur= a;
- break;
- }
+ if(coba->tot > 1) {
+ if(coba->cur > 0) pos= (coba->data[coba->cur-1].pos + coba->data[coba->cur].pos) * 0.5f;
+ else pos= (coba->data[coba->cur+1].pos + coba->data[coba->cur].pos) * 0.5f;
}
- rna_update_cb(C, cb_v, NULL);
+ if(colorband_element_add(coba, pos)) {
+ rna_update_cb(C, cb_v, NULL);
+ ED_undo_push(C, "Add colorband");
+ }
}
-static void colorband_add_cb(bContext *C, void *cb_v, void *coba_v)
+static void colorband_del_cb(bContext *C, void *cb_v, void *coba_v)
{
ColorBand *coba= coba_v;
- if(coba->tot < MAXCOLORBAND-1) coba->tot++;
- coba->cur= coba->tot-1;
-
- colorband_pos_cb(C, cb_v, coba_v);
-
- ED_undo_push(C, "Add colorband");
+ if(colorband_element_remove(coba, coba->cur)) {
+ ED_undo_push(C, "Delete colorband");
+ rna_update_cb(C, cb_v, NULL);
+ }
}
-static void colorband_del_cb(bContext *C, void *cb_v, void *coba_v)
+static void colorband_flip_cb(bContext *C, void *cb_v, void *coba_v)
{
+ CBData data_tmp[MAXCOLORBAND];
+
ColorBand *coba= coba_v;
int a;
- if(coba->tot<2) return;
-
- for(a=coba->cur; a<coba->tot; a++) {
- coba->data[a]= coba->data[a+1];
+ for(a=0; a<coba->tot; a++) {
+ data_tmp[a]= coba->data[coba->tot - (a + 1)];
}
- if(coba->cur) coba->cur--;
- coba->tot--;
+ for(a=0; a<coba->tot; 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, "Delete colorband");
+ ED_undo_push(C, "Flip colorband");
rna_update_cb(C, cb_v, NULL);
}
@@ -1473,12 +1211,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",
@@ -1489,6 +1232,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;
@@ -1511,8 +1256,10 @@ 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) {
@@ -1596,12 +1343,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;
+
+ 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;
- hist->height= (hist->height==0)?100:hist->height;
+ rect.xmin= 0; rect.xmax= 200;
+ rect.ymin= 0; rect.ymax= 190;
- bt= uiDefBut(block, HISTOGRAM, 0, "", rect.xmin, rect.ymin, rect.xmax-rect.xmin, hist->height, hist, 0, 0, 0, 0, "");
+ 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);
@@ -1609,7 +1429,6 @@ void uiTemplateHistogram(uiLayout *layout, PointerRNA *ptr, char *propname, int
/********************* CurveMapping Template ************************/
-#include "BKE_colortools.h"
static void curvemap_buttons_zoom_in(bContext *C, void *cumap_v, void *unused)
{
@@ -1718,7 +1537,7 @@ static void curvemap_tools_dofunc(bContext *C, void *cumap_v, int event)
switch(event) {
case 0: /* reset */
- curvemap_reset(cuma, &cumap->clipr, cumap->preset);
+ curvemap_reset(cuma, &cumap->clipr, cumap->preset, CURVEMAP_SLOPE_POSITIVE);
curvemapping_changed(cumap, 0);
break;
case 1:
@@ -1798,7 +1617,7 @@ static void curvemap_buttons_reset(bContext *C, void *cb_v, void *cumap_v)
cumap->preset = CURVE_PRESET_LINE;
for(a=0; a<CM_TOT; a++)
- curvemap_reset(cumap->cm+a, &cumap->clipr, cumap->preset);
+ curvemap_reset(cumap->cm+a, &cumap->clipr, cumap->preset, CURVEMAP_SLOPE_POSITIVE);
cumap->black[0]=cumap->black[1]=cumap->black[2]= 0.0f;
cumap->white[0]=cumap->white[1]=cumap->white[2]= 1.0f;
@@ -1963,62 +1782,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);
+ printf("uiTemplateColorWheel: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), 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, "");
-
- uiItemS(row);
-
- if (value_slider)
- uiDefButR(block, HSVCUBE, 0, "", WHEEL_SIZE+6, 0, 14, WHEEL_SIZE, ptr, propname, -1, softmin, softmax, 9, 0, "");
+ but= uiDefButR(block, HSVCIRCLE, 0, "", 0, 0, WHEEL_SIZE, WHEEL_SIZE, ptr, propname, -1, 0.0, 0.0, 0, 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);
+ 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);
+ }
-/********************* TriColor (ThemeWireColorSet) Template ************************/
-
-void uiTemplateTriColorSet(uiLayout *layout, PointerRNA *ptr, char *propname)
-{
- PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
- uiLayout *row;
- PointerRNA csPtr;
+ if(cubic)
+ but->flag |= UI_BUT_COLOR_CUBIC;
- if (!prop) {
- printf("uiTemplateTriColorSet: property not found: %s\n", propname);
- return;
- }
-
- /* we lay out the data in a row as 3 color swatches */
- row= uiLayoutRow(layout, 1);
-
- /* nselected, selected, active color swatches */
- csPtr= RNA_property_pointer_get(ptr, prop);
+ uiItemS(row);
- uiItemR(row, &csPtr, "normal", 0, "", 0);
- uiItemR(row, &csPtr, "selected", 0, "", 0);
- uiItemR(row, &csPtr, "active", 0, "", 0);
+ if (value_slider)
+ uiDefButR(block, HSVCUBE, 0, "", WHEEL_SIZE+6, 0, 14, WHEEL_SIZE, ptr, propname, -1, softmin, softmax, 9, 0, "");
}
/********************* Layer Buttons Template ************************/
@@ -2058,7 +1859,7 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, char *propname,
prop= RNA_struct_find_property(ptr, propname);
if (!prop) {
- printf("uiTemplateLayer: layers property not found: %s\n", propname);
+ printf("uiTemplateLayer: layers property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -2077,7 +1878,7 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, char *propname,
if(used_ptr && used_propname) {
used_prop= RNA_struct_find_property(used_ptr, used_propname);
if (!used_prop) {
- printf("uiTemplateLayer: used layers property not found: %s\n", used_propname);
+ printf("uiTemplateLayer: used layers property not found: %s.%s\n", RNA_struct_identifier(ptr->type), used_propname);
return;
}
@@ -2163,12 +1964,6 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
/* list item behind label & other buttons */
sub= uiLayoutRow(overlap, 0);
- if(itemptr->type == &RNA_ShapeKey) {
- ob= (Object*)activeptr->data;
- if(ob->mode == OB_MODE_EDIT && !(ob->type == OB_MESH))
- uiLayoutSetEnabled(sub, 0);
- }
-
but= uiDefButR(block, LISTROW, 0, "", 0,0, UI_UNIT_X*10,UI_UNIT_Y, activeptr, activepropname, 0, 0, i, 0, 0, "");
uiButSetFlag(but, UI_BUT_NO_TOOLTIP);
@@ -2197,7 +1992,7 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
else if(RNA_struct_is_a(itemptr->type, &RNA_SceneRenderLayer)) {
uiItemL(sub, name, icon);
uiBlockSetEmboss(block, UI_EMBOSS);
- uiDefButR(block, OPTION, 0, "", 0, 0, UI_UNIT_X, UI_UNIT_Y, itemptr, "enabled", 0, 0, 0, 0, 0, NULL);
+ uiDefButR(block, OPTION, 0, "", 0, 0, UI_UNIT_X, UI_UNIT_Y, itemptr, "use", 0, 0, 0, 0, 0, NULL);
}
else if(itemptr->type == &RNA_ShapeKey) {
ob= (Object*)activeptr->data;
@@ -2252,14 +2047,14 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propna
if(ptr->data) {
prop= RNA_struct_find_property(ptr, propname);
if(!prop) {
- printf("uiTemplateList: property not found: %s\n", propname);
+ printf("uiTemplateList: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
}
activeprop= RNA_struct_find_property(activeptr, activepropname);
if(!activeprop) {
- printf("uiTemplateList: property not found: %s\n", activepropname);
+ printf("uiTemplateList: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), activepropname);
return;
}
@@ -2456,6 +2251,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)
{
@@ -2464,11 +2260,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;
}
}
@@ -2477,15 +2276,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)
@@ -2494,43 +2314,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_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 1c75a05e084..32ede75c20d 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -28,7 +28,6 @@
#include <stdlib.h>
#include <string.h>
-#include "MEM_guardedalloc.h"
#include "DNA_screen_types.h"
#include "DNA_userdef_types.h"
@@ -39,7 +38,6 @@
#include "BKE_context.h"
#include "BKE_curve.h"
-#include "BKE_global.h"
#include "BKE_utildefines.h"
#include "RNA_access.h"
@@ -283,10 +281,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)
@@ -608,14 +606,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; a<wtb->totvert; 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; a<wtb->totvert; 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; a<wtb->totvert; 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; a<wtb->totvert; 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; a<wtb->totvert; 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; a<wtb->totvert; a++)
+ glVertex2fv(wtb->inner_v[a]);
+ glEnd();
+ }
}
else {
char col1[4], col2[4];
@@ -694,11 +745,10 @@ static void widgetbase_draw(uiWidgetBase *wtb, uiWidgetColors *wcol)
static void widget_draw_preview(BIFIconID icon, float aspect, float alpha, rcti *rect)
{
int w, h, x, y, size;
-
- /* only display previews for actual preview images .. ? */
- if (icon < BIFICONID_LAST)
+
+ if(!icon)
return;
-
+
w = rect->xmax - rect->xmin;
h = rect->ymax - rect->ymin;
size = MIN2(w, h);
@@ -813,15 +863,15 @@ static void ui_text_leftclip(uiFontStyle *fstyle, uiBut *but, rcti *rect)
uiStyleFontSet(fstyle);
if (fstyle->kerning==1) /* for BLF_width */
- BLF_enable(BLF_KERNING_DEFAULT);
+ 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) {
@@ -842,7 +892,7 @@ static void ui_text_leftclip(uiFontStyle *fstyle, uiBut *but, rcti *rect)
}
if (fstyle->kerning==1)
- BLF_disable(BLF_KERNING_DEFAULT);
+ BLF_disable(fstyle->uifont_id, BLF_KERNING_DEFAULT);
}
static void ui_text_label_rightclip(uiFontStyle *fstyle, uiBut *but, rcti *rect)
@@ -856,9 +906,9 @@ static void ui_text_label_rightclip(uiFontStyle *fstyle, uiBut *but, rcti *rect)
uiStyleFontSet(fstyle);
if (fstyle->kerning==1) /* for BLF_width */
- BLF_enable(BLF_KERNING_DEFAULT);
+ 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;
/* find the space after ':' separator */
@@ -873,7 +923,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;
}
@@ -882,7 +932,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;
}
@@ -895,12 +945,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(BLF_KERNING_DEFAULT);
+ BLF_disable(fstyle->uifont_id, BLF_KERNING_DEFAULT);
}
@@ -917,7 +967,7 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b
fstyle->align= UI_STYLE_TEXT_CENTER;
if (fstyle->kerning==1) /* for BLF_width */
- BLF_enable(BLF_KERNING_DEFAULT);
+ BLF_enable(fstyle->uifont_id, BLF_KERNING_DEFAULT);
/* text button selection and cursor */
if(but->editstr && but->pos != -1) {
@@ -935,7 +985,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
@@ -944,7 +994,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;
@@ -959,7 +1009,7 @@ 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) / but->aspect;
+ t= BLF_width(fstyle->uifont_id, but->drawstr+but->ofs) / but->aspect;
but->drawstr[pos]= ch;
}
@@ -971,7 +1021,7 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b
}
if (fstyle->kerning == 1)
- BLF_disable(BLF_KERNING_DEFAULT);
+ 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!
@@ -1276,6 +1326,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},
@@ -1322,6 +1385,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;
}
@@ -1574,6 +1638,10 @@ void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, rcti *rect)
float centx, centy, radius;
float rgb[3], hsv[3], hsvo[3], col[3], colcent[3];
int a, tot= 32;
+ int color_profile = but->block->color_profile;
+
+ if (but->rnaprop && RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
+ color_profile = BLI_PR_NONE;
radstep= 2.0f*M_PI/(float)tot;
centx= (float)(rect->xmin + rect->xmax)/2;
@@ -1589,10 +1657,13 @@ 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;
+ else if (color_profile)
+ hsv[2] = linearrgb_to_srgb(hsv[2]);
hsv_to_rgb(0.f, 0.f, hsv[2], colcent, colcent+1, colcent+2);
@@ -1607,6 +1678,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);
@@ -1621,14 +1694,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);
}
@@ -1813,11 +1891,8 @@ static void ui_draw_but_HSV_v(uiBut *but, rcti *rect)
float rgb[3], hsv[3], v, range;
int color_profile = but->block->color_profile;
- if (but->rnaprop) {
- if (RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA) {
- color_profile = BLI_PR_NONE;
- }
- }
+ if (but->rnaprop && RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
+ color_profile = BLI_PR_NONE;
ui_get_but_vectorf(but, rgb);
rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
@@ -1954,6 +2029,7 @@ void uiWidgetScrollDraw(uiWidgetColors *wcol, rcti *rect, rcti *slider, int stat
uiWidgetBase wtb;
float rad;
int horizontal;
+ short outline=0;
widget_init(&wtb);
@@ -1995,6 +2071,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) {
@@ -2013,6 +2093,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);
}
}
@@ -2077,9 +2160,35 @@ static void widget_scroll(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
uiWidgetScrollDraw(wcol, rect, &rect1, state);
}
-static void widget_link(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+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;
@@ -2094,7 +2203,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;
@@ -2161,9 +2269,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);
@@ -2179,8 +2293,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);
}
@@ -2318,6 +2434,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;
@@ -2384,10 +2530,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);
}
@@ -2504,6 +2651,7 @@ static uiWidgetType *widget_type(uiWidgetTypeEnum type)
break;
case UI_WTYPE_BOX:
+ wt.custom= widget_box;
wt.wcol_theme= &btheme->tui.wcol_box;
break;
@@ -2523,6 +2671,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;
@@ -2727,9 +2880,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);
@@ -2813,7 +2979,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);
@@ -2856,8 +3022,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 dcfbc94798b..c250cdb1284 100644
--- a/source/blender/editors/interface/resources.c
+++ b/source/blender/editors/interface/resources.c
@@ -34,10 +34,6 @@
#include <stdlib.h>
#include <string.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "MEM_guardedalloc.h"
@@ -275,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:
@@ -311,6 +309,8 @@ char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
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:
@@ -532,6 +532,7 @@ void ui_theme_init_default(void)
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
@@ -942,6 +943,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)
@@ -970,6 +979,7 @@ void UI_make_axis_color(char *src_col, char *dst_col, char axis)
/* patching UserDef struct and Themes */
void init_userdef_do_versions(void)
{
+ Main *bmain= G.main;
// countall();
/* the UserDef struct is not corrected with do_versions() .... ugh! */
@@ -988,9 +998,13 @@ void init_userdef_do_versions(void)
strcpy(U.tempdir, tmp?tmp:"/tmp/");
}
+ if (U.autokey_mode == 0) {
+ /* 'add/replace' but not on */
+ U.autokey_mode = 2;
+ }
if (U.savetime <= 0) {
U.savetime = 1;
-// XXX error(".B.blend is buggy, please consider removing it.\n");
+// XXX error("startup.blend is buggy, please consider removing it.\n");
}
/* transform widget settings */
if(U.tw_hotspot==0) {
@@ -1004,18 +1018,18 @@ void init_userdef_do_versions(void)
if(U.flag & USER_CUSTOM_RANGE)
vDM_ColorBand_store(&U.coba_weight); /* signal for derivedmesh to use colorband */
- if (G.main->versionfile <= 191) {
+ if (bmain->versionfile <= 191) {
strcpy(U.plugtexdir, U.textudir);
strcpy(U.sounddir, "/");
}
/* patch to set Dupli Armature */
- if (G.main->versionfile < 220) {
+ if (bmain->versionfile < 220) {
U.dupflag |= USER_DUP_ARM;
}
/* added seam, normal color, undo */
- if (G.main->versionfile <= 234) {
+ if (bmain->versionfile <= 234) {
bTheme *btheme;
U.uiflag |= USER_GLOBALUNDO;
@@ -1038,12 +1052,12 @@ void init_userdef_do_versions(void)
}
}
}
- if (G.main->versionfile <= 235) {
+ if (bmain->versionfile <= 235) {
/* illegal combo... */
if (U.flag & USER_LMOUSESELECT)
U.flag &= ~USER_TWOBUTTONMOUSE;
}
- if (G.main->versionfile <= 236) {
+ if (bmain->versionfile <= 236) {
bTheme *btheme;
/* new space type */
for(btheme= U.themes.first; btheme; btheme= btheme->next) {
@@ -1060,7 +1074,7 @@ void init_userdef_do_versions(void)
}
}
}
- if (G.main->versionfile <= 237) {
+ if (bmain->versionfile <= 237) {
bTheme *btheme;
/* bone colors */
for(btheme= U.themes.first; btheme; btheme= btheme->next) {
@@ -1071,7 +1085,7 @@ void init_userdef_do_versions(void)
}
}
}
- if (G.main->versionfile <= 238) {
+ if (bmain->versionfile <= 238) {
bTheme *btheme;
/* bone colors */
for(btheme= U.themes.first; btheme; btheme= btheme->next) {
@@ -1082,7 +1096,7 @@ void init_userdef_do_versions(void)
}
}
}
- if (G.main->versionfile <= 239) {
+ if (bmain->versionfile <= 239) {
bTheme *btheme;
for(btheme= U.themes.first; btheme; btheme= btheme->next) {
@@ -1096,7 +1110,7 @@ void init_userdef_do_versions(void)
}
if(U.obcenter_dia==0) U.obcenter_dia= 6;
}
- if (G.main->versionfile <= 241) {
+ if (bmain->versionfile <= 241) {
bTheme *btheme;
for(btheme= U.themes.first; btheme; btheme= btheme->next) {
/* Node editor theme, check for alpha==0 is safe, then color was never set */
@@ -1129,7 +1143,7 @@ void init_userdef_do_versions(void)
}
/* set defaults for 3D View rotating axis indicator */
- /* since size can't be set to 0, this indicates it's not saved in .B.blend */
+ /* since size can't be set to 0, this indicates it's not saved in startup.blend */
if (U.rvisize == 0) {
U.rvisize = 15;
U.rvibright = 8;
@@ -1137,7 +1151,7 @@ void init_userdef_do_versions(void)
}
}
- if (G.main->versionfile <= 242) {
+ if (bmain->versionfile <= 242) {
bTheme *btheme;
for(btheme= U.themes.first; btheme; btheme= btheme->next) {
@@ -1155,11 +1169,11 @@ void init_userdef_do_versions(void)
}
}
}
- if (G.main->versionfile <= 243) {
+ if (bmain->versionfile <= 243) {
/* set default number of recently-used files (if not set) */
if (U.recent_files == 0) U.recent_files = 10;
}
- if (G.main->versionfile < 245 || (G.main->versionfile == 245 && G.main->subversionfile < 3)) {
+ if (bmain->versionfile < 245 || (bmain->versionfile == 245 && bmain->subversionfile < 3)) {
bTheme *btheme;
for(btheme= U.themes.first; btheme; btheme= btheme->next) {
SETCOL(btheme->tv3d.editmesh_active, 255, 255, 255, 128);
@@ -1167,7 +1181,7 @@ void init_userdef_do_versions(void)
if(U.coba_weight.tot==0)
init_colorband(&U.coba_weight, 1);
}
- if ((G.main->versionfile < 245) || (G.main->versionfile == 245 && G.main->subversionfile < 11)) {
+ if ((bmain->versionfile < 245) || (bmain->versionfile == 245 && bmain->subversionfile < 11)) {
bTheme *btheme;
for (btheme= U.themes.first; btheme; btheme= btheme->next) {
/* these should all use the same colour */
@@ -1180,7 +1194,7 @@ void init_userdef_do_versions(void)
SETCOL(btheme->ttime.cframe, 0x60, 0xc0, 0x40, 255);
}
}
- if ((G.main->versionfile < 245) || (G.main->versionfile == 245 && G.main->subversionfile < 13)) {
+ if ((bmain->versionfile < 245) || (bmain->versionfile == 245 && bmain->subversionfile < 13)) {
bTheme *btheme;
for (btheme= U.themes.first; btheme; btheme= btheme->next) {
/* action channel groups (recolor anyway) */
@@ -1253,10 +1267,10 @@ void init_userdef_do_versions(void)
}
}
}
- if ((G.main->versionfile < 245) || (G.main->versionfile == 245 && G.main->subversionfile < 16)) {
+ if ((bmain->versionfile < 245) || (bmain->versionfile == 245 && bmain->subversionfile < 16)) {
U.flag |= USER_ADD_VIEWALIGNED|USER_ADD_EDITMODE;
}
- if ((G.main->versionfile < 247) || (G.main->versionfile == 247 && G.main->subversionfile <= 2)) {
+ if ((bmain->versionfile < 247) || (bmain->versionfile == 247 && bmain->subversionfile <= 2)) {
bTheme *btheme;
/* adjust themes */
@@ -1278,7 +1292,7 @@ void init_userdef_do_versions(void)
SETCOL(btheme->tseq.vertex_select, col[0], col[1], col[2], 255);
}
}
- if (G.main->versionfile < 250) {
+ if (bmain->versionfile < 250) {
bTheme *btheme;
for(btheme= U.themes.first; btheme; btheme= btheme->next) {
@@ -1319,7 +1333,7 @@ void init_userdef_do_versions(void)
U.ipo_new= BEZT_IPO_BEZ;
}
- if (G.main->versionfile < 250 || (G.main->versionfile == 250 && G.main->subversionfile < 1)) {
+ if (bmain->versionfile < 250 || (bmain->versionfile == 250 && bmain->subversionfile < 1)) {
bTheme *btheme;
for(btheme= U.themes.first; btheme; btheme= btheme->next) {
@@ -1342,7 +1356,7 @@ void init_userdef_do_versions(void)
}
}
- if (G.main->versionfile < 250 || (G.main->versionfile == 250 && G.main->subversionfile < 3)) {
+ if (bmain->versionfile < 250 || (bmain->versionfile == 250 && bmain->subversionfile < 3)) {
/* new audio system */
if(U.audiochannels == 0)
U.audiochannels = 2;
@@ -1360,10 +1374,10 @@ void init_userdef_do_versions(void)
U.audiorate = 44100;
}
- if (G.main->versionfile < 250 || (G.main->versionfile == 250 && G.main->subversionfile < 5))
+ if (bmain->versionfile < 250 || (bmain->versionfile == 250 && bmain->subversionfile < 5))
U.gameflags |= USER_DISABLE_VBO;
- if (G.main->versionfile < 250 || (G.main->versionfile == 250 && G.main->subversionfile < 8)) {
+ if (bmain->versionfile < 250 || (bmain->versionfile == 250 && bmain->subversionfile < 8)) {
wmKeyMap *km;
for(km=U.keymaps.first; km; km=km->next) {
@@ -1403,16 +1417,16 @@ void init_userdef_do_versions(void)
strcpy(km->idname, "Property Editor");
}
}
- if (G.main->versionfile < 250 || (G.main->versionfile == 250 && G.main->subversionfile < 16)) {
+ if (bmain->versionfile < 250 || (bmain->versionfile == 250 && bmain->subversionfile < 16)) {
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 (bmain->versionfile < 252 || (bmain->versionfile == 252 && bmain->subversionfile < 3)) {
if (U.flag & USER_LMOUSESELECT)
U.flag &= ~USER_TWOBUTTONMOUSE;
}
- if (G.main->versionfile < 252 || (G.main->versionfile == 252 && G.main->subversionfile < 4)) {
+ if (bmain->versionfile < 252 || (bmain->versionfile == 252 && bmain->subversionfile < 4)) {
bTheme *btheme;
/* default new handle type is auto handles */
@@ -1440,9 +1454,42 @@ void init_userdef_do_versions(void)
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 (bmain->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 (bmain->versionfile < 252 || (bmain->versionfile == 252 && bmain->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) {
@@ -1475,6 +1522,3 @@ void init_userdef_do_versions(void)
// XXX reset_autosave();
}
-
-
-
diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c
index d41317f7078..14ec7c6d0d6 100644
--- a/source/blender/editors/interface/view2d.c
+++ b/source/blender/editors/interface/view2d.c
@@ -44,7 +44,6 @@
#include "WM_api.h"
#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "BLF_api.h"
@@ -1314,6 +1313,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)
{
@@ -1389,6 +1395,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)
@@ -1429,6 +1436,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)
@@ -1702,8 +1710,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 */
@@ -1713,7 +1722,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);
}
}
}
@@ -2053,12 +2062,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 8e760a7501c..de1b26e987b 100644
--- a/source/blender/editors/interface/view2d_ops.c
+++ b/source/blender/editors/interface/view2d_ops.c
@@ -34,7 +34,6 @@
#include "BLI_blenlib.h"
#include "BKE_context.h"
-#include "BKE_utildefines.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -42,7 +41,6 @@
#include "WM_api.h"
#include "WM_types.h"
-#include "BIF_gl.h"
#include "ED_screen.h"
@@ -151,7 +149,8 @@ static void view_pan_apply(bContext *C, wmOperator *op)
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;
}
@@ -292,7 +291,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 */
@@ -339,9 +338,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);
@@ -386,9 +382,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);
@@ -432,9 +425,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);
@@ -479,9 +469,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);
@@ -569,11 +556,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;
}
@@ -588,16 +576,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;
}
@@ -612,19 +601,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;
}
@@ -679,9 +670,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);
@@ -699,9 +694,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);
@@ -737,7 +729,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);
@@ -755,9 +751,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);
@@ -789,10 +782,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;
}
@@ -807,10 +801,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;
}
@@ -871,7 +866,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;
@@ -890,9 +886,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)
@@ -1014,7 +1014,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);
@@ -1145,6 +1145,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;
@@ -1164,19 +1166,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
@@ -1198,17 +1202,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;
}
@@ -1248,14 +1259,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 +1274,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 +1331,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,6 +1346,7 @@ static void scroller_activate_apply(bContext *C, wmOperator *op)
v2d->cur.ymax += temp;
}
break;
+
}
/* validate that view is in valid configuration after this operation */
@@ -1353,7 +1368,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 +1379,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 +1401,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 +1532,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;
@@ -1545,9 +1575,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..5f75ceb34ef
--- /dev/null
+++ b/source/blender/editors/mesh/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
+ ../include
+ ../../blenkernel
+ ../../blenlib
+ ../../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/Makefile b/source/blender/editors/mesh/Makefile
index 8ae40e1b957..be57f72329a 100644
--- a/source/blender/editors/mesh/Makefile
+++ b/source/blender/editors/mesh/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c
index 7d47473e739..fc92598591a 100644
--- a/source/blender/editors/mesh/editface.c
+++ b/source/blender/editors/mesh/editface.c
@@ -44,21 +44,12 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
-#include "BKE_brush.h"
-#include "BKE_customdata.h"
-#include "BKE_depsgraph.h"
#include "BKE_DerivedMesh.h"
-#include "BKE_displist.h"
#include "BKE_global.h"
#include "BKE_mesh.h"
-#include "BKE_object.h"
-#include "BKE_texture.h"
-#include "BKE_utildefines.h"
-#include "BKE_customdata.h"
#include "BKE_context.h"
#include "BIF_gl.h"
-#include "BIF_glutil.h"
#ifndef DISABLE_PYTHON
@@ -77,7 +68,7 @@
#include "mesh_intern.h"
/* ***************** XXX **************** */
-static int pupmenu() {return 0;}
+static int pupmenu(const char *dummy) {return 0;}
/* ***************** XXX **************** */
diff --git a/source/blender/editors/mesh/editmesh.c b/source/blender/editors/mesh/editmesh.c
index e3f0d96ccfc..e6ba228c260 100644
--- a/source/blender/editors/mesh/editmesh.c
+++ b/source/blender/editors/mesh/editmesh.c
@@ -32,8 +32,11 @@
#include "MEM_guardedalloc.h"
-
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
#include "DNA_key_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
@@ -41,27 +44,15 @@
#include "BLI_dynstr.h"
#include "BLI_rand.h"
-#include "BKE_cloth.h"
+#include "BKE_DerivedMesh.h"
#include "BKE_context.h"
-#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
-#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
#include "BKE_key.h"
-#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_mesh.h"
-#include "BKE_modifier.h"
-#include "BKE_object.h"
#include "BKE_paint.h"
-#include "BKE_pointcache.h"
-#include "BKE_softbody.h"
-#include "BKE_texture.h"
-#include "BKE_utildefines.h"
-
-#include "LBM_fluidsim.h"
-
#include "ED_mesh.h"
#include "ED_object.h"
@@ -87,8 +78,8 @@ editmesh.c:
*/
/* XXX */
-static void BIF_undo_push() {}
-static void error() {}
+static void BIF_undo_push(const char *dummy) {}
+static void error(const char *dummy) {}
/* ***************** HASH ********************* */
@@ -1333,7 +1324,7 @@ static EnumPropertyItem prop_separate_types[] = {
};
/* return 1: success */
-static int mesh_separate_selected(Scene *scene, Base *editbase)
+static int mesh_separate_selected(Main *bmain, Scene *scene, Base *editbase)
{
EditMesh *em, *emnew;
EditVert *eve, *v1;
@@ -1375,7 +1366,7 @@ static int mesh_separate_selected(Scene *scene, Base *editbase)
*/
/* 1 */
- basenew= ED_object_add_duplicate(scene, editbase, 0); /* 0 = fully linked */
+ basenew= ED_object_add_duplicate(bmain, scene, editbase, 0); /* 0 = fully linked */
ED_base_object_select(basenew, BA_DESELECT);
/* 2 */
@@ -1444,7 +1435,7 @@ static int mesh_separate_selected(Scene *scene, Base *editbase)
}
/* return 1: success */
-static int mesh_separate_material(Scene *scene, Base *editbase)
+static int mesh_separate_material(Main *bmain, Scene *scene, Base *editbase)
{
Mesh *me= editbase->object->data;
EditMesh *em= BKE_mesh_get_editmesh(me);
@@ -1456,7 +1447,7 @@ static int mesh_separate_material(Scene *scene, Base *editbase)
/* select the material */
EM_select_by_material(em, curr_mat);
/* and now separate */
- if(0==mesh_separate_selected(scene, editbase)) {
+ if(0==mesh_separate_selected(bmain, scene, editbase)) {
BKE_mesh_end_editmesh(me, em);
return 0;
}
@@ -1467,7 +1458,7 @@ static int mesh_separate_material(Scene *scene, Base *editbase)
}
/* return 1: success */
-static int mesh_separate_loose(Scene *scene, Base *editbase)
+static int mesh_separate_loose(Main *bmain, Scene *scene, Base *editbase)
{
Mesh *me;
EditMesh *em;
@@ -1483,10 +1474,18 @@ static int mesh_separate_loose(Scene *scene, Base *editbase)
}
EM_clear_flag_all(em, SELECT);
-
- while(doit && em->verts.first) {
+
+ while(doit) {
/* Select a random vert to start with */
- EditVert *eve= em->verts.first;
+ EditVert *eve;
+ int tot;
+
+ /* check if all verts that are visible have been done */
+ for(eve=em->verts.first; eve; eve= eve->next)
+ if(!eve->h) break;
+ if(eve==NULL) break; /* only hidden verts left, quit early */
+
+ /* first non hidden vert */
eve->f |= SELECT;
selectconnected_mesh_all(em);
@@ -1496,8 +1495,14 @@ static int mesh_separate_loose(Scene *scene, Base *editbase)
if((eve->f & SELECT)==0) break;
if(eve==NULL) break;
+ tot= BLI_countlist(&em->verts);
+
/* and now separate */
- doit= mesh_separate_selected(scene, editbase);
+ doit= mesh_separate_selected(bmain, scene, editbase);
+
+ /* with hidden verts this can happen */
+ if(tot == BLI_countlist(&em->verts))
+ break;
}
BKE_mesh_end_editmesh(me, em);
@@ -1507,16 +1512,17 @@ static int mesh_separate_loose(Scene *scene, Base *editbase)
static int mesh_separate_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Base *base= CTX_data_active_base(C);
int retval= 0, type= RNA_enum_get(op->ptr, "type");
if(type == 0)
- retval= mesh_separate_selected(scene, base);
+ retval= mesh_separate_selected(bmain, scene, base);
else if(type == 1)
- retval= mesh_separate_material (scene, base);
+ retval= mesh_separate_material(bmain, scene, base);
else if(type == 2)
- retval= mesh_separate_loose(scene, base);
+ retval= mesh_separate_loose(bmain, scene, base);
if(retval) {
WM_event_add_notifier(C, NC_GEOM|ND_DATA, base->object->data);
diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c
index 47ff6ad7c8c..ca1a80110f3 100644
--- a/source/blender/editors/mesh/editmesh_add.c
+++ b/source/blender/editors/mesh/editmesh_add.c
@@ -47,11 +47,8 @@
#include "BKE_context.h"
#include "BKE_depsgraph.h"
-#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_mesh.h"
-#include "BKE_object.h"
-#include "BKE_utildefines.h"
#include "BKE_report.h"
#include "WM_api.h"
@@ -140,7 +137,7 @@ static int dupli_extrude_cursor(bContext *C, wmOperator *op, wmEvent *event)
if( (eed->v1->f & SELECT)+(eed->v2->f & SELECT) == SELECT ) {
if(eed->v1->f & SELECT) sub_v3_v3v3(vec, eed->v1->co, eed->v2->co);
else sub_v3_v3v3(vec, eed->v2->co, eed->v1->co);
- add_v3_v3v3(nor, nor, vec);
+ add_v3_v3(nor, vec);
done= 1;
}
}
@@ -1262,6 +1259,23 @@ static void make_prim(Object *obedit, int type, float mat[4][4], int tot, int se
/* ********* add primitive operators ************* */
+static char *get_mesh_defname(int type)
+{
+ switch (type) {
+ case PRIM_PLANE: return "Plane";
+ case PRIM_CUBE: return "Cube";
+ case PRIM_CIRCLE: return "Circle";
+ case PRIM_CYLINDER: return "Tube";
+ case PRIM_CONE: return "Cone";
+ case PRIM_GRID: return "Grid";
+ case PRIM_UVSPHERE: return "Sphere";
+ case PRIM_ICOSPHERE: return "Icosphere";
+ case PRIM_MONKEY: return "Monkey";
+ default:
+ return "Mesh";
+ }
+}
+
static void make_prim_ext(bContext *C, float *loc, float *rot, int enter_editmode, unsigned int layer,
int type, int tot, int seg,
int subdiv, float dia, float depth, int ext, int fill)
@@ -1269,18 +1283,24 @@ static void make_prim_ext(bContext *C, float *loc, float *rot, int enter_editmod
Object *obedit= CTX_data_edit_object(C);
int newob = 0;
float mat[4][4];
+ float scale;
if(obedit==NULL || obedit->type!=OB_MESH) {
obedit= ED_object_add_type(C, OB_MESH, loc, rot, FALSE, layer);
+ rename_id((ID *)obedit, get_mesh_defname(type));
+ rename_id((ID *)obedit->data, get_mesh_defname(type));
+
/* create editmode */
ED_object_enter_editmode(C, EM_DO_UNDO|EM_IGNORE_LAYER); /* rare cases the active layer is messed up */
newob = 1;
}
else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
- dia *= ED_object_new_primitive_matrix(C, loc, rot, mat);
- depth *= ED_object_new_primitive_matrix(C, loc, rot, mat);
+ scale= ED_object_new_primitive_matrix(C, obedit, loc, rot, mat);
+
+ dia *= scale;
+ depth *= scale;
make_prim(obedit, type, mat, tot, seg, subdiv, dia, depth, ext, fill);
@@ -1301,7 +1321,8 @@ static int add_primitive_plane_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;
/* sqrt(2.0f) - plane (diameter of 1.41 makes it unit size) */
make_prim_ext(C, loc, rot, enter_editmode, layer,
@@ -1333,7 +1354,8 @@ static int add_primitive_cube_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;
/* sqrt(2.0f) - plane (diameter of 1.41 makes it unit size) */
make_prim_ext(C, loc, rot, enter_editmode, layer,
@@ -1365,7 +1387,8 @@ static int add_primitive_circle_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;
make_prim_ext(C, loc, rot, enter_editmode, layer,
PRIM_CIRCLE, RNA_int_get(op->ptr, "vertices"), 0, 0,
@@ -1404,7 +1427,8 @@ static int add_primitive_tube_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;
make_prim_ext(C, loc, rot, enter_editmode, layer,
PRIM_CYLINDER, RNA_int_get(op->ptr, "vertices"), 0, 0,
@@ -1445,7 +1469,8 @@ static int add_primitive_cone_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;
make_prim_ext(C, loc, rot, enter_editmode, layer,
PRIM_CONE, RNA_int_get(op->ptr, "vertices"), 0, 0,
@@ -1485,7 +1510,8 @@ static int add_primitive_grid_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;
make_prim_ext(C, loc, rot, enter_editmode, layer,
PRIM_GRID, RNA_int_get(op->ptr, "x_subdivisions"),
@@ -1524,7 +1550,8 @@ static int add_primitive_monkey_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;
make_prim_ext(C, loc, rot, enter_editmode, layer,
PRIM_MONKEY, 0, 0, 2, 0.0f, 0.0f, 0, 0);
@@ -1556,10 +1583,11 @@ static int add_primitive_uvsphere_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;
make_prim_ext(C, loc, rot, enter_editmode, layer,
- PRIM_UVSPHERE, RNA_int_get(op->ptr, "rings"),
+ PRIM_UVSPHERE, RNA_int_get(op->ptr, "ring_count"),
RNA_int_get(op->ptr, "segments"), 0,
RNA_float_get(op->ptr,"size"), 0.0f, 0, 0);
@@ -1583,7 +1611,7 @@ void MESH_OT_primitive_uv_sphere_add(wmOperatorType *ot)
/* props */
RNA_def_int(ot->srna, "segments", 32, INT_MIN, INT_MAX, "Segments", "", 3, 500);
- RNA_def_int(ot->srna, "rings", 16, INT_MIN, INT_MAX, "Rings", "", 3, 500);
+ RNA_def_int(ot->srna, "ring_count", 16, INT_MIN, INT_MAX, "Rings", "", 3, 500);
RNA_def_float(ot->srna, "size", 1.0f, 0.0, FLT_MAX, "Size", "", 0.001, 100.00);
ED_object_add_generic_props(ot, TRUE);
@@ -1595,7 +1623,8 @@ static int add_primitive_icosphere_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;
make_prim_ext(C, loc, rot, enter_editmode, layer,
PRIM_ICOSPHERE, 0, 0, RNA_int_get(op->ptr, "subdivisions"),
@@ -1620,7 +1649,7 @@ void MESH_OT_primitive_ico_sphere_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
- RNA_def_int(ot->srna, "subdivisions", 2, 0, 6, "Subdivisions", "", 0, 8);
+ RNA_def_int(ot->srna, "subdivisions", 2, 0, INT_MAX, "Subdivisions", "", 0, 8);
RNA_def_float(ot->srna, "size", 1.0f, 0.0f, FLT_MAX, "Size", "", 0.001f, 100.00);
ED_object_add_generic_props(ot, TRUE);
diff --git a/source/blender/editors/mesh/editmesh_lib.c b/source/blender/editors/mesh/editmesh_lib.c
index 90d720e9c18..d34cca0d358 100644
--- a/source/blender/editors/mesh/editmesh_lib.c
+++ b/source/blender/editors/mesh/editmesh_lib.c
@@ -967,13 +967,13 @@ static void update_data_blocks(EditMesh *em, CustomData *olddata, CustomData *da
}
}
-void EM_add_data_layer(EditMesh *em, CustomData *data, int type)
+void EM_add_data_layer(EditMesh *em, CustomData *data, int type, const char *name)
{
CustomData olddata;
olddata= *data;
olddata.layers= (olddata.layers)? MEM_dupallocN(olddata.layers): NULL;
- CustomData_add_layer(data, type, CD_CALLOC, NULL, 0);
+ CustomData_add_layer_named(data, type, CD_CALLOC, NULL, 0, name);
update_data_blocks(em, &olddata, data);
if (olddata.layers) MEM_freeN(olddata.layers);
@@ -996,9 +996,9 @@ void EM_free_data_layer(EditMesh *em, CustomData *data, int type)
static void add_normal_aligned(float *nor, float *add)
{
if( INPR(nor, add) < -0.9999f)
- sub_v3_v3v3(nor, nor, add);
+ sub_v3_v3(nor, add);
else
- add_v3_v3v3(nor, nor, add);
+ add_v3_v3(nor, add);
}
static void set_edge_directions_f2(EditMesh *em, int val)
@@ -1316,8 +1316,8 @@ static short extrudeflag_edge(Object *obedit, EditMesh *em, short flag, float *n
copy_v3_v3(co2, eed->v2->co);
if (mmd->mirror_ob) {
- mul_v3_m4v3(co1, mtx, co1);
- mul_v3_m4v3(co2, mtx, co2);
+ mul_m4_v3(mtx, co1);
+ mul_m4_v3(mtx, co2);
}
if (mmd->flag & MOD_MIR_AXIS_X)
@@ -1605,8 +1605,8 @@ short extrudeflag_vert(Object *obedit, EditMesh *em, short flag, float *nor, int
copy_v3_v3(co2, eed->v2->co);
if (mmd->mirror_ob) {
- mul_v3_m4v3(co1, mtx, co1);
- mul_v3_m4v3(co2, mtx, co2);
+ mul_m4_v3(mtx, co1);
+ mul_m4_v3(mtx, co2);
}
if (mmd->flag & MOD_MIR_AXIS_X)
@@ -2006,15 +2006,15 @@ void recalc_editnormals(EditMesh *em)
if(efa->v4) {
normal_quad_v3( efa->n,efa->v1->co, efa->v2->co, efa->v3->co, efa->v4->co);
cent_quad_v3(efa->cent, efa->v1->co, efa->v2->co, efa->v3->co, efa->v4->co);
- add_v3_v3v3(efa->v4->no, efa->v4->no, efa->n);
+ add_v3_v3(efa->v4->no, efa->n);
}
else {
normal_tri_v3( efa->n,efa->v1->co, efa->v2->co, efa->v3->co);
cent_tri_v3(efa->cent, efa->v1->co, efa->v2->co, efa->v3->co);
}
- add_v3_v3v3(efa->v1->no, efa->v1->no, efa->n);
- add_v3_v3v3(efa->v2->no, efa->v2->no, efa->n);
- add_v3_v3v3(efa->v3->no, efa->v3->no, efa->n);
+ add_v3_v3(efa->v1->no, efa->n);
+ add_v3_v3(efa->v2->no, efa->n);
+ add_v3_v3(efa->v3->no, efa->n);
}
/* following Mesh convention; we use vertex coordinate itself for normal in this case */
diff --git a/source/blender/editors/mesh/editmesh_loop.c b/source/blender/editors/mesh/editmesh_loop.c
index 90de0a01eea..682fbca5072 100644
--- a/source/blender/editors/mesh/editmesh_loop.c
+++ b/source/blender/editors/mesh/editmesh_loop.c
@@ -51,13 +51,7 @@ editmesh_loop: tools with own drawing subloops, select, knife, subdiv
#include "BKE_context.h"
#include "BKE_depsgraph.h"
-#include "BKE_displist.h"
-#include "BKE_global.h"
-#include "BKE_library.h"
#include "BKE_mesh.h"
-#include "BKE_object.h"
-#include "BKE_report.h"
-#include "BKE_utildefines.h"
#include "PIL_time.h"
@@ -75,9 +69,9 @@ editmesh_loop: tools with own drawing subloops, select, knife, subdiv
#include "mesh_intern.h"
/* **** XXX ******** */
-static void BIF_undo_push() {}
+static void BIF_undo_push(const char *dummy) {}
static void BIF_undo() {}
-static void error() {}
+static void error(const char *dummy) {}
static int qtest() {return 0;}
/* **** XXX ******** */
@@ -629,7 +623,7 @@ static int knife_cut_exec(bContext *C, wmOperator *op)
int len=0;
short numcuts= RNA_int_get(op->ptr, "num_cuts");
short mode= RNA_int_get(op->ptr, "type");
- int corner_cut_pattern= RNA_enum_get(op->ptr,"corner_cut_pattern");
+// int corner_cut_pattern= RNA_enum_get(op->ptr,"corner_cut_pattern");
/* edit-object needed for matrix, and ar->regiondata for projections to work */
if (ELEM3(NULL, obedit, ar, ar->regiondata))
@@ -660,7 +654,7 @@ static int knife_cut_exec(bContext *C, wmOperator *op)
eed->tmp.fp = 0.0;
/*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 gh");
for(eve=em->verts.first; eve; eve=eve->next){
scr = MEM_mallocN(sizeof(float)*2, "Vertex Screen Coordinates");
VECCOPY(co, eve->co);
diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c
index 7a5fd2d13cd..0274bf1004d 100644
--- a/source/blender/editors/mesh/editmesh_mods.c
+++ b/source/blender/editors/mesh/editmesh_mods.c
@@ -55,14 +55,9 @@ editmesh_mods.c, UI level access, no geometry changes
#include "BKE_context.h"
#include "BKE_displist.h"
#include "BKE_depsgraph.h"
-#include "BKE_DerivedMesh.h"
-#include "BKE_customdata.h"
-#include "BKE_global.h"
#include "BKE_mesh.h"
#include "BKE_material.h"
#include "BKE_paint.h"
-#include "BKE_texture.h"
-#include "BKE_utildefines.h"
#include "BKE_report.h"
#include "IMB_imbuf_types.h"
@@ -82,7 +77,6 @@ editmesh_mods.c, UI level access, no geometry changes
#include "ED_view3d.h"
#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "mesh_intern.h"
@@ -90,7 +84,7 @@ editmesh_mods.c, UI level access, no geometry changes
/* XXX */
static void waitcursor(int val) {}
-static int pupmenu() {return 0;}
+static int pupmenu(const char *dummy) {return 0;}
/* ****************************** MIRROR **************** */
@@ -186,7 +180,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 */
@@ -931,7 +925,7 @@ static int similar_edge_select__internal(ToolSettings *ts, EditMesh *em, int mod
/* cound how many faces each edge uses use tmp.l */
for(efa= em->faces.first; efa; efa= efa->next) {
/* here we use the edges temp data to assign a face
- if a face has alredy been assigned (eed->f2==1)
+ if a face has already been assigned (eed->f2==1)
we calculate the angle between the current face and
the edges previously found face.
store the angle in eed->tmp.fp (loosing the face eed->tmp.f)
@@ -1207,7 +1201,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
if (dvert && !(eve->f & SELECT) && !eve->h && dvert->totweight) {
/* do the extra check for selection in the following if, so were not
- checking verts that may be alredy selected */
+ checking verts that may be already selected */
for (i=0; base_dvert->totweight >i && !(eve->f & SELECT); i++) {
for (j=0; dvert->totweight >j; j++) {
if (base_dvert->dw[i].def_nr==dvert->dw[j].def_nr) {
@@ -2150,7 +2144,7 @@ static void mouse_mesh_shortest_path(bContext *C, short mval[2])
if(ese && ese->type == EDITEDGE) {
eed_act = (EditEdge*)ese->data;
if (eed_act != eed) {
- if (edgetag_shortest_path(vc.scene, em, eed_act, eed)) {
+ if (edgetag_shortest_path(vc.scene, em, eed_act, eed)) { /* <- this is where the magic happens */
EM_remove_selection(em, eed_act, EDITEDGE);
path = 1;
}
@@ -2163,13 +2157,19 @@ static void mouse_mesh_shortest_path(bContext *C, short mval[2])
}
/* even if this is selected it may not be in the selection list */
- if(edgetag_context_check(vc.scene, eed)==EDGE_MODE_SELECT)
+ if(edgetag_context_check(vc.scene, eed)==0) {
EM_remove_selection(em, eed, EDITEDGE);
+ }
else {
/* other modes need to keep the last edge tagged */
- if(eed_act)
- EM_select_edge(eed_act, 0);
+ if(eed_act) {
+ if(vc.scene->toolsettings->edge_mode!=EDGE_MODE_SELECT) {
+ /* for non-select modes, always de-select the previous active edge */
+ EM_select_edge(eed_act, 0);
+ }
+ }
+ /* set the new edge active */
EM_select_edge(eed, 1);
EM_store_selection(em, eed, EDITEDGE);
}
@@ -2208,6 +2208,16 @@ static int mesh_shortest_path_select_invoke(bContext *C, wmOperator *op, wmEvent
return OPERATOR_FINISHED;
}
+
+static int mesh_shortest_path_select_poll(bContext *C)
+{
+ if(ED_operator_editmesh_view3d(C)) {
+ Object *obedit= CTX_data_edit_object(C);
+ EditMesh *em= BKE_mesh_get_editmesh(obedit->data);
+ return (em->selectmode & SCE_SELECT_EDGE);
+ }
+ return 0;
+}
void MESH_OT_select_shortest_path(wmOperatorType *ot)
{
@@ -2218,7 +2228,7 @@ void MESH_OT_select_shortest_path(wmOperatorType *ot)
/* api callbacks */
ot->invoke= mesh_shortest_path_select_invoke;
- ot->poll= ED_operator_editmesh_view3d;
+ ot->poll= mesh_shortest_path_select_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -3420,7 +3430,7 @@ static int select_all_exec(bContext *C, wmOperator *op)
void MESH_OT_select_all(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Select/Deselect All";
+ ot->name= "Select or Deselect All";
ot->description= "Change selection of all vertices, edges or faces";
ot->idname= "MESH_OT_select_all";
@@ -4058,7 +4068,7 @@ static void editmesh_calc_selvert_center(EditMesh *em, float cent_r[3])
EditVert *eve;
int nsel= 0;
- cent_r[0]= cent_r[1]= cent_r[0]= 0.0;
+ zero_v3(cent_r);
for (eve= em->verts.first; eve; eve= eve->next) {
if (eve->f & SELECT) {
@@ -4301,11 +4311,11 @@ static int smooth_vertex(bContext *C, wmOperator *op)
if((eed->v1->f & SELECT) && eed->v1->f1<255) {
eed->v1->f1++;
- add_v3_v3v3(eed->v1->tmp.p, eed->v1->tmp.p, fvec);
+ add_v3_v3(eed->v1->tmp.p, fvec);
}
if((eed->v2->f & SELECT) && eed->v2->f1<255) {
eed->v2->f1++;
- add_v3_v3v3(eed->v2->tmp.p, eed->v2->tmp.p, fvec);
+ add_v3_v3(eed->v2->tmp.p, fvec);
}
}
eed= eed->next;
@@ -4317,6 +4327,10 @@ static int smooth_vertex(bContext *C, wmOperator *op)
if(eve->f & SELECT) {
if(eve->f1) {
+ int xaxis= RNA_boolean_get(op->ptr, "xaxis");
+ int yaxis= RNA_boolean_get(op->ptr, "yaxis");
+ int zaxis= RNA_boolean_get(op->ptr, "zaxis");
+
if (((Mesh *)obedit->data)->editflag & ME_EDIT_MIRROR_X) {
eve_mir= editmesh_get_x_mirror_vert(obedit, em, eve, eve->co, index);
}
@@ -4324,9 +4338,12 @@ static int smooth_vertex(bContext *C, wmOperator *op)
adr = eve->tmp.p;
fac= 0.5/(float)eve->f1;
- eve->co[0]= 0.5*eve->co[0]+fac*adr[0];
- eve->co[1]= 0.5*eve->co[1]+fac*adr[1];
- eve->co[2]= 0.5*eve->co[2]+fac*adr[2];
+ if(xaxis)
+ eve->co[0]= 0.5*eve->co[0]+fac*adr[0];
+ if(yaxis)
+ eve->co[1]= 0.5*eve->co[1]+fac*adr[1];
+ if(zaxis)
+ eve->co[2]= 0.5*eve->co[2]+fac*adr[2];
/* clip if needed by mirror modifier */
@@ -4395,6 +4412,9 @@ void MESH_OT_vertices_smooth(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
RNA_def_int(ot->srna, "repeat", 1, 1, 100, "Smooth Iterations", "", 1, INT_MAX);
+ RNA_def_boolean(ot->srna, "xaxis", 1, "X-Axis", "Smooth along the X axis.");
+ RNA_def_boolean(ot->srna, "yaxis", 1, "Y-Axis", "Smooth along the Y axis.");
+ RNA_def_boolean(ot->srna, "zaxis", 1, "Z-Axis", "Smooth along the Z axis.");
}
void vertexnoise(Object *obedit, EditMesh *em)
@@ -4426,7 +4446,7 @@ void vertexnoise(Object *obedit, EditMesh *em)
vec[1]= 0.2*(b2-BLI_hnoise(tex->noisesize, eve->co[0], eve->co[1]+ofs, eve->co[2]));
vec[2]= 0.2*(b2-BLI_hnoise(tex->noisesize, eve->co[0], eve->co[1], eve->co[2]+ofs));
- add_v3_v3v3(eve->co, eve->co, vec);
+ add_v3_v3(eve->co, vec);
}
else {
float tin, dum;
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 35fc5c1e3bc..5d6d9e314f2 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -37,8 +37,6 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise
#include <math.h>
#include <float.h>
-#include "MEM_guardedalloc.h"
-
#include "BLO_sys_types.h" // for intptr_t support
#include "DNA_meshdata_types.h"
@@ -47,6 +45,8 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise
#include "DNA_scene_types.h"
#include "DNA_key_types.h"
+#include "MEM_guardedalloc.h"
+
#include "RNA_define.h"
#include "RNA_access.h"
@@ -59,19 +59,13 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise
#include "BLI_heap.h"
#include "BKE_context.h"
-#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h"
#include "BKE_key.h"
-#include "BKE_library.h"
#include "BKE_mesh.h"
-#include "BKE_object.h"
-#include "BKE_utildefines.h"
#include "BKE_bmesh.h"
#include "BKE_report.h"
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -80,6 +74,7 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise
#include "ED_screen.h"
#include "ED_transform.h"
#include "ED_view3d.h"
+#include "ED_object.h"
#include "mesh_intern.h"
@@ -481,20 +476,19 @@ static int removedoublesflag_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
- /*char msg[100];*/
- /*int cnt =*/ removedoublesflag(em,1,0,RNA_float_get(op->ptr, "limit"));
- /*XXX this messes up last operator panel
- if(cnt)
- {
- sprintf(msg, "Removed %d vertices", cnt);
- BKE_report(op->reports, RPT_INFO, msg);
- }*/
+ int count = removedoublesflag(em,1,0,RNA_float_get(op->ptr, "limit"));
+
+ if(count) {
+ recalc_editnormals(em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ }
+ BKE_reportf(op->reports, RPT_INFO, "Removed %d vertices", count);
BKE_mesh_end_editmesh(obedit->data, em);
+
return OPERATOR_FINISHED;
}
@@ -648,8 +642,7 @@ void extrude_mesh(Scene *scene, Object *obedit, EditMesh *em, wmOperator *op, sh
* This shouldn't be necessary, derived queries should be
* automatically building this data if invalid. Or something.
*/
-// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
- object_handle_update(scene, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
/* individual faces? */
// BIF_TransformSetUndo("Extrude");
@@ -661,7 +654,7 @@ void extrude_mesh(Scene *scene, Object *obedit, EditMesh *em, wmOperator *op, sh
// initTransform(TFM_TRANSLATION, CTX_NO_PET|CTX_NO_MIRROR);
if(transmode=='n') {
mul_m4_v3(obedit->obmat, nor);
- sub_v3_v3v3(nor, nor, obedit->obmat[3]);
+ sub_v3_v3(nor, obedit->obmat[3]);
// BIF_setSingleAxisConstraint(nor, "along normal");
}
// Transform();
@@ -798,6 +791,7 @@ void MESH_OT_extrude(wmOperatorType *ot)
/* properties */
prop= RNA_def_enum(ot->srna, "type", extrude_items, 0, "Type", "");
+ RNA_def_property_flag(prop, PROP_HIDDEN);
RNA_def_enum_funcs(prop, extrude_itemf);
ot->prop= prop;
}
@@ -1034,11 +1028,11 @@ void MESH_OT_spin(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
- RNA_def_int(ot->srna, "steps", 9, 0, INT_MAX, "Steps", "Steps", 0, INT_MAX);
+ RNA_def_int(ot->srna, "steps", 9, 0, INT_MAX, "Steps", "Steps", 0, 128);
RNA_def_boolean(ot->srna, "dupli", 0, "Dupli", "Make Duplicates");
RNA_def_float(ot->srna, "degrees", 90.0f, -FLT_MAX, FLT_MAX, "Degrees", "Degrees", -360.0f, 360.0f);
- RNA_def_float_vector(ot->srna, "center", 3, NULL, -FLT_MAX, FLT_MAX, "Center", "Center in global view space", -FLT_MAX, FLT_MAX);
+ RNA_def_float_vector_xyz(ot->srna, "center", 3, NULL, -FLT_MAX, FLT_MAX, "Center", "Center in global view space", -FLT_MAX, FLT_MAX);
RNA_def_float_vector(ot->srna, "axis", 3, NULL, -1.0f, 1.0f, "Axis", "Axis in global view space", -FLT_MAX, FLT_MAX);
}
@@ -1145,7 +1139,7 @@ void MESH_OT_screw(wmOperatorType *ot)
RNA_def_int(ot->srna, "steps", 9, 0, INT_MAX, "Steps", "Steps", 0, 256);
RNA_def_int(ot->srna, "turns", 1, 0, INT_MAX, "Turns", "Turns", 0, 256);
- RNA_def_float_vector(ot->srna, "center", 3, NULL, -FLT_MAX, FLT_MAX, "Center", "Center in global view space", -FLT_MAX, FLT_MAX);
+ RNA_def_float_vector_xyz(ot->srna, "center", 3, NULL, -FLT_MAX, FLT_MAX, "Center", "Center in global view space", -FLT_MAX, FLT_MAX);
RNA_def_float_vector(ot->srna, "axis", 3, NULL, -1.0f, 1.0f, "Axis", "Axis in global view space", -FLT_MAX, FLT_MAX);
}
@@ -1447,7 +1441,7 @@ static void alter_co(float *co, EditEdge *edge, float smooth, float fractal, int
vec1[0]= fac*(float)(0.5-BLI_drand());
vec1[1]= fac*(float)(0.5-BLI_drand());
vec1[2]= fac*(float)(0.5-BLI_drand());
- add_v3_v3v3(co, co, vec1);
+ add_v3_v3(co, vec1);
}
}
@@ -2729,7 +2723,7 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float smooth, float
}
}
- gh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+ gh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "subdivideedgenum gh");
// If we are knifing, We only need the selected edges that were cut, so deselect if it was not cut
if(beauty & B_KNIFE) {
@@ -3094,21 +3088,21 @@ static void givequadverts(EditFace *efa, EditFace *efa1, EditVert **v1, EditVert
if VTEST(efa1, 1, efa) {
*v3= efa1->v1;
- *v4= efa1->v2;
+ *v4= (efa1->v2 == *v2)? efa1->v3: efa1->v2;
vindex[2]= 0;
- vindex[3]= 1;
+ vindex[3]= (efa1->v2 == *v2)? 2: 1;
}
else if VTEST(efa1, 2, efa) {
*v3= efa1->v2;
- *v4= efa1->v3;
+ *v4= (efa1->v3 == *v2)? efa1->v1: efa1->v3;
vindex[2]= 1;
- vindex[3]= 2;
+ vindex[3]= (efa1->v3 == *v2)? 0: 2;
}
else if VTEST(efa1, 3, efa) {
*v3= efa1->v3;
- *v4= efa1->v1;
+ *v4= (efa1->v1 == *v2)? efa1->v2: efa1->v1;
vindex[2]= 2;
- vindex[3]= 0;
+ vindex[3]= (efa1->v1 == *v2)? 1: 0;
}
else
*v3= *v4= NULL;
@@ -3417,7 +3411,7 @@ void join_triangles(EditMesh *em)
efaa= (EVPtr *)eed->tmp.p;
v1 = v2 = v3 = v4 = NULL;
givequadverts(efaa[0], efaa[1], &v1, &v2, &v3, &v4, vindex);
- if((v1 && v2 && v3 && v4) && (exist_face(em, v1, v2, v3, v4)==0)){ /*exist_face is very slow! Needs to be adressed.*/
+ if((v1 && v2 && v3 && v4) && (exist_face(em, v1, v2, v3, v4)==0)){ /*exist_face is very slow! Needs to be addressed.*/
/*flag for delete*/
eed->f1 |= T2QDELETE;
/*create new quad and select*/
@@ -3657,10 +3651,10 @@ static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed, int dir)
newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], 4+p[0][1], -1);
}
else if(fac1 == 4 && fac2 == 3) {
- if(dir == DIRECTION_CW) {
+ if(dir == DIRECTION_CCW) {
newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][1], p[0][2], p[0][3], 4+p[1][1]);
newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], 4+p[0][1], -1);
- } else if (dir == DIRECTION_CCW) {
+ } else if (dir == DIRECTION_CW) {
newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][2], 4+p[1][1], p[0][0], p[0][1]);
newFace[1]= EM_face_from_faces(em, face[1], face[0], 4+p[0][2], p[1][0], p[1][1], -1);
@@ -3669,10 +3663,10 @@ static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed, int dir)
}
}
else if(fac1 == 3 && fac2 == 4) {
- if(dir == DIRECTION_CW) {
+ if(dir == DIRECTION_CCW) {
newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][1], p[0][2], 4+p[1][1], -1);
newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], p[1][3], 4+p[0][1]);
- } else if (dir == DIRECTION_CCW) {
+ } else if (dir == DIRECTION_CW) {
newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][0], p[0][1], 4+p[1][2], -1);
newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], 4+p[0][1], 4+p[0][2]);
@@ -3682,10 +3676,10 @@ static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed, int dir)
}
else if(fac1 == 4 && fac2 == 4) {
- if(dir == DIRECTION_CW) {
+ if(dir == DIRECTION_CCW) {
newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][1], p[0][2], p[0][3], 4+p[1][1]);
newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], p[1][3], 4+p[0][1]);
- } else if (dir == DIRECTION_CCW) {
+ } else if (dir == DIRECTION_CW) {
newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][2], p[0][3], 4+p[1][1], 4+p[1][2]);
newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][2], p[1][3], 4+p[0][1], 4+p[0][2]);
@@ -3696,7 +3690,7 @@ static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed, int dir)
else
return; /* This should never happen */
- if(dir == DIRECTION_CW || (fac1 == 3 && fac2 == 3)) {
+ if(dir == DIRECTION_CCW || (fac1 == 3 && fac2 == 3)) {
verts[0][p[0][1]]->f |= SELECT;
verts[1][p[1][1]]->f |= SELECT;
}
@@ -4091,7 +4085,7 @@ useless:
// populate the SlideVerts
- vertgh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+ vertgh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "EdgeSlide gh");
look = vertlist;
while(look) {
i=0;
@@ -4259,7 +4253,7 @@ useless:
for (uvlay_idx=0; uvlay_idx<uvlay_tot; uvlay_idx++) {
- uvarray[uvlay_idx] = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+ uvarray[uvlay_idx] = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "EdgeSlideUV gh");
for(ev=em->verts.first;ev;ev=ev->next) {
ev->tmp.l = 0;
@@ -5162,7 +5156,7 @@ static int blend_from_shape_exec(bContext *C, wmOperator *op)
if(add) {
mul_v3_fl(co, blend);
- add_v3_v3v3(eve->co, eve->co, co);
+ add_v3_v3(eve->co, co);
}
else
interp_v3_v3v3(eve->co, eve->co, co, blend);
@@ -5778,7 +5772,7 @@ static void em_snap_to_center(EditMesh *em)
for (eve=em->verts.first; eve; eve=eve->next) {
if (eve->f & SELECT) {
- add_v3_v3v3(cent, cent, eve->co);
+ add_v3_v3(cent, eve->co);
i++;
}
}
@@ -5863,6 +5857,7 @@ static int merge_exec(bContext *C, wmOperator *op)
if(!count)
return OPERATOR_CANCELLED;
+ recalc_editnormals(em);
BKE_reportf(op->reports, RPT_INFO, "Removed %d vert%s.", count, (count==1)?"ex":"ices");
@@ -6174,6 +6169,7 @@ static int region_to_loop(bContext *C, wmOperator *op)
}
em->selectmode = SCE_SELECT_EDGE;
+ CTX_data_tool_settings(C)->selectmode= em->selectmode;
EM_selectmode_set(em);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -7080,6 +7076,184 @@ void MESH_OT_beautify_fill(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+/* ********************** 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;
+}
+
+
+static int sort_faces_exec(bContext *C, wmOperator *op)
+{
+ RegionView3D *rv3d= ED_view3d_context_rv3d(C);
+ View3D *v3d= CTX_wm_view3d(C);
+ Object *ob= CTX_data_edit_object(C);
+ Scene *scene= CTX_data_scene(C);
+ Mesh *me;
+ CustomDataLayer *layer;
+ int i, *index;
+ int event;
+ float reverse = 1;
+ // XXX int ctrl= 0;
+
+ if (!v3d) return OPERATOR_CANCELLED;
+
+ /* This operator work in Object Mode, not in edit mode.
+ * After talk with Cambell we agree that there is no point to port this to EditMesh right now.
+ * so for now, we just exit_editmode and enter_editmode at the end of this function.
+ */
+ ED_object_exit_editmode(C, EM_FREEDATA);
+
+ me= ob->data;
+ if(me->totface==0) {
+ ED_object_enter_editmode(C, 0);
+ return OPERATOR_FINISHED;
+ }
+
+ event= RNA_enum_get(op->ptr, "type");
+
+ // XXX
+ //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; i<me->totface; 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; i<me->totface; 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_v3(vec, (me->mvert+mf->v3)->co);
+ add_v3_v3(vec, (me->mvert+mf->v4)->co);
+ mul_v3_fl(vec, 0.25f);
+ } else {
+ add_v3_v3(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);
+
+ /* Return to editmode. */
+ ED_object_enter_editmode(C, 0);
+
+ return OPERATOR_FINISHED;
+}
+
+void MESH_OT_sort_faces(wmOperatorType *ot)
+{
+ static EnumPropertyItem type_items[]= {
+ { 1, "VIEW_AXIS", 0, "View Axis", "" },
+ { 2, "CURSOR_DISTANCE", 0, "Cursor Distance", "" },
+ { 3, "MATERIAL", 0, "Material", "" },
+ { 4, "SELECTION", 0, "Selection", "" },
+ { 5, "RANDOMIZE", 0, "Randomize", "" },
+ { 0, NULL, 0, NULL, NULL }};
+
+ /* identifiers */
+ ot->name= "Sort Faces"; // XXX (Ctrl to reverse)%t|
+ ot->description= "The faces of the active Mesh Object are sorted, based on the current view.";
+ ot->idname= "MESH_OT_sort_faces";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= sort_faces_exec;
+ ot->poll= ED_operator_editmesh;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ ot->prop= RNA_def_enum(ot->srna, "type", type_items, 0, "Type", "");
+}
+
/********************** Quad/Tri Operators *************************/
static int quads_convert_to_tris_exec(bContext *C, wmOperator *op)
diff --git a/source/blender/editors/mesh/loopcut.c b/source/blender/editors/mesh/loopcut.c
index 314aa2c345f..488b59fa29e 100644
--- a/source/blender/editors/mesh/loopcut.c
+++ b/source/blender/editors/mesh/loopcut.c
@@ -51,7 +51,6 @@
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_scene.h"
-#include "BKE_utildefines.h"
#include "BKE_mesh.h"
#include "BIF_gl.h"
@@ -60,7 +59,6 @@
#include "IMB_imbuf_types.h"
#include "ED_screen.h"
-#include "ED_util.h"
#include "ED_space_api.h"
#include "ED_view3d.h"
#include "ED_mesh.h"
@@ -271,6 +269,16 @@ static void ringsel_finish(bContext *C, wmOperator *op)
if (lcd->do_cut) {
EditMesh *em = BKE_mesh_get_editmesh(lcd->ob->data);
esubdivideflag(lcd->ob, em, SELECT, 0.0f, 0.0f, 0, cuts, 0, SUBDIV_SELECT_LOOPCUT);
+
+ /* 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;
+ EM_selectmode_set(em);
+ }
DAG_id_flush_update(lcd->ob->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, lcd->ob->data);
@@ -403,7 +411,7 @@ static int ringcut_modal (bContext *C, wmOperator *op, wmEvent *event)
switch (event->type) {
case LEFTMOUSE: /* 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 70352e9399f..35cb9f02b64 100644
--- a/source/blender/editors/mesh/mesh_data.c
+++ b/source/blender/editors/mesh/mesh_data.c
@@ -39,10 +39,9 @@
#include "DNA_view3d_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"
@@ -158,7 +157,7 @@ static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *la
}
}
-int ED_mesh_uv_texture_add(bContext *C, Scene *scene, Object *ob, Mesh *me)
+int ED_mesh_uv_texture_add(bContext *C, Scene *scene, Object *ob, Mesh *me, const char *name, int active_set)
{
EditMesh *em;
int layernum;
@@ -168,22 +167,25 @@ int ED_mesh_uv_texture_add(bContext *C, Scene *scene, Object *ob, Mesh *me)
layernum= CustomData_number_of_layers(&em->fdata, CD_MTFACE);
if(layernum >= MAX_MTFACE)
- return OPERATOR_CANCELLED;
+ return 0;
- EM_add_data_layer(em, &em->fdata, CD_MTFACE);
- CustomData_set_layer_active(&em->fdata, CD_MTFACE, layernum);
+ EM_add_data_layer(em, &em->fdata, CD_MTFACE, name);
+ if(active_set || layernum==0)
+ CustomData_set_layer_active(&em->fdata, CD_MTFACE, layernum);
}
else {
layernum= CustomData_number_of_layers(&me->fdata, CD_MTFACE);
if(layernum >= MAX_MTFACE)
- return OPERATOR_CANCELLED;
+ return 0;
if(me->mtface)
- CustomData_add_layer(&me->fdata, CD_MTFACE, CD_DUPLICATE, me->mtface, me->totface);
+ CustomData_add_layer_named(&me->fdata, CD_MTFACE, CD_DUPLICATE, me->mtface, me->totface, name);
else
- CustomData_add_layer(&me->fdata, CD_MTFACE, CD_DEFAULT, NULL, me->totface);
+ CustomData_add_layer_named(&me->fdata, CD_MTFACE, CD_DEFAULT, NULL, me->totface, name);
+
+ if(active_set || layernum==0)
+ CustomData_set_layer_active(&me->fdata, CD_MTFACE, layernum);
- CustomData_set_layer_active(&me->fdata, CD_MTFACE, layernum);
mesh_update_customdata_pointers(me);
}
@@ -199,7 +201,7 @@ int ED_mesh_uv_texture_remove(bContext *C, Object *ob, Mesh *me)
CustomDataLayer *cdl;
int index;
- index= CustomData_get_active_layer_index(data, CD_MTFACE);
+ index= CustomData_get_active_layer_index(data, CD_MTFACE);
cdl= (index == -1) ? NULL: &data->layers[index];
if(!cdl)
@@ -212,7 +214,7 @@ int ED_mesh_uv_texture_remove(bContext *C, Object *ob, Mesh *me)
return 1;
}
-int ED_mesh_color_add(bContext *C, Scene *scene, Object *ob, Mesh *me)
+int ED_mesh_color_add(bContext *C, Scene *scene, Object *ob, Mesh *me, const char *name, int active_set)
{
EditMesh *em;
MCol *mcol;
@@ -225,8 +227,9 @@ int ED_mesh_color_add(bContext *C, Scene *scene, Object *ob, Mesh *me)
if(layernum >= MAX_MCOL)
return 0;
- EM_add_data_layer(em, &em->fdata, CD_MCOL);
- CustomData_set_layer_active(&em->fdata, CD_MCOL, layernum);
+ EM_add_data_layer(em, &em->fdata, CD_MCOL, name);
+ if(active_set || layernum==0)
+ CustomData_set_layer_active(&em->fdata, CD_MCOL, layernum);
}
else {
layernum= CustomData_number_of_layers(&me->fdata, CD_MCOL);
@@ -236,11 +239,13 @@ int ED_mesh_color_add(bContext *C, Scene *scene, Object *ob, Mesh *me)
mcol= me->mcol;
if(me->mcol)
- CustomData_add_layer(&me->fdata, CD_MCOL, CD_DUPLICATE, me->mcol, me->totface);
+ CustomData_add_layer_named(&me->fdata, CD_MCOL, CD_DUPLICATE, me->mcol, me->totface, name);
else
- CustomData_add_layer(&me->fdata, CD_MCOL, CD_DEFAULT, NULL, me->totface);
+ CustomData_add_layer_named(&me->fdata, CD_MCOL, CD_DEFAULT, NULL, me->totface, name);
+
+ if(active_set || layernum==0)
+ CustomData_set_layer_active(&me->fdata, CD_MCOL, layernum);
- CustomData_set_layer_active(&me->fdata, CD_MCOL, layernum);
mesh_update_customdata_pointers(me);
if(!mcol)
@@ -287,7 +292,7 @@ static int uv_texture_add_exec(bContext *C, wmOperator *op)
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Mesh *me= ob->data;
- if(!ED_mesh_uv_texture_add(C, scene, ob, me))
+ if(!ED_mesh_uv_texture_add(C, scene, ob, me, NULL, TRUE))
return OPERATOR_CANCELLED;
return OPERATOR_FINISHED;
@@ -312,17 +317,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;
}
@@ -368,6 +389,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)
@@ -404,7 +426,7 @@ static int vertex_color_add_exec(bContext *C, wmOperator *op)
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Mesh *me= ob->data;
- if(!ED_mesh_color_add(C, scene, ob, me))
+ if(!ED_mesh_color_add(C, scene, ob, me, NULL, TRUE))
return OPERATOR_CANCELLED;
return OPERATOR_FINISHED;
@@ -699,6 +721,7 @@ static void mesh_add_faces(Mesh *mesh, int len)
mesh->totface= totface;
}
+/*
void ED_mesh_geometry_add(Mesh *mesh, ReportList *reports, int verts, int edges, int faces)
{
if(mesh->edit_mesh) {
@@ -713,23 +736,50 @@ void ED_mesh_geometry_add(Mesh *mesh, ReportList *reports, int verts, int edges,
if(faces)
mesh_add_faces(mesh, faces);
}
+*/
+
+void ED_mesh_faces_add(Mesh *mesh, ReportList *reports, int count)
+{
+ if(mesh->edit_mesh) {
+ BKE_report(reports, RPT_ERROR, "Can't add faces in edit mode.");
+ return;
+ }
+
+ mesh_add_faces(mesh, count);
+}
+
+void ED_mesh_edges_add(Mesh *mesh, ReportList *reports, int count)
+{
+ if(mesh->edit_mesh) {
+ BKE_report(reports, RPT_ERROR, "Can't add edges in edit mode.");
+ return;
+ }
+
+ mesh_add_edges(mesh, count);
+}
+
+void ED_mesh_vertices_add(Mesh *mesh, ReportList *reports, int count)
+{
+ if(mesh->edit_mesh) {
+ BKE_report(reports, RPT_ERROR, "Can't add vertices in edit mode.");
+ return;
+ }
+
+ mesh_add_verts(mesh, count);
+}
void ED_mesh_calc_normals(Mesh *me)
{
mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
}
-void ED_mesh_material_add(Mesh *me, Material *ma)
+/* always adds the material even if its linked alredy
+ * for pradictable material indicies */
+void ED_mesh_material_link(Mesh *me, Material *ma)
{
- int i;
int totcol = me->totcol + 1;
Material **mat;
- /* don't add if mesh already has it */
- for(i = 0; i < me->totcol; i++)
- if(me->mat[i] == ma)
- return;
-
mat= MEM_callocN(sizeof(void*)*totcol, "newmatar");
if(me->totcol) memcpy(mat, me->mat, sizeof(void*) * me->totcol);
diff --git a/source/blender/editors/mesh/mesh_intern.h b/source/blender/editors/mesh/mesh_intern.h
index 3e175c657f6..6db2a3f211d 100644
--- a/source/blender/editors/mesh/mesh_intern.h
+++ b/source/blender/editors/mesh/mesh_intern.h
@@ -241,6 +241,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 205ff99ee04..6562a4b30ae 100644
--- a/source/blender/editors/mesh/mesh_ops.c
+++ b/source/blender/editors/mesh/mesh_ops.c
@@ -29,7 +29,6 @@
#include <stdlib.h>
#include <math.h>
-#include "MEM_guardedalloc.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -39,9 +38,6 @@
#include "BLI_editVert.h"
#include "BKE_context.h"
-#include "BKE_global.h"
-#include "BKE_mesh.h"
-#include "BKE_utildefines.h"
#include "RNA_access.h"
@@ -113,6 +109,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);
@@ -273,6 +270,7 @@ void ED_keymap_mesh(wmKeyConfig *keyconf)
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,9 +296,6 @@ 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_fgon_make", FKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "MESH_OT_fgon_clear", FKEY, KM_PRESS, KM_SHIFT|KM_ALT, 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*/);
@@ -315,6 +310,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, 2);
+ ED_object_generic_keymap(keyconf, keymap, 3);
}
diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c
index 0d2d39f938f..7cef819a795 100644
--- a/source/blender/editors/mesh/meshtools.c
+++ b/source/blender/editors/mesh/meshtools.c
@@ -44,7 +44,6 @@
#include "DNA_meshdata_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"
@@ -54,20 +53,15 @@
#include "BLI_threads.h"
-#include "BKE_blender.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
+#include "BKE_deform.h"
#include "BKE_DerivedMesh.h"
-#include "BKE_customdata.h"
-#include "BKE_global.h"
-#include "BKE_image.h"
#include "BKE_key.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_material.h"
-#include "BKE_object.h"
-#include "BKE_utildefines.h"
#include "BKE_report.h"
#include "BLO_sys_types.h" // for intptr_t support
@@ -82,10 +76,6 @@
/* own include */
#include "mesh_intern.h"
-/* XXX */
-static int pupmenu() {return 0;}
-/* XXX */
-
/* * ********************** no editmode!!! *********** */
@@ -96,6 +86,7 @@ return 0 if no join is made (error) and 1 of the join is done */
int join_mesh_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
Material **matar, *ma;
@@ -194,12 +185,7 @@ int join_mesh_exec(bContext *C, wmOperator *op)
/* Join this object's vertex groups to the base one's */
for(dg=base->object->defbase.first; dg; dg=dg->next) {
/* See if this group exists in the object (if it doesn't, add it to the end) */
- for(odg=ob->defbase.first; odg; odg=odg->next) {
- if(!strcmp(odg->name, dg->name)) {
- break;
- }
- }
- if(!odg) {
+ if(!defgroup_find_name(ob, dg->name)) {
odg = MEM_callocN(sizeof(bDeformGroup), "join deformGroup");
memcpy(odg, dg, sizeof(bDeformGroup));
BLI_addtail(&ob->defbase, odg);
@@ -447,7 +433,7 @@ int join_mesh_exec(bContext *C, wmOperator *op)
/* free base, now that data is merged */
if(base->object != ob)
- ED_base_object_free_and_unlink(scene, base);
+ ED_base_object_free_and_unlink(bmain, scene, base);
}
}
CTX_DATA_END;
@@ -507,17 +493,17 @@ int join_mesh_exec(bContext *C, wmOperator *op)
/* free it's ipo too - both are not actually freed from memory yet as ID-blocks */
if(nkey->ipo) {
free_ipo(nkey->ipo);
- BLI_remlink(&G.main->ipo, nkey->ipo);
+ BLI_remlink(&bmain->ipo, nkey->ipo);
MEM_freeN(nkey->ipo);
}
#endif
free_key(nkey);
- BLI_remlink(&G.main->key, nkey);
+ BLI_remlink(&bmain->key, nkey);
MEM_freeN(nkey);
}
- DAG_scene_sort(scene); // removed objects, need to rebuild dag before editmode call
+ DAG_scene_sort(bmain, scene); // removed objects, need to rebuild dag before editmode call
ED_object_enter_editmode(C, EM_WAITCURSOR);
ED_object_exit_editmode(C, EM_FREEDATA|EM_WAITCURSOR|EM_DO_UNDO);
@@ -601,153 +587,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; i<me->totface; 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; i<me->totface; 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 */
@@ -1374,7 +1213,7 @@ int *mesh_get_x_mirror_faces(Object *ob, EditMesh *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; a<me->totface; 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/Makefile b/source/blender/editors/metaball/Makefile
index d971ec9b412..c28ef59e9db 100644
--- a/source/blender/editors/metaball/Makefile
+++ b/source/blender/editors/metaball/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c
index 961968959ff..80cea4eea1c 100644
--- a/source/blender/editors/metaball/mball_edit.c
+++ b/source/blender/editors/metaball/mball_edit.c
@@ -30,10 +30,6 @@
#include <math.h>
#include <string.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
@@ -47,10 +43,9 @@
#include "RNA_define.h"
#include "RNA_access.h"
-#include "BKE_utildefines.h"
#include "BKE_depsgraph.h"
-#include "BKE_object.h"
#include "BKE_context.h"
+#include "BKE_mball.h"
#include "ED_screen.h"
#include "ED_view3d.h"
@@ -63,6 +58,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
@@ -84,13 +83,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) */
@@ -108,49 +103,12 @@ MetaElem *add_metaball_primitive(bContext *C, float mat[4][4], int type, int new
ml->flag &= ~SELECT;
ml= ml->next;
}
-
- ml= MEM_callocN(sizeof(MetaElem), "metaelem");
-
- ml->x= mat[3][0];
- ml->y= mat[3][1];
- ml->z= mat[3][2];
- ml->quat[0]= 1.0;
- ml->quat[1]= 0.0;
- ml->quat[2]= 0.0;
- ml->quat[3]= 0.0;
- ml->rad= 2.0;
- ml->s= 2.0;
- ml->flag= SELECT | MB_SCALE_RAD;
-
- switch(type) {
- 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;
- }
+ ml= add_metaball_element(mball, type);
+ copy_v3_v3(&ml->x, mat[3]);
+
+ ml->flag |= SELECT;
mball->lastelem= ml;
-
return ml;
}
@@ -202,7 +160,7 @@ static int select_all_exec(bContext *C, wmOperator *op)
void MBALL_OT_select_all(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Select/Deselect All";
+ ot->name= "Select or Deselect All";
ot->description= "Change selection of all meta elements";
ot->idname= "MBALL_OT_select_all";
@@ -548,7 +506,7 @@ int mouse_mball(bContext *C, short mval[2], int extend)
if(ml==startelem) break;
}
- /* When some metaelem was found, then it is neccessary to select or
+ /* When some metaelem was found, then it is necessary to select or
* deselet it. */
if(act) {
if(extend==0) {
diff --git a/source/blender/editors/object/CMakeLists.txt b/source/blender/editors/object/CMakeLists.txt
new file mode 100644
index 00000000000..a41b9e89f83
--- /dev/null
+++ b/source/blender/editors/object/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
+ ../../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/Makefile b/source/blender/editors/object/Makefile
index 7c081355ed5..4694653b115 100644
--- a/source/blender/editors/object/Makefile
+++ b/source/blender/editors/object/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index 225889cdb59..4df3e0ee1de 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -49,12 +49,10 @@
#include "BKE_constraint.h"
#include "BKE_context.h"
#include "BKE_curve.h"
-#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
#include "BKE_DerivedMesh.h"
#include "BKE_displist.h"
#include "BKE_effect.h"
-#include "BKE_global.h"
#include "BKE_group.h"
#include "BKE_lattice.h"
#include "BKE_library.h"
@@ -67,9 +65,7 @@
#include "BKE_particle.h"
#include "BKE_report.h"
#include "BKE_sca.h"
-#include "BKE_scene.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -108,7 +104,7 @@ void ED_object_location_from_view(bContext *C, float *loc)
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];
@@ -137,9 +133,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];
@@ -155,8 +150,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]);
@@ -176,13 +171,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_vector_xyz(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, "layers", 20, NULL, "Layer", "");
RNA_def_property_flag(prop, PROP_HIDDEN);
}
@@ -192,51 +189,32 @@ 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, "layers")) {
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<<a));
- } else {
- layer = v3d->layact;
- for(a=0; a<32; a++)
- values[a]= (layer & (1<<a));
- }
- } else {
- layer = scene->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<<a));
+ }
+ else {
+ layer = scene->layact;
+
+ for(a=0; a<20; a++)
values[a]= (layer & (1<<a));
}
- RNA_boolean_set_array(op->ptr, "layer", values);
+ RNA_boolean_set_array(op->ptr, "layers", values);
}
}
@@ -246,29 +224,65 @@ int ED_object_add_generic_invoke(bContext *C, wmOperator *op, wmEvent *event)
return op->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, "layers")) {
+ RNA_boolean_get_array(op->ptr, "layers", layer_values);
+ *layer= 0;
+ 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, "rotation"))
+ view_align = FALSE;
+ else 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 */
Object *ED_object_add_type(bContext *C, int type, float *loc, float *rot, int enter_editmode, unsigned int layer)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *ob;
@@ -285,8 +299,8 @@ Object *ED_object_add_type(bContext *C, int type, float *loc, float *rot, int en
/* more editor stuff */
ED_object_base_init_transform(C, BASACT, loc, rot);
- DAG_scene_sort(scene);
- ED_render_id_flush_update(G.main, ob->data);
+ DAG_scene_sort(bmain, scene);
+ ED_render_id_flush_update(bmain, ob->data);
if(enter_editmode)
ED_object_enter_editmode(C, EM_IGNORE_LAYER);
@@ -301,7 +315,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;
@@ -360,7 +376,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);
@@ -368,7 +386,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)
@@ -394,8 +412,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;
}
@@ -435,7 +454,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);
@@ -470,163 +491,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) {
- 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);
-
- 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", ""},
@@ -639,7 +503,6 @@ static EnumPropertyItem prop_metaball_types[]= {
static int object_metaball_add_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
- MetaBall *mball;
MetaElem *elem;
int newob= 0;
int enter_editmode;
@@ -648,7 +511,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);
@@ -656,12 +521,10 @@ 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;
- BLI_addtail(mball->editelems, elem);
-
+
/* userdef */
if (newob && !enter_editmode) {
ED_object_exit_editmode(C, EM_FREEDATA);
@@ -718,7 +581,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;
@@ -758,7 +622,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);
@@ -804,6 +669,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;
@@ -813,12 +691,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;
}
@@ -853,24 +735,29 @@ 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) {
+ Main *bmain= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
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);
+ /* works without this except if you try render right after, see: 22027 */
+ DAG_scene_sort(bmain, scene);
- WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, CTX_data_scene(C));
return OPERATOR_FINISHED;
}
@@ -898,7 +785,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);
@@ -908,16 +795,17 @@ void OBJECT_OT_group_instance_add(wmOperatorType *ot)
/* remove base from a specific scene */
/* note: now unlinks constraints as well */
-void ED_base_object_free_and_unlink(Scene *scene, Base *base)
+void ED_base_object_free_and_unlink(Main *bmain, Scene *scene, Base *base)
{
BLI_remlink(&scene->base, base);
- free_libblock_us(&G.main->object, base->object);
+ free_libblock_us(&bmain->object, base->object);
if(scene->basact==base) scene->basact= NULL;
MEM_freeN(base);
}
static int object_delete_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
int islamp= 0;
@@ -927,16 +815,15 @@ 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);
+ ED_base_object_free_and_unlink(bmain, scene, base);
}
CTX_DATA_END;
if(islamp) reshadeall_displist(scene); /* only frees displist */
-
- DAG_scene_sort(scene);
- DAG_ids_flush_update(0);
+
+ DAG_scene_sort(bmain, scene);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, CTX_data_scene(C));
@@ -971,6 +858,7 @@ static void copy_object__forwardModifierLinks(void *userData, Object *ob,
/* after copying objects, copied data should get new pointers */
static void copy_object_set_idnew(bContext *C, int dupflag)
{
+ Main *bmain= CTX_data_main(C);
Material *ma, *mao;
ID *id;
int a;
@@ -993,7 +881,7 @@ static void copy_object_set_idnew(bContext *C, int dupflag)
/* materials */
if( dupflag & USER_DUP_MAT) {
- mao= G.main->mat.first;
+ mao= bmain->mat.first;
while(mao) {
if(mao->id.newid) {
@@ -1027,7 +915,7 @@ static void copy_object_set_idnew(bContext *C, int dupflag)
#if 0 // XXX old animation system
/* lamps */
if( dupflag & USER_DUP_IPO) {
- Lamp *la= G.main->lamp.first;
+ Lamp *la= bmain->lamp.first;
while(la) {
if(la->id.newid) {
Lamp *lan= (Lamp *)la->id.newid;
@@ -1043,7 +931,7 @@ static void copy_object_set_idnew(bContext *C, int dupflag)
}
/* ipos */
- ipo= G.main->ipo.first;
+ ipo= bmain->ipo.first;
while(ipo) {
if(ipo->id.lib==NULL && ipo->id.newid) {
Ipo *ipon= (Ipo *)ipo->id.newid;
@@ -1088,7 +976,8 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base)
if(ob->mat==NULL) ob->totcol= 0;
basen= MEM_dupallocN(base);
- basen->flag &= ~OB_FROMDUPLI;
+ basen->flag &= ~(OB_FROMDUPLI|OB_FROMGROUP);
+ ob->flag= basen->flag;
basen->lay= base->lay;
BLI_addhead(&scene->base, basen); /* addhead: othwise eternal loop */
basen->object= ob;
@@ -1111,6 +1000,7 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base)
static int object_duplicates_make_real_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
clear_id_newpoins();
@@ -1120,9 +1010,10 @@ static int object_duplicates_make_real_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
- DAG_scene_sort(scene);
- DAG_ids_flush_update(0);
+ DAG_scene_sort(bmain, scene);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_SCENE, scene);
+ WM_main_add_notifier(NC_OBJECT|ND_DRAW, NULL);
return OPERATOR_FINISHED;
}
@@ -1148,7 +1039,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)
@@ -1183,7 +1074,7 @@ static Base *duplibase_for_convert(Scene *scene, Base *base, Object *ob)
}
obn= copy_object(ob);
- obn->recalc |= OB_RECALC;
+ obn->recalc |= OB_RECALC_ALL;
basen= MEM_mallocN(sizeof(Base), "duplibase");
*basen= *base;
@@ -1199,6 +1090,7 @@ static Base *duplibase_for_convert(Scene *scene, Base *base, Object *ob)
static int convert_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Base *basen=NULL, *basact=NULL, *basedel=NULL;
Object *ob, *ob1, *newob, *obact= CTX_data_active_object(C);
@@ -1266,7 +1158,7 @@ static int convert_exec(bContext *C, wmOperator *op)
newob->data= copy_mesh(me);
} else {
newob = ob;
- ob->recalc |= OB_RECALC;
+ ob->recalc |= OB_RECALC_ALL;
}
/* make new mesh data from the original copy */
@@ -1324,10 +1216,10 @@ static int convert_exec(bContext *C, wmOperator *op)
if (!keep_original) {
/* other users */
if(cu->id.us>1) {
- for(ob1= G.main->object.first; ob1; ob1=ob1->id.next) {
+ for(ob1= bmain->object.first; ob1; ob1=ob1->id.next) {
if(ob1->data==ob->data) {
ob1->type= OB_CURVE;
- ob1->recalc |= OB_RECALC;
+ ob1->recalc |= OB_RECALC_ALL;
}
}
}
@@ -1431,7 +1323,7 @@ static int convert_exec(bContext *C, wmOperator *op)
/* delete original if needed */
if(basedel) {
if(!keep_original)
- ED_base_object_free_and_unlink(scene, basedel);
+ ED_base_object_free_and_unlink(bmain, scene, basedel);
basedel = NULL;
}
@@ -1447,13 +1339,13 @@ static int convert_exec(bContext *C, wmOperator *op)
base= base->next;
if (ob->type == OB_MBALL) {
- ED_base_object_free_and_unlink(scene, tmpbase);
+ ED_base_object_free_and_unlink(bmain, scene, tmpbase);
}
}
}
/* delete object should renew depsgraph */
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
}
// XXX ED_object_enter_editmode(C, 0);
@@ -1467,7 +1359,7 @@ static int convert_exec(bContext *C, wmOperator *op)
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER|ND_DATA, BASACT->object);
}
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
WM_event_add_notifier(C, NC_SCENE|NC_OBJECT|ND_DRAW, scene); /* is NC_SCENE needed ? */
return OPERATOR_FINISHED;
@@ -1504,7 +1396,7 @@ void OBJECT_OT_convert(wmOperatorType *ot)
/* used below, assumes id.new is correct */
/* leaves selection of base/object unaltered */
-static Base *object_add_duplicate_internal(Scene *scene, Base *base, int dupflag)
+static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base, int dupflag)
{
Base *basen= NULL;
Material ***matarar;
@@ -1518,7 +1410,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;
@@ -1527,7 +1419,7 @@ static Base *object_add_duplicate_internal(Scene *scene, Base *base, int dupflag
if(basen->flag & OB_FROMGROUP) {
Group *group;
- for(group= G.main->group.first; group; group= group->id.next) {
+ for(group= bmain->group.first; group; group= group->id.next) {
if(object_in_group(ob, group))
add_to_group(group, obn, scene, basen);
}
@@ -1706,7 +1598,7 @@ static Base *object_add_duplicate_internal(Scene *scene, Base *base, int dupflag
/* single object duplicate, if dupflag==0, fully linked, else it uses the flags given */
/* leaves selection of base/object unaltered */
-Base *ED_object_add_duplicate(Scene *scene, Base *base, int dupflag)
+Base *ED_object_add_duplicate(Main *bmain, Scene *scene, Base *base, int dupflag)
{
Base *basen;
Object *ob;
@@ -1714,15 +1606,15 @@ 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);
+ basen= object_add_duplicate_internal(bmain, scene, base, dupflag);
if (basen == NULL) {
return NULL;
}
ob= basen->object;
- DAG_scene_sort(scene);
- ED_render_id_flush_update(G.main, ob->data);
+ DAG_scene_sort(bmain, scene);
+ ED_render_id_flush_update(bmain, ob->data);
return basen;
}
@@ -1730,6 +1622,7 @@ Base *ED_object_add_duplicate(Scene *scene, Base *base, int dupflag)
/* contextual operator dupli */
static int duplicate_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
int linked= RNA_boolean_get(op->ptr, "linked");
int dupflag= (linked)? 0: U.dupflag;
@@ -1738,7 +1631,7 @@ static int duplicate_exec(bContext *C, wmOperator *op)
clear_sca_new_poins(); /* sensor/contr/act */
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
- Base *basen= object_add_duplicate_internal(scene, base, dupflag);
+ Base *basen= object_add_duplicate_internal(bmain, scene, base, dupflag);
/* note that this is safe to do with this context iterator,
the list is made in advance */
@@ -1752,14 +1645,14 @@ static int duplicate_exec(bContext *C, wmOperator *op)
if(BASACT==base)
ED_base_object_activate(C, basen);
- ED_render_id_flush_update(G.main, basen->object->data);
+ ED_render_id_flush_update(bmain, basen->object->data);
}
CTX_DATA_END;
copy_object_set_idnew(C, dupflag);
- DAG_scene_sort(scene);
- DAG_ids_flush_update(0);
+ DAG_scene_sort(bmain, scene);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
@@ -1768,6 +1661,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";
@@ -1782,7 +1677,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 ************* */
@@ -1804,6 +1700,7 @@ static int add_named_poll(bContext *C)
static int add_named_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Base *basen, *base;
Object *ob;
@@ -1825,7 +1722,7 @@ static int add_named_exec(bContext *C, wmOperator *op)
clear_id_newpoins();
clear_sca_new_poins(); /* sensor/contr/act */
- basen= object_add_duplicate_internal(scene, base, dupflag);
+ basen= object_add_duplicate_internal(bmain, scene, base, dupflag);
if (basen == NULL) {
MEM_freeN(base);
@@ -1839,8 +1736,8 @@ static int add_named_exec(bContext *C, wmOperator *op)
copy_object_set_idnew(C, dupflag);
- DAG_scene_sort(scene);
- DAG_ids_flush_update(0);
+ DAG_scene_sort(bmain, scene);
+ DAG_ids_flush_update(bmain, 0);
MEM_freeN(base);
diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c
index d3f9847d9b9..a03d1a29333 100644
--- a/source/blender/editors/object/object_bake.c
+++ b/source/blender/editors/object/object_bake.c
@@ -48,8 +48,6 @@
#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_main.h"
-#include "BKE_object.h"
-#include "BKE_utildefines.h"
#include "BKE_report.h"
#include "RE_pipeline.h"
@@ -94,6 +92,7 @@ static ScrArea *biggest_image_area(bScreen *screen)
typedef struct BakeRender {
Render *re;
+ Main *main;
Scene *scene;
struct Object *actob;
int tot, ready;
@@ -102,7 +101,8 @@ typedef struct BakeRender {
short *stop;
short *do_update;
-
+ float *progress;
+
ListBase threads;
/* backup */
@@ -138,6 +138,7 @@ static void init_bake_internal(BakeRender *bkr, bContext *C)
Scene *scene= CTX_data_scene(C);
bkr->sa= biggest_image_area(CTX_wm_screen(C)); /* can be NULL */
+ bkr->main= CTX_data_main(C);
bkr->scene= scene;
bkr->actob= (scene->r.bake_flag & R_BAKE_TO_ACTIVE) ? OBACT : NULL;
bkr->re= RE_NewRender("_Bake View_");
@@ -185,27 +186,29 @@ 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;
+ Main *bmain= bkr->main;
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->lay, scene->r.bake_mode, bkr->actob);
+ RE_Database_Baking(bkr->re, bmain, 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)
@@ -222,11 +225,11 @@ static void bake_update(void *bkv)
static void bake_freejob(void *bkv)
{
BakeRender *bkr= bkv;
- BLI_end_threads(&bkr->threads);
finish_bake_internal(bkr);
if(bkr->tot==0) BKE_report(bkr->reports, RPT_ERROR, "No Images found to bake to");
MEM_freeN(bkr);
+ G.rendering = 0;
}
/* catch esc */
@@ -260,12 +263,13 @@ 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;
+ G.rendering = 1;
WM_jobs_start(CTX_wm_manager(C), steve);
@@ -282,6 +286,7 @@ static int objects_bake_render_invoke(bContext *C, wmOperator *op, wmEvent *_eve
static int bake_image_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -300,7 +305,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->lay, scene->r.bake_mode, (scene->r.bake_flag & R_BAKE_TO_ACTIVE)? OBACT: NULL);
+ RE_Database_Baking(bkr.re, bmain, 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 0db31b90365..de4a931e069 100644
--- a/source/blender/editors/object/object_constraint.c
+++ b/source/blender/editors/object/object_constraint.c
@@ -40,6 +40,7 @@
#include "DNA_curve_types.h"
#include "DNA_scene_types.h"
#include "DNA_text_types.h"
+#include "DNA_object_types.h"
#include "BKE_action.h"
#include "BKE_armature.h"
@@ -50,7 +51,6 @@
#include "BKE_main.h"
#include "BKE_object.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
#include "BIK_api.h"
#ifndef DISABLE_PYTHON
@@ -133,6 +133,7 @@ bConstraint *get_active_constraint (Object *ob)
{
return constraints_get_active(get_active_constraints(ob));
}
+
/* -------------- Constraint Management (Add New, Remove, Rename) -------------------- */
/* ------------- PyConstraints ------------------ */
@@ -198,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
@@ -322,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;
@@ -418,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);
+ }
}
}
-/* ********************** CONSTRAINT-SPECIFIC STUFF ********************* */
-/* ---------- Distance-Dependent Constraints ---------- */
-/* StretchTo, Limit Distance */
+/************************ 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 stretchto_poll(bContext *C)
+
+static int edit_constraint_poll_generic(bContext *C, StructRNA *rna_type)
{
- PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_StretchToConstraint);
- return (ptr.id.data && ptr.data);
+ 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_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 */
@@ -460,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;
+
+ /* despite 3 layers of checks, we may still not be able to find a constraint */
+ if (data == NULL)
+ return OPERATOR_CANCELLED;
- /* just set distance to 0.0, which will cause a reset on next recalc */
- RNA_float_set(&ptr, "distance", 0.0f);
+ /* 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)
@@ -492,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)
@@ -564,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 */
@@ -572,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);
@@ -594,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 */
@@ -602,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 ****************************/
@@ -633,12 +779,12 @@ void ED_object_constraint_update(Object *ob)
else DAG_id_flush_update(&ob->id, OB_RECALC_OB);
}
-void ED_object_constraint_dependency_update(Scene *scene, Object *ob)
+void ED_object_constraint_dependency_update(Main *bmain, 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(bmain, scene);
}
static int constraint_poll(bContext *C)
@@ -675,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;
@@ -687,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;
@@ -707,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;
@@ -745,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 ****************************/
@@ -766,8 +931,9 @@ void CONSTRAINT_OT_move_up (wmOperatorType *ot)
static int pose_constraints_clear_exec(bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
+ Object *ob= CTX_data_active_object(C);
/* free constraints for all selected bones */
CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones)
@@ -778,7 +944,7 @@ static int pose_constraints_clear_exec(bContext *C, wmOperator *op)
CTX_DATA_END;
/* force depsgraph to get recalculated since relationships removed */
- DAG_scene_sort(scene); /* sort order of objects */
+ DAG_scene_sort(bmain, scene); /* sort order of objects */
/* do updates */
DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
@@ -802,19 +968,22 @@ void POSE_OT_constraints_clear(wmOperatorType *ot)
static int object_constraints_clear_exec(bContext *C, wmOperator *op)
{
- Object *ob= ED_object_active_context(C);
+ Main *bmain= CTX_data_main(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 */
+ DAG_scene_sort(bmain, 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;
}
@@ -831,6 +1000,86 @@ 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)
+{
+ Main *bmain= CTX_data_main(C);
+ Scene *scene = CTX_data_scene(C);
+ bPoseChannel *pchan = CTX_data_active_pose_bone(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(bmain, 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)
+{
+ Main *bmain= CTX_data_main(C);
+ Scene *scene = CTX_data_scene(C);
+ Object *obact = ED_object_active_context(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(bmain, 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 */
@@ -974,6 +1223,7 @@ static short get_new_constraint_target(bContext *C, int con_type, Object **tar_o
/* used by add constraint operators to add the constraint required */
static int constraint_add_exec(bContext *C, wmOperator *op, Object *ob, ListBase *list, int type, short setTarget)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
bPoseChannel *pchan;
bConstraint *con;
@@ -1001,7 +1251,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);
@@ -1041,9 +1291,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);
@@ -1071,7 +1321,7 @@ static int constraint_add_exec(bContext *C, wmOperator *op, Object *ob, ListBase
/* force depsgraph to get recalculated since new relationships added */
- DAG_scene_sort(scene); /* sort order of objects */
+ DAG_scene_sort(bmain, scene); /* sort order of objects */
if ((ob->type==OB_ARMATURE) && (pchan)) {
ob->pose->flag |= POSE_RECALC; /* sort pose channels */
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index 2332f08c021..78404959dff 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -30,10 +30,15 @@
#include <time.h>
#include <float.h>
#include <ctype.h>
+#include <stddef.h> //for offsetof
#include "MEM_guardedalloc.h"
-#include "IMB_imbuf_types.h"
+#include "BLI_blenlib.h"
+#include "BLI_math.h"
+#include "BLI_editVert.h"
+#include "BLI_ghash.h"
+#include "BLI_rand.h"
#include "DNA_armature_types.h"
#include "DNA_curve_types.h"
@@ -42,59 +47,38 @@
#include "DNA_material_types.h"
#include "DNA_meta_types.h"
#include "DNA_property_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+#include "DNA_meshdata_types.h"
#include "DNA_vfont_types.h"
-#include "BLI_blenlib.h"
-#include "BLI_math.h"
-#include "BLI_editVert.h"
-#include "BLI_ghash.h"
-#include "BLI_rand.h"
+#include "IMB_imbuf_types.h"
-#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"
#include "BKE_depsgraph.h"
-#include "BKE_DerivedMesh.h"
-#include "BKE_effect.h"
#include "BKE_font.h"
-#include "BKE_global.h"
-#include "BKE_group.h"
#include "BKE_image.h"
-#include "BKE_key.h"
-#include "BKE_lattice.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_mball.h"
#include "BKE_mesh.h"
-#include "BKE_nla.h"
#include "BKE_object.h"
#include "BKE_paint.h"
-#include "BKE_particle.h"
#include "BKE_pointcache.h"
#include "BKE_property.h"
-#include "BKE_report.h"
#include "BKE_sca.h"
-#include "BKE_scene.h"
#include "BKE_softbody.h"
-#include "BKE_subsurf.h"
-#include "BKE_texture.h"
-#include "BKE_utildefines.h"
#include "BKE_modifier.h"
#include "ED_armature.h"
#include "ED_curve.h"
#include "ED_mesh.h"
#include "ED_mball.h"
+#include "ED_lattice.h"
#include "ED_object.h"
#include "ED_screen.h"
#include "ED_util.h"
@@ -106,13 +90,14 @@
/* for menu/popup icons etc etc*/
+#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;}
@@ -121,18 +106,23 @@ static bContext *C;
static void error_libdata() {}
-/* find the correct active object per context */
+/* 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)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
- if (!ob) ob= CTX_data_active_object(C);
+ 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)
+static int object_hide_view_clear_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
ScrArea *sa= CTX_wm_area(C);
View3D *v3d= sa->spacedata.first;
Scene *scene= CTX_data_scene(C);
@@ -149,31 +139,32 @@ static int object_restrictview_clear_exec(bContext *C, wmOperator *op)
}
}
if (changed) {
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
}
return OPERATOR_FINISHED;
}
-void OBJECT_OT_restrictview_clear(wmOperatorType *ot)
+void OBJECT_OT_hide_view_clear(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Clear Restrict View";
- ot->description = "Reveal the object by setting the restrictview flag";
- ot->idname= "OBJECT_OT_restrictview_clear";
+ ot->description = "Reveal the object by setting the hide flag";
+ ot->idname= "OBJECT_OT_hide_view_clear";
/* api callbacks */
- ot->exec= object_restrictview_clear_exec;
+ ot->exec= object_hide_view_clear_exec;
ot->poll= ED_operator_view3d_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int object_restrictview_set_exec(bContext *C, wmOperator *op)
+static int object_hide_view_set_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
short changed = 0;
int unselected= RNA_boolean_get(op->ptr, "unselected");
@@ -200,7 +191,7 @@ static int object_restrictview_set_exec(bContext *C, wmOperator *op)
CTX_DATA_END;
if (changed) {
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, CTX_data_scene(C));
@@ -209,15 +200,15 @@ static int object_restrictview_set_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void OBJECT_OT_restrictview_set(wmOperatorType *ot)
+void OBJECT_OT_hide_view_set(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Restrict View";
- ot->description = "Hide the object by setting the restrictview flag";
- ot->idname= "OBJECT_OT_restrictview_set";
+ ot->description = "Hide the object by setting the hide flag";
+ ot->idname= "OBJECT_OT_hide_view_set";
/* api callbacks */
- ot->exec= object_restrictview_set_exec;
+ ot->exec= object_hide_view_set_exec;
ot->poll= ED_operator_view3d_active;
/* flags */
@@ -227,6 +218,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_hide_render_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_hide_render_clear(wmOperatorType *ot)
+{
+
+ /* identifiers */
+ ot->name= "Clear Restrict Render";
+ ot->description = "Reveal the render object by setting the hide render flag";
+ ot->idname= "OBJECT_OT_hide_render_clear";
+
+ /* api callbacks */
+ ot->exec= object_hide_render_clear_exec;
+ ot->poll= ED_operator_view3d_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int object_hide_render_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_hide_render_set(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Set Restrict Render";
+ ot->description = "Hide the render object by setting the hide render flag";
+ ot->idname= "OBJECT_OT_hide_render_set";
+
+ /* api callbacks */
+ ot->exec= object_hide_render_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 ***************** */
@@ -358,7 +422,12 @@ void ED_object_enter_editmode(bContext *C, int flag)
if(flag & EM_WAITCURSOR) waitcursor(1);
ob->restore_mode = ob->mode;
- ED_object_toggle_modes(C, ob->mode);
+
+ /* note, when switching scenes the object can have editmode data but
+ * not be scene->obedit: bug 22954, this avoids calling self eternally */
+ if((ob->restore_mode & OB_MODE_EDIT)==0)
+ ED_object_toggle_modes(C, ob->mode);
+
ob->mode= OB_MODE_EDIT;
if(ob->type==OB_MESH) {
@@ -391,7 +460,7 @@ 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);
}
@@ -870,159 +939,23 @@ void special_editmenu(Scene *scene, View3D *v3d)
static float weight= 1.0f;
{ // XXX
// XXX if(fbutton(&weight, 0.0f, 1.0f, 10, 10, "Set Weight")) {
- int a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
- BPoint *bp= lt->editlatt->def;
+ Lattice *editlt= lt->editlatt->latt;
+ int a= editlt->pntsu*editlt->pntsv*editlt->pntsw;
+ BPoint *bp= editlt->def;
while(a--) {
if(bp->f1 & SELECT)
bp->weight= weight;
bp++;
- }
- }
- }
-
-}
-
-/* Change subdivision or particle properties of mesh object ob, if level==-1
- * then toggle subsurf, else set to level set allows to toggle multiple
- * selections */
-
-static void object_has_subdivision_particles(Object *ob, int *havesubdiv, int *havepart, int depth)
-{
- if(ob->type==OB_MESH) {
- if(modifiers_findByType(ob, eModifierType_Subsurf))
- *havesubdiv= 1;
- if(modifiers_findByType(ob, eModifierType_ParticleSystem))
- *havepart= 1;
- }
-
- if(ob->dup_group && depth <= 4) {
- GroupObject *go;
-
- for(go= ob->dup_group->gobject.first; go; go= go->next)
- object_has_subdivision_particles(go->ob, havesubdiv, havepart, depth+1);
- }
-}
-
-static void object_flip_subdivison_particles(Scene *scene, Object *ob, int *set, int level, int mode, int particles, int depth)
-{
- ModifierData *md;
-
- if(ob->type==OB_MESH) {
- if(particles) {
- for(md=ob->modifiers.first; md; md=md->next) {
- if(md->type == eModifierType_ParticleSystem) {
- ParticleSystemModifierData *psmd = (ParticleSystemModifierData*)md;
-
- if(*set == -1)
- *set= psmd->modifier.mode&(mode);
-
- if (*set)
- psmd->modifier.mode &= ~(mode);
- else
- psmd->modifier.mode |= (mode);
- }
- }
- }
- else {
- md = modifiers_findByType(ob, eModifierType_Subsurf);
-
- if (md) {
- SubsurfModifierData *smd = (SubsurfModifierData*) md;
-
- if (level == -1) {
- if(*set == -1)
- *set= smd->modifier.mode&(mode);
-
- if (*set)
- smd->modifier.mode &= ~(mode);
- else
- smd->modifier.mode |= (mode);
- } else {
- smd->levels = level;
- }
- }
- else if(depth == 0 && *set != 0) {
- SubsurfModifierData *smd = (SubsurfModifierData*) modifier_new(eModifierType_Subsurf);
-
- BLI_addtail(&ob->modifiers, smd);
- modifier_unique_name(&ob->modifiers, (ModifierData*)smd);
-
- if (level!=-1) {
- smd->levels = level;
- }
-
- if(*set == -1)
- *set= 1;
}
}
-
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
- if(ob->dup_group && depth<=4) {
- GroupObject *go;
-
- for(go= ob->dup_group->gobject.first; go; go= go->next)
- object_flip_subdivison_particles(scene, go->ob, set, level, mode, particles, depth+1);
- }
}
-/* Change subdivision properties of mesh object ob, if
-* level==-1 then toggle subsurf, else set to level.
-*/
-
-void flip_subdivison(Scene *scene, View3D *v3d, int level)
-{
- Base *base;
- int set= -1;
- int mode, pupmode, particles= 0, havesubdiv= 0, havepart= 0;
- int alt= 0; // XXX
-
- if(alt)
- mode= eModifierMode_Realtime;
- else
- mode= eModifierMode_Render|eModifierMode_Realtime;
-
- if(level == -1) {
- if (scene->obedit) { // XXX get from context
- object_has_subdivision_particles(scene->obedit, &havesubdiv, &havepart, 0);
- } else {
- for(base= scene->base.first; base; base= base->next) {
- if(((level==-1) && (TESTBASE(v3d, base))) || (TESTBASELIB(v3d, base))) {
- object_has_subdivision_particles(base->object, &havesubdiv, &havepart, 0);
- }
- }
- }
- }
- else
- havesubdiv= 1;
-
- if(havesubdiv && havepart) {
- pupmode= pupmenu("Switch%t|Subsurf %x1|Particle Systems %x2");
- if(pupmode <= 0)
- return;
- else if(pupmode == 2)
- particles= 1;
- }
- else if(havepart)
- particles= 1;
-
- if (scene->obedit) { // XXX get from context
- object_flip_subdivison_particles(scene, scene->obedit, &set, level, mode, particles, 0);
- } else {
- for(base= scene->base.first; base; base= base->next) {
- if(((level==-1) && (TESTBASE(v3d, base))) || (TESTBASELIB(v3d, base))) {
- object_flip_subdivison_particles(scene, base->object, &set, level, mode, particles, 0);
- }
- }
- }
-
- DAG_ids_flush_update(0);
-}
-
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;
@@ -1081,6 +1014,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) {
@@ -1113,7 +1047,7 @@ static void copymenu_logicbricks(Scene *scene, View3D *v3d, Object *ob)
}
}
-static void copymenu_modifiers(Scene *scene, View3D *v3d, Object *ob)
+static void copymenu_modifiers(Main *bmain, Scene *scene, View3D *v3d, Object *ob)
{
Base *base;
int i, event;
@@ -1212,7 +1146,7 @@ static void copymenu_modifiers(Scene *scene, View3D *v3d, Object *ob)
// if(errorstr) notice(errorstr);
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
}
@@ -1260,7 +1194,7 @@ static void copy_texture_space(Object *to, Object *ob)
}
-void copy_attr(Scene *scene, View3D *v3d, short event)
+void copy_attr(Main *bmain, Scene *scene, View3D *v3d, short event)
{
Object *ob;
Base *base;
@@ -1285,7 +1219,7 @@ void copy_attr(Scene *scene, View3D *v3d, short event)
return;
}
else if(event==24) {
- copymenu_modifiers(scene, v3d, ob);
+ copymenu_modifiers(bmain, scene, v3d, ob);
return;
}
@@ -1329,7 +1263,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;
@@ -1448,7 +1382,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;
}
@@ -1503,12 +1437,12 @@ void copy_attr(Scene *scene, View3D *v3d, short event)
}
if(do_scene_sort)
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 0);
}
-void copy_attr_menu(Scene *scene, View3D *v3d)
+void copy_attr_menu(Main *bmain, Scene *scene, View3D *v3d)
{
Object *ob;
short event;
@@ -1559,7 +1493,7 @@ void copy_attr_menu(Scene *scene, View3D *v3d)
event= pupmenu(str);
if(event<= 0) return;
- copy_attr(scene, v3d, event);
+ copy_attr(bmain, scene, v3d, event);
}
/* ********************************************** */
@@ -1713,6 +1647,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 */
@@ -1720,7 +1659,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 */
@@ -1734,7 +1673,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 */
@@ -2054,6 +1993,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 ***********************/
@@ -2070,6 +2011,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;
}
@@ -2092,18 +2034,18 @@ 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);
if(prop) {
BLI_remlink(&ob->prop, prop);
free_property(prop);
+
+ WM_event_add_notifier(C, NC_LOGIC, NULL);
return OPERATOR_FINISHED;
}
else {
@@ -2126,3 +2068,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..f000485466f 100644
--- a/source/blender/editors/object/object_group.c
+++ b/source/blender/editors/object/object_group.c
@@ -29,7 +29,6 @@
#include <string.h>
-#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
@@ -39,11 +38,9 @@
#include "BKE_context.h"
#include "BKE_depsgraph.h"
-#include "BKE_global.h"
#include "BKE_group.h"
#include "BKE_main.h"
#include "BKE_report.h"
-#include "BKE_scene.h"
#include "ED_screen.h"
@@ -52,6 +49,7 @@
#include "RNA_access.h"
#include "RNA_define.h"
+#include "RNA_enum_types.h"
#include "object_intern.h"
@@ -59,6 +57,7 @@
static int objects_add_active_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *ob= OBACT;
Group *group;
@@ -69,7 +68,7 @@ static int objects_add_active_exec(bContext *C, wmOperator *op)
/* linking to same group requires its own loop so we can avoid
looking up the active objects groups each time */
- for(group= G.main->group.first; group; group=group->id.next) {
+ for(group= bmain->group.first; group; group=group->id.next) {
if(object_in_group(ob, group)) {
/* Assign groups to selected objects */
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
@@ -82,7 +81,7 @@ static int objects_add_active_exec(bContext *C, wmOperator *op)
if(!ok) BKE_report(op->reports, RPT_ERROR, "Active Object contains no groups");
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
WM_event_add_notifier(C, NC_GROUP|NA_EDITED, NULL);
return OPERATOR_FINISHED;
@@ -105,6 +104,7 @@ void GROUP_OT_objects_add_active(wmOperatorType *ot)
static int objects_remove_active_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *ob= OBACT;
Group *group;
@@ -115,7 +115,7 @@ static int objects_remove_active_exec(bContext *C, wmOperator *op)
/* linking to same group requires its own loop so we can avoid
looking up the active objects groups each time */
- for(group= G.main->group.first; group; group=group->id.next) {
+ for(group= bmain->group.first; group; group=group->id.next) {
if(object_in_group(ob, group)) {
/* Assign groups to selected objects */
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
@@ -128,7 +128,7 @@ static int objects_remove_active_exec(bContext *C, wmOperator *op)
if(!ok) BKE_report(op->reports, RPT_ERROR, "Active Object contains no groups");
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
WM_event_add_notifier(C, NC_GROUP|NA_EDITED, NULL);
return OPERATOR_FINISHED;
@@ -151,6 +151,7 @@ void GROUP_OT_objects_remove_active(wmOperatorType *ot)
static int group_objects_remove_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Group *group= NULL;
@@ -161,7 +162,7 @@ static int group_objects_remove_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
WM_event_add_notifier(C, NC_GROUP|NA_EDITED, NULL);
return OPERATOR_FINISHED;
@@ -184,6 +185,7 @@ void GROUP_OT_objects_remove(wmOperatorType *ot)
static int group_create_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Group *group= NULL;
char name[32]; /* id name */
@@ -197,7 +199,7 @@ static int group_create_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
WM_event_add_notifier(C, NC_GROUP|NA_EDITED, NULL);
return OPERATOR_FINISHED;
@@ -224,84 +226,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;
+void OBJECT_OT_group_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add to Group";
+ ot->idname= "OBJECT_OT_group_add";
+ ot->description = "Add an object to a new group";
- RNA_enum_items_add_value(&item, &totitem, group_items, -1);
+ /* api callbacks */
+ ot->exec= group_add_exec;
- if (bmain) {
- if(bmain->group.first)
- RNA_enum_item_add_separator(&item, &totitem);
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
- 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);
- }
- }
+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"));
- RNA_enum_item_end(&item, &totitem);
- *free= 1;
+ if(ELEM(NULL, ob, group))
+ return OPERATOR_CANCELLED;
+
+ add_to_group(group, ob, scene, NULL);
- return item;
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+
+ return OPERATOR_FINISHED;
}
-void OBJECT_OT_group_add(wmOperatorType *ot)
+void OBJECT_OT_group_link(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->name= "Link to Group";
+ ot->idname= "OBJECT_OT_group_link";
+ ot->description = "Add an object to an existing group";
/* api callbacks */
- ot->exec= group_add_exec;
+ 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 624b4985f97..75e22d5356f 100644
--- a/source/blender/editors/object/object_hook.c
+++ b/source/blender/editors/object/object_hook.c
@@ -43,14 +43,13 @@
#include "BKE_action.h"
#include "BKE_context.h"
-#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
+#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
#include "BKE_report.h"
#include "BKE_scene.h"
-#include "BKE_utildefines.h"
#include "RNA_define.h"
#include "RNA_access.h"
@@ -85,7 +84,7 @@ static int return_editmesh_indexar(EditMesh *em, int *tot, int **indexar, float
for(eve= em->verts.first; eve; eve= eve->next) {
if(eve->f & SELECT) {
*index= nr; index++;
- add_v3_v3v3(cent, cent, eve->co);
+ add_v3_v3(cent, eve->co);
}
nr++;
}
@@ -113,7 +112,7 @@ static int return_editmesh_vgroup(Object *obedit, EditMesh *em, char *name, floa
for(i=0; i<dvert->totweight; i++){
if(dvert->dw[i].def_nr == (obedit->actdef-1)) {
totvert++;
- add_v3_v3v3(cent, cent, eve->co);
+ add_v3_v3(cent, eve->co);
}
}
}
@@ -178,7 +177,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++;
@@ -192,13 +191,14 @@ static int return_editlattice_indexar(Lattice *editlatt, int *tot, int **indexar
static void select_editlattice_hook(Object *obedit, HookModifierData *hmd)
{
- Lattice *lt= obedit->data;
+ Lattice *lt= obedit->data, *editlt;
BPoint *bp;
int index=0, nr=0, a;
-
+
+ editlt= lt->editlatt->latt;
/* count */
- a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
- bp= lt->editlatt->def;
+ a= editlt->pntsu*editlt->pntsv*editlt->pntsw;
+ bp= editlt->def;
while(a--) {
if(hmd->indexar[index]==nr) {
bp->f1 |= SELECT;
@@ -251,17 +251,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++;
@@ -273,7 +273,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++;
@@ -314,7 +314,7 @@ static int object_hook_index_array(Object *obedit, int *tot, int **indexar, char
case OB_LATTICE:
{
Lattice *lt= obedit->data;
- return return_editlattice_indexar(lt->editlatt, tot, indexar, cent_r);
+ return return_editlattice_indexar(lt->editlatt->latt, tot, indexar, cent_r);
}
default:
return 0;
@@ -413,7 +413,7 @@ static Object *add_hook_object_new(Scene *scene, Object *obedit)
return ob;
}
-static void add_hook_object(Scene *scene, Object *obedit, Object *ob, int mode)
+static void add_hook_object(Main *bmain, Scene *scene, Object *obedit, Object *ob, int mode)
{
ModifierData *md=NULL;
HookModifierData *hmd = NULL;
@@ -459,11 +459,12 @@ static void add_hook_object(Scene *scene, Object *obedit, Object *ob, int mode)
mul_serie_m4(hmd->parentinv, ob->imat, obedit->obmat, NULL,
NULL, NULL, NULL, NULL, NULL);
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
}
static int object_add_hook_selob_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *obedit = CTX_data_edit_object(C);
Object *obsel=NULL;
@@ -482,7 +483,7 @@ static int object_add_hook_selob_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- add_hook_object(scene, obedit, obsel, OBJECT_ADDHOOK_SELOB);
+ add_hook_object(bmain, scene, obedit, obsel, OBJECT_ADDHOOK_SELOB);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, obedit);
return OPERATOR_FINISHED;
@@ -505,10 +506,11 @@ void OBJECT_OT_hook_add_selobj(wmOperatorType *ot)
static int object_add_hook_newob_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *obedit = CTX_data_edit_object(C);
- add_hook_object(scene, obedit, NULL, OBJECT_ADDHOOK_NEWOB);
+ add_hook_object(bmain, scene, obedit, NULL, OBJECT_ADDHOOK_NEWOB);
WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, obedit);
@@ -656,7 +658,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 */
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index 23f5d0c1475..ed75c4060a2 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -75,14 +75,22 @@ void OBJECT_OT_drop_named_material(struct wmOperatorType *ot);
void OBJECT_OT_mode_set(struct wmOperatorType *ot);
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_hide_view_set(struct wmOperatorType *ot);
+void OBJECT_OT_hide_view_clear(struct wmOperatorType *ot);
+void OBJECT_OT_hide_render_set(struct wmOperatorType *ot);
+void OBJECT_OT_hide_render_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);
@@ -124,11 +131,6 @@ void OBJECT_OT_hook_reset(struct wmOperatorType *ot);
void OBJECT_OT_hook_recenter(struct wmOperatorType *ot);
/* object_lattice.c */
-void free_editLatt(Object *ob);
-void make_editLatt(Object *obedit);
-void load_editLatt(Object *obedit);
-void remake_editLatt(Object *obedit);
-
void LATTICE_OT_select_all(struct wmOperatorType *ot);
void LATTICE_OT_make_regular(struct wmOperatorType *ot);
@@ -149,8 +151,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 +162,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 +200,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 +211,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 52f779748fa..9f82a1209cf 100644
--- a/source/blender/editors/object/object_lattice.c
+++ b/source/blender/editors/object/object_lattice.c
@@ -45,7 +45,8 @@
#include "BKE_key.h"
#include "BKE_lattice.h"
#include "BKE_mesh.h"
-#include "BKE_utildefines.h"
+
+#include "BLI_listbase.h"
#include "ED_screen.h"
#include "ED_view3d.h"
@@ -63,12 +64,16 @@ void free_editLatt(Object *ob)
Lattice *lt= ob->data;
if(lt->editlatt) {
- if(lt->editlatt->def)
- MEM_freeN(lt->editlatt->def);
- if(lt->editlatt->dvert)
- free_dverts(lt->editlatt->dvert, lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw);
-
+ Lattice *editlt= lt->editlatt->latt;
+
+ if(editlt->def)
+ MEM_freeN(editlt->def);
+ if(editlt->dvert)
+ free_dverts(editlt->dvert, editlt->pntsu*editlt->pntsv*editlt->pntsw);
+
+ MEM_freeN(editlt);
MEM_freeN(lt->editlatt);
+
lt->editlatt= NULL;
}
}
@@ -77,47 +82,51 @@ void make_editLatt(Object *obedit)
{
Lattice *lt= obedit->data;
KeyBlock *actkey;
-
+
free_editLatt(obedit);
-
+
lt= obedit->data;
actkey= ob_get_keyblock(obedit);
if(actkey)
key_to_latt(actkey, lt);
- lt->editlatt= MEM_dupallocN(lt);
- lt->editlatt->def= MEM_dupallocN(lt->def);
-
+ lt->editlatt= MEM_callocN(sizeof(EditLatt), "editlatt");
+ lt->editlatt->latt= MEM_dupallocN(lt);
+ lt->editlatt->latt->def= MEM_dupallocN(lt->def);
+
if(lt->dvert) {
int tot= lt->pntsu*lt->pntsv*lt->pntsw;
- lt->editlatt->dvert = MEM_mallocN (sizeof (MDeformVert)*tot, "Lattice MDeformVert");
- copy_dverts(lt->editlatt->dvert, lt->dvert, tot);
+ lt->editlatt->latt->dvert = MEM_mallocN (sizeof (MDeformVert)*tot, "Lattice MDeformVert");
+ copy_dverts(lt->editlatt->latt->dvert, lt->dvert, tot);
}
+
+ if(lt->key) lt->editlatt->shapenr= obedit->shapenr;
}
void load_editLatt(Object *obedit)
{
- Lattice *lt;
+ Lattice *lt, *editlt;
KeyBlock *actkey;
BPoint *bp;
float *fp;
int tot;
-
+
lt= obedit->data;
-
- actkey= ob_get_keyblock(obedit);
+ editlt= lt->editlatt->latt;
+
+ if(lt->editlatt->shapenr) {
+ actkey= BLI_findlink(&lt->key->block, lt->editlatt->shapenr-1);
- if(actkey) {
/* active key: vertices */
- tot= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
+ tot= editlt->pntsu*editlt->pntsv*editlt->pntsw;
if(actkey->data) MEM_freeN(actkey->data);
fp=actkey->data= MEM_callocN(lt->key->elemsize*tot, "actkey->data");
actkey->totelem= tot;
-
- bp= lt->editlatt->def;
+
+ bp= editlt->def;
while(tot--) {
VECCOPY(fp, bp->vec);
fp+= 3;
@@ -126,30 +135,30 @@ void load_editLatt(Object *obedit)
}
else {
MEM_freeN(lt->def);
-
- lt->def= MEM_dupallocN(lt->editlatt->def);
- lt->flag= lt->editlatt->flag;
+ lt->def= MEM_dupallocN(editlt->def);
- lt->pntsu= lt->editlatt->pntsu;
- lt->pntsv= lt->editlatt->pntsv;
- lt->pntsw= lt->editlatt->pntsw;
+ lt->flag= editlt->flag;
+
+ lt->pntsu= editlt->pntsu;
+ lt->pntsv= editlt->pntsv;
+ lt->pntsw= editlt->pntsw;
- lt->typeu= lt->editlatt->typeu;
- lt->typev= lt->editlatt->typev;
- lt->typew= lt->editlatt->typew;
+ lt->typeu= editlt->typeu;
+ lt->typev= editlt->typev;
+ lt->typew= editlt->typew;
}
-
+
if(lt->dvert) {
free_dverts(lt->dvert, lt->pntsu*lt->pntsv*lt->pntsw);
lt->dvert= NULL;
}
-
- if(lt->editlatt->dvert) {
+
+ if(editlt->dvert) {
int tot= lt->pntsu*lt->pntsv*lt->pntsw;
-
+
lt->dvert = MEM_mallocN (sizeof (MDeformVert)*tot, "Lattice MDeformVert");
- copy_dverts(lt->dvert, lt->editlatt->dvert, tot);
+ copy_dverts(lt->dvert, editlt->dvert, tot);
}
}
@@ -161,9 +170,9 @@ void ED_setflagsLatt(Object *obedit, int flag)
BPoint *bp;
int a;
- bp= lt->editlatt->def;
+ bp= lt->editlatt->latt->def;
- a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
+ a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
while(a--) {
if(bp->hide==0) {
@@ -184,8 +193,8 @@ int select_all_exec(bContext *C, wmOperator *op)
if (action == SEL_TOGGLE) {
action = SEL_SELECT;
- bp= lt->editlatt->def;
- a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
+ bp= lt->editlatt->latt->def;
+ a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
while(a--) {
if(bp->hide==0) {
@@ -206,8 +215,8 @@ int select_all_exec(bContext *C, wmOperator *op)
ED_setflagsLatt(obedit, 0);
break;
case SEL_INVERT:
- bp= lt->editlatt->def;
- a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
+ bp= lt->editlatt->latt->def;
+ a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
while(a--) {
if(bp->hide==0) {
@@ -257,7 +266,7 @@ int make_regular_exec(bContext *C, wmOperator *op)
if(ob) {
lt= ob->data;
- resizelattice(lt->editlatt, lt->pntsu, lt->pntsv, lt->pntsw, NULL);
+ resizelattice(lt->editlatt->latt, lt->pntsu, lt->pntsv, lt->pntsw, NULL);
}
else {
ob= CTX_data_active_object(C);
@@ -355,21 +364,21 @@ typedef struct UndoLattice {
static void undoLatt_to_editLatt(void *data, void *edata)
{
UndoLattice *ult= (UndoLattice*)data;
- Lattice *editlatt= (Lattice *)edata;
- int a= editlatt->pntsu*editlatt->pntsv*editlatt->pntsw;
+ EditLatt *editlatt= (EditLatt *)edata;
+ int a= editlatt->latt->pntsu*editlatt->latt->pntsv*editlatt->latt->pntsw;
- memcpy(editlatt->def, ult->def, a*sizeof(BPoint));
+ memcpy(editlatt->latt->def, ult->def, a*sizeof(BPoint));
}
static void *editLatt_to_undoLatt(void *edata)
{
UndoLattice *ult= MEM_callocN(sizeof(UndoLattice), "UndoLattice");
- Lattice *editlatt= (Lattice *)edata;
+ EditLatt *editlatt= (EditLatt *)edata;
- ult->def= MEM_dupallocN(editlatt->def);
- ult->pntsu= editlatt->pntsu;
- ult->pntsv= editlatt->pntsv;
- ult->pntsw= editlatt->pntsw;
+ ult->def= MEM_dupallocN(editlatt->latt->def);
+ ult->pntsu= editlatt->latt->pntsu;
+ ult->pntsv= editlatt->latt->pntsv;
+ ult->pntsw= editlatt->latt->pntsw;
return ult;
}
@@ -385,11 +394,11 @@ static void free_undoLatt(void *data)
static int validate_undoLatt(void *data, void *edata)
{
UndoLattice *ult= (UndoLattice*)data;
- Lattice *editlatt= (Lattice *)edata;
+ EditLatt *editlatt= (EditLatt *)edata;
- return (ult->pntsu == editlatt->pntsu &&
- ult->pntsv == editlatt->pntsv &&
- ult->pntsw == editlatt->pntsw);
+ return (ult->pntsu == editlatt->latt->pntsu &&
+ ult->pntsv == editlatt->latt->pntsv &&
+ ult->pntsw == editlatt->latt->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 a43f3de9b14..286e953a69a 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -43,7 +43,6 @@
#include "BLI_string.h"
#include "BLI_path_util.h"
-#include "BKE_action.h"
#include "BKE_curve.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
@@ -53,6 +52,7 @@
#include "BKE_global.h"
#include "BKE_key.h"
#include "BKE_lattice.h"
+#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_multires.h"
@@ -60,7 +60,6 @@
#include "BKE_object.h"
#include "BKE_particle.h"
#include "BKE_softbody.h"
-#include "BKE_utildefines.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -77,7 +76,7 @@
/******************************** API ****************************/
-ModifierData *ED_object_modifier_add(ReportList *reports, Scene *scene, Object *ob, char *name, int type)
+ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *scene, Object *ob, char *name, int type)
{
ModifierData *md=NULL, *new_md=NULL;
ModifierTypeInfo *mti = modifierType_getInfo(type);
@@ -129,10 +128,10 @@ ModifierData *ED_object_modifier_add(ReportList *reports, Scene *scene, Object *
ob->pd= object_add_collision_fields(0);
ob->pd->deflect= 1;
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
}
else if(type == eModifierType_Surface)
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
}
DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
@@ -140,7 +139,7 @@ ModifierData *ED_object_modifier_add(ReportList *reports, Scene *scene, Object *
return new_md;
}
-int ED_object_modifier_remove(ReportList *reports, Scene *scene, Object *ob, ModifierData *md)
+int ED_object_modifier_remove(ReportList *reports, Main *bmain, Scene *scene, Object *ob, ModifierData *md)
{
ModifierData *obmd;
@@ -175,13 +174,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(bmain, 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(bmain, scene);
}
else if(md->type == eModifierType_Smoke) {
ob->dt = OB_TEXTURE;
@@ -243,7 +242,7 @@ int ED_object_modifier_move_down(ReportList *reports, Object *ob, ModifierData *
return 1;
}
-int ED_object_modifier_convert(ReportList *reports, Scene *scene, Object *ob, ModifierData *md)
+int ED_object_modifier_convert(ReportList *reports, Main *bmain, Scene *scene, Object *ob, ModifierData *md)
{
Object *obn;
ParticleSystem *psys;
@@ -341,7 +340,7 @@ int ED_object_modifier_convert(ReportList *reports, Scene *scene, Object *ob, Mo
}
}
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
return 1;
}
@@ -389,32 +388,47 @@ 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;
int numVerts;
float (*vertexCos)[3];
@@ -427,11 +441,6 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob,
cu = ob->data;
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");
- return 0;
- }
-
vertexCos = curve_getVertexCos(cu, &cu->nurb, &numVerts);
mti->deformVerts(md, ob, NULL, vertexCos, numVerts, 0, 0);
curve_applyVertexCos(cu, &cu->nurb, vertexCos);
@@ -486,23 +495,16 @@ 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)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(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))
+ if(!ED_object_modifier_add(op->reports, bmain, scene, ob, NULL, type))
return OPERATOR_CANCELLED;
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
@@ -566,16 +568,70 @@ 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)
{
+ Main *bmain= CTX_data_main(C);
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, bmain, scene, ob, md))
return OPERATOR_CANCELLED;
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
@@ -583,28 +639,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);
@@ -613,26 +678,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;
@@ -643,17 +717,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 *********************/
@@ -661,13 +745,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);
@@ -675,6 +759,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"},
@@ -686,26 +778,27 @@ 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 *********************/
static int modifier_convert_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
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(!ob || !md || !ED_object_modifier_convert(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_convert(op->reports, bmain, scene, ob, md))
return OPERATOR_CANCELLED;
DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
@@ -714,26 +807,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;
@@ -744,62 +846,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);
@@ -808,6 +931,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";
@@ -815,25 +946,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;
@@ -846,18 +977,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";
@@ -865,20 +1004,22 @@ 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;
@@ -886,8 +1027,9 @@ static int multires_save_external_exec(bContext *C, wmOperator *op)
if(CustomData_external_test(&me->fdata, CD_MDISPS))
return OPERATOR_CANCELLED;
- RNA_string_get(op->ptr, "path", path);
- if(G.save_over)
+ 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);
@@ -896,51 +1038,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_save_external_exec;
- ot->invoke= multires_save_external_invoke;
+ ot->exec= multires_external_save_exec;
+ ot->invoke= multires_external_save_invoke;
+ ot->poll= multires_poll;
/* 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))
@@ -952,14 +1106,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;
@@ -969,32 +1123,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;
@@ -1025,6 +1182,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 */
@@ -1034,26 +1199,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;
@@ -1063,16 +1230,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 2ff99bac1c5..6e9e8eeb5e5 100644
--- a/source/blender/editors/object/object_ops.c
+++ b/source/blender/editors/object/object_ops.c
@@ -29,7 +29,6 @@
#include <stdlib.h>
#include <math.h>
-#include "MEM_guardedalloc.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -38,8 +37,6 @@
#include "BLI_blenlib.h"
#include "BKE_context.h"
-#include "BKE_global.h"
-#include "BKE_utildefines.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -72,8 +69,10 @@ void ED_operatortypes_object(void)
WM_operatortype_append(OBJECT_OT_editmode_toggle);
WM_operatortype_append(OBJECT_OT_posemode_toggle);
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_hide_view_clear);
+ WM_operatortype_append(OBJECT_OT_hide_view_set);
+ WM_operatortype_append(OBJECT_OT_hide_render_clear);
+ WM_operatortype_append(OBJECT_OT_hide_render_set);
WM_operatortype_append(OBJECT_OT_shade_smooth);
WM_operatortype_append(OBJECT_OT_shade_flat);
WM_operatortype_append(OBJECT_OT_paths_calculate);
@@ -96,6 +95,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);
@@ -109,9 +109,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);
@@ -136,8 +134,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);
@@ -145,6 +143,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);
@@ -175,9 +175,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);
@@ -189,6 +193,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);
@@ -310,9 +315,14 @@ void ED_keymap_object(wmKeyConfig *keyconf)
WM_keymap_verify_item(keymap, "OBJECT_OT_scale_clear", SKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_verify_item(keymap, "OBJECT_OT_origin_clear", OKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "OBJECT_OT_restrictview_clear", HKEY, KM_PRESS, KM_ALT, 0);
- 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);
+ WM_keymap_add_item(keymap, "OBJECT_OT_hide_view_clear", HKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "OBJECT_OT_hide_view_set", HKEY, KM_PRESS, 0, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_hide_view_set", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1);
+
+ /* same as above but for rendering */
+ WM_keymap_add_item(keymap, "OBJECT_OT_hide_render_clear", HKEY, KM_PRESS, KM_ALT|KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "OBJECT_OT_hide_render_set", HKEY, KM_PRESS, KM_CTRL, 0);
+// RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_hide_render_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);
@@ -351,7 +361,10 @@ void ED_keymap_object(wmKeyConfig *keyconf)
RNA_int_set(kmi->ptr, "level", i);
}
- /* Lattice -------------------------------------------------------------------- */
+ /* ############################################################################ */
+ /* ################################ LATTICE ################################### */
+ /* ############################################################################ */
+
keymap= WM_keymap_find(keyconf, "Lattice", 0, 0);
keymap->poll= ED_operator_editlattice;
@@ -362,7 +375,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, 1);
+ ED_object_generic_keymap(keyconf, keymap, 2);
}
void ED_object_generic_keymap(struct wmKeyConfig *keyconf, struct wmKeyMap *keymap, int do_pet)
@@ -370,22 +383,31 @@ void ED_object_generic_keymap(struct wmKeyConfig *keyconf, struct wmKeyMap *keym
wmKeyMapItem *kmi;
/* used by mesh, curve & lattice only */
- if(do_pet > 0) {
+ if(do_pet) {
/* 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_edit_falloff");
+
+ // Object mode
+ if (do_pet == 1) {
+
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", OKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "data_path", "tool_settings.use_proportional_edit_objects");
- 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, "value_1", "DISABLED");
- RNA_string_set(kmi->ptr, "value_2", "ENABLED");
+ } else { // Edit mode
- /* 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, "path", "tool_settings.proportional_editing");
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle_enum", OKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "data_path", "tool_settings.proportional_edit");
RNA_string_set(kmi->ptr, "value_1", "DISABLED");
- RNA_string_set(kmi->ptr, "value_2", "CONNECTED");
+ RNA_string_set(kmi->ptr, "value_2", "ENABLED");
+
+ /* for modes/object types that allow 'connected' mode, add the Alt O key */
+ if (do_pet == 3) {
+ 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_edit");
+ 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 52d6a7a7b8b..b8eebd161dc 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -41,6 +41,7 @@
#include "DNA_particle_types.h"
#include "DNA_scene_types.h"
#include "DNA_world_types.h"
+#include "DNA_object_types.h"
#include "BLI_math.h"
#include "BLI_editVert.h"
@@ -68,7 +69,6 @@
#include "BKE_sca.h"
#include "BKE_scene.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -97,6 +97,7 @@ static int vertex_parent_set_poll(bContext *C)
static int vertex_parent_set_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
EditVert *eve;
@@ -171,8 +172,8 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
else if(obedit->type==OB_LATTICE) {
Lattice *lt= obedit->data;
- a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
- bp= lt->editlatt->def;
+ a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
+ bp= lt->editlatt->latt->def;
while(a--) {
if(bp->f1 & SELECT) {
if(v1==0) v1= nr;
@@ -193,7 +194,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) {
@@ -230,7 +231,7 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
WM_event_add_notifier(C, NC_OBJECT, NULL);
@@ -295,6 +296,7 @@ static int make_proxy_invoke (bContext *C, wmOperator *op, wmEvent *evt)
static int make_proxy_exec (bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Object *ob, *gob= CTX_data_active_object(C);
GroupObject *go;
Scene *scene= CTX_data_scene(C);
@@ -338,8 +340,8 @@ static int make_proxy_exec (bContext *C, wmOperator *op)
object_make_proxy(newob, ob, gob);
/* depsgraph flushes are needed for the new data */
- DAG_scene_sort(scene);
- DAG_id_flush_update(&newob->id, OB_RECALC);
+ DAG_scene_sort(bmain, scene);
+ DAG_id_flush_update(&newob->id, OB_RECALC_ALL);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, newob);
}
else {
@@ -413,6 +415,8 @@ static EnumPropertyItem prop_clear_parent_types[] = {
/* note, poll should check for editable scene */
static int parent_clear_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
int type= RNA_enum_get(op->ptr, "type");
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
@@ -427,12 +431,12 @@ static int parent_clear_exec(bContext *C, wmOperator *op)
else if(type == 2)
unit_m4(ob->parentinv);
- ob->recalc |= OB_RECALC;
+ ob->recalc |= OB_RECALC_ALL;
}
CTX_DATA_END;
- DAG_scene_sort(CTX_data_scene(C));
- DAG_ids_flush_update(0);
+ DAG_scene_sort(bmain, scene);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
return OPERATOR_FINISHED;
@@ -517,6 +521,7 @@ void ED_object_parent(Object *ob, Object *par, int type, const char *substr)
static int parent_set_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *par= CTX_data_active_object(C);
bPoseChannel *pchan= NULL;
@@ -594,15 +599,15 @@ static int parent_set_exec(bContext *C, wmOperator *op)
switch (partype) {
case PAR_CURVE: /* curve deform */
- md= ED_object_modifier_add(op->reports, scene, ob, NULL, eModifierType_Curve);
+ md= ED_object_modifier_add(op->reports, bmain, scene, ob, NULL, eModifierType_Curve);
((CurveModifierData *)md)->object= par;
break;
case PAR_LATTICE: /* lattice deform */
- md= ED_object_modifier_add(op->reports, scene, ob, NULL, eModifierType_Lattice);
+ md= ED_object_modifier_add(op->reports, bmain, scene, ob, NULL, eModifierType_Lattice);
((LatticeModifierData *)md)->object= par;
break;
default: /* armature deform */
- md= ED_object_modifier_add(op->reports, scene, ob, NULL, eModifierType_Armature);
+ md= ED_object_modifier_add(op->reports, bmain, scene, ob, NULL, eModifierType_Armature);
((ArmatureModifierData *)md)->object= par;
break;
}
@@ -657,8 +662,8 @@ static int parent_set_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
- DAG_scene_sort(scene);
- DAG_ids_flush_update(0);
+ DAG_scene_sort(bmain, scene);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
return OPERATOR_FINISHED;
@@ -719,6 +724,7 @@ void OBJECT_OT_parent_set(wmOperatorType *ot)
static int parent_noinv_set_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Object *par= CTX_data_active_object(C);
par->recalc |= OB_RECALC_OB;
@@ -745,8 +751,8 @@ static int parent_noinv_set_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
- DAG_scene_sort(CTX_data_scene(C));
- DAG_ids_flush_update(0);
+ DAG_scene_sort(bmain, CTX_data_scene(C));
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
return OPERATOR_FINISHED;
@@ -772,6 +778,7 @@ void OBJECT_OT_parent_no_inverse_set(wmOperatorType *ot)
static int object_slow_parent_clear_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
@@ -786,7 +793,7 @@ static int object_slow_parent_clear_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_SCENE, scene);
return OPERATOR_FINISHED;
@@ -813,6 +820,7 @@ void OBJECT_OT_slow_parent_clear(wmOperatorType *ot)
static int object_slow_parent_set_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
@@ -824,7 +832,7 @@ static int object_slow_parent_set_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_SCENE, scene);
return OPERATOR_FINISHED;
@@ -858,6 +866,8 @@ static EnumPropertyItem prop_clear_track_types[] = {
/* note, poll should check for editable scene */
static int object_track_clear_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
int type= RNA_enum_get(op->ptr, "type");
if(CTX_data_edit_object(C)) {
@@ -869,7 +879,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) {
@@ -883,8 +893,8 @@ static int object_track_clear_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
- DAG_ids_flush_update(0);
- DAG_scene_sort(CTX_data_scene(C));
+ DAG_ids_flush_update(bmain, 0);
+ DAG_scene_sort(bmain, scene);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
return OPERATOR_FINISHED;
@@ -920,6 +930,7 @@ static EnumPropertyItem prop_make_track_types[] = {
static int track_set_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *obact= CTX_data_active_object(C);
@@ -935,7 +946,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)
@@ -954,7 +965,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) {
@@ -975,7 +986,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) {
@@ -987,8 +998,8 @@ static int track_set_exec(bContext *C, wmOperator *op)
CTX_DATA_END;
}
- DAG_scene_sort(scene);
- DAG_ids_flush_update(0);
+ DAG_scene_sort(bmain, scene);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
return OPERATOR_FINISHED;
@@ -1021,7 +1032,7 @@ static unsigned int move_to_layer_init(bContext *C, wmOperator *op)
int values[20], a;
unsigned int lay= 0;
- if(!RNA_property_is_set(op->ptr, "layer")) {
+ if(!RNA_property_is_set(op->ptr, "layers")) {
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
lay |= base->lay;
}
@@ -1030,10 +1041,10 @@ static unsigned int move_to_layer_init(bContext *C, wmOperator *op)
for(a=0; a<20; a++)
values[a]= (lay & (1<<a));
- RNA_boolean_set_array(op->ptr, "layer", values);
+ RNA_boolean_set_array(op->ptr, "layers", values);
}
else {
- RNA_boolean_get_array(op->ptr, "layer", values);
+ RNA_boolean_get_array(op->ptr, "layers", values);
for(a=0; a<20; a++)
if(values[a])
@@ -1057,6 +1068,7 @@ static int move_to_layer_invoke(bContext *C, wmOperator *op, wmEvent *event)
static int move_to_layer_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
View3D *v3d= CTX_wm_view3d(C);
unsigned int lay, local;
@@ -1097,7 +1109,7 @@ static int move_to_layer_exec(bContext *C, wmOperator *op)
/* warning, active object may be hidden now */
WM_event_add_notifier(C, NC_SCENE|NC_OBJECT|ND_DRAW, scene); /* is NC_SCENE needed ? */
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
return OPERATOR_FINISHED;
}
@@ -1118,15 +1130,15 @@ void OBJECT_OT_move_to_layer(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_boolean_layer_member(ot->srna, "layer", 20, NULL, "Layer", "");
+ RNA_def_boolean_layer_member(ot->srna, "layers", 20, NULL, "Layer", "");
}
/************************** Link to Scene Operator *****************************/
-void link_to_scene(unsigned short nr)
+void link_to_scene(Main *bmain, unsigned short nr)
{
#if 0
- Scene *sce= (Scene*) BLI_findlink(&G.main->scene, G.curscreen->scenenr-1);
+ Scene *sce= (Scene*) BLI_findlink(&bmain->scene, G.curscreen->scenenr-1);
Base *base, *nbase;
if(sce==0) return;
@@ -1146,7 +1158,8 @@ 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"));
+ Main *bmain= CTX_data_main(C);
+ 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");
@@ -1174,7 +1187,7 @@ static int make_links_scene_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 0);
/* one day multiple scenes will be visible, then we should have some update function for them */
return OPERATOR_FINISHED;
@@ -1188,8 +1201,33 @@ 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)
{
+ Main *bmain= CTX_data_main(C);
int event = RNA_int_get(op->ptr, "type");
Object *ob;
ID *id;
@@ -1199,49 +1237,50 @@ 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; a<ob->totcol; 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->dup_group= ob->dup_group;
- if(obt->dup_group) {
- id_us_plus((ID *)obt->dup_group);
- obt->transflag |= OB_DUPLIGROUP;
+ obt->recalc |= OB_RECALC_DATA;
+ break;
+ case MAKE_LINKS_MATERIALS:
+ /* new approach, using functions from kernel */
+ for(a=0; a<ob->totcol; 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_lib_extern(&obt->dup_group->id);
+ obt->transflag |= OB_DUPLIGROUP;
+ }
+ break;
+ case MAKE_LINKS_MODIFIERS:
+ object_link_modifiers(obt, ob);
+ obt->recalc |= OB_RECALC_ALL;
+ break;
}
- break;
- case MAKE_LINKS_MODIFIERS:
- object_link_modifiers(obt, ob);
- obt->recalc |= OB_RECALC;
- break;
}
}
}
CTX_DATA_END;
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, CTX_wm_view3d(C));
return OPERATOR_FINISHED;
}
@@ -1264,8 +1303,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)
@@ -1370,7 +1410,7 @@ void new_id_matar(Material **matar, int totcol)
}
}
-void single_obdata_users(Scene *scene, int flag)
+void single_obdata_users(Main *bmain, Scene *scene, int flag)
{
Object *ob;
Lamp *la;
@@ -1486,7 +1526,7 @@ void single_obdata_users(Scene *scene, int flag)
}
}
- me= G.main->mesh.first;
+ me= bmain->mesh.first;
while(me) {
ID_NEW(me->texcomesh);
me= me->id.next;
@@ -1584,10 +1624,9 @@ void do_single_tex_user(Tex **from)
}
}
-void single_tex_users_expand()
+void single_tex_users_expand(Main *bmain)
{
/* only when 'parent' blocks are LIB_NEW */
- Main *bmain= G.main;
Material *ma;
Lamp *la;
World *wo;
@@ -1624,10 +1663,9 @@ void single_tex_users_expand()
}
}
-static void single_mat_users_expand(void)
+static void single_mat_users_expand(Main *bmain)
{
/* only when 'parent' blocks are LIB_NEW */
- Main *bmain= G.main;
Object *ob;
Mesh *me;
Curve *cu;
@@ -1660,14 +1698,14 @@ static void single_mat_users_expand(void)
}
/* used for copying scenes */
-void ED_object_single_users(Scene *scene, int full)
+void ED_object_single_users(Main *bmain, Scene *scene, int full)
{
single_object_users(scene, NULL, 0);
if(full) {
- single_obdata_users(scene, 0);
- single_mat_users_expand();
- single_tex_users_expand();
+ single_obdata_users(bmain, scene, 0);
+ single_mat_users_expand(bmain);
+ single_tex_users_expand(bmain);
}
clear_id_newpoins();
@@ -1710,21 +1748,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);
}
}
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) {
@@ -1742,7 +1780,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;
@@ -1802,6 +1840,7 @@ void OBJECT_OT_make_local(wmOperatorType *ot)
static int make_single_user_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
View3D *v3d= CTX_wm_view3d(C); /* ok if this is NULL */
int flag= RNA_enum_get(op->ptr, "type"); /* 0==ALL, SELECTED==selected objecs */
@@ -1810,7 +1849,7 @@ static int make_single_user_exec(bContext *C, wmOperator *op)
single_object_users(scene, v3d, flag);
if(RNA_boolean_get(op->ptr, "obdata"))
- single_obdata_users(scene, flag);
+ single_obdata_users(bmain, scene, flag);
if(RNA_boolean_get(op->ptr, "material"))
single_mat_users(scene, flag, FALSE);
@@ -1859,6 +1898,7 @@ void OBJECT_OT_make_single_user(wmOperatorType *ot)
static int drop_named_material_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
+ Main *bmain= CTX_data_main(C);
Base *base= ED_view3d_give_base_under_cursor(C, event->mval);
Material *ma;
char name[32];
@@ -1870,7 +1910,7 @@ static int drop_named_material_invoke(bContext *C, wmOperator *op, wmEvent *even
assign_material(base->object, ma, 1);
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, CTX_wm_view3d(C));
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c
index a5a9bbdffdd..fa9a97f4e74 100644
--- a/source/blender/editors/object/object_select.c
+++ b/source/blender/editors/object/object_select.c
@@ -44,8 +44,6 @@
#include "BLI_string.h"
#include "BKE_context.h"
-#include "BKE_depsgraph.h"
-#include "BKE_global.h"
#include "BKE_group.h"
#include "BKE_main.h"
#include "BKE_material.h"
@@ -53,13 +51,15 @@
#include "BKE_property.h"
#include "BKE_report.h"
#include "BKE_scene.h"
-#include "BKE_utildefines.h"
+#include "BKE_deform.h"
#include "WM_api.h"
#include "WM_types.h"
#include "ED_screen.h"
+#include "UI_interface.h"
+
#include "RNA_access.h"
#include "RNA_define.h"
#include "RNA_enum_types.h"
@@ -161,11 +161,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}
};
@@ -198,7 +200,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;
}
@@ -227,7 +229,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) {
@@ -286,6 +295,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;
@@ -382,14 +403,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;
-
- for ( group=G.main->group.first;
- group && group_count < GROUP_MENU_MAX;
- group=group->id.next
- ) {
+ int group_count=0, i;
+ uiPopupMenu *pup;
+ uiLayout *layout;
+
+ 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++;
@@ -398,7 +416,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) {
@@ -410,27 +427,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; i<group_count; i++) {
group = ob_groups[i];
- p += sprintf (p, "|%s%%x%i", group->id.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)
@@ -627,7 +635,7 @@ static int object_select_by_layer_exec(bContext *C, wmOperator *op)
short extend;
extend= RNA_boolean_get(op->ptr, "extend");
- layernum = RNA_int_get(op->ptr, "layer");
+ layernum = RNA_int_get(op->ptr, "layers");
if (extend == 0) {
CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
@@ -665,7 +673,7 @@ void OBJECT_OT_select_by_layer(wmOperatorType *ot)
/* properties */
RNA_def_boolean(ot->srna, "extend", FALSE, "Extend", "Extend selection instead of deselecting everything first.");
- RNA_def_int(ot->srna, "layer", 1, 1, 20, "Layer", "", 1, 20);
+ RNA_def_int(ot->srna, "layers", 1, 1, 20, "Layer", "", 1, 20);
}
/************************** Select Inverse *************************/
@@ -751,7 +759,7 @@ void OBJECT_OT_select_all(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "deselect all";
+ ot->name= "Select or Deselect All";
ot->description = "Change selection of all visible objects in scene";
ot->idname= "OBJECT_OT_select_all";
@@ -765,131 +773,67 @@ void OBJECT_OT_select_all(wmOperatorType *ot)
WM_operator_properties_select_all(ot);
}
-/**************************** Select Mirror ****************************/
+/**************************** Select In The Same Group ****************************/
-/* finds the best possible flipped name. For renaming; check for unique names afterwards */
-/* if strip_number: removes number extensions */
-void object_flip_name (char *name)
+static int object_select_same_group_exec(bContext *C, wmOperator *op)
{
- 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 occurrence
- if (index && isdigit(index[1]) ) { // doesnt handle case bone.1abc2 correct..., whatever!
- strcpy(number, index);
- *index= 0;
- len= strlen(name);
- }
- }
+ Group *group;
+ char group_name[32];
- strcpy (prefix, name);
+ /* passthrough if no objects are visible */
+ if (CTX_DATA_COUNT(C, visible_bases) == 0) return OPERATOR_PASS_THROUGH;
-#define IS_SEPARATOR(a) ((a)=='.' || (a)==' ' || (a)=='-' || (a)=='_')
+ RNA_string_get(op->ptr, "group", group_name);
- /* 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;
- }
+ for (group=CTX_data_main(C)->group.first; group; group=group->id.next) {
+ if (!strcmp(group->id.name, group_name))
+ 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);
- }
- }
+
+ 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;
-#undef IS_SEPARATOR
+ 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;
- sprintf (name, "%s%s%s%s", prefix, replace, suffix, number);
+ RNA_def_string(ot->srna, "group", "", 32, "Group", "Name of the group to select.");
}
+/**************************** Select Mirror ****************************/
static int object_select_mirror_exec(bContext *C, wmOperator *op)
{
- char tmpname[32];
short extend;
extend= RNA_boolean_get(op->ptr, "extend");
CTX_DATA_BEGIN(C, Base*, primbase, selected_bases) {
- strcpy(tmpname, primbase->object->id.name+2);
- object_flip_name(tmpname);
-
+ char tmpname[32];
+ flip_side_name(tmpname, primbase->object->id.name+2, TRUE);
+
CTX_DATA_BEGIN(C, Base*, secbase, visible_bases) {
if(!strcmp(secbase->object->id.name+2, tmpname)) {
ED_base_object_select(secbase, BA_SELECT);
@@ -941,7 +885,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 6735d07b591..7b1ab933e28 100644
--- a/source/blender/editors/object/object_shapekey.c
+++ b/source/blender/editors/object/object_shapekey.c
@@ -45,20 +45,14 @@
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
-#include "BKE_action.h"
-#include "BKE_anim.h"
#include "BKE_context.h"
-#include "BKE_curve.h"
#include "BKE_depsgraph.h"
-#include "BKE_global.h"
-#include "BKE_ipo.h"
#include "BKE_key.h"
#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_mesh.h"
#include "BKE_object.h"
-#include "BKE_utildefines.h"
#include "BLO_sys_types.h" // for intptr_t support
diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c
index 13b7f883922..813f562f380 100644
--- a/source/blender/editors/object/object_transform.c
+++ b/source/blender/editors/object/object_transform.c
@@ -34,6 +34,7 @@
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_group_types.h"
#include "BLI_math.h"
#include "BLI_editVert.h"
@@ -42,12 +43,10 @@
#include "BKE_context.h"
#include "BKE_curve.h"
#include "BKE_depsgraph.h"
-#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_object.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
#include "RNA_define.h"
#include "RNA_access.h"
@@ -56,7 +55,6 @@
#include "WM_types.h"
#include "ED_armature.h"
-#include "ED_curve.h"
#include "ED_keyframing.h"
#include "ED_mesh.h"
#include "ED_screen.h"
@@ -68,6 +66,7 @@
static int object_location_clear_exec(bContext *C, wmOperator *op)
{
+ Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Location");
@@ -102,7 +101,7 @@ static int object_location_clear_exec(bContext *C, wmOperator *op)
CTX_DATA_END;
/* this is needed so children are also updated */
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
@@ -126,6 +125,7 @@ void OBJECT_OT_location_clear(wmOperatorType *ot)
static int object_rotation_clear_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Rotation");
@@ -182,7 +182,7 @@ static int object_rotation_clear_exec(bContext *C, wmOperator *op)
axis_angle_to_eulO( oldeul, EULER_ORDER_DEFAULT,ob->rotAxis, ob->rotAngle);
}
else {
- VECCOPY(oldeul, ob->rot);
+ copy_v3_v3(oldeul, ob->rot);
}
eul[0]= eul[1]= eul[2]= 0.0f;
@@ -205,10 +205,10 @@ static int object_rotation_clear_exec(bContext *C, wmOperator *op)
eulO_to_axis_angle( ob->rotAxis, &ob->rotAngle,eul, EULER_ORDER_DEFAULT);
}
else {
- VECCOPY(ob->rot, eul);
+ copy_v3_v3(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;
@@ -244,7 +244,7 @@ static int object_rotation_clear_exec(bContext *C, wmOperator *op)
CTX_DATA_END;
/* this is needed so children are also updated */
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
@@ -268,6 +268,7 @@ void OBJECT_OT_rotation_clear(wmOperatorType *ot)
static int object_scale_clear_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Scaling");
@@ -307,7 +308,7 @@ static int object_scale_clear_exec(bContext *C, wmOperator *op)
CTX_DATA_END;
/* this is needed so children are also updated */
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
@@ -331,6 +332,7 @@ void OBJECT_OT_scale_clear(wmOperatorType *ot)
static int object_origin_clear_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
float *v1, *v3, mat[3][3];
int armature_clear= 0;
@@ -340,10 +342,7 @@ static int object_origin_clear_exec(bContext *C, wmOperator *op)
v3= ob->parentinv[3];
copy_m3_m4(mat, ob->parentinv);
- VECCOPY(v3, v1);
- v3[0]= -v3[0];
- v3[1]= -v3[1];
- v3[2]= -v3[2];
+ negate_v3_v3(v3, v1);
mul_m3_v3(mat, v3);
}
ob->recalc |= OB_RECALC_OB;
@@ -351,7 +350,7 @@ static int object_origin_clear_exec(bContext *C, wmOperator *op)
CTX_DATA_END;
if(armature_clear==0) /* in this case flush was done */
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
@@ -432,6 +431,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 +501,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;
@@ -693,340 +696,290 @@ void texspace_edit(Scene *scene, View3D *v3d)
/********************* Set Object Center ************************/
-static EnumPropertyItem prop_set_center_types[] = {
- {0, "GEOMETRY_ORIGIN", 0, "Geometry to Origin", "Move object geometry to object origin"},
- {1, "ORIGIN_GEOMETRY", 0, "Origin to Geometry", "Move object origin to center of object geometry"},
- {2, "ORIGIN_CURSOR", 0, "Origin to 3D Cursor", "Move object origin to position of the 3d cursor"},
- {0, NULL, 0, NULL, NULL}
+enum {
+ GEOMETRY_TO_ORIGIN=0,
+ ORIGIN_TO_GEOMETRY,
+ ORIGIN_TO_CURSOR
};
-/* 0 == do center, 1 == center new, 2 == center cursor */
static int object_origin_set_exec(bContext *C, wmOperator *op)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
- ScrArea *sa= CTX_wm_area(C);
- View3D *v3d= sa->spacedata.first;
Object *obedit= CTX_data_edit_object(C);
- Mesh *me, *tme;
- Curve *cu;
-/* BezTriple *bezt;
- BPoint *bp; */
- Nurb *nu, *nu1;
- EditVert *eve;
- float cent[3], centn[3], min[3], max[3], omat[3][3];
- int a, total= 0;
+ Object *tob;
+ float cursor[3], cent[3], cent_neg[3], centn[3], min[3], max[3];
int centermode = RNA_enum_get(op->ptr, "type");
-
+ int around = RNA_enum_get(op->ptr, "center"); /* initialized from v3d->around */
+
/* keep track of what is changed */
int tot_change=0, tot_lib_error=0, tot_multiuser_arm_error=0;
- MVert *mvert;
- if(scene->id.lib || v3d==NULL){
- BKE_report(op->reports, RPT_ERROR, "Operation cannot be performed on Lib data");
- return OPERATOR_CANCELLED;
- }
- if (obedit && centermode > 0) {
+ if (obedit && centermode != GEOMETRY_TO_ORIGIN) {
BKE_report(op->reports, RPT_ERROR, "Operation cannot be performed in EditMode");
return OPERATOR_CANCELLED;
- }
- cent[0]= cent[1]= cent[2]= 0.0;
-
- if(obedit) {
+ }
+ else {
+ /* get the view settings if 'around' isnt set and the view is available */
+ View3D *v3d= CTX_wm_view3d(C);
+ copy_v3_v3(cursor, give_cursor(scene, v3d));
+ if(v3d && !RNA_property_is_set(op->ptr, "around"))
+ around= v3d->around;
+ }
+ zero_v3(cent);
+
+ if(obedit) {
INIT_MINMAX(min, max);
-
+
if(obedit->type==OB_MESH) {
Mesh *me= obedit->data;
EditMesh *em = BKE_mesh_get_editmesh(me);
+ EditVert *eve;
- for(eve= em->verts.first; eve; eve= eve->next) {
- if(v3d->around==V3D_CENTROID) {
+ if(around==V3D_CENTROID) {
+ int total= 0;
+ for(eve= em->verts.first; eve; eve= eve->next) {
total++;
- VECADD(cent, cent, eve->co);
- }
- else {
- DO_MINMAX(eve->co, min, max);
+ add_v3_v3(cent, eve->co);
}
- }
-
- if(v3d->around==V3D_CENTROID) {
mul_v3_fl(cent, 1.0f/(float)total);
}
else {
- cent[0]= (min[0]+max[0])/2.0f;
- cent[1]= (min[1]+max[1])/2.0f;
- cent[2]= (min[2]+max[2])/2.0f;
+ for(eve= em->verts.first; eve; eve= eve->next) {
+ DO_MINMAX(eve->co, min, max);
+ }
+ mid_v3_v3v3(cent, min, max);
}
-
+
for(eve= em->verts.first; eve; eve= eve->next) {
- sub_v3_v3v3(eve->co, eve->co, cent);
+ sub_v3_v3(eve->co, cent);
}
-
+
recalc_editnormals(em);
tot_change++;
DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
BKE_mesh_end_editmesh(me, em);
}
}
-
+
/* reset flags */
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
ob->flag &= ~OB_DONE;
}
CTX_DATA_END;
-
- for (me= G.main->mesh.first; me; me= me->id.next) {
- me->flag &= ~ME_ISDONE;
+
+ for (tob= bmain->object.first; tob; tob= tob->id.next) {
+ if(tob->data)
+ ((ID *)tob->data)->flag &= ~LIB_DOIT;
+ if(tob->dup_group)
+ ((ID *)tob->dup_group)->flag &= ~LIB_DOIT;
}
-
+
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
if((ob->flag & OB_DONE)==0) {
+ int do_inverse_offset = FALSE;
ob->flag |= OB_DONE;
-
- if(obedit==NULL && (me=get_mesh(ob)) ) {
- if (me->id.lib) {
- tot_lib_error++;
- } else {
- if(centermode==2) {
- VECCOPY(cent, give_cursor(scene, v3d));
- invert_m4_m4(ob->imat, ob->obmat);
- mul_m4_v3(ob->imat, cent);
- } else {
- INIT_MINMAX(min, max);
- mvert= me->mvert;
- for(a=0; a<me->totvert; a++, mvert++) {
- DO_MINMAX(mvert->co, min, max);
- }
-
- cent[0]= (min[0]+max[0])/2.0f;
- cent[1]= (min[1]+max[1])/2.0f;
- cent[2]= (min[2]+max[2])/2.0f;
- }
- mvert= me->mvert;
- for(a=0; a<me->totvert; a++, mvert++) {
- sub_v3_v3v3(mvert->co, mvert->co, cent);
+ if(centermode == ORIGIN_TO_CURSOR) {
+ copy_v3_v3(cent, cursor);
+ invert_m4_m4(ob->imat, ob->obmat);
+ mul_m4_v3(ob->imat, cent);
+ }
+
+ if(ob->data == NULL) {
+ /* special support for dupligroups */
+ if((ob->transflag & OB_DUPLIGROUP) && ob->dup_group && (ob->dup_group->id.flag & LIB_DOIT)==0) {
+ if(ob->dup_group->id.lib) {
+ tot_lib_error++;
}
-
- if (me->key) {
- KeyBlock *kb;
- for (kb=me->key->block.first; kb; kb=kb->next) {
- float *fp= kb->data;
-
- for (a=0; a<kb->totelem; a++, fp+=3) {
- sub_v3_v3v3(fp, fp, cent);
- }
+ else {
+ if(centermode == ORIGIN_TO_CURSOR) { /* done */ }
+ else {
+ /* only bounds support */
+ INIT_MINMAX(min, max);
+ minmax_object_duplis(scene, ob, min, max);
+ mid_v3_v3v3(cent, min, max);
+ invert_m4_m4(ob->imat, ob->obmat);
+ mul_m4_v3(ob->imat, cent);
}
- }
-
- me->flag |= ME_ISDONE;
-
- if(centermode) {
- copy_m3_m4(omat, ob->obmat);
-
- VECCOPY(centn, cent);
- mul_m3_v3(omat, centn);
- ob->loc[0]+= centn[0];
- ob->loc[1]+= centn[1];
- ob->loc[2]+= centn[2];
- where_is_object(scene, ob);
- ignore_parent_tx(bmain, scene, ob);
-
- /* other users? */
- CTX_DATA_BEGIN(C, Object*, ob_other, selected_editable_objects) {
- if((ob_other->flag & OB_DONE)==0) {
- tme= get_mesh(ob_other);
-
- if(tme==me) {
-
- ob_other->flag |= OB_DONE;
- ob_other->recalc= OB_RECALC_OB|OB_RECALC_DATA;
-
- copy_m3_m4(omat, ob_other->obmat);
- VECCOPY(centn, cent);
- mul_m3_v3(omat, centn);
- ob_other->loc[0]+= centn[0];
- ob_other->loc[1]+= centn[1];
- ob_other->loc[2]+= centn[2];
-
- where_is_object(scene, ob_other);
- ignore_parent_tx(bmain, scene, ob_other);
-
- if(tme && (tme->flag & ME_ISDONE)==0) {
- mvert= tme->mvert;
- for(a=0; a<tme->totvert; a++, mvert++) {
- sub_v3_v3v3(mvert->co, mvert->co, cent);
- }
-
- if (tme->key) {
- KeyBlock *kb;
- for (kb=tme->key->block.first; kb; kb=kb->next) {
- float *fp= kb->data;
-
- for (a=0; a<kb->totelem; a++, fp+=3) {
- sub_v3_v3v3(fp, fp, cent);
- }
- }
- }
-
- tme->flag |= ME_ISDONE;
- }
- }
- }
- }
- CTX_DATA_END;
+ add_v3_v3(ob->dup_group->dupli_ofs, cent);
+
+ tot_change++;
+ ob->dup_group->id.flag |= LIB_DOIT;
+ do_inverse_offset= TRUE;
}
- tot_change++;
}
}
+ else if (((ID *)ob->data)->lib) {
+ tot_lib_error++;
+ }
+
+ if(obedit==NULL && ob->type==OB_MESH) {
+ Mesh *me= ob->data;
+
+ if(centermode == ORIGIN_TO_CURSOR) { /* done */ }
+ else if(around==V3D_CENTROID) { mesh_center_median(me, cent); }
+ else { mesh_center_bounds(me, cent); }
+
+ negate_v3_v3(cent_neg, cent);
+ mesh_translate(me, cent_neg, 1);
+
+ tot_change++;
+ me->id.flag |= LIB_DOIT;
+ do_inverse_offset= TRUE;
+ }
else if (ELEM(ob->type, OB_CURVE, OB_SURF)) {
-
- /* weak code here... (ton) */
- if(obedit==ob) {
- ListBase *editnurb= curve_get_editcurve(obedit);
+ Curve *cu= ob->data;
- nu1= editnurb->first;
- cu= obedit->data;
- }
- else {
- cu= ob->data;
- nu1= cu->nurb.first;
- }
-
- if (cu->id.lib) {
- tot_lib_error++;
- } else {
- if(centermode==2) {
- VECCOPY(cent, give_cursor(scene, v3d));
- invert_m4_m4(ob->imat, ob->obmat);
- mul_m4_v3(ob->imat, cent);
-
- /* don't allow Z change if curve is 2D */
- if( !( cu->flag & CU_3D ) )
- cent[2] = 0.0;
- }
- else {
- INIT_MINMAX(min, max);
-
- nu= nu1;
- while(nu) {
- minmaxNurb(nu, min, max);
- nu= nu->next;
- }
-
- cent[0]= (min[0]+max[0])/2.0f;
- cent[1]= (min[1]+max[1])/2.0f;
- cent[2]= (min[2]+max[2])/2.0f;
- }
-
- nu= nu1;
- while(nu) {
- 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);
- }
- }
- else {
- a= nu->pntsu*nu->pntsv;
- while (a--)
- sub_v3_v3v3(nu->bp[a].vec, nu->bp[a].vec, cent);
- }
- nu= nu->next;
- }
-
- if(centermode && obedit==NULL) {
- 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];
-
- where_is_object(scene, ob);
- ignore_parent_tx(bmain, scene, ob);
- }
-
- tot_change++;
- if(obedit) {
- if (centermode==0) {
- DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
- }
- break;
+ if(centermode == ORIGIN_TO_CURSOR) { /* done */ }
+ else if(around==V3D_CENTROID) { curve_center_median(cu, cent); }
+ else { curve_center_bounds(cu, cent); }
+
+ /* don't allow Z change if curve is 2D */
+ if((ob->type == OB_CURVE) && !(cu->flag & CU_3D))
+ cent[2] = 0.0;
+
+ negate_v3_v3(cent_neg, cent);
+ curve_translate(cu, cent_neg, 1);
+
+ tot_change++;
+ cu->id.flag |= LIB_DOIT;
+ do_inverse_offset= TRUE;
+
+ if(obedit) {
+ if (centermode == GEOMETRY_TO_ORIGIN) {
+ DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
}
+ break;
}
}
else if(ob->type==OB_FONT) {
/* get from bb */
-
- cu= ob->data;
-
- if(cu->bb==NULL) {
+
+ Curve *cu= ob->data;
+
+ if(cu->bb==NULL && (centermode != ORIGIN_TO_CURSOR)) {
/* do nothing*/
- } else if (cu->id.lib) {
- tot_lib_error++;
- } else {
- cu->xof= -0.5f*( cu->bb->vec[4][0] - cu->bb->vec[0][0]);
- cu->yof= -0.5f -0.5f*( cu->bb->vec[0][1] - cu->bb->vec[2][1]); /* extra 0.5 is the height o above line */
-
- /* not really ok, do this better once! */
- cu->xof /= cu->fsize;
- cu->yof /= cu->fsize;
+ }
+ else {
+ if(centermode == ORIGIN_TO_CURSOR) {
+ /* done */
+ }
+ else {
+ cent[0]= 0.5f * ( cu->bb->vec[4][0] + cu->bb->vec[0][0]);
+ cent[1]= 0.5f * ( cu->bb->vec[0][1] + cu->bb->vec[2][1]) - 0.5f; /* extra 0.5 is the height o above line */
+ }
+
+ cent[2]= 0.0f;
+
+ cu->xof= cu->xof - (cent[0] / cu->fsize);
+ cu->yof= cu->yof - (cent[1] / cu->fsize);
tot_change++;
+ cu->id.flag |= LIB_DOIT;
+ do_inverse_offset= TRUE;
}
}
else if(ob->type==OB_ARMATURE) {
bArmature *arm = ob->data;
-
- if (arm->id.lib) {
- tot_lib_error++;
- } else if(ID_REAL_USERS(arm) > 1) {
+
+ if(ID_REAL_USERS(arm) > 1) {
/*BKE_report(op->reports, RPT_ERROR, "Can't apply to a multi user armature");
return;*/
tot_multiuser_arm_error++;
- } else {
- /* Function to recenter armatures in editarmature.c
+ }
+ else {
+ /* Function to recenter armatures in editarmature.c
* Bone + object locations are handled there.
*/
- docenter_armature(scene, v3d, ob, centermode);
+ docenter_armature(scene, ob, cursor, centermode, around);
+
tot_change++;
-
+ arm->id.flag |= LIB_DOIT;
+ /* do_inverse_offset= TRUE; */ /* docenter_armature() handles this */
+
where_is_object(scene, ob);
ignore_parent_tx(bmain, scene, ob);
-
- if(obedit)
+
+ if(obedit)
break;
}
}
- ob->recalc= OB_RECALC_OB|OB_RECALC_DATA;
+
+ /* offset other selected objects */
+ if(do_inverse_offset && (centermode != GEOMETRY_TO_ORIGIN)) {
+ /* was the object data modified
+ * note: the functions above must set 'cent' */
+ copy_v3_v3(centn, cent);
+ mul_mat3_m4_v3(ob->obmat, centn); /* ommit translation part */
+ add_v3_v3(ob->loc, centn);
+
+ where_is_object(scene, ob);
+ ignore_parent_tx(bmain, scene, ob);
+
+ /* other users? */
+ CTX_DATA_BEGIN(C, Object*, ob_other, selected_editable_objects) {
+ if( (ob_other->flag & OB_DONE)==0 &&
+ ( (ob->data && (ob->data == ob_other->data)) ||
+ (ob->dup_group==ob_other->dup_group && (ob->transflag|ob_other->transflag) & OB_DUPLIGROUP) )
+ ) {
+ ob_other->flag |= OB_DONE;
+ ob_other->recalc= OB_RECALC_OB|OB_RECALC_DATA;
+
+ copy_v3_v3(centn, cent);
+ mul_mat3_m4_v3(ob_other->obmat, centn); /* ommit translation part */
+ add_v3_v3(ob_other->loc, centn);
+
+ where_is_object(scene, ob_other);
+ ignore_parent_tx(bmain, scene, ob_other);
+ }
+ }
+ CTX_DATA_END;
+ }
}
}
CTX_DATA_END;
-
+
+ for (tob= bmain->object.first; tob; tob= tob->id.next) {
+ if(tob->data && (((ID *)tob->data)->flag & LIB_DOIT)) {
+ tob->recalc= OB_RECALC_OB|OB_RECALC_DATA;
+ }
+ }
+
if (tot_change) {
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
}
-
- /* Warn if any errors occured */
+
+ /* Warn if any errors occurred */
if (tot_lib_error+tot_multiuser_arm_error) {
- BKE_reportf(op->reports, RPT_WARNING, "%i Object(s) Not Centered, %i Changed:",tot_lib_error+tot_multiuser_arm_error, tot_change);
+ BKE_reportf(op->reports, RPT_WARNING, "%i Object(s) Not Centered, %i Changed:",tot_lib_error+tot_multiuser_arm_error, tot_change);
if (tot_lib_error)
BKE_reportf(op->reports, RPT_WARNING, "|%i linked library objects",tot_lib_error);
if (tot_multiuser_arm_error)
BKE_reportf(op->reports, RPT_WARNING, "|%i multiuser armature object(s)",tot_multiuser_arm_error);
}
-
+
return OPERATOR_FINISHED;
}
void OBJECT_OT_origin_set(wmOperatorType *ot)
{
+ static EnumPropertyItem prop_set_center_types[] = {
+ {GEOMETRY_TO_ORIGIN, "GEOMETRY_ORIGIN", 0, "Geometry to Origin", "Move object geometry to object origin"},
+ {ORIGIN_TO_GEOMETRY, "ORIGIN_GEOMETRY", 0, "Origin to Geometry", "Move object origin to center of object geometry"},
+ {ORIGIN_TO_CURSOR, "ORIGIN_CURSOR", 0, "Origin to 3D Cursor", "Move object origin to position of the 3d cursor"},
+ {0, NULL, 0, NULL, NULL}
+ };
+
+ static EnumPropertyItem prop_set_bounds_types[] = {
+ {V3D_CENTROID, "MEDIAN", 0, "Median Center", ""},
+ {V3D_CENTER, "BOUNDS", 0, "Bounds Center", ""},
+ {0, NULL, 0, NULL, NULL}
+ };
+
/* identifiers */
ot->name= "Set Origin";
ot->description = "Set the object's origin, by either moving the data, or set to center of data, or use 3d cursor";
@@ -1036,12 +989,12 @@ void OBJECT_OT_origin_set(wmOperatorType *ot)
ot->invoke= WM_menu_invoke;
ot->exec= object_origin_set_exec;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_scene_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
ot->prop= RNA_def_enum(ot->srna, "type", prop_set_center_types, 0, "Type", "");
-
+ RNA_def_enum(ot->srna, "center", prop_set_bounds_types, V3D_CENTROID, "Center", "");
}
diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
index 76de8ee9dbe..f4806adf8b4 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -50,13 +50,8 @@
#include "BKE_customdata.h"
#include "BKE_deform.h"
#include "BKE_depsgraph.h"
-#include "BKE_DerivedMesh.h"
-#include "BKE_displist.h"
#include "BKE_global.h"
-#include "BKE_lattice.h"
#include "BKE_mesh.h"
-#include "BKE_paint.h"
-#include "BKE_utildefines.h"
#include "BKE_report.h"
#include "RNA_access.h"
@@ -78,7 +73,7 @@ static Lattice *vgroup_edit_lattice(Object *ob)
{
if(ob->type==OB_LATTICE) {
Lattice *lt= ob->data;
- return (lt->editlatt)? lt->editlatt: lt;
+ return (lt->editlatt)? lt->editlatt->latt: lt;
}
return NULL;
@@ -88,12 +83,12 @@ bDeformGroup *ED_vgroup_add_name(Object *ob, char *name)
{
bDeformGroup *defgroup;
- if(!ob)
+ if(!ob || !ELEM(ob->type, OB_MESH, OB_LATTICE))
return NULL;
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);
@@ -122,6 +117,77 @@ 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_mesh) {
+ EditMesh *em = me->edit_mesh;
+ EditVert *eve;
+ int i;
+
+ if (!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT)) {
+ *dvert_tot = 0;
+ *dvert_arr = NULL;
+ return 0;
+ }
+
+ i = 0;
+ for (eve=em->verts.first; eve; eve=eve->next) i++;
+
+ *dvert_arr= MEM_mallocN(sizeof(void*)*i, "vgroup parray from me");
+ *dvert_tot = i;
+
+ i = 0;
+ for (eve=em->verts.first; eve; eve=eve->next, i++) {
+ (*dvert_arr)[i] = CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+ }
+
+ 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; i<me->totvert; 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->latt: 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)
{
@@ -137,7 +203,7 @@ int ED_vgroup_give_array(ID *id, MDeformVert **dvert_arr, int *dvert_tot)
case ID_LT:
{
Lattice *lt= (Lattice *)id;
- lt= (lt->editlatt)? lt->editlatt: lt;
+ lt= (lt->editlatt)? lt->editlatt->latt: lt;
*dvert_arr= lt->dvert;
*dvert_tot= lt->pntsu*lt->pntsv*lt->pntsw;
return TRUE;
@@ -153,20 +219,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);
@@ -187,15 +255,18 @@ int ED_vgroup_copy_array(Object *ob, Object *ob_from)
dv= dvert_array;
for(i=0; i<dvert_tot; i++, dvf++, dv++) {
- if(dv->dw)
- 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;
}
@@ -461,18 +532,8 @@ float ED_vgroup_vert_weight(Object *ob, bDeformGroup *dg, int vertnum)
}
void ED_vgroup_select_by_name(Object *ob, char *name)
-{
- bDeformGroup *curdef;
- int actdef= 1;
-
- for(curdef = ob->defbase.first; curdef; curdef=curdef->next, actdef++){
- if(!strcmp(curdef->name, name)) {
- ob->actdef= actdef;
- return;
- }
- }
-
- ob->actdef= 0; // this signals on painting to create a new one, if a bone in posemode is selected */
+{ /* note: ob->actdef==0 signals on painting to create a new one, if a bone in posemode is selected */
+ ob->actdef= defgroup_name_index(ob, name) + 1;
}
/********************** Operator Implementations *********************/
@@ -537,7 +598,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));
@@ -570,13 +631,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;
@@ -585,16 +646,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));
@@ -604,7 +667,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);
@@ -613,7 +676,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;
@@ -624,16 +687,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));
@@ -641,7 +706,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);
@@ -650,17 +715,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) {
@@ -672,7 +739,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--) {
@@ -710,7 +777,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--) {
@@ -731,6 +798,8 @@ static void vgroup_normalize_all(Object *ob, int lock_active)
}
}
}
+
+ if (dvert_array) MEM_freeN(dvert_array);
}
@@ -738,10 +807,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));
@@ -750,7 +819,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);
@@ -768,6 +837,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 +929,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 +940,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 +951,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 +983,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)
@@ -1266,7 +1341,7 @@ static void vgroup_assign_verts(Object *ob, float weight)
EditMesh *em = BKE_mesh_get_editmesh(me);
if(!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT))
- EM_add_data_layer(em, &em->vdata, CD_MDEFORMVERT);
+ EM_add_data_layer(em, &em->vdata, CD_MDEFORMVERT, NULL);
/* Go through the list of editverts and assign them */
for(eve=em->verts.first; eve; eve=eve->next){
@@ -1920,41 +1995,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;
+ 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;
- return strcmp(def_a->name, def_b->name);
+ name= name_array;
+ for(def = ob->defbase.first; def; def=def->next) {
+ BLI_strncpy(name, def->name, MAX_VGROUP_NAME);
+ name += MAX_VGROUP_NAME;
+ }
+
+ return name_array;
}
-#define DEF_GROUP_SIZE (sizeof(((bDeformGroup *)NULL)->name))
-static int vertex_group_sort_exec(bContext *C, wmOperator *op)
+static int vgroup_do_remap(Object *ob, char *name_array, wmOperator *op)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ MDeformVert *dvert= NULL;
bDeformGroup *def;
int def_tot = BLI_countlist(&ob->defbase);
- 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_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;
- 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;
- }
-
- BLI_sortlist(&ob->defbase, vgroup_sort);
-
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) {
@@ -1975,7 +2047,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);
@@ -1988,21 +2064,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);
+ return OPERATOR_FINISHED;
+}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob);
+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 OPERATOR_FINISHED;
+ return strcmp(def_a->name, def_b->name);
}
-#undef DEF_GROUP_SIZE
+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)
{
@@ -2017,3 +2117,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..be826654311
--- /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_FLUID)
+ ADD_DEFINITIONS(-DDISABLE_ELBEEM)
+ENDIF(NOT WITH_FLUID)
+
+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/Makefile b/source/blender/editors/physics/Makefile
index e9260b66087..9ffc3a5b372 100644
--- a/source/blender/editors/physics/Makefile
+++ b/source/blender/editors/physics/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/physics/particle_boids.c b/source/blender/editors/physics/particle_boids.c
index 37de0d8f873..a18890881a8 100644
--- a/source/blender/editors/physics/particle_boids.c
+++ b/source/blender/editors/physics/particle_boids.c
@@ -35,6 +35,7 @@
#include "BKE_boids.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
+#include "BKE_main.h"
#include "BKE_particle.h"
#include "BLI_listbase.h"
@@ -99,6 +100,7 @@ void BOID_OT_rule_add(wmOperatorType *ot)
}
static int rule_del_exec(bContext *C, wmOperator *op)
{
+ Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -125,7 +127,7 @@ static int rule_del_exec(bContext *C, wmOperator *op)
if(rule)
rule->flag |= BOIDRULE_CURRENT;
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
DAG_id_flush_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
@@ -266,6 +268,7 @@ void BOID_OT_state_add(wmOperatorType *ot)
}
static int state_del_exec(bContext *C, wmOperator *op)
{
+ Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -297,7 +300,7 @@ static int state_del_exec(bContext *C, wmOperator *op)
state->flag |= BOIDSTATE_CURRENT;
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
DAG_id_flush_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c
index d20e0e87934..d491b1a9731 100644
--- a/source/blender/editors/physics/particle_edit.c
+++ b/source/blender/editors/physics/particle_edit.c
@@ -124,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;
@@ -160,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);
}
@@ -897,13 +897,13 @@ static void pe_deflect_emitter(Scene *scene, Object *ob, PTCacheEdit *edit)
if(dot<dist_1st) {
normalize_v3(dvec);
mul_v3_fl(dvec,dist_1st-dot);
- add_v3_v3v3(key->co,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;
@@ -989,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);
@@ -1321,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;
}
@@ -1371,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;
}
@@ -1380,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;
@@ -1392,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 */
@@ -1416,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;
@@ -1428,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 */
@@ -1468,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;
}
@@ -1494,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;
@@ -1534,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;
}
@@ -1559,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;
}
@@ -1625,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;
}
@@ -1659,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;
}
@@ -1701,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;
}
@@ -1759,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;
}
@@ -1820,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;
}
@@ -1857,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;
}
@@ -1948,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;
}
@@ -2091,6 +2098,7 @@ static void remove_tagged_keys(Scene *scene, Object *ob, ParticleSystem *psys)
ParticleData *pa;
HairKey *hkey, *nhkey, *new_hkeys=0;
POINT_P; KEY_K;
+ PTCacheEditKey *nkey, *new_keys;
ParticleSystemModifierData *psmd;
short new_totkey;
@@ -2126,9 +2134,10 @@ static void remove_tagged_keys(Scene *scene, Object *ob, ParticleSystem *psys)
}
if(new_totkey != pa->totkey) {
- hkey= pa->hair;
nhkey= new_hkeys= MEM_callocN(new_totkey*sizeof(HairKey), "HairKeys");
+ nkey= new_keys= MEM_callocN(new_totkey*sizeof(PTCacheEditKey), "particle edit keys");
+ hkey= pa->hair;
LOOP_KEYS {
while(key->flag & PEK_TAG && hkey < pa->hair + pa->totkey) {
key++;
@@ -2137,29 +2146,36 @@ static void remove_tagged_keys(Scene *scene, Object *ob, ParticleSystem *psys)
if(hkey < pa->hair + pa->totkey) {
VECCOPY(nhkey->co, hkey->co);
+ nhkey->editflag = hkey->editflag;
nhkey->time= hkey->time;
nhkey->weight= hkey->weight;
+
+ nkey->co= nhkey->co;
+ nkey->time= &nhkey->time;
+ /* these can be copied from old edit keys */
+ nkey->flag = key->flag;
+ nkey->ftime = key->ftime;
+ nkey->length = key->length;
+ VECCOPY(nkey->world_co, key->world_co);
}
- hkey++;
+ nkey++;
nhkey++;
+ hkey++;
}
+
if(pa->hair)
MEM_freeN(pa->hair);
+
+ if(point->keys)
+ MEM_freeN(point->keys);
pa->hair= new_hkeys;
+ point->keys= new_keys;
point->totkey= pa->totkey= new_totkey;
- if(point->keys)
- MEM_freeN(point->keys);
- key= point->keys= MEM_callocN(new_totkey*sizeof(PTCacheEditKey), "particle edit keys");
-
- hkey = pa->hair;
- LOOP_KEYS {
- key->co= hkey->co;
- key->time= &hkey->time;
- hkey++;
- }
+ /* flag for recalculating length */
+ point->flag |= PEP_EDIT_RECALC;
}
}
}
@@ -2253,7 +2269,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;
}
@@ -2341,7 +2357,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;
}
@@ -2376,21 +2392,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= 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;
}
@@ -2407,6 +2424,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 *******************************/
@@ -2446,7 +2465,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 *********************/
@@ -2565,7 +2584,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;
}
@@ -2724,7 +2743,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;
@@ -3317,7 +3336,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
RNA_float_get_array(itemptr, "mouse", mousef);
mouse[0] = mousef[0];
mouse[1] = mousef[1];
- flip= RNA_boolean_get(itemptr, "flip");
+ flip= RNA_boolean_get(itemptr, "pen_flip");
if(bedit->first) {
bedit->lastmouse[0]= mouse[0];
@@ -3509,7 +3528,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];
@@ -3606,7 +3625,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;
@@ -3663,6 +3682,8 @@ static void make_PTCacheUndo(PTCacheEdit *edit, PTCacheUndo *undo)
for(; pm; pm=pm->next) {
for(i=0; i<BPHYS_TOT_DATA; i++)
pm->data[i] = MEM_dupallocN(pm->data[i]);
+
+ pm->index_array = MEM_dupallocN(pm->index_array);
}
}
@@ -3737,6 +3758,8 @@ static void get_PTCacheUndo(PTCacheEdit *edit, PTCacheUndo *undo)
for(i=0; i<BPHYS_TOT_DATA; i++)
pm->data[i] = MEM_dupallocN(pm->data[i]);
+ pm->index_array = MEM_dupallocN(pm->index_array);
+
BKE_ptcache_mem_init_pointers(pm);
LOOP_POINTS {
@@ -4001,12 +4024,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) {
@@ -4116,7 +4147,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 d8ca65fa8c9..ba5d1ee5250 100644
--- a/source/blender/editors/physics/particle_object.c
+++ b/source/blender/editors/physics/particle_object.c
@@ -69,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;
}
@@ -107,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;
}
@@ -163,10 +166,10 @@ static int new_particle_settings_exec(bContext *C, wmOperator *op)
psys_check_boid_data(psys);
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, 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;
}
@@ -190,6 +193,7 @@ void PARTICLE_OT_new(wmOperatorType *ot)
static int new_particle_target_exec(bContext *C, wmOperator *op)
{
+ Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -211,10 +215,10 @@ static int new_particle_target_exec(bContext *C, wmOperator *op)
BLI_addtail(&psys->targets, pt);
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, 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;
}
@@ -235,6 +239,7 @@ void PARTICLE_OT_new_target(wmOperatorType *ot)
static int remove_particle_target_exec(bContext *C, wmOperator *op)
{
+ Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -259,10 +264,10 @@ static int remove_particle_target_exec(bContext *C, wmOperator *op)
if(pt)
pt->flag |= PTARGET_CURRENT;
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, 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;
}
@@ -300,7 +305,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;
}
}
@@ -338,7 +343,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;
}
}
@@ -376,7 +381,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;
}
}
@@ -415,7 +420,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;
}
}
@@ -461,7 +466,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;
}
@@ -498,7 +503,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;
}
}
@@ -590,7 +595,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;
}
@@ -729,7 +734,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 6f5b8924a13..f411f92d395 100644
--- a/source/blender/editors/physics/physics_fluid.c
+++ b/source/blender/editors/physics/physics_fluid.c
@@ -77,7 +77,6 @@
#include "LBM_fluidsim.h"
-#include "BIF_gl.h"
#include "ED_screen.h"
@@ -297,6 +296,8 @@ static void set_vertex_channel(float *channel, float time, struct Scene *scene,
static void free_domain_channels(FluidAnimChannels *channels)
{
+ if (!channels->timeAtFrame)
+ return;
MEM_freeN(channels->timeAtFrame);
channels->timeAtFrame = NULL;
MEM_freeN(channels->DomainGravity);
@@ -561,7 +562,6 @@ static void export_fluid_objects(ListBase *fobjects, Scene *scene, int length)
if(verts) MEM_freeN(verts);
if(tris) MEM_freeN(tris);
- if(fsmesh.channelVertices) MEM_freeN(fsmesh.channelVertices);
}
}
@@ -708,7 +708,7 @@ typedef struct FluidBakeJob {
/* from wmJob */
void *owner;
short *stop, *do_update;
-
+ float *progress;
int current_frame;
elbeemSimulationSettings *settings;
} FluidBakeJob;
@@ -732,19 +732,21 @@ static int fluidbake_breakjob(void *customdata)
}
/* called by fluidbake, wmJob sends notifier */
-static void fluidbake_updatejob(void *customdata, char *str)
+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)
+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 */
@@ -753,14 +755,24 @@ static void fluidbake_startjob(void *customdata, short *stop, short *do_update)
*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) {
FluidBakeJob *fb = (FluidBakeJob *)data;
+ elbeemSimulationSettings *settings = fb->settings;
- //elbeemSimulationSettings *settings = fb->settings;
- //printf("elbeem blender cb s%d, f%d, domainid:%d \n", status,frame, settings->domainId ); // DEBUG
-
- if (status == FLUIDSIM_CBSTATUS_NEWFRAME)
- fluidbake_updatejob(fb, "");
+ 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 (fluidbake_breakjob(fb)) {
return FLUIDSIM_CBRET_ABORT;
@@ -769,6 +781,28 @@ int runSimulationCallback(void *data, int status, int frame) {
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;
+
+ 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 *fsDomain)
{
Scene *scene= CTX_data_scene(C);
@@ -799,9 +833,9 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain)
wmJob *steve;
FluidBakeJob *fb;
- elbeemSimulationSettings fsset;
+ elbeemSimulationSettings *fsset= MEM_callocN(sizeof(elbeemSimulationSettings), "Fluid sim settings");
- steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, 0);
+ 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)) {
@@ -815,14 +849,15 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain)
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;
}
/* 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 */
fluidmd = (FluidsimModifierData *)modifiers_findByType(fsDomain, eModifierType_Fluidsim);
@@ -902,7 +937,7 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain)
for(i=2; i<=allchannelSize; i++) {
timeAtFrame[i] = timeAtFrame[i-1]+channelDomainTime[(i-1)*2+0];
}
- } else {
+ fsset->} else {
for(i=2; i<=allchannelSize; i++) { timeAtFrame[i] = timeAtFrame[i-1]+aniFrameTime; }
}
@@ -916,12 +951,7 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain)
elbeemDebugOut(debugStrBuffer);
BKE_report(reports, RPT_ERROR, "Invalid object matrix.");
- free_domain_channels(channels);
- MEM_freeN(channels);
-
- free_all_fluidobject_channels(fobjects);
- BLI_freelistN(fobjects);
- MEM_freeN(fobjects);
+ fluidbake_free_data(channels, fobjects, fsset, fb);
return 0;
}
@@ -936,86 +966,82 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain)
}
/* ******** export domain to elbeem ******** */
- elbeemResetSettings(&fsset);
- fsset.version = 1;
+ elbeemResetSettings(fsset);
+ fsset->version = 1;
// setup global settings
- copy_v3_v3(fsset.geoStart, domainSettings->bbStart);
- copy_v3_v3(fsset.geoSize, domainSettings->bbSize);
+ 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;
+ fsset->resolutionxyz = (int)domainSettings->resolutionxyz;
+ fsset->previewresxyz = (int)domainSettings->previewresxyz;
- fsset.realsize = get_fluid_size_m(scene, fsDomain, domainSettings);
- fsset.viscosity = get_fluid_viscosity(domainSettings);
- get_fluid_gravity(fsset.gravity, scene, domainSettings);
+ fsset->realsize = get_fluid_size_m(scene, fsDomain, domainSettings);
+ fsset->viscosity = get_fluid_viscosity(domainSettings);
+ get_fluid_gravity(fsset->gravity, scene, domainSettings);
// 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->animStart = domainSettings->animStart;
+ fsset->aniFrameTime = channels->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->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);
// 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;
-
- 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);
+ 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;
+
+ 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 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];
+ fsset->surfaceTrafo[i*4+j] = invDomMat[j][i];
}
} }
/* ******** init solver with settings ******** */
elbeemInit();
- elbeemAddDomain(&fsset);
+ elbeemAddDomain(fsset);
/* ******** export all fluid objects to elbeem ******** */
export_fluid_objects(fobjects, scene, channels->length);
/* custom data for fluid bake job */
- fb->settings = &fsset;
+ 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);
+ WM_jobs_callbacks(steve, fluidbake_startjob, NULL, NULL, fluidbake_endjob);
WM_jobs_start(CTX_wm_manager(C), steve);
/* ******** free stored animation data ******** */
- free_domain_channels(channels);
- MEM_freeN(channels);
-
- free_all_fluidobject_channels(fobjects);
- BLI_freelistN(fobjects);
- MEM_freeN(fobjects);
+ fluidbake_free_data(channels, fobjects, NULL, NULL);
// elbeemFree();
return 1;
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 4bdac8ff3e8..2b7f8e9d5a2 100644
--- a/source/blender/editors/physics/physics_ops.c
+++ b/source/blender/editors/physics/physics_ops.c
@@ -43,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);
@@ -114,7 +114,7 @@ static void keymap_particle(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "PARTICLE_OT_weight_set", KKEY, KM_PRESS, KM_SHIFT, 0);
- ED_object_generic_keymap(keyconf, keymap, 1);
+ ED_object_generic_keymap(keyconf, keymap, 2);
}
/******************************* boids *************************************/
diff --git a/source/blender/editors/physics/physics_pointcache.c b/source/blender/editors/physics/physics_pointcache.c
index 57a123d8f17..35f86a49aa7 100644
--- a/source/blender/editors/physics/physics_pointcache.c
+++ b/source/blender/editors/physics/physics_pointcache.c
@@ -33,15 +33,15 @@
#include "DNA_scene_types.h"
-#include "BKE_anim.h"
#include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BKE_modifier.h"
#include "BKE_particle.h"
+#include "BKE_pointcache.h"
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_utildefines.h"
-#include "BKE_pointcache.h"
-#include "BKE_global.h"
-#include "BKE_modifier.h"
#include "BLI_blenlib.h"
@@ -71,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);
}
@@ -88,11 +88,12 @@ void bake_console_progress_end(void *arg)
static int ptcache_bake_all_exec(bContext *C, wmOperator *op)
{
+ Main *bmain = CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
- wmWindow *win = CTX_wm_window(C);
+ wmWindow *win = G.background ? NULL : CTX_wm_window(C);
PTCacheBaker baker;
-
+ baker.main = bmain;
baker.scene = scene;
baker.pid = NULL;
baker.bake = RNA_boolean_get(op->ptr, "bake");
@@ -115,6 +116,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;
}
@@ -133,6 +135,8 @@ static int ptcache_free_bake_all_exec(bContext *C, wmOperator *op)
}
BLI_freelistN(&pidlist);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_POINTCACHE, base->object);
}
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
@@ -170,9 +174,10 @@ void PTCACHE_OT_free_bake_all(wmOperatorType *ot)
}
static int ptcache_bake_exec(bContext *C, wmOperator *op)
{
+ Main *bmain = CTX_data_main(C);
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;
@@ -186,6 +191,7 @@ static int ptcache_bake_exec(bContext *C, wmOperator *op)
break;
}
+ baker.main = bmain;
baker.scene = scene;
baker.pid = pid;
baker.bake = RNA_boolean_get(op->ptr, "bake");
@@ -211,13 +217,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?")) {
@@ -228,15 +236,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;
}
@@ -285,7 +298,7 @@ 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;
@@ -303,12 +316,13 @@ 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;
@@ -331,6 +345,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..2ecdc14a497
--- /dev/null
+++ b/source/blender/editors/render/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
+ ../../blenfont
+ ../../blenkernel
+ ../../blenlib
+ ../../blenloader
+ ../../gpu
+ ../../imbuf
+ ../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/Makefile b/source/blender/editors/render/Makefile
index 85b70172e0a..510e5372e22 100644
--- a/source/blender/editors/render/Makefile
+++ b/source/blender/editors/render/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c
index 54e29011084..083202e5a03 100644
--- a/source/blender/editors/render/render_internal.c
+++ b/source/blender/editors/render/render_internal.c
@@ -33,11 +33,11 @@
#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"
@@ -45,9 +45,7 @@
#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 "BKE_sequencer.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -87,11 +85,11 @@ void image_buffer_rect_update(Scene *scene, RenderResult *rr, ImBuf *ibuf, volat
/* xmin here is first subrect x coord, xmax defines subrect width */
xmin = renrect->xmin + rr->crop;
- xmax = renrect->xmax - xmin - rr->crop;
+ xmax = renrect->xmax - xmin + rr->crop;
if (xmax<2) return;
ymin= renrect->ymin + rr->crop;
- ymax= renrect->ymax - ymin - rr->crop;
+ ymax= renrect->ymax - ymin + rr->crop;
if(ymax<2)
return;
renrect->ymin= renrect->ymax;
@@ -131,23 +129,25 @@ void image_buffer_rect_update(Scene *scene, RenderResult *rr, ImBuf *ibuf, volat
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<ymax; y1++) {
float *rf= rectf;
float srgb[3];
char *rc= rectc;
+ const float dither = ibuf->dither / 255.0;
/* XXX temp. because crop offset */
if( rectc >= (char *)(ibuf->rect)) {
for(x1= 0; x1<xmax; x1++, rf += 4, rc+=4) {
- srgb[0]= linearrgb_to_srgb(rf[0]);
- srgb[1]= linearrgb_to_srgb(rf[1]);
- srgb[2]= linearrgb_to_srgb(rf[2]);
+ const float d = (BLI_frand()-0.5)*dither;
+ srgb[0]= d + linearrgb_to_srgb(rf[0]);
+ srgb[1]= d + linearrgb_to_srgb(rf[1]);
+ srgb[2]= d + linearrgb_to_srgb(rf[2]);
rc[0]= FTOCHAR(srgb[0]);
rc[1]= FTOCHAR(srgb[1]);
@@ -162,20 +162,28 @@ void image_buffer_rect_update(Scene *scene, RenderResult *rr, ImBuf *ibuf, volat
for(y1= 0; y1<ymax; y1++) {
float *rf= rectf;
char *rc= rectc;
+ float rgb[3];
+ const float dither = ibuf->dither / 255.0;
/* XXX temp. because crop offset */
if( rectc >= (char *)(ibuf->rect)) {
for(x1= 0; x1<xmax; x1++, rf += 4, rc+=4) {
- rc[0]= FTOCHAR(rf[0]);
- rc[1]= FTOCHAR(rf[1]);
- rc[2]= FTOCHAR(rf[2]);
+ const float d = (BLI_frand()-0.5)*dither;
+
+ rgb[0] = d + rf[0];
+ rgb[1] = d + rf[1];
+ rgb[2] = d + rf[2];
+
+ rc[0]= FTOCHAR(rgb[0]);
+ rc[1]= FTOCHAR(rgb[1]);
+ rc[2]= FTOCHAR(rgb[2]);
rc[3]= FTOCHAR(rf[3]);
}
}
rectf += 4*rr->rectx;
rectc += 4*ibuf->x;
}
- }
+ }
}
/* new window uses x,y to set position */
@@ -210,7 +218,7 @@ void screen_set_image_output(bContext *C, int mx, int my)
sa= CTX_wm_area(C);
}
else if(scene->r.displaymode==R_OUTPUT_SCREEN) {
- if (CTX_wm_area(C)->spacetype == SPACE_IMAGE)
+ if (CTX_wm_area(C) && CTX_wm_area(C)->spacetype == SPACE_IMAGE)
area_was_image = 1;
/* this function returns with changed context */
@@ -380,28 +388,43 @@ static ScrArea *find_empty_image_area(bContext *C)
}
#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_GetRender(scene->id.name);
+ Render *re= RE_NewRender(scene->id.name);
Image *ima;
View3D *v3d= CTX_wm_view3d(C);
- int lay= (v3d)? v3d->lay|scene->lay: scene->lay;
+ Main *mainp= CTX_data_main(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);
+ /* cleanup sequencer caches before starting user triggered render.
+ otherwise, invalidated cache entries can make their way into
+ the output rendering. We can't put that into RE_BlenderFrame,
+ since sequence rendering can call that recursively... (peter) */
+ seq_stripelem_cache_cleanup();
+
if(RNA_boolean_get(op->ptr, "animation"))
- RE_BlenderAnim(re, scene, lay, scene->r.sfra, scene->r.efra, scene->r.frame_step, op->reports);
+ RE_BlenderAnim(re, mainp, scene, lay, scene->r.sfra, scene->r.efra, scene->r.frame_step, op->reports);
else
- RE_BlenderFrame(re, scene, NULL, lay, scene->r.cfra);
+ RE_BlenderFrame(re, mainp, scene, NULL, lay, scene->r.cfra);
// no redraw needed, we leave state as we entered it
ED_update_for_newframe(C, 1);
@@ -412,6 +435,7 @@ static int screen_render_exec(bContext *C, wmOperator *op)
}
typedef struct RenderJob {
+ Main *main;
Scene *scene;
Render *re;
wmWindow *win;
@@ -422,6 +446,7 @@ typedef struct RenderJob {
ImageUser iuser;
short *stop;
short *do_update;
+ float *progress;
ReportList *reports;
} RenderJob;
@@ -436,15 +461,17 @@ static void render_freejob(void *rjv)
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;
+ 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 | ");
@@ -458,7 +485,7 @@ static void make_renderinfo_string(RenderStats *rs, Scene *scene, char *str)
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);
+ 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);
@@ -486,11 +513,14 @@ static void image_renderinfo_cb(void *rjv, RenderStats *rs)
rr= RE_AcquireResultRead(rj->re);
- /* malloc OK here, stats_draw is not in tile threads */
- if(rr->text==NULL)
- rr->text= MEM_callocN(IMA_MAX_RENDER_TEXT, "rendertext");
+ 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);
+ }
- make_renderinfo_string(rs, rj->scene, rr->text);
RE_ReleaseResult(rj->re);
/* make jobs timer to send notifier */
@@ -498,6 +528,14 @@ static void image_renderinfo_cb(void *rjv, RenderStats *rs)
}
+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;
@@ -519,21 +557,30 @@ static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrec
BKE_image_release_ibuf(ima, lock);
}
-static void render_startjob(void *rjv, short *stop, short *do_update)
+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);
+ RE_BlenderAnim(rj->re, rj->main, 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);
+ RE_BlenderFrame(rj->re, rj->main, rj->scene, rj->srl, rj->lay, rj->scene->r.cfra);
+}
+
+static void render_endjob(void *rjv)
+{
+ RenderJob *rj= rjv;
-// if(mainp)
-// free_main(mainp);
+ if(rj->main != G.main)
+ free_main(rj->main);
+
+ /* XXX render stability hack */
+ G.rendering = 0;
+ WM_main_add_notifier(NC_WINDOW, NULL);
}
/* called by render, check job 'stop' value or the global */
@@ -552,8 +599,9 @@ static int render_breakjob(void *rjv)
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)))
+ if(0==WM_jobs_test(CTX_wm_manager(C), CTX_data_scene(C))) {
return OPERATOR_FINISHED|OPERATOR_PASS_THROUGH;
+ }
/* running render */
switch (event->type) {
@@ -568,6 +616,7 @@ static int screen_render_modal(bContext *C, wmOperator *op, wmEvent *event)
static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
/* new render clears all callbacks */
+ Main *mainp;
Scene *scene= CTX_data_scene(C);
SceneRenderLayer *srl=NULL;
bScreen *screen= CTX_wm_screen(C);
@@ -584,6 +633,14 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* stop all running jobs, currently previews frustrate Render */
WM_jobs_stop_all(CTX_wm_manager(C));
+ /* get main */
+ if(G.rt == 101) {
+ /* thread-safety experiment, copy main from the undo buffer */
+ mainp= BKE_undo_get_main(&scene);
+ }
+ else
+ mainp= CTX_data_main(C);
+
/* cancel animation playback */
if (screen->animtimer)
ED_screen_animation_play(C, 0, 0);
@@ -594,8 +651,14 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* flush multires changes (for sculpt) */
multires_force_render_update(CTX_data_active_object(C));
+ /* cleanup sequencer caches before starting user triggered render.
+ otherwise, invalidated cache entries can make their way into
+ the output rendering. We can't put that into RE_BlenderFrame,
+ since sequence rendering can call that recursively... (peter) */
+ seq_stripelem_cache_cleanup();
+
/* get editmode results */
- ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO); /* 0 = does not exit editmode */
+ 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
@@ -613,7 +676,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
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);
+ scn = (Scene *)BLI_findstring(&mainp->scene, scene_name, offsetof(ID, name) + 2);
rl = (SceneRenderLayer *)BLI_findstring(&scene->r.layers, rl_name, offsetof(SceneRenderLayer, name));
if (scn && rl) {
@@ -624,20 +687,21 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* job custom data */
rj= MEM_callocN(sizeof(RenderJob), "render job");
+ rj->main= mainp;
rj->scene= scene;
rj->win= CTX_wm_window(C);
rj->srl = srl;
- rj->lay = (v3d)? v3d->lay|scene->lay: scene->lay;
+ 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, WM_JOB_EXCL_RENDER|WM_JOB_PRIORITY);
+ 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);
+ 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");
@@ -650,18 +714,23 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
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;
- // BKE_report in render!
- // RE_error_cb(re, error_cb);
+ 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);
diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c
index ee5363a00f9..7833f93b3b5 100644
--- a/source/blender/editors/render/render_opengl.c
+++ b/source/blender/editors/render/render_opengl.c
@@ -38,20 +38,13 @@
#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"
@@ -59,9 +52,11 @@
#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"
@@ -94,6 +89,17 @@ typedef struct OGLRender {
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;
@@ -106,32 +112,54 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
float winmat[4][4];
int sizex= oglrender->sizex;
int sizey= oglrender->sizey;
+ int view_context = (v3d != NULL);
- /* bind */
- GPU_offscreen_bind(oglrender->ofs);
+ rr= RE_AcquireResultRead(oglrender->re);
+
+ /* note on color management:
+ * looked into how best to deal with color management here and found heres how it should work.
+ *
+ * OpenGL materials etc are color corrected, so a float buffer from the graphics card is
+ * color corrected, without running any conversion functions.
+ *
+ * With color correction disabled blender expects the rr->rectf to be non-color managed so
+ * just do a direct copy from the byte array to the rectf with no conversion too.
+ * notice IMB_float_from_rect has the profile set so no conversion is done.
+ */
+
+ 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);
- /* 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);
+ GPU_offscreen_unbind(oglrender->ofs); /* unbind */
}
- else
- ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, NULL);
+ else {
+ ImBuf *ibuf_view= ED_view3d_draw_offscreen_imbuf_simple(scene, oglrender->sizex, oglrender->sizey, IB_rectfloat, OB_SOLID);
+ 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 */
- /* 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)
@@ -142,14 +170,23 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op)
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))
- return 0;
+
+ 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));
@@ -177,9 +214,11 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op)
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);
+ 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");
@@ -194,7 +233,7 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op)
rr= RE_AcquireResultWrite(oglrender->re);
if(rr->rectf==NULL)
- rr->rectf= MEM_mallocN(sizeof(float)*4*sizex*sizey, "32 bits rects");
+ rr->rectf= MEM_callocN(sizeof(float)*4*sizex*sizey, "screen_opengl_render_init rect");
RE_ReleaseResult(oglrender->re);
return 1;
@@ -202,6 +241,7 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op)
static void screen_opengl_render_end(bContext *C, OGLRender *oglrender)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= oglrender->scene;
if(oglrender->mh) {
@@ -211,7 +251,7 @@ static void screen_opengl_render_end(bContext *C, OGLRender *oglrender)
if(oglrender->timer) { /* exec will not have a timer */
scene->r.cfra= oglrender->cfrao;
- scene_update_for_newframe(scene, scene->lay);
+ scene_update_for_newframe(bmain, scene, screen_opengl_layers(oglrender));
WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), oglrender->timer);
}
@@ -258,32 +298,42 @@ static int screen_opengl_render_anim_initialize(bContext *C, wmOperator *op)
}
static int screen_opengl_render_anim_step(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
OGLRender *oglrender= op->customdata;
Scene *scene= oglrender->scene;
ImBuf *ibuf;
void *lock;
char name[FILE_MAXDIR+FILE_MAXFILE];
- unsigned int lay;
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(CFRA<oglrender->nfra) {
- if(scene->lay & 0xFF000000)
- lay= scene->lay & 0xFF000000;
- else
- lay= scene->lay;
+ unsigned int lay= screen_opengl_layers(oglrender);
- scene_update_for_newframe(scene, lay);
+ if(lay & 0xFF000000)
+ lay &= 0xFF000000;
+
+ scene_update_for_newframe(bmain, scene, lay);
CFRA++;
}
- scene_update_for_newframe(scene, scene->lay);
+ scene_update_for_newframe(bmain, scene, screen_opengl_layers(oglrender));
- 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;
+ 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 */
@@ -354,9 +404,10 @@ static int screen_opengl_render_modal(bContext *C, wmOperator *op, wmEvent *even
return OPERATOR_RUNNING_MODAL;
}
- ret= screen_opengl_render_anim_step(C, op);
-
+ /* 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) {
@@ -445,6 +496,7 @@ void RENDER_OT_opengl(wmOperatorType *ot)
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 */
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index aef652cd116..71bee8c5b08 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -54,6 +54,7 @@
#include "DNA_space_types.h"
#include "DNA_view3d_types.h"
#include "DNA_scene_types.h"
+#include "DNA_brush_types.h"
#include "DNA_screen_types.h"
#include "BKE_context.h"
@@ -63,12 +64,8 @@
#include "BKE_icons.h"
#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_texture.h"
#include "BKE_material.h"
#include "BKE_node.h"
-#include "BKE_world.h"
-#include "BKE_texture.h"
-#include "BKE_utildefines.h"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -100,6 +97,47 @@
static int qtest() {return 0;}
/* XXX */
+ImBuf* get_brush_icon(Brush *brush)
+{
+ static const int flags = IB_rect|IB_multilayer|IB_metadata;
+
+ char path[240];
+ char *folder;
+
+ if (!(brush->icon_imbuf)) {
+ if (brush->flag & BRUSH_CUSTOM_ICON) {
+
+ if (brush->icon_filepath[0]) {
+ // first use the path directly to try and load the file
+
+ BLI_strncpy(path, brush->icon_filepath, sizeof(brush->icon_filepath));
+ BLI_path_abs(path, G.sce);
+
+ brush->icon_imbuf= IMB_loadiffname(path, flags);
+
+ // otherwise lets try to find it in other directories
+ if (!(brush->icon_imbuf)) {
+ folder= BLI_get_folder(BLENDER_DATAFILES, "brushicons");
+
+ path[0]= 0;
+
+ BLI_make_file_string(G.sce, path, folder, brush->icon_filepath);
+
+ if (path[0])
+ brush->icon_imbuf= IMB_loadiffname(path, flags);
+ }
+ }
+ }
+ }
+
+ if (!(brush->icon_imbuf))
+ brush->id.icon_id = 0;
+ else
+ BKE_icon_changed(BKE_icon_getid(&(brush->id)));
+
+ return brush->icon_imbuf;
+}
+
typedef struct ShaderPreview {
/* from wmJob */
void *owner;
@@ -346,7 +384,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<<MA_FLAT;
}
@@ -406,7 +444,7 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
}
}
- if(tex && tex->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) {
@@ -510,8 +548,8 @@ void ED_preview_draw(const bContext *C, void *idp, void *parentp, void *slotp, r
newrect.ymax= rect->ymin;
if(parent) {
- ok = ed_preview_draw_rect(sa, sce, parent, 1, 1, rect, &newrect);
- ok &= ed_preview_draw_rect(sa, sce, id, 1, 0, rect, &newrect);
+ ok = ed_preview_draw_rect(sa, sce, id, 1, 1, rect, &newrect);
+ ok &= ed_preview_draw_rect(sa, sce, parent, 1, 0, rect, &newrect);
}
else
ok = ed_preview_draw_rect(sa, sce, id, 0, 0, rect, &newrect);
@@ -661,7 +699,7 @@ void BIF_view3d_previewrender_clear(ScrArea *sa)
}
/* afterqueue call */
-void BIF_view3d_previewrender(Scene *scene, ScrArea *sa)
+void BIF_view3d_previewrender(Main *bmain, Scene *scene, ScrArea *sa)
{
View3D *v3d= sa->spacedata.first;
RegionView3D *rv3d= NULL; // XXX
@@ -752,7 +790,7 @@ void BIF_view3d_previewrender(Scene *scene, ScrArea *sa)
lay |= v3d->lay;
else lay= v3d->lay;
- RE_Database_FromScene(re, scene, lay, 0); // 0= dont use camera view
+ RE_Database_FromScene(re, bmain, scene, lay, 0); // 0= dont use camera view
rstats= RE_GetStats(re);
if(rstats->convertdone)
@@ -761,7 +799,7 @@ void BIF_view3d_previewrender(Scene *scene, ScrArea *sa)
/* database can have created render-resol data... */
if(rstats->convertdone)
- DAG_scene_flush_update(scene, scene->lay, 0);
+ DAG_scene_flush_update(bmain, scene, scene->lay, 0);
//printf("dbase update\n");
}
@@ -898,6 +936,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;
@@ -931,7 +970,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_PreviewRender(re, sce);
+ RE_PreviewRender(re, G.main, sce);
((Camera *)sce->camera->data)->lens= oldlens;
@@ -960,8 +999,8 @@ static void shader_preview_startjob(void *customdata, short *stop, short *do_upd
sp->do_update= do_update;
if(sp->parent) {
- shader_preview_render(sp, sp->parent, 1, 1);
- shader_preview_render(sp, sp->id, 1, 0);
+ shader_preview_render(sp, sp->id, 1, 1);
+ shader_preview_render(sp, sp->parent, 1, 0);
}
else
shader_preview_render(sp, sp->id, 0, 0);
@@ -1068,6 +1107,19 @@ static void icon_preview_startjob(void *customdata, short *stop, short *do_updat
*do_update= 1;
}
+ else if(idtype == ID_BR) {
+ Brush *br= (Brush*)id;
+
+ br->icon_imbuf= get_brush_icon(br);
+
+ if(!(br->icon_imbuf) || !(br->icon_imbuf->rect))
+ return;
+
+ memset(sp->pr_rect, 0x888888, sp->sizex*sp->sizey*sizeof(unsigned int));
+ icon_copy_rect(br->icon_imbuf, sp->sizex, sp->sizey, sp->pr_rect);
+
+ *do_update= 1;
+ }
else {
/* re-use shader job */
shader_preview_startjob(customdata, stop, do_update);
@@ -1089,7 +1141,7 @@ 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;
@@ -1099,6 +1151,14 @@ static void common_preview_startjob(void *customdata, short *stop, short *do_upd
shader_preview_startjob(customdata, stop, do_update);
}
+static void common_preview_endjob(void *customdata)
+{
+ ShaderPreview *sp= customdata;
+
+ if(sp->id && GS(sp->id->name) == ID_BR)
+ WM_main_add_notifier(NC_BRUSH|NA_EDITED, sp->id);
+}
+
/* exported functions */
void ED_preview_icon_job(const bContext *C, void *owner, ID *id, unsigned int *rect, int sizex, int sizey)
@@ -1106,7 +1166,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 */
@@ -1121,7 +1181,7 @@ 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, common_preview_endjob);
WM_jobs_start(CTX_wm_manager(C), steve);
}
@@ -1131,7 +1191,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 */
@@ -1147,9 +1207,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);
+ 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 870eea74464..24796441fe4 100644
--- a/source/blender/editors/render/render_shading.c
+++ b/source/blender/editors/render/render_shading.c
@@ -52,7 +52,6 @@
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
#include "BKE_world.h"
#include "IMB_imbuf.h"
@@ -196,6 +195,34 @@ 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);
+}
+
+static void scene_changed(Main *bmain, Scene *sce)
+{
+ Object *ob;
+ Material *ma;
+
+ /* glsl */
+ for(ob=bmain->object.first; ob; ob=ob->id.next)
+ if(ob->gpulamp.first)
+ GPU_lamp_free(ob);
+
+ for(ma=bmain->mat.first; ma; ma=ma->id.next)
+ if(ma->gpumaterial.first)
+ GPU_material_free(ma);
+}
+
void ED_render_id_flush_update(Main *bmain, ID *id)
{
if(!id)
@@ -214,6 +241,12 @@ 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;
+ case ID_SCE:
+ scene_changed(bmain, (Scene*)id);
+ break;
default:
break;
}
@@ -294,11 +327,11 @@ static int material_slot_assign_exec(bContext *C, wmOperator *op)
}
}
else if(ELEM(ob->type, OB_CURVE, OB_SURF)) {
- ListBase *editnurb= ((Curve*)ob->data)->editnurb;
Nurb *nu;
+ ListBase *nurbs= ED_curve_editnurbs((Curve*)ob->data);
- if(editnurb) {
- for(nu= editnurb->first; nu; nu= nu->next)
+ if(nurbs) {
+ for(nu= nurbs->first; nu; nu= nu->next)
if(isNurbsel(nu))
nu->mat_nr= nu->charidx= ob->actcol-1;
}
@@ -352,13 +385,13 @@ static int material_slot_de_select(bContext *C, int select)
}
}
else if ELEM(ob->type, OB_CURVE, OB_SURF) {
- ListBase *editnurb= ((Curve*)ob->data)->editnurb;
+ ListBase *nurbs= ED_curve_editnurbs((Curve*)ob->data);
Nurb *nu;
BPoint *bp;
BezTriple *bezt;
int a;
- for(nu= editnurb->first; nu; nu=nu->next) {
+ for(nu= nurbs->first; nu; nu=nu->next) {
if(nu->mat_nr==ob->actcol-1) {
if(nu->bezt) {
a= nu->pntsu;
@@ -780,7 +813,7 @@ void TEXTURE_OT_slot_move(wmOperatorType *ot)
static int save_envmap(wmOperator *op, Scene *scene, EnvMap *env, char *str, int imtype)
{
- ImBuf *ibuf;
+ ImBuf *ibuf=NULL;
int dx;
int retval;
@@ -831,7 +864,7 @@ static int envmap_save_exec(bContext *C, wmOperator *op)
int imtype = scene->r.imtype;
char path[FILE_MAX];
- RNA_string_get(op->ptr, "path", path);
+ RNA_string_get(op->ptr, "filepath", path);
if(scene->r.scemode & R_EXTENSION) {
BKE_add_image_extension(path, imtype);
@@ -855,12 +888,12 @@ static int envmap_save_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, "path"))
+ 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, "path", G.sce);
+ RNA_string_set(op->ptr, "filepath", G.sce);
WM_event_add_fileselect(C, op);
return OPERATOR_RUNNING_MODAL;
@@ -897,9 +930,7 @@ void TEXTURE_OT_envmap_save(wmOperatorType *ot)
/* 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);
-
- RNA_def_boolean(ot->srna, "relative_path", 0, "Relative Path", "Save image with relative path to current .blend file");
+ 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)
@@ -1021,7 +1052,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;
diff --git a/source/blender/editors/screen/CMakeLists.txt b/source/blender/editors/screen/CMakeLists.txt
index 5708ab6684d..6bbd1112d05 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,26 @@
# 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 *****
-
-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
+# ***** END GPL LICENSE BLOCK *****
+
+FILE(GLOB SRC *.c)
+
+SET(INC
+ ../../blenfont
+ ../../blenkernel
+ ../../blenlib
+ ../../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/Makefile b/source/blender/editors/screen/Makefile
index 23c9d130eec..2ab35a32888 100644
--- a/source/blender/editors/screen/Makefile
+++ b/source/blender/editors/screen/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/screen/SConscript b/source/blender/editors/screen/SConscript
index 703a16f753b..6efb2617a18 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'
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 61aa7a63da9..90f9d5683c2 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -40,7 +40,6 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -48,6 +47,7 @@
#include "ED_screen.h"
#include "ED_screen_types.h"
+#include "ED_space_api.h"
#include "ED_types.h"
#include "ED_fileselect.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 */
@@ -121,16 +117,10 @@ void ED_region_do_listen(ARegion *ar, wmNotifier *note)
case NC_WINDOW:
ED_region_tag_redraw(ar);
break;
-#ifndef WM_FAST_DRAW
- case NC_SCREEN:
- if(note->action==NA_EDITED)
- ED_region_tag_redraw(ar);
- /* pass on */
-#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 +171,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 +334,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);
@@ -351,6 +343,8 @@ void ED_region_do_draw(bContext *C, ARegion *ar)
else if(at->draw) {
at->draw(C, ar);
}
+
+ ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_PIXEL);
uiFreeInactiveBlocks(C, &ar->uiblocks);
@@ -378,6 +372,12 @@ void ED_region_tag_redraw(ARegion *ar)
}
}
+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) {
@@ -908,7 +908,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 +956,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 +984,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 +1007,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);
@@ -1228,7 +1225,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)
@@ -1334,14 +1330,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 */
@@ -1418,16 +1409,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) */
@@ -1438,7 +1423,7 @@ void ED_region_header(const bContext *C, ARegion *ar)
/* draw all headers types */
for(ht= ar->type->headertypes.first; ht; ht= ht->next) {
- block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS);
+ block= uiBeginBlock(C, ar, ht->idname, UI_EMBOSS);
layout= uiBlockLayout(block, UI_LAYOUT_HORIZONTAL, UI_LAYOUT_HEADER, xco, yco, HEADERY-6, 1, style);
if(ht->draw) {
diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c
index 14cafc74ea5..fbc83b1de65 100644
--- a/source/blender/editors/screen/screen_context.c
+++ b/source/blender/editors/screen/screen_context.c
@@ -29,13 +29,14 @@
#include "DNA_object_types.h"
#include "DNA_armature_types.h"
+#include "DNA_sequence_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "BKE_context.h"
#include "BKE_utildefines.h"
-#include "BKE_global.h"
#include "BKE_action.h"
+#include "BKE_sequencer.h"
#include "RNA_access.h"
@@ -66,7 +67,9 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
"visible_pose_bones", "selected_pose_bones", "active_bone", "active_pose_bone",
"active_base", "active_object", "object", "edit_object",
"sculpt_object", "vertex_paint_object", "weight_paint_object",
- "texture_paint_object", "particle_edit_object", NULL};
+ "texture_paint_object", "particle_edit_object",
+ "sequences", "selected_sequences", "selected_editable_sequences", /* sequencer */
+ NULL};
CTX_data_dir_set(result, dir);
return 1;
@@ -86,7 +89,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_objects") || CTX_data_equals(member, "selected_bases")) {
@@ -100,7 +103,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")) {
@@ -118,7 +121,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")) {
@@ -159,7 +162,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
}
}
}
-
+ CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
return 1;
}
}
@@ -201,7 +204,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
}
}
}
-
+ CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
return 1;
}
}
@@ -216,7 +219,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;
}
}
@@ -232,7 +235,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;
}
}
@@ -317,6 +320,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 d8531d0b4e9..dd77bfc4fd5 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -25,6 +25,8 @@
*/
#include <string.h>
+#include <math.h>
+
#include "MEM_guardedalloc.h"
@@ -40,7 +42,6 @@
#include "BKE_node.h"
#include "BKE_screen.h"
#include "BKE_scene.h"
-#include "BKE_utildefines.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -49,7 +50,7 @@
#include "WM_types.h"
#include "ED_image.h"
-#include "ED_view3d.h"
+#include "ED_object.h"
#include "ED_screen.h"
#include "ED_screen_types.h"
@@ -1367,6 +1368,8 @@ void ED_screen_set_scene(bContext *C, Scene *scene)
bScreen *sc;
bScreen *curscreen= CTX_wm_screen(C);
+ ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO);
+
for(sc= CTX_data_main(C)->screen.first; sc; sc= sc->id.next) {
if((U.flag & USER_SCENEGLOBAL) || sc==curscreen) {
@@ -1395,7 +1398,7 @@ void ED_screen_set_scene(bContext *C, Scene *scene)
if(sl->spacetype==SPACE_VIEW3D) {
View3D *v3d= (View3D*) sl;
- ED_view3d_scene_layers_copy(v3d, scene);
+ BKE_screen_view3d_sync(v3d, scene);
if (!v3d->camera || !object_in_scene(v3d->camera, scene)) {
v3d->camera= scene_find_camera(sc->scene);
@@ -1421,7 +1424,7 @@ void ED_screen_set_scene(bContext *C, Scene *scene)
}
CTX_data_scene_set(C, scene);
- set_scene_bg(scene);
+ set_scene_bg(CTX_data_main(C), scene);
ED_update_for_newframe(C, 1);
@@ -1492,7 +1495,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) {
@@ -1651,7 +1654,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);
@@ -1666,11 +1669,14 @@ void ED_screen_animation_timer(bContext *C, int redraws, int sync, int enable)
ScreenAnimData *sad= MEM_callocN(sizeof(ScreenAnimData), "ScreenAnimData");
screen->animtimer= WM_event_add_timer(wm, win, TIMER0, (1.0/FPS));
+
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;
}
@@ -1702,13 +1708,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);
@@ -1718,43 +1725,31 @@ void ED_screen_animation_timer_update(bScreen *screen, int redraws)
/* results in fully updated anim system */
void ED_update_for_newframe(const bContext *C, int mute)
{
+ Main *bmain= CTX_data_main(C);
bScreen *screen= CTX_wm_screen(C);
Scene *scene= CTX_data_scene(C);
#ifdef DURIAN_CAMERA_SWITCH
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 */
+ scene_update_for_newframe(bmain, scene, BKE_screen_visible_layers(screen, scene)); /* BKE_scene.h */
//if ( (CFRA>1) && (!mute) && (scene->r.audio.flag & AUDIO_SCRUB))
// audiostream_scrub( CFRA );
@@ -1769,9 +1764,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 5c104521a60..79789b1876e 100644
--- a/source/blender/editors/screen/screen_intern.h
+++ b/source/blender/editors/screen/screen_intern.h
@@ -58,9 +58,6 @@ void ed_screen_context(const bContext *C, const char *member, bContextDataResult
void SCREEN_OT_screenshot(struct wmOperatorType *ot);
void SCREEN_OT_screencast(struct wmOperatorType *ot);
-/* partial updates, much faster then drawing everything, ton is away so allow easy undo'ing - campbell */
-#define WM_FAST_DRAW
-
#endif /* ED_SCREEN_INTERN_H */
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index e5feccefedc..c96306dde14 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -41,20 +41,13 @@
#include "DNA_scene_types.h"
#include "DNA_meta_types.h"
-#include "BKE_blender.h"
-#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_customdata.h"
-#include "BKE_global.h"
-#include "BKE_idprop.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_sound.h"
#include "WM_api.h"
@@ -573,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;
@@ -613,15 +607,14 @@ static int area_swap_modal(bContext *C, wmOperator *op, wmEvent *event)
return area_swap_cancel(C, op);
}
+
+ ED_area_tag_redraw(sad->sa1);
+ ED_area_tag_redraw(sad->sa2);
+
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
-
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
return OPERATOR_FINISHED;
@@ -689,10 +682,8 @@ static int area_dupli_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* copy area to new screen */
area_copy_data((ScrArea *)newsc->areabase.first, sa, 0);
-
-#ifdef WM_FAST_DRAW
+
ED_area_tag_redraw((ScrArea *)newsc->areabase.first);
-#endif
/* screen, areas init */
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
@@ -818,6 +809,7 @@ static void area_move_apply_do(bContext *C, int origval, int delta, int dir, int
wmWindow *win= CTX_wm_window(C);
bScreen *sc= CTX_wm_screen(C);
ScrVert *v1;
+ ScrArea *sa;
delta= CLAMPIS(delta, -smaller, bigger);
@@ -840,15 +832,12 @@ static void area_move_apply_do(bContext *C, int origval, int delta, int dir, int
}
}
}
-#ifdef WM_FAST_DRAW
- {
- ScrArea *sa;
- for(sa= sc->areabase.first; sa; sa= sa->next)
- if(sa->v1->flag || sa->v2->flag || sa->v3->flag || sa->v4->flag)
- ED_area_tag_redraw(sa);
+
+ for(sa= sc->areabase.first; sa; sa= sa->next) {
+ if(sa->v1->flag || sa->v2->flag || sa->v3->flag || sa->v4->flag)
+ ED_area_tag_redraw(sa);
}
-#endif
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL); /* redraw everything */
}
@@ -1111,10 +1100,9 @@ static int area_split_apply(bContext *C, wmOperator *op)
if(dir=='h') sd->origval= sd->nedge->v1->vec.y;
else sd->origval= sd->nedge->v1->vec.x;
-#ifdef WM_FAST_DRAW
ED_area_tag_redraw(sd->sarea);
ED_area_tag_redraw(sd->narea);
-#endif
+
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
return 1;
@@ -1126,11 +1114,9 @@ static int area_split_apply(bContext *C, wmOperator *op)
static void area_split_exit(bContext *C, wmOperator *op)
{
if (op->customdata) {
-#ifdef WM_FAST_DRAW
sAreaSplitData *sd= (sAreaSplitData *)op->customdata;
if(sd->sarea) ED_area_tag_redraw(sd->sarea);
if(sd->narea) ED_area_tag_redraw(sd->narea);
-#endif
MEM_freeN(op->customdata);
op->customdata = NULL;
@@ -1324,6 +1310,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)
@@ -1332,8 +1321,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;
}
@@ -1432,9 +1428,7 @@ static int region_scale_modal(bContext *C, wmOperator *op, wmEvent *event)
else if(rmd->ar->flag & RGN_FLAG_HIDDEN)
ED_region_toggle_hidden(C, rmd->ar);
}
-#ifdef WM_FAST_DRAW
ED_area_tag_redraw(rmd->sa);
-#endif
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
break;
@@ -1445,9 +1439,7 @@ static int region_scale_modal(bContext *C, wmOperator *op, wmEvent *event)
if(ABS(event->x - rmd->origx) < 2 && ABS(event->y - rmd->origy) < 2) {
if(rmd->ar->flag & RGN_FLAG_HIDDEN) {
ED_region_toggle_hidden(C, rmd->ar);
-#ifdef WM_FAST_DRAW
ED_area_tag_redraw(rmd->sa);
-#endif
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
}
}
@@ -1492,6 +1484,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);
@@ -1541,7 +1534,7 @@ static void SCREEN_OT_frame_jump(wmOperatorType *ot)
ot->exec= frame_jump_exec;
ot->poll= ED_operator_screenactive;
- ot->flag= 0;
+ ot->flag= OPTYPE_UNDO;
/* rna */
RNA_def_boolean(ot->srna, "end", 0, "Last Frame", "Jump to the last frame of the frame range.");
@@ -1559,6 +1552,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)
@@ -1577,15 +1571,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 */
@@ -1607,7 +1613,7 @@ static void SCREEN_OT_keyframe_jump(wmOperatorType *ot)
ot->exec= keyframe_jump_exec;
ot->poll= ED_operator_screenactive;
- ot->flag= 0;
+ ot->flag= OPTYPE_UNDO;
/* rna */
RNA_def_boolean(ot->srna, "next", 1, "Next Keyframe", "");
@@ -1742,10 +1748,10 @@ static int area_join_init(bContext *C, wmOperator *op)
int x2, y2;
/* required properties, make negative to get return 0 if not set by caller */
- x1= RNA_int_get(op->ptr, "x1");
- y1= RNA_int_get(op->ptr, "y1");
- x2= RNA_int_get(op->ptr, "x2");
- y2= RNA_int_get(op->ptr, "y2");
+ x1= RNA_int_get(op->ptr, "min_x");
+ y1= RNA_int_get(op->ptr, "min_y");
+ x2= RNA_int_get(op->ptr, "max_x");
+ y2= RNA_int_get(op->ptr, "max_y");
sa1 = screen_areahascursor(CTX_wm_screen(C), x1, y1);
sa2 = screen_areahascursor(CTX_wm_screen(C), x2, y2);
@@ -1826,10 +1832,10 @@ static int area_join_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_PASS_THROUGH;
/* prepare operator state vars */
- RNA_int_set(op->ptr, "x1", sad->x);
- RNA_int_set(op->ptr, "y1", sad->y);
- RNA_int_set(op->ptr, "x2", event->x);
- RNA_int_set(op->ptr, "y2", event->y);
+ RNA_int_set(op->ptr, "min_x", sad->x);
+ RNA_int_set(op->ptr, "min_y", sad->y);
+ RNA_int_set(op->ptr, "max_x", event->x);
+ RNA_int_set(op->ptr, "max_y", event->y);
if(!area_join_init(C, op))
return OPERATOR_PASS_THROUGH;
@@ -1936,10 +1942,9 @@ static int area_join_modal(bContext *C, wmOperator *op, wmEvent *event)
break;
case LEFTMOUSE:
if(event->val==KM_RELEASE) {
-#ifdef WM_FAST_DRAW
ED_area_tag_redraw(jd->sa1);
ED_area_tag_redraw(jd->sa2);
-#endif
+
area_join_apply(C, op);
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
area_join_exit(C, op);
@@ -1972,10 +1977,10 @@ static void SCREEN_OT_area_join(wmOperatorType *ot)
ot->flag= OPTYPE_BLOCKING;
/* rna */
- RNA_def_int(ot->srna, "x1", -100, INT_MIN, INT_MAX, "X 1", "", INT_MIN, INT_MAX);
- RNA_def_int(ot->srna, "y1", -100, INT_MIN, INT_MAX, "Y 1", "", INT_MIN, INT_MAX);
- RNA_def_int(ot->srna, "x2", -100, INT_MIN, INT_MAX, "X 2", "", INT_MIN, INT_MAX);
- RNA_def_int(ot->srna, "y2", -100, INT_MIN, INT_MAX, "Y 2", "", INT_MIN, INT_MAX);
+ RNA_def_int(ot->srna, "min_x", -100, INT_MIN, INT_MAX, "X 1", "", INT_MIN, INT_MAX);
+ RNA_def_int(ot->srna, "min_y", -100, INT_MIN, INT_MAX, "Y 1", "", INT_MIN, INT_MAX);
+ RNA_def_int(ot->srna, "max_x", -100, INT_MIN, INT_MAX, "X 2", "", INT_MIN, INT_MAX);
+ RNA_def_int(ot->srna, "max_y", -100, INT_MIN, INT_MAX, "Y 2", "", INT_MIN, INT_MAX);
}
/* ************** repeat last operator ***************************** */
@@ -2122,9 +2127,7 @@ static int region_quadview_exec(bContext *C, wmOperator *op)
MEM_freeN(ar);
}
}
-#ifdef WM_FAST_DRAW
ED_area_tag_redraw(sa);
-#endif
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
}
else if(ar->next)
@@ -2147,23 +2150,24 @@ 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
ED_area_tag_redraw(sa);
-#endif
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
}
@@ -2205,10 +2209,8 @@ static int region_flip_exec(bContext *C, wmOperator *op)
ar->alignment= RGN_ALIGN_RIGHT;
else if(ar->alignment==RGN_ALIGN_RIGHT)
ar->alignment= RGN_ALIGN_LEFT;
-
-#ifdef WM_FAST_DRAW
- ED_area_tag_redraw(CTX_wm_area(C));
-#endif
+
+ ED_area_tag_redraw(CTX_wm_area(C));
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
return OPERATOR_FINISHED;
@@ -2260,10 +2262,8 @@ static int header_flip_exec(bContext *C, wmOperator *op)
ar->alignment= RGN_ALIGN_RIGHT;
else if(ar->alignment==RGN_ALIGN_RIGHT)
ar->alignment= RGN_ALIGN_LEFT;
-
-#ifdef WM_FAST_DRAW
+
ED_area_tag_redraw(CTX_wm_area(C));
-#endif
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
@@ -2330,6 +2330,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) {
@@ -2391,28 +2403,28 @@ 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;
+ 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) && finite(time = sound_sync_scene(scene)))
- scene->r.cfra = floor(time * FPS);
+ scene->r.cfra = time * FPS + 0.5;
else
{
- if(sync) {
+ if (sync) {
int step = floor(wt->duration * FPS);
/* skip frames */
- if(sad->flag & ANIMPLAY_FLAG_REVERSE)
+ if (sad->flag & ANIMPLAY_FLAG_REVERSE)
scene->r.cfra -= step;
else
scene->r.cfra += step;
@@ -2420,7 +2432,7 @@ static int screen_animation_step(bContext *C, wmOperator *op, wmEvent *event)
}
else {
/* one frame +/- */
- if(sad->flag & ANIMPLAY_FLAG_REVERSE)
+ if (sad->flag & ANIMPLAY_FLAG_REVERSE)
scene->r.cfra--;
else
scene->r.cfra++;
@@ -2461,21 +2473,24 @@ static int screen_animation_step(bContext *C, wmOperator *op, wmEvent *event)
}
}
- if(sad->flag & ANIMPLAY_FLAG_JUMPED)
+ if (sad->flag & ANIMPLAY_FLAG_JUMPED)
sound_seek_scene(C);
/* since we follow drawflags, we can't send notifier but tag regions ourselves */
ED_update_for_newframe(C, 1);
- for(sa= screen->areabase.first; sa; sa= sa->next) {
+ for (sa= screen->areabase.first; sa; sa= sa->next) {
ARegion *ar;
- for(ar= sa->regionbase.first; ar; ar= ar->next) {
- if(ar==sad->ar)
+ for (ar= sa->regionbase.first; ar; ar= ar->next) {
+ if (ar==sad->ar)
ED_region_tag_redraw(ar);
else
- if(match_region_with_redraws(sa->spacetype, ar->regiontype, sad->redraws))
+ 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
@@ -2515,42 +2530,43 @@ static void SCREEN_OT_animation_step(wmOperatorType *ot)
int ED_screen_animation_play(bContext *C, int sync, int mode)
{
bScreen *screen= CTX_wm_screen(C);
- struct Scene* scene = CTX_data_scene(C);
+ Scene *scene = CTX_data_scene(C);
- if(screen->animtimer) {
+ 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);
-
- if(mode == 1) // XXX only play audio forwards!?
+ int refresh= SPACE_TIME;
+
+ if (mode == 1) // XXX only play audio forwards!?
sound_play_scene(scene);
-
+
/* timeline gets special treatment since it has it's own menu for determining redraws */
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;
-
+
/* XXX - would like a better way to deal with this situation - Campbell */
- if((!sa) || (sa->spacetype == SPACE_SEQ)) {
+ if ((!sa) || (sa->spacetype == SPACE_SEQ)) {
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;
ScreenAnimData *sad= wt->customdata;
-
+
sad->ar= CTX_wm_region(C);
}
}
@@ -2559,14 +2575,14 @@ 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;
-
- if(RNA_property_is_set(op->ptr, "sync"))
+
+ if (RNA_property_is_set(op->ptr, "sync"))
sync= (RNA_boolean_get(op->ptr, "sync"));
-
+
return ED_screen_animation_play(C, sync, mode);
}
@@ -2578,7 +2594,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;
@@ -2586,7 +2602,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);
@@ -2615,7 +2631,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;
}
@@ -2815,9 +2831,9 @@ static int scene_new_exec(bContext *C, wmOperator *op)
/* these can't be handled in blenkernel curently, so do them here */
if(type == SCE_COPY_LINK_DATA)
- ED_object_single_users(newscene, 0);
+ ED_object_single_users(bmain, newscene, 0);
else if(type == SCE_COPY_FULL)
- ED_object_single_users(newscene, 1);
+ ED_object_single_users(bmain, newscene, 1);
WM_event_add_notifier(C, NC_SCENE|ND_SCENEBROWSE, newscene);
@@ -2953,13 +2969,14 @@ static void keymap_modal_set(wmKeyConfig *keyconf)
void ED_keymap_screen(wmKeyConfig *keyconf)
{
wmKeyMap *keymap;
+ //wmKeyMapItem *kmi;
/* Screen Editing ------------------------------------------------ */
keymap= WM_keymap_find(keyconf, "Screen Editing", 0, 0);
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);
@@ -2996,7 +3013,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);
@@ -3038,7 +3055,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);
@@ -3047,10 +3065,22 @@ void ED_keymap_screen(wmKeyConfig *keyconf)
/* play (forward and backwards) */
WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", AKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", KKEY, KM_PRESS, 0, LKEY);
RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", AKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0)->ptr, "reverse", 1);
WM_keymap_add_item(keymap, "SCREEN_OT_animation_cancel", ESCKEY, KM_PRESS, 0, 0);
+ /* Alternative keys for animation and sequencer playing */
+#if 0 // XXX: disabled for restoring later... bad implementation
+ keymap= WM_keymap_find(keyconf, "Frames", 0, 0);
+ kmi = WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", RIGHTARROWKEY, KM_PRESS, KM_ALT, 0);
+ RNA_boolean_set(kmi->ptr, "cycle_speed", 1);
+
+ kmi = WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", LEFTARROWKEY, KM_PRESS, KM_ALT, 0);
+ RNA_boolean_set(kmi->ptr, "reverse", 1);
+ RNA_boolean_set(kmi->ptr, "cycle_speed", 1);
+
+ WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", DOWNARROWKEY, KM_PRESS, KM_ALT, 0);
+#endif
+
keymap_modal_set(keyconf);
}
diff --git a/source/blender/editors/screen/screendump.c b/source/blender/editors/screen/screendump.c
index b6cb6978dc1..56efa0a5a83 100644
--- a/source/blender/editors/screen/screendump.c
+++ b/source/blender/editors/screen/screendump.c
@@ -44,7 +44,6 @@
#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
#include "BKE_writeavi.h"
#include "BIF_gl.h"
@@ -75,7 +74,7 @@ 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_path_abs(path, G.sce);
@@ -88,8 +87,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);
@@ -149,10 +146,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);
@@ -173,7 +170,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", "");
}
@@ -217,7 +214,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;
@@ -298,7 +295,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 */
@@ -323,7 +320,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);
@@ -343,7 +340,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/Makefile b/source/blender/editors/sculpt_paint/Makefile
index 012a39b8d25..f9f39fea7eb 100644
--- a/source/blender/editors/sculpt_paint/Makefile
+++ b/source/blender/editors/sculpt_paint/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/sculpt_paint/SConscript b/source/blender/editors/sculpt_paint/SConscript
index 472ba361059..3d9a5144c93 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'] == 'linuxcross':
+ if env['WITH_BF_OPENMP']:
+ incs += ' ' + env['BF_OPENMP_INC']
+
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
- incs += ' ' + env['BF_PTHREADS_INC']
+ incs += ' ' + env['BF_PTHREADS_INC']
-env.BlenderLib ( 'bf_editors_sculpt_paint', sources, Split(incs), [], libtype=['core'], priority=[40] )
+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 df2e4032257..418bac69974 100644
--- a/source/blender/editors/sculpt_paint/paint_image.c
+++ b/source/blender/editors/sculpt_paint/paint_image.c
@@ -54,18 +54,16 @@
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_brush_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"
#include "BKE_main.h"
#include "BKE_mesh.h"
-#include "BKE_node.h"
#include "BKE_paint.h"
-#include "BKE_utildefines.h"
#include "BKE_DerivedMesh.h"
#include "BKE_report.h"
#include "BKE_depsgraph.h"
@@ -641,8 +639,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;
@@ -1053,15 +1051,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) {
@@ -1197,7 +1195,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 */
@@ -1334,7 +1332,7 @@ float project_paint_uvpixel_mask(
// This only works when the opacity dosnt change while painting, stylus pressure messes with this
// so dont use it.
- // if (ps->is_airbrush==0) mask *= ps->brush->alpha;
+ // if (ps->is_airbrush==0) mask *= brush_alpha(ps->brush);
return mask;
}
@@ -1444,7 +1442,7 @@ static ProjPixel *project_paint_uvpixel_init(
sub_v2_v2v2(co, projPixel->projCoSS, (float *)ps->cloneOffset);
/* no need to initialize the bucket, we're only checking buckets faces and for this
- * the faces are alredy initialized in project_paint_delayed_face_init(...) */
+ * the faces are already initialized in project_paint_delayed_face_init(...) */
if (ibuf->rect_float) {
if (!project_paint_PickColor(ps, co, ((ProjPixelClone *)projPixel)->clonepx.f, NULL, 1)) {
((ProjPixelClone *)projPixel)->clonepx.f[3] = 0; /* zero alpha - ignore */
@@ -1642,10 +1640,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);
}
@@ -1664,9 +1662,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);
}
@@ -1694,7 +1692,7 @@ static float Vec2Lenf_nosqrt_other(const float *v1, const float v2_1, const floa
static int project_bucket_isect_circle(const int bucket_x, const int bucket_y, const float cent[2], const float radius_squared, rctf *bucket_bounds)
{
- /* Would normally to a simple intersection test, however we know the bounds of these 2 alredy intersect
+ /* Would normally to a simple intersection test, however we know the bounds of these 2 already intersect
* so we only need to test if the center is inside the vertical or horizontal bounds on either axis,
* this is even less work then an intersection test
*
@@ -2513,11 +2511,11 @@ 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
}
@@ -2571,11 +2569,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);
@@ -2808,6 +2807,8 @@ static void project_paint_begin(ProjPaintState *ps)
MVert *mv;
MemArena *arena; /* at the moment this is just ps->arena_mt[0], but use this to show were not multithreading */
+
+ const int diameter= 2*brush_size(ps->brush);
/* ---- end defines ---- */
@@ -2973,7 +2974,7 @@ static void project_paint_begin(ProjPaintState *ps)
VECCOPY(ps->viewPos, 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]);
+ add_v3_v3(ps->viewPos, ps->ob->imat[3]);
}
/* calculate vert screen coords
@@ -3029,27 +3030,27 @@ static void project_paint_begin(ProjPaintState *ps)
if(ps->source==PROJ_SRC_VIEW) {
#ifdef PROJ_DEBUG_WINCLIP
- CLAMP(ps->screenMin[0], -ps->brush->size, ps->winx + ps->brush->size);
- CLAMP(ps->screenMax[0], -ps->brush->size, ps->winx + ps->brush->size);
+ CLAMP(ps->screenMin[0], (float)(-diameter), (float)(ps->winx + diameter));
+ CLAMP(ps->screenMax[0], (float)(-diameter), (float)(ps->winx + diameter));
- CLAMP(ps->screenMin[1], -ps->brush->size, ps->winy + ps->brush->size);
- CLAMP(ps->screenMax[1], -ps->brush->size, ps->winy + ps->brush->size);
+ CLAMP(ps->screenMin[1], (float)(-diameter), (float)(ps->winy + diameter));
+ CLAMP(ps->screenMax[1], (float)(-diameter), (float)(ps->winy + diameter));
#endif
}
else { /* reprojection, use bounds */
ps->screenMin[0]= 0;
- ps->screenMax[0]= ps->winx;
+ ps->screenMax[0]= (float)(ps->winx);
ps->screenMin[1]= 0;
- ps->screenMax[1]= ps->winy;
+ 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];
- ps->buckets_x = (int)(ps->screen_width / (((float)ps->brush->size) / PROJ_BUCKET_BRUSH_DIV));
- ps->buckets_y = (int)(ps->screen_height / (((float)ps->brush->size) / PROJ_BUCKET_BRUSH_DIV));
+ ps->buckets_x = (int)(ps->screen_width / (((float)diameter) / PROJ_BUCKET_BRUSH_DIV));
+ ps->buckets_y = (int)(ps->screen_height / (((float)diameter) / PROJ_BUCKET_BRUSH_DIV));
/* printf("\tscreenspace bucket division x:%d y:%d\n", ps->buckets_x, ps->buckets_y); */
@@ -3083,7 +3084,7 @@ static void project_paint_begin(ProjPaintState *ps)
ps->thread_tot = BLI_system_thread_count();
}
for (a=0; a<ps->thread_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];
@@ -3447,16 +3448,16 @@ static int project_bucket_iter_init(ProjPaintState *ps, const float mval_f[2])
{
if(ps->source==PROJ_SRC_VIEW) {
float min_brush[2], max_brush[2];
- float size_half = ((float)ps->brush->size) * 0.5f;
+ const float radius = (float)brush_size(ps->brush);
/* 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 :/
+ // if (radius < 1.0f) radius = 1.0f; // this doesn't work yet :/
- min_brush[0] = mval_f[0] - size_half;
- min_brush[1] = mval_f[1] - size_half;
+ min_brush[0] = mval_f[0] - radius;
+ min_brush[1] = mval_f[1] - radius;
- max_brush[0] = mval_f[0] + size_half;
- max_brush[1] = mval_f[1] + size_half;
+ max_brush[0] = mval_f[0] + radius;
+ max_brush[1] = mval_f[1] + radius;
/* offset to make this a valid bucket index */
project_paint_bucket_bounds(ps, min_brush, max_brush, ps->bucketMin, ps->bucketMax);
@@ -3485,6 +3486,8 @@ static int project_bucket_iter_init(ProjPaintState *ps, const float mval_f[2])
static int project_bucket_iter_next(ProjPaintState *ps, int *bucket_index, rctf *bucket_bounds, const float mval[2])
{
+ const int diameter= 2*brush_size(ps->brush);
+
if (ps->thread_tot > 1)
BLI_lock_thread(LOCK_CUSTOM1);
@@ -3497,7 +3500,7 @@ static int project_bucket_iter_next(ProjPaintState *ps, int *bucket_index, rctf
project_bucket_bounds(ps, ps->context_bucket_x, ps->context_bucket_y, bucket_bounds);
if ( (ps->source != PROJ_SRC_VIEW) ||
- project_bucket_isect_circle(ps->context_bucket_x, ps->context_bucket_y, mval, ps->brush->size * ps->brush->size, bucket_bounds)
+ project_bucket_isect_circle(ps->context_bucket_x, ps->context_bucket_y, mval, (float)(diameter*diameter), bucket_bounds)
) {
*bucket_index = ps->context_bucket_x + (ps->context_bucket_y * ps->buckets_x);
ps->context_bucket_x++;
@@ -3545,23 +3548,25 @@ 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_rgb(unsigned char *cp, const unsigned char *cp1, const unsigned char *cp2, const int fac)
+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)
@@ -3682,7 +3687,6 @@ static void *do_projectpaint_thread(void *ph_v)
float rgba[4], alpha, dist_nosqrt, dist;
- float brush_size_sqared;
float falloff;
int bucket_index;
int is_floatbuf = 0;
@@ -3694,24 +3698,22 @@ static void *do_projectpaint_thread(void *ph_v)
float co[2];
float mask = 1.0f; /* airbrush wont use mask */
unsigned short mask_short;
- float size_half = ((float)ps->brush->size) * 0.5f;
+ const float radius= (float)brush_size(ps->brush);
+ const float radius_squared= radius*radius; /* avoid a square root with every dist comparison */
+
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;
MemArena *smearArena = NULL; /* mem arena for this brush projection only */
-
if (tool==PAINT_TOOL_SMEAR) {
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;
-
/* printf("brush bounds %d %d %d %d\n", bucketMin[0], bucketMin[1], bucketMax[0], bucketMax[1]); */
while (project_bucket_iter_next(ps, &bucket_index, &bucket_bounds, pos)) {
@@ -3732,7 +3734,8 @@ static void *do_projectpaint_thread(void *ph_v)
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_rgb(projPixel->pixel.ch_pt, projPixel->origColor.ch, projPixel->newColor.ch, (mask*projPixel->newColor.ch[3]));
+ blend_color_mix_accum(projPixel->pixel.ch_pt, projPixel->origColor.ch, projPixel->newColor.ch, (int)(mask*projPixel->newColor.ch[3]));
+
}
}
}
@@ -3746,9 +3749,11 @@ static void *do_projectpaint_thread(void *ph_v)
/*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 (dist < radius) {*/ /* correct but uses a sqrtf */
+ if (dist_nosqrt <= radius_squared) {
+ dist=sqrtf(dist_nosqrt);
+
+ falloff = brush_curve_strength_clamp(ps->brush, dist, radius);
if (falloff > 0.0f) {
if (ps->is_texbrush) {
@@ -3760,7 +3765,7 @@ static void *do_projectpaint_thread(void *ph_v)
if (ps->is_airbrush) {
/* for an aurbrush there is no real mask, so just multiply the alpha by it */
- alpha *= falloff * ps->brush->alpha;
+ alpha *= falloff * brush_alpha(ps->brush);
mask = ((float)projPixel->mask)/65535.0f;
}
else {
@@ -3768,7 +3773,7 @@ static void *do_projectpaint_thread(void *ph_v)
falloff = 1.0f - falloff;
falloff = 1.0f - (falloff * falloff);
- mask_short = projPixel->mask * (ps->brush->alpha * falloff);
+ mask_short = (unsigned short)(projPixel->mask * (brush_alpha(ps->brush) * falloff));
if (mask_short > projPixel->mask_max) {
mask = ((float)mask_short)/65535.0f;
projPixel->mask_max = mask_short;
@@ -3929,8 +3934,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);
@@ -4054,7 +4059,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;
}
@@ -4515,7 +4521,7 @@ typedef struct PaintOperation {
int first;
int prevmouse[2];
float prev_pressure; /* need this since we dont get tablet events for pressure change */
- int brush_size_orig;
+ int orig_brush_size;
double starttime;
ViewContext vc;
@@ -4608,8 +4614,8 @@ static void project_state_init(bContext *C, Object *ob, ProjPaintState *ps)
ps->normal_angle_inner= ps->normal_angle= settings->imapaint.normal_angle;
}
- ps->normal_angle_inner *= M_PI_2 / 90;
- ps->normal_angle *= M_PI_2 / 90;
+ 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)
@@ -4648,7 +4654,7 @@ static int texture_paint_init(bContext *C, wmOperator *op)
if(pop->mode == PAINT_MODE_3D && (pop->s.tool == PAINT_TOOL_CLONE))
pop->s.tool = PAINT_TOOL_DRAW;
pop->s.blend = brush->blend;
- pop->brush_size_orig= brush->size;
+ pop->orig_brush_size= brush_size(brush);
if(pop->mode != PAINT_MODE_2D) {
pop->s.ob = OBACT;
@@ -4680,8 +4686,8 @@ static int texture_paint_init(bContext *C, wmOperator *op)
return 0;
/* Dont allow brush size below 2 */
- if (brush->size <= 1)
- brush->size = 2;
+ if (brush_size(brush) < 2)
+ brush_set_size(brush, 2);
/* allocate and initialize spacial data structures */
project_paint_begin(&pop->ps);
@@ -4691,7 +4697,7 @@ static int texture_paint_init(bContext *C, wmOperator *op)
}
settings->imapaint.flag |= IMAGEPAINT_DRAWING;
- undo_paint_push_begin(UNDO_PAINT_IMAGE, "Image Paint",
+ undo_paint_push_begin(UNDO_PAINT_IMAGE, op->type->name,
image_undo_restore, image_undo_free);
/* create painter */
@@ -4708,8 +4714,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");
@@ -4751,7 +4757,7 @@ static void paint_exit(bContext *C, wmOperator *op)
brush_painter_free(pop->painter);
if(pop->mode == PAINT_MODE_3D_PROJECT) {
- pop->ps.brush->size = pop->brush_size_orig;
+ brush_set_size(pop->ps.brush, pop->orig_brush_size);
project_paint_end(&pop->ps);
}
@@ -4822,15 +4828,22 @@ static void paint_apply_event(bContext *C, wmOperator *op, wmEvent *event)
/* special exception here for too high pressure values on first touch in
windows for some tablets, then we just skip first touch .. */
- if ((pop->s.brush->flag & (BRUSH_ALPHA_PRESSURE|BRUSH_SIZE_PRESSURE|BRUSH_SPACING_PRESSURE)) && tablet && (pressure >= 0.99f))
+ if (tablet && (pressure >= 0.99f) && ((pop->s.brush->flag & BRUSH_SPACING_PRESSURE) || brush_use_alpha_pressure(pop->s.brush) || brush_use_size_pressure(pop->s.brush)))
+ return;
+
+ /* This can be removed once fixed properly in
+ brush_painter_paint(BrushPainter *painter, BrushFunc func, float *pos, double time, float pressure, void *user)
+ at zero pressure we should do nothing 1/2^12 is .0002 which is the sensitivity of the most sensitive pen tablet available*/
+ if (tablet && (pressure < .0002f) && ((pop->s.brush->flag & BRUSH_SPACING_PRESSURE) || brush_use_alpha_pressure(pop->s.brush) || brush_use_size_pressure(pop->s.brush)))
return;
+
}
/* 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);
@@ -4872,6 +4885,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:
@@ -4933,9 +4947,14 @@ static int get_imapaint_zoom(bContext *C, float *zoomx, float *zoomy)
static void brush_drawcursor(bContext *C, int x, int y, void *customdata)
{
Brush *brush= image_paint_brush(C);
+ Paint *paint= paint_get_active(CTX_data_scene(C));
- if(brush) {
+ if(paint && brush) {
float zoomx, zoomy;
+
+ if(!(paint->flags & PAINT_SHOW_BRUSH))
+ return;
+
glPushMatrix();
glTranslatef((float)x, (float)y, 0.0f);
@@ -4943,13 +4962,13 @@ static void brush_drawcursor(bContext *C, int x, int y, void *customdata)
if(get_imapaint_zoom(C, &zoomx, &zoomy))
glScalef(zoomx, zoomy, 1.0f);
- glColor4ub(255, 255, 255, 128);
+ glColor4f(brush->add_col[0], brush->add_col[1], brush->add_col[2], 0.5f);
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), (float)brush_size(brush), 40);
glDisable(GL_BLEND);
glDisable( GL_LINE_SMOOTH );
-
+
glPopMatrix();
}
}
@@ -4973,7 +4992,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), zoom);
return WM_radial_control_invoke(C, op, event);
}
@@ -4993,7 +5012,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, 1.0f / zoom);
WM_radial_control_string(op, str, 256);
WM_event_add_notifier(C, NC_BRUSH|NA_EDITED, brush);
@@ -5300,14 +5319,14 @@ static int texture_paint_radial_control_invoke(bContext *C, wmOperator *op, wmEv
{
ToolSettings *ts = CTX_data_scene(C)->toolsettings;
toggle_paint_cursor(C, !ts->imapaint.paintcursor);
- brush_radial_control_invoke(op, paint_brush(&ts->imapaint.paint), 0.5);
+ brush_radial_control_invoke(op, paint_brush(&ts->imapaint.paint), 1);
return WM_radial_control_invoke(C, op, event);
}
static int texture_paint_radial_control_exec(bContext *C, wmOperator *op)
{
Brush *brush = paint_brush(&CTX_data_scene(C)->toolsettings->imapaint.paint);
- int ret = brush_radial_control_exec(op, brush, 2);
+ int ret = brush_radial_control_exec(op, brush, 1);
char str[256];
WM_radial_control_string(op, str, 256);
@@ -5343,7 +5362,7 @@ void PAINT_OT_texture_paint_radial_control(wmOperatorType *ot)
ot->poll= texture_paint_poll;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
}
@@ -5412,21 +5431,21 @@ static int texture_paint_camera_project_exec(bContext *C, wmOperator *op)
/* override */
ps.is_texbrush= 0;
ps.is_airbrush= 1;
- orig_brush_size= ps.brush->size;
- ps.brush->size= 32; /* cover the whole image */
+ orig_brush_size= brush_size(ps.brush);
+ brush_set_size(ps.brush, 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",
+ undo_paint_push_begin(UNDO_PAINT_IMAGE, op->type->name,
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;
+ brush_set_size(ps.brush, orig_brush_size);
return OPERATOR_CANCELLED;
}
else {
@@ -5450,7 +5469,7 @@ static int texture_paint_camera_project_exec(bContext *C, wmOperator *op)
project_paint_end(&ps);
scene->toolsettings->imapaint.flag &= ~IMAGEPAINT_DRAWING;
- ps.brush->size= orig_brush_size;
+ brush_set_size(ps.brush, orig_brush_size);
return OPERATOR_FINISHED;
}
@@ -5488,14 +5507,14 @@ static int texture_paint_image_from_view_exec(bContext *C, wmOperator *op)
int h= settings->imapaint.screen_grab_size[1];
int maxsize;
- RNA_string_get(op->ptr, "filename", filename);
+ 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);
+ ibuf= ED_view3d_draw_offscreen_imbuf(CTX_data_scene(C), CTX_wm_view3d(C), CTX_wm_region(C), w, h, IB_rect);
image= BKE_add_image_imbuf(ibuf);
if(image) {
@@ -5541,5 +5560,5 @@ void PAINT_OT_image_from_view(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER;
- RNA_def_string_file_name(ot->srna, "filename", "", FILE_MAX, "File Name", "Name of the file");
+ 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 b25eec70311..3ed314095ef 100644
--- a/source/blender/editors/sculpt_paint/paint_intern.h
+++ b/source/blender/editors/sculpt_paint/paint_intern.h
@@ -110,11 +110,18 @@ 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);
-void undo_paint_push_begin(int type, char *name, UndoRestoreCb restore, UndoFreeCb free);
+void undo_paint_push_begin(int type, const char *name, UndoRestoreCb restore, UndoFreeCb free);
struct ListBase *undo_paint_push_get_list(int type);
void undo_paint_push_count_alloc(int type, int size);
void undo_paint_push_end(int type);
diff --git a/source/blender/editors/sculpt_paint/paint_ops.c b/source/blender/editors/sculpt_paint/paint_ops.c
index abd56babd8d..b5cadb9c484 100644
--- a/source/blender/editors/sculpt_paint/paint_ops.c
+++ b/source/blender/editors/sculpt_paint/paint_ops.c
@@ -39,28 +39,25 @@
#include "sculpt_intern.h"
#include <string.h>
+//#include <stdio.h>
/* 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));
+ struct 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 */
@@ -73,8 +70,63 @@ void BRUSH_OT_add(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+
+static int brush_scale_size_exec(bContext *C, wmOperator *op)
+{
+ Paint *paint= paint_get_active(CTX_data_scene(C));
+ struct Brush *brush= paint_brush(paint);
+ // Object *ob= CTX_data_active_object(C);
+ float scalar= RNA_float_get(op->ptr, "scalar");
+
+ if (brush) {
+ // pixel radius
+ {
+ const int old_size= brush_size(brush);
+ int size= (int)(scalar*old_size);
+
+ if (old_size == size) {
+ if (scalar > 1) {
+ size++;
+ }
+ else if (scalar < 1) {
+ size--;
+ }
+ }
+ CLAMP(size, 1, 2000); // XXX magic number
+
+ brush_set_size(brush, size);
+ }
+
+ // unprojected radius
+ {
+ float unprojected_radius= scalar*brush_unprojected_radius(brush);
+
+ if (unprojected_radius < 0.001) // XXX magic number
+ unprojected_radius= 0.001f;
+
+ brush_set_unprojected_radius(brush, unprojected_radius);
+ }
+ }
+
+ 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_REGISTER|OPTYPE_UNDO;
- RNA_def_enum(ot->srna, "type", brush_type_items, OB_MODE_VERTEX_PAINT, "Type", "Which paint mode to create the brush for.");
+ 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)
@@ -102,13 +154,44 @@ void PAINT_OT_vertex_color_set(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+static int brush_reset_exec(bContext *C, wmOperator *op)
+{
+ Paint *paint = paint_get_active(CTX_data_scene(C));
+ struct Brush *brush = paint_brush(paint);
+ Object *ob = CTX_data_active_object(C);
+
+ if(!ob) return OPERATOR_CANCELLED;
+
+ if(ob->mode & OB_MODE_SCULPT)
+ brush_reset_sculpt(brush);
+ /* TODO: other modes */
+
+ return OPERATOR_FINISHED;
+}
+
+void BRUSH_OT_reset(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Reset Brush";
+ ot->description= "Return brush to defaults based on current tool";
+ ot->idname= "BRUSH_OT_reset";
+
+ /* api callbacks */
+ ot->exec= brush_reset_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
/**************************** registration **********************************/
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);
+ WM_operatortype_append(BRUSH_OT_reset);
/* image */
WM_operatortype_append(PAINT_OT_texture_paint_toggle);
@@ -121,7 +204,6 @@ void ED_operatortypes_paint(void)
WM_operatortype_append(PAINT_OT_project_image);
WM_operatortype_append(PAINT_OT_image_from_view);
-
/* weight */
WM_operatortype_append(PAINT_OT_weight_paint_toggle);
WM_operatortype_append(PAINT_OT_weight_paint_radial_control);
@@ -141,54 +223,83 @@ 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);
+ kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", ONEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "data_path", path);
+ RNA_int_set(kmi->ptr, "value", 10);
+ kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", TWOKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "data_path", path);
+ RNA_int_set(kmi->ptr, "value", 11);
+ kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", THREEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "data_path", path);
+ RNA_int_set(kmi->ptr, "value", 12);
+ kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", FOURKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "data_path", path);
+ RNA_int_set(kmi->ptr, "value", 13);
+ kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", FIVEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "data_path", path);
+ RNA_int_set(kmi->ptr, "value", 14);
+ kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", SIXKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "data_path", path);
+ RNA_int_set(kmi->ptr, "value", 15);
+ kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", SEVENKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "data_path", path);
+ RNA_int_set(kmi->ptr, "value", 16);
+ kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", EIGHTKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "data_path", path);
+ RNA_int_set(kmi->ptr, "value", 17);
+ kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", NINEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "data_path", path);
+ RNA_int_set(kmi->ptr, "value", 18);
+ kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", ZEROKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "data_path", path);
+ RNA_int_set(kmi->ptr, "value", 19);
}
static void ed_keymap_paint_brush_size(wmKeyMap *keymap, const char *path)
{
wmKeyMapItem *kmi;
-
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_scale_int", LEFTBRACKETKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "path", path);
- RNA_float_set(kmi->ptr, "value", 0.9);
-
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_scale_int", RIGHTBRACKETKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "path", path);
- RNA_float_set(kmi->ptr, "value", 10.0/9.0); // 1.1111....
-}
+
+ 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)
{
@@ -200,12 +311,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);
@@ -221,44 +335,56 @@ 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, "value", "Draw");
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", DKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
+ RNA_string_set(kmi->ptr, "value", "SculptDraw");
- 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");
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", SKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
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, "value", "Pinch");
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", PKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
+ RNA_string_set(kmi->ptr, "value", "Pinch/Magnify");
- 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");
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", GKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
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");
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", LKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
RNA_string_set(kmi->ptr, "value", "Layer");
+
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", CKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
+ RNA_string_set(kmi->ptr, "value", "Crease");
+
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", CKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
+ RNA_string_set(kmi->ptr, "value", "Clay");
- 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, "value", "Flatten");
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", IKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
+ RNA_string_set(kmi->ptr, "value", "Inflate/Deflate");
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", TKEY, KM_PRESS, KM_SHIFT, 0); // was just T in 2.4x
+ RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
+ RNA_string_set(kmi->ptr, "value", "Flatten/Contrast");
/* Vertex Paint mode */
keymap= WM_keymap_find(keyconf, "Vertex Paint", 0, 0);
@@ -276,7 +402,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);
@@ -294,7 +420,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);
@@ -314,7 +440,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 c25b5685844..6d58731d79c 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 *****
*
@@ -30,11 +30,13 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_brush_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"
@@ -49,6 +51,8 @@
#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 <float.h>
#include <math.h>
@@ -65,7 +69,7 @@ typedef struct PaintStroke {
float last_mouse_position[2];
- /* Set whether any stroke step has yet occured
+ /* Set whether any stroke step has yet occurred
e.g. in sculpt mode, stroke doesn't start until cursor
passes over the mesh */
int stroke_started;
@@ -96,54 +100,751 @@ 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] =
+{
+ 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,
+};
+
+static unsigned grid_texture1[64] =
{
- Paint *paint = paint_get_active(CTX_data_scene(C));
- Brush *brush = paint_brush(paint);
+ 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,
+};
+
+static unsigned grid_texture2[16] =
+{
+ O,O,O,O,
+ O,G,G,O,
+ O,G,G,O,
+ O,O,O,O,
+};
- if(!(paint->flags & PAINT_SHOW_BRUSH))
- return;
+static unsigned grid_texture3[4] =
+{
+ Q,Q,
+ Q,Q,
+};
- glColor4ubv(paint_get_active(CTX_data_scene(C))->paint_cursor_col);
- glEnable(GL_LINE_SMOOTH);
- glEnable(GL_BLEND);
+static unsigned grid_texture4[1] =
+{
+ Q,
+};
- 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);
+#undef W
+#undef G
+#undef E
+#undef C
+#undef O
+#undef Q
- glDisable(GL_BLEND);
- glDisable(GL_LINE_SMOOTH);
+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 && brush_size(brush) <= snap->brush_size) || (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 = 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 = brush_size(br);
+ int r = 1;
+
+ for (s >>= 1; s > 0; s >>= 1)
+ r++;
+
+ size = (1<<r);
+
+ if (size < 256)
+ size = 256;
+
+ if (size < old_size)
+ size = old_size;
+ }
+ else
+ size = 512;
+
+ if (old_size != size) {
+ if (overlay_texture) {
+ glDeleteTextures(1, &overlay_texture);
+ overlay_texture = 0;
+ }
+
+ init = 0;
+
+ old_size = size;
+ }
+
+ buffer = MEM_mallocN(sizeof(GLubyte)*size*size, "load_tex");
+
+ #pragma omp parallel for schedule(static) if (sd->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 radius = 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 / radius;
+ y *= vc->ar->winy / radius;
+ }
+ 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] = 255 - (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, brush_unprojected_radius(stroke->brush), location, &stroke->mats);
+
+ if (*pixel_radius == 0)
+ *pixel_radius = 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 = 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;
+
+ const float root_alpha = brush_alpha(brush);
+ float visual_strength = root_alpha*root_alpha;
+
+ 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(!brush_use_locked_size(brush) && !(paint->flags & PAINT_SHOW_BRUSH))
+ return;
+
+ hit = sculpt_get_brush_geometry(C, x, y, &pixel_radius, location, modelview, projection, viewport);
+
+ if (brush_use_locked_size(brush))
+ brush_set_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_use_size_pressure(brush)) {
+ 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 {
+ const int radius= brush_size(brush);
+
+ glTexCoord2f(0, 0);
+ glVertex2f((float)x-radius, (float)y-radius);
+
+ glTexCoord2f(1, 0);
+ glVertex2f((float)x+radius, (float)y-radius);
+
+ glTexCoord2f(1, 1);
+ glVertex2f((float)x+radius, (float)y+radius);
+
+ glTexCoord2f(0, 1);
+ glVertex2f((float)x-radius, (float)y+radius);
+ }
+ }
+ 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_use_alpha_pressure(brush))
+ 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, brush_size(brush));
+ }
+
+ if (sd->draw_pressure && brush_use_size_pressure(brush))
+ unprojected_radius *= sd->pressure_value;
+
+ if (!brush_use_locked_size(brush))
+ brush_set_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, 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;
+
+ glColor4f(brush->add_col[0], brush->add_col[1], brush->add_col[2], 0.5f);
+ 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(brush), 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[3];
+
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];
@@ -154,10 +855,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;
@@ -176,7 +881,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
@@ -187,23 +894,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 = brush_use_size_pressure(stroke->brush) ? wmtab->Pressure : 1;
+ }
+
+ scale = (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);
}
}
@@ -275,21 +993,34 @@ 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
+ 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_undo.c b/source/blender/editors/sculpt_paint/paint_undo.c
index 5da988f1ae1..c2f82b8e2e0 100644
--- a/source/blender/editors/sculpt_paint/paint_undo.c
+++ b/source/blender/editors/sculpt_paint/paint_undo.c
@@ -76,7 +76,7 @@ static void undo_elem_free(UndoStack *stack, UndoElem *uel)
}
}
-static void undo_stack_push_begin(UndoStack *stack, char *name, UndoRestoreCb restore, UndoFreeCb free)
+static void undo_stack_push_begin(UndoStack *stack, const char *name, UndoRestoreCb restore, UndoFreeCb free)
{
UndoElem *uel;
int nr;
@@ -145,27 +145,35 @@ static void undo_stack_push_end(UndoStack *stack)
}
}
-static void undo_stack_step(bContext *C, UndoStack *stack, int step)
+static int undo_stack_step(bContext *C, UndoStack *stack, int step, const char *name)
{
UndoElem *undo;
if(step==1) {
if(stack->current==NULL);
else {
- if(G.f & G_DEBUG) printf("undo %s\n", stack->current->name);
- undo_restore(C, stack, stack->current);
- stack->current= stack->current->prev;
+ if(!name || strcmp(stack->current->name, name) == 0) {
+ if(G.f & G_DEBUG) printf("undo %s\n", stack->current->name);
+ undo_restore(C, stack, stack->current);
+ stack->current= stack->current->prev;
+ return 1;
+ }
}
}
else if(step==-1) {
if((stack->current!=NULL && stack->current->next==NULL) || stack->elems.first==NULL);
else {
- undo= (stack->current && stack->current->next)? stack->current->next: stack->elems.first;
- undo_restore(C, stack, undo);
- stack->current= undo;
- if(G.f & G_DEBUG) printf("redo %s\n", undo->name);
+ if(!name || strcmp(stack->current->name, name) == 0) {
+ undo= (stack->current && stack->current->next)? stack->current->next: stack->elems.first;
+ undo_restore(C, stack, undo);
+ stack->current= undo;
+ if(G.f & G_DEBUG) printf("redo %s\n", undo->name);
+ return 1;
+ }
}
}
+
+ return 0;
}
static void undo_stack_free(UndoStack *stack)
@@ -181,7 +189,7 @@ static void undo_stack_free(UndoStack *stack)
/* Exported Functions */
-void undo_paint_push_begin(int type, char *name, UndoRestoreCb restore, UndoFreeCb free)
+void undo_paint_push_begin(int type, const char *name, UndoRestoreCb restore, UndoFreeCb free)
{
if(type == UNDO_PAINT_IMAGE)
undo_stack_push_begin(&ImageUndoStack, name, restore, free);
@@ -219,12 +227,14 @@ void undo_paint_push_end(int type)
undo_stack_push_end(&MeshUndoStack);
}
-void ED_undo_paint_step(bContext *C, int type, int step)
+int ED_undo_paint_step(bContext *C, int type, int step, const char *name)
{
if(type == UNDO_PAINT_IMAGE)
- undo_stack_step(C, &ImageUndoStack, step);
+ return undo_stack_step(C, &ImageUndoStack, step, name);
else if(type == UNDO_PAINT_MESH)
- undo_stack_step(C, &MeshUndoStack, step);
+ return undo_stack_step(C, &MeshUndoStack, step, name);
+
+ return 0;
}
void ED_undo_paint_free(void)
diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c
index 85fbd5954e8..0098b8ca12c 100644
--- a/source/blender/editors/sculpt_paint/paint_utils.c
+++ b/source/blender/editors/sculpt_paint/paint_utils.c
@@ -7,6 +7,7 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_brush_types.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -14,13 +15,10 @@
#include "BLI_math.h"
#include "BKE_brush.h"
-#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_DerivedMesh.h"
-#include "BKE_global.h"
#include "BKE_paint.h"
-#include "BKE_utildefines.h"
#include "BIF_gl.h"
@@ -216,6 +214,9 @@ 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_LINE, "LINE", 0, "Line", ""},
+ {CURVE_PRESET_ROUND, "ROUND", 0, "Round", ""},
+ {CURVE_PRESET_ROOT, "ROOT", 0, "Root", ""},
{0, NULL, 0, NULL, NULL}};
ot->name= "Preset";
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index 7bfb7716c9c..399ba535e57 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -38,42 +38,38 @@
#include "MEM_guardedalloc.h"
-#include "IMB_imbuf.h"
-#include "IMB_imbuf_types.h"
-
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_ghash.h"
+#include "IMB_imbuf.h"
+#include "IMB_imbuf_types.h"
+
#include "DNA_armature_types.h"
#include "DNA_mesh_types.h"
#include "DNA_particle_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_brush_types.h"
+#include "DNA_object_types.h"
+#include "DNA_meshdata_types.h"
#include "RNA_access.h"
#include "RNA_define.h"
-#include "BKE_armature.h"
+#include "BKE_DerivedMesh.h"
#include "BKE_action.h"
#include "BKE_brush.h"
-#include "BKE_DerivedMesh.h"
-#include "BKE_cloth.h"
#include "BKE_context.h"
-#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
#include "BKE_deform.h"
-#include "BKE_displist.h"
-#include "BKE_global.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
#include "BKE_paint.h"
-#include "BKE_utildefines.h"
#include "WM_api.h"
#include "WM_types.h"
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "ED_armature.h"
#include "ED_mesh.h"
@@ -99,7 +95,7 @@ int vertex_paint_mode_poll(bContext *C)
{
Object *ob = CTX_data_active_object(C);
- return ob && ob->mode == OB_MODE_VERTEX_PAINT;
+ return ob && ob->mode == OB_MODE_VERTEX_PAINT && ((Mesh *)ob->data)->totface;
}
int vertex_paint_poll(bContext *C)
@@ -111,8 +107,8 @@ int vertex_paint_poll(bContext *C)
ARegion *ar= CTX_wm_region(C);
if(ar->regiontype==RGN_TYPE_WINDOW)
return 1;
+ }
}
- }
return 0;
}
@@ -120,7 +116,7 @@ int weight_paint_mode_poll(bContext *C)
{
Object *ob = CTX_data_active_object(C);
- return ob && ob->mode == OB_MODE_WEIGHT_PAINT;
+ return ob && ob->mode == OB_MODE_WEIGHT_PAINT && ((Mesh *)ob->data)->totface;
}
int weight_paint_poll(bContext *C)
@@ -386,9 +382,8 @@ void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
int actdef= 0;
char name[32];
- BLI_strncpy(name, defgroup->name, 32);
- bone_flip_name(name, 0); /* 0 = don't strip off number extensions */
-
+ flip_side_name(name, defgroup->name, FALSE);
+
for (curdef = ob->defbase.first; curdef; curdef=curdef->next, actdef++)
if (!strcmp(curdef->name, name))
break;
@@ -663,7 +658,7 @@ static void vpaint_blend(VPaint *vp, unsigned int *col, unsigned int *colorig, u
unsigned int testcol=0, a;
char *cp, *ct, *co;
- alpha= (int)(255.0*brush->alpha);
+ alpha= (int)(255.0*brush_alpha(brush));
if(brush->vertexpaint_tool==VP_MIX || brush->vertexpaint_tool==VP_BLUR) testcol= mcol_blend( *colorig, paintcol, alpha);
else if(brush->vertexpaint_tool==VP_ADD) testcol= mcol_add( *colorig, paintcol, alpha);
@@ -733,23 +728,24 @@ static float calc_vp_alpha_dl(VPaint *vp, ViewContext *vc, float vpimat[][3], fl
float fac, fac_2, size, dx, dy;
float alpha;
short vertco[2];
-
+ const int radius= brush_size(brush);
+
project_short_noclip(vc->ar, vert_nor, vertco);
dx= mval[0]-vertco[0];
dy= mval[1]-vertco[1];
- if (brush->flag & BRUSH_SIZE_PRESSURE)
- size = pressure * brush->size;
+ if (brush_use_size_pressure(brush))
+ size = pressure * radius;
else
- size = brush->size;
+ size = radius;
fac_2= dx*dx + dy*dy;
if(fac_2 > size*size) return 0.f;
fac = sqrtf(fac_2);
- alpha= brush->alpha * brush_curve_strength_clamp(brush, fac, size);
+ alpha= brush_alpha(brush) * brush_curve_strength_clamp(brush, fac, size);
- if (brush->flag & BRUSH_ALPHA_PRESSURE)
+ if (brush_use_alpha_pressure(brush))
alpha *= pressure;
if(vp->flag & VP_NORMALS) {
@@ -813,7 +809,7 @@ static void wpaint_blend(VPaint *wp, MDeformWeight *dw, MDeformWeight *uw, float
if((wp->flag & VP_SPRAY)==0) {
float testw=0.0f;
- alpha= brush->alpha;
+ alpha= brush_alpha(brush);
if(tool==VP_MIX || tool==VP_BLUR)
testw = paintval*alpha + uw->weight*(1.0-alpha);
else if(tool==VP_ADD)
@@ -864,6 +860,7 @@ void sample_wpaint(Scene *scene, ARegion *ar, View3D *v3d, int mode)
Mesh *me= get_mesh(ob);
int index;
short mval[2] = {0, 0}, sco[2];
+ int vgroup= ob->actdef-1;
if (!me) return;
@@ -938,7 +935,6 @@ void sample_wpaint(Scene *scene, ARegion *ar, View3D *v3d, int mode)
}
else {
DerivedMesh *dm;
- MDeformWeight *dw;
float w1, w2, w3, w4, co[3], fac;
dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
@@ -968,21 +964,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);
}
}
}
@@ -1123,8 +1115,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)
@@ -1154,10 +1144,16 @@ static int vpaint_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *ev
{
Paint *p = paint_get_active(CTX_data_scene(C));
Brush *brush = paint_brush(p);
+ float col[4];
WM_paint_cursor_end(CTX_wm_manager(C), p->paint_cursor);
p->paint_cursor = NULL;
brush_radial_control_invoke(op, brush, 1);
+
+ copy_v3_v3(col, brush->add_col);
+ col[3]= 0.5f;
+ RNA_float_set_array(op->ptr, "color", col);
+
return WM_radial_control_invoke(C, op, event);
}
@@ -1183,10 +1179,16 @@ static int wpaint_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *ev
{
Paint *p = paint_get_active(CTX_data_scene(C));
Brush *brush = paint_brush(p);
+ float col[4];
WM_paint_cursor_end(CTX_wm_manager(C), p->paint_cursor);
p->paint_cursor = NULL;
brush_radial_control_invoke(op, brush, 1);
+
+ copy_v3_v3(col, brush->add_col);
+ col[3]= 0.5f;
+ RNA_float_set_array(op->ptr, "color", col);
+
return WM_radial_control_invoke(C, op, event);
}
@@ -1262,7 +1264,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*/
@@ -1395,10 +1397,9 @@ static int wpaint_stroke_test_start(bContext *C, wmOperator *op, wmEvent *event)
bDeformGroup *curdef;
int actdef= 0;
char name[32];
-
- BLI_strncpy(name, defgroup->name, 32);
- bone_flip_name(name, 0); /* 0 = don't strip off number extensions */
-
+
+ flip_side_name(name, defgroup->name, FALSE);
+
for (curdef = ob->defbase.first; curdef; curdef=curdef->next, actdef++)
if (!strcmp(curdef->name, name))
break;
@@ -1450,7 +1451,7 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
/* load projection matrix */
mul_m4_m4m4(mat, ob->obmat, vc->rv3d->persmat);
- flip = RNA_boolean_get(itemptr, "flip");
+ flip = RNA_boolean_get(itemptr, "pen_flip");
pressure = RNA_float_get(itemptr, "pressure");
RNA_float_get_array(itemptr, "mouse", mval);
mval[0]-= vc->ar->winrct.xmin;
@@ -1460,7 +1461,7 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
/* which faces are involved */
if(wp->flag & VP_AREA) {
- totindex= sample_backbuf_area(vc, indexar, me->totface, mval[0], mval[1], brush->size);
+ totindex= sample_backbuf_area(vc, indexar, me->totface, mval[0], mval[1], brush_size(brush));
}
else {
indexar[0]= view3d_sample_backbuf(vc, mval[0], mval[1]);
@@ -1746,7 +1747,6 @@ void PAINT_OT_vertex_paint_toggle(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
}
@@ -1866,7 +1866,7 @@ static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
float pressure, mval[2];
RNA_float_get_array(itemptr, "mouse", mval);
- flip = RNA_boolean_get(itemptr, "flip");
+ flip = RNA_boolean_get(itemptr, "pen_flip");
pressure = RNA_float_get(itemptr, "pressure");
view3d_operator_needs_opengl(C);
@@ -1880,7 +1880,7 @@ static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
/* which faces are involved */
if(vp->flag & VP_AREA) {
- totindex= sample_backbuf_area(vc, indexar, me->totface, mval[0], mval[1], brush->size);
+ totindex= sample_backbuf_area(vc, indexar, me->totface, mval[0], mval[1], brush_size(brush));
}
else {
indexar[0]= view3d_sample_backbuf(vc, mval[0], mval[1]);
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 509a1bcc61e..10af35a1b4b 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,32 +38,25 @@
#include "BLI_ghash.h"
#include "BLI_pbvh.h"
#include "BLI_threads.h"
+#include "BLI_editVert.h"
+#include "BLI_rand.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_brush_types.h"
#include "BKE_brush.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_context.h"
-#include "BKE_customdata.h"
-#include "BKE_DerivedMesh.h"
#include "BKE_depsgraph.h"
-#include "BKE_global.h"
-#include "BKE_image.h"
#include "BKE_key.h"
#include "BKE_library.h"
-#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_multires.h"
#include "BKE_paint.h"
#include "BKE_report.h"
-#include "BKE_texture.h"
-#include "BKE_utildefines.h"
-#include "BKE_colortools.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -71,7 +64,6 @@
#include "WM_api.h"
#include "WM_types.h"
#include "ED_screen.h"
-#include "ED_sculpt.h"
#include "ED_view3d.h"
#include "paint_intern.h"
#include "sculpt_intern.h"
@@ -81,15 +73,84 @@
#include "RE_render_ext.h"
+#include "RE_shader_ext.h"
-#include "gpu_buffers.h"
+#include "GPU_buffers.h"
#include <math.h>
#include <stdlib.h>
#include <string.h>
-/* Number of vertices to average in order to determine the flatten distance */
-#define FLATTEN_SAMPLE_SIZE 10
+#ifdef _OPENMP
+#include <omp.h>
+#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)
+{
+ Mesh *me= (Mesh*)ob->data;
+ ModifierData *md, *nmd;
+
+ if(!CustomData_get_layer(&me->fdata, CD_MDISPS)) {
+ /* multires can't work without displacement layer */
+ return NULL;
+ }
+
+ 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 =====
*
@@ -116,10 +177,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;
@@ -136,15 +200,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 =====
@@ -219,10 +298,12 @@ void sculpt_get_redraw_planes(float planes[4][4], ARegion *ar,
RegionView3D *rv3d, Object *ob)
{
PBVH *pbvh= ob->sculpt->pbvh;
- BoundBox *bb = MEM_callocN(sizeof(BoundBox), "sculpt boundbox");
+ BoundBox bb;
bglMats mats;
rcti rect;
+ memset(&bb, 0, sizeof(BoundBox));
+
view3d_get_transformation(ar, rv3d, ob, &mats);
sculpt_get_redraw_rect(ar, rv3d,ob, &rect);
@@ -241,353 +322,354 @@ void sculpt_get_redraw_planes(float planes[4][4], ARegion *ar,
rect.ymax -= 2;
#endif
- view3d_calculate_clipping(bb, planes, &mats, &rect);
+ view3d_calculate_clipping(&bb, planes, &mats, &rect);
mul_m4_fl(planes, -1.0f);
- MEM_freeN(bb);
-
/* clear redraw flag from nodes */
if(pbvh)
BLI_pbvh_update(pbvh, PBVH_UpdateRedraw, NULL);
}
-/************************** 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 */
+/************************ Brush Testing *******************/
- /* layer brush */
- float *layer_disp;
-} SculptUndoNode;
+typedef struct SculptBrushTest {
+ float radius_squared;
+ float location[3];
+ float dist;
+} SculptBrushTest;
-static void update_cb(PBVHNode *node, void *data)
+static void sculpt_brush_test_init(SculptSession *ss, SculptBrushTest *test)
{
- BLI_pbvh_node_mark_update(node);
+ test->radius_squared= ss->cache->radius_squared;
+ copy_v3_v3(test->location, ss->cache->location);
}
-/* Checks whether full update mode (slower) needs to be used to work with modifiers */
-static int sculpt_modifiers_active(Scene *scene, Object *ob)
+static int sculpt_brush_test(SculptBrushTest *test, float co[3])
{
- 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;
+ float distsq = len_squared_v3v3(co, test->location);
+
+ if(distsq <= test->radius_squared) {
+ test->dist = sqrt(distsq);
+ return 1;
+ }
+ else {
+ return 0;
}
-
- return 0;
}
-static void sculpt_undo_restore(bContext *C, ListBase *lb)
+static int sculpt_brush_test_sq(SculptBrushTest *test, float co[3])
{
- 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;
+ float distsq = len_squared_v3v3(co, test->location);
- if(unode->maxvert) {
- /* regular mesh restore */
- if(ss->totvert != unode->maxvert)
- continue;
+ if(distsq <= test->radius_squared) {
+ test->dist = distsq;
+ return 1;
+ }
+ else {
+ return 0;
+ }
+}
- index= unode->index;
- mvert= ss->mvert;
+static int sculpt_brush_test_fast(SculptBrushTest *test, float co[3])
+{
+ return len_squared_v3v3(co, test->location) <= test->radius_squared;
+}
- for(i=0; i<unode->totvert; 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;
+static int sculpt_brush_test_cube(SculptBrushTest *test, float co[3], float local[4][4])
+{
+ static const float side = 0.70710678118654752440084436210485; // sqrt(.5);
- if(dm->getNumGrids(dm) != unode->maxgrid)
- continue;
- if(dm->getGridSize(dm) != unode->gridsize)
- continue;
+ float local_co[3];
- grids= dm->getGridData(dm);
- gridsize= dm->getGridSize(dm);
+ mul_v3_m4v3(local_co, local, co);
- co = unode->co;
- for(j=0; j<unode->totgrid; j++) {
- grid= grids[unode->grids[j]];
+ local_co[0] = fabs(local_co[0]);
+ local_co[1] = fabs(local_co[1]);
+ local_co[2] = fabs(local_co[2]);
- for(i=0; i<gridsize*gridsize; i++, co++)
- swap_v3_v3(grid[i].co, co[0]);
- }
- }
+ 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;
- update= 1;
+ return 1;
+ }
+ else {
+ return 0;
}
+}
- if(update) {
- if(ss->kb) sculpt_mesh_to_key(ss->ob, ss->kb);
- if(ss->refkb) sculpt_key_to_mesh(ss->refkb, ob);
+static float frontface(Brush *brush, float sculpt_normal[3], short no[3], float fno[3])
+{
+ if (brush->flag & BRUSH_FRONTFACE) {
+ float dot;
- /* 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->pbvh, NULL, NULL, update_cb, NULL);
- BLI_pbvh_update(ss->pbvh, PBVH_UpdateBB|PBVH_UpdateOriginalBB|PBVH_UpdateRedraw, NULL);
+ if (no) {
+ float tmp[3];
- if((mmd=sculpt_multires_active(ob)))
- multires_mark_as_modified(ob);
+ normal_short_to_float_v3(tmp, no);
+ dot= dot_v3v3(tmp, sculpt_normal);
+ }
+ else {
+ dot= dot_v3v3(fno, sculpt_normal);
+ }
- if(sculpt_modifiers_active(scene, ob))
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ return dot > 0 ? dot : 0;
+ }
+ else {
+ return 1;
}
}
-static void sculpt_undo_free(ListBase *lb)
+#if 0
+
+static int sculpt_brush_test_cyl(SculptBrushTest *test, float co[3], float location[3], float an[3])
{
- SculptUndoNode *unode;
+ if (sculpt_brush_test_fast(test, co)) {
+ float t1[3], t2[3], t3[3], dist;
- 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);
- }
-}
+ sub_v3_v3v3(t1, location, co);
+ sub_v3_v3v3(t2, x2, location);
-static SculptUndoNode *sculpt_undo_get_node(SculptSession *ss, PBVHNode *node)
-{
- ListBase *lb= undo_paint_push_get_list(UNDO_PAINT_MESH);
- SculptUndoNode *unode;
+ cross_v3_v3v3(t3, an, t1);
- if(!lb)
- return NULL;
+ dist = len_v3(t3)/len_v3(t2);
- for(unode=lb->first; unode; unode=unode->next)
- if(unode->node == node)
- return unode;
+ test->dist = dist;
- return NULL;
+ return 1;
+ }
+
+ return 0;
}
-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;
+#endif
- /* list is manipulated by multiple threads, so we lock */
- BLI_lock_thread(LOCK_CUSTOM1);
+/* ===== Sculpting =====
+ *
+ */
+
- if((unode= sculpt_undo_get_node(ss, node))) {
- BLI_unlock_thread(LOCK_CUSTOM1);
- return unode;
- }
+static float overlapped_curve(Brush* br, float x)
+{
+ int i;
+ const int n = 100 / br->spacing;
+ const float h = br->spacing / 50.0f;
+ const float x0 = x-1;
- unode= MEM_callocN(sizeof(SculptUndoNode), "SculptUndoNode");
- strcpy(unode->idname, ob->id.name);
- unode->node= node;
+ float sum;
- BLI_pbvh_node_num_verts(ss->pbvh, node, &totvert, &allvert);
- BLI_pbvh_node_get_grids(ss->pbvh, node, &grids, &totgrid,
- &maxgrid, &gridsize, NULL, NULL);
+ sum = 0;
+ for (i= 0; i < n; i++) {
+ float xx;
- 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);
+ xx = fabs(x0 + i*h);
- if(maxgrid) {
- /* multires */
- unode->maxgrid= maxgrid;
- unode->totgrid= totgrid;
- unode->gridsize= gridsize;
- unode->grids= MEM_mapallocN(sizeof(int)*totgrid, "SculptUndoNode.grids");
+ if (xx < 1.0f)
+ sum += brush_curve_strength(br, xx, 1);
}
- 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;
+ return sum;
+}
- 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;
+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;
}
- if(unode->grids)
- memcpy(unode->grids, grids, sizeof(int)*totgrid);
-
- return unode;
+ return max;
}
-static void sculpt_undo_push_begin(SculptSession *ss, char *name)
+/* Uses symm to selectively flip any axis of a coordinate. */
+static void flip_coord(float out[3], float in[3], const char symm)
{
- undo_paint_push_begin(UNDO_PAINT_MESH, name,
- sculpt_undo_restore, sculpt_undo_free);
+ if(symm & SCULPT_SYMM_X)
+ out[0]= -in[0];
+ else
+ out[0]= in[0];
+ if(symm & SCULPT_SYMM_Y)
+ out[1]= -in[1];
+ else
+ out[1]= in[1];
+ if(symm & SCULPT_SYMM_Z)
+ out[2]= -in[2];
+ else
+ out[2]= in[2];
}
-static void sculpt_undo_push_end(SculptSession *ss)
+float calc_overlap(StrokeCache *cache, const char symm, const char axis, const float angle)
{
- 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;
- }
+ float mirror[3];
+ float distsq;
+ float mat[4][4];
+
+ //flip_coord(mirror, cache->traced_location, symm);
+ flip_coord(mirror, cache->true_location, symm);
- if(unode->layer_disp) {
- MEM_freeN(unode->layer_disp);
- unode->layer_disp= NULL;
- }
- }
+ unit_m4(mat);
+ rotate_m4(mat, axis, angle);
- undo_paint_push_end(UNDO_PAINT_MESH);
-}
+ mul_m4_v3(mat, mirror);
-void ED_sculpt_force_update(bContext *C)
-{
- Object *ob= CTX_data_active_object(C);
+ //distsq = len_squared_v3v3(mirror, cache->traced_location);
+ distsq = len_squared_v3v3(mirror, cache->true_location);
- if(ob && (ob->mode & OB_MODE_SCULPT))
- multires_force_update(ob);
+ if (distsq <= 4*(cache->radius_squared))
+ return (2*(cache->radius) - sqrt(distsq)) / (2*(cache->radius));
+ else
+ return 0;
}
-/************************ Brush Testing *******************/
-
-typedef struct SculptBrushTest {
- float radius_squared;
- float location[3];
+static float calc_radial_symmetry_feather(Sculpt *sd, StrokeCache *cache, const char symm, const char axis)
+{
+ int i;
+ float overlap;
- float dist;
-} SculptBrushTest;
+ 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);
+ }
-static void sculpt_brush_test_init(SculptSession *ss, SculptBrushTest *test)
-{
- test->radius_squared= ss->cache->radius*ss->cache->radius;
- copy_v3_v3(test->location, ss->cache->location);
+ return overlap;
}
-static int sculpt_brush_test(SculptBrushTest *test, float co[3])
+static float calc_symmetry_feather(Sculpt *sd, StrokeCache* cache)
{
- float distsq, delta[3];
+ if (sd->flags & SCULPT_SYMMETRY_FEATHER) {
+ float overlap;
+ int symm = cache->symmetry;
+ int i;
- sub_v3_v3v3(delta, co, test->location);
- distsq = INPR(delta, delta);
+ overlap = 0;
+ for (i = 0; i <= symm; i++) {
+ if(i == 0 || (symm & i && (symm != 5 || i != 3) && (symm != 6 || (i != 3 && i != 5)))) {
- if(distsq < test->radius_squared) {
- test->dist = sqrt(distsq);
+ 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 0;
}
-/* ===== 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 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 = brush->alpha * brush->alpha;
- float dir= brush->flag & BRUSH_DIR_IN ? -1 : 1;
- float pressure= 1;
- float flip= cache->flip ? -1:1;
+ /* Primary strength input; square it to make lower values more sensitive */
+ const float root_alpha = brush_alpha(brush);
+ float alpha = root_alpha*root_alpha;
+ float dir = brush->flag & BRUSH_DIR_IN ? -1 : 1;
+ float pressure = brush_use_alpha_pressure(brush) ? 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;
- 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;
+ 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;
}
}
-/* Uses symm to selectively flip any axis of a coordinate. */
-static void flip_coord(float out[3], float in[3], const char symm)
+float get_tex_pixel(Brush* br, float u, float v)
{
- if(symm & SCULPT_SYMM_X)
- out[0]= -in[0];
- else
- out[0]= in[0];
- if(symm & SCULPT_SYMM_Y)
- out[1]= -in[1];
- else
- out[1]= in[1];
- if(symm & SCULPT_SYMM_Z)
- out[2]= -in[2];
- else
- out[2]= in[2];
+ 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)
{
@@ -598,7 +680,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;
@@ -625,76 +707,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];
-
- /* 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);
-
- /* 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);
- }
- 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;
+ float rotation = -mtex->rot;
+ float x, y, point_2d[3];
+ float radius;
+
+ /* 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. */
+
+ 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];
- avg= get_texcache_pixel_bilinear(ss, fx * ss->texcache_side, fy * ss->texcache_side);
+ radius = ss->cache->pixel_radius; // use pressure adjusted size for fixed mode
+
+ x = point_2d[0];
+ y = point_2d[1];
+ }
+ else /* else (mtex->brush_map_mode == MTEX_MAP_MODE_TILED),
+ leave the coordinates relative to the screen */
+ {
+ radius = 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 / radius;
+ y *= ss->cache->vc->ar->winy / radius;
+
+ /* 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;
}
@@ -730,7 +833,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 */
@@ -746,64 +849,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->pbvh;
- 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; n<totnode; n++) {
PBVHVertexIter vd;
SculptBrushTest test;
SculptUndoNode *unode;
- float fno[3];
- float nout[3] = {0.0f, 0.0f, 0.0f};
- float nout_flip[3] = {0.0f, 0.0f, 0.0f};
-
- // XXX push instead of get for thread safety in draw
- // brush .. lame, but also not harmful really
- unode= sculpt_undo_push_node(ss, nodes[n]);
+ float private_an[3] = {0.0f, 0.0f, 0.0f};
+ float private_out_flip[3] = {0.0f, 0.0f, 0.0f};
+
+ unode = sculpt_undo_push_node(ss, nodes[n]);
sculpt_brush_test_init(ss, &test);
if(ss->cache->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;
@@ -811,72 +910,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);
- /* 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;
-
- /* threaded loop over nodes */
- #pragma omp parallel for private(n) schedule(static)
- for(n=0; n<totnode; n++) {
- PBVHVertexIter vd;
- SculptBrushTest test;
-
- sculpt_undo_push_node(ss, nodes[n]);
- 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 */
- 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};
-
- sculpt_clip(sd, ss, vd.co, val);
- if(vd.mvert) vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ 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(sd, ss, an, nodes, totnode);
+
+ default:
+ break;
}
- BLI_pbvh_vertex_iter_end;
- 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;
@@ -903,7 +1000,7 @@ static void neighbor_average(SculptSession *ss, float avg[3], const int vert)
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;
}
}
@@ -917,52 +1014,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->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);
+ 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]];
@@ -970,75 +1073,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;
+
+ if(x == 0 && adj->index[0] == -1)
+ continue;
+
+ if(x == gridsize - 1 && adj->index[2] == -1)
+ continue;
- copy_v3_v3(co, data[x + y*gridsize].co);
+ 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;
+
+ mul_v3_fl(avg, n);
+
+ sub_v3_v3v3(val, avg, co);
+ mul_v3_fl(val, fade);
- CLAMP(fade, 0.0f, 1.0f);
+ add_v3_v3(val, co);
- 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);
+ 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)
- for(n=0; n<totnode; n++) {
- sculpt_undo_push_node(ss, nodes[n]);
+ CLAMP(bstrength, 0, 1);
- if(ss->multires)
- do_multires_smooth_brush(sd, ss, nodes[n]);
- else if(ss->fmap)
- do_mesh_smooth_brush(sd, ss, nodes[n]);
+ count = (int)(bstrength*max_iterations);
+ last = max_iterations*(bstrength - count*fract);
- BLI_pbvh_node_mark_update(nodes[n]);
+ for(iteration = 0; iteration <= count; ++iteration) {
+ #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
+ for(n=0; n<totnode; 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], iteration != count ? 1.0f : last);
}
if(ss->multires)
@@ -1046,69 +1180,378 @@ static void do_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int
}
}
-static void do_pinch_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+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;
- #pragma omp parallel for private(n) schedule(static)
+ 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; 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->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(brush_alpha(brush) > 0.0f)
+ crease_correction = brush->crease_pinch_factor*brush->crease_pinch_factor/(brush_alpha(brush)*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; 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)) {
- 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};
+ /* 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);
- 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;
+ }
+}
+
+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 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)) {
+ 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);
- BLI_pbvh_node_mark_update(nodes[n]);
+ if(vd.mvert)
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
+ }
+ }
+ BLI_pbvh_vertex_iter_end;
}
}
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; n<totnode; n++) {
PBVHVertexIter vd;
+ SculptUndoNode* unode;
SculptBrushTest test;
float (*origco)[3];
-
- origco= sculpt_undo_push_node(ss, nodes[n])->co;
+ 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], grab_delta, fade);
+
+ if(vd.mvert)
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
+ }
+ }
+ BLI_pbvh_vertex_iter_end;
+ }
+}
+
+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])) {
- 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);
+
+ mul_v3_v3fl(proxy[vd.i], cono, fade);
- sculpt_clip(sd, ss, vd.co, add);
- 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;
+ }
+}
+
+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; 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);
- BLI_pbvh_node_mark_update(nodes[n]);
+ 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;
}
}
@@ -1120,63 +1563,66 @@ static void do_layer_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int
float lim= ss->cache->radius / 4;
int n;
- 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; n<totnode; n++) {
PBVHVertexIter vd;
SculptBrushTest test;
SculptUndoNode *unode;
float (*origco)[3], *layer_disp;
+ //float (*proxy)[3]; // XXX layer brush needs conversion to proxy but its more complicated
+
+ //proxy= BLI_pbvh_node_add_proxy(ss->pbvh, nodes[n])->co;
unode= sculpt_undo_push_node(ss, nodes[n]);
origco=unode->co;
if(!unode->layer_disp)
- unode->layer_disp= MEM_callocN(sizeof(float)*unode->totvert, "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->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;
+ 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]);
}
}
@@ -1186,206 +1632,721 @@ 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; 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->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);
-
- 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);
+ if(vd.fno) copy_v3_v3(val, vd.fno);
+ else normal_short_to_float_v3(val, vd.no);
- 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;
+ int n;
+
+ float count = 0;
+
+ zero_v3(fc);
+
+ #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
+ for(n=0; n<totnode; n++) {
+ PBVHVertexIter vd;
+ SculptBrushTest test;
+ SculptUndoNode *unode;
+ float private_fc[3] = {0.0f, 0.0f, 0.0f};
+ int private_count = 0;
+
+ unode = sculpt_undo_push_node(ss, nodes[n]);
+ sculpt_brush_test_init(ss, &test);
+
+ 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;
+ }
+
+ #pragma omp critical
+ {
+ add_v3_v3(fc, private_fc);
+ count += private_count;
+ }
}
-
- #pragma omp parallel for private(n) schedule(static)
+
+ 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; n<totnode; n++) {
PBVHVertexIter vd;
SculptBrushTest test;
- int j;
-
- sculpt_undo_push_node(ss, nodes[n]);
+ SculptUndoNode *unode;
+ float private_an[3] = {0.0f, 0.0f, 0.0f};
+ float private_out_flip[3] = {0.0f, 0.0f, 0.0f};
+ float private_fc[3] = {0.0f, 0.0f, 0.0f};
+ int private_count = 0;
+
+ unode = sculpt_undo_push_node(ss, nodes[n]);
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)) {
- 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])) {
+ // 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;
}
- BLI_pbvh_vertex_iter_end;
- BLI_pbvh_node_mark_update(nodes[n]);
+ #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
+ if (count != 0) {
+ mul_v3_fl(fc, 1.0f / count);
+ }
+ else {
+ zero_v3(fc);
+ }
+}
+
+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];
+ 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_trim(StrokeCache *cache, Brush *brush, float val[3])
+{
+ return !(brush->flag & BRUSH_PLANE_TRIM) || (dot_v3v3(val, val) <= cache->radius_squared*cache->plane_trim_squared);
+}
+
+static int plane_point_side_flip(float co[3], float plane_normal[3], float plane_center[3], int flip)
+{
+ 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;
+}
+
+static int plane_point_side(float co[3], float plane_normal[3], float plane_center[3])
+{
+ float delta[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(delta, co, plane_center);
+ return dot_v3v3(plane_normal, delta) <= 0.0f;
}
-static int plane_point_side(float co[3], float plane_normal[3], float plane_center[3], int flip)
+static float get_offset(Sculpt *sd, SculptSession *ss)
{
- float delta[3];
- float d;
+ Brush* brush = paint_brush(&sd->paint);
- sub_v3_v3v3(delta, co, plane_center);
- d = dot_v3v3(plane_normal, delta);
+ float rv = brush->plane_offset;
- if(flip)
- d = -d;
+ if (brush->flag & BRUSH_OFFSET_PRESSURE) {
+ rv *= ss->cache->pressure;
+ }
- return d <= 0.0f;
+ return rv;
}
-static void do_flatten_clay_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode, int clay)
+static void do_flatten_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
{
- /* 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;
- calc_area_normal(sd, ss, area_normal, nodes, totnode);
- calc_flatten_center(sd, ss, nodes, totnode, cntr);
+ 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)) {
+ 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);
- 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;
+ mul_v3_v3fl(proxy[vd.i], val, fade);
+
+ if(vd.mvert)
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
+ }
+ }
+ }
+ BLI_pbvh_vertex_iter_end;
}
+}
- //#pragma omp parallel for private(n) schedule(static)
- for(n=0; n<totnode; n++) {
+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;
-
- 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->pbvh, 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;
+ 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];
- /* 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);
- 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;
+ 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;
}
- else
- mul_v3_fl(val, fabs(fade));
+ }
+ }
+ }
+ BLI_pbvh_vertex_iter_end;
+ }
+}
- add_v3_v3v3(val, val, vd.co);
+static void do_clay_tubes_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+{
+ Brush *brush = paint_brush(&sd->paint);
- sculpt_clip(sd, ss, vd.co, val);
- if(vd.mvert) vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
+ 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;
- BLI_pbvh_node_mark_update(nodes[n]);
+ 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_brush_action(Sculpt *sd, SculptSession *ss, StrokeCache *cache)
+static void do_scrape_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
{
- SculptSearchSphereData data;
Brush *brush = paint_brush(&sd->paint);
- PBVHNode **nodes= NULL;
- int totnode;
- data.ss = ss;
- data.sd = sd;
- data.radius_squared = ss->cache->radius * ss->cache->radius;
+ float bstrength = ss->cache->bstrength;
+ const float 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->pbvh, sculpt_search_sphere_cb, &data,
- &nodes, &totnode);
+ float an[3];
+ float fc[3];
+ float offset = get_offset(sd, ss);
- 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]);
+ 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;
}
- else {
- BLI_pbvh_search_gather(ss->pbvh, sculpt_search_sphere_cb, &data,
- &nodes, &totnode);
+}
+
+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;
+ 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_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:
@@ -1394,6 +2355,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;
@@ -1403,60 +2370,246 @@ 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<<i))
+// count[i] *= 2;
+// }
+// }
+//
+// return MAX3(count[0], count[1], count[2]);
+//}
+
/* Flip all the editdata across the axis/axes specified by symm. Used to
calculate multiple modifications to the mesh when symmetry is enabled. */
-static void calc_brushdata_symm(StrokeCache *cache, const char symm)
+static void calc_brushdata_symm(Sculpt *sd, StrokeCache *cache, const char symm, const char axis, const float angle, const float feather)
{
flip_coord(cache->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);
+
+ cache->bstrength= brush_strength(sd, cache, feather);
- 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->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)
{
Brush *brush = paint_brush(&sd->paint);
+ const int radius= brush_size(brush);
if(ss->texcache) {
MEM_freeN(ss->texcache);
@@ -1464,72 +2617,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*radius;
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, radius);
ss->texcache_actual = ss->texcache_side;
}
}
-/* 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->getNumFaces(dm);
ss->mvert= NULL;
@@ -1543,10 +2652,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->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)
@@ -1569,16 +2690,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;
}
@@ -1589,10 +2726,24 @@ static int sculpt_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *ev
{
Paint *p = paint_get_active(CTX_data_scene(C));
Brush *brush = paint_brush(p);
+ float col[4], tex_col[4];
WM_paint_cursor_end(CTX_wm_manager(C), p->paint_cursor);
p->paint_cursor = NULL;
brush_radial_control_invoke(op, brush, 1);
+
+ if((brush->flag & BRUSH_DIR_IN) && ELEM4(brush->sculpt_tool, SCULPT_TOOL_DRAW, SCULPT_TOOL_INFLATE, SCULPT_TOOL_CLAY, SCULPT_TOOL_PINCH))
+ copy_v3_v3(col, brush->sub_col);
+ else
+ copy_v3_v3(col, brush->add_col);
+ col[3]= 0.5f;
+
+ copy_v3_v3(tex_col, U.sculpt_paint_overlay_col);
+ tex_col[3]= (brush->texture_overlay_alpha / 100.0f);
+
+ RNA_float_set_array(op->ptr, "color", col);
+ RNA_float_set_array(op->ptr, "texture_color", tex_col);
+
return WM_radial_control_invoke(C, op, event);
}
@@ -1657,19 +2808,69 @@ static void sculpt_cache_free(StrokeCache *cache)
}
/* 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;
- 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;
+
+ BLI_strncpy(cache->saved_active_brush_name, brush->id.name+2, sizeof(cache->saved_active_brush_name));
+
+ br= (Brush *)find_id("BR", "Smooth");
+ if(br) {
+ paint_brush_set(p, br);
+ brush = br;
+ }
+ }
copy_v2_v2(cache->mouse, cache->initial_mouse);
copy_v2_v2(cache->tex_mouse, cache->initial_mouse);
@@ -1677,11 +2878,13 @@ 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) {
/* not supported yet for multires */
@@ -1707,103 +2910,233 @@ 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;
+}
+
+static void sculpt_update_brush_delta(Sculpt *sd, SculptSession *ss, Brush *brush)
+{
+ StrokeCache *cache = ss->cache;
+ int tool = brush->sculpt_tool;
+
+ if(ELEM5(tool,
+ SCULPT_TOOL_GRAB, SCULPT_TOOL_NUDGE,
+ SCULPT_TOOL_CLAY_TUBES, SCULPT_TOOL_SNAKE_HOOK,
+ SCULPT_TOOL_THUMB)) {
+ float grab_location[3], imat[4][4], delta[3];
+
+ if(cache->first_time) {
+ copy_v3_v3(cache->orig_grab_location,
+ cache->true_location);
+ }
+ else if(tool == SCULPT_TOOL_SNAKE_HOOK)
+ 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) {
+ switch(tool) {
+ case SCULPT_TOOL_GRAB:
+ case SCULPT_TOOL_THUMB:
+ 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);
+ break;
+ case SCULPT_TOOL_CLAY_TUBES:
+ case SCULPT_TOOL_NUDGE:
+ 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);
+ break;
+ case SCULPT_TOOL_SNAKE_HOOK:
+ 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);
+ break;
+ }
+ }
+ else {
+ zero_v3(cache->grab_delta);
+ }
+
+ copy_v3_v3(cache->old_grab_location, grab_location);
+
+ if(tool == SCULPT_TOOL_GRAB)
+ copy_v3_v3(sd->anchored_location, cache->true_location);
+ else if(tool == SCULPT_TOOL_THUMB)
+ copy_v3_v3(sd->anchored_location, cache->orig_grab_location);
+
+ if(ELEM(tool, SCULPT_TOOL_GRAB, SCULPT_TOOL_THUMB)) {
+ /* 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_initial_mouse, cache->initial_mouse);
+ sd->anchored_size = cache->pixel_radius;
+ }
+ }
}
/* 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 = brush_size(brush);
+
+ if(cache->first_time) {
+ if (!brush_use_locked_size(brush)) {
+ cache->initial_radius= unproject_brush_radius(ss->ob, cache->vc, cache->true_location, brush_size(brush));
+ brush_set_unprojected_radius(brush, cache->initial_radius);
+ }
+ else {
+ cache->initial_radius= brush_unprojected_radius(brush);
+ }
- if(cache->first_time)
- cache->initial_radius = unproject_brush_radius(ss->ob, cache->vc, cache->true_location, brush->size);
+ if (ELEM(brush->sculpt_tool, SCULPT_TOOL_GRAB, SCULPT_TOOL_SNAKE_HOOK))
+ cache->initial_radius *= 2.0f;
+ }
- if(brush->flag & BRUSH_SIZE_PRESSURE && brush->sculpt_tool != SCULPT_TOOL_GRAB) {
+ if(brush_use_size_pressure(brush)) {
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;
+
+ cache->radius_squared = cache->radius*cache->radius;
- if(!(brush->flag & BRUSH_ANCHORED))
+ 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);
- }
- else if(brush->flag & BRUSH_RAKE) {
- int update;
- dx = cache->last_rake[0] - cache->mouse[0];
- dy = cache->last_rake[1] - cache->mouse[1];
+ sd->anchored_size = cache->pixel_radius = sqrt(dx*dx + dy*dy);
- update = dx*dx + dy*dy > 100;
+ cache->special_rotation = atan2(dx, dy) + M_PI;
- /* 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 (brush->flag & BRUSH_EDGE_TO_EDGE) {
+ float halfway[2];
+ float out[3];
- if(update || cache->first_time) {
- cache->last_rake[0] = cache->mouse[0];
- cache->last_rake[1] = cache->mouse[1];
+ halfway[0] = dx*0.5 + cache->initial_mouse[0];
+ halfway[1] = dy*0.5 + cache->initial_mouse[1];
+
+ if (sculpt_stroke_get_location(C, stroke, out, halfway)) {
+ copy_v3_v3(sd->anchored_location, out);
+ copy_v2_v2(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;
+ }
}
- }
- /* Find the grab delta */
- if(brush->sculpt_tool == SCULPT_TOOL_GRAB) {
- float grab_location[3], imat[4][4];
+ if (!hit)
+ copy_v2_v2(sd->anchored_initial_mouse, cache->initial_mouse);
- if(cache->first_time)
- copy_v3_v3(cache->orig_grab_location, cache->true_location);
+ 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;
- /* 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]);
+ copy_v3_v3(sd->anchored_location, cache->true_location);
- /* 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);
+ sd->draw_anchored = 1;
+ }
+ else if(brush->flag & BRUSH_RAKE) {
+ const float u = 0.5f;
+ const float v = 1 - u;
+ const float r = 20;
+
+ const float dx = cache->last_rake[0] - cache->mouse[0];
+ const float dy = cache->last_rake[1] - cache->mouse[1];
+
+ if (cache->first_time) {
+ copy_v2_v2(cache->last_rake, cache->mouse);
}
+ else if (dx*dx + dy*dy >= r*r) {
+ cache->special_rotation = atan2(dx, dy);
- copy_v3_v3(cache->old_grab_location, grab_location);
+ 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];
+ }
+ }
+
+ sculpt_update_brush_delta(sd, ss, brush);
+
+ 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);
- /* 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_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);
@@ -1819,19 +3152,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;
+ }
- srd->hit |= BLI_pbvh_node_raycast(srd->ss->pbvh, node, origco,
- srd->ray_start, srd->ray_normal, &srd->dist);
+ if (BLI_pbvh_node_raycast(srd->ss->pbvh, node, origco, srd->ray_start, srd->ray_normal, &srd->dist)) {
+ srd->hit = 1;
+ *tmin = srd->dist;
+ }
+ }
}
/* Do a raycast in the tree to find the 3d brush location
@@ -1845,10 +3182,12 @@ 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);
@@ -1871,48 +3210,11 @@ int sculpt_stroke_get_location(bContext *C, struct PaintStroke *stroke, float ou
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);
@@ -1940,22 +3242,26 @@ 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_use_size_pressure(brush)) ||
+ (brush->flag & BRUSH_RESTORE_MESH))
+ {
+ StrokeCache *cache = ss->cache;
+ int i;
+
PBVHNode **nodes;
int n, 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; n<totnode; n++) {
SculptUndoNode *unode;
- unode= sculpt_undo_get_node(ss, nodes[n]);
+ unode= sculpt_undo_get_node(nodes[n]);
if(unode) {
PBVHVertexIter vd;
@@ -1963,8 +3269,12 @@ static void sculpt_restore_mesh(Sculpt *sd, SculptSession *ss)
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]);
}
}
@@ -1981,17 +3291,17 @@ static void sculpt_restore_mesh(Sculpt *sd, SculptSession *ss)
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(ob->derivedFinal) /* VBO no longer valid */
+ GPU_drawobject_free(ob->derivedFinal);
- if(sculpt_modifiers_active(scene, ob)) {
+ if(ss->modifiers_active) {
DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
ED_region_tag_redraw(ar);
}
@@ -1999,14 +3309,22 @@ static void sculpt_flush_update(bContext *C)
rcti r;
BLI_pbvh_update(ss->pbvh, PBVH_UpdateBB, NULL);
- redraw = sculpt_get_redraw_rect(ar, CTX_wm_region_view3d(C), ob, &r);
- if(redraw) {
+ if (sculpt_get_redraw_rect(ar, CTX_wm_region_view3d(C), ob, &r)) {
+ //rcti tmp;
+
r.xmin += ar->winrct.xmin + 1;
r.xmax += ar->winrct.xmin - 1;
r.ymin += ar->winrct.ymin + 1;
r.ymax += ar->winrct.ymin - 1;
-
+
+ //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);
}
@@ -2017,9 +3335,12 @@ 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,
@@ -2033,11 +3354,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_undo_push_begin(sculpt_tool_name(sd));
- sculpt_update_cache_invariants(sd, ss, C, op);
+#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;
- sculpt_undo_push_begin(ss, sculpt_tool_name(sd));
+ num_procs = omp_get_num_procs();
+ omp_set_num_threads(2*num_procs);
+ }
+#endif
return 1;
}
@@ -2051,7 +3383,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);
@@ -2059,26 +3391,46 @@ 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= (Brush *)find_id("BR", ss->cache->saved_active_brush_name);
+ if(br) {
+ paint_brush_set(p, br);
+ }
+ }
+
sculpt_cache_free(ss->cache);
ss->cache = NULL;
- sculpt_undo_push_end(ss);
+ sculpt_undo_push_end();
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);
@@ -2105,6 +3457,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;
@@ -2129,7 +3482,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);
@@ -2141,7 +3494,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";
@@ -2152,36 +3510,32 @@ 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_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);
+ RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement,
+ "Stroke", "");
- /* 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;
+ (void)unused;
+
if(ss) {
if(ss->layer_co)
MEM_freeN(ss->layer_co);
@@ -2201,7 +3555,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= OPTYPE_REGISTER|OPTYPE_UNDO;
}
/**** Toggle operator for turning sculpt mode on or off ****/
@@ -2209,25 +3563,31 @@ 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");
-
- sculpt_update_mesh_elements(scene, ob, 0);
+ ob->sculpt->ob = ob;
- if(ob->sculpt->refkb)
- sculpt_key_to_mesh(ob->sculpt->refkb, ob);
+ sculpt_update_mesh_elements(scene, ob, 0);
}
-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 */
@@ -2239,13 +3599,17 @@ static int sculpt_toggle_mode(bContext *C, wmOperator *op)
/* 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);
diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h
index d3553c008b2..254876d9b68 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(struct 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..e92740678fd
--- /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 "MEM_guardedalloc.h"
+
+#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 "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_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; i<unode->totvert; 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; i<unode->totvert; 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; j<unode->totgrid; j++) {
+ grid= grids[unode->grids[j]];
+
+ for(i=0; i<gridsize*gridsize; i++, co++)
+ swap_v3_v3(grid[i].co, co[0]);
+ }
+ }
+
+ update= 1;
+ }
+
+ if(update) {
+ /* 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->pbvh, 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/Makefile b/source/blender/editors/sound/Makefile
index 10145035eb4..f51e15627a2 100644
--- a/source/blender/editors/sound/Makefile
+++ b/source/blender/editors/sound/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) 2007 Blender Foundation
# All rights reserved.
@@ -37,6 +37,8 @@ CFLAGS += $(LEVEL_1_C_WARNINGS)
CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
+CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
+
CPPFLAGS += -I../../windowmanager
CPPFLAGS += -I../../blenkernel
CPPFLAGS += -I../../blenloader
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 376db0d3d58..fe1fe3266bc 100644
--- a/source/blender/editors/sound/sound_ops.c
+++ b/source/blender/editors/sound/sound_ops.c
@@ -30,18 +30,20 @@
#include <stdlib.h>
#include <stdio.h>
+#include "MEM_guardedalloc.h"
+
#include "DNA_packedFile_types.h"
#include "DNA_scene_types.h"
#include "DNA_space_types.h"
#include "DNA_sequence_types.h"
+#include "DNA_sound_types.h"
+#include "DNA_userdef_types.h"
#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_main.h"
#include "BKE_report.h"
#include "BKE_packedFile.h"
#include "BKE_sound.h"
-#include "BKE_utildefines.h"
#include "BLI_blenlib.h"
@@ -61,17 +63,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;
}
@@ -80,6 +95,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;
}
@@ -87,12 +103,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);
}
@@ -111,7 +149,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.");
}
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/Makefile b/source/blender/editors/space_action/Makefile
index e856587acca..19aeb54cc2f 100644
--- a/source/blender/editors/space_action/Makefile
+++ b/source/blender/editors/space_action/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/space_action/action_draw.c b/source/blender/editors/space_action/action_draw.c
index d486bff9b6f..d2067790b2f 100644
--- a/source/blender/editors/space_action/action_draw.c
+++ b/source/blender/editors/space_action/action_draw.c
@@ -34,11 +34,6 @@
#include <string.h>
#include <float.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
@@ -49,19 +44,12 @@
#include "DNA_screen_types.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_global.h" // XXX remove me!
#include "BKE_context.h"
#include "BKE_utildefines.h"
/* Everything from source (BIF, BDR, BSE) ------------------------------ */
#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "UI_interface.h"
#include "UI_resources.h"
diff --git a/source/blender/editors/space_action/action_edit.c b/source/blender/editors/space_action/action_edit.c
index 7e392f2d335..916b0032f17 100644
--- a/source/blender/editors/space_action/action_edit.c
+++ b/source/blender/editors/space_action/action_edit.c
@@ -32,11 +32,6 @@
#include <string.h>
#include <float.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
@@ -50,15 +45,10 @@
#include "RNA_enum_types.h"
#include "BKE_action.h"
-#include "BKE_depsgraph.h"
#include "BKE_fcurve.h"
-#include "BKE_key.h"
-#include "BKE_material.h"
#include "BKE_nla.h"
-#include "BKE_object.h"
#include "BKE_context.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
#include "UI_view2d.h"
@@ -103,7 +93,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;
}
@@ -137,7 +127,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 */
@@ -288,7 +278,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 */
@@ -307,7 +297,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 */
@@ -383,7 +373,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;
}
@@ -425,7 +415,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;
@@ -478,7 +468,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;
}
@@ -512,9 +502,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 */
@@ -546,7 +536,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
}
@@ -590,9 +580,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 */
@@ -633,7 +623,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;
}
@@ -663,7 +653,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 */
@@ -697,7 +687,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;
}
@@ -731,7 +721,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 */
@@ -761,7 +751,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;
}
@@ -801,7 +791,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 */
@@ -872,7 +862,7 @@ static void setipo_action_keys(bAnimContext *ac, short 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
@@ -956,7 +946,7 @@ static void sethandles_action_keys(bAnimContext *ac, short 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
@@ -1040,7 +1030,7 @@ static void setkeytype_action_keys(bAnimContext *ac, short 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
@@ -1122,7 +1112,7 @@ static int actkeys_framejump_exec(bContext *C, wmOperator *op)
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) {
@@ -1142,6 +1132,7 @@ static int actkeys_framejump_exec(bContext *C, wmOperator *op)
if (ked.i1) {
Scene *scene= ac.scene;
CFRA= (int)floor((ked.f1 / ked.i1) + 0.5f);
+ SUBFRA= 0.f;
}
/* set notifier that things have changed */
@@ -1190,7 +1181,7 @@ static void snap_action_keys(bAnimContext *ac, short mode)
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 */
@@ -1242,7 +1233,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;
}
@@ -1315,9 +1306,9 @@ static void mirror_action_keys(bAnimContext *ac, short mode)
/* 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 */
@@ -1359,7 +1350,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_ops.c b/source/blender/editors/space_action/action_ops.c
index 8ef37942fb3..19dd4512909 100644
--- a/source/blender/editors/space_action/action_ops.c
+++ b/source/blender/editors/space_action/action_ops.c
@@ -29,14 +29,11 @@
#include <stdlib.h>
#include <math.h>
-#include "MEM_guardedalloc.h"
#include "DNA_space_types.h"
#include "BLI_blenlib.h"
-#include "BKE_context.h"
-#include "BKE_utildefines.h"
#include "ED_transform.h"
diff --git a/source/blender/editors/space_action/action_select.c b/source/blender/editors/space_action/action_select.c
index 8f1d2d4be0e..b2c47194384 100644
--- a/source/blender/editors/space_action/action_select.c
+++ b/source/blender/editors/space_action/action_select.c
@@ -29,10 +29,6 @@
#include <string.h>
#include <float.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
@@ -46,15 +42,9 @@
#include "RNA_access.h"
#include "RNA_define.h"
-#include "BKE_action.h"
-#include "BKE_depsgraph.h"
#include "BKE_fcurve.h"
-#include "BKE_key.h"
-#include "BKE_material.h"
#include "BKE_nla.h"
-#include "BKE_object.h"
#include "BKE_context.h"
-#include "BKE_utildefines.h"
#include "UI_view2d.h"
@@ -69,6 +59,7 @@
#include "action_intern.h"
+
/* ************************************************************************** */
/* KEYFRAMES STUFF */
@@ -99,9 +90,9 @@ static void deselect_action_keys (bAnimContext *ac, short test, short sel)
/* 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);
@@ -160,7 +151,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;
}
@@ -216,7 +207,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) */
@@ -321,7 +312,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;
}
@@ -393,7 +384,7 @@ static void markers_selectkeys_between (bAnimContext *ac)
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 */
@@ -535,7 +526,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;
}
@@ -576,7 +567,7 @@ static int actkeys_select_linked_exec (bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
/* 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) {
@@ -593,7 +584,7 @@ static int actkeys_select_linked_exec (bContext *C, wmOperator *op)
BLI_freelistN(&anim_data);
/* 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;
}
@@ -631,7 +622,7 @@ static void select_moreless_action_keys (bAnimContext *ac, short mode)
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) {
@@ -671,7 +662,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;
}
@@ -705,7 +696,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;
}
@@ -804,9 +795,9 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short
/* 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 */
@@ -827,13 +818,14 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short
/* 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)
- ) {
+ if( ((leftright == ACTKEYS_LRSEL_LEFT) && (marker->frame < CFRA)) ||
+ ((leftright == ACTKEYS_LRSEL_RIGHT) && (marker->frame >= CFRA)) )
+ {
marker->flag |= SELECT;
}
else {
@@ -868,9 +860,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) {
@@ -997,14 +989,12 @@ static void mouse_action_keys (bAnimContext *ac, int mval[2], short select_mode,
return;
}
else if (ale->type == ANIMTYPE_GPLAYER) {
- bGPDlayer *gpl= (bGPDlayer *)ale->data;
+ struct bGPDlayer *gpl= (struct bGPDlayer *)ale->data;
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
@@ -1143,7 +1133,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 7e02454254b..7b96618d923 100644
--- a/source/blender/editors/space_action/space_action.c
+++ b/source/blender/editors/space_action/space_action.c
@@ -38,10 +38,8 @@
#include "BLI_math.h"
#include "BLI_rand.h"
-#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "ED_screen.h"
@@ -165,12 +163,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);
@@ -227,11 +223,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);
@@ -356,7 +350,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..591e97f800f
--- /dev/null
+++ b/source/blender/editors/space_api/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_api "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_api/Makefile b/source/blender/editors/space_api/Makefile
index 474fbe89053..deaa46a9582 100644
--- a/source/blender/editors/space_api/Makefile
+++ b/source/blender/editors/space_api/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/space_api/SConscript b/source/blender/editors/space_api/SConscript
index c3105d3e50c..c499d5865ec 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 66cb88ebf70..e862358c465 100644
--- a/source/blender/editors/space_api/space.c
+++ b/source/blender/editors/space_api/space.c
@@ -29,13 +29,10 @@
#include <string.h>
#include <stdio.h>
-#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
-#include "BKE_context.h"
-#include "BKE_screen.h"
/* */
diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c
index ba7172b0da8..2140c59da67 100644
--- a/source/blender/editors/space_api/spacetypes.c
+++ b/source/blender/editors/space_api/spacetypes.c
@@ -36,7 +36,6 @@
#include "UI_interface.h"
#include "UI_view2d.h"
-#include "BIF_gl.h"
#include "ED_anim_api.h"
#include "ED_armature.h"
@@ -55,6 +54,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)
@@ -100,6 +100,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/Makefile b/source/blender/editors/space_buttons/Makefile
index a4894ede06b..28758fb168b 100644
--- a/source/blender/editors/space_buttons/Makefile
+++ b/source/blender/editors/space_buttons/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/space_buttons/SConscript b/source/blender/editors/space_buttons/SConscript
index a0a7dad4077..31438b641e0 100644
--- a/source/blender/editors/space_buttons/SConscript
+++ b/source/blender/editors/space_buttons/SConscript
@@ -9,7 +9,4 @@ incs += ' ../../makesrna ../../render/extern/include'
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 961c3cf17ce..343237dee5e 100644
--- a/source/blender/editors/space_buttons/buttons_context.c
+++ b/source/blender/editors/space_buttons/buttons_context.c
@@ -36,11 +36,11 @@
#include "DNA_node_types.h"
#include "DNA_scene_types.h"
#include "DNA_world_types.h"
+#include "DNA_brush_types.h"
#include "BLI_listbase.h"
#include "BKE_context.h"
-#include "BKE_global.h"
#include "BKE_action.h"
#include "BKE_material.h"
#include "BKE_modifier.h"
@@ -49,7 +49,6 @@
#include "BKE_screen.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
-#include "BKE_world.h"
#include "RNA_access.h"
@@ -342,7 +341,7 @@ static int buttons_context_path_brush(const bContext *C, ButsContextPath *path)
br= paint_brush(paint_get_active(scene));
if(br) {
- RNA_id_pointer_create(&br->id, &path->ptr[path->len]);
+ RNA_id_pointer_create((ID *)br, &path->ptr[path->len]);
path->len++;
return 1;
@@ -699,11 +698,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;
diff --git a/source/blender/editors/space_buttons/buttons_header.c b/source/blender/editors/space_buttons/buttons_header.c
index d8cbbb0cbae..ab756b638fa 100644
--- a/source/blender/editors/space_buttons/buttons_header.c
+++ b/source/blender/editors/space_buttons/buttons_header.c
@@ -30,20 +30,15 @@
#include <stdio.h>
-#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BKE_context.h"
-#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "ED_screen.h"
#include "ED_types.h"
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "UI_interface.h"
#include "UI_resources.h"
diff --git a/source/blender/editors/space_buttons/buttons_ops.c b/source/blender/editors/space_buttons/buttons_ops.c
index 9261e28cd6a..c4357008a9c 100644
--- a/source/blender/editors/space_buttons/buttons_ops.c
+++ b/source/blender/editors/space_buttons/buttons_ops.c
@@ -30,6 +30,9 @@
#include "MEM_guardedalloc.h"
+#include "DNA_userdef_types.h"
+
+#include "BLI_fileops.h"
#include "BKE_context.h"
@@ -88,10 +91,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);
@@ -119,26 +122,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 */
@@ -147,6 +177,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 66068a4f23c..0b6e752574b 100644
--- a/source/blender/editors/space_buttons/space_buttons.c
+++ b/source/blender/editors/space_buttons/space_buttons.c
@@ -36,7 +36,6 @@
#include "BLI_math.h"
#include "BLI_rand.h"
-#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -191,39 +190,22 @@ void buttons_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "BUTTONS_OT_toolbox", RIGHTMOUSE, KM_PRESS, 0, 0);
}
-//#define PY_HEADER
/* add handlers, stuff you only do once or on area/region changes */
static void buttons_header_area_init(wmWindowManager *wm, ARegion *ar)
{
-#ifdef PY_HEADER
- ED_region_header_init(ar);
-#else
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
-#endif
}
static void buttons_header_area_draw(const bContext *C, ARegion *ar)
{
-#ifdef PY_HEADER
- 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) */
UI_view2d_view_ortho(C, &ar->v2d);
buttons_header_buttons(C, ar);
-#endif
/* restore view matrix? */
UI_view2d_view_restore(C);
@@ -268,6 +250,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,8 +281,9 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn)
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);
@@ -344,9 +329,9 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn)
break;
case NC_BRUSH:
buttons_area_redraw(sa, BCONTEXT_TEXTURE);
- sbuts->preview= 1;
break;
case NC_TEXTURE:
+ case NC_IMAGE:
ED_area_tag_redraw(sa);
sbuts->preview= 1;
break;
@@ -360,10 +345,17 @@ 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;
}
+ break;
+ /* Listener for preview render, when doing an global undo. */
+ case NC_WINDOW:
+ ED_area_tag_redraw(sa);
+ sbuts->preview= 1;
+ break;
}
if(wmn->data == ND_KEYS)
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..4ae157507e0 100644
--- a/source/blender/editors/space_console/Makefile
+++ b/source/blender/editors/space_console/Makefile
@@ -17,7 +17,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) 2009 Blender Foundation
# All rights reserved.
@@ -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 db7bb8419e8..74d47ad675d 100644
--- a/source/blender/editors/space_console/console_draw.c
+++ b/source/blender/editors/space_console/console_draw.c
@@ -33,7 +33,6 @@
#include <sys/stat.h>
#include <limits.h>
-#include "MEM_guardedalloc.h"
#include "BLF_api.h"
@@ -42,10 +41,7 @@
#include "DNA_space_types.h"
#include "DNA_screen_types.h"
-#include "BKE_global.h"
-#include "BKE_main.h"
// #include "BKE_suggestions.h"
-#include "BKE_text.h"
#include "BKE_report.h"
#include "BKE_utildefines.h"
@@ -59,17 +55,16 @@
#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)
@@ -224,8 +219,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);
@@ -242,8 +237,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);
@@ -268,8 +263,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);
@@ -301,7 +296,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;
@@ -344,11 +339,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_ops.c b/source/blender/editors/space_console/console_ops.c
index 089e769e0d9..9a53531ba73 100644
--- a/source/blender/editors/space_console/console_ops.c
+++ b/source/blender/editors/space_console/console_ops.c
@@ -39,13 +39,7 @@
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
-#include "BKE_utildefines.h"
#include "BKE_context.h"
-#include "BKE_depsgraph.h"
-#include "BKE_global.h"
-#include "BKE_library.h"
-#include "BKE_main.h"
-#include "BKE_report.h"
#include "BKE_text.h" /* only for character utility funcs */
#include "WM_api.h"
diff --git a/source/blender/editors/space_console/console_report.c b/source/blender/editors/space_console/console_report.c
index 50829e4365c..51bffa5b981 100644
--- a/source/blender/editors/space_console/console_report.c
+++ b/source/blender/editors/space_console/console_report.c
@@ -36,13 +36,7 @@
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
-#include "BKE_utildefines.h"
#include "BKE_context.h"
-#include "BKE_depsgraph.h"
-#include "BKE_global.h"
-#include "BKE_library.h"
-#include "BKE_main.h"
-#include "BKE_report.h"
#include "WM_api.h"
#include "WM_types.h"
diff --git a/source/blender/editors/space_console/space_console.c b/source/blender/editors/space_console/space_console.c
index 97e1403e435..4ee69bbd809 100644
--- a/source/blender/editors/space_console/space_console.c
+++ b/source/blender/editors/space_console/space_console.c
@@ -29,15 +29,18 @@
#include <string.h>
#include <stdio.h>
+#ifdef WIN32
+#include "BLI_winstuff.h"
+#endif
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
-#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_screen.h"
+#include "BKE_idcode.h"
#include "ED_screen.h"
@@ -142,28 +145,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']", BKE_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);
@@ -229,19 +287,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);
@@ -346,6 +404,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..5cbe9bbe0ba
--- /dev/null
+++ b/source/blender/editors/space_file/CMakeLists.txt
@@ -0,0 +1,67 @@
+# $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_IMAGE_OPENEXR)
+ ADD_DEFINITIONS(-DWITH_OPENEXR)
+ENDIF(WITH_IMAGE_OPENEXR)
+
+IF(WITH_IMAGE_TIFF)
+ ADD_DEFINITIONS(-DWITH_TIFF)
+ENDIF(WITH_IMAGE_TIFF)
+
+IF(WITH_IMAGE_OPENJPEG)
+ ADD_DEFINITIONS(-DWITH_OPENJPEG)
+ENDIF(WITH_IMAGE_OPENJPEG)
+
+IF(WITH_IMAGE_DDS)
+ ADD_DEFINITIONS(-DWITH_DDS)
+ENDIF(WITH_IMAGE_DDS)
+
+IF(WITH_IMAGE_CINEON)
+ ADD_DEFINITIONS(-DWITH_CINEON)
+ENDIF(WITH_IMAGE_CINEON)
+
+IF(WITH_IMAGE_HDR)
+ ADD_DEFINITIONS(-DWITH_HDR)
+ENDIF(WITH_IMAGE_HDR)
+
+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..1fc27795f08 100644
--- a/source/blender/editors/space_file/Makefile
+++ b/source/blender/editors/space_file/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) 2007 Blender Foundation
# All rights reserved.
@@ -63,3 +63,14 @@ ifeq ($(WITH_OPENEXR), true)
CPPFLAGS += -DWITH_OPENEXR
endif
+ifeq ($(WITH_TIFF), true)
+ CPPFLAGS += -DWITH_TIFF
+endif
+
+ifeq ($(WITH_CINEON), true)
+ CPPFLAGS += -DWITH_CINEON
+endif
+
+ifeq ($(WITH_HDR), true)
+ CPPFLAGS += -DWITH_HDR
+endif \ No newline at end of file
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 bfc17261fa6..3368ce636e1 100644
--- a/source/blender/editors/space_file/file_draw.c
+++ b/source/blender/editors/space_file/file_draw.c
@@ -38,20 +38,16 @@
#include "BIF_gl.h"
#include "BIF_glutil.h"
-#include "BKE_colortools.h"
#include "BKE_context.h"
-#include "BKE_screen.h"
#include "BKE_global.h"
-#include "BKE_utildefines.h"
#include "BLF_api.h"
-
-
#include "IMB_imbuf_types.h"
#include "MEM_guardedalloc.h"
+#include "DNA_userdef_types.h"
#include "RNA_access.h"
@@ -78,10 +74,6 @@
/* button events */
enum {
- B_REDR = 0,
- B_FS_EXEC,
- B_FS_CANCEL,
- B_FS_PARENT,
B_FS_DIRNAME,
B_FS_FILENAME
} eFile_ButEvents;
@@ -90,9 +82,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;
@@ -129,10 +118,11 @@ void file_draw_buttons(const bContext *C, ARegion *ar)
const int separator = 4;
/* Additional locals. */
- char name[20];
+ char name[32];
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;
@@ -151,8 +141,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;
}
}
@@ -182,27 +173,28 @@ 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,
+ 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,
+ 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,
+ 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,
+ 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);
@@ -334,11 +326,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 );
@@ -346,8 +340,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)
@@ -431,21 +426,25 @@ static void renamebutton_cb(bContext *C, void *arg1, char *oldname)
SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
ARegion* ar = CTX_wm_region(C);
+#if 0
struct direntry *file = (struct direntry *)arg1;
+#endif
BLI_make_file_string(G.sce, orgname, sfile->params->dir, oldname);
- BLI_strncpy(filename, file->relname, sizeof(filename));
+ BLI_strncpy(filename, sfile->params->renameedit, sizeof(filename));
BLI_make_file_string(G.sce, newname, sfile->params->dir, filename);
if( strcmp(orgname, newname) != 0 ) {
if (!BLI_exists(newname)) {
BLI_rename(orgname, newname);
/* to make sure we show what is on disk */
+#if 0 /* this is cleared anyway, no need */
+ MEM_freeN(file->relname);
+ file->relname= BLI_strdup(sfile->params->renameedit);
+#endif
ED_fileselect_clear(C, sfile);
- } else {
- BLI_strncpy(file->relname, oldname, strlen(oldname)+1);
}
-
+
ED_region_tag_redraw(ar);
}
}
@@ -516,6 +515,13 @@ void file_draw_list(const bContext *C, ARegion *ar)
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) && (i<offset+numfiles_layout); ++i)
{
ED_fileselect_layout_tilepos(layout, i, &sx, &sy);
@@ -533,7 +539,7 @@ void file_draw_list(const bContext *C, ARegion *ar)
int but_width = (FILE_IMGDISPLAY == params->display) ? layout->tile_w : layout->column_widths[COLUMN_NAME];
uiBut *but = uiDefBut(block, TEX, 1, "", spos, sy-layout->tile_h-3,
- but_width, layout->textheight*2, file->relname, 1.0f, (float)FILE_MAX,0,0,"");
+ but_width, layout->textheight*2, sfile->params->renameedit, 1.0f, (float)sizeof(sfile->params->renameedit),0,0,"");
uiButSetRenameFunc(but, renamebutton_cb, file);
if ( 0 == uiButActiveOnly(C, block, but)) {
file->flags &= ~EDITING;
@@ -622,4 +628,3 @@ void file_draw_list(const bContext *C, ARegion *ar)
}
-
diff --git a/source/blender/editors/space_file/file_intern.h b/source/blender/editors/space_file/file_intern.h
index a7aeaa1d365..c77379b39a0 100644
--- a/source/blender/editors/space_file/file_intern.h
+++ b/source/blender/editors/space_file/file_intern.h
@@ -70,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);
@@ -90,6 +91,7 @@ float file_font_pointsize();
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 f1d3702160f..2a50b505c57 100644
--- a/source/blender/editors/space_file/file_ops.c
+++ b/source/blender/editors/space_file/file_ops.c
@@ -121,7 +121,7 @@ static void clamp_to_filelist(int numfiles, int *first_file, int *last_file)
}
}
-static FileSelect file_select(bContext* C, 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);
@@ -141,6 +141,19 @@ static FileSelect file_select(bContext* C, const rcti* rect, short selecting, sh
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++) {
@@ -213,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(C, &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);
@@ -245,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;
@@ -259,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(C, &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);
@@ -283,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)
@@ -318,7 +333,7 @@ static int file_select_all_exec(bContext *C, wmOperator *op)
void FILE_OT_select_all_toggle(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Select/Deselect all files";
+ ot->name= "Select/Deselect All Files";
ot->description= "Select/deselect all files";
ot->idname= "FILE_OT_select_all_toggle";
@@ -376,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);
}
@@ -408,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);
}
@@ -530,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;
@@ -552,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_path"))
- if(RNA_boolean_get(op->ptr, "relative_path"))
- BLI_path_rel(name, G.sce);
+ 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 */
{
@@ -597,8 +619,8 @@ 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);
ED_fileselect_clear(C, sfile);
@@ -657,7 +679,9 @@ void FILE_OT_parent(struct wmOperatorType *ot)
int file_refresh_exec(bContext *C, wmOperator *unused)
{
- file_change_dir(C, 1);
+ SpaceFile *sfile= CTX_wm_space_file(C);
+
+ ED_fileselect_clear(C, sfile);
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
@@ -728,6 +752,116 @@ int file_next_exec(bContext *C, wmOperator *unused)
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.
*/
@@ -777,6 +911,12 @@ 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);
@@ -799,26 +939,15 @@ 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_getDefaultDocumentFolder(), tmpstr);
}
+
#ifdef WIN32
if (sfile->params->dir[0] == '\0')
get_default_root(sfile->params->dir);
diff --git a/source/blender/editors/space_file/file_panels.c b/source/blender/editors/space_file/file_panels.c
index 637e56459d7..4a505bc022f 100644
--- a/source/blender/editors/space_file/file_panels.c
+++ b/source/blender/editors/space_file/file_panels.c
@@ -182,7 +182,7 @@ 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;
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 9dd16586946..c3bea2a5bea 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -34,10 +34,6 @@
#include <math.h>
#include <string.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#ifndef WIN32
#include <unistd.h>
#else
@@ -56,25 +52,14 @@
#endif
#include "BKE_context.h"
-#include "BKE_utildefines.h"
#include "BKE_global.h"
#include "BKE_library.h"
-#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_report.h"
#include "BLO_readfile.h"
+#include "BKE_idcode.h"
#include "DNA_space_types.h"
-#include "DNA_ipo_types.h"
-#include "DNA_ID.h"
-#include "DNA_object_types.h"
-#include "DNA_listBase.h"
-#include "DNA_lamp_types.h"
-#include "DNA_material_types.h"
-#include "DNA_texture_types.h"
-#include "DNA_world_types.h"
-#include "DNA_scene_types.h"
-#include "DNA_userdef_types.h"
#include "ED_datafiles.h"
@@ -165,7 +150,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);
@@ -262,7 +247,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);
@@ -379,7 +364,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; y<SPECIAL_IMG_ROWS; y++) {
for (x=0; x<SPECIAL_IMG_COLS; x++) {
@@ -617,9 +602,7 @@ struct ImBuf * filelist_loadimage(struct FileList* filelist, int index)
if (!imb)
{
if ( (filelist->filelist[fidx].flags & IMAGEFILE) || (filelist->filelist[fidx].flags & MOVIEFILE) ) {
- char path[FILE_MAX];
- BLI_join_dirfile(path, filelist->dir, filelist->filelist[fidx].relname);
- imb = IMB_thumb_read(path, THB_NORMAL);
+ imb = IMB_thumb_read(filelist->filelist[fidx].path, THB_NORMAL);
}
if (imb) {
filelist->filelist[fidx].image = imb;
@@ -743,7 +726,7 @@ static void filelist_read_dir(struct FileList* filelist)
BLI_cleanup_dir(G.sce, filelist->dir);
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);
}
@@ -813,9 +796,6 @@ void filelist_setfiletypes(struct FileList* filelist, short has_quicktime)
/* Don't check extensions for directories */
if (file->type & S_IFDIR) {
- if(BLO_has_bfile_extension(file->relname)) {
- file->flags |= BLENDERFILE;
- }
continue;
}
@@ -837,129 +817,13 @@ void filelist_setfiletypes(struct FileList* filelist, short has_quicktime)
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")
- || BLI_testextensie(file->relname, ".jpg")
-#ifdef WITH_OPENJPEG
- || BLI_testextensie(file->relname, ".jp2")
-#endif
- || BLI_testextensie(file->relname, ".jpeg")
- || BLI_testextensie(file->relname, ".tga")
- || BLI_testextensie(file->relname, ".rgb")
- || BLI_testextensie(file->relname, ".rgba")
- || BLI_testextensie(file->relname, ".bmp")
- || BLI_testextensie(file->relname, ".png")
- || BLI_testextensie(file->relname, ".iff")
- || BLI_testextensie(file->relname, ".lbm")
- || BLI_testextensie(file->relname, ".gif")
- || BLI_testextensie(file->relname, ".psd")
- || BLI_testextensie(file->relname, ".tif")
- || BLI_testextensie(file->relname, ".tiff")
- || BLI_testextensie(file->relname, ".pct")
- || BLI_testextensie(file->relname, ".pict")
- || BLI_testextensie(file->relname, ".pntg") //macpaint
- || BLI_testextensie(file->relname, ".qtif")
- || BLI_testextensie(file->relname, ".sgi")
- || BLI_testextensie(file->relname, ".hdr")
-#ifdef WITH_DDS
- || BLI_testextensie(file->relname, ".dds")
-#endif
-#ifdef WITH_OPENEXR
- || BLI_testextensie(file->relname, ".exr")
-#endif
- ) {
+ } else if(BLI_testextensie_array(file->relname, imb_ext_image)
+ || (has_quicktime && BLI_testextensie_array(file->relname, imb_ext_image_qt))) {
file->flags |= IMAGEFILE;
- }
- else if(BLI_testextensie(file->relname, ".avi")
- || BLI_testextensie(file->relname, ".flc")
- || BLI_testextensie(file->relname, ".mov")
- || BLI_testextensie(file->relname, ".movie")
- || BLI_testextensie(file->relname, ".mp4")
- || BLI_testextensie(file->relname, ".m4v")
- || BLI_testextensie(file->relname, ".mv")
- || BLI_testextensie(file->relname, ".wmv")
- || BLI_testextensie(file->relname, ".ogv")
- || BLI_testextensie(file->relname, ".mpeg")
- || BLI_testextensie(file->relname, ".mpg")
- || BLI_testextensie(file->relname, ".mpg2")
- || BLI_testextensie(file->relname, ".vob")
- || BLI_testextensie(file->relname, ".mkv")
- || BLI_testextensie(file->relname, ".flv")
- || BLI_testextensie(file->relname, ".divx")
- || BLI_testextensie(file->relname, ".xvid")) {
- file->flags |= MOVIEFILE;
- }
- else if(BLI_testextensie(file->relname, ".wav")
- || BLI_testextensie(file->relname, ".ogg")
- || BLI_testextensie(file->relname, ".oga")
- || BLI_testextensie(file->relname, ".mp3")
- || BLI_testextensie(file->relname, ".mp2")
- || BLI_testextensie(file->relname, ".ac3")
- || BLI_testextensie(file->relname, ".aac")
- || BLI_testextensie(file->relname, ".flac")
- || BLI_testextensie(file->relname, ".wma")
- || BLI_testextensie(file->relname, ".eac3")) {
- file->flags |= SOUNDFILE;
- }
- } else { // no quicktime
- if(BLI_testextensie(file->relname, ".int")
- || BLI_testextensie(file->relname, ".inta")
- || BLI_testextensie(file->relname, ".jpg")
- || BLI_testextensie(file->relname, ".jpeg")
-#ifdef WITH_OPENJPEG
- || BLI_testextensie(file->relname, ".jp2")
-#endif
- || BLI_testextensie(file->relname, ".tga")
- || BLI_testextensie(file->relname, ".rgb")
- || BLI_testextensie(file->relname, ".rgba")
- || BLI_testextensie(file->relname, ".bmp")
- || BLI_testextensie(file->relname, ".png")
- || BLI_testextensie(file->relname, ".iff")
- || BLI_testextensie(file->relname, ".tif")
- || BLI_testextensie(file->relname, ".tiff")
- || BLI_testextensie(file->relname, ".hdr")
-#ifdef WITH_DDS
- || BLI_testextensie(file->relname, ".dds")
-#endif
-#ifdef WITH_OPENEXR
- || BLI_testextensie(file->relname, ".exr")
-#endif
- || BLI_testextensie(file->relname, ".lbm")
- || BLI_testextensie(file->relname, ".sgi")) {
- file->flags |= IMAGEFILE;
- }
- else if(BLI_testextensie(file->relname, ".avi")
- || BLI_testextensie(file->relname, ".flc")
- || BLI_testextensie(file->relname, ".mov")
- || BLI_testextensie(file->relname, ".movie")
- || BLI_testextensie(file->relname, ".mp4")
- || BLI_testextensie(file->relname, ".m4v")
- || BLI_testextensie(file->relname, ".mv")
- || BLI_testextensie(file->relname, ".wmv")
- || BLI_testextensie(file->relname, ".ogv")
- || BLI_testextensie(file->relname, ".mpeg")
- || BLI_testextensie(file->relname, ".mpg")
- || BLI_testextensie(file->relname, ".mpg2")
- || BLI_testextensie(file->relname, ".vob")
- || BLI_testextensie(file->relname, ".mkv")
- || BLI_testextensie(file->relname, ".flv")
- || BLI_testextensie(file->relname, ".divx")
- || BLI_testextensie(file->relname, ".xvid")) {
- file->flags |= MOVIEFILE;
- }
- else if(BLI_testextensie(file->relname, ".wav")
- || BLI_testextensie(file->relname, ".ogg")
- || BLI_testextensie(file->relname, ".oga")
- || BLI_testextensie(file->relname, ".mp3")
- || BLI_testextensie(file->relname, ".mp2")
- || BLI_testextensie(file->relname, ".ac3")
- || BLI_testextensie(file->relname, ".aac")
- || BLI_testextensie(file->relname, ".flac")
- || BLI_testextensie(file->relname, ".wma")
- || BLI_testextensie(file->relname, ".eac3")) {
- file->flags |= SOUNDFILE;
- }
+ } else if(BLI_testextensie_array(file->relname, imb_ext_movie)) {
+ file->flags |= MOVIEFILE;
+ } else if(BLI_testextensie_array(file->relname, imb_ext_audio)) {
+ file->flags |= SOUNDFILE;
}
}
}
@@ -1018,7 +882,7 @@ static int groupname_to_code(char *group)
if (lslash)
lslash[0]= '\0';
- return BLO_idcode_from_name(buf);
+ return BKE_idcode_from_name(buf);
}
void filelist_from_library(struct FileList* filelist)
@@ -1271,7 +1135,7 @@ static void thumbnail_joblist_free(ThumbnailJob *tj)
BLI_freelistN(&tj->loadimages);
}
-static void thumbnails_startjob(void *tjv, short *stop, short *do_update)
+static void thumbnails_startjob(void *tjv, short *stop, short *do_update, float *progress)
{
ThumbnailJob *tj= tjv;
FileImage* limg = tj->loadimages.first;
@@ -1282,7 +1146,9 @@ static void thumbnails_startjob(void *tjv, short *stop, short *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 & MOVIEFILE ) {
+ } 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 */
@@ -1336,9 +1202,9 @@ void thumbnails_start(struct FileList* filelist, const struct bContext* C)
tj->filelist = filelist;
for (idx = 0; idx < filelist->numfiles;idx++) {
if (!filelist->filelist[idx].image) {
- if ( (filelist->filelist[idx].flags & IMAGEFILE) || (filelist->filelist[idx].flags & MOVIEFILE) ) {
+ if ( (filelist->filelist[idx].flags & (IMAGEFILE|MOVIEFILE|BLENDERFILE)) ) {
FileImage* limg = MEM_callocN(sizeof(struct FileImage), "loadimage");
- BLI_join_dirfile(limg->path, filelist->dir, filelist->filelist[idx].relname);
+ BLI_strncpy(limg->path, filelist->filelist[idx].path, FILE_MAX);
limg->index= idx;
limg->flags= filelist->filelist[idx].flags;
BLI_addtail(&tj->loadimages, limg);
@@ -1349,10 +1215,10 @@ void thumbnails_start(struct FileList* filelist, const struct bContext* C)
BKE_reports_init(&tj->reports, RPT_PRINT);
/* setup job */
- steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), filelist, 0);
+ 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);
+ WM_jobs_callbacks(steve, thumbnails_startjob, NULL, thumbnails_update, NULL);
/* start the job */
WM_jobs_start(CTX_wm_manager(C), steve);
@@ -1360,5 +1226,10 @@ void thumbnails_start(struct FileList* filelist, const struct bContext* C)
void thumbnails_stop(struct FileList* filelist, const struct bContext* C)
{
- WM_jobs_kill(CTX_wm_manager(C), filelist);
+ 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 e75a3143817..b2a86b9c764 100644
--- a/source/blender/editors/space_file/filelist.h
+++ b/source/blender/editors/space_file/filelist.h
@@ -86,6 +86,7 @@ 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
}
diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c
index 7aed890e9ba..52d59270663 100644
--- a/source/blender/editors/space_file/filesel.c
+++ b/source/blender/editors/space_file/filesel.c
@@ -42,6 +42,15 @@
#include <sys/times.h>
#endif
+/* path/file handeling stuff */
+#ifndef WIN32
+ #include <dirent.h>
+ #include <unistd.h>
+#else
+ #include <io.h>
+ #include "BLI_winstuff.h"
+#endif
+
#include "DNA_space_types.h"
#include "DNA_screen_types.h"
#include "DNA_userdef_types.h"
@@ -53,10 +62,7 @@
#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"
@@ -67,8 +73,6 @@
#include "WM_api.h"
#include "WM_types.h"
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "RNA_access.h"
@@ -77,16 +81,10 @@
#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 <fnmatch.h>
+# include <fnmatch.h>
#endif
FileSelectParams* ED_fileselect_get_params(struct SpaceFile *sfile)
@@ -99,7 +97,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;
@@ -107,10 +104,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;
@@ -124,19 +118,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_path_abs(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;
@@ -160,8 +168,13 @@ short ED_fileselect_set_params(SpaceFile *sfile)
params->filter |= RNA_boolean_get(op->ptr, "filter_btx") ? BTXFILE : 0;
if(RNA_struct_find_property(op->ptr, "filter_collada"))
params->filter |= RNA_boolean_get(op->ptr, "filter_collada") ? COLLADAFILE : 0;
- if (params->filter != 0)
- params->flag |= FILE_FILTER;
+ 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;
@@ -189,6 +202,13 @@ short ED_fileselect_set_params(SpaceFile *sfile)
params->filter = 0;
params->sort = FILE_SORT_ALPHA;
}
+
+
+ /* initialize the list with previous folders */
+ if (!sfile->folders_prev)
+ sfile->folders_prev = folderlist_new();
+ folderlist_pushdir(sfile->folders_prev, sfile->params->dir);
+
return 1;
}
@@ -205,11 +225,11 @@ 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;
}
}
@@ -255,7 +275,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()
@@ -264,7 +284,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;
}
@@ -433,10 +453,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 */
@@ -447,19 +512,11 @@ void autocomplete_directory(struct bContext *C, char *str, void *arg_v)
for(i= 0; i<nentries; ++i) {
struct direntry* file = filelist_file(sfile->files, 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);
- }
}
}
diff --git a/source/blender/editors/space_file/fsmenu.c b/source/blender/editors/space_file/fsmenu.c
index d3e859602d7..8211257da02 100644
--- a/source/blender/editors/space_file/fsmenu.c
+++ b/source/blender/editors/space_file/fsmenu.c
@@ -55,7 +55,6 @@
#define ID ID_
#include <CoreServices/CoreServices.h>
-#include "BKE_utildefines.h"
#endif
#ifdef __linux__
@@ -248,12 +247,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 +294,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;
@@ -309,7 +337,7 @@ void fsmenu_read_file(struct FSMenu* fsmenu, const char *filename)
/* As 10.4 doesn't provide proper API to retrieve the favorite places,
assume they are the standard ones
TODO : replace hardcoded paths with proper BLI_get_folder calls */
- home = BLI_gethome();
+ home = getenv("HOME");
if(home) {
BLI_snprintf(line, 256, "%s/", home);
fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, line, 1, 0);
@@ -429,15 +457,14 @@ void fsmenu_read_file(struct FSMenu* fsmenu, const char *filename)
#else
/* unix */
{
- char dir[FILE_MAXDIR];
- char *home= BLI_gethome();
+ char *home= getenv("HOME");
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 +473,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 +487,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 +508,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 8304b104a4f..dcf8d3eb632 100644
--- a/source/blender/editors/space_file/fsmenu.h
+++ b/source/blender/editors/space_file/fsmenu.h
@@ -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 6cef78d4bee..7b9423332f2 100644
--- a/source/blender/editors/space_file/space_file.c
+++ b/source/blender/editors/space_file/space_file.c
@@ -43,7 +43,6 @@
#include "BLI_rand.h"
#include "BLI_storage_types.h"
-#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -195,13 +194,35 @@ static void file_refresh(const bContext *C, ScrArea *sa)
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);
- thumbnails_start(sfile->files, C);
+ 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 {
- filelist_filter(sfile->files);
+ 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);
@@ -211,6 +232,7 @@ static void file_refresh(const bContext *C, ScrArea *sa)
file->flags |= EDITING;
}
}
+ BLI_strncpy(sfile->params->renameedit, sfile->params->renamefile, sizeof(sfile->params->renameedit));
params->renamefile[0] = '\0';
}
if (sfile->layout) sfile->layout->dirty= 1;
@@ -353,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 */
@@ -370,6 +393,7 @@ 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_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);
@@ -377,6 +401,9 @@ 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);
@@ -395,6 +422,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);
@@ -439,7 +467,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)
@@ -556,9 +589,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 ade0b7db0ca..b69bfdc0231 100644
--- a/source/blender/editors/space_file/writeimage.c
+++ b/source/blender/editors/space_file/writeimage.c
@@ -29,7 +29,6 @@
#include <string.h>
-#include "MEM_guardedalloc.h"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -43,17 +42,16 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_image.h"
-#include "BKE_utildefines.h"
#include "RE_pipeline.h"
#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 */
@@ -125,9 +123,11 @@ static void save_rendered_image_cb_real(char *name, int confirm)
void save_image_filesel_str(Scene *scene, char *str)
{
switch(scene->r.imtype) {
+#ifdef WITH_HDR
case R_RADHDR:
strcpy(str, "Save Radiance HDR");
break;
+#endif
case R_FFMPEG:
case R_H264:
case R_XVID:
@@ -143,21 +143,24 @@ 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");
break;
#endif
+#ifdef WITH_CINEON
case R_CINEON:
strcpy(str, "Save Cineon");
break;
case R_DPX:
strcpy(str, "Save DPX");
break;
+#endif
case R_RAWTGA:
strcpy(str, "Save Raw Targa");
break;
@@ -167,9 +170,6 @@ void save_image_filesel_str(Scene *scene, char *str)
case R_IRIZ:
strcpy(str, "Save IRIS");
break;
- case R_HAMX:
- strcpy(str, "Save HAMX");
- break;
case R_TARGA:
strcpy(str, "Save Targa");
break;
@@ -183,7 +183,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:
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/Makefile b/source/blender/editors/space_graph/Makefile
index 65cdf1a3ffb..1ac744af239 100644
--- a/source/blender/editors/space_graph/Makefile
+++ b/source/blender/editors/space_graph/Makefile
@@ -17,7 +17,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) 2007 Blender Foundation
# All rights reserved.
@@ -37,6 +37,8 @@ include nan_compile.mk
CFLAGS += $(LEVEL_1_C_WARNINGS)
+CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
+
CPPFLAGS += -I$(NAN_GLEW)/include
CPPFLAGS += -I$(OPENGL_HEADERS)
CPPFLAGS += -I$(NAN_AUDASPACE)/include
diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c
index 5751fb0300e..14f684dd9e3 100644
--- a/source/blender/editors/space_graph/graph_buttons.c
+++ b/source/blender/editors/space_graph/graph_buttons.c
@@ -42,21 +42,12 @@
#include "BLI_editVert.h"
#include "BLI_rand.h"
-#include "BKE_action.h"
-#include "BKE_animsys.h"
#include "BKE_context.h"
-#include "BKE_curve.h"
-#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
#include "BKE_fcurve.h"
-#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_object.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"
@@ -159,7 +150,7 @@ static void graph_panel_view(const bContext *C, Panel *pa)
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, &spaceptr, "cursor_value", 0, "Cursor Y", 0);
+ uiItemR(row, &spaceptr, "cursor_position_y", 0, "Cursor Y", 0);
uiItemEnumO(row, "GRAPH_OT_snap", "To Keys", 0, "type", GRAPHKEYS_SNAP_VALUE);
}
@@ -208,11 +199,88 @@ static void graph_panel_properties(const bContext *C, Panel *pa)
uiLayoutSetEnabled(subrow, (fcu->color_mode==FCURVE_COLOR_CUSTOM));
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, "handle_left", 0, NULL, 0);
+
+ /* next handle - only if current is Bezier interpolation */
+ if (bezt->ipo == BEZT_IPO_BEZ)
+ uiItemR(col, &bezt_ptr, "handle_right", 0, NULL, 0);
+ }
+ else
+ uiItemL(layout, "No active keyframe on F-Curve", 0);
+
MEM_freeN(ale);
}
@@ -222,16 +290,17 @@ static void graph_panel_properties(const bContext *C, Panel *pa)
static void do_graph_region_driver_buttons(bContext *C, void *arg, int event)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
switch (event) {
case B_IPO_DEPCHANGE:
{
/* rebuild depsgraph for the new deps */
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
/* force an update of depsgraph */
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 0);
}
break;
}
@@ -388,7 +457,7 @@ static void graph_panel_driverVar__locDiff(const bContext *C, uiLayout *layout,
uiItemPointerR(col, &dtar_ptr, "bone_target", &tar_ptr, "bones", "", ICON_BONE_DATA);
}
- uiItemR(col, &dtar_ptr, "use_local_space_transforms", 0, NULL, 0);
+ uiItemR(col, &dtar_ptr, "use_local_space_transform", 0, NULL, 0);
col= uiLayoutColumn(layout, 1);
uiTemplateAnyID(col, (bContext *)C, &dtar2_ptr, "id", "id_type", "Ob/Bone 2:");
@@ -400,7 +469,7 @@ static void graph_panel_driverVar__locDiff(const bContext *C, uiLayout *layout,
uiItemPointerR(col, &dtar2_ptr, "bone_target", &tar_ptr, "bones", "", ICON_BONE_DATA);
}
- uiItemR(col, &dtar2_ptr, "use_local_space_transforms", 0, NULL, 0);
+ uiItemR(col, &dtar2_ptr, "use_local_space_transform", 0, NULL, 0);
}
/* settings for 'transform channel' driver variable type */
@@ -427,7 +496,7 @@ static void graph_panel_driverVar__transChan(const bContext *C, uiLayout *layout
row= uiLayoutRow(layout, 1);
uiItemR(row, &dtar_ptr, "transform_type", 0, "", 0);
- uiItemR(row, &dtar_ptr, "use_local_space_transforms", 0, NULL, 0);
+ uiItemR(row, &dtar_ptr, "use_local_space_transform", 0, NULL, 0);
}
/* driver settings for active F-Curve (only for 'Drivers' mode) */
@@ -631,6 +700,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");
@@ -639,6 +709,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 7f44df24a6e..f780a6c31ee 100644
--- a/source/blender/editors/space_graph/graph_draw.c
+++ b/source/blender/editors/space_graph/graph_draw.c
@@ -29,17 +29,12 @@
#include <string.h>
#include <float.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#ifndef _WIN32
#include <unistd.h>
#else
#include <io.h>
#endif
-#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
@@ -50,15 +45,9 @@
#include "DNA_space_types.h"
#include "DNA_windowmanager_types.h"
-#include "BKE_animsys.h"
#include "BKE_context.h"
#include "BKE_curve.h"
-#include "BKE_depsgraph.h"
#include "BKE_fcurve.h"
-#include "BKE_global.h"
-#include "BKE_key.h"
-#include "BKE_object.h"
-#include "BKE_screen.h"
#include "BKE_utildefines.h"
#include "BIF_gl.h"
@@ -506,7 +495,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;
@@ -526,11 +523,9 @@ static void draw_fcurve_curve (bAnimContext *ac, ID *id, FCurve *fcu, SpaceIpo *
* 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;
+ samplefreq= dx / U.v2d_min_gridsize;
if (samplefreq < 0.00001f) samplefreq= 0.00001f;
diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c
index 66eb8d8d546..5c692ba1112 100644
--- a/source/blender/editors/space_graph/graph_edit.c
+++ b/source/blender/editors/space_graph/graph_edit.c
@@ -32,10 +32,6 @@
#include <string.h>
#include <float.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "AUD_C-API.h"
#include "MEM_guardedalloc.h"
@@ -51,16 +47,10 @@
#include "RNA_define.h"
#include "RNA_enum_types.h"
-#include "BKE_action.h"
-#include "BKE_depsgraph.h"
#include "BKE_fcurve.h"
-#include "BKE_key.h"
-#include "BKE_material.h"
#include "BKE_nla.h"
-#include "BKE_object.h"
#include "BKE_context.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
#include "UI_interface.h"
#include "UI_view2d.h"
@@ -90,7 +80,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 */
@@ -262,7 +252,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 */
@@ -421,7 +411,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);
@@ -460,8 +450,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");
@@ -473,7 +461,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;
}
@@ -537,7 +525,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;
@@ -603,7 +591,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 */
@@ -621,7 +609,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 */
@@ -688,7 +676,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;
}
@@ -717,7 +705,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 */
@@ -746,7 +734,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;
}
@@ -789,7 +777,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 */
@@ -826,7 +814,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;
}
@@ -856,7 +844,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 */
@@ -888,7 +876,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;
}
@@ -923,7 +911,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 */
@@ -971,7 +959,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;
}
@@ -1043,7 +1031,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 */
@@ -1055,7 +1043,7 @@ static int graphkeys_sound_bake_exec(bContext *C, wmOperator *op)
RNA_float_get(op->ptr, "release"),
RNA_float_get(op->ptr, "threshold"),
RNA_boolean_get(op->ptr, "accumulate"),
- RNA_boolean_get(op->ptr, "additive"),
+ RNA_boolean_get(op->ptr, "use_additive"),
RNA_boolean_get(op->ptr, "square"),
RNA_float_get(op->ptr, "sthreshold"),
FPS, &sbi.length);
@@ -1070,7 +1058,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 */
@@ -1091,7 +1079,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;
}
@@ -1123,14 +1111,14 @@ 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);
RNA_def_float(ot->srna, "release", 0.2, 0.0, 5.0, "Release time", "", 0.01, 0.2);
RNA_def_float(ot->srna, "threshold", 0.0, 0.0, 1.0, "Threshold", "", 0.01, 0.1);
RNA_def_boolean(ot->srna, "accumulate", 0, "Accumulate", "");
- RNA_def_boolean(ot->srna, "additive", 0, "Additive", "");
+ RNA_def_boolean(ot->srna, "use_additive", 0, "Additive", "");
RNA_def_boolean(ot->srna, "square", 0, "Square", "");
RNA_def_float(ot->srna, "sthreshold", 0.1, 0.0, 1.0, "Square Threshold", "", 0.01, 0.1);
}
@@ -1148,7 +1136,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 */
@@ -1176,7 +1164,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;
}
@@ -1217,7 +1205,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 */
@@ -1286,7 +1274,7 @@ static void setipo_graph_keys(bAnimContext *ac, short 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
@@ -1368,7 +1356,7 @@ static void sethandles_graph_keys(bAnimContext *ac, short 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
@@ -1479,7 +1467,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) {
@@ -1558,7 +1546,7 @@ static int graphkeys_framejump_exec(bContext *C, wmOperator *op)
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) {
@@ -1588,6 +1576,7 @@ static int graphkeys_framejump_exec(bContext *C, wmOperator *op)
/* take the average values, rounding to the nearest int for the current frame */
CFRA= (int)floor((ked.f1 / ked.i1) + 0.5f);
+ SUBFRA= 0.f;
sipo->cursorVal= ked.f2 / (float)ked.i1;
}
@@ -1636,7 +1625,7 @@ static void snap_graph_keys(bAnimContext *ac, short mode)
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 */
@@ -1696,7 +1685,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;
}
@@ -1774,7 +1763,7 @@ static void mirror_graph_keys(bAnimContext *ac, short 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);
/* mirror keyframes */
@@ -1820,7 +1809,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;
}
@@ -1858,7 +1847,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 */
@@ -1875,7 +1864,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;
}
@@ -1949,7 +1938,7 @@ 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
@@ -2092,7 +2081,7 @@ static int graph_fmodifier_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;
}
diff --git a/source/blender/editors/space_graph/graph_ops.c b/source/blender/editors/space_graph/graph_ops.c
index d3d2743200b..0069e6e0675 100644
--- a/source/blender/editors/space_graph/graph_ops.c
+++ b/source/blender/editors/space_graph/graph_ops.c
@@ -29,7 +29,6 @@
#include <stdlib.h>
#include <math.h>
-#include "MEM_guardedalloc.h"
#include "DNA_scene_types.h"
@@ -37,7 +36,6 @@
#include "BKE_context.h"
#include "BKE_sound.h"
-#include "BKE_utildefines.h"
#include "UI_view2d.h"
@@ -71,6 +69,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 */
@@ -173,7 +172,7 @@ void GRAPH_OT_cursor_set(wmOperatorType *ot)
ot->poll= ED_operator_ipo_active;
/* flags */
- ot->flag= OPTYPE_BLOCKING;
+ ot->flag= OPTYPE_BLOCKING|OPTYPE_UNDO;
/* rna */
RNA_def_int(ot->srna, "frame", 0, MINAFRAME, MAXFRAME, "Frame", "", MINAFRAME, MAXFRAME);
diff --git a/source/blender/editors/space_graph/graph_select.c b/source/blender/editors/space_graph/graph_select.c
index a81de25f265..cdc8166f2d6 100644
--- a/source/blender/editors/space_graph/graph_select.c
+++ b/source/blender/editors/space_graph/graph_select.c
@@ -29,10 +29,6 @@
#include <string.h>
#include <float.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
@@ -47,15 +43,9 @@
#include "RNA_access.h"
#include "RNA_define.h"
-#include "BKE_action.h"
-#include "BKE_depsgraph.h"
#include "BKE_fcurve.h"
-#include "BKE_key.h"
-#include "BKE_material.h"
#include "BKE_nla.h"
-#include "BKE_object.h"
#include "BKE_context.h"
-#include "BKE_utildefines.h"
#include "UI_view2d.h"
@@ -99,7 +89,7 @@ static void deselect_graph_keys (bAnimContext *ac, short test, short sel)
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);
@@ -164,7 +154,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;
}
@@ -217,7 +207,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 */
@@ -333,7 +323,7 @@ static int graphkeys_borderselect_exec(bContext *C, wmOperator *op)
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;
}
@@ -406,7 +396,7 @@ static void markers_selectkeys_between (bAnimContext *ac)
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 */
@@ -446,7 +436,7 @@ static void columnselect_graph_keys (bAnimContext *ac, short mode)
/* 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)
@@ -478,7 +468,7 @@ 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) {
@@ -524,7 +514,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;
}
@@ -565,7 +555,7 @@ static int graphkeys_select_linked_exec (bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
/* 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) {
@@ -582,7 +572,7 @@ static int graphkeys_select_linked_exec (bContext *C, wmOperator *op)
BLI_freelistN(&anim_data);
/* 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;
}
@@ -620,7 +610,7 @@ static void select_moreless_graph_keys (bAnimContext *ac, short mode)
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) {
@@ -660,7 +650,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;
}
@@ -694,7 +684,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;
}
@@ -784,7 +774,7 @@ static void nearest_fcurve_vert_store (ListBase *matches, View2D *v2d, FCurve *f
* needed to access the relevant vertex coordinates in the 3x3
* 'vec' matrix
*/
- UI_view2d_to_region_no_clip(v2d, bezt->vec[hpoint+1][0], bezt->vec[hpoint+1][1], &screen_co[0], &screen_co[1]);
+ 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...
@@ -838,7 +828,7 @@ static void get_nearest_fcurve_verts_list (bAnimContext *ac, int mval[2], ListBa
* - 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);
@@ -1059,7 +1049,7 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short select_mode, s
/* set active F-Curve (NOTE: sync the filter flags with findnearest_fcurve_vert) */
if (nvi->fcu->flag & FCURVE_SELECTED) {
- int filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY);
+ int filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, nvi->fcu, ANIMTYPE_FCURVE);
}
}
@@ -1111,7 +1101,7 @@ static void graphkeys_mselect_leftright (bAnimContext *ac, short leftright, shor
}
/* 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 */
@@ -1184,7 +1174,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) {
@@ -1264,7 +1254,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 ad96370e4fa..927149a268d 100644
--- a/source/blender/editors/space_graph/graph_utils.c
+++ b/source/blender/editors/space_graph/graph_utils.c
@@ -42,20 +42,9 @@
#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_scene.h"
-#include "BKE_screen.h"
-#include "BKE_utildefines.h"
-#include "BIF_gl.h"
#include "WM_api.h"
diff --git a/source/blender/editors/space_graph/space_graph.c b/source/blender/editors/space_graph/space_graph.c
index 2c66cb51fba..ca372d74da6 100644
--- a/source/blender/editors/space_graph/space_graph.c
+++ b/source/blender/editors/space_graph/space_graph.c
@@ -43,7 +43,6 @@
#include "BKE_main.h"
#include "BKE_fcurve.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "ED_screen.h"
#include "ED_anim_api.h"
@@ -382,9 +381,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:
@@ -401,13 +403,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;
}
@@ -432,7 +430,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);
@@ -521,7 +519,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..f644338d39d
--- /dev/null
+++ b/source/blender/editors/space_image/CMakeLists.txt
@@ -0,0 +1,53 @@
+# $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
+ ../../render/extern/include
+ ../../windowmanager
+)
+
+IF(WITH_IMAGE_OPENEXR)
+ ADD_DEFINITIONS(-DWITH_OPENEXR)
+ENDIF(WITH_IMAGE_OPENEXR)
+
+IF(WITH_IMAGE_TIFF)
+ ADD_DEFINITIONS(-DWITH_TIFF)
+ENDIF(WITH_IMAGE_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 af15b1d9724..773a6920961 100644
--- a/source/blender/editors/space_image/Makefile
+++ b/source/blender/editors/space_image/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) 2007 Blender Foundation
# All rights reserved.
@@ -57,3 +57,20 @@ ifeq ($(WITH_OPENEXR), true)
CPPFLAGS += -DWITH_OPENEXR
endif
+ifeq ($(WITH_TIFF), true)
+ CPPFLAGS += -DWITH_TIFF
+endif
+
+ifeq ($(WITH_LCMS), true)
+ CPPFLAGS += -DWITH_LCMS
+ CPPFLAGS += -I$(BF_LCMS_INC)
+endif
+
+ifeq ($(WITH_CINEON), true)
+ CPPFLAGS += -DWITH_CINEON
+endif
+
+ifeq ($(WITH_HDR), true)
+ CPPFLAGS += -DWITH_HDR
+endif
+
diff --git a/source/blender/editors/space_image/SConscript b/source/blender/editors/space_image/SConscript
index dd43559645d..4e1918bc327 100644
--- a/source/blender/editors/space_image/SConscript
+++ b/source/blender/editors/space_image/SConscript
@@ -11,8 +11,11 @@ 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']
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c
index aa3a0f58fa9..9871b75fa42 100644
--- a/source/blender/editors/space_image/image_buttons.c
+++ b/source/blender/editors/space_image/image_buttons.c
@@ -45,15 +45,9 @@
#include "BKE_context.h"
#include "BKE_customdata.h"
#include "BKE_image.h"
-#include "BKE_global.h"
-#include "BKE_library.h"
-#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_node.h"
-#include "BKE_packedFile.h"
-#include "BKE_paint.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "RE_pipeline.h"
@@ -65,8 +59,6 @@
#include "ED_screen.h"
#include "ED_uvedit.h"
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "RNA_access.h"
@@ -101,11 +93,6 @@
#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);
@@ -203,7 +190,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);
static float ocent[2];
float cent[2]= {0.0, 0.0};
@@ -218,24 +207,24 @@ static void image_editvertex_buts(const bContext *C, uiBlock *block)
em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
for (efa= em->faces.first; efa; efa= efa->next) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (simaFaceDraw_Check(efa, tf)) {
+ if (uvedit_face_visible(scene, ima, efa, tf)) {
- if (simaUVSel_Check(efa, tf, 0)) {
+ if (uvedit_uv_selected(scene, efa, tf, 0)) {
cent[0]+= tf->uv[0][0];
cent[1]+= tf->uv[0][1];
nactive++;
}
- if (simaUVSel_Check(efa, tf, 1)) {
+ if (uvedit_uv_selected(scene, efa, tf, 1)) {
cent[0]+= tf->uv[1][0];
cent[1]+= tf->uv[1][1];
nactive++;
}
- if (simaUVSel_Check(efa, tf, 2)) {
+ if (uvedit_uv_selected(scene, efa, tf, 2)) {
cent[0]+= tf->uv[2][0];
cent[1]+= tf->uv[2][1];
nactive++;
}
- if (efa->v4 && simaUVSel_Check(efa, tf, 3)) {
+ if (efa->v4 && uvedit_uv_selected(scene, efa, tf, 3)) {
cent[0]+= tf->uv[3][0];
cent[1]+= tf->uv[3][1];
nactive++;
@@ -282,20 +271,20 @@ static void image_editvertex_buts(const bContext *C, uiBlock *block)
for (efa= em->faces.first; efa; efa= efa->next) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (simaFaceDraw_Check(efa, tf)) {
- if (simaUVSel_Check(efa, tf, 0)) {
+ if (uvedit_face_visible(scene, ima, efa, tf)) {
+ if (uvedit_uv_selected(scene, efa, tf, 0)) {
tf->uv[0][0]+= delta[0];
tf->uv[0][1]+= delta[1];
}
- if (simaUVSel_Check(efa, tf, 1)) {
+ if (uvedit_uv_selected(scene, efa, tf, 1)) {
tf->uv[1][0]+= delta[0];
tf->uv[1][1]+= delta[1];
}
- if (simaUVSel_Check(efa, tf, 2)) {
+ if (uvedit_uv_selected(scene, efa, tf, 2)) {
tf->uv[2][0]+= delta[0];
tf->uv[2][1]+= delta[1];
}
- if (efa->v4 && simaUVSel_Check(efa, tf, 3)) {
+ if (efa->v4 && uvedit_uv_selected(scene, efa, tf, 3)) {
tf->uv[3][0]+= delta[0];
tf->uv[3][1]+= delta[1];
}
@@ -777,7 +766,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
prop= RNA_struct_find_property(ptr, propname);
if(!prop) {
- printf("uiTemplateImage: property not found: %s\n", propname);
+ printf("uiTemplateImage: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -844,7 +833,17 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
if(ima->source != IMA_SRC_GENERATED) {
row= uiLayoutRow(layout, 1);
- uiItemR(row, &imaptr, "filename", 0, "", 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");
}
@@ -879,14 +878,13 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
split= uiLayoutSplit(layout, 0, 0);
col= uiLayoutColumn(split, 0);
- uiItemR(col, &imaptr, "fields", 0, NULL, 0);
+ uiItemR(col, &imaptr, "use_fields", 0, NULL, 0);
row= uiLayoutRow(col, 0);
uiItemR(row, &imaptr, "field_order", UI_ITEM_R_EXPAND, NULL, 0);
- uiLayoutSetActive(row, RNA_boolean_get(&imaptr, "fields"));
+ uiLayoutSetActive(row, RNA_boolean_get(&imaptr, "use_fields"));
col= uiLayoutColumn(split, 0);
- uiItemR(col, &imaptr, "antialias", 0, NULL, 0);
- uiItemR(col, &imaptr, "premultiply", 0, NULL, 0);
+ uiItemR(col, &imaptr, "use_premultiply", 0, NULL, 0);
}
}
@@ -899,20 +897,20 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
sprintf(str, "(%d) Frames", iuser->framenr);
row= uiLayoutRow(col, 1);
- uiItemR(col, userptr, "frames", 0, str, 0);
+ uiItemR(col, userptr, "frame_duration", 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, userptr, "frame_start", 0, "Start", 0);
- uiItemR(col, userptr, "offset", 0, NULL, 0);
+ uiItemR(col, userptr, "frame_offset", 0, NULL, 0);
col= uiLayoutColumn(split, 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);
+ uiItemR(col, userptr, "use_auto_refresh", 0, NULL, 0);
+ uiItemR(col, userptr, "use_cyclic", 0, NULL, 0);
}
else if(ima->source==IMA_SRC_GENERATED) {
split= uiLayoutSplit(layout, 0, 0);
diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c
index bcd37d97dcf..6a77d4da067 100644
--- a/source/blender/editors/space_image/image_draw.c
+++ b/source/blender/editors/space_image/image_draw.c
@@ -36,6 +36,7 @@
#include "DNA_space_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
+#include "DNA_brush_types.h"
#include "PIL_time.h"
#include "BLI_threads.h"
@@ -44,11 +45,9 @@
#include "IMB_imbuf_types.h"
#include "BKE_context.h"
-#include "BKE_colortools.h"
#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_paint.h"
-#include "BKE_utildefines.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -215,7 +214,7 @@ static void draw_image_grid(ARegion *ar, float zoomx, float zoomy)
glEnd();
}
-static void sima_draw_alpha_backdrop(float x1, float y1, float xsize, float ysize, float zoomx, float zoomy)
+static void sima_draw_alpha_backdrop(float x1, float y1, float xsize, float ysize, float zoomx, float zoomy, unsigned char col1[3], unsigned char col2[3])
{
GLubyte checker_stipple[32*32/8] =
{
@@ -229,9 +228,9 @@ static void sima_draw_alpha_backdrop(float x1, float y1, float xsize, float ysiz
0,0,255,255,0,0,255,255,0,0,255,255,0,0,255,255, \
};
- glColor3ub(100, 100, 100);
+ glColor3ubv(col1);
glRectf(x1, y1, x1 + zoomx*xsize, y1 + zoomy*ysize);
- glColor3ub(160, 160, 160);
+ glColor3ubv(col2);
glEnable(GL_POLYGON_STIPPLE);
glPolygonStipple(checker_stipple);
@@ -271,11 +270,16 @@ static void sima_draw_alpha_pixelsf(float x1, float y1, int rectx, int recty, fl
}
#ifdef WITH_LCMS
-static void sima_draw_colorcorrected_pixels(float x1, float y1, ImBuf *ibuf)
+static int sima_draw_colorcorrected_pixels(float x1, float y1, ImBuf *ibuf)
{
colorcorrection_do_ibuf(ibuf, "MONOSCNR.ICM"); /* path is hardcoded here, find some place better */
-
- glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->crect);
+
+ if(ibuf->crect) {
+ glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->crect);
+ return 1;
+ }
+
+ return 0;
}
#endif
@@ -361,13 +365,17 @@ static void draw_image_buffer(SpaceImage *sima, ARegion *ar, Scene *scene, Image
else if(sima->flag & SI_COLOR_CORRECTION) {
image_verify_buffer_float(sima, ima, ibuf, color_manage);
- sima_draw_colorcorrected_pixels(x, y, ibuf);
+ if(sima_draw_colorcorrected_pixels(x, y, ibuf)==0) {
+ unsigned char col1[3]= {100, 0, 100}, col2[3]= {160, 0, 160}; /* pink says 'warning' in blender land */
+ sima_draw_alpha_backdrop(x, y, ibuf->x, ibuf->y, zoomx, zoomy, col1, col2);
+ }
}
#endif
else {
if(sima->flag & SI_USE_ALPHA) {
- sima_draw_alpha_backdrop(x, y, ibuf->x, ibuf->y, zoomx, zoomy);
+ unsigned char col1[3]= {100, 100, 100}, col2[3]= {160, 160, 160};
+ sima_draw_alpha_backdrop(x, y, ibuf->x, ibuf->y, zoomx, zoomy, col1, col2);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
@@ -496,7 +504,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);
}
}
@@ -521,7 +529,7 @@ static void draw_image_view_tool(Scene *scene)
if(draw) {
getmouseco_areawin(mval);
- radius= brush->size*G.sima->zoom/2;
+ radius= brush_size(brush)*G.sima->zoom;
fdrawXORcirc(mval[0], mval[1], radius);
if (brush->innerradius != 1.0) {
diff --git a/source/blender/editors/space_image/image_header.c b/source/blender/editors/space_image/image_header.c
index 25208b61c28..7ecb2565e72 100644
--- a/source/blender/editors/space_image/image_header.c
+++ b/source/blender/editors/space_image/image_header.c
@@ -33,25 +33,17 @@
#include "DNA_space_types.h"
#include "DNA_windowmanager_types.h"
-#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BKE_context.h"
-#include "BKE_customdata.h"
-#include "BKE_image.h"
-#include "BKE_mesh.h"
-#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "ED_image.h"
#include "WM_types.h"
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "UI_interface.h"
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index c9daeb09f25..314d5dd9043 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -25,12 +25,15 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stddef.h>
#include <string.h>
#include <stdlib.h>
+#include <errno.h>
#include "MEM_guardedalloc.h"
#include "DNA_object_types.h"
+#include "DNA_node_types.h"
#include "DNA_packedFile_types.h"
#include "DNA_scene_types.h"
@@ -38,7 +41,6 @@
#include "BKE_context.h"
#include "BKE_image.h"
#include "BKE_global.h"
-#include "BKE_image.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_node.h"
@@ -103,12 +105,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)
@@ -119,14 +123,19 @@ 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;
- int poll;
-
+ int poll= 0;
+ char name[FILE_MAX];
+
ibuf= ED_space_image_acquire_buffer(sima, &lock);
- poll= (ibuf && BLI_exists(ibuf->name) && BLI_is_writable(ibuf->name));
+ if(ibuf) {
+ BLI_strncpy(name, ibuf->name, FILE_MAX);
+ BLI_path_abs(name, G.sce);
+ poll= (BLI_exists(name) && BLI_is_writable(name));
+ }
ED_space_image_release_buffer(sima, lock);
return poll;
@@ -134,6 +143,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)
{
@@ -177,7 +193,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));
@@ -193,7 +209,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
@@ -309,7 +325,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));
@@ -323,7 +339,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
@@ -347,7 +363,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;
}
@@ -369,7 +385,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:
@@ -452,7 +468,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;
}
@@ -504,11 +520,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 */
@@ -517,7 +538,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 *********************/
@@ -529,7 +550,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;
}
@@ -552,7 +573,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;
}
@@ -590,7 +611,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;
}
@@ -623,11 +644,16 @@ 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
+#ifdef WITH_DDS
{R_RADHDR, "RADIANCE_HDR", 0, "Radiance HDR", ""},
+#endif
+#ifdef WITH_CINEON
{R_CINEON, "CINEON", 0, "Cineon", ""},
{R_DPX, "DPX", 0, "DPX", ""},
+#endif
#ifdef WITH_OPENEXR
{R_OPENEXR, "OPENEXR", 0, "OpenEXR", ""},
/* saving sequences of multilayer won't work, they copy buffers */
@@ -639,7 +665,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);
}
@@ -670,12 +696,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;
}
@@ -709,12 +739,27 @@ static int open_exec(bContext *C, wmOperator *op)
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;
+ char *path=U.textudir;
+ Image *ima= NULL;
+
+ if(sima) {
+ ima= sima->image;
+ }
+
+ if (ima==NULL) {
+ Tex *tex= CTX_data_pointer_get_type(C, "texture", &RNA_Texture).data;
+ if(tex && tex->type==TEX_IMAGE)
+ ima= tex->ima;
+ }
+
+ if(ima)
+ path= ima->name;
+
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, "path"))
+ if(RNA_property_is_set(op->ptr, "filepath"))
return open_exec(C, op);
open_init(C, op);
@@ -739,9 +784,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);
-
- RNA_def_boolean(ot->srna, "relative_path", 0, "Relative Path", "Load image with relative path to current .blend file");
+ WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE|MOVIEFILE, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_FILEPATH|WM_FILESEL_RELPATH);
}
/******************** replace image operator ********************/
@@ -754,7 +797,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);
@@ -766,15 +809,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;
}
@@ -794,7 +839,7 @@ 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 ********************/
@@ -809,6 +854,8 @@ static void save_image_doit(bContext *C, SpaceImage *sima, Scene *scene, wmOpera
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) {
@@ -831,54 +878,55 @@ static void save_image_doit(bContext *C, SpaceImage *sima, Scene *scene, wmOpera
if(relative)
BLI_path_rel(path, G.sce); /* only after saving */
- 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;
-
+ 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, path, sima->imtypenr, scene->r.subimtype, scene->r.quality)) {
- char *name;
if(relative)
BLI_path_rel(path, G.sce); /* only after saving */
- 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 = BLI_last_slash(path);
+ if(!save_copy) {
- /* name image as how we saved it */
- rename_id(&ima->id, name ? name + 1 : path);
+ 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));
+ }
}
else
BKE_reportf(op->reports, RPT_ERROR, "Couldn't write image: %s", path);
@@ -902,7 +950,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);
@@ -920,7 +968,7 @@ static int save_as_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, "path"))
+ if(RNA_property_is_set(op->ptr, "filepath"))
return save_as_exec(C, op);
if(!ima)
@@ -944,7 +992,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);
@@ -967,16 +1020,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, "relative_path", 0, "Relative Path", "Save image with relative path to current .blend file");
+ RNA_def_boolean(ot->srna, "copy", 0, "Copy", "Create a new image file without modifying the current image in blender");
}
/******************** save image operator ********************/
@@ -1001,6 +1054,8 @@ static int save_exec(bContext *C, wmOperator *op)
BLI_strncpy(name, ibuf->name, FILE_MAX);
if(name[0]==0)
BLI_strncpy(name, G.ima, FILE_MAX);
+ else
+ BLI_path_abs(name, G.sce);
if(BLI_exists(name) && BLI_is_writable(name)) {
rr= BKE_image_acquire_renderresult(scene, ima);
@@ -1109,7 +1164,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;
@@ -1129,7 +1184,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;
}
@@ -1142,7 +1196,6 @@ void IMAGE_OT_reload(wmOperatorType *ot)
/* api callbacks */
ot->exec= reload_exec;
- ot->poll= image_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1160,7 +1213,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);
@@ -1173,12 +1226,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;
@@ -1206,6 +1262,9 @@ static int new_exec(bContext *C, wmOperator *op)
void IMAGE_OT_new(wmOperatorType *ot)
{
+ PropertyRNA *prop;
+ static float default_color[4]= {0.0f, 0.0f, 0.0f, 1.0f};
+
/* identifiers */
ot->name= "New";
ot->idname= "IMAGE_OT_new";
@@ -1221,8 +1280,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.");
}
@@ -1266,6 +1326,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;
}
@@ -1296,12 +1358,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;
@@ -1312,12 +1374,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);
@@ -1332,17 +1396,33 @@ void unpack_menu(bContext *C, char *opname, char *abs_name, char *folder, Packed
switch(checkPackedFile(local_name, pf)) {
case PF_NOFILE:
sprintf(line, "Create %s", local_name);
- 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;
case PF_EQUAL:
sprintf(line, "Use %s (identical)", local_name);
- uiItemEnumO(layout, opname, line, 0, "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, opname, line, 0, "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, opname, line, 0, "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;
}
}
@@ -1350,17 +1430,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, opname, line, 0, "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, opname, line, 0, "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, opname, line, 0, "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, opname, line, 0, "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;
}
@@ -1372,6 +1465,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;
@@ -1382,8 +1483,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;
}
@@ -1392,6 +1495,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;
@@ -1403,7 +1509,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;
}
@@ -1412,18 +1518,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 ********************/
@@ -1638,6 +1745,7 @@ 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");
@@ -1652,6 +1760,7 @@ static int sample_line_exec(bContext *C, wmOperator *op)
int x1, y1, x2, y2;
int i, x, y;
float *fp;
+ float rgb[3];
unsigned char *cp;
if (ibuf == NULL) {
@@ -1681,23 +1790,30 @@ static int sample_line_exec(bContext *C, wmOperator *op)
y= (int)(0.5f + y1 + (float)i*(y2-y1)/255.0f);
if (x<0 || y<0 || x>=ibuf->x || y>=ibuf->y) {
- hist->data_r[i] = hist->data_g[i]= hist->data_b[i] = 0.0f;
+ 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));
- hist->data_r[i] = fp[0];
- hist->data_g[i] = fp[1];
- hist->data_b[i] = fp[2];
+
+ 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;
}
}
}
- hist->ok=1;
ED_space_image_release_buffer(sima, lock);
@@ -1906,7 +2022,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 *********************/
@@ -1962,8 +2078,10 @@ void IMAGE_OT_cycle_render_slot(wmOperatorType *ot)
void ED_image_update_frame(const bContext *C)
{
- Main *mainp = CTX_data_main(C);
+ Main *mainp= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
+ wmWindowManager *wm= CTX_wm_manager(C);
+ wmWindow *win;
Tex *tex;
/* texture users */
@@ -1976,41 +2094,40 @@ void ED_image_update_frame(const bContext *C)
}
}
-#if 0
/* image window, compo node users */
- if(G.curscreen) {
- ScrArea *sa;
- for(sa= G.curscreen->areabase.first; sa; sa= sa->next) {
- if(sa->spacetype==SPACE_VIEW3D) {
- View3D *v3d= sa->spacedata.first;
- if(v3d->bgpic)
- if(v3d->bgpic->iuser.flag & IMA_ANIM_ALWAYS)
- BKE_image_user_calc_frame(&v3d->bgpic->iuser, scene->r.cfra, 0);
- }
- else if(sa->spacetype==SPACE_IMAGE) {
- SpaceImage *sima= sa->spacedata.first;
- if(sima->iuser.flag & IMA_ANIM_ALWAYS)
- BKE_image_user_calc_frame(&sima->iuser, scene->r.cfra, 0);
- }
- else if(sa->spacetype==SPACE_NODE) {
- SpaceNode *snode= sa->spacedata.first;
- if((snode->treetype==NTREE_COMPOSIT) && (snode->nodetree)) {
- bNode *node;
- for(node= snode->nodetree->nodes.first; node; node= node->next) {
- if(node->id && node->type==CMP_NODE_IMAGE) {
- Image *ima= (Image *)node->id;
- ImageUser *iuser= node->storage;
- if(ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE))
- if(iuser->flag & IMA_ANIM_ALWAYS)
- BKE_image_user_calc_frame(iuser, scene->r.cfra, 0);
+ if(wm) {
+ for(win= wm->windows.first; win; win= win->next) {
+ ScrArea *sa;
+ for(sa= win->screen->areabase.first; sa; sa= sa->next) {
+ if(sa->spacetype==SPACE_VIEW3D) {
+ View3D *v3d= sa->spacedata.first;
+ BGpic *bgpic;
+ for(bgpic= v3d->bgpicbase.first; bgpic; bgpic= bgpic->next)
+ if(bgpic->iuser.flag & IMA_ANIM_ALWAYS)
+ BKE_image_user_calc_frame(&bgpic->iuser, scene->r.cfra, 0);
+ }
+ else if(sa->spacetype==SPACE_IMAGE) {
+ SpaceImage *sima= sa->spacedata.first;
+ if(sima->iuser.flag & IMA_ANIM_ALWAYS)
+ BKE_image_user_calc_frame(&sima->iuser, scene->r.cfra, 0);
+ }
+ else if(sa->spacetype==SPACE_NODE) {
+ SpaceNode *snode= sa->spacedata.first;
+ if((snode->treetype==NTREE_COMPOSIT) && (snode->nodetree)) {
+ bNode *node;
+ for(node= snode->nodetree->nodes.first; node; node= node->next) {
+ if(node->id && node->type==CMP_NODE_IMAGE) {
+ Image *ima= (Image *)node->id;
+ ImageUser *iuser= node->storage;
+ if(ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE))
+ if(iuser->flag & IMA_ANIM_ALWAYS)
+ BKE_image_user_calc_frame(iuser, scene->r.cfra, 0);
+ }
}
}
}
}
}
}
-#endif
}
-
-
diff --git a/source/blender/editors/space_image/image_render.c b/source/blender/editors/space_image/image_render.c
index 18e42ce8797..be9d60a5adb 100644
--- a/source/blender/editors/space_image/image_render.c
+++ b/source/blender/editors/space_image/image_render.c
@@ -32,9 +32,7 @@
#include "DNA_space_types.h"
#include "BKE_context.h"
-#include "BKE_global.h"
#include "BKE_image.h"
-#include "BKE_screen.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index 0eb377450e9..0b8a2d8f843 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -45,7 +45,6 @@
#include "BKE_image.h"
#include "BKE_mesh.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "IMB_imbuf_types.h"
@@ -55,7 +54,6 @@
#include "ED_uvedit.h"
#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "RNA_access.h"
@@ -98,6 +96,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));
+
}
}
@@ -176,6 +175,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));
@@ -289,21 +294,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)
@@ -356,8 +361,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;
}
@@ -377,6 +382,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");
@@ -400,7 +407,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");
@@ -417,9 +424,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);
}
@@ -524,7 +529,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;
}
@@ -532,7 +537,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 */
@@ -590,7 +595,7 @@ static void image_listener(ScrArea *sa, wmNotifier *wmn)
case NC_SCENE:
switch(wmn->data) {
case ND_FRAME:
- image_histogram_tag_refresh(sa);
+ image_scopes_tag_refresh(sa);
ED_area_tag_refresh(sa);
ED_area_tag_redraw(sa);
break;
@@ -598,7 +603,7 @@ static void image_listener(ScrArea *sa, wmNotifier *wmn)
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);
break;
@@ -606,14 +611,14 @@ static void image_listener(ScrArea *sa, wmNotifier *wmn)
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) {
- image_histogram_tag_refresh(sa);
+ image_scopes_tag_refresh(sa);
ED_area_tag_redraw(sa);
}
break;
@@ -768,8 +773,6 @@ static void image_main_area_draw(const bContext *C, ARegion *ar)
/* draw Grease Pencil - screen space only */
draw_image_grease_pencil((bContext *)C, 0);
-
- ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_PIXEL);
/* scrollers? */
/*scrollers= UI_view2d_scrollers_calc(C, v2d, V2D_UNIT_VALUES, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
@@ -837,10 +840,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);
diff --git a/source/blender/editors/space_info/CMakeLists.txt b/source/blender/editors/space_info/CMakeLists.txt
new file mode 100644
index 00000000000..aa9a40ac98f
--- /dev/null
+++ b/source/blender/editors/space_info/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
+ ../../imbuf
+ ../include
+ ../../../../intern/guardedalloc
+ ../../makesdna
+ ../../makesrna
+ ../../windowmanager
+)
+
+BLENDERLIB(bf_editor_space_info "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_info/Makefile b/source/blender/editors/space_info/Makefile
index 931c2f2097c..46feeec8613 100644
--- a/source/blender/editors/space_info/Makefile
+++ b/source/blender/editors/space_info/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/space_info/SConscript b/source/blender/editors/space_info/SConscript
index 01268115687..417b9c7d962 100644
--- a/source/blender/editors/space_info/SConscript
+++ b/source/blender/editors/space_info/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_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 128c0dace20..4053bbf5a1f 100644
--- a/source/blender/editors/space_info/info_intern.h
+++ b/source/blender/editors/space_info/info_intern.h
@@ -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 e2baeb9abac..51767d3e006 100644
--- a/source/blender/editors/space_info/info_ops.c
+++ b/source/blender/editors/space_info/info_ops.c
@@ -36,6 +36,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_math.h"
#include "BLI_bpath.h"
#include "BKE_context.h"
@@ -44,14 +45,11 @@
#include "BKE_main.h"
#include "BKE_packedFile.h"
#include "BKE_report.h"
-#include "BKE_screen.h"
#include "WM_api.h"
#include "WM_types.h"
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "UI_interface.h"
@@ -270,7 +268,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);
@@ -298,5 +296,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 cf23c488960..0789114c054 100644
--- a/source/blender/editors/space_info/info_stats.c
+++ b/source/blender/editors/space_info/info_stats.c
@@ -35,7 +35,6 @@
#include "DNA_scene_types.h"
#include "BKE_anim.h"
-#include "BKE_context.h"
#include "BKE_displist.h"
#include "BKE_DerivedMesh.h"
#include "BKE_key.h"
@@ -45,6 +44,7 @@
#include "ED_armature.h"
#include "ED_mesh.h"
+#include "ED_curve.h" /* for ED_curve_editnurbs */
#include "BLI_editVert.h"
@@ -187,8 +187,9 @@ static void stats_object_edit(Object *obedit, SceneStats *stats)
BezTriple *bezt;
BPoint *bp;
int a;
+ ListBase *nurbs= ED_curve_editnurbs(cu);
- for(nu=cu->editnurb->first; nu; nu=nu->next) {
+ for(nu=nurbs->first; nu; nu=nu->next) {
if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
a= nu->pntsu;
@@ -224,7 +225,7 @@ static void stats_object_edit(Object *obedit, SceneStats *stats)
else if(obedit->type==OB_LATTICE) {
/* Lattice Edit */
Lattice *lt= obedit->data;
- Lattice *editlatt= lt->editlatt;
+ Lattice *editlatt= lt->editlatt->latt;
BPoint *bp;
int a;
diff --git a/source/blender/editors/space_info/space_info.c b/source/blender/editors/space_info/space_info.c
index 6c172c13138..b47c8e8d189 100644
--- a/source/blender/editors/space_info/space_info.c
+++ b/source/blender/editors/space_info/space_info.c
@@ -37,9 +37,8 @@
#include "BLI_rand.h"
#include "BKE_context.h"
-#include "BKE_colortools.h"
+#include "BKE_global.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "ED_screen.h"
@@ -49,6 +48,7 @@
#include "WM_types.h"
#include "UI_resources.h"
+#include "UI_interface.h"
#include "info_intern.h" // own include
@@ -111,11 +111,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);
}
@@ -127,11 +125,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 */
@@ -158,6 +160,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);
@@ -173,6 +179,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)
{
@@ -211,7 +242,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/Makefile b/source/blender/editors/space_logic/Makefile
index 90cd73bd62a..9b72e132be8 100644
--- a/source/blender/editors/space_logic/Makefile
+++ b/source/blender/editors/space_logic/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/space_logic/logic_buttons.c b/source/blender/editors/space_logic/logic_buttons.c
index fc0955bf9d1..d8dfd8cb52d 100644
--- a/source/blender/editors/space_logic/logic_buttons.c
+++ b/source/blender/editors/space_logic/logic_buttons.c
@@ -27,26 +27,16 @@
#include <string.h>
#include <stdio.h>
-#include "DNA_object_types.h"
-#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BKE_context.h"
-#include "BKE_global.h"
-#include "BKE_library.h"
-#include "BKE_main.h"
-#include "BKE_mesh.h"
-#include "BKE_node.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "ED_screen.h"
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "RNA_access.h"
#include "RNA_define.h"
diff --git a/source/blender/editors/space_logic/logic_header.c b/source/blender/editors/space_logic/logic_header.c
deleted file mode 100644
index 3e38eb815fb..00000000000
--- a/source/blender/editors/space_logic/logic_header.c
+++ /dev/null
@@ -1,120 +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) 2009 Blender Foundation.
- * All rights reserved.
- *
- *
- * Contributor(s): Blender Foundation
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include <string.h>
-#include <stdio.h>
-
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_blenlib.h"
-
-#include "BKE_context.h"
-#include "BKE_screen.h"
-#include "BKE_main.h"
-
-#include "ED_screen.h"
-#include "ED_types.h"
-#include "ED_util.h"
-
-
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
-
-#include "UI_interface.h"
-#include "UI_resources.h"
-#include "UI_view2d.h"
-
-#include "logic_intern.h"
-
-/* ************************ header area region *********************** */
-
-
-static void do_logic_buttons(bContext *C, void *arg, int event)
-{
-// SpaceLogic *slogic= CTX_wm_space_logic(C);
-}
-
-static uiBlock *logic_addmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
-// SpaceLogic *slogic= CTX_wm_space_logic(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "logic_addmenu", UI_EMBOSSP);
-// uiBlockSetButmFunc(block, do_logic_addmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Nothing yet", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
- uiTextBoundsBlock(block, 50);
- uiBlockSetDirection(block, UI_TOP);
- uiEndBlock(C, block);
-
- return block;
-}
-
-void logic_header_buttons(const bContext *C, ARegion *ar)
-{
- ScrArea *sa= CTX_wm_area(C);
-// SpaceLogic *slogic= CTX_wm_space_logic(C);
- uiBlock *block;
- short xco, yco= 3;
-
- block= uiBeginBlock(C, ar, "header logic", UI_EMBOSS);
- uiBlockSetHandleFunc(block, do_logic_buttons, NULL);
-
- xco= ED_area_header_standardbuttons(C, block, yco);
-
- if((sa->flag & HEADER_NO_PULLDOWN)==0) {
- int xmax;
-
- xmax= GetButStringLength("View");
- uiDefPulldownBut(block, logic_addmenu, NULL,
- "View", xco, yco, xmax-3, 20, "");
- xco+= xmax;
-
- xmax= GetButStringLength("Select");
- uiDefPulldownBut(block, logic_addmenu, NULL,
- "Select", xco, yco, xmax-3, 20, "");
- xco+= xmax;
-
- xmax= GetButStringLength("Add");
- uiDefPulldownBut(block, logic_addmenu, NULL,
- "Add", xco, yco, xmax-3, 20, "");
- xco+= xmax;
- }
-
- uiBlockSetEmboss(block, UI_EMBOSS);
-
- UI_view2d_totRect_set(&ar->v2d, xco+XIC+100, (int)(ar->v2d.tot.ymax-ar->v2d.tot.ymin));
-
- uiEndBlock(C, block);
- uiDrawBlock(C, block);
-}
-
-
diff --git a/source/blender/editors/space_logic/logic_intern.h b/source/blender/editors/space_logic/logic_intern.h
index 4d19a16ee9c..0c30aa711f1 100644
--- a/source/blender/editors/space_logic/logic_intern.h
+++ b/source/blender/editors/space_logic/logic_intern.h
@@ -42,9 +42,6 @@ struct Scene;
/* space_logic.c */
struct ARegion *logic_has_buttons_region(struct ScrArea *sa);
-/* logic_header.c */
-void logic_header_buttons(const struct bContext *C, struct ARegion *ar);
-
/* logic_ops.c */
/* logic_buttons.c */
@@ -54,6 +51,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..4641fd2ce61
--- /dev/null
+++ b/source/blender/editors/space_logic/logic_ops.c
@@ -0,0 +1,696 @@
+/**
+ * $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 <stddef.h>
+
+#include "DNA_object_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; bit<OB_MAX_STATES; bit++) {
+ if (ob->state & (1<<bit))
+ break;
+ }
+ cont->state_mask = (1<<bit);
+ if (cont->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 39d3feafc19..8a703c510c4 100644
--- a/source/blender/editors/space_logic/logic_window.c
+++ b/source/blender/editors/space_logic/logic_window.c
@@ -40,6 +40,7 @@
#include "DNA_sensor_types.h"
#include "DNA_constraint_types.h"
#include "DNA_windowmanager_types.h"
+#include "DNA_object_types.h"
#include "MEM_guardedalloc.h"
@@ -49,20 +50,18 @@
#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_property.h"
-#include "BKE_screen.h"
#include "BKE_sca.h"
-#include "BKE_utildefines.h"
#include "ED_util.h"
#include "WM_types.h"
#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "UI_interface.h"
+#include "RNA_access.h"
+
/* XXX BAD BAD */
#include "../interface/interface_intern.h"
@@ -192,8 +191,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;
@@ -244,8 +244,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;
@@ -299,8 +300,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;
@@ -354,6 +356,7 @@ static void sca_move_actuator(bContext *C, void *datav, void *move_up)
void do_logic_buts(bContext *C, void *arg, int event)
{
+ Main *bmain= CTX_data_main(C);
bSensor *sens;
bController *cont;
bActuator *act;
@@ -377,7 +380,7 @@ void do_logic_buts(bContext *C, void *arg, int event)
break;
case B_ADD_SENS:
- for(ob=G.main->object.first; ob; ob=ob->id.next) {
+ for(ob=bmain->object.first; ob; ob=ob->id.next) {
if(ob->scaflag & OB_ADDSENS) {
ob->scaflag &= ~OB_ADDSENS;
sens= new_sensor(SENS_ALWAYS);
@@ -391,7 +394,7 @@ void do_logic_buts(bContext *C, void *arg, int event)
break;
case B_CHANGE_SENS:
- for(ob=G.main->object.first; ob; ob=ob->id.next) {
+ for(ob=bmain->object.first; ob; ob=ob->id.next) {
sens= ob->sensors.first;
while(sens) {
if(sens->type != sens->otype) {
@@ -405,7 +408,7 @@ void do_logic_buts(bContext *C, void *arg, int event)
break;
case B_DEL_SENS:
- for(ob=G.main->object.first; ob; ob=ob->id.next) {
+ for(ob=bmain->object.first; ob; ob=ob->id.next) {
sens= ob->sensors.first;
while(sens) {
if(sens->flag & SENS_DEL) {
@@ -420,7 +423,7 @@ void do_logic_buts(bContext *C, void *arg, int event)
break;
case B_ADD_CONT:
- for(ob=G.main->object.first; ob; ob=ob->id.next) {
+ for(ob=bmain->object.first; ob; ob=ob->id.next) {
if(ob->scaflag & OB_ADDCONT) {
ob->scaflag &= ~OB_ADDCONT;
cont= new_controller(CONT_LOGIC_AND);
@@ -445,16 +448,16 @@ void do_logic_buts(bContext *C, void *arg, int event)
break;
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;
+ for(ob=bmain->object.first; ob; ob=ob->id.next) {
+ if(ob->scaflag & OB_ALLSTATE) {
+ ob->scaflag &= ~OB_ALLSTATE;
ob->state = 0x3FFFFFFF;
}
}
break;
case B_INIT_STATE_BIT:
- for(ob=G.main->object.first; ob; ob=ob->id.next) {
+ for(ob=bmain->object.first; ob; ob=ob->id.next) {
if(ob->scaflag & OB_INITSTBIT) {
ob->scaflag &= ~OB_INITSTBIT;
ob->state = ob->init_state;
@@ -465,7 +468,7 @@ void do_logic_buts(bContext *C, void *arg, int event)
break;
case B_CHANGE_CONT:
- for(ob=G.main->object.first; ob; ob=ob->id.next) {
+ for(ob=bmain->object.first; ob; ob=ob->id.next) {
cont= ob->controllers.first;
while(cont) {
if(cont->type != cont->otype) {
@@ -480,7 +483,7 @@ void do_logic_buts(bContext *C, void *arg, int event)
case B_DEL_CONT:
- for(ob=G.main->object.first; ob; ob=ob->id.next) {
+ for(ob=bmain->object.first; ob; ob=ob->id.next) {
cont= ob->controllers.first;
while(cont) {
if(cont->flag & CONT_DEL) {
@@ -496,7 +499,7 @@ void do_logic_buts(bContext *C, void *arg, int event)
break;
case B_ADD_ACT:
- for(ob=G.main->object.first; ob; ob=ob->id.next) {
+ for(ob=bmain->object.first; ob; ob=ob->id.next) {
if(ob->scaflag & OB_ADDACT) {
ob->scaflag &= ~OB_ADDACT;
act= new_actuator(ACT_OBJECT);
@@ -509,7 +512,7 @@ void do_logic_buts(bContext *C, void *arg, int event)
break;
case B_CHANGE_ACT:
- for(ob=G.main->object.first; ob; ob=ob->id.next) {
+ for(ob=bmain->object.first; ob; ob=ob->id.next) {
act= ob->actuators.first;
while(act) {
if(act->type != act->otype) {
@@ -523,7 +526,7 @@ void do_logic_buts(bContext *C, void *arg, int event)
break;
case B_DEL_ACT:
- for(ob=G.main->object.first; ob; ob=ob->id.next) {
+ for(ob=bmain->object.first; ob; ob=ob->id.next) {
act= ob->actuators.first;
while(act) {
if(act->flag & ACT_DEL) {
@@ -541,7 +544,7 @@ void do_logic_buts(bContext *C, void *arg, int event)
case B_SOUNDACT_BROWSE:
/* since we don't know which... */
didit= 0;
- for(ob=G.main->object.first; ob; ob=ob->id.next) {
+ for(ob=bmain->object.first; ob; ob=ob->id.next) {
act= ob->actuators.first;
while(act)
{
@@ -550,11 +553,11 @@ void do_logic_buts(bContext *C, void *arg, int event)
bSoundActuator *sa= act->data;
if(sa->sndnr)
{
- bSound *sound= G.main->sound.first;
+ ID *sound= bmain->sound.first;
int nr= 1;
if(sa->sndnr == -2) {
-// XXX activate_databrowse((ID *)G.main->sound.first, ID_SO, 0, B_SOUNDACT_BROWSE,
+// XXX activate_databrowse((ID *)bmain->sound.first, ID_SO, 0, B_SOUNDACT_BROWSE,
// &sa->sndnr, do_logic_buts);
break;
}
@@ -564,16 +567,16 @@ void do_logic_buts(bContext *C, void *arg, int event)
if(nr==sa->sndnr)
break;
nr++;
- sound= sound->id.next;
+ sound= sound->next;
}
if(sa->sound)
- sa->sound->id.us--;
+ ((ID *)sa->sound)->us--;
- sa->sound= sound;
+ sa->sound= (struct bSound *)sound;
if(sound)
- sound->id.us++;
+ sound->us++;
sa->sndnr= 0;
didit= 1;
@@ -639,17 +642,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:
@@ -673,7 +676,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:
@@ -701,7 +704,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:
@@ -763,6 +766,7 @@ static void set_sca_ob(Object *ob)
static ID **get_selected_and_linked_obs(bContext *C, short *count, short scavisflag)
{
Base *base;
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *ob, *obt, *obact= CTX_data_active_object(C);
ID **idar;
@@ -779,7 +783,7 @@ static ID **get_selected_and_linked_obs(bContext *C, short *count, short scavisf
if(scene==NULL) return NULL;
- ob= G.main->object.first;
+ ob= bmain->object.first;
while(ob) {
ob->scavisflag= 0;
set_sca_ob(ob);
@@ -813,7 +817,7 @@ static ID **get_selected_and_linked_obs(bContext *C, short *count, short scavisf
while(doit) {
doit= 0;
- ob= G.main->object.first;
+ ob= bmain->object.first;
while(ob) {
/* 1st case: select sensor when controller selected */
@@ -894,7 +898,7 @@ static ID **get_selected_and_linked_obs(bContext *C, short *count, short scavisf
}
/* now we count */
- ob= G.main->object.first;
+ ob= bmain->object.first;
while(ob) {
if( ob->scavisflag ) (*count)++;
ob= ob->id.next;
@@ -905,10 +909,17 @@ static ID **get_selected_and_linked_obs(bContext *C, short *count, short scavisf
idar= MEM_callocN( (*count)*sizeof(void *), "idar");
- ob= G.main->object.first;
+ ob= bmain->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++;
}
@@ -1598,7 +1609,7 @@ static short draw_sensorbuttons(Object *ob, bSensor *sens, uiBlock *block, short
str = "Type %t|Up Axis %x1 |Down Axis %x3|Left Axis %x2|Right Axis %x0";
uiDefButI(block, MENU, B_REDR, str, xco+10 + 0.6 * (width-20), yco-68, 0.4 * (width-20), 19,
&joy->axisf, 2.0, 31, 0, 0,
- "The direction of the axis, use 'All Events' to recieve events on any direction");
+ "The direction of the axis, use 'All Events' to receive events on any direction");
}
}
else if (joy->type == SENS_JOY_HAT)
@@ -1611,7 +1622,7 @@ static short draw_sensorbuttons(Object *ob, bSensor *sens, uiBlock *block, short
str = "Direction%t|Up%x1|Down%x4|Left%x8|Right%x2|%l|Up/Right%x3|Down/Left%x12|Up/Left%x9|Down/Right%x6";
uiDefButI(block, MENU, 0, str, xco+10 + 0.6 * (width-20), yco-68, 0.4 * (width-20), 19,
&joy->hatf, 2.0, 31, 0, 0,
- "The direction of the hat, use 'All Events' to recieve events on any direction");
+ "The direction of the hat, use 'All Events' to receive events on any direction");
}
}
else { /* (joy->type == SENS_JOY_AXIS_SINGLE)*/
@@ -1805,7 +1816,7 @@ static void check_armature_actuator(bContext *C, void *arg1_but, void *arg2_act)
}
-static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, short xco, short yco, short width)
+static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlock *block, short xco, short yco, short width)
{
bSoundActuator *sa = NULL;
bObjectActuator *oa = NULL;
@@ -1914,7 +1925,7 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh
uiDefButBitS(block, TOG, ACT_LIN_VEL_LOCAL, 0, "L", xco+45+3*wval, yco-129, 15, 19, &oa->flag, 0.0, 0.0, 0, 0, "Local transformation");
uiDefButBitS(block, TOG, ACT_ANG_VEL_LOCAL, 0, "L", xco+45+3*wval, yco-148, 15, 19, &oa->flag, 0.0, 0.0, 0, 0, "Local transformation");
- uiDefButBitS(block, TOG, ACT_ADD_LIN_VEL, 0, "add",xco+45+3*wval+15, yco-129, 35, 19, &oa->flag, 0.0, 0.0, 0, 0, "Toggles between ADD and SET linV");
+ uiDefButBitS(block, TOG, ACT_ADD_LIN_VEL, 0, "use_additive",xco+45+3*wval+15, yco-129, 35, 19, &oa->flag, 0.0, 0.0, 0, 0, "Toggles between ADD and SET linV");
}
} else if (oa->type == ACT_OBJECT_SERVO)
{
@@ -2130,8 +2141,8 @@ 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);
- if(G.main->sound.first) {
- IDnames_to_pupstring(&str, "Sound files", NULL, &(G.main->sound), (ID *)sa->sound, &(sa->sndnr));
+ if(bmain->sound.first) {
+ IDnames_to_pupstring(&str, "Sound files", NULL, &(bmain->sound), (ID *)sa->sound, &(sa->sndnr));
/* reset this value, it is for handling the event */
sa->sndnr = 0;
uiDefButS(block, MENU, B_SOUNDACT_BROWSE, str, xco+10,yco-22,20,19, &(sa->sndnr), 0, 0, 0, 0, "");
@@ -2139,7 +2150,7 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh
if(sa->sound) {
char dummy_str[] = "Sound mode %t|Play Stop %x0|Play End %x1|Loop Stop %x2|Loop End %x3|Loop Ping Pong Stop %x5|Loop Ping Pong %x4";
- uiDefBut(block, TEX, B_IDNAME, "SO:",xco+30,yco-22,wval-20,19, sa->sound->id.name+2, 0.0, 21.0, 0, 0, "");
+ uiDefBut(block, TEX, B_IDNAME, "SO:",xco+30,yco-22,wval-20,19, ((ID *)sa->sound)->name+2, 0.0, 21.0, 0, 0, "");
uiDefButS(block, MENU, 1, dummy_str,xco+10,yco-44,width-20, 19, &sa->type, 0.0, 0.0, 0, 0, "");
uiDefButF(block, NUM, 0, "Volume:", xco+10,yco-66,wval, 19, &sa->volume, 0.0, 1.0, 0, 0, "Sets the volume of this sound");
uiDefButF(block, NUM, 0, "Pitch:",xco+wval+10,yco-66,wval, 19, &sa->pitch,-12.0, 12.0, 0, 0, "Sets the pitch of this sound");
@@ -2518,7 +2529,7 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh
}
//str = "Scene %t|Load game%x0|Start loaded game%x1|Restart this game%x2|Quit this game %x3";
- str = "Scene %t|Start new game%x0|Restart this game%x2|Quit this game %x3|Save GameLogic.globalDict %x4|Load GameLogic.globalDict %x5";
+ str = "Scene %t|Start new game%x0|Restart this game%x2|Quit this game %x3|Save bge.logic.globalDict %x4|Load bge.logic.globalDict %x5";
uiDefButS(block, MENU, B_REDR, str, xco+40, yco-24, (width-80), 19, &gma->type, 0.0, 0.0, 0, 0, "");
yco -= ysize;
@@ -3162,15 +3173,1542 @@ static int is_sensor_linked(uiBlock *block, bSensor *sens)
return 0;
}
-/* never used, see CVS 1.134 for the code */
-/* static FreeCamera *new_freecamera(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, "show_expanded", UI_ITEM_R_NO_BG, "", 0);
+ if(RNA_boolean_get(ptr, "show_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, "show_sensors_active_states")
+ && RNA_boolean_get(ptr, "show_expanded")) || RNA_boolean_get(ptr, "pin")));
+ uiItemR(subrow, ptr, "pin", UI_ITEM_R_NO_BG, "", 0);
+
+ if(RNA_boolean_get(ptr, "show_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, "use_pulse_true_level", 0, "", ICON_DOTSUP);
+ uiItemR(row, ptr, "use_pulse_false_level", 0, "", ICON_DOTSDOWN);
+ uiItemR(row, ptr, "frequency", 0, "Freq", 0);
+
+ row= uiLayoutRow(split, 1);
+ uiItemR(row, ptr, "use_level", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "use_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, "use_pulse", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "use_material", UI_ITEM_R_TOGGLE, NULL, 0);
+
+ switch (RNA_enum_get(ptr, "use_material")) {
+ 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, "use_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, "use_all_events", 0, NULL, 0);
+
+ col = uiLayoutColumn(layout, 0);
+ uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_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, "use_all_events", 0, NULL, 0);
+ col = uiLayoutColumn(layout, 0);
+ uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_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, "use_all_events", 0, NULL, 0);
+
+ col = uiLayoutColumn(layout, 0);
+ uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_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, "use_all_keys")==0);
+ uiItemR(col, ptr, "key", UI_ITEM_R_EVENT, "", 0);
+ col = uiLayoutColumn(row, 0);
+ uiItemR(col, ptr, "use_all_keys", UI_ITEM_R_TOGGLE, NULL, 0);
+
+ col = uiLayoutColumn(layout, 0);
+ uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_keys")==0);
+ row = uiLayoutRow(col, 0);
+ uiItemL(row, "First Modifier:", 0);
+ uiItemR(row, ptr, "modifier_key_1", UI_ITEM_R_EVENT, "", 0);
+
+ row = uiLayoutRow(col, 0);
+ uiItemL(row, "Second Modifier:", 0);
+ uiItemR(row, ptr, "modifier_key_2", 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, "value_min", 0, NULL, 0);
+ uiItemR(row, ptr, "value_max", 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, "use_x_ray", 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, "show_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, "states"));
+
+ box= uiLayoutBox(layout);
+ row= uiLayoutRow(box, 0);
+
+ uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", 0);
+ if(RNA_boolean_get(ptr, "show_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, "use_priority", 0, "", 0);
+
+ if(RNA_boolean_get(ptr, "show_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, "use_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, "show_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, "show_expanded", UI_ITEM_R_NO_BG, "", 0);
+ if(RNA_boolean_get(ptr, "show_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, "show_actuators_active_states")
+ && RNA_boolean_get(ptr, "show_expanded")) || RNA_boolean_get(ptr, "pin")));
+ uiItemR(subrow, ptr, "pin", UI_ITEM_R_NO_BG, "", 0);
+
+ if(RNA_boolean_get(ptr, "show_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, "play_mode", 0, "", 0);
+ uiItemR(row, ptr, "action", 0, NULL, 0);
+ uiItemR(row, ptr, "use_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, "frame_blend_in", 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, "use_local", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "use_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, "use_force_distance", UI_ITEM_R_TOGGLE, NULL, 0);
+ subcol = uiLayoutColumn(col, 0);
+ uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "use_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, "use_material_detect", UI_ITEM_R_TOGGLE, NULL, 0);
+ if (RNA_boolean_get(ptr, "use_material_detect"))
+ 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, "use_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, "rotation_max", 0, NULL, 0);
+
+ row=uiLayoutRow(layout, 1);
+ uiItemR(row, ptr, "angle_min", 0, NULL, 0);
+ uiItemR(row, ptr, "angle_max", 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, "use_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, "use_fh_normal", UI_ITEM_R_TOGGLE , NULL, 0);
+
+ split = uiLayoutSplit(layout, 0.15, 0);
+ uiItemR(split, ptr, "use_material_detect", UI_ITEM_R_TOGGLE, NULL, 0);
+ if (RNA_boolean_get(ptr, "use_material_detect"))
+ 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, "use_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, "use_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, "use_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, "use_replace_display_mesh", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "use_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, "use_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, "use_motion_blur")==1);
+ uiItemR(row, ptr, "motion_blur_factor", 0, NULL, 0);
+ uiItemR(split, ptr, "use_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, "use_force", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(subrow, ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, 0);
+
+ col = uiLayoutColumn(subrow, 0);
+ uiLayoutSetActive(col, (RNA_boolean_get(ptr, "use_additive") || RNA_boolean_get(ptr, "use_force")));
+ uiItemR(col, ptr, "use_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, "apply_to_children", 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, "offset_location", 0, NULL, 0);
+ uiItemR(split, ptr, "use_local_location", UI_ITEM_R_TOGGLE, NULL, 0);
+
+ split = uiLayoutSplit(layout, 0.9, 0);
+ row = uiLayoutRow(split, 0);
+ uiItemR(row, ptr, "offset_rotation", 0, NULL, 0);
+ uiItemR(split, ptr, "use_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, "use_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, "use_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, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "use_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, "use_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, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, 0);
+
+ row = uiLayoutRow(layout, 0);
+ col = uiLayoutColumn(row, 0);
+ uiItemR(col, ptr, "use_servo_limit_x", UI_ITEM_R_TOGGLE, NULL, 0);
+ subcol = uiLayoutColumn(col, 1);
+ uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "use_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, "use_servo_limit_y", UI_ITEM_R_TOGGLE, NULL, 0);
+ subcol = uiLayoutColumn(col, 1);
+ uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "use_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, "use_servo_limit_z", UI_ITEM_R_TOGGLE, NULL, 0);
+ subcol = uiLayoutColumn(col, 1);
+ uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "use_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, "use_compound", 0, NULL, 0);
+ uiItemR(row, ptr, "use_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);
-/* never used, see CVS 1.120 for the code */
-/* static uiBlock *freecamera_menu(void) */
+ 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, "use_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, "use_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, "frame_blend_in", 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);
+ 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, "use_sound_3d", 0, NULL, 0);
+
+ col = uiLayoutColumn(layout, 0);
+ uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_sound_3d")==1);
+
+ row = uiLayoutRow(col, 0);
+ uiItemR(row, ptr, "gain_3d_min", 0, NULL, 0);
+ uiItemR(row, ptr, "gain_3d_max", 0, NULL, 0);
+
+ row = uiLayoutRow(col, 0);
+ uiItemR(row, ptr, "distance_3d_reference", 0, NULL, 0);
+ uiItemR(row, ptr, "distance_3d_max", 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, "states", &settings_ptr, "used_states", 0);
+}
+
+static void draw_actuator_visibility(uiLayout *layout, PointerRNA *ptr)
+{
+ uiLayout *row;
+ row = uiLayoutRow(layout, 0);
+
+ uiItemR(row, ptr, "use_visible", 0, NULL, 0);
+ uiItemR(row, ptr, "use_occlusion", 0, NULL, 0);
+ uiItemR(row, ptr, "apply_to_children", 0, NULL, 0);
+}
+
+void draw_brick_actuator(uiLayout *layout, PointerRNA *ptr, bContext *C)
+{
+ uiLayout *box;
+
+ if (!RNA_boolean_get(ptr, "show_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; a<count; a++) {
+ bActuator *act;
+ bSensor *sens;
+ bController *cont;
+ int iact;
+ short flag;
+
+ ob= (Object *)idar[a];
+
+ /* clean ACT_LINKED and ACT_VISIBLE of all potentially visible actuators so that we can determine which is actually linked/visible */
+ act = ob->actuators.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; iact<cont->totlinks; 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, "show_controllers_selected_objects", 0, "Sel", 0);
+ uiItemR(row, &logic_ptr, "show_controllers_active_object", 0, "Act", 0);
+ uiItemR(row, &logic_ptr, "show_controllers_linked_controller", 0, "Link", 0);
+
+ for(a=0; a<count; a++) {
+ bController *cont;
+ PointerRNA ptr;
+ uiLayout *split, *subsplit, *col;
+
+
+ ob= (Object *)idar[a];
+
+ /* only draw the controller common header if "use_visible" */
+ if( (ob->scavisflag & 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, "use_all_states")==0);
+ uiTemplateLayers(row, &settings_ptr, "states_visible", &settings_ptr, "used_states", 0);
+ row= uiLayoutRow(col, 0);
+ uiTemplateLayers(row, &settings_ptr, "states_initial", &settings_ptr, "used_states", 0);
+
+ col= uiLayoutColumn(subsplit, 0);
+ uiItemR(col, &settings_ptr, "use_all_states", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(col, &settings_ptr, "show_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, "show_sensors_selected_objects", 0, "Sel", 0);
+ uiItemR(row, &logic_ptr, "show_sensors_active_object", 0, "Act", 0);
+ uiItemR(row, &logic_ptr, "show_sensors_linked_controller", 0, "Link", 0);
+ uiItemR(row, &logic_ptr, "show_sensors_active_states", 0, "State", 0);
+
+ for(a=0; a<count; a++) {
+ bSensor *sens;
+ PointerRNA ptr;
+
+ ob= (Object *)idar[a];
+
+ /* only draw the sensor common header if "use_visible" */
+ if((ob->scavisflag & 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, "show_actuators_selected_objects", 0, "Sel", 0);
+ uiItemR(row, &logic_ptr, "show_actuators_active_object", 0, "Act", 0);
+ uiItemR(row, &logic_ptr, "show_actuators_linked_controller", 0, "Link", 0);
+ uiItemR(row, &logic_ptr, "show_actuators_active_states", 0, "State", 0);
+
+ for(a=0; a<count; a++) {
+ bActuator *act;
+ PointerRNA ptr;
+
+ ob= (Object *)idar[a];
+
+ /* only draw the actuator common header if "use_visible" */
+ if( (ob->scavisflag & 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)
{
+ Main *bmain= CTX_data_main(C);
SpaceLogic *slogic= CTX_wm_space_logic(C);
Object *ob= CTX_data_active_object(C);
ID **idar;
@@ -3179,13 +4717,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);
@@ -3193,6 +4738,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
@@ -3276,7 +4823,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);
@@ -3323,15 +4870,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;
@@ -3352,7 +4899,7 @@ void logic_buttons(bContext *C, ARegion *ar)
yco-= 6;
}
}
-
+
/* ******************************* */
xco= 10; yco= 170; width= 300;
@@ -3415,15 +4962,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);
}
@@ -3437,10 +4984,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);
@@ -3488,22 +5033,22 @@ void logic_buttons(bContext *C, ARegion *ar)
uiButSetFunc(but, make_unique_prop_names_cb, act->name, (void*) 0);
ycoo= yco;
- yco= draw_actuatorbuttons(ob, act, block, xco, yco, width);
+ yco= draw_actuatorbuttons(bmain, ob, act, block, xco, yco, width);
if(yco-6 < ycoo) ycoo= (yco+ycoo-20)/2;
}
else {
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 e15d68b36a5..01af324334b 100644
--- a/source/blender/editors/space_logic/space_logic.c
+++ b/source/blender/editors/space_logic/space_logic.c
@@ -37,12 +37,10 @@
#include "BKE_context.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "ED_screen.h"
#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "WM_api.h"
@@ -182,6 +180,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)
@@ -195,6 +194,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:
@@ -244,11 +246,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);
@@ -294,24 +294,7 @@ 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);
- glClear(GL_COLOR_BUFFER_BIT);
-
- /* set view2d view matrix for scrolling (without scrollers) */
- UI_view2d_view_ortho(C, &ar->v2d);
-
- logic_header_buttons(C, ar);
-
- /* restore view matrix? */
- UI_view2d_view_restore(C);
+ ED_region_header(C, ar);
}
/**************************** spacetype *****************************/
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/Makefile b/source/blender/editors/space_nla/Makefile
index d7c9477dc83..fd940081c16 100644
--- a/source/blender/editors/space_nla/Makefile
+++ b/source/blender/editors/space_nla/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/space_nla/nla_buttons.c b/source/blender/editors/space_nla/nla_buttons.c
index 9b7bc9a8002..fc869c4b46f 100644
--- a/source/blender/editors/space_nla/nla_buttons.c
+++ b/source/blender/editors/space_nla/nla_buttons.c
@@ -40,21 +40,10 @@
#include "BLI_editVert.h"
#include "BLI_rand.h"
-#include "BKE_animsys.h"
#include "BKE_nla.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_scene.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
-#include "BIF_gl.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -245,7 +234,7 @@ static void nla_panel_animdata (const bContext *C, Panel *pa)
/* blending */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &adt_ptr, "action_blending", 0, NULL, 0);
+ uiItemR(row, &adt_ptr, "action_blend_type", 0, NULL, 0);
/* influence */
row= uiLayoutRow(layout, 1);
@@ -304,26 +293,26 @@ static void nla_panel_properties(const bContext *C, Panel *pa)
/* blending */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &strip_ptr, "blending", 0, NULL, 0);
+ uiItemR(row, &strip_ptr, "blend_type", 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, &strip_ptr, "auto_blending", 0, NULL, 0); // XXX as toggle?
+ uiLayoutSetActive(column, RNA_boolean_get(&strip_ptr, "use_animated_influence")==0);
+ uiItemR(column, &strip_ptr, "use_auto_blend", 0, NULL, 0); // XXX as toggle?
subcol= uiLayoutColumn(column, 1);
- uiLayoutSetActive(subcol, RNA_boolean_get(&strip_ptr, "auto_blending")==0);
+ uiLayoutSetActive(subcol, RNA_boolean_get(&strip_ptr, "use_auto_blend")==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")));
+ uiLayoutSetActive(column, !(RNA_boolean_get(&strip_ptr, "animated_influence") || RNA_boolean_get(&strip_ptr, "use_animated_time")));
uiItemL(column, "Playback Settings:", 0);
- uiItemR(column, &strip_ptr, "muted", 0, NULL, 0);
- uiItemR(column, &strip_ptr, "reversed", 0, NULL, 0);
+ uiItemR(column, &strip_ptr, "mute", 0, NULL, 0);
+ uiItemR(column, &strip_ptr, "use_reverse", 0, NULL, 0);
}
@@ -357,7 +346,7 @@ static void nla_panel_actclip(const bContext *C, Panel *pa)
/* action usage */
column= uiLayoutColumn(layout, 1);
- uiLayoutSetActive(column, RNA_boolean_get(&strip_ptr, "animated_time")==0);
+ uiLayoutSetActive(column, RNA_boolean_get(&strip_ptr, "use_animated_time")==0);
uiItemL(column, "Playback Settings:", 0);
uiItemR(column, &strip_ptr, "scale", 0, NULL, 0);
uiItemR(column, &strip_ptr, "repeat", 0, NULL, 0);
@@ -379,21 +368,21 @@ static void nla_panel_evaluation(const bContext *C, Panel *pa)
uiBlockSetHandleFunc(block, do_nla_region_buttons, NULL);
column= uiLayoutColumn(layout, 1);
- uiItemR(column, &strip_ptr, "animated_influence", 0, NULL, 0);
+ uiItemR(column, &strip_ptr, "use_animated_influence", 0, NULL, 0);
subcolumn= uiLayoutColumn(column, 1);
- uiLayoutSetEnabled(subcolumn, RNA_boolean_get(&strip_ptr, "animated_influence"));
+ uiLayoutSetEnabled(subcolumn, RNA_boolean_get(&strip_ptr, "use_animated_influence"));
uiItemR(subcolumn, &strip_ptr, "influence", 0, NULL, 0);
column= uiLayoutColumn(layout, 1);
subrow= uiLayoutRow(column, 0);
- uiItemR(subrow, &strip_ptr, "animated_time", 0, NULL, 0);
- uiItemR(subrow, &strip_ptr, "animated_time_cyclic", 0, NULL, 0);
+ uiItemR(subrow, &strip_ptr, "use_animated_time", 0, NULL, 0);
+ uiItemR(subrow, &strip_ptr, "use_animated_time_cyclic", 0, NULL, 0);
subcolumn= uiLayoutColumn(column, 1);
subrow= uiLayoutRow(subcolumn, 0);
- uiLayoutSetEnabled(subrow, RNA_boolean_get(&strip_ptr, "animated_time"));
+ uiLayoutSetEnabled(subrow, RNA_boolean_get(&strip_ptr, "use_animated_time"));
uiItemR(subcolumn, &strip_ptr, "strip_time", 0, NULL, 0);
}
diff --git a/source/blender/editors/space_nla/nla_channels.c b/source/blender/editors/space_nla/nla_channels.c
index 4deab9d82ab..b00cba676d0 100644
--- a/source/blender/editors/space_nla/nla_channels.c
+++ b/source/blender/editors/space_nla/nla_channels.c
@@ -35,7 +35,6 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
-#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
@@ -46,7 +45,6 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "ED_anim_api.h"
#include "ED_keyframes_edit.h"
@@ -116,7 +114,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:
@@ -157,7 +155,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;
@@ -194,7 +192,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;
@@ -220,21 +218,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 */
@@ -253,7 +251,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;
@@ -385,20 +383,22 @@ static int nlaedit_add_tracks_exec (bContext *C, wmOperator *op)
/* add tracks... */
for (ale= anim_data.first; ale; ale= ale->next) {
- NlaTrack *nlt= (NlaTrack *)ale->data;
- AnimData *adt= ale->adt;
-
- /* check if just adding a new track above this one,
- * or whether we're adding a new one to the top of the stack that this one belongs to
- */
- if (above_sel) {
- /* just add a new one above this one */
- add_nlatrack(adt, nlt);
- }
- else if ((lastAdt == NULL) || (adt != lastAdt)) {
- /* add one track to the top of the owning AnimData's stack, then don't add anymore to this stack */
- add_nlatrack(adt, NULL);
- lastAdt= adt;
+ if(ale->type == ANIMTYPE_NLATRACK) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ AnimData *adt= ale->adt;
+
+ /* check if just adding a new track above this one,
+ * or whether we're adding a new one to the top of the stack that this one belongs to
+ */
+ if (above_sel) {
+ /* just add a new one above this one */
+ add_nlatrack(adt, nlt);
+ }
+ else if ((lastAdt == NULL) || (adt != lastAdt)) {
+ /* add one track to the top of the owning AnimData's stack, then don't add anymore to this stack */
+ add_nlatrack(adt, NULL);
+ lastAdt= adt;
+ }
}
}
@@ -406,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;
@@ -451,18 +451,20 @@ static int nlaedit_delete_tracks_exec (bContext *C, wmOperator *op)
/* delete tracks */
for (ale= anim_data.first; ale; ale= ale->next) {
- NlaTrack *nlt= (NlaTrack *)ale->data;
- AnimData *adt= ale->adt;
-
- /* call delete on this track - deletes all strips too */
- free_nlatrack(&adt->nla_tracks, nlt);
+ if(ale->type == ANIMTYPE_NLATRACK) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ AnimData *adt= ale->adt;
+
+ /* call delete on this track - deletes all strips too */
+ free_nlatrack(&adt->nla_tracks, nlt);
+ }
}
/* free temp data */
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 2ec88ba852f..f489fc4774f 100644
--- a/source/blender/editors/space_nla/nla_draw.c
+++ b/source/blender/editors/space_nla/nla_draw.c
@@ -37,19 +37,16 @@
#include "DNA_space_types.h"
#include "DNA_windowmanager_types.h"
-#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
#include "BLI_dlrbTree.h"
-#include "BKE_animsys.h"
#include "BKE_fcurve.h"
#include "BKE_nla.h"
#include "BKE_context.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "ED_anim_api.h"
#include "ED_keyframes_draw.h"
@@ -705,7 +702,7 @@ static void draw_nla_channel_list_gl (bAnimContext *ac, ListBase *anim_data, Vie
offset += 7 * indent;
- /* only on top two corners, to show that this channel sits on top of the preceeding ones */
+ /* only on top two corners, to show that this channel sits on top of the preceding ones */
uiSetRoundBox((1|2));
/* draw slightly shifted up vertically to look like it has more separtion from other channels,
@@ -790,7 +787,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);
@@ -805,7 +802,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 3319c36e92b..247987cda9f 100644
--- a/source/blender/editors/space_nla/nla_edit.c
+++ b/source/blender/editors/space_nla/nla_edit.c
@@ -39,16 +39,13 @@
#include "BLI_math.h"
#include "BLI_rand.h"
-#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_fcurve.h"
#include "BKE_nla.h"
#include "BKE_context.h"
-#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_report.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "ED_anim_api.h"
#include "ED_keyframes_edit.h"
@@ -260,7 +257,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.");
@@ -311,7 +308,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;
@@ -336,7 +333,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;
}
@@ -430,7 +427,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;
@@ -497,7 +494,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;
@@ -549,7 +546,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;
@@ -639,7 +636,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;
@@ -727,7 +724,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;
@@ -872,7 +869,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;
@@ -903,7 +900,7 @@ static int nlaedit_bake_exec (bContext *C, wmOperator *op)
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
int filter;
- int flag = 0;
+// int flag = 0;
/* get editor data */
if (ANIM_animdata_get_context(C, &ac) == 0)
@@ -925,7 +922,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;
@@ -987,7 +984,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;
@@ -1061,7 +1058,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;
@@ -1135,7 +1132,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;
@@ -1211,7 +1208,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;
@@ -1312,7 +1309,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;
@@ -1375,7 +1372,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;
@@ -1516,7 +1513,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;
@@ -1631,7 +1628,7 @@ static int nla_fmodifier_add_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;
@@ -1753,7 +1750,7 @@ static int nla_fmodifier_paste_exec(bContext *C, wmOperator *op)
if (ok) {
/* set notifier that things have changed */
/* 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);
return OPERATOR_FINISHED;
}
else {
diff --git a/source/blender/editors/space_nla/nla_ops.c b/source/blender/editors/space_nla/nla_ops.c
index 71701048e2f..85a169f2bb0 100644
--- a/source/blender/editors/space_nla/nla_ops.c
+++ b/source/blender/editors/space_nla/nla_ops.c
@@ -31,16 +31,12 @@
#include "DNA_scene_types.h"
-#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
-#include "BKE_animsys.h"
-#include "BKE_nla.h"
#include "BKE_context.h"
-#include "BKE_report.h"
#include "BKE_screen.h"
#include "ED_anim_api.h"
@@ -246,7 +242,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);
-
+
/* 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 b76d90bd0f9..f49897e79fe 100644
--- a/source/blender/editors/space_nla/nla_select.c
+++ b/source/blender/editors/space_nla/nla_select.c
@@ -38,10 +38,8 @@
#include "BLI_math.h"
#include "BLI_rand.h"
-#include "BKE_animsys.h"
#include "BKE_nla.h"
#include "BKE_context.h"
-#include "BKE_report.h"
#include "BKE_screen.h"
#include "ED_anim_api.h"
@@ -70,7 +68,7 @@ static short selmodes_to_flagmodes (short sel)
break;
case SELECT_INVERT:
- return ACHANNEL_SETFLAG_TOGGLE;
+ return ACHANNEL_SETFLAG_INVERT;
break;
case SELECT_ADD:
@@ -176,7 +174,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;
}
@@ -313,7 +311,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;
}
@@ -570,7 +568,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 46fec4015ea..92c5ef6c410 100644
--- a/source/blender/editors/space_nla/space_nla.c
+++ b/source/blender/editors/space_nla/space_nla.c
@@ -38,15 +38,10 @@
#include "BLI_math.h"
#include "BLI_rand.h"
-#include "BKE_animsys.h"
-#include "BKE_action.h"
-#include "BKE_nla.h"
-#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "ED_anim_api.h"
#include "ED_markers.h"
@@ -227,11 +222,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);
@@ -273,12 +266,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/Makefile b/source/blender/editors/space_node/Makefile
index 5bd6e95e28c..6c12149a43f 100644
--- a/source/blender/editors/space_node/Makefile
+++ b/source/blender/editors/space_node/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 5ba2c1c27c8..93dddac3107 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -43,16 +43,9 @@
#include "BKE_context.h"
#include "BKE_curve.h"
-#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_material.h"
-#include "BKE_node.h"
-#include "BKE_object.h"
-#include "BKE_texture.h"
-#include "BKE_text.h"
-#include "BKE_utildefines.h"
#include "CMP_node.h"
#include "SHD_node.h"
@@ -107,7 +100,7 @@ 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);
+ uiTemplateColorWheel(col, &sockptr, "default_value", 1, 0, 0, 0);
uiItemR(col, &sockptr, "default_value", 0, "", 0);
}
@@ -120,7 +113,7 @@ static void node_buts_mix_rgb(uiLayout *layout, bContext *C, PointerRNA *ptr)
row= uiLayoutRow(layout, 1);
uiItemR(row, ptr, "blend_type", 0, "", 0);
if(ntree->type == NTREE_COMPOSIT)
- uiItemR(row, ptr, "alpha", 0, "", ICON_IMAGE_RGB_ALPHA);
+ uiItemR(row, ptr, "use_alpha", 0, "", ICON_IMAGE_RGB_ALPHA);
}
static void node_buts_time(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -141,8 +134,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, ptr, "start", 0, "Sta", 0);
- uiItemR(row, ptr, "end", 0, "End", 0);
+ uiItemR(row, ptr, "frame_start", 0, "Sta", 0);
+ uiItemR(row, ptr, "frame_end", 0, "End", 0);
}
static void node_buts_colorramp(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -190,6 +183,7 @@ static void node_buts_normal(uiLayout *layout, bContext *C, PointerRNA *ptr)
#if 0 // not used in 2.5x yet
static void node_browse_tex_cb(bContext *C, void *ntree_v, void *node_v)
{
+ Main *bmain= CTX_data_main(C);
bNodeTree *ntree= ntree_v;
bNode *node= node_v;
Tex *tex;
@@ -200,7 +194,7 @@ static void node_browse_tex_cb(bContext *C, void *ntree_v, void *node_v)
node->id->us--;
node->id= NULL;
}
- tex= BLI_findlink(&G.main->tex, node->menunr-1);
+ tex= BLI_findlink(&bmain->tex, node->menunr-1);
node->id= &tex->id;
id_us_plus(node->id);
@@ -220,6 +214,7 @@ static void node_browse_tex_cb(bContext *C, void *ntree_v, void *node_v)
#endif
static void node_dynamic_update_cb(bContext *C, void *ntree_v, void *node_v)
{
+ Main *bmain= CTX_data_main(C);
Material *ma;
bNode *node= (bNode *)node_v;
ID *id= node->id;
@@ -229,7 +224,7 @@ static void node_dynamic_update_cb(bContext *C, void *ntree_v, void *node_v)
/* Users only have to press the "update" button in one pynode
* and we also update all others sharing the same script */
- for (ma= G.main->mat.first; ma; ma= ma->id.next) {
+ for (ma= bmain->mat.first; ma; ma= ma->id.next) {
if (ma->nodetree) {
bNode *nd;
for (nd= ma->nodetree->nodes.first; nd; nd= nd->next) {
@@ -277,6 +272,7 @@ static void node_buts_math(uiLayout *layout, bContext *C, PointerRNA *ptr)
static void node_browse_text_cb(bContext *C, void *ntree_v, void *node_v)
{
+ Main *bmain= CTX_data_main(C);
bNodeTree *ntree= ntree_v;
bNode *node= node_v;
ID *oldid;
@@ -287,7 +283,7 @@ static void node_browse_text_cb(bContext *C, void *ntree_v, void *node_v)
node->id->us--;
}
oldid= node->id;
- node->id= BLI_findlink(&G.main->text, node->menunr-1);
+ node->id= BLI_findlink(&bmain->text, node->menunr-1);
id_us_plus(node->id);
BLI_strncpy(node->name, node->id->name+2, 21); /* huh? why 21? */
@@ -311,8 +307,8 @@ static void node_shader_buts_material(uiLayout *layout, bContext *C, PointerRNA
if(!node->id) return;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "diffuse", 0, NULL, 0);
- uiItemR(col, ptr, "specular", 0, NULL, 0);
+ uiItemR(col, ptr, "use_diffuse", 0, NULL, 0);
+ uiItemR(col, ptr, "use_specular", 0, NULL, 0);
uiItemR(col, ptr, "invert_normal", 0, NULL, 0);
}
@@ -333,12 +329,12 @@ static void node_shader_buts_mapping(uiLayout *layout, bContext *C, PointerRNA *
uiItemR(row, ptr, "scale", 0, "", 0);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "clamp_minimum", 0, "Min", 0);
- uiItemR(row, ptr, "minimum", 0, "", 0);
+ uiItemR(row, ptr, "use_min", 0, "Min", 0);
+ uiItemR(row, ptr, "min", 0, "", 0);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "clamp_maximum", 0, "Max", 0);
- uiItemR(row, ptr, "maximum", 0, "", 0);
+ uiItemR(row, ptr, "use_max", 0, "Max", 0);
+ uiItemR(row, ptr, "max", 0, "", 0);
}
@@ -349,15 +345,26 @@ static void node_shader_buts_vect_math(uiLayout *layout, bContext *C, PointerRNA
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, ptr, "uv_layer", 0, "UV", 0);
- uiItemR(col, ptr, "color_layer", 0, "VCol", 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)
{
+ Main *bmain= CTX_data_main(C);
uiBlock *block= uiLayoutAbsoluteBlock(layout);
bNode *node= ptr->data;
bNodeTree *ntree= ptr->id.data;
@@ -370,7 +377,7 @@ static void node_shader_buts_dynamic(uiLayout *layout, bContext *C, PointerRNA *
/* B_NODE_EXEC is handled in butspace.c do_node_buts */
if(!node->id) {
char *strp;
- IDnames_to_pupstring(&strp, NULL, "", &(G.main->text), NULL, NULL);
+ IDnames_to_pupstring(&strp, NULL, "", &(bmain->text), NULL, NULL);
node->menunr= 0;
bt= uiDefButS(block, MENU, B_NODE_EXEC/*+node->nr*/, strp,
butr->xmin, dy, 19, 19,
@@ -471,11 +478,11 @@ static void node_composit_buts_image(uiLayout *layout, bContext *C, PointerRNA *
if (ELEM(RNA_enum_get(&imaptr, "source"), IMA_SRC_SEQUENCE, IMA_SRC_MOVIE)) {
col= uiLayoutColumn(layout, 1);
- 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);
+ uiItemR(col, ptr, "frame_duration", 0, NULL, 0);
+ uiItemR(col, ptr, "frame_start", 0, NULL, 0);
+ uiItemR(col, ptr, "frame_offset", 0, NULL, 0);
+ uiItemR(col, ptr, "use_cyclic", 0, NULL, 0);
+ uiItemR(col, ptr, "use_auto_refresh", UI_ITEM_R_ICON_ONLY, NULL, 0);
}
col= uiLayoutColumn(layout, 0);
@@ -525,19 +532,19 @@ static void node_composit_buts_blur(uiLayout *layout, bContext *C, PointerRNA *p
uiItemR(col, ptr, "filter_type", 0, "", 0);
if (RNA_enum_get(ptr, "filter_type")!= R_FILTER_FAST_GAUSS) {
- uiItemR(col, ptr, "bokeh", 0, NULL, 0);
- uiItemR(col, ptr, "gamma", 0, NULL, 0);
+ uiItemR(col, ptr, "use_bokeh", 0, NULL, 0);
+ uiItemR(col, ptr, "use_gamma_correction", 0, NULL, 0);
}
- uiItemR(col, ptr, "relative", 0, NULL, 0);
+ uiItemR(col, ptr, "use_relative", 0, NULL, 0);
col= uiLayoutColumn(layout, 1);
- if (RNA_boolean_get(ptr, "relative")) {
+ if (RNA_boolean_get(ptr, "use_relative")) {
uiItemR(col, ptr, "factor_x", 0, "X", 0);
uiItemR(col, ptr, "factor_y", 0, "Y", 0);
}
else {
- uiItemR(col, ptr, "sizex", 0, "X", 0);
- uiItemR(col, ptr, "sizey", 0, "Y", 0);
+ uiItemR(col, ptr, "size_x", 0, "X", 0);
+ uiItemR(col, ptr, "size_y", 0, "Y", 0);
}
}
@@ -546,7 +553,7 @@ static void node_composit_buts_dblur(uiLayout *layout, bContext *C, PointerRNA *
uiLayout *col;
uiItemR(layout, ptr, "iterations", 0, NULL, 0);
- uiItemR(layout, ptr, "wrap", 0, NULL, 0);
+ uiItemR(layout, ptr, "use_wrap", 0, NULL, 0);
col= uiLayoutColumn(layout, 1);
uiItemL(col, "Center:", 0);
@@ -584,19 +591,19 @@ static void node_composit_buts_defocus(uiLayout *layout, bContext *C, PointerRNA
uiItemR(col, ptr, "bokeh", 0, "", 0);
uiItemR(col, ptr, "angle", 0, NULL, 0);
- uiItemR(layout, ptr, "gamma_correction", 0, NULL, 0);
+ uiItemR(layout, ptr, "use_gamma_correction", 0, NULL, 0);
col = uiLayoutColumn(layout, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_zbuffer")==1);
uiItemR(col, ptr, "f_stop", 0, NULL, 0);
- uiItemR(layout, ptr, "max_blur", 0, NULL, 0);
+ uiItemR(layout, ptr, "blur_max", 0, NULL, 0);
uiItemR(layout, ptr, "threshold", 0, NULL, 0);
col = uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "preview", 0, NULL, 0);
+ uiItemR(col, ptr, "use_preview", 0, NULL, 0);
sub = uiLayoutColumn(col, 0);
- uiLayoutSetActive(sub, RNA_boolean_get(ptr, "preview"));
+ uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_preview"));
uiItemR(sub, ptr, "samples", 0, NULL, 0);
col = uiLayoutColumn(layout, 0);
@@ -630,7 +637,7 @@ static void node_composit_buts_glare(uiLayout *layout, bContext *C, PointerRNA *
uiItemR(layout, ptr, "fade", UI_ITEM_R_SLIDER, NULL, 0);
if (RNA_enum_get(ptr, "glare_type")== 0)
- uiItemR(layout, ptr, "rotate_45", 0, NULL, 0);
+ uiItemR(layout, ptr, "use_rotate_45", 0, NULL, 0);
}
if (RNA_enum_get(ptr, "glare_type")== 1) {
uiItemR(layout, ptr, "size", 0, NULL, 0);
@@ -661,12 +668,12 @@ static void node_composit_buts_lensdist(uiLayout *layout, bContext *C, PointerRN
uiLayout *col;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "projector", 0, NULL, 0);
+ uiItemR(col, ptr, "use_projector", 0, NULL, 0);
col = uiLayoutColumn(col, 0);
- uiLayoutSetActive(col, RNA_boolean_get(ptr, "projector")==0);
- uiItemR(col, ptr, "jitter", 0, NULL, 0);
- uiItemR(col, ptr, "fit", 0, NULL, 0);
+ uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_projector")==0);
+ uiItemR(col, ptr, "use_jitter", 0, NULL, 0);
+ uiItemR(col, ptr, "use_fit", 0, NULL, 0);
}
static void node_composit_buts_vecblur(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -679,10 +686,10 @@ static void node_composit_buts_vecblur(uiLayout *layout, bContext *C, PointerRNA
col= uiLayoutColumn(layout, 1);
uiItemL(col, "Speed:", 0);
- uiItemR(col, ptr, "min_speed", 0, "Min", 0);
- uiItemR(col, ptr, "max_speed", 0, "Max", 0);
+ uiItemR(col, ptr, "speed_min", 0, "Min", 0);
+ uiItemR(col, ptr, "speed_max", 0, "Max", 0);
- uiItemR(layout, ptr, "curved", 0, NULL, 0);
+ uiItemR(layout, ptr, "use_curved", 0, NULL, 0);
}
static void node_composit_buts_filter(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -699,13 +706,21 @@ static void node_composit_buts_crop(uiLayout *layout, bContext *C, PointerRNA *p
{
uiLayout *col;
- uiItemR(layout, ptr, "crop_size", 0, NULL, 0);
-
+ uiItemR(layout, ptr, "use_crop_size", 0, NULL, 0);
+ uiItemR(layout, ptr, "relative", 0, NULL, 0);
+
col= uiLayoutColumn(layout, 1);
- 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);
+ if (RNA_boolean_get(ptr, "relative")){
+ uiItemR(col, ptr, "rel_min_x", 0, "Left", 0);
+ uiItemR(col, ptr, "rel_max_x", 0, "Right", 0);
+ uiItemR(col, ptr, "rel_min_y", 0, "Up", 0);
+ uiItemR(col, ptr, "rel_max_y", 0, "Down", 0);
+ } else {
+ uiItemR(col, ptr, "min_x", 0, "Left", 0);
+ uiItemR(col, ptr, "max_x", 0, "Right", 0);
+ uiItemR(col, ptr, "min_y", 0, "Up", 0);
+ uiItemR(col, ptr, "max_y", 0, "Down", 0);
+ }
}
static void node_composit_buts_splitviewer(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -744,7 +759,7 @@ static void node_composit_buts_alphaover(uiLayout *layout, bContext *C, PointerR
uiLayout *col;
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "convert_premul", 0, NULL, 0);
+ uiItemR(col, ptr, "use_premultiply", 0, NULL, 0);
uiItemR(col, ptr, "premul", 0, NULL, 0);
}
@@ -753,9 +768,9 @@ static void node_composit_buts_hue_sat(uiLayout *layout, bContext *C, PointerRNA
uiLayout *col;
col =uiLayoutColumn(layout, 0);
- 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);
+ uiItemR(col, ptr, "color_hue", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "color_saturation", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "color_value", UI_ITEM_R_SLIDER, NULL, 0);
}
static void node_composit_buts_dilateerode(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -790,17 +805,17 @@ static void node_composit_buts_color_spill(uiLayout *layout, bContext *C, Pointe
uiItemR(row, ptr, "channel", UI_ITEM_R_EXPAND, NULL, 0);
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "algorithm", 0, NULL, 0);
+ uiItemR(col, ptr, "limit_method", 0, NULL, 0);
- if(RNA_enum_get(ptr, "algorithm")==0) {
+ if(RNA_enum_get(ptr, "limit_method")==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, "use_unspill", 0, NULL, 0);
+ if (RNA_enum_get(ptr, "use_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);
@@ -812,13 +827,13 @@ static void node_composit_buts_chroma_matte(uiLayout *layout, bContext *C, Point
uiLayout *col;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "acceptance", 0, NULL, 0);
- uiItemR(col, ptr, "cutoff", 0, NULL, 0);
+ uiItemR(col, ptr, "tolerance", 0, NULL, 0);
+ uiItemR(col, ptr, "threshold", 0, NULL, 0);
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "lift", UI_ITEM_R_SLIDER, NULL, 0);
+ /*uiItemR(col, ptr, "lift", UI_ITEM_R_SLIDER, NULL, 0); Removed for now */
uiItemR(col, ptr, "gain", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "shadow_adjust", UI_ITEM_R_SLIDER, NULL, 0);
+ /*uiItemR(col, ptr, "shadow_adjust", UI_ITEM_R_SLIDER, NULL, 0); Removed for now*/
}
static void node_composit_buts_color_matte(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -826,9 +841,9 @@ static void node_composit_buts_color_matte(uiLayout *layout, bContext *C, Pointe
uiLayout *col;
col= uiLayoutColumn(layout, 1);
- 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);
+ uiItemR(col, ptr, "color_hue", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "color_saturation", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "color_value", UI_ITEM_R_SLIDER, NULL, 0);
}
static void node_composit_buts_channel_matte(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -842,19 +857,19 @@ static void node_composit_buts_channel_matte(uiLayout *layout, bContext *C, Poin
col=uiLayoutColumn(layout, 0);
uiItemL(col, "Key Channel:", 0);
row= uiLayoutRow(col, 0);
- uiItemR(row, ptr, "channel", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, ptr, "matte_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) {
+ uiItemR(col, ptr, "limit_method", 0, NULL, 0);
+ if(RNA_enum_get(ptr, "limit_method")==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);
+ uiItemR(col, ptr, "limit_max", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "limit_min", UI_ITEM_R_SLIDER, NULL, 0);
}
static void node_composit_buts_luma_matte(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -862,8 +877,8 @@ static void node_composit_buts_luma_matte(uiLayout *layout, bContext *C, Pointer
uiLayout *col;
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "high", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "low", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "limit_max", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "limit_min", UI_ITEM_R_SLIDER, NULL, 0);
}
static void node_composit_buts_map_uv(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -881,16 +896,19 @@ static void node_composit_buts_file_output(uiLayout *layout, bContext *C, Pointe
uiLayout *col, *row;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "filename", 0, "", 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, ptr, "exr_half", 0, NULL, 0);
+ uiItemR(row, ptr, "use_exr_half", 0, NULL, 0);
uiItemR(row, ptr, "exr_codec", 0, "", 0);
}
else if (RNA_enum_get(ptr, "image_type")== R_JPEG90) {
- uiItemR(row, ptr, "quality", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(row, ptr, "quality", UI_ITEM_R_SLIDER, "Quality", 0);
+ }
+ else if (RNA_enum_get(ptr, "image_type")== R_PNG) {
+ uiItemR(row, ptr, "quality", UI_ITEM_R_SLIDER, "Compression", 0);
}
row= uiLayoutRow(layout, 1);
@@ -905,7 +923,7 @@ static void node_composit_buts_scale(uiLayout *layout, bContext *C, PointerRNA *
static void node_composit_buts_rotate(uiLayout *layout, bContext *C, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "filter", 0, "", 0);
+ uiItemR(layout, ptr, "filter_type", 0, "", 0);
}
static void node_composit_buts_invert(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -913,8 +931,8 @@ static void node_composit_buts_invert(uiLayout *layout, bContext *C, PointerRNA
uiLayout *col;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "rgb", 0, NULL, 0);
- uiItemR(col, ptr, "alpha", 0, NULL, 0);
+ uiItemR(col, ptr, "invert_rgb", 0, NULL, 0);
+ uiItemR(col, ptr, "invert_alpha", 0, NULL, 0);
}
static void node_composit_buts_premulkey(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -931,23 +949,23 @@ static void node_composit_buts_colorbalance(uiLayout *layout, bContext *C, Point
{
uiLayout *split, *col, *row;
- uiItemR(layout, ptr, "correction_formula", 0, NULL, 0);
+ uiItemR(layout, ptr, "correction_method", 0, NULL, 0);
- if (RNA_enum_get(ptr, "correction_formula")== 0) {
+ if (RNA_enum_get(ptr, "correction_method")== 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, 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, 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, ptr, "gain", 0, NULL, 0);
@@ -955,17 +973,17 @@ static void node_composit_buts_colorbalance(uiLayout *layout, bContext *C, Point
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, 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, 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, ptr, "slope", 0, NULL, 0);
}
@@ -1154,7 +1172,7 @@ static void node_texture_buts_proc(uiLayout *layout, bContext *C, PointerRNA *pt
case TEX_BLEND:
uiItemR(col, &tex_ptr, "progression", 0, "", 0);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "flip_axis", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, &tex_ptr, "use_flip_axis", UI_ITEM_R_EXPAND, NULL, 0);
break;
case TEX_MARBLE:
@@ -1163,14 +1181,14 @@ static void node_texture_buts_proc(uiLayout *layout, bContext *C, PointerRNA *pt
row= uiLayoutRow(col, 0);
uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, 0);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "noisebasis2", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, &tex_ptr, "noisebasis_2", UI_ITEM_R_EXPAND, NULL, 0);
break;
case TEX_WOOD:
uiItemR(col, &tex_ptr, "noise_basis", 0, "", 0);
uiItemR(col, &tex_ptr, "stype", 0, "", 0);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "noisebasis2", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, &tex_ptr, "noisebasis_2", 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, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, 0);
@@ -1199,7 +1217,7 @@ static void node_texture_buts_image(uiLayout *layout, bContext *C, PointerRNA *p
static void node_texture_buts_output(uiLayout *layout, bContext *C, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "output_name", 0, "", 0);
+ uiItemR(layout, ptr, "filepath", 0, "", 0);
}
/* only once called */
@@ -1293,14 +1311,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)
@@ -1310,8 +1331,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 41cf689407b..11319d817c7 100644
--- a/source/blender/editors/space_node/node_buttons.c
+++ b/source/blender/editors/space_node/node_buttons.c
@@ -41,16 +41,9 @@
#include "BLI_rand.h"
#include "BKE_context.h"
-#include "BKE_depsgraph.h"
-#include "BKE_idprop.h"
-#include "BKE_object.h"
#include "BKE_node.h"
-#include "BKE_global.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"
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index f4c9353ff92..cc7c966e397 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -40,20 +40,10 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_threads.h"
-#include "MEM_guardedalloc.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
-#include "BKE_global.h"
-#include "BKE_image.h"
-#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_material.h"
-#include "BKE_node.h"
-#include "BKE_object.h"
-#include "BKE_texture.h"
-#include "BKE_text.h"
-#include "BKE_utildefines.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -140,6 +130,9 @@ void ED_node_generic_update(Main *bmain, Scene *scene, bNodeTree *ntree, bNode *
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)
@@ -623,13 +616,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 */
@@ -658,6 +645,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);
@@ -680,42 +680,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 */
@@ -733,10 +723,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);
@@ -768,10 +758,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))) {
@@ -842,6 +828,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);
@@ -895,10 +883,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);
@@ -1040,9 +1028,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);
@@ -1064,14 +1052,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);
@@ -1127,14 +1113,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 69b2cb95a9d..829c74fd26d 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -31,6 +31,7 @@
#include <stdlib.h>
#include <math.h>
#include <string.h>
+#include <errno.h>
#include "MEM_guardedalloc.h"
@@ -40,7 +41,6 @@
#include "DNA_scene_types.h"
#include "BKE_context.h"
-#include "BKE_colortools.h"
#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_library.h"
@@ -50,10 +50,7 @@
#include "BKE_paint.h"
#include "BKE_texture.h"
#include "BKE_report.h"
-#include "BKE_scene.h"
-#include "BKE_utildefines.h"
-#include "BIF_gl.h"
#include "BLI_math.h"
#include "BLI_blenlib.h"
@@ -61,9 +58,11 @@
#include "RE_pipeline.h"
+#include "IMB_imbuf_types.h"
#include "ED_node.h"
#include "ED_screen.h"
+#include "ED_render.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -73,7 +72,7 @@
#include "UI_interface.h"
#include "UI_view2d.h"
-
+
#include "node_intern.h"
#define SOCK_IN 1
@@ -87,6 +86,7 @@ typedef struct CompoJob {
bNodeTree *localtree;
short *stop;
short *do_update;
+ float *progress;
} CompoJob;
/* called by compo, only to check job 'stop' value */
@@ -132,9 +132,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;
@@ -144,11 +151,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();
@@ -156,6 +166,7 @@ static void compo_startjob(void *cjv, short *stop, short *do_update)
ntree->test_break= NULL;
ntree->stats_draw= NULL;
+ ntree->progress= NULL;
}
@@ -165,7 +176,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 */
@@ -175,7 +186,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);
@@ -396,7 +407,7 @@ void snode_set_context(SpaceNode *snode, Scene *scene)
snode->id= &tx->id;
}
else {
- Brush *brush= NULL;
+ struct Brush *brush= NULL;
if(ob && (ob->mode & OB_MODE_SCULPT))
brush= paint_brush(&scene->toolsettings->sculpt->paint);
@@ -535,6 +546,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);
@@ -580,6 +593,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)
@@ -686,68 +701,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)
+{
+ 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)
{
- ScrArea *sa;
+ 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;
+ return OPERATOR_RUNNING_MODAL;
+}
+
+
+void NODE_OT_backimage_move(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Background Image Move";
+ ot->idname= "NODE_OT_backimage_move";
- getmouseco_sc(mvalo);
+ /* api callbacks */
+ ot->invoke= snode_bg_viewmove_invoke;
+ ot->modal= snode_bg_viewmove_modal;
+ ot->poll= ED_operator_node_active;
- /* store the old cursor to temporarily change it */
- oldcursor=get_cursor();
- win=winlay_get_active_window();
+ /* 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)
+{
- SetBlenderCursor(BC_NSEW_SCROLLCURSOR);
+ /* identifiers */
+ ot->name= "Background Image Zoom";
+ ot->idname= "NODE_OT_backimage_zoom";
- 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();
- }
+ /* api callbacks */
+ ot->exec= backimage_zoom;
+ ot->poll= ED_operator_node_active;
- window_set_cursor(win, oldcursor);
+ /* flags */
+ ot->flag= OPTYPE_BLOCKING;
+
+ /* internal */
+ RNA_def_float(ot->srna, "factor", 1.2f, 0.0f, 10.0f, "Factor", "", 0.0f, 10.0f);
}
-#endif
+
/* ********************** size widget operator ******************** */
@@ -864,6 +936,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;
@@ -892,31 +1037,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)
{
@@ -1256,6 +1471,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);
@@ -1414,7 +1631,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)
@@ -1468,6 +1685,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) {
@@ -1514,6 +1733,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);
@@ -1577,6 +1798,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;
@@ -1622,15 +1845,18 @@ 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;
+ Main *bmain= CTX_data_main(C);
+ 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)
+ for(scene= bmain->scene.first; scene; scene= scene->id.next)
scene->id.flag |= LIB_DOIT;
for(node= snode->edittree->nodes.first; node; node= node->next) {
@@ -1644,26 +1870,57 @@ void node_read_renderlayers(SpaceNode *snode)
}
}
- // XXX snode_notify(snode);
+ snode_notify(C, snode);
+ return OPERATOR_FINISHED;
+}
+
+void NODE_OT_read_renderlayers(wmOperatorType *ot)
+{
+
+ ot->name= "Read Render Layers";
+ ot->idname= "NODE_OT_read_renderlayers";
+
+ ot->exec= node_read_renderlayers_exec;
+
+ ot->poll= ED_operator_node_active;
+
+ /* flags */
+ ot->flag= 0;
}
-void node_read_fullsamplelayers(SpaceNode *snode)
+static int node_read_fullsamplelayers_exec(bContext *C, wmOperator *op)
{
- Scene *curscene= NULL; // XXX
+ SpaceNode *snode= CTX_wm_space_node(C);
+ Scene *curscene= CTX_data_scene(C);
Render *re= RE_NewRender(curscene->id.name);
- WM_cursor_wait(1);
+// WM_cursor_wait(1);
- //BIF_init_render_callbacks(re, 1);
RE_MergeFullSample(re, curscene, snode->nodetree);
- //BIF_end_render_callbacks();
+ 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;
- // allqueue(REDRAWNODE, 1);
- // allqueue(REDRAWIMAGE, 1);
+ ot->poll= ED_operator_node_active;
- WM_cursor_wait(0);
+ /* flags */
+ ot->flag= 0;
}
+
+/* ************************* */
+
void imagepaint_composite_tags(bNodeTree *ntree, Image *image, ImageUser *iuser)
{
bNode *node;
@@ -1714,6 +1971,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) {
@@ -1747,49 +2006,144 @@ void NODE_OT_group_make(wmOperatorType *ot)
/* ****************** Hide operator *********************** */
-static int node_hide_exec(bContext *C, wmOperator *op)
+static void node_flag_toggle_exec(SpaceNode *snode, int toggle_flag)
{
- SpaceNode *snode= CTX_wm_space_node(C);
+ int tot_eq= 0, tot_neq= 0;
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++;
+
+ if(toggle_flag== NODE_PREVIEW && (node->typeinfo->flag & NODE_PREVIEW)==0)
+ continue;
+
+ if(node->flag & toggle_flag)
+ tot_eq++;
else
- nothidden++;
+ tot_neq++;
}
}
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;
+
+ 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);
+
+ /* sanity checking (poll callback checks this already) */
+ if((snode == NULL) || (snode->edittree == NULL))
+ return OPERATOR_CANCELLED;
+
+ 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;
}
@@ -1805,6 +2159,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) {
@@ -1819,12 +2175,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;
@@ -1841,6 +2197,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) {
@@ -1901,4 +2259,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 3ed719eccc0..17c50b32e98 100644
--- a/source/blender/editors/space_node/node_header.c
+++ b/source/blender/editors/space_node/node_header.c
@@ -42,14 +42,11 @@
#include "BKE_screen.h"
#include "BKE_node.h"
#include "BKE_main.h"
-#include "BKE_utildefines.h"
#include "WM_api.h"
#include "WM_types.h"
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "UI_interface.h"
diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h
index ade31ee525a..77fda0627e7 100644
--- a/source/blender/editors/space_node/node_intern.h
+++ b/source/blender/editors/space_node/node_intern.h
@@ -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 9994da909d3..46cd8515f23 100644
--- a/source/blender/editors/space_node/node_ops.c
+++ b/source/blender/editors/space_node/node_ops.c
@@ -30,7 +30,6 @@
#include "DNA_scene_types.h"
#include "BKE_context.h"
-#include "BKE_node.h"
#include "ED_screen.h"
#include "ED_transform.h"
@@ -51,11 +50,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);
@@ -69,6 +73,16 @@ 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)
@@ -78,6 +92,11 @@ void ED_operatormacros_node(void)
ot= WM_operatortype_append_macro("NODE_OT_duplicate_move", "Duplicate", OPTYPE_UNDO|OPTYPE_REGISTER);
WM_operatortype_macro_define(ot, "NODE_OT_duplicate");
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)
@@ -110,14 +129,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);
@@ -129,10 +159,16 @@ void node_keymap(struct wmKeyConfig *keyconf)
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 b690059fc12..ec08cdf07ac 100644
--- a/source/blender/editors/space_node/node_select.c
+++ b/source/blender/editors/space_node/node_select.c
@@ -32,9 +32,6 @@
#include "DNA_scene_types.h"
#include "BKE_context.h"
-#include "BKE_node.h"
-#include "BKE_global.h"
-#include "BKE_utildefines.h"
#include "BLI_rect.h"
@@ -112,9 +109,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)) {
@@ -123,7 +117,7 @@ static int node_select_exec(bContext *C, wmOperator *op)
}
/* send notifiers */
- WM_event_add_notifier(C, NC_NODE|ND_NODE_SELECT, NULL);
+ WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL);
/* allow tweak event to work too */
return OPERATOR_FINISHED|OPERATOR_PASS_THROUGH;
@@ -191,7 +185,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;
}
@@ -267,14 +261,14 @@ 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;
}
void NODE_OT_select_all(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Select/Deselect All";
+ ot->name = "Select or Deselect All";
ot->description = "(De)select all nodes";
ot->idname = "NODE_OT_select_all";
@@ -307,7 +301,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;
}
@@ -347,7 +341,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;
}
@@ -366,3 +360,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 43c80f693b1..b4f09f960d6 100644
--- a/source/blender/editors/space_node/node_state.c
+++ b/source/blender/editors/space_node/node_state.c
@@ -33,7 +33,6 @@
#include "BKE_context.h"
#include "BKE_node.h"
-#include "BKE_global.h"
#include "BLI_rect.h"
@@ -51,12 +50,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)
@@ -64,7 +64,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);
@@ -89,7 +89,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);
}
@@ -238,7 +242,7 @@ static void snode_home(ScrArea *sa, ARegion *ar, SpaceNode* snode)
cur->xmin= cur->ymin= 0.0f;
cur->xmax=ar->winx;
- cur->xmax= ar->winy;
+ cur->ymax=ar->winy;
if(snode->edittree) {
for(node= snode->edittree->nodes.first; node; node= node->next) {
@@ -256,19 +260,20 @@ static void snode_home(ScrArea *sa, ARegion *ar, SpaceNode* snode)
snode->yof= 0;
width= cur->xmax - cur->xmin;
height= cur->ymax- cur->ymin;
+
if(width > height) {
float newheight;
newheight= oldheight * width/oldwidth;
cur->ymin= cur->ymin - newheight/4;
- cur->ymax= cur->ymin + newheight;
+ cur->ymax= cur->ymax + newheight/4;
}
else {
float newwidth;
newwidth= oldwidth * height/oldheight;
cur->xmin= cur->xmin - newwidth/4;
- cur->xmax= cur->xmin + newwidth;
+ cur->xmax= cur->xmax + newwidth/4;
}
-
+
ar->v2d.tot= ar->v2d.cur;
UI_view2d_curRect_validate(&ar->v2d);
}
diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c
index afb2ec04f55..d9a4dda9d6e 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -40,19 +40,17 @@
#include "BLI_math.h"
#include "BLI_rand.h"
-#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_screen.h"
-#include "BKE_node.h"
#include "ED_render.h"
#include "ED_screen.h"
-#include "BIF_gl.h"
#include "WM_api.h"
#include "WM_types.h"
+#include "UI_resources.h"
#include "UI_view2d.h"
#include "RNA_access.h"
@@ -135,8 +133,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;
@@ -199,7 +197,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;
}
}
@@ -262,6 +261,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);
@@ -271,6 +271,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)
@@ -280,6 +285,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)
{
@@ -340,6 +386,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;
}
@@ -364,6 +411,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/Makefile b/source/blender/editors/space_outliner/Makefile
index 8d7cd017e0b..bd6725c5b71 100644
--- a/source/blender/editors/space_outliner/Makefile
+++ b/source/blender/editors/space_outliner/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c
index 44baea0737f..16021e0f909 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 <math.h>
#include <string.h>
#include <stdlib.h>
#include <stddef.h>
@@ -47,13 +48,19 @@
#include "DNA_scene_types.h"
#include "DNA_world_types.h"
#include "DNA_sequence_types.h"
+#include "DNA_object_types.h"
#include "BLI_blenlib.h"
-#include "IMB_imbuf_types.h"
+#if defined WIN32 && !defined _LIBC
+# include "BLI_fnmatch.h" /* use fnmatch included in blenlib */
+#else
+# define _GNU_SOURCE
+# include <fnmatch.h>
+#endif
+
#include "BKE_animsys.h"
-#include "BKE_constraint.h"
#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_depsgraph.h"
@@ -62,14 +69,10 @@
#include "BKE_group.h"
#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_material.h"
#include "BKE_modifier.h"
-#include "BKE_object.h"
#include "BKE_report.h"
-#include "BKE_screen.h"
#include "BKE_scene.h"
#include "BKE_sequencer.h"
-#include "BKE_utildefines.h"
#include "ED_armature.h"
#include "ED_object.h"
@@ -115,7 +118,7 @@
/* ************* XXX **************** */
-static void error() {}
+static void error(const char *dummy, ...) {}
/* ********************************** */
@@ -125,6 +128,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 ***************** */
@@ -426,87 +430,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_INDIRECT);
+ te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_INDIRECT));
te->name= "Indirect";
te->directdata= &srl->passflag;
- /* TODO SCE_PASS_ENVIRONMENT/EMIT overflow short..
-
- te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_ENVIRONMENT);
+ 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, SCE_PASS_EMIT);
+ te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_EMIT));
te->name= "Emit";
- te->directdata= &srl->passflag;*/
+ 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,
@@ -974,8 +982,6 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
else {
if((seq->strip) && (seq->strip->stripdata))
te->name= seq->strip->stripdata->name;
- else if((seq->strip) && (seq->strip->tstripdata) && (seq->strip->tstripdata->ibuf))
- te->name= seq->strip->tstripdata->ibuf->name;
else
te->name= "SQ None";
}
@@ -1235,6 +1241,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;
@@ -1318,7 +1404,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);
@@ -1416,6 +1502,7 @@ static void outliner_build_tree(Main *mainvar, Scene *scene, SpaceOops *soops)
}
outliner_sort(soops, &soops->tree);
+ outliner_filter_tree(soops, &soops->tree);
}
/* **************** INTERACTIVE ************* */
@@ -1467,10 +1554,10 @@ static void outliner_set_flag(SpaceOops *soops, ListBase *lb, short flag, short
void object_toggle_visibility_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
{
Base *base= (Base *)te->directdata;
-
- if(base==NULL) base= object_in_scene((Object *)tselem->id, scene);
- if(base) {
- base->object->restrictflag^=OB_RESTRICT_VIEW;
+ if(base || (base= object_in_scene((Object *)tselem->id, scene))) {
+ if((base->object->restrictflag ^= OB_RESTRICT_VIEW)) {
+ ED_base_object_select(base, BA_DESELECT);
+ }
}
}
@@ -1540,8 +1627,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;
@@ -1798,8 +1883,8 @@ static void tree_element_set_active_object(bContext *C, Scene *scene, SpaceOops
}
/* find associated base in current scene */
- for(base= FIRSTBASE; base; base= base->next)
- if(base->object==ob) break;
+ base= object_in_scene(ob, scene);
+
if(base) {
if(set==2) {
/* swap select */
@@ -1809,12 +1894,8 @@ static void tree_element_set_active_object(bContext *C, Scene *scene, SpaceOops
ED_base_object_select(base, BA_SELECT);
}
else {
- Base *b;
/* deleselect all */
- for(b= FIRSTBASE; b; b= b->next) {
- b->flag &= ~SELECT;
- b->object->flag= b->flag;
- }
+ scene_deselect_all(scene);
ED_base_object_select(base, BA_SELECT);
}
if(C)
@@ -1835,7 +1916,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;
@@ -1935,6 +2017,7 @@ static int tree_element_active_texture(bContext *C, Scene *scene, SpaceOops *soo
}
}
+ WM_event_add_notifier(C, NC_TEXTURE, NULL);
return 0;
}
@@ -2130,7 +2213,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);
}
@@ -2255,7 +2338,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);
@@ -2320,7 +2402,7 @@ static int do_outliner_item_activate(bContext *C, Scene *scene, ARegion *ar, Spa
return 1;
}
/* name and first icon */
- else if(mval[0]>te->xs && mval[0]<te->xend) {
+ else if(mval[0]>te->xs+OL_X && mval[0]<te->xend) {
/* always makes active object */
if(tselem->type!=TSE_SEQUENCE && tselem->type!=TSE_SEQ_STRIP && tselem->type!=TSE_SEQUENCE_DUP)
@@ -2333,12 +2415,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
@@ -2483,7 +2599,7 @@ static int do_outliner_item_rename(bContext *C, ARegion *ar, SpaceOops *soops, T
TreeStoreElem *tselem= TREESTORE(te);
/* name and first icon */
- if(mval[0]>te->xs && mval[0]<te->xend) {
+ if(mval[0]>te->xs+OL_X && mval[0]<te->xend) {
/* can't rename rna datablocks entries */
if(ELEM3(tselem->type, TSE_RNA_STRUCT, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM))
@@ -2645,17 +2761,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? */
@@ -2711,7 +2817,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);
@@ -2719,7 +2825,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 */
@@ -3008,7 +3114,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 {
@@ -3071,7 +3176,7 @@ static void object_delete_cb(bContext *C, Scene *scene, TreeElement *te, TreeSto
if(scene->obedit==base->object)
ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR|EM_DO_UNDO);
- ED_base_object_free_and_unlink(scene, base);
+ ED_base_object_free_and_unlink(CTX_data_main(C), scene, base);
te->directdata= NULL;
tselem->id= NULL;
}
@@ -3222,7 +3327,7 @@ void outliner_del(bContext *C, Scene *scene, ARegion *ar, SpaceOops *soops)
;// del_seq();
else {
outliner_do_object_operation(C, scene, soops, &soops->tree, object_delete_cb);
- DAG_scene_sort(scene);
+ DAG_scene_sort(CTX_data_main(C), scene);
ED_undo_push(C, "Delete Objects");
}
}
@@ -3241,6 +3346,7 @@ static EnumPropertyItem prop_object_op_types[] = {
static int outliner_object_operation_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
SpaceOops *soops= CTX_wm_space_outliner(C);
int event;
@@ -3267,7 +3373,7 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op)
}
else if(event==4) {
outliner_do_object_operation(C, scene, soops, &soops->tree, object_delete_cb);
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
str= "Delete Objects";
}
else if(event==5) { /* disabled, see above (ton) */
@@ -3318,6 +3424,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}
};
@@ -3344,7 +3453,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);
@@ -3776,7 +3885,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);
@@ -3784,7 +3893,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) {
@@ -4091,11 +4200,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)
@@ -4218,7 +4327,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:
@@ -4419,6 +4528,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;
@@ -4710,21 +4831,24 @@ static void outliner_draw_restrictcols(ARegion *ar, SpaceOops *soops)
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) {
-
/* Ouch! There is no backwards pointer from Object to Base,
* so have to do loop to find it. */
- for(base= FIRSTBASE; base; base= base->next) {
- if(base->object==ob) {
- base->flag &= ~SELECT;
- base->object->flag= base->flag;
- }
- }
+ ED_base_object_select(object_in_scene(ob, scene), BA_DESELECT);
}
WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
@@ -4732,21 +4856,14 @@ static void restrictbutton_view_cb(bContext *C, void *poin, void *poin2)
static void restrictbutton_sel_cb(bContext *C, void *poin, void *poin2)
{
- Base *base;
Scene *scene = (Scene *)poin;
Object *ob = (Object *)poin2;
/* if select restriction has just been turned on */
if (ob->restrictflag & OB_RESTRICT_SELECT) {
-
/* Ouch! There is no backwards pointer from Object to Base,
* so have to do loop to find it. */
- for(base= FIRSTBASE; base; base= base->next) {
- if(base->object==ob) {
- base->flag &= ~SELECT;
- base->object->flag= base->flag;
- }
- }
+ ED_base_object_select(object_in_scene(ob, scene), BA_DESELECT);
}
WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
@@ -4764,20 +4881,96 @@ 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);
}
static void restrictbutton_bone_cb(bContext *C, void *poin, void *poin2)
{
+ Bone *bone= (Bone *)poin2;
+ if(bone && (bone->flag & BONE_HIDDEN_P))
+ bone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL);
+}
+
+static void restrictbutton_ebone_cb(bContext *C, void *poin, void *poin2)
+{
+ EditBone *ebone= (EditBone *)poin2;
+ if(ebone && (ebone->flag & BONE_HIDDEN_A))
+ ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+
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);
@@ -4895,29 +5088,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, "hide", -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, "hide_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, "hide_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);
@@ -4930,16 +5151,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<<tselem->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(ELEM8(tselem->nr, 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, 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);
@@ -4965,7 +5188,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
uiBlockSetEmboss(block, UI_EMBOSSN);
bt= uiDefIconButBitI(block, ICONTOG, BONE_HIDDEN_P, 0, ICON_RESTRICT_VIEW_OFF,
(int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, &(bone->flag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
- uiButSetFunc(bt, restrictbutton_bone_cb, NULL, NULL);
+ uiButSetFunc(bt, restrictbutton_bone_cb, NULL, bone);
bt= uiDefIconButBitI(block, ICONTOG, BONE_UNSELECTABLE, 0, ICON_RESTRICT_SELECT_OFF,
(int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (short)te->ys, 17, OL_H-1, &(bone->flag), 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
@@ -4977,11 +5200,11 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
uiBlockSetEmboss(block, UI_EMBOSSN);
bt= uiDefIconButBitI(block, ICONTOG, BONE_HIDDEN_A, 0, ICON_RESTRICT_VIEW_OFF,
(int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, &(ebone->flag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
- uiButSetFunc(bt, restrictbutton_bone_cb, NULL, NULL);
+ uiButSetFunc(bt, restrictbutton_ebone_cb, NULL, ebone);
bt= uiDefIconButBitI(block, ICONTOG, BONE_UNSELECTABLE, 0, ICON_RESTRICT_SELECT_OFF,
(int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (short)te->ys, 17, OL_H-1, &(ebone->flag), 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
- uiButSetFunc(bt, restrictbutton_bone_cb, NULL, NULL);
+ uiButSetFunc(bt, restrictbutton_ebone_cb, NULL, NULL);
}
}
diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h
index 1c34cb5ef87..fa3078a365b 100644
--- a/source/blender/editors/space_outliner/outliner_intern.h
+++ b/source/blender/editors/space_outliner/outliner_intern.h
@@ -99,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
@@ -147,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 fcd6e272390..d23e950a033 100644
--- a/source/blender/editors/space_outliner/outliner_ops.c
+++ b/source/blender/editors/space_outliner/outliner_ops.c
@@ -75,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 63508725b05..d3db64d6d03 100644
--- a/source/blender/editors/space_outliner/space_outliner.c
+++ b/source/blender/editors/space_outliner/space_outliner.c
@@ -36,11 +36,8 @@
#include "BLI_math.h"
#include "BLI_rand.h"
-#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_screen.h"
-#include "BKE_texture.h"
-#include "BKE_utildefines.h"
#include "ED_screen.h"
@@ -48,7 +45,6 @@
#include "WM_types.h"
#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "UI_resources.h"
#include "UI_view2d.h"
@@ -71,11 +67,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/Makefile b/source/blender/editors/space_script/Makefile
index 3322cb61a7f..35462b8c255 100644
--- a/source/blender/editors/space_script/Makefile
+++ b/source/blender/editors/space_script/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/space_script/script_edit.c b/source/blender/editors/space_script/script_edit.c
index 6ef9a96b478..610fecaa543 100644
--- a/source/blender/editors/space_script/script_edit.c
+++ b/source/blender/editors/space_script/script_edit.c
@@ -30,14 +30,10 @@
#include <stdio.h>
-#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BKE_context.h"
-#include "BKE_global.h"
-#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -50,18 +46,17 @@
#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;
}
@@ -81,6 +76,30 @@ 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 */
+ WM_cursor_wait(1);
+ BPY_eval_string(C, "__import__('bpy').utils.load_scripts(reload_scripts=True)");
+ WM_cursor_wait(0);
+ 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 9c23d1b8131..6e65d458451 100644
--- a/source/blender/editors/space_script/script_header.c
+++ b/source/blender/editors/space_script/script_header.c
@@ -30,20 +30,16 @@
#include <stdio.h>
-#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BKE_context.h"
-#include "BKE_screen.h"
#include "ED_screen.h"
#include "ED_types.h"
#include "ED_util.h"
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "UI_interface.h"
#include "UI_resources.h"
diff --git a/source/blender/editors/space_script/script_intern.h b/source/blender/editors/space_script/script_intern.h
index 57e4cc6c793..ed625bb8ec6 100644
--- a/source/blender/editors/space_script/script_intern.h
+++ b/source/blender/editors/space_script/script_intern.h
@@ -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 353d80f1921..a52ffbd0808 100644
--- a/source/blender/editors/space_script/script_ops.c
+++ b/source/blender/editors/space_script/script_ops.c
@@ -29,7 +29,6 @@
#include <stdlib.h>
#include <math.h>
-#include "MEM_guardedalloc.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
@@ -38,8 +37,6 @@
#include "BLI_blenlib.h"
#include "BKE_context.h"
-#include "BKE_global.h"
-#include "BKE_utildefines.h"
#include "RNA_access.h"
@@ -55,6 +52,7 @@
void script_operatortypes(void)
{
WM_operatortype_append(SCRIPT_OT_python_file_run);
+ WM_operatortype_append(SCRIPT_OT_reload);
}
void script_keymap(wmKeyConfig *keyconf)
@@ -62,6 +60,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 3629c980a25..f93ddc6efbe 100644
--- a/source/blender/editors/space_script/space_script.c
+++ b/source/blender/editors/space_script/space_script.c
@@ -36,7 +36,6 @@
#include "BLI_math.h"
#include "BLI_rand.h"
-#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -50,8 +49,9 @@
#include "UI_resources.h"
#include "UI_view2d.h"
-
+#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
+#endif
#include "script_intern.h" // own include
@@ -140,11 +140,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/Makefile b/source/blender/editors/space_sequencer/Makefile
index 2fb3de516b4..bd2b837d499 100644
--- a/source/blender/editors/space_sequencer/Makefile
+++ b/source/blender/editors/space_sequencer/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) 2007 Blender Foundation
# All rights reserved.
@@ -38,6 +38,7 @@ CFLAGS += $(LEVEL_1_C_WARNINGS)
CPPFLAGS += -I$(NAN_GLEW)/include
CPPFLAGS += -I$(OPENGL_HEADERS)
+CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
# not very neat....
CPPFLAGS += -I../../windowmanager
diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c
index b8c233bfe3e..e58e2ebb328 100644
--- a/source/blender/editors/space_sequencer/sequencer_add.c
+++ b/source/blender/editors/space_sequencer/sequencer_add.c
@@ -43,20 +43,14 @@
#include "DNA_scene_types.h"
+#include "DNA_userdef_types.h"
#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_image.h"
-#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_plugin_types.h"
#include "BKE_sequencer.h"
-#include "BKE_scene.h"
-#include "BKE_utildefines.h"
#include "BKE_report.h"
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -85,8 +79,6 @@
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, "frame_start", 0, INT_MIN, INT_MAX, "Start Frame", "Start frame of the sequence strip", INT_MIN, INT_MAX);
@@ -101,6 +93,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);
@@ -120,11 +126,14 @@ static void sequencer_generic_invoke_xy__internal(bContext *C, wmOperator *op, w
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, "frame_start");
@@ -133,9 +142,13 @@ static void seq_load_operator_info(SeqLoadInfo *seq_load, wmOperator *op)
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);
-
- RNA_string_get(op->ptr, "path", seq_load->path); /* full path, file is set by the caller */
+ 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;
+ }
if (RNA_struct_find_property(op->ptr, "frame_end")) {
seq_load->end_frame = RNA_int_get(op->ptr, "frame_end");
@@ -152,6 +165,22 @@ 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") {
+ char *name= RNA_string_get_alloc(&itemptr, "name", NULL, 0);
+ BLI_strncpy(seq_load->name, name, sizeof(seq_load->name));
+ MEM_freeN(name);
+ break;
+ }
+ RNA_END;
+ }
}
/* add scene operator */
@@ -179,9 +208,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");
@@ -190,11 +221,9 @@ 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);
@@ -202,7 +231,7 @@ static int sequencer_add_scene_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;
}
@@ -307,13 +336,26 @@ 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(RNA_collection_length(op->ptr, "files") || RNA_property_is_set(op->ptr, "filepath"))
+ return sequencer_add_movie_strip_exec(C, op);
+
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);
+
+ /* This is for drag and drop */
+ if(RNA_property_is_set(op->ptr, "filepath"))
+ return sequencer_add_movie_strip_exec(C, op);
+
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);
}
@@ -335,7 +377,7 @@ void SEQUENCER_OT_movie_strip_add(struct wmOperatorType *ot)
/* 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");
}
@@ -349,13 +391,26 @@ 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(RNA_collection_length(op->ptr, "files") || RNA_property_is_set(op->ptr, "filepath"))
+ return sequencer_add_sound_strip_exec(C, op);
+
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);
+
+ /* This is for drag and drop */
+ if(RNA_property_is_set(op->ptr, "filepath"))
+ return sequencer_add_sound_strip_exec(C, op);
+
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);
}
@@ -377,7 +432,7 @@ void SEQUENCER_OT_sound_strip_add(struct wmOperatorType *ot)
/* 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.");
}
@@ -401,26 +456,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(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;
}
@@ -440,13 +495,22 @@ 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(RNA_collection_length(op->ptr, "files"))
+ return sequencer_add_image_strip_exec(C, op);
+
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);
}
@@ -468,7 +532,7 @@ void SEQUENCER_OT_image_strip_add(struct wmOperatorType *ot)
/* 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);
}
@@ -495,7 +559,7 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op)
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;
@@ -511,11 +575,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);
@@ -544,7 +604,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);
@@ -558,6 +618,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);
@@ -571,7 +643,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;
}
@@ -592,6 +664,10 @@ static int sequencer_add_effect_strip_invoke(bContext *C, wmOperator *op, wmEven
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);
}
@@ -616,7 +692,7 @@ void SEQUENCER_OT_effect_strip_add(struct wmOperatorType *ot)
/* 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 a2aa7e649b9..4394e334614 100644
--- a/source/blender/editors/space_sequencer/sequencer_buttons.c
+++ b/source/blender/editors/space_sequencer/sequencer_buttons.c
@@ -33,10 +33,7 @@
#include "BLI_blenlib.h"
#include "BKE_context.h"
-#include "BKE_global.h"
-#include "BKE_main.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "ED_screen.h"
diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index 60927b5f3dd..afd8895edd9 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -39,12 +39,11 @@
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_userdef_types.h"
+#include "DNA_sound_types.h"
#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_plugin_types.h"
#include "BKE_sequencer.h"
-#include "BKE_scene.h"
#include "BKE_utildefines.h"
#include "BKE_sound.h"
@@ -126,6 +125,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);
@@ -167,7 +167,7 @@ static void get_seq_color3ubv(Scene *curscene, Sequence *seq, char *col)
}
}
-static void drawseqwave(Sequence *seq, float x1, float y1, float x2, float y2, float stepsize)
+static void drawseqwave(Scene *scene, Sequence *seq, float x1, float y1, float x2, float y2, float stepsize)
{
/*
x1 is the starting x value to draw the wave,
@@ -183,7 +183,9 @@ static void drawseqwave(Sequence *seq, float x1, float y1, float x2, float y2, f
float* samples = MEM_mallocN(length * sizeof(float) * 2, "seqwave_samples");
if(!samples)
return;
- if(sound_read_sound_buffer(seq->sound, samples, length) != length)
+ if(sound_read_sound_buffer(seq->sound, samples, length,
+ (seq->startofs + seq->anim_startofs)/FPS,
+ (seq->startofs + seq->anim_startofs + seq->enddisp - seq->startdisp)/FPS) != length)
{
MEM_freeN(samples);
return;
@@ -199,46 +201,86 @@ static void drawseqwave(Sequence *seq, float x1, float y1, float x2, float y2, f
}
}
+static void drawmeta_stipple(int value)
+{
+ if(value) {
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(stipple_halftone);
+
+ glEnable(GL_LINE_STIPPLE);
+ glLineStipple(1, 0x8888);
+ }
+ 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;
- float dx;
- int nr;
- char col[3];
-
- nr= BLI_countlist(&seqm->seqbase);
+ char col[4];
- dx= (x2-x1)/nr;
+ int chan_min= MAXSEQ;
+ int chan_max= 0;
+ int chan_range= 0;
+ float draw_range= y2 - y1;
+ float draw_height;
- if (seqm->flag & SEQ_MUTE) {
- glEnable(GL_POLYGON_STIPPLE);
- glPolygonStipple(stipple_halftone);
-
- glEnable(GL_LINE_STIPPLE);
- glLineStipple(1, 0x8888);
+ 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) {
- get_seq_color3ubv(scene, seq, col);
-
- glColor3ubv((GLubyte *)col);
+ 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;
- glRectf(x1, y1, x1+0.9*dx, y2);
-
- UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, -30);
- glColor3ubv((GLubyte *)col);
+ if((seqm->flag & SEQ_MUTE) == 0 && (seq->flag & SEQ_MUTE))
+ drawmeta_stipple(1);
- fdrawbox(x1, y1, x1+0.9*dx, y2);
-
- x1+= dx;
+ 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);
- if (seqm->flag & SEQ_MUTE) {
- glDisable(GL_POLYGON_STIPPLE);
- glDisable(GL_LINE_STIPPLE);
- }
+ glDisable(GL_BLEND);
}
/* draw a handle, for each end of a sequence strip */
@@ -324,11 +366,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;
@@ -337,10 +379,11 @@ 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);
+ if(pixely <= 0) return; /* can happen when the view is split/resized */
+
blendcol[0] = blendcol[1] = blendcol[2] = 120;
if(seq->startofs) {
@@ -451,7 +494,9 @@ static void draw_seq_text(View2D *v2d, Sequence *seq, float x1, float x2, float
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);
@@ -546,7 +591,7 @@ static void draw_shadedstrip(Sequence *seq, char *col, float x1, float y1, float
}
/*
-Draw a sequence strip, bounds check alredy made
+Draw a sequence strip, bounds check already made
ARegion is currently only used to get the windows width in pixels
so wave file sample drawing precision is zoom adjusted
*/
@@ -582,7 +627,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);
@@ -592,7 +637,7 @@ static void draw_seq_strip(Scene *scene, ARegion *ar, SpaceSeq *sseq, Sequence *
x2= seq->enddisp;
/* draw sound wave */
- if(seq->type == SEQ_SOUND) drawseqwave(seq, x1, y1, x2, y2, (ar->v2d.cur.xmax - ar->v2d.cur.xmin)/ar->winx);
+ if(seq->type == SEQ_SOUND) drawseqwave(scene, seq, x1, y1, x2, y2, (ar->v2d.cur.xmax - ar->v2d.cur.xmin)/ar->winx);
get_seq_color3ubv(scene, seq, col);
if (G.moving && (seq->flag & SELECT)) {
@@ -616,13 +661,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(x1<v2d->cur.xmin) x1= v2d->cur.xmin;
else if(x1>v2d->cur.xmax) x1= v2d->cur.xmax;
@@ -648,15 +692,15 @@ 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;
+ struct Main *bmain= CTX_data_main(C);
+ struct ImBuf *ibuf = 0;
+ struct ImBuf *scope = 0;
struct View2D *v2d = &ar->v2d;
int rectx, recty;
float viewrectx, viewrecty;
- int free_ibuf = 0;
- static int recursive= 0;
float render_size = 0.0;
float proxy_size = 100.0;
GLuint texid;
@@ -684,9 +728,11 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq
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);
@@ -694,33 +740,12 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq
UI_view2d_totRect_set(v2d, viewrectx + 0.5f, viewrecty + 0.5f);
UI_view2d_curRect_validate(v2d);
- /* BIG PROBLEM: the give_ibuf_seq() can call a rendering, which in turn calls redraws...
- this shouldn't belong in a window drawing....
- So: solve this once event based.
- Now we check for recursion, space type and active area again (ton) */
-
- if(recursive)
- return;
- else {
- recursive= 1;
- if (special_seq_update) {
- ibuf= give_ibuf_seq_direct(scene, rectx, recty, (scene->r.cfra), 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);
- }
- else {
- ibuf= (ImBuf *)give_ibuf_seq_threaded(scene, rectx, recty, (scene->r.cfra), sseq->chanshown, proxy_size);
- }
- recursive= 0;
-
- /* XXX HURMF! the give_ibuf_seq can call image display in this window */
-// if(sa->spacetype!=SPACE_SEQ)
-// return;
-// if(sa!=curarea) {
-// areawinset(sa->win);
-// }
- }
+ if (special_seq_update)
+ ibuf= give_ibuf_seq_direct(bmain, 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(bmain, scene, rectx, recty, cfra + frame_ofs, sseq->chanshown, proxy_size);
+ else
+ ibuf= (ImBuf *)give_ibuf_seq_threaded(bmain, scene, rectx, recty, cfra + frame_ofs, sseq->chanshown, proxy_size);
if(ibuf==NULL)
return;
@@ -731,28 +756,29 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq
switch(sseq->mainb) {
case SEQ_DRAW_IMG_IMBUF:
if (sseq->zebra != 0) {
- ibuf = make_zebra_view_from_ibuf(ibuf, sseq->zebra);
- free_ibuf = 1;
+ scope = make_zebra_view_from_ibuf(ibuf, sseq->zebra);
}
break;
case SEQ_DRAW_IMG_WAVEFORM:
if ((sseq->flag & SEQ_DRAW_COLOR_SEPERATED) != 0) {
- ibuf = make_sep_waveform_view_from_ibuf(ibuf);
+ scope = make_sep_waveform_view_from_ibuf(ibuf);
} else {
- ibuf = make_waveform_view_from_ibuf(ibuf);
+ scope = make_waveform_view_from_ibuf(ibuf);
}
- free_ibuf = 1;
break;
case SEQ_DRAW_IMG_VECTORSCOPE:
- ibuf = make_vectorscope_view_from_ibuf(ibuf);
- free_ibuf = 1;
+ scope = make_vectorscope_view_from_ibuf(ibuf);
break;
case SEQ_DRAW_IMG_HISTOGRAM:
- ibuf = make_histogram_view_from_ibuf(ibuf);
- free_ibuf = 1;
+ scope = make_histogram_view_from_ibuf(ibuf);
break;
}
+ if (scope) {
+ IMB_freeImBuf(ibuf);
+ ibuf = scope;
+ }
+
if(ibuf->rect_float && ibuf->rect==NULL) {
IMB_rect_from_float(ibuf);
}
@@ -770,56 +796,83 @@ 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);
glDeleteTextures(1, &texid);
- /* safety border */
- if (sseq->mainb == SEQ_DRAW_IMG_IMBUF &&
- (sseq->flag & SEQ_DRAW_SAFE_MARGINS) != 0) {
- float fac= 0.1;
+ if(sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
+
float x1 = v2d->tot.xmin;
float y1 = v2d->tot.ymin;
float x2 = v2d->tot.xmax;
float y2 = v2d->tot.ymax;
-
- float a= fac*(x2-x1);
- x1+= a;
- x2-= a;
-
- a= fac*(y2-y1);
- y1+= a;
- y2-= a;
-
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ /* border */
setlinestyle(3);
UI_ThemeColorBlendShade(TH_WIRE, TH_BACK, 1.0, 0);
-
- uiSetRoundBox(15);
- gl_round_box(GL_LINE_LOOP, x1, y1, x2, y2, 12.0);
+
+ glBegin(GL_LINE_LOOP);
+ glVertex2f(x1-0.5, y1-0.5);
+ glVertex2f(x1-0.5, y2+0.5);
+ glVertex2f(x2+0.5, y2+0.5);
+ glVertex2f(x2+0.5, y1-0.5);
+ glEnd();
+
+ /* safety border */
+ if ((sseq->flag & SEQ_DRAW_SAFE_MARGINS) != 0) {
+ float fac= 0.1;
+
+ float a= fac*(x2-x1);
+ x1+= a;
+ x2-= a;
+
+ a= fac*(y2-y1);
+ y1+= a;
+ y2-= a;
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ uiSetRoundBox(15);
+ gl_round_box(GL_LINE_LOOP, x1, y1, x2, y2, 12.0);
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
+ }
setlinestyle(0);
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
/* draw grease-pencil (image aligned) */
// if (sseq->flag & SEQ_DRAW_GPENCIL)
// XXX draw_gpencil_2dimage(sa, ibuf);
- if (free_ibuf) {
- IMB_freeImBuf(ibuf);
- }
+ IMB_freeImBuf(ibuf);
/* 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);
@@ -897,7 +950,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);
@@ -929,6 +982,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)
{
@@ -962,7 +1042,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) {
@@ -986,6 +1067,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 de0b048e9d5..d1654dc5d37 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -43,19 +43,13 @@
#include "BLI_storage_types.h"
-#include "DNA_ipo_types.h"
#include "DNA_scene_types.h"
#include "DNA_userdef_types.h"
#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_image.h"
-#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_plugin_types.h"
#include "BKE_sequencer.h"
-#include "BKE_scene.h"
-#include "BKE_utildefines.h"
#include "BKE_report.h"
#include "BKE_sound.h"
@@ -75,15 +69,11 @@
/* 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 */
@@ -103,6 +93,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}
};
@@ -166,7 +157,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;
@@ -392,7 +383,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
@@ -405,9 +396,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);
@@ -440,7 +431,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;
@@ -482,7 +473,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);
@@ -518,7 +509,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;
@@ -620,11 +611,11 @@ 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) {
- if (seq->type == SEQ_SOUND) {
+ if (seq->type == SEQ_SOUND && get_sequence_effect_num_inputs(type) != 0) {
*error_str= "Can't apply effects to audio sequence strips";
return 0;
}
@@ -680,36 +671,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;
@@ -752,153 +713,29 @@ 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) {
seqn= seq->next;
if((seq->flag & flag) || deleteall) {
- if(seq->type==SEQ_SOUND && seq->sound)
- seq->sound->id.us--;
+ if(seq->type==SEQ_SOUND && seq->sound) {
+ ((ID *)seq->sound)->us--; /* TODO, could be moved into seq_free_sequence() */
+ }
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;
- 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");
- }
-
- 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)
+static Sequence *cut_seq_hard(Main *bmain, Scene *scene, Sequence * seq, int cutframe)
{
TransSeq ts;
Sequence *seqn = 0;
@@ -945,12 +782,13 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence * seq, int cutframe)
}
}
- reload_sequence_new_file(scene, seq);
+ reload_sequence_new_file(bmain, scene, seq, FALSE);
calc_sequence(scene, seq);
+ new_tstripdata(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) {
@@ -984,13 +822,14 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence * seq, int cutframe)
seqn->startstill = 0;
}
- reload_sequence_new_file(scene, seqn);
+ reload_sequence_new_file(bmain, scene, seqn, FALSE);
calc_sequence(scene, seqn);
+ new_tstripdata(seqn);
}
return seqn;
}
-static Sequence *cut_seq_soft(Scene *scene, Sequence * seq, int cutframe)
+static Sequence *cut_seq_soft(Main *bmain, Scene *scene, Sequence * seq, int cutframe)
{
TransSeq ts;
Sequence *seqn = 0;
@@ -1036,10 +875,11 @@ static Sequence *cut_seq_soft(Scene *scene, Sequence * seq, int cutframe)
}
calc_sequence(scene, seq);
+ new_tstripdata(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) {
@@ -1071,6 +911,7 @@ static Sequence *cut_seq_soft(Scene *scene, Sequence * seq, int cutframe)
}
calc_sequence(scene, seqn);
+ new_tstripdata(seqn);
}
return seqn;
}
@@ -1078,8 +919,8 @@ static Sequence *cut_seq_soft(Scene *scene, Sequence * seq, int cutframe)
/* like duplicate, but only duplicate and cut overlapping strips,
* strips to the left of the cutframe are ignored and strips to the right are moved into the new list */
-static int cut_seq_list(Scene *scene, ListBase *old, ListBase *new, int cutframe,
- Sequence * (*cut_seq)(Scene *, Sequence *, int))
+static int cut_seq_list(Main *bmain, Scene *scene, ListBase *old, ListBase *new, int cutframe,
+ Sequence * (*cut_seq)(Main *, Scene *, Sequence *, int))
{
int did_something = FALSE;
Sequence *seq, *seq_next;
@@ -1093,7 +934,7 @@ static int cut_seq_list(Scene *scene, ListBase *old, ListBase *new, int cutframe
if(seq->flag & SELECT) {
if(cutframe > seq->startdisp &&
cutframe < seq->enddisp) {
- Sequence * seqn = cut_seq(scene, seq, cutframe);
+ Sequence * seqn = cut_seq(bmain, scene, seq, cutframe);
if (seqn) {
BLI_addtail(new, seqn);
}
@@ -1163,7 +1004,7 @@ void touch_seq_files(Scene *scene)
waitcursor(0);
}
-void set_filter_seq(Scene *scene)
+void set_filter_seq(Main *bmain, Scene *scene)
{
Sequence *seq;
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1177,7 +1018,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(bmain, scene, seq, FALSE);
+ calc_sequence(scene, seq);
}
}
@@ -1188,7 +1030,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];
@@ -1269,6 +1111,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)
@@ -1278,8 +1134,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");
@@ -1353,8 +1207,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;
@@ -1370,9 +1223,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) {
@@ -1403,8 +1253,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;
@@ -1421,9 +1270,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) {
@@ -1448,14 +1294,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;
@@ -1471,9 +1316,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;
@@ -1494,8 +1336,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;
@@ -1508,9 +1349,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;
@@ -1531,8 +1369,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;
@@ -1545,9 +1382,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);
@@ -1568,8 +1402,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;
@@ -1580,11 +1413,8 @@ 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);
+ free_imbuf_seq(scene, &ed->seqbase, FALSE, FALSE);
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
@@ -1600,13 +1430,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", ""},
@@ -1616,15 +1506,13 @@ static EnumPropertyItem prop_cut_types[] = {
static int sequencer_cut_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
int cut_side, cut_hard, cut_frame;
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");
@@ -1633,10 +1521,10 @@ static int sequencer_cut_exec(bContext *C, wmOperator *op)
newlist.first= newlist.last= NULL;
if (cut_hard==SEQ_CUT_HARD) {
- changed = cut_seq_list(scene,
+ changed = cut_seq_list(bmain, scene,
ed->seqbasep, &newlist, cut_frame, cut_seq_hard);
} else {
- changed = cut_seq_list(scene,
+ changed = cut_seq_list(bmain, scene,
ed->seqbasep, &newlist, cut_frame, cut_seq_soft);
}
@@ -1648,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;
}
}
}
@@ -1673,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);
@@ -1697,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;
@@ -1709,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;
@@ -1748,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";
@@ -1757,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 */
@@ -1776,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 {
@@ -1839,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;
@@ -1859,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)) {
@@ -1870,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);
@@ -1894,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++;
@@ -1931,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;
@@ -1948,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");
@@ -1963,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 {
@@ -1983,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);
@@ -2007,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;
@@ -2021,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;
@@ -2050,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);
@@ -2080,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;
@@ -2103,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;
@@ -2152,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;
@@ -2185,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 */
@@ -2252,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, (int)(winx*facx*ratio) + 1, (int)(winy*facy*ratio) + 1);
+
+ 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", ""},
@@ -2369,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 */
@@ -2455,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;
@@ -2485,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;
@@ -2496,9 +2416,9 @@ void SEQUENCER_OT_previous_edit(wmOperatorType *ot)
static void swap_sequence(Scene* scene, Sequence* seqa, Sequence* seqb)
{
int gap = seqb->startdisp - seqa->enddisp;
- seqb->start = seqa->start;
+ seqb->start = (seqb->start - seqb->startdisp) + seqa->startdisp;
calc_sequence(scene, seqb);
- seqa->start = seqb->enddisp + gap;
+ seqa->start = (seqa->start - seqa->startdisp) + seqb->enddisp + gap;
calc_sequence(scene, seqa);
}
@@ -2526,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);
@@ -2538,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) {
@@ -2590,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;
@@ -2603,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;
@@ -2640,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;
@@ -2669,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) {
@@ -2679,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 */
@@ -2699,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;
@@ -2726,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);
@@ -2765,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 f591afa1e34..bf0dfff8e98 100644
--- a/source/blender/editors/space_sequencer/sequencer_intern.h
+++ b/source/blender/editors/space_sequencer/sequencer_intern.h
@@ -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);
@@ -141,8 +149,6 @@ enum {
};
/* 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 1d1ee43f400..6ca0a13f172 100644
--- a/source/blender/editors/space_sequencer/sequencer_ops.c
+++ b/source/blender/editors/space_sequencer/sequencer_ops.c
@@ -30,16 +30,12 @@
#include <stdlib.h>
#include <math.h>
-#include "MEM_guardedalloc.h"
#include "DNA_space_types.h"
#include "BLI_math.h"
#include "BLI_blenlib.h"
-#include "BKE_context.h"
-#include "BKE_global.h"
-#include "BKE_utildefines.h"
#include "WM_api.h"
@@ -63,6 +59,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);
@@ -73,12 +70,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);
@@ -110,6 +110,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);
@@ -132,6 +135,7 @@ 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);
@@ -159,7 +163,18 @@ void sequencer_keymap(wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_swap", RIGHTARROWKEY, KM_PRESS, KM_ALT, 0)->ptr, "side", SEQ_SIDE_RIGHT);
WM_keymap_add_item(keymap, "SEQUENCER_OT_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
-
+
+ /* multicam editing keyboard layout, switch to camera 1-10 using
+ regular number keys */
+ {
+ int keys[] = { ONEKEY, TWOKEY, THREEKEY, FOURKEY, FIVEKEY,
+ SIXKEY, SEVENKEY, EIGHTKEY, NINEKEY, ZEROKEY };
+ int i;
+
+ for (i = 1; i <= 10; i++) {
+ RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_cut_multicam", keys[i-1], KM_PRESS, 0, 0)->ptr, "camera", i);
+ }
+ }
/* Mouse selection, a bit verbose :/ */
WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, 0, 0);
@@ -218,9 +233,34 @@ 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", PAD1, KM_PRESS, 0, 0)->ptr, "ratio", 1.0f);
+
+ /* Setting zoom levels is not that useful, except for back to zoom level 1, removing keymap because of conflicts for now */
+#if 0
+ 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", 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);
+#endif
+
}
diff --git a/source/blender/editors/space_sequencer/sequencer_select.c b/source/blender/editors/space_sequencer/sequencer_select.c
index 1074c3572fc..a61e05517d9 100644
--- a/source/blender/editors/space_sequencer/sequencer_select.c
+++ b/source/blender/editors/space_sequencer/sequencer_select.c
@@ -35,7 +35,6 @@
#endif
#include <sys/types.h>
-#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
@@ -43,12 +42,7 @@
#include "DNA_scene_types.h"
#include "BKE_context.h"
-#include "BKE_global.h"
-#include "BKE_library.h"
-#include "BKE_main.h"
#include "BKE_sequencer.h"
-#include "BKE_scene.h"
-#include "BKE_utildefines.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -64,8 +58,7 @@
/* 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 */
{
@@ -167,7 +160,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)
@@ -186,7 +179,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) {
@@ -223,9 +216,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;
@@ -235,7 +225,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);
@@ -243,7 +233,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;
}
@@ -251,14 +241,13 @@ static int sequencer_deselect_exec(bContext *C, wmOperator *op)
void SEQUENCER_OT_select_all_toggle(struct wmOperatorType *ot)
{
/* identifiers */
- ot->name= "(De)Select All";
+ ot->name= "Select or Deselect All";
ot->idname= "SEQUENCER_OT_select_all_toggle";
ot->description="Select or deselect all strips";
/* 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;
@@ -272,12 +261,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);
@@ -285,7 +271,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;
}
@@ -299,8 +285,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;
@@ -349,7 +334,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;
}
@@ -401,7 +386,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) {
@@ -418,7 +403,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;
@@ -514,7 +499,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;
@@ -604,7 +589,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;
}
@@ -614,11 +599,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;
@@ -635,7 +620,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;
}
@@ -645,11 +630,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;
@@ -690,7 +675,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;
}
@@ -700,7 +685,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;
@@ -725,7 +710,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;
}
@@ -735,11 +720,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;
@@ -756,8 +741,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) {
@@ -777,7 +760,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;
}
@@ -787,11 +770,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;
@@ -805,7 +788,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;
@@ -814,7 +797,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;
}
@@ -824,11 +807,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;
@@ -871,12 +854,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 073743976e8..4cf25ab9585 100644
--- a/source/blender/editors/space_sequencer/space_sequencer.c
+++ b/source/blender/editors/space_sequencer/space_sequencer.c
@@ -35,6 +35,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_path_util.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -306,7 +307,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;
}
@@ -322,7 +323,20 @@ 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);
+ if(RNA_struct_find_property(drop->ptr, "filepath"))
+ RNA_string_set(drop->ptr, "filepath", drag->path);
+
+ if(RNA_struct_find_property(drop->ptr, "directory")) {
+ PointerRNA itemptr;
+ char dir[FILE_MAX], file[FILE_MAX];
+
+ BLI_split_dirfile(drag->path, dir, file);
+
+ RNA_string_set(drop->ptr, "directory", dir);
+
+ RNA_collection_add(drop->ptr, "files", &itemptr);
+ RNA_string_set(&itemptr, "name", file);
+ }
}
/* this region dropbox definition */
@@ -355,9 +369,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;
}
@@ -396,7 +410,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)
@@ -408,7 +436,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;
}
@@ -450,7 +477,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;
}
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/Makefile b/source/blender/editors/space_sound/Makefile
index a072684d543..9afda815f59 100644
--- a/source/blender/editors/space_sound/Makefile
+++ b/source/blender/editors/space_sound/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) 2007 Blender Foundation
# All rights reserved.
@@ -38,6 +38,8 @@ CFLAGS += $(LEVEL_1_C_WARNINGS)
CPPFLAGS += -I$(NAN_GLEW)/include
CPPFLAGS += -I$(OPENGL_HEADERS)
+CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
+
# not very neat....
CPPFLAGS += -I../../windowmanager
CPPFLAGS += -I../../blenloader
diff --git a/source/blender/editors/space_sound/sound_header.c b/source/blender/editors/space_sound/sound_header.c
index acc9645af9d..fbf6d8c85c9 100644
--- a/source/blender/editors/space_sound/sound_header.c
+++ b/source/blender/editors/space_sound/sound_header.c
@@ -35,7 +35,6 @@
#include "BLI_blenlib.h"
#include "BKE_context.h"
-#include "BKE_screen.h"
#include "ED_screen.h"
#include "ED_types.h"
diff --git a/source/blender/editors/space_sound/space_sound.c b/source/blender/editors/space_sound/space_sound.c
index 8c84002a625..905e1d6cdd9 100644
--- a/source/blender/editors/space_sound/space_sound.c
+++ b/source/blender/editors/space_sound/space_sound.c
@@ -29,7 +29,6 @@
#include <string.h>
#include <stdio.h>
-#include "DNA_sound_types.h"
#include "DNA_scene_types.h"
#include "MEM_guardedalloc.h"
@@ -38,7 +37,6 @@
#include "BLI_math.h"
#include "BLI_rand.h"
-#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -150,11 +148,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/Makefile b/source/blender/editors/space_text/Makefile
index 50871017085..8bc12852e18 100644
--- a/source/blender/editors/space_text/Makefile
+++ b/source/blender/editors/space_text/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c
index e4f488fb5c1..c8c19a0bc93 100644
--- a/source/blender/editors/space_text/space_text.c
+++ b/source/blender/editors/space_text/space_text.c
@@ -38,7 +38,6 @@
#include "BLI_math.h"
#include "BLI_rand.h"
-#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -118,15 +117,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:
@@ -217,19 +214,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);
@@ -276,6 +273,8 @@ static void text_keymap(struct wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", DOWNARROWKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_LINE);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", PAGEUPKEY, KM_PRESS, 0, 0)->ptr, "type", PREV_PAGE);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", PAGEDOWNKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_PAGE);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", HOMEKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", FILE_TOP);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", ENDKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", FILE_BOTTOM);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", HOMEKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", LINE_BEGIN);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", ENDKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", LINE_END);
@@ -287,6 +286,8 @@ static void text_keymap(struct wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", DOWNARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", NEXT_LINE);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", PAGEUPKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", PREV_PAGE);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", PAGEDOWNKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", NEXT_PAGE);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", HOMEKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0)->ptr, "type", FILE_TOP);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", ENDKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0)->ptr, "type", FILE_BOTTOM);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", DELKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_NEXT_CHAR);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", DKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_NEXT_CHAR);
@@ -307,6 +308,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!
}
@@ -334,12 +337,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)
@@ -347,11 +356,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);
@@ -370,6 +377,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 */
@@ -415,6 +452,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");
@@ -429,7 +467,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 4a73340d719..62274fc664a 100644
--- a/source/blender/editors/space_text/text_draw.c
+++ b/source/blender/editors/space_text/text_draw.c
@@ -44,14 +44,11 @@
#include "DNA_userdef_types.h"
#include "BKE_context.h"
-#include "BKE_global.h"
-#include "BKE_main.h"
#include "BKE_suggestions.h"
#include "BKE_text.h"
#include "BKE_utildefines.h"
#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "ED_datafiles.h"
#include "UI_interface.h"
@@ -60,18 +57,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 +74,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 +87,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 **********************/
@@ -116,8 +110,8 @@ static void flatten_string_append(FlattenString *fs, char c, int accum)
nbuf= MEM_callocN(sizeof(*fs->buf)*fs->len, "fs->buf");
naccum= MEM_callocN(sizeof(*fs->accum)*fs->len, "fs->accum");
- memcpy(nbuf, fs->buf, fs->pos);
- memcpy(naccum, fs->accum, fs->pos);
+ memcpy(nbuf, fs->buf, fs->pos * sizeof(*fs->buf));
+ memcpy(naccum, fs->accum, fs->pos * sizeof(*fs->accum));
if(fs->buf != fs->fixedbuf) {
MEM_freeN(fs->buf);
@@ -177,12 +171,13 @@ void flatten_string_free(FlattenString *fs)
static int find_builtinfunc(char *string)
{
int a, i;
- char builtinfuncs[][11] = {"and", "as", "assert", "break", "class", "continue", "def",
+ char builtinfuncs[][9] = {"and", "as", "assert", "break", "class", "continue", "def",
"del", "elif", "else", "except", "exec", "finally",
"for", "from", "global", "if", "import", "in",
"is", "lambda", "not", "or", "pass", "print",
- "raise", "return", "try", "while", "yield"};
- for(a=0; a<30; a++) {
+ "raise", "return", "try", "while", "yield", "with"};
+
+ for(a=0; a < sizeof(builtinfuncs)/sizeof(builtinfuncs[0]); a++) {
i = 0;
while(1) {
/* If we hit the end of a keyword... (eg. "def") */
@@ -227,6 +222,36 @@ static int find_specialvar(char *string)
return i;
}
+static int find_decorator(char *string)
+{
+ if(string[0] == '@') {
+ int i = 1;
+ while(text_check_identifier(string[i])) {
+ i++;
+ }
+ return i;
+ }
+ return -1;
+}
+
+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)
@@ -338,6 +363,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 = '!';
@@ -351,6 +387,8 @@ static void txt_format_line(SpaceText *st, TextLine *line, int do_next)
prev = 'v';
else if((i=find_builtinfunc(str)) != -1)
prev = 'b';
+ else if((i=find_decorator(str)) != -1)
+ prev = 'v'; /* could have a new color for this */
if(i>0) {
while(i>1) {
*fmt = prev; fmt++; str++;
@@ -1076,6 +1114,22 @@ static void draw_cursor(SpaceText *st, ARegion *ar)
}
}
+ if(st->line_hlight) {
+ y= ar->winy-2 - vsell*st->lheight;
+ if(!(y<0 || y > ar->winy)) { /* check we need to draw */
+ int x1= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
+ int x2= x1 + ar->winx;
+ y= ar->winy-2 - vsell*st->lheight;
+
+ glColor4ub(255, 255, 255, 32);
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glRecti(x1-4, y, x2, y-st->lheight+1);
+ glDisable(GL_BLEND);
+ }
+ }
+
if(!hidden) {
/* Draw the cursor itself (we draw the sel. cursor as this is the leading edge) */
x= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
@@ -1106,7 +1160,8 @@ static void draw_brackets(SpaceText *st, ARegion *ar)
int viewc, viewl, offl, offc, x, y;
char ch;
- if(!text->curl) return;
+ // showsyntax must be on or else the format string will be null
+ if(!text->curl || !st->showsyntax) return;
startl= text->curl;
startc= text->curc;
@@ -1120,23 +1175,29 @@ static void draw_brackets(SpaceText *st, ARegion *ar)
endc= -1;
find= -b;
stack= 0;
+
+ /* Dont highlight backets if syntax HL is off or bracket in string or comment. */
+ if(!linep->format || linep->format[c] == 'l' || linep->format[c] == '#')
+ return;
if(b>0) {
/* opening bracket, search forward for close */
c++;
while(linep) {
while(c<linep->len) {
- b= text_check_bracket(linep->line[c]);
- if(b==find) {
- if(stack==0) {
- endl= linep;
- endc= c;
- break;
+ if(linep->format && linep->format[c] != 'l' && linep->format[c] != '#') {
+ b= text_check_bracket(linep->line[c]);
+ if(b==find) {
+ if(stack==0) {
+ endl= linep;
+ endc= c;
+ break;
+ }
+ stack--;
+ }
+ else if(b==-find) {
+ stack++;
}
- stack--;
- }
- else if(b==-find) {
- stack++;
}
c++;
}
@@ -1150,17 +1211,19 @@ static void draw_brackets(SpaceText *st, ARegion *ar)
c--;
while(linep) {
while(c>=0) {
- b= text_check_bracket(linep->line[c]);
- if(b==find) {
- if(stack==0) {
- endl= linep;
- endc= c;
- break;
+ if(linep->format && linep->format[c] != 'l' && linep->format[c] != '#') {
+ b= text_check_bracket(linep->line[c]);
+ if(b==find) {
+ if(stack==0) {
+ endl= linep;
+ endc= c;
+ break;
+ }
+ stack--;
+ }
+ else if(b==-find) {
+ stack++;
}
- stack--;
- }
- else if(b==-find) {
- stack++;
}
c--;
}
@@ -1237,7 +1300,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 */
@@ -1254,7 +1317,7 @@ void draw_text_main(SpaceText *st, ARegion *ar)
}
y= ar->winy-st->lheight;
winx= ar->winx - TXT_SCROLL_WIDTH;
-
+
/* draw cursor */
draw_cursor(st, ar);
@@ -1307,7 +1370,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 +1381,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(ELEM3(NULL, 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 +1395,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 3b1c882ff2f..672940cf3cb 100644
--- a/source/blender/editors/space_text/text_header.c
+++ b/source/blender/editors/space_text/text_header.c
@@ -49,24 +49,15 @@
#include "BLI_blenlib.h"
#include "BKE_context.h"
-#include "BKE_global.h"
-#include "BKE_library.h"
-#include "BKE_main.h"
-#include "BKE_scene.h"
-#include "BKE_screen.h"
-#include "BKE_text.h"
#include "ED_screen.h"
#include "WM_types.h"
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
#ifndef DISABLE_PYTHON
-#include "BPY_extern.h"
// XXX #include "BPY_menus.h"
#endif
diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c
index 8cb2b4be628..d39056c6bbc 100644
--- a/source/blender/editors/space_text/text_ops.c
+++ b/source/blender/editors/space_text/text_ops.c
@@ -34,19 +34,17 @@
#include "MEM_guardedalloc.h"
-#include "DNA_constraint_types.h"
#include "DNA_text_types.h"
+#include "DNA_userdef_types.h"
#include "BLI_blenlib.h"
#include "PIL_time.h"
#include "BKE_context.h"
-#include "BKE_depsgraph.h"
#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_report.h"
-#include "BKE_suggestions.h"
#include "BKE_text.h"
#include "WM_api.h"
@@ -190,6 +188,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 *********************/
@@ -215,9 +216,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");
+ short internal = RNA_boolean_get(op->ptr, "internal");
- RNA_string_get(op->ptr, "path", str);
+ RNA_string_get(op->ptr, "filepath", str);
text= add_text(str, G.sce);
@@ -265,11 +266,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;
@@ -288,8 +289,11 @@ 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");
}
@@ -369,6 +373,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 *********************/
@@ -400,6 +407,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 *********************/
@@ -482,7 +492,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);
@@ -501,7 +511,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)
@@ -511,7 +521,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;
@@ -530,7 +540,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 *********************/
@@ -571,14 +581,17 @@ void TEXT_OT_run_script(wmOperatorType *ot)
/* api callbacks */
ot->poll= run_script_poll;
ot->exec= run_script_exec;
-}
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
/******************* refresh pyconstraints operator *********************/
static int refresh_pyconstraints_exec(bContext *C, wmOperator *op)
{
#ifndef DISABLE_PYTHON
+#if 0
Text *text= CTX_data_edit_text(C);
Object *ob;
bConstraint *con;
@@ -613,6 +626,7 @@ static int refresh_pyconstraints_exec(bContext *C, wmOperator *op)
}
}
#endif
+#endif
return OPERATOR_FINISHED;
}
@@ -749,7 +763,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.");
}
@@ -890,15 +904,22 @@ void TEXT_OT_unindent(wmOperatorType *ot)
static int line_break_exec(bContext *C, wmOperator *op)
{
+ SpaceText *st= CTX_wm_space_text(C);
Text *text= CTX_data_edit_text(C);
- int a, curtab;
+ int a, curts;
+ int space = (text->flags & TXT_TABSTOSPACES) ? st->tabnumber : 1;
- // double check tabs before splitting the line
- curtab= setcurr_tab(text);
+ // double check tabs/spaces before splitting the line
+ curts= setcurr_tab_spaces(text, space);
txt_split_curline(text);
- for(a=0; a < curtab; a++)
- txt_add_char(text, '\t');
+ for(a=0; a < curts; a++) {
+ if (text->flags & TXT_TABSTOSPACES) {
+ txt_add_char(text, ' ');
+ } else {
+ txt_add_char(text, '\t');
+ }
+ }
if(text->curl) {
if(text->curl->prev)
@@ -1008,7 +1029,7 @@ static int convert_whitespace_exec(bContext *C, wmOperator *op)
tmp = text->lines.first;
- //first convert to all space, this make it alot easier to convert to tabs because there is no mixtures of ' ' && '\t'
+ //first convert to all space, this make it a lot easier to convert to tabs because there is no mixtures of ' ' && '\t'
while(tmp) {
text_check_line = tmp->line;
number = flatten_string(st, &fs, text_check_line)+1;
@@ -1688,6 +1709,8 @@ static int toggle_overwrite_exec(bContext *C, wmOperator *op)
st->overwrite= !st->overwrite;
+ WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, st->text);
+
return OPERATOR_FINISHED;
}
@@ -2340,9 +2363,11 @@ void TEXT_OT_insert(wmOperatorType *ot)
static int find_and_replace(bContext *C, wmOperator *op, short mode)
{
+ Main *bmain= CTX_data_main(C);
SpaceText *st= CTX_wm_space_text(C);
Text *start= NULL, *text= st->text;
int flags, first= 1;
+ int found = 0;
char *tmp;
if(!st->findstr[0] || (mode == TEXT_REPLACE && !st->replacestr[0]))
@@ -2401,16 +2426,17 @@ static int find_and_replace(bContext *C, wmOperator *op, short mode)
if(text->id.next)
text= st->text= text->id.next;
else
- text= st->text= G.main->text.first;
+ text= st->text= bmain->text.first;
txt_move_toline(text, 0, 0);
text_update_cursor_moved(C);
WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, text);
first= 1;
}
else {
- BKE_reportf(op->reports, RPT_ERROR, "Text not found: %s", st->findstr);
+ if(!found) BKE_reportf(op->reports, RPT_ERROR, "Text not found: %s", st->findstr);
break;
}
+ found = 1;
} while(mode==TEXT_MARK_ALL);
return OPERATOR_FINISHED;
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/Makefile b/source/blender/editors/space_time/Makefile
index e0bf3943dd8..958c3018f82 100644
--- a/source/blender/editors/space_time/Makefile
+++ b/source/blender/editors/space_time/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/space_time/space_time.c b/source/blender/editors/space_time/space_time.c
index 31b76e6d5fa..d65422ce327 100644
--- a/source/blender/editors/space_time/space_time.c
+++ b/source/blender/editors/space_time/space_time.c
@@ -40,7 +40,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
+#include "BKE_pointcache.h"
#include "ED_anim_api.h"
#include "ED_keyframes_draw.h"
@@ -84,6 +84,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)
{
@@ -206,6 +374,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)
{
@@ -226,18 +454,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);
@@ -245,7 +471,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;
@@ -256,6 +483,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);
@@ -279,7 +509,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;
@@ -379,13 +608,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)
@@ -393,6 +632,8 @@ static SpaceLink *time_duplicate(SpaceLink *sl)
SpaceTime *stime= (SpaceTime *)sl;
SpaceTime *stimen= MEM_dupallocN(stime);
+ time_cache_free(stimen);
+
return (SpaceLink *)stimen;
}
@@ -412,6 +653,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_ops.c b/source/blender/editors/space_time/time_ops.c
index 68036d0ea33..fb80d54d5e6 100644
--- a/source/blender/editors/space_time/time_ops.c
+++ b/source/blender/editors/space_time/time_ops.c
@@ -29,14 +29,12 @@
#include <stdlib.h>
#include <math.h>
-#include "MEM_guardedalloc.h"
#include "DNA_scene_types.h"
#include "BLI_blenlib.h"
#include "BKE_context.h"
-#include "BKE_utildefines.h"
#include "ED_screen.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/Makefile b/source/blender/editors/space_userpref/Makefile
index be7206f51ce..8510c355ab4 100644
--- a/source/blender/editors/space_userpref/Makefile
+++ b/source/blender/editors/space_userpref/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) 2007 Blender Foundation
# All rights reserved.
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 4d6d303625b..8eea83a1083 100644
--- a/source/blender/editors/space_userpref/space_userpref.c
+++ b/source/blender/editors/space_userpref/space_userpref.c
@@ -39,7 +39,6 @@
#include "ED_screen.h"
-#include "BIF_gl.h"
#include "WM_api.h"
#include "WM_types.h"
diff --git a/source/blender/editors/space_view3d/CMakeLists.txt b/source/blender/editors/space_view3d/CMakeLists.txt
new file mode 100644
index 00000000000..a6945bbe9bb
--- /dev/null
+++ b/source/blender/editors/space_view3d/CMakeLists.txt
@@ -0,0 +1,50 @@
+# $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
+ ../../../../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/Makefile b/source/blender/editors/space_view3d/Makefile
index 9204f2482c6..58d88194c22 100644
--- a/source/blender/editors/space_view3d/Makefile
+++ b/source/blender/editors/space_view3d/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/space_view3d/SConscript b/source/blender/editors/space_view3d/SConscript
index ba521a5fb1a..1d8e01f2b1b 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 8db1ddb7505..fb271556a9c 100644
--- a/source/blender/editors/space_view3d/drawanimviz.c
+++ b/source/blender/editors/space_view3d/drawanimviz.c
@@ -31,39 +31,22 @@
#include <string.h>
#include <math.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "MEM_guardedalloc.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_view3d_types.h"
+#include "DNA_object_types.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_dlrbTree.h"
-#include "BKE_anim.h"
#include "BKE_animsys.h"
#include "BKE_action.h"
-#include "BKE_armature.h"
-#include "BKE_constraint.h"
-#include "BKE_context.h"
-#include "BKE_depsgraph.h"
-#include "BKE_DerivedMesh.h"
-#include "BKE_global.h"
-#include "BKE_main.h"
-#include "BKE_modifier.h"
-#include "BKE_nla.h"
-#include "BKE_object.h"
-#include "BKE_utildefines.h"
#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "ED_armature.h"
#include "ED_keyframes_draw.h"
@@ -203,6 +186,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) {
@@ -224,9 +222,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;
@@ -234,8 +232,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) {
@@ -265,7 +265,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 28fe074c19c..adff6ffdc65 100644
--- a/source/blender/editors/space_view3d/drawarmature.c
+++ b/source/blender/editors/space_view3d/drawarmature.c
@@ -31,11 +31,6 @@
#include <string.h>
#include <math.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "MEM_guardedalloc.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -43,6 +38,7 @@
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_view3d_types.h"
+#include "DNA_object_types.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
@@ -51,15 +47,9 @@
#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_armature.h"
-#include "BKE_constraint.h"
-#include "BKE_context.h"
-#include "BKE_depsgraph.h"
-#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
-#include "BKE_main.h"
#include "BKE_modifier.h"
#include "BKE_nla.h"
-#include "BKE_object.h"
#include "BKE_utildefines.h"
#include "BIF_gl.h"
@@ -1551,7 +1541,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 */
@@ -1886,15 +1876,12 @@ 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);
- mul_m4_m4m4(mat, bmat, rv3d->viewmatob);
-
- drawaxes(rv3d, mat, pchan->bone->length*0.25f, 0, OB_ARROWS);
+ drawaxes(pchan->bone->length*0.25f, 0, OB_ARROWS);
glPopMatrix();
}
@@ -1921,7 +1908,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)
@@ -2082,16 +2069,12 @@ 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 */
- drawaxes(rv3d, mat, eBone->length*0.25f, 0, OB_ARROWS);
+ drawaxes(eBone->length*0.25f, 0, OB_ARROWS);
glPopMatrix();
}
diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c
index ced745bb5d4..372ac976342 100644
--- a/source/blender/editors/space_view3d/drawmesh.c
+++ b/source/blender/editors/space_view3d/drawmesh.c
@@ -42,17 +42,12 @@
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_view3d_types.h"
+#include "DNA_object_types.h"
-#include "BKE_bmfont.h"
-#include "BKE_displist.h"
#include "BKE_DerivedMesh.h"
#include "BKE_effect.h"
-#include "BKE_global.h"
#include "BKE_image.h"
-#include "BKE_main.h"
#include "BKE_material.h"
-#include "BKE_mesh.h"
-#include "BKE_object.h"
#include "BKE_paint.h"
#include "BKE_property.h"
#include "BKE_utildefines.h"
@@ -62,7 +57,7 @@
#include "UI_resources.h"
-#include "gpu_buffers.h"
+#include "GPU_buffers.h"
#include "GPU_extensions.h"
#include "GPU_draw.h"
@@ -430,7 +425,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 */
}
@@ -465,9 +460,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) {
@@ -486,9 +481,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
@@ -535,7 +530,7 @@ static int draw_em_tf_mapped__set_draw(void *userData, int index)
mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
matnr = efa->mat_nr;
- return draw_tface__set_draw(tface, mcol, matnr);
+ return draw_tface__set_draw_legacy(tface, mcol, 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 c5cbb080b4c..d3162c44463 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -28,16 +28,8 @@
#include <string.h>
#include <math.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "MEM_guardedalloc.h"
-
-
-
-
#include "DNA_camera_types.h"
#include "DNA_curve_types.h"
#include "DNA_constraint_types.h" // for drawing constraint
@@ -57,12 +49,10 @@
#include "BLI_rand.h"
#include "BKE_anim.h" //for the where_on_path function
-#include "BKE_curve.h"
#include "BKE_constraint.h" // for the get_constraint_target function
#include "BKE_DerivedMesh.h"
#include "BKE_deform.h"
#include "BKE_displist.h"
-#include "BKE_effect.h"
#include "BKE_font.h"
#include "BKE_global.h"
#include "BKE_image.h"
@@ -76,9 +66,6 @@
#include "BKE_paint.h"
#include "BKE_particle.h"
#include "BKE_pointcache.h"
-#include "BKE_property.h"
-#include "BKE_softbody.h"
-#include "BKE_smoke.h"
#include "BKE_unit.h"
#include "BKE_utildefines.h"
#include "smoke_API.h"
@@ -94,6 +81,7 @@
#include "ED_screen.h"
#include "ED_sculpt.h"
#include "ED_types.h"
+#include "ED_curve.h" /* for ED_curve_editnurbs */
#include "UI_resources.h"
@@ -109,13 +97,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);
@@ -123,6 +104,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
@@ -140,7 +141,7 @@ static void view3d_project_short_clip(ARegion *ar, float *vec, short *adr, int l
return;
}
- VECCOPY(vec4, vec);
+ copy_v3_v3(vec4, vec);
vec4[3]= 1.0;
mul_m4_v4(rv3d->persmatob, vec4);
@@ -169,7 +170,7 @@ static void view3d_project_short_noclip(ARegion *ar, float *vec, short *adr)
adr[0]= IS_CLIPPED;
- VECCOPY(vec4, vec);
+ copy_v3_v3(vec4, vec);
vec4[3]= 1.0;
mul_m4_v4(rv3d->persmatob, vec4);
@@ -315,31 +316,12 @@ static float cosval[32] ={
1.00000000
};
-static void draw_xyz_wire(RegionView3D *rv3d, float mat[][4], float *c, float size, int axis)
+static void draw_xyz_wire(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]);
+ float dim = size * 0.1;
+ float dx[3]={dim, 0.0, 0.0}, dy[3]={0.0, dim, 0.0}, dz[3]={0.0, 0.0, dim};
- 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);
@@ -391,7 +373,7 @@ static void draw_xyz_wire(RegionView3D *rv3d, float mat[][4], float *c, float si
/* start at top left */
sub_v3_v3v3(v1, c, dx);
- add_v3_v3v3(v1, c, dy);
+ add_v3_v3v3(v1, c, dz);
glVertex3fv(v1);
@@ -400,9 +382,9 @@ static void draw_xyz_wire(RegionView3D *rv3d, float mat[][4], float *c, float si
glVertex3fv(v1);
- mul_v3_fl(dy, 2.f);
+ mul_v3_fl(dz, 2.f);
sub_v3_v3(v1, dx);
- sub_v3_v3(v1, dy);
+ sub_v3_v3(v1, dz);
glVertex3fv(v1);
@@ -417,7 +399,7 @@ static void draw_xyz_wire(RegionView3D *rv3d, float mat[][4], float *c, float si
}
/* flag is same as for draw_object */
-void drawaxes(RegionView3D *rv3d, float mat[][4], float size, int flag, char drawtype)
+void drawaxes(float size, int flag, char drawtype)
{
int axis;
float v1[3]= {0.0, 0.0, 0.0};
@@ -459,11 +441,11 @@ void drawaxes(RegionView3D *rv3d, float mat[][4], float size, int flag, char dra
for (axis=0; axis<4; axis++) {
if (axis % 2 == 1) {
- v2[0] *= -1;
- v3[1] *= -1;
+ v2[0] = -v2[0];
+ v3[1] = -v3[1];
} else {
- v2[1] *= -1;
- v3[0] *= -1;
+ v2[1] = -v2[1];
+ v3[0] = -v3[0];
}
glVertex3fv(v1);
@@ -516,7 +498,7 @@ void drawaxes(RegionView3D *rv3d, float mat[][4], float size, int flag, char dra
v2[axis]+= size*0.125;
- draw_xyz_wire(rv3d, mat, v2, size, axis);
+ draw_xyz_wire(v2, size, axis);
}
break;
}
@@ -526,12 +508,10 @@ void drawcircball(int mode, float *cent, float rad, float tmat[][4])
{
float vec[3], vx[3], vy[3];
int a, tot=32;
-
- VECCOPY(vx, tmat[0]);
- VECCOPY(vy, tmat[1]);
- mul_v3_fl(vx, rad);
- mul_v3_fl(vy, rad);
-
+
+ mul_v3_v3fl(vx, tmat[0], rad);
+ mul_v3_v3fl(vy, tmat[1], rad);
+
glBegin(mode);
for(a=0; a<tot; a++) {
vec[0]= cent[0] + *(sinval+a) * vx[0] + *(cosval+a) * vy[0];
@@ -625,14 +605,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);
@@ -768,19 +748,11 @@ 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];
- sta[1]= mat[3][1]+ la->clipsta*lavec[1];
- sta[2]= mat[3][2]+ la->clipsta*lavec[2];
-
- end[0]= mat[3][0]+ la->clipend*lavec[0];
- end[1]= mat[3][1]+ la->clipend*lavec[1];
- end[2]= mat[3][2]+ la->clipend*lavec[2];
-
+ madd_v3_v3v3fl(sta, mat[3], lavec, la->clipsta);
+ madd_v3_v3v3fl(end, mat[3], lavec, la->clipend);
glBegin(GL_LINE_STRIP);
glVertex3fv(sta);
@@ -835,10 +807,7 @@ static void spotvolume(float *lvec, float *vvec, float inp)
quat_to_mat3(mat1,q);
/* rotate lamp vector now over acos(inp) degrees */
-
- vvec[0] = lvec[0] ;
- vvec[1] = lvec[1] ;
- vvec[2] = lvec[2] ;
+ copy_v3_v3(vvec, lvec);
unit_m3(mat2);
co = inp;
@@ -865,25 +834,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;
@@ -912,7 +873,7 @@ static void draw_transp_spot_volume(Lamp *la, float x, float z)
draw_spot_cone(la, x, z);
- /* draw front side lightening */
+ /* draw front side lighting */
glCullFace(GL_BACK);
glBlendFunc(GL_ONE, GL_ONE);
@@ -940,7 +901,7 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
if(drawcone && !v3d->transp) {
/* in this case we need to draw delayed */
- add_view3d_after(v3d, base, V3D_TRANSP, flag);
+ add_view3d_after(&v3d->afterdraw_transp, base, flag);
return;
}
@@ -971,7 +932,7 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
}
/* Inner Circle */
- VECCOPY(vec, ob->obmat[3]);
+ copy_v3_v3(vec, ob->obmat[3]);
glEnable(GL_BLEND);
drawcircball(GL_LINE_LOOP, vec, lampsize, imat);
glDisable(GL_BLEND);
@@ -983,21 +944,23 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
/* Outer circle */
circrad = 3.0f*lampsize;
+ setlinestyle(3);
+
drawcircball(GL_LINE_LOOP, vec, circrad, imat);
- }
- else
- circrad = 0.0f;
-
- 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);
+ /* 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) {
@@ -1008,10 +971,8 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
vec_rot_to_mat3( mat,imat[2], M_PI/4.0f);
/* vectors */
- VECCOPY(v1, imat[0]);
- mul_v3_fl(v1, circrad*1.2f);
- VECCOPY(v2, imat[0]);
- mul_v3_fl(v2, circrad*2.5f);
+ mul_v3_v3fl(v1, imat[0], circrad * 1.2f);
+ mul_v3_v3fl(v2, imat[0], circrad * 2.5f);
/* center */
glTranslatef(vec[0], vec[1], vec[2]);
@@ -1039,7 +1000,7 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
}
glPopMatrix(); /* back in object space */
- vec[0]= vec[1]= vec[2]= 0.0f;
+ zero_v3(vec);
if ((la->type==LA_SPOT) || (la->type==LA_YF_PHOTON)) {
lvec[0]=lvec[1]= 0.0;
@@ -1070,17 +1031,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));
@@ -1097,6 +1061,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) {
@@ -1112,7 +1092,7 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
/* draw the hemisphere curves */
short axis, steps, dir;
float outdist, zdist, mul;
- vec[0]=vec[1]=vec[2]= 0.0;
+ zero_v3(vec);
outdist = 0.14; mul = 1.4; dir = 1;
setlinestyle(4);
@@ -1161,7 +1141,7 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
/* and back to viewspace */
glLoadMatrixf(rv3d->viewmat);
- VECCOPY(vec, ob->obmat[3]);
+ copy_v3_v3(vec, ob->obmat[3]);
setlinestyle(0);
@@ -1231,17 +1211,28 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
/* a standing up pyramid with (0,0,0) as top */
Camera *cam;
World *wrld;
- float nobmat[4][4], vec[8][4], fac, facx, facy, depth;
+ float nobmat[4][4], vec[8][4], fac, facx, facy, depth, aspx, aspy, caspx, caspy;
int i;
cam= ob->data;
+ aspx= (float) scene->r.xsch*scene->r.xasp;
+ aspy= (float) scene->r.ysch*scene->r.yasp;
+
+ if(aspx < aspy) {
+ caspx= aspx / aspy;
+ caspy= 1.0;
+ }
+ else {
+ caspx= 1.0;
+ caspy= aspy / aspx;
+ }
glDisable(GL_LIGHTING);
glDisable(GL_CULL_FACE);
if(rv3d->persp>=2 && cam->type==CAM_ORTHO && ob==v3d->camera) {
- facx= 0.5*cam->ortho_scale*1.28;
- facy= 0.5*cam->ortho_scale*1.024;
+ facx= 0.5*cam->ortho_scale*caspx;
+ facy= 0.5*cam->ortho_scale*caspy;
depth= -cam->clipsta-0.1;
}
else {
@@ -1249,8 +1240,8 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
if(rv3d->persp>=2 && ob==v3d->camera) fac= cam->clipsta+0.1; /* that way it's always visible */
depth= - fac*cam->lens/16.0;
- facx= fac*1.28;
- facy= fac*1.024;
+ facx= fac*caspx;
+ facy= fac*caspy;
}
vec[0][0]= 0.0; vec[0][1]= 0.0; vec[0][2]= 0.001; /* GLBUG: for picking at iris Entry (well thats old!) */
@@ -1291,16 +1282,16 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
else if (i==1 && (ob == v3d->camera)) glBegin(GL_TRIANGLES);
else break;
- vec[0][0]= -0.7*cam->drawsize;
- vec[0][1]= 1.1*cam->drawsize;
+ vec[0][0]= -0.7*cam->drawsize*caspx;
+ vec[0][1]= 1.1*cam->drawsize*caspy;
glVertex3fv(vec[0]);
vec[0][0]= 0.0;
- vec[0][1]= 1.8*cam->drawsize;
+ vec[0][1]= 1.8*cam->drawsize*caspy;
glVertex3fv(vec[0]);
- vec[0][0]= 0.7*cam->drawsize;
- vec[0][1]= 1.1*cam->drawsize;
+ vec[0][0]= 0.7*cam->drawsize*caspx;
+ vec[0][1]= 1.1*cam->drawsize*caspy;
glVertex3fv(vec[0]);
glEnd();
@@ -1366,10 +1357,10 @@ void lattice_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, BPo
{
Object *obedit= vc->obedit;
Lattice *lt= obedit->data;
- BPoint *bp = lt->editlatt->def;
+ BPoint *bp = lt->editlatt->latt->def;
DispList *dl = find_displist(&obedit->disp, DL_VERTS);
float *co = dl?dl->verts:NULL;
- int i, N = lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
+ int i, N = lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
short s[2] = {IS_CLIPPED, 0};
ED_view3d_local_clipping(vc->rv3d, obedit->obmat); /* for local clipping lookups */
@@ -1409,14 +1400,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->latt;
+
cpack(0x004000);
if(ob->defbase.first && lt->dvert) {
@@ -1425,8 +1418,6 @@ static void drawlattice(Scene *scene, View3D *v3d, Object *ob)
}
}
- if(lt->editlatt) lt= lt->editlatt;
-
glBegin(GL_LINES);
for(w=0; w<lt->pntsw; w++) {
int wxt = (w==0 || w==lt->pntsw-1);
@@ -1456,7 +1447,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);
@@ -1594,10 +1585,11 @@ void nurbs_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, Nurb
short s[2] = {IS_CLIPPED, 0};
Nurb *nu;
int i;
+ ListBase *nurbs= ED_curve_editnurbs(cu);
ED_view3d_local_clipping(vc->rv3d, vc->obedit->obmat); /* for local clipping lookups */
- for (nu= cu->editnurb->first; nu; nu=nu->next) {
+ for (nu= nurbs->first; nu; nu=nu->next) {
if(nu->type == CU_BEZIER) {
for (i=0; i<nu->pntsu; i++) {
BezTriple *bezt = &nu->bezt[i];
@@ -1885,7 +1877,7 @@ static int draw_dm_creases__setDrawOptions(void *userData, int index)
EditEdge *eed = EM_get_edge_for_index(index);
if (eed->h==0 && eed->crease!=0.0) {
- UI_ThemeColorBlend(TH_WIRE, TH_EDGE_SELECT, eed->crease);
+ UI_ThemeColorBlend(TH_WIRE, TH_EDGE_CREASE, eed->crease);
return 1;
} else {
return 0;
@@ -1984,7 +1976,7 @@ static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit, EditM
draw_dm_verts(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(cageDM, sel);
@@ -2064,13 +2056,15 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
Mesh *me= ob->data;
EditEdge *eed;
EditFace *efa;
- float v1[3], v2[3], v3[3], v4[3], x, y, z;
+ float v1[3], v2[3], v3[3], v4[3], vmid[3];
float fvec[3];
char val[32]; /* Stores the measurement display text here */
char conv_float[5]; /* Use a float conversion matching the grid size */
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;
+ const int do_split= unit->flag & USER_UNIT_OPT_SPLIT;
+ const int do_global= v3d->flag & V3D_GLOBAL_STATS;
+ const int do_moving= G.moving;
if(v3d->flag2 & V3D_RENDER_OVERRIDE)
return;
@@ -2103,24 +2097,22 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
for(eed= em->edges.first; eed; eed= eed->next) {
/* draw non fgon edges, or selected edges, or edges next to selected verts while draging */
- if((eed->h != EM_FGON) && ((eed->f & SELECT) || (G.moving && ((eed->v1->f & SELECT) || (eed->v2->f & SELECT)) ))) {
- VECCOPY(v1, eed->v1->co);
- VECCOPY(v2, eed->v2->co);
-
- x= 0.5f*(v1[0]+v2[0]);
- y= 0.5f*(v1[1]+v2[1]);
- z= 0.5f*(v1[2]+v2[2]);
-
- if(v3d->flag & V3D_GLOBAL_STATS) {
- mul_m4_v3(ob->obmat, v1);
- mul_m4_v3(ob->obmat, v2);
+ if((eed->h != EM_FGON) && ((eed->f & SELECT) || (do_moving && ((eed->v1->f & SELECT) || (eed->v2->f & SELECT)) ))) {
+ copy_v3_v3(v1, eed->v1->co);
+ copy_v3_v3(v2, eed->v2->co);
+
+ interp_v3_v3v3(vmid, v1, v2, 0.5f);
+
+ if(do_global) {
+ mul_mat3_m4_v3(ob->obmat, v1);
+ mul_mat3_m4_v3(ob->obmat, v2);
}
if(unit->system)
bUnit_AsString(val, sizeof(val), len_v3v3(v1, v2)*unit->scale_length, 3, unit->system, B_UNIT_LENGTH, do_split, FALSE);
else
sprintf(val, conv_float, len_v3v3(v1, v2));
- view3d_cached_text_draw_add(x, y, z, val, 0, 0);
+ view3d_cached_text_draw_add(vmid[0], vmid[1], vmid[2], val, 0, 0);
}
}
}
@@ -2135,18 +2127,18 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
glColor3fv(col);
for(efa= em->faces.first; efa; efa= efa->next) {
- if((efa->f & SELECT)) { // XXX || (G.moving && faceselectedOR(efa, SELECT)) ) {
- VECCOPY(v1, efa->v1->co);
- VECCOPY(v2, efa->v2->co);
- VECCOPY(v3, efa->v3->co);
+ if((efa->f & SELECT)) { // XXX || (do_moving && faceselectedOR(efa, SELECT)) ) {
+ copy_v3_v3(v1, efa->v1->co);
+ copy_v3_v3(v2, efa->v2->co);
+ copy_v3_v3(v3, efa->v3->co);
if (efa->v4) {
- VECCOPY(v4, efa->v4->co);
+ copy_v3_v3(v4, efa->v4->co);
}
- if(v3d->flag & V3D_GLOBAL_STATS) {
- mul_m4_v3(ob->obmat, v1);
- mul_m4_v3(ob->obmat, v2);
- mul_m4_v3(ob->obmat, v3);
- if (efa->v4) mul_m4_v3(ob->obmat, v4);
+ if(do_global) {
+ mul_mat3_m4_v3(ob->obmat, v1);
+ mul_mat3_m4_v3(ob->obmat, v2);
+ mul_mat3_m4_v3(ob->obmat, v3);
+ if (efa->v4) mul_mat3_m4_v3(ob->obmat, v4);
}
if (efa->v4)
@@ -2174,20 +2166,20 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
glColor3fv(col);
for(efa= em->faces.first; efa; efa= efa->next) {
- VECCOPY(v1, efa->v1->co);
- VECCOPY(v2, efa->v2->co);
- VECCOPY(v3, efa->v3->co);
+ copy_v3_v3(v1, efa->v1->co);
+ copy_v3_v3(v2, efa->v2->co);
+ copy_v3_v3(v3, efa->v3->co);
if(efa->v4) {
- VECCOPY(v4, efa->v4->co);
+ copy_v3_v3(v4, efa->v4->co);
}
else {
- VECCOPY(v4, v3);
+ copy_v3_v3(v4, v3);
}
- if(v3d->flag & V3D_GLOBAL_STATS) {
- mul_m4_v3(ob->obmat, v1);
- mul_m4_v3(ob->obmat, v2);
- mul_m4_v3(ob->obmat, v3);
- mul_m4_v3(ob->obmat, v4);
+ if(do_global) {
+ mul_mat3_m4_v3(ob->obmat, v1);
+ mul_mat3_m4_v3(ob->obmat, v2);
+ mul_mat3_m4_v3(ob->obmat, v3);
+ mul_mat3_m4_v3(ob->obmat, v4); /* intentionally executed even for tri's */
}
e1= efa->e1;
@@ -2197,19 +2189,19 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
/* Calculate the angles */
- if( (e4->f & e1->f & SELECT) || (G.moving && (efa->v1->f & SELECT)) ) {
+ if( (e4->f & e1->f & SELECT) || (do_moving && (efa->v1->f & SELECT)) ) {
/* Vec 1 */
sprintf(val,"%.3f", RAD2DEG(angle_v3v3v3(v4, v1, v2)));
interp_v3_v3v3(fvec, efa->cent, efa->v1->co, 0.8f);
view3d_cached_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0, 0);
}
- if( (e1->f & e2->f & SELECT) || (G.moving && (efa->v2->f & SELECT)) ) {
+ if( (e1->f & e2->f & SELECT) || (do_moving && (efa->v2->f & SELECT)) ) {
/* Vec 2 */
sprintf(val,"%.3f", RAD2DEG(angle_v3v3v3(v1, v2, v3)));
interp_v3_v3v3(fvec, efa->cent, efa->v2->co, 0.8f);
view3d_cached_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0, 0);
}
- if( (e2->f & e3->f & SELECT) || (G.moving && (efa->v3->f & SELECT)) ) {
+ if( (e2->f & e3->f & SELECT) || (do_moving && (efa->v3->f & SELECT)) ) {
/* Vec 3 */
if(efa->v4)
sprintf(val,"%.3f", RAD2DEG(angle_v3v3v3(v2, v3, v4)));
@@ -2220,7 +2212,7 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
}
/* Vec 4 */
if(efa->v4) {
- if( (e3->f & e4->f & SELECT) || (G.moving && (efa->v4->f & SELECT)) ) {
+ if( (e3->f & e4->f & SELECT) || (do_moving && (efa->v4->f & SELECT)) ) {
sprintf(val,"%.3f", RAD2DEG(angle_v3v3v3(v3, v4, v1)));
interp_v3_v3v3(fvec, efa->cent, efa->v4->co, 0.8f);
view3d_cached_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0, 0);
@@ -2479,7 +2471,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);
@@ -2517,7 +2510,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) {
@@ -2584,7 +2578,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);
}
}
@@ -2651,7 +2645,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);
}
}
@@ -2705,8 +2700,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), 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);
@@ -2726,7 +2722,8 @@ static int draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
int do_alpha_pass= 0, drawlinked= 0, retval= 0, glsl, check_alpha;
if(obedit && ob!=obedit && ob->data==obedit->data) {
- if(ob_get_key(ob));
+ if(ob_get_key(ob) || ob_get_key(obedit));
+ else if(ob->modifiers.first || obedit->modifiers.first);
else drawlinked= 1;
}
@@ -2772,7 +2769,20 @@ static int draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
}
/* GPU_begin_object_materials checked if this is needed */
- if(do_alpha_pass) add_view3d_after(v3d, base, V3D_TRANSP, flag);
+ if(do_alpha_pass) {
+ if(ob->dtx & OB_DRAWXRAY) {
+ add_view3d_after(&v3d->afterdraw_xraytransp, base, flag);
+ }
+ else {
+ add_view3d_after(&v3d->afterdraw_transp, base, flag);
+ }
+ }
+ else if(ob->dtx & OB_DRAWXRAY && ob->dtx & OB_DRAWTRANSP) {
+ /* special case xray+transp when alpha is 1.0, without this the object vanishes */
+ if(v3d->xray == 0 && v3d->transp == 0) {
+ add_view3d_after(&v3d->afterdraw_xray, base, flag);
+ }
+ }
return retval;
}
@@ -3073,7 +3083,8 @@ static int drawCurveDerivedMesh(Scene *scene, View3D *v3d, RegionView3D *rv3d, B
glDisable(GL_LIGHTING);
GPU_end_object_materials();
} else {
- drawCurveDMWired (ob);
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_SOLID)==0)
+ drawCurveDMWired (ob);
}
return 0;
@@ -3105,7 +3116,7 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
dl= lb->first;
if(dl==NULL) return 1;
- if(dl->nors==0) addnormalsDispList(ob, lb);
+ if(dl->nors==0) addnormalsDispList(lb);
index3_nors_incr= 0;
if( displist_has_faces(lb)==0) {
@@ -3152,7 +3163,7 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
dl= lb->first;
if(dl==NULL) return 1;
- if(dl->nors==NULL) addnormalsDispList(ob, lb);
+ if(dl->nors==NULL) addnormalsDispList(lb);
if(draw_glsl_material(scene, ob, v3d, dt)) {
GPU_begin_object_materials(v3d, rv3d, scene, ob, 1, NULL);
@@ -3255,7 +3266,7 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix
case PART_DRAW_DOT:
{
if(vd) {
- VECCOPY(vd,state->co) pdd->vd+=3;
+ copy_v3_v3(vd,state->co); pdd->vd+=3;
}
if(cd) {
cd[0]=ma_r;
@@ -3280,7 +3291,7 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix
cd[14]=cd[17]=1.0;
pdd->cd+=18;
- VECCOPY(vec2,state->co);
+ copy_v3_v3(vec2,state->co);
}
else {
if(cd) {
@@ -3289,47 +3300,47 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix
cd[2]=cd[5]=cd[8]=cd[11]=cd[14]=cd[17]=ma_b;
pdd->cd+=18;
}
- VECSUB(vec2,state->co,vec);
+ sub_v3_v3v3(vec2, state->co, vec);
}
- VECADD(vec,state->co,vec);
- VECCOPY(pdd->vd,vec); pdd->vd+=3;
- VECCOPY(pdd->vd,vec2); pdd->vd+=3;
+ add_v3_v3(vec, state->co);
+ copy_v3_v3(pdd->vd,vec); pdd->vd+=3;
+ copy_v3_v3(pdd->vd,vec2); pdd->vd+=3;
vec[1]=2.0f*pixsize;
vec[0]=vec[2]=0.0;
mul_qt_v3(state->rot,vec);
if(draw_as==PART_DRAW_AXIS){
- VECCOPY(vec2,state->co);
+ copy_v3_v3(vec2,state->co);
}
- else VECSUB(vec2,state->co,vec);
+ else sub_v3_v3v3(vec2, state->co, vec);
- VECADD(vec,state->co,vec);
- VECCOPY(pdd->vd,vec); pdd->vd+=3;
- VECCOPY(pdd->vd,vec2); pdd->vd+=3;
+ add_v3_v3(vec, state->co);
+ copy_v3_v3(pdd->vd,vec); pdd->vd+=3;
+ copy_v3_v3(pdd->vd,vec2); pdd->vd+=3;
vec[2]=2.0f*pixsize;
vec[0]=vec[1]=0.0;
mul_qt_v3(state->rot,vec);
if(draw_as==PART_DRAW_AXIS){
- VECCOPY(vec2,state->co);
+ copy_v3_v3(vec2,state->co);
}
- else VECSUB(vec2,state->co,vec);
+ else sub_v3_v3v3(vec2, state->co, vec);
- VECADD(vec,state->co,vec);
+ add_v3_v3(vec, state->co);
- VECCOPY(pdd->vd,vec); pdd->vd+=3;
- VECCOPY(pdd->vd,vec2); pdd->vd+=3;
+ copy_v3_v3(pdd->vd,vec); pdd->vd+=3;
+ copy_v3_v3(pdd->vd,vec2); pdd->vd+=3;
break;
}
case PART_DRAW_LINE:
{
- VECCOPY(vec,state->vel);
+ copy_v3_v3(vec,state->vel);
normalize_v3(vec);
if(draw & PART_DRAW_VEL_LENGTH)
mul_v3_fl(vec,len_v3(state->vel));
- VECADDFAC(pdd->vd,state->co,vec,-draw_line[0]); pdd->vd+=3;
- VECADDFAC(pdd->vd,state->co,vec,draw_line[1]); pdd->vd+=3;
+ madd_v3_v3v3fl(pdd->vd, state->co, vec, -draw_line[0]); pdd->vd+=3;
+ madd_v3_v3v3fl(pdd->vd, state->co, vec, draw_line[1]); pdd->vd+=3;
if(cd) {
cd[0]=cd[3]=ma_r;
cd[1]=cd[4]=ma_g;
@@ -3356,27 +3367,27 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix
}
- VECCOPY(bb->vec, state->co);
- VECCOPY(bb->vel, state->vel);
+ copy_v3_v3(bb->vec, state->co);
+ copy_v3_v3(bb->vel, state->vel);
psys_make_billboard(bb, xvec, yvec, zvec, bb_center);
- VECADD(pdd->vd,bb_center,xvec);
- VECADD(pdd->vd,pdd->vd,yvec); pdd->vd+=3;
+ add_v3_v3v3(pdd->vd, bb_center, xvec);
+ add_v3_v3(pdd->vd, yvec); pdd->vd+=3;
- VECSUB(pdd->vd,bb_center,xvec);
- VECADD(pdd->vd,pdd->vd,yvec); pdd->vd+=3;
+ sub_v3_v3v3(pdd->vd, bb_center, vec);
+ add_v3_v3(pdd->vd, yvec); pdd->vd+=3;
- VECSUB(pdd->vd,bb_center,xvec);
- VECSUB(pdd->vd,pdd->vd,yvec); pdd->vd+=3;
+ sub_v3_v3v3(pdd->vd, bb_center, xvec);
+ sub_v3_v3v3(pdd->vd, pdd->vd,yvec); pdd->vd+=3;
- VECADD(pdd->vd,bb_center,xvec);
- VECSUB(pdd->vd,pdd->vd,yvec); pdd->vd+=3;
+ add_v3_v3v3(pdd->vd, bb_center, xvec);
+ sub_v3_v3v3(pdd->vd, pdd->vd, yvec); pdd->vd+=3;
- VECCOPY(pdd->nd, zvec); pdd->nd+=3;
- VECCOPY(pdd->nd, zvec); pdd->nd+=3;
- VECCOPY(pdd->nd, zvec); pdd->nd+=3;
- VECCOPY(pdd->nd, zvec); pdd->nd+=3;
+ copy_v3_v3(pdd->nd, zvec); pdd->nd+=3;
+ copy_v3_v3(pdd->nd, zvec); pdd->nd+=3;
+ copy_v3_v3(pdd->nd, zvec); pdd->nd+=3;
+ copy_v3_v3(pdd->nd, zvec); pdd->nd+=3;
break;
}
}
@@ -3494,7 +3505,6 @@ 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)
@@ -3786,11 +3796,10 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
/* additional things to draw for each particle */
/* (velocity, size and number) */
if((part->draw & PART_DRAW_VEL) && pdd->vedata){
- VECCOPY(pdd->ved,state.co);
- pdd->ved+=3;
- VECCOPY(vel,state.vel);
- mul_v3_fl(vel,timestep);
- VECADD(pdd->ved,state.co,vel);
+ copy_v3_v3(pdd->ved,state.co);
+ pdd->ved += 3;
+ mul_v3_v3fl(vel, state.vel, timestep);
+ add_v3_v3v3(pdd->ved, state.co, vel);
pdd->ved+=3;
totve++;
@@ -3815,7 +3824,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
sprintf(val_pos, (val_pos==val) ? "%.2f" : ":%.2f", pa_health);
/* in path drawing state.co is the end point */
- /* use worldspace beause object matrix is alredy applied */
+ /* use worldspace beause object matrix is already applied */
mul_v3_m4v3(vec_txt, ob->imat, state.co);
view3d_cached_text_draw_add(vec_txt[0], vec_txt[1], vec_txt[2], val, 10, V3D_CACHE_TEXT_WORLDSPACE);
}
@@ -3832,7 +3841,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)
@@ -3842,13 +3851,13 @@ 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)
totpart=0;
@@ -3862,7 +3871,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);
@@ -3878,7 +3887,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);
@@ -3889,7 +3898,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);
@@ -3900,6 +3909,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; a<totpart; a++, pa++){
+ float vec_txt[3];
+ val[0]= '\0';
+
+ sprintf(val, "%i", a);
+ /* use worldspace beause object matrix is already applied */
+ mul_v3_m4v3(vec_txt, ob->imat, 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);
@@ -4054,7 +4077,7 @@ static void draw_ptcache_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Obj
if(timed) {
for(k=0, pcol=pathcol, pkey=path; k<steps; k++, pkey++, pcol+=4){
- VECCOPY(pcol, pkey->col);
+ copy_v3_v3(pcol, pkey->col);
pcol[3] = 1.0f - fabs((float)CFRA - pkey->time)/(float)pset->fade_frames;
}
@@ -4092,15 +4115,15 @@ static void draw_ptcache_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Obj
for(k=0, key=point->keys; k<point->totkey; k++, key++){
if(pd) {
- VECCOPY(pd, key->co);
+ copy_v3_v3(pd, key->co);
pd += 3;
}
if(key->flag&PEK_SELECT){
- VECCOPY(cd,sel_col);
+ copy_v3_v3(cd,sel_col);
}
else{
- VECCOPY(cd,nosel_col);
+ copy_v3_v3(cd,nosel_col);
}
if(timed)
@@ -4174,12 +4197,12 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float
root[1] = root[2] = 0.0f;
root[0] = -drw_size;
mul_m3_v3(tr,root);
- VECADD(root,root,com);
+ add_v3_v3(root, com);
glVertex3fv(root);
tip[1] = tip[2] = 0.0f;
tip[0] = drw_size;
mul_m3_v3(tr,tip);
- VECADD(tip,tip,com);
+ add_v3_v3(tip, com);
glVertex3fv(tip);
glEnd();
@@ -4187,7 +4210,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float
root[0] = th;
glBegin(GL_LINES);
mul_m3_v3(tr,root);
- VECADD(root,root,com);
+ add_v3_v3(root, com);
glVertex3fv(root);
glVertex3fv(tip);
glEnd();
@@ -4196,7 +4219,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float
root[0] = th;
glBegin(GL_LINES);
mul_m3_v3(tr,root);
- VECADD(root,root,com);
+ add_v3_v3(root, com);
glVertex3fv(root);
glVertex3fv(tip);
glEnd();
@@ -4205,7 +4228,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float
root[0] =th;
glBegin(GL_LINES);
mul_m3_v3(tr,root);
- VECADD(root,root,com);
+ add_v3_v3(root, com);
glVertex3fv(root);
glVertex3fv(tip);
glEnd();
@@ -4214,7 +4237,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float
root[0] = th;
glBegin(GL_LINES);
mul_m3_v3(tr,root);
- VECADD(root,root,com);
+ add_v3_v3(root, com);
glVertex3fv(root);
glVertex3fv(tip);
glEnd();
@@ -4225,12 +4248,12 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float
root[0] = root[2] = 0.0f;
root[1] = -drw_size;
mul_m3_v3(tr,root);
- VECADD(root,root,com);
+ add_v3_v3(root, com);
glVertex3fv(root);
tip[0] = tip[2] = 0.0f;
tip[1] = drw_size;
mul_m3_v3(tr,tip);
- VECADD(tip,tip,com);
+ add_v3_v3(tip, com);
glVertex3fv(tip);
glEnd();
@@ -4238,7 +4261,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float
root[1] = th;
glBegin(GL_LINES);
mul_m3_v3(tr,root);
- VECADD(root,root,com);
+ add_v3_v3(root, com);
glVertex3fv(root);
glVertex3fv(tip);
glEnd();
@@ -4247,7 +4270,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float
root[1] = th;
glBegin(GL_LINES);
mul_m3_v3(tr,root);
- VECADD(root,root,com);
+ add_v3_v3(root, com);
glVertex3fv(root);
glVertex3fv(tip);
glEnd();
@@ -4256,7 +4279,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float
root[1] =th;
glBegin(GL_LINES);
mul_m3_v3(tr,root);
- VECADD(root,root,com);
+ add_v3_v3(root, com);
glVertex3fv(root);
glVertex3fv(tip);
glEnd();
@@ -4265,7 +4288,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float
root[1] = th;
glBegin(GL_LINES);
mul_m3_v3(tr,root);
- VECADD(root,root,com);
+ add_v3_v3(root, com);
glVertex3fv(root);
glVertex3fv(tip);
glEnd();
@@ -4275,12 +4298,12 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float
root[0] = root[1] = 0.0f;
root[2] = -drw_size;
mul_m3_v3(tr,root);
- VECADD(root,root,com);
+ add_v3_v3(root, com);
glVertex3fv(root);
tip[0] = tip[1] = 0.0f;
tip[2] = drw_size;
mul_m3_v3(tr,tip);
- VECADD(tip,tip,com);
+ add_v3_v3(tip, com);
glVertex3fv(tip);
glEnd();
@@ -4288,7 +4311,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float
root[2] = th;
glBegin(GL_LINES);
mul_m3_v3(tr,root);
- VECADD(root,root,com);
+ add_v3_v3(root, com);
glVertex3fv(root);
glVertex3fv(tip);
glEnd();
@@ -4297,7 +4320,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float
root[2] = th;
glBegin(GL_LINES);
mul_m3_v3(tr,root);
- VECADD(root,root,com);
+ add_v3_v3(root, com);
glVertex3fv(root);
glVertex3fv(tip);
glEnd();
@@ -4306,7 +4329,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float
root[2] = th;
glBegin(GL_LINES);
mul_m3_v3(tr,root);
- VECADD(root,root,com);
+ add_v3_v3(root, com);
glVertex3fv(root);
glVertex3fv(tip);
glEnd();
@@ -4315,7 +4338,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float
root[2] = th;
glBegin(GL_LINES);
mul_m3_v3(tr,root);
- VECADD(root,root,com);
+ add_v3_v3(root, com);
glVertex3fv(root);
glVertex3fv(tip);
glEnd();
@@ -4409,17 +4432,19 @@ static void tekenhandlesN_active(Nurb *nu)
glLineWidth(1);
}
-static void tekenvertsN(Nurb *nu, short sel, short hide_handles)
+static void tekenvertsN(Nurb *nu, short sel, short hide_handles, void *lastsel)
{
BezTriple *bezt;
BPoint *bp;
float size;
- int a;
+ int a, color;
if(nu->hide) return;
- if(sel) UI_ThemeColor(TH_VERTEX_SELECT);
- else UI_ThemeColor(TH_VERTEX);
+ if(sel) color= TH_VERTEX_SELECT;
+ else color= TH_VERTEX;
+
+ UI_ThemeColor(color);
size= UI_GetThemeValuef(TH_VERTEX_SIZE);
glPointSize(size);
@@ -4432,7 +4457,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]);
@@ -4448,7 +4483,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++;
}
@@ -4673,7 +4714,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);
@@ -4695,8 +4736,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);
@@ -4716,7 +4757,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);
@@ -4836,12 +4877,10 @@ static void drawspiral(float *cent, float rad, float tmat[][4], int start)
start *= -1;
}
- VECCOPY(vx, tmat[0]);
- VECCOPY(vy, tmat[1]);
- mul_v3_fl(vx, rad);
- mul_v3_fl(vy, rad);
+ mul_v3_v3fl(vx, tmat[0], rad);
+ mul_v3_v3fl(vy, tmat[1], rad);
- VECCOPY(vec, cent);
+ copy_v3_v3(vec, cent);
if (inverse==0) {
for(a=0; a<tot; a++) {
@@ -4963,6 +5002,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) {
@@ -5102,17 +5143,17 @@ 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);
- VECCOPY(vec, guidevec1); /* max center */
+ copy_v3_v3(vec, guidevec1); /* max center */
}
}
@@ -5198,8 +5239,8 @@ void get_local_bounds(Object *ob, float *center, float *size)
BoundBox *bb= object_get_boundbox(ob);
if(bb==NULL) {
- center[0]= center[1]= center[2]= 0.0;
- VECCOPY(size, ob->size);
+ zero_v3(center);
+ copy_v3_v3(size, ob->size);
}
else {
size[0]= 0.5*fabs(bb->vec[0][0] - bb->vec[4][0]);
@@ -5291,13 +5332,13 @@ static void drawtexspace(Object *ob)
}
else if ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT) {
Curve *cu= ob->data;
- VECCOPY(size, cu->size);
- VECCOPY(loc, cu->loc);
+ copy_v3_v3(size, cu->size);
+ copy_v3_v3(loc, cu->loc);
}
else if(ob->type==OB_MBALL) {
MetaBall *mb= ob->data;
- VECCOPY(size, mb->size);
- VECCOPY(loc, mb->loc);
+ copy_v3_v3(size, mb->size);
+ copy_v3_v3(loc, mb->loc);
}
else return;
@@ -5442,10 +5483,9 @@ static void draw_hooks(Object *ob)
//<rcruiz>
void drawRBpivot(bRigidBodyJointConstraint *data)
{
- float radsPerDeg = 6.283185307179586232f / 360.f;
int axis;
float v1[3]= {data->pivX, data->pivY, data->pivZ};
- float eu[3]= {radsPerDeg*data->axX, radsPerDeg*data->axY, radsPerDeg*data->axZ};
+ float eu[3]= {data->axX, data->axY, data->axZ};
float mat[4][4];
eul_to_mat4(mat,eu);
@@ -5458,9 +5498,7 @@ void drawRBpivot(bRigidBodyJointConstraint *data)
dir[axis] = 1.f;
glBegin(GL_LINES);
mul_m4_v3(mat,dir);
- v[0] += dir[0];
- v[1] += dir[1];
- v[2] += dir[2];
+ add_v3_v3(v, dir);
glVertex3fv(v1);
glVertex3fv(v);
glEnd();
@@ -5498,6 +5536,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 */
@@ -5510,7 +5551,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if(!(ob->mode & OB_MODE_PARTICLE_EDIT)) {
/* xray and transp are set when it is drawing the 2nd/3rd pass */
if(!v3d->xray && !v3d->transp && (ob->dtx & OB_DRAWXRAY) && !(ob->dtx & OB_DRAWTRANSP)) {
- add_view3d_after(v3d, base, V3D_XRAY, flag);
+ add_view3d_after(&v3d->afterdraw_xray, base, flag);
return;
}
}
@@ -5745,8 +5786,8 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if (cu->linewidth != 0.0) {
cpack(0xff44ff);
UI_ThemeColor(TH_WIRE);
- VECCOPY(vec1, ob->orig);
- VECCOPY(vec2, ob->orig);
+ copy_v3_v3(vec1, ob->orig);
+ copy_v3_v3(vec2, ob->orig);
vec1[0] += cu->linewidth;
vec2[0] += cu->linewidth;
vec1[1] += cu->linedist * cu->fsize;
@@ -5766,8 +5807,8 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
UI_ThemeColor(TH_ACTIVE);
else
UI_ThemeColor(TH_WIRE);
- vec1[0] = cu->tb[i].x;
- vec1[1] = cu->tb[i].y + cu->fsize;
+ vec1[0] = (cu->xof * cu->fsize) + cu->tb[i].x;
+ vec1[1] = (cu->yof * cu->fsize) + cu->tb[i].y + cu->fsize;
vec1[2] = 0.001;
glBegin(GL_LINE_STRIP);
glVertex3fv(vec1);
@@ -5812,8 +5853,10 @@ 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(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);
@@ -5823,10 +5866,13 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
cu= ob->data;
if(cu->editnurb) {
- drawnurb(scene, v3d, rv3d, base, cu->editnurb->first, dt);
+ ListBase *nurbs= ED_curve_editnurbs(cu);
+ drawnurb(scene, v3d, rv3d, base, nurbs->first, dt);
+ }
+ else if(dt==OB_BOUNDBOX) {
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0)
+ draw_bounding_volume(scene, ob);
}
- else if(dt==OB_BOUNDBOX)
- 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);
@@ -5840,15 +5886,17 @@ 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:
if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0)
- drawaxes(rv3d, rv3d->viewmatob, ob->empty_drawsize, flag, ob->empty_drawtype);
+ drawaxes(ob->empty_drawsize, flag, ob->empty_drawtype);
break;
case OB_LAMP:
if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
@@ -5874,11 +5922,11 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
break;
default:
if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
- drawaxes(rv3d, rv3d->viewmatob, 1.0, flag, OB_ARROWS);
+ drawaxes(1.0, flag, OB_ARROWS);
}
}
- if((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) {
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) {
if(ob->soft /*&& flag & OB_SBMOTION*/){
float mrt[3][3],msc[3][3],mtr[3][3];
@@ -6028,7 +6076,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if(density[index] > FLT_EPSILON)
{
float color[3];
- VECCOPY(tmp, smd->domain->p0);
+ copy_v3_v3(tmp, smd->domain->p0);
tmp[0] += smd->domain->dx * x + smd->domain->dx * 0.5;
tmp[1] += smd->domain->dx * y + smd->domain->dx * 0.5;
tmp[2] += smd->domain->dx * z + smd->domain->dx * 0.5;
@@ -6072,11 +6120,14 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
/* 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);
+ drawaxes(1.0f, flag, OB_ARROWS);
+ }
+ if(dtx & OB_BOUNDBOX) {
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0)
+ draw_bounding_volume(scene, ob);
}
- 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 */
@@ -6090,12 +6141,11 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
}
- if(dt<OB_SHADED) {
+ if(dt<OB_SHADED && (v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
if((ob->gameflag & OB_DYNAMIC) ||
((ob->gameflag & OB_BOUNDS) && (ob->boundtype == OB_BOUND_SPHERE))) {
- float imat[4][4], vec[3];
+ float imat[4][4], vec[3]= {0.0f, 0.0f, 0.0f};
- vec[0]= vec[1]= vec[2]= 0.0;
invert_m4_m4(imat, rv3d->viewmatob);
setlinestyle(2);
@@ -6279,7 +6329,7 @@ static void bbs_mesh_solid_EM(Scene *scene, View3D *v3d, Object *ob, DerivedMesh
if (facecol) {
dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, (void*)(intptr_t) 1, 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);
@@ -6445,7 +6495,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(rv3d, rv3d->viewmatob, ob->empty_drawsize, 0, ob->empty_drawtype);
+ drawaxes(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 9fa64c4e155..678920f8173 100644
--- a/source/blender/editors/space_view3d/drawvolume.c
+++ b/source/blender/editors/space_view3d/drawvolume.c
@@ -29,10 +29,6 @@
#include <string.h>
#include <math.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "MEM_guardedalloc.h"
@@ -49,7 +45,6 @@
#include "BLI_edgehash.h"
#include "BLI_rand.h"
-#include "BKE_anim.h" //for the where_on_path function
#include "BKE_curve.h"
#include "BKE_constraint.h" // for the get_constraint_target function
#include "BKE_DerivedMesh.h"
@@ -70,12 +65,10 @@
#include "BKE_particle.h"
#include "BKE_property.h"
#include "BKE_smoke.h"
-#include "BKE_unit.h"
#include "BKE_utildefines.h"
#include "smoke_API.h"
#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "GPU_extensions.h"
@@ -123,6 +116,7 @@ static void tend ( void )
{
gettimeofday ( &_tend,&tz );
}
+ #if 0
static double tval()
{
double t1, t2;
@@ -130,6 +124,7 @@ static double tval()
t2 = ( double ) _tend.tv_sec*1000 + ( double ) _tend.tv_usec/ ( 1000 );
return t2-t1;
}
+ #endif
#endif
struct GPUTexture;
@@ -216,7 +211,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"
@@ -353,6 +348,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]);
@@ -449,7 +449,7 @@ void draw_volume(Scene *scene, ARegion *ar, View3D *v3d, Base *base, GPUTexture
}
tend();
- printf ( "Draw Time: %f\n",( float ) tval() );
+ // printf ( "Draw Time: %f\n",( float ) tval() );
if(tex_shadow)
GPU_texture_unbind(tex_shadow);
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 869d0c45f2f..c49f4f48e10 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -38,12 +38,8 @@
#include "BLI_math.h"
#include "BLI_rand.h"
-#include "BKE_action.h"
#include "BKE_context.h"
-#include "BKE_global.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
-#include "BKE_image.h"
#include "ED_screen.h"
#include "ED_object.h"
@@ -57,6 +53,8 @@
#include "RNA_access.h"
+#include "UI_resources.h"
+
#include "view3d_intern.h" // own include
/* ******************** manage regions ********************* */
@@ -209,6 +207,7 @@ static SpaceLink *view3d_new(const bContext *C)
v3d->far= 500.0f;
v3d->twtype= V3D_MANIP_TRANSLATE;
+ v3d->around= V3D_CENTROID;
/* header */
ar= MEM_callocN(sizeof(ARegion), "header for view3d");
@@ -271,7 +270,6 @@ static void view3d_free(SpaceLink *sl)
if(vd->localvd) MEM_freeN(vd->localvd);
if(vd->properties_storage) MEM_freeN(vd->properties_storage);
-
}
@@ -411,10 +409,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;
}
@@ -435,10 +439,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)
@@ -447,7 +461,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);
}
@@ -505,13 +519,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:
@@ -539,8 +559,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;
}
@@ -564,7 +583,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) {
@@ -592,6 +611,10 @@ 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->subtype == NS_VIEW3D_GPU) {
@@ -687,12 +710,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:
@@ -719,6 +745,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;
}
@@ -730,6 +757,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 */
@@ -770,6 +799,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);
@@ -798,7 +846,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")) {
@@ -816,7 +864,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")) {
@@ -832,7 +880,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")) {
@@ -848,7 +896,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")) {
@@ -944,7 +992,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");
@@ -952,7 +1003,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 b463d07677b..a0167c87d87 100644
--- a/source/blender/editors/space_view3d/view3d_buttons.c
+++ b/source/blender/editors/space_view3d/view3d_buttons.c
@@ -47,21 +47,15 @@
#include "BLI_rand.h"
#include "BKE_action.h"
-#include "BKE_brush.h"
#include "BKE_context.h"
#include "BKE_curve.h"
#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
-#include "BKE_idprop.h"
+#include "BKE_main.h"
#include "BKE_mesh.h"
-#include "BKE_object.h"
-#include "BKE_global.h"
-#include "BKE_scene.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "BKE_deform.h"
-#include "BIF_gl.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -73,6 +67,7 @@
#include "ED_mesh.h"
#include "ED_screen.h"
#include "ED_transform.h"
+#include "ED_curve.h"
#include "UI_interface.h"
#include "UI_resources.h"
@@ -157,7 +152,7 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d
if(eve->f & SELECT) {
evedef= eve;
tot++;
- add_v3_v3v3(median, median, eve->co);
+ add_v3_v3(median, eve->co);
}
eve= eve->next;
}
@@ -205,15 +200,16 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d
BPoint *bp;
BezTriple *bezt;
int a;
-
- nu= cu->editnurb->first;
+ ListBase *nurbs= ED_curve_editnurbs(cu);
+
+ nu= nurbs->first;
while(nu) {
if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
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++;
@@ -222,11 +218,11 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d
}
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++;
}
}
@@ -238,7 +234,7 @@ 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++;
@@ -258,11 +254,11 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d
BPoint *bp;
int a;
- a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
- bp= lt->editlatt->def;
+ a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
+ bp= lt->editlatt->latt->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++;
@@ -358,7 +354,7 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d
if(totedge==1)
uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Crease:", 0, 20, 200, 20, &(tfp->ve_median[3]), 0.0, 1.0, 10, 3, "");
else if(totedge>1)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median Crease:", 0, 20, 200, 20, &(tfp->ve_median[3]), 0.0, 1.0, 10, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Mean Crease:", 0, 20, 200, 20, &(tfp->ve_median[3]), 0.0, 1.0, 10, 3, "");
}
else { // apply
@@ -383,7 +379,7 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d
eve= em->verts.first;
while(eve) {
if(eve->f & SELECT) {
- add_v3_v3v3(eve->co, eve->co, median);
+ add_v3_v3(eve->co, median);
}
eve= eve->next;
}
@@ -410,26 +406,27 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d
BPoint *bp;
BezTriple *bezt;
int a;
-
- nu= cu->editnurb->first;
+ ListBase *nurbs= ED_curve_editnurbs(cu);
+
+ nu= nurbs->first;
while(nu) {
if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
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++;
@@ -440,7 +437,7 @@ 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];
@@ -459,11 +456,11 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d
BPoint *bp;
int a;
- a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
- bp= lt->editlatt->def;
+ a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
+ bp= lt->editlatt->latt->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++;
@@ -746,7 +743,7 @@ static void v3d_transform_butsR(uiLayout *layout, PointerRNA *ptr)
uiItemR(colsub, ptr, "location", 0, "Location", 0);
colsub = uiLayoutColumn(split, 1);
uiItemL(colsub, "", 0);
- uiItemR(colsub, ptr, "lock_location", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_LOCKED);
+ uiItemR(colsub, ptr, "lock_location", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0);
split = uiLayoutSplit(layout, 0.8, 0);
@@ -757,10 +754,10 @@ static void v3d_transform_butsR(uiLayout *layout, PointerRNA *ptr)
colsub = uiLayoutColumn(split, 1);
uiItemR(colsub, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE, "4L", 0);
if (RNA_boolean_get(ptr, "lock_rotations_4d"))
- uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_LOCKED);
+ uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0);
else
uiItemL(colsub, "", 0);
- uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_LOCKED);
+ 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);
@@ -768,17 +765,17 @@ static void v3d_transform_butsR(uiLayout *layout, PointerRNA *ptr)
colsub = uiLayoutColumn(split, 1);
uiItemR(colsub, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE, "4L", 0);
if (RNA_boolean_get(ptr, "lock_rotations_4d"))
- uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_LOCKED);
+ uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0);
else
uiItemL(colsub, "", 0);
- uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_LOCKED);
+ 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, ptr, "rotation_euler", 0, "Rotation", 0);
colsub = uiLayoutColumn(split, 1);
uiItemL(colsub, "", 0);
- uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_LOCKED);
+ uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0);
break;
}
uiItemR(layout, ptr, "rotation_mode", 0, "", 0);
@@ -788,7 +785,7 @@ static void v3d_transform_butsR(uiLayout *layout, PointerRNA *ptr)
uiItemR(colsub, ptr, "scale", 0, "Scale", 0);
colsub = uiLayoutColumn(split, 1);
uiItemL(colsub, "", 0);
- uiItemR(colsub, ptr, "lock_scale", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_LOCKED);
+ uiItemR(colsub, ptr, "lock_scale", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0);
if (ptr->type == &RNA_Object) {
Object *ob = ptr->data;
@@ -994,6 +991,7 @@ static int test_parent_loop(Object *par, Object *ob)
static void do_view3d_region_buttons(bContext *C, void *arg, int event)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
// Object *obedit= CTX_data_edit_object(C);
View3D *v3d= CTX_wm_view3d(C);
@@ -1025,7 +1023,7 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event)
if(ob->id.lib || test_parent_loop(ob->parent, ob) )
ob->parent= NULL;
else {
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
DAG_id_flush_update(&ob->id, OB_RECALC_OB);
}
}
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 64c3da55318..f0aa54248da 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -33,6 +33,7 @@
#include "DNA_armature_types.h"
#include "DNA_camera_types.h"
#include "DNA_customdata_types.h"
+#include "DNA_object_types.h"
#include "DNA_group_types.h"
#include "DNA_key_types.h"
#include "DNA_lamp_types.h"
@@ -49,14 +50,11 @@
#include "BKE_context.h"
#include "BKE_customdata.h"
#include "BKE_image.h"
-#include "BKE_ipo.h"
#include "BKE_key.h"
#include "BKE_object.h"
#include "BKE_global.h"
#include "BKE_paint.h"
#include "BKE_scene.h"
-#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "BKE_unit.h"
#include "RE_pipeline.h" // make_stars
@@ -188,7 +186,7 @@ void view3d_clr_clipping(void)
static int test_clipping(float *vec, float clip[][4])
{
float view[3];
- VECCOPY(view, vec);
+ copy_v3_v3(view, vec);
if(0.0f < clip[0][3] + INPR(view, clip[0]))
if(0.0f < clip[1][3] + INPR(view, clip[1]))
@@ -210,28 +208,37 @@ int view3d_test_clipping(RegionView3D *rv3d, float *vec, int local)
static void drawgrid_draw(ARegion *ar, float wx, float wy, float x, float y, float dx)
-{
- float fx, fy;
-
+{
+ float v1[2], v2[2];
+
x+= (wx);
y+= (wy);
- fx= x/dx;
- fx= x-dx*floor(fx);
+
+ v1[1]= 0.0f;
+ v2[1]= (float)ar->winy;
+
+ v1[0] = v2[0] = x-dx*floor(x/dx);
+
+ glBegin(GL_LINES);
- while(fx< ar->winx) {
- fdrawline(fx, 0.0, fx, (float)ar->winy);
- fx+= dx;
+ while(v1[0] < ar->winx) {
+ glVertex2fv(v1);
+ glVertex2fv(v2);
+ v1[0] = v2[0] = v1[0] + dx;
}
- fy= y/dx;
- fy= y-dx*floor(fy);
-
+ v1[0]= 0.0f;
+ v2[0]= (float)ar->winx;
+
+ v1[1]= v2[1]= y-dx*floor(y/dx);
- while(fy< ar->winy) {
- fdrawline(0.0, fy, (float)ar->winx, fy);
- fy+= dx;
+ while(v1[1] < ar->winy) {
+ glVertex2fv(v1);
+ glVertex2fv(v2);
+ v1[1] = v2[1] = v1[1] + dx;
}
+ glEnd();
}
#define GRID_MIN_PX 6.0f
@@ -819,7 +826,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,14 +862,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 view3d_calc_camera_border(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
*/
@@ -968,21 +977,30 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
extern void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad); // interface_panel.c
float fac, a;
float x1, x2, y1, y2;
+ float x1i, x2i, y1i, y2i;
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);
+ view3d_calc_camera_border(scene, ar, rv3d, v3d, &viewborder);
+ /* the offsets */
x1= viewborder.xmin;
y1= viewborder.ymin;
x2= viewborder.xmax;
y2= viewborder.ymax;
+ /* apply offsets so the real 3D camera shows through */
+ x1i= (int)(x1 - 1.0f);
+ y1i= (int)(y1 - 1.0f);
+ x2i= (int)(x2 + 1.0f);
+ y2i= (int)(y2 + 1.0f);
+
/* passepartout, specified in camera edit buttons */
if (ca && (ca->flag & CAM_SHOWPASSEPARTOUT) && ca->passepartalpha > 0.000001) {
if (ca->passepartalpha == 1.0) {
@@ -992,29 +1010,29 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
glEnable(GL_BLEND);
glColor4f(0, 0, 0, ca->passepartalpha);
}
- if (x1 > 0.0)
- glRectf(0.0, (float)ar->winy, x1, 0.0);
- if (x2 < (float)ar->winx)
- glRectf(x2, (float)ar->winy, (float)ar->winx, 0.0);
- if (y2 < (float)ar->winy)
- glRectf(x1, (float)ar->winy, x2, y2);
- if (y2 > 0.0)
- glRectf(x1, y1, x2, 0.0);
+ if (x1i > 0.0)
+ glRectf(0.0, (float)ar->winy, x1i, 0.0);
+ if (x2i < (float)ar->winx)
+ glRectf(x2i, (float)ar->winy, (float)ar->winx, 0.0);
+ if (y2i < (float)ar->winy)
+ glRectf(x1i, (float)ar->winy, x2i, y2i);
+ if (y2i > 0.0)
+ glRectf(x1i, y1i, x2i, 0.0);
glDisable(GL_BLEND);
}
-
+
/* edge */
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
-
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
setlinestyle(0);
UI_ThemeColor(TH_BACK);
- glRectf(x1, y1, x2, y2);
+ glRectf(x1i, y1i, x2i, y2i);
setlinestyle(3);
UI_ThemeColor(TH_WIRE);
- glRectf(x1, y1, x2, y2);
-
+ glRectf(x1i, y1i, x2i, y2i);
+
/* border */
if(scene->r.mode & R_BORDER) {
@@ -1027,7 +1045,7 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
cpack(0x4040FF);
glRectf(x3, y3, x4, y4);
}
-
+
/* safety border */
if (ca && (ca->flag & CAM_SHOWTITLESAFE)) {
fac= 0.1;
@@ -1045,21 +1063,21 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
uiSetRoundBox(15);
gl_round_box(GL_LINE_LOOP, x1, y1, x2, y2, 12.0);
}
-
+
setlinestyle(0);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
-
+
/* camera name - draw in highlighted text color */
if (ca && (ca->flag & CAM_SHOWNAME)) {
UI_ThemeColor(TH_TEXT_HI);
- BLF_draw_default(x1, y1-15, 0.0f, v3d->camera->id.name+2);
+ BLF_draw_default(x1i, y1i-15, 0.0f, v3d->camera->id.name+2);
UI_ThemeColor(TH_WIRE);
}
}
/* *********************** backdraw for selection *************** */
-void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d)
+static void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d)
{
RegionView3D *rv3d= ar->regiondata;
struct Base *base = scene->basact;
@@ -1112,6 +1130,7 @@ void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d)
}
v3d->flag &= ~V3D_INVALID_BACKBUF;
+ ar->swap= 0; /* mark invalid backbuf for wm draw */
G.f &= ~G_BACKBUFSEL;
v3d->zbuf= FALSE;
@@ -1306,7 +1325,7 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d)
if(rv3d->persp==RV3D_CAMOB) {
rctf vb;
- calc_viewborder(scene, ar, v3d, &vb);
+ view3d_calc_camera_border(scene, ar, rv3d, v3d, &vb);
x1= vb.xmin;
y1= vb.ymin;
@@ -1400,45 +1419,18 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d)
typedef struct View3DAfter {
struct View3DAfter *next, *prev;
struct Base *base;
- int type, flag;
+ int flag;
} View3DAfter;
/* temp storage of Objects that need to be drawn as last */
-void add_view3d_after(View3D *v3d, Base *base, int type, int flag)
+void add_view3d_after(ListBase *lb, Base *base, int flag)
{
View3DAfter *v3da= MEM_callocN(sizeof(View3DAfter), "View 3d after");
-
- BLI_addtail(&v3d->afterdraw, v3da);
+ BLI_addtail(lb, v3da);
v3da->base= base;
- v3da->type= type;
v3da->flag= flag;
}
-/* clears zbuffer and draws it over */
-static void view3d_draw_xray(Scene *scene, ARegion *ar, View3D *v3d, int clear)
-{
- View3DAfter *v3da, *next;
- int doit= 0;
-
- for(v3da= v3d->afterdraw.first; v3da; v3da= v3da->next)
- if(v3da->type==V3D_XRAY) doit= 1;
-
- if(doit) {
- if(clear && v3d->zbuf) glClear(GL_DEPTH_BUFFER_BIT);
- v3d->xray= TRUE;
-
- for(v3da= v3d->afterdraw.first; v3da; v3da= next) {
- next= v3da->next;
- if(v3da->type==V3D_XRAY) {
- draw_object(scene, ar, v3d, v3da->base, v3da->flag);
- BLI_remlink(&v3d->afterdraw, v3da);
- MEM_freeN(v3da);
- }
- }
- v3d->xray= FALSE;
- }
-}
-
/* disables write in zbuffer and draws it over */
static void view3d_draw_transp(Scene *scene, ARegion *ar, View3D *v3d)
{
@@ -1447,13 +1439,11 @@ static void view3d_draw_transp(Scene *scene, ARegion *ar, View3D *v3d)
glDepthMask(0);
v3d->transp= TRUE;
- for(v3da= v3d->afterdraw.first; v3da; v3da= next) {
+ for(v3da= v3d->afterdraw_transp.first; v3da; v3da= next) {
next= v3da->next;
- if(v3da->type==V3D_TRANSP) {
- draw_object(scene, ar, v3d, v3da->base, v3da->flag);
- BLI_remlink(&v3d->afterdraw, v3da);
- MEM_freeN(v3da);
- }
+ draw_object(scene, ar, v3d, v3da->base, v3da->flag);
+ BLI_remlink(&v3d->afterdraw_transp, v3da);
+ MEM_freeN(v3da);
}
v3d->transp= FALSE;
@@ -1461,6 +1451,48 @@ static void view3d_draw_transp(Scene *scene, ARegion *ar, View3D *v3d)
}
+/* clears zbuffer and draws it over */
+static void view3d_draw_xray(Scene *scene, ARegion *ar, View3D *v3d, int clear)
+{
+ View3DAfter *v3da, *next;
+
+ if(clear && v3d->zbuf)
+ glClear(GL_DEPTH_BUFFER_BIT);
+
+ v3d->xray= TRUE;
+ for(v3da= v3d->afterdraw_xray.first; v3da; v3da= next) {
+ next= v3da->next;
+ draw_object(scene, ar, v3d, v3da->base, v3da->flag);
+ BLI_remlink(&v3d->afterdraw_xray, v3da);
+ MEM_freeN(v3da);
+ }
+ v3d->xray= FALSE;
+}
+
+
+/* clears zbuffer and draws it over */
+static void view3d_draw_xraytransp(Scene *scene, ARegion *ar, View3D *v3d, int clear)
+{
+ View3DAfter *v3da, *next;
+
+ if(clear && v3d->zbuf)
+ glClear(GL_DEPTH_BUFFER_BIT);
+
+ v3d->xray= TRUE;
+ v3d->transp= TRUE;
+
+ for(v3da= v3d->afterdraw_xraytransp.first; v3da; v3da= next) {
+ next= v3da->next;
+ draw_object(scene, ar, v3d, v3da->base, v3da->flag);
+ BLI_remlink(&v3d->afterdraw_xraytransp, v3da);
+ MEM_freeN(v3da);
+ }
+
+ v3d->transp= FALSE;
+ v3d->xray= FALSE;
+
+}
+
/* *********************** */
/*
@@ -1653,7 +1685,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, v3d, ar, 1);
v3d->zbuf= zbuf;
@@ -1721,37 +1753,61 @@ void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (* func)(void *))
}
/* this isnt that nice, draw xray objects as if they are normal */
- if (v3d->afterdraw.first) {
+ if ( v3d->afterdraw_transp.first ||
+ v3d->afterdraw_xray.first ||
+ v3d->afterdraw_xraytransp.first
+ ) {
View3DAfter *v3da, *next;
- int num = 0;
+ int mask_orig;
+
v3d->xray= TRUE;
- glDepthFunc(GL_ALWAYS); /* always write into the depth bufer, overwriting front z values */
- for(v3da= v3d->afterdraw.first; v3da; v3da= next) {
- next= v3da->next;
- if(v3da->type==V3D_XRAY) {
+ /* transp materials can change the depth mask, see #21388 */
+ glGetIntegerv(GL_DEPTH_WRITEMASK, &mask_orig);
+
+
+ if(v3d->afterdraw_xray.first || v3d->afterdraw_xraytransp.first) {
+ glDepthFunc(GL_ALWAYS); /* always write into the depth bufer, overwriting front z values */
+ for(v3da= v3d->afterdraw_xray.first; v3da; v3da= next) {
+ next= v3da->next;
draw_object(scene, ar, v3d, v3da->base, 0);
- num++;
}
- /* dont remove this time */
+ glDepthFunc(GL_LEQUAL); /* Now write the depth buffer normally */
}
+
+ /* draw 3 passes, transp/xray/xraytransp */
v3d->xray= FALSE;
-
- glDepthFunc(GL_LEQUAL); /* Now write the depth buffer normally */
- for(v3da= v3d->afterdraw.first; v3da; v3da= next) {
+ v3d->transp= TRUE;
+ for(v3da= v3d->afterdraw_transp.first; v3da; v3da= next) {
next= v3da->next;
- if(v3da->type==V3D_XRAY) {
- v3d->xray= TRUE; v3d->transp= FALSE;
- } else if (v3da->type==V3D_TRANSP) {
- v3d->xray= FALSE; v3d->transp= TRUE;
- }
-
- draw_object(scene, ar, v3d, v3da->base, 0); /* Draw Xray or Transp objects normally */
- BLI_remlink(&v3d->afterdraw, v3da);
+ draw_object(scene, ar, v3d, v3da->base, 0);
+ BLI_remlink(&v3d->afterdraw_transp, v3da);
MEM_freeN(v3da);
}
+
+ v3d->xray= TRUE;
+ v3d->transp= FALSE;
+ for(v3da= v3d->afterdraw_xray.first; v3da; v3da= next) {
+ next= v3da->next;
+ draw_object(scene, ar, v3d, v3da->base, 0);
+ BLI_remlink(&v3d->afterdraw_xray, v3da);
+ MEM_freeN(v3da);
+ }
+
+ v3d->xray= TRUE;
+ v3d->transp= TRUE;
+ for(v3da= v3d->afterdraw_xraytransp.first; v3da; v3da= next) {
+ next= v3da->next;
+ draw_object(scene, ar, v3d, v3da->base, 0);
+ BLI_remlink(&v3d->afterdraw_xraytransp, v3da);
+ MEM_freeN(v3da);
+ }
+
+
v3d->xray= FALSE;
v3d->transp= FALSE;
+
+ glDepthMask(mask_orig);
}
if(rv3d->rflag & RV3D_CLIPPING)
@@ -1779,7 +1835,7 @@ static void gpu_render_lamp_update(Scene *scene, View3D *v3d, Object *ob, Object
lamp = GPU_lamp_from_blender(scene, ob, par);
if(lamp) {
- GPU_lamp_update(lamp, ob->lay, obmat);
+ GPU_lamp_update(lamp, ob->lay, (ob->restrictflag & OB_RESTRICT_RENDER), obmat);
GPU_lamp_update_colors(lamp, la->r, la->g, la->b, la->energy);
if((ob->lay & v3d->lay) && GPU_lamp_has_shadow_buffer(lamp)) {
@@ -1797,6 +1853,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;
@@ -1824,23 +1882,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);
@@ -1911,9 +1982,9 @@ static void view3d_main_area_setup_view(Scene *scene, View3D *v3d, ARegion *ar,
{
float len1, len2, vec[3];
- VECCOPY(vec, rv3d->persinv[0]);
+ copy_v3_v3(vec, rv3d->persinv[0]);
len1= normalize_v3(vec);
- VECCOPY(vec, rv3d->persinv[1]);
+ copy_v3_v3(vec, rv3d->persinv[1]);
len2= normalize_v3(vec);
rv3d->pixsize= 2.0f*(len1>len2?len1:len2);
@@ -1934,28 +2005,42 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx,
{
Scene *sce;
Base *base;
+ float backcol[3];
int bwinx, bwiny;
+ rcti brect;
glPushMatrix();
/* set temporary new size */
bwinx= ar->winx;
bwiny= ar->winy;
+ brect= ar->winrct;
+
ar->winx= winx;
- ar->winy= winy;
-
+ ar->winy= winy;
+ ar->winrct.xmin= 0;
+ ar->winrct.ymin= 0;
+ ar->winrct.xmax= winx;
+ ar->winrct.ymax= 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);
+ if(scene->r.color_mgt_flag & R_COLOR_MANAGEMENT)
+ linearrgb_to_srgb_v3_v3(backcol, &scene->world->horr);
+ else
+ copy_v3_v3(backcol, &scene->world->horr);
+ glClearColor(backcol[0], backcol[1], backcol[2], 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);
@@ -1996,8 +2081,9 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx,
}
/* 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!
+ if(v3d->afterdraw_transp.first) view3d_draw_transp(scene, ar, v3d);
+ if(v3d->afterdraw_xray.first) view3d_draw_xray(scene, ar, v3d, 1); // clears zbuffer if it is used!
+ if(v3d->afterdraw_xraytransp.first) view3d_draw_xraytransp(scene, ar, v3d, 1);
/* cleanup */
if(v3d->zbuf) {
@@ -2006,26 +2092,30 @@ 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, v3d, 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, v3d, 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;
+ ar->winrct = brect;
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)
+ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, int sizex, int sizey, unsigned int flag)
{
RegionView3D *rv3d= ar->regiondata;
ImBuf *ibuf;
@@ -2053,9 +2143,13 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, in
}
/* 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);
+ ibuf= IMB_allocImBuf(sizex, sizey, 32, flag, 0);
+ if(ibuf->rect_float)
+ glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_FLOAT, ibuf->rect_float);
+ else if(ibuf->rect)
+ 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);
@@ -2063,11 +2157,14 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, in
GPU_offscreen_unbind(ofs);
GPU_offscreen_free(ofs);
+ if(ibuf->rect_float && ibuf->rect)
+ IMB_rect_from_float(ibuf);
+
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)
+ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, int width, int height, unsigned int flag, int drawtype)
{
View3D v3d;
ARegion ar;
@@ -2102,7 +2199,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, int width, int height
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);
+ return ED_view3d_draw_offscreen_imbuf(scene, &v3d, &ar, width, height, flag);
// seq_view3d_cb(scene, cfra, render_size, seqrectx, seqrecty);
}
@@ -2145,15 +2242,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);
@@ -2167,7 +2264,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
Scene *sce;
Base *base;
Object *ob;
- float col[3];
+ float backcol[3];
int retopo= 0, sculptparticle= 0;
Object *obact = OBACT;
char *grid_unit= NULL;
@@ -2186,8 +2283,16 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
}
/* clear background */
- UI_GetThemeColor3fv(TH_BACK, col);
- glClearColor(col[0], col[1], col[2], 0.0);
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE) && scene->world) {
+ if(scene->r.color_mgt_flag & R_COLOR_MANAGEMENT)
+ linearrgb_to_srgb_v3_v3(backcol, &scene->world->horr);
+ else
+ copy_v3_v3(backcol, &scene->world->horr);
+ glClearColor(backcol[0], backcol[1], backcol[2], 0.0);
+ }
+ else
+ UI_ThemeClearColor(TH_BACK);
+
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
/* setup view matrices */
@@ -2303,8 +2408,9 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
// REEB_draw();
/* 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!
+ if(v3d->afterdraw_transp.first) view3d_draw_transp(scene, ar, v3d);
+ if(v3d->afterdraw_xray.first) view3d_draw_xray(scene, ar, v3d, 1); // clears zbuffer if it is used!
+ if(v3d->afterdraw_xraytransp.first) view3d_draw_xraytransp(scene, ar, v3d, 1);
ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_VIEW);
@@ -2329,7 +2435,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
/* draw grease-pencil stuff (3d-space strokes) */
//if (v3d->flag2 & V3D_DISPGP)
- draw_gpencil_3dview((bContext *)C, 1);
+ draw_gpencil_view3d((bContext *)C, 1);
BDR_drawSketch(C);
}
@@ -2348,7 +2454,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *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_3dview((bContext *)C, 0);
+ draw_gpencil_view3d((bContext *)C, 0);
drawcursor(scene, ar, v3d);
}
@@ -2372,8 +2478,6 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
ob= OBACT;
if(U.uiflag & USER_DRAWVIEWINFO)
draw_selected_name(scene, ob, v3d);
-
- ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_PIXEL);
/* XXX here was the blockhandlers for floating panels */
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index 101667719fa..132f43ff327 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -41,16 +41,11 @@
#include "BLI_math.h"
#include "BLI_rand.h"
-#include "BKE_action.h"
#include "BKE_context.h"
-#include "BKE_depsgraph.h"
#include "BKE_object.h"
-#include "BKE_global.h"
#include "BKE_paint.h"
#include "BKE_report.h"
#include "BKE_scene.h"
-#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "BIF_gl.h"
@@ -206,7 +201,7 @@ void view3d_boxview_copy(ScrArea *sa, ARegion *ar)
if(rv3dtest->viewlock) {
rv3dtest->dist= rv3d->dist;
- VECCOPY(rv3dtest->ofs, rv3d->ofs);
+ copy_v3_v3(rv3dtest->ofs, rv3d->ofs);
ED_region_tag_redraw(artest);
}
}
@@ -310,14 +305,14 @@ static void viewops_data_create(bContext *C, wmOperator *op, wmEvent *event)
vod->ar= CTX_wm_region(C);
vod->rv3d= rv3d= vod->ar->regiondata;
vod->dist0= rv3d->dist;
- QUATCOPY(vod->oldquat, rv3d->viewquat);
+ copy_qt_qt(vod->oldquat, rv3d->viewquat);
vod->origx= vod->oldx= event->x;
vod->origy= vod->oldy= event->y;
vod->origkey= event->type; /* the key that triggered the operator. */
vod->use_dyn_ofs= (U.uiflag & USER_ORBIT_SELECTION) ? 1:0;
if (vod->use_dyn_ofs) {
- VECCOPY(vod->ofs, rv3d->ofs);
+ copy_v3_v3(vod->ofs, rv3d->ofs);
/* If there's no selection, lastofs is unmodified and last value since static */
calculateTransformCenter(C, V3D_CENTROID, lastofs);
negate_v3_v3(vod->dyn_ofs, lastofs);
@@ -336,8 +331,7 @@ static void viewops_data_create(bContext *C, wmOperator *op, wmEvent *event)
float mat[3][3];
float upvec[3];
- VECCOPY(my_origin, rv3d->ofs);
- negate_v3(my_origin); /* ofs is flipped */
+ negate_v3_v3(my_origin, rv3d->ofs); /* ofs is flipped */
/* Set the dist value to be the distance from this 3d point */
/* this means youll always be able to zoom into it and panning wont go bad when dist was zero */
@@ -358,7 +352,7 @@ static void viewops_data_create(bContext *C, wmOperator *op, wmEvent *event)
negate_v3_v3(rv3d->ofs, dvec);
}
negate_v3(vod->dyn_ofs);
- VECCOPY(vod->ofs, rv3d->ofs);
+ copy_v3_v3(vod->ofs, rv3d->ofs);
} else {
vod->ofs[0] = vod->ofs[1] = vod->ofs[2] = 0.0f;
}
@@ -403,49 +397,49 @@ static const float thres = 0.93f; //cos(20 deg);
#define COS45 0.70710678118654746
#define SIN45 COS45
-static float snapquats[39][6] = {
- /*{q0, q1, q3, q4, view, oposite_direction}*/
-{COS45, -SIN45, 0.0, 0.0, RV3D_VIEW_FRONT, 0}, //front
-{0.0, 0.0, -SIN45, -SIN45, RV3D_VIEW_BACK, 0}, //back
-{1.0, 0.0, 0.0, 0.0, RV3D_VIEW_TOP, 0}, //top
-{0.0, -1.0, 0.0, 0.0, RV3D_VIEW_BOTTOM, 0}, //bottom
-{0.5, -0.5, -0.5, -0.5, RV3D_VIEW_LEFT, 0}, //left
-{0.5, -0.5, 0.5, 0.5, RV3D_VIEW_RIGHT, 0}, //right
+static float snapquats[39][5] = {
+ /*{q0, q1, q3, q4, view}*/
+ {COS45, -SIN45, 0.0, 0.0, RV3D_VIEW_FRONT}, //front
+ {0.0, 0.0, -SIN45, -SIN45, RV3D_VIEW_BACK}, //back
+ {1.0, 0.0, 0.0, 0.0, RV3D_VIEW_TOP}, //top
+ {0.0, -1.0, 0.0, 0.0, RV3D_VIEW_BOTTOM}, //bottom
+ {0.5, -0.5, -0.5, -0.5, RV3D_VIEW_RIGHT}, //left
+ {0.5, -0.5, 0.5, 0.5, RV3D_VIEW_LEFT}, //right
/* some more 45 deg snaps */
-{0.65328145027160645, -0.65328145027160645, 0.27059805393218994, 0.27059805393218994, 0, 0},
-{0.92387950420379639, 0.0, 0.0, 0.38268342614173889, 0, 0},
-{0.0, -0.92387950420379639, 0.38268342614173889, 0.0, 0, 0},
-{0.35355335474014282, -0.85355335474014282, 0.35355338454246521, 0.14644660055637360, 0, 0},
-{0.85355335474014282, -0.35355335474014282, 0.14644660055637360, 0.35355338454246521, 0, 0},
-{0.49999994039535522, -0.49999994039535522, 0.49999997019767761, 0.49999997019767761, 0, 0},
-{0.27059802412986755, -0.65328145027160645, 0.65328145027160645, 0.27059802412986755, 0, 0},
-{0.65328145027160645, -0.27059802412986755, 0.27059802412986755, 0.65328145027160645, 0, 0},
-{0.27059799432754517, -0.27059799432754517, 0.65328139066696167, 0.65328139066696167, 0, 0},
-{0.38268336653709412, 0.0, 0.0, 0.92387944459915161, 0, 0},
-{0.0, -0.38268336653709412, 0.92387944459915161, 0.0, 0, 0},
-{0.14644658565521240, -0.35355335474014282, 0.85355335474014282, 0.35355335474014282, 0, 0},
-{0.35355335474014282, -0.14644658565521240, 0.35355335474014282, 0.85355335474014282, 0, 0},
-{0.0, 0.0, 0.92387944459915161, 0.38268336653709412, 0, 0},
-{-0.0, 0.0, 0.38268336653709412, 0.92387944459915161, 0, 0},
-{-0.27059802412986755, 0.27059802412986755, 0.65328133106231689, 0.65328133106231689, 0, 0},
-{-0.38268339633941650, 0.0, 0.0, 0.92387938499450684, 0, 0},
-{0.0, 0.38268339633941650, 0.92387938499450684, 0.0, 0, 0},
-{-0.14644658565521240, 0.35355338454246521, 0.85355329513549805, 0.35355332493782043, 0, 0},
-{-0.35355338454246521, 0.14644658565521240, 0.35355332493782043, 0.85355329513549805, 0, 0},
-{-0.49999991059303284, 0.49999991059303284, 0.49999985098838806, 0.49999985098838806, 0, 0},
-{-0.27059799432754517, 0.65328145027160645, 0.65328139066696167, 0.27059799432754517, 0, 0},
-{-0.65328145027160645, 0.27059799432754517, 0.27059799432754517, 0.65328139066696167, 0, 0},
-{-0.65328133106231689, 0.65328133106231689, 0.27059793472290039, 0.27059793472290039, 0, 0},
-{-0.92387932538986206, 0.0, 0.0, 0.38268333673477173, 0, 0},
-{0.0, 0.92387932538986206, 0.38268333673477173, 0.0, 0, 0},
-{-0.35355329513549805, 0.85355329513549805, 0.35355329513549805, 0.14644657075405121, 0, 0},
-{-0.85355329513549805, 0.35355329513549805, 0.14644657075405121, 0.35355329513549805, 0, 0},
-{-0.38268330693244934, 0.92387938499450684, 0.0, 0.0, 0, 0},
-{-0.92387938499450684, 0.38268330693244934, 0.0, 0.0, 0, 0},
-{-COS45, 0.0, 0.0, SIN45, 0, 0},
-{COS45, 0.0, 0.0, SIN45, 0, 0},
-{0.0, 0.0, 0.0, 1.0, 0, 0}
+ {0.65328145027160645, -0.65328145027160645, 0.27059805393218994, 0.27059805393218994, 0},
+ {0.92387950420379639, 0.0, 0.0, 0.38268342614173889, 0},
+ {0.0, -0.92387950420379639, 0.38268342614173889, 0.0, 0},
+ {0.35355335474014282, -0.85355335474014282, 0.35355338454246521, 0.14644660055637360, 0},
+ {0.85355335474014282, -0.35355335474014282, 0.14644660055637360, 0.35355338454246521, 0},
+ {0.49999994039535522, -0.49999994039535522, 0.49999997019767761, 0.49999997019767761, 0},
+ {0.27059802412986755, -0.65328145027160645, 0.65328145027160645, 0.27059802412986755, 0},
+ {0.65328145027160645, -0.27059802412986755, 0.27059802412986755, 0.65328145027160645, 0},
+ {0.27059799432754517, -0.27059799432754517, 0.65328139066696167, 0.65328139066696167, 0},
+ {0.38268336653709412, 0.0, 0.0, 0.92387944459915161, 0},
+ {0.0, -0.38268336653709412, 0.92387944459915161, 0.0, 0},
+ {0.14644658565521240, -0.35355335474014282, 0.85355335474014282, 0.35355335474014282, 0},
+ {0.35355335474014282, -0.14644658565521240, 0.35355335474014282, 0.85355335474014282, 0},
+ {0.0, 0.0, 0.92387944459915161, 0.38268336653709412, 0},
+ {-0.0, 0.0, 0.38268336653709412, 0.92387944459915161, 0},
+ {-0.27059802412986755, 0.27059802412986755, 0.65328133106231689, 0.65328133106231689, 0},
+ {-0.38268339633941650, 0.0, 0.0, 0.92387938499450684, 0},
+ {0.0, 0.38268339633941650, 0.92387938499450684, 0.0, 0},
+ {-0.14644658565521240, 0.35355338454246521, 0.85355329513549805, 0.35355332493782043, 0},
+ {-0.35355338454246521, 0.14644658565521240, 0.35355332493782043, 0.85355329513549805, 0},
+ {-0.49999991059303284, 0.49999991059303284, 0.49999985098838806, 0.49999985098838806, 0},
+ {-0.27059799432754517, 0.65328145027160645, 0.65328139066696167, 0.27059799432754517, 0},
+ {-0.65328145027160645, 0.27059799432754517, 0.27059799432754517, 0.65328139066696167, 0},
+ {-0.65328133106231689, 0.65328133106231689, 0.27059793472290039, 0.27059793472290039, 0},
+ {-0.92387932538986206, 0.0, 0.0, 0.38268333673477173, 0},
+ {0.0, 0.92387932538986206, 0.38268333673477173, 0.0, 0},
+ {-0.35355329513549805, 0.85355329513549805, 0.35355329513549805, 0.14644657075405121, 0},
+ {-0.85355329513549805, 0.35355329513549805, 0.14644657075405121, 0.35355329513549805, 0},
+ {-0.38268330693244934, 0.92387938499450684, 0.0, 0.0, 0},
+ {-0.92387938499450684, 0.38268330693244934, 0.0, 0.0, 0},
+ {-COS45, 0.0, 0.0, SIN45, 0},
+ {COS45, 0.0, 0.0, SIN45, 0},
+ {0.0, 0.0, 0.0, 1.0, 0}
};
enum {
@@ -490,9 +484,11 @@ void viewrotate_modal_keymap(wmKeyConfig *keyconf)
WM_modalkeymap_add_item(keymap, LEFTALTKEY, KM_PRESS, KM_ANY, 0, VIEWROT_MODAL_AXIS_SNAP_ENABLE);
WM_modalkeymap_add_item(keymap, LEFTALTKEY, KM_RELEASE, KM_ANY, 0, VIEWROT_MODAL_AXIS_SNAP_DISABLE);
+ /* disabled mode switching for now, can re-implement better, later on
WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, KM_ANY, 0, VIEWROT_MODAL_SWITCH_ZOOM);
WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_PRESS, KM_ANY, 0, VIEWROT_MODAL_SWITCH_ZOOM);
WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_PRESS, KM_ANY, 0, VIEWROT_MODAL_SWITCH_MOVE);
+ */
/* assign map to operators */
WM_modalkeymap_assign(keymap, "VIEW3D_OT_rotate");
@@ -536,15 +532,15 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
if (vod->use_dyn_ofs) {
/* compute the post multiplication quat, to rotate the offset correctly */
- QUATCOPY(q1, vod->oldquat);
+ copy_qt_qt(q1, vod->oldquat);
conjugate_qt(q1);
mul_qt_qtqt(q1, q1, rv3d->viewquat);
conjugate_qt(q1); /* conj == inv for unit quat */
- VECCOPY(rv3d->ofs, vod->ofs);
- sub_v3_v3v3(rv3d->ofs, rv3d->ofs, vod->dyn_ofs);
+ copy_v3_v3(rv3d->ofs, vod->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 {
@@ -575,9 +571,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 */
@@ -589,32 +585,75 @@ 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);
}
}
/* check for view snap */
if (vod->axis_snap){
int i;
- float viewmat[3][3];
+ float viewquat_inv[4];
+ float zaxis[3]={0,0,1};
+ invert_qt_qt(viewquat_inv, rv3d->viewquat);
-
- quat_to_mat3( viewmat,rv3d->viewquat);
+ mul_qt_v3(viewquat_inv, zaxis);
for (i = 0 ; i < 39; i++){
- float snapmat[3][3];
+
float view = (int)snapquats[i][4];
+ float viewquat_inv_test[4];
+ float zaxis_test[3]={0,0,1};
- quat_to_mat3( snapmat,snapquats[i]);
+ invert_qt_qt(viewquat_inv_test, snapquats[i]);
+ mul_qt_v3(viewquat_inv_test, zaxis_test);
+
+ if(angle_v3v3(zaxis_test, zaxis) < DEG2RAD(45/3)) {
+ /* find the best roll */
+ float quat_roll[4], quat_final[4], quat_best[4];
+ float viewquat_align[4]; /* viewquat aligned to zaxis_test */
+ float viewquat_align_inv[4]; /* viewquat aligned to zaxis_test */
+ float best_angle = FLT_MAX;
+ int j;
+
+ /* viewquat_align is the original viewquat aligned to the snapped axis
+ * for testing roll */
+ rotation_between_vecs_to_quat(viewquat_align, zaxis_test, zaxis);
+ normalize_qt(viewquat_align);
+ mul_qt_qtqt(viewquat_align, rv3d->viewquat, viewquat_align);
+ normalize_qt(viewquat_align);
+ invert_qt_qt(viewquat_align_inv, viewquat_align);
+
+ /* find best roll */
+ for(j= 0; j<8; j++) {
+ float angle;
+ float xaxis1[3]={1,0,0};
+ float xaxis2[3]={1,0,0};
+ float quat_final_inv[4];
+
+ axis_angle_to_quat(quat_roll, zaxis_test, j * DEG2RAD(45.0));
+ normalize_qt(quat_roll);
+
+ mul_qt_qtqt(quat_final, snapquats[i], quat_roll);
+ normalize_qt(quat_final);
+
+ /* compare 2 vector angles to find the least roll */
+ invert_qt_qt(quat_final_inv, quat_final);
+ mul_qt_v3(viewquat_align_inv, xaxis1);
+ mul_qt_v3(quat_final_inv, xaxis2);
+ angle= angle_v3v3(xaxis1, xaxis2);
+
+ if(angle <= best_angle) {
+ best_angle= angle;
+ copy_qt_qt(quat_best, quat_final);
+ if(j) view= 0; /* view grid assumes certain up axis */
+ }
+ }
+
+ copy_qt_qt(rv3d->viewquat, quat_best);
+ rv3d->view= view; /* if we snap to a rolled camera the grid is invalid */
- if ((dot_v3v3(snapmat[0], viewmat[0]) > thres) &&
- (dot_v3v3(snapmat[1], viewmat[1]) > thres) &&
- (dot_v3v3(snapmat[2], viewmat[2]) > thres)
- ) {
- copy_qt_qt(rv3d->viewquat, snapquats[i]);
- rv3d->view= view;
break;
}
}
@@ -691,8 +730,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);
}
@@ -721,7 +767,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;
@@ -747,7 +805,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;
@@ -763,6 +821,9 @@ void viewmove_modal_keymap(wmKeyConfig *keyconf)
{
static EnumPropertyItem modal_items[] = {
{VIEW_MODAL_CONFIRM, "CONFIRM", 0, "Confirm", ""},
+
+ {VIEWROT_MODAL_SWITCH_ZOOM, "SWITCH_TO_ZOOM", 0, "Switch to Zoom"},
+ {VIEWROT_MODAL_SWITCH_ROTATE, "SWITCH_TO_ROTATE", 0, "Switch to Rotate"},
{0, NULL, 0, NULL, NULL}};
@@ -777,9 +838,11 @@ void viewmove_modal_keymap(wmKeyConfig *keyconf)
WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, KM_ANY, 0, VIEW_MODAL_CONFIRM);
WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, VIEW_MODAL_CONFIRM);
+ /* disabled mode switching for now, can re-implement better, later on
WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, KM_ANY, 0, VIEWROT_MODAL_SWITCH_ZOOM);
WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_PRESS, KM_ANY, 0, VIEWROT_MODAL_SWITCH_ZOOM);
WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_RELEASE, KM_ANY, 0, VIEWROT_MODAL_SWITCH_ROTATE);
+ */
/* assign map to operators */
WM_modalkeymap_assign(keymap, "VIEW3D_OT_move");
@@ -801,7 +864,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);
@@ -903,6 +966,9 @@ void viewzoom_modal_keymap(wmKeyConfig *keyconf)
{
static EnumPropertyItem modal_items[] = {
{VIEW_MODAL_CONFIRM, "CONFIRM", 0, "Confirm", ""},
+
+ {VIEWROT_MODAL_SWITCH_ROTATE, "SWITCH_TO_ROTATE", 0, "Switch to Rotate"},
+ {VIEWROT_MODAL_SWITCH_MOVE, "SWITCH_TO_MOVE", 0, "Switch to Move"},
{0, NULL, 0, NULL, NULL}};
@@ -917,9 +983,11 @@ void viewzoom_modal_keymap(wmKeyConfig *keyconf)
WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, KM_ANY, 0, VIEW_MODAL_CONFIRM);
WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, VIEW_MODAL_CONFIRM);
+ /* disabled mode switching for now, can re-implement better, later on
WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, KM_ANY, 0, VIEWROT_MODAL_SWITCH_ROTATE);
WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_RELEASE, KM_ANY, 0, VIEWROT_MODAL_SWITCH_ROTATE);
WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_PRESS, KM_ANY, 0, VIEWROT_MODAL_SWITCH_MOVE);
+ */
/* assign map to operators */
WM_modalkeymap_assign(keymap, "VIEW3D_OT_zoom");
@@ -956,7 +1024,7 @@ static void view_zoom_mouseloc(ARegion *ar, float dfac, int mx, int my)
/* Offset to target position and dolly */
new_dist = rv3d->dist * dfac;
- VECCOPY(rv3d->ofs, tvec);
+ copy_v3_v3(rv3d->ofs, tvec);
rv3d->dist = new_dist;
/* Calculate final offset */
@@ -1022,7 +1090,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;
@@ -1104,7 +1172,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);
@@ -1157,8 +1225,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));
@@ -1235,7 +1303,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]);
@@ -1277,6 +1355,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 */
@@ -1286,7 +1376,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;
@@ -1294,6 +1384,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);
@@ -1341,11 +1432,9 @@ static int viewselected_exec(bContext *C, wmOperator *op) /* like a localview wi
if(pchan->bone->layer & arm->layer) {
bPoseChannel *pchan_tx= pchan->custom_tx ? pchan->custom_tx : pchan;
ok= 1;
- VECCOPY(vec, pchan_tx->pose_head);
- mul_m4_v3(ob->obmat, vec);
+ mul_v3_m4v3(vec, ob->obmat, pchan_tx->pose_head);
DO_MINMAX(vec, min, max);
- VECCOPY(vec, pchan_tx->pose_tail);
- mul_m4_v3(ob->obmat, vec);
+ mul_v3_m4v3(vec, ob->obmat, pchan_tx->pose_tail);
DO_MINMAX(vec, min, max);
}
}
@@ -1443,16 +1532,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));
@@ -1476,12 +1559,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;
@@ -1493,11 +1603,8 @@ static int render_border_exec(bContext *C, wmOperator *op)
rect.xmax= RNA_int_get(op->ptr, "xmax");
rect.ymax= RNA_int_get(op->ptr, "ymax");
- if (!ar || ar->regiontype != RGN_TYPE_WINDOW)
- return OPERATOR_CANCELLED;
-
/* calculate range */
- calc_viewborder(scene, ar, v3d, &vb);
+ view3d_calc_camera_border(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);
@@ -1528,15 +1635,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 */
@@ -1545,11 +1643,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;
@@ -1677,7 +1775,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 */
@@ -1867,11 +1965,12 @@ static int viewnumpad_exec(bContext *C, wmOperator *op)
/* lastview - */
if(rv3d->persp != RV3D_CAMOB) {
+ Object *ob= OBACT;
if (!rv3d->smooth_timer) {
/* store settings of current view before allowing overwriting with camera view
* only if we're not currently in a view transition */
- QUATCOPY(rv3d->lviewquat, rv3d->viewquat);
+ copy_qt_qt(rv3d->lviewquat, rv3d->viewquat);
rv3d->lview= rv3d->view;
rv3d->lpersp= rv3d->persp;
}
@@ -1884,19 +1983,35 @@ static int viewnumpad_exec(bContext *C, wmOperator *op)
handle_view3d_lock();
}
#endif
-
- if(BASACT) {
- /* check both G.vd as G.scene cameras */
- if((v3d->camera==NULL || scene->camera==NULL) && OBACT->type==OB_CAMERA) {
- v3d->camera= OBACT;
- /*handle_view3d_lock();*/
+
+ /* first get the default camera for the view lock type */
+ if(v3d->scenelock) {
+ /* sets the camera view if available */
+ v3d->camera= scene->camera;
+ }
+ else {
+ /* use scene camera if one is not set (even though we're unlocked) */
+ if(v3d->camera==NULL) {
+ v3d->camera= scene->camera;
}
}
- if(v3d->camera==NULL) {
- v3d->camera= scene_find_camera(scene);
- /*handle_view3d_lock();*/
- }
+ /* if the camera isnt found, check a number of options */
+ if(v3d->camera==NULL && ob && ob->type==OB_CAMERA)
+ v3d->camera= ob;
+
+ if(v3d->camera==NULL)
+ v3d->camera= scene_find_camera(scene);
+
+ /* couldnt find any useful camera, bail out */
+ if(v3d->camera==NULL)
+ return OPERATOR_CANCELLED;
+
+ /* important these dont get out of sync for locked scenes */
+ if(v3d->scenelock)
+ scene->camera= v3d->camera;
+
+ /* finally do snazzy view zooming */
rv3d->persp= RV3D_CAMOB;
smooth_view(C, NULL, v3d->camera, rv3d->ofs, rv3d->viewquat, &rv3d->dist, &v3d->lens);
@@ -1967,7 +2082,7 @@ static int vieworbit_exec(bContext *C, wmOperator *op)
}
else if(orbitdir == V3D_VIEW_STEPDOWN || orbitdir == V3D_VIEW_STEPUP) {
/* horizontal axis */
- VECCOPY(q1+1, rv3d->viewinv[0]);
+ copy_v3_v3(q1+1, rv3d->viewinv[0]);
normalize_v3(q1+1);
phi= (float)(M_PI/360.0)*U.pad_rot_angle;
@@ -1994,7 +2109,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;
@@ -2276,17 +2391,26 @@ static int set_3dcursor_invoke(bContext *C, wmOperator *op, wmEvent *event)
float dx, dy, fz, *fp = NULL, dvec[3], oldcurs[3];
short mx, my, mval[2];
// short ctrl= 0; // XXX
-
+ int flip;
fp= give_cursor(scene, v3d);
// if(obedit && ctrl) lr_click= 1;
- VECCOPY(oldcurs, fp);
+ copy_v3_v3(oldcurs, fp);
mx= event->x - ar->winrct.xmin;
my= event->y - ar->winrct.ymin;
+
project_short_noclip(ar, fp, mval);
+ flip= initgrabz(rv3d, fp[0], fp[1], fp[2]);
+
+ /* reset the depth based on the view offset */
+ if(flip) {
+ negate_v3_v3(fp, rv3d->ofs);
- initgrabz(rv3d, fp[0], fp[1], fp[2]);
+ /* re initialize */
+ project_short_noclip(ar, fp, mval);
+ flip= initgrabz(rv3d, fp[0], fp[1], fp[2]);
+ }
if(mval[0]!=IS_CLIPPED) {
short depth_used = 0;
@@ -2300,7 +2424,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 {
@@ -2708,7 +2832,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;
}
@@ -2750,7 +2874,7 @@ 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);
/*----------------------------------------------------
@@ -2811,7 +2935,7 @@ 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);
}
/*----------------------------------------------------
@@ -2822,7 +2946,7 @@ void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int mode)
/*----------------------------------------------------
* record how much time has passed. clamp at 10 Hz
- * pretend the previous frame occured at the clamped time
+ * pretend the previous frame occurred at the clamped time
*/
// now = PIL_check_seconds_timer();
// frametime = (now - prevTime);
@@ -2865,7 +2989,7 @@ void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int mode)
obofs[2] = -ob->obmat[3][2];
}
else {
- VECCOPY(obofs, rv3d->ofs);
+ copy_v3_v3(obofs, rv3d->ofs);
}
/* calc an adjustment based on distance from camera
@@ -2889,7 +3013,7 @@ void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int mode)
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);
+ add_v3_v3(rv3d->ofs, dvec);
/*----------------------------------------------------
* ndof device dolly
@@ -2931,9 +3055,9 @@ void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int mode)
if (use_sel) {
conjugate_qt(q1); /* conj == inv for unit quat */
- sub_v3_v3v3(rv3d->ofs, rv3d->ofs, obofs);
+ sub_v3_v3(rv3d->ofs, obofs);
mul_qt_v3(q1, rv3d->ofs);
- add_v3_v3v3(rv3d->ofs, rv3d->ofs, obofs);
+ add_v3_v3(rv3d->ofs, obofs);
}
/* Perform the orbital rotation */
@@ -2956,9 +3080,9 @@ void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int mode)
if (use_sel) {
conjugate_qt(q1);
- sub_v3_v3v3(rv3d->ofs, rv3d->ofs, obofs);
+ sub_v3_v3(rv3d->ofs, obofs);
mul_qt_v3(q1, rv3d->ofs);
- add_v3_v3v3(rv3d->ofs, rv3d->ofs, obofs);
+ add_v3_v3(rv3d->ofs, obofs);
}
/*----------------------------------------------------
diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c
index e76546c6080..d7ab8034286 100644
--- a/source/blender/editors/space_view3d/view3d_header.c
+++ b/source/blender/editors/space_view3d/view3d_header.c
@@ -31,28 +31,20 @@
#include <stdlib.h>
#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
#include "RNA_access.h"
#include "MEM_guardedalloc.h"
-#include "BKE_action.h"
-#include "BKE_brush.h"
#include "BKE_context.h"
-#include "BKE_curve.h"
#include "BKE_depsgraph.h"
-#include "BKE_displist.h"
#include "BKE_effect.h"
-#include "BKE_global.h"
-#include "BKE_image.h"
-#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_paint.h"
-#include "BKE_particle.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h" /* for VECCOPY */
#include "ED_mesh.h"
#include "ED_util.h"
@@ -66,8 +58,6 @@
#include "RNA_define.h"
#include "RNA_enum_types.h"
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
#include "BLI_math.h"
#include "BLI_blenlib.h"
@@ -137,11 +127,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);
@@ -151,6 +142,7 @@ static void handle_view3d_lock(bContext *C)
static int layers_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
ScrArea *sa= CTX_wm_area(C);
View3D *v3d= sa->spacedata.first;
@@ -212,7 +204,7 @@ static int layers_exec(bContext *C, wmOperator *op)
if(v3d->scenelock) handle_view3d_lock(C);
/* new layers might need unflushed events events */
- DAG_scene_update_flags(scene, v3d->lay); /* tags all that moves and flushes */
+ DAG_scene_update_flags(bmain, scene, v3d->lay); /* tags all that moves and flushes */
ED_area_tag_redraw(sa);
@@ -367,8 +359,9 @@ static void do_view3d_header_buttons(bContext *C, void *arg, int event)
case B_SEL_FACE:
if(em) {
if( shift==0 || em->selectmode==0){
- if( ((ts->selectmode ^ SCE_SELECT_FACE) == SCE_SELECT_VERTEX) || ((ts->selectmode ^ SCE_SELECT_FACE) == SCE_SELECT_EDGE)){
- if(ctrl) EM_convertsel(em, (ts->selectmode ^ SCE_SELECT_FACE),SCE_SELECT_FACE);
+ if( ((em->selectmode ^ SCE_SELECT_FACE) == SCE_SELECT_VERTEX) || ((em->selectmode ^ SCE_SELECT_FACE) == SCE_SELECT_EDGE)){
+ if(ctrl)
+ EM_convertsel(em, (em->selectmode ^ SCE_SELECT_FACE),SCE_SELECT_FACE);
}
em->selectmode = SCE_SELECT_FACE;
}
@@ -438,7 +431,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);
@@ -470,7 +463,7 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
uiBlockEndAlign(block);
/* Draw type */
- uiItemR(layout, &v3dptr, "viewport_shading", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(layout, &v3dptr, "viewport_shade", 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 */
@@ -484,7 +477,7 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
row= uiLayoutRow(layout, 1);
uiItemR(row, &v3dptr, "pivot_point", UI_ITEM_R_ICON_ONLY, "", 0);
- uiItemR(row, &v3dptr, "pivot_point_align", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(row, &v3dptr, "use_pivot_point_align", UI_ITEM_R_ICON_ONLY, "", 0);
/* NDOF */
/* Not implemented yet
@@ -499,7 +492,7 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
/* Transform widget / manipulators */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &v3dptr, "manipulator", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(row, &v3dptr, "show_manipulator", UI_ITEM_R_ICON_ONLY, "", 0);
block= uiLayoutGetBlock(row);
if(v3d->twflag & V3D_USE_MANIPULATOR) {
@@ -522,9 +515,9 @@ 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, "layers_used", ob_lay);
else
- uiTemplateLayers(layout, &v3dptr, "visible_layers", &v3dptr, "used_layers", ob_lay);
+ uiTemplateLayers(layout, &v3dptr, "layers", &v3dptr, "layers_used", ob_lay);
/* Scene lock */
uiItemR(layout, &v3dptr, "lock_camera_and_layers", UI_ITEM_R_ICON_ONLY, "", 0);
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index e6ba2fa904f..7a45a43ddd4 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -56,6 +56,7 @@ struct bMotionPath;
#define V3D_XRAY 1
#define V3D_TRANSP 2
+#define V3D_XRAYTRANSP 4
#define V3D_SELECT_MOUSE 1
@@ -75,6 +76,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);
@@ -101,10 +103,10 @@ void draw_motion_paths_cleanup(Scene *scene, View3D *v3d, struct ARegion *ar);
/* drawobject.c */
void draw_object(Scene *scene, struct ARegion *ar, View3D *v3d, Base *base, int flag);
-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(struct RegionView3D *rv3d, float mat[][4], float size, int flag, char drawtype);
+int draw_glsl_material(Scene *scene, struct Object *ob, View3D *v3d, int dt);
+void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, struct Object *ob, int dt, int outline);
+void draw_object_backbufsel(Scene *scene, View3D *v3d, RegionView3D *rv3d, struct Object *ob);
+void drawaxes(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);
@@ -116,7 +118,7 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, floa
int draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt, int flag);
/* drawmesh.c */
-void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, struct DerivedMesh *dm, int faceselect);
+void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, struct Object *ob, struct DerivedMesh *dm, int faceselect);
/* view3d_draw.c */
void view3d_main_area_draw(const struct bContext *C, struct ARegion *ar);
@@ -124,8 +126,7 @@ void draw_depth(Scene *scene, struct ARegion *ar, View3D *v3d, int (* func)(void
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 add_view3d_after(ListBase *lb, Base *base, int flag);
void circf(float x, float y, float rad);
void circ(float x, float y, float rad);
@@ -139,9 +140,11 @@ 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);
+void VIEW3D_OT_object_as_camera(struct wmOperatorType *ot);
void VIEW3D_OT_localview(struct wmOperatorType *ot);
void VIEW3D_OT_game_start(struct wmOperatorType *ot);
void VIEW3D_OT_fly(struct wmOperatorType *ot);
@@ -151,7 +154,7 @@ int boundbox_clip(RegionView3D *rv3d, float obmat[][4], struct BoundBox *bb);
void centerview(struct ARegion *ar, View3D *v3d);
-void smooth_view(struct bContext *C, Object *, Object *, float *ofs, float *quat, float *dist, float *lens);
+void smooth_view(struct bContext *C, struct Object *, struct Object *, float *ofs, float *quat, float *dist, float *lens);
void setwinmatrixview3d(ARegion *ar, View3D *v3d, rctf *rect); /* rect: for picking */
void setviewmatrixview3d(Scene *scene, View3D *v3d, RegionView3D *rv3d);
@@ -171,11 +174,10 @@ void view3d_toolshelf_register(struct ARegionType *art);
void view3d_tool_props_register(struct ARegionType *art);
/* view3d_snap.c */
-int minmax_verts(Object *obedit, float *min, float *max);
+int minmax_verts(struct 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 d2fda2f2f76..9ee12a8ef1e 100644
--- a/source/blender/editors/space_view3d/view3d_ops.c
+++ b/source/blender/editors/space_view3d/view3d_ops.c
@@ -29,7 +29,6 @@
#include <stdlib.h>
#include <math.h>
-#include "MEM_guardedalloc.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -40,9 +39,6 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
-#include "BKE_context.h"
-#include "BKE_global.h"
-#include "BKE_utildefines.h"
#include "RNA_access.h"
@@ -70,6 +66,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);
@@ -82,7 +79,7 @@ void view3d_operatortypes(void)
WM_operatortype_append(VIEW3D_OT_cursor3d);
WM_operatortype_append(VIEW3D_OT_select_lasso);
WM_operatortype_append(VIEW3D_OT_setcameratoview);
- WM_operatortype_append(VIEW3D_OT_setobjectascamera);
+ WM_operatortype_append(VIEW3D_OT_object_as_camera);
WM_operatortype_append(VIEW3D_OT_localview);
WM_operatortype_append(VIEW3D_OT_game_start);
WM_operatortype_append(VIEW3D_OT_fly);
@@ -93,7 +90,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);
@@ -151,7 +147,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*/
@@ -221,12 +218,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_shade");
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_shade");
RNA_string_set(kmi->ptr, "value_1", "TEXTURED");
RNA_string_set(kmi->ptr, "value_2", "SOLID");
@@ -267,29 +264,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.show_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_select.c b/source/blender/editors/space_view3d/view3d_select.c
index d0c69c9a4cb..b3d4e513d43 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -46,15 +46,8 @@
#include "BLI_rand.h"
#include "BLI_linklist.h"
-#include "BKE_action.h"
#include "BKE_context.h"
-#include "BKE_depsgraph.h"
-#include "BKE_object.h"
-#include "BKE_global.h"
#include "BKE_paint.h"
-#include "BKE_scene.h"
-#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "BIF_gl.h"
@@ -105,7 +98,7 @@ void view3d_get_view_aligned_coordinate(ViewContext *vc, float *fp, short mval[2
if(mval[0]!=IS_CLIPPED) {
window_to_3d_delta(vc->ar, dvec, mval[0]-mx, mval[1]-my);
- sub_v3_v3v3(fp, fp, dvec);
+ sub_v3_v3(fp, dvec);
}
}
@@ -218,6 +211,23 @@ void arrows_move_cursor(unsigned short event)
/* *********************** GESTURE AND LASSO ******************* */
+static int view3d_selectable_data(bContext *C)
+{
+ Object *ob = CTX_data_active_object(C);
+
+ if (!ED_operator_view3d_active(C))
+ return 0;
+
+ if (!CTX_data_edit_object(C))
+ if (ob && ob->mode & OB_MODE_SCULPT)
+ return 0;
+ if (ob && ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT) && !paint_facesel_test(ob))
+ return 0;
+
+ return 1;
+}
+
+
/* helper also for borderselect */
static int edge_fully_inside_rect(rcti *rect, short x1, short y1, short x2, short y2)
{
@@ -339,11 +349,9 @@ static void do_lasso_select_pose(ViewContext *vc, Object *ob, short mcords[][2],
if(ob->type!=OB_ARMATURE || ob->pose==NULL) return;
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- VECCOPY(vec, pchan->pose_head);
- mul_m4_v3(ob->obmat, vec);
+ mul_v3_m4v3(vec, ob->obmat, pchan->pose_head);
project_short(vc->ar, vec, sco1);
- VECCOPY(vec, pchan->pose_tail);
- mul_m4_v3(ob->obmat, vec);
+ mul_v3_m4v3(vec, ob->obmat, pchan->pose_tail);
project_short(vc->ar, vec, sco2);
if(lasso_inside_edge(mcords, moves, sco1[0], sco1[1], sco2[0], sco2[1])) {
@@ -528,7 +536,7 @@ static void do_lasso_select_mesh_uv(short mcords[][2], short moves, short select
} else { /* Vert Sel*/
for (efa= em->faces.first; efa; efa= efa->next) {
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (simaFaceDraw_Check(efa, tf)) {
+ if (uvedit_face_visible(scene, ima, efa, tf)) {
nverts= efa->v4? 4: 3;
for(i=0; i<nverts; i++) {
if ((select) != (simaUVSel_Check(efa, tf, i))) {
@@ -554,14 +562,15 @@ static void do_lasso_select_mesh_uv(short mcords[][2], short moves, short select
static void do_lasso_select_curve__doSelect(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
{
- struct { ViewContext vc; short (*mcords)[2]; short moves; short select; } *data = userData;
-
+ struct { ViewContext *vc; short (*mcords)[2]; short moves; short select; } *data = userData;
+ Object *obedit= data->vc->obedit;
+ Curve *cu= (Curve*)obedit->data;
+
if (lasso_inside(data->mcords, data->moves, x, y)) {
if (bp) {
bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
+ if (bp == cu->lastsel && !(bp->f1 & 1)) cu->lastsel = NULL;
} else {
- Curve *cu= data->vc.obedit->data;
-
if (cu->drawflag & CU_HIDE_HANDLES) {
/* can only be beztindex==0 here since handles are hidden */
bezt->f1 = bezt->f2 = bezt->f3 = data->select?(bezt->f2|SELECT):(bezt->f2&~SELECT);
@@ -574,16 +583,18 @@ static void do_lasso_select_curve__doSelect(void *userData, Nurb *nu, BPoint *bp
bezt->f3 = data->select?(bezt->f3|SELECT):(bezt->f3&~SELECT);
}
}
+
+ if (bezt == cu->lastsel && !(bezt->f2 & 1)) cu->lastsel = NULL;
}
}
}
static void do_lasso_select_curve(ViewContext *vc, short mcords[][2], short moves, short select)
{
- struct { ViewContext vc; short (*mcords)[2]; short moves; short select; } data;
+ struct { ViewContext *vc; short (*mcords)[2]; short moves; short select; } data;
/* set vc->editnurb */
- data.vc = *vc;
+ data.vc = vc;
data.mcords = mcords;
data.moves = moves;
data.select = select;
@@ -624,11 +635,9 @@ static void do_lasso_select_armature(ViewContext *vc, short mcords[][2], short m
for (ebone= arm->edbo->first; ebone; ebone=ebone->next) {
- VECCOPY(vec, ebone->head);
- mul_m4_v3(vc->obedit->obmat, vec);
+ mul_v3_m4v3(vec, vc->obedit->obmat, ebone->head);
project_short(vc->ar, vec, sco1);
- VECCOPY(vec, ebone->tail);
- mul_m4_v3(vc->obedit->obmat, vec);
+ mul_v3_m4v3(vec, vc->obedit->obmat, ebone->tail);
project_short(vc->ar, vec, sco2);
didpoint= 0;
@@ -715,8 +724,10 @@ void view3d_lasso_select(bContext *C, ViewContext *vc, short mcords[][2], short
;
else if(ob && ob->mode & OB_MODE_PARTICLE_EDIT)
PE_lasso_select(C, mcords, moves, select);
- else
+ else {
do_lasso_select_objects(vc, mcords, moves, select);
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, vc->scene);
+ }
}
else { /* Edit Mode */
if(vc->obedit->type==OB_MESH)
@@ -775,7 +786,7 @@ void VIEW3D_OT_select_lasso(wmOperatorType *ot)
ot->invoke= WM_gesture_lasso_invoke;
ot->modal= WM_gesture_lasso_modal;
ot->exec= view3d_lasso_select_exec;
- ot->poll= WM_operator_winactive;
+ ot->poll= view3d_selectable_data;
/* flags */
ot->flag= OPTYPE_UNDO;
@@ -1274,14 +1285,15 @@ int edge_inside_circle(short centx, short centy, short rad, short x1, short y1,
static void do_nurbs_box_select__doSelect(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
{
- struct { ViewContext vc; rcti *rect; int select; } *data = userData;
+ struct { ViewContext *vc; rcti *rect; int select; } *data = userData;
+ Object *obedit= data->vc->obedit;
+ Curve *cu= (Curve*)obedit->data;
if (BLI_in_rcti(data->rect, x, y)) {
if (bp) {
bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
+ if (bp == cu->lastsel && !(bp->f1 & 1)) cu->lastsel = NULL;
} else {
- Curve *cu= data->vc.obedit->data;
-
if (cu->drawflag & CU_HIDE_HANDLES) {
/* can only be beztindex==0 here since handles are hidden */
bezt->f1 = bezt->f2 = bezt->f3 = data->select?(bezt->f2|SELECT):(bezt->f2&~SELECT);
@@ -1294,14 +1306,16 @@ static void do_nurbs_box_select__doSelect(void *userData, Nurb *nu, BPoint *bp,
bezt->f3 = data->select?(bezt->f3|SELECT):(bezt->f3&~SELECT);
}
}
+
+ if (bezt == cu->lastsel && !(bezt->f2 & 1)) cu->lastsel = NULL;
}
}
}
static void do_nurbs_box_select(ViewContext *vc, rcti *rect, int select, int extend)
{
- struct { ViewContext vc; rcti *rect; int select; } data;
+ struct { ViewContext *vc; rcti *rect; int select; } data;
- data.vc = *vc;
+ data.vc = vc;
data.rect = rect;
data.select = select;
@@ -1590,6 +1604,7 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
unsigned int *vbuffer=NULL; /* selection buffer */
unsigned int *col; /* color in buffer */
int bone_only;
+ int bone_selected=0;
int totobj= MAXPICKBUF; // XXX solve later
if((ob) && (ob->mode & OB_MODE_POSE))
@@ -1645,6 +1660,7 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
if(bone) {
if(selecting) {
bone->flag |= BONE_SELECTED;
+ bone_selected=1;
// XXX select_actionchannel_by_name(base->object->action, bone->name, 1);
}
else {
@@ -1670,6 +1686,8 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
}
}
+ if (bone_selected) WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, base->object);
+
base= next;
}
@@ -1696,8 +1714,7 @@ void VIEW3D_OT_select_border(wmOperatorType *ot)
ot->invoke= WM_border_select_invoke;
ot->exec= view3d_borderselect_exec;
ot->modal= WM_border_select_modal;
-
- ot->poll= ED_operator_view3d_active;
+ ot->poll= view3d_selectable_data;
/* flags */
ot->flag= OPTYPE_UNDO;
@@ -1871,18 +1888,29 @@ static void nurbscurve_circle_doSelect(void *userData, Nurb *nu, BPoint *bp, Bez
struct {ViewContext *vc; short select, mval[2]; float radius; } *data = userData;
int mx = x - data->mval[0], my = y - data->mval[1];
float r = sqrt(mx*mx + my*my);
+ Object *obedit= data->vc->obedit;
+ Curve *cu= (Curve*)obedit->data;
if (r<=data->radius) {
if (bp) {
bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
+
+ if (bp == cu->lastsel && !(bp->f1 & 1)) cu->lastsel = NULL;
} else {
- if (beztindex==0) {
- bezt->f1 = data->select?(bezt->f1|SELECT):(bezt->f1&~SELECT);
- } else if (beztindex==1) {
- bezt->f2 = data->select?(bezt->f2|SELECT):(bezt->f2&~SELECT);
+ if (cu->drawflag & CU_HIDE_HANDLES) {
+ /* can only be beztindex==0 here since handles are hidden */
+ bezt->f1 = bezt->f2 = bezt->f3 = data->select?(bezt->f2|SELECT):(bezt->f2&~SELECT);
} else {
- bezt->f3 = data->select?(bezt->f3|SELECT):(bezt->f3&~SELECT);
+ if (beztindex==0) {
+ bezt->f1 = data->select?(bezt->f1|SELECT):(bezt->f1&~SELECT);
+ } else if (beztindex==1) {
+ bezt->f2 = data->select?(bezt->f2|SELECT):(bezt->f2&~SELECT);
+ } else {
+ bezt->f3 = data->select?(bezt->f3|SELECT):(bezt->f3&~SELECT);
+ }
}
+
+ if (bezt == cu->lastsel && !(bezt->f2 & 1)) cu->lastsel = NULL;
}
}
}
@@ -1896,6 +1924,7 @@ static void nurbscurve_circle_select(ViewContext *vc, int selecting, short *mval
data.mval[0] = mval[0];
data.mval[1] = mval[1];
data.radius = rad;
+ data.vc = vc;
ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
nurbs_foreachScreenVert(vc, nurbscurve_circle_doSelect, &data);
@@ -1972,13 +2001,11 @@ static void armature_circle_select(ViewContext *vc, int selecting, short *mval,
float vec[3];
/* project head location to screenspace */
- VECCOPY(vec, ebone->head);
- mul_m4_v3(vc->obedit->obmat, vec);
+ mul_v3_m4v3(vec, vc->obedit->obmat, ebone->head);
project_short(vc->ar, vec, sco1);
/* project tail location to screenspace */
- VECCOPY(vec, ebone->tail);
- mul_m4_v3(vc->obedit->obmat, vec);
+ mul_v3_m4v3(vec, vc->obedit->obmat, ebone->tail);
project_short(vc->ar, vec, sco2);
/* check if the head and/or tail is in the circle
@@ -2091,7 +2118,7 @@ void VIEW3D_OT_select_circle(wmOperatorType *ot)
ot->invoke= WM_gesture_circle_invoke;
ot->modal= WM_gesture_circle_modal;
ot->exec= view3d_circle_select_exec;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= view3d_selectable_data;
/* flags */
ot->flag= OPTYPE_UNDO;
diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c
index 48658b57297..a4e893a6181 100644
--- a/source/blender/editors/space_view3d/view3d_snap.c
+++ b/source/blender/editors/space_view3d/view3d_snap.c
@@ -37,26 +37,20 @@
#include "DNA_lattice_types.h"
#include "DNA_meta_types.h"
#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_editVert.h"
#include "BLI_linklist.h"
-#include "BKE_action.h"
-#include "BKE_anim.h"
-#include "BKE_context.h"
#include "BKE_armature.h"
+#include "BKE_context.h"
#include "BKE_curve.h"
#include "BKE_depsgraph.h"
-#include "BKE_DerivedMesh.h"
-#include "BKE_displist.h"
-#include "BKE_global.h"
#include "BKE_lattice.h"
-#include "BKE_mesh.h"
-#include "BKE_modifier.h"
+#include "BKE_main.h"
#include "BKE_object.h"
-#include "BKE_utildefines.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -66,6 +60,7 @@
#include "ED_armature.h"
#include "ED_mesh.h"
#include "ED_screen.h"
+#include "ED_curve.h" /* for ED_curve_editnurbs */
#include "view3d_intern.h"
@@ -100,8 +95,9 @@ static void special_transvert_update(Scene *scene, Object *obedit)
}
else if (ELEM(obedit->type, OB_CURVE, OB_SURF)) {
Curve *cu= obedit->data;
- Nurb *nu= cu->editnurb->first;
-
+ ListBase *nurbs= ED_curve_editnurbs(cu);
+ Nurb *nu= nurbs->first;
+
while(nu) {
test2DNurb(nu);
testhandlesNurb(nu); /* test for bezier too */
@@ -122,7 +118,7 @@ static void special_transvert_update(Scene *scene, Object *obedit)
float diffvec[3];
sub_v3_v3v3(diffvec, tv->loc, tv->oldloc);
- add_v3_v3v3(ebo->tail, ebo->tail, diffvec);
+ add_v3_v3(ebo->tail, diffvec);
a++;
if (a<tottrans) tv++;
@@ -149,8 +145,8 @@ static void special_transvert_update(Scene *scene, Object *obedit)
else if(obedit->type==OB_LATTICE) {
Lattice *lt= obedit->data;
- if(lt->editlatt->flag & LT_OUTSIDE)
- outside_lattice(lt->editlatt);
+ if(lt->editlatt->latt->flag & LT_OUTSIDE)
+ outside_lattice(lt->editlatt->latt);
}
}
}
@@ -288,8 +284,9 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
else if (ELEM(obedit->type, OB_CURVE, OB_SURF)) {
Curve *cu= obedit->data;
int totmalloc= 0;
-
- for(nu= cu->editnurb->first; nu; nu= nu->next) {
+ ListBase *nurbs= ED_curve_editnurbs(cu);
+
+ for(nu= nurbs->first; nu; nu= nu->next) {
if(nu->type == CU_BEZIER)
totmalloc += 3*nu->pntsu;
else
@@ -297,7 +294,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
}
tv=transvmain= MEM_callocN(totmalloc*sizeof(TransVert), "maketransverts curve");
- nu= cu->editnurb->first;
+ nu= nurbs->first;
while(nu) {
if(nu->type == CU_BEZIER) {
a= nu->pntsu;
@@ -362,7 +359,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
while(ml) {
if(ml->flag & SELECT) {
tv->loc= &ml->x;
- VECCOPY(tv->oldloc, tv->loc);
+ copy_v3_v3(tv->oldloc, tv->loc);
tv->val= &(ml->rad);
tv->oldval= ml->rad;
tv->flag= 1;
@@ -375,16 +372,16 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
else if(obedit->type==OB_LATTICE) {
Lattice *lt= obedit->data;
- bp= lt->editlatt->def;
+ bp= lt->editlatt->latt->def;
- a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
+ a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
tv=transvmain= MEM_callocN(a*sizeof(TransVert), "maketransverts curve");
while(a--) {
if((mode & 1) || (bp->f1 & SELECT)) {
if(bp->hide==0) {
- VECCOPY(tv->oldloc, bp->vec);
+ copy_v3_v3(tv->oldloc, bp->vec);
tv->loc= bp->vec;
tv->flag= bp->f1 & SELECT;
tv++;
@@ -400,23 +397,16 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
total= 0.0;
for(a=0; a<tottrans; a++, tv++) {
if(tv->flag & SELECT) {
- centroid[0]+= tv->oldloc[0];
- centroid[1]+= tv->oldloc[1];
- centroid[2]+= tv->oldloc[2];
+ add_v3_v3(centroid, tv->oldloc);
total+= 1.0;
DO_MINMAX(tv->oldloc, min, max);
}
}
if(total!=0.0) {
- centroid[0]/= total;
- centroid[1]/= total;
- centroid[2]/= total;
+ mul_v3_fl(centroid, 1.0f/total);
}
- center[0]= (min[0]+max[0])/2.0;
- center[1]= (min[1]+max[1])/2.0;
- center[2]= (min[2]+max[2])/2.0;
-
+ mid_v3_v3v3(center, min, max);
}
/* *********************** operators ******************** */
@@ -424,6 +414,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
static int snap_sel_to_grid(bContext *C, wmOperator *op)
{
extern float originmat[3][3]; /* XXX object.c */
+ Main *bmain= CTX_data_main(C);
Object *obedit= CTX_data_edit_object(C);
Scene *scene= CTX_data_scene(C);
RegionView3D *rv3d= CTX_wm_region_data(C);
@@ -448,11 +439,11 @@ static int snap_sel_to_grid(bContext *C, wmOperator *op)
VECCOPY(vec, tv->loc);
mul_m3_v3(bmat, vec);
- add_v3_v3v3(vec, vec, obedit->obmat[3]);
+ add_v3_v3(vec, obedit->obmat[3]);
vec[0]= gridf*floor(.5+ vec[0]/gridf);
vec[1]= gridf*floor(.5+ vec[1]/gridf);
vec[2]= gridf*floor(.5+ vec[2]/gridf);
- sub_v3_v3v3(vec, vec, obedit->obmat[3]);
+ sub_v3_v3(vec, obedit->obmat[3]);
mul_m3_v3(imat, vec);
VECCOPY(tv->loc, vec);
@@ -530,7 +521,7 @@ static int snap_sel_to_grid(bContext *C, wmOperator *op)
CTX_DATA_END;
}
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
return OPERATOR_FINISHED;
@@ -557,6 +548,7 @@ void VIEW3D_OT_snap_selected_to_grid(wmOperatorType *ot)
static int snap_sel_to_curs(bContext *C, wmOperator *op)
{
extern float originmat[3][3]; /* XXX object.c */
+ Main *bmain= CTX_data_main(C);
Object *obedit= CTX_data_edit_object(C);
Scene *scene= CTX_data_scene(C);
View3D *v3d= CTX_wm_view3d(C);
@@ -655,7 +647,7 @@ static int snap_sel_to_curs(bContext *C, wmOperator *op)
CTX_DATA_END;
}
- DAG_ids_flush_update(0);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
return OPERATOR_FINISHED;
@@ -744,8 +736,8 @@ static int snap_curs_to_sel(bContext *C, wmOperator *op)
for(a=0; a<tottrans; a++, tv++) {
VECCOPY(vec, tv->loc);
mul_m3_v3(bmat, vec);
- add_v3_v3v3(vec, vec, obedit->obmat[3]);
- add_v3_v3v3(centroid, centroid, vec);
+ add_v3_v3(vec, obedit->obmat[3]);
+ add_v3_v3(centroid, vec);
DO_MINMAX(vec, min, max);
}
@@ -772,7 +764,7 @@ static int snap_curs_to_sel(bContext *C, wmOperator *op)
if(pchan->bone->flag & BONE_SELECTED) {
VECCOPY(vec, pchan->pose_head);
mul_m4_v3(ob->obmat, vec);
- add_v3_v3v3(centroid, centroid, vec);
+ add_v3_v3(centroid, vec);
DO_MINMAX(vec, min, max);
count++;
}
@@ -780,9 +772,9 @@ static int snap_curs_to_sel(bContext *C, wmOperator *op)
}
}
else {
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ CTX_DATA_BEGIN(C, Object*, ob, selected_objects) {
VECCOPY(vec, ob->obmat[3]);
- add_v3_v3v3(centroid, centroid, vec);
+ add_v3_v3(centroid, vec);
DO_MINMAX(vec, min, max);
count++;
}
@@ -872,204 +864,6 @@ void VIEW3D_OT_snap_cursor_to_active(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-/* ************************************** */
-
-static int snap_selected_to_center(bContext *C, wmOperator *op)
-{
- extern float originmat[3][3]; /* XXX object.c */
- Object *obedit= CTX_data_edit_object(C);
- Scene *scene= CTX_data_scene(C);
- View3D *v3d= CTX_wm_view3d(C);
- TransVert *tv;
- float snaploc[3], imat[3][3], bmat[3][3], vec[3], min[3], max[3], centroid[3];
- int count, a;
-
- /*calculate the snaplocation (centerpoint) */
- count= 0;
- INIT_MINMAX(min, max);
- centroid[0]= centroid[1]= centroid[2]= 0.0f;
- snaploc[0]= snaploc[1]= snaploc[2]= 0.0f;
-
- if(obedit) {
- tottrans= 0;
-
- if ELEM6(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL)
- make_trans_verts(obedit, bmat[0], bmat[1], 0);
- if(tottrans==0) return OPERATOR_CANCELLED;
-
- copy_m3_m4(bmat, obedit->obmat);
- invert_m3_m3(imat, bmat);
-
- tv= transvmain;
- for(a=0; a<tottrans; a++, tv++) {
- VECCOPY(vec, tv->loc);
- mul_m3_v3(bmat, vec);
- add_v3_v3v3(vec, vec, obedit->obmat[3]);
- add_v3_v3v3(centroid, centroid, vec);
- DO_MINMAX(vec, min, max);
- }
-
- if(v3d->around==V3D_CENTROID) {
- mul_v3_fl(centroid, 1.0/(float)tottrans);
- VECCOPY(snaploc, centroid);
- }
- else {
- snaploc[0]= (min[0]+max[0])/2;
- snaploc[1]= (min[1]+max[1])/2;
- snaploc[2]= (min[2]+max[2])/2;
- }
-
- MEM_freeN(transvmain);
- transvmain= NULL;
- }
- else {
-
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
- if(ob->mode & OB_MODE_POSE) {
- bPoseChannel *pchan;
- bArmature *arm= ob->data;
-
- for (pchan = ob->pose->chanbase.first; pchan; pchan=pchan->next) {
- if(pchan->bone->flag & BONE_SELECTED) {
- if(pchan->bone->layer & arm->layer) {
- VECCOPY(vec, pchan->pose_mat[3]);
- add_v3_v3v3(centroid, centroid, vec);
- DO_MINMAX(vec, min, max);
- count++;
- }
- }
- }
- }
- else {
- /* not armature bones (i.e. objects) */
- VECCOPY(vec, ob->obmat[3]);
- add_v3_v3v3(centroid, centroid, vec);
- DO_MINMAX(vec, min, max);
- count++;
- }
- }
- CTX_DATA_END;
-
- if(count) {
- if(v3d->around==V3D_CENTROID) {
- mul_v3_fl(centroid, 1.0/(float)count);
- VECCOPY(snaploc, centroid);
- }
- else {
- snaploc[0]= (min[0]+max[0])/2;
- snaploc[1]= (min[1]+max[1])/2;
- snaploc[2]= (min[2]+max[2])/2;
- }
- }
- }
-
- /* Snap the selection to the snaplocation (duh!) */
- if(obedit) {
- tottrans= 0;
-
- if ELEM6(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL)
- make_trans_verts(obedit, bmat[0], bmat[1], 0);
- if(tottrans==0) return OPERATOR_CANCELLED;
-
- copy_m3_m4(bmat, obedit->obmat);
- invert_m3_m3(imat, bmat);
-
- tv= transvmain;
- for(a=0; a<tottrans; a++, tv++) {
- vec[0]= snaploc[0]-obedit->obmat[3][0];
- vec[1]= snaploc[1]-obedit->obmat[3][1];
- vec[2]= snaploc[2]-obedit->obmat[3][2];
-
- mul_m3_v3(imat, vec);
- VECCOPY(tv->loc, vec);
- }
-
- special_transvert_update(scene, obedit);
-
- MEM_freeN(transvmain);
- transvmain= NULL;
-
- }
- else {
-
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
- if(ob->mode & OB_MODE_POSE) {
- bPoseChannel *pchan;
- bArmature *arm= ob->data;
-
- for (pchan = ob->pose->chanbase.first; pchan; pchan=pchan->next) {
- if(pchan->bone->flag & BONE_SELECTED) {
- if(pchan->bone->layer & arm->layer) {
- if((pchan->bone->flag & BONE_CONNECTED)==0) {
- /* get location of cursor in bone-space */
- armature_loc_pose_to_bone(pchan, snaploc, vec);
-
- /* calculate new position */
- VECCOPY(pchan->loc, vec);
- }
- /* if the bone has a parent and is connected to the parent,
- * don't do anything - will break chain unless we do auto-ik.
- */
- }
- }
- }
-
- /* auto-keyframing */
- ob->pose->flag |= POSE_DO_UNLOCK;
-// XXX autokeyframe_pose_cb_func(ob, TFM_TRANSLATION, 0);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
- }
- else {
- ob->recalc |= OB_RECALC_OB;
-
- vec[0]= -ob->obmat[3][0] + snaploc[0];
- vec[1]= -ob->obmat[3][1] + snaploc[1];
- vec[2]= -ob->obmat[3][2] + snaploc[2];
-
- if(ob->parent) {
- where_is_object(scene, ob);
-
- invert_m3_m3(imat, originmat);
- mul_m3_v3(imat, vec);
- ob->loc[0]+= vec[0];
- ob->loc[1]+= vec[1];
- ob->loc[2]+= vec[2];
- }
- else {
- ob->loc[0]+= vec[0];
- ob->loc[1]+= vec[1];
- ob->loc[2]+= vec[2];
- }
- /* auto-keyframing */
-// XXX autokeyframe_ob_cb_func(ob, TFM_TRANSLATION);
- }
- }
- CTX_DATA_END;
- }
-
- DAG_ids_flush_update(0);
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
-
- return OPERATOR_FINISHED;
-}
-
-void VIEW3D_OT_snap_selected_to_center(wmOperatorType *ot)
-{
-
- /* identifiers */
- ot->name= "Snap Selection to Center";
- ot->description= "Snap selected items to selections geometric center";
- ot->idname= "VIEW3D_OT_snap_selected_to_center";
-
- /* api callbacks */
- ot->exec= snap_selected_to_center;
- ot->poll= ED_operator_view3d_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-
/* **************************************************** */
/*New Code - Snap Cursor to Center -*/
static int snap_curs_to_center(bContext *C, wmOperator *op)
@@ -1125,8 +919,8 @@ int minmax_verts(Object *obedit, float *min, float *max)
for(a=0; a<tottrans; a++, tv++) {
VECCOPY(vec, tv->loc);
mul_m3_v3(bmat, vec);
- add_v3_v3v3(vec, vec, obedit->obmat[3]);
- add_v3_v3v3(centroid, centroid, vec);
+ add_v3_v3(vec, obedit->obmat[3]);
+ add_v3_v3(centroid, vec);
DO_MINMAX(vec, min, max);
}
diff --git a/source/blender/editors/space_view3d/view3d_toolbar.c b/source/blender/editors/space_view3d/view3d_toolbar.c
index ac6d61fce18..e47a3af19f1 100644
--- a/source/blender/editors/space_view3d/view3d_toolbar.c
+++ b/source/blender/editors/space_view3d/view3d_toolbar.c
@@ -41,21 +41,11 @@
#include "BLI_editVert.h"
#include "BLI_rand.h"
-#include "BKE_action.h"
-#include "BKE_brush.h"
#include "BKE_context.h"
-#include "BKE_curve.h"
-#include "BKE_customdata.h"
-#include "BKE_depsgraph.h"
#include "BKE_idprop.h"
-#include "BKE_mesh.h"
-#include "BKE_object.h"
#include "BKE_global.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"
diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c
index 543af197370..45d099cbb4d 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -35,6 +35,7 @@
#include "DNA_camera_types.h"
#include "DNA_lamp_types.h"
#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
#include "MEM_guardedalloc.h"
@@ -51,8 +52,6 @@
#include "BKE_main.h"
#include "BKE_report.h"
#include "BKE_scene.h"
-#include "BKE_screen.h"
-#include "BKE_utildefines.h"
#include "BKE_depsgraph.h" /* for fly mode updating */
@@ -138,37 +137,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);
@@ -199,20 +193,20 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo
/* initialize sms */
memset(&sms,0,sizeof(struct SmoothViewStore));
- VECCOPY(sms.new_ofs, rv3d->ofs);
- QUATCOPY(sms.new_quat, rv3d->viewquat);
+ copy_v3_v3(sms.new_ofs, rv3d->ofs);
+ copy_qt_qt(sms.new_quat, rv3d->viewquat);
sms.new_dist= rv3d->dist;
sms.new_lens= v3d->lens;
sms.to_camera= 0;
/* store the options we want to end with */
- if(ofs) VECCOPY(sms.new_ofs, ofs);
- if(quat) QUATCOPY(sms.new_quat, quat);
+ if(ofs) copy_v3_v3(sms.new_ofs, ofs);
+ if(quat) copy_qt_qt(sms.new_quat, quat);
if(dist) sms.new_dist= *dist;
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 */
}
@@ -224,46 +218,24 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo
if (sms.new_lens != v3d->lens)
changed = 1;
- if ((sms.new_ofs[0]!=rv3d->ofs[0]) ||
- (sms.new_ofs[1]!=rv3d->ofs[1]) ||
- (sms.new_ofs[2]!=rv3d->ofs[2]) )
+ if (!equals_v3v3(sms.new_ofs, rv3d->ofs))
changed = 1;
-
- if ((sms.new_quat[0]!=rv3d->viewquat[0]) ||
- (sms.new_quat[1]!=rv3d->viewquat[1]) ||
- (sms.new_quat[2]!=rv3d->viewquat[2]) ||
- (sms.new_quat[3]!=rv3d->viewquat[3]) )
+
+ if (!equals_v4v4(sms.new_quat, rv3d->viewquat))
changed = 1;
/* The new view is different from the old one
* so animate the view */
if (changed) {
-
- sms.time_allowed= (double)U.smooth_viewtx / 1000.0;
-
- /* if this is view rotation only
- * we can decrease the time allowed by
- * the angle between quats
- * this means small rotations wont lag */
- if (quat && !ofs && !dist) {
- 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);
- }
-
+
/* 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);
- QUATCOPY(sms.orig_quat, rv3d->viewquat);
+ copy_v3_v3(sms.orig_ofs, rv3d->ofs);
+ copy_qt_qt(sms.orig_quat, rv3d->viewquat);
sms.orig_dist= rv3d->dist;
sms.orig_lens= v3d->lens;
}
@@ -274,6 +246,26 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo
rv3d->view= 0;
}
+ sms.time_allowed= (double)U.smooth_viewtx / 1000.0;
+
+ /* if this is view rotation only
+ * we can decrease the time allowed by
+ * the angle between quats
+ * this means small rotations wont lag */
+ if (quat && !ofs && !dist) {
+ float vec1[3]={0,0,1}, vec2[3]= {0,0,1};
+ float q1[4], q2[4];
+
+ invert_qt_qt(q1, sms.new_quat);
+ invert_qt_qt(q2, sms.orig_quat);
+
+ mul_qt_v3(q1, vec1);
+ mul_qt_v3(q2, vec2);
+
+ /* scale the time allowed by the rotation */
+ sms.time_allowed *= angle_v3v3(vec1, vec2) / M_PI; /* 180deg == 1.0 */
+ }
+
/* ensure it shows correct */
if(sms.to_camera) rv3d->persp= RV3D_PERSP;
@@ -294,8 +286,8 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo
/* if we get here nothing happens */
if(sms.to_camera==0) {
- VECCOPY(rv3d->ofs, sms.new_ofs);
- QUATCOPY(rv3d->viewquat, sms.new_quat);
+ copy_v3_v3(rv3d->ofs, sms.new_ofs);
+ copy_qt_qt(rv3d->viewquat, sms.new_quat);
rv3d->dist = sms.new_dist;
v3d->lens = sms.new_lens;
}
@@ -314,7 +306,10 @@ static int view3d_smoothview_invoke(bContext *C, wmOperator *op, wmEvent *event)
if(rv3d->smooth_timer==NULL || rv3d->smooth_timer!=event->customdata)
return OPERATOR_PASS_THROUGH;
- step = (rv3d->smooth_timer->duration)/sms->time_allowed;
+ if(sms->time_allowed != 0.0f)
+ step = (rv3d->smooth_timer->duration)/sms->time_allowed;
+ else
+ step = 1.0f;
/* end timer */
if(step >= 1.0f) {
@@ -322,14 +317,14 @@ static int view3d_smoothview_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* if we went to camera, store the original */
if(sms->to_camera) {
rv3d->persp= RV3D_CAMOB;
- VECCOPY(rv3d->ofs, sms->orig_ofs);
- QUATCOPY(rv3d->viewquat, sms->orig_quat);
+ copy_v3_v3(rv3d->ofs, sms->orig_ofs);
+ copy_qt_qt(rv3d->viewquat, sms->orig_quat);
rv3d->dist = sms->orig_dist;
v3d->lens = sms->orig_lens;
}
else {
- VECCOPY(rv3d->ofs, sms->new_ofs);
- QUATCOPY(rv3d->viewquat, sms->new_quat);
+ copy_v3_v3(rv3d->ofs, sms->new_ofs);
+ copy_qt_qt(rv3d->viewquat, sms->new_quat);
rv3d->dist = sms->new_dist;
v3d->lens = sms->new_lens;
}
@@ -363,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;
}
@@ -463,7 +458,7 @@ static int view3d_setobjectascamera_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void VIEW3D_OT_setobjectascamera(wmOperatorType *ot)
+void VIEW3D_OT_object_as_camera(wmOperatorType *ot)
{
/* identifiers */
@@ -536,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);
@@ -576,9 +571,9 @@ void viewvector(RegionView3D *rv3d, float coord[3], float vec[3])
{
float p1[4], p2[4];
- VECCOPY(p1, coord);
+ copy_v3_v3(p1, coord);
p1[3] = 1.0f;
- VECCOPY(p2, p1);
+ copy_v3_v3(p2, p1);
p2[3] = 1.0f;
mul_m4_v4(rv3d->viewmat, p2);
@@ -589,16 +584,18 @@ void viewvector(RegionView3D *rv3d, float coord[3], float vec[3])
sub_v3_v3v3(vec, p1, p2);
}
else {
- VECCOPY(vec, rv3d->viewinv[2]);
+ copy_v3_v3(vec, rv3d->viewinv[2]);
}
normalize_v3(vec);
}
-void initgrabz(RegionView3D *rv3d, float x, float y, float z)
+int initgrabz(RegionView3D *rv3d, float x, float y, float z)
{
- if(rv3d==NULL) return;
+ int flip= FALSE;
+ if(rv3d==NULL) return flip;
rv3d->zfac= rv3d->persmat[0][3]*x+ rv3d->persmat[1][3]*y+ rv3d->persmat[2][3]*z+ rv3d->persmat[3][3];
-
+ if (rv3d->zfac < 0.0f)
+ flip= TRUE;
/* if x,y,z is exactly the viewport offset, zfac is 0 and we don't want that
* (accounting for near zero values)
* */
@@ -611,6 +608,8 @@ void initgrabz(RegionView3D *rv3d, float x, float y, float z)
// -- Aligorith, 2009Aug31
//if (rv3d->zfac < 0.0f) rv3d->zfac = 1.0f;
if (rv3d->zfac < 0.0f) rv3d->zfac= -rv3d->zfac;
+
+ return flip;
}
/* always call initgrabz */
@@ -691,7 +690,7 @@ void view3d_project_float(ARegion *ar, float *vec, float *adr, float mat[4][4])
float vec4[4];
adr[0]= IS_CLIPPED;
- VECCOPY(vec4, vec);
+ copy_v3_v3(vec4, vec);
vec4[3]= 1.0;
mul_m4_v4(mat, vec4);
@@ -718,7 +717,7 @@ int boundbox_clip(RegionView3D *rv3d, float obmat[][4], BoundBox *bb)
mul_m4_m4m4(mat, obmat, rv3d->persmat);
for(a=0; a<8; a++) {
- VECCOPY(vec, bb->vec[a]);
+ copy_v3_v3(vec, bb->vec[a]);
vec[3]= 1.0;
mul_m4_v4(mat, vec);
max= vec[3];
@@ -751,7 +750,7 @@ void project_short(ARegion *ar, float *vec, short *adr) /* clips */
return;
}
- VECCOPY(vec4, vec);
+ copy_v3_v3(vec4, vec);
vec4[3]= 1.0;
mul_m4_v4(rv3d->persmat, vec4);
@@ -776,7 +775,7 @@ void project_int(ARegion *ar, float *vec, int *adr)
float fx, fy, vec4[4];
adr[0]= (int)2140000000.0f;
- VECCOPY(vec4, vec);
+ copy_v3_v3(vec4, vec);
vec4[3]= 1.0;
mul_m4_v4(rv3d->persmat, vec4);
@@ -800,7 +799,7 @@ void project_int_noclip(ARegion *ar, float *vec, int *adr)
RegionView3D *rv3d= ar->regiondata;
float fx, fy, vec4[4];
- VECCOPY(vec4, vec);
+ copy_v3_v3(vec4, vec);
vec4[3]= 1.0;
mul_m4_v4(rv3d->persmat, vec4);
@@ -825,7 +824,7 @@ void project_short_noclip(ARegion *ar, float *vec, short *adr)
float fx, fy, vec4[4];
adr[0]= IS_CLIPPED;
- VECCOPY(vec4, vec);
+ copy_v3_v3(vec4, vec);
vec4[3]= 1.0;
mul_m4_v4(rv3d->persmat, vec4);
@@ -851,7 +850,7 @@ void project_float(ARegion *ar, float *vec, float *adr)
float vec4[4];
adr[0]= IS_CLIPPED;
- VECCOPY(vec4, vec);
+ copy_v3_v3(vec4, vec);
vec4[3]= 1.0;
mul_m4_v4(rv3d->persmat, vec4);
@@ -867,7 +866,7 @@ void project_float_noclip(ARegion *ar, float *vec, float *adr)
RegionView3D *rv3d= ar->regiondata;
float vec4[4];
- VECCOPY(vec4, vec);
+ copy_v3_v3(vec4, vec);
vec4[3]= 1.0;
mul_m4_v4(rv3d->persmat, vec4);
@@ -1114,7 +1113,7 @@ static void obmat_to_viewmat(View3D *v3d, RegionView3D *rv3d, Object *ob, short
float orig_ofs[3];
float orig_dist= rv3d->dist;
float orig_lens= v3d->lens;
- VECCOPY(orig_ofs, rv3d->ofs);
+ copy_v3_v3(orig_ofs, rv3d->ofs);
/* Switch from camera view */
mat3_to_quat( new_quat,tmat);
@@ -1122,7 +1121,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 */
@@ -1210,11 +1209,11 @@ void setviewmatrixview3d(Scene *scene, View3D *v3d, RegionView3D *rv3d)
Object *ob= v3d->ob_centre;
float vec[3];
- VECCOPY(vec, ob->obmat[3]);
+ copy_v3_v3(vec, ob->obmat[3]);
if(ob->type==OB_ARMATURE && v3d->ob_centre_bone[0]) {
bPoseChannel *pchan= get_pose_channel(ob->pose, v3d->ob_centre_bone);
if(pchan) {
- VECCOPY(vec, pchan->pose_mat[3]);
+ copy_v3_v3(vec, pchan->pose_mat[3]);
mul_m4_v3(ob->obmat, vec);
}
}
@@ -1351,7 +1350,7 @@ short view3d_opengl_select(ViewContext *vc, unsigned int *buffer, unsigned int b
/* ********************** local view operator ******************** */
-static unsigned int free_localbit(void)
+static unsigned int free_localbit(Main *bmain)
{
unsigned int lay;
ScrArea *sa;
@@ -1361,7 +1360,7 @@ static unsigned int free_localbit(void)
/* sometimes we loose a localview: when an area is closed */
/* check all areas: which localviews are in use? */
- for(sc= G.main->screen.first; sc; sc= sc->id.next) {
+ for(sc= bmain->screen.first; sc; sc= sc->id.next) {
for(sa= sc->areabase.first; sa; sa= sa->next) {
SpaceLink *sl= sa->spacedata.first;
for(; sl; sl= sl->next) {
@@ -1385,61 +1384,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<<bit)) {
- v3d->layact= 1<<bit;
- break;
- }
- }
- }
- }
-}
-
-void ED_view3d_scene_layers_copy(struct View3D *v3d, struct Scene *scene)
-{
- copy_view3d_lock_space(v3d, scene);
-}
-
-void ED_view3d_scene_layers_update(Main *bmain, Scene *scene)
-{
- bScreen *sc;
- ScrArea *sa;
- SpaceLink *sl;
-
- /* from scene copy to the other views */
- for(sc=bmain->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;
@@ -1452,14 +1397,32 @@ int ED_view3d_scene_layer_set(int lay, const int *values)
return lay;
for(i=0; i<20; i++) {
- if(values[i]) lay |= (1<<i);
+
+ if (active) {
+ /* if this value has just been switched on, make that layer active */
+ if (values[i] && (lay & (1<<i))==0) {
+ *active = (1<<i);
+ }
+ }
+
+ if (values[i]) lay |= (1<<i);
else lay &= ~(1<<i);
}
+ /* ensure always an active layer */
+ if (active && (lay & *active)==0) {
+ for(i=0; i<20; i++) {
+ if(lay & (1<<i)) {
+ *active= 1<<i;
+ break;
+ }
+ }
+ }
+
return lay;
}
-static void initlocalview(Scene *scene, ScrArea *sa)
+static void initlocalview(Main *bmain, Scene *scene, ScrArea *sa)
{
View3D *v3d= sa->spacedata.first;
Base *base;
@@ -1471,7 +1434,7 @@ static void initlocalview(Scene *scene, ScrArea *sa)
INIT_MINMAX(min, max);
- locallay= free_localbit();
+ locallay= free_localbit(bmain);
if(locallay==0) {
printf("Sorry, no more than 8 localviews\n"); // XXX error
@@ -1584,8 +1547,8 @@ static void restore_localviewdata(ScrArea *sa, int free)
if(rv3d->localvd) {
rv3d->dist= rv3d->localvd->dist;
- VECCOPY(rv3d->ofs, rv3d->localvd->ofs);
- QUATCOPY(rv3d->viewquat, rv3d->localvd->viewquat);
+ copy_v3_v3(rv3d->ofs, rv3d->localvd->ofs);
+ copy_qt_qt(rv3d->viewquat, rv3d->localvd->viewquat);
rv3d->view= rv3d->localvd->view;
rv3d->persp= rv3d->localvd->persp;
rv3d->camzoom= rv3d->localvd->camzoom;
@@ -1635,7 +1598,7 @@ static int localview_exec(bContext *C, wmOperator *unused)
if(v3d->localvd)
endlocalview(CTX_data_scene(C), CTX_wm_area(C));
else
- initlocalview(CTX_data_scene(C), CTX_wm_area(C));
+ initlocalview(CTX_data_main(C), CTX_data_scene(C), CTX_wm_area(C));
ED_area_tag_redraw(CTX_wm_area(C));
@@ -1773,7 +1736,8 @@ int ED_view3d_context_activate(bContext *C)
ARegion *ar;
RegionView3D *rv3d;
- if(sa->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;
@@ -1820,7 +1784,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);
+ view3d_calc_camera_border(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;
@@ -1847,8 +1811,8 @@ static int game_engine_exec(bContext *C, wmOperator *op)
RestoreState(C);
//XXX restore_all_scene_cfra(scene_cfra_store);
- set_scene_bg(startscene);
- //XXX scene_update_for_newframe(G.scene, G.scene->lay);
+ set_scene_bg(CTX_data_main(C), startscene);
+ //XXX scene_update_for_newframe(bmain, scene, scene->lay);
ED_area_tag_redraw(CTX_wm_area(C));
@@ -2045,7 +2009,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;
@@ -2097,13 +2061,13 @@ static int initFlyInfo (bContext *C, FlyInfo *fly, wmOperator *op, wmEvent *even
/* perspective or ortho */
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_qt_qt(fly->rot_backup, fly->rv3d->viewquat);
+ 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*/
}
@@ -2141,8 +2105,8 @@ static int flyEnd(bContext *C, FlyInfo *fly)
DAG_id_flush_update(&ob_back->id, OB_RECALC_OB);
} else {
/* Non Camera we need to reset the view back to the original location bacause the user canceled*/
- QUATCOPY(rv3d->viewquat, fly->rot_backup);
- VECCOPY(rv3d->ofs, fly->ofs_backup);
+ copy_qt_qt(rv3d->viewquat, fly->rot_backup);
+ copy_v3_v3(rv3d->ofs, fly->ofs_backup);
rv3d->persp= fly->persp_backup;
}
}
@@ -2174,7 +2138,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 */
}
@@ -2262,7 +2226,7 @@ static void flyEvent(FlyInfo *fly, wmEvent *event)
/* impliment WASD keys */
case FLY_MODAL_DIR_FORWARD:
if (fly->speed < 0.0f) fly->speed= -fly->speed; /* flip speed rather then stopping, game like motion */
- else fly->speed += fly->grid; /* increse like mousewheel if were alredy moving in that difection*/
+ else fly->speed += fly->grid; /* increse like mousewheel if were already moving in that difection*/
fly->axis= 2;
break;
case FLY_MODAL_DIR_BACKWARD:
@@ -2317,6 +2281,11 @@ static void flyEvent(FlyInfo *fly, wmEvent *event)
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
@@ -2432,7 +2401,7 @@ static int flyApply(bContext *C, 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*/
@@ -2464,7 +2433,7 @@ static int flyApply(bContext *C, 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*/
@@ -2485,10 +2454,10 @@ static int flyApply(bContext *C, 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;
@@ -2544,7 +2513,7 @@ static int flyApply(bContext *C, 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
@@ -2625,7 +2594,7 @@ static int flyApply(bContext *C, FlyInfo *fly)
/*were not redrawing but we need to update the time else the view will jump */
fly->time_lastdraw= PIL_check_seconds_timer();
/* end drawing */
- VECCOPY(fly->dvec_prev, dvec);
+ copy_v3_v3(fly->dvec_prev, dvec);
}
/* moved to flyEnd() */
@@ -2738,10 +2707,10 @@ void view3d_align_axis_to_vector(View3D *v3d, RegionView3D *rv3d, int axisidx, f
float orig_dist= rv3d->dist;
float orig_lens= v3d->lens;
- VECCOPY(orig_ofs, rv3d->ofs);
+ copy_v3_v3(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..e67771270cf
--- /dev/null
+++ b/source/blender/editors/transform/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_transform "${SRC}" "${INC}")
diff --git a/source/blender/editors/transform/Makefile b/source/blender/editors/transform/Makefile
index 607038b413b..9d23b763cd6 100644
--- a/source/blender/editors/transform/Makefile
+++ b/source/blender/editors/transform/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index 498313838df..a16417b846f 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -33,10 +33,6 @@
#include <math.h>
#include <float.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#ifndef WIN32
#include <unistd.h>
#else
@@ -67,7 +63,6 @@
//#include "BIF_editsima.h"
//#include "BIF_editparticle.h"
-#include "BKE_action.h"
#include "BKE_nla.h"
//#include "BKE_bad_level_calls.h"/* popmenu and error */
#include "BKE_bmesh.h"
@@ -76,8 +71,6 @@
#include "BKE_global.h"
#include "BKE_particle.h"
#include "BKE_pointcache.h"
-#include "BKE_utildefines.h"
-#include "BKE_context.h"
#include "BKE_unit.h"
//#include "BSE_view.h"
@@ -206,17 +199,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};
+
+ 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_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];
}
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];
}
@@ -246,9 +255,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) {
@@ -267,9 +275,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) {
@@ -301,14 +308,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)
{
@@ -334,7 +341,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
@@ -469,6 +476,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)
@@ -493,6 +502,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");
@@ -522,6 +533,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;
}
@@ -702,6 +718,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;
@@ -926,10 +956,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;
@@ -945,10 +971,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;
@@ -1342,17 +1364,17 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
}
}
- /* XXX convert stupid flag to enum */
+ /* convert flag to enum */
switch(t->flag & (T_PROP_EDIT|T_PROP_CONNECTED))
{
case (T_PROP_EDIT|T_PROP_CONNECTED):
- proportional = 2;
+ proportional = PROP_EDIT_CONNECTED;
break;
case T_PROP_EDIT:
- proportional = 1;
+ proportional = PROP_EDIT_ON;
break;
default:
- proportional = 0;
+ proportional = PROP_EDIT_OFF;
}
// If modal, save settings back in scene if not set as operator argument
@@ -1360,14 +1382,17 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
/* save settings if not set in operator */
if (RNA_struct_find_property(op->ptr, "proportional") && !RNA_property_is_set(op->ptr, "proportional")) {
- ts->proportional = proportional;
+ if (t->obedit)
+ ts->proportional = proportional;
+ else
+ ts->proportional_objects = (proportional != PROP_EDIT_OFF);
}
if (RNA_struct_find_property(op->ptr, "proportional_size") && !RNA_property_is_set(op->ptr, "proportional_size")) {
ts->proportional_size = t->prop_size;
}
- if (RNA_struct_find_property(op->ptr, "proportional_editing_falloff") && !RNA_property_is_set(op->ptr, "proportional_editing_falloff")) {
+ if (RNA_struct_find_property(op->ptr, "proportional_edit_falloff") && !RNA_property_is_set(op->ptr, "proportional_edit_falloff")) {
ts->prop_mode = t->prop_mode;
}
@@ -1390,7 +1415,7 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
if (RNA_struct_find_property(op->ptr, "proportional"))
{
RNA_enum_set(op->ptr, "proportional", proportional);
- RNA_enum_set(op->ptr, "proportional_editing_falloff", t->prop_mode);
+ RNA_enum_set(op->ptr, "proportional_edit_falloff", t->prop_mode);
RNA_float_set(op->ptr, "proportional_size", t->prop_size);
}
@@ -1432,6 +1457,7 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
}
}
+/* note: caller needs to free 't' on a 0 return */
int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int mode)
{
int options = 0;
@@ -1925,39 +1951,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) {
@@ -1973,6 +2010,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) {
@@ -1980,10 +2027,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);
@@ -1997,18 +2040,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);
+ }
}
}
}
@@ -2127,21 +2172,19 @@ void initWarp(TransInfo *t)
/* we need min/max in view space */
for(i = 0; i < t->total; i++) {
float center[3];
- VECCOPY(center, t->data[i].center);
+ copy_v3_v3(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 {
- VECCOPY(max, center);
- VECCOPY(min, center);
+ copy_v3_v3(max, center);
+ copy_v3_v3(min, center);
}
}
-
- t->center[0]= (min[0]+max[0])/2.0f;
- t->center[1]= (min[1]+max[1])/2.0f;
- t->center[2]= (min[2]+max[2])/2.0f;
+
+ mid_v3_v3v3(t->center, min, max);
if (max[0] == min[0]) max[0] += 0.1; /* not optimal, but flipping is better than invalid garbage (i.e. division by zero!) */
t->val= (max[0]-min[0])/2.0f; /* t->val is X dimension projected boundbox */
@@ -2186,12 +2229,12 @@ 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 radians for warp */
circumfac = t->values[0];
@@ -2230,7 +2273,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];
@@ -2246,10 +2289,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);
}
@@ -2374,8 +2417,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);
@@ -2554,11 +2597,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);
@@ -2846,7 +2889,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
@@ -2918,9 +2961,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);
@@ -3481,7 +3524,7 @@ void initTilt(TransInfo *t)
t->num.increment = t->snap[1];
- t->flag |= T_NO_CONSTRAINT;
+ t->flag |= T_NO_CONSTRAINT|T_NO_PROJECT;
}
@@ -3672,7 +3715,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);
@@ -4091,7 +4134,7 @@ void initBoneEnvelope(TransInfo *t)
t->num.increment = t->snap[1];
- t->flag |= T_NO_CONSTRAINT;
+ t->flag |= T_NO_CONSTRAINT|T_NO_PROJECT;
}
int BoneEnvelope(TransInfo *t, short mval[2])
@@ -4313,7 +4356,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;
@@ -4467,7 +4510,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);
@@ -4480,7 +4523,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;
@@ -4492,7 +4535,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];
@@ -4514,7 +4557,7 @@ static int createSlideVerts(TransInfo *t)
for (uvlay_idx=0; uvlay_idx<uvlay_tot; uvlay_idx++) {
- uvarray[uvlay_idx] = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+ uvarray[uvlay_idx] = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "createSlideVerts2 gh");
for(ev=em->verts.first;ev;ev=ev->next) {
ev->tmp.l = 0;
@@ -4670,7 +4713,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)
@@ -4736,10 +4779,11 @@ int doEdgeSlide(TransInfo *t, float perc)
//Non prop code
look = vertlist;
while(look) {
- float newlen;
+ float newlen, edgelen;
ev = look->link;
tempsv = BLI_ghash_lookup(vertgh,ev);
- newlen = (len / len_v3v3(editedge_getOtherVert(tempsv->up,ev)->co,editedge_getOtherVert(tempsv->down,ev)->co));
+ edgelen = len_v3v3(editedge_getOtherVert(tempsv->up,ev)->co,editedge_getOtherVert(tempsv->down,ev)->co);
+ newlen = (edgelen != 0.0f)? (len / edgelen): 0.0f;
if(newlen > 1.0) {newlen = 1.0;}
if(newlen < 0.0) {newlen = 0.0;}
if(flip == 0) {
@@ -4840,7 +4884,7 @@ void initBoneRoll(TransInfo *t)
t->num.increment = 1.0f;
- t->flag |= T_NO_CONSTRAINT;
+ t->flag |= T_NO_CONSTRAINT|T_NO_PROJECT;
}
int BoneRoll(TransInfo *t, short mval[2])
@@ -5270,27 +5314,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);
@@ -5300,23 +5344,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 ----------------------- */
@@ -5379,6 +5434,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;
@@ -5387,16 +5443,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];
@@ -5426,7 +5484,7 @@ static void applyTimeTranslate(TransInfo *t, float sval)
}
/* apply nearest snapping */
- doAnimEdit_SnapFrame(t, td, adt, autosnap);
+ doAnimEdit_SnapFrame(t, td, td2d, adt, autosnap);
}
}
@@ -5637,6 +5695,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);
@@ -5644,7 +5703,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)
@@ -5670,7 +5729,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);
}
}
diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index ef13634a6ae..c1e62eb563c 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -151,6 +151,9 @@ typedef struct 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 */
@@ -427,6 +430,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
diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c
index 14d0676786e..1e6916f0a86 100644
--- a/source/blender/editors/transform/transform_constraints.c
+++ b/source/blender/editors/transform/transform_constraints.c
@@ -32,17 +32,12 @@
#include <string.h>
#include <math.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#ifndef WIN32
#include <unistd.h>
#else
#include <io.h>
#endif
-#include "MEM_guardedalloc.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -54,7 +49,6 @@
#include "BIF_glutil.h"
#include "BKE_context.h"
-#include "BKE_global.h"
#include "BKE_utildefines.h"
#include "ED_image.h"
@@ -528,6 +522,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 {
@@ -623,8 +618,10 @@ void drawConstraint(const struct bContext *C, TransInfo *t)
if (tc->mode & CON_SELECT) {
float vec[3];
char col2[3] = {255,255,255};
+ int depth_test_enabled;
+
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);
@@ -632,15 +629,18 @@ void drawConstraint(const struct bContext *C, TransInfo *t)
glColor3ubv((GLubyte *)col2);
- glDisable(GL_DEPTH_TEST);
+ depth_test_enabled = glIsEnabled(GL_DEPTH_TEST);
+ if(depth_test_enabled)
+ glDisable(GL_DEPTH_TEST);
+
setlinestyle(1);
glBegin(GL_LINE_STRIP);
glVertex3fv(tc->center);
glVertex3fv(vec);
glEnd();
setlinestyle(0);
- // TRANSFORM_FIX_ME
- //if(G.vd->zbuf)
+
+ if(depth_test_enabled)
glEnable(GL_DEPTH_TEST);
}
@@ -856,7 +856,7 @@ 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]);
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index f9c537e1c20..5609b7068b3 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -35,8 +35,6 @@
#include <string.h>
#include <math.h>
-#include "MEM_guardedalloc.h"
-
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
#include "DNA_lattice_types.h"
@@ -47,41 +45,30 @@
#include "DNA_sequence_types.h"
#include "DNA_view3d_types.h"
#include "DNA_constraint_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "MEM_guardedalloc.h"
-#include "BKE_anim.h"
#include "BKE_action.h"
#include "BKE_armature.h"
-#include "BKE_blender.h"
-#include "BKE_cloth.h"
#include "BKE_context.h"
#include "BKE_curve.h"
#include "BKE_constraint.h"
#include "BKE_depsgraph.h"
-#include "BKE_displist.h"
-#include "BKE_DerivedMesh.h"
-#include "BKE_effect.h"
-#include "BKE_font.h"
#include "BKE_fcurve.h"
#include "BKE_global.h"
-#include "BKE_lattice.h"
#include "BKE_key.h"
#include "BKE_main.h"
-#include "BKE_mball.h"
-#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_nla.h"
#include "BKE_object.h"
#include "BKE_particle.h"
#include "BKE_sequencer.h"
#include "BKE_pointcache.h"
-#include "BKE_softbody.h"
-#include "BKE_utildefines.h"
#include "BKE_bmesh.h"
-#include "BKE_context.h"
-#include "BKE_report.h"
#include "BKE_scene.h"
-#include "BIF_gl.h"
#include "ED_anim_api.h"
#include "ED_armature.h"
@@ -94,6 +81,7 @@
#include "ED_mesh.h"
#include "ED_types.h"
#include "ED_uvedit.h"
+#include "ED_curve.h" /* for ED_curve_editnurbs */
#include "UI_view2d.h"
@@ -659,7 +647,8 @@ static void bone_children_clear_transflag(int mode, short around, ListBase *lb)
}
}
-/* sets transform flags in the bones, returns total */
+/* sets transform flags in the bones
+ * returns total number of bones with BONE_TRANSFORM */
int count_set_pose_transflags(int *out_mode, short around, Object *ob)
{
bArmature *arm= ob->data;
@@ -1347,12 +1336,14 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
int count=0, countsel=0;
int propmode = t->flag & T_PROP_EDIT;
short hide_handles = (cu->drawflag & CU_HIDE_HANDLES);
-
+ ListBase *nurbs;
+
/* to be sure */
if(cu->editnurb==NULL) return;
/* count total of vertices, check identical as in 2nd loop for making transdata! */
- for(nu= cu->editnurb->first; nu; nu= nu->next) {
+ nurbs= ED_curve_editnurbs(cu);
+ for(nu= nurbs->first; nu; nu= nu->next) {
if(nu->type == CU_BEZIER) {
for(a=0, bezt= nu->bezt; a<nu->pntsu; a++, bezt++) {
if(bezt->hide==0) {
@@ -1388,7 +1379,7 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
invert_m3_m3(smtx, mtx);
td = t->data;
- for(nu= cu->editnurb->first; nu; nu= nu->next) {
+ for(nu= nurbs->first; nu; nu= nu->next) {
if(nu->type == CU_BEZIER) {
TransData *head, *tail;
head = tail = td;
@@ -1541,7 +1532,7 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
static void createTransLatticeVerts(bContext *C, TransInfo *t)
{
- Lattice *latt = ((Lattice*)t->obedit->data)->editlatt;
+ Lattice *latt = ((Lattice*)t->obedit->data)->editlatt->latt;
TransData *td = NULL;
BPoint *bp;
float mtx[3][3], smtx[3][3];
@@ -1772,14 +1763,17 @@ static int connectivity_edge(float mtx[][3], EditVert *v1, EditVert *v2)
float edge_len;
int done = 0;
+ /* note: hidden verts are not being checked for, this assumes
+ * flushing of hidden faces & edges is working right */
+
+ if (v1->f2 + v2->f2 == 4)
+ return 0;
+
sub_v3_v3v3(edge_vec, v1->co, v2->co);
mul_m3_v3(mtx, edge_vec);
edge_len = len_v3(edge_vec);
- if (v1->f2 + v2->f2 == 4)
- return 0;
-
if (v1->f2) {
if (v2->f2) {
if (v2->tmp.fp + edge_len + THRESHOLD < v1->tmp.fp) {
@@ -1845,7 +1839,7 @@ static void editmesh_set_connectivity_distance(EditMesh *em, float mtx[][3])
/* do internal edges for quads */
for(efa= em->faces.first; efa; efa= efa->next) {
- if (efa->v4) {
+ if (efa->v4 && efa->h==0) {
done |= connectivity_edge(mtx, efa->v1, efa->v3);
done |= connectivity_edge(mtx, efa->v2, efa->v4);
}
@@ -2283,7 +2277,7 @@ void flushTransNodes(TransInfo *t)
#define XXX_DURIAN_ANIM_TX_HACK
void flushTransSeq(TransInfo *t)
{
- ListBase *seqbasep= seq_give_editing(t->scene, FALSE)->seqbasep; /* Editing null check alredy done */
+ ListBase *seqbasep= seq_give_editing(t->scene, FALSE)->seqbasep; /* Editing null check already done */
int a, new_frame;
TransData *td= NULL;
TransData2D *td2d= NULL;
@@ -2896,7 +2890,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) {
@@ -2906,7 +2900,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;
}
}
@@ -2972,9 +2966,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;
}
}
@@ -3023,9 +3016,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)
@@ -3033,22 +3027,27 @@ static TransData *FCurveToTransData(TransData *td, FCurve *fcu, AnimData *adt, c
for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
/* only add selected keyframes (for now, proportional edit is not enabled) */
- if (BEZSELECTED(bezt)) {
+ if (bezt->f2 & SELECT) { /* note this MUST match count_fcurve_keys(), so can't use BEZSELECTED() macro */
/* 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;
}
@@ -3116,6 +3115,7 @@ static void createTransActionData(bContext *C, TransInfo *t)
{
Scene *scene= t->scene;
TransData *td = NULL;
+ TransData2D *td2d = NULL;
tGPFtransdata *tfd = NULL;
bAnimContext ac;
@@ -3179,7 +3179,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) {
@@ -3216,7 +3218,7 @@ static void createTransActionData(bContext *C, TransInfo *t)
else
cfra = (float)CFRA;
- td= FCurveToTransData(td, fcu, adt, t->frame_side, cfra);
+ td= ActionFCurveToTransData(td, &td2d, fcu, adt, t->frame_side, cfra);
//}
}
@@ -3248,8 +3250,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])
*
@@ -3280,7 +3287,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;
@@ -3300,9 +3321,10 @@ 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)
@@ -3323,6 +3345,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
BezTriple *bezt;
int count=0, i;
float cfra;
+ float mtx[3][3], smtx[3][3];
/* determine what type of data we are operating on */
if (ANIM_animdata_get_context(C, &ac) == 0)
@@ -3366,7 +3389,7 @@ 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(t->frame_side, bezt->vec[1][0], cfra)) {
- if (sipo->around == V3D_LOCAL) {
+ 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
*/
@@ -3376,6 +3399,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++;
@@ -3403,12 +3435,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)
*/
@@ -3429,23 +3480,34 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
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 */
@@ -3454,7 +3516,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...):
@@ -3700,7 +3762,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);
@@ -3712,6 +3774,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];
+ }
}
}
@@ -4299,7 +4371,11 @@ static void set_trans_object_base_flags(bContext *C, TransInfo *t)
/* if parent selected, deselect */
while(parsel) {
- if(parsel->flag & SELECT) break;
+ if(parsel->flag & SELECT) {
+ Base *parbase = object_in_scene(parsel, scene);
+ if TESTBASELIB_BGMODE(v3d, scene, parbase)
+ break;
+ }
parsel= parsel->parent;
}
@@ -4319,7 +4395,7 @@ static void set_trans_object_base_flags(bContext *C, TransInfo *t)
}
/* all recalc flags get flushed to all layers, so a layer flip later on works fine */
- DAG_scene_flush_update(t->scene, -1, 0);
+ DAG_scene_flush_update(G.main, t->scene, -1, 0);
/* and we store them temporal in base (only used for transform code) */
/* this because after doing updates, the object->recalc is cleared */
@@ -4397,7 +4473,7 @@ static int count_proportional_objects(TransInfo *t)
/* all recalc flags get flushed to all layers, so a layer flip later on works fine */
- DAG_scene_flush_update(t->scene, -1, 0);
+ DAG_scene_flush_update(G.main, t->scene, -1, 0);
/* and we store them temporal in base (only used for transform code) */
/* this because after doing updates, the object->recalc is cleared */
@@ -4421,7 +4497,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);
}
}
@@ -4451,7 +4527,7 @@ void autokeyframe_ob_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *ob,
/* 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, NULL, NULL, active_ks, MODIFYKEY_MODE_INSERT, cfra);
+ ANIM_apply_keyingset(C, &dsources, NULL, active_ks, MODIFYKEY_MODE_INSERT, cfra);
}
else if (IS_AUTOKEY_FLAG(INSERTAVAIL)) {
AnimData *adt= ob->adt;
@@ -4560,9 +4636,9 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *o
ANIM_relative_keyingset_add_source(&dsources, id, &RNA_PoseBone, pchan);
/* only insert into active keyingset? */
- // TODO: move this first case out of the loop
if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && (active_ks)) {
- ANIM_apply_keyingset(C, NULL, 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)) {
@@ -4748,7 +4824,7 @@ 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);
}
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index 8bbeec63155..15e2d32cc94 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -39,7 +39,11 @@
#include "DNA_lattice_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+#include "DNA_meshdata_types.h"
#include "DNA_view3d_types.h"
+#include "DNA_modifier_types.h"
#include "RNA_access.h"
@@ -54,23 +58,14 @@
#include "BKE_animsys.h"
#include "BKE_action.h"
-#include "BKE_anim.h"
#include "BKE_armature.h"
-#include "BKE_cloth.h"
#include "BKE_curve.h"
#include "BKE_depsgraph.h"
#include "BKE_displist.h"
-#include "BKE_depsgraph.h"
#include "BKE_fcurve.h"
-#include "BKE_global.h"
-#include "BKE_group.h"
#include "BKE_lattice.h"
-#include "BKE_key.h"
#include "BKE_mesh.h"
-#include "BKE_modifier.h"
#include "BKE_nla.h"
-#include "BKE_object.h"
-#include "BKE_utildefines.h"
#include "BKE_context.h"
#include "ED_anim_api.h"
@@ -84,6 +79,7 @@
#include "ED_space_api.h"
#include "ED_uvedit.h"
#include "ED_view3d.h"
+#include "ED_curve.h" /* for ED_curve_editnurbs */
//#include "BDR_unwrapper.h"
@@ -189,8 +185,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;
@@ -218,7 +214,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);
}
@@ -636,14 +632,15 @@ void recalcData(TransInfo *t)
if (t->obedit) {
if ELEM(t->obedit->type, OB_CURVE, OB_SURF) {
Curve *cu= t->obedit->data;
- Nurb *nu= cu->editnurb->first;
+ ListBase *nurbs= ED_curve_editnurbs(cu);
+ Nurb *nu= nurbs->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) {
while(nu) {
calchandlesNurb(nu); /* Cant do testhandlesNurb here, it messes up the h1 and h2 flags */
@@ -662,7 +659,7 @@ void recalcData(TransInfo *t)
Lattice *la= t->obedit->data;
DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA); /* sets recalc flags */
- if(la->editlatt->flag & LT_OUTSIDE) outside_lattice(la->editlatt);
+ if(la->editlatt->latt->flag & LT_OUTSIDE) outside_lattice(la->editlatt->latt);
}
else if (t->obedit->type == OB_MESH) {
EditMesh *em = ((Mesh*)t->obedit->data)->edit_mesh;
@@ -810,7 +807,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);
}
}
@@ -960,7 +957,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;
}
@@ -1031,9 +1028,9 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
{
switch(RNA_enum_get(op->ptr, "proportional"))
{
- case 2: /* XXX connected constant */
+ case PROP_EDIT_CONNECTED:
t->flag |= T_PROP_CONNECTED;
- case 1: /* XXX prop on constant */
+ case PROP_EDIT_ON:
t->flag |= T_PROP_EDIT;
break;
}
@@ -1043,11 +1040,19 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
/* use settings from scene only if modal */
if (t->flag & T_MODAL)
{
- if ((t->options & CTX_NO_PET) == 0 && (ts->proportional != PROP_EDIT_OFF)) {
- t->flag |= T_PROP_EDIT;
+ if ((t->options & CTX_NO_PET) == 0)
+ {
+ if (t->obedit && ts->proportional != PROP_EDIT_OFF)
+ {
+ t->flag |= T_PROP_EDIT;
- if(ts->proportional == PROP_EDIT_CONNECTED)
- t->flag |= T_PROP_CONNECTED;
+ if(ts->proportional == PROP_EDIT_CONNECTED)
+ t->flag |= T_PROP_CONNECTED;
+ }
+ else if (t->obedit == NULL && ts->proportional_objects)
+ {
+ t->flag |= T_PROP_EDIT;
+ }
}
}
}
@@ -1068,9 +1073,9 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
t->prop_size = 1.0f;
}
- if (op && RNA_struct_find_property(op->ptr, "proportional_editing_falloff") && RNA_property_is_set(op->ptr, "proportional_editing_falloff"))
+ if (op && RNA_struct_find_property(op->ptr, "proportional_edit_falloff") && RNA_property_is_set(op->ptr, "proportional_edit_falloff"))
{
- t->prop_mode = RNA_enum_get(op->ptr, "proportional_editing_falloff");
+ t->prop_mode = RNA_enum_get(op->ptr, "proportional_edit_falloff");
}
else
{
@@ -1167,6 +1172,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);
@@ -1188,11 +1194,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);
@@ -1276,7 +1294,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 d7ebd28f604..54a86b3dca1 100644
--- a/source/blender/editors/transform/transform_input.c
+++ b/source/blender/editors/transform/transform_input.c
@@ -197,17 +197,17 @@ void InputCustomRatio(TransInfo *t, MouseInput *mi, short mval[2], float output[
mdx = (mi->precision_mval[0] + (float)(mval[0] - mi->precision_mval[0]) / 10.0f) - data[2];
mdy = (mi->precision_mval[1] + (float)(mval[1] - mi->precision_mval[1]) / 10.0f) - data[3];
- distance = (mdx*dx + mdy*dy) / length;
+ distance = (length != 0.0f)? (mdx*dx + mdy*dy) / length: 0.0f;
}
else {
short mdx, mdy;
mdx = mval[0] - data[2];
mdy = mval[1] - data[3];
- distance = (mdx*dx + mdy*dy) / length;
+ distance = (length != 0.0f)? (mdx*dx + mdy*dy) / length: 0.0f;
}
- output[0] = distance / length;
+ output[0] = (length != 0.0f)? distance / length: 0.0f;
}
}
@@ -237,7 +237,7 @@ void InputAngle(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
if( (dx1*dy2-dx2*dy1)>0.0 ) dphi= -dphi;
/* If the angle is zero, because of lack of precision close to the 1.0 value in acos
- * approximate the angle with the oposite side of the normalized triangle
+ * approximate the angle with the opposite side of the normalized triangle
* This is a good approximation here since the smallest acos value seems to be around
* 0.02 degree and lower values don't even have a 0.01% error compared to the approximation
* */
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index b11f35dd363..396cb15e61a 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -51,15 +51,11 @@
#include "RNA_access.h"
#include "BKE_action.h"
-#include "BKE_armature.h"
#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_lattice.h"
#include "BKE_mesh.h"
-#include "BKE_object.h"
#include "BKE_particle.h"
#include "BKE_pointcache.h"
-#include "BKE_utildefines.h"
#include "BLI_math.h"
#include "BLI_editVert.h"
@@ -73,6 +69,7 @@
#include "ED_mesh.h"
#include "ED_particle.h"
#include "ED_view3d.h"
+#include "ED_curve.h" /* for ED_curve_editnurbs */
#include "UI_resources.h"
@@ -122,7 +119,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)
@@ -291,7 +288,7 @@ int calc_manipulator_stats(const bContext *C)
bArmature *arm= obedit->data;
EditBone *ebo;
for (ebo= arm->edbo->first; ebo; ebo=ebo->next){
- if(ebo->layer & arm->layer) {
+ if(ebo->layer & arm->layer && !(ebo->flag & BONE_HIDDEN_A)) {
if (ebo->flag & BONE_TIPSEL) {
calc_tw_center(scene, ebo->tail);
totsel++;
@@ -311,8 +308,9 @@ int calc_manipulator_stats(const bContext *C)
Nurb *nu;
BezTriple *bezt;
BPoint *bp;
+ ListBase *nurbs= ED_curve_editnurbs(cu);
- nu= cu->editnurb->first;
+ nu= nurbs->first;
while(nu) {
if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
@@ -381,9 +379,9 @@ int calc_manipulator_stats(const bContext *C)
BPoint *bp;
Lattice *lt= obedit->data;
- bp= lt->editlatt->def;
+ bp= lt->editlatt->latt->def;
- a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
+ a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
while(a--) {
if(bp->f1 & SELECT) {
calc_tw_center(scene, bp->vec);
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index eba6482c884..10047c5a0f7 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -32,7 +32,6 @@
#include "BLI_math.h"
-#include "BKE_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
@@ -61,6 +60,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";
@@ -75,6 +75,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);
@@ -91,6 +92,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},
@@ -278,7 +280,7 @@ static int transformops_data(bContext *C, wmOperator *op, wmEvent *event)
int retval = 1;
if (op->customdata == NULL)
{
- TransInfo *t = MEM_callocN(sizeof(TransInfo), "TransInfo data");
+ TransInfo *t = MEM_callocN(sizeof(TransInfo), "TransInfo data2");
TransformModeItem *tmode;
int mode = -1;
@@ -300,7 +302,12 @@ static int transformops_data(bContext *C, wmOperator *op, wmEvent *event)
G.moving = 1;
/* store data */
- op->customdata = t;
+ if(retval) {
+ op->customdata = t;
+ }
+ else {
+ MEM_freeN(t);
+ }
}
return retval; /* return 0 on error */
@@ -389,15 +396,20 @@ void Transform_Properties(struct wmOperatorType *ot, int flags)
{
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");
+
}
if (flags & P_CONSTRAINT)
{
- RNA_def_boolean_vector(ot->srna, "constraint_axis", 3, NULL, "Constraint Axis", "");
+ 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 (flags & P_MIRROR)
@@ -409,28 +421,33 @@ void Transform_Properties(struct wmOperatorType *ot, int flags)
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_enum(ot->srna, "proportional_edit_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)
{
- RNA_def_boolean(ot->srna, "snap", 0, "Use Snapping Options", "");
+ prop= RNA_def_boolean(ot->srna, "snap", 0, "Use Snapping Options", "");
+ RNA_def_property_flag(prop, PROP_HIDDEN);
if (flags & P_GEO_SNAP) {
- 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);
-
+ 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) {
- 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);
+ 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);
}
}
}
// 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);
+ RNA_def_property_flag(prop, PROP_HIDDEN);
}
void TRANSFORM_OT_translate(struct wmOperatorType *ot)
@@ -448,7 +465,7 @@ void TRANSFORM_OT_translate(struct wmOperatorType *ot)
ot->cancel = transform_cancel;
ot->poll = ED_operator_areaactive;
- RNA_def_float_vector(ot->srna, "value", 3, NULL, -FLT_MAX, FLT_MAX, "Vector", "", -FLT_MAX, FLT_MAX);
+ RNA_def_float_vector_xyz(ot->srna, "value", 3, NULL, -FLT_MAX, FLT_MAX, "Vector", "", -FLT_MAX, FLT_MAX);
Transform_Properties(ot, P_CONSTRAINT|P_PROPORTIONAL|P_MIRROR|P_ALIGN_SNAP);
}
@@ -579,6 +596,26 @@ void TRANSFORM_OT_shear(struct wmOperatorType *ot)
// XXX Shear axis?
}
+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)
{
/* identifiers */
@@ -814,7 +851,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);
@@ -892,7 +929,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 d509ce97015..210ab0d45a8 100644
--- a/source/blender/editors/transform/transform_orientations.c
+++ b/source/blender/editors/transform/transform_orientations.c
@@ -34,7 +34,6 @@
#include "DNA_screen_types.h"
#include "DNA_view3d_types.h"
-#include "BKE_global.h"
#include "BKE_utildefines.h"
#include "BKE_armature.h"
#include "BKE_context.h"
@@ -51,6 +50,7 @@
#include "ED_armature.h"
#include "ED_mesh.h"
+#include "ED_curve.h" /* for ED_curve_editnurbs */
#include "RNA_define.h"
@@ -517,6 +517,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 */
@@ -725,7 +726,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
for (eve = em->verts.first; eve; eve = eve->next)
{
if ( eve->f & SELECT ) {
- add_v3_v3v3(normal, normal, eve->no);
+ add_v3_v3(normal, eve->no);
}
}
normalize_v3(normal);
@@ -739,8 +740,9 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
Nurb *nu;
BezTriple *bezt;
int a;
-
- for (nu = cu->editnurb->first; nu; nu = nu->next)
+ ListBase *nurbs= ED_curve_editnurbs(cu);
+
+ for (nu = nurbs->first; nu; nu = nu->next)
{
/* only bezier has a normal */
if(nu->type == CU_BEZIER)
@@ -832,10 +834,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]);
}
}
}
@@ -875,8 +877,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 b49e1b05de3..778698d3060 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -36,6 +36,7 @@
#include "DNA_armature_types.h"
#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
#include "DNA_meshdata_types.h" // Temporary, for snapping to other unselected meshes
#include "DNA_space_types.h"
#include "DNA_screen_types.h"
@@ -53,15 +54,12 @@
//#include "editmesh.h"
//#include "BIF_editsima.h"
#include "BIF_gl.h"
-#include "BIF_glutil.h"
//#include "BIF_mywindow.h"
//#include "BIF_screen.h"
//#include "BIF_editsima.h"
//#include "BIF_drawimage.h"
//#include "BIF_editmesh.h"
-#include "BKE_global.h"
-#include "BKE_utildefines.h"
#include "BKE_DerivedMesh.h"
#include "BKE_object.h"
#include "BKE_anim.h" /* for duplis */
@@ -279,7 +277,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);
@@ -442,9 +440,9 @@ void initSnapping(TransInfo *t, wmOperator *op)
normalize_v3(t->tsnap.snapNormal);
}
- if (RNA_struct_find_property(op->ptr, "snap_project"))
+ if (RNA_struct_find_property(op->ptr, "use_snap_project"))
{
- t->tsnap.project = RNA_boolean_get(op->ptr, "snap_project");
+ t->tsnap.project = RNA_boolean_get(op->ptr, "use_snap_project");
}
}
}
@@ -912,7 +910,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);
@@ -1030,7 +1028,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);
@@ -1730,7 +1728,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);
@@ -1760,7 +1758,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);
@@ -1897,26 +1895,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/Makefile b/source/blender/editors/util/Makefile
index 303079daeee..8535b3fb402 100644
--- a/source/blender/editors/util/Makefile
+++ b/source/blender/editors/util/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c
index 19bd18ade1f..0d3d8a48b60 100644
--- a/source/blender/editors/util/ed_util.c
+++ b/source/blender/editors/util/ed_util.c
@@ -38,11 +38,11 @@
#include "BLI_editVert.h"
#include "BKE_context.h"
-#include "BKE_global.h"
#include "BKE_main.h"
#include "ED_armature.h"
#include "ED_mesh.h"
+#include "ED_object.h"
#include "ED_sculpt.h"
#include "ED_util.h"
@@ -50,16 +50,43 @@
/* ********* 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)
{
+ Main *bmain= CTX_data_main(C);
Scene *sce;
+
+ if(!bmain)
+ return;
/* frees all editmode undos */
undo_editmode_clear();
ED_undo_paint_free();
- for(sce=G.main->scene.first; sce; sce= sce->id.next) {
+ for(sce=bmain->scene.first; sce; sce= sce->id.next) {
if(sce->obedit) {
Object *ob= sce->obedit;
diff --git a/source/blender/editors/util/editmode_undo.c b/source/blender/editors/util/editmode_undo.c
index 8597454fdb5..290c8a64881 100644
--- a/source/blender/editors/util/editmode_undo.c
+++ b/source/blender/editors/util/editmode_undo.c
@@ -40,12 +40,10 @@
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h"
-#include "BKE_object.h"
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
-#include "BKE_utildefines.h"
#include "ED_mesh.h"
@@ -76,7 +74,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 a5c0bfeb73a..868aa8ac6af 100644
--- a/source/blender/editors/util/numinput.c
+++ b/source/blender/editors/util/numinput.c
@@ -30,8 +30,6 @@
#include <math.h> /* fabs */
#include <stdio.h> /* for sprintf */
-#include "BKE_global.h" /* for G */
-#include "BKE_utildefines.h" /* ABS */
#include "WM_types.h"
diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c
index 636ce9dcec5..283e2b49f0d 100644
--- a/source/blender/editors/util/undo.c
+++ b/source/blender/editors/util/undo.c
@@ -38,16 +38,11 @@
#include "BKE_blender.h"
#include "BKE_context.h"
-#include "BKE_depsgraph.h"
-#include "BKE_global.h"
-#include "BKE_object.h"
-#include "BKE_text.h"
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_dynstr.h"
-#include "BKE_utildefines.h"
#include "ED_armature.h"
#include "ED_particle.h"
@@ -116,7 +111,9 @@ static int ed_undo_step(bContext *C, int step, const char *undoname)
SpaceImage *sima= (SpaceImage *)sa->spacedata.first;
if((obact && obact->mode & OB_MODE_TEXTURE_PAINT) || sima->flag & SI_DRAWTOOL) {
- ED_undo_paint_step(C, UNDO_PAINT_IMAGE, step);
+ if(!ED_undo_paint_step(C, UNDO_PAINT_IMAGE, step, undoname) && undoname)
+ if(U.uiflag & USER_GLOBALUNDO)
+ BKE_undo_name(C, undoname);
WM_event_add_notifier(C, NC_WINDOW, NULL);
return OPERATOR_FINISHED;
@@ -139,10 +136,14 @@ static int ed_undo_step(bContext *C, int step, const char *undoname)
else {
int do_glob_undo= 0;
- if(obact && obact->mode & OB_MODE_TEXTURE_PAINT)
- ED_undo_paint_step(C, UNDO_PAINT_IMAGE, step);
- else if(obact && obact->mode & OB_MODE_SCULPT)
- ED_undo_paint_step(C, UNDO_PAINT_MESH, step);
+ if(obact && obact->mode & OB_MODE_TEXTURE_PAINT) {
+ if(!ED_undo_paint_step(C, UNDO_PAINT_IMAGE, step, undoname) && undoname)
+ do_glob_undo= 1;
+ }
+ else if(obact && obact->mode & OB_MODE_SCULPT) {
+ if(!ED_undo_paint_step(C, UNDO_PAINT_MESH, step, undoname) && undoname)
+ do_glob_undo= 1;
+ }
else if(obact && obact->mode & OB_MODE_PARTICLE_EDIT) {
if(step==1)
PE_undo(CTX_data_scene(C));
diff --git a/source/blender/editors/uvedit/CMakeLists.txt b/source/blender/editors/uvedit/CMakeLists.txt
new file mode 100644
index 00000000000..297863b2a9f
--- /dev/null
+++ b/source/blender/editors/uvedit/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/opennl/extern
+ ../../makesdna
+ ../../makesrna
+ ../../windowmanager
+)
+
+BLENDERLIB(bf_editor_uvedit "${SRC}" "${INC}")
diff --git a/source/blender/editors/uvedit/Makefile b/source/blender/editors/uvedit/Makefile
index d589bbec3bc..e4b9ae72ccb 100644
--- a/source/blender/editors/uvedit/Makefile
+++ b/source/blender/editors/uvedit/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) 2007 Blender Foundation
# All rights reserved.
diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c
index e3bf1e83247..f1f2dd8548a 100644
--- a/source/blender/editors/uvedit/uvedit_draw.c
+++ b/source/blender/editors/uvedit/uvedit_draw.c
@@ -35,10 +35,8 @@
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
-#include "BKE_customdata.h"
#include "BKE_DerivedMesh.h"
#include "BKE_mesh.h"
-#include "BKE_object.h"
#include "BKE_utildefines.h"
#include "BLI_math.h"
@@ -839,12 +837,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_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index bae8d4b7fcf..cd58ac4a482 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -48,7 +48,6 @@
#include "BKE_library.h"
#include "BKE_mesh.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
#include "ED_image.h"
#include "ED_mesh.h"
@@ -108,7 +107,7 @@ void ED_uvedit_assign_image(Scene *scene, Object *obedit, Image *ima, Image *pre
/* ensure we have a uv layer */
if(!CustomData_has_layer(&em->fdata, CD_MTFACE)) {
- EM_add_data_layer(em, &em->fdata, CD_MTFACE);
+ EM_add_data_layer(em, &em->fdata, CD_MTFACE, NULL);
update= 1;
}
@@ -3241,7 +3240,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, 1);
+ ED_object_generic_keymap(keyconf, keymap, 2);
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 dbc04f85497..259b7a95492 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -3190,11 +3190,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);
@@ -3203,11 +3203,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);
@@ -4027,7 +4027,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)
@@ -4047,7 +4047,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;
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index 2948592daf8..20c9fa5877b 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -41,10 +41,8 @@
#include "BKE_context.h"
#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
-#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_mesh.h"
-#include "BKE_utildefines.h"
#include "BLI_math.h"
#include "BLI_edgehash.h"
@@ -86,7 +84,7 @@ static int ED_uvedit_ensure_uvs(bContext *C, Scene *scene, Object *obedit)
}
if(em && em->faces.first)
- EM_add_data_layer(em, &em->fdata, CD_MTFACE);
+ EM_add_data_layer(em, &em->fdata, CD_MTFACE, NULL);
if(!ED_uvedit_test(obedit)) {
BKE_mesh_end_editmesh(obedit->data, em);
@@ -410,7 +408,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;
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index 28dd4911ffd..126cddf852f 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -27,9 +27,13 @@
FILE(GLOB SRC intern/*.c)
SET(INC
- . ../blenlib ../blenkernel ../makesdna ../include
+ . ../blenlib ../blenkernel ../makesdna ../makesrna ../include
../../../extern/glew/include ../../../intern/guardedalloc ../../../intern/smoke/extern ../imbuf)
+IF(WIN32)
+ INCLUDE_DIRECTORIES(${PTHREADS_INC})
+ENDIF(WIN32)
+
ADD_DEFINITIONS(-DGLEW_STATIC)
BLENDERLIB(bf_gpu "${SRC}" "${INC}")
diff --git a/source/blender/gpu/gpu_buffers.h b/source/blender/gpu/GPU_buffers.h
index 98cefa7a696..6f552e087d7 100644
--- a/source/blender/gpu/gpu_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -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 );
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 6b98ffdede7..a7f43d3b0ae 100644
--- a/source/blender/gpu/GPU_extensions.h
+++ b/source/blender/gpu/GPU_extensions.h
@@ -61,7 +61,7 @@ int GPU_print_error(char *str);
int GPU_glsl_support(void);
int GPU_non_power_of_two_support(void);
-int GPU_24bit_color_support(void);
+int GPU_color_depth(void);
/* GPU Types */
@@ -75,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);
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index 63baeb99b5d..e0602c20272 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -158,7 +158,7 @@ int GPU_lamp_has_shadow_buffer(GPULamp *lamp);
void GPU_lamp_shadow_buffer_bind(GPULamp *lamp, float viewmat[][4], int *winsize, float winmat[][4]);
void GPU_lamp_shadow_buffer_unbind(GPULamp *lamp);
-void GPU_lamp_update(GPULamp *lamp, int lay, float obmat[][4]);
+void GPU_lamp_update(GPULamp *lamp, int lay, int hide, float obmat[][4]);
void GPU_lamp_update_colors(GPULamp *lamp, float r, float g, float b, float energy);
int GPU_lamp_shadow_layer(GPULamp *lamp);
diff --git a/source/blender/gpu/Makefile b/source/blender/gpu/Makefile
index b9bde147115..eaa8a69bfdd 100644
--- a/source/blender/gpu/Makefile
+++ b/source/blender/gpu/Makefile
@@ -18,7 +18,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/gpu/SConscript b/source/blender/gpu/SConscript
index 98f57f336ab..4f1cdc2ce76 100644
--- a/source/blender/gpu/SConscript
+++ b/source/blender/gpu/SConscript
@@ -8,6 +8,9 @@ defs = [ 'GLEW_STATIC' ]
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/Makefile b/source/blender/gpu/intern/Makefile
index 2637bff44ac..088b56edbab 100644
--- a/source/blender/gpu/intern/Makefile
+++ b/source/blender/gpu/intern/Makefile
@@ -18,7 +18,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/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 74bef43e928..5bddb42add2 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -38,17 +38,17 @@
#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"
#include "BKE_DerivedMesh.h"
-#include "BKE_utildefines.h"
#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 +82,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 +134,38 @@ 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);
+ /* if we are releasing the global pool, stop keeping a reference to it */
+ if (pool == globalPool)
+ globalPool = NULL;
+}
+
+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 +233,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 +243,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-- ) {
@@ -459,7 +477,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) {
@@ -586,7 +604,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) {
@@ -1515,8 +1533,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 a3196f5125b..d596f573682 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -36,7 +36,6 @@
#include "DNA_customdata_types.h"
#include "DNA_image_types.h"
-#include "DNA_listBase.h"
#include "DNA_material_types.h"
#include "BLI_dynstr.h"
@@ -44,8 +43,6 @@
#include "BLI_ghash.h"
#include "BLI_heap.h"
-#include "BKE_global.h"
-#include "BKE_utildefines.h"
#include "GPU_material.h"
#include "GPU_extensions.h"
@@ -352,7 +349,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 +477,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) {
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index f00126a7fab..798bf5f86ff 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -36,7 +36,6 @@
#include "BLI_math.h"
-#include "DNA_image_types.h"
#include "DNA_lamp_types.h"
#include "DNA_material_types.h"
#include "DNA_meshdata_types.h"
@@ -45,7 +44,6 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_smoke_types.h"
-#include "DNA_userdef_types.h"
#include "DNA_view3d_types.h"
#include "MEM_guardedalloc.h"
@@ -62,9 +60,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"
@@ -781,8 +783,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 +854,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->source, IMA_SRC_SEQUENCE, IMA_SRC_MOVIE))
+ GPU_free_image(ima);
+}
+
/* OpenGL Materials */
#define FIXEDMAT 8
@@ -1097,6 +1147,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 */
diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c
index d53b8e67c56..fa8ff7a6354 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -32,18 +32,13 @@
#include "GL/glew.h"
-#include "DNA_listBase.h"
#include "DNA_image_types.h"
-#include "DNA_userdef_types.h"
#include "MEM_guardedalloc.h"
-#include "BKE_image.h"
#include "BKE_global.h"
#include "BKE_utildefines.h"
-#include "IMB_imbuf.h"
-#include "IMB_imbuf_types.h"
#include "BLI_blenlib.h"
@@ -71,7 +66,7 @@ static struct GPUGlobal {
GLuint currentfb;
int glslsupport;
int extdisabled;
- int color24bit;
+ int colordepth;
GPUDeviceType device;
GPUOSType os;
GPUDriverType driver;
@@ -93,7 +88,7 @@ void GPU_extensions_disable()
void GPU_extensions_init()
{
- GLint bits;
+ GLint r, g, b;
const char *vendor, *renderer;
glewInit();
@@ -108,9 +103,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, &bits);
- GG.color24bit = (bits >= 8);
-
+ 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);
@@ -122,7 +119,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;
}
@@ -147,8 +147,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;
@@ -175,9 +175,9 @@ int GPU_non_power_of_two_support()
return GLEW_ARB_texture_non_power_of_two;
}
-int GPU_24bit_color_support()
+int GPU_color_depth()
{
- return GG.color24bit;
+ return GG.colordepth;
}
int GPU_print_error(char *str)
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index c81ddd6a770..5f8015be52f 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -34,14 +34,10 @@
#include "MEM_guardedalloc.h"
-#include "DNA_image_types.h"
#include "DNA_lamp_types.h"
-#include "DNA_listBase.h"
#include "DNA_material_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
-#include "DNA_texture_types.h"
-#include "DNA_view3d_types.h"
#include "DNA_world_types.h"
#include "BKE_anim.h"
@@ -103,7 +99,7 @@ struct GPULamp {
Object *par;
Lamp *la;
- int type, mode, lay;
+ int type, mode, lay, hide;
float dynenergy, dyncol[3];
float energy, col[3];
@@ -256,7 +252,7 @@ void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double tim
for(nlink=material->lamps.first; nlink; nlink=nlink->next) {
lamp= nlink->data;
- if((lamp->lay & viewlay) && (!(lamp->mode & LA_LAYER) || (lamp->lay & oblay))) {
+ if(!lamp->hide && (lamp->lay & viewlay) && (!(lamp->mode & LA_LAYER) || (lamp->lay & oblay))) {
lamp->dynenergy = lamp->energy;
VECCOPY(lamp->dyncol, lamp->col);
}
@@ -1004,6 +1000,10 @@ static void do_material_tex(GPUShadeInput *shi)
else
GPU_link(mat, "set_value_one", &tin);
}
+
+ if(tex->type==TEX_IMAGE)
+ if(mat->scene->r.color_mgt_flag & R_COLOR_MANAGEMENT)
+ GPU_link(mat, "srgb_to_linearrgb", tcol, &tcol);
if(mtex->mapto & MAP_COL) {
GPUNodeLink *colfac;
@@ -1244,6 +1244,9 @@ void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr)
mat->obcolalpha = 1;
GPU_link(mat, "shade_alpha_obcolor", shr->combined, GPU_builtin(GPU_OBCOLOR), &shr->combined);
}
+
+ if(mat->scene->r.color_mgt_flag & R_COLOR_MANAGEMENT)
+ GPU_link(mat, "linearrgb_to_srgb", shr->combined, &shr->combined);
}
GPUNodeLink *GPU_blender_material(GPUMaterial *mat, Material *ma)
@@ -1310,11 +1313,12 @@ void GPU_materials_free()
/* Lamps and shadow buffers */
-void GPU_lamp_update(GPULamp *lamp, int lay, float obmat[][4])
+void GPU_lamp_update(GPULamp *lamp, int lay, int hide, float obmat[][4])
{
float mat[4][4];
lamp->lay = lay;
+ lamp->hide = hide;
copy_m4_m4(mat, obmat);
normalize_m4(mat);
@@ -1355,7 +1359,7 @@ static void gpu_lamp_from_blender(Scene *scene, Object *ob, Object *par, Lamp *l
lamp->col[1]= la->g*lamp->energy;
lamp->col[2]= la->b*lamp->energy;
- GPU_lamp_update(lamp, ob->lay, ob->obmat);
+ GPU_lamp_update(lamp, ob->lay, (ob->restrictflag & OB_RESTRICT_RENDER), ob->obmat);
lamp->spotsi= la->spotsize;
if(lamp->mode & LA_HALO)
diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl b/source/blender/gpu/intern/gpu_shader_material.glsl
index c824e755afc..cfd35f59478 100644
--- a/source/blender/gpu/intern/gpu_shader_material.glsl
+++ b/source/blender/gpu/intern/gpu_shader_material.glsl
@@ -75,6 +75,38 @@ void hsv_to_rgb(vec4 hsv, out vec4 outcol)
outcol = vec4(rgb, hsv.w);
}
+float srgb_to_linearrgb(float c)
+{
+ if(c < 0.04045)
+ return (c < 0.0)? 0.0: c * (1.0/12.92);
+ else
+ return pow((c + 0.055)*(1.0/1.055), 2.4);
+}
+
+float linearrgb_to_srgb(float c)
+{
+ if(c < 0.0031308)
+ return (c < 0.0)? 0.0: c * 12.92;
+ else
+ return 1.055 * pow(c, 1.0/2.4) - 0.055;
+}
+
+void srgb_to_linearrgb(vec4 col_from, out vec4 col_to)
+{
+ col_to.r = srgb_to_linearrgb(col_from.r);
+ col_to.g = srgb_to_linearrgb(col_from.g);
+ col_to.b = srgb_to_linearrgb(col_from.b);
+ col_to.a = col_from.a;
+}
+
+void linearrgb_to_srgb(vec4 col_from, out vec4 col_to)
+{
+ col_to.r = linearrgb_to_srgb(col_from.r);
+ col_to.g = linearrgb_to_srgb(col_from.g);
+ col_to.b = linearrgb_to_srgb(col_from.b);
+ col_to.a = col_from.a;
+}
+
#define M_PI 3.14159265358979323846
/*********** SHADER NODES ***************/
diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl.c b/source/blender/gpu/intern/gpu_shader_material.glsl.c
index 920cd16c369..e996578dc89 100644
--- a/source/blender/gpu/intern/gpu_shader_material.glsl.c
+++ b/source/blender/gpu/intern/gpu_shader_material.glsl.c
@@ -1,192 +1,214 @@
/* DataToC output of file <gpu_shader_material_glsl> */
-int datatoc_gpu_shader_material_glsl_size= 33537;
+int datatoc_gpu_shader_material_glsl_size= 34245;
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,
+ 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,102,108,111, 97,116, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,102,108,
+111, 97,116, 32, 99, 41, 10,123, 10, 9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 52, 48, 52, 53, 41, 10, 9, 9,114,101,116,117,
+114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 40, 49, 46, 48, 47, 49, 50, 46, 57,
+ 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,114,101,116,117,114,110, 32,112,111,119, 40, 40, 99, 32, 43, 32, 48, 46, 48, 53,
+ 53, 41, 42, 40, 49, 46, 48, 47, 49, 46, 48, 53, 53, 41, 44, 32, 50, 46, 52, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,108,
+105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10, 9,105,102, 40,
+ 99, 32, 60, 32, 48, 46, 48, 48, 51, 49, 51, 48, 56, 41, 10, 9, 9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48,
+ 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 49, 50, 46, 57, 50, 59, 10, 9,101,108,115,101, 10, 9, 9,114,101,116,117,114,
+110, 32, 49, 46, 48, 53, 53, 32, 42, 32,112,111,119, 40, 99, 44, 32, 49, 46, 48, 47, 50, 46, 52, 41, 32, 45, 32, 48, 46, 48, 53,
+ 53, 59, 10,125, 10, 10,118,111,105,100, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,118,101, 99,
+ 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10, 9,
+ 99,111,108, 95,116,111, 46,114, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108,
+ 95,102,114,111,109, 46,114, 41, 59, 10, 9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,
+110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 98, 32, 61,
+ 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10,
+ 9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,
+108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109, 44,
+ 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10, 9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,
+108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10, 9,
+ 99,111,108, 95,116,111, 46,103, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108,
+ 95,102,114,111,109, 46,103, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,
+116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 97, 32, 61,
+ 32, 99,111,108, 95,102,114,111,109, 46, 97, 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, 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,
- 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,
+ 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,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,
+ 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,
diff --git a/source/blender/ikplugin/Makefile b/source/blender/ikplugin/Makefile
index 370ed418464..28726586cc8 100644
--- a/source/blender/ikplugin/Makefile
+++ b/source/blender/ikplugin/Makefile
@@ -12,7 +12,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/ikplugin/intern/Makefile b/source/blender/ikplugin/intern/Makefile
index 0c54e5d1264..352ab90df9d 100644
--- a/source/blender/ikplugin/intern/Makefile
+++ b/source/blender/ikplugin/intern/Makefile
@@ -12,7 +12,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/ikplugin/intern/ikplugin_api.c b/source/blender/ikplugin/intern/ikplugin_api.c
index fe9d116c8ca..cdc4ee11518 100644
--- a/source/blender/ikplugin/intern/ikplugin_api.c
+++ b/source/blender/ikplugin/intern/ikplugin_api.c
@@ -27,7 +27,6 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "MEM_guardedalloc.h"
#include "BIK_api.h"
#include "BLI_blenlib.h"
diff --git a/source/blender/imbuf/CMakeLists.txt b/source/blender/imbuf/CMakeLists.txt
index 9cb98c258de..49886bdc46f 100644
--- a/source/blender/imbuf/CMakeLists.txt
+++ b/source/blender/imbuf/CMakeLists.txt
@@ -28,22 +28,35 @@ 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(WITH_OPENEXR)
+IF(WIN32)
+ SET(INC ${INC} ${PTHREADS_INC})
+ENDIF(WIN32)
+
+IF(WITH_IMAGE_OPENEXR)
ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_OPENEXR)
+ENDIF(WITH_IMAGE_OPENEXR)
+
+IF(WITH_IMAGE_TIFF)
+ SET(INC ${INC} ${TIFF_INCLUDE_DIR})
+ ADD_DEFINITIONS(-DWITH_TIFF)
+ENDIF(WITH_IMAGE_TIFF)
-IF(WITH_OPENJPEG)
+IF(WITH_IMAGE_OPENJPEG)
+ SET(INC ${INC} ${OPENJPEG_INC})
ADD_DEFINITIONS(-DWITH_OPENJPEG)
-ENDIF(WITH_OPENJPEG)
+ENDIF(WITH_IMAGE_OPENJPEG)
IF(WITH_QUICKTIME)
SET(INC ${INC} ../quicktime ${QUICKTIME_INC})
@@ -55,9 +68,16 @@ IF(WITH_FFMPEG)
ADD_DEFINITIONS(-DWITH_FFMPEG)
ENDIF(WITH_FFMPEG)
-IF(WITH_DDS)
+IF(WITH_IMAGE_DDS)
ADD_DEFINITIONS(-DWITH_DDS)
-ENDIF(WITH_DDS)
+ENDIF(WITH_IMAGE_DDS)
+
+IF(WITH_IMAGE_CINEON)
+ ADD_DEFINITIONS(-DWITH_CINEON)
+ENDIF(WITH_IMAGE_CINEON)
+
+IF(WITH_IMAGE_HDR)
+ ADD_DEFINITIONS(-DWITH_HDR)
+ENDIF(WITH_IMAGE_HDR)
BLENDERLIB(bf_imbuf "${SRC}" "${INC}")
-#env.BlenderLib ( libname = 'bf_imbuf', sources = sources, includes = Split(incs), defines = defs, libtype=['core','player'], priority = [80, 40] )
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index 14c58496352..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
- */
-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
+ * @attention Defined in allocimbuf.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,37 +130,33 @@ 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);
-/**
- *
- * @attention Defined in allocimbuf.c
- */
-struct ImBuf *IMB_dupImBuf(struct ImBuf *ibuf1);
+void IMB_free_cache_limiter(void);
/**
*
* @attention Defined in allocimbuf.c
*/
-short addzbufImBuf(struct ImBuf * ibuf);
-short addzbuffloatImBuf(struct ImBuf * ibuf);
+struct ImBuf *IMB_dupImBuf(struct ImBuf *ibuf1);
/**
*
* @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);
/**
*
@@ -318,30 +245,34 @@ 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);
+struct ImBuf *IMB_getmipmap(struct ImBuf *ibuf, int level);
/**
*
- * @attention Defined in filter.c
+ * @attention Defined in cache.c
*/
-void IMB_filtery(struct ImBuf *ibuf);
+
+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);
/**
*
- * @attention Defined in scaling.c
+ * @attention Defined in filter.c
*/
-struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1);
+void IMB_filtery(struct ImBuf *ibuf);
/**
*
* @attention Defined in scaling.c
*/
-struct ImBuf *IMB_scaleImBuf(struct ImBuf * ibuf, short newx, short newy);
+struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1);
/**
*
* @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,18 +330,6 @@ void IMB_float_from_rect(struct ImBuf *ibuf);
* @attention Defined in imageprocess.c
*/
void IMB_convert_rgba_to_abgr(struct ImBuf *ibuf);
-/**
- *
- * @attention defined in imageprocess.c
- */
-void bicubic_interpolation(struct ImBuf *in, struct ImBuf *out, float u, float v, int xout, int yout);
-void neareast_interpolation(struct ImBuf *in, struct ImBuf *out, float u, float v, int xout, int yout);
-void bilinear_interpolation(struct ImBuf *in, struct ImBuf *out, float u, float v, int xout, int yout);
-
-void bicubic_interpolation_color(struct ImBuf *in, unsigned char *col, float *col_float, float u, float v);
-void neareast_interpolation_color(struct ImBuf *in, unsigned char *col, float *col_float, float u, float v);
-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
@@ -420,11 +341,16 @@ void IMB_convert_bgra_to_rgba(int size, unsigned int *rect);
/**
*
- * @attention defined in scaling.c
+ * @attention defined in imageprocess.c
*/
-struct ImBuf *IMB_scalefastfieldImBuf(struct ImBuf *ibuf,
- short newx,
- short newy);
+void bicubic_interpolation(struct ImBuf *in, struct ImBuf *out, float u, float v, int xout, int yout);
+void neareast_interpolation(struct ImBuf *in, struct ImBuf *out, float u, float v, int xout, int yout);
+void bilinear_interpolation(struct ImBuf *in, struct ImBuf *out, float u, float v, int xout, int yout);
+
+void bicubic_interpolation_color(struct ImBuf *in, unsigned char *col, float *col_float, float u, float v);
+void neareast_interpolation_color(struct ImBuf *in, unsigned char *col, float *col_float, float u, float v);
+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);
/**
*
@@ -480,66 +406,21 @@ 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..203a7268581 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 <stdio.h> /* 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 */
-
- 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 */
+
+ /* 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 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)
@@ -171,16 +173,22 @@ typedef enum {
#define QUICKTIME (1 << 25)
#endif
+#ifdef WITH_HDR
#define RADHDR (1 << 24)
+#endif
+#ifdef WITH_TIFF
#define TIF (1 << 23)
#define TIF_16BIT (1 << 8 )
+#endif
#define OPENEXR (1 << 22)
#define OPENEXR_HALF (1 << 8 )
#define OPENEXR_COMPRESS (7)
+#ifdef WITH_CINEON
#define CINEON (1 << 21)
#define DPX (1 << 20)
+#endif
#ifdef WITH_DDS
#define DDS (1 << 19)
@@ -188,11 +196,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 +211,20 @@ 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
-/**@}*/
+extern const char *imb_ext_image[];
+extern const char *imb_ext_image_qt[];
+extern const char *imb_ext_movie[];
+extern const char *imb_ext_audio[];
-/** \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 165accc9e17..9248b768cb6 100644
--- a/source/blender/imbuf/IMB_thumbs.h
+++ b/source/blender/imbuf/IMB_thumbs.h
@@ -50,13 +50,14 @@ 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* path, 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* path, ThumbSize size);
@@ -70,6 +71,10 @@ 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/Makefile b/source/blender/imbuf/Makefile
index cc9b56b3cd8..78eea89173f 100644
--- a/source/blender/imbuf/Makefile
+++ b/source/blender/imbuf/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/imbuf/SConscript b/source/blender/imbuf/SConscript
index a8d91b2d31e..6b3360a16c5 100644
--- a/source/blender/imbuf/SConscript
+++ b/source/blender/imbuf/SConscript
@@ -14,12 +14,24 @@ 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')
+if env['WITH_BF_CINEON']:
+ defs.append('WITH_CINEON')
+
+if env['WITH_BF_HDR']:
+ defs.append('WITH_HDR')
+
if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
incs += ' ' + env['BF_FFMPEG_INC']
diff --git a/source/blender/imbuf/intern/IMB_anim.h b/source/blender/imbuf/intern/IMB_anim.h
index 39b8e48fb7f..c9eac2c1399 100644
--- a/source/blender/imbuf/intern/IMB_anim.h
+++ b/source/blender/imbuf/intern/IMB_anim.h
@@ -65,7 +65,6 @@
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
index 2884abcaf6e..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,20 +30,16 @@
#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
+/** 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
@@ -52,8 +48,8 @@ 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
@@ -63,23 +59,22 @@ void IMB_imginfo_free(struct ImBuf* img);
* @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..8e7272100b9 100644
--- a/source/blender/imbuf/intern/Makefile
+++ b/source/blender/imbuf/intern/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.
@@ -36,7 +36,12 @@ include nan_subdirs.mk
include nan_compile.mk
include nan_definitions.mk
-DIRS = cineon
+DIRS =
+
+ifeq ($(WITH_CINEON), true)
+ DIRS += cineon
+ CPPFLAGS += -DWITH_CINEON
+endif
ifeq ($(WITH_OPENEXR), true)
DIRS += openexr
@@ -61,7 +66,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 +89,12 @@ ifeq ($(WITH_FFMPEG), true)
CPPFLAGS += -DWITH_FFMPEG
CPPFLAGS += $(NAN_FFMPEGCFLAGS)
endif
+
+ifeq ($(WITH_TIFF), true)
+ CPPFLAGS += -DWITH_TIFF
+ CPPFLAGS += -I$(NAN_TIFF)/include
+endif
+
+ifeq ($(WITH_HDR), true)
+ CPPFLAGS += -DWITH_HDR
+endif
diff --git a/source/blender/imbuf/intern/allocimbuf.c b/source/blender/imbuf/intern/allocimbuf.c
index 710dbde21b2..3f440c0bf6f 100644
--- a/source/blender/imbuf/intern/allocimbuf.c
+++ b/source/blender/imbuf/intern/allocimbuf.c
@@ -32,54 +32,39 @@
/* It's become a bit messy... Basically, only the IMB_ prefixed files
* should remain. */
-#include "IMB_imbuf_types.h"
-
-#include "imbuf.h"
-#include "imbuf_patch.h"
#include "IMB_imbuf.h"
+#include "IMB_imbuf_types.h"
-#include "IMB_divers.h"
#include "IMB_allocimbuf.h"
-#include "IMB_imginfo.h"
-#include "MEM_CacheLimiterC-Api.h"
+#include "IMB_filetype.h"
+#include "IMB_metadata.h"
-static unsigned int dfltcmap[16] = {
- 0x00000000, 0xffffffff, 0x777777ff, 0xccccccff,
- 0xcc3344ff, 0xdd8844ff, 0xccdd44ff, 0x888833ff,
- 0x338844ff, 0x44dd44ff, 0x44ddccff, 0x3388ccff,
- 0x8888ddff, 0x4433ccff, 0xcc33ccff, 0xcc88ddff
-};
+#include "imbuf.h"
-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;
-}
+#include "MEM_CacheLimiterC-Api.h"
+#include "MEM_guardedalloc.h"
-void imb_freemipmapImBuf(struct ImBuf * ibuf)
+void imb_freemipmapImBuf(ImBuf *ibuf)
{
int a;
- for(a=0; a<IB_MIPMAP_LEVELS; a++) {
- if(ibuf->mipmap[a]) IMB_freeImBuf(ibuf->mipmap[a]);
- ibuf->mipmap[a]= NULL;
+ for(a=1; a<ibuf->miptot; 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 +74,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)
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 +91,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; ty<ibuf->ytiles; ty++) {
+ for(tx=0; tx<ibuf->xtiles; 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)
-{
- 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)
+void IMB_freeImBuf(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 +266,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);
- }
-
- return (FALSE);
-}
-
-
-short imb_addcmapImBuf(struct ImBuf *ibuf)
-{
- int min;
-
- if (ibuf==NULL) return(FALSE);
- IMB_freecmapImBuf(ibuf);
-
- imb_checkncols(ibuf);
- if (ibuf->maxcol == 0) return (TRUE);
-
- 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);
+ if(ibuf->depth > 32) return (addzbufImBuf(ibuf));
+ else return TRUE;
}
- return (FALSE);
+ return FALSE;
}
-
-short imb_addplanesImBuf(struct ImBuf *ibuf)
+short imb_addtilesImBuf(ImBuf *ibuf)
{
- int size;
- short skipx,d,y;
- unsigned int **planes;
- unsigned int *point2;
-
- if (ibuf==NULL) return(FALSE);
- imb_freeplanesImBuf(ibuf);
+ if(ibuf==NULL) return FALSE;
- 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);
+ if(!ibuf->tiles)
+ if((ibuf->tiles = MEM_callocN(sizeof(unsigned int*)*ibuf->xtiles*ibuf->ytiles, "imb_tiles")))
+ ibuf->mall |= IB_tiles;
- 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);
+ return (ibuf->tiles != NULL);
}
-
-struct ImBuf *IMB_allocImBuf(short x, short y, uchar d, unsigned int flags, uchar bitmap)
+ImBuf *IMB_allocImBuf(short x, short y, uchar d, unsigned int flags, uchar bitmap) /* XXX bitmap argument is deprecated */
{
- struct ImBuf *ibuf;
+ ImBuf *ibuf;
- ibuf = MEM_callocN(sizeof(struct ImBuf), "ImBuf_struct");
- if (bitmap) flags |= IB_planes;
+ ibuf = MEM_callocN(sizeof(ImBuf), "ImBuf_struct");
- 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 +367,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 +407,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 +418,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 +457,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 +469,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 <io.h>
-#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 5a5b5ada4a1..096ed499f85 100644
--- a/source/blender/imbuf/intern/anim.c
+++ b/source/blender/imbuf/intern/anim.c
@@ -60,11 +60,13 @@
#include "BLI_blenlib.h" /* BLI_remlink BLI_filesize BLI_addtail
BLI_countlist BLI_stringdec */
+#include "MEM_guardedalloc.h"
+
#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 +80,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 <libavformat/avformat.h>
@@ -94,8 +94,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 +225,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 +239,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 +253,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 +327,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 +340,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 +475,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 +530,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();
@@ -574,9 +591,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;
@@ -647,10 +664,139 @@ 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);
}
+static void ffmpeg_postprocess(struct anim * anim, ImBuf * ibuf,
+ int * filter_y)
+{
+ AVFrame * input = anim->pFrame;
+
+ /* 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){
+ fprintf(stderr, "ffmpeg_fetchibuf: "
+ "data not read properly...\n");
+ return;
+ }
+
+ 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) {
+ *filter_y = 1;
+ } else {
+ input = anim->pFrameDeinterlaced;
+ }
+ }
+
+ if (ENDIAN_ORDER == B_ENDIAN) {
+ int * dstStride = anim->pFrameRGB->linesize;
+ uint8_t** dst = anim->pFrameRGB->data;
+ int dstStride2[4] = { dstStride[0], 0, 0, 0 };
+ uint8_t* dst2[4] = { dst[0], 0, 0, 0 };
+ int x,y,h,w;
+ unsigned char* bottom;
+ unsigned char* top;
+
+ sws_scale(anim->img_convert_ctx,
+ (const uint8_t * const *)input->data,
+ input->linesize,
+ 0,
+ anim->pCodecCtx->height,
+ dst2,
+ dstStride2);
+
+ /* workaround: sws_scale bug
+ sets alpha = 0 and compensate
+ for altivec-bugs and flipy... */
+
+ bottom = (unsigned char*) ibuf->rect;
+ top = bottom + ibuf->x * (ibuf->y-1) * 4;
+
+ h = (ibuf->y + 1) / 2;
+ w = ibuf->x;
+
+ for (y = 0; y < h; y++) {
+ unsigned char tmp[4];
+ unsigned int * tmp_l =
+ (unsigned int*) tmp;
+ tmp[3] = 0xff;
+
+ for (x = 0; x < w; x++) {
+ tmp[0] = bottom[0];
+ tmp[1] = bottom[1];
+ tmp[2] = bottom[2];
+
+ bottom[0] = top[0];
+ bottom[1] = top[1];
+ bottom[2] = top[2];
+ bottom[3] = 0xff;
+
+ *(unsigned int*) top = *tmp_l;
+
+ bottom +=4;
+ top += 4;
+ }
+ top -= 8 * w;
+ }
+ } else {
+ int * dstStride = anim->pFrameRGB->linesize;
+ uint8_t** dst = anim->pFrameRGB->data;
+ int dstStride2[4] = { -dstStride[0], 0, 0, 0 };
+ uint8_t* dst2[4] = { dst[0] + (anim->y - 1)*dstStride[0],
+ 0, 0, 0 };
+ int i;
+ unsigned char* r;
+
+ sws_scale(anim->img_convert_ctx,
+ (const uint8_t * const *)input->data,
+ input->linesize,
+ 0,
+ anim->pCodecCtx->height,
+ dst2,
+ dstStride2);
+
+ r = (unsigned char*) ibuf->rect;
+
+ /* workaround sws_scale bug: older version of
+ sws_scale set alpha = 0... */
+ if (r[3] == 0) {
+ for (i = 0; i < ibuf->x * ibuf->y; i++) {
+ r[3] = 0xff;
+ r += 4;
+ }
+ }
+ }
+}
+
static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
ImBuf * ibuf;
int frameFinished;
@@ -658,6 +804,8 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
int64_t pts_to_search = 0;
int pos_found = 1;
int filter_y = 0;
+ int seek_by_bytes= 0;
+ int preseek_count = 0;
if (anim == 0) return (0);
@@ -690,6 +838,8 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
}
}
+ seek_by_bytes = !!(anim->pFormatCtx->iformat->flags & AVFMT_TS_DISCONT);
+
if (position != anim->curposition + 1) {
#ifdef FFMPEG_OLD_FRAME_RATE
double frame_rate =
@@ -703,21 +853,41 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
double time_base =
av_q2d(anim->pFormatCtx->streams[anim->videoStream]
->time_base);
- long long pos = (long long) (position - anim->preseek)
- * AV_TIME_BASE / frame_rate;
+ long long pos;
long long st_time = anim->pFormatCtx
->streams[anim->videoStream]->start_time;
+ int ret;
- if (pos < 0) {
- pos = 0;
- }
+ if (seek_by_bytes) {
+ pos = position - anim->preseek;
+ if (pos < 0) {
+ pos = 0;
+ }
+ preseek_count = position - pos;
- if (st_time != AV_NOPTS_VALUE) {
- pos += st_time * AV_TIME_BASE * time_base;
+ pos *= anim->pFormatCtx->bit_rate / frame_rate;
+ pos /= 8;
+ } else {
+ pos = (long long) (position - anim->preseek)
+ * AV_TIME_BASE / frame_rate;
+ if (pos < 0) {
+ pos = 0;
+ }
+
+ if (st_time != AV_NOPTS_VALUE) {
+ pos += st_time * AV_TIME_BASE * time_base;
+ }
}
- av_seek_frame(anim->pFormatCtx, -1,
- pos, AVSEEK_FLAG_BACKWARD);
+ ret = av_seek_frame(anim->pFormatCtx, -1,
+ pos,
+ AVSEEK_FLAG_BACKWARD | (
+ seek_by_bytes
+ ? AVSEEK_FLAG_ANY
+ | AVSEEK_FLAG_BYTE : 0));
+ if (ret < 0) {
+ fprintf(stderr, "error while seeking: %d\n", ret);
+ }
pts_to_search = (long long)
(((double) position) / time_base / frame_rate);
@@ -735,132 +905,28 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
anim->pFrame, &frameFinished,
packet.data, packet.size);
- if (frameFinished && !pos_found) {
- if (packet.dts >= pts_to_search) {
- pos_found = 1;
- anim->curposition = position;
- }
- }
-
- if(frameFinished && pos_found == 1) {
- AVFrame * input = anim->pFrame;
-
- /* 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){
- 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) {
- filter_y = 1;
- } else {
- input = anim->pFrameDeinterlaced;
- }
- }
+ if (seek_by_bytes && preseek_count > 0) {
+ preseek_count--;
+ }
- if (ENDIAN_ORDER == B_ENDIAN) {
- int * dstStride
- = anim->pFrameRGB->linesize;
- uint8_t** dst = anim->pFrameRGB->data;
- int dstStride2[4]
- = { dstStride[0], 0, 0, 0 };
- uint8_t* dst2[4]= {
- dst[0], 0, 0, 0 };
- int x,y,h,w;
- unsigned char* bottom;
- unsigned char* top;
-
- sws_scale(anim->img_convert_ctx,
- input->data,
- input->linesize,
- 0,
- anim->pCodecCtx->height,
- dst2,
- dstStride2);
-
- /* workaround: sws_scale
- sets alpha = 0 and compensate
- for altivec-bugs and flipy... */
-
- bottom = (unsigned char*) ibuf->rect;
- top = bottom
- + ibuf->x * (ibuf->y-1) * 4;
-
- h = (ibuf->y + 1) / 2;
- w = ibuf->x;
-
- for (y = 0; y < h; y++) {
- unsigned char tmp[4];
- unsigned int * tmp_l =
- (unsigned int*) tmp;
- tmp[3] = 0xff;
-
- for (x = 0; x < w; x++) {
- tmp[0] = bottom[0];
- tmp[1] = bottom[1];
- tmp[2] = bottom[2];
-
- bottom[0] = top[0];
- bottom[1] = top[1];
- bottom[2] = top[2];
- bottom[3] = 0xff;
-
- *(unsigned int*) top
- = *tmp_l;
-
- bottom +=4;
- top += 4;
- }
- top -= 8 * w;
+ if (frameFinished && !pos_found) {
+ if (seek_by_bytes) {
+ if (!preseek_count) {
+ pos_found = 1;
+ anim->curposition = position;
}
-
- av_free_packet(&packet);
- break;
} else {
- int * dstStride
- = anim->pFrameRGB->linesize;
- uint8_t** dst = anim->pFrameRGB->data;
- int dstStride2[4]
- = { -dstStride[0], 0, 0, 0 };
- uint8_t* dst2[4]= {
- dst[0]
- + (anim->y - 1)*dstStride[0],
- 0, 0, 0 };
- int i;
- unsigned char* r;
-
- sws_scale(anim->img_convert_ctx,
- input->data,
- input->linesize,
- 0,
- anim->pCodecCtx->height,
- dst2,
- dstStride2);
-
- /* workaround: sws_scale
- sets alpha = 0... */
-
- r = (unsigned char*) ibuf->rect;
-
- for (i = 0; i < ibuf->x * ibuf->y;i++){
- r[3] = 0xff;
- r+=4;
+ if (packet.dts >= pts_to_search) {
+ pos_found = 1;
+ anim->curposition = position;
}
-
- av_free_packet(&packet);
- break;
}
+ }
+
+ if(frameFinished && pos_found == 1) {
+ ffmpeg_postprocess(anim, ibuf, &filter_y);
+ av_free_packet(&packet);
+ break;
}
}
@@ -958,7 +1024,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 +1041,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 +1118,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 +1164,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 +1171,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 41c4c2c610b..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 <io.h>
-#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 606cce645ee..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;
diff --git a/source/blender/imbuf/intern/cache.c b/source/blender/imbuf/intern/cache.c
new file mode 100644
index 00000000000..77e01d8ebef
--- /dev/null
+++ b/source/blender/imbuf/intern/cache.c
@@ -0,0 +1,444 @@
+/*
+ * $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 "MEM_guardedalloc.h"
+
+#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; a<IB_THREAD_CACHE_SIZE; a++) {
+ ttile= BLI_memarena_alloc(GLOBAL_CACHE.memarena, sizeof(ImThreadTile));
+ BLI_addtail(&cache->unused, 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; a<GLOBAL_CACHE.totthread; a++)
+ imb_thread_cache_exit(&GLOBAL_CACHE.thread_cache[a]);
+
+ if(GLOBAL_CACHE.memarena)
+ BLI_memarena_free(GLOBAL_CACHE.memarena);
+
+ if(GLOBAL_CACHE.tilehash)
+ BLI_ghash_free(GLOBAL_CACHE.tilehash, NULL, NULL);
+
+ BLI_mutex_end(&GLOBAL_CACHE.mutex);
+}
+
+/* presumed to be called when no threads are running */
+void IMB_tile_cache_params(int totthread, int maxmem)
+{
+ int a;
+
+ /* always one cache for non-threaded access */
+ totthread++;
+
+ /* lazy initialize cache */
+ if(GLOBAL_CACHE.totthread == totthread && GLOBAL_CACHE.maxmem == maxmem)
+ return;
+
+ imb_tile_cache_exit();
+
+ memset(&GLOBAL_CACHE, 0, sizeof(ImGlobalTileCache));
+
+ GLOBAL_CACHE.tilehash= BLI_ghash_new(imb_global_tile_hash, imb_global_tile_cmp, "tile_cache_params gh");
+
+ GLOBAL_CACHE.memarena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "ImTileCache arena");
+ BLI_memarena_use_calloc(GLOBAL_CACHE.memarena);
+
+ GLOBAL_CACHE.maxmem= maxmem*1024*1024;
+
+ GLOBAL_CACHE.totthread= totthread;
+ for(a=0; a<totthread; a++)
+ imb_thread_cache_init(&GLOBAL_CACHE.thread_cache[a]);
+
+ BLI_mutex_init(&GLOBAL_CACHE.mutex);
+}
+
+/***************************** Global Cache **********************************/
+
+static ImGlobalTile *imb_global_cache_get_tile(ImBuf *ibuf, int tx, int ty, ImGlobalTile *replacetile)
+{
+ ImGlobalTile *gtile, lookuptile;
+
+ BLI_mutex_lock(&GLOBAL_CACHE.mutex);
+
+ if(replacetile)
+ replacetile->refcount--;
+
+ /* 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; a<ibuf->miptot; 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; ty<mipbuf->ytiles; ty++) {
+ for(tx=0; tx<mipbuf->xtiles; 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; y<h; y++) {
+ memcpy(to, from, sizeof(unsigned int)*w);
+ from += mipbuf->tilex;
+ 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/CMakeLists.txt b/source/blender/imbuf/intern/cineon/CMakeLists.txt
index 588be3305d9..cd887b6fc4e 100644
--- a/source/blender/imbuf/intern/cineon/CMakeLists.txt
+++ b/source/blender/imbuf/intern/cineon/CMakeLists.txt
@@ -38,4 +38,3 @@ SET(INC
)
BLENDERLIB(bf_cineon "${SRC}" "${INC}")
-#env.BlenderLib ('bf_cineon', source_files, incs, defs, libtype=['core','player'], priority = [90, 200])
diff --git a/source/blender/imbuf/intern/cineon/Makefile b/source/blender/imbuf/intern/cineon/Makefile
index 99a9a5dbd46..6e940d530a9 100644
--- a/source/blender/imbuf/intern/cineon/Makefile
+++ b/source/blender/imbuf/intern/cineon/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/imbuf/intern/cineon/cineon_dpx.c b/source/blender/imbuf/intern/cineon/cineon_dpx.c
index 2acd4dfda75..a9b229536cb 100644
--- a/source/blender/imbuf/intern/cineon/cineon_dpx.c
+++ b/source/blender/imbuf/intern/cineon/cineon_dpx.c
@@ -53,7 +53,7 @@ static void cineon_conversion_parameters(LogImageByteConversionParameters *param
params->blackPoint = 95;
params->whitePoint = 685;
- params->gamma = 1.7f;
+ params->gamma = 1.0f;
params->doLogarithm = 0;
}
@@ -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 <ctype.h>
-#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 ; i<nocols ; i++) ibuf->cmap[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 3b1f3035d62..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/CMakeLists.txt b/source/blender/imbuf/intern/dds/CMakeLists.txt
index 364dd41e744..376dd3d61f4 100644
--- a/source/blender/imbuf/intern/dds/CMakeLists.txt
+++ b/source/blender/imbuf/intern/dds/CMakeLists.txt
@@ -37,9 +37,8 @@ SET(INC
../../../../../intern/guardedalloc
)
-if(WITH_DDS)
+if(WITH_IMAGE_DDS)
ADD_DEFINITIONS(-DWITH_DDS)
-ENDIF(WITH_DDS)
+ENDIF(WITH_IMAGE_DDS)
BLENDERLIB(bf_dds "${SRC}" "${INC}")
-#env.BlenderLib ('bf_dds', source_files, incs, defs, libtype=['core','player'], priority = [90, 200])
diff --git a/source/blender/imbuf/intern/dds/Makefile b/source/blender/imbuf/intern/dds/Makefile
index e14f9320d19..d4f04382899 100644
--- a/source/blender/imbuf/intern/dds/Makefile
+++ b/source/blender/imbuf/intern/dds/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/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)-1);
- bits -= 2;
-
- ofs = 0;
-
- switch(ofs){
- case 3:
- break;
- case 2:
- dit[0]=0;
- dit[1]=1;
- dit[2]=2;
- dit[3]=3;
- break;
- case 1:
- dit[0]=3;
- dit[1]=1;
- dit[2]=0;
- dit[3]=2;
- break;
- case 0:
- dit[0]=0;
- dit[1]=2;
- dit[2]=3;
- dit[3]=1;
- break;
- }
-
- if (bits < 0){
- dit[0] >>= -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 4e8d61f8675..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 <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#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..db2eef759dc
--- /dev/null
+++ b/source/blender/imbuf/intern/filetype.c
@@ -0,0 +1,106 @@
+/*
+ * $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},
+#ifdef WITH_CINEON
+ {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},
+#endif
+#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
+#ifdef WITH_HDR
+ {NULL, NULL, imb_is_a_hdr, imb_ftype_default, imb_loadhdr, imb_savehdr, NULL, IM_FTYPE_FLOAT, RADHDR},
+#endif
+#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 5692686a9bc..3cc266e460e 100644
--- a/source/blender/imbuf/intern/filter.c
+++ b/source/blender/imbuf/intern/filter.c
@@ -29,14 +29,14 @@
* $Id$
*/
-#include "BLI_blenlib.h"
+#include "BKE_utildefines.h"
+#include "MEM_guardedalloc.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 */
@@ -375,17 +375,97 @@ void IMB_makemipmap(ImBuf *ibuf, int use_filter)
{
ImBuf *hbuf = ibuf;
int curmap = 0;
- while (curmap < IB_MIPMAP_LEVELS) {
- if (use_filter) {
+
+ ibuf->miptot= 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);
IMB_freeImBuf(nbuf);
}
- else ibuf->mipmap[curmap] = IMB_onehalf(hbuf);
- hbuf = ibuf->mipmap[curmap];
- if (hbuf->x == 1 && hbuf->y == 1) break;
+ 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++;
}
}
+ImBuf *IMB_getmipmap(ImBuf *ibuf, int level)
+{
+ 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; y<h; y++)
+ for(x=0; x<w; x++, cp+=4)
+ cp[3]= 255;
+ }
+ else {
+ cp= (char *)(rect);
+
+ for(y=0; y<h; y++) {
+ for(x=0; x<w; x++, cp+=4) {
+ val= cp[3];
+ cp[0]= (cp[0]*val)>>8;
+ cp[1]= (cp[1]*val)>>8;
+ cp[2]= (cp[2]*val)>>8;
+ }
+ }
+ }
+}
+
+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; y<h; y++)
+ for(x=0; x<w; x++, cp+=4)
+ cp[3]= 1.0;
+ }
+ else {
+ cp= rect_float;
+ for(y=0; y<h; y++) {
+ for(x=0; x<w; x++, cp+=4) {
+ val= cp[3];
+ cp[0]= cp[0]*val;
+ cp[1]= cp[1]*val;
+ cp[2]= cp[2]*val;
+ }
+ }
+ }
+
+}
+
+void IMB_premultiply_alpha(ImBuf *ibuf)
+{
+ if(ibuf==NULL)
+ return;
+
+ if(ibuf->rect)
+ 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 <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#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 <io.h>
-#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 <io.h>
-#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 ; i<ibuf->maxcol ; 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..8fa76fa4502 100644
--- a/source/blender/imbuf/intern/imageprocess.c
+++ b/source/blender/imbuf/intern/imageprocess.c
@@ -37,6 +37,8 @@
* $Id$
*/
+#include <stdlib.h>
+
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
#include "math.h"
@@ -127,7 +129,7 @@ void bicubic_interpolation_color(struct ImBuf *in, unsigned char *outI, float *o
unsigned char *dataI;
float a,b,w,wx,wy[4], outR,outG,outB,outA,*dataF;
- /* ImBuf in must have a valid rect or rect_float, assume this is alredy checked */
+ /* ImBuf in must have a valid rect or rect_float, assume this is already checked */
i= (int)floor(u);
j= (int)floor(v);
@@ -243,7 +245,7 @@ void bilinear_interpolation_color(struct ImBuf *in, unsigned char *outI, float *
int y1, y2, x1, x2;
- /* ImBuf in must have a valid rect or rect_float, assume this is alredy checked */
+ /* ImBuf in must have a valid rect or rect_float, assume this is already checked */
x1= (int)floor(u);
x2= (int)ceil(u);
@@ -317,7 +319,7 @@ void bilinear_interpolation_color_wrap(struct ImBuf *in, unsigned char *outI, fl
int y1, y2, x1, x2;
- /* ImBuf in must have a valid rect or rect_float, assume this is alredy checked */
+ /* ImBuf in must have a valid rect or rect_float, assume this is already checked */
x1= (int)floor(u);
x2= (int)ceil(u);
@@ -391,7 +393,7 @@ void neareast_interpolation_color(struct ImBuf *in, unsigned char *outI, float *
unsigned char *dataI;
int y1, x1;
- /* ImBuf in must have a valid rect or rect_float, assume this is alredy checked */
+ /* ImBuf in must have a valid rect or rect_float, assume this is already checked */
x1= (int)(u);
y1= (int)(v);
diff --git a/source/blender/imbuf/intern/imbuf.h b/source/blender/imbuf/intern/imbuf.h
index aba4784d7d7..1e2f3ec461a 100644
--- a/source/blender/imbuf/intern/imbuf.h
+++ b/source/blender/imbuf/intern/imbuf.h
@@ -72,97 +72,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 <Cocoa/Cocoa.h>
#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..c676c401ccd 100644
--- a/source/blender/imbuf/intern/iris.c
+++ b/source/blender/imbuf/intern/iris.c
@@ -30,13 +30,15 @@
*/
#include <string.h>
+
#include "BLI_blenlib.h"
+#include "MEM_guardedalloc.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 +226,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 +244,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 +257,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 +291,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 +393,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 +509,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 +674,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 +728,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 +812,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 b2ed8b87d0f..558eaedf8b2 100644
--- a/source/blender/imbuf/intern/jp2.c
+++ b/source/blender/imbuf/intern/jp2.c
@@ -23,15 +23,17 @@
#ifdef WITH_OPENJPEG
+#include "MEM_guardedalloc.h"
+
#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 +60,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 +94,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 +159,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 +189,7 @@ struct ImBuf *imb_jp2_decode(unsigned char *mem, int size, int flags)
float_divs[i]= (1<<image->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 +200,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 +231,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];
@@ -294,7 +289,7 @@ 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
+2048x1080 (2K) at 24 fps or 48 fps, or 4096x2160 (4K) at 24 fps; 3x12 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
@@ -540,16 +535,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; x<w; x++, rect_float+=4) {
i = y_row + x;
+
+ if (ibuf->profile == 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 +563,15 @@ static opj_image_t* ibuftoimage(ImBuf *ibuf, opj_cparameters_t *parameters) {
y_row = y*w;
for(x=0; x<w; x++, rect_float+=4) {
i = y_row + x;
+
+ if (ibuf->profile == 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 +582,15 @@ static opj_image_t* ibuftoimage(ImBuf *ibuf, opj_cparameters_t *parameters) {
y_row = y*w;
for(x=0; x<w; x++, rect_float+=4) {
i = y_row + x;
+
+ if (ibuf->profile == 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 +661,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 127145c967d..2bae7228220 100644
--- a/source/blender/imbuf/intern/jpeg.c
+++ b/source/blender/imbuf/intern/jpeg.c
@@ -34,17 +34,24 @@
#include <stdio.h>
#include <setjmp.h>
+#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);
@@ -149,7 +156,10 @@ static void skip_input_data(j_decompress_ptr cinfo, long num_bytes)
{
my_src_ptr src = (my_src_ptr) cinfo->src;
- src->pub.next_input_byte = src->pub.next_input_byte + num_bytes;
+ if(num_bytes > 0) {
+ src->pub.next_input_byte = src->pub.next_input_byte + num_bytes;
+ src->pub.bytes_in_buffer = src->pub.bytes_in_buffer - num_bytes;
+ }
}
@@ -297,11 +307,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 +384,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 +410,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 +459,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 +495,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 +506,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 +534,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 +569,7 @@ next_stamp_info:
}
jpeg_finish_compress(cinfo);
- free(row_pointer[0]);
+ MEM_freeN(row_pointer[0]);
}
@@ -580,7 +588,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){
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 a2528fbd93c..19a5f25e7a4 100644
--- a/source/blender/imbuf/intern/md5.c
+++ b/source/blender/imbuf/intern/md5.c
@@ -18,10 +18,6 @@
/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>. */
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
#include <sys/types.h>
# include <stdlib.h>
diff --git a/source/blender/imbuf/intern/imginfo.c b/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
index 325715906a0..5438066d164 100644
--- a/source/blender/imbuf/intern/IMB_radiance_hdr.h
+++ b/source/blender/imbuf/intern/module.c
@@ -1,6 +1,4 @@
/*
- * IMB_radiance_hdr.h
- *
* $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
-
-struct ImBuf;
+#include "IMB_imbuf.h"
+#include "IMB_filetype.h"
-int imb_is_a_hdr(void *buf);
+void IMB_init(void)
+{
+ imb_filetypes_init();
+ imb_tile_cache_init();
+}
-struct ImBuf *imb_loadhdr(unsigned char *mem, int size, int flags);
-short imb_savehdr(struct ImBuf * ibuf, char *name, int flags);
+void IMB_exit(void)
+{
+ IMB_free_cache_limiter();
+ imb_tile_cache_exit();
+ imb_filetypes_exit();
+}
-#endif
diff --git a/source/blender/imbuf/intern/openexr/CMakeLists.txt b/source/blender/imbuf/intern/openexr/CMakeLists.txt
index 7dc295a8aae..cfc977ff155 100644
--- a/source/blender/imbuf/intern/openexr/CMakeLists.txt
+++ b/source/blender/imbuf/intern/openexr/CMakeLists.txt
@@ -38,9 +38,8 @@ SET(INC
${OPENEXR_INC}
)
-IF(WITH_OPENEXR)
+IF(WITH_IMAGE_OPENEXR)
ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_OPENEXR)
+ENDIF(WITH_IMAGE_OPENEXR)
BLENDERLIB(bf_openexr "${SRC}" "${INC}")
-#env.BlenderLib ('bf_openexr', source_files, incs, defs, libtype=['core','player'], priority = [90, 200])
diff --git a/source/blender/imbuf/intern/openexr/Makefile b/source/blender/imbuf/intern/openexr/Makefile
index 083089b11d5..820b2aeb003 100644
--- a/source/blender/imbuf/intern/openexr/Makefile
+++ b/source/blender/imbuf/intern/openexr/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/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp
index c9859f8d5bd..9b68e0e45eb 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,69 @@ 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--)
+ {
+ 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--)
{
- 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 = 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--)
+ {
+ from= (unsigned char *)ibuf->rect + channels*i*width;
+
+ 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--)
{
- 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;
+ from= (unsigned char *)ibuf->rect + channels*i*width;
+
+ 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 +314,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 +326,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 +343,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 +372,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 +481,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 +495,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 +566,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 +620,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 +648,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 +756,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;
+ 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);
}
-
- pass= (ExrPass *)MEM_callocN(sizeof(ExrPass), "exr 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 +931,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 +1028,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 2dafa043da6..6344b227174 100644
--- a/source/blender/imbuf/intern/png.c
+++ b/source/blender/imbuf/intern/png.c
@@ -31,17 +31,16 @@
#include "png.h"
#include "BLI_blenlib.h"
+#include "MEM_guardedalloc.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 +52,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 +93,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;
@@ -105,6 +104,11 @@ short imb_savepng(struct ImBuf *ibuf, char *name, int flags)
int i, bytesperpixel, color_type = PNG_COLOR_TYPE_GRAY;
FILE *fp = 0;
+ /* use the jpeg quality setting for compression */
+ int compression;
+ compression= (int)(((float)(ibuf->ftype & 0xff) / 11.1111f));
+ compression= compression < 0 ? 0 : (compression > 9 ? 9 : compression);
+
bytesperpixel = (ibuf->depth + 7) >> 3;
if ((bytesperpixel > 4) || (bytesperpixel == 2)) {
printf("imb_savepng: unsupported bytes per pixel: %d\n", bytesperpixel);
@@ -203,10 +207,10 @@ short imb_savepng(struct ImBuf *ibuf, char *name, int flags)
PNG_FILTER_AVG | PNG_FILTER_VALUE_AVG |
PNG_FILTER_PAETH | PNG_FILTER_VALUE_PAETH|
PNG_ALL_FILTERS);
-
- png_set_compression_level(png_ptr, Z_BEST_COMPRESSION);
*/
+ png_set_compression_level(png_ptr, compression);
+
// png image settings
png_set_IHDR(png_ptr,
info_ptr,
@@ -219,30 +223,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,12 +441,12 @@ 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;
}
}
diff --git a/source/blender/imbuf/intern/radiance_hdr.c b/source/blender/imbuf/intern/radiance_hdr.c
index 9ad28abeae4..c5122ebe46c 100644
--- a/source/blender/imbuf/intern/radiance_hdr.c
+++ b/source/blender/imbuf/intern/radiance_hdr.c
@@ -29,6 +29,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#ifdef WITH_HDR
+
/* ----------------------------------------------------------------------
Radiance High Dynamic Range image file IO
For description and code for reading/writing of radiance hdr files
@@ -40,17 +42,18 @@
#ifdef WIN32
#include <io.h>
#endif
+
+#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_allocimbuf.h"
-#include "IMB_cmap.h"
-#include "IMB_radiance_hdr.h"
+#include "IMB_filetype.h"
/* needed constants */
#define MINELEN 8
@@ -160,7 +163,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 +208,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;
@@ -331,7 +333,7 @@ static void writeHeader(FILE *file, int width, int height)
fputc(10, file);
}
-short imb_savehdr(struct ImBuf *ibuf, char *name, int flags)
+int imb_savehdr(struct ImBuf *ibuf, char *name, int flags)
{
FILE* file = fopen(name, "wb");
float *fp= NULL;
@@ -361,3 +363,4 @@ short imb_savehdr(struct ImBuf *ibuf, char *name, int flags)
return 1;
}
+#endif /* WITH_HDR */
diff --git a/source/blender/imbuf/intern/readimage.c b/source/blender/imbuf/intern/readimage.c
index c23daacb919..3f4e177c78b 100644
--- a/source/blender/imbuf/intern/readimage.c
+++ b/source/blender/imbuf/intern/readimage.c
@@ -42,275 +42,159 @@
#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_amiga.h"
-#include "IMB_iris.h"
-#include "IMB_targa.h"
-#include "IMB_png.h"
-#include "IMB_hamx.h"
-#include "IMB_jpeg.h"
-#include "IMB_bmp.h"
-#include "IMB_radiance_hdr.h"
-#include "IMB_dpxcineon.h"
-#include "BKE_global.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
+ImBuf *IMB_ibImageFromMemory(unsigned char *mem, int size, int flags)
+{
+ ImBuf *ibuf;
+ ImFileType *type;
-#ifdef WITH_QUICKTIME
-#if defined(_WIN32) || defined (__APPLE__)
-#include "quicktime_import.h"
-#endif
-#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
-
-/* 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;
+ if(mem == NULL) {
+ printf("Error in ibImageFromMemory: NULL pointer\n");
+ return NULL;
+ }
-ImBuf *IMB_ibImageFromMemory(int *mem, int size, int flags) {
- int len;
- struct ImBuf *ibuf;
+ 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;
+ }
- 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);
+ return ibuf;
}
}
+ }
+
+ fprintf(stderr, "Unknown fileformat\n");
- 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;
+}
- ibuf = imb_loadpng((uchar *)mem, size, flags);
- if (ibuf) return(ibuf);
+ImBuf *IMB_loadifffile(int file, int flags)
+{
+ ImBuf *ibuf;
+ unsigned char *mem;
+ int size;
- ibuf = imb_bmp_decode((uchar *)mem, size, flags);
- if (ibuf) return(ibuf);
+ if(file == -1) return 0;
- ibuf = imb_loadtarga((uchar *)mem, size, flags);
- if (ibuf) return(ibuf);
+ size= BLI_filesize(file);
- ibuf = imb_loaddpx((uchar *)mem, size, flags);
- if (ibuf) return(ibuf);
+ mem= mmap(0, size, PROT_READ, MAP_SHARED, file, 0);
+ if(mem==(unsigned char*)-1) {
+ fprintf(stderr, "Couldn't get mapping\n");
+ return 0;
+ }
- 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);
+ ibuf= IMB_ibImageFromMemory(mem, size, flags);
-#ifdef WITH_OPENEXR
- ibuf = imb_load_openexr((uchar *)mem, size, flags);
- if (ibuf) return (ibuf);
-#endif
+ if(munmap(mem, size))
+ fprintf(stderr, "Couldn't unmap file.\n");
-#ifdef WITH_OPENJPEG
- ibuf = imb_jp2_decode((uchar *)mem, size, flags);
- if (ibuf) return (ibuf);
-#endif
+ return ibuf;
+}
-#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
+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 (IB_verbose) fprintf(stderr, "Unknown fileformat\n");
+ if(BLI_file_older(name, filename))
+ return;
}
-
- return (0);
+
+ 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_loadiffmem(int *mem, int flags) {
- int len,maxlen;
- struct ImBuf *ibuf;
+ imb_cache_filename(filename, name, flags);
- // IMB_loadiffmem shouldn't be used anymore in new development
- // it's still here to be backwards compatible...
+ file = open(filename, O_BINARY|O_RDONLY);
+ if(file < 0) return 0;
- maxlen= (GET_BIG_LONG(mem+1) + 1) & ~1;
+ ibuf= IMB_loadifffile(file, flags);
- 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);
- }
+ if(ibuf) {
+ BLI_strncpy(ibuf->name, name, sizeof(ibuf->name));
+ BLI_strncpy(ibuf->cachename, filename, sizeof(ibuf->cachename));
+ for(a=1; a<ibuf->miptot; a++)
+ BLI_strncpy(ibuf->mipmap[a-1]->cachename, filename, sizeof(ibuf->cachename));
+ if(flags & IB_fields) IMB_de_interlace(ibuf);
}
- 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_loadtarga((uchar *) mem,maxlen,flags);
- if (ibuf) return(ibuf);
+ close(file);
- 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;
+ImBuf *IMB_testiffname(char *name, int flags)
+{
+ ImBuf *ibuf;
+ int file;
+ char filename[IB_FILENAME_SIZE];
- if (file == -1) return (0);
+ imb_cache_filename(filename, name, flags);
- size = BLI_filesize(file);
+ file = open(filename,O_BINARY|O_RDONLY);
+ if(file < 0) return 0;
- mem= (int *)mmap(0,size,PROT_READ,MAP_SHARED,file,0);
- if (mem==(int *)-1){
- printf("Couldn't get mapping\n");
- return (0);
+ 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));
}
- ibuf = IMB_ibImageFromMemory(mem, size, flags);
+ close(file);
- if (munmap( (void *) mem, size)){
- printf("Couldn't unmap file.\n");
- }
- 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;
-struct ImBuf *IMB_loadiffname(const char *naam, int flags) {
- int file;
- struct ImBuf *ibuf;
- int buf[1];
-
- file = open(naam, O_BINARY|O_RDONLY);
-
- if (file < 0) return (0);
+ if(file == -1) return;
- ibuf= IMB_loadifffile(file, flags);
+ size= BLI_filesize(file);
- if (ibuf == NULL) {
- if (read(file, buf, 4) != 4) buf[0] = 0;
- if ((BIG_LONG(buf[0]) & 0xfffffff0) == 0xffd8ffe0)
- ibuf = imb_ibJpegImageFromFilename(naam, flags);
+ 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;
}
- if (ibuf) {
- strncpy(ibuf->name, naam, sizeof(ibuf->name));
- if (flags & IB_fields) IMB_de_interlace(ibuf);
- }
- close(file);
- return(ibuf);
+ 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);
}
-struct ImBuf *IMB_testiffname(char *naam,int flags) {
+void imb_loadtile(ImBuf *ibuf, int tx, int ty, unsigned int *rect)
+{
int file;
- struct ImBuf *ibuf;
- flags |= IB_test;
- file = open(naam,O_BINARY|O_RDONLY);
+ file = open(ibuf->cachename, O_BINARY|O_RDONLY);
+ if(file < 0) return;
- if (file < 0) return (0);
+ imb_loadtilefile(ibuf, file, tx, ty, rect);
- ibuf=IMB_loadifffile(file,flags);
- if (ibuf) {
- strncpy(ibuf->name, naam, sizeof(ibuf->name));
- }
close(file);
- return(ibuf);
}
+
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..4edb7ac7877 100644
--- a/source/blender/imbuf/intern/rotate.c
+++ b/source/blender/imbuf/intern/rotate.c
@@ -30,10 +30,10 @@
*/
#include "BLI_blenlib.h"
-#include "BKE_utildefines.h"
+#include "BKE_utildefines.h"
+#include "MEM_guardedalloc.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 b3e25b52140..f26eec51b03 100644
--- a/source/blender/imbuf/intern/scaling.c
+++ b/source/blender/imbuf/intern/scaling.c
@@ -30,9 +30,9 @@
*/
#include "BLI_blenlib.h"
+#include "MEM_guardedalloc.h"
#include "imbuf.h"
-#include "imbuf_patch.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -347,142 +347,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(
@@ -1687,55 +1551,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 092c52d427b..b5434b85b5a 100644
--- a/source/blender/imbuf/intern/targa.c
+++ b/source/blender/imbuf/intern/targa.c
@@ -31,16 +31,15 @@
#include <io.h>
#endif
#include "BLI_blenlib.h"
+#include "MEM_guardedalloc.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 +233,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 +247,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,18 +255,16 @@ 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) {
@@ -294,17 +278,6 @@ short imb_savetarga(struct ImBuf * ibuf, char *name, int flags)
return (0);
}
- if (ibuf->cmap){
- for (i = 0 ; i<ibuf->maxcol ; 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 +338,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 +532,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 +543,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 +578,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 +618,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 +663,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 5e0504155dc..f3415d44ecb 100644
--- a/source/blender/imbuf/intern/thumbs.c
+++ b/source/blender/imbuf/intern/thumbs.c
@@ -29,7 +29,6 @@
#include <stdio.h>
-#include "BKE_global.h"
#include "BKE_utildefines.h"
#include "BLI_blenlib.h"
#include "MEM_guardedalloc.h"
@@ -37,7 +36,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"
@@ -241,17 +240,16 @@ void IMB_thumb_makedirs()
}
/* create thumbnail for file and returns new imbuf for thumbnail */
-ImBuf* IMB_thumb_create(const char* path, 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 uri[URI_MAX]= "";
char desc[URI_MAX+22];
char tpath[FILE_MAX];
char tdir[FILE_MAX];
char temp[FILE_MAX];
- char mtime[40];
- char cwidth[40];
- char cheight[40];
+ char mtime[40]= "0"; /* incase we can't stat the file */
+ char cwidth[40]= "0"; /* incase images have no data */
+ char cheight[40]= "0";
char thumb[40];
short tsize = 128;
short ex, ey;
@@ -266,7 +264,7 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source)
tsize = 256;
break;
case THB_FAIL:
- tsize = 0;
+ tsize = 1;
break;
default:
return 0; /* unknown size */
@@ -282,11 +280,21 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source)
return NULL;
}
if (size == THB_FAIL) {
- img = IMB_allocImBuf(0,0,32, IB_rect | IB_imginfo, 0);
+ img = IMB_allocImBuf(1,1,32, IB_rect | IB_metadata, 0);
if (!img) return 0;
} else {
- if (THB_SOURCE_IMAGE == source) {
- img = IMB_loadiffname(path, 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(path, &info);
sprintf(mtime, "%ld", info.st_mtime);
@@ -295,7 +303,7 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source)
}
} else if (THB_SOURCE_MOVIE == source) {
struct anim * anim = NULL;
- anim = IMB_open_anim(path, 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) {
@@ -325,20 +333,20 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source)
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);
}
@@ -358,7 +366,7 @@ ImBuf* IMB_thumb_read(const char* path, ThumbSize size)
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;
@@ -409,10 +417,10 @@ ImBuf* IMB_thumb_manage(const char* path, ThumbSize size, ThumbSource source)
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;
@@ -425,10 +433,10 @@ ImBuf* IMB_thumb_manage(const char* path, ThumbSize size, ThumbSource 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);
+ img = IMB_thumb_create(path, size, source, NULL);
if(!img){
/* thumb creation failed, write fail thumb */
- img = IMB_thumb_create(path, THB_FAIL, source);
+ img = IMB_thumb_create(path, THB_FAIL, source, NULL);
if (img) {
/* we don't need failed thumb anymore */
IMB_freeImBuf(img);
@@ -438,10 +446,10 @@ ImBuf* IMB_thumb_manage(const char* path, ThumbSize size, ThumbSource source)
}
}
} else {
- img = IMB_thumb_create(path, size, source);
+ img = IMB_thumb_create(path, size, source, NULL);
if(!img){
/* thumb creation failed, write fail thumb */
- img = IMB_thumb_create(path, 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..cb27b1a647f
--- /dev/null
+++ b/source/blender/imbuf/intern/thumbs_blend.c
@@ -0,0 +1,192 @@
+/**
+ * $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 <string.h>
+
+#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[12];
+ int bhead[24/sizeof(int)]; /* max size on 64bit */
+ char endian, pointer_size;
+ char endian_switch;
+ int sizeof_bhead ;
+
+ /* read the blend file header */
+ if(gzread(gzfile, buf, 12) != 12)
+ 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;
+
+ sizeof_bhead = 16 + pointer_size;
+
+ if(buf[8]=='V')
+ endian= B_ENDIAN; /* big: PPC */
+ else if(buf[8]=='v')
+ endian= L_ENDIAN; /* little: x86 */
+ else
+ return NULL;
+
+ endian_switch = ((ENDIAN_ORDER != endian)) ? 1 : 0;
+
+ while(gzread(gzfile, bhead, sizeof_bhead) == sizeof_bhead) {
+ if(endian_switch)
+ SWITCH_INT(bhead[1]); /* length */
+
+ if (bhead[0]==REND) {
+ gzseek(gzfile, bhead[1], SEEK_CUR); /* skip to the next */
+ }
+ else {
+ break;
+ }
+ }
+
+ /* using 'TEST' since new names segfault when loading in old blenders */
+ if(bhead[0] == TEST) {
+ ImBuf *img= NULL;
+ int size[2];
+
+ if(gzread(gzfile, size, sizeof(size)) != sizeof(size))
+ return NULL;
+
+ if(endian_switch) {
+ SWITCH_INT(size[0]);
+ SWITCH_INT(size[1]);
+ }
+ /* length */
+ bhead[1] -= sizeof(int) * 2;
+
+ /* inconsistant image size, quit early */
+ if(bhead[1] != size[0] * size[1] * sizeof(int))
+ return NULL;
+
+ /* finally malloc and read the data */
+ img= IMB_allocImBuf(size[0], size[1], 32, IB_rect | IB_metadata, 0);
+
+ if(gzread(gzfile, img->rect, bhead[1]) != bhead[1]) {
+ IMB_freeImBuf(img);
+ img= NULL;
+ }
+
+ return img;
+ }
+
+ return NULL;
+}
+
+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 dd18c77c5c6..6b94583f17d 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 <string.h>
#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"
@@ -72,12 +77,12 @@ 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));
@@ -108,28 +113,28 @@ static int imb_tiff_DummyMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
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) */
@@ -171,12 +176,12 @@ 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)
{
- 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);
}
@@ -218,11 +223,11 @@ static toff_t imb_tiff_SeekProc(thandle_t handle, toff_t ofs, int whence)
*/
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);
}
@@ -244,11 +249,11 @@ static int imb_tiff_CloseProc(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 @@ static 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 @@ static 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,161 @@ int imb_is_a_tiff(void *mem)
(memcmp(lil_endian, mem, IMB_TIFF_NCB) == 0) );
}
+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_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];
+}
+
+/*
+ * 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= 0;
+ short bitspersample, spp, config;
+ size_t scanline;
+ int ib_flag=0, row, chan;
+ float *fbuf=NULL;
+ unsigned short *sbuf=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 {
+ ib_flag = IB_rect;
+ }
+
+ tmpibuf= IMB_allocImBuf(ibuf->x, ibuf->y, ibuf->depth, ib_flag, 0);
+
+ /* simple RGBA image */
+ if (!(bitspersample == 32 || bitspersample == 16)) {
+ success |= TIFFReadRGBAImage(image, ibuf->x, ibuf->y, tmpibuf->rect, 0);
+ }
+ /* contiguous channels: RGBRGBRGB */
+ else 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);
+ }
+ }
+ /* 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);
+
+ }
+ }
+ }
+ }
+
+ if (bitspersample == 32)
+ _TIFFfree(fbuf);
+ else if (bitspersample == 16)
+ _TIFFfree(sbuf);
+
+ if(success) {
+ ibuf->profile = (bitspersample==32)?IB_PROFILE_LINEAR_RGB:IB_PROFILE_SRGB;
+
+ 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 +464,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<numlevel; level++) {
+ if(!TIFFSetDirectory(image, level))
+ break;
+
+ if(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 +631,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 +642,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 +661,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 {
+ }
+ else {
/* create image as a file */
- image = libtiff_TIFFOpen(name, "w");
+ image = TIFFOpen(name, "w");
}
- if (image == NULL) {
+ if(image == NULL) {
fprintf(stderr,
"imb_savetiff: could not open TIFF for writing.\n");
return (0);
@@ -483,16 +681,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 +705,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 */
diff --git a/source/blender/imbuf/intern/util.c b/source/blender/imbuf/intern/util.c
index b1ca414434f..cd447e5e43a 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 <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
@@ -88,153 +68,127 @@
#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])
+const char *imb_ext_image[] = {
+ ".png",
+ ".tga",
+ ".bmp",
+ ".jpg", ".jpeg",
+ ".sgi", ".rgb", ".rgba",
+#ifdef WITH_TIFF
+ ".tif", ".tiff", ".tx",
+#endif
+#ifdef WITH_OPENJPEG
+ ".jp2",
+#endif
+#ifdef WITH_HDR
+ ".hdr",
+#endif
+#ifdef WITH_DDS
+ ".dds",
+#endif
+#ifdef WITH_CINEON
+ ".dpx",
+ ".cin",
+#endif
+#ifdef WITH_OPENEXR
+ ".exr",
+#endif
+ NULL};
+
+const char *imb_ext_image_qt[] = {
+ ".gif",
+ ".psd",
+ ".pct", ".pict",
+ ".pntg",
+ ".qtif",
+ NULL};
+
+const char *imb_ext_movie[] = {
+ ".avi",
+ ".flc",
+ ".mov",
+ ".movie",
+ ".mp4",
+ ".m4v",
+ ".m2v",
+ ".m2t",
+ ".mts",
+ ".mv",
+ ".avs",
+ ".wmv",
+ ".ogv",
+ ".dv",
+ ".mpeg",
+ ".mpg",
+ ".mpg2",
+ ".vob",
+ ".mkv",
+ ".flv",
+ ".divx",
+ ".xvid",
+ NULL};
+
+/* sort of wrong being here... */
+const char *imb_ext_audio[] = {
+ ".wav",
+ ".ogg",
+ ".oga",
+ ".mp3",
+ ".mp2",
+ ".ac3",
+ ".aac",
+ ".flac",
+ ".wma",
+ ".eac3",
+ NULL};
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);
-
- /* 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 (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
+ if(stat(name,&st) == -1)
+ return FALSE;
+ if(((st.st_mode) & S_IFMT) != S_IFREG)
+ return FALSE;
- return(FALSE);
- }
- close(fp);
- }
+ if((fp = open(name,O_BINARY|O_RDONLY)) < 0)
+ return FALSE;
+
+ 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"))) {
- return IMB_ispic_name(filename);
+ if( (BLI_testextensie_array(filename, imb_ext_image)) ||
+ (G.have_quicktime && BLI_testextensie_array(filename, imb_ext_image_qt))
+ ) {
+ return IMB_ispic_name(filename);
}
- if (G.have_quicktime){
- if( BLI_testextensie(filename, ".jpg")
- || BLI_testextensie(filename, ".jpeg")
- || BLI_testextensie(filename, ".tif")
- || BLI_testextensie(filename, ".tiff")
- || BLI_testextensie(filename, ".hdr")
- || BLI_testextensie(filename, ".tga")
- || BLI_testextensie(filename, ".rgb")
- || BLI_testextensie(filename, ".bmp")
- || BLI_testextensie(filename, ".png")
-#ifdef WITH_DDS
- || BLI_testextensie(filename, ".dds")
-#endif
- || BLI_testextensie(filename, ".iff")
- || BLI_testextensie(filename, ".lbm")
- || BLI_testextensie(filename, ".gif")
- || BLI_testextensie(filename, ".psd")
- || BLI_testextensie(filename, ".pct")
- || BLI_testextensie(filename, ".pict")
- || BLI_testextensie(filename, ".pntg") //macpaint
- || BLI_testextensie(filename, ".qtif")
- || BLI_testextensie(filename, ".cin")
-#ifdef WITH_BF_OPENEXR
- || BLI_testextensie(filename, ".exr")
-#endif
-#ifdef WITH_BF_OPENJPEG
- || BLI_testextensie(filename, ".jp2")
-#endif
- || BLI_testextensie(filename, ".sgi")) {
- return IMB_ispic_name(filename);
- } else {
- return(FALSE);
- }
- } else { /* no quicktime or libtiff */
- if( BLI_testextensie(filename, ".jpg")
- || BLI_testextensie(filename, ".jpeg")
- || BLI_testextensie(filename, ".hdr")
- || BLI_testextensie(filename, ".tga")
- || BLI_testextensie(filename, ".rgb")
- || BLI_testextensie(filename, ".bmp")
- || BLI_testextensie(filename, ".png")
- || BLI_testextensie(filename, ".cin")
-#ifdef WITH_DDS
- || BLI_testextensie(filename, ".dds")
-#endif
-#ifdef WITH_BF_OPENEXR
- || BLI_testextensie(filename, ".exr")
-#endif
-#ifdef WITH_BF_OPENJPEG
- || BLI_testextensie(filename, ".jp2")
-#endif
- || BLI_testextensie(filename, ".iff")
- || BLI_testextensie(filename, ".lbm")
- || BLI_testextensie(filename, ".sgi")) {
- return IMB_ispic_name(filename);
- }
- else {
- return(FALSE);
- }
+ else {
+ return FALSE;
}
- } else { /* no FILTERFILEEXTS */
+ }
+ else { /* no FILTERFILEEXTS */
return IMB_ispic_name(filename);
}
}
@@ -391,14 +345,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 +368,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 <stdio.h>
-#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 <io.h>
-#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);
- }
- else{
- if (ok) ok = imb_encodebodyh(ibuf,file);
+ return type->save(ibuf, name, flags);
}
- 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 e9b1b655ad8..49c2df42810 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -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;
@@ -164,7 +164,6 @@ typedef struct PreviewImage {
#define ID_MA MAKE_ID2('M', 'A') /* Material */
#define ID_TE MAKE_ID2('T', 'E') /* Texture */
#define ID_IM MAKE_ID2('I', 'M') /* Image */
-#define ID_WV MAKE_ID2('W', 'V') /* Wave (unused) */
#define ID_LT MAKE_ID2('L', 'T') /* Lattice */
#define ID_LA MAKE_ID2('L', 'A') /* Lamp */
#define ID_CA MAKE_ID2('C', 'A') /* Camera */
@@ -205,8 +204,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 18b3c1095cc..f7bbf9235ab 100644
--- a/source/blender/makesdna/DNA_action_types.h
+++ b/source/blender/makesdna/DNA_action_types.h
@@ -33,9 +33,8 @@
#include "DNA_listBase.h"
#include "DNA_ID.h"
-#include "DNA_gpencil_types.h"
#include "DNA_view2d_types.h"
-#include "DNA_userdef_types.h"
+#include "DNA_userdef_types.h" /* ThemeWireColor */
struct SpaceLink;
struct Object;
@@ -154,6 +153,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 */
@@ -344,6 +345,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;
@@ -547,6 +549,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;
diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h
index a59b748945f..76bb9a5f96f 100644
--- a/source/blender/makesdna/DNA_actuator_types.h
+++ b/source/blender/makesdna/DNA_actuator_types.h
@@ -37,9 +37,6 @@ struct Scene;
struct Group;
struct Text;
-// for Sound3D
-#include "DNA_sound_types.h"
-
/* ****************** ACTUATORS ********************* */
/* unused now, moved to editobjectactuator in 2.02. Still needed for dna */
@@ -61,6 +58,18 @@ typedef struct bActionActuator {
float stridelength; /* Displacement incurred by cycle */ // not in use
} bActionActuator;
+typedef struct Sound3D
+{
+ float min_gain;
+ float max_gain;
+ float reference_distance;
+ float max_distance;
+ float rolloff_factor;
+ float cone_inner_angle;
+ float cone_outer_angle;
+ float cone_outer_gain;
+} Sound3D;
+
typedef struct bSoundActuator {
short flag, sndnr;
int pad1, pad2;
@@ -95,7 +104,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 {
@@ -236,13 +245,6 @@ typedef struct bActuator {
} bActuator;
-typedef struct FreeCamera {
- float mass, accelleration;
- float maxspeed, maxrotspeed, maxtiltspeed;
- int flag;
- float rotdamp, tiltdamp, speeddamp, pad;
-} FreeCamera;
-
/* objectactuator->flag */
#define ACT_FORCE_LOCAL 1
#define ACT_TORQUE_LOCAL 2
@@ -351,6 +353,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 +500,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_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 14930f85e63..1492319fe22 100644
--- a/source/blender/makesdna/DNA_brush_types.h
+++ b/source/blender/makesdna/DNA_brush_types.h
@@ -31,11 +31,11 @@
#define DNA_BRUSH_TYPES_H
#include "DNA_ID.h"
-#include "DNA_texture_types.h"
+#include "DNA_texture_types.h" /* for MTex */
-#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,50 +53,99 @@ 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) */
-
- float rgb[3]; /* color */
- float alpha; /* opacity */
-
- char sculpt_tool; /* active sculpt tool */
+
+ struct ImBuf *icon_imbuf;
+ PreviewImage *preview;
+ char icon_filepath[240];
+
+ float normal_weight;
+
+ short blend; /* blend mode */
+ short ob_mode; /* & with ob->mode to see if the brush is compatible, use for display only. */
+ 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_LOCK_ALPHA 16384
+#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)
+#define BRUSH_CUSTOM_ICON (1<<28)
/* 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
@@ -104,5 +153,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 a15f9a4eb4c..3a9c7b22cde 100644
--- a/source/blender/makesdna/DNA_camera_types.h
+++ b/source/blender/makesdna/DNA_camera_types.h
@@ -46,7 +46,7 @@ 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;
@@ -54,9 +54,7 @@ typedef struct Camera {
/* 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;
+ float YF_dofdist;
struct Ipo *ipo; // XXX depreceated... old animation system
diff --git a/source/blender/makesdna/DNA_color_types.h b/source/blender/makesdna/DNA_color_types.h
index 2a6dcfcb64e..83cd7979ce7 100644
--- a/source/blender/makesdna/DNA_color_types.h
+++ b/source/blender/makesdna/DNA_color_types.h
@@ -64,7 +64,8 @@ typedef struct CurveMap {
typedef struct CurveMapping {
int flag, cur; /* cur; for buttons, to show active curve */
- int preset, pad;
+ int preset;
+ int changed_timestamp;
rctf curr, clipr; /* current rect, clip rect (is default rect too) */
@@ -87,21 +88,60 @@ typedef enum CurveMappingPreset {
CURVE_PRESET_SHARP,
CURVE_PRESET_SMOOTH,
CURVE_PRESET_MAX,
- CURVE_PRESET_MID9
+ 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 mode;
int height;
+} Histogram;
+
+struct ImBuf;
+
+typedef struct Scopes {
int ok;
- int flag;
+ 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;
-} Histogram;
+} 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 6c7bda171eb..dbd9be14c0e 100644
--- a/source/blender/makesdna/DNA_constraint_types.h
+++ b/source/blender/makesdna/DNA_constraint_types.h
@@ -33,7 +33,6 @@
#include "DNA_ID.h"
#include "DNA_listBase.h"
-#include "DNA_object_types.h"
struct Action;
struct Text;
@@ -82,7 +81,7 @@ typedef struct bConstraint {
typedef struct bConstraintTarget {
struct bConstraintTarget *next, *prev;
- Object *tar; /* object to use as target */
+ struct Object *tar; /* object to use as target */
char subtarget[32]; /* subtarget - pchan or vgroup name */
float matrix[4][4]; /* matrix used during constraint solving - should be cleared before each use */
@@ -118,7 +117,7 @@ typedef struct bPythonConstraint {
ListBase targets; /* a list of targets that this constraint has (bConstraintTarget-s) */
- Object *tar; /* target from previous implementation (version-patch sets this to NULL on file-load) */
+ struct Object *tar; /* target from previous implementation (version-patch sets this to NULL on file-load) */
char subtarget[32]; /* subtarger from previous implentation (version-patch sets this to "" on file-load) */
} bPythonConstraint;
@@ -130,13 +129,13 @@ typedef struct bPythonConstraint {
This is indicated in the comments for each field
*/
typedef struct bKinematicConstraint {
- Object *tar; /* All: target object in case constraint needs a target */
+ struct Object *tar; /* All: target object in case constraint needs a target */
short iterations; /* All: Maximum number of iterations to try */
short flag; /* All & CopyPose: some options Like CONSTRAINT_IK_TIP */
short rootbone; /* All: index to rootbone, if zero go all the way to mother bone */
short max_rootbone; /* CopyPose: for auto-ik, maximum length of chain */
char subtarget[32]; /* All: String to specify sub-object target */
- Object *poletar; /* All: Pole vector target */
+ struct Object *poletar; /* All: Pole vector target */
char polesubtarget[32]; /* All: Pole vector sub-object target */
float poleangle; /* All: Pole vector rest angle */
float weight; /* All: Weight of constraint in IK tree */
@@ -160,7 +159,7 @@ typedef enum B_CONSTRAINT_IK_TYPE {
*/
typedef struct bSplineIKConstraint {
/* target(s) */
- Object *tar; /* curve object (with follow path enabled) which drives the bone chain */
+ struct Object *tar; /* curve object (with follow path enabled) which drives the bone chain */
/* binding details */
float *points; /* array of numpoints items, denoting parametric positions along curve that joints should follow */
@@ -174,9 +173,10 @@ typedef struct bSplineIKConstraint {
/* Single-target subobject constraints --------------------- */
+
/* Track To Constraint */
typedef struct bTrackToConstraint {
- Object *tar;
+ struct Object *tar;
int reserved1; /* I'll be using reserved1 and reserved2 as Track and Up flags, not sure if that's what they were intented for anyway. Not sure either if it would create backward incompatibility if I were to rename them. - theeth*/
int reserved2;
int flags;
@@ -186,7 +186,7 @@ typedef struct bTrackToConstraint {
/* Copy Rotation Constraint */
typedef struct bRotateLikeConstraint {
- Object *tar;
+ struct Object *tar;
int flag;
int reserved1;
char subtarget[32];
@@ -194,7 +194,7 @@ typedef struct bRotateLikeConstraint {
/* Copy Location Constraint */
typedef struct bLocateLikeConstraint {
- Object *tar;
+ struct Object *tar;
int flag;
int reserved1;
char subtarget[32];
@@ -202,7 +202,7 @@ typedef struct bLocateLikeConstraint {
/* Copy Scale Constraint */
typedef struct bSizeLikeConstraint {
- Object *tar;
+ struct Object *tar;
int flag;
int reserved1;
char subtarget[32];
@@ -210,19 +210,19 @@ typedef struct bSizeLikeConstraint {
/* Maintain Volume Constraint */
typedef struct bSameVolumeConstraint {
- int flag;
+ int flag;
float volume;
} bSameVolumeConstraint;
/* Copy Transform Constraint */
typedef struct bTransLikeConstraint {
- Object *tar;
+ struct Object *tar;
char subtarget[32];
} bTransLikeConstraint;
/* Floor Constraint */
typedef struct bMinMaxConstraint {
- Object *tar;
+ struct Object *tar;
int minmaxflag;
float offset;
int flag;
@@ -233,7 +233,7 @@ typedef struct bMinMaxConstraint {
/* Action Constraint */
typedef struct bActionConstraint {
- Object *tar;
+ struct Object *tar;
short type; /* what transform 'channel' drives the result */
short local; /* was used in versions prior to the Constraints recode */
int start;
@@ -247,7 +247,7 @@ typedef struct bActionConstraint {
/* Locked Axis Tracking constraint */
typedef struct bLockTrackConstraint {
- Object *tar;
+ struct Object *tar;
int trackflag;
int lockflag;
char subtarget[32];
@@ -255,7 +255,7 @@ typedef struct bLockTrackConstraint {
/* Damped Tracking constraint */
typedef struct bDampTrackConstraint {
- Object *tar;
+ struct Object *tar;
int trackflag;
int pad;
char subtarget[32];
@@ -263,7 +263,7 @@ typedef struct bDampTrackConstraint {
/* Follow Path constraints */
typedef struct bFollowPathConstraint {
- Object *tar; /* Must be path object */
+ struct Object *tar; /* Must be path object */
float offset; /* Offset in time on the path (in frames), when NOT using 'fixed position' */
float offset_fac; /* Parametric offset factor defining position along path, when using 'fixed position' */
@@ -276,7 +276,7 @@ typedef struct bFollowPathConstraint {
/* Stretch to constraint */
typedef struct bStretchToConstraint {
- Object *tar;
+ struct Object *tar;
int volmode;
int plane;
float orglength;
@@ -286,8 +286,8 @@ typedef struct bStretchToConstraint {
/* Rigid Body constraint */
typedef struct bRigidBodyJointConstraint {
- Object *tar;
- Object *child;
+ struct Object *tar;
+ struct Object *child;
int type;
float pivX;
float pivY;
@@ -306,14 +306,14 @@ typedef struct bRigidBodyJointConstraint {
/* Clamp-To Constraint */
typedef struct bClampToConstraint {
- Object *tar; /* 'target' must be a curve */
+ struct Object *tar; /* 'target' must be a curve */
int flag; /* which axis/plane to compare owner's location on */
int flag2; /* for legacy reasons, this is flag2. used for any extra settings */
} bClampToConstraint;
/* Child Of Constraint */
typedef struct bChildOfConstraint {
- Object *tar; /* object which will act as parent (or target comes from) */
+ struct Object *tar; /* object which will act as parent (or target comes from) */
int flag; /* settings */
int pad;
float invmat[4][4]; /* parent-inverse matrix to use */
@@ -322,7 +322,7 @@ typedef struct bChildOfConstraint {
/* Generic Transform->Transform Constraint */
typedef struct bTransformConstraint {
- Object *tar; /* target (i.e. 'driver' object/bone) */
+ struct Object *tar; /* target (i.e. 'driver' object/bone) */
char subtarget[32];
short from, to; /* can be loc(0) , rot(1), or size(2) */
@@ -336,6 +336,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
+ */
+ struct 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 {
@@ -366,7 +384,7 @@ typedef struct bSizeLimitConstraint {
/* Limit Distance Constraint */
typedef struct bDistLimitConstraint {
- Object *tar;
+ struct Object *tar;
char subtarget[32];
float dist; /* distance (radius of clamping sphere) from target */
@@ -379,7 +397,7 @@ typedef struct bDistLimitConstraint {
/* ShrinkWrap Constraint */
typedef struct bShrinkwrapConstraint {
- Object *target;
+ struct Object *target;
float dist; /* distance to kept from target */
short shrinkType; /* shrink type (look on MOD shrinkwrap for values) */
char projAxis; /* axis to project over UP_X, UP_Y, UP_Z */
@@ -419,6 +437,7 @@ typedef enum eBConstraint_Types {
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
@@ -469,11 +488,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),
@@ -688,6 +702,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 82418899172..8537b703c69 100644
--- a/source/blender/makesdna/DNA_curve_types.h
+++ b/source/blender/makesdna/DNA_curve_types.h
@@ -48,6 +48,7 @@ struct VFont;
struct AnimData;
struct SelBox;
struct EditFont;
+struct GHash;
/* These two Lines with # tell makesdna this struct can be excluded. */
#
@@ -55,7 +56,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 +81,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;
@@ -150,6 +151,19 @@ typedef struct TextBox {
float x, y, w, h;
} TextBox;
+typedef struct EditNurb {
+ /* base of nurbs' list (old Curve->editnurb) */
+ ListBase nurbs;
+
+ /* index data for shape keys */
+ struct GHash *keyindex;
+
+ /* shape key being edited */
+ int shapenr;
+
+ char pad[4];
+} EditNurb;
+
typedef struct Curve {
ID id;
struct AnimData *adt; /* animation data (must be immediately after id for utilities to use it) */
@@ -159,7 +173,7 @@ typedef struct Curve {
ListBase nurb; /* actual data, called splines in rna */
ListBase disp;
- ListBase *editnurb; /* edited data, not in file, use pointer so we can check for it */
+ EditNurb *editnurb; /* edited data, not in file, use pointer so we can check for it */
struct Object *bevobj, *taperobj, *textoncurve;
struct Ipo *ipo; // XXX depreceated... old animation system
@@ -177,7 +191,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 +203,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;
@@ -236,7 +250,7 @@ typedef struct Curve {
#define CU_PATH 8
#define CU_FOLLOW 16
#define CU_UV_ORCO 32
-#define CU_NOPUNOFLIP 64
+#define CU_DEFORM_BOUNDS_OFF 64
#define CU_STRETCH 128
#define CU_OFFS_PATHDIST 256
#define CU_FAST 512 /* Font: no filling inside editmode */
@@ -324,11 +338,17 @@ 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 occurred here */
+#define CU_CHINFO_SMALLCAPS (1<<4)
+#define CU_CHINFO_SMALLCAPS_CHECK (1<<5) /* set at runtime, checks if case switching is needed */
+
+/* mixed with KEY_LINEAR but define here since only curve supports */
+#define KEY_CU_EASE 3
+
#endif
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 5aed1d0c2d0..d1aa3c00ac4 100644
--- a/source/blender/makesdna/DNA_image_types.h
+++ b/source/blender/makesdna/DNA_image_types.h
@@ -105,17 +105,17 @@ typedef struct Image {
/* **************** IMAGE ********************* */
-/* flag */
+/* Image.flag */
#define IMA_FIELDS 1
#define IMA_STD_FIELD 2
#define IMA_DO_PREMUL 4
#define IMA_REFLECT 16
#define IMA_NOCOLLECT 32
-#define IMA_ANTIALI 64
+#define IMA_DEPRECATED 64
#define IMA_OLD_PREMUL 128
-/* tpageflag */
+/* Image.tpageflag */
#define IMA_TILES 1
#define IMA_TWINANIM 2
#define IMA_COLCYCLE 4 /* Depreciated */
diff --git a/source/blender/makesdna/DNA_lamp_types.h b/source/blender/makesdna/DNA_lamp_types.h
index 1cf6b25c58f..5231108a756 100644
--- a/source/blender/makesdna/DNA_lamp_types.h
+++ b/source/blender/makesdna/DNA_lamp_types.h
@@ -93,20 +93,14 @@ typedef struct Lamp {
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..94fc9fefb66 100644
--- a/source/blender/makesdna/DNA_lattice_types.h
+++ b/source/blender/makesdna/DNA_lattice_types.h
@@ -36,6 +36,14 @@ struct Ipo;
struct Key;
struct MDeformVert;
+typedef struct EditLatt {
+ struct Lattice *latt;
+
+ int shapenr;
+
+ char pad[4];
+} EditLatt;
+
typedef struct Lattice {
ID id;
@@ -52,12 +60,13 @@ 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;
float latmat[4][4];
- struct Lattice *editlatt;
+ struct EditLatt *editlatt;
} Lattice;
/* ***************** LATTICE ********************* */
diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h
index 9f8d07b987f..4e41309cff4 100644
--- a/source/blender/makesdna/DNA_mesh_types.h
+++ b/source/blender/makesdna/DNA_mesh_types.h
@@ -128,8 +128,8 @@ typedef struct TFace {
/* me->flag */
-#define ME_ISDONE 1
-#define ME_NOPUNOFLIP 2
+/* #define ME_ISDONE 1 */
+#define ME_DEPRECATED 2
#define ME_TWOSIDED 4
#define ME_UVEFFECT 8
#define ME_VCOLEFFECT 16
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index a9178a392f4..27f9c9cd5f3 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -66,6 +66,9 @@ typedef enum ModifierType {
eModifierType_ShapeKey,
eModifierType_Solidify,
eModifierType_Screw,
+ /* placeholder, keep this so durian files load in
+ * trunk with the correct modifier once its merged */
+ eModifierType_Warp,
NUM_MODIFIER_TYPES
} ModifierType;
@@ -83,6 +86,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) */
@@ -516,9 +520,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? */
@@ -528,8 +536,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;
@@ -571,7 +583,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),
@@ -599,7 +611,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;
@@ -694,6 +706,7 @@ typedef struct SolidifyModifierData {
#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;
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index c587b2106ff..fe422bfa689 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -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;
@@ -255,6 +255,7 @@ typedef struct NodeChroma {
typedef struct NodeTwoXYs {
short x1, x2, y1, y2;
+ float fac_x1, fac_x2, fac_y1, fac_y2;
} NodeTwoXYs;
typedef struct NodeTwoFloats {
@@ -311,6 +312,10 @@ typedef struct NodeColorBalance {
float lift[3];
float gamma[3];
float gain[3];
+
+ /* temp storage for inverted lift */
+ float lift_lgg[3];
+ float gamma_inv[3];
} NodeColorBalance;
typedef struct NodeColorspill {
diff --git a/source/blender/makesdna/DNA_object_force.h b/source/blender/makesdna/DNA_object_force.h
index 29a188c0f92..63a6b8fbe4a 100644
--- a/source/blender/makesdna/DNA_object_force.h
+++ b/source/blender/makesdna/DNA_object_force.h
@@ -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 b572c50a4ae..273b885f407 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -35,7 +35,7 @@
#include "DNA_listBase.h"
#include "DNA_ID.h"
-#include "DNA_action_types.h"
+#include "DNA_action_types.h" /* bAnimVizSettings */
#ifdef __cplusplus
extern "C" {
@@ -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
@@ -300,7 +301,7 @@ extern Object workob;
#define OB_LAMP 10
#define OB_CAMERA 11
-#define OB_WAVE 21
+// #define OB_WAVE 21
#define OB_LATTICE 22
/* 23 and 24 are for life and sector (old file compat.) */
@@ -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
@@ -551,6 +556,8 @@ typedef enum ObjectMode {
OB_MODE_POSE = 64
} ObjectMode;
+#define MAX_DUPLI_RECUR 8
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/makesdna/DNA_particle_types.h b/source/blender/makesdna/DNA_particle_types.h
index 8367875aa7a..105fa6d5289 100644
--- a/source/blender/makesdna/DNA_particle_types.h
+++ b/source/blender/makesdna/DNA_particle_types.h
@@ -136,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;
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index f9deebb0026..cc5d256615e 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -36,12 +36,12 @@
extern "C" {
#endif
-#include "DNA_brush_types.h"
#include "DNA_vec_types.h"
#include "DNA_listBase.h"
#include "DNA_ID.h"
struct Object;
+struct Brush;
struct World;
struct Scene;
struct Image;
@@ -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,24 +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_INDIRECT 8192
-#define SCE_PASS_MIST 16384
-#define SCE_PASS_RAYHITS 32768
-#define SCE_PASS_EMIT 65536
-#define SCE_PASS_ENVIRONMENT 131072
+#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... */
@@ -200,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 */
@@ -335,18 +344,8 @@ typedef struct RenderData {
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 */
+
+ /* paths to backbufffer, output */
char backbuf[160], pic[160];
/* stamps flags. */
@@ -508,9 +507,7 @@ typedef struct TimeMarker {
} TimeMarker;
typedef struct Paint {
- /* Array of brushes selected for use in this paint mode */
- Brush **brushes;
- int active_brush_index, brush_count;
+ struct Brush *brush;
/* WM Paint cursor */
void *paint_cursor;
@@ -570,12 +567,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 {
@@ -707,8 +722,16 @@ typedef struct ToolSettings {
/* Transform */
short snap_mode, snap_flag, snap_target;
short proportional, prop_mode;
+ char proportional_objects; /* proportional edit, object mode */
+ char pad[3];
+
+ int auto_normalize; /*auto normalizing mode in wpaint*/
- int auto_normalize, intpad; /*auto normalizing mode in wpaint*/
+ short sculpt_paint_settings; /* user preferences for sculpt and paint */
+ short pad1;
+ 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 */
} ToolSettings;
typedef struct bStats {
@@ -726,7 +749,7 @@ typedef struct UnitSettings {
typedef struct PhysicsSettings {
float gravity[3];
- int flag;
+ int flag, quick_cache_step, rt;
} PhysicsSettings;
typedef struct Scene {
@@ -746,9 +769,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;
@@ -770,6 +795,7 @@ typedef struct Scene {
void *sound_scene;
void *sound_scene_handle;
+ void *sound_scrub_handle;
void *fps_info; /* (runtime) info/cache used for presenting playback framerate info to the user */
@@ -934,8 +960,8 @@ typedef struct Scene {
/* imtype */
#define R_TARGA 0
#define R_IRIS 1
-#define R_HAMX 2
-#define R_FTYPE 3 /* ftype is nomore */
+/* #define R_HAMX 2 */ /* hamx is nomore */
+/* #define R_FTYPE 3 */ /* ftype is nomore */
#define R_JPEG90 4
#define R_MOVIE 5
#define R_IRIZ 7
@@ -1021,6 +1047,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)
@@ -1091,7 +1118,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 */
@@ -1104,21 +1130,31 @@ 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;
+/* 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)
+#define SCULPT_PAINT_UNIFIED_SIZE_PRESSURE (1<<3)
+#define SCULPT_PAINT_UNIFIED_ALPHA_PRESSURE (1<<4)
+
/* ImagePaintSettings.flag */
#define IMAGEPAINT_DRAWING 1
#define IMAGEPAINT_DRAW_TOOL 2
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index 6d73c261f23..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 */
diff --git a/source/blender/makesdna/DNA_sdna_types.h b/source/blender/makesdna/DNA_sdna_types.h
index 9b486e2851d..f2bdfeff9dd 100644
--- a/source/blender/makesdna/DNA_sdna_types.h
+++ b/source/blender/makesdna/DNA_sdna_types.h
@@ -47,7 +47,7 @@ typedef struct SDNA {
short *typelens; /* type lengths */
int nr_structs; /* number of struct types */
- short **structs; /* sp= structs[a] is the adress of a struct definintion
+ short **structs; /* sp= structs[a] is the address of a struct definintion
sp[0] is struct type number, sp[1] amount of members
(sp[2], sp[3]), (sp[4], sp[5]), .. are the member
diff --git a/source/blender/makesdna/DNA_sensor_types.h b/source/blender/makesdna/DNA_sensor_types.h
index 3bbcb128f07..d7256b5b9e0 100644
--- a/source/blender/makesdna/DNA_sensor_types.h
+++ b/source/blender/makesdna/DNA_sensor_types.h
@@ -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 2fd83742367..d51dec97351 100644
--- a/source/blender/makesdna/DNA_sequence_types.h
+++ b/source/blender/makesdna/DNA_sequence_types.h
@@ -32,12 +32,11 @@
#define DNA_SEQUENCE_TYPES_H
#include "DNA_listBase.h"
-
-/* needed for sound support */
-#include "DNA_sound_types.h"
+#include "DNA_vec_types.h"
struct Ipo;
struct Scene;
+struct bSound;
/* strlens; 80= FILE_MAXFILE, 160= FILE_MAXDIR */
@@ -45,15 +44,6 @@ typedef struct StripElem {
char name[80];
} StripElem;
-typedef struct TStripElem {
- struct ImBuf *ibuf;
- struct ImBuf *ibuf_comp;
- struct TStripElem *se1, *se2, *se3;
- short ok;
- short flag;
- int nr;
-} TStripElem;
-
typedef struct StripCrop {
int top;
int bottom;
@@ -72,8 +62,8 @@ typedef struct StripColorBalance {
float gain[3];
int flag;
int pad;
- float exposure;
- float saturation;
+ // float exposure;
+ // float saturation;
} StripColorBalance;
typedef struct StripProxy {
@@ -96,11 +86,6 @@ typedef struct Strip {
StripCrop *crop;
StripTransform *transform;
StripColorBalance *color_balance;
- TStripElem *tstripdata;
- TStripElem *tstripdata_startstill;
- TStripElem *tstripdata_endstill;
- struct ImBuf *ibuf_startstill;
- struct ImBuf *ibuf_endstill;
} Strip;
@@ -140,6 +125,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. */
@@ -164,10 +150,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 */
@@ -195,6 +182,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 ********* */
@@ -241,6 +232,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
@@ -275,6 +270,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*/
@@ -306,7 +304,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
@@ -319,5 +318,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_smoke_types.h b/source/blender/makesdna/DNA_smoke_types.h
index 46e5c10be3b..b8be51b378f 100644
--- a/source/blender/makesdna/DNA_smoke_types.h
+++ b/source/blender/makesdna/DNA_smoke_types.h
@@ -33,8 +33,8 @@
#define MOD_SMOKE_HIGHRES (1<<1) /* enable high resolution */
#define MOD_SMOKE_DISSOLVE (1<<2) /* let smoke dissolve */
#define MOD_SMOKE_DISSOLVE_LOG (1<<3) /* using 1/x for dissolve */
-#define MOD_SMOKE_INITVELOCITY (1<<4) /* passes particles speed to
- the smoke*/
+
+#define MOD_SMOKE_HIGH_SMOOTH (1<<5) /* smoothens high res emission*/
/* noise */
#define MOD_SMOKE_NOISEWAVE (1<<0)
@@ -47,6 +47,11 @@
#define SM_CACHE_LIGHT 0
#define SM_CACHE_HEAVY 1
+/* domain border collision */
+#define SM_BORDER_OPEN 0
+#define SM_BORDER_VERTICAL 1
+#define SM_BORDER_CLOSED 2
+
typedef struct SmokeDomainSettings {
struct SmokeModifierData *smd; /* for fast RNA access */
struct FLUID_3D *fluid;
@@ -84,6 +89,10 @@ typedef struct SmokeDomainSettings {
struct PointCache *point_cache[2]; /* definition is in DNA_object_force.h */
struct ListBase ptcaches[2];
struct EffectorWeights *effector_weights;
+ int border_collisions; /* How domain border collisions are handled */
+ float time_scale;
+ float vorticity;
+ int pad2;
} SmokeDomainSettings;
@@ -92,18 +101,25 @@ typedef struct SmokeDomainSettings {
/* type */
#define MOD_SMOKE_FLOW_TYPE_OUTFLOW (1<<1)
+/* flags */
+#define MOD_SMOKE_FLOW_ABSOLUTE (1<<1) /*old style emission*/
+#define MOD_SMOKE_FLOW_INITVELOCITY (1<<2) /* passes particles speed to
+ the smoke*/
+
+
typedef struct SmokeFlowSettings {
struct SmokeModifierData *smd; /* for fast RNA access */
struct ParticleSystem *psys;
float density;
float temp; /* delta temperature (temp - ambient temp) */
- float velocity[3]; /* UNUSED, velocity taken from particles */
+ float velocity[2]; /* UNUSED, velocity taken from particles */
+ float vel_multi; // Multiplier for particle velocity
float vgrp_heat_scale[2]; /* min and max scaling for vgroup_heat */
short vgroup_flow; /* where inflow/outflow happens - red=1=action */
short vgroup_density;
short vgroup_heat;
short type; /* inflow =0 or outflow = 1 */
- int pad;
+ int flags; /* absolute emission etc*/
} SmokeFlowSettings;
/*
diff --git a/source/blender/makesdna/DNA_sound_types.h b/source/blender/makesdna/DNA_sound_types.h
index 45dff0c96fa..c10d306565b 100644
--- a/source/blender/makesdna/DNA_sound_types.h
+++ b/source/blender/makesdna/DNA_sound_types.h
@@ -41,18 +41,6 @@ struct Ipo;
struct PackedFile;
struct SpaceLink;
-typedef struct Sound3D
-{
- float min_gain;
- float max_gain;
- float reference_distance;
- float max_distance;
- float rolloff_factor;
- float cone_inner_angle;
- float cone_outer_angle;
- float cone_outer_gain;
-} Sound3D;
-
typedef struct bSound {
ID id;
@@ -115,22 +103,6 @@ typedef enum eSound_Type {
#define SND_DRAWFRAMES 1
#define SND_CFRA_NUM 2
-typedef struct SpaceSound {
- struct SpaceLink *next, *prev;
- ListBase regionbase; /* storage of regions for inactive spaces */
- int spacetype;
- float blockscale;
- struct ScrArea *area;
-
- View2D v2d;
-
- bSound *sound;
- short mode, sndnr;
- short xof, yof;
- short flag, lock;
- int pad2;
-} SpaceSound;
-
#define SOUND_FLAGS_3D (1 << 3)
/* to DNA_sound_types.h*/
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index 00ade3156c5..bf64bc27b48 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -42,8 +42,10 @@
struct ID;
struct Text;
struct Script;
+struct bSound;
struct ImBuf;
struct Image;
+struct Scopes;
struct Histogram;
struct SpaceIpo;
struct BlendHandle;
@@ -159,6 +161,7 @@ typedef struct FileSelectParams {
char dir[240]; /* directory */
char file[80]; /* file */
char renamefile[80];
+ char renameedit[80]; /* annoying but the first is only used for initialization */
short type; /* XXXXX for now store type here, should be moved to the operator */
short flag; /* settings for filter, hiding dots files,... */
@@ -186,7 +189,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 */
@@ -202,7 +205,7 @@ typedef struct SpaceFile {
*/
struct wmOperator *op;
- struct wmTimer *loadimage_timer;
+ struct wmTimer *smoothscroll_timer;
struct FileLayout *layout;
@@ -260,8 +263,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 {
@@ -299,7 +304,8 @@ typedef struct SpaceText {
int showlinenrs;
int tabnumber;
- int showsyntax;
+ short showsyntax;
+ short line_hlight;
short overwrite;
short live_edit; /* run python while editing, evil */
float pix_per_line;
@@ -343,6 +349,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 */
@@ -351,6 +368,9 @@ typedef struct SpaceTime {
View2D v2d; /* deprecated, copied to region */
+ ListBase caches;
+ int cache_display, pad;
+
int flag, redraws;
} SpaceTime;
@@ -370,8 +390,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 */
@@ -527,8 +548,27 @@ typedef struct SpaceUserPref {
int spacetype;
int pad;
+
+ char filter[64]; /* search term for filtering in the UI */
+
} SpaceUserPref;
+typedef struct SpaceSound {
+ struct SpaceLink *next, *prev;
+ ListBase regionbase; /* storage of regions for inactive spaces */
+ int spacetype;
+ float blockscale;
+ struct ScrArea *area;
+
+ View2D v2d;
+
+ struct bSound *sound;
+ short mode, sndnr;
+ short xof, yof;
+ short flag, lock;
+ int pad2;
+} SpaceSound;
+
/* view3d Now in DNA_view3d_types.h */
@@ -621,6 +661,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 {
@@ -807,6 +848,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
@@ -848,6 +893,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
@@ -868,6 +920,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 2c5c50d7dc2..e9e058cbbd6 100644
--- a/source/blender/makesdna/DNA_texture_types.h
+++ b/source/blender/makesdna/DNA_texture_types.h
@@ -32,7 +32,7 @@
#define DNA_TEXTURE_TYPES_H
#include "DNA_ID.h"
-#include "DNA_image_types.h"
+#include "DNA_image_types.h" /* ImageUser */
struct AnimData;
struct Ipo;
@@ -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;
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index d5a2b504962..0591872fa69 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -33,7 +33,7 @@
#define DNA_USERDEF_TYPES_H
#include "DNA_listBase.h"
-#include "DNA_texture_types.h"
+#include "DNA_texture_types.h" /* ColorBand */
/* themes; defines in BIF_resource.h */
struct ColorBand;
@@ -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];
@@ -201,7 +201,7 @@ typedef struct ThemeSpace {
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];
+ 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
@@ -210,7 +210,7 @@ typedef struct ThemeSpace {
char console_cursor[4];
char vertex_size, facedot_size;
- char bpad[6];
+ char bpad[2];
char syntaxl[4], syntaxn[4], syntaxb[4]; // syntax for textwindow and nodes
char syntaxv[4], syntaxc[4];
@@ -223,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];
@@ -343,7 +343,8 @@ typedef struct UserDef {
struct SolidLight light[3];
short tw_hotspot, tw_flag, tw_handlesize, tw_size;
short textimeout,texcollectrate;
- short wmdrawmethod, wmpad;
+ short wmdrawmethod; /* removed wmpad */
+ short pad2;
int memcachelimit;
int prefetchframes;
short frameserverport;
@@ -362,6 +363,8 @@ typedef struct UserDef {
short scrcastfps; /* frame rate for screencast to be played back */
short scrcastwait; /* milliseconds between screencast snapshots */
+
+ short pad8, pad[3]; /* Value for Dual/Single Column UI */
char versemaster[160];
char verseuser[160];
@@ -371,6 +374,11 @@ typedef struct UserDef {
short autokey_flag; /* flags for autokeying */
struct ColorBand coba_weight; /* from texture.h */
+
+ float sculpt_paint_overlay_col[3];
+ int pad3;
+
+ char author[80]; /* author name for file formats supporting it */
} UserDef;
extern UserDef U; /* from blenkernel blender.c */
@@ -388,9 +396,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)
@@ -437,7 +445,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)
@@ -550,4 +558,4 @@ extern UserDef U; /* from blenkernel blender.c */
#define TH_OLDSKOOL 3
#define TH_SHADED 4
-#endif
+#endif \ No newline at end of file
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index c5516a3bff5..520fc56162c 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -185,7 +185,9 @@ typedef struct View3D {
unsigned int customdata_mask;
/* afterdraw, for xray & transparent */
- struct ListBase afterdraw;
+ struct ListBase afterdraw_transp;
+ struct ListBase afterdraw_xray;
+ struct ListBase afterdraw_xraytransp;
/* drawflags, denoting state */
short zbuf, transp, xray;
diff --git a/source/blender/makesdna/DNA_wave_types.h b/source/blender/makesdna/DNA_wave_types.h
deleted file mode 100644
index b05ae862108..00000000000
--- a/source/blender/makesdna/DNA_wave_types.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * blenlib/DNA_wave_types.h (mar-2001 nzc)
- *
- * $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 DNA_WAVE_TYPES_H
-#define DNA_WAVE_TYPES_H
-
-#include "DNA_ID.h"
-
-struct Ipo;
-
-
-/* a Wave has never been implemented... it was meant as a 'free' mathematical
- deformation object type (ton) */
-
-typedef struct Wave {
- ID id;
-
- struct Ipo *ipo;
-
-} Wave;
-
-#endif
-
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/DNA_world_types.h b/source/blender/makesdna/DNA_world_types.h
index 66d31467c4a..42c80f4b8b5 100644
--- a/source/blender/makesdna/DNA_world_types.h
+++ b/source/blender/makesdna/DNA_world_types.h
@@ -52,11 +52,11 @@ typedef struct World {
short colormodel, totex;
short texact, mistype;
-
- /* TODO - hork, zenk and ambk are not used, should remove at some point (Campbell) */
- float horr, horg, horb, hork;
- float zenr, zeng, zenb, zenk;
- float ambr, ambg, ambb, ambk;
+
+ float horr, horg, horb;
+ float zenr, zeng, zenb;
+ float ambr, ambg, ambb;
+ float pad2;
unsigned int fastcol;
diff --git a/source/blender/makesdna/Makefile b/source/blender/makesdna/Makefile
index 82009d2b80a..f83a6288e8d 100644
--- a/source/blender/makesdna/Makefile
+++ b/source/blender/makesdna/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/makesdna/intern/Makefile b/source/blender/makesdna/intern/Makefile
index 01c4d87a4fc..55b0c42acda 100644
--- a/source/blender/makesdna/intern/Makefile
+++ b/source/blender/makesdna/intern/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/makesdna/intern/SConscript b/source/blender/makesdna/intern/SConscript
index 38819ccdf96..78f5fcaba69 100644
--- a/source/blender/makesdna/intern/SConscript
+++ b/source/blender/makesdna/intern/SConscript
@@ -50,7 +50,7 @@ targetdir = normpath(root_build_dir + '/makesdna')
if not (root_build_dir[0]==os.sep or root_build_dir[1]==':'):
targetdir = '#' + targetdir
-makesdna = makesdna_tool.Program (target = targetdir, source = source_files, LIBS=['bf_guardedalloc', 'bf_blenlib'])
+makesdna = makesdna_tool.Program (target = targetdir, source = source_files, LIBS=['bf_intern_guardedalloc', 'bf_blenlib'])
dna_dict = dna.Dictionary()
dna.Depends ('dna.c', makesdna)
@@ -60,7 +60,7 @@ if env['OURPLATFORM'] != 'linuxcross':
if env['OURPLATFORM'] in ('win32-vc', 'win64-vc', 'win32-mingw'):
dna.Command ('dna.c', '', "\"" + root_build_dir+os.sep+"makesdna\" $TARGET")
else:
- dna.Command ('dna.c', '', root_build_dir+os.sep+"makesdna $TARGET")
+ dna.Command ('dna.c', '', "\"" + root_build_dir+os.sep+"makesdna\" $TARGET")
else:
if USE_WINE:
dna.Command ('dna.c', '', 'wine ' + root_build_dir+os.sep+"makesdna $TARGET")
diff --git a/source/blender/makesdna/intern/dna_genfile.c b/source/blender/makesdna/intern/dna_genfile.c
index 89219b114da..fd98fd4ef08 100644
--- a/source/blender/makesdna/intern/dna_genfile.c
+++ b/source/blender/makesdna/intern/dna_genfile.c
@@ -41,9 +41,9 @@
#include "DNA_sdna_types.h" // for SDNA ;-)
-/* gcc 4.1 on mingw was complaining that __int64 was alredy defined
+/* gcc 4.1 on mingw was complaining that __int64 was already defined
actually is saw the line below as typedef long long long long...
-Anyhow, since its alredy defined, its safe to do an ifndef here- Cambpell*/
+Anyhow, since its already defined, its safe to do an ifndef here- Cambpell*/
#ifdef FREE_WINDOWS
#ifndef __int64
typedef long long __int64;
@@ -110,7 +110,7 @@ DONE:
- pointer conversion (32-64 bits)
IMPORTANT:
- - do not use #defines in structs for array lenghts, this cannot be read by the dna functions
+ - do not use #defines in structs for array lengths, this cannot be read by the dna functions
- do not use uint, but unsigned int instead, ushort and ulong are allowed
- only use a long in Blender if you want this to be the size of a pointer. so it is
32 bits or 64 bits, dependant at the cpu architecture
diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c
index adcb074461e..4133afffeed 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 <config.h>
-#endif
-
#define SDNA_MAX_FILENAME_LENGTH 255
@@ -82,7 +78,6 @@ char *includefiles[] = {
"DNA_image_types.h",
"DNA_texture_types.h",
"DNA_lamp_types.h",
- "DNA_wave_types.h",
"DNA_material_types.h",
"DNA_vfont_types.h",
// if you add files here, please add them at the end
@@ -142,11 +137,11 @@ int maxdata= 500000, maxnr= 50000;
int nr_names=0;
int nr_types=0;
int nr_structs=0;
-char **names, *namedata; /* at adress names[a] is string a */
-char **types, *typedata; /* at adress types[a] is string a */
+char **names, *namedata; /* at address names[a] is string a */
+char **types, *typedata; /* at address types[a] is string a */
short *typelens; /* at typelens[a] is de length of type a */
short *alphalens; /* contains sizes as they are calculated on the DEC Alpha (64 bits) */
-short **structs, *structdata; /* at sp= structs[a] is the first adress of a struct definition
+short **structs, *structdata; /* at sp= structs[a] is the first address of a struct definition
sp[0] is type number
sp[1] is amount of elements
sp[2] sp[3] is typenr, namenr (etc) */
@@ -207,7 +202,7 @@ static int calculate_structlens(int);
void dna_write(FILE *file, void *pntr, int size);
/**
- * Report all structures found so far, and print their lenghts.
+ * Report all structures found so far, and print their lengths.
*/
void printStructLenghts(void);
@@ -1132,7 +1127,6 @@ int main(int argc, char ** argv)
#include "DNA_image_types.h"
#include "DNA_texture_types.h"
#include "DNA_lamp_types.h"
-#include "DNA_wave_types.h"
#include "DNA_material_types.h"
#include "DNA_vfont_types.h"
#include "DNA_meta_types.h"
diff --git a/source/blender/makesrna/Makefile b/source/blender/makesrna/Makefile
index bed3e85550d..2b025949d77 100644
--- a/source/blender/makesrna/Makefile
+++ b/source/blender/makesrna/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.
#
# Contributor(s): Blender Foundation (2008).
#
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index e72c5eb9a4d..43697ec5d9e 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -316,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;
@@ -355,6 +356,7 @@ 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;
@@ -383,6 +385,7 @@ 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;
@@ -435,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;
@@ -604,8 +607,9 @@ void RNA_struct_py_type_set(StructRNA *srna, void *py_type);
void *RNA_struct_blender_type_get(StructRNA *srna);
void RNA_struct_blender_type_set(StructRNA *srna, void *blender_type);
-struct IDProperty *RNA_struct_idproperties(PointerRNA *ptr, int create);
-int RNA_struct_idproperties_check(StructRNA *srna);
+struct IDProperty *RNA_struct_idprops(PointerRNA *ptr, int create);
+int RNA_struct_idprops_check(StructRNA *srna);
+int RNA_struct_idprops_register_check(StructRNA *type);
PropertyRNA *RNA_struct_find_property(PointerRNA *ptr, const char *identifier);
@@ -658,13 +662,16 @@ 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);
+int RNA_property_pointer_poll(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *value);
int RNA_property_editable(PointerRNA *ptr, PropertyRNA *prop);
int RNA_property_editable_index(PointerRNA *ptr, PropertyRNA *prop, int index);
@@ -817,9 +824,10 @@ void RNA_enum_set(PointerRNA *ptr, const char *name, int value);
void RNA_enum_set_identifier(PointerRNA *ptr, const char *name, const char *id);
int RNA_enum_is_equal(struct bContext *C, PointerRNA *ptr, const char *name, const char *enumname);
-/* lower level functions that donr use a PointerRNA */
-int RNA_enum_value_from_id(EnumPropertyItem *item, const char *identifier, int *value);
-int RNA_enum_id_from_value(EnumPropertyItem *item, int value, const char **identifier);
+/* lower level functions that don't use a PointerRNA */
+int RNA_enum_value_from_id(EnumPropertyItem *item, const char *identifier, int *value);
+int RNA_enum_id_from_value(EnumPropertyItem *item, int value, const char **identifier);
+int RNA_enum_icon_from_value(EnumPropertyItem *item, int value, int *icon);
void RNA_string_get(PointerRNA *ptr, const char *name, char *value);
char *RNA_string_get_alloc(PointerRNA *ptr, const char *name, char *fixedbuf, int fixedlen);
diff --git a/source/blender/makesrna/RNA_define.h b/source/blender/makesrna/RNA_define.h
index 99bd79d5d90..6422950b5e4 100644
--- a/source/blender/makesrna/RNA_define.h
+++ b/source/blender/makesrna/RNA_define.h
@@ -57,7 +57,7 @@ void RNA_def_struct_nested(BlenderRNA *brna, StructRNA *srna, const char *struct
void RNA_def_struct_flag(StructRNA *srna, int flag);
void RNA_def_struct_clear_flag(StructRNA *srna, int flag);
void RNA_def_struct_refine_func(StructRNA *srna, const char *refine);
-void RNA_def_struct_idproperties_func(StructRNA *srna, const char *refine);
+void RNA_def_struct_idprops_func(StructRNA *srna, const char *refine);
void RNA_def_struct_register_funcs(StructRNA *srna, const char *reg, const char *unreg);
void RNA_def_struct_path_func(StructRNA *srna, const char *path);
void RNA_def_struct_identifier(StructRNA *srna, const char *identifier);
@@ -90,6 +90,7 @@ void RNA_def_enum_funcs(PropertyRNA *prop, EnumPropertyItemFunc itemfunc);
PropertyRNA *RNA_def_float(StructOrFunctionRNA *cont, const char *identifier, float default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
PropertyRNA *RNA_def_float_vector(StructOrFunctionRNA *cont, const char *identifier, int len, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
+PropertyRNA *RNA_def_float_vector_xyz(StructOrFunctionRNA *cont, const char *identifier, int len, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
PropertyRNA *RNA_def_float_color(StructOrFunctionRNA *cont, const char *identifier, int len, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
PropertyRNA *RNA_def_float_matrix(StructOrFunctionRNA *cont, const char *identifier, int rows, int columns, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
PropertyRNA *RNA_def_float_rotation(StructOrFunctionRNA *cont, const char *identifier, int len, const float *default_value,
@@ -163,7 +164,7 @@ void RNA_def_property_int_funcs(PropertyRNA *prop, const char *get, const char *
void RNA_def_property_float_funcs(PropertyRNA *prop, const char *get, const char *set, const char *range);
void RNA_def_property_enum_funcs(PropertyRNA *prop, const char *get, const char *set, const char *item);
void RNA_def_property_string_funcs(PropertyRNA *prop, const char *get, const char *length, const char *set);
-void RNA_def_property_pointer_funcs(PropertyRNA *prop, const char *get, const char *set, const char *typef);
+void RNA_def_property_pointer_funcs(PropertyRNA *prop, const char *get, const char *set, const char *typef, const char *poll);
void RNA_def_property_collection_funcs(PropertyRNA *prop, const char *begin, const char *next, const char *end, const char *get, const char *length, const char *lookupint, const char *lookupstring);
void RNA_def_property_srna(PropertyRNA *prop, const char *type);
@@ -193,6 +194,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 6adad6aa92c..38ba44f2c2b 100644
--- a/source/blender/makesrna/RNA_enum_types.h
+++ b/source/blender/makesrna/RNA_enum_types.h
@@ -66,6 +66,8 @@ extern EnumPropertyItem event_type_items[];
extern EnumPropertyItem operator_return_items[];
extern EnumPropertyItem brush_sculpt_tool_items[];
+extern EnumPropertyItem brush_vertexpaint_tool_items[];
+extern EnumPropertyItem brush_imagepaint_tool_items[];
extern EnumPropertyItem texture_type_items[];
@@ -75,6 +77,8 @@ 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[];
@@ -86,18 +90,24 @@ extern EnumPropertyItem wm_report_items[];
extern EnumPropertyItem property_type_items[];
extern EnumPropertyItem property_unit_items[];
-extern EnumPropertyItem viewport_shading_items[];
+extern EnumPropertyItem viewport_shade_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 6eecd091b7f..887069d6c00 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 */
@@ -297,7 +298,8 @@ typedef enum StructFlag {
/* internal flags */
STRUCT_RUNTIME = 4,
STRUCT_GENERATED = 8,
- STRUCT_FREE_POINTERS = 16
+ STRUCT_FREE_POINTERS = 16,
+ STRUCT_NO_IDPROPERTIES = 32, /* Menu's and Panels don't need properties */
} StructFlag;
typedef int (*StructValidateFunc)(struct PointerRNA *ptr, void *data, int *have_function);
@@ -330,19 +332,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 MainImages Main
-#define MainObjects Main
-#define MainTexts Main
-#define MainActions Main
-#define MainGroups Main
-#define MainTextures Main
-#define MainCurves 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 cf31fb8e0e5..7ac76c4d107 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/memutil #/intern/audaspace/intern ../blenkernel ../blenlib ../makesdna intern .'
incs += ' ../windowmanager ../editors/include ../gpu ../imbuf ../ikplugin'
incs += ' ../render/extern/include'
@@ -15,12 +15,21 @@ 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')
if env['WITH_BF_DDS']:
defs.append('WITH_DDS')
+if env['WITH_BF_CINEON']:
+ defs.append('WITH_CINEON')
+
+if env['WITH_BF_HDR']:
+ defs.append('WITH_HDR')
+
if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
incs += ' ' + env['BF_FFMPEG_INC']
@@ -34,13 +43,16 @@ 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 not env['WITH_BF_PYTHON']:
+ defs.append('DISABLE_PYTHON')
if env['OURPLATFORM'] == 'linux2':
cflags='-pthread'
diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt
index 58931165638..9dbb2fd00aa 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)
-
-INCLUDE_DIRECTORIES(../../../../intern/guardedalloc .. ../../makesdna ../../blenkernel ../../blenlib ../../ikplugin ../../windowmanager ../../editors/include ../../gpu ../../imbuf ../../render/extern/include .)
+ 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
+ ../../../../intern/memutil
+ ..
+ ../../makesdna
+ ../../blenkernel
+ ../../blenlib
+ ../../ikplugin
+ ../../windowmanager
+ ../../editors/include
+ ../../gpu
+ ../../imbuf
+ ../../render/extern/include
+ ../../../../extern/glew/include
+ . )
+
FILE(GLOB INC_FILES ../*.h ../../makesdna/*.h)
IF(NOT WITH_PYTHON)
@@ -54,17 +70,29 @@ IF(WITH_GAMEENGINE)
ADD_DEFINITIONS(-DGAMEBLENDER)
ENDIF(WITH_GAMEENGINE)
-IF(WITH_OPENEXR)
+IF(WITH_IMAGE_OPENEXR)
ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_OPENEXR)
+ENDIF(WITH_IMAGE_OPENEXR)
+
+IF(WITH_IMAGE_TIFF)
+ ADD_DEFINITIONS(-DWITH_TIFF)
+ENDIF(WITH_IMAGE_TIFF)
-IF(WITH_OPENJPEG)
+IF(WITH_IMAGE_OPENJPEG)
ADD_DEFINITIONS(-DWITH_OPENJPEG)
-ENDIF(WITH_OPENJPEG)
+ENDIF(WITH_IMAGE_OPENJPEG)
-IF(WITH_DDS)
+IF(WITH_IMAGE_DDS)
ADD_DEFINITIONS(-DWITH_DDS)
-ENDIF(WITH_DDS)
+ENDIF(WITH_IMAGE_DDS)
+
+IF(WITH_IMAGE_CINEON)
+ ADD_DEFINITIONS(-DWITH_CINEON)
+ENDIF(WITH_IMAGE_CINEON)
+
+IF(WITH_IMAGE_HDR)
+ ADD_DEFINITIONS(-DWITH_HDR)
+ENDIF(WITH_IMAGE_HDR)
IF(WITH_QUICKTIME)
SET(INC ${INC} ../../quicktime)
@@ -76,9 +104,14 @@ IF(WITH_FFMPEG)
ADD_DEFINITIONS(-DWITH_FFMPEG)
ENDIF(WITH_FFMPEG)
-IF(NOT WITH_ELBEEM)
+IF(WITH_LCMS)
+ SET(INC ${INC} ${LCMS_INCLUDE_DIR})
+ ADD_DEFINITIONS(-DWITH_LCMS)
+ENDIF(WITH_LCMS)
+
+IF(NOT WITH_FLUID)
ADD_DEFINITIONS(-DDISABLE_ELBEEM)
-ENDIF(NOT WITH_ELBEEM)
+ENDIF(NOT WITH_FLUID)
IF(WITH_FFTW3)
ADD_DEFINITIONS(-DFFTW3=1)
diff --git a/source/blender/makesrna/intern/Makefile b/source/blender/makesrna/intern/Makefile
index 5afe55bb319..69d5581184d 100644
--- a/source/blender/makesrna/intern/Makefile
+++ b/source/blender/makesrna/intern/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.
#
# Contributor(s): Blender Foundation (2008).
#
@@ -45,7 +45,11 @@ endif
CFLAGS += $(LEVEL_1_C_WARNINGS)
+CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
+
CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
+CPPFLAGS += -I$(NAN_MEMUTIL)/include
+CPPFLAGS += -I../../../../intern/audaspace/intern
CPPFLAGS += -I../../blenlib
CPPFLAGS += -I../../blenkernel
CPPFLAGS += -I../../imbuf
@@ -91,6 +95,22 @@ ifeq ($(WITH_OPENAL),true)
CPPFLAGS += -DWITH_OPENAL
endif
+ifeq ($(WITH_TIFF),true)
+ CPPFLAGS += -DWITH_TIFF
+endif
+
+ifeq ($(WITH_LCMS),true)
+ CPPFLAGS += -DWITH_LCMS
+endif
+
+ifeq ($(WITH_CINEON),true)
+ CPPFLAGS += -DWITH_CINEON
+endif
+
+ifeq ($(WITH_HDR),true)
+ CPPFLAGS += -DWITH_HDR
+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 b63a816edfb..32ff64e609f 100644
--- a/source/blender/makesrna/intern/SConscript
+++ b/source/blender/makesrna/intern/SConscript
@@ -33,16 +33,26 @@ incs = '#/intern/guardedalloc ../../blenlib ../../blenkernel'
incs += ' ../../imbuf ../../makesdna ../../makesrna ../../ikplugin'
incs += ' ../../windowmanager ../../editors/include'
incs += ' ../../render/extern/include'
+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')
if env['WITH_BF_DDS']:
defs.append('WITH_DDS')
+if env['WITH_BF_CINEON']:
+ defs.append('WITH_CINEON')
+
+if env['WITH_BF_HDR']:
+ defs.append('WITH_HDR')
+
if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
incs += ' ' + env['BF_FFMPEG_INC']
@@ -80,7 +90,7 @@ if not env['WITH_BF_PYTHON']:
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']
@@ -128,9 +138,9 @@ if not (root_build_dir[0]==os.sep or root_build_dir[1]==':'):
targetpath = '#' + targetpath
if env['OURPLATFORM'] == 'linux2' and root_build_dir[0]==os.sep:
- makesrna = makesrna_tool.Program (target = targetpath, source = source_files, LIBS=['bf_guardedalloc', 'bf_dna', 'bf_blenlib'])
+ makesrna = makesrna_tool.Program (target = targetpath, source = source_files, LIBS=['bf_intern_guardedalloc', 'bf_dna', 'bf_blenlib'])
else:
- makesrna = makesrna_tool.Program (target = targetpath, source = source_files, LIBS=['bf_guardedalloc', 'bf_dna', 'bf_blenlib'])
+ makesrna = makesrna_tool.Program (target = targetpath, source = source_files, LIBS=['bf_intern_guardedalloc', 'bf_dna', 'bf_blenlib'])
rna_dict = rna.Dictionary()
rna.Depends (generated_files, makesrna)
@@ -142,7 +152,7 @@ if env['OURPLATFORM'] != 'linuxcross':
if env['OURPLATFORM'] in ('win32-vc', 'win64-vc', 'win32-mingw'):
rna.Command (generated_files, '', "\"" + root_build_dir+os.sep+"makesrna.exe\" \"" + build_dir )
else:
- rna.Command (generated_files, '', root_build_dir+os.sep+"makesrna " + build_dir)
+ rna.Command (generated_files, '', "\"" + root_build_dir+os.sep+"makesrna\" \"" + build_dir + '"' )
else:
rna.Command (generated_files, '', root_build_dir+os.sep+"makesrna.exe " + build_dir)
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index c9db05c30b1..af0faf5a165 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -30,7 +30,9 @@
#include "MEM_guardedalloc.h"
+#include "RNA_access.h"
#include "RNA_define.h"
+#include "RNA_types.h"
#include "rna_internal.h"
@@ -80,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;
}
@@ -483,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<<i)) != 0);\n", (dp->booleannegative)? "!": "", dp->dnaname, dp->booleanbit);
+ fprintf(f, " values[i]= %s((data->%s & (%d<<i)) != 0);\n", (dp->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");
}
@@ -514,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");
}
@@ -625,6 +628,14 @@ static char *rna_def_property_set_func(FILE *f, StructRNA *srna, PropertyRNA *pr
fprintf(f, " if(value.data)\n");
fprintf(f, " id_us_plus((ID*)value.data);\n\n");
}
+ else {
+ PointerPropertyRNA *pprop= (PointerPropertyRNA*)dp->prop;
+ StructRNA *type= rna_find_struct((char*)pprop->type);
+ if(type && (type->flag & STRUCT_ID)) {
+ fprintf(f, " if(value.data)\n");
+ fprintf(f, " id_lib_extern((ID*)value.data);\n\n");
+ }
+ }
fprintf(f, " data->%s= value.data;\n", dp->dnaname);
@@ -1634,7 +1645,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";
@@ -1684,7 +1695,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";
}
}
@@ -2077,7 +2088,7 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
}
case PROP_POINTER: {
PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
- fprintf(f, "\t%s, %s, %s, ", rna_function_string(pprop->get), rna_function_string(pprop->set), rna_function_string(pprop->typef));
+ fprintf(f, "\t%s, %s, %s, %s,", rna_function_string(pprop->get), rna_function_string(pprop->set), rna_function_string(pprop->typef), rna_function_string(pprop->poll));
if(pprop->type) fprintf(f, "&RNA_%s\n", (char*)pprop->type);
else fprintf(f, "NULL\n");
break;
@@ -2234,7 +2245,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},
@@ -2243,7 +2254,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},
@@ -2270,8 +2281,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},
diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c
index 3263d816ad0..a8b7fb1540b 100644
--- a/source/blender/makesrna/intern/rna_ID.c
+++ b/source/blender/makesrna/intern/rna_ID.c
@@ -176,7 +176,7 @@ StructRNA *rna_ID_refine(PointerRNA *ptr)
return ID_code_to_RNA_type(GS(id->name));
}
-IDProperty *rna_ID_idproperties(PointerRNA *ptr, int create)
+IDProperty *rna_ID_idprops(PointerRNA *ptr, int create)
{
return IDP_GetProperties(ptr->data, create);
}
@@ -195,7 +195,7 @@ void rna_ID_fake_user_set(PointerRNA *ptr, int value)
}
}
-IDProperty *rna_IDPropertyGroup_idproperties(PointerRNA *ptr, int create)
+IDProperty *rna_IDPropertyGroup_idprops(PointerRNA *ptr, int create)
{
return ptr->data;
}
@@ -317,7 +317,7 @@ static void rna_def_ID_properties(BlenderRNA *brna)
* care of the properties here */
srna= RNA_def_struct(brna, "IDPropertyGroup", NULL);
RNA_def_struct_ui_text(srna, "ID Property Group", "Group of ID properties");
- RNA_def_struct_idproperties_func(srna, "rna_IDPropertyGroup_idproperties");
+ RNA_def_struct_idprops_func(srna, "rna_IDPropertyGroup_idprops");
RNA_def_struct_register_funcs(srna, "rna_IDPropertyGroup_register", "rna_IDPropertyGroup_unregister");
RNA_def_struct_refine_func(srna, "rna_IDPropertyGroup_refine");
@@ -341,7 +341,7 @@ static void rna_def_ID(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "ID", "Base type for datablocks, defining a unique name, linking from other libraries and garbage collection");
RNA_def_struct_flag(srna, STRUCT_ID|STRUCT_ID_REFCOUNT);
RNA_def_struct_refine_func(srna, "rna_ID_refine");
- RNA_def_struct_idproperties_func(srna, "rna_ID_idproperties");
+ RNA_def_struct_idprops_func(srna, "rna_ID_idprops");
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_property_ui_text(prop, "Name", "Unique datablock ID name");
@@ -356,7 +356,7 @@ static void rna_def_ID(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Users", "Number of times this datablock is referenced");
- prop= RNA_def_property(srna, "fake_user", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_fake_user", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", LIB_FAKEUSER);
RNA_def_property_ui_text(prop, "Fake User", "Saves this datablock even if it has no users");
RNA_def_property_boolean_funcs(prop, NULL, "rna_ID_fake_user_set");
@@ -399,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 c110b89a818..8d3d9a0c747 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -23,6 +23,7 @@
*/
#include <stdlib.h>
+#include <stddef.h>
#include <string.h>
#include <ctype.h>
@@ -64,7 +65,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))
@@ -240,7 +241,7 @@ IDProperty *rna_idproperty_ui(PropertyRNA *prop)
return NULL;
}
-IDProperty *RNA_struct_idproperties(PointerRNA *ptr, int create)
+IDProperty *RNA_struct_idprops(PointerRNA *ptr, int create)
{
StructRNA *type= ptr->type;
@@ -250,22 +251,18 @@ IDProperty *RNA_struct_idproperties(PointerRNA *ptr, int create)
return NULL;
}
-int RNA_struct_idproperties_check(StructRNA *srna)
+int RNA_struct_idprops_check(StructRNA *srna)
{
return (srna && srna->idproperties) ? 1 : 0;
}
static IDProperty *rna_idproperty_find(PointerRNA *ptr, const char *name)
{
- IDProperty *group= RNA_struct_idproperties(ptr, 0);
- IDProperty *idprop;
+ IDProperty *group= RNA_struct_idprops(ptr, 0);
+
+ if(group)
+ return IDP_GetPropertyFromGroup(group, name);
- if(group) {
- for(idprop=group->data.group.first; idprop; idprop=idprop->next)
- if(strcmp(idprop->name, name) == 0)
- return idprop;
- }
-
return NULL;
}
@@ -390,7 +387,7 @@ IDProperty *rna_idproperty_check(PropertyRNA **prop, PointerRNA *ptr)
IDProperty *idprop= rna_idproperty_find(ptr, (*prop)->identifier);
if(idprop && !rna_idproperty_verify_valid(ptr, *prop, idprop)) {
- IDProperty *group= RNA_struct_idproperties(ptr, 0);
+ IDProperty *group= RNA_struct_idprops(ptr, 0);
IDP_RemFromGroup(group, idprop);
IDP_FreeProperty(idprop);
@@ -513,6 +510,11 @@ int RNA_struct_is_ID(StructRNA *type)
return (type->flag & STRUCT_ID) != 0;
}
+int RNA_struct_idprops_register_check(StructRNA *type)
+{
+ return (type->flag & STRUCT_NO_IDPROPERTIES) == 0;
+}
+
int RNA_struct_is_a(StructRNA *type, StructRNA *srna)
{
StructRNA *base;
@@ -577,9 +579,9 @@ FunctionRNA *RNA_struct_find_function(PointerRNA *ptr, const char *identifier)
FunctionRNA *func;
StructRNA *type;
for(type= ptr->type; type; type= type->base) {
- for(func= type->functions.first; func; func= func->cont.next) {
- if(strcmp(func->identifier, identifier)==0)
- return func;
+ func= (FunctionRNA *)BLI_findstring_ptr(&type->functions, identifier, offsetof(FunctionRNA, identifier));
+ if(func) {
+ return func;
}
}
return NULL;
@@ -730,7 +732,7 @@ char RNA_property_array_item_char(PropertyRNA *prop, int index)
/* get string to use for array index */
if ((index < 4) && ELEM(subtype, PROP_QUATERNION, PROP_AXISANGLE))
return quatitem[index];
- else if((index < 4) && ELEM6(subtype, PROP_TRANSLATION, PROP_DIRECTION, PROP_XYZ, PROP_EULER, PROP_VELOCITY, PROP_ACCELERATION))
+ else if((index < 4) && ELEM7(subtype, PROP_TRANSLATION, PROP_DIRECTION, PROP_XYZ, PROP_XYZ_LENGTH, PROP_EULER, PROP_VELOCITY, PROP_ACCELERATION))
return vectoritem[index];
else if ((index < 4) && ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA))
return coloritem[index];
@@ -786,6 +788,7 @@ int RNA_property_array_item_index(PropertyRNA *prop, char name)
return -1;
}
+
void RNA_property_int_range(PointerRNA *ptr, PropertyRNA *prop, int *hardmin, int *hardmax)
{
IntPropertyRNA *iprop= (IntPropertyRNA*)rna_ensure_property(prop);
@@ -960,7 +963,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);
@@ -989,6 +993,22 @@ StructRNA *RNA_property_pointer_type(PointerRNA *ptr, PropertyRNA *prop)
return &RNA_UnknownType;
}
+int RNA_property_pointer_poll(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *value)
+{
+ prop= rna_ensure_property(prop);
+
+ if(prop->type == PROP_POINTER) {
+ PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
+ if(pprop->poll)
+ return pprop->poll(ptr, *value);
+
+ return 1;
+ }
+
+ printf("RNA_property_pointer_poll %s: is not a pointer property.\n", prop->identifier);
+ return 0;
+}
+
/* Reuse for dynamic types */
EnumPropertyItem DummyRNA_NULL_items[] = {
{0, NULL, 0, NULL, NULL}
@@ -1085,6 +1105,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;
@@ -1101,6 +1132,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;
@@ -1214,7 +1261,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);
}
@@ -1263,7 +1310,7 @@ void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, int value)
val.i= value;
- group= RNA_struct_idproperties(ptr, 1);
+ group= RNA_struct_idprops(ptr, 1);
if(group)
IDP_AddToGroup(group, IDP_New(IDP_INT, val, (char*)prop->identifier));
}
@@ -1333,7 +1380,7 @@ void RNA_property_boolean_set_array(PointerRNA *ptr, PropertyRNA *prop, const in
val.array.len= prop->totarraylength;
val.array.type= IDP_INT;
- group= RNA_struct_idproperties(ptr, 1);
+ group= RNA_struct_idprops(ptr, 1);
if(group) {
idprop= IDP_New(IDP_ARRAY, val, (char*)prop->identifier);
IDP_AddToGroup(group, idprop);
@@ -1430,7 +1477,7 @@ void RNA_property_int_set(PointerRNA *ptr, PropertyRNA *prop, int value)
val.i= value;
- group= RNA_struct_idproperties(ptr, 1);
+ group= RNA_struct_idprops(ptr, 1);
if(group)
IDP_AddToGroup(group, IDP_New(IDP_INT, val, (char*)prop->identifier));
}
@@ -1500,7 +1547,7 @@ void RNA_property_int_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *v
val.array.len= prop->totarraylength;
val.array.type= IDP_INT;
- group= RNA_struct_idproperties(ptr, 1);
+ group= RNA_struct_idprops(ptr, 1);
if(group) {
idprop= IDP_New(IDP_ARRAY, val, (char*)prop->identifier);
IDP_AddToGroup(group, idprop);
@@ -1606,7 +1653,7 @@ void RNA_property_float_set(PointerRNA *ptr, PropertyRNA *prop, float value)
val.f= value;
- group= RNA_struct_idproperties(ptr, 1);
+ group= RNA_struct_idprops(ptr, 1);
if(group)
IDP_AddToGroup(group, IDP_New(IDP_FLOAT, val, (char*)prop->identifier));
}
@@ -1694,7 +1741,7 @@ void RNA_property_float_set_array(PointerRNA *ptr, PropertyRNA *prop, const floa
val.array.len= prop->totarraylength;
val.array.type= IDP_FLOAT;
- group= RNA_struct_idproperties(ptr, 1);
+ group= RNA_struct_idprops(ptr, 1);
if(group) {
idprop= IDP_New(IDP_ARRAY, val, (char*)prop->identifier);
IDP_AddToGroup(group, idprop);
@@ -1813,18 +1860,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);
+ group= RNA_struct_idprops(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));
}
}
@@ -1887,7 +1931,7 @@ void RNA_property_enum_set(PointerRNA *ptr, PropertyRNA *prop, int value)
val.i= value;
- group= RNA_struct_idproperties(ptr, 1);
+ group= RNA_struct_idprops(ptr, 1);
if(group)
IDP_AddToGroup(group, IDP_New(IDP_INT, val, (char*)prop->identifier));
}
@@ -1960,7 +2004,7 @@ void RNA_property_pointer_add(PointerRNA *ptr, PropertyRNA *prop)
val.i= 0;
- group= RNA_struct_idproperties(ptr, 1);
+ group= RNA_struct_idprops(ptr, 1);
if(group)
IDP_AddToGroup(group, IDP_New(IDP_GROUP, val, (char*)prop->identifier));
}
@@ -1973,7 +2017,7 @@ void RNA_property_pointer_remove(PointerRNA *ptr, PropertyRNA *prop)
IDProperty *idprop, *group;
if((idprop=rna_idproperty_check(&prop, ptr))) {
- group= RNA_struct_idproperties(ptr, 0);
+ group= RNA_struct_idprops(ptr, 0);
if(group) {
IDP_RemFromGroup(group, idprop);
@@ -2086,7 +2130,7 @@ void RNA_property_collection_add(PointerRNA *ptr, PropertyRNA *prop, PointerRNA
IDProperty *group, *item;
IDPropertyTemplate val = {0};
- group= RNA_struct_idproperties(ptr, 1);
+ group= RNA_struct_idprops(ptr, 1);
if(group) {
idprop= IDP_NewIDPArray(prop->identifier);
IDP_AddToGroup(group, idprop);
@@ -2905,7 +2949,7 @@ int RNA_path_resolve_full(PointerRNA *ptr, const char *path, PointerRNA *r_ptr,
PropertyRNA *prop;
PointerRNA curptr, nextptr;
char fixedbuf[256], *token;
- int type, len, intkey;
+ int type, intkey;
prop= NULL;
curptr= *ptr;
@@ -2926,7 +2970,7 @@ int RNA_path_resolve_full(PointerRNA *ptr, const char *path, PointerRNA *r_ptr,
return 0;
if(use_id_prop) { /* look up property name in current struct */
- IDProperty *group= RNA_struct_idproperties(&curptr, 0);
+ IDProperty *group= RNA_struct_idprops(&curptr, 0);
if(group && rna_token_strip_quotes(token))
prop= (PropertyRNA *)IDP_GetPropertyFromGroup(group, token+1);
}
@@ -2957,33 +3001,44 @@ int RNA_path_resolve_full(PointerRNA *ptr, const char *path, PointerRNA *r_ptr,
break;
case PROP_COLLECTION:
if(*path) {
- /* resolve the lookup with [] brackets */
- token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 1);
-
- if(!token)
- return 0;
-
- len= strlen(token);
+ if(*path == '[') {
+ /* resolve the lookup with [] brackets */
+ token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 1);
+
+ if(!token)
+ return 0;
+
+ /* check for "" to see if it is a string */
+ if(rna_token_strip_quotes(token)) {
+ RNA_property_collection_lookup_string(&curptr, prop, token+1, &nextptr);
+ }
+ else {
+ /* otherwise do int lookup */
+ intkey= atoi(token);
+ RNA_property_collection_lookup_int(&curptr, prop, intkey, &nextptr);
+ }
- /* check for "" to see if it is a string */
- if(rna_token_strip_quotes(token)) {
- RNA_property_collection_lookup_string(&curptr, prop, token+1, &nextptr);
+ if(token != fixedbuf) {
+ MEM_freeN(token);
+ }
}
else {
- /* otherwise do int lookup */
- intkey= atoi(token);
- RNA_property_collection_lookup_int(&curptr, prop, intkey, &nextptr);
- }
+ PointerRNA c_ptr;
+
+ /* ensure we quit on invalid values */
+ nextptr.data = NULL;
- if(token != fixedbuf)
- MEM_freeN(token);
+ if(RNA_property_collection_type_get(&curptr, prop, &c_ptr)) {
+ nextptr= c_ptr;
+ }
+ }
if(nextptr.data)
curptr= nextptr;
else
return 0;
}
-
+
break;
default:
if (index==NULL)
@@ -3399,6 +3454,18 @@ int RNA_enum_id_from_value(EnumPropertyItem *item, int value, const char **ident
return 0;
}
+int RNA_enum_icon_from_value(EnumPropertyItem *item, int value, int *icon)
+{
+ for( ; item->identifier; item++) {
+ if(item->value==value) {
+ *icon = item->icon;
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
void RNA_string_get(PointerRNA *ptr, const char *name, char *value)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, name);
@@ -3538,7 +3605,8 @@ int RNA_property_is_set(PointerRNA *ptr, const char *name)
return 1;
}
else {
- // printf("RNA_property_is_set: %s.%s not found.\n", ptr->type->identifier, name);
+ /* python raises an error */
+ /* printf("RNA_property_is_set: %s.%s not found.\n", ptr->type->identifier, name); */
return 0;
}
}
@@ -3723,27 +3791,12 @@ int RNA_function_defined(FunctionRNA *func)
PropertyRNA *RNA_function_get_parameter(PointerRNA *ptr, FunctionRNA *func, int index)
{
- PropertyRNA *parm;
- int i;
-
- parm= func->cont.properties.first;
- for(i= 0; parm; parm= parm->next, i++)
- if(i==index)
- return parm;
-
- return NULL;
+ return BLI_findlink(&func->cont.properties, index);
}
PropertyRNA *RNA_function_find_parameter(PointerRNA *ptr, FunctionRNA *func, const char *identifier)
{
- PropertyRNA *parm;
-
- parm= func->cont.properties.first;
- for(; parm; parm= parm->next)
- if(strcmp(parm->identifier, identifier)==0)
- return parm;
-
- return NULL;
+ return BLI_findstring(&func->cont.properties, identifier, offsetof(PropertyRNA, identifier));
}
const struct ListBase *RNA_function_defined_parameters(FunctionRNA *func)
@@ -3759,18 +3812,18 @@ ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *ptr,
void *data;
int alloc_size= 0, size;
- parms->arg_count= 0;
- parms->ret_count= 0;
-
+ parms->arg_count= 0;
+ parms->ret_count= 0;
+
/* allocate data */
for(parm= func->cont.properties.first; parm; parm= parm->next) {
alloc_size += rna_parameter_size_alloc(parm);
- if(parm->flag & PROP_OUTPUT)
- parms->ret_count++;
- else
- parms->arg_count++;
- }
+ 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;
diff --git a/source/blender/makesrna/intern/rna_action.c b/source/blender/makesrna/intern/rna_action.c
index 127aa191b5c..623717e469f 100644
--- a/source/blender/makesrna/intern/rna_action.c
+++ b/source/blender/makesrna/intern/rna_action.c
@@ -41,6 +41,9 @@
#ifdef RNA_RUNTIME
+#include "ED_keyframing.h"
+#include "BKE_fcurve.h"
+
static void rna_ActionGroup_channels_next(CollectionPropertyIterator *iter)
{
ListBaseIterator *internal= iter->internal;
@@ -86,6 +89,65 @@ static void rna_Action_groups_remove(bAction *act, ReportList *reports, bActionG
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]' already 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);
+ free_fcurve(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
@@ -104,129 +166,135 @@ static void rna_def_dopesheet(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Source", "ID-Block representing source data, currently ID_SCE (for Dopesheet), and ID_SC (for Grease Pencil)");
/* General Filtering Settings */
- prop= RNA_def_property(srna, "only_selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_only_selected", PROP_BOOLEAN, PROP_NONE);
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, "show_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);
+ prop= RNA_def_property(srna, "show_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);
+ prop= RNA_def_property(srna, "filter_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);
+ prop= RNA_def_property(srna, "show_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);
+ prop= RNA_def_property(srna, "show_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);
+ prop= RNA_def_property(srna, "show_expanded_summary", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_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 */
- prop= RNA_def_property(srna, "display_transforms", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_transforms", PROP_BOOLEAN, PROP_NONE);
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);
+ prop= RNA_def_property(srna, "show_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);
+ prop= RNA_def_property(srna, "show_meshes", 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);
+ prop= RNA_def_property(srna, "show_cameras", 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);
+ prop= RNA_def_property(srna, "show_materials", 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);
+ prop= RNA_def_property(srna, "show_lamps", 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);
+ prop= RNA_def_property(srna, "show_textures", 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);
+ prop= RNA_def_property(srna, "show_curves", 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);
+ prop= RNA_def_property(srna, "show_worlds", 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);
+ prop= RNA_def_property(srna, "show_scenes", 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);
+ prop= RNA_def_property(srna, "show_particles", 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);
+ prop= RNA_def_property(srna, "show_metaballs", 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);
+ prop= RNA_def_property(srna, "show_armatures", 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);
+ prop= RNA_def_property(srna, "show_nodes", 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)
@@ -241,7 +309,7 @@ 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
@@ -259,25 +327,25 @@ static void rna_def_action_group(BlenderRNA *brna)
RNA_def_property_collection_funcs(prop, 0, "rna_ActionGroup_channels_next", 0, 0, 0, 0, 0);
RNA_def_property_ui_text(prop, "Channels", "F-Curves in this group");
- prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select", 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_ui_text(prop, "Select", "Action Group is selected");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_SELECTED, NULL);
- prop= RNA_def_property(srna, "locked", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock", 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_ui_text(prop, "Lock", "Action Group is locked");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
- prop= RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_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 */
@@ -291,7 +359,7 @@ static void rna_def_action_groups(BlenderRNA *brna, PropertyRNA *cprop)
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 Points", "Collection of action groups");
+ 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.");
@@ -309,6 +377,64 @@ static void rna_def_action_groups(BlenderRNA *brna, PropertyRNA *cprop)
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)
{
StructRNA *srna;
@@ -323,6 +449,7 @@ 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);
@@ -334,6 +461,7 @@ static void rna_def_action(BlenderRNA *brna)
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_actuator.c b/source/blender/makesrna/intern/rna_actuator.c
index 23698e8140f..a4becb87e28 100644
--- a/source/blender/makesrna/intern/rna_actuator.c
+++ b/source/blender/makesrna/intern/rna_actuator.c
@@ -27,23 +27,50 @@
#include "RNA_define.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:
@@ -65,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:
@@ -79,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 "use_material_detect" 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; i<OB_MAX_STATES; i++)
+ if(values[i])
+ tot++;
+
+ if(tot==0)
+ return;
+
+ for(i=0; i<OB_MAX_STATES; i++) {
+ if(values[i]) sa->mask |= (1<<i);
+ else sa->mask &= ~(1<<i);
+ }
+}
+
+/* Always keep in alphabetical order */
+EnumPropertyItem *rna_Actuator_type_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ EnumPropertyItem *item= NULL;
+ Object *ob= NULL;
+ int totitem= 0;
+
+ if (ptr->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)
@@ -86,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");
@@ -114,13 +468,108 @@ 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, "pin", 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, "show_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, "play_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, NULL);
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "use_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, "frame_blend_in", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "blendin");
+ 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)
@@ -129,7 +578,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}};
@@ -138,11 +587,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");
@@ -153,145 +602,161 @@ 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);
RNA_def_property_float_sdna(prop, NULL, "forcerot[0]");
- RNA_def_property_ui_range(prop, 0.0, 200.0, 1.0, 0.1);
+ RNA_def_property_ui_range(prop, 0.0, 200.0, 10, 2);
RNA_def_property_ui_text(prop, "Proportional Coefficient", "Typical value is 60x integral coefficient");
RNA_def_property_update(prop, NC_LOGIC, NULL);
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_ui_range(prop, 0.0, 3.0, 10, 2);
+ 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);
prop= RNA_def_property(srna, "derivate_coefficient", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "forcerot[2]");
- RNA_def_property_ui_range(prop, -100.0, 100.0, 1.0, 0.1);
+ RNA_def_property_ui_range(prop, -100.0, 100.0, 10, 2);
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]");
- RNA_def_property_ui_range(prop, -100.0, 100.0, 1.0, 0.1);
+ /* 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, 2);
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]");
- RNA_def_property_ui_range(prop, -100.0, 100.0, 1.0, 0.1);
+ 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, 2);
+ 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[1]");
+ RNA_def_property_ui_range(prop, -100.0, 100.0, 1, 2);
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, 2);
+ 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, 2);
+ 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, 2);
+ 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);
+ prop= RNA_def_property(srna, "offset_location", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "dloc");
RNA_def_property_array(prop, 3);
- RNA_def_property_ui_range(prop, -10000.0, 10000.0, 0.1, 0.001);
+ RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, 2);
RNA_def_property_ui_text(prop, "Loc", "Sets the location");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "rot", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "offset_rotation", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "drot");
RNA_def_property_array(prop, 3);
- RNA_def_property_ui_range(prop, -10000.0, 10000.0, 0.1, 0.001);
+ RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, 2);
RNA_def_property_ui_text(prop, "Rot", "Sets the rotation");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "force", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "force", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "forceloc");
RNA_def_property_array(prop, 3);
- RNA_def_property_ui_range(prop, -10000.0, 10000.0, 0.1, 0.001);
+ RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, 2);
RNA_def_property_ui_text(prop, "Force", "Sets the force");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "torque", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "torque", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "forcerot");
RNA_def_property_array(prop, 3);
- RNA_def_property_ui_range(prop, -10000.0, 10000.0, 0.1, 0.001);
+ RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, 2);
RNA_def_property_ui_text(prop, "Torque", "Sets the torque");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "linear_velocity", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "linear_velocity", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "linearvelocity");
RNA_def_property_array(prop, 3);
- RNA_def_property_ui_range(prop, -10000.0, 10000.0, 0.1, 0.001);
+ RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, 2);
RNA_def_property_ui_text(prop, "Linear Velocity", "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)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "angular_velocity", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "angular_velocity", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "angularvelocity");
RNA_def_property_array(prop, 3);
- RNA_def_property_ui_range(prop, -10000.0, 10000.0, 0.1, 0.001);
+ RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, 2);
RNA_def_property_ui_text(prop, "Angular Velocity", "Sets the angular velocity");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* booleans */
- prop= RNA_def_property(srna, "local_location", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_local_location", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_DLOC_LOCAL);
RNA_def_property_ui_text(prop, "L", "Location is defined in local coordinates");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "local_rotation", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_local_rotation", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_DROT_LOCAL);
RNA_def_property_ui_text(prop, "L", "Rotation is defined in local coordinates");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "local_force", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_local_force", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_FORCE_LOCAL);
RNA_def_property_ui_text(prop, "L", "Force is defined in local coordinates");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "local_torque", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_local_torque", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_TORQUE_LOCAL);
RNA_def_property_ui_text(prop, "L", "Torque is defined in local coordinates");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "local_linear_velocity", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_local_linear_velocity", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_LIN_VEL_LOCAL);
RNA_def_property_ui_text(prop, "L", "Velocity is defined in local coordinates");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "local_angular_velocity", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_local_angular_velocity", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_ANG_VEL_LOCAL);
RNA_def_property_ui_text(prop, "L", "Angular velocity is defined in local coordinates");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "add_linear_velocity", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_add_linear_velocity", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_ADD_LIN_VEL);
RNA_def_property_ui_text(prop, "Add", "Toggles between ADD and SET linV");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "servo_limit_x", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_servo_limit_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_SERVO_LIMIT_X);
RNA_def_property_ui_text(prop, "X", "Set limit to force along the X axis");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "servo_limit_y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_servo_limit_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_SERVO_LIMIT_Y);
RNA_def_property_ui_text(prop, "Y", "Set limit to force along the Y axis");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "servo_limit_z", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_servo_limit_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_SERVO_LIMIT_Z);
RNA_def_property_ui_text(prop, "Z", "Set limit to force along the Z axis");
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;
@@ -306,14 +771,14 @@ 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, "frame_start", PROP_INT, PROP_NONE);
@@ -330,7 +795,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);
@@ -338,29 +803,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, "force", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_additive", 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, "use_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);
+ prop= RNA_def_property(srna, "use_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);
+ prop= RNA_def_property(srna, "apply_to_children", 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)
@@ -369,8 +832,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");
@@ -386,26 +849,25 @@ static void rna_def_camera_actuator(BlenderRNA *brna)
/* floats */
prop= RNA_def_property(srna, "height", PROP_FLOAT, PROP_NONE);
- RNA_def_property_ui_range(prop, 0.0, 20.0, 0.1, 0.1);
+ RNA_def_property_ui_range(prop, 0.0, 20.0, 1, 2);
RNA_def_property_ui_text(prop, "Height", "");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "min", PROP_FLOAT, PROP_NONE);
- RNA_def_property_ui_range(prop, 0.0, 20.0, 0.1, 0.1);
+ RNA_def_property_ui_range(prop, 0.0, 20.0, 1, 2);
RNA_def_property_ui_text(prop, "Min", "");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "max", PROP_FLOAT, PROP_NONE);
- RNA_def_property_ui_range(prop, 0.0, 20.0, 0.1, 0.1);
+ RNA_def_property_ui_range(prop, 0.0, 20.0, 1, 2);
RNA_def_property_ui_text(prop, "Max", "");
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);
}
@@ -434,73 +896,74 @@ 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);
- RNA_def_property_ui_range(prop, 0.0, 1.0, 0.1, 0.01);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 1, 2);
RNA_def_property_range(prop, 0.0, 2.0);
RNA_def_property_ui_text(prop, "Volume", "Sets the initial volume of the sound");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "pitch", PROP_FLOAT, PROP_NONE);
- RNA_def_property_ui_range(prop, -12.0, 12.0, 1.0, 0.1);
+ RNA_def_property_ui_range(prop, -12.0, 12.0, 1, 2);
RNA_def_property_ui_text(prop, "Pitch", "Sets the pitch of the sound");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* floats - 3D Parameters */
- prop= RNA_def_property(srna, "minimum_gain_3d", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "gain_3d_min", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "sound3D.min_gain");
- RNA_def_property_ui_range(prop, 0.0, 1.0, 0.1, 0.01);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 1, 2);
RNA_def_property_ui_text(prop, "Minimum Gain", "The minimum gain of the sound, no matter how far it is away");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "maximum_gain_3d", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "gain_3d_max", 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_range(prop, 0.0, 1.0, 1, 2);
+ 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);
+ prop= RNA_def_property(srna, "distance_3d_reference", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "sound3D.reference_distance");
- RNA_def_property_ui_range(prop, 0.0, FLT_MAX, 1.0, 0.01);
+ RNA_def_property_ui_range(prop, 0.0, FLT_MAX, 1, 2);
RNA_def_property_ui_text(prop, "Reference Distance", "The distance where the sound has a gain of 1.0");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "max_distance_3d", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "distance_3d_max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "sound3D.max_distance");
- RNA_def_property_ui_range(prop, 0.0, FLT_MAX, 1.0, 0.01);
+ RNA_def_property_ui_range(prop, 0.0, FLT_MAX, 1, 2);
RNA_def_property_ui_text(prop, "Maximum Distance", "The maximum distance at which you can hear the sound");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "rolloff_factor_3d", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "sound3D.rolloff_factor");
- RNA_def_property_ui_range(prop, 0.0, 5.0, 1.0, 0.01);
+ RNA_def_property_ui_range(prop, 0.0, 5.0, 1, 2);
RNA_def_property_ui_text(prop, "Rolloff", "The influence factor on volume depending on distance");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "cone_outer_gain_3d", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "sound3D.cone_outer_gain");
- RNA_def_property_ui_range(prop, 0.0, 1.0, 0.1, 0.01);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 1, 2);
RNA_def_property_ui_text(prop, "Cone Outer Gain", "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");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "cone_outer_angle_3d", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "sound3D.cone_outer_angle");
- RNA_def_property_ui_range(prop, 0.0, 360.0, 1.0, 0.01);
+ RNA_def_property_ui_range(prop, 0.0, 360.0, 1, 2);
RNA_def_property_ui_text(prop, "Cone Outer Angle", "The angle of the outer cone");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "cone_inner_angle_3d", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "sound3D.cone_inner_angle");
- RNA_def_property_ui_range(prop, 0.0, 360.0, 1.0, 0.01);
+ RNA_def_property_ui_range(prop, 0.0, 360.0, 1, 2);
RNA_def_property_ui_text(prop, "Cone Inner Angle", "The angle of the inner cone");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* booleans */
- prop= RNA_def_property(srna, "enable_sound_3d", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_sound_3d", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_SND_3D_SOUND);
RNA_def_property_ui_text(prop, "3D Sound", "Enable/Disable 3D Sound");
RNA_def_property_update(prop, NC_LOGIC, NULL);
@@ -523,12 +986,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);
@@ -536,12 +1000,26 @@ 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)
{
StructRNA *srna;
- /*PropertyRNA *prop;
+ PropertyRNA *prop;
static EnumPropertyItem prop_type_items[] ={
{ACT_CONST_TYPE_LOC, "LOC", 0, "Location Constraint", ""},
@@ -549,13 +1027,187 @@ static void rna_def_constraint_actuator(BlenderRNA *brna)
{ACT_CONST_TYPE_ORI, "ORI", 0, "Orientation Constraint", ""},
{ACT_CONST_TYPE_FH, "FH", 0, "Force Field Constraint", ""},
{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, "rotation_max", PROP_FLOAT, PROP_XYZ);
+ RNA_def_property_float_sdna(prop, NULL, "maxrot");
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_range(prop, -2000.0, 2000.0, 10, 2);
+ RNA_def_property_ui_text(prop, "Reference Direction", "Reference Direction");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "angle_min", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "minloc[0]");
+ RNA_def_property_ui_range(prop, 0.0, 180.0, 10, 2);
+ 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, "angle_max", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "maxloc[0]");
+ RNA_def_property_ui_range(prop, 0.0, 180.0, 10, 2);
+ 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, 10, 2);
+ 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, 10, 2);
+ 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, 10, 2);
+ 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, "use_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, "use_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, "use_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, "use_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, "use_material_detect", 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, "use_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, "use_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)
@@ -563,27 +1215,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");
@@ -614,6 +1266,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, NULL);
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "time", PROP_INT, PROP_NONE);
@@ -622,47 +1276,47 @@ static void rna_def_edit_object_actuator(BlenderRNA *brna)
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "mass", PROP_FLOAT, PROP_NONE);
- RNA_def_property_ui_range(prop, 0, 10000, 1, 0.01);
+ RNA_def_property_ui_range(prop, 0, 10000, 1, 2);
RNA_def_property_ui_text(prop, "Mass", "The mass of the object");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* floats 3 Arrays*/
- prop= RNA_def_property(srna, "linear_velocity", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "linear_velocity", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "linVelocity");
RNA_def_property_array(prop, 3);
- RNA_def_property_ui_range(prop, -100.0, 100.0, 0.1, 0.01);
+ RNA_def_property_ui_range(prop, -100.0, 100.0, 10, 2);
RNA_def_property_ui_text(prop, "Linear Velocity", "Velocity upon creation");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "angular_velocity", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "angular_velocity", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "angVelocity");
RNA_def_property_array(prop, 3);
- RNA_def_property_ui_range(prop, -10000.0, 10000.0, 1.0, 0.01);
+ RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, 2);
RNA_def_property_ui_text(prop, "Angular Velocity", "Angular velocity upon creation");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* booleans */
- prop= RNA_def_property(srna, "local_linear_velocity", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_local_linear_velocity", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "localflag", ACT_EDOB_LOCAL_LINV);
RNA_def_property_ui_text(prop, "L", "Apply the transformation locally");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "local_angular_velocity", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_local_angular_velocity", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "localflag", ACT_EDOB_LOCAL_ANGV);
RNA_def_property_ui_text(prop, "L", "Apply the rotation locally");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "replace_display_mesh", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_replace_display_mesh", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_EDOB_REPLACE_MESH_NOGFX);
RNA_def_property_ui_text(prop, "Gfx", "Replace the display mesh");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "replace_physics_mesh", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_replace_physics_mesh", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_EDOB_REPLACE_MESH_PHYS);
RNA_def_property_ui_text(prop, "Phys", "Replace the physics mesh (triangle bounds only - compound shapes not supported)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "enable_3d_tracking", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_3d_tracking", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_TRACK_3D);
RNA_def_property_ui_text(prop, "3D", "Enable 3D tracking");
RNA_def_property_update(prop, NC_LOGIC, NULL);
@@ -688,11 +1342,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);
@@ -705,7 +1361,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 ""
@@ -764,7 +1420,7 @@ static void rna_def_random_actuator(BlenderRNA *brna)
/* int_arg_1, int_arg_2, float_arg_1, float_arg_2 */
/* ACT_RANDOM_BOOL_CONST */
- prop= RNA_def_property(srna, "always_true", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_always_true", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "int_arg_1", 1);
RNA_def_property_ui_text(prop, "Always true", "Always false or always true");
RNA_def_property_update(prop, NC_LOGIC, NULL);
@@ -873,7 +1529,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);
@@ -902,22 +1558,25 @@ static void rna_def_game_actuator(BlenderRNA *brna)
{ACT_GAME_LOAD, "START", 0, "Start new game", ""},
{ACT_GAME_RESTART, "RESTART", 0, "Restart this game", ""},
{ACT_GAME_QUIT, "QUIT", 0, "Quit this game", ""},
- {ACT_GAME_SAVECFG, "SAVECFG", 0, "Save GameLogic.globalDict", ""},
- {ACT_GAME_LOADCFG, "LOADCFG", 0, "Load GameLogic.globalDict", ""},
+ {ACT_GAME_SAVECFG, "SAVECFG", 0, "Save bge.logic.globalDict", ""},
+ {ACT_GAME_LOADCFG, "LOADCFG", 0, "Load bge.logic.globalDict", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "GameActuator", "Actuator");
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)
@@ -929,17 +1588,17 @@ static void rna_def_visibility_actuator(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Visibility Actuator", "Actuator to set visibility and occlusion of the object");
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);
+ prop= RNA_def_property(srna, "use_visible", PROP_BOOLEAN, PROP_NONE);
+ 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);
- prop= RNA_def_property(srna, "occlusion", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_occlusion", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_VISIBILITY_OCCLUSION);
RNA_def_property_ui_text(prop, "Occlusion", "Set the object to occlude objects behind it. Initialized from the object type in physics button");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "children", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "apply_to_children", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_VISIBILITY_RECURSIVE);
RNA_def_property_ui_text(prop, "Children", "Set all the children of this object to the same visibility/occlusion recursively");
RNA_def_property_update(prop, NC_LOGIC, NULL);
@@ -969,11 +1628,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);
@@ -991,19 +1651,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_factor", 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_ui_text(prop, "Value", "Set motion blur factor");
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, "use_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);
}
@@ -1021,7 +1678,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);
@@ -1034,12 +1692,12 @@ static void rna_def_parent_actuator(BlenderRNA *brna)
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* booleans */
- prop= RNA_def_property(srna, "compound", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_compound", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_PARENT_COMPOUND);
RNA_def_property_ui_text(prop, "Compound", "Add this object shape to the parent shape (only if the parent shape is already compound)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "ghost", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_ghost", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_PARENT_GHOST);
RNA_def_property_ui_text(prop, "Ghost", "Make this object ghost while parented (only if not compound)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
@@ -1062,10 +1720,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);
@@ -1075,9 +1734,11 @@ 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, NULL);
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "continue_last_frame", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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);
@@ -1099,7 +1760,8 @@ static void rna_def_shape_action_actuator(BlenderRNA *brna)
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);
+ prop= RNA_def_property(srna, "frame_blend_in", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "blendin");
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);
@@ -1145,14 +1807,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, "states", 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)
@@ -1161,18 +1820,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", "");
@@ -1181,18 +1840,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");
@@ -1207,7 +1860,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");
@@ -1218,12 +1871,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 <stdlib.h>
+#include <stdio.h>
+
+#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 fedba105a69..42cd6fd5911 100644
--- a/source/blender/makesrna/intern/rna_animation.c
+++ b/source/blender/makesrna/intern/rna_animation.c
@@ -327,7 +327,7 @@ static PointerRNA rna_KeyingSet_typeinfo_get(PointerRNA *ptr)
static KS_Path *rna_KeyingSet_paths_add(KeyingSet *keyingset, ReportList *reports,
- ID *id, char rna_path[], int index, int grouping_method, char group_name[])
+ ID *id, char rna_path[], int index, int group_method, char group_name[])
{
KS_Path *ksp = NULL;
short flag = 0;
@@ -340,7 +340,7 @@ static KS_Path *rna_KeyingSet_paths_add(KeyingSet *keyingset, ReportList *report
/* 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);
+ ksp= BKE_keyingset_add_path(keyingset, id, group_name, rna_path, index, flag, group_method);
keyingset->active_path= BLI_countlist(&keyingset->paths);
}
else {
@@ -395,17 +395,17 @@ static void rna_def_common_keying_flags(StructRNA *srna, short reg)
{
PropertyRNA *prop;
- prop= RNA_def_property(srna, "insertkey_needed", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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);
+ prop= RNA_def_property(srna, "use_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);
+ prop= RNA_def_property(srna, "use_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);
@@ -489,7 +489,7 @@ static void rna_def_keyingset_path(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "ID");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_editable_func(prop, "rna_ksPath_id_editable");
- RNA_def_property_pointer_funcs(prop, NULL, NULL, "rna_ksPath_id_typef");
+ RNA_def_property_pointer_funcs(prop, NULL, NULL, "rna_ksPath_id_typef", NULL);
RNA_def_property_ui_text(prop, "ID-Block", "ID-Block that keyframes for Keying Set should be added to (for Absolute Keying Sets only)");
prop= RNA_def_property(srna, "id_type", PROP_ENUM, PROP_NONE);
@@ -504,7 +504,7 @@ static void rna_def_keyingset_path(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Group Name", "Name of Action Group to assign setting(s) for this path to");
/* Grouping */
- prop= RNA_def_property(srna, "grouping", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "group_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "groupmode");
RNA_def_property_enum_items(prop, keyingset_path_grouping_items);
RNA_def_property_ui_text(prop, "Grouping Method", "Method used to define which Group-name to use");
@@ -519,7 +519,7 @@ static void rna_def_keyingset_path(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "RNA Array Index", "Index to the specific setting if applicable");
/* Flags */
- prop= RNA_def_property(srna, "entire_array", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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");
@@ -528,7 +528,6 @@ static void rna_def_keyingset_path(BlenderRNA *brna)
}
-
/* keyingset.paths */
static void rna_def_keyingset_paths(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -536,6 +535,8 @@ static void rna_def_keyingset_paths(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
+
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "KeyingSetPaths");
srna= RNA_def_struct(brna, "KeyingSetPaths", NULL);
@@ -557,9 +558,9 @@ static void rna_def_keyingset_paths(BlenderRNA *brna, PropertyRNA *cprop)
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, 0, 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);
+ 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_enum(func, "group_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).");
@@ -569,13 +570,25 @@ static void rna_def_keyingset_paths(BlenderRNA *brna, PropertyRNA *cprop)
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);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
/* 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);
+
+ prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "KeyingSetPath");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_editable_func(prop, "rna_KeyingSet_active_ksPath_editable");
+ RNA_def_property_pointer_funcs(prop, "rna_KeyingSet_active_ksPath_get", "rna_KeyingSet_active_ksPath_set", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Active Keying Set", "Active Keying Set used to insert/delete keyframes");
+
+ prop= RNA_def_property(srna, "active_index", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "active_path");
+ RNA_def_property_int_funcs(prop, "rna_KeyingSet_active_ksPath_index_get", "rna_KeyingSet_active_ksPath_index_set", "rna_KeyingSet_active_ksPath_index_range");
+ RNA_def_property_ui_text(prop, "Active Path Index", "Current Keying Set index");
}
static void rna_def_keyingset(BlenderRNA *brna)
@@ -595,8 +608,8 @@ static void rna_def_keyingset(BlenderRNA *brna)
/* 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 builtin Keying Sets");
+ RNA_def_property_pointer_funcs(prop, "rna_KeyingSet_typeinfo_get", NULL, 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);
@@ -604,21 +617,10 @@ static void rna_def_keyingset(BlenderRNA *brna)
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");
- RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_editable_func(prop, "rna_KeyingSet_active_ksPath_editable");
- RNA_def_property_pointer_funcs(prop, "rna_KeyingSet_active_ksPath_get", "rna_KeyingSet_active_ksPath_set", NULL);
- RNA_def_property_ui_text(prop, "Active Keying Set", "Active Keying Set used to insert/delete keyframes");
-
- prop= RNA_def_property(srna, "active_path_index", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "active_path");
- RNA_def_property_int_funcs(prop, "rna_KeyingSet_active_ksPath_index_get", "rna_KeyingSet_active_ksPath_index_set", "rna_KeyingSet_active_ksPath_index_range");
- RNA_def_property_ui_text(prop, "Active Path Index", "Current Keying Set index");
-
+
/* Flags */
- prop= RNA_def_property(srna, "absolute", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_path_absolute", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
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)");
@@ -658,7 +660,7 @@ void rna_def_animdata(BlenderRNA *brna)
/* Active Action */
prop= RNA_def_property(srna, "action", PROP_POINTER, PROP_NONE);
- RNA_def_property_pointer_funcs(prop, NULL, "rna_AnimData_action_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_AnimData_action_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE); /* this flag as well as the dynamic test must be defined for this to be editable... */
RNA_def_property_editable_func(prop, "rna_AnimData_action_editable");
RNA_def_property_ui_text(prop, "Action", "Active Action for this datablock");
@@ -670,7 +672,7 @@ void rna_def_animdata(BlenderRNA *brna)
RNA_def_property_enum_items(prop, nla_mode_extend_items);
RNA_def_property_ui_text(prop, "Action Extrapolation", "Action to take for gaps past the Active Action's range (when evaluating with NLA)");
- prop= RNA_def_property(srna, "action_blending", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "action_blend_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "act_blendmode");
RNA_def_property_enum_items(prop, nla_mode_blend_items);
RNA_def_property_ui_text(prop, "Action Blending", "Method used for combining Active Action's result with result of NLA stack");
@@ -688,7 +690,7 @@ void rna_def_animdata(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Drivers", "The Drivers/Expressions for this datablock");
/* General Settings */
- prop= RNA_def_property(srna, "nla_enabled", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_nla", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", ADT_NLA_EVAL_OFF);
RNA_def_property_ui_text(prop, "NLA Evaluation Enabled", "NLA stack is evaluated when evaluating this block");
}
diff --git a/source/blender/makesrna/intern/rna_animation_api.c b/source/blender/makesrna/intern/rna_animation_api.c
index 5c745eac59f..1e62e10f211 100644
--- a/source/blender/makesrna/intern/rna_animation_api.c
+++ b/source/blender/makesrna/intern/rna_animation_api.c
@@ -44,8 +44,8 @@
void RNA_api_keyingset(StructRNA *srna)
{
- FunctionRNA *func;
- PropertyRNA *parm;
+// FunctionRNA *func;
+// PropertyRNA *parm;
}
#endif
diff --git a/source/blender/makesrna/intern/rna_animviz.c b/source/blender/makesrna/intern/rna_animviz.c
index 95ff202a2d8..1fcd53d5d0f 100644
--- a/source/blender/makesrna/intern/rna_animviz.c
+++ b/source/blender/makesrna/intern/rna_animviz.c
@@ -104,9 +104,9 @@ static void rna_def_animviz_motionpath_vert(BlenderRNA *brna)
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Coordinates", "");
- prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOTIONPATH_VERT_SEL);
- RNA_def_property_ui_text(prop, "Selected", "Path point is selected for editing");
+ RNA_def_property_ui_text(prop, "Select", "Path point is selected for editing");
}
static void rna_def_animviz_motion_path(BlenderRNA *brna)
@@ -145,7 +145,7 @@ static void rna_def_animviz_motion_path(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE); // xxx
RNA_def_property_ui_text(prop, "Use Bone Heads", "For PoseBone paths, use the bone head location when calculating this path");
- prop= RNA_def_property(srna, "editing", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_modified", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOTIONPATH_FLAG_EDIT);
RNA_def_property_ui_text(prop, "Edit Path", "Path is being edited");
}
@@ -158,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"},
@@ -178,7 +178,7 @@ static void rna_def_animviz_ghosts(BlenderRNA *brna)
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
/* Settings */
- prop= RNA_def_property(srna, "only_selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_only_selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "ghost_flag", GHOST_FLAG_ONLYSEL);
RNA_def_property_ui_text(prop, "On Selected Bones Only", "For Pose-Mode drawing, only draw ghosts for selected bones");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
@@ -186,7 +186,7 @@ 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 */
@@ -203,13 +203,13 @@ static void rna_def_animviz_ghosts(BlenderRNA *brna)
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
/* Around Current Ranges */
- prop= RNA_def_property(srna, "before_current", PROP_INT, PROP_TIME);
+ prop= RNA_def_property(srna, "frame_before", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "ghost_bc");
RNA_def_property_range(prop, 0, 30);
RNA_def_property_ui_text(prop, "Before Current", "Number of frames to show before the current frame (only 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, "after_current", PROP_INT, PROP_TIME);
+ prop= RNA_def_property(srna, "frame_after", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "ghost_ac");
RNA_def_property_range(prop, 0, 30);
RNA_def_property_ui_text(prop, "After Current", "Number of frames to show after the current frame (only for 'Around Current Frame' Onion-skinning method)");
@@ -222,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"},
@@ -254,7 +254,7 @@ static void rna_def_animviz_paths(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show Frame Numbers", "Show frame numbers 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, "highlight_keyframes", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_keyframe_highlight", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "path_viewflag", MOTIONPATH_VIEW_KFRAS);
RNA_def_property_ui_text(prop, "Highlight Keyframes", "Emphasize position 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 */
@@ -264,10 +264,15 @@ 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, "show_keyframe_action_all", 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 */
@@ -285,13 +290,13 @@ static void rna_def_animviz_paths(BlenderRNA *brna)
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
/* Around Current Ranges */
- prop= RNA_def_property(srna, "before_current", PROP_INT, PROP_TIME);
+ prop= RNA_def_property(srna, "frame_before", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "path_bc");
RNA_def_property_range(prop, 1, MAXFRAMEF/2);
RNA_def_property_ui_text(prop, "Before Current", "Number of frames to show before the current frame (only 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, "after_current", PROP_INT, PROP_TIME);
+ prop= RNA_def_property(srna, "frame_after", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "path_ac");
RNA_def_property_range(prop, 1, MAXFRAMEF/2);
RNA_def_property_ui_text(prop, "After Current", "Number of frames to show after the current frame (only for 'Around Current Frame' Onion-skinning method)");
@@ -320,17 +325,17 @@ static void rna_def_animviz(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Animation Visualisation", "Settings for the visualisation of motion");
/* onion-skinning settings (nested struct) */
- prop= RNA_def_property(srna, "onion_skinning", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "onion_skin_frames", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "AnimVizOnionSkinning");
- RNA_def_property_pointer_funcs(prop, "rna_AnimViz_onion_skinning_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_AnimViz_onion_skinning_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Onion Skinning", "Onion Skinning (ghosting) settings for visualisation");
/* motion path settings (nested struct) */
- prop= RNA_def_property(srna, "motion_paths", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "motion_path", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "AnimVizMotionPaths");
- RNA_def_property_pointer_funcs(prop, "rna_AnimViz_motion_paths_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_AnimViz_motion_paths_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Motion Paths", "Motion Path settings for visualisation");
}
diff --git a/source/blender/makesrna/intern/rna_armature.c b/source/blender/makesrna/intern/rna_armature.c
index 1ad63d63639..f2abe690218 100644
--- a/source/blender/makesrna/intern/rna_armature.c
+++ b/source/blender/makesrna/intern/rna_armature.c
@@ -108,6 +108,12 @@ void rna_Armature_edit_bone_remove(bArmature *arm, ReportList *reports, EditBone
BKE_reportf(reports, RPT_ERROR, "Armature '%s' not in editmode, cant remove an editbone.", arm->id.name+2);
return;
}
+
+ if(BLI_findindex(arm->edbo, ebone) == -1) {
+ BKE_reportf(reports, RPT_ERROR, "Armature '%s' doesn't contain bone '%s'.", arm->id.name+2, ebone->name);
+ return;
+ }
+
ED_armature_edit_bone_remove(arm, ebone);
}
@@ -123,7 +129,7 @@ static char *rna_Bone_path(PointerRNA *ptr)
return BLI_sprintfN("bones[\"%s\"]", ((Bone*)ptr->data)->name);
}
-static IDProperty *rna_Bone_idproperties(PointerRNA *ptr, int create)
+static IDProperty *rna_Bone_idprops(PointerRNA *ptr, int create)
{
Bone *bone= ptr->data;
@@ -135,7 +141,7 @@ static IDProperty *rna_Bone_idproperties(PointerRNA *ptr, int create)
return bone->prop;
}
-static IDProperty *rna_EditBone_idproperties(PointerRNA *ptr, int create)
+static IDProperty *rna_EditBone_idprops(PointerRNA *ptr, int create)
{
EditBone *ebone= ptr->data;
@@ -393,7 +399,7 @@ static void rna_def_bone_common(StructRNA *srna, int editbone)
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
/* flags */
- prop= RNA_def_property(srna, "layer", PROP_BOOLEAN, PROP_LAYER_MEMBER);
+ prop= RNA_def_property(srna, "layers", PROP_BOOLEAN, PROP_LAYER_MEMBER);
RNA_def_property_boolean_sdna(prop, NULL, "layer", 1);
RNA_def_property_array(prop, 32);
if(editbone) RNA_def_property_boolean_funcs(prop, NULL, "rna_EditBone_layer_set");
@@ -401,49 +407,49 @@ static void rna_def_bone_common(StructRNA *srna, int editbone)
RNA_def_property_ui_text(prop, "Layers", "Layers bone exists in");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
- prop= RNA_def_property(srna, "connected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_connect", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_CONNECTED);
if(editbone) RNA_def_property_boolean_funcs(prop, NULL, "rna_EditBone_connected_set");
else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Connected", "When bone has a parent, bone's head is struck to the parent's tail");
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
- prop= RNA_def_property(srna, "hinge", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_hinge", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_HINGE);
RNA_def_property_ui_text(prop, "Inherit Rotation", "Bone inherits rotation or scale from parent bone");
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
- prop= RNA_def_property(srna, "multiply_vertexgroup_with_envelope", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_envelope_multiply", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_MULT_VG_ENV);
RNA_def_property_ui_text(prop, "Multiply Vertex Group with Envelope", "When deforming bone, multiply effects of Vertex Group weights with Envelope influence");
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
- prop= RNA_def_property(srna, "deform", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_deform", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_NO_DEFORM);
RNA_def_property_ui_text(prop, "Deform", "Bone does not deform any geometry");
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
- prop= RNA_def_property(srna, "inherit_scale", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_inherit_scale", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_ui_text(prop, "Inherit Scale", "Bone inherits scaling from parent bone");
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_NO_SCALE);
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
- prop= RNA_def_property(srna, "local_location", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_local_location", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_ui_text(prop, "Local Location", "Bone location is set in local space");
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_NO_LOCAL_LOCATION);
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
- prop= RNA_def_property(srna, "draw_wire", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_wire", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_DRAWWIRE);
RNA_def_property_ui_text(prop, "Draw Wire", "Bone is always drawn as Wireframe regardless of viewport draw mode. Useful for non-obstructive custom bone shapes");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
- prop= RNA_def_property(srna, "cyclic_offset", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_cyclic_offset", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_NO_CYCLICOFFSET);
RNA_def_property_ui_text(prop, "Cyclic Offset", "When bone doesn't have a parent, it receives cyclic offset effects");
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
- prop= RNA_def_property(srna, "restrict_select", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "hide_select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_UNSELECTABLE);
RNA_def_property_ui_text(prop, "Selectable", "Bone is able to be selected");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
@@ -504,7 +510,7 @@ static void rna_def_bone(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Bone", "Bone in an Armature datablock");
RNA_def_struct_ui_icon(srna, ICON_BONE_DATA);
RNA_def_struct_path_func(srna, "rna_Bone_path");
- RNA_def_struct_idproperties_func(srna, "rna_Bone_idproperties");
+ RNA_def_struct_idprops_func(srna, "rna_Bone_idprops");
/* pointers/collections */
/* parent (pointer) */
@@ -523,14 +529,14 @@ static void rna_def_bone(BlenderRNA *brna)
rna_def_bone_common(srna, 0);
// XXX should we define this in PoseChannel wrapping code instead? but PoseChannels directly get some of their flags from here...
- prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_HIDDEN_P);
- RNA_def_property_ui_text(prop, "Hidden", "Bone is not visible when it is not in Edit Mode (i.e. in Object or Pose Modes)");
+ RNA_def_property_ui_text(prop, "Hide", "Bone is not visible when it is not in Edit Mode (i.e. in Object or Pose Modes)");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
- prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_SELECTED);
- RNA_def_property_ui_text(prop, "Selected", "");
+ RNA_def_property_ui_text(prop, "Select", "");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
/* XXX better matrix descriptions possible (Arystan) */
@@ -572,7 +578,7 @@ static void rna_def_edit_bone(BlenderRNA *brna)
srna= RNA_def_struct(brna, "EditBone", NULL);
RNA_def_struct_sdna(srna, "EditBone");
- RNA_def_struct_idproperties_func(srna, "rna_EditBone_idproperties");
+ RNA_def_struct_idprops_func(srna, "rna_EditBone_idprops");
RNA_def_struct_ui_text(srna, "Edit Bone", "Editmode bone in an Armature datablock");
RNA_def_struct_ui_icon(srna, ICON_BONE_DATA);
@@ -580,7 +586,7 @@ static void rna_def_edit_bone(BlenderRNA *brna)
prop= RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "EditBone");
- RNA_def_property_pointer_funcs(prop, "rna_EditBone_parent_get", "rna_EditBone_parent_set", NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_EditBone_parent_get", "rna_EditBone_parent_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Parent", "Parent edit bone (in same Armature)");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
@@ -604,29 +610,29 @@ static void rna_def_edit_bone(BlenderRNA *brna)
rna_def_bone_common(srna, 1);
- prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_HIDDEN_A);
- RNA_def_property_ui_text(prop, "Hidden", "Bone is not visible when in Edit Mode");
+ RNA_def_property_ui_text(prop, "Hide", "Bone is not visible when in Edit Mode");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
- prop= RNA_def_property(srna, "locked", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_EDITMODE_LOCKED);
- RNA_def_property_ui_text(prop, "Locked", "Bone is not able to be transformed when in Edit Mode");
+ RNA_def_property_ui_text(prop, "Lock", "Bone is not able to be transformed when in Edit Mode");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
- prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_SELECTED);
- RNA_def_property_ui_text(prop, "Selected", "");
+ RNA_def_property_ui_text(prop, "Select", "");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
- prop= RNA_def_property(srna, "selected_head", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select_head", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_ROOTSEL);
- RNA_def_property_ui_text(prop, "Head Selected", "");
+ RNA_def_property_ui_text(prop, "Head Select", "");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
- prop= RNA_def_property(srna, "selected_tail", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select_tail", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_TIPSEL);
- RNA_def_property_ui_text(prop, "Tail Selected", "");
+ RNA_def_property_ui_text(prop, "Tail Select", "");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
/* calculated and read only, not actual data access */
@@ -664,7 +670,7 @@ static void rna_def_armature_bones(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_pointer_sdna(prop, NULL, "act_bone");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Active Bone", "Armatures active bone");
- RNA_def_property_pointer_funcs(prop, NULL, "rna_Armature_act_bone_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_Armature_act_bone_set", NULL, NULL);
/* todo, redraw */
// RNA_def_property_collection_active(prop, prop_act);
@@ -690,7 +696,7 @@ static void rna_def_armature_edit_bones(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Active EditBone", "Armatures active edit bone");
//RNA_def_property_update(prop, 0, "rna_Armature_act_editbone_update");
- RNA_def_property_pointer_funcs(prop, NULL, "rna_Armature_act_edit_bone_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_Armature_act_edit_bone_set", NULL, NULL);
/* todo, redraw */
// RNA_def_property_collection_active(prop, prop_act);
@@ -712,7 +718,7 @@ static void rna_def_armature_edit_bones(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove an existing bone from the armature");
/* target to remove*/
parm= RNA_def_pointer(func, "bone", "EditBone", "", "EditBone to remove");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
static void rna_def_armature(BlenderRNA *brna)
@@ -765,7 +771,8 @@ static void rna_def_armature(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Pose Position", "Show armature in binding pose or final posed state");
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
- prop= RNA_def_property(srna, "drawtype", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "draw_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "drawtype");
RNA_def_property_enum_items(prop, prop_drawtype_items);
RNA_def_property_ui_text(prop, "Draw Type", "");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
@@ -782,7 +789,7 @@ static void rna_def_armature(BlenderRNA *brna)
/* Boolean values */
/* layer */
- prop= RNA_def_property(srna, "layer", PROP_BOOLEAN, PROP_LAYER_MEMBER);
+ prop= RNA_def_property(srna, "layers", PROP_BOOLEAN, PROP_LAYER_MEMBER);
RNA_def_property_boolean_sdna(prop, NULL, "layer", 1);
RNA_def_property_array(prop, 32);
RNA_def_property_ui_text(prop, "Visible Layers", "Armature layer visibility");
@@ -791,54 +798,54 @@ static void rna_def_armature(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
/* layer protection */
- prop= RNA_def_property(srna, "layer_protection", PROP_BOOLEAN, PROP_LAYER);
+ prop= RNA_def_property(srna, "layers_protected", PROP_BOOLEAN, PROP_LAYER);
RNA_def_property_boolean_sdna(prop, NULL, "layer_protected", 1);
RNA_def_property_array(prop, 32);
RNA_def_property_ui_text(prop, "Layer Proxy Protection", "Protected layers in Proxy Instances are restored to Proxy settings on file reload and undo");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
/* flag */
- prop= RNA_def_property(srna, "draw_axes", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_axes", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_DRAWAXES);
RNA_def_property_ui_text(prop, "Draw Axes", "Draw bone axes");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
- prop= RNA_def_property(srna, "draw_names", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_names", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_DRAWNAMES);
RNA_def_property_ui_text(prop, "Draw Names", "Draw bone names");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
- prop= RNA_def_property(srna, "delay_deform", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_deform_delay", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_DELAYDEFORM);
RNA_def_property_ui_text(prop, "Delay Deform", "Don't deform children when manipulating bones in Pose Mode");
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
- prop= RNA_def_property(srna, "x_axis_mirror", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_mirror_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_MIRROR_EDIT);
RNA_def_property_ui_text(prop, "X-Axis Mirror", "Apply changes to matching bone on opposite side of X-Axis");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
- prop= RNA_def_property(srna, "auto_ik", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_auto_ik", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_AUTO_IK);
RNA_def_property_ui_text(prop, "Auto IK", "Add temporaral IK constraints while grabbing bones in Pose Mode");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
- prop= RNA_def_property(srna, "draw_custom_bone_shapes", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_bone_custom_shapes", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", ARM_NO_CUSTOM);
RNA_def_property_ui_text(prop, "Draw Custom Bone Shapes", "Draw bones with their custom shapes");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
- prop= RNA_def_property(srna, "draw_group_colors", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_group_colors", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_COL_CUSTOM);
RNA_def_property_ui_text(prop, "Draw Bone Group Colors", "Draw bone group colors");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
// XXX depreceated ....... old animviz for armatures only
- prop= RNA_def_property(srna, "ghost_only_selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_only_ghost_selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_GHOST_ONLYSEL);
RNA_def_property_ui_text(prop, "Draw Ghosts on Selected Bones Only", "");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
@@ -846,26 +853,21 @@ static void rna_def_armature(BlenderRNA *brna)
// XXX depreceated ....... old animviz for armatures only
/* deformflag */
- prop= RNA_def_property(srna, "deform_vertexgroups", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_deform_vertex_groups", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_VGROUP);
RNA_def_property_ui_text(prop, "Deform Vertex Groups", "Enable Vertex Groups when defining deform");
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
- prop= RNA_def_property(srna, "deform_envelope", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_deform_envelopes", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_ENVELOPE);
RNA_def_property_ui_text(prop, "Deform Envelopes", "Enable Bone Envelopes when defining deform");
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
- prop= RNA_def_property(srna, "deform_quaternion", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_deform_preserve_volume", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_QUATERNION);
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)");
@@ -877,14 +879,14 @@ 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);
diff --git a/source/blender/makesrna/intern/rna_boid.c b/source/blender/makesrna/intern/rna_boid.c
index ddf9cf1aeda..3afa135d079 100644
--- a/source/blender/makesrna/intern/rna_boid.c
+++ b/source/blender/makesrna/intern/rna_boid.c
@@ -83,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)
{
@@ -97,9 +97,9 @@ static void rna_Boids_reset_deps(Main *bmain, Scene *scene, PointerRNA *ptr)
else
DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, 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)
@@ -238,7 +238,7 @@ static void rna_def_boidrule_goal(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Object", "Goal object");
RNA_def_property_update(prop, 0, "rna_Boids_reset_deps");
- prop= RNA_def_property(srna, "predict", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_predict", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "options", BRULE_GOAL_AVOID_PREDICT);
RNA_def_property_ui_text(prop, "Predict", "Predict target movement");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
@@ -259,14 +259,14 @@ static void rna_def_boidrule_avoid(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Object", "Object to avoid");
RNA_def_property_update(prop, 0, "rna_Boids_reset_deps");
- prop= RNA_def_property(srna, "predict", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_predict", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "options", BRULE_GOAL_AVOID_PREDICT);
RNA_def_property_ui_text(prop, "Predict", "Predict target movement");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
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");
}
@@ -278,12 +278,12 @@ static void rna_def_boidrule_avoid_collision(BlenderRNA *brna)
srna= RNA_def_struct(brna, "BoidRuleAvoidCollision", "BoidRule");
RNA_def_struct_ui_text(srna, "Avoid Collision", "");
- prop= RNA_def_property(srna, "boids", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_avoid", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "options", BRULE_ACOLL_WITH_BOIDS);
RNA_def_property_ui_text(prop, "Boids", "Avoid collision with other boids");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
- prop= RNA_def_property(srna, "deflectors", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_avoid_collision", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "options", BRULE_ACOLL_WITH_DEFLECTORS);
RNA_def_property_ui_text(prop, "Deflectors", "Avoid collision with deflector objects");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
@@ -313,12 +313,13 @@ static void rna_def_boidrule_follow_leader(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Distance", "Distance behind leader to follow");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
- prop= RNA_def_property(srna, "queue_size", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "queue_count", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "queue_size");
RNA_def_property_range(prop, 0.0f, 100.0f);
RNA_def_property_ui_text(prop, "Queue Size", "How many boids in a line");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
- prop= RNA_def_property(srna, "line", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_line", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "options", BRULE_LEADER_IN_LINE);
RNA_def_property_ui_text(prop, "Line", "Follow leader in a line");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
@@ -391,17 +392,17 @@ static void rna_def_boidrule(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Type", "");
/* flags */
- prop= RNA_def_property(srna, "in_air", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_in_air", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BOIDRULE_IN_AIR);
RNA_def_property_ui_text(prop, "In Air", "Use rule when boid is flying");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
- prop= RNA_def_property(srna, "on_land", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_on_land", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BOIDRULE_ON_LAND);
RNA_def_property_ui_text(prop, "On Land", "Use rule when boid is on land");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
- //prop= RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE);
+ //prop= RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
//RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_Expanded);
//RNA_def_property_ui_text(prop, "Expanded", "Set modifier expanded in the user interface");
@@ -436,16 +437,17 @@ static void rna_def_boidstate(BlenderRNA *brna)
prop= RNA_def_property(srna, "active_boid_rule", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "BoidRule");
- RNA_def_property_pointer_funcs(prop, "rna_BoidState_active_boid_rule_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_BoidState_active_boid_rule_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Active Boid Rule", "");
prop= RNA_def_property(srna, "active_boid_rule_index", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_funcs(prop, "rna_BoidState_active_boid_rule_index_get", "rna_BoidState_active_boid_rule_index_set", "rna_BoidState_active_boid_rule_index_range");
RNA_def_property_ui_text(prop, "Active Boid Rule Index", "");
- prop= RNA_def_property(srna, "rule_fuzziness", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "rule_fuzzy", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "rule_fuzziness");
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);
@@ -466,12 +468,14 @@ static void rna_def_boid_settings(BlenderRNA *brna)
srna = RNA_def_struct(brna, "BoidSettings", NULL);
RNA_def_struct_ui_text(srna, "Boid Settings", "Settings for boid physics");
- prop= RNA_def_property(srna, "landing_smoothness", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "land_smooth", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "landing_smoothness");
RNA_def_property_range(prop, 0.0, 10.0);
RNA_def_property_ui_text(prop, "Landing Smoothness", "How smoothly the boids land");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
- prop= RNA_def_property(srna, "banking", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "bank", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "banking");
RNA_def_property_range(prop, 0.0, 2.0);
RNA_def_property_ui_text(prop, "Banking", "Amount of rotation around velocity vector on turns");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
@@ -488,7 +492,7 @@ static void rna_def_boid_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "active_boid_state", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "BoidRule");
- RNA_def_property_pointer_funcs(prop, "rna_BoidSettings_active_boid_state_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_BoidSettings_active_boid_state_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Active Boid Rule", "");
prop= RNA_def_property(srna, "active_boid_state_index", PROP_INT, PROP_UNSIGNED);
@@ -522,22 +526,26 @@ static void rna_def_boid_settings(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Boids_reset");
/* physical properties */
- prop= RNA_def_property(srna, "air_min_speed", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "air_speed_min", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "air_min_speed");
RNA_def_property_range(prop, 0.0, 1.0);
RNA_def_property_ui_text(prop, "Min Air Speed", "Minimum speed in air (relative to maximum speed)");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
- prop= RNA_def_property(srna, "air_max_speed", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "air_speed_max", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "air_max_speed");
RNA_def_property_range(prop, 0.0, 100.0);
RNA_def_property_ui_text(prop, "Max Air Speed", "Maximum speed in air");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
- prop= RNA_def_property(srna, "air_max_acc", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "air_acc_max", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "air_max_acc");
RNA_def_property_range(prop, 0.0, 1.0);
RNA_def_property_ui_text(prop, "Max Air Acceleration", "Maximum acceleration in air (relative to maximum speed)");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
- prop= RNA_def_property(srna, "air_max_ave", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "air_ave_max", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "air_max_ave");
RNA_def_property_range(prop, 0.0, 1.0);
RNA_def_property_ui_text(prop, "Max Air Angular Velocity", "Maximum angular velocity in air (relative to 180 degrees)");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
@@ -552,17 +560,20 @@ static void rna_def_boid_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Jump Speed", "Maximum speed for jumping");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
- prop= RNA_def_property(srna, "land_max_speed", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "land_speed_max", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "land_max_speed");
RNA_def_property_range(prop, 0.0, 100.0);
RNA_def_property_ui_text(prop, "Max Land Speed", "Maximum speed on land");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
- prop= RNA_def_property(srna, "land_max_acc", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "land_acc_max", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "land_max_acc");
RNA_def_property_range(prop, 0.0, 1.0);
RNA_def_property_ui_text(prop, "Max Land Acceleration", "Maximum acceleration on land (relative to maximum speed)");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
- prop= RNA_def_property(srna, "land_max_ave", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "land_ave_max", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "land_max_ave");
RNA_def_property_range(prop, 0.0, 1.0);
RNA_def_property_ui_text(prop, "Max Land Angular Velocity", "Maximum angular velocity on land (relative to 180 degrees)");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
@@ -578,17 +589,17 @@ static void rna_def_boid_settings(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Boids_reset");
/* options */
- prop= RNA_def_property(srna, "allow_flight", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_flight", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "options", BOID_ALLOW_FLIGHT);
RNA_def_property_ui_text(prop, "Allow Flight", "Allow boids to move in air");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
- prop= RNA_def_property(srna, "allow_land", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_land", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "options", BOID_ALLOW_LAND);
RNA_def_property_ui_text(prop, "Allow Land", "Allow boids to move on land");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
- prop= RNA_def_property(srna, "allow_climb", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_climb", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "options", BOID_ALLOW_CLIMB);
RNA_def_property_ui_text(prop, "Allow Climbing", "Allow boids to climb goal objects");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c
index fff29ba8f56..83d40a3802b 100644
--- a/source/blender/makesrna/intern/rna_brush.c
+++ b/source/blender/makesrna/intern/rna_brush.c
@@ -30,25 +30,266 @@
#include "DNA_brush_types.h"
#include "DNA_texture_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
#include "BLI_math.h"
#include "IMB_imbuf.h"
+
#include "WM_types.h"
+static EnumPropertyItem prop_direction_items[]= {
+ {0, "ADD", 0, "Add", "Add effect of brush"},
+ {BRUSH_DIR_IN, "SUBTRACT", 0, "Subtract", "Subtract effect of brush"},
+ {0, NULL, 0, NULL, NULL}};
+
+EnumPropertyItem brush_sculpt_tool_items[] = {
+ {SCULPT_TOOL_BLOB, "BLOB", ICON_BRUSH_BLOB, "Blob", ""},
+ {SCULPT_TOOL_CLAY, "CLAY", ICON_BRUSH_CLAY, "Clay", ""},
+ {SCULPT_TOOL_CREASE, "CREASE",ICON_BRUSH_CREASE, "Crease", ""},
+ {SCULPT_TOOL_DRAW, "DRAW", ICON_BRUSH_SCULPT_DRAW, "Draw", ""},
+ {SCULPT_TOOL_FILL, "FILL", ICON_BRUSH_FILL, "Fill", ""},
+ {SCULPT_TOOL_FLATTEN, "FLATTEN", ICON_BRUSH_FLATTEN, "Flatten", ""},
+ {SCULPT_TOOL_GRAB, "GRAB", ICON_BRUSH_GRAB, "Grab", ""},
+ {SCULPT_TOOL_INFLATE, "INFLATE", ICON_BRUSH_INFLATE, "Inflate", ""},
+ {SCULPT_TOOL_LAYER, "LAYER", ICON_BRUSH_LAYER, "Layer", ""},
+ {SCULPT_TOOL_NUDGE, "NUDGE", ICON_BRUSH_NUDGE, "Nudge", ""},
+ {SCULPT_TOOL_PINCH, "PINCH", ICON_BRUSH_PINCH, "Pinch", ""},
+ {SCULPT_TOOL_ROTATE, "ROTATE", ICON_BRUSH_ROTATE, "Rotate", ""},
+ {SCULPT_TOOL_SCRAPE, "SCRAPE", ICON_BRUSH_SCRAPE, "Scrape", ""},
+ {SCULPT_TOOL_SMOOTH, "SMOOTH", ICON_BRUSH_SMOOTH, "Smooth", ""},
+ {SCULPT_TOOL_SNAKE_HOOK, "SNAKE_HOOK", ICON_BRUSH_SNAKE_HOOK, "Snake Hook", ""},
+ {SCULPT_TOOL_THUMB, "THUMB", ICON_BRUSH_THUMB, "Thumb", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+
+EnumPropertyItem brush_vertexpaint_tool_items[] = {
+ {0, "MIX", ICON_BRUSH_MIX, "Mix", "Use mix blending mode while painting"},
+ {1, "ADD", ICON_BRUSH_ADD, "Add", "Use add blending mode while painting"},
+ {2, "SUB", ICON_BRUSH_SUBTRACT, "Subtract", "Use subtract blending mode while painting"},
+ {3, "MUL", ICON_BRUSH_MULTIPLY, "Multiply", "Use multiply blending mode while painting"},
+ {4, "BLUR", ICON_BRUSH_BLUR, "Blur", "Blur the color with surrounding values"},
+ {5, "LIGHTEN", ICON_BRUSH_LIGHTEN, "Lighten", "Use lighten blending mode while painting"},
+ {6, "DARKEN", ICON_BRUSH_DARKEN, "Darken", "Use darken blending mode while painting"},
+ {0, NULL, 0, NULL, NULL}};
+
+EnumPropertyItem brush_imagepaint_tool_items[] = {
+ {PAINT_TOOL_DRAW, "DRAW", ICON_BRUSH_TEXDRAW, "Draw", ""},
+ {PAINT_TOOL_SOFTEN, "SOFTEN", ICON_BRUSH_SOFTEN, "Soften", ""},
+ {PAINT_TOOL_SMEAR, "SMEAR", ICON_BRUSH_SMEAR, "Smear", ""},
+ {PAINT_TOOL_CLONE, "CLONE", ICON_BRUSH_CLONE, "Clone", ""},
+ {0, NULL, 0, NULL, NULL}};
+
#ifdef RNA_RUNTIME
#include "MEM_guardedalloc.h"
+#include "DNA_object_types.h"
+
+#include "RNA_access.h"
+
#include "BKE_texture.h"
+#include "BKE_brush.h"
+#include "BKE_icons.h"
+
+#include "BKE_paint.h"
#include "WM_api.h"
+static void rna_Brush_reset_icon(Brush *br, char *type)
+{
+ ID *id = &br->id;
+
+ if(br->flag & BRUSH_CUSTOM_ICON)
+ return;
+
+ if(id->icon_id >= BIFICONID_LAST) {
+ BKE_icon_delete(id);
+ BKE_previewimg_free_id(id);
+ }
+
+ id->icon_id = 0;
+}
+
static void rna_Brush_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Brush *br= (Brush*)ptr->data;
WM_main_add_notifier(NC_BRUSH|NA_EDITED, br);
+ //WM_main_add_notifier(NC_SPACE|ND_SPACE_VIEW3D, NULL);
+}
+
+static void rna_Brush_sculpt_tool_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Brush *br= (Brush*)ptr->data;
+ rna_Brush_reset_icon(br, "sculpt");
+ rna_Brush_update(bmain, scene, ptr);
+}
+
+static void rna_Brush_vertexpaint_tool_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Brush *br= (Brush*)ptr->data;
+ rna_Brush_reset_icon(br, "vertex_paint");
+ rna_Brush_update(bmain, scene, ptr);
+}
+
+static void rna_Brush_imagepaint_tool_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Brush *br= (Brush*)ptr->data;
+ rna_Brush_reset_icon(br, "texture_paint");
+ rna_Brush_update(bmain, scene, ptr);
+}
+
+static void rna_Brush_icon_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Brush *br= (Brush*)ptr->data;
+
+ if(br->icon_imbuf) {
+ IMB_freeImBuf(br->icon_imbuf);
+ br->icon_imbuf= NULL;
+ }
+
+ br->id.icon_id = 0;
+
+ if(br->flag & BRUSH_CUSTOM_ICON) {
+ BKE_previewimg_get(&br->id);
+ BKE_icon_changed(BKE_icon_getid(&br->id));
+ }
+
+ WM_main_add_notifier(NC_BRUSH|NA_EDITED, br);
+}
+
+static void rna_Brush_set_size(PointerRNA *ptr, int value)
+{
+ Brush* me = (Brush*)(ptr->data);
+ brush_set_size(me, value);
+}
+
+static int rna_Brush_get_size(PointerRNA *ptr)
+{
+ Brush* me = (Brush*)(ptr->data);
+ return brush_size(me);
+}
+
+static void rna_Brush_set_use_locked_size(PointerRNA *ptr, int value)
+{
+ Brush* me = (Brush*)(ptr->data);
+ brush_set_use_locked_size(me, value);
+}
+
+static int rna_Brush_get_use_locked_size(PointerRNA *ptr)
+{
+ Brush* me = (Brush*)(ptr->data);
+ return brush_use_locked_size(me);
+}
+
+static void rna_Brush_set_use_size_pressure(PointerRNA *ptr, int value)
+{
+ Brush* me = (Brush*)(ptr->data);
+ brush_set_use_size_pressure(me, value);
+}
+
+static int rna_Brush_get_use_size_pressure(PointerRNA *ptr)
+{
+ Brush* me = (Brush*)(ptr->data);
+ return brush_use_size_pressure(me);
+}
+
+static void rna_Brush_set_use_alpha_pressure(PointerRNA *ptr, int value)
+{
+ Brush* me = (Brush*)(ptr->data);
+ brush_set_use_alpha_pressure(me, value);
+}
+
+static int rna_Brush_get_use_alpha_pressure(PointerRNA *ptr)
+{
+ Brush* me = (Brush*)(ptr->data);
+ return brush_use_alpha_pressure(me);
+}
+
+static void rna_Brush_set_unprojected_radius(PointerRNA *ptr, float value)
+{
+ Brush* me = (Brush*)(ptr->data);
+ brush_set_unprojected_radius(me, value);
+}
+
+static float rna_Brush_get_unprojected_radius(PointerRNA *ptr)
+{
+ Brush* me = (Brush*)(ptr->data);
+ return brush_unprojected_radius(me);
+}
+
+static void rna_Brush_set_alpha(PointerRNA *ptr, float value)
+{
+ Brush* me = (Brush*)(ptr->data);
+ brush_set_alpha(me, value);
+}
+
+static float rna_Brush_get_alpha(PointerRNA *ptr)
+{
+ Brush* me = (Brush*)(ptr->data);
+ return brush_alpha(me);
+}
+
+static EnumPropertyItem *rna_Brush_direction_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ static EnumPropertyItem prop_default_items[]= {
+ {0, NULL, 0, NULL, NULL}};
+
+ static 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 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 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 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 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}};
+
+ Brush *me= (Brush*)(ptr->data);
+
+ switch (me->sculpt_tool) {
+ case SCULPT_TOOL_DRAW:
+ case SCULPT_TOOL_CREASE:
+ case SCULPT_TOOL_BLOB:
+ case SCULPT_TOOL_LAYER:
+ case SCULPT_TOOL_CLAY:
+ return prop_direction_items;
+
+ case SCULPT_TOOL_FLATTEN:
+ return prop_flatten_contrast_items;
+
+ case SCULPT_TOOL_FILL:
+ return prop_fill_deepen_items;
+
+ case SCULPT_TOOL_SCRAPE:
+ return prop_scrape_peaks_items;
+
+ case SCULPT_TOOL_PINCH:
+ return prop_pinch_magnify_items;
+
+ case SCULPT_TOOL_INFLATE:
+ return prop_inflate_deflate_items;
+
+ default:
+ return prop_default_items;
+ }
}
#else
@@ -97,43 +338,37 @@ static void rna_def_brush(BlenderRNA *brna)
{IMB_BLEND_ADD_ALPHA, "ADD_ALPHA", 0, "Add Alpha", "Add alpha while painting"},
{0, NULL, 0, NULL, NULL}};
- static EnumPropertyItem brush_sculpt_tool_items[] = {
- {SCULPT_TOOL_DRAW, "DRAW", 0, "Draw", ""},
- {SCULPT_TOOL_SMOOTH, "SMOOTH", 0, "Smooth", ""},
- {SCULPT_TOOL_PINCH, "PINCH", 0, "Pinch", ""},
- {SCULPT_TOOL_INFLATE, "INFLATE", 0, "Inflate", ""},
- {SCULPT_TOOL_GRAB, "GRAB", 0, "Grab", ""},
- {SCULPT_TOOL_LAYER, "LAYER", 0, "Layer", ""},
- {SCULPT_TOOL_FLATTEN, "FLATTEN", 0, "Flatten", ""},
- {SCULPT_TOOL_CLAY, "CLAY", 0, "Clay", ""},
+ 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 brush_vertexpaint_tool_items[] = {
- {0, "MIX", 0, "Mix", "Use mix blending mode while painting"},
- {1, "ADD", 0, "Add", "Use add blending mode while painting"},
- {2, "SUB", 0, "Subtract", "Use subtract blending mode while painting"},
- {3, "MUL", 0, "Multiply", "Use multiply blending mode while painting"},
- {4, "BLUR", 0, "Blur", "Blur the color with surrounding values"},
- {5, "LIGHTEN", 0, "Lighten", "Use lighten blending mode while painting"},
- {6, "DARKEN", 0, "Darken", "Use darken blending mode while painting"},
+
+ 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 brush_imagepaint_tool_items[] = {
- {PAINT_TOOL_DRAW, "DRAW", 0, "Draw", ""},
- {PAINT_TOOL_SOFTEN, "SOFTEN", 0, "Soften", ""},
- {PAINT_TOOL_SMEAR, "SMEAR", 0, "Smear", ""},
- {PAINT_TOOL_CLONE, "CLONE", 0, "Clone", ""},
+
+ static EnumPropertyItem texture_angle_source_no_random_items[] = {
+ {0, "USER", 0, "User", ""},
+ {BRUSH_RAKE, "RAKE", 0, "Rake", ""},
{0, NULL, 0, NULL, NULL}};
-
- static const EnumPropertyItem prop_flip_direction_items[]= {
- {0, "ADD", 0, "Add", "Add effect of brush"},
- {BRUSH_DIR_IN, "SUBTRACT", 0, "Subtract", "Subtract effect of brush"},
+
+ 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}};
-
+
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);
-
+
/* enums */
prop= RNA_def_property(srna, "blend", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_blend_items);
@@ -143,48 +378,82 @@ static void rna_def_brush(BlenderRNA *brna)
prop= RNA_def_property(srna, "sculpt_tool", PROP_ENUM, PROP_NONE);
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");
-
+ RNA_def_property_update(prop, 0, "rna_Brush_sculpt_tool_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", "");
- RNA_def_property_update(prop, 0, "rna_Brush_update");
+ RNA_def_property_update(prop, 0, "rna_Brush_vertexpaint_tool_update");
prop= RNA_def_property(srna, "imagepaint_tool", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, brush_imagepaint_tool_items);
RNA_def_property_ui_text(prop, "Image Paint Tool", "");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, "rna_Brush_update");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, "rna_Brush_imagepaint_tool_update");
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_enum_items(prop, prop_direction_items);
+ RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Brush_direction_itemf");
+ 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_random", 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, "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_int_funcs(prop, "rna_Brush_get_size", "rna_Brush_set_size", NULL);
+ 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_float_funcs(prop, "rna_Brush_get_unprojected_radius", "rna_Brush_set_unprojected_radius", NULL);
+ RNA_def_property_range(prop, 0.001, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0.001, 1, 0, 0);
+ RNA_def_property_ui_text(prop, "Unprojected Radius", "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");
@@ -202,10 +471,57 @@ 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_funcs(prop, "rna_Brush_get_alpha", "rna_Brush_set_alpha", NULL);
+ 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, "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, "Strength", "The amount of pressure on the brush");
+ 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, "auto_smooth_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,40 +530,74 @@ 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");
RNA_def_property_update(prop, 0, "rna_Brush_update");
- prop= RNA_def_property(srna, "use_strength_pressure", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pressure_strength", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_ALPHA_PRESSURE);
+ RNA_def_property_boolean_funcs(prop, "rna_Brush_get_use_alpha_pressure", "rna_Brush_set_use_alpha_pressure");
RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
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_size_pressure", PROP_BOOLEAN, PROP_NONE);
+ 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_pressure_size", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_SIZE_PRESSURE);
+ RNA_def_property_boolean_funcs(prop, "rna_Brush_get_use_size_pressure", "rna_Brush_set_use_size_pressure");
RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
RNA_def_property_ui_text(prop, "Size Pressure", "Enable tablet pressure sensitivity for size");
RNA_def_property_update(prop, 0, "rna_Brush_update");
- prop= RNA_def_property(srna, "use_jitter_pressure", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pressure_jitter", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_JITTER_PRESSURE);
RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
RNA_def_property_ui_text(prop, "Jitter Pressure", "Enable tablet pressure sensitivity for jitter");
RNA_def_property_update(prop, 0, "rna_Brush_update");
- prop= RNA_def_property(srna, "use_spacing_pressure", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pressure_spacing", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_SPACING_PRESSURE);
RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
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,6 +623,38 @@ 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, "use_locked_size", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_Brush_get_use_locked_size", "rna_Brush_set_use_locked_size");
+ 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, "use_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, "use_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);
@@ -290,6 +672,23 @@ static void rna_def_brush(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Curve", "Editable falloff curve");
RNA_def_property_update(prop, 0, "rna_Brush_update");
+ /* paint mode flags */
+ prop= RNA_def_property(srna, "use_paint_sculpt", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_SCULPT);
+ RNA_def_property_ui_text(prop, "Use Sculpt", "Use this brush in sculpt mode");
+
+ prop= RNA_def_property(srna, "use_paint_vertex", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_VERTEX_PAINT);
+ RNA_def_property_ui_text(prop, "Use Vertex", "Use this brush in vertex paint mode");
+
+ prop= RNA_def_property(srna, "use_paint_weight", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_WEIGHT_PAINT);
+ RNA_def_property_ui_text(prop, "Use Weight", "Use this brush in weight paint mode");
+
+ prop= RNA_def_property(srna, "use_paint_texture", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_TEXTURE_PAINT);
+ RNA_def_property_ui_text(prop, "Use Texture", "Use this brush in texture paint mode");
+
/* texture */
prop= RNA_def_property(srna, "texture_slot", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "BrushTextureSlot");
@@ -303,6 +702,34 @@ 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, "cursor_color_add", 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, "cursor_color_subtract", 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, "use_custom_icon", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_CUSTOM_ICON);
+ RNA_def_property_ui_text(prop, "Custom Icon", "Set the brush icon from an image file");
+ RNA_def_property_update(prop, 0, "rna_Brush_icon_update");
+
+ prop= RNA_def_property(srna, "icon_filepath", PROP_STRING, PROP_FILEPATH);
+ RNA_def_property_string_sdna(prop, NULL, "icon_filepath");
+ RNA_def_property_ui_text(prop, "Brush Icon Filepath", "File path to brush icon");
+ RNA_def_property_update(prop, 0, "rna_Brush_icon_update");
+
/* clone tool */
prop= RNA_def_property(srna, "clone_image", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "clone.image");
@@ -357,16 +784,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, "time", PROP_FLOAT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "pen_flip", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_flag(prop, PROP_IDPROPERTY);
- RNA_def_property_ui_text(prop, "Time", "");
+ RNA_def_property_ui_text(prop, "Flip", "");
- prop= RNA_def_property(srna, "flip", PROP_BOOLEAN, PROP_NONE);
+ // 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, "Flip", "");
+ RNA_def_property_ui_text(prop, "Time", "");
/* 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 */
+
+ // 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 c4dc461ad38..9d82c472882 100644
--- a/source/blender/makesrna/intern/rna_camera.c
+++ b/source/blender/makesrna/intern/rna_camera.c
@@ -36,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
@@ -93,19 +84,13 @@ 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);
+ prop= RNA_def_property(srna, "clip_start", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "clipsta");
RNA_def_property_range(prop, 0.0f, FLT_MAX);
RNA_def_property_ui_text(prop, "Clip Start", "Camera near clipping distance");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
- prop= RNA_def_property(srna, "clip_end", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "clip_end", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "clipend");
RNA_def_property_range(prop, 1.0f, FLT_MAX);
RNA_def_property_ui_text(prop, "Clip End", "Camera far clipping distance");
@@ -115,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");
@@ -123,7 +114,7 @@ void RNA_def_camera(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Orthographic Scale", "Orthographic Camera scale (similar to zoom)");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
- prop= RNA_def_property(srna, "draw_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "draw_size", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "drawsize");
RNA_def_property_range(prop, 0.1f, 1000.0f);
RNA_def_property_ui_range(prop, 0.01, 100, 1, 1);
@@ -144,7 +135,7 @@ void RNA_def_camera(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Shift Y", "Perspective Camera vertical shift");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
- prop= RNA_def_property(srna, "dof_distance", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "dof_distance", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "YF_dofdist");
RNA_def_property_range(prop, 0.0f, 5000.0f);
RNA_def_property_ui_text(prop, "DOF Distance", "Distance to the focus point for depth of field");
@@ -181,7 +172,7 @@ void RNA_def_camera(BlenderRNA *brna)
RNA_def_property_enum_items(prop, prop_lens_unit_items);
RNA_def_property_ui_text(prop, "Lens Unit", "Unit to edit lens in for the user interface");
- prop= RNA_def_property(srna, "panorama", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_panorama", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_PANORAMA);
RNA_def_property_ui_text(prop, "Panorama", "Render the scene with a cylindrical camera for pseudo-fisheye lens effects");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
diff --git a/source/blender/makesrna/intern/rna_cloth.c b/source/blender/makesrna/intern/rna_cloth.c
index 3518044a601..e40bbcbbf50 100644
--- a/source/blender/makesrna/intern/rna_cloth.c
+++ b/source/blender/makesrna/intern/rna_cloth.c
@@ -273,7 +273,7 @@ static void rna_def_cloth_sim_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Air Damping", "Air has normally some thickness which slows falling things down");
RNA_def_property_update(prop, 0, "rna_cloth_update");
- prop= RNA_def_property(srna, "pin_cloth", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pin_cloth", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_GOAL);
RNA_def_property_ui_text(prop, "Pin Cloth", "Enable pinning of cloth vertices to other objects/positions");
RNA_def_property_update(prop, 0, "rna_cloth_update");
@@ -292,7 +292,7 @@ static void rna_def_cloth_sim_settings(BlenderRNA *brna)
/* springs */
- prop= RNA_def_property(srna, "stiffness_scaling", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_stiffness_scale", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_SCALING);
RNA_def_property_ui_text(prop, "Stiffness Scaling", "If enabled, stiffness can be scaled along a weight painted vertex group");
RNA_def_property_update(prop, 0, "rna_cloth_update");
@@ -353,7 +353,7 @@ static void rna_def_cloth_sim_settings(BlenderRNA *brna)
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_pointer_funcs(prop, "rna_ClothSettings_rest_shape_key_get", "rna_ClothSettings_rest_shape_key_set", NULL, 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");
@@ -407,12 +407,12 @@ static void rna_def_cloth_collision_settings(BlenderRNA *brna)
/* general collision */
- prop= RNA_def_property(srna, "enable_collision", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_collision", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_COLLSETTINGS_FLAG_ENABLED);
RNA_def_property_ui_text(prop, "Enable Collision", "Enable collisions with other objects");
RNA_def_property_update(prop, 0, "rna_cloth_update");
- prop= RNA_def_property(srna, "min_distance", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "distance_min", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "epsilon");
RNA_def_property_range(prop, 0.001f, 1.0f);
RNA_def_property_ui_text(prop, "Minimum Distance", "Minimum distance between collision objects before collision response takes in");
@@ -431,12 +431,12 @@ static void rna_def_cloth_collision_settings(BlenderRNA *brna)
/* self collision */
- prop= RNA_def_property(srna, "enable_self_collision", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_self_collision", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_COLLSETTINGS_FLAG_SELF);
RNA_def_property_ui_text(prop, "Enable Self Collision", "Enable self collisions");
RNA_def_property_update(prop, 0, "rna_cloth_update");
- prop= RNA_def_property(srna, "self_min_distance", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "self_distance_min", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "selfepsilon");
RNA_def_property_range(prop, 0.5f, 1.0f);
RNA_def_property_ui_text(prop, "Self Minimum Distance", "0.5 means no distance at all, 1.0 is maximum distance");
diff --git a/source/blender/makesrna/intern/rna_color.c b/source/blender/makesrna/intern/rna_color.c
index daf3f73a3d7..89f3e459105 100644
--- a/source/blender/makesrna/intern/rna_color.c
+++ b/source/blender/makesrna/intern/rna_color.c
@@ -26,8 +26,10 @@
#include <stdio.h>
#include "RNA_define.h"
+#include "rna_internal.h"
#include "DNA_color_types.h"
+#include "DNA_texture_types.h"
#ifdef RNA_RUNTIME
@@ -41,6 +43,7 @@
#include "BKE_colortools.h"
#include "BKE_depsgraph.h"
#include "BKE_node.h"
+#include "BKE_texture.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -269,6 +272,34 @@ static void rna_ColorRamp_update(Main *bmain, Scene *scene, PointerRNA *ptr)
}
}
+static void rna_ColorRamp_eval(struct ColorBand *coba, float position, float color[4])
+{
+ do_colorband(coba, position, color);
+}
+
+static CBData *rna_ColorRampElement_new(struct ColorBand *coba, ReportList *reports, float position)
+{
+ CBData *element= colorband_element_add(coba, position);
+
+ if(element==NULL)
+ BKE_reportf(reports, RPT_ERROR, "Unable to add element to colorband (limit %d)", MAXCOLORBAND);
+
+ return element;
+}
+
+static void rna_ColorRampElement_remove(struct ColorBand *coba, ReportList *reports, CBData *element)
+{
+ int index = (int)(element - coba->data);
+ if(colorband_element_remove(coba, index) == 0)
+ BKE_report(reports, RPT_ERROR, "Element not found in element collection or last element");
+
+}
+
+static void rna_Scopes_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Scopes *s= (Scopes*)ptr->data;
+ s->ok = 0;
+}
#else
@@ -299,9 +330,9 @@ static void rna_def_curvemappoint(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Handle Type", "Curve interpolation at this point: bezier or vector");
- prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CUMA_SELECT);
- RNA_def_property_ui_text(prop, "Selected", "Selection state of the curve point");
+ RNA_def_property_ui_text(prop, "Select", "Selection state of the curve point");
}
static void rna_def_curvemap(BlenderRNA *brna)
@@ -339,7 +370,7 @@ static void rna_def_curvemapping(BlenderRNA *brna)
srna= RNA_def_struct(brna, "CurveMapping", NULL);
RNA_def_struct_ui_text(srna, "CurveMapping", "Curve mapping to map color, vector and scalar values to other values using a user defined curve");
- prop= RNA_def_property(srna, "clip", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_clip", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CUMA_DO_CLIP);
RNA_def_property_ui_text(prop, "Clip", "Force the curve view to fit a defined boundary");
RNA_def_property_boolean_funcs(prop, NULL, "rna_CurveMapping_clip_set");
@@ -390,7 +421,7 @@ 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");
@@ -409,11 +440,41 @@ static void rna_def_color_ramp_element(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_ColorRamp_update");
}
+static void rna_def_color_ramp_element_api(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *parm;
+ FunctionRNA *func;
+
+ RNA_def_property_srna(cprop, "ColorRampElements");
+ srna= RNA_def_struct(brna, "ColorRampElements", NULL);
+ RNA_def_struct_sdna(srna, "ColorBand");
+ RNA_def_struct_path_func(srna, "rna_ColorRampElement_path");
+ RNA_def_struct_ui_text(srna, "Color Ramp Elements", "Collection of Color Ramp Elements");
+
+ /* TODO, make these functions generic in texture.c */
+ func = RNA_def_function(srna, "new", "rna_ColorRampElement_new");
+ RNA_def_function_ui_description(func, "Add element to ColorRamp");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_float(func, "position", 0.0f, 0.0f, 1.0f, "Position", "Position to add element", 0.0f, 1.0f);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ /* return type */
+ parm= RNA_def_pointer(func, "element", "ColorRampElement", "", "New element.");
+ RNA_def_function_return(func, parm);
+
+ func = RNA_def_function(srna, "remove", "rna_ColorRampElement_remove");
+ RNA_def_function_ui_description(func, "Delete element from ColorRamp");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_pointer(func, "element", "ColorRampElement", "", "Element to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+}
+
static void rna_def_color_ramp(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
-
+ FunctionRNA *func;
+
static EnumPropertyItem prop_interpolation_items[] = {
{1, "EASE", 0, "Ease", ""},
{3, "CARDINAL", 0, "Cardinal", ""},
@@ -432,23 +493,108 @@ static void rna_def_color_ramp(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "ColorRampElement");
RNA_def_property_ui_text(prop, "Elements", "");
RNA_def_property_update(prop, 0, "rna_ColorRamp_update");
-
+ rna_def_color_ramp_element_api(brna, prop);
+
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");
+
+#if 0 // use len(elements)
+ prop= RNA_def_property(srna, "total", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "tot");
+ /* needs a function to do the right thing when adding elements like colorband_add_cb() */
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_range(prop, 0, 31); /* MAXCOLORBAND = 32 */
+ RNA_def_property_ui_text(prop, "Total", "Total number of elements");
+ RNA_def_property_update(prop, 0, "rna_ColorRamp_update");
+#endif
+
+ func = RNA_def_function(srna, "evaluate", "rna_ColorRamp_eval");
+ RNA_def_function_ui_description(func, "Evaluate ColorRamp");
+ prop= RNA_def_float(func, "position", 1.0f, 0.0f, 1.0f, "Position", "Evaluate ColorRamp at position", 0.0f, 1.0f);
+ RNA_def_property_flag(prop, PROP_REQUIRED);
+ /* return */
+ prop = RNA_def_float_color(func, "color", 4, NULL, -FLT_MAX, FLT_MAX, "Color", "Color at given position", -FLT_MAX, FLT_MAX);
+ RNA_def_property_flag(prop, PROP_THICK_WRAP);
+ RNA_def_function_output(func, prop);
}
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);
@@ -457,6 +603,7 @@ void RNA_def_color(BlenderRNA *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 c61ebf5adfc..a58807902d8 100644
--- a/source/blender/makesrna/intern/rna_constraint.c
+++ b/source/blender/makesrna/intern/rna_constraint.c
@@ -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", ""},
@@ -157,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;
}
@@ -211,7 +214,7 @@ static void rna_Constraint_update(Main *bmain, Scene *scene, PointerRNA *ptr)
static void rna_Constraint_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- ED_object_constraint_dependency_update(scene, ptr->id.data);
+ ED_object_constraint_dependency_update(bmain, scene, ptr->id.data);
}
static void rna_Constraint_influence_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -434,7 +437,7 @@ static void rna_def_constraint_python(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "ConstraintTarget");
RNA_def_property_ui_text(prop, "Targets", "Target Objects");
- prop= RNA_def_property(srna, "number_of_targets", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "target_count", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "tarnum");
RNA_def_property_ui_text(prop, "Number of Targets", "Usually only 1-3 are needed");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
@@ -449,7 +452,7 @@ static void rna_def_constraint_python(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Use Targets", "Use the targets indicated in the constraint panel");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
- prop= RNA_def_property(srna, "script_error", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "has_script_error", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PYCON_SCRIPTERROR);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Script Error", "The linked Python script has thrown an error");
@@ -507,7 +510,7 @@ static void rna_def_constraint_kinematic(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Orientation Weight", "For Tree-IK: Weight of orientation control for this target");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "chain_length", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "chain_count", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "rootbone");
RNA_def_property_range(prop, 0, 255);
RNA_def_property_ui_text(prop, "Chain Length", "How many bones are included in the IK effect - 0 uses all bones");
@@ -518,28 +521,28 @@ static void rna_def_constraint_kinematic(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Use Tail", "Include bone's tail as last element in chain");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
- prop= RNA_def_property(srna, "axis_reference", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "reference_axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
RNA_def_property_enum_items(prop, constraint_ik_axisref_items);
RNA_def_property_ui_text(prop, "Axis Reference", "Constraint axis Lock options relative to Bone or Target reference");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
- prop= RNA_def_property(srna, "use_position", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_location", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_IK_POS);
RNA_def_property_ui_text(prop, "Position", "Chain follows position of target");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
- prop= RNA_def_property(srna, "pos_lock_x", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock_location_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CONSTRAINT_IK_NO_POS_X);
RNA_def_property_ui_text(prop, "Lock X Pos", "Constraint position along X axis");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Constraint_dependency_update");
- prop= RNA_def_property(srna, "pos_lock_y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock_location_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CONSTRAINT_IK_NO_POS_Y);
RNA_def_property_ui_text(prop, "Lock Y Pos", "Constraint position along Y axis");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Constraint_dependency_update");
- prop= RNA_def_property(srna, "pos_lock_z", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock_location_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CONSTRAINT_IK_NO_POS_Z);
RNA_def_property_ui_text(prop, "Lock Z Pos", "Constraint position along Z axis");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Constraint_dependency_update");
@@ -549,17 +552,17 @@ static void rna_def_constraint_kinematic(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Rotation", "Chain follows rotation of target");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
- prop= RNA_def_property(srna, "rot_lock_x", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock_rotation_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CONSTRAINT_IK_NO_ROT_X);
RNA_def_property_ui_text(prop, "Lock X Rot", "Constraint rotation along X axis");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Constraint_dependency_update");
- prop= RNA_def_property(srna, "rot_lock_y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock_rotation_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CONSTRAINT_IK_NO_ROT_Y);
RNA_def_property_ui_text(prop, "Lock Y Rot", "Constraint rotation along Y axis");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Constraint_dependency_update");
- prop= RNA_def_property(srna, "rot_lock_z", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock_rotation_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CONSTRAINT_IK_NO_ROT_Z);
RNA_def_property_ui_text(prop, "Lock Z Rot", "Constraint rotation along Z axis");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Constraint_dependency_update");
@@ -635,19 +638,19 @@ static void rna_def_constraint_track_to(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Sub-Target", "");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
- prop= RNA_def_property(srna, "track", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "track_axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "reserved1");
RNA_def_property_enum_items(prop, track_items);
RNA_def_property_ui_text(prop, "Track Axis", "Axis that points to the target object");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "up", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "up_axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "reserved2");
RNA_def_property_enum_items(prop, up_items);
RNA_def_property_ui_text(prop, "Up Axis", "Axis that points upward");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "target_z", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_target_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", TARGET_Z_UP);
RNA_def_property_ui_text(prop, "Target Z", "Target's Z axis, not World Z axis, will constraint the Up direction");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
@@ -829,7 +832,7 @@ static void rna_def_constraint_same_volume(BlenderRNA *brna)
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);
+ prop= RNA_def_property(srna, "free_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");
@@ -903,7 +906,7 @@ static void rna_def_constraint_minmax(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Floor Location", "Location of target that object will not pass through");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "sticky", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_sticky", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MINMAX_STICKY);
RNA_def_property_ui_text(prop, "Sticky", "Immobilize object while constrained");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
@@ -975,14 +978,14 @@ static void rna_def_constraint_action(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "End Frame", "Last frame of the Action to use");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "maximum", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "max");
RNA_def_property_range(prop, -1000.f, 1000.f);
RNA_def_property_ui_text(prop, "Maximum", "Maximum value for target channel range");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
RNA_def_property_float_funcs(prop, NULL, NULL, "rna_ActionConstraint_minmax_range");
- prop= RNA_def_property(srna, "minimum", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "min", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "min");
RNA_def_property_range(prop, -1000.f, 1000.f);
RNA_def_property_ui_text(prop, "Minimum", "Minimum value for target channel range");
@@ -1025,13 +1028,13 @@ static void rna_def_constraint_locked_track(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Sub-Target", "");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
- prop= RNA_def_property(srna, "track", PROP_ENUM, PROP_NONE);
+ 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, locktrack_items);
RNA_def_property_ui_text(prop, "Track Axis", "Axis that points to the target object");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "locked", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "lock_axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "lockflag");
RNA_def_property_enum_items(prop, lock_items);
RNA_def_property_ui_text(prop, "Locked Axis", "Axis that points upward");
@@ -1064,6 +1067,7 @@ static void rna_def_constraint_follow_path(BlenderRNA *brna)
prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "tar");
+ RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_Curve_object_poll");
RNA_def_property_ui_text(prop, "Target", "Target Object");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
@@ -1079,13 +1083,13 @@ static void rna_def_constraint_follow_path(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Offset Factor", "Percentage value defining target position along length of bone");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "forward", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "forward_axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "trackflag");
RNA_def_property_enum_items(prop, forwardpath_items);
RNA_def_property_ui_text(prop, "Forward Axis", "Axis that points forward along the path");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "up", PROP_ENUM, PROP_NONE);
+ 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, pathup_items);
RNA_def_property_ui_text(prop, "Up Axis", "Axis that points upward");
@@ -1096,7 +1100,7 @@ static void rna_def_constraint_follow_path(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Follow Curve", "Object will follow the heading and banking of the curve");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "use_fixed_position", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_fixed_location", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "followflag", FOLLOWPATH_STATIC);
RNA_def_property_ui_text(prop, "Fixed Position", "Object will stay locked to a single point somewhere along the length of the curve regardless of time");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
@@ -1157,7 +1161,7 @@ static void rna_def_constraint_stretch_to(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Keep Axis", "Axis to maintain during stretch");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "original_length", PROP_FLOAT, PROP_DISTANCE);
+ prop= RNA_def_property(srna, "rest_length", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "orglength");
RNA_def_property_range(prop, 0.0, 100.f);
RNA_def_property_ui_text(prop, "Original Length", "Length at rest position");
@@ -1242,12 +1246,12 @@ static void rna_def_constraint_rigid_body_joint(BlenderRNA *brna)
//float minLimit[6];
//float maxLimit[6];
- prop= RNA_def_property(srna, "disable_linked_collision", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_linked_collision", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_DISABLE_LINKED_COLLISION);
RNA_def_property_ui_text(prop, "Disable Linked Collision", "Disable collision between linked bodies");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "draw_pivot", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_pivot", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_DRAW_PIVOT);
RNA_def_property_ui_text(prop, "Draw Pivot", "Display the pivot point and rotation in 3D view");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
@@ -1270,7 +1274,8 @@ static void rna_def_constraint_clamp_to(BlenderRNA *brna)
RNA_def_struct_sdna_from(srna, "bClampToConstraint", "data");
prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
- RNA_def_property_pointer_sdna(prop, NULL, "tar"); // TODO: curve only!
+ RNA_def_property_pointer_sdna(prop, NULL, "tar"); // TODO: curve only for set function!
+ RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_Curve_object_poll");
RNA_def_property_ui_text(prop, "Target", "Target Object");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
@@ -1281,7 +1286,7 @@ static void rna_def_constraint_clamp_to(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Main Axis", "Main axis of movement");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "cyclic", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_cyclic", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag2", CLAMPTO_CYCLIC);
RNA_def_property_ui_text(prop, "Cyclic", "Treat curve as cyclic curve (no clamping to curve bounding box");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
@@ -1349,7 +1354,7 @@ static void rna_def_constraint_transform(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Map To Z From", "The source axis constrained object's Z axis uses");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "extrapolate_motion", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_motion_extrapolate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "expo", CLAMPTO_CYCLIC);
RNA_def_property_ui_text(prop, "Extrapolate Motion", "Extrapolate ranges");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
@@ -1436,73 +1441,73 @@ static void rna_def_constraint_location_limit(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Limit Location Constraint", "Limits the location of the constrained object");
RNA_def_struct_sdna_from(srna, "bLocLimitConstraint", "data");
- prop= RNA_def_property(srna, "use_minimum_x", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_min_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", LIMIT_XMIN);
RNA_def_property_ui_text(prop, "Minimum X", "Use the minimum X value");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "use_minimum_y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_min_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", LIMIT_YMIN);
RNA_def_property_ui_text(prop, "Minimum Y", "Use the minimum Y value");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "use_minimum_z", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_min_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", LIMIT_ZMIN);
RNA_def_property_ui_text(prop, "Minimum Z", "Use the minimum Z value");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "use_maximum_x", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_max_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", LIMIT_XMAX);
RNA_def_property_ui_text(prop, "Maximum X", "Use the maximum X value");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "use_maximum_y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_max_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", LIMIT_YMAX);
RNA_def_property_ui_text(prop, "Maximum Y", "Use the maximum Y value");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "use_maximum_z", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_max_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", LIMIT_ZMAX);
RNA_def_property_ui_text(prop, "Maximum Z", "Use the maximum Z value");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "minimum_x", PROP_FLOAT, PROP_DISTANCE);
+ prop= RNA_def_property(srna, "min_x", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "xmin");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Minimum X", "Lowest X value to allow");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "minimum_y", PROP_FLOAT, PROP_DISTANCE);
+ prop= RNA_def_property(srna, "min_y", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "ymin");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Minimum Y", "Lowest Y value to allow");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "minimum_z", PROP_FLOAT, PROP_DISTANCE);
+ prop= RNA_def_property(srna, "min_z", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "zmin");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Minimum Z", "Lowest Z value to allow");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "maximum_x", PROP_FLOAT, PROP_DISTANCE);
+ prop= RNA_def_property(srna, "max_x", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "xmax");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Maximum X", "Highest X value to allow");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "maximum_y", PROP_FLOAT, PROP_DISTANCE);
+ prop= RNA_def_property(srna, "max_y", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "ymax");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Maximum Y", "Highest Y value to allow");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "maximum_z", PROP_FLOAT, PROP_DISTANCE);
+ prop= RNA_def_property(srna, "max_z", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "zmax");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Maximum Z", "Highest Z value to allow");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "limit_transform", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_transform_limit", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag2", LIMIT_TRANSFORM);
RNA_def_property_ui_text(prop, "For Transform", "Transforms are affected by this constraint as well");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
@@ -1532,43 +1537,43 @@ static void rna_def_constraint_rotation_limit(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Limit Z", "Use the minimum Z value");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "minimum_x", PROP_FLOAT, PROP_ANGLE);
+ prop= RNA_def_property(srna, "min_x", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "xmin");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Minimum X", "Lowest X value to allow");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "minimum_y", PROP_FLOAT, PROP_ANGLE);
+ prop= RNA_def_property(srna, "min_y", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "ymin");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Minimum Y", "Lowest Y value to allow");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "minimum_z", PROP_FLOAT, PROP_ANGLE);
+ prop= RNA_def_property(srna, "min_z", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "zmin");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Minimum Z", "Lowest Z value to allow");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "maximum_x", PROP_FLOAT, PROP_ANGLE);
+ prop= RNA_def_property(srna, "max_x", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "xmax");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Maximum X", "Highest X value to allow");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "maximum_y", PROP_FLOAT, PROP_ANGLE);
+ prop= RNA_def_property(srna, "max_y", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "ymax");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Maximum Y", "Highest Y value to allow");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "maximum_z", PROP_FLOAT, PROP_ANGLE);
+ prop= RNA_def_property(srna, "max_z", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "zmax");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Maximum Z", "Highest Z value to allow");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "limit_transform", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_transform_limit", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag2", LIMIT_TRANSFORM);
RNA_def_property_ui_text(prop, "For Transform", "Transforms are affected by this constraint as well");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
@@ -1583,73 +1588,73 @@ static void rna_def_constraint_size_limit(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Limit Size Constraint", "Limits the scaling of the constrained object");
RNA_def_struct_sdna_from(srna, "bSizeLimitConstraint", "data");
- prop= RNA_def_property(srna, "use_minimum_x", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_min_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", LIMIT_XMIN);
RNA_def_property_ui_text(prop, "Minimum X", "Use the minimum X value");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "use_minimum_y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_min_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", LIMIT_YMIN);
RNA_def_property_ui_text(prop, "Minimum Y", "Use the minimum Y value");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "use_minimum_z", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_min_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", LIMIT_ZMIN);
RNA_def_property_ui_text(prop, "Minimum Z", "Use the minimum Z value");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "use_maximum_x", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_max_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", LIMIT_XMAX);
RNA_def_property_ui_text(prop, "Maximum X", "Use the maximum X value");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "use_maximum_y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_max_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", LIMIT_YMAX);
RNA_def_property_ui_text(prop, "Maximum Y", "Use the maximum Y value");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "use_maximum_z", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_max_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", LIMIT_ZMAX);
RNA_def_property_ui_text(prop, "Maximum Z", "Use the maximum Z value");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "minimum_x", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "min_x", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "xmin");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Minimum X", "Lowest X value to allow");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "minimum_y", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "min_y", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ymin");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Minimum Y", "Lowest Y value to allow");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "minimum_z", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "min_z", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "zmin");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Minimum Z", "Lowest Z value to allow");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "maximum_x", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "max_x", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "xmax");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Maximum X", "Highest X value to allow");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "maximum_y", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "max_y", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ymax");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Maximum Y", "Highest Y value to allow");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "maximum_z", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "max_z", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "zmax");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Maximum Z", "Highest Z value to allow");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "limit_transform", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_transform_limit", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag2", LIMIT_TRANSFORM);
RNA_def_property_ui_text(prop, "For Transform", "Transforms are affected by this constraint as well");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
@@ -1704,7 +1709,8 @@ static void rna_def_constraint_shrinkwrap(BlenderRNA *brna)
RNA_def_struct_sdna_from(srna, "bShrinkwrapConstraint", "data");
prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
- RNA_def_property_pointer_sdna(prop, NULL, "target");
+ RNA_def_property_pointer_sdna(prop, NULL, "target"); /* TODO, mesh type */
+ RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_Mesh_object_poll");
RNA_def_property_ui_text(prop, "Target", "Target Object");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
@@ -1766,7 +1772,7 @@ static void rna_def_constraint_damped_track(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Sub-Target", "");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
- prop= RNA_def_property(srna, "track", PROP_ENUM, PROP_NONE);
+ 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, damptrack_items);
RNA_def_property_ui_text(prop, "Track Axis", "Axis that points to the target object");
@@ -1795,7 +1801,7 @@ static void rna_def_constraint_spline_ik(BlenderRNA *brna)
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, "chain_length", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "chain_count", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "chainlen");
RNA_def_property_range(prop, 1, 255); // TODO: this should really check the max length of the chain the constraint is attached to
RNA_def_property_ui_text(prop, "Chain Length", "How many bones are included in the chain");
@@ -1812,17 +1818,17 @@ static void rna_def_constraint_spline_ik(BlenderRNA *brna)
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
/* settings */
- prop= RNA_def_property(srna, "chain_offset", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_chain_offset", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_SPLINEIK_NO_ROOT);
RNA_def_property_ui_text(prop, "Chain Offset", "Offset the entire chain relative to the root joint");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "even_divisions", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_even_divisions", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_SPLINEIK_EVENSPLITS);
RNA_def_property_ui_text(prop, "Even Divisions", "Ignore the relative lengths of the bones when fitting to the curve");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "y_stretch", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_y_stretch", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CONSTRAINT_SPLINEIK_SCALE_LIMITED);
RNA_def_property_ui_text(prop, "Y Stretch", "Stretch the Y axis of the bones to fit the curve");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
@@ -1832,13 +1838,69 @@ static void rna_def_constraint_spline_ik(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Use Curve Radius", "Average radius of the endpoints is used to tweak the X and Z Scaling of the bones, on top of XZ Scale mode");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "xz_scaling_mode", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "xz_scale_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "xzScaleMode");
RNA_def_property_enum_items(prop, splineik_xz_scale_mode);
RNA_def_property_ui_text(prop, "XZ Scale Mode", "Method used for determining the scaling of the X and Z axes of the bones");
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_location", 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, "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)
{
@@ -1855,7 +1917,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 */
@@ -1878,15 +1940,19 @@ 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, "expanded", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_OFF);
+ RNA_def_property_ui_text(prop, "Enabled", "Enable/Disable Constraint");
+
+ prop= RNA_def_property(srna, "show_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);
+ prop= RNA_def_property(srna, "is_valid", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_DISABLE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CONSTRAINT_DISABLE);
RNA_def_property_ui_text(prop, "Disabled", "Constraint has invalid settings and will not be evaluated");
// TODO: setting this to true must ensure that all others in stack are turned off too...
@@ -1894,7 +1960,7 @@ void RNA_def_constraint(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_ACTIVE);
RNA_def_property_ui_text(prop, "Active", "Constraint is the one being edited ");
- prop= RNA_def_property(srna, "proxy_local", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_proxy_local", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_PROXY_LOCAL);
RNA_def_property_ui_text(prop, "Proxy Local", "Constraint was added in this proxy instance (i.e. did not belong to source Armature)");
@@ -1906,12 +1972,12 @@ void RNA_def_constraint(BlenderRNA *brna)
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_influence_update");
/* readonly values */
- prop= RNA_def_property(srna, "lin_error", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "error_location", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "lin_error");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Lin error", "Amount of residual error in Blender space unit for constraints that work on position");
- prop= RNA_def_property(srna, "rot_error", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "error_rotation", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rot_error");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Rot error", "Amount of residual error in radiant for constraints that work on orientation");
@@ -1943,6 +2009,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 9ee2ca1a322..6cc93d088ad 100644
--- a/source/blender/makesrna/intern/rna_context.c
+++ b/source/blender/makesrna/intern/rna_context.c
@@ -76,13 +76,19 @@ static PointerRNA rna_Context_region_get(PointerRNA *ptr)
return newptr;
}
-/*static PointerRNA rna_Context_region_data_get(PointerRNA *ptr)
+static PointerRNA rna_Context_region_data_get(PointerRNA *ptr)
{
bContext *C= (bContext*)ptr->data;
- PointerRNA newptr;
- RNA_pointer_create((ID*)CTX_wm_screen(C), &RNA_RegionData, CTX_wm_region_data(C), &newptr);
- return newptr;
-}*/
+
+ /* only exists for one space still, no generic system yet */
+ if(CTX_wm_view3d(C)) {
+ PointerRNA newptr;
+ RNA_pointer_create((ID*)CTX_wm_screen(C), &RNA_RegionView3D, CTX_wm_region_data(C), &newptr);
+ return newptr;
+ }
+
+ return PointerRNA_NULL;
+}
static PointerRNA rna_Context_main_get(PointerRNA *ptr)
{
@@ -148,58 +154,58 @@ void RNA_def_context(BlenderRNA *brna)
prop= RNA_def_property(srna, "manager", PROP_POINTER, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "WindowManager");
- RNA_def_property_pointer_funcs(prop, "rna_Context_manager_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Context_manager_get", NULL, NULL, NULL);
prop= RNA_def_property(srna, "window", PROP_POINTER, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "Window");
- RNA_def_property_pointer_funcs(prop, "rna_Context_window_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Context_window_get", NULL, NULL, NULL);
prop= RNA_def_property(srna, "screen", PROP_POINTER, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "Screen");
- RNA_def_property_pointer_funcs(prop, "rna_Context_screen_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Context_screen_get", NULL, NULL, NULL);
prop= RNA_def_property(srna, "area", PROP_POINTER, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "Area");
- RNA_def_property_pointer_funcs(prop, "rna_Context_area_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Context_area_get", NULL, NULL, NULL);
prop= RNA_def_property(srna, "space_data", PROP_POINTER, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "Space");
- RNA_def_property_pointer_funcs(prop, "rna_Context_space_data_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Context_space_data_get", NULL, NULL, NULL);
prop= RNA_def_property(srna, "region", PROP_POINTER, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "Region");
- RNA_def_property_pointer_funcs(prop, "rna_Context_region_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Context_region_get", NULL, NULL, NULL);
- /*prop= RNA_def_property(srna, "region_data", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "region_data", PROP_POINTER, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_struct_type(prop, "RegionData");
- RNA_def_property_pointer_funcs(prop, "rna_Context_region_data_get", NULL, NULL);*/
+ RNA_def_property_struct_type(prop, "RegionView3D");
+ RNA_def_property_pointer_funcs(prop, "rna_Context_region_data_get", NULL, NULL, NULL);
/* Data */
prop= RNA_def_property(srna, "main", PROP_POINTER, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "Main");
- RNA_def_property_pointer_funcs(prop, "rna_Context_main_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Context_main_get", NULL, NULL, NULL);
prop= RNA_def_property(srna, "scene", PROP_POINTER, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "Scene");
- RNA_def_property_pointer_funcs(prop, "rna_Context_scene_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Context_scene_get", NULL, NULL, NULL);
prop= RNA_def_property(srna, "tool_settings", PROP_POINTER, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "ToolSettings");
- RNA_def_property_pointer_funcs(prop, "rna_Context_tool_settings_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Context_tool_settings_get", NULL, NULL, NULL);
prop= RNA_def_property(srna, "user_preferences", PROP_POINTER, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "UserPreferences");
- RNA_def_property_pointer_funcs(prop, "rna_Context_user_preferences_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Context_user_preferences_get", NULL, NULL, NULL);
prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, mode_items);
diff --git a/source/blender/makesrna/intern/rna_controller.c b/source/blender/makesrna/intern/rna_controller.c
index 67c7bd0f2d8..ee0707ad0ae 100644
--- a/source/blender/makesrna/intern/rna_controller.c
+++ b/source/blender/makesrna/intern/rna_controller.c
@@ -24,14 +24,28 @@
#include <stdlib.h>
+#include "WM_types.h"
#include "RNA_define.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;
@@ -58,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<<bit))
+ return bit+1;
+ }
+ return 0;
+}
+
+static void rna_Controller_state_number_set(struct PointerRNA *ptr, const int value)
+{
+ bController *cont= (bController *)ptr->data;
+ if (value < 1 || value > OB_MAX_STATES)
+ return;
+
+ cont->state_mask = (1 << (value - 1));
+}
+
+#if 0 /* editable is set to false, comment for now. */
+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; i<OB_MAX_STATES; i++)
+ values[i] = (cont->state_mask & (1<<i));
+}
+
+static void rna_Controller_state_set(PointerRNA *ptr, const int *values)
+{
+ bController *cont= (bController *)ptr->data;
+ int i, tot= 0;
+
+ /* ensure we always have some state selected */
+ for(i=0; i<OB_MAX_STATES; i++)
+ if(values[i])
+ tot++;
+
+ if(tot==0)
+ return;
+
+ /* only works for one state at once */
+ if(tot>1)
+ return;
+
+ for(i=0; i<OB_MAX_STATES; i++) {
+ if(values[i]) cont->state_mask |= (1<<i);
+ else cont->state_mask &= ~(1<<i);
+ }
+}
+#endif
+
#else
void RNA_def_controller(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
- static EnumPropertyItem controller_type_items[] ={
- {CONT_LOGIC_AND, "LOGIC_AND", 0, "Logic And", ""},
- {CONT_LOGIC_OR, "LOGIC_OR", 0, "Logic Or", ""},
- {CONT_LOGIC_NAND, "LOGIC_NAND", 0, "Logic Nand", ""},
- {CONT_LOGIC_NOR, "LOGIC_NOR", 0, "Logic Nor", ""},
- {CONT_LOGIC_XOR, "LOGIC_XOR", 0, "Logic Xor", ""},
- {CONT_LOGIC_XNOR, "LOGIC_XNOR", 0, "Logic Xnor", ""},
- {CONT_EXPRESSION, "EXPRESSION", 0, "Expression", ""},
- {CONT_PYTHON, "PYTHON", 0, "Python Script", ""},
+
+ static EnumPropertyItem python_controller_modes[] ={
+ {CONT_PY_SCRIPT, "SCRIPT", 0, "Script", ""},
+ {CONT_PY_MODULE, "MODULE", 0, "Module", ""},
{0, NULL, 0, NULL, NULL}};
/* Controller */
@@ -81,15 +156,49 @@ void RNA_def_controller(BlenderRNA *brna)
RNA_def_struct_refine_func(srna, "rna_Controller_refine");
RNA_def_struct_ui_text(srna, "Controller", "Game engine logic brick to process events, connecting sensors to actuators");
+ RNA_api_controller(srna);
+
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_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_funcs(prop, NULL, "rna_Controller_type_set", NULL);
RNA_def_property_enum_items(prop, controller_type_items);
RNA_def_property_ui_text(prop, "Type", "");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", CONT_SHOW);
+ RNA_def_property_ui_text(prop, "Expanded", "Set controller 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, "use_priority", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", CONT_PRIO);
+ RNA_def_property_ui_text(prop, "Priority", "Mark controller for execution before all non-marked controllers (good for startup scripts)");
+ RNA_def_property_ui_icon(prop, ICON_BOOKMARKS, 1);
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ /* State */
+
+ // array of OB_MAX_STATES
+ //prop= RNA_def_property(srna, "states", PROP_BOOLEAN, PROP_LAYER_MEMBER);
+ //RNA_def_property_array(prop, OB_MAX_STATES);
+ //RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ //RNA_def_property_ui_text(prop, "", "Set Controller state index (1 to 30)");
+ //RNA_def_property_boolean_funcs(prop, "rna_Controller_state_get", "rna_Controller_state_set");
+ //RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ // number of the state
+ prop= RNA_def_property(srna, "states", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "state_mask");
+ RNA_def_property_range(prop, 1, OB_MAX_STATES);
+ RNA_def_property_ui_text(prop, "", "Set Controller state index (1 to 30)");
+ RNA_def_property_int_funcs(prop, "rna_Controller_state_number_get", "rna_Controller_state_number_set", NULL);
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
/* Expression Controller */
srna= RNA_def_struct(brna, "ExpressionController", "Controller");
@@ -100,24 +209,32 @@ void RNA_def_controller(BlenderRNA *brna)
RNA_def_property_string_sdna(prop, NULL, "str");
RNA_def_property_string_maxlength(prop, 127);
RNA_def_property_ui_text(prop, "Expression", "");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
/* Python Controller */
srna= RNA_def_struct(brna, "PythonController", "Controller" );
RNA_def_struct_sdna_from(srna, "bPythonCont", "data");
RNA_def_struct_ui_text(srna, "Python Controller", "Controller executing a python script");
+ prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, python_controller_modes);
+ RNA_def_property_ui_text(prop, "Execution Method", "Python script type (textblock or module - faster)");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
prop= RNA_def_property(srna, "text", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Text");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Text", "Text datablock with the python script");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "module", PROP_STRING, PROP_NONE);
RNA_def_property_ui_text(prop, "Module", "Module name and function to run e.g. \"someModule.main\". Internal texts and external python files can be used");
- RNA_def_struct_name_property(srna, prop);
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "debug", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_debug", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CONT_PY_DEBUG);
RNA_def_property_ui_text(prop, "D", "Continuously reload the module from disk for editing external modules without restarting");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
/* Other Controllers */
srna= RNA_def_struct(brna, "AndController", "Controller");
diff --git a/source/blender/makesrna/intern/rna_controller_api.c b/source/blender/makesrna/intern/rna_controller_api.c
new file mode 100644
index 00000000000..dab2ce8c3a1
--- /dev/null
+++ b/source/blender/makesrna/intern/rna_controller_api.c
@@ -0,0 +1,81 @@
+/**
+ * $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 <stdlib.h>
+#include <stdio.h>
+
+#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 c0ad35eb7c3..f5eace91831 100644
--- a/source/blender/makesrna/intern/rna_curve.c
+++ b/source/blender/makesrna/intern/rna_curve.c
@@ -29,6 +29,7 @@
#include "rna_internal.h"
#include "DNA_curve_types.h"
+#include "DNA_key_types.h"
#include "DNA_material_types.h"
#include "DNA_scene_types.h"
@@ -36,6 +37,9 @@
#include "WM_types.h"
+#include "BKE_curve.h"
+#include "ED_curve.h"
+
EnumPropertyItem beztriple_handle_type_items[] = {
{HD_FREE, "FREE", 0, "Free", ""},
{HD_AUTO, "AUTO", 0, "Auto", ""},
@@ -59,6 +63,8 @@ EnumPropertyItem curve_type_items[] = {
#ifdef RNA_RUNTIME
+#include "BLI_math.h"
+
#include "DNA_object_types.h"
#include "BKE_curve.h"
@@ -69,6 +75,8 @@ EnumPropertyItem curve_type_items[] = {
#include "MEM_guardedalloc.h"
+#include "ED_curve.h" /* for BKE_curve_nurbs */
+
static StructRNA *rna_Curve_refine(PointerRNA *ptr)
{
Curve *cu= (Curve*)ptr->data;
@@ -139,6 +147,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;
@@ -157,7 +199,8 @@ static void rna_Curve_active_textbox_index_range(PointerRNA *ptr, int *min, int
static void rna_Curve_dimension_set(PointerRNA *ptr, int value)
{
Curve *cu= (Curve*)ptr->id.data;
- Nurb *nu= cu->editnurb ? cu->editnurb->first : cu->nurb.first;
+ ListBase *nurbs= BKE_curve_nurbs(cu);
+ Nurb *nu= nurbs->first;
if(value==CU_3D) {
cu->flag |= CU_3D;
@@ -179,10 +222,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;
}
@@ -212,7 +255,7 @@ static void rna_Curve_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
static void rna_Curve_update_deps(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
rna_Curve_update_data(bmain, scene, ptr);
}
@@ -243,6 +286,20 @@ static void rna_Curve_bevelObject_set(PointerRNA *ptr, PointerRNA value)
}
}
+static int rna_Curve_otherObject_poll(PointerRNA *ptr, PointerRNA value)
+{
+ Curve *cu= (Curve*)ptr->id.data;
+ Object *ob= (Object*)value.data;
+
+ if (ob) {
+ if (ob->type == OB_CURVE && ob->data != cu) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
static PointerRNA rna_Curve_taperObject_get(PointerRNA *ptr)
{
Curve *cu= (Curve*)ptr->id.data;
@@ -273,11 +330,9 @@ static void rna_Curve_taperObject_set(PointerRNA *ptr, PointerRNA value)
static void rna_Curve_resolution_u_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Curve *cu= (Curve*)ptr->id.data;
- Nurb *nu=NULL;
-
- if (cu->editnurb) nu= cu->editnurb->first;
- else nu=cu->nurb.first;
-
+ ListBase *nurbs= BKE_curve_nurbs(cu);
+ Nurb *nu= nurbs->first;
+
while(nu) {
nu->resolu= cu->resolu;
nu= nu->next;
@@ -289,16 +344,15 @@ static void rna_Curve_resolution_u_update_data(Main *bmain, Scene *scene, Pointe
static void rna_Curve_resolution_v_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Curve *cu= (Curve*)ptr->id.data;
- Nurb *nu=NULL;
-
- if (cu->editnurb) nu= cu->editnurb->first;
- else nu=cu->nurb.first;
-
+ ListBase *nurbs= BKE_curve_nurbs(cu);
+ Nurb *nu=nurbs->first;
+
+
while(nu) {
nu->resolv= cu->resolv;
nu= nu->next;
}
-
+
rna_Curve_update_data(bmain, scene, ptr);
}
@@ -306,13 +360,13 @@ static void rna_Curve_resolution_v_update_data(Main *bmain, Scene *scene, Pointe
void rna_Curve_body_get(PointerRNA *ptr, char *value)
{
Curve *cu= (Curve*)ptr->id.data;
- strcpy(value, cu->str);
+ BLI_strncpy(value, cu->str, cu->len+1);
}
int rna_Curve_body_length(PointerRNA *ptr)
{
Curve *cu= (Curve*)ptr->id.data;
- return strlen(cu->str);
+ return cu->len;
}
/* TODO - check UTF & python play nice */
@@ -321,8 +375,7 @@ void rna_Curve_body_set(PointerRNA *ptr, const char *value)
int len= strlen(value);
Curve *cu= (Curve*)ptr->id.data;
- cu->pos = len;
- cu->len = len;
+ cu->len= cu->pos = len;
if(cu->str) MEM_freeN(cu->str);
if(cu->strinfo) MEM_freeN(cu->strinfo);
@@ -364,7 +417,7 @@ 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, bContext *C, ReportList *reports, int number)
+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");
@@ -378,11 +431,11 @@ static void rna_Curve_spline_points_add(ID *id, Nurb *nu, bContext *C, ReportLis
/* update */
makeknots(nu, 1);
- rna_Curve_update_data_id(CTX_data_main(C), CTX_data_scene(C), id);
+ rna_Curve_update_data_id(NULL, NULL, id);
}
}
-static void rna_Curve_spline_bezpoints_add(ID *id, Nurb *nu, bContext *C, ReportList *reports, int number)
+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");
@@ -395,7 +448,7 @@ static void rna_Curve_spline_bezpoints_add(ID *id, Nurb *nu, bContext *C, Report
/* update */
makeknots(nu, 1);
- rna_Curve_update_data_id(CTX_data_main(C), CTX_data_scene(C), id);
+ rna_Curve_update_data_id(NULL, NULL, id);
}
}
@@ -429,14 +482,10 @@ static Nurb *rna_Curve_spline_new(Curve *cu, int type)
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);
- }
+ ListBase *nurbs= BKE_curve_nurbs(cu);
+
+ found= BLI_remlink_safe(nurbs, nu);
if(!found) {
BKE_reportf(reports, RPT_ERROR, "Curve \"%s\" does not contain spline given", cu->id.name+2);
@@ -451,11 +500,10 @@ static PointerRNA rna_Curve_active_spline_get(PointerRNA *ptr)
{
Curve *cu= (Curve*)ptr->data;
Nurb *nu;
+ ListBase *nurbs= BKE_curve_nurbs(cu);
- 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.
+ // for curve outside editmode will set to -1, should be changed to be allowed outside of editmode.
+ nu= BLI_findlink(nurbs, cu->actnu);
if(nu)
return rna_pointer_inherit_refine(ptr, &RNA_Spline, nu);
@@ -467,14 +515,25 @@ static void rna_Curve_active_spline_set(PointerRNA *ptr, PointerRNA value)
{
Curve *cu= (Curve*)ptr->data;
Nurb *nu= value.data;
+ ListBase *nubase= BKE_curve_nurbs(cu);
/* -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);
+ cu->actnu= BLI_findindex(nubase, nu);
+}
+
+static char *rna_TextBox_path(PointerRNA *ptr)
+{
+ Curve *cu= (Curve*)ptr->id.data;
+ TextBox *tb= ptr->data;
+ int index= (int)(tb - cu->tb);
+
+ if (index >= 0 && index < cu->totbox)
+ return BLI_sprintfN("textboxes[%d]", index);
+ else
+ return BLI_strdup("");
}
#else
@@ -489,14 +548,14 @@ static void rna_def_bpoint(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "SplinePoint", "Spline point without handles");
/* Boolean values */
- prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "f1", 0);
- RNA_def_property_ui_text(prop, "Selected", "Selection status");
+ RNA_def_property_ui_text(prop, "Select", "Selection status");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "hide", 0);
- RNA_def_property_ui_text(prop, "Hidden", "Visibility status");
+ RNA_def_property_ui_text(prop, "Hide", "Visibility status");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
/* Vector value */
@@ -542,41 +601,41 @@ static void rna_def_beztriple(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Bezier Curve Point", "Bezier curve point with two handles");
/* Boolean values */
- prop= RNA_def_property(srna, "selected_handle1", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select_left_handle", 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, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "selected_handle2", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select_right_handle", 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, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "selected_control_point", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select_control_point", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "f2", 0);
RNA_def_property_ui_text(prop, "Control Point selected", "Control point selection status");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "hide", 0);
- RNA_def_property_ui_text(prop, "Hidden", "Visibility status");
+ RNA_def_property_ui_text(prop, "Hide", "Visibility status");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
/* Enums */
- prop= RNA_def_property(srna, "handle1_type", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "handle_left_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "h1");
RNA_def_property_enum_items(prop, beztriple_handle_type_items);
RNA_def_property_ui_text(prop, "Handle 1 Type", "Handle types");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "handle2_type", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "handle_right_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "h2");
RNA_def_property_enum_items(prop, beztriple_handle_type_items);
RNA_def_property_ui_text(prop, "Handle 2 Type", "Handle types");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
/* Vector values */
- prop= RNA_def_property(srna, "handle1", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "handle_left", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
RNA_def_property_float_funcs(prop, "rna_BezTriple_handle1_get", "rna_BezTriple_handle1_set", NULL);
RNA_def_property_ui_text(prop, "Handle 1", "Coordinates of the first handle");
@@ -588,7 +647,7 @@ static void rna_def_beztriple(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Control Point", "Coordinates of the control point");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "handle2", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "handle_right", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
RNA_def_property_float_funcs(prop, "rna_BezTriple_handle2_get", "rna_BezTriple_handle2_set", NULL);
RNA_def_property_ui_text(prop, "Handle 2", "Coordinates of the second handle");
@@ -619,7 +678,7 @@ static void rna_def_path(BlenderRNA *brna, StructRNA *srna)
PropertyRNA *prop;
/* number values */
- prop= RNA_def_property(srna, "path_length", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "path_duration", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "pathlen");
RNA_def_property_range(prop, 1, MAXFRAME);
RNA_def_property_ui_text(prop, "Path Length", "The number of frames that are needed to traverse the path, defining the maximum value for the 'Evaluation Time' setting");
@@ -640,7 +699,12 @@ static void rna_def_path(BlenderRNA *brna, StructRNA *srna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_STRETCH);
RNA_def_property_ui_text(prop, "Stretch", "Option for curve-deform: makes deformed child to stretch along entire path");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
-
+
+ prop= RNA_def_property(srna, "use_deform_bounds", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CU_DEFORM_BOUNDS_OFF);
+ RNA_def_property_ui_text(prop, "Bounds Clamp", "Use the mesh bounds to clamp the deformation");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
prop= RNA_def_property(srna, "use_time_offset", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_OFFS_PATHDIST);
RNA_def_property_ui_text(prop, "Offset Path Distance", "Children will use TimeOffs value as path distance offset");
@@ -657,14 +721,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, "use_map_on_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_update(prop, 0, "rna_Curve_update_data");
-
- prop= RNA_def_property(srna, "vertex_normal_flip", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CU_NOPUNOFLIP);
- RNA_def_property_ui_text(prop, "Vertex Normal Flip", "Flip vertex normals towards the camera during render");
+ 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");
}
@@ -681,32 +740,39 @@ static void rna_def_font(BlenderRNA *brna, StructRNA *srna)
{0, NULL, 0, NULL, NULL}};
/* Enums */
- prop= RNA_def_property(srna, "spacemode", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "align", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "spacemode");
RNA_def_property_enum_items(prop, prop_align_items);
RNA_def_property_ui_text(prop, "Text Align", "Text align from the object center");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
/* number values */
- prop= RNA_def_property(srna, "text_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "fsize");
RNA_def_property_range(prop, 0.0001f, 10000.0f);
- RNA_def_property_ui_range(prop, 0.01, 10, 1, 1);
+ RNA_def_property_ui_range(prop, 0.01, 10, 1, 3);
RNA_def_property_ui_text(prop, "Font size", "");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "line_dist", PROP_FLOAT, PROP_NONE);
+ 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, 1, 2);
+ 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, "space_line", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "linedist");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Distance between lines of text", "");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "word_spacing", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "space_word", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "wordspace");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Spacing between words", "");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "spacing", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "space_character", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "spacing");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Global spacing between characters", "");
@@ -730,19 +796,19 @@ static void rna_def_font(BlenderRNA *brna, StructRNA *srna)
RNA_def_property_ui_text(prop, "Y Offset", "Vertical offset from the object origin");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "ul_position", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "underline_position", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ulpos");
RNA_def_property_range(prop, -0.2f, 0.8f);
RNA_def_property_ui_text(prop, "Underline Position", "Vertical position of underline");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "ul_height", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "underline_height", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ulheight");
RNA_def_property_range(prop, -0.2f, 0.8f);
RNA_def_property_ui_text(prop, "Underline Thickness", "");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "textboxes", PROP_COLLECTION, PROP_NONE);
+ prop= RNA_def_property(srna, "text_boxes", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "tb", "totbox");
RNA_def_property_struct_type(prop, "TextBox");
RNA_def_property_ui_text(prop, "Textboxes", "");
@@ -760,15 +826,20 @@ 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);
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
+ prop= RNA_def_property(srna, "body_format", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "strinfo", "len");
+ RNA_def_property_struct_type(prop, "TextCharacterFormat");
+ RNA_def_property_ui_text(prop, "Character Info", "Stores the style of each character");
/* pointers */
- prop= RNA_def_property(srna, "text_on_curve", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "follow_curve", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "textoncurve");
+ RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_Curve_otherObject_poll");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Text on Curve", "Curve deforming text object");
RNA_def_property_update(prop, 0, "rna_Curve_update_deps");
@@ -785,7 +856,7 @@ static void rna_def_font(BlenderRNA *brna, StructRNA *srna)
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
/* flags */
- prop= RNA_def_property(srna, "fast", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_fast_edit", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_FAST);
RNA_def_property_ui_text(prop, "Fast", "Don't fill polygons while editing");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
@@ -823,6 +894,8 @@ static void rna_def_textbox(BlenderRNA *brna)
RNA_def_property_range(prop, 0.0f, 50.0f);
RNA_def_property_ui_text(prop, "Textbox Height", "");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
+ RNA_def_struct_path_func(srna, "rna_TextBox_path");
}
static void rna_def_charinfo(BlenderRNA *brna)
@@ -835,29 +908,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);
+ prop= RNA_def_property(srna, "use_bold", PROP_BOOLEAN, PROP_NONE);
+ 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);
+ prop= RNA_def_property(srna, "use_italic", PROP_BOOLEAN, PROP_NONE);
+ 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);
+ prop= RNA_def_property(srna, "use_underline", PROP_BOOLEAN, PROP_NONE);
+ 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");
}
@@ -903,7 +977,7 @@ static void rna_def_curve_spline_points(BlenderRNA *brna, PropertyRNA *cprop)
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_CONTEXT|FUNC_USE_SELF_ID|FUNC_USE_REPORTS);
+ 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);
/*
@@ -911,7 +985,7 @@ static void rna_def_curve_spline_points(BlenderRNA *brna, PropertyRNA *cprop)
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);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
*/
}
@@ -930,7 +1004,7 @@ static void rna_def_curve_spline_bezpoints(BlenderRNA *brna, PropertyRNA *cprop)
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_CONTEXT|FUNC_USE_SELF_ID|FUNC_USE_REPORTS);
+ 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);
/*
@@ -938,7 +1012,7 @@ static void rna_def_curve_spline_bezpoints(BlenderRNA *brna, PropertyRNA *cprop)
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);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
*/
}
@@ -967,11 +1041,11 @@ static void rna_def_curve_splines(BlenderRNA *brna, PropertyRNA *cprop)
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);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
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_pointer_funcs(prop, "rna_Curve_active_spline_get", "rna_Curve_active_spline_set", NULL, 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);
@@ -1002,7 +1076,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");
@@ -1014,12 +1087,12 @@ static void rna_def_curve(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Splines", "Collection of splines in this curve data object");
rna_def_curve_splines(brna, prop);
- prop= RNA_def_property(srna, "draw_handles", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_handles", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "drawflag", CU_HIDE_HANDLES);
RNA_def_property_ui_text(prop, "Draw Handles", "Display bezier handles in editmode");
RNA_def_property_update(prop, NC_GEOM|ND_DATA, NULL);
- prop= RNA_def_property(srna, "draw_normals", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_normal_face", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "drawflag", CU_HIDE_NORMALS);
RNA_def_property_ui_text(prop, "Draw Normals", "Display 3D curve normals in editmode");
RNA_def_property_update(prop, NC_GEOM|ND_DATA, NULL);
@@ -1034,22 +1107,22 @@ static void rna_def_curve(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Bevel Resolution", "Bevel resolution when depth is non-zero and no specific bevel object has been defined");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "width", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "width");
- RNA_def_property_ui_range(prop, 0, 2.0, 0.1, 0);
+ RNA_def_property_ui_range(prop, 0, 2.0, 0.1, 3);
RNA_def_property_ui_text(prop, "Width", "Scale the original width (1.0) based on given factor");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "extrude", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ext1");
- RNA_def_property_ui_range(prop, 0, 100.0, 0.1, 0);
+ RNA_def_property_ui_range(prop, 0, 100.0, 0.1, 3);
RNA_def_property_range(prop, 0.0, FLT_MAX);
RNA_def_property_ui_text(prop, "Extrude", "Amount of curve extrusion when not using a bevel object");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "bevel_depth", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ext2");
- RNA_def_property_ui_range(prop, 0, 100.0, 0.1, 0);
+ RNA_def_property_ui_range(prop, 0, 100.0, 0.1, 3);
RNA_def_property_ui_text(prop, "Bevel Depth", "Bevel depth when not using a bevel object");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
@@ -1092,7 +1165,7 @@ static void rna_def_curve(BlenderRNA *brna)
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);
+ RNA_def_property_pointer_funcs(prop, "rna_Curve_bevelObject_get", "rna_Curve_bevelObject_set", NULL, "rna_Curve_otherObject_poll");
prop= RNA_def_property(srna, "taper_object", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Object");
@@ -1100,7 +1173,7 @@ static void rna_def_curve(BlenderRNA *brna)
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);
+ RNA_def_property_pointer_funcs(prop, "rna_Curve_taperObject_get", "rna_Curve_taperObject_set", NULL, "rna_Curve_otherObject_poll");
/* Flags */
@@ -1111,12 +1184,12 @@ static void rna_def_curve(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Dimensions", "Select 2D or 3D curve type");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "front", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_fill_front", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_FRONT);
RNA_def_property_ui_text(prop, "Front", "Draw filled front for extruded/beveled curves");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "back", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_fill_back", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_BACK);
RNA_def_property_ui_text(prop, "Back", "Draw filled back for extruded/beveled curves");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
@@ -1134,19 +1207,56 @@ 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);
+ prop= RNA_def_property(srna, "use_fill_deform", 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, "use_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_location", 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, "use_map_on_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 spline_interpolation_items[] = {
- {BEZT_IPO_CONST, "LINEAR", 0, "Linear", ""},
- {BEZT_IPO_LIN, "CARDINAL", 0, "Cardinal", ""},
- {BEZT_IPO_BEZ, "BSPLINE", 0, "BSpline", ""},
- {BEZT_IPO_BEZ, "EASE", 0, "Ease", ""},
+ {KEY_LINEAR, "LINEAR", 0, "Linear", ""},
+ {KEY_CARDINAL, "CARDINAL", 0, "Cardinal", ""},
+ {KEY_BSPLINE, "BSPLINE", 0, "BSpline", ""},
+ {KEY_CU_EASE, "EASE", 0, "Ease", ""}, /* todo, define somewhere, not one of BEZT_IPO_* */
{0, NULL, 0, NULL, NULL}};
StructRNA *srna;
@@ -1189,13 +1299,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");
@@ -1229,40 +1339,40 @@ static void rna_def_curve_nurb(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Resolution V", "Surface subdivisions per segment");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "cyclic_u", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_cyclic_u", PROP_BOOLEAN, PROP_NONE);
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);
+ prop= RNA_def_property(srna, "use_cyclic_v", PROP_BOOLEAN, PROP_NONE);
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);
+ prop= RNA_def_property(srna, "use_endpoint_u", PROP_BOOLEAN, PROP_NONE);
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);
+ prop= RNA_def_property(srna, "use_endpoint_v", PROP_BOOLEAN, PROP_NONE);
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);
+ prop= RNA_def_property(srna, "use_bezier_u", PROP_BOOLEAN, PROP_NONE);
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);
+ prop= RNA_def_property(srna, "use_bezier_v", PROP_BOOLEAN, PROP_NONE);
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");
- prop= RNA_def_property(srna, "smooth", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_smooth", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_SMOOTH);
RNA_def_property_ui_text(prop, "Smooth", "Smooth the normals of the surface or beveled curve");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
diff --git a/source/blender/makesrna/intern/rna_define.c b/source/blender/makesrna/intern/rna_define.c
index d0a8763baa7..0ac77382c04 100644
--- a/source/blender/makesrna/intern/rna_define.c
+++ b/source/blender/makesrna/intern/rna_define.c
@@ -476,7 +476,7 @@ void RNA_struct_free(BlenderRNA *brna, StructRNA *srna)
if(srna->flag & STRUCT_RUNTIME) {
if(RNA_struct_py_type_get(srna)) {
- fprintf(stderr, "StructRNA \"%s\" freed while holding a python reference\n", srna->name);
+ fprintf(stderr, "RNA_struct_free '%s' freed while holding a python reference\n", srna->identifier);
}
}
@@ -670,7 +670,7 @@ StructRNA *RNA_def_struct(BlenderRNA *brna, const char *identifier, const char *
if(DefRNA.preprocess) {
RNA_def_property_struct_type(prop, "Struct");
- RNA_def_property_pointer_funcs(prop, "rna_builtin_type_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_builtin_type_get", NULL, NULL, NULL);
}
else {
#ifdef RNA_RUNTIME
@@ -737,7 +737,7 @@ void RNA_def_struct_sdna_from(StructRNA *srna, const char *structname, const cha
void RNA_def_struct_name_property(struct StructRNA *srna, struct PropertyRNA *prop)
{
if(prop->type != PROP_STRING) {
- fprintf(stderr, "RNA_def_struct_name_property: %s.%s, must be a string property.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_struct_name_property: \"%s.%s\", must be a string property.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
}
else
@@ -781,10 +781,10 @@ void RNA_def_struct_refine_func(StructRNA *srna, const char *refine)
if(refine) srna->refine= (StructRefineFunc)refine;
}
-void RNA_def_struct_idproperties_func(StructRNA *srna, const char *idproperties)
+void RNA_def_struct_idprops_func(StructRNA *srna, const char *idproperties)
{
if(!DefRNA.preprocess) {
- fprintf(stderr, "RNA_def_struct_idproperties_func: only during preprocessing.\n");
+ fprintf(stderr, "RNA_def_struct_idprops_func: only during preprocessing.\n");
return;
}
@@ -847,7 +847,7 @@ PropertyRNA *RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier
char error[512];
if (rna_validate_identifier(identifier, error, 1) == 0) {
- fprintf(stderr, "RNA_def_property: property identifier \"%s\" - %s\n", identifier, error);
+ fprintf(stderr, "RNA_def_property: property identifier \"%s.%s\" - %s\n", srna->identifier, identifier, error);
DefRNA.error= 1;
}
@@ -855,7 +855,7 @@ PropertyRNA *RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier
/* XXX - toto, detect supertype collisions */
if(rna_findlink(&dcont->properties, identifier)) {
- fprintf(stderr, "RNA_def_property: duplicate identifier \"%s\"\n", identifier);
+ fprintf(stderr, "RNA_def_property: duplicate identifier \"%s.%s\"\n", srna->identifier, identifier);
DefRNA.error= 1;
}
@@ -913,7 +913,7 @@ PropertyRNA *RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier
case PROP_COLLECTION:
break;
default:
- fprintf(stderr, "RNA_def_property: %s.%s, invalid property type.\n", srna->identifier, identifier);
+ fprintf(stderr, "RNA_def_property: \"%s.%s\", invalid property type.\n", srna->identifier, identifier);
DefRNA.error= 1;
return NULL;
}
@@ -1009,13 +1009,13 @@ void RNA_def_property_array(PropertyRNA *prop, int length)
StructRNA *srna= DefRNA.laststruct;
if(length<0) {
- fprintf(stderr, "RNA_def_property_array: %s.%s, array length must be zero of greater.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_array: \"%s.%s\", array length must be zero of greater.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
return;
}
if(length>RNA_MAX_ARRAY_LENGTH) {
- fprintf(stderr, "RNA_def_property_array: %s.%s, array length must be smaller than %d.\n", srna->identifier, prop->identifier, RNA_MAX_ARRAY_LENGTH);
+ fprintf(stderr, "RNA_def_property_array: \"%s.%s\", array length must be smaller than %d.\n", srna->identifier, prop->identifier, RNA_MAX_ARRAY_LENGTH);
DefRNA.error= 1;
return;
}
@@ -1029,7 +1029,7 @@ void RNA_def_property_array(PropertyRNA *prop, int length)
prop->arraydimension= 1;
break;
default:
- fprintf(stderr, "RNA_def_property_array: %s.%s, only boolean/int/float can be array.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_array: \"%s.%s\", only boolean/int/float can be array.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1041,7 +1041,7 @@ void RNA_def_property_multi_array(PropertyRNA *prop, int dimension, int length[]
int i;
if (dimension < 1 || dimension > RNA_MAX_ARRAY_DIMENSION) {
- fprintf(stderr, "RNA_def_property_multi_array: %s.%s, array dimension must be between 1 and %d.\n", srna->identifier, prop->identifier, RNA_MAX_ARRAY_DIMENSION);
+ fprintf(stderr, "RNA_def_property_multi_array: \"%s.%s\", array dimension must be between 1 and %d.\n", srna->identifier, prop->identifier, RNA_MAX_ARRAY_DIMENSION);
DefRNA.error= 1;
return;
}
@@ -1052,7 +1052,7 @@ void RNA_def_property_multi_array(PropertyRNA *prop, int dimension, int length[]
case PROP_FLOAT:
break;
default:
- fprintf(stderr, "RNA_def_property_multi_array: %s.%s, only boolean/int/float can be array.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_multi_array: \"%s.%s\", only boolean/int/float can be array.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1107,7 +1107,7 @@ void RNA_def_property_ui_range(PropertyRNA *prop, double min, double max, double
break;
}
default:
- fprintf(stderr, "RNA_def_property_ui_range: %s.%s, invalid type for ui range.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_ui_range: \"%s.%s\", invalid type for ui range.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1135,7 +1135,7 @@ void RNA_def_property_range(PropertyRNA *prop, double min, double max)
break;
}
default:
- fprintf(stderr, "RNA_def_property_range: %s.%s, invalid type for range.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_range: \"%s.%s\", invalid type for range.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1146,7 +1146,7 @@ void RNA_def_property_struct_type(PropertyRNA *prop, const char *type)
StructRNA *srna= DefRNA.laststruct;
if(!DefRNA.preprocess) {
- fprintf(stderr, "RNA_def_property_struct_type %s.%s: only during preprocessing.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_struct_type \"%s.%s\": only during preprocessing.\n", srna->identifier, prop->identifier);
return;
}
@@ -1162,7 +1162,7 @@ void RNA_def_property_struct_type(PropertyRNA *prop, const char *type)
break;
}
default:
- fprintf(stderr, "RNA_def_property_struct_type: %s.%s, invalid type for struct type.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_struct_type: \"%s.%s\", invalid type for struct type.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1193,7 +1193,7 @@ void RNA_def_property_struct_runtime(PropertyRNA *prop, StructRNA *type)
break;
}
default:
- fprintf(stderr, "RNA_def_property_struct_runtime: %s.%s, invalid type for struct type.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_struct_runtime: \"%s.%s\", invalid type for struct type.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1228,7 +1228,7 @@ void RNA_def_property_enum_items(PropertyRNA *prop, const EnumPropertyItem *item
break;
}
default:
- fprintf(stderr, "RNA_def_property_enum_items: %s.%s, invalid type for struct type.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_enum_items: \"%s.%s\", invalid type for struct type.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1245,7 +1245,7 @@ void RNA_def_property_string_maxlength(PropertyRNA *prop, int maxlength)
break;
}
default:
- fprintf(stderr, "RNA_def_property_string_maxlength: %s.%s, type is not string.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_string_maxlength: \"%s.%s\", type is not string.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1262,7 +1262,7 @@ void RNA_def_property_boolean_default(PropertyRNA *prop, int value)
break;
}
default:
- fprintf(stderr, "RNA_def_property_boolean_default: %s.%s, type is not boolean.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_boolean_default: \"%s.%s\", type is not boolean.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1279,7 +1279,7 @@ void RNA_def_property_boolean_array_default(PropertyRNA *prop, const int *array)
break;
}
default:
- fprintf(stderr, "RNA_def_property_boolean_default: %s.%s, type is not boolean.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_boolean_default: \"%s.%s\", type is not boolean.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1296,7 +1296,7 @@ void RNA_def_property_int_default(PropertyRNA *prop, int value)
break;
}
default:
- fprintf(stderr, "RNA_def_property_int_default: %s.%s, type is not int.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_int_default: \"%s.%s\", type is not int.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1313,7 +1313,7 @@ void RNA_def_property_int_array_default(PropertyRNA *prop, const int *array)
break;
}
default:
- fprintf(stderr, "RNA_def_property_int_default: %s.%s, type is not int.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_int_default: \"%s.%s\", type is not int.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1330,7 +1330,7 @@ void RNA_def_property_float_default(PropertyRNA *prop, float value)
break;
}
default:
- fprintf(stderr, "RNA_def_property_float_default: %s.%s, type is not float.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_float_default: \"%s.%s\", type is not float.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1347,7 +1347,7 @@ void RNA_def_property_float_array_default(PropertyRNA *prop, const float *array)
break;
}
default:
- fprintf(stderr, "RNA_def_property_float_default: %s.%s, type is not float.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_float_default: \"%s.%s\", type is not float.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1364,7 +1364,7 @@ void RNA_def_property_string_default(PropertyRNA *prop, const char *value)
break;
}
default:
- fprintf(stderr, "RNA_def_property_string_default: %s.%s, type is not string.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_string_default: \"%s.%s\", type is not string.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1390,7 +1390,7 @@ void RNA_def_property_enum_default(PropertyRNA *prop, int value)
eprop->defaultvalue= eprop->item[0].value;
}
else {
- fprintf(stderr, "RNA_def_property_enum_default: %s.%s, default is not in items.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_enum_default: \"%s.%s\", default is not in items.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
}
}
@@ -1398,7 +1398,7 @@ void RNA_def_property_enum_default(PropertyRNA *prop, int value)
break;
}
default:
- fprintf(stderr, "RNA_def_property_enum_default: %s.%s, type is not enum.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_enum_default: \"%s.%s\", type is not enum.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1437,7 +1437,7 @@ static PropertyDefRNA *rna_def_property_sdna(PropertyRNA *prop, const char *stru
return dp;
}
else {
- fprintf(stderr, "rna_def_property_sdna: %s.%s not found.\n", structname, propname);
+ fprintf(stderr, "rna_def_property_sdna: \"%s.%s\" not found.\n", structname, propname);
DefRNA.error= 1;
return NULL;
}
@@ -1475,7 +1475,7 @@ void RNA_def_property_boolean_sdna(PropertyRNA *prop, const char *structname, co
}
if(prop->type != PROP_BOOLEAN) {
- fprintf(stderr, "RNA_def_property_boolean_sdna: %s.%s, type is not boolean.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_boolean_sdna: \"%s.%s\", type is not boolean.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
return;
}
@@ -1508,7 +1508,7 @@ void RNA_def_property_int_sdna(PropertyRNA *prop, const char *structname, const
}
if(prop->type != PROP_INT) {
- fprintf(stderr, "RNA_def_property_int_sdna: %s.%s, type is not int.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_int_sdna: \"%s.%s\", type is not int.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
return;
}
@@ -1546,7 +1546,7 @@ void RNA_def_property_float_sdna(PropertyRNA *prop, const char *structname, cons
}
if(prop->type != PROP_FLOAT) {
- fprintf(stderr, "RNA_def_property_float_sdna: %s.%s, type is not float.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_float_sdna: \"%s.%s\", type is not float.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
return;
}
@@ -1565,7 +1565,7 @@ void RNA_def_property_enum_sdna(PropertyRNA *prop, const char *structname, const
}
if(prop->type != PROP_ENUM) {
- fprintf(stderr, "RNA_def_property_enum_sdna: %s.%s, type is not enum.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_enum_sdna: \"%s.%s\", type is not enum.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
return;
}
@@ -1576,7 +1576,7 @@ void RNA_def_property_enum_sdna(PropertyRNA *prop, const char *structname, const
prop->totarraylength= 0;
if(!DefRNA.silent) {
- fprintf(stderr, "RNA_def_property_enum_sdna: %s.%s, array not supported for enum type.\n", structname, propname);
+ fprintf(stderr, "RNA_def_property_enum_sdna: \"%s.%s\", array not supported for enum type.\n", structname, propname);
DefRNA.error= 1;
}
}
@@ -1607,7 +1607,7 @@ void RNA_def_property_string_sdna(PropertyRNA *prop, const char *structname, con
}
if(prop->type != PROP_STRING) {
- fprintf(stderr, "RNA_def_property_string_sdna: %s.%s, type is not string.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_string_sdna: \"%s.%s\", type is not string.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
return;
}
@@ -1632,7 +1632,7 @@ void RNA_def_property_pointer_sdna(PropertyRNA *prop, const char *structname, co
}
if(prop->type != PROP_POINTER) {
- fprintf(stderr, "RNA_def_property_pointer_sdna: %s.%s, type is not pointer.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_pointer_sdna: \"%s.%s\", type is not pointer.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
return;
}
@@ -1643,7 +1643,7 @@ void RNA_def_property_pointer_sdna(PropertyRNA *prop, const char *structname, co
prop->totarraylength= 0;
if(!DefRNA.silent) {
- fprintf(stderr, "RNA_def_property_pointer_sdna: %s.%s, array not supported for pointer type.\n", structname, propname);
+ fprintf(stderr, "RNA_def_property_pointer_sdna: \"%s.%s\", array not supported for pointer type.\n", structname, propname);
DefRNA.error= 1;
}
}
@@ -1662,7 +1662,7 @@ void RNA_def_property_collection_sdna(PropertyRNA *prop, const char *structname,
}
if(prop->type != PROP_COLLECTION) {
- fprintf(stderr, "RNA_def_property_collection_sdna: %s.%s, type is not collection.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_collection_sdna: \"%s.%s\", type is not collection.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
return;
}
@@ -1673,7 +1673,7 @@ void RNA_def_property_collection_sdna(PropertyRNA *prop, const char *structname,
prop->totarraylength= 0;
if(!DefRNA.silent) {
- fprintf(stderr, "RNA_def_property_collection_sdna: %s.%s, array of collections not supported.\n", structname, propname);
+ fprintf(stderr, "RNA_def_property_collection_sdna: \"%s.%s\", array of collections not supported.\n", structname, propname);
DefRNA.error= 1;
}
}
@@ -1714,7 +1714,7 @@ void RNA_def_property_collection_sdna(PropertyRNA *prop, const char *structname,
}
else {
if(!DefRNA.silent) {
- fprintf(stderr, "RNA_def_property_collection_sdna: %s.%s not found.\n", structname, lengthpropname);
+ fprintf(stderr, "RNA_def_property_collection_sdna: \"%s.%s\" not found.\n", structname, lengthpropname);
DefRNA.error= 1;
}
}
@@ -1794,7 +1794,7 @@ void RNA_def_property_boolean_funcs(PropertyRNA *prop, const char *get, const ch
break;
}
default:
- fprintf(stderr, "RNA_def_property_boolean_funcs: %s.%s, type is not boolean.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_boolean_funcs: \"%s.%s\", type is not boolean.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1825,7 +1825,7 @@ void RNA_def_property_int_funcs(PropertyRNA *prop, const char *get, const char *
break;
}
default:
- fprintf(stderr, "RNA_def_property_int_funcs: %s.%s, type is not int.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_int_funcs: \"%s.%s\", type is not int.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1856,7 +1856,7 @@ void RNA_def_property_float_funcs(PropertyRNA *prop, const char *get, const char
break;
}
default:
- fprintf(stderr, "RNA_def_property_float_funcs: %s.%s, type is not float.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_float_funcs: \"%s.%s\", type is not float.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1881,7 +1881,7 @@ void RNA_def_property_enum_funcs(PropertyRNA *prop, const char *get, const char
break;
}
default:
- fprintf(stderr, "RNA_def_property_enum_funcs: %s.%s, type is not enum.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_enum_funcs: \"%s.%s\", type is not enum.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1906,13 +1906,13 @@ void RNA_def_property_string_funcs(PropertyRNA *prop, const char *get, const cha
break;
}
default:
- fprintf(stderr, "RNA_def_property_string_funcs: %s.%s, type is not string.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_string_funcs: \"%s.%s\", type is not string.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
}
-void RNA_def_property_pointer_funcs(PropertyRNA *prop, const char *get, const char *set, const char *typef)
+void RNA_def_property_pointer_funcs(PropertyRNA *prop, const char *get, const char *set, const char *typef, const char *poll)
{
StructRNA *srna= DefRNA.laststruct;
@@ -1928,10 +1928,11 @@ void RNA_def_property_pointer_funcs(PropertyRNA *prop, const char *get, const ch
if(get) pprop->get= (PropPointerGetFunc)get;
if(set) pprop->set= (PropPointerSetFunc)set;
if(typef) pprop->typef= (PropPointerTypeFunc)typef;
+ if(poll) pprop->poll= (PropPointerPollFunc)poll;
break;
}
default:
- fprintf(stderr, "RNA_def_property_pointer_funcs: %s.%s, type is not pointer.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_pointer_funcs: \"%s.%s\", type is not pointer.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -1960,7 +1961,7 @@ void RNA_def_property_collection_funcs(PropertyRNA *prop, const char *begin, con
break;
}
default:
- fprintf(stderr, "RNA_def_property_collection_funcs: %s.%s, type is not collection.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "RNA_def_property_collection_funcs: \"%s.%s\", type is not collection.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
break;
}
@@ -2200,6 +2201,17 @@ PropertyRNA *RNA_def_float_vector(StructOrFunctionRNA *cont_, const char *identi
return prop;
}
+PropertyRNA *RNA_def_float_vector_xyz(StructOrFunctionRNA *cont_, const char *identifier, int len, const float *default_value,
+ float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax)
+{
+ PropertyRNA *prop;
+
+ prop= RNA_def_float_vector(cont_, identifier, len, default_value, hardmin, hardmax, ui_name, ui_description, softmin, softmax);
+ prop->subtype = PROP_XYZ;
+
+ return prop;
+}
+
PropertyRNA *RNA_def_float_color(StructOrFunctionRNA *cont_, const char *identifier, int len, const float *default_value,
float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax)
{
@@ -2422,11 +2434,11 @@ FunctionRNA *RNA_def_function_runtime(StructRNA *srna, const char *identifier, C
void RNA_def_function_return(FunctionRNA *func, PropertyRNA *ret)
{
if (ret->flag & PROP_DYNAMIC) {
- fprintf(stderr, "RNA_def_function_return: %s.%s, dynamic values are not allowed as strict returns, use RNA_def_function_output instead.\n", func->identifier, ret->identifier);
+ fprintf(stderr, "RNA_def_function_return: \"%s.%s\", dynamic values are not allowed as strict returns, use RNA_def_function_output instead.\n", func->identifier, ret->identifier);
return;
}
else if (ret->arraydimension) {
- fprintf(stderr, "RNA_def_function_return: %s.%s, arrays are not allowed as strict returns, use RNA_def_function_output instead.\n", func->identifier, ret->identifier);
+ fprintf(stderr, "RNA_def_function_return: \"%s.%s\", arrays are not allowed as strict returns, use RNA_def_function_output instead.\n", func->identifier, ret->identifier);
return;
}
@@ -2722,5 +2734,41 @@ void RNA_def_property_free_pointers(PropertyRNA *prop)
}
}
}
+
+void RNA_def_property_free(StructOrFunctionRNA *cont_, PropertyRNA *prop)
+{
+ ContainerRNA *cont= cont_;
+
+ if(prop->flag & PROP_RUNTIME) {
+ if(cont->prophash)
+ BLI_ghash_remove(cont->prophash, (void*)prop->identifier, NULL, NULL);
+
+ RNA_def_property_free_pointers(prop);
+ rna_freelinkN(&cont->properties, prop);
+ }
+ else {
+ RNA_def_property_free_pointers(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 7f85f0f5e2d..a55c3f10095 100644
--- a/source/blender/makesrna/intern/rna_fcurve.c
+++ b/source/blender/makesrna/intern/rna_fcurve.c
@@ -110,7 +110,7 @@ static void rna_ChannelDriver_update_data(Main *bmain, Scene *scene, PointerRNA
driver->flag &= ~DRIVER_FLAG_INVALID;
// TODO: this really needs an update guard...
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
DAG_id_flush_update(id, OB_RECALC_OB|OB_RECALC_DATA);
WM_main_add_notifier(NC_SCENE|ND_FRAME, scene);
@@ -155,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;
@@ -337,6 +344,7 @@ static void rna_FCurve_group_set(PointerRNA *ptr, PointerRNA value)
/* already belongs to group? */
if (fcu->grp == value.data) {
/* nothing to do */
+ printf("ERROR: F-Curve already belongs to the group\n");
return;
}
@@ -345,6 +353,7 @@ static void rna_FCurve_group_set(PointerRNA *ptr, PointerRNA value)
*/
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;
}
@@ -376,9 +385,13 @@ DriverVar *rna_Driver_new_variable(ChannelDriver *driver)
return driver_add_new_variable(driver);
}
-void rna_Driver_remove_variable(ChannelDriver *driver, DriverVar *dvar)
+void rna_Driver_remove_variable(ChannelDriver *driver, ReportList *reports, DriverVar *dvar)
{
- /* call the API function for this */
+ if(BLI_findindex(&driver->variables, dvar) == -1) {
+ BKE_report(reports, RPT_ERROR, "Variable does not exist in this driver.");
+ return;
+ }
+
driver_free_variable(driver, dvar);
}
@@ -396,14 +409,18 @@ 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 void rna_FCurve_modifiers_remove(FCurve *fcu, ReportList *reports, FModifier *fcm)
{
- return remove_fmodifier_index(&fcu->modifiers, index);
+ if(BLI_findindex(&fcu->modifiers, fcm) == -1) {
+ BKE_reportf(reports, RPT_ERROR, "FCurveModifier '%s' not found in fcurve.", fcm->name);
+ return;
+ }
+ remove_fmodifier(&fcu->modifiers, fcm);
}
static void rna_FModifier_active_set(PointerRNA *ptr, int value)
@@ -537,6 +554,11 @@ static void rna_FKeyframe_points_remove(FCurve *fcu, ReportList *reports, BezTri
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)
@@ -554,23 +576,23 @@ static void rna_def_fmodifier_generator(BlenderRNA *brna)
RNA_def_struct_sdna_from(srna, "FMod_Generator", "data");
/* define common props */
- prop= RNA_def_property(srna, "additive", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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);
@@ -604,31 +626,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);
+ prop= RNA_def_property(srna, "use_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);
}
/* --------- */
@@ -646,21 +668,21 @@ static void rna_def_fmodifier_envelope_ctrl(BlenderRNA *brna)
* - for now, these are allowed to go past each other, so that we can have inverted action
* - technically, the range is limited by the settings in the envelope-modifier data, not here...
*/
- prop= RNA_def_property(srna, "minimum", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "min", 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);
+ prop= RNA_def_property(srna, "max", 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)
@@ -685,17 +707,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);
+ prop= RNA_def_property(srna, "default_min", 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);
+ prop= RNA_def_property(srna, "default_max", 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);
}
/* --------- */
@@ -717,24 +739,28 @@ static void rna_def_fmodifier_cycles(BlenderRNA *brna)
RNA_def_struct_sdna_from(srna, "FMod_Cycles", "data");
/* before */
- prop= RNA_def_property(srna, "before_mode", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "mode_before", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "before_mode");
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);
+ prop= RNA_def_property(srna, "cycles_before", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "before_cycles");
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);
+ prop= RNA_def_property(srna, "mode_after", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "after_mode");
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);
+ prop= RNA_def_property(srna, "cycles_after", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "after_cycles");
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);
}
/* --------- */
@@ -760,49 +786,49 @@ static void rna_def_fmodifier_limits(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Limits F-Modifier", "Limits the time/value ranges of the modified F-Curve");
RNA_def_struct_sdna_from(srna, "FMod_Limits", "data");
- prop= RNA_def_property(srna, "use_minimum_x", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_min_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);
+ prop= RNA_def_property(srna, "use_min_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);
+ prop= RNA_def_property(srna, "use_max_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);
+ prop= RNA_def_property(srna, "use_max_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);
+ prop= RNA_def_property(srna, "min_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);
+ prop= RNA_def_property(srna, "min_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);
+ prop= RNA_def_property(srna, "max_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);
+ prop= RNA_def_property(srna, "max_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);
}
/* --------- */
@@ -823,30 +849,31 @@ static void rna_def_fmodifier_noise(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Noise F-Modifier", "Gives randomness to the modified F-Curve");
RNA_def_struct_sdna_from(srna, "FMod_Noise", "data");
- prop= RNA_def_property(srna, "modification", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "blend_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "modification");
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_ui_text(prop, "Blend Type", "Method of modifying the existing F-Curve");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
- prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "scale", 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_ui_text(prop, "Scale", "Scaling (in time) of the noise");
+ 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);
}
@@ -862,36 +889,37 @@ static void rna_def_fmodifier_stepped(BlenderRNA *brna)
RNA_def_struct_sdna_from(srna, "FMod_Stepped", "data");
/* properties */
- prop= RNA_def_property(srna, "step_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "frame_step", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "step_size");
RNA_def_property_ui_text(prop, "Step Size", "Number of frames to hold each 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, "offset", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "frame_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_EDIT, NULL);
+ 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_EDIT, NULL);
+ 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_EDIT, NULL);
+ 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_EDIT, NULL);
+ 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_EDIT, NULL);
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
}
/* --------- */
@@ -921,20 +949,20 @@ static void rna_def_fmodifier(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Type", "F-Curve Modifier Type");
/* settings */
- prop= RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", FMODIFIER_FLAG_EXPANDED);
RNA_def_property_ui_text(prop, "Expanded", "F-Curve Modifier's panel is expanded in UI");
RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1);
- prop= RNA_def_property(srna, "muted", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", FMODIFIER_FLAG_MUTED);
RNA_def_property_ui_text(prop, "Muted", "F-Curve Modifier will not be evaluated");
RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_PROP, NULL);
RNA_def_property_ui_icon(prop, ICON_MUTE_IPO_OFF, 1);
- prop= RNA_def_property(srna, "disabled", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_valid", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", FMODIFIER_FLAG_DISABLED);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", FMODIFIER_FLAG_DISABLED);
RNA_def_property_ui_text(prop, "Disabled", "F-Curve Modifier has invalid settings and will not be evaluated");
RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_PROP, NULL);
@@ -974,7 +1002,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", NULL);
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");
@@ -1004,7 +1033,7 @@ static void rna_def_drivertarget(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Type", "Driver variable type");
RNA_def_property_update(prop, 0, "rna_DriverTarget_update_data");
- prop= RNA_def_property(srna, "use_local_space_transforms", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_local_space_transform", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", DTAR_FLAG_LOCALSPACE);
RNA_def_property_ui_text(prop, "Local Space", "Use transforms in Local Space (as opposed to the worldspace default)");
RNA_def_property_update(prop, 0, "rna_DriverTarget_update_data");
@@ -1073,10 +1102,11 @@ static void rna_def_channeldriver_variables(BlenderRNA *brna, PropertyRNA *cprop
/* remove variable */
func= RNA_def_function(srna, "remove", "rna_Driver_remove_variable");
- RNA_def_function_ui_description(func, "Remove an existing variable from the driver.");
- /* target to remove */
- parm= RNA_def_pointer(func, "var", "DriverVariable", "", "Variable to remove from the driver.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_function_ui_description(func, "Remove an existing variable from the driver.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ /* target to remove */
+ parm= RNA_def_pointer(func, "variable", "DriverVariable", "", "Variable to remove from the driver.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
static void rna_def_channeldriver(BlenderRNA *brna)
@@ -1120,8 +1150,8 @@ static void rna_def_channeldriver(BlenderRNA *brna)
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);
+ prop= RNA_def_property(srna, "is_valid", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_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");
@@ -1141,17 +1171,17 @@ static void rna_def_fpoint(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "F-Curve Sample", "Sample point for F-Curve");
/* Boolean values */
- prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select", 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_ui_text(prop, "Select", "Selection status");
+ 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);
}
@@ -1168,29 +1198,29 @@ static void rna_def_fkeyframe(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Keyframe", "Bezier curve point with two handles defining a Keyframe on an F-Curve");
/* Boolean values */
- prop= RNA_def_property(srna, "selected_handle1", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select_left_handle", 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);
+ prop= RNA_def_property(srna, "select_right_handle", 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);
+ prop= RNA_def_property(srna, "select_control_point", 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_ui_text(prop, "Select", "Control point selection status");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL);
/* Enums */
- prop= RNA_def_property(srna, "handle1_type", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "handle_left_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "h1");
RNA_def_property_enum_items(prop, beztriple_handle_type_items);
RNA_def_property_ui_text(prop, "Handle 1 Type", "Handle types");
RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_PROP, NULL);
- prop= RNA_def_property(srna, "handle2_type", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "handle_right_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "h2");
RNA_def_property_enum_items(prop, beztriple_handle_type_items);
RNA_def_property_ui_text(prop, "Handle 2 Type", "Handle types");
@@ -1209,23 +1239,23 @@ static void rna_def_fkeyframe(BlenderRNA *brna)
RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_PROP, NULL);
/* Vector values */
- prop= RNA_def_property(srna, "handle1", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "handle_left", PROP_FLOAT, PROP_TRANSLATION);
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);
+ prop= RNA_def_property(srna, "handle_right", 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)
@@ -1246,13 +1276,12 @@ static void rna_def_fcurve_modifiers(BlenderRNA *brna, PropertyRNA *cprop)
/* Collection active property */
prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "FModifier");
- RNA_def_property_pointer_funcs(prop, "rna_FCurve_active_modifier_get", "rna_FCurve_active_modifier_set", NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_FCurve_active_modifier_get", "rna_FCurve_active_modifier_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Active F-Curve Modifier", "Active F-Curve Modifier");
/* 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.");
@@ -1262,14 +1291,11 @@ 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_flag(func, FUNC_USE_REPORTS);
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.");
- RNA_def_function_return(func, parm);
- /* object to add */
- parm= RNA_def_int(func, "index", 0, 0, INT_MAX, "Index", "", 0, INT_MAX);
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ /* modifier to remove */
+ parm= RNA_def_pointer(func, "modifier", "FModifier", "", "Removed modifier.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
/* fcurve.keyframe_points */
@@ -1313,7 +1339,9 @@ 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", ""},
@@ -1344,7 +1372,7 @@ static void rna_def_fcurve(BlenderRNA *brna)
RNA_def_property_pointer_sdna(prop, NULL, "grp");
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_pointer_funcs(prop, NULL, "rna_FCurve_group_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_FCurve_group_set", NULL, NULL);
RNA_def_property_update(prop, NC_ANIMATION, NULL);
/* Path + Array Index */
@@ -1369,35 +1397,35 @@ static void rna_def_fcurve(BlenderRNA *brna)
RNA_def_property_update(prop, NC_ANIMATION, NULL);
/* Flags */
- prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select", 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_ui_text(prop, "Select", "F-Curve is selected for editing");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL);
- prop= RNA_def_property(srna, "locked", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock", 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_ui_text(prop, "Lock", "F-Curve's settings cannot be edited");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
- prop= RNA_def_property(srna, "muted", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "mute", 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);
+ prop= RNA_def_property(srna, "use_auto_handle_clamp", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", FCURVE_AUTO_HANDLES);
RNA_def_property_ui_text(prop, "Auto Clamped Handles", "All auto-handles for F-Curve are clamped");
RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_PROP, NULL);
- prop= RNA_def_property(srna, "visible", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", FCURVE_VISIBLE);
- RNA_def_property_ui_text(prop, "Visible", "F-Curve and its keyframes are shown in the Graph Editor graphs");
+ prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", FCURVE_VISIBLE);
+ RNA_def_property_ui_text(prop, "Hide", "F-Curve and its keyframes are hidden 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");
+ prop= RNA_def_property(srna, "is_valid", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", FCURVE_DISABLED);
+ RNA_def_property_ui_text(prop, "Valid", "False when 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 */
@@ -1415,8 +1443,23 @@ static void rna_def_fcurve(BlenderRNA *brna)
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);
}
/* *********************** */
diff --git a/source/blender/makesrna/intern/rna_fluidsim.c b/source/blender/makesrna/intern/rna_fluidsim.c
index 0782ee4fb84..68060e2cfe3 100644
--- a/source/blender/makesrna/intern/rna_fluidsim.c
+++ b/source/blender/makesrna/intern/rna_fluidsim.c
@@ -105,6 +105,7 @@ static void rna_FluidSettings_update_type(Main *bmain, Scene *scene, PointerRNA
psys->part= part;
psys->pointcache= BKE_ptcache_add(&psys->ptcaches);
psys->flag |= PSYS_ENABLED;
+ sprintf(psys->name, "FluidParticles");
BLI_addtail(&ob->particlesystem,psys);
/* add modifier */
@@ -227,11 +228,11 @@ static void rna_def_fluidsim_domain(BlenderRNA *brna)
RNA_def_property_enum_items(prop, quality_items);
RNA_def_property_ui_text(prop, "Render Display Mode", "How to display the mesh for rendering");
- prop= RNA_def_property(srna, "reverse_frames", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_reverse_frames", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_FLUIDSIM_REVERSE);
RNA_def_property_ui_text(prop, "Reverse Frames", "Reverse fluid frames");
- prop= RNA_def_property(srna, "path", PROP_STRING, PROP_DIRPATH);
+ prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_DIRPATH);
RNA_def_property_string_maxlength(prop, 240);
RNA_def_property_string_sdna(prop, NULL, "surfdataPath");
RNA_def_property_ui_text(prop, "Path", "Directory (and/or filename prefix) to store baked fluid simulation files in");
@@ -249,21 +250,21 @@ static void rna_def_fluidsim_domain(BlenderRNA *brna)
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);
+ prop= RNA_def_property(srna, "use_time_override", 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");
+ RNA_def_property_ui_text(prop, "Start Time", "Simulation time of the first blender frame (in seconds)");
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");
+ RNA_def_property_ui_text(prop, "End Time", "Simulation time of the last blender frame (in seconds)");
- prop= RNA_def_property(srna, "real_world_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "simulation_scale", 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");
@@ -299,7 +300,7 @@ static void rna_def_fluidsim_domain(BlenderRNA *brna)
rna_def_fluidsim_slip(srna);
- prop= RNA_def_property(srna, "surface_smoothing", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "surface_smooth", 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);
@@ -311,7 +312,7 @@ static void rna_def_fluidsim_domain(BlenderRNA *brna)
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);
+ prop= RNA_def_property(srna, "use_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");
@@ -347,7 +348,7 @@ static void rna_def_fluidsim_volume(StructRNA *srna)
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);
+ prop= RNA_def_property(srna, "use_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");
@@ -357,9 +358,9 @@ static void rna_def_fluidsim_active(StructRNA *srna)
{
PropertyRNA *prop;
- prop= RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use", 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");
+ RNA_def_property_ui_text(prop, "Enabled", "Object contributes to the fluid simulation");
}
static void rna_def_fluidsim_fluid(BlenderRNA *brna)
@@ -419,7 +420,7 @@ static void rna_def_fluidsim_inflow(BlenderRNA *brna)
RNA_def_property_range(prop, -1000.1, 1000.1);
RNA_def_property_ui_text(prop, "Inflow Velocity", "Initial velocity of fluid");
- prop= RNA_def_property(srna, "local_coordinates", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_local_coords", 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)");
@@ -446,15 +447,15 @@ static void rna_def_fluidsim_particle(BlenderRNA *brna)
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");
- prop= RNA_def_property(srna, "drops", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_drops", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "typeFlags", OB_FSPART_DROP);
RNA_def_property_ui_text(prop, "Drops", "Show drop particles");
- prop= RNA_def_property(srna, "floats", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_floats", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "typeFlags", OB_FSPART_FLOAT);
RNA_def_property_ui_text(prop, "Floats", "Show floating foam particles");
- prop= RNA_def_property(srna, "tracer", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_tracer", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "typeFlags", OB_FSPART_TRACER);
RNA_def_property_ui_text(prop, "Tracer", "Show tracer particles");
@@ -468,7 +469,7 @@ static void rna_def_fluidsim_particle(BlenderRNA *brna)
RNA_def_property_range(prop, 0.0, 2.0);
RNA_def_property_ui_text(prop, "Alpha Influence", "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)");
- prop= RNA_def_property(srna, "path", PROP_STRING, PROP_DIRPATH);
+ prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_DIRPATH);
RNA_def_property_string_maxlength(prop, 240);
RNA_def_property_string_sdna(prop, NULL, "surfdataPath");
RNA_def_property_ui_text(prop, "Path", "Directory (and/or filename prefix) to store and load particles from");
@@ -522,7 +523,7 @@ static void rna_def_fluidsim_control(BlenderRNA *brna)
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);
+ prop= RNA_def_property(srna, "use_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");
@@ -559,7 +560,7 @@ void RNA_def_fluidsim(BlenderRNA *brna)
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 a541015139f..c03af99ccb0 100644
--- a/source/blender/makesrna/intern/rna_gpencil.c
+++ b/source/blender/makesrna/intern/rna_gpencil.c
@@ -131,13 +131,13 @@ static void rna_def_gpencil_frame(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Frame Number", "The frame on which this sketch appears");
/* Flags */
- prop= RNA_def_property(srna, "paint_lock", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_edited", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_FRAME_PAINT); // XXX should it be editable?
RNA_def_property_ui_text(prop, "Paint Lock", "Frame is being edited (painted on)");
- prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_FRAME_SELECT);
- RNA_def_property_ui_text(prop, "Selected", "Frame is selected for editing in the DopeSheet");
+ RNA_def_property_ui_text(prop, "Select", "Frame is selected for editing in the DopeSheet");
}
static void rna_def_gpencil_layer(BlenderRNA *brna)
@@ -151,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 */
@@ -169,17 +169,17 @@ 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);
+ prop= RNA_def_property(srna, "alpha", 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 */
- prop= RNA_def_property(srna, "line_thickness", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "line_width", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "thickness");
RNA_def_property_range(prop, 1, 10);
RNA_def_property_ui_text(prop, "Thickness", "Thickness of strokes (in pixels)");
@@ -191,37 +191,37 @@ static void rna_def_gpencil_layer(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Use Onion Skinning", "Ghost frames on either side of frame");
RNA_def_property_update(prop, NC_SCREEN|ND_GPENCIL, NULL);
- prop= RNA_def_property(srna, "max_ghost_range", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "ghost_range_max", 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);
+ prop= RNA_def_property(srna, "lock", 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);
+ prop= RNA_def_property(srna, "lock_frame", 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);
+ prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_SELECT);
- RNA_def_property_ui_text(prop, "Selected", "Layer is selected for editing in the DopeSheet");
+ RNA_def_property_ui_text(prop, "Select", "Layer is selected for editing in the DopeSheet");
RNA_def_property_update(prop, NC_SCREEN|ND_GPENCIL, NULL);
// XXX keep this option?
@@ -237,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");
@@ -252,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);
@@ -262,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 e16d586b5fa..bd1b7c96998 100644
--- a/source/blender/makesrna/intern/rna_group.c
+++ b/source/blender/makesrna/intern/rna_group.c
@@ -110,13 +110,14 @@ 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");
RNA_def_property_ui_text(prop, "Dupli Offset", "Offset from the origin to use when instancing as DupliGroup");
RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, 4);
- prop= RNA_def_property(srna, "layer", PROP_BOOLEAN, PROP_LAYER);
+ prop= RNA_def_property(srna, "layers", PROP_BOOLEAN, PROP_LAYER);
RNA_def_property_boolean_sdna(prop, NULL, "layer", 1);
RNA_def_property_array(prop, 20);
RNA_def_property_ui_text(prop, "Dupli Layers", "Layers visible when this groups is instanced as a dupli");
diff --git a/source/blender/makesrna/intern/rna_image.c b/source/blender/makesrna/intern/rna_image.c
index 7fc9673f3e5..7dffa4aec74 100644
--- a/source/blender/makesrna/intern/rna_image.c
+++ b/source/blender/makesrna/intern/rna_image.c
@@ -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)
@@ -220,23 +223,25 @@ static void rna_def_imageuser(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ImageUser", NULL);
RNA_def_struct_ui_text(srna, "Image User", "Parameters defining how an Image datablock is used by another datablock");
- prop= RNA_def_property(srna, "auto_refresh", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_auto_refresh", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_ANIM_ALWAYS);
RNA_def_property_ui_text(prop, "Auto Refresh", "Always refresh image on frame changes");
RNA_def_property_update(prop, 0, "rna_ImageUser_update");
/* animation */
- prop= RNA_def_property(srna, "cyclic", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_cyclic", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "cycl", 0);
RNA_def_property_ui_text(prop, "Cyclic", "Cycle the images in the movie");
RNA_def_property_update(prop, 0, "rna_ImageUser_update");
- prop= RNA_def_property(srna, "frames", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "frame_duration", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "frames");
RNA_def_property_range(prop, 0, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Frames", "Sets the number of images of a movie to use");
RNA_def_property_update(prop, 0, "rna_ImageUser_update");
- prop= RNA_def_property(srna, "offset", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "frame_offset", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "offset");
RNA_def_property_range(prop, -MAXFRAMEF, MAXFRAMEF);
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");
@@ -249,7 +254,7 @@ static void rna_def_imageuser(BlenderRNA *brna)
prop= RNA_def_property(srna, "fields_per_frame", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "fie_ima");
- RNA_def_property_range(prop, -MAXFRAMEF, MAXFRAMEF);
+ RNA_def_property_range(prop, 1, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Fields per Frame", "The number of fields per rendered frame (2 fields is 1 image)");
RNA_def_property_update(prop, 0, "rna_ImageUser_update");
@@ -293,15 +298,15 @@ static void rna_def_image(BlenderRNA *brna)
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, "filename_raw", PROP_STRING, PROP_FILEPATH);
+ 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, "Filename", "Image/Movie file name (without data refreshing)");
+ 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);
@@ -331,22 +336,17 @@ static void rna_def_image(BlenderRNA *brna)
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
/* booleans */
- prop= RNA_def_property(srna, "fields", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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);
+ prop= RNA_def_property(srna, "use_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");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_reload_update");
- prop= RNA_def_property(srna, "dirty", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_dirty", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_Image_dirty_get", NULL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Dirty", "Image has changed and is not saved");
@@ -384,30 +384,30 @@ static void rna_def_image(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Display Aspect", "Display Aspect for this image, does not affect rendering");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
- prop= RNA_def_property(srna, "animated", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_animation", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "tpageflag", IMA_TWINANIM);
RNA_def_property_ui_text(prop, "Animated", "Use as animated texture in the game engine");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_animated_update");
- prop= RNA_def_property(srna, "animation_start", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "twsta");
RNA_def_property_range(prop, 0, 128);
RNA_def_property_ui_text(prop, "Animation Start", "Start frame of an animated texture");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_animated_update");
- prop= RNA_def_property(srna, "animation_end", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "twend");
RNA_def_property_range(prop, 0, 128);
RNA_def_property_ui_text(prop, "Animation End", "End frame of an animated texture");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_animated_update");
- prop= RNA_def_property(srna, "animation_speed", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "fps", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "animspeed");
RNA_def_property_range(prop, 1, 100);
RNA_def_property_ui_text(prop, "Animation Speed", "Speed of the animation in frames per second");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
- prop= RNA_def_property(srna, "tiles", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_tiles", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "tpageflag", IMA_TILES);
RNA_def_property_ui_text(prop, "Tiles", "Use of tilemode for faces (default shift-LMB to pick the tile for selected faces)");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
@@ -424,16 +424,22 @@ static void rna_def_image(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Tiles Y", "Degree of repetition in the Y direction");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
- prop= RNA_def_property(srna, "clamp_x", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_clamp_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "tpageflag", IMA_CLAMP_U);
RNA_def_property_ui_text(prop, "Clamp X", "Disable texture repeating horizontally");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
- prop= RNA_def_property(srna, "clamp_y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_clamp_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "tpageflag", IMA_CLAMP_V);
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)
@@ -443,7 +449,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 aa2ed58623e..70438ae3d8c 100644
--- a/source/blender/makesrna/intern/rna_image_api.c
+++ b/source/blender/makesrna/intern/rna_image_api.c
@@ -33,6 +33,8 @@
#include "RNA_define.h"
+#include "BIF_gl.h"
+
#ifdef RNA_RUNTIME
#include "BKE_image.h"
@@ -75,6 +77,8 @@ static void rna_Image_save_render(Image *image, bContext *C, ReportList *reports
if (!BKE_write_ibuf(NULL, ibuf, path, scene->r.imtype, scene->r.subimtype, scene->r.quality)) {
BKE_reportf(reports, RPT_ERROR, "Couldn't write image: %s", path);
}
+
+ BKE_image_release_ibuf(image, lock);
} else {
BKE_reportf(reports, RPT_ERROR, "Scene not in context, couldn't get save parameters");
}
@@ -127,30 +131,45 @@ static void rna_Image_update(Image *image, ReportList *reports)
IMB_rect_from_float(ibuf);
}
-static void rna_Image_gl_load(Image *image, ReportList *reports)
+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;
+ return error;
ibuf= BKE_image_get_ibuf(image, NULL);
- if(ibuf == NULL || ibuf->rect == 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;
+ return (int)GL_INVALID_OPERATION;
}
/* could be made into a function? */
- glGenTextures( 1, ( GLuint * ) bind );
- glBindTexture( GL_TEXTURE_2D, *bind );
-
- gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, ibuf->x, ibuf->y, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- 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_BYTE, ibuf->rect);
+ 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_WRAP_S, image->tpageflag & IMA_CLAMP_U ? GL_CLAMP : GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, image->tpageflag & IMA_CLAMP_V ? GL_CLAMP : GL_REPEAT);
+ 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_BYTE, ibuf->rect);
+ error = (int)glGetError();
+ }
+
+ if (error) {
+ glDeleteTextures(1, (GLuint*)bind);
+ image->bindcode = 0;
+ }
+
+ return error;
}
static void rna_Image_gl_free(Image *image)
@@ -171,7 +190,7 @@ void RNA_api_image(StructRNA *srna)
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_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");
@@ -189,6 +208,11 @@ void RNA_api_image(StructRNA *srna)
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");
diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h
index 433d5ff2904..669fc5d3871 100644
--- a/source/blender/makesrna/intern/rna_internal.h
+++ b/source/blender/makesrna/intern/rna_internal.h
@@ -34,6 +34,7 @@
struct ID;
struct IDProperty;
struct SDNA;
+struct Sequence;
/* Data structures used during define */
@@ -188,9 +189,9 @@ void rna_ID_name_get(struct PointerRNA *ptr, char *value);
int rna_ID_name_length(struct PointerRNA *ptr);
void rna_ID_name_set(struct PointerRNA *ptr, const char *value);
struct StructRNA *rna_ID_refine(struct PointerRNA *ptr);
-struct IDProperty *rna_ID_idproperties(struct PointerRNA *ptr, int create);
+struct IDProperty *rna_ID_idprops(struct PointerRNA *ptr, int create);
void rna_ID_fake_user_set(struct PointerRNA *ptr, int value);
-struct IDProperty *rna_IDPropertyGroup_idproperties(struct PointerRNA *ptr, int create);
+struct IDProperty *rna_IDPropertyGroup_idprops(struct PointerRNA *ptr, int create);
void rna_IDPropertyGroup_unregister(const struct bContext *C, struct StructRNA *type);
struct StructRNA *rna_IDPropertyGroup_register(const struct bContext *C, struct ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free);
struct StructRNA* rna_IDPropertyGroup_refine(struct PointerRNA *ptr);
@@ -204,11 +205,19 @@ void rna_object_vcollayer_name_set(struct PointerRNA *ptr, const char *value, ch
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_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);
+/* basic poll functions for object types */
+int rna_Armature_object_poll(struct PointerRNA *ptr, struct PointerRNA value);
+int rna_Camera_object_poll(struct PointerRNA *ptr, struct PointerRNA value);
+int rna_Curve_object_poll(struct PointerRNA *ptr, struct PointerRNA value);
+int rna_Lattice_object_poll(struct PointerRNA *ptr, struct PointerRNA value);
+int rna_Mesh_object_poll(struct PointerRNA *ptr, struct PointerRNA value);
+
+
char *rna_TextureSlot_path(struct PointerRNA *ptr);
/* API functions */
@@ -227,12 +236,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);
@@ -249,7 +263,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);
@@ -338,6 +352,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_internal_types.h b/source/blender/makesrna/intern/rna_internal_types.h
index 7737d6094bc..216533a8708 100644
--- a/source/blender/makesrna/intern/rna_internal_types.h
+++ b/source/blender/makesrna/intern/rna_internal_types.h
@@ -87,6 +87,7 @@ typedef EnumPropertyItem *(*PropEnumItemFunc)(struct bContext *C, struct Pointer
typedef PointerRNA (*PropPointerGetFunc)(struct PointerRNA *ptr);
typedef StructRNA* (*PropPointerTypeFunc)(struct PointerRNA *ptr);
typedef void (*PropPointerSetFunc)(struct PointerRNA *ptr, const PointerRNA value);
+typedef int (*PropPointerPollFunc)(struct PointerRNA *ptr, const PointerRNA value);
typedef void (*PropCollectionBeginFunc)(struct CollectionPropertyIterator *iter, struct PointerRNA *ptr);
typedef void (*PropCollectionNextFunc)(struct CollectionPropertyIterator *iter);
typedef void (*PropCollectionEndFunc)(struct CollectionPropertyIterator *iter);
@@ -257,6 +258,7 @@ typedef struct PointerPropertyRNA {
PropPointerGetFunc get;
PropPointerSetFunc set;
PropPointerTypeFunc typef;
+ PropPointerPollFunc poll; /* unlike operators, 'set' can still run if poll fails, used for filtering display */
struct StructRNA *type;
} PointerPropertyRNA;
diff --git a/source/blender/makesrna/intern/rna_key.c b/source/blender/makesrna/intern/rna_key.c
index 7e9aebeffa4..970c825d30b 100644
--- a/source/blender/makesrna/intern/rna_key.c
+++ b/source/blender/makesrna/intern/rna_key.c
@@ -363,13 +363,13 @@ static void rna_def_keydata(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Location", "");
RNA_def_property_update(prop, 0, "rna_Key_update_data");
- prop= RNA_def_property(srna, "handle_1_co", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "handle_left", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
RNA_def_property_float_funcs(prop, "rna_ShapeKeyBezierPoint_handle_1_co_get", "rna_ShapeKeyBezierPoint_handle_1_co_set", NULL);
RNA_def_property_ui_text(prop, "Handle 1 Location", "");
RNA_def_property_update(prop, 0, "rna_Key_update_data");
- prop= RNA_def_property(srna, "handle_2_co", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "handle_right", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
RNA_def_property_float_funcs(prop, "rna_ShapeKeyBezierPoint_handle_2_co_get", "rna_ShapeKeyBezierPoint_handle_2_co_set", NULL);
RNA_def_property_ui_text(prop, "Handle 2 Location", "");
@@ -433,7 +433,7 @@ static void rna_def_keyblock(BlenderRNA *brna)
prop= RNA_def_property(srna, "relative_key", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "ShapeKey");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_pointer_funcs(prop, "rna_ShapeKey_relative_key_get", "rna_ShapeKey_relative_key_set", NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_ShapeKey_relative_key_get", "rna_ShapeKey_relative_key_set", NULL, NULL);
RNA_def_property_ui_text(prop, "Relative Key", "Shape used as a relative key");
RNA_def_property_update(prop, 0, "rna_Key_update_data");
@@ -488,7 +488,7 @@ static void rna_def_key(BlenderRNA *brna)
RNA_def_property_pointer_sdna(prop, NULL, "from");
RNA_def_property_ui_text(prop, "User", "Datablock using these shape keys");
- prop= RNA_def_property(srna, "relative", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_relative", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "type", KEY_RELATIVE);
RNA_def_property_ui_text(prop, "Relative", "Makes shape keys relative");
RNA_def_property_update(prop, 0, "rna_Key_update_data");
diff --git a/source/blender/makesrna/intern/rna_lamp.c b/source/blender/makesrna/intern/rna_lamp.c
index fb5242f64f4..c6660450914 100644
--- a/source/blender/makesrna/intern/rna_lamp.c
+++ b/source/blender/makesrna/intern/rna_lamp.c
@@ -159,7 +159,7 @@ static void rna_def_lamp_mtex(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "MTex");
RNA_def_struct_ui_text(srna, "Lamp Texture Slot", "Texture slot for textures in a Lamp datablock");
- prop= RNA_def_property(srna, "texture_coordinates", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "texture_coords", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "texco");
RNA_def_property_enum_items(prop, prop_texture_coordinates_items);
RNA_def_property_ui_text(prop, "Texture Coordinates", "");
@@ -170,12 +170,12 @@ static void rna_def_lamp_mtex(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Object", "Object to use for mapping with Object texture coordinates");
- prop= RNA_def_property(srna, "map_color", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_color", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", LAMAP_COL);
RNA_def_property_ui_text(prop, "Color", "Lets the texture affect the basic color of the lamp");
RNA_def_property_update(prop, 0, "rna_Lamp_update");
- prop= RNA_def_property(srna, "map_shadow", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_shadow", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", LAMAP_SHAD);
RNA_def_property_ui_text(prop, "Shadow", "Lets the texture affect the shadow color of the lamp");
RNA_def_property_update(prop, 0, "rna_Lamp_update");
@@ -275,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");
@@ -361,22 +362,22 @@ static void rna_def_lamp(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Color", "Light color");
RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
- prop= RNA_def_property(srna, "layer", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_own_layer", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", LA_LAYER);
RNA_def_property_ui_text(prop, "Layer", "Illuminates objects only on the same layer the lamp is on");
RNA_def_property_update(prop, 0, "rna_Lamp_update");
- prop= RNA_def_property(srna, "negative", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_negative", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", LA_NEG);
RNA_def_property_ui_text(prop, "Negative", "Lamp casts negative light");
RNA_def_property_update(prop, 0, "rna_Lamp_update");
- prop= RNA_def_property(srna, "specular", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_specular", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "mode", LA_NO_SPEC);
RNA_def_property_ui_text(prop, "Specular", "Lamp creates specular highlights");
RNA_def_property_update(prop, 0, "rna_Lamp_update");
- prop= RNA_def_property(srna, "diffuse", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_diffuse", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "mode", LA_NO_DIFF);
RNA_def_property_ui_text(prop, "Diffuse", "Lamp does diffuse shading");
RNA_def_property_update(prop, 0, "rna_Lamp_update");
@@ -411,7 +412,7 @@ static void rna_def_lamp_falloff(StructRNA *srna)
RNA_def_property_ui_text(prop, "Falloff Curve", "Custom Lamp Falloff Curve");
RNA_def_property_update(prop, 0, "rna_Lamp_update");
- prop= RNA_def_property(srna, "sphere", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_sphere", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", LA_SPHERE);
RNA_def_property_ui_text(prop, "Sphere", "Sets light intensity to zero beyond lamp distance");
RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
@@ -419,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");
}
@@ -467,12 +468,12 @@ static void rna_def_lamp_shadow(StructRNA *srna, int spot, int area)
RNA_def_property_ui_text(prop, "Shadow Color", "Color of shadows cast by the lamp");
RNA_def_property_update(prop, 0, "rna_Lamp_update");
- prop= RNA_def_property(srna, "only_shadow", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_only_shadow", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", LA_ONLYSHADOW);
RNA_def_property_ui_text(prop, "Only Shadow", "Causes light to cast shadows only without illuminating objects");
RNA_def_property_update(prop, 0, "rna_Lamp_update");
- prop= RNA_def_property(srna, "shadow_ray_sampling_method", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "shadow_ray_sample_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "ray_samp_method");
RNA_def_property_enum_items(prop, (area)? prop_spot_ray_sampling_method_items: prop_ray_sampling_method_items);
RNA_def_property_ui_text(prop, "Shadow Ray Sampling Method", "Method for generating shadow samples: Adaptive QMC is fastest, Constant QMC is less noisy but slower");
@@ -504,7 +505,7 @@ static void rna_def_lamp_shadow(StructRNA *srna, int spot, int area)
RNA_def_property_ui_text(prop, "Shadow Soft Size", "Light size for ray shadow sampling (Raytraced shadows)");
RNA_def_property_update(prop, 0, "rna_Lamp_update");
- prop= RNA_def_property(srna, "shadow_layer", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_shadow_layer", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", LA_LAYER_SHADOW);
RNA_def_property_ui_text(prop, "Shadow Layer", "Causes only objects on the same layer to cast shadows");
RNA_def_property_update(prop, 0, "rna_Lamp_update");
@@ -540,17 +541,17 @@ static void rna_def_area_lamp(BlenderRNA *brna)
rna_def_lamp_shadow(srna, 0, 1);
- prop= RNA_def_property(srna, "umbra", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_umbra", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "ray_samp_type", LA_SAMP_UMBRA);
RNA_def_property_ui_text(prop, "Umbra", "Emphasize parts that are fully shadowed (Constant Jittered sampling)");
RNA_def_property_update(prop, 0, "rna_Lamp_update");
- prop= RNA_def_property(srna, "dither", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_dither", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "ray_samp_type", LA_SAMP_DITHER);
RNA_def_property_ui_text(prop, "Dither", "Use 2x2 dithering for sampling (Constant Jittered sampling)");
RNA_def_property_update(prop, 0, "rna_Lamp_update");
- prop= RNA_def_property(srna, "jitter", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_jitter", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "ray_samp_type", LA_SAMP_JITTER);
RNA_def_property_ui_text(prop, "Jitter", "Use noise for sampling (Constant Jittered sampling)");
RNA_def_property_update(prop, 0, "rna_Lamp_update");
@@ -612,12 +613,12 @@ static void rna_def_spot_lamp(BlenderRNA *brna)
rna_def_lamp_falloff(srna);
rna_def_lamp_shadow(srna, 1, 0);
- prop= RNA_def_property(srna, "square", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_square", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", LA_SQUARE);
RNA_def_property_ui_text(prop, "Square", "Casts a square spot light shape");
RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
- prop= RNA_def_property(srna, "halo", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_halo", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", LA_HALO);
RNA_def_property_ui_text(prop, "Halo", "Renders spotlight with a volumetric halo (Buffer Shadows)");
RNA_def_property_update(prop, 0, "rna_Lamp_update");
@@ -707,12 +708,12 @@ static void rna_def_spot_lamp(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Shadow Buffer Type", "Type of shadow buffer");
RNA_def_property_update(prop, 0, "rna_Lamp_update");
- prop= RNA_def_property(srna, "auto_clip_start", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_auto_clip_start", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "bufflag", LA_SHADBUF_AUTO_START);
RNA_def_property_ui_text(prop, "Autoclip Start", "Automatic calculation of clipping-start, based on visible vertices");
RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
- prop= RNA_def_property(srna, "auto_clip_end", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_auto_clip_end", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "bufflag", LA_SHADBUF_AUTO_END);
RNA_def_property_ui_text(prop, "Autoclip End", "Automatic calculation of clipping-end, based on visible vertices");
RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
@@ -740,7 +741,7 @@ static void rna_def_sun_lamp(BlenderRNA *brna)
prop= RNA_def_property(srna, "sky", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "LampSkySettings");
- RNA_def_property_pointer_funcs(prop, "rna_Lamp_sky_settings_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Lamp_sky_settings_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Sky Settings", "Sky related settings for sun lamps");
rna_def_lamp_sky_settings(brna);
diff --git a/source/blender/makesrna/intern/rna_lattice.c b/source/blender/makesrna/intern/rna_lattice.c
index e56cb2659f7..f27a1ef86c0 100644
--- a/source/blender/makesrna/intern/rna_lattice.c
+++ b/source/blender/makesrna/intern/rna_lattice.c
@@ -41,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"
@@ -78,8 +79,8 @@ static void rna_Lattice_points_begin(CollectionPropertyIterator *iter, PointerRN
Lattice *lt= (Lattice*)ptr->data;
int tot= lt->pntsu*lt->pntsv*lt->pntsw;
- if(lt->editlatt && lt->editlatt->def)
- rna_iterator_array_begin(iter, (void*)lt->editlatt->def, sizeof(BPoint), tot, 0, NULL);
+ if(lt->editlatt && lt->editlatt->latt->def)
+ rna_iterator_array_begin(iter, (void*)lt->editlatt->latt->def, sizeof(BPoint), tot, 0, NULL);
else if(lt->def)
rna_iterator_array_begin(iter, (void*)lt->def, sizeof(BPoint), tot, 0, NULL);
else
@@ -110,7 +111,7 @@ static void rna_Lattice_update_size(Main *bmain, Scene *scene, PointerRNA *ptr)
if(ob->data == lt) {
resizelattice(lt, newu, newv, neww, ob);
if(lt->editlatt)
- resizelattice(lt->editlatt, newu, newv, neww, ob);
+ resizelattice(lt->editlatt->latt, newu, newv, neww, ob);
break;
}
}
@@ -119,13 +120,13 @@ static void rna_Lattice_update_size(Main *bmain, Scene *scene, PointerRNA *ptr)
if(!ob) {
resizelattice(lt, newu, newv, neww, NULL);
if(lt->editlatt)
- resizelattice(lt->editlatt, newu, newv, neww, NULL);
+ resizelattice(lt->editlatt->latt, newu, newv, neww, NULL);
}
rna_Lattice_update_data(bmain, scene, ptr);
}
-static void rna_Lattice_outside_set(PointerRNA *ptr, int value)
+static void rna_Lattice_use_outside_set(PointerRNA *ptr, int value)
{
Lattice *lt= ptr->data;
@@ -135,28 +136,51 @@ static void rna_Lattice_outside_set(PointerRNA *ptr, int value)
outside_lattice(lt);
if(lt->editlatt) {
- if(value) lt->editlatt->flag |= LT_OUTSIDE;
- else lt->editlatt->flag &= ~LT_OUTSIDE;
+ if(value) lt->editlatt->latt->flag |= LT_OUTSIDE;
+ else lt->editlatt->latt->flag &= ~LT_OUTSIDE;
- outside_lattice(lt->editlatt);
+ outside_lattice(lt->editlatt->latt);
}
}
+static int rna_Lattice_size_editable(PointerRNA *ptr)
+{
+ Lattice *lt= (Lattice*)ptr->data;
+
+ return lt->key == NULL;
+}
+
static void rna_Lattice_points_u_set(PointerRNA *ptr, int value)
{
- ((Lattice*)ptr->data)->opntsu= CLAMPIS(value, 1, 64);
+ Lattice *lt= (Lattice*)ptr->data;
+
+ lt->opntsu= CLAMPIS(value, 1, 64);
}
static void rna_Lattice_points_v_set(PointerRNA *ptr, int value)
{
- ((Lattice*)ptr->data)->opntsv= CLAMPIS(value, 1, 64);
+ Lattice *lt= (Lattice*)ptr->data;
+
+ lt->opntsv= CLAMPIS(value, 1, 64);
}
static void rna_Lattice_points_w_set(PointerRNA *ptr, int value)
{
- ((Lattice*)ptr->data)->opntsw= CLAMPIS(value, 1, 64);
+ Lattice *lt= (Lattice*)ptr->data;
+
+ lt->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->latt->vgroup, value);
+}
+
+
#else
static void rna_def_latticepoint(BlenderRNA *brna)
@@ -174,7 +198,7 @@ static void rna_def_latticepoint(BlenderRNA *brna)
RNA_def_property_float_funcs(prop, "rna_LatticePoint_co_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Location", "");
- prop= RNA_def_property(srna, "deformed_co", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "co_deform", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "vec");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Deformed Location", "");
@@ -205,22 +229,25 @@ static void rna_def_lattice(BlenderRNA *brna)
RNA_def_property_int_sdna(prop, NULL, "pntsu");
RNA_def_property_int_funcs(prop, NULL, "rna_Lattice_points_u_set", NULL);
RNA_def_property_range(prop, 1, 64);
- RNA_def_property_ui_text(prop, "U", "Points in U direction");
+ RNA_def_property_ui_text(prop, "U", "Points in U direction (can't be changed when there are shape keys)");
RNA_def_property_update(prop, 0, "rna_Lattice_update_size");
+ RNA_def_property_editable_func(prop, "rna_Lattice_size_editable");
prop= RNA_def_property(srna, "points_v", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "pntsv");
RNA_def_property_int_funcs(prop, NULL, "rna_Lattice_points_v_set", NULL);
RNA_def_property_range(prop, 1, 64);
- RNA_def_property_ui_text(prop, "V", "Points in V direction");
+ RNA_def_property_ui_text(prop, "V", "Points in V direction (can't be changed when there are shape keys)");
RNA_def_property_update(prop, 0, "rna_Lattice_update_size");
+ RNA_def_property_editable_func(prop, "rna_Lattice_size_editable");
prop= RNA_def_property(srna, "points_w", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "pntsw");
RNA_def_property_int_funcs(prop, NULL, "rna_Lattice_points_w_set", NULL);
RNA_def_property_range(prop, 1, 64);
- RNA_def_property_ui_text(prop, "W", "Points in W direction");
+ RNA_def_property_ui_text(prop, "W", "Points in W direction (can't be changed when there are shape keys)");
RNA_def_property_update(prop, 0, "rna_Lattice_update_size");
+ RNA_def_property_editable_func(prop, "rna_Lattice_size_editable");
prop= RNA_def_property(srna, "interpolation_type_u", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "typeu");
@@ -240,11 +267,17 @@ static void rna_def_lattice(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Interpolation Type W", "");
RNA_def_property_update(prop, 0, "rna_Lattice_update_data");
- prop= RNA_def_property(srna, "outside", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_outside", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", LT_OUTSIDE);
- RNA_def_property_boolean_funcs(prop, NULL, "rna_Lattice_outside_set");
+ RNA_def_property_boolean_funcs(prop, NULL, "rna_Lattice_use_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 7a680e00c8b..b59f23d3e1f 100644
--- a/source/blender/makesrna/intern/rna_main.c
+++ b/source/blender/makesrna/intern/rna_main.c
@@ -50,21 +50,25 @@ static void rna_Main_debug_set(PointerRNA *ptr, const int value)
G.f &= ~G_DEBUG;
}
+static int rna_Main_is_dirty_get(PointerRNA *ptr)
+{
+ return !G.relbase_valid;
+}
-static void rna_Main_filename_get(PointerRNA *ptr, char *value)
+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));
@@ -143,13 +147,11 @@ static void rna_Main_camera_begin(CollectionPropertyIterator *iter, PointerRNA *
rna_iterator_listbase_begin(iter, &bmain->camera, NULL);
}
-#if 0
static void rna_Main_key_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
Main *bmain= (Main*)ptr->data;
rna_iterator_listbase_begin(iter, &bmain->key, NULL);
}
-#endif
static void rna_Main_world_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
@@ -169,7 +171,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);
@@ -267,6 +269,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},
@@ -282,19 +285,19 @@ 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},
{"groups", "Group", "rna_Main_group_begin", "Groups", "Group datablocks.", RNA_def_main_groups},
-/* {"keys", "Key", "rna_Main_key_begin", "Keys", "Key datablocks.", NULL}, */
+ {"shape_keys", "Key", "rna_Main_key_begin", "Keys", "Key datablocks.", NULL},
{"scripts", "ID", "rna_Main_script_begin", "Scripts", "Script datablocks (DEPRECATED).", NULL},
{"texts", "Text", "rna_Main_text_begin", "Texts", "Text datablocks.", RNA_def_main_texts},
{"sounds", "Sound", "rna_Main_sound_begin", "Sounds", "Sound datablocks.", RNA_def_main_sounds},
{"armatures", "Armature", "rna_Main_armature_begin", "Armatures", "Armature datablocks.", RNA_def_main_armatures},
{"actions", "Action", "rna_Main_action_begin", "Actions", "Action datablocks.", RNA_def_main_actions},
{"particles", "ParticleSettings", "rna_Main_particle_begin", "Particles", "Particle datablocks.", RNA_def_main_particles},
- {"gpencil", "GreasePencil", "rna_Main_gpencil_begin", "Grease Pencil", "Grease Pencil datablocks.", RNA_def_main_gpencil},
+ {"grease_pencil", "GreasePencil", "rna_Main_gpencil_begin", "Grease Pencil", "Grease Pencil datablocks.", RNA_def_main_gpencil},
{NULL, NULL, NULL, NULL, NULL, NULL}};
int i;
@@ -303,11 +306,16 @@ 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, "is_dirty", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_is_dirty_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");
@@ -335,7 +343,7 @@ void RNA_def_main(BlenderRNA *brna)
prop= RNA_def_property(srna, "test", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Test");
- RNA_def_property_pointer_funcs(prop, "rna_Test_test_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Test_test_get", NULL, NULL, NULL);
RNA_define_verify_sdna(1);
diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c
index d70962568e5..72ed625e5aa 100644
--- a/source/blender/makesrna/intern/rna_main_api.c
+++ b/source/blender/makesrna/intern/rna_main_api.c
@@ -28,6 +28,7 @@
#include <stdlib.h>
#include <stdio.h>
+#include <errno.h>
#include "RNA_define.h"
#include "RNA_access.h"
@@ -50,6 +51,13 @@
#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"
@@ -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"
@@ -190,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);
@@ -222,16 +254,24 @@ 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 float_buffer)
+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, float_buffer, 0, color);
+ 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, char *filename)
+Image *rna_Main_images_load(Main *bmain, ReportList *reports, char *filepath)
{
- return BKE_add_image_file(filename, 0);
+ 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)
{
@@ -243,6 +283,20 @@ void rna_Main_images_remove(Main *bmain, ReportList *reports, Image *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);
@@ -257,9 +311,47 @@ void rna_Main_curves_remove(Main *bmain, ReportList *reports, struct Curve *cu)
BKE_reportf(reports, RPT_ERROR, "Curve \"%s\" must have zero users to be removed, found %d.", cu->id.name+2, ID_REAL_USERS(cu));
}
-Tex *rna_Main_textures_new(Main *bmain, char* name)
+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, int type)
{
Tex *tex= add_texture(name);
+ tex_set_type(tex, type);
tex->id.us--;
return tex;
}
@@ -271,6 +363,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);
@@ -278,7 +398,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? */
}
@@ -293,11 +412,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;
}
@@ -335,6 +459,22 @@ 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)
@@ -348,7 +488,7 @@ void RNA_api_main(StructRNA *srna)
/*
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);
@@ -378,7 +518,7 @@ void RNA_def_main_cameras(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Remove a camera from the current blendfile.");
parm= RNA_def_pointer(func, "camera", "Camera", "", "Camera to remove.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
void RNA_def_main_scenes(BlenderRNA *brna, PropertyRNA *cprop)
@@ -401,10 +541,9 @@ void RNA_def_main_scenes(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "remove", "rna_Main_scenes_remove");
RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
- parm= RNA_def_pointer(func, "scene", "Scene", "", "Scene to remove.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
RNA_def_function_ui_description(func, "Remove a scene from the current blendfile.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_pointer(func, "scene", "Scene", "", "Scene to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
void RNA_def_main_objects(BlenderRNA *brna, PropertyRNA *cprop)
@@ -430,10 +569,10 @@ void RNA_def_main_objects(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_return(func, parm);
func= RNA_def_function(srna, "remove", "rna_Main_objects_remove");
+ RNA_def_function_ui_description(func, "Remove a object from the current blendfile.");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
parm= RNA_def_pointer(func, "object", "Object", "", "Object to remove.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
- RNA_def_function_ui_description(func, "Remove a object from the current blendfile.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
void RNA_def_main_materials(BlenderRNA *brna, PropertyRNA *cprop)
@@ -458,11 +597,39 @@ void RNA_def_main_materials(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Remove a material from the current blendfile.");
parm= RNA_def_pointer(func, "material", "Material", "", "Material to remove.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
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|PROP_NEVER_NULL);
+#endif
}
void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -486,7 +653,7 @@ void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Remove a mesh from the current blendfile.");
parm= RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh to remove.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
void RNA_def_main_lamps(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -510,7 +677,7 @@ void RNA_def_main_lamps(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Remove a lamp from the current blendfile.");
parm= RNA_def_pointer(func, "lamp", "Lamp", "", "Lamp to remove.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
void RNA_def_main_libraries(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -540,14 +707,16 @@ void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop)
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, "filename", "File Name", 0, "", "path of the file to load.");
+ 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.");
@@ -557,12 +726,32 @@ void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop)
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);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
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|PROP_NEVER_NULL);
}
void RNA_def_main_curves(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -578,7 +767,7 @@ void RNA_def_main_curves(BlenderRNA *brna, PropertyRNA *cprop)
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");
+ parm= RNA_def_enum(func, "type", object_type_curve_items, 0, "Type", "The type of curve to add");
RNA_def_property_flag(parm, PROP_REQUIRED);
/* return type */
parm= RNA_def_pointer(func, "curve", "Curve", "", "New curve datablock.");
@@ -588,15 +777,56 @@ void RNA_def_main_curves(BlenderRNA *brna, PropertyRNA *cprop)
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);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
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|PROP_NEVER_NULL);
}
-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|PROP_NEVER_NULL);
}
void RNA_def_main_textures(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -612,6 +842,8 @@ void RNA_def_main_textures(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Add a new texture to the main database");
parm= RNA_def_string(func, "name", "Texture", 0, "", "New name for the datablock.");
RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_enum(func, "type", texture_type_items, 0, "Type", "The type of texture to add");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
/* return type */
parm= RNA_def_pointer(func, "texture", "Texture", "", "New texture datablock.");
RNA_def_function_return(func, parm);
@@ -620,16 +852,58 @@ void RNA_def_main_textures(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Remove a texture from the current blendfile.");
parm= RNA_def_pointer(func, "texture", "Texture", "", "Texture to remove.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
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|PROP_NEVER_NULL);
}
+
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|PROP_NEVER_NULL);
}
+
void RNA_def_main_groups(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
@@ -652,7 +926,7 @@ void RNA_def_main_groups(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Remove a group from the current blendfile.");
parm= RNA_def_pointer(func, "group", "Group", "", "Group to remove.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
void RNA_def_main_texts(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -676,13 +950,13 @@ void RNA_def_main_texts(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Remove a text from the current blendfile.");
parm= RNA_def_pointer(func, "text", "Text", "", "Text to remove.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
/* load func */
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.");
@@ -714,7 +988,7 @@ void RNA_def_main_armatures(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Remove a armature from the current blendfile.");
parm= RNA_def_pointer(func, "armature", "Armature", "", "Armature to remove.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
void RNA_def_main_actions(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -738,11 +1012,31 @@ void RNA_def_main_actions(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Remove a action from the current blendfile.");
parm= RNA_def_pointer(func, "action", "Action", "", "Action to remove.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
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|PROP_NEVER_NULL);
}
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 4d47737038a..46a89ccce40 100644
--- a/source/blender/makesrna/intern/rna_material.c
+++ b/source/blender/makesrna/intern/rna_material.c
@@ -186,7 +186,7 @@ static void rna_MaterialStrand_end_size_range(PointerRNA *ptr, float *min, float
}
}
-static int rna_MaterialTextureSlot_enabled_get(PointerRNA *ptr)
+static int rna_MaterialTextureSlot_use_get(PointerRNA *ptr)
{
Material *ma= (Material*)ptr->id.data;
MTex *mtex= (MTex*)ptr->data;
@@ -199,7 +199,7 @@ static int rna_MaterialTextureSlot_enabled_get(PointerRNA *ptr)
return 0;
}
-static void rna_MaterialTextureSlot_enabled_set(PointerRNA *ptr, int value)
+static void rna_MaterialTextureSlot_use_set(PointerRNA *ptr, int value)
{
Material *ma= (Material*)ptr->id.data;
MTex *mtex= (MTex*)ptr->data;
@@ -323,7 +323,7 @@ static void rna_def_material_mtex(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "MTex");
RNA_def_struct_ui_text(srna, "Material Texture Slot", "Texture slot for textures in a Material datablock");
- prop= RNA_def_property(srna, "texture_coordinates", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "texture_coords", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "texco");
RNA_def_property_enum_items(prop, prop_texture_coordinates_items);
RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Material_texture_coordinates_itemf");
@@ -342,99 +342,99 @@ static void rna_def_material_mtex(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "UV Layer", "UV layer to use for mapping with UV texture coordinates");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "from_dupli", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_from_dupli", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "texflag", MTEX_DUPLI_MAPTO);
RNA_def_property_ui_text(prop, "From Dupli", "Dupli's instanced from verts, faces or particles, inherit texture coordinate from their parent");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "from_original", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_from_original", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "texflag", MTEX_OB_DUPLI_ORIG);
RNA_def_property_ui_text(prop, "From Original", "Dupli's derive their object coordinates from the original objects transformation");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "map_colordiff", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_color_diffuse", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_COL);
RNA_def_property_ui_text(prop, "Diffuse Color", "Causes the texture to affect basic color of the material");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "map_normal", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_normal", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_NORM);
RNA_def_property_ui_text(prop, "Normal", "Causes the texture to affect the rendered normal");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "map_colorspec", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_color_spec", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_COLSPEC);
RNA_def_property_ui_text(prop, "Specular Color", "Causes the texture to affect the specularity color");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "map_mirror", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_mirror", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_COLMIR);
RNA_def_property_ui_text(prop, "Mirror", "Causes the texture to affect the mirror color");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "map_diffuse", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_diffuse", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_REF);
RNA_def_property_ui_text(prop, "Diffuse", "Causes the texture to affect the value of the materials diffuse reflectivity");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "map_specular", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_specular", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_SPEC);
RNA_def_property_ui_text(prop, "Specular", "Causes the texture to affect the value of specular reflectivity");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "map_ambient", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_ambient", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_AMB);
RNA_def_property_ui_text(prop, "Ambient", "Causes the texture to affect the value of ambient");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "map_hardness", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_hardness", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_HAR);
RNA_def_property_ui_text(prop, "Hardness", "Causes the texture to affect the hardness value");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "map_raymir", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_raymir", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_RAYMIRR);
RNA_def_property_ui_text(prop, "Ray-Mirror", "Causes the texture to affect the ray-mirror value");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "map_alpha", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_alpha", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_ALPHA);
RNA_def_property_ui_text(prop, "Alpha", "Causes the texture to affect the alpha value");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "map_emit", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_emit", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_EMIT);
RNA_def_property_ui_text(prop, "Emit", "Causes the texture to affect the emit value");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "map_translucency", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_translucency", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_TRANSLU);
RNA_def_property_ui_text(prop, "Translucency", "Causes the texture to affect the translucency value");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "map_displacement", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_displacement", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_DISPLACE);
RNA_def_property_ui_text(prop, "Displacement", "Let the texture displace the surface");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "map_warp", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_warp", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_WARP);
RNA_def_property_ui_text(prop, "Warp", "Let the texture warp texture coordinates of next channels");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "x_mapping", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "mapping_x", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "projx");
RNA_def_property_enum_items(prop, prop_x_mapping_items);
RNA_def_property_ui_text(prop, "X Mapping", "");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "y_mapping", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "mapping_y", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "projy");
RNA_def_property_enum_items(prop, prop_y_mapping_items);
RNA_def_property_ui_text(prop, "Y Mapping", "");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "z_mapping", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "mapping_z", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "projz");
RNA_def_property_enum_items(prop, prop_z_mapping_items);
RNA_def_property_ui_text(prop, "Z Mapping", "");
@@ -469,13 +469,13 @@ static void rna_def_material_mtex(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Warp Factor", "Amount texture affects texture coordinates of next channels");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "colorspec_factor", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "specular_color_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "colspecfac");
RNA_def_property_ui_range(prop, 0, 1, 10, 3);
RNA_def_property_ui_text(prop, "Specular Color Factor", "Amount texture affects specular color");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "colordiff_factor", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "diffuse_color_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "colfac");
RNA_def_property_ui_range(prop, 0, 1, 10, 3);
RNA_def_property_ui_text(prop, "Diffuse Color Factor", "Amount texture affects diffuse color");
@@ -536,54 +536,54 @@ static void rna_def_material_mtex(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Material_update");
/* volume material */
- prop= RNA_def_property(srna, "map_coloremission", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_color_emission", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_EMISSION_COL);
RNA_def_property_ui_text(prop, "Emission Color", "Causes the texture to affect the color of emission");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "map_colorreflection", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_color_reflection", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_REFLECTION_COL);
RNA_def_property_ui_text(prop, "Reflection Color", "Causes the texture to affect the color of scattered light");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "map_colortransmission", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_color_transmission", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_TRANSMISSION_COL);
RNA_def_property_ui_text(prop, "Transmission Color", "Causes the texture to affect the result color after other light has been scattered/absorbed");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "map_density", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_density", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_DENSITY);
RNA_def_property_ui_text(prop, "Density", "Causes the texture to affect the volume's density");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "map_emission", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_emission", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_EMISSION);
RNA_def_property_ui_text(prop, "Emission", "Causes the texture to affect the volume's emission");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "map_scattering", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_scatter", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_SCATTERING);
RNA_def_property_ui_text(prop, "Scattering", "Causes the texture to affect the volume's scattering");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "map_reflection", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_reflect", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_REFLECTION);
RNA_def_property_ui_text(prop, "Reflection", "Causes the texture to affect the reflected light's brightness");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "coloremission_factor", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "color_emission_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "colemitfac");
RNA_def_property_ui_range(prop, 0, 1, 10, 3);
RNA_def_property_ui_text(prop, "Emission Color Factor", "Amount texture affects emission color");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "colorreflection_factor", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "reflection_color_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "colreflfac");
RNA_def_property_ui_range(prop, 0, 1, 10, 3);
RNA_def_property_ui_text(prop, "Reflection Color Factor", "Amount texture affects color of out-scattered light");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "colortransmission_factor", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "transmission_color_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "coltransfac");
RNA_def_property_ui_range(prop, 0, 1, 10, 3);
RNA_def_property_ui_text(prop, "Transmission Color Factor", "Amount texture affects result color after light has been scattered/absorbed");
@@ -615,14 +615,14 @@ static void rna_def_material_mtex(BlenderRNA *brna)
/* end volume material */
- prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_funcs(prop, "rna_MaterialTextureSlot_enabled_get", "rna_MaterialTextureSlot_enabled_set");
+ prop= RNA_def_property(srna, "use", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_MaterialTextureSlot_use_get", "rna_MaterialTextureSlot_use_set");
RNA_def_property_ui_text(prop, "Enabled", "Enable this material texture slot");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "new_bump", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "texflag", MTEX_NEW_BUMP);
- RNA_def_property_ui_text(prop, "New Bump", "Use new, corrected bump mapping code (backwards compatibility option)");
+ prop= RNA_def_property(srna, "use_old_bump", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "texflag", MTEX_NEW_BUMP);
+ RNA_def_property_ui_text(prop, "Old Bump", "Use old bump mapping (backwards compatibility option)");
RNA_def_property_update(prop, 0, "rna_Material_update");
}
@@ -799,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);
@@ -823,7 +823,7 @@ static void rna_def_material_raymirror(BlenderRNA *brna)
RNA_def_struct_nested(brna, srna, "Material");
RNA_def_struct_ui_text(srna, "Material Raytrace Mirror", "Raytraced reflection settings for a Material datablock");
- prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_RAYMIRROR); /* use bitflags */
RNA_def_property_ui_text(prop, "Enabled", "Enable raytraced reflections");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -870,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");
@@ -935,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");
@@ -947,7 +947,7 @@ static void rna_def_material_raytra(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Filter", "Amount to blend in the material's diffuse color in raytraced transparency (simulating absorption)");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "limit", PROP_FLOAT, PROP_DISTANCE);
+ prop= RNA_def_property(srna, "depth_max", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "tx_limit");
RNA_def_property_range(prop, 0.0f, 100.0f);
RNA_def_property_ui_text(prop, "Limit", "Maximum depth for light to travel through the transparent material before becoming fully filtered (0.0 is disabled)");
@@ -984,7 +984,7 @@ static void rna_def_material_volume(BlenderRNA *brna)
RNA_def_struct_nested(brna, srna, "Material");
RNA_def_struct_ui_text(srna, "Material Volume", "Volume rendering settings for a Material datablock");
- prop= RNA_def_property(srna, "step_calculation", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "step_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "stepsize_type");
RNA_def_property_enum_items(prop, prop_stepsize_items);
RNA_def_property_ui_text(prop, "Step Calculation", "Method of calculating the steps through the volume");
@@ -997,18 +997,18 @@ static void rna_def_material_volume(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Step Size", "Distance between subsequent volume depth samples");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "lighting_mode", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "light_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "shade_type");
RNA_def_property_enum_items(prop, prop_lighting_items);
RNA_def_property_ui_text(prop, "Lighting Mode", "Method of shading, attenuating, and scattering light through the volume");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "external_shadows", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_external_shadows", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shadeflag", MA_VOL_RECV_EXT_SHADOW); /* use bitflags */
RNA_def_property_ui_text(prop, "External Shadows", "Receive shadows from sources outside the volume (temporary)");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "light_cache", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_light_cache", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shadeflag", MA_VOL_PRECACHESHADING); /* use bitflags */
RNA_def_property_ui_text(prop, "Light Cache", "Pre-calculate the shading information into a voxel grid, speeds up shading at slightly less accuracy");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -1038,7 +1038,7 @@ static void rna_def_material_volume(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Intensity", "Multiplier for multiple scattered light energy");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "depth_cutoff", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "depth_threshold", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "depth_cutoff");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Depth Cutoff", "Stop ray marching early if transmission drops below this luminance - higher values give speedups in dense volumes at the expense of accuracy");
@@ -1132,19 +1132,19 @@ static void rna_def_material_halo(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Add", "Sets the strength of the add effect");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "rings", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "ring_count", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "ringc");
RNA_def_property_range(prop, 0, 24);
RNA_def_property_ui_text(prop, "Rings", "Sets the number of rings rendered over the halo");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "line_number", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "line_count", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "linec");
RNA_def_property_range(prop, 0, 250);
RNA_def_property_ui_text(prop, "Line Number", "Sets the number of star shaped lines rendered over the halo");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "star_tips", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "star_tip_count", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "starc");
RNA_def_property_range(prop, 3, 50);
RNA_def_property_ui_text(prop, "Star Tips", "Sets the number of points on the star shaped halo");
@@ -1156,7 +1156,7 @@ static void rna_def_material_halo(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Seed", "Randomizes ring dimension and line location");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "flare_mode", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_flare_mode", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO_FLARE); /* use bitflags */
RNA_def_property_ui_text(prop, "Flare", "Renders halo as a lensflare");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -1167,7 +1167,7 @@ static void rna_def_material_halo(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Flare Size", "Sets the factor by which the flare is larger than the halo");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "flare_subsize", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "flare_subflare_size", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "subsize");
RNA_def_property_range(prop, 0.1f, 25.0f);
RNA_def_property_ui_text(prop, "Flare Subsize", "Sets the dimension of the subflares, dots and circles");
@@ -1185,48 +1185,48 @@ static void rna_def_material_halo(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Flare Seed", "Specifies an offset in the flare seed table");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "flares_sub", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "flare_subflare_count", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "flarec");
RNA_def_property_range(prop, 1, 32);
RNA_def_property_ui_text(prop, "Flares Sub", "Sets the number of subflares");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "ring", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_ring", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO_RINGS);
RNA_def_property_ui_text(prop, "Rings", "Renders rings over halo");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "lines", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_lines", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO_LINES);
RNA_def_property_ui_text(prop, "Lines", "Renders star shaped lines over halo");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "star", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_star", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_STAR);
RNA_def_property_ui_text(prop, "Star", "Renders halo as a star");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "texture", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_texture", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALOTEX);
RNA_def_property_ui_text(prop, "Texture", "Gives halo a texture");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "vertex_normal", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_vertex_normal", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALOPUNO);
RNA_def_property_ui_text(prop, "Vertex Normal", "Uses the vertex normal to specify the dimension of the halo");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "xalpha", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_extreme_alpha", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO_XALPHA);
RNA_def_property_ui_text(prop, "Extreme Alpha", "Uses extreme alpha");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "shaded", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_shaded", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO_SHADE);
RNA_def_property_ui_text(prop, "Shaded", "Lets halo receive light and shadows from external objects");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "soft", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_soft", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO_SOFT);
RNA_def_property_ui_text(prop, "Soft", "Softens the edges of halos at intersections with other geometry");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -1254,7 +1254,7 @@ static void rna_def_material_sss(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Color", "Scattering color");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "error_tolerance", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "error_threshold", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "sss_error");
RNA_def_property_ui_range(prop, 0.0001, 10, 1, 3);
RNA_def_property_ui_text(prop, "Error Tolerance", "Error tolerance (low values are slower and higher quality)");
@@ -1296,7 +1296,7 @@ static void rna_def_material_sss(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Back", "Back scattering weight");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "sss_flag", MA_DIFF_SSS);
RNA_def_property_ui_text(prop, "Enabled", "Enable diffuse subsurface scatting effects in a material");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -1352,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);
@@ -1372,12 +1372,12 @@ static void rna_def_material_strand(BlenderRNA *brna)
RNA_def_struct_nested(brna, srna, "Material");
RNA_def_struct_ui_text(srna, "Material Strand", "Strand settings for a Material datablock");
- prop= RNA_def_property(srna, "tangent_shading", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_tangent_shading", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_TANGENT_STR);
RNA_def_property_ui_text(prop, "Tangent Shading", "Uses direction of strands as normal for tangent-shading");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "surface_diffuse", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_surface_diffuse", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_STR_SURFDIFF);
RNA_def_property_ui_text(prop, "Surface Diffuse", "Make diffuse shading more similar to shading the surface");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -1388,7 +1388,7 @@ static void rna_def_material_strand(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Blend Distance", "Worldspace distance over which to blend in the surface normal");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "blender_units", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_blender_units", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_STR_B_UNITS);
RNA_def_property_ui_text(prop, "Blender Units", "Use Blender units for widths instead of pixels");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -1407,7 +1407,7 @@ static void rna_def_material_strand(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Tip Size", "End size of strands in pixels or Blender units");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "min_size", PROP_FLOAT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "size_min", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_float_sdna(prop, NULL, "strand_min");
RNA_def_property_range(prop, 0.001, 10);
RNA_def_property_ui_text(prop, "Minimum Size", "Minimum size of strands in pixels");
@@ -1441,14 +1441,14 @@ static void rna_def_material_physics(BlenderRNA *brna)
RNA_def_struct_nested(brna, srna, "Material");
RNA_def_struct_ui_text(srna, "Material Physics", "Physics settings for a Material datablock");
- prop= RNA_def_property(srna, "align_to_normal", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_normal_align", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dynamode", MA_FH_NOR);
RNA_def_property_ui_text(prop, "Align to Normal", "Align dynamic game objects along the surface normal, when inside the physics distance area");
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");
@@ -1465,7 +1465,7 @@ static void rna_def_material_physics(BlenderRNA *brna)
RNA_def_property_range(prop, 0, 20);
RNA_def_property_ui_text(prop, "Distance", "Distance of the physics area");
- prop= RNA_def_property(srna, "damp", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "damping", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "xyfrict");
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_text(prop, "Damping", "Damping of the spring force, when inside the physics distance area");
@@ -1508,7 +1508,7 @@ void RNA_def_material(BlenderRNA *brna)
RNA_def_property_enum_funcs(prop, NULL, "rna_Material_type_set", NULL);
RNA_def_property_update(prop, 0, "rna_Material_draw_update");
- prop= RNA_def_property(srna, "transparency", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_transparency", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_TRANSP);
RNA_def_property_ui_text(prop, "Transparency", "Render material as transparent");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -1543,12 +1543,12 @@ void RNA_def_material(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Translucency", "Amount of diffuse shading on the back side");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "cubic", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_cubic", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shade_flag", MA_CUBIC);
RNA_def_property_ui_text(prop, "Cubic Interpolation", "Use cubic interpolation for diffuse values, for smoother transitions");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "object_color", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_object_color", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shade_flag", MA_OBCOLOR);
RNA_def_property_ui_text(prop, "Object Color", "Modulate the result with a per-object color");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -1563,7 +1563,7 @@ void RNA_def_material(BlenderRNA *brna)
RNA_def_property_range(prop, 0, 10);
RNA_def_property_ui_text(prop, "Shadow Buffer Bias", "Factor to multiply shadow buffer bias with (0 is ignore.)");
- prop= RNA_def_property(srna, "shadow_casting_alpha", PROP_FLOAT, PROP_FACTOR);
+ prop= RNA_def_property(srna, "shadow_cast_alpha", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "shad_alpha");
RNA_def_property_range(prop, 0.001, 1);
RNA_def_property_ui_text(prop, "Shadow Casting Alpha", "Shadow casting alpha, in use for Irregular and Deep shadow buffer");
@@ -1578,32 +1578,32 @@ void RNA_def_material(BlenderRNA *brna)
/* flags */
- prop= RNA_def_property(srna, "light_group_exclusive", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_light_group_exclusive", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_GROUP_NOLAY);
RNA_def_property_ui_text(prop, "Light Group Exclusive", "Material uses the light group exclusively - these lamps are excluded from other scene lighting");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "traceable", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_raytrace", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_TRACEBLE);
RNA_def_property_ui_text(prop, "Traceable", "Include this material and geometry that uses it in ray tracing calculations");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "shadows", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_shadows", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_SHADOW);
RNA_def_property_ui_text(prop, "Shadows", "Allows this material to receive shadows");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "shadeless", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_shadeless", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_SHLESS);
RNA_def_property_ui_text(prop, "Shadeless", "Makes this material insensitive to light or shadow");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "vertex_color_light", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_vertex_color_light", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_VERTEXCOL);
RNA_def_property_ui_text(prop, "Vertex Color Light", "Add vertex colors as additional lighting");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "vertex_color_paint", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_vertex_color_paint", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_VERTEXCOLP);
RNA_def_property_ui_text(prop, "Vertex Color Paint", "Replaces object base color with vertex colors (multiplies with 'texture face' face assigned textures)");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -1613,7 +1613,7 @@ void RNA_def_material(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Invert Z Depth", "Renders material's faces with an inverted Z buffer (scanline only)");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "z_offset", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "offset_z", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "zoffs");
RNA_def_property_ui_text(prop, "Z Offset", "Gives faces an artificial offset in the Z buffer for Z transparency");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -1623,57 +1623,57 @@ void RNA_def_material(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Sky", "Renders this material with zero alpha, with sky background in place (scanline only)");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "only_shadow", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_only_shadow", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_ONLYSHADOW);
RNA_def_property_ui_text(prop, "Only Shadow", "Renders shadows as the material's alpha value, making materials transparent except for shadowed areas");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "face_texture", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_face_texture", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_FACETEXTURE);
RNA_def_property_ui_text(prop, "Face Textures", "Replaces the object's base color with color from face assigned image textures");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "face_texture_alpha", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_face_texture_alpha", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_FACETEXTURE_ALPHA);
RNA_def_property_ui_text(prop, "Face Textures Alpha", "Replaces the object's base alpha value with alpha from face assigned image textures");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "cast_shadows_only", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_cast_shadows_only", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_ONLYCAST);
RNA_def_property_ui_text(prop, "Cast Shadows Only", "Makes objects with this material appear invisible, only casting shadows (not rendered)");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "exclude_mist", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_NOMIST);
- RNA_def_property_ui_text(prop, "Exclude Mist", "Excludes this material from mist effects (in world settings)");
+ prop= RNA_def_property(srna, "use_mist", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "mode", MA_NOMIST);
+ RNA_def_property_ui_text(prop, "Use Mist", "Use mist with this material (in world settings)");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "receive_transparent_shadows", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_transparent_shadows", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_SHADOW_TRA);
RNA_def_property_ui_text(prop, "Receive Transparent Shadows", "Allow this object to receive transparent shadows casted through other objects");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "ray_shadow_bias", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_ray_shadow_bias", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_RAYBIAS);
RNA_def_property_ui_text(prop, "Ray Shadow Bias", "Prevents raytraced shadow errors on surfaces with smooth shaded normals (terminator problem)");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "full_oversampling", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_full_oversampling", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_FULL_OSA);
RNA_def_property_ui_text(prop, "Full Oversampling", "Force this material to render full shading/textures for all anti-aliasing samples");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "cast_buffer_shadows", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_cast_buffer_shadows", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_SHADBUF);
RNA_def_property_ui_text(prop, "Cast Buffer Shadows", "Allow this material to cast shadows from shadow buffer lamps");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "cast_approximate", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_cast_approximate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shade_flag", MA_APPROX_OCCLUSION);
RNA_def_property_ui_text(prop, "Cast Approximate", "Allow this material to cast shadows when using approximate ambient occlusion.");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "tangent_shading", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_tangent_shading", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_TANGENT_V);
RNA_def_property_ui_text(prop, "Tangent Shading", "Use the material's tangent vector instead of the normal for shading - for anisotropic shading effects");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -1682,13 +1682,13 @@ void RNA_def_material(BlenderRNA *brna)
prop= RNA_def_property(srna, "raytrace_mirror", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "MaterialRaytraceMirror");
- RNA_def_property_pointer_funcs(prop, "rna_Material_mirror_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Material_mirror_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Raytrace Mirror", "Raytraced reflection settings for the material");
prop= RNA_def_property(srna, "raytrace_transparency", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "MaterialRaytraceTransparency");
- RNA_def_property_pointer_funcs(prop, "rna_Material_transp_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Material_transp_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Raytrace Transparency", "Raytraced transparency settings for the material");
prop= RNA_def_property(srna, "volume", PROP_POINTER, PROP_NONE);
@@ -1700,25 +1700,25 @@ void RNA_def_material(BlenderRNA *brna)
prop= RNA_def_property(srna, "halo", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "MaterialHalo");
- RNA_def_property_pointer_funcs(prop, "rna_Material_halo_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Material_halo_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Halo", "Halo settings for the material");
prop= RNA_def_property(srna, "subsurface_scattering", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "MaterialSubsurfaceScattering");
- RNA_def_property_pointer_funcs(prop, "rna_Material_sss_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Material_sss_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Subsurface Scattering", "Subsurface scattering settings for the material");
prop= RNA_def_property(srna, "strand", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "MaterialStrand");
- RNA_def_property_pointer_funcs(prop, "rna_Material_strand_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Material_strand_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Strand", "Strand settings for the material");
prop= RNA_def_property(srna, "physics", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "MaterialPhysics");
- RNA_def_property_pointer_funcs(prop, "rna_Material_physics_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Material_physics_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Physics", "Game physics settings");
/* nodetree */
@@ -1735,7 +1735,7 @@ void RNA_def_material(BlenderRNA *brna)
prop= RNA_def_property(srna, "active_node_material", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Material");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_pointer_funcs(prop, "rna_Material_active_node_material_get", "rna_Material_active_node_material_set", NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Material_active_node_material_get", "rna_Material_active_node_material_set", NULL, NULL);
RNA_def_property_ui_text(prop, "Material", "Active node material");
RNA_def_property_update(prop, NC_MATERIAL, NULL);
@@ -1781,7 +1781,7 @@ void rna_def_mtex_common(StructRNA *srna, const char *begin, const char *activeg
prop= RNA_def_property(srna, "active_texture", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Texture");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_pointer_funcs(prop, activeget, activeset, NULL);
+ RNA_def_property_pointer_funcs(prop, activeget, activeset, NULL, NULL);
RNA_def_property_ui_text(prop, "Active Texture", "Active texture slot being displayed");
RNA_def_property_update(prop, 0, update);
diff --git a/source/blender/makesrna/intern/rna_material_api.c b/source/blender/makesrna/intern/rna_material_api.c
index 03eba157bf3..d271b3b374c 100644
--- a/source/blender/makesrna/intern/rna_material_api.c
+++ b/source/blender/makesrna/intern/rna_material_api.c
@@ -42,7 +42,7 @@
Adds material to the first free texture slot.
If all slots are busy, replaces the first.
*/
-static void rna_Material_add_texture(Material *ma, Tex *tex, int mapto, int texco)
+static void rna_Material_add_texture(Material *ma, Tex *tex, int texco, int mapto)
{
int i;
MTex *mtex;
@@ -71,8 +71,8 @@ static void rna_Material_add_texture(Material *ma, Tex *tex, int mapto, int texc
if (tex)
id_us_plus(&tex->id);
- mtex->texco= mapto;
- mtex->mapto= texco;
+ mtex->texco= texco;
+ mtex->mapto= mapto;
}
#else
@@ -119,8 +119,9 @@ void RNA_api_material(StructRNA *srna)
RNA_def_function_ui_description(func, "Add a texture to material's free texture slot.");
parm= RNA_def_pointer(func, "texture", "Texture", "Texture", "Texture to add.");
RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_enum(func, "texture_coordinates", prop_texture_coordinates_items, TEXCO_UV, "", "Source of texture coordinate information."); /* optional */
+ parm= RNA_def_enum(func, "texture_coords", prop_texture_coordinates_items, TEXCO_UV, "", "Source of texture coordinate information."); /* optional */
parm= RNA_def_enum(func, "map_to", prop_texture_mapto_items, MAP_COL, "", "Controls which material property the texture affects."); /* optional */
+ RNA_def_property_flag(parm, PROP_ENUM_FLAG);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c
index ce8001c8ecd..741b5cbab81 100644
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@ -33,6 +33,8 @@
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#include "WM_types.h"
+
#ifdef RNA_RUNTIME
#include "DNA_scene_types.h"
@@ -46,6 +48,8 @@
#include "BKE_mesh.h"
#include "BKE_utildefines.h"
+#include "ED_mesh.h" /* XXX Bad level call */
+
#include "WM_api.h"
#include "WM_types.h"
@@ -53,22 +57,29 @@ static void rna_Mesh_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
{
ID *id= ptr->id.data;
- DAG_id_flush_update(id, OB_RECALC_DATA);
- WM_main_add_notifier(NC_GEOM|ND_DATA, id);
+ /* cheating way for importers to avoid slow updates */
+ if(id->us > 0) {
+ DAG_id_flush_update(id, OB_RECALC_DATA);
+ WM_main_add_notifier(NC_GEOM|ND_DATA, id);
+ }
}
static void rna_Mesh_update_select(Main *bmain, Scene *scene, PointerRNA *ptr)
{
ID *id= ptr->id.data;
-
- WM_main_add_notifier(NC_GEOM|ND_SELECT, id);
+ /* cheating way for importers to avoid slow updates */
+ if(id->us > 0) {
+ WM_main_add_notifier(NC_GEOM|ND_SELECT, id);
+ }
}
void rna_Mesh_update_draw(Main *bmain, Scene *scene, PointerRNA *ptr)
{
ID *id= ptr->id.data;
-
- WM_main_add_notifier(NC_GEOM|ND_DATA, id);
+ /* cheating way for importers to avoid slow updates */
+ if(id->us > 0) {
+ WM_main_add_notifier(NC_GEOM|ND_DATA, id);
+ }
}
static void rna_MeshVertex_normal_get(PointerRNA *ptr, float *value)
@@ -224,6 +235,40 @@ static int rna_Mesh_texspace_editable(PointerRNA *ptr)
return (me->texflag & AUTOSPACE)? 0: PROP_EDITABLE;
}
+static void rna_Mesh_texspace_loc_get(PointerRNA *ptr, float *values)
+{
+ Mesh *me= (Mesh *)ptr->data;
+
+ if (!me->bb)
+ tex_space_mesh(me);
+
+ copy_v3_v3(values, me->loc);
+}
+
+static void rna_Mesh_texspace_loc_set(PointerRNA *ptr, const float *values)
+{
+ Mesh *me= (Mesh *)ptr->data;
+
+ copy_v3_v3(me->loc, values);
+}
+
+static void rna_Mesh_texspace_size_get(PointerRNA *ptr, float *values)
+{
+ Mesh *me= (Mesh *)ptr->data;
+
+ if (!me->bb)
+ tex_space_mesh(me);
+
+ copy_v3_v3(values, me->size);
+}
+
+static void rna_Mesh_texspace_size_set(PointerRNA *ptr, const float *values)
+{
+ Mesh *me= (Mesh *)ptr->data;
+
+ copy_v3_v3(me->size, values);
+}
+
static void rna_MeshVertex_groups_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
Mesh *me= (Mesh*)ptr->id.data;
@@ -458,6 +503,22 @@ static void rna_Mesh_active_uv_texture_index_range(PointerRNA *ptr, int *min, in
*max= MAX2(0, *max);
}
+static PointerRNA rna_Mesh_active_mtface_get(PointerRNA *ptr)
+{
+ Mesh *me= (Mesh*)ptr->data;
+ EditMesh *em= BKE_mesh_get_editmesh(me);
+ MTFace *tf;
+
+ if (em && EM_texFaceCheck(em))
+ {
+ tf = EM_get_active_mtface(em, NULL, NULL, 1);
+
+ return rna_pointer_inherit_refine(ptr, &RNA_MeshTextureFace, tf);
+ }
+
+ return rna_pointer_inherit_refine(ptr, &RNA_MeshTextureFace, NULL);
+}
+
static void rna_MeshTextureFace_uv1_get(PointerRNA *ptr, float *values)
{
MTFace *mtface= (MTFace*)ptr->data;
@@ -527,8 +588,7 @@ static int rna_CustomDataData_numverts(PointerRNA *ptr, int type)
Mesh *me= (Mesh*)ptr->id.data;
CustomData *fdata= rna_mesh_fdata(me);
CustomDataLayer *cdl;
- int a;
- size_t b;
+ int a, b;
for(cdl=fdata->layers, a=0; a<fdata->totlayer; cdl++, a++) {
if(cdl->type == type) {
@@ -925,8 +985,7 @@ static char *rna_CustomDataData_path(PointerRNA *ptr, char *collection, int type
Mesh *me= (Mesh*)ptr->id.data;
CustomData *fdata= rna_mesh_fdata(me);
CustomDataLayer *cdl;
- int a;
- size_t b;
+ int a, b;
for(cdl=fdata->layers, a=0; a<fdata->totlayer; cdl++, a++) {
if(cdl->type == type) {
@@ -966,7 +1025,7 @@ static char *rna_MeshIntPropertyLayer_path(PointerRNA *ptr)
static char *rna_MeshIntProperty_path(PointerRNA *ptr)
{
- return rna_CustomDataData_path(ptr, "int_layers", CD_MCOL);
+ return rna_CustomDataData_path(ptr, "layers_int", CD_MCOL);
}
static char *rna_MeshFloatPropertyLayer_path(PointerRNA *ptr)
@@ -976,7 +1035,7 @@ static char *rna_MeshFloatPropertyLayer_path(PointerRNA *ptr)
static char *rna_MeshFloatProperty_path(PointerRNA *ptr)
{
- return rna_CustomDataData_path(ptr, "float_layers", CD_MCOL);
+ return rna_CustomDataData_path(ptr, "layers_float", CD_MCOL);
}
static char *rna_MeshStringPropertyLayer_path(PointerRNA *ptr)
@@ -986,7 +1045,7 @@ static char *rna_MeshStringPropertyLayer_path(PointerRNA *ptr)
static char *rna_MeshStringProperty_path(PointerRNA *ptr)
{
- return rna_CustomDataData_path(ptr, "string_layers", CD_MCOL);
+ return rna_CustomDataData_path(ptr, "layers_string", CD_MCOL);
}
static int rna_Mesh_tot_vert_get(PointerRNA *ptr)
@@ -1005,6 +1064,34 @@ static int rna_Mesh_tot_face_get(PointerRNA *ptr)
return me->edit_mesh ? me->edit_mesh->totfacesel : 0;
}
+static CustomDataLayer *rna_Mesh_vertex_color_new(struct Mesh *me, struct bContext *C, char *name)
+{
+ CustomData *fdata;
+ CustomDataLayer *cdl= NULL;
+ int index;
+
+ if(ED_mesh_color_add(C, NULL, NULL, me, name, FALSE)) {
+ fdata= rna_mesh_fdata(me);
+ index= CustomData_get_named_layer_index(fdata, CD_MCOL, name);
+ cdl= (index == -1)? NULL: &fdata->layers[index];
+ }
+ return cdl;
+}
+
+static CustomDataLayer *rna_Mesh_uv_texture_new(struct Mesh *me, struct bContext *C, char *name)
+{
+ CustomData *fdata;
+ CustomDataLayer *cdl= NULL;
+ int index;
+
+ if(ED_mesh_uv_texture_add(C, NULL, NULL, me, name, FALSE)) {
+ fdata= rna_mesh_fdata(me);
+ index= CustomData_get_named_layer_index(fdata, CD_MTFACE, name);
+ cdl= (index == -1)? NULL: &fdata->layers[index];
+ }
+ return cdl;
+}
+
#else
static void rna_def_mvert_group(BlenderRNA *brna)
@@ -1052,14 +1139,14 @@ static void rna_def_mvert(BlenderRNA *brna)
RNA_def_property_float_funcs(prop, "rna_MeshVertex_normal_get", "rna_MeshVertex_normal_set", NULL);
RNA_def_property_ui_text(prop, "Normal", "Vertex Normal");
- prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SELECT);
- RNA_def_property_ui_text(prop, "Selected", "");
+ RNA_def_property_ui_text(prop, "Select", "");
RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
- prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_HIDE);
- RNA_def_property_ui_text(prop, "Hidden", "");
+ RNA_def_property_ui_text(prop, "Hide", "");
RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
prop= RNA_def_property(srna, "bevel_weight", PROP_FLOAT, PROP_NONE);
@@ -1089,7 +1176,7 @@ static void rna_def_medge(BlenderRNA *brna)
RNA_def_struct_path_func(srna, "rna_MeshEdge_path");
RNA_def_struct_ui_icon(srna, ICON_EDGESEL);
- prop= RNA_def_property(srna, "verts", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "vertices", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "v1");
RNA_def_property_array(prop, 2);
RNA_def_property_ui_text(prop, "Vertices", "Vertex indices");
@@ -1105,34 +1192,32 @@ static void rna_def_medge(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Bevel Weight", "Weight used by the Bevel modifier");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SELECT);
- RNA_def_property_ui_text(prop, "Selected", "");
+ RNA_def_property_ui_text(prop, "Select", "");
RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
- prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_HIDE);
- RNA_def_property_ui_text(prop, "Hidden", "");
+ RNA_def_property_ui_text(prop, "Hide", "");
RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
- prop= RNA_def_property(srna, "seam", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_seam", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_SEAM);
RNA_def_property_ui_text(prop, "Seam", "Seam edge for UV unwrapping");
RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
- prop= RNA_def_property(srna, "sharp", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_edge_sharp", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_SHARP);
RNA_def_property_ui_text(prop, "Sharp", "Sharp edge for the EdgeSplit modifier");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "loose", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_loose", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_LOOSEEDGE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Loose", "Loose edge");
- prop= RNA_def_property(srna, "fgon", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_fgon", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_FGON);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Fgon", "Fgon edge");
prop= RNA_def_property(srna, "index", PROP_INT, PROP_UNSIGNED);
@@ -1153,7 +1238,7 @@ static void rna_def_mface(BlenderRNA *brna)
RNA_def_struct_ui_icon(srna, ICON_FACESEL);
// XXX allows creating invalid meshes
- prop= RNA_def_property(srna, "verts", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "vertices", PROP_INT, PROP_UNSIGNED);
RNA_def_property_array(prop, 4);
RNA_def_property_flag(prop, PROP_DYNAMIC);
RNA_def_property_dynamic_array_funcs(prop, "rna_MeshFace_verts_get_length");
@@ -1161,7 +1246,7 @@ static void rna_def_mface(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Vertices", "Vertex indices");
/* leaving this fixed size array for foreach_set used in import scripts */
- prop= RNA_def_property(srna, "verts_raw", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "vertices_raw", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "v1");
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Vertices", "Fixed size vertex indices array");
@@ -1172,17 +1257,17 @@ static void rna_def_mface(BlenderRNA *brna)
RNA_def_property_int_funcs(prop, NULL, NULL, "rna_MeshFace_material_index_range");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_FACE_SEL);
- RNA_def_property_ui_text(prop, "Selected", "");
+ RNA_def_property_ui_text(prop, "Select", "");
RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
- prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_HIDE);
- RNA_def_property_ui_text(prop, "Hidden", "");
+ RNA_def_property_ui_text(prop, "Hide", "");
RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
- prop= RNA_def_property(srna, "smooth", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_smooth", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_SMOOTH);
RNA_def_property_ui_text(prop, "Smooth", "");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
@@ -1259,83 +1344,84 @@ static void rna_def_mtface(BlenderRNA *brna)
prop= RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "tpage");
- RNA_def_property_pointer_funcs(prop, NULL, "rna_TextureFace_image_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_TextureFace_image_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Image", "");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "tex", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_image", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_TEX);
RNA_def_property_ui_text(prop, "Tex", "Render face with texture");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "light", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_light", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_LIGHT);
RNA_def_property_ui_text(prop, "Light", "Use light for face");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "invisible", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_INVISIBLE);
RNA_def_property_ui_text(prop, "Invisible", "Make face invisible");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "collision", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_collision", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_DYNAMIC);
RNA_def_property_ui_text(prop, "Collision", "Use face for collision and ray-sensor detection");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "shared", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_blend_shared", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_SHAREDCOL);
RNA_def_property_ui_text(prop, "Shared", "Blend vertex colors across face when vertices are shared");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "twoside", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_twoside", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_TWOSIDE);
- RNA_def_property_ui_text(prop, "Twoside", "Render face twosided");
+ RNA_def_property_ui_text(prop, "Two-side", "Render face two-sided");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "object_color", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_object_color", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_OBCOL);
RNA_def_property_ui_text(prop, "Object Color", "Use ObColor instead of vertex colors");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "halo", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_halo", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_BILLBOARD);
RNA_def_property_ui_text(prop, "Halo", "Screen aligned billboard");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "billboard", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_billboard", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_BILLBOARD2);
RNA_def_property_ui_text(prop, "Billboard", "Billboard with Z-axis constraint");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "shadow", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_shadow_cast", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_SHADOW);
RNA_def_property_ui_text(prop, "Shadow", "Face is used for shadow");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "text", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_bitmap_text", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_BMFONT);
RNA_def_property_ui_text(prop, "Text", "Enable bitmap text on face");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "alpha_sort", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_alpha_sort", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_ALPHASORT);
RNA_def_property_ui_text(prop, "Alpha Sort", "Enable sorting of faces for correct alpha drawing (slow, use Clip Alpha instead when possible)");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "transp", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "blend_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "transp");
RNA_def_property_enum_items(prop, transp_items);
RNA_def_property_ui_text(prop, "Transparency", "Transparency blending mode");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "uv_selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select_uv", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TF_SEL1);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "UV Selected", "");
RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
- prop= RNA_def_property(srna, "uv_pinned", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "pin_uv", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "unwrap", TF_PIN1);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "UV Pinned", "");
@@ -1546,50 +1632,52 @@ static void rna_def_mproperties(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
}
-void rna_def_texmat_common(StructRNA *srna, const char *texspace_editable)
+/* mesh.vertices */
+static void rna_def_mesh_vertices(BlenderRNA *brna, PropertyRNA *cprop)
{
- PropertyRNA *prop;
+ StructRNA *srna;
+// PropertyRNA *prop;
- /* texture space */
- prop= RNA_def_property(srna, "auto_texspace", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "texflag", AUTOSPACE);
- RNA_def_property_ui_text(prop, "Auto Texture Space", "Adjusts active object's texture space automatically when transforming object");
+ FunctionRNA *func;
+ PropertyRNA *parm;
- prop= RNA_def_property(srna, "texspace_loc", PROP_FLOAT, PROP_TRANSLATION);
- RNA_def_property_float_sdna(prop, NULL, "loc");
- RNA_def_property_ui_text(prop, "Texure Space Location", "Texture space location");
- RNA_def_property_editable_func(prop, texspace_editable);
- RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
+ RNA_def_property_srna(cprop, "MeshVertices");
+ srna= RNA_def_struct(brna, "MeshVertices", NULL);
+ RNA_def_struct_sdna(srna, "Mesh");
+ RNA_def_struct_ui_text(srna, "Mesh Vertices", "Collection of mesh vertices");
- prop= RNA_def_property(srna, "texspace_size", PROP_FLOAT, PROP_XYZ);
- RNA_def_property_float_sdna(prop, NULL, "size");
- RNA_def_property_ui_text(prop, "Texture Space Size", "Texture space size");
- RNA_def_property_editable_func(prop, texspace_editable);
- RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
+ func= RNA_def_function(srna, "add", "ED_mesh_vertices_add");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of vertices to add.", 0, INT_MAX);
+}
- /* 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_Mesh_update_draw");*/
+/* mesh.edges */
+static void rna_def_mesh_edges(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+// PropertyRNA *prop;
- /* 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", "");
-}
+ FunctionRNA *func;
+ PropertyRNA *parm;
+ RNA_def_property_srna(cprop, "MeshEdges");
+ srna= RNA_def_struct(brna, "MeshEdges", NULL);
+ RNA_def_struct_sdna(srna, "Mesh");
+ RNA_def_struct_ui_text(srna, "Mesh Edges", "Collection of mesh edges");
+
+ func= RNA_def_function(srna, "add", "ED_mesh_edges_add");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of vertices to add.", 0, INT_MAX);
+}
-/* scene.objects */
+/* mesh.faces */
static void rna_def_mesh_faces(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
PropertyRNA *prop;
-// FunctionRNA *func;
-// PropertyRNA *parm;
+ FunctionRNA *func;
+ PropertyRNA *parm;
RNA_def_property_srna(cprop, "MeshFaces");
srna= RNA_def_struct(brna, "MeshFaces", NULL);
@@ -1599,6 +1687,120 @@ static void rna_def_mesh_faces(BlenderRNA *brna, PropertyRNA *cprop)
prop= RNA_def_property(srna, "active", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "act_face");
RNA_def_property_ui_text(prop, "Active Face", "The active face for this mesh");
+
+ prop= RNA_def_property(srna, "active_tface", PROP_POINTER, PROP_UNSIGNED);
+ RNA_def_property_struct_type(prop, "MeshTextureFace");
+ RNA_def_property_pointer_funcs(prop, "rna_Mesh_active_mtface_get", NULL, NULL, NULL);
+ RNA_def_property_ui_text(prop, "Active Texture Face", "Active Texture Face");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+
+ func= RNA_def_function(srna, "add", "ED_mesh_faces_add");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of vertices to add.", 0, INT_MAX);
+}
+
+/* mesh.vertex_colors */
+static void rna_def_vertex_colors(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "VertexColors");
+ srna= RNA_def_struct(brna, "VertexColors", NULL);
+ RNA_def_struct_sdna(srna, "Mesh");
+ RNA_def_struct_ui_text(srna, "Vertex Colors", "Collection of vertex colors");
+
+ func= RNA_def_function(srna, "new", "rna_Mesh_vertex_color_new");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+ RNA_def_function_ui_description(func, "Add a vertex color layer to Mesh.");
+ parm= RNA_def_string(func, "name", "UVTex", 0, "", "UV Texture name.");
+ parm= RNA_def_pointer(func, "layer", "MeshColorLayer", "", "The newly created layer.");
+ RNA_def_function_return(func, parm);
+
+/*
+ func= RNA_def_function(srna, "remove", "rna_Mesh_vertex_color_remove");
+ RNA_def_function_ui_description(func, "Remove a vertex color layer.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_pointer(func, "layer", "Layer", "", "The layer to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+*/
+ prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_UNSIGNED);
+ RNA_def_property_struct_type(prop, "MeshColorLayer");
+ RNA_def_property_pointer_funcs(prop, "rna_Mesh_active_vertex_color_get", "rna_Mesh_active_vertex_color_set", NULL, NULL);
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Active Vertex Color Layer", "Active vertex color layer");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+
+ prop= RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_funcs(prop, "rna_Mesh_active_vertex_color_index_get", "rna_Mesh_active_vertex_color_index_set", "rna_Mesh_active_vertex_color_index_range");
+ RNA_def_property_ui_text(prop, "Active Vertex Color Index", "Active vertex color index");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+}
+
+/* mesh.uv_layers */
+static void rna_def_uv_textures(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "UVTextures");
+ srna= RNA_def_struct(brna, "UVTextures", NULL);
+ RNA_def_struct_sdna(srna, "Mesh");
+ RNA_def_struct_ui_text(srna, "UV Textures", "Collection of uv textures");
+
+ func= RNA_def_function(srna, "new", "rna_Mesh_uv_texture_new");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+ RNA_def_function_ui_description(func, "Add a UV texture layer to Mesh.");
+ parm= RNA_def_string(func, "name", "UVTex", 0, "", "UV Texture name.");
+ parm= RNA_def_pointer(func, "layer", "MeshTextureFaceLayer", "", "The newly created layer.");
+ RNA_def_function_return(func, parm);
+
+/*
+ func= RNA_def_function(srna, "remove", "rna_Mesh_uv_layers_remove");
+ RNA_def_function_ui_description(func, "Remove a vertex color layer.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_pointer(func, "layer", "Layer", "", "The layer to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+*/
+ prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_UNSIGNED);
+ RNA_def_property_struct_type(prop, "MeshTextureFaceLayer");
+ RNA_def_property_pointer_funcs(prop, "rna_Mesh_active_uv_texture_get", "rna_Mesh_active_uv_texture_set", NULL, NULL);
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Active UV Texture", "Active UV texture");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+
+ prop= RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_funcs(prop, "rna_Mesh_active_uv_texture_index_get", "rna_Mesh_active_uv_texture_index_set", "rna_Mesh_active_uv_texture_index_range");
+ RNA_def_property_ui_text(prop, "Active UV Texture Index", "Active UV texture index");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+}
+
+/* mesh.materials */
+static void rna_def_mesh_materials(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ // PropertyRNA *prop;
+
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "MeshMaterials");
+ srna= RNA_def_struct(brna, "MeshMaterials", NULL);
+ RNA_def_struct_sdna(srna, "Mesh");
+ RNA_def_struct_ui_text(srna, "Mesh Materials", "Collection of materials");
+
+ func= RNA_def_function(srna, "link", "ED_mesh_material_link");
+ RNA_def_function_ui_description(func, "Add a new material to Mesh.");
+ parm= RNA_def_pointer(func, "material", "Material", "", "Material to add.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ /* TODO, unlink? */
}
@@ -1611,15 +1813,17 @@ static void rna_def_mesh(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Mesh", "Mesh datablock defining geometric surfaces");
RNA_def_struct_ui_icon(srna, ICON_MESH_DATA);
- prop= RNA_def_property(srna, "verts", PROP_COLLECTION, PROP_NONE);
+ prop= RNA_def_property(srna, "vertices", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "mvert", "totvert");
RNA_def_property_struct_type(prop, "MeshVertex");
RNA_def_property_ui_text(prop, "Vertices", "Vertices of the mesh");
+ rna_def_mesh_vertices(brna, prop);
prop= RNA_def_property(srna, "edges", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "medge", "totedge");
RNA_def_property_struct_type(prop, "MeshEdge");
RNA_def_property_ui_text(prop, "Edges", "Edges of the mesh");
+ rna_def_mesh_edges(brna, prop);
prop= RNA_def_property(srna, "faces", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "mface", "totface");
@@ -1636,7 +1840,7 @@ static void rna_def_mesh(BlenderRNA *brna)
prop= RNA_def_property(srna, "texture_mesh", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "texcomesh");
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
- RNA_def_property_ui_text(prop, "Texture Mesh", "Use another mesh for texture indicies (vertex indicies must be aligned)");
+ RNA_def_property_ui_text(prop, "Texture Mesh", "Use another mesh for texture indices (vertex indices must be aligned)");
/* UV textures */
prop= RNA_def_property(srna, "uv_textures", PROP_COLLECTION, PROP_NONE);
@@ -1644,22 +1848,11 @@ static void rna_def_mesh(BlenderRNA *brna)
RNA_def_property_collection_funcs(prop, "rna_Mesh_uv_textures_begin", 0, 0, 0, "rna_Mesh_uv_textures_length", 0, 0);
RNA_def_property_struct_type(prop, "MeshTextureFaceLayer");
RNA_def_property_ui_text(prop, "UV Textures", "");
-
- prop= RNA_def_property(srna, "active_uv_texture", PROP_POINTER, PROP_UNSIGNED);
- RNA_def_property_struct_type(prop, "MeshTextureFaceLayer");
- RNA_def_property_pointer_funcs(prop, "rna_Mesh_active_uv_texture_get", "rna_Mesh_active_uv_texture_set", NULL);
- RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Active UV Texture", "Active UV texture");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop= RNA_def_property(srna, "active_uv_texture_index", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_int_funcs(prop, "rna_Mesh_active_uv_texture_index_get", "rna_Mesh_active_uv_texture_index_set", "rna_Mesh_active_uv_texture_index_range");
- RNA_def_property_ui_text(prop, "Active UV Texture Index", "Active UV texture index");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+ rna_def_uv_textures(brna, prop);
prop= RNA_def_property(srna, "uv_texture_clone", PROP_POINTER, PROP_UNSIGNED);
RNA_def_property_struct_type(prop, "MeshTextureFaceLayer");
- RNA_def_property_pointer_funcs(prop, "rna_Mesh_uv_texture_clone_get", "rna_Mesh_uv_texture_clone_set", NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Mesh_uv_texture_clone_get", "rna_Mesh_uv_texture_clone_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Clone UV Texture", "UV texture to be used as cloning source");
@@ -1669,7 +1862,7 @@ static void rna_def_mesh(BlenderRNA *brna)
prop= RNA_def_property(srna, "uv_texture_stencil", PROP_POINTER, PROP_UNSIGNED);
RNA_def_property_struct_type(prop, "MeshTextureFaceLayer");
- RNA_def_property_pointer_funcs(prop, "rna_Mesh_uv_texture_stencil_get", "rna_Mesh_uv_texture_stencil_set", NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Mesh_uv_texture_stencil_get", "rna_Mesh_uv_texture_stencil_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Mask UV Texture", "UV texture to mask the painted area");
@@ -1684,51 +1877,36 @@ static void rna_def_mesh(BlenderRNA *brna)
RNA_def_property_collection_funcs(prop, "rna_Mesh_vertex_colors_begin", 0, 0, 0, "rna_Mesh_vertex_colors_length", 0, 0);
RNA_def_property_struct_type(prop, "MeshColorLayer");
RNA_def_property_ui_text(prop, "Vertex Colors", "");
+ rna_def_vertex_colors(brna, prop);
- prop= RNA_def_property(srna, "active_vertex_color", PROP_POINTER, PROP_UNSIGNED);
- RNA_def_property_struct_type(prop, "MeshColorLayer");
- RNA_def_property_pointer_funcs(prop, "rna_Mesh_active_vertex_color_get", "rna_Mesh_active_vertex_color_set", NULL);
- RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Active Vertex Color Layer", "Active vertex color layer");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop= RNA_def_property(srna, "active_vertex_color_index", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_int_funcs(prop, "rna_Mesh_active_vertex_color_index_get", "rna_Mesh_active_vertex_color_index_set", "rna_Mesh_active_vertex_color_index_range");
- RNA_def_property_ui_text(prop, "Active Vertex Color Index", "Active vertex color index");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop= RNA_def_property(srna, "float_layers", PROP_COLLECTION, PROP_NONE);
+ prop= RNA_def_property(srna, "layers_float", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "fdata.layers", "fdata.totlayer");
RNA_def_property_collection_funcs(prop, "rna_Mesh_float_layers_begin", 0, 0, 0, "rna_Mesh_float_layers_length", 0, 0);
RNA_def_property_struct_type(prop, "MeshFloatPropertyLayer");
RNA_def_property_ui_text(prop, "Float Property Layers", "");
- prop= RNA_def_property(srna, "int_layers", PROP_COLLECTION, PROP_NONE);
+ prop= RNA_def_property(srna, "layers_int", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "fdata.layers", "fdata.totlayer");
RNA_def_property_collection_funcs(prop, "rna_Mesh_int_layers_begin", 0, 0, 0, "rna_Mesh_int_layers_length", 0, 0);
RNA_def_property_struct_type(prop, "MeshIntPropertyLayer");
RNA_def_property_ui_text(prop, "Int Property Layers", "");
- prop= RNA_def_property(srna, "string_layers", PROP_COLLECTION, PROP_NONE);
+ prop= RNA_def_property(srna, "layers_string", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "fdata.layers", "fdata.totlayer");
RNA_def_property_collection_funcs(prop, "rna_Mesh_string_layers_begin", 0, 0, 0, "rna_Mesh_string_layers_length", 0, 0);
RNA_def_property_struct_type(prop, "MeshStringPropertyLayer");
RNA_def_property_ui_text(prop, "String Property Layers", "");
- prop= RNA_def_property(srna, "autosmooth", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_auto_smooth", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_AUTOSMOOTH);
RNA_def_property_ui_text(prop, "Auto Smooth", "Treats all set-smoothed faces with angles less than the specified angle as 'smooth' during render");
- prop= RNA_def_property(srna, "autosmooth_angle", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "auto_smooth_angle", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "smoothresh");
RNA_def_property_range(prop, 1, 80);
RNA_def_property_ui_text(prop, "Auto Smooth Angle", "Defines maximum angle between face normals that 'Auto Smooth' will operate on");
- prop= RNA_def_property(srna, "vertex_normal_flip", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", ME_NOPUNOFLIP);
- RNA_def_property_ui_text(prop, "Vertex Normal Flip", "Flip vertex normals towards the camera during render");
-
- prop= RNA_def_property(srna, "double_sided", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_double_sided", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_TWOSIDED);
RNA_def_property_ui_text(prop, "Double Sided", "Render/display the mesh with double or single sided lighting");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
@@ -1742,65 +1920,99 @@ static void rna_def_mesh(BlenderRNA *brna)
RNA_def_property_pointer_sdna(prop, NULL, "key");
RNA_def_property_ui_text(prop, "Shape Keys", "");
+ /* texture space */
+ prop= RNA_def_property(srna, "use_auto_texspace", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "texflag", 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_location", 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_Mesh_texspace_editable");
+ RNA_def_property_float_funcs(prop, "rna_Mesh_texspace_loc_get", "rna_Mesh_texspace_loc_set", NULL);
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
+
+ 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_Mesh_texspace_editable");
+ RNA_def_property_float_funcs(prop, "rna_Mesh_texspace_size_get", "rna_Mesh_texspace_size_set", NULL);
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
+
+ /* 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_Mesh_update_draw");*/
+
+ /* 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", "");
+ rna_def_mesh_materials(brna, prop);
+
/* Mesh Draw Options for Edit Mode*/
- prop= RNA_def_property(srna, "draw_edges", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_edges", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEDGES);
- RNA_def_property_ui_text(prop, "Draw Edges", "Displays selected edges using hilights in the 3D view and UV editor");
+ RNA_def_property_ui_text(prop, "Draw Edges", "Displays selected edges using highlights in the 3D view and UV editor");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
- prop= RNA_def_property(srna, "all_edges", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_all_edges", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_ALLEDGES);
RNA_def_property_ui_text(prop, "All Edges", "Displays all edges for wireframe in all view modes in the 3D view");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
- prop= RNA_def_property(srna, "draw_faces", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_faces", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWFACES);
RNA_def_property_ui_text(prop, "Draw Faces", "Displays all faces as shades in the 3D view and UV editor");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
- prop= RNA_def_property(srna, "draw_normals", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_normal_face", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWNORMALS);
RNA_def_property_ui_text(prop, "Draw Normals", "Displays face normals as lines");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
- prop= RNA_def_property(srna, "draw_vertex_normals", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_normal_vertex", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_VNORMALS);
RNA_def_property_ui_text(prop, "Draw Vertex Normals", "Displays vertex normals as lines");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
- prop= RNA_def_property(srna, "draw_creases", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_edge_crease", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWCREASES);
RNA_def_property_ui_text(prop, "Draw Creases", "Displays creases created for subsurf weighting");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
- prop= RNA_def_property(srna, "draw_bevel_weights", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_edge_bevel_weight", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWBWEIGHTS);
RNA_def_property_ui_text(prop, "Draw Bevel Weights", "Displays weights created for the Bevel modifier");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
- prop= RNA_def_property(srna, "draw_seams", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_edge_seams", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWSEAMS);
RNA_def_property_ui_text(prop, "Draw Seams", "Displays UV unwrapping seams");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
- prop= RNA_def_property(srna, "draw_sharp", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_edge_sharp", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWSHARP);
RNA_def_property_ui_text(prop, "Draw Sharp", "Displays sharp edges, used with the EdgeSplit modifier");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
- prop= RNA_def_property(srna, "draw_edge_lenght", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_extra_edge_length", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_EDGELEN);
- RNA_def_property_ui_text(prop, "Edge Length", "Displays selected edge lengths");
+ RNA_def_property_ui_text(prop, "Edge Length", "Displays selected edge lengths, Using global values when set in the transform panel");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
- prop= RNA_def_property(srna, "draw_edge_angle", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_extra_edge_angle", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_EDGEANG);
- RNA_def_property_ui_text(prop, "Edge Angles", "Displays the angles in the selected edges in degrees");
+ RNA_def_property_ui_text(prop, "Edge Angles", "Displays the angles in the selected edges in degrees, Using global values when set in the transform panel");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
- prop= RNA_def_property(srna, "draw_face_area", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_extra_face_area", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_FACEAREA);
- RNA_def_property_ui_text(prop, "Face Area", "Displays the area of selected faces");
+ RNA_def_property_ui_text(prop, "Face Area", "Displays the area of selected faces, Using global values when set in the transform panel");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
/* editflag */
@@ -1847,7 +2059,6 @@ static void rna_def_mesh(BlenderRNA *brna)
/* pointers */
rna_def_animdata_common(srna);
- rna_def_texmat_common(srna, "rna_Mesh_texspace_editable");
RNA_api_mesh(srna);
}
diff --git a/source/blender/makesrna/intern/rna_mesh_api.c b/source/blender/makesrna/intern/rna_mesh_api.c
index 1657e0e64d7..eaf18920c85 100644
--- a/source/blender/makesrna/intern/rna_mesh_api.c
+++ b/source/blender/makesrna/intern/rna_mesh_api.c
@@ -37,15 +37,6 @@
#ifdef RNA_RUNTIME
-static void rna_Mesh_uv_texture_add(struct Mesh *me, struct bContext *C)
-{
- ED_mesh_uv_texture_add(C, NULL, NULL, me);
-}
-
-static void rna_Mesh_vertex_color_add(struct Mesh *me, struct bContext *C)
-{
- ED_mesh_color_add(C, NULL, NULL, me);
-}
#else
@@ -59,36 +50,12 @@ void RNA_api_mesh(StructRNA *srna)
parm= RNA_def_float_matrix(func, "matrix", 4, 4, NULL, 0.0f, 0.0f, "", "Matrix.", 0.0f, 0.0f);
RNA_def_property_flag(parm, PROP_REQUIRED);
- func= RNA_def_function(srna, "add_geometry", "ED_mesh_geometry_add");
- RNA_def_function_flag(func, FUNC_USE_REPORTS);
- parm= RNA_def_int(func, "verts", 0, 0, INT_MAX, "Number", "Number of vertices to add.", 0, INT_MAX);
- RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_int(func, "edges", 0, 0, INT_MAX, "Number", "Number of edges to add.", 0, INT_MAX);
- RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_int(func, "faces", 0, 0, INT_MAX, "Number", "Number of faces to add.", 0, INT_MAX);
- RNA_def_property_flag(parm, PROP_REQUIRED);
-
- func= RNA_def_function(srna, "add_uv_texture", "rna_Mesh_uv_texture_add");
- RNA_def_function_flag(func, FUNC_USE_CONTEXT);
- RNA_def_function_ui_description(func, "Add a UV texture layer to Mesh.");
-
- func= RNA_def_function(srna, "add_vertex_color", "rna_Mesh_vertex_color_add");
- RNA_def_function_flag(func, FUNC_USE_CONTEXT);
- RNA_def_function_ui_description(func, "Add a vertex color layer to Mesh.");
-
func= RNA_def_function(srna, "calc_normals", "ED_mesh_calc_normals");
RNA_def_function_ui_description(func, "Calculate vertex normals.");
func= RNA_def_function(srna, "update", "ED_mesh_update");
RNA_def_boolean(func, "calc_edges", 0, "Calculate Edges", "Force recalculation of edges.");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
-
- func= RNA_def_function(srna, "add_material", "ED_mesh_material_add");
- RNA_def_function_ui_description(func, "Add a new material to Mesh.");
- parm= RNA_def_pointer(func, "material", "Material", "", "Material to add.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
-
-
}
#endif
diff --git a/source/blender/makesrna/intern/rna_meta.c b/source/blender/makesrna/intern/rna_meta.c
index 76c64c374f2..e364b075024 100644
--- a/source/blender/makesrna/intern/rna_meta.c
+++ b/source/blender/makesrna/intern/rna_meta.c
@@ -33,6 +33,10 @@
#ifdef RNA_RUNTIME
+#include "BLI_math.h"
+
+#include "MEM_guardedalloc.h"
+
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
@@ -46,36 +50,107 @@
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;
Object *ob;
- for(ob=bmain->object.first; ob; ob= ob->id.next)
- if(ob->data == mb)
- copy_mball_properties(scene, ob);
+ /* cheating way for importers to avoid slow updates */
+ if(mb->id.us > 0) {
+ for(ob=bmain->object.first; ob; ob= ob->id.next)
+ if(ob->data == mb)
+ copy_mball_properties(scene, ob);
+
+ DAG_id_flush_update(&mb->id, OB_RECALC_DATA);
+ WM_main_add_notifier(NC_GEOM|ND_DATA, mb);
+ }
+}
+
+static MetaElem *rna_MetaBall_elements_new(MetaBall *mb, int type)
+{
+ MetaElem *ml= add_metaball_element(mb, type);
+
+ /* cheating way for importers to avoid slow updates */
+ if(mb->id.us > 0) {
+ DAG_id_flush_update(&mb->id, OB_RECALC_DATA);
+ WM_main_add_notifier(NC_GEOM|ND_DATA, &mb->id);
+ }
+
+ return ml;
+}
+
+static void rna_MetaBall_elements_remove(MetaBall *mb, ReportList *reports, MetaElem *ml)
+{
+ int found= 0;
+
+ found= BLI_remlink_safe(&mb->elems, ml);
- DAG_id_flush_update(&mb->id, OB_RECALC_DATA);
- WM_main_add_notifier(NC_GEOM|ND_DATA, mb);
+ if(!found) {
+ BKE_reportf(reports, RPT_ERROR, "MetaBall \"%s\" does not contain spline given", mb->id.name+2);
+ return;
+ }
+
+ MEM_freeN(ml);
+ /* invalidate pointer!, no can do */
+
+ /* cheating way for importers to avoid slow updates */
+ if(mb->id.us > 0) {
+ DAG_id_flush_update(&mb->id, OB_RECALC_DATA);
+ WM_main_add_notifier(NC_GEOM|ND_DATA, &mb->id);
+ }
}
#else
+static EnumPropertyItem metaelem_type_items[] = {
+ {MB_BALL, "BALL", ICON_META_BALL, "Ball", ""},
+ {MB_TUBE, "TUBE", ICON_META_TUBE, "Tube", ""},
+ {MB_PLANE, "PLANE", ICON_META_PLANE, "Plane", ""},
+ {MB_ELIPSOID, "ELLIPSOID", ICON_META_ELLIPSOID, "Ellipsoid", ""}, // NOTE: typo at original definition!
+ {MB_CUBE, "CUBE", ICON_META_CUBE, "Cube", ""},
+ {0, NULL, 0, NULL, NULL}};
+
static void rna_def_metaelement(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
- static EnumPropertyItem prop_type_items[] = {
- {MB_BALL, "BALL", ICON_META_BALL, "Ball", ""},
- {MB_TUBE, "TUBE", ICON_META_TUBE, "Tube", ""},
- {MB_PLANE, "PLANE", ICON_META_PLANE, "Plane", ""},
- {MB_ELIPSOID, "ELLIPSOID", ICON_META_ELLIPSOID, "Ellipsoid", ""}, // NOTE: typo at original definition!
- {MB_CUBE, "CUBE", ICON_META_CUBE, "Cube", ""},
- {0, NULL, 0, NULL, NULL}};
-
+
srna= RNA_def_struct(brna, "MetaElement", NULL);
RNA_def_struct_sdna(srna, "MetaElem");
RNA_def_struct_ui_text(srna, "Meta Element", "Blobby element in a MetaBall datablock");
@@ -83,12 +158,12 @@ static void rna_def_metaelement(BlenderRNA *brna)
/* enums */
prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_items(prop, prop_type_items);
+ RNA_def_property_enum_items(prop, metaelem_type_items);
RNA_def_property_ui_text(prop, "Type", "Metaball types");
RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
/* number values */
- prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "x");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Location", "");
@@ -130,7 +205,7 @@ static void rna_def_metaelement(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
/* flags */
- prop= RNA_def_property(srna, "negative", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_negative", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MB_NEGATIVE);
RNA_def_property_ui_text(prop, "Negative", "Set metaball as negative one");
RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
@@ -141,6 +216,37 @@ static void rna_def_metaelement(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
}
+/* mball.elements */
+static void rna_def_metaball_elements(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "MetaBallElements");
+ srna= RNA_def_struct(brna, "MetaBallElements", NULL);
+ RNA_def_struct_sdna(srna, "MetaBall");
+ RNA_def_struct_ui_text(srna, "Meta Elements", "Collection of metaball elements");
+
+ func= RNA_def_function(srna, "new", "rna_MetaBall_elements_new");
+ RNA_def_function_ui_description(func, "Add a new spline to the curve.");
+ parm= RNA_def_enum(func, "type", metaelem_type_items, MB_BALL, "", "type for the new meta element.");
+ parm= RNA_def_pointer(func, "element", "MetaElement", "", "The newly created metaelement.");
+ RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "remove", "rna_MetaBall_elements_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, "element", "MetaElement", "", "The element to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "lastelem");
+ RNA_def_property_ui_text(prop, "Active Element", "Last selected element");
+}
+
static void rna_def_metaball(BlenderRNA *brna)
{
StructRNA *srna;
@@ -160,25 +266,23 @@ static void rna_def_metaball(BlenderRNA *brna)
RNA_def_property_collection_sdna(prop, NULL, "elems", NULL);
RNA_def_property_struct_type(prop, "MetaElement");
RNA_def_property_ui_text(prop, "Elements", "Meta elements");
+ rna_def_metaball_elements(brna, prop);
- prop= RNA_def_property(srna, "active_element", PROP_POINTER, PROP_NONE);
- RNA_def_property_pointer_sdna(prop, NULL, "lastelem");
- RNA_def_property_ui_text(prop, "Last selected element.", "Last selected element");
-
/* enums */
- prop= RNA_def_property(srna, "flag", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "update_method", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "flag");
RNA_def_property_enum_items(prop, prop_update_items);
RNA_def_property_ui_text(prop, "Update", "Metaball edit update behavior");
RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
/* number values */
- prop= RNA_def_property(srna, "wire_size", PROP_FLOAT, PROP_DISTANCE);
+ prop= RNA_def_property(srna, "resolution", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "wiresize");
RNA_def_property_range(prop, 0.050f, 1.0f);
RNA_def_property_ui_text(prop, "Wire Size", "Polygonization resolution in the 3D viewport");
RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
- prop= RNA_def_property(srna, "render_size", PROP_FLOAT, PROP_DISTANCE);
+ prop= RNA_def_property(srna, "render_resolution", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "rendersize");
RNA_def_property_range(prop, 0.050f, 1.0f);
RNA_def_property_ui_text(prop, "Render Size", "Polygonization resolution in rendering");
@@ -190,8 +294,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, "use_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_location", 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 d4bc2d6c571..5024c8d2c2e 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -36,10 +36,13 @@
#include "DNA_object_force.h"
#include "DNA_scene_types.h"
+#include "MEM_guardedalloc.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,8 +58,8 @@ EnumPropertyItem modifier_type_items[] ={
{eModifierType_EdgeSplit, "EDGE_SPLIT", ICON_MOD_EDGESPLIT, "Edge Split", ""},
{eModifierType_Mask, "MASK", ICON_MOD_MASK, "Mask", ""},
{eModifierType_Mirror, "MIRROR", ICON_MOD_MIRROR, "Mirror", ""},
- {eModifierType_Screw, "SCREW", ICON_MOD_SCREW, "Screw", ""},
{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", ""},
@@ -86,10 +89,14 @@ EnumPropertyItem modifier_type_items[] ={
#ifdef RNA_RUNTIME
+#include "DNA_particle_types.h"
+#include "DNA_smoke_types.h"
+
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_library.h"
#include "BKE_modifier.h"
+#include "BKE_particle.h"
static void rna_UVProject_projectors_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
@@ -208,13 +215,16 @@ 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(bmain, scene);
}
static void rna_Smoke_set_type(Main *bmain, Scene *scene, PointerRNA *ptr)
{
SmokeModifierData *smd= (SmokeModifierData *)ptr->data;
Object *ob= (Object*)ptr->id.data;
+ ParticleSystemModifierData *psmd = NULL;
+ ParticleSystem *psys = NULL;
+ ParticleSettings *part = NULL;
// nothing changed
if((smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain)
@@ -228,6 +238,28 @@ static void rna_Smoke_set_type(Main *bmain, Scene *scene, PointerRNA *ptr)
ob->dt = OB_WIRE;
break;
case MOD_SMOKE_TYPE_FLOW:
+ for(psys=ob->particlesystem.first; psys; psys=psys->next)
+ if(psys->part->type == PART_EMITTER)
+ break;
+ if(ob->type == OB_MESH && !psys) {
+ /* add particle system */
+ psmd = (ParticleSystemModifierData *)object_add_particle_system(scene, ob, NULL);
+ if(psmd)
+ {
+ psys = psmd->psys;
+ part = psys->part;
+ part->flag |= PART_UNBORN;
+ part->lifetime = 1.0f;
+ part->sta = 1.0f;
+ part->end = 250.0f;
+ part->ren_as = PART_DRAW_NOT;
+ sprintf(psys->name, "SmokeParticles");
+ psys->recalc |= (PSYS_RECALC_RESET|PSYS_RECALC_PHYS);
+ DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+ }
+ }
+ if(smd->flow)
+ smd->flow->psys = psys;
case MOD_SMOKE_TYPE_COLL:
case 0:
default:
@@ -369,7 +401,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;
@@ -377,16 +409,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;
@@ -465,7 +499,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)
@@ -553,12 +587,12 @@ static void rna_def_modifier_subsurf(BlenderRNA *brna)
RNA_def_property_ui_range(prop, 0, 6, 1, 0);
RNA_def_property_ui_text(prop, "Render Levels", "Number of subdivisions to perform when rendering");
- prop= RNA_def_property(srna, "optimal_display", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_only_control_edges", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", eSubsurfModifierFlag_ControlEdges);
RNA_def_property_ui_text(prop, "Optimal Display", "Skip drawing/rendering of interior subdivided edges");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "subsurf_uv", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_subsurf_uv", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", eSubsurfModifierFlag_SubsurfUv);
RNA_def_property_ui_text(prop, "Subdivide UVs", "Use subsurf to subdivide UVs");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -598,17 +632,17 @@ static void rna_def_modifier_multires(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Total Levels", "Number of subdivisions for which displacements are stored");
- prop= RNA_def_property(srna, "external", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_external", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
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);
+ prop= RNA_def_property(srna, "show_only_control_edges", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", eMultiresModifierFlag_ControlEdges);
RNA_def_property_ui_text(prop, "Optimal Display", "Skip drawing/rendering of interior subdivided edges");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -626,7 +660,7 @@ static void rna_def_modifier_lattice(BlenderRNA *brna)
prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Object", "Lattice object to deform with");
- RNA_def_property_pointer_funcs(prop, NULL, "rna_LatticeModifier_object_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_LatticeModifier_object_set", NULL, "rna_Lattice_object_poll");
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
@@ -658,7 +692,7 @@ static void rna_def_modifier_curve(BlenderRNA *brna)
prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Object", "Curve object to deform with");
- RNA_def_property_pointer_funcs(prop, NULL, "rna_CurveModifier_object_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_CurveModifier_object_set", NULL, "rna_Curve_object_poll");
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
@@ -685,17 +719,20 @@ 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");
- prop= RNA_def_property(srna, "length", PROP_FLOAT, PROP_TIME);
+ prop= RNA_def_property(srna, "frame_duration", PROP_FLOAT, PROP_TIME);
+ RNA_def_property_float_sdna(prop, NULL, "length");
RNA_def_property_range(prop, 1, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Length", "Specify the total time the build effect requires");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "randomize", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_random_order", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "randomize", 1);
RNA_def_property_ui_text(prop, "Randomize", "Randomize the faces or edges during build");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -715,42 +752,42 @@ static void rna_def_modifier_mirror(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "MirrorModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_MIRROR);
- prop= RNA_def_property(srna, "x", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MIR_AXIS_X);
RNA_def_property_ui_text(prop, "X", "Enable X axis mirror");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MIR_AXIS_Y);
RNA_def_property_ui_text(prop, "Y", "Enable Y axis mirror");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "z", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MIR_AXIS_Z);
RNA_def_property_ui_text(prop, "Z", "Enable Z axis mirror");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "clip", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_clip", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MIR_CLIPPING);
RNA_def_property_ui_text(prop, "Clip", "Prevents vertices from going through the mirror during transform");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "mirror_vertex_groups", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_mirror_vertex_groups", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MIR_VGROUP);
RNA_def_property_ui_text(prop, "Mirror Vertex Groups", "Mirror vertex groups (e.g. .R->.L)");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "mirror_u", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_mirror_u", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MIR_MIRROR_U);
RNA_def_property_ui_text(prop, "Mirror U", "Mirror the U texture coordinate around the 0.5 point");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "mirror_v", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_mirror_v", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MIR_MIRROR_V);
RNA_def_property_ui_text(prop, "Mirror V", "Mirror the V texture coordinate around the 0.5 point");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "merge_limit", PROP_FLOAT, PROP_DISTANCE);
+ prop= RNA_def_property(srna, "merge_threshold", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "tolerance");
RNA_def_property_range(prop, 0, FLT_MAX);
RNA_def_property_ui_range(prop, 0, 1, 0.01, 6);
@@ -774,9 +811,10 @@ static void rna_def_modifier_decimate(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "DecimateModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_DECIM);
- prop= RNA_def_property(srna, "ratio", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "ratio", PROP_FLOAT, PROP_PERCENTAGE);
RNA_def_property_float_sdna(prop, NULL, "percent");
RNA_def_property_range(prop, 0, 1);
+ RNA_def_property_ui_range(prop, 0, 1, 1, 2);
RNA_def_property_ui_text(prop, "Ratio", "Defines the ratio of triangles to reduce to");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -803,37 +841,37 @@ static void rna_def_modifier_wave(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "WaveModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_WAVE);
- prop= RNA_def_property(srna, "x", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_WAVE_X);
RNA_def_property_ui_text(prop, "X", "X axis motion");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_WAVE_Y);
RNA_def_property_ui_text(prop, "Y", "Y axis motion");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "cyclic", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_cyclic", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_WAVE_CYCL);
RNA_def_property_ui_text(prop, "Cyclic", "Cyclic wave effect");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "normals", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_normal", 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);
+ prop= RNA_def_property(srna, "use_normal_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_WAVE_NORM_X);
RNA_def_property_ui_text(prop, "X Normal", "Enable displacement along the X normal");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "y_normal", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_normal_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_WAVE_NORM_Y);
RNA_def_property_ui_text(prop, "Y Normal", "Enable displacement along the Y normal");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "z_normal", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_normal_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_WAVE_NORM_Z);
RNA_def_property_ui_text(prop, "Z Normal", "Enable displacement along the Z normal");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -845,6 +883,7 @@ static void rna_def_modifier_wave(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "lifetime", PROP_FLOAT, PROP_TIME);
+ RNA_def_property_float_sdna(prop, NULL, "lifetime");
RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Lifetime", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -893,7 +932,7 @@ static void rna_def_modifier_wave(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "texture_coordinates", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "texture_coords", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "texmapping");
RNA_def_property_enum_items(prop, prop_texture_coordinates_items);
RNA_def_property_ui_text(prop, "Texture Coordinates", "Texture coordinates used for modulating input");
@@ -905,7 +944,7 @@ static void rna_def_modifier_wave(BlenderRNA *brna)
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WaveModifier_uvlayer_set");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "texture_coordinates_object", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "texture_coords_object", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "map_object");
RNA_def_property_ui_text(prop, "Texture Coordinates Object", "");
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
@@ -949,7 +988,7 @@ static void rna_def_modifier_armature(BlenderRNA *brna)
prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Object", "Armature object to deform with");
- RNA_def_property_pointer_funcs(prop, NULL, "rna_ArmatureModifier_object_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_ArmatureModifier_object_set", NULL, "rna_Armature_object_poll");
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
@@ -959,7 +998,7 @@ static void rna_def_modifier_armature(BlenderRNA *brna)
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_ArmatureModifier_vgroup_set");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "invert", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_vertex_group", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_INVERT_VGROUP);
RNA_def_property_ui_text(prop, "Invert", "Invert vertex group influence");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -974,17 +1013,12 @@ static void rna_def_modifier_armature(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Use Bone Envelopes", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "quaternion", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_deform_preserve_volume", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_QUATERNION);
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);
+ prop= RNA_def_property(srna, "use_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");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1041,13 +1075,13 @@ static void rna_def_modifier_softbody(BlenderRNA *brna)
prop= RNA_def_property(srna, "settings", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "SoftBodySettings");
- RNA_def_property_pointer_funcs(prop, "rna_SoftBodyModifier_settings_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_SoftBodyModifier_settings_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Soft Body Settings", "");
prop= RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "PointCache");
- RNA_def_property_pointer_funcs(prop, "rna_SoftBodyModifier_point_cache_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_SoftBodyModifier_point_cache_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Soft Body Point Cache", "");
}
@@ -1068,8 +1102,8 @@ 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_pointer_funcs(prop, NULL, "rna_BooleanModifier_object_set", NULL);
+ 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, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
@@ -1107,7 +1141,8 @@ static void rna_def_modifier_array(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Count", "Number of duplicates to make");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "length", PROP_FLOAT, PROP_DISTANCE);
+ prop= RNA_def_property(srna, "fit_length", PROP_FLOAT, PROP_DISTANCE);
+ RNA_def_property_float_sdna(prop, NULL, "length");
RNA_def_property_range(prop, 0, INT_MAX);
RNA_def_property_ui_range(prop, 0, 10000, 10, 2);
RNA_def_property_ui_text(prop, "Length", "Length to fit array within");
@@ -1116,43 +1151,43 @@ static void rna_def_modifier_array(BlenderRNA *brna)
prop= RNA_def_property(srna, "curve", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "curve_ob");
RNA_def_property_ui_text(prop, "Curve", "Curve object to fit array length to");
- RNA_def_property_pointer_funcs(prop, NULL, "rna_ArrayModifier_curve_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_ArrayModifier_curve_set", NULL, "rna_Curve_object_poll");
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
/* Offset parameters */
- prop= RNA_def_property(srna, "constant_offset", PROP_BOOLEAN, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "use_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);
+ prop= RNA_def_property(srna, "constant_offset_displace", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "offset");
RNA_def_property_ui_text(prop, "Constant Offset Displacement", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "relative_offset", PROP_BOOLEAN, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "use_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);
+ prop= RNA_def_property(srna, "relative_offset_displace", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "scale");
RNA_def_property_ui_text(prop, "Relative Offset Displacement", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
/* Vertex merging parameters */
- prop= RNA_def_property(srna, "merge_adjacent_vertices", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_merge_vertices", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_ARR_MERGE);
RNA_def_property_ui_text(prop, "Merge Vertices", "Merge vertices in adjacent duplicates");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "merge_end_vertices", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_merge_vertices_cap", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_ARR_MERGEFINAL);
RNA_def_property_ui_text(prop, "Merge Vertices", "Merge vertices in first and last duplicates");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "merge_distance", PROP_FLOAT, PROP_DISTANCE);
+ prop= RNA_def_property(srna, "merge_threshold", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "merge_dist");
RNA_def_property_range(prop, 0, FLT_MAX);
RNA_def_property_ui_range(prop, 0, 1, 1, 4);
@@ -1160,27 +1195,27 @@ static void rna_def_modifier_array(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Modifier_update");
/* Offset object */
- prop= RNA_def_property(srna, "add_offset_object", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_object_offset", 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");
/* Caps */
prop= RNA_def_property(srna, "start_cap", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Start Cap", "Mesh object to use as a start cap");
- RNA_def_property_pointer_funcs(prop, NULL, "rna_ArrayModifier_start_cap_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_ArrayModifier_start_cap_set", NULL, "rna_Mesh_object_poll");
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "end_cap", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "End Cap", "Mesh object to use as an end cap");
- RNA_def_property_pointer_funcs(prop, NULL, "rna_ArrayModifier_end_cap_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_ArrayModifier_end_cap_set", NULL, "rna_Mesh_object_poll");
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
}
@@ -1207,7 +1242,7 @@ static void rna_def_modifier_edgesplit(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Use Edge Angle", "Split edges with high angle between faces");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "use_sharp", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_edge_sharp", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_EDGESPLIT_FROMFLAG);
RNA_def_property_ui_text(prop, "Use Sharp Edges", "Split edges that are marked as sharp");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1249,7 +1284,8 @@ static void rna_def_modifier_displace(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "midlevel", PROP_FLOAT, PROP_DISTANCE);
+ prop= RNA_def_property(srna, "mid_level", PROP_FLOAT, PROP_DISTANCE);
+ RNA_def_property_float_sdna(prop, NULL, "midlevel");
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_range(prop, 0, 1, 10, 3);
RNA_def_property_ui_text(prop, "Midlevel", "Material value that gives no displacement");
@@ -1257,7 +1293,7 @@ static void rna_def_modifier_displace(BlenderRNA *brna)
prop= RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
- RNA_def_property_ui_range(prop, -100, 100, 10, 2);
+ RNA_def_property_ui_range(prop, -100, 100, 10, 3);
RNA_def_property_ui_text(prop, "Strength", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1266,7 +1302,7 @@ static void rna_def_modifier_displace(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Direction", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "texture_coordinates", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "texture_coords", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "texmapping");
RNA_def_property_enum_items(prop, prop_texture_coordinates_items);
RNA_def_property_ui_text(prop, "Texture Coordinates", "");
@@ -1301,7 +1337,8 @@ static void rna_def_modifier_uvproject(BlenderRNA *brna)
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_UVProjectModifier_uvlayer_set");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "num_projectors", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "projector_count", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "num_projectors");
RNA_def_property_ui_text(prop, "Number of Projectors", "Number of projectors to use");
RNA_def_property_int_funcs(prop, NULL, "rna_UVProjectModifier_num_projectors_set", NULL);
RNA_def_property_range(prop, 1, MOD_UVPROJECT_MAX);
@@ -1320,32 +1357,32 @@ static void rna_def_modifier_uvproject(BlenderRNA *brna)
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, 0.2, 2);
+ RNA_def_property_ui_range(prop, 1, 1000, 1, 3);
RNA_def_property_ui_text(prop, "Horizontal Aspect Ratio", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
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, 0.2, 2);
+ RNA_def_property_ui_range(prop, 1, 1000, 1, 3);
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_range(prop, 0, 1000, 1, 3);
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_range(prop, 0, 1000, 1, 3);
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);
+ prop= RNA_def_property(srna, "use_image_override", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_UVPROJECT_OVERRIDEIMAGE);
RNA_def_property_ui_text(prop, "Override Image", "Override faces' current images with the given image");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1355,9 +1392,10 @@ static void rna_def_modifier_uvproject(BlenderRNA *brna)
prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Object");
- RNA_def_property_pointer_funcs(prop, "rna_UVProjector_object_get", "rna_UVProjector_object_set", NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_UVProjector_object_get", "rna_UVProjector_object_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
RNA_def_property_ui_text(prop, "Object", "Object to use as projector transform");
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
}
static void rna_def_modifier_smooth(BlenderRNA *brna)
@@ -1370,17 +1408,17 @@ static void rna_def_modifier_smooth(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "SmoothModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_SMOOTH);
- prop= RNA_def_property(srna, "x", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SMOOTH_X);
RNA_def_property_ui_text(prop, "X", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SMOOTH_Y);
RNA_def_property_ui_text(prop, "Y", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "z", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SMOOTH_Z);
RNA_def_property_ui_text(prop, "Z", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1388,11 +1426,12 @@ static void rna_def_modifier_smooth(BlenderRNA *brna)
prop= RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "fac");
RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
- RNA_def_property_ui_range(prop, -10, 10, 0.5, 2);
+ RNA_def_property_ui_range(prop, -10, 10, 1, 3);
RNA_def_property_ui_text(prop, "Factor", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "repeat", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "iterations", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "repeat");
RNA_def_property_ui_range(prop, 0, 30, 1, 0);
RNA_def_property_ui_text(prop, "Repeat", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1428,26 +1467,26 @@ static void rna_def_modifier_cast(BlenderRNA *brna)
prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Object", "Control object: if available, its location determines the center of the effect");
- RNA_def_property_pointer_funcs(prop, NULL, "rna_CastModifier_object_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_CastModifier_object_set", NULL, NULL);
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, "x", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_CAST_X);
RNA_def_property_ui_text(prop, "X", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_CAST_Y);
RNA_def_property_ui_text(prop, "Y", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "z", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_CAST_Z);
RNA_def_property_ui_text(prop, "Z", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "from_radius", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_radius_as_size", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_CAST_SIZE_FROM_RADIUS);
RNA_def_property_ui_text(prop, "From Radius", "Use radius as size of projection shape (0 = auto)");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1466,13 +1505,13 @@ static void rna_def_modifier_cast(BlenderRNA *brna)
prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_range(prop, 0, FLT_MAX);
- RNA_def_property_ui_range(prop, 0, 100, 10, 2);
+ RNA_def_property_ui_range(prop, 0, 100, 5, 2);
RNA_def_property_ui_text(prop, "Radius", "Only deform vertices within this distance from the center of the effect (leave as 0 for infinite.)");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0, FLT_MAX);
- RNA_def_property_ui_range(prop, 0, 100, 10, 2);
+ RNA_def_property_ui_range(prop, 0, 100, 5, 2);
RNA_def_property_ui_text(prop, "Size", "Size of projection shape (leave as 0 for auto.)");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1501,7 +1540,7 @@ static void rna_def_modifier_meshdeform(BlenderRNA *brna)
prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Object", "Mesh object to deform with");
- RNA_def_property_pointer_funcs(prop, NULL, "rna_MeshDeformModifier_object_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_MeshDeformModifier_object_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
@@ -1510,7 +1549,7 @@ static void rna_def_modifier_meshdeform(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Bound", "Whether geometry has been bound to control cage");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- prop= RNA_def_property(srna, "invert", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_vertex_group", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MDEF_INVERT_VGROUP);
RNA_def_property_ui_text(prop, "Invert", "Invert vertex group influence");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1527,7 +1566,7 @@ static void rna_def_modifier_meshdeform(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Precision", "The grid size for binding");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "dynamic", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_dynamic_bind", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MDEF_DYNAMIC_BIND);
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");
@@ -1543,11 +1582,17 @@ static void rna_def_modifier_meshdeform(BlenderRNA *brna)
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)
@@ -1573,7 +1618,7 @@ static void rna_def_modifier_particleinstance(BlenderRNA *brna)
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, "particle_system_number", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "particle_system_index", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "psys");
RNA_def_property_range(prop, 1, 10);
RNA_def_property_ui_text(prop, "Particle System Number", "");
@@ -1585,42 +1630,42 @@ static void rna_def_modifier_particleinstance(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Axis", "Pole axis for rotation");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "normal", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_normal", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eParticleInstanceFlag_Parents);
RNA_def_property_ui_text(prop, "Normal", "Create instances from normal particles");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "children", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_children", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eParticleInstanceFlag_Children);
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");
- prop= RNA_def_property(srna, "unborn", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_unborn", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eParticleInstanceFlag_Unborn);
RNA_def_property_ui_text(prop, "Unborn", "Show instances when particles are unborn");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "alive", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_alive", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eParticleInstanceFlag_Alive);
RNA_def_property_ui_text(prop, "Alive", "Show instances when particles are alive");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "dead", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_dead", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eParticleInstanceFlag_Dead);
RNA_def_property_ui_text(prop, "Dead", "Show instances when particles are dead");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "keep_shape", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_preserve_shape", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eParticleInstanceFlag_KeepShape);
RNA_def_property_ui_text(prop, "Keep Shape", "Don't stretch the object");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "size", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_size", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eParticleInstanceFlag_UseSize);
RNA_def_property_ui_text(prop, "Size", "Use particle size to scale the instances");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1657,25 +1702,30 @@ static void rna_def_modifier_explode(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Protect", "Clean vertex group edges");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "split_edges", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_edge_split", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eExplodeFlag_EdgeSplit);
RNA_def_property_ui_text(prop, "Split Edges", "Split face edges for nicer shrapnel");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "unborn", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_unborn", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eExplodeFlag_Unborn);
RNA_def_property_ui_text(prop, "Unborn", "Show mesh when particles are unborn");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "alive", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_alive", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eExplodeFlag_Alive);
RNA_def_property_ui_text(prop, "Alive", "Show mesh when particles are alive");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "dead", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_dead", PROP_BOOLEAN, PROP_NONE);
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, "use_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)
@@ -1710,9 +1760,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");
@@ -1752,7 +1802,7 @@ static void rna_def_modifier_collision(BlenderRNA *brna)
prop= RNA_def_property(srna, "settings", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "CollisionSettings");
- RNA_def_property_pointer_funcs(prop, "rna_CollisionModifier_settings_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_CollisionModifier_settings_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Settings", "");
}
@@ -1785,7 +1835,7 @@ static void rna_def_modifier_bevel(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Width", "Bevel value/amount");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "only_vertices", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_only_vertices", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", BME_BEVEL_VERT);
RNA_def_property_ui_text(prop, "Only Vertices", "Bevel verts/corners, not edges");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1802,7 +1852,7 @@ static void rna_def_modifier_bevel(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Edge Weight Method", "What edge weight to use for weighting a vertex");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "angle_limit", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "bevel_angle");
RNA_def_property_range(prop, 0, 180);
RNA_def_property_ui_range(prop, 0, 180, 100, 2);
@@ -1826,7 +1876,7 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "ShrinkwrapModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_SHRINKWRAP);
- prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "wrap_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "shrinkType");
RNA_def_property_enum_items(prop, shrink_type_items);
RNA_def_property_ui_text(prop, "Mode", "");
@@ -1834,14 +1884,14 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna)
prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Target", "Mesh target to shrink to");
- RNA_def_property_pointer_funcs(prop, NULL, "rna_ShrinkwrapModifier_target_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_ShrinkwrapModifier_target_set", NULL, "rna_Mesh_object_poll");
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, "auxiliary_target", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "auxTarget");
RNA_def_property_ui_text(prop, "Auxiliary Target", "Additional mesh target to shrink to");
- RNA_def_property_pointer_funcs(prop, NULL, "rna_ShrinkwrapModifier_auxiliary_target_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_ShrinkwrapModifier_auxiliary_target_set", NULL, "rna_Mesh_object_poll");
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
@@ -1858,17 +1908,17 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Offset", "Distance to keep from the target");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "x", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_project_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "projAxis", MOD_SHRINKWRAP_PROJECT_OVER_X_AXIS);
RNA_def_property_ui_text(prop, "X", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_project_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "projAxis", MOD_SHRINKWRAP_PROJECT_OVER_Y_AXIS);
RNA_def_property_ui_text(prop, "Y", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "z", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_project_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "projAxis", MOD_SHRINKWRAP_PROJECT_OVER_Z_AXIS);
RNA_def_property_ui_text(prop, "Z", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1880,27 +1930,27 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Subsurf Levels", "Number of subdivisions that must be performed before extracting vertices' positions and normals");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "negative", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_negative_direction", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_PROJECT_ALLOW_NEG_DIR);
RNA_def_property_ui_text(prop, "Negative", "Allow vertices to move in the negative direction of axis");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "positive", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_positive_direction", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_PROJECT_ALLOW_POS_DIR);
RNA_def_property_ui_text(prop, "Positive", "Allow vertices to move in the positive direction of axis");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "cull_front_faces", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_cull_front_faces", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE);
RNA_def_property_ui_text(prop, "Cull Front Faces", "Stop vertices from projecting to a front face on the target");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "cull_back_faces", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_cull_back_faces", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_CULL_TARGET_BACKFACE);
RNA_def_property_ui_text(prop, "Cull Back Faces", "Stop vertices from projecting to a back face on the target");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "keep_above_surface", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_keep_above_surface", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_KEEP_ABOVE_SURFACE);
RNA_def_property_ui_text(prop, "Keep Above Surface", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1945,7 +1995,7 @@ static void rna_def_modifier_mask(BlenderRNA *brna)
prop= RNA_def_property(srna, "armature", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "ob_arm");
RNA_def_property_ui_text(prop, "Armature", "Armature to use as source of bones to mask");
- RNA_def_property_pointer_funcs(prop, NULL, "rna_MaskModifier_armature_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_MaskModifier_armature_set", NULL, "rna_Armature_object_poll");
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
@@ -1955,7 +2005,7 @@ static void rna_def_modifier_mask(BlenderRNA *brna)
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_MaskModifier_vgroup_set");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "invert", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_vertex_group", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MASK_INV);
RNA_def_property_ui_text(prop, "Invert", "Use vertices that are not part of region defined");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1978,7 +2028,8 @@ static void rna_def_modifier_simpledeform(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "SimpleDeformModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_SIMPLEDEFORM);
- prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "deform_method", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "mode");
RNA_def_property_enum_items(prop, simple_deform_mode_items);
RNA_def_property_ui_text(prop, "Mode", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1994,14 +2045,14 @@ static void rna_def_modifier_simpledeform(BlenderRNA *brna)
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, "relative", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_relative", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "originOpts", MOD_SIMPLEDEFORM_ORIGIN_LOCAL);
RNA_def_property_ui_text(prop, "Relative", "Sets the origin of deform space to be relative to the object");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
- RNA_def_property_ui_range(prop, -10, 10, 0.5, 2);
+ RNA_def_property_ui_range(prop, -10, 10, 1, 3);
RNA_def_property_ui_text(prop, "Factor", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -2013,12 +2064,12 @@ static void rna_def_modifier_simpledeform(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Limits", "Lower/Upper limits for deform");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "lock_x_axis", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "axis", MOD_SIMPLEDEFORM_LOCK_AXIS_X);
RNA_def_property_ui_text(prop, "Lock X Axis", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "lock_y_axis", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "axis", MOD_SIMPLEDEFORM_LOCK_AXIS_Y);
RNA_def_property_ui_text(prop, "Lock Y Axis", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -2051,11 +2102,11 @@ static void rna_def_modifier_solidify(BlenderRNA *brna)
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);
+ prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_FACTOR);
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", "");
+ 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);
@@ -2089,6 +2140,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);
@@ -2100,10 +2156,12 @@ static void rna_def_modifier_solidify(BlenderRNA *brna)
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);
+ prop= RNA_def_property(srna, "invert_vertex_group", 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)
@@ -2180,7 +2238,7 @@ static void rna_def_modifier_screw(BlenderRNA *brna)
/*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 then the fixed 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");*/
}
@@ -2211,30 +2269,30 @@ void RNA_def_modifier(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Type", "");
/* flags */
- prop= RNA_def_property(srna, "realtime", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_viewport", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_Realtime);
RNA_def_property_ui_text(prop, "Realtime", "Realtime display of a modifier");
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
RNA_def_property_update(prop, 0, "rna_Modifier_update");
RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 0);
- prop= RNA_def_property(srna, "render", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_render", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_Render);
RNA_def_property_ui_text(prop, "Render", "Use modifier during rendering");
RNA_def_property_ui_icon(prop, ICON_SCENE, 0);
- prop= RNA_def_property(srna, "editmode", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_in_editmode", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_Editmode);
RNA_def_property_ui_text(prop, "Editmode", "Use modifier while in the edit mode");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
RNA_def_property_ui_icon(prop, ICON_EDITMODE_HLT, 0);
- prop= RNA_def_property(srna, "on_cage", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_on_cage", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_OnCage);
RNA_def_property_ui_text(prop, "On Cage", "Enable direct editing of modifier control cage");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_Expanded);
RNA_def_property_ui_text(prop, "Expanded", "Set modifier expanded in the user interface");
RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1);
diff --git a/source/blender/makesrna/intern/rna_nla.c b/source/blender/makesrna/intern/rna_nla.c
index accb40d2223..15c8608e523 100644
--- a/source/blender/makesrna/intern/rna_nla.c
+++ b/source/blender/makesrna/intern/rna_nla.c
@@ -314,7 +314,7 @@ static void rna_def_nlastrip(BlenderRNA *brna)
RNA_def_property_enum_items(prop, nla_mode_extend_items);
RNA_def_property_ui_text(prop, "Extrapolation", "Action to take for gaps past the strip extents");
- prop= RNA_def_property(srna, "blending", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "blend_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "blendmode");
RNA_def_property_enum_items(prop, nla_mode_blend_items);
RNA_def_property_ui_text(prop, "Blending", "Method used for combining strip's result with accumulated result");
@@ -343,7 +343,7 @@ static void rna_def_nlastrip(BlenderRNA *brna)
RNA_def_property_float_funcs(prop, NULL, "rna_NlaStrip_blend_out_set", NULL);
RNA_def_property_ui_text(prop, "Blend Out", "");
- prop= RNA_def_property(srna, "auto_blending", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_auto_blend", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_AUTO_BLENDS);
RNA_def_property_ui_text(prop, "Auto Blend In/Out", "Number of frames for Blending In/Out is automatically determined from overlapping strips");
@@ -401,17 +401,17 @@ static void rna_def_nlastrip(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Strip Time", "Frame of referenced Action to evaluate");
// TODO: should the animated_influence/time settings be animatable themselves?
- prop= RNA_def_property(srna, "animated_influence", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_animated_influence", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_USR_INFLUENCE);
RNA_def_property_boolean_funcs(prop, NULL, "rna_NlaStrip_animated_influence_set");
RNA_def_property_ui_text(prop, "Animated Influence", "Influence setting is controlled by an F-Curve rather than automatically determined");
- prop= RNA_def_property(srna, "animated_time", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_animated_time", PROP_BOOLEAN, PROP_NONE);
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);
+ prop= RNA_def_property(srna, "use_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?
@@ -422,15 +422,15 @@ static void rna_def_nlastrip(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_ACTIVE);
RNA_def_property_ui_text(prop, "Active", "NLA Strip is active");
- prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_SELECT);
- RNA_def_property_ui_text(prop, "Selected", "NLA Strip is selected");
+ RNA_def_property_ui_text(prop, "Select", "NLA Strip is selected");
- prop= RNA_def_property(srna, "muted", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_MUTED);
RNA_def_property_ui_text(prop, "Muted", "NLA Strip is not evaluated");
- prop= RNA_def_property(srna, "reversed", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_reverse", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_REVERSE);
RNA_def_property_ui_text(prop, "Reversed", "NLA Strip is played back in reverse order (only when timing is automatically determined)");
@@ -463,20 +463,20 @@ static void rna_def_nlatrack(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLATRACK_ACTIVE);
RNA_def_property_ui_text(prop, "Active", "NLA Track is active");
- prop= RNA_def_property(srna, "solo", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_solo", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* can be made editable by hooking it up to the necessary NLA API methods */
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLATRACK_SOLO);
RNA_def_property_ui_text(prop, "Solo", "NLA Track is evaluated itself (i.e. active Action and all other NLA Tracks in the same AnimData block are disabled)");
- prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLATRACK_SELECTED);
- RNA_def_property_ui_text(prop, "Selected", "NLA Track is selected");
+ RNA_def_property_ui_text(prop, "Select", "NLA Track is selected");
- prop= RNA_def_property(srna, "muted", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLATRACK_MUTED);
RNA_def_property_ui_text(prop, "Muted", "NLA Track is not evaluated");
- prop= RNA_def_property(srna, "locked", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLATRACK_PROTECTED);
RNA_def_property_ui_text(prop, "Locked", "NLA Track is locked");
}
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 82d0f0b3e6e..5044518ca93 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -139,6 +139,24 @@ static void rna_Matte_t2_set(PointerRNA *ptr, float value)
chroma->t2 = value;
}
+static void rna_Image_start_frame_set(PointerRNA *ptr, int value)
+{
+ bNode *node= (bNode*)ptr->data;
+ NodeImageFile *image = node->storage;
+
+ CLAMP(value, MINFRAME, image->efra);
+ image->sfra= value;
+}
+
+static void rna_Image_end_frame_set(PointerRNA *ptr, int value)
+{
+ bNode *node= (bNode*)ptr->data;
+ NodeImageFile *image = node->storage;
+
+ CLAMP(value, image->sfra, MAXFRAME);
+ image->efra= value;
+}
+
static void node_update(Main *bmain, Scene *scene, bNodeTree *ntree, bNode *node)
{
ED_node_generic_update(bmain, scene, ntree, node);
@@ -638,12 +656,12 @@ static void def_time(StructRNA *srna)
RNA_def_property_ui_text(prop, "Curve", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "start", PROP_INT, PROP_NONE);
+ prop = RNA_def_property(srna, "frame_start", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "custom1");
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", PROP_INT, PROP_NONE);
+ prop = RNA_def_property(srna, "frame_end", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "custom2");
RNA_def_property_ui_text(prop, "End Frame", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -670,7 +688,7 @@ static void def_mix_rgb(StructRNA *srna)
RNA_def_property_ui_text(prop, "Blend Type", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "alpha", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_alpha", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom2", 1);
RNA_def_property_ui_text(prop, "Alpha", "Include alpha of second input in this operation");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -707,12 +725,12 @@ static void def_sh_material(StructRNA *srna)
RNA_def_property_ui_text(prop, "Material", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "diffuse", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_diffuse", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom1", SH_NODE_MAT_DIFF);
RNA_def_property_ui_text(prop, "Diffuse", "Material Node outputs Diffuse");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "specular", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_specular", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom1", SH_NODE_MAT_SPEC);
RNA_def_property_ui_text(prop, "Specular", "Material Node outputs Specular");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -747,23 +765,23 @@ static void def_sh_mapping(StructRNA *srna)
RNA_def_property_ui_range(prop, -10.f, 10.f, 0.1f, 2);
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_mapping_update");
- prop = RNA_def_property(srna, "clamp_minimum", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_min", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TEXMAP_CLIP_MIN);
RNA_def_property_ui_text(prop, "Clamp Minimum", "Clamp the output coordinate to a minimum value");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop= RNA_def_property(srna, "minimum", PROP_FLOAT, PROP_XYZ);
+ prop= RNA_def_property(srna, "min", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "min");
RNA_def_property_ui_text(prop, "Minimum", "Minimum value to clamp coordinate to");
RNA_def_property_ui_range(prop, -10.f, 10.f, 0.1f, 2);
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "clamp_maximum", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_max", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TEXMAP_CLIP_MAX);
RNA_def_property_ui_text(prop, "Clamp Maximum", "Clamp the output coordinate to a maximum value");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop= RNA_def_property(srna, "maximum", PROP_FLOAT, PROP_XYZ);
+ prop= RNA_def_property(srna, "max", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "max");
RNA_def_property_ui_text(prop, "Maximum", "Maximum value to clamp coordinate to");
RNA_def_property_ui_range(prop, -10.f, 10.f, 0.1f, 2);
@@ -795,7 +813,7 @@ static void def_cmp_alpha_over(StructRNA *srna)
PropertyRNA *prop;
// XXX: Tooltip
- prop = RNA_def_property(srna, "convert_premul", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_premultiply", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom1", 1);
RNA_def_property_ui_text(prop, "Convert Premul", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -815,19 +833,19 @@ static void def_cmp_hue_saturation(StructRNA *srna)
RNA_def_struct_sdna_from(srna, "NodeHueSat", "storage");
- prop = RNA_def_property(srna, "hue", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "color_hue", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "hue");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Hue", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "sat", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "color_saturation", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "sat");
RNA_def_property_range(prop, 0.0f, 2.0f);
RNA_def_property_ui_text(prop, "Saturation", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "val", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "color_value", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "val");
RNA_def_property_range(prop, 0.0f, 2.0f);
RNA_def_property_ui_text(prop, "Value", "");
@@ -851,21 +869,21 @@ static void def_cmp_blur(StructRNA *srna)
RNA_def_struct_sdna_from(srna, "NodeBlurData", "storage");
- prop = RNA_def_property(srna, "sizex", PROP_INT, PROP_NONE);
+ prop = RNA_def_property(srna, "size_x", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "sizex");
RNA_def_property_range(prop, 0, 256);
RNA_def_property_ui_text(prop, "Size X", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "sizey", PROP_INT, PROP_NONE);
+ prop = RNA_def_property(srna, "size_y", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "sizey");
RNA_def_property_range(prop, 0, 256);
RNA_def_property_ui_text(prop, "Size Y", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "relative", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_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);
@@ -892,14 +910,14 @@ static void def_cmp_blur(StructRNA *srna)
RNA_def_property_ui_text(prop, "Filter Type", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "bokeh", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_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);
+ prop = RNA_def_property(srna, "use_gamma_correction", 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");
}
@@ -968,25 +986,29 @@ static void def_cmp_vector_blur(StructRNA *srna)
prop = RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "samples");
+ RNA_def_property_range(prop, 1, 256);
RNA_def_property_ui_text(prop, "Samples", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "min_speed", PROP_INT, PROP_NONE);
+ prop = RNA_def_property(srna, "speed_min", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "minspeed");
+ RNA_def_property_range(prop, 0, 1024);
RNA_def_property_ui_text(prop, "Min Speed", "Minimum speed for a pixel to be blurred; used to separate background from foreground");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "max_speed", PROP_INT, PROP_NONE);
+ prop = RNA_def_property(srna, "speed_max", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "maxspeed");
+ RNA_def_property_range(prop, 0, 1024);
RNA_def_property_ui_text(prop, "Max Speed", "Maximum speed, or zero for none");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
prop = RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "fac");
+ RNA_def_property_range(prop, 0.0f, 2.0f);
RNA_def_property_ui_text(prop, "Blur Factor", "Scaling factor for motion vectors; actually 'shutter speed' in frames");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "curved", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_curved", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "curved", 1);
RNA_def_property_ui_text(prop, "Curved", "Interpolate between frames in a bezier curve, rather than linearly");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1033,30 +1055,30 @@ static void def_cmp_image(StructRNA *srna)
RNA_def_struct_sdna_from(srna, "ImageUser", "storage");
- prop = RNA_def_property(srna, "frames", PROP_INT, PROP_NONE);
+ prop = RNA_def_property(srna, "frame_duration", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "frames");
- RNA_def_property_range(prop, 1, MAXFRAMEF);
+ RNA_def_property_range(prop, 0, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Frames", "Number of images used in animation");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "start", 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, 1, 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, "offset", PROP_INT, PROP_NONE);
+ prop = RNA_def_property(srna, "frame_offset", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "offset");
RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Offset", "Offsets the number of the frame to use in the animation");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "cyclic", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_cyclic", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "cycl", 1);
RNA_def_property_ui_text(prop, "Cyclic", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "auto_refresh", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_auto_refresh", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_ANIM_ALWAYS);
RNA_def_property_ui_text(prop, "Auto-Refresh", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1115,9 +1137,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);
@@ -1126,7 +1148,7 @@ static void def_cmp_output_file(StructRNA *srna)
RNA_def_property_ui_text(prop, "Image Type", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "exr_half", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_exr_half", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "subimtype", R_OPENEXR_HALF);
RNA_def_property_ui_text(prop, "Half", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1142,16 +1164,17 @@ static void def_cmp_output_file(StructRNA *srna)
RNA_def_property_range(prop, 1, 100);
RNA_def_property_ui_text(prop, "Quality", "");
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, "frame_start", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "sfra");
+ RNA_def_property_int_funcs(prop, NULL, "rna_Image_start_frame_set", NULL);
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, "frame_end", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "efra");
+ RNA_def_property_int_funcs(prop, NULL, "rna_Image_end_frame_set", NULL);
RNA_def_property_range(prop, MINFRAMEF, MAXFRAMEF);
RNA_def_property_ui_text(prop, "End Frame", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1176,6 +1199,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);
@@ -1195,7 +1219,7 @@ static void def_cmp_rotate(StructRNA *srna)
{2, "BICUBIC", 0, "Bicubic", ""},
{0, NULL, 0, NULL, NULL}};
- prop = RNA_def_property(srna, "filter", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "filter_type", 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");
@@ -1229,19 +1253,19 @@ static void def_cmp_color_matte(StructRNA *srna)
RNA_def_struct_sdna_from(srna, "NodeChroma", "storage");
- prop = RNA_def_property(srna, "h", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "color_hue", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t1");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "H", "Hue tolerance for colors to be considered a keying color");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "s", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "color_saturation", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t2");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "S", "Saturation Tolerance for the color");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "v", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "color_value", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t3");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "V", "Value Tolerance for the color");
@@ -1296,7 +1320,7 @@ 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");
- prop = RNA_def_property(srna, "algorithm", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "limit_method", 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", "");
@@ -1316,7 +1340,7 @@ static void def_cmp_color_spill(StructRNA *srna)
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);
+ prop = RNA_def_property(srna, "use_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");
@@ -1346,14 +1370,14 @@ static void def_cmp_luma_matte(StructRNA *srna)
RNA_def_struct_sdna_from(srna, "NodeChroma", "storage");
- prop = RNA_def_property(srna, "high", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "limit_max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t1");
RNA_def_property_float_funcs(prop, NULL, "rna_Matte_t1_set", NULL);
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "High", "Values higher than this setting are 100% opaque");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "low", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "limit_min", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t2");
RNA_def_property_float_funcs(prop, NULL, "rna_Matte_t2_set", NULL);
RNA_def_property_range(prop, 0.0f, 1.0f);
@@ -1367,14 +1391,14 @@ static void def_cmp_chroma_matte(StructRNA *srna)
RNA_def_struct_sdna_from(srna, "NodeChroma", "storage");
- prop = RNA_def_property(srna, "acceptance", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "tolerance", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t1");
RNA_def_property_float_funcs(prop, NULL, "rna_Matte_t1_set", NULL);
RNA_def_property_range(prop, 1.0f, 80.0f);
RNA_def_property_ui_text(prop, "Acceptance", "Tolerance for a color to be considered a keying color");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "cutoff", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t2");
RNA_def_property_float_funcs(prop, NULL, "rna_Matte_t2_set", NULL);
RNA_def_property_range(prop, 0.0f, 30.0f);
@@ -1422,7 +1446,7 @@ 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);
+ prop= RNA_def_property(srna, "matte_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");
@@ -1431,7 +1455,7 @@ static void def_cmp_channel_matte(StructRNA *srna)
RNA_def_struct_sdna_from(srna, "NodeChroma", "storage");
- prop = RNA_def_property(srna, "algorithm", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "limit_method", 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");
@@ -1444,14 +1468,14 @@ static void def_cmp_channel_matte(StructRNA *srna)
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);
+ prop = RNA_def_property(srna, "limit_max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t1");
RNA_def_property_float_funcs(prop, NULL, "rna_Matte_t1_set", NULL);
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "High", "Values higher than this setting are 100% opaque");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "low", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "limit_min", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t2");
RNA_def_property_float_funcs(prop, NULL, "rna_Matte_t2_set", NULL);
RNA_def_property_range(prop, 0.0f, 1.0f);
@@ -1543,7 +1567,7 @@ static void def_cmp_defocus(StructRNA *srna)
RNA_def_property_ui_text(prop, "Angle", "Bokeh shape rotation offset in degrees");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "gamma_correction", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_gamma_correction", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gamco", 1);
RNA_def_property_ui_text(prop, "Gamma Correction", "Enable gamma correction before and after main process");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1555,7 +1579,7 @@ static void def_cmp_defocus(StructRNA *srna)
RNA_def_property_ui_text(prop, "fStop", "Amount of focal blur, 128=infinity=perfect focus, half the value doubles the blur radius");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "max_blur", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "blur_max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "maxblur");
RNA_def_property_range(prop, 0.0f, 10000.0f);
RNA_def_property_ui_text(prop, "Max Blur", "blur limit, maximum CoC radius, 0=no limit");
@@ -1567,7 +1591,7 @@ static void def_cmp_defocus(StructRNA *srna)
RNA_def_property_ui_text(prop, "Threshold", "CoC radius threshold, prevents background bleed on in-focus midground, 0=off");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "preview", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_preview", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "preview", 1);
RNA_def_property_ui_text(prop, "Preview", "Enable sampling mode, useful for preview when using low samplecounts");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1594,12 +1618,12 @@ static void def_cmp_invert(StructRNA *srna)
{
PropertyRNA *prop;
- prop = RNA_def_property(srna, "rgb", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "invert_rgb", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom1", CMP_CHAN_RGB);
RNA_def_property_ui_text(prop, "RGB", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "alpha", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "invert_alpha", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom1", CMP_CHAN_A);
RNA_def_property_ui_text(prop, "Alpha", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1609,36 +1633,65 @@ static void def_cmp_crop(StructRNA *srna)
{
PropertyRNA *prop;
- prop = RNA_def_property(srna, "crop_size", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_crop_size", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom1", 1);
RNA_def_property_ui_text(prop, "Crop Image Size", "Whether to crop the size of the input image");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
-
+
+ prop = RNA_def_property(srna, "relative", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "custom2", 1);
+ RNA_def_property_ui_text(prop, "Relative", "Use relative values to crop image");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+
RNA_def_struct_sdna_from(srna, "NodeTwoXYs", "storage");
- prop = RNA_def_property(srna, "x1", PROP_INT, PROP_NONE);
+ prop = RNA_def_property(srna, "min_x", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "x1");
RNA_def_property_range(prop, 0, 10000);
RNA_def_property_ui_text(prop, "X1", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "x2", PROP_INT, PROP_NONE);
+ prop = RNA_def_property(srna, "max_x", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "x2");
RNA_def_property_range(prop, 0, 10000);
RNA_def_property_ui_text(prop, "X2", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "y1", PROP_INT, PROP_NONE);
+ prop = RNA_def_property(srna, "min_y", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "y1");
RNA_def_property_range(prop, 0, 10000);
RNA_def_property_ui_text(prop, "Y1", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "y2", PROP_INT, PROP_NONE);
+ prop = RNA_def_property(srna, "max_y", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "y2");
RNA_def_property_range(prop, 0, 10000);
RNA_def_property_ui_text(prop, "Y2", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+
+ prop = RNA_def_property(srna, "rel_min_x", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "fac_x1");
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_text(prop, "X1", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+
+ prop = RNA_def_property(srna, "rel_max_x", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "fac_x2");
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_text(prop, "X2", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+
+ prop = RNA_def_property(srna, "rel_min_y", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "fac_y1");
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_text(prop, "Y1", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+
+ prop = RNA_def_property(srna, "rel_max_y", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "fac_y2");
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_text(prop, "Y2", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
}
static void def_cmp_dblur(StructRNA *srna)
@@ -1653,7 +1706,7 @@ static void def_cmp_dblur(StructRNA *srna)
RNA_def_property_ui_text(prop, "Iterations", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "wrap", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_wrap", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "wrap", 1);
RNA_def_property_ui_text(prop, "Wrap", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1810,7 +1863,7 @@ static void def_cmp_glare(StructRNA *srna)
RNA_def_property_ui_text(prop, "Fade", "Streak fade-out factor");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "rotate_45", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_rotate_45", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "angle", 1);
RNA_def_property_ui_text(prop, "Rotate 45", "Simple star filter: add 45 degree rotation offset");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1890,17 +1943,17 @@ static void def_cmp_lensdist(StructRNA *srna)
RNA_def_struct_sdna_from(srna, "NodeLensDist", "storage");
- prop = RNA_def_property(srna, "projector", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_projector", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "proj", 1);
RNA_def_property_ui_text(prop, "Projector", "Enable/disable projector mode. Effect is applied in horizontal direction only");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "jitter", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_jitter", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "jit", 1);
RNA_def_property_ui_text(prop, "Jitter", "Enable/disable jittering; faster, but also noisier");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "fit", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_fit", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "fit", 1);
RNA_def_property_ui_text(prop, "Fit", "For positive distortion factor only: scale image such that black areas are not visible");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1916,7 +1969,7 @@ static void def_cmp_colorbalance(StructRNA *srna)
{1, "OFFSET_POWER_SLOPE", 0, "Offset/Power/Slope (ASC-CDL)", "ASC-CDL standard color correction"},
{0, NULL, 0, NULL, NULL}};
- prop = RNA_def_property(srna, "correction_formula", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "correction_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "custom1");
RNA_def_property_enum_items(prop, type_items);
RNA_def_property_ui_text(prop, "Correction Formula", "");
@@ -1993,7 +2046,7 @@ static void def_tex_output(StructRNA *srna)
RNA_def_struct_sdna_from(srna, "TexNodeOutput", "storage");
- prop = RNA_def_property(srna, "output_name", PROP_STRING, PROP_NONE);
+ prop = RNA_def_property(srna, "filepath", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "name");
RNA_def_property_ui_text(prop, "Output Name", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index a0c638b484b..45407a8e375 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -33,6 +33,7 @@
#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"
@@ -40,6 +41,9 @@
#include "DNA_property_types.h"
#include "DNA_scene_types.h"
+#include "BLO_sys_types.h" /* needed for intptr_t used in ED_mesh.h */
+#include "ED_mesh.h"
+
#include "WM_api.h"
#include "WM_types.h"
@@ -121,25 +125,61 @@ EnumPropertyItem object_type_curve_items[] = {
#include "BKE_mesh.h"
#include "BKE_particle.h"
#include "BKE_scene.h"
+#include "BKE_deform.h"
#include "BLI_editVert.h" /* for EditMesh->mat_nr */
#include "ED_mesh.h"
#include "ED_object.h"
#include "ED_particle.h"
+#include "ED_curve.h"
+#include "ED_lattice.h"
-void rna_Object_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+static 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)
+static void rna_Object_matrix_world_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
object_apply_mat4(ptr->id.data, ((Object *)ptr->id.data)->obmat);
- rna_Object_update(bmain, scene, ptr);
+ rna_Object_internal_update(bmain, scene, ptr);
+}
+
+static 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);
+ }
+}
+
+static 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_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
+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,21 +188,33 @@ void rna_Object_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
void rna_Object_active_shape_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Object *ob= ptr->id.data;
- int editmode= (scene->obedit == ob && ob->type == OB_MESH);
- if(editmode) {
+ if(scene->obedit == ob) {
/* exit/enter editmode to get new shape */
- load_editMesh(scene, ob);
- make_editMesh(scene, ob);
+ switch(ob->type) {
+ case OB_MESH:
+ load_editMesh(scene, ob);
+ make_editMesh(scene, ob);
+ break;
+ case OB_CURVE:
+ case OB_SURF:
+ load_editNurb(ob);
+ make_editNurb(ob);
+ break;
+ case OB_LATTICE:
+ load_editLatt(ob);
+ make_editLatt(ob);
+ break;
+ }
}
- 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)
{
DAG_id_flush_update(ptr->id.data, OB_RECALC_OB);
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
}
/* when changing the selection flag the scene needs updating */
@@ -180,7 +232,7 @@ static void rna_Base_select_update(Main *bmain, Scene *scene, PointerRNA *ptr)
ED_base_object_select(base, mode);
}
-static void rna_Object_layer_update__internal(Scene *scene, Base *base, Object *ob)
+static void rna_Object_layer_update__internal(Main *bmain, Scene *scene, Base *base, Object *ob)
{
/* try to avoid scene sort */
if((ob->lay & scene->lay) && (base->lay & scene->lay)) {
@@ -188,7 +240,7 @@ static void rna_Object_layer_update__internal(Scene *scene, Base *base, Object *
} else if((ob->lay & scene->lay)==0 && (base->lay & scene->lay)==0) {
/* pass */
} else {
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
}
}
@@ -203,16 +255,16 @@ static void rna_Object_layer_update(Main *bmain, Scene *scene, PointerRNA *ptr)
SWAP(int, base->lay, ob->lay);
- rna_Object_layer_update__internal(scene, base, ob);
+ rna_Object_layer_update__internal(bmain, scene, base, ob);
ob->lay= base->lay;
}
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);
+ rna_Object_layer_update__internal(bmain, scene, base, ob);
ob->lay= base->lay;
}
@@ -400,32 +452,19 @@ int rna_object_vgroup_name_index_length(PointerRNA *ptr, int index)
void rna_object_vgroup_name_index_set(PointerRNA *ptr, const char *value, short *index)
{
Object *ob= (Object*)ptr->id.data;
- bDeformGroup *dg;
- int a;
-
- for(a=1, dg=ob->defbase.first; dg; dg=dg->next, a++) {
- if(strcmp(dg->name, value) == 0) {
- *index= a;
- return;
- }
- }
-
- *index= 0;
+ *index= defgroup_name_index(ob, value) + 1;
}
void rna_object_vgroup_name_set(PointerRNA *ptr, const char *value, char *result, int maxlen)
{
Object *ob= (Object*)ptr->id.data;
- bDeformGroup *dg;
-
- for(dg=ob->defbase.first; dg; dg=dg->next) {
- if(strcmp(dg->name, value) == 0) {
- BLI_strncpy(result, value, maxlen);
- return;
- }
+ bDeformGroup *dg= defgroup_find_name(ob, value);
+ if(dg) {
+ BLI_strncpy(result, value, maxlen);
+ return;
}
- BLI_strncpy(result, "", maxlen);
+ result[0]= '\0';
}
void rna_object_uvlayer_name_set(PointerRNA *ptr, const char *value, char *result, int maxlen)
@@ -858,25 +897,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; i<OB_MAX_STATES; i++)
+ values[i] = (ob->state & (1<<i)) | all_states;
+}
+
static void rna_GameObjectSettings_state_set(PointerRNA *ptr, const int *values)
{
Object *ob= (Object*)ptr->data;
int i, tot= 0;
/* ensure we always have some state selected */
- for(i=0; i<20; i++)
+ for(i=0; i<OB_MAX_STATES; i++)
if(values[i])
tot++;
if(tot==0)
return;
- for(i=0; i<20; i++) {
+ for(i=0; i<OB_MAX_STATES; i++) {
if(values[i]) ob->state |= (1<<i);
else ob->state &= ~(1<<i);
}
}
+static void rna_GameObjectSettings_used_state_get(PointerRNA *ptr, int *values)
+{
+ Object *ob= (Object*)ptr->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; i<OB_MAX_STATES; i++) {
+ if (cont->state_mask & (1<<i))
+ values[i] = 1;
+ }
+ }
+}
+
static void rna_Object_active_shape_key_index_range(PointerRNA *ptr, int *min, int *max)
{
Object *ob= (Object*)ptr->id.data;
@@ -951,31 +1017,32 @@ 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_constraints_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 void rna_Object_constraints_remove(Object *object, ReportList *reports, bConstraint *con)
{
- int ok = remove_constraint_index(&object->constraints, index);
- if(ok) {
- ED_object_constraint_set_active(object, NULL);
- WM_main_add_notifier(NC_OBJECT|ND_CONSTRAINT, object);
+ if(BLI_findindex(&object->constraints, con) == -1) {
+ BKE_reportf(reports, RPT_ERROR, "Constraint '%s' not found in object '%s'.", con->name, object->id.name+2);
+ return;
}
- return ok;
+ remove_constraint(&object->constraints, con);
+ ED_object_constraint_set_active(object, NULL);
+ WM_main_add_notifier(NC_OBJECT|ND_CONSTRAINT, object);
}
static ModifierData *rna_Object_modifier_new(Object *object, bContext *C, ReportList *reports, char *name, int type)
{
- return ED_object_modifier_add(reports, CTX_data_scene(C), object, name, type);
+ return ED_object_modifier_add(reports, CTX_data_main(C), CTX_data_scene(C), object, name, type);
}
static void rna_Object_modifier_remove(Object *object, bContext *C, ReportList *reports, ModifierData *md)
{
- ED_object_modifier_remove(reports, CTX_data_scene(C), object, md);
+ ED_object_modifier_remove(reports, CTX_data_main(C), CTX_data_scene(C), object, md);
}
static void rna_Object_boundbox_get(PointerRNA *ptr, float *values)
@@ -991,6 +1058,38 @@ static void rna_Object_boundbox_get(PointerRNA *ptr, float *values)
}
+static void rna_Object_add_vertex_to_group(Object *ob, int vertex_index, bDeformGroup *def, float weight, int assignmode)
+{
+ /* creates dverts if needed */
+ ED_vgroup_vert_add(ob, def, vertex_index, weight, assignmode);
+}
+
+/* generic poll functions */
+int rna_Lattice_object_poll(PointerRNA *ptr, PointerRNA value)
+{
+ return ((Object *)value.id.data)->type == OB_LATTICE;
+}
+
+int rna_Curve_object_poll(PointerRNA *ptr, PointerRNA value)
+{
+ return ((Object *)value.id.data)->type == OB_CURVE;
+}
+
+int rna_Armature_object_poll(PointerRNA *ptr, PointerRNA value)
+{
+ return ((Object *)value.id.data)->type == OB_ARMATURE;
+}
+
+int rna_Mesh_object_poll(PointerRNA *ptr, PointerRNA value)
+{
+ return ((Object *)value.id.data)->type == OB_MESH;
+}
+
+int rna_Camera_object_poll(PointerRNA *ptr, PointerRNA value)
+{
+ return ((Object *)value.id.data)->type == OB_CAMERA;
+}
+
#else
static void rna_def_vertex_group(BlenderRNA *brna)
@@ -1035,15 +1134,15 @@ static void rna_def_material_slot(BlenderRNA *brna)
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_funcs(prop, "rna_MaterialSlot_material_get", "rna_MaterialSlot_material_set", NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_MaterialSlot_material_get", "rna_MaterialSlot_material_set", NULL, 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);
@@ -1111,12 +1210,13 @@ 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);
+ prop= RNA_def_property(srna, "use_actor", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_ACTOR);
RNA_def_property_ui_text(prop, "Actor", "Object is detected by the Near and Radar sensor");
- prop= RNA_def_property(srna, "ghost", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_ghost", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_GHOST);
RNA_def_property_ui_text(prop, "Ghost", "Object does not restitute collisions, like a ghost");
@@ -1130,7 +1230,7 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Radius", "Radius of bounding sphere and material physics");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
- prop= RNA_def_property(srna, "no_sleeping", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_sleep", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_COLLISION_RESPONSE);
RNA_def_property_ui_text(prop, "No Sleeping", "Disable auto (de)activation in physics simulation");
@@ -1144,40 +1244,40 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
RNA_def_property_range(prop, 0.0, 1.0);
RNA_def_property_ui_text(prop, "Rotation Damping", "General rotation damping");
- prop= RNA_def_property(srna, "minimum_velocity", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "velocity_min", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "min_vel");
RNA_def_property_range(prop, 0.0, 1000.0);
RNA_def_property_ui_text(prop, "Velocity Min", "Clamp velocity to this minimum speed (except when totally still)");
- prop= RNA_def_property(srna, "maximum_velocity", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "velocity_max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "max_vel");
RNA_def_property_range(prop, 0.0, 1000.0);
RNA_def_property_ui_text(prop, "Velocity Max", "Clamp velocity to this maximum speed");
/* lock position */
- prop= RNA_def_property(srna, "lock_x_axis", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock_location_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gameflag2", OB_LOCK_RIGID_BODY_X_AXIS);
RNA_def_property_ui_text(prop, "Lock X Axis", "Disable simulation of linear motion along the X axis");
- prop= RNA_def_property(srna, "lock_y_axis", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock_location_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gameflag2", OB_LOCK_RIGID_BODY_Y_AXIS);
RNA_def_property_ui_text(prop, "Lock Y Axis", "Disable simulation of linear motion along the Y axis");
- prop= RNA_def_property(srna, "lock_z_axis", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock_location_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gameflag2", OB_LOCK_RIGID_BODY_Z_AXIS);
RNA_def_property_ui_text(prop, "Lock Z Axis", "Disable simulation of linear motion along the Z axis");
/* lock rotation */
- prop= RNA_def_property(srna, "lock_x_rot_axis", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock_rotation_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gameflag2", OB_LOCK_RIGID_BODY_X_ROT_AXIS);
RNA_def_property_ui_text(prop, "Lock X Rotation Axis", "Disable simulation of angular motion along the X axis");
- prop= RNA_def_property(srna, "lock_y_rot_axis", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock_rotation_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gameflag2", OB_LOCK_RIGID_BODY_Y_ROT_AXIS);
RNA_def_property_ui_text(prop, "Lock Y Rotation Axis", "Disable simulation of angular motion along the Y axis");
- prop= RNA_def_property(srna, "lock_z_rot_axis", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock_rotation_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gameflag2", OB_LOCK_RIGID_BODY_Z_ROT_AXIS);
RNA_def_property_ui_text(prop, "Lock Z Rotation Axis", "Disable simulation of angular motion along the Z axis");
@@ -1187,11 +1287,11 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Lock Z Rotation Axis", "Disable simulation of angular motion along the Z axis");
- prop= RNA_def_property(srna, "material_physics", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_material_physics", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_DO_FH);
RNA_def_property_ui_text(prop, "Use Material Physics", "Use physics settings in materials");
- prop= RNA_def_property(srna, "rotate_from_normal", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_rotate_from_normal", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_ROT_FH);
RNA_def_property_ui_text(prop, "Rotate From Normal", "Use face normal to rotate object, so that it points away from the surface");
@@ -1200,7 +1300,7 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
RNA_def_property_range(prop, 0.0, 1.0);
RNA_def_property_ui_text(prop, "Form Factor", "Form factor scales the inertia tensor");
- prop= RNA_def_property(srna, "anisotropic_friction", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_anisotropic_friction", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_ANISOTROPIC_FRICTION);
RNA_def_property_ui_text(prop, "Anisotropic Friction", "Enable anisotropic friction");
@@ -1213,16 +1313,16 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_BOUNDS);
RNA_def_property_ui_text(prop, "Use Collision Bounds", "Specify a collision bounds type other than the default");
- prop= RNA_def_property(srna, "collision_bounds", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "collision_bounds_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "boundtype");
RNA_def_property_enum_items(prop, collision_bounds_items);
RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Object_collision_bounds_itemf");
RNA_def_property_ui_text(prop, "Collision Bounds", "Selects the collision type");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
- prop= RNA_def_property(srna, "collision_compound", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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");
@@ -1235,20 +1335,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, "states_visible", 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, "initial_state", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "used_states", 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, "states_initial", 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);
+ prop= RNA_def_property(srna, "show_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, "use_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)
@@ -1268,34 +1384,30 @@ static void rna_def_object_constraints(BlenderRNA *brna, PropertyRNA *cprop)
/* Collection active property */
prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Constraint");
- RNA_def_property_pointer_funcs(prop, "rna_Object_active_constraint_get", "rna_Object_active_constraint_set", NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Object_active_constraint_get", "rna_Object_active_constraint_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Active Constraint", "Active Object constraint");
/* Constraint collection */
- func= RNA_def_function(srna, "new", "rna_Object_constraint_new");
- RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+ func= RNA_def_function(srna, "new", "rna_Object_constraints_new");
RNA_def_function_ui_description(func, "Add a new constraint to this object");
- /* return type */
- parm= RNA_def_pointer(func, "constraint", "Constraint", "", "New constraint.");
- RNA_def_function_return(func, parm);
/* object to add */
parm= RNA_def_enum(func, "type", constraint_type_items, 1, "", "Constraint type to add.");
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.");
+ parm= RNA_def_pointer(func, "constraint", "Constraint", "", "New constraint.");
RNA_def_function_return(func, parm);
- /* object to add */
- parm= RNA_def_int(func, "index", 0, 0, INT_MAX, "Index", "", 0, INT_MAX);
- RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ func= RNA_def_function(srna, "remove", "rna_Object_constraints_remove");
+ RNA_def_function_ui_description(func, "Remove a constraint from this object.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ /* constraint to remove */
+ parm= RNA_def_pointer(func, "constraint", "Constraint", "", "Removed constraint.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
-/* armature.bones.* */
+/* object.modifiers */
static void rna_def_object_modifiers(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
@@ -1315,7 +1427,7 @@ static void rna_def_object_modifiers(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Active EditBone", "Armatures active edit bone");
//RNA_def_property_update(prop, 0, "rna_Armature_act_editbone_update");
- RNA_def_property_pointer_funcs(prop, NULL, "rna_Armature_act_edit_bone_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_Armature_act_edit_bone_set", NULL, NULL);
/* todo, redraw */
// RNA_def_property_collection_active(prop, prop_act);
@@ -1324,7 +1436,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 */
@@ -1340,9 +1452,92 @@ static void rna_def_object_modifiers(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove an existing modifier from the object.");
/* target to remove*/
parm= RNA_def_pointer(func, "modifier", "Modifier", "", "Modifier to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+}
+
+/* object.particle_systems */
+static void rna_def_object_particle_systems(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+
+ PropertyRNA *prop;
+
+ // FunctionRNA *func;
+ // PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "ParticleSystems");
+ srna= RNA_def_struct(brna, "ParticleSystems", NULL);
+ RNA_def_struct_sdna(srna, "Object");
+ RNA_def_struct_ui_text(srna, "Particle Systems", "Collection of particle systems");
+
+ prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "ParticleSystem");
+ RNA_def_property_pointer_funcs(prop, "rna_Object_active_particle_system_get", NULL, NULL, NULL);
+ RNA_def_property_ui_text(prop, "Active Particle System", "Active particle system being displayed");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+
+ prop= RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_funcs(prop, "rna_Object_active_particle_system_index_get", "rna_Object_active_particle_system_index_set", "rna_Object_active_particle_system_index_range");
+ RNA_def_property_ui_text(prop, "Active Particle System Index", "Index of active particle system slot");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_particle_update");
+}
+
+
+/* object.vertex_groups */
+static void rna_def_object_vertex_groups(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ static EnumPropertyItem assign_mode_items[] = {
+ {WEIGHT_REPLACE, "REPLACE", 0, "Replace", "Replace"},
+ {WEIGHT_ADD, "ADD", 0, "Add", "Add"},
+ {WEIGHT_SUBTRACT, "SUBTRACT", 0, "Subtract", "Subtract"},
+ {0, NULL, 0, NULL, NULL}
+ };
+
+ StructRNA *srna;
+
+ PropertyRNA *prop;
+
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "VertexGroups");
+ srna= RNA_def_struct(brna, "VertexGroups", NULL);
+ RNA_def_struct_sdna(srna, "Object");
+ RNA_def_struct_ui_text(srna, "Vertex Groups", "Collection of vertex groups");
+
+ prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
+ 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, 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_internal_update_data");
+
+ prop= RNA_def_property(srna, "active_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_internal_update_data");
+
+ /* vertex groups */ // add_vertex_group
+ func= RNA_def_function(srna, "new", "ED_vgroup_add_name");
+ RNA_def_function_ui_description(func, "Add vertex group to object.");
+ parm= RNA_def_string(func, "name", "Group", 0, "", "Vertex group name."); /* optional */
+ parm= RNA_def_pointer(func, "group", "VertexGroup", "", "New vertex group.");
+ RNA_def_function_return(func, parm);
+
+ // XXX, this will be very slow, bad API design! :S
+ func= RNA_def_function(srna, "assign", "rna_Object_add_vertex_to_group");
+ RNA_def_function_ui_description(func, "Add vertex to a vertex group.");
+ parm= RNA_def_int(func, "index", 0, 0, 0, "", "Vertex index.", 0, 0);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_pointer(func, "group", "VertexGroup", "", "Vertex group to add vertex to.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_float(func, "weight", 0, 0.0f, 1.0f, "", "Vertex weight.", 0.0f, 1.0f);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_enum(func, "type", assign_mode_items, 0, "", "Vertex assign mode.");
RNA_def_property_flag(parm, PROP_REQUIRED);
}
+
static void rna_def_object(BlenderRNA *brna)
{
StructRNA *srna;
@@ -1357,7 +1552,6 @@ static void rna_def_object(BlenderRNA *brna)
{OB_MBALL, "META", 0, "Meta", ""},
{OB_LAMP, "LAMP", 0, "Lamp", ""},
{OB_CAMERA, "CAMERA", 0, "Camera", ""},
- {OB_WAVE, "WAVE", 0, "Wave", ""},
{OB_LATTICE, "LATTICE", 0, "Lattice", ""},
{OB_ARMATURE, "ARMATURE", 0, "Armature", ""},
{0, NULL, 0, NULL, NULL}};
@@ -1400,7 +1594,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[] = {
@@ -1436,11 +1630,11 @@ static void rna_def_object(BlenderRNA *brna)
prop= RNA_def_property(srna, "data", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "ID");
- RNA_def_property_pointer_funcs(prop, NULL, "rna_Object_data_set", "rna_Object_data_typef");
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_Object_data_set", "rna_Object_data_typef", NULL);
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");
@@ -1462,9 +1656,9 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_layer_update");
- prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SELECT);
- RNA_def_property_ui_text(prop, "Selected", "Object selection state");
+ RNA_def_property_ui_text(prop, "Select", "Object selection state");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_select_update");
/* for data access */
@@ -1472,11 +1666,11 @@ 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 */
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_pointer_funcs(prop, NULL, "rna_Object_parent_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
RNA_def_property_ui_text(prop, "Parent", "Parent Object");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_dependency_update");
@@ -1493,7 +1687,7 @@ 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");
@@ -1507,13 +1701,13 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "trackflag");
RNA_def_property_enum_items(prop, track_items);
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_update");
+ 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);
@@ -1531,10 +1725,10 @@ static void rna_def_object(BlenderRNA *brna)
prop= RNA_def_property(srna, "active_material", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Material");
- RNA_def_property_pointer_funcs(prop, "rna_Object_active_material_get", "rna_Object_active_material_set", NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Object_active_material_get", "rna_Object_active_material_set", NULL, 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");
@@ -1547,14 +1741,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...
@@ -1565,81 +1759,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);
@@ -1650,14 +1847,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);
@@ -1675,7 +1879,7 @@ static void rna_def_object(BlenderRNA *brna)
prop= RNA_def_property(srna, "game", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "GameObjectSettings");
- RNA_def_property_pointer_funcs(prop, "rna_Object_game_settings_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Object_game_settings_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Game Settings", "Game engine related settings for the object");
/* vertex groups */
@@ -1683,18 +1887,7 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_collection_sdna(prop, NULL, "defbase", NULL);
RNA_def_property_struct_type(prop, "VertexGroup");
RNA_def_property_ui_text(prop, "Vertex Groups", "Vertex groups of the object");
-
- prop= RNA_def_property(srna, "active_vertex_group", PROP_POINTER, PROP_NONE);
- 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");
-
- 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_object_vertex_groups(brna, prop);
/* empty */
prop= RNA_def_property(srna, "empty_draw_type", PROP_ENUM, PROP_NONE);
@@ -1705,8 +1898,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);
@@ -1725,13 +1918,13 @@ static void rna_def_object(BlenderRNA *brna)
prop= RNA_def_property(srna, "field", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "pd");
RNA_def_property_struct_type(prop, "FieldSettings");
- RNA_def_property_pointer_funcs(prop, "rna_Object_field_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Object_field_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Field Settings", "Settings for using the objects as a field in physics simulation");
prop= RNA_def_property(srna, "collision", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "pd");
RNA_def_property_struct_type(prop, "CollisionSettings");
- RNA_def_property_pointer_funcs(prop, "rna_Object_collision_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Object_collision_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Collision Settings", "Settings for using the objects as a collider in physics simulation");
prop= RNA_def_property(srna, "soft_body", PROP_POINTER, PROP_NONE);
@@ -1743,32 +1936,25 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_collection_sdna(prop, NULL, "particlesystem", NULL);
RNA_def_property_struct_type(prop, "ParticleSystem");
RNA_def_property_ui_text(prop, "Particle Systems", "Particle systems emitted from the object");
-
- prop= RNA_def_property(srna, "active_particle_system", PROP_POINTER, PROP_NONE);
- RNA_def_property_struct_type(prop, "ParticleSystem");
- RNA_def_property_pointer_funcs(prop, "rna_Object_active_particle_system_get", NULL, NULL);
- RNA_def_property_ui_text(prop, "Active Particle System", "Active particle system being displayed");
- RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
-
- prop= RNA_def_property(srna, "active_particle_system_index", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_int_funcs(prop, "rna_Object_active_particle_system_index_get", "rna_Object_active_particle_system_index_set", "rna_Object_active_particle_system_index_range");
- RNA_def_property_ui_text(prop, "Active Particle System Index", "Index of active particle system slot");
- RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_particle_update");
+ rna_def_object_particle_systems(brna, prop);
/* restrict */
- prop= RNA_def_property(srna, "restrict_view", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "hide", 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);
+ prop= RNA_def_property(srna, "hide_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);
+ prop= RNA_def_property(srna, "hide_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 */
@@ -1779,10 +1965,10 @@ static void rna_def_object(BlenderRNA *brna)
/* duplicates */
// XXX: evil old crap
- prop= RNA_def_property(srna, "slow_parent", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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");
@@ -1793,9 +1979,9 @@ 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);
+ prop= RNA_def_property(srna, "use_dupli_vertices_rotation", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "transflag", OB_DUPLIROT);
RNA_def_property_ui_text(prop, "Dupli Verts Rotation", "Rotate dupli according to vertex normal");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
@@ -1803,7 +1989,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");
@@ -1821,67 +2007,71 @@ 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, "is_duplicator", 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);
+ prop= RNA_def_property(srna, "use_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);
+ prop= RNA_def_property(srna, "use_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);
+ prop= RNA_def_property(srna, "use_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);
+ prop= RNA_def_property(srna, "use_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);
+ prop= RNA_def_property(srna, "draw_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "dt");
RNA_def_property_enum_items(prop, drawtype_items);
RNA_def_property_ui_text(prop, "Maximum Draw Type", "Maximum draw type to display object with in viewport");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
- prop= RNA_def_property(srna, "draw_bounds", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_bounds", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dtx", OB_BOUNDBOX);
RNA_def_property_ui_text(prop, "Draw Bounds", "Displays the object's bounds");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
@@ -1892,32 +2082,32 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Draw Bounds Type", "Object boundary display type");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
- prop= RNA_def_property(srna, "draw_name", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_name", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dtx", OB_DRAWNAME);
RNA_def_property_ui_text(prop, "Draw Name", "Displays the object's name");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
- prop= RNA_def_property(srna, "draw_axis", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_axis", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dtx", OB_AXIS);
RNA_def_property_ui_text(prop, "Draw Axis", "Displays the object's origin and axis");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
- prop= RNA_def_property(srna, "draw_texture_space", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_texture_space", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dtx", OB_TEXSPACE);
RNA_def_property_ui_text(prop, "Draw Texture Space", "Displays the object's texture space");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
- prop= RNA_def_property(srna, "draw_wire", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_wire", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dtx", OB_DRAWWIRE);
RNA_def_property_ui_text(prop, "Draw Wire", "Adds the object's wireframe over solid drawing");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
- prop= RNA_def_property(srna, "draw_transparent", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_transparent", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dtx", OB_DRAWTRANSP);
RNA_def_property_ui_text(prop, "Draw Transparent", "Enables transparent materials for the object (Mesh only)");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
- prop= RNA_def_property(srna, "x_ray", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_x_ray", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dtx", OB_DRAWXRAY);
RNA_def_property_ui_text(prop, "X-Ray", "Makes the object draw in front of others");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
@@ -1941,21 +2131,21 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Pose", "Current pose for armatures");
/* shape keys */
- prop= RNA_def_property(srna, "shape_key_lock", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_shape_key", PROP_BOOLEAN, PROP_NONE);
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);
+ prop= RNA_def_property(srna, "use_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");
- RNA_def_property_pointer_funcs(prop, "rna_Object_active_shape_key_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Object_active_shape_key_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Active Shape Key", "Current shape key");
prop= RNA_def_property(srna, "active_shape_key_index", PROP_INT, PROP_NONE);
@@ -1980,13 +2170,13 @@ static void rna_def_dupli_object(BlenderRNA *brna)
prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "ob");
- /* RNA_def_property_pointer_funcs(prop, "rna_DupliObject_object_get", NULL, NULL); */
+ /* RNA_def_property_pointer_funcs(prop, "rna_DupliObject_object_get", NULL, NULL, NULL); */
RNA_def_property_ui_text(prop, "Object", "Object being duplicated");
- prop= RNA_def_property(srna, "object_matrix", PROP_FLOAT, PROP_MATRIX);
+ prop= RNA_def_property(srna, "matrix_original", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "omat");
RNA_def_property_array(prop, 16);
- RNA_def_property_ui_text(prop, "Object Matrix", "Duplicated object transformation matrix");
+ RNA_def_property_ui_text(prop, "Object Matrix", "The original matrix of this object before it was duplicated");
prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "mat");
@@ -1996,7 +2186,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;
@@ -2018,22 +2208,19 @@ static void rna_def_base(BlenderRNA *brna)
RNA_def_property_boolean_funcs(prop, NULL, "rna_Base_layer_set");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Base_layer_update");
- prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BA_SELECT);
- RNA_def_property_ui_text(prop, "Selected", "Object base selection state");
+ RNA_def_property_ui_text(prop, "Select", "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 27a88006b40..d48e714ea23 100644
--- a/source/blender/makesrna/intern/rna_object_api.c
+++ b/source/blender/makesrna/intern/rna_object_api.c
@@ -35,9 +35,9 @@
#include "DNA_object_types.h"
-#include "BLO_sys_types.h" /* needed for intptr_t used in ED_mesh.h */
+// #include "BLO_sys_types.h" /* needed for intptr_t used in ED_mesh.h */
-#include "ED_mesh.h"
+// #include "ED_mesh.h"
#ifdef RNA_RUNTIME
@@ -65,19 +65,19 @@
#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) {
@@ -115,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;
}
@@ -233,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.");
@@ -248,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 */
}
@@ -261,21 +261,11 @@ static void rna_Object_free_duplilist(Object *ob, ReportList *reports)
}
}
-static bDeformGroup *rna_Object_add_vertex_group(Object *ob, char *group_name)
+/* 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)
{
- return ED_vgroup_add_name(ob, group_name);
-}
-
-static void rna_Object_add_vertex_to_group(Object *ob, int vertex_index, bDeformGroup *def, float weight, int assignmode)
-{
- /* creates dverts if needed */
- 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)
-{
- Scene *sce= CTX_data_scene(C);
+ int flag= 0;
if (ob->type == OB_FONT) {
Curve *cu = ob->data;
@@ -283,7 +273,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)
@@ -328,9 +322,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;
}
/*
@@ -408,6 +402,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)
@@ -421,17 +422,12 @@ void RNA_api_object(StructRNA *srna)
{0, NULL, 0, NULL, NULL}
};
- static EnumPropertyItem assign_mode_items[] = {
- {WEIGHT_REPLACE, "REPLACE", 0, "Replace", "Replace"}, /* TODO: more meaningful descriptions */
- {WEIGHT_ADD, "ADD", 0, "Add", "Add"},
- {WEIGHT_SUBTRACT, "SUBTRACT", 0, "Subtract", "Subtract"},
- {0, NULL, 0, NULL, NULL}
- };
-
/* 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.");
@@ -442,30 +438,14 @@ 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.");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
- /* vertex groups */
- func= RNA_def_function(srna, "add_vertex_group", "rna_Object_add_vertex_group");
- RNA_def_function_ui_description(func, "Add vertex group to object.");
- parm= RNA_def_string(func, "name", "Group", 0, "", "Vertex group name."); /* optional */
- parm= RNA_def_pointer(func, "group", "VertexGroup", "", "New vertex group.");
- RNA_def_function_return(func, parm);
-
- func= RNA_def_function(srna, "add_vertex_to_group", "rna_Object_add_vertex_to_group");
- RNA_def_function_ui_description(func, "Add vertex to a vertex group.");
- parm= RNA_def_int(func, "vertex_index", 0, 0, 0, "", "Vertex index.", 0, 0);
- RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_pointer(func, "group", "VertexGroup", "", "Vertex group to add vertex to.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_float(func, "weight", 0, 0.0f, 1.0f, "", "Vertex weight.", 0.0f, 1.0f);
- RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_enum(func, "type", assign_mode_items, 0, "", "Vertex assign mode.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
-
/* Armature */
func= RNA_def_function(srna, "find_armature", "rna_Object_find_armature");
RNA_def_function_ui_description(func, "Find armature influencing this object as a parent or via a modifier.");
@@ -506,17 +486,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 238098e85e2..f019a96844d 100644
--- a/source/blender/makesrna/intern/rna_object_force.c
+++ b/source/blender/makesrna/intern/rna_object_force.c
@@ -294,6 +294,29 @@ static void rna_Cache_active_point_cache_index_set(struct PointerRNA *ptr, int v
BLI_freelistN(&pidlist);
}
+static void rna_PointCache_frame_step_range(PointerRNA *ptr, int *min, int *max)
+{
+ Object *ob = ptr->id.data;
+ PointCache *cache= ptr->data;
+ PTCacheID *pid;
+ ListBase pidlist;
+
+ *min= 1;
+ *max= 20;
+
+ BKE_ptcache_ids_from_object(&pidlist, ob, NULL, 0);
+
+ for(pid=pidlist.first; pid; pid=pid->next) {
+ if(pid->cache == cache) {
+ if(ELEM3(pid->type, PTCACHE_TYPE_CLOTH, PTCACHE_TYPE_SMOKE_DOMAIN, PTCACHE_TYPE_SMOKE_HIGHRES))
+ *max= 1;
+ break;
+ }
+ }
+
+ BLI_freelistN(&pidlist);
+}
+
static char *rna_CollisionSettings_path(PointerRNA *ptr)
{
Object *ob= (Object*)ptr->id.data;
@@ -357,14 +380,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)
@@ -454,7 +482,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);
}
@@ -482,11 +510,11 @@ static void rna_FieldSettings_shape_update(Main *bmain, Scene *scene, PointerRNA
if(!md) {
if(pd && (pd->shape == PFIELD_SHAPE_SURFACE) && ELEM(pd->forcefield,PFIELD_GUIDE,PFIELD_TEXTURE)==0)
if(ELEM4(ob->type, OB_MESH, OB_SURF, OB_FONT, OB_CURVE))
- ED_object_modifier_add(NULL, scene, ob, NULL, eModifierType_Surface);
+ ED_object_modifier_add(NULL, bmain, scene, ob, NULL, eModifierType_Surface);
}
else {
if(!pd || pd->shape != PFIELD_SHAPE_SURFACE)
- ED_object_modifier_remove(NULL, scene, ob, md);
+ ED_object_modifier_remove(NULL, bmain, scene, ob, md);
}
WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob);
@@ -496,7 +524,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;
@@ -510,10 +538,10 @@ static void rna_FieldSettings_dependency_update(Main *bmain, Scene *scene, Point
rna_FieldSettings_shape_update(bmain, scene, ptr);
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, 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);
@@ -554,7 +582,7 @@ static void rna_EffectorWeight_update(Main *bmain, Scene *scene, PointerRNA *ptr
static void rna_EffectorWeight_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
DAG_id_flush_update((ID*)ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
@@ -612,9 +640,9 @@ static void rna_CollisionSettings_dependency_update(Main *bmain, Scene *scene, P
/* add/remove modifier as needed */
if(ob->pd->deflect && !md)
- ED_object_modifier_add(NULL, scene, ob, NULL, eModifierType_Collision);
+ ED_object_modifier_add(NULL, bmain, scene, ob, NULL, eModifierType_Collision);
else if(!ob->pd->deflect && md)
- ED_object_modifier_remove(NULL, scene, ob, md);
+ ED_object_modifier_remove(NULL, bmain, scene, ob, md);
WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob);
}
@@ -623,7 +651,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);
}
@@ -665,9 +693,28 @@ static EnumPropertyItem *rna_Effector_shape_itemf(bContext *C, PointerRNA *ptr,
}
}
-
#else
+/* ptcache.point_caches */
+static void rna_def_ptcache_point_caches(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ // FunctionRNA *func;
+ // PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "PointCaches");
+ srna= RNA_def_struct(brna, "PointCaches", NULL);
+ RNA_def_struct_sdna(srna, "PointCache");
+ RNA_def_struct_ui_text(srna, "Point Caches", "Collection of point caches");
+
+ prop= RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_funcs(prop, "rna_Cache_active_point_cache_index_get", "rna_Cache_active_point_cache_index_set", "rna_Cache_active_point_cache_index_range");
+ RNA_def_property_ui_text(prop, "Active Point Cache Index", "");
+ RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_change");
+}
+
static void rna_def_pointcache(BlenderRNA *brna)
{
StructRNA *srna;
@@ -687,8 +734,10 @@ static void rna_def_pointcache(BlenderRNA *brna)
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);
+ prop= RNA_def_property(srna, "frame_step", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "step");
RNA_def_property_range(prop, 1, 20);
+ RNA_def_property_int_funcs(prop, NULL, NULL, "rna_PointCache_frame_step_range");
RNA_def_property_ui_text(prop, "Cache Step", "Number of frames between cached frames");
RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_change");
@@ -699,20 +748,20 @@ static void rna_def_pointcache(BlenderRNA *brna)
RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change");
/* flags */
- prop= RNA_def_property(srna, "baked", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_baked", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_BAKED);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- prop= RNA_def_property(srna, "baking", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_baking", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_BAKING);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- prop= RNA_def_property(srna, "disk_cache", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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);
+ prop= RNA_def_property(srna, "is_outdated", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_OUTDATED);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Cache is outdated", "");
@@ -732,7 +781,7 @@ static void rna_def_pointcache(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "File Path", "Cache file path");
RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change");
- prop= RNA_def_property(srna, "quick_cache", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_quick_cache", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_QUICK_CACHE);
RNA_def_property_ui_text(prop, "Quick Cache", "Update simulation with cache steps");
RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_change");
@@ -742,20 +791,21 @@ static void rna_def_pointcache(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Cache Info", "Info on current cache status");
- prop= RNA_def_property(srna, "external", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_external", PROP_BOOLEAN, PROP_NONE);
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);
+ prop= RNA_def_property(srna, "point_caches", 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);
RNA_def_property_struct_type(prop, "PointCache");
RNA_def_property_ui_text(prop, "Point Cache List", "Point cache list");
-
- prop= RNA_def_property(srna, "active_point_cache_index", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_int_funcs(prop, "rna_Cache_active_point_cache_index_get", "rna_Cache_active_point_cache_index_set", "rna_Cache_active_point_cache_index_range");
- RNA_def_property_ui_text(prop, "Active Point Cache Index", "");
- RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_change");
+ rna_def_ptcache_point_caches(brna, prop);
}
static void rna_def_collision(BlenderRNA *brna)
@@ -768,7 +818,7 @@ static void rna_def_collision(BlenderRNA *brna)
RNA_def_struct_path_func(srna, "rna_CollisionSettings_path");
RNA_def_struct_ui_text(srna, "Collision Settings", "Collision settings for object in physics simulation");
- prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "deflect", 1);
RNA_def_property_ui_text(prop, "Enabled", "Enable this objects as a collider for physics systems");
RNA_def_property_update(prop, 0, "rna_CollisionSettings_dependency_update");
@@ -781,7 +831,7 @@ static void rna_def_collision(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Damping Factor", "Amount of damping during particle collision");
RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
- prop= RNA_def_property(srna, "random_damping", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "damping_random", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "pdef_rdamp");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Random Damping", "Random variation of damping");
@@ -793,7 +843,7 @@ static void rna_def_collision(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Friction Factor", "Amount of friction during particle collision");
RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
- prop= RNA_def_property(srna, "random_friction", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "friction_random", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "pdef_rfrict");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Random Friction", "Random variation of friction");
@@ -805,7 +855,7 @@ static void rna_def_collision(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Permeability", "Chance that the particle will pass through the mesh");
RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
- prop= RNA_def_property(srna, "kill_particles", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_particle_kill", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PDEFLE_KILL_PART);
RNA_def_property_ui_text(prop, "Kill Particles", "Kill collided particles");
RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
@@ -818,13 +868,13 @@ static void rna_def_collision(BlenderRNA *brna)
/* Soft Body and Cloth Interaction */
- prop= RNA_def_property(srna, "inner_thickness", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "thickness_inner", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "pdef_sbift");
RNA_def_property_range(prop, 0.001f, 1.0f);
RNA_def_property_ui_text(prop, "Inner Thickness", "Inner face thickness");
RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
- prop= RNA_def_property(srna, "outer_thickness", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "thickness_outer", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "pdef_sboft");
RNA_def_property_range(prop, 0.001f, 1.0f);
RNA_def_property_ui_text(prop, "Outer Thickness", "Outer face thickness");
@@ -862,15 +912,13 @@ static void rna_def_effector_weight(BlenderRNA *brna)
RNA_def_struct_ui_icon(srna, ICON_PHYSICS);
/* Flags */
- prop= RNA_def_property(srna, "do_growing_hair", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "apply_to_hair_growing", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", EFF_WEIGHT_DO_HAIR);
RNA_def_property_ui_text(prop, "Use For Growing Hair", "Use force fields when growing hair");
RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
/* 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");
@@ -918,7 +966,7 @@ static void rna_def_effector_weight(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Wind", "Wind effector weight");
RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
- prop= RNA_def_property(srna, "curveguide", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "curve_guide", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "weight[5]");
RNA_def_property_range(prop, -200.0f, 200.0f);
RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
@@ -1127,25 +1175,25 @@ static void rna_def_field(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Falloff Power", "Falloff power (real gravitational falloff = 2)");
RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
- prop= RNA_def_property(srna, "minimum_distance", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "distance_min", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "mindist");
RNA_def_property_range(prop, 0.0f, 1000.0f);
RNA_def_property_ui_text(prop, "Minimum Distance", "Minimum distance for the field's fall-off");
RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
- prop= RNA_def_property(srna, "maximum_distance", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "distance_max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "maxdist");
RNA_def_property_range(prop, 0.0f, 1000.0f);
RNA_def_property_ui_text(prop, "Maximum Distance", "Maximum distance for the field to work");
RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
- prop= RNA_def_property(srna, "radial_minimum", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "radial_min", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "minrad");
RNA_def_property_range(prop, 0.0f, 1000.0f);
RNA_def_property_ui_text(prop, "Minimum Radial Distance", "Minimum radial distance for the field's fall-off");
RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
- prop= RNA_def_property(srna, "radial_maximum", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "radial_max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "maxrad");
RNA_def_property_range(prop, 0.0f, 1000.0f);
RNA_def_property_ui_text(prop, "Maximum Radial Distance", "Maximum radial distance for the field to work");
@@ -1198,42 +1246,42 @@ static void rna_def_field(BlenderRNA *brna)
// "Use a maximum angle for the field to work"
RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
- prop= RNA_def_property(srna, "use_coordinates", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_object_coords", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_TEX_OBJECT);
RNA_def_property_ui_text(prop, "Use Coordinates", "Use object/global coordinates for texture");
RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
- prop= RNA_def_property(srna, "global_coordinates", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_global_coords", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_GLOBAL_CO);
RNA_def_property_ui_text(prop, "Use Global Coordinates", "Use effector/global coordinates for turbulence");
RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
- prop= RNA_def_property(srna, "force_2d", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_2d_force", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_TEX_2D);
RNA_def_property_ui_text(prop, "2D", "Apply force only in 2d");
RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
- prop= RNA_def_property(srna, "root_coordinates", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_root_coords", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_TEX_ROOTCO);
RNA_def_property_ui_text(prop, "Root Texture Coordinates", "Texture coordinates from root particle locations");
RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
- prop= RNA_def_property(srna, "do_location", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "apply_to_location", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_DO_LOCATION);
RNA_def_property_ui_text(prop, "Location", "Effect particles' location");
RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
- prop= RNA_def_property(srna, "do_rotation", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "apply_to_rotation", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_DO_ROTATION);
RNA_def_property_ui_text(prop, "Rotation", "Effect particles' dynamic rotation");
RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
- prop= RNA_def_property(srna, "do_absorption", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_absorption", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_VISIBILITY);
RNA_def_property_ui_text(prop, "Absorption", "Force gets absorbed by collision objects");
RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
- prop= RNA_def_property(srna, "multiple_springs", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_multiple_springs", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_MULTIPLE_SPRINGS);
RNA_def_property_ui_text(prop, "Multiple Springs", "Every point is effected by multiple springs");
RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
@@ -1260,23 +1308,28 @@ static void rna_def_field(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Free", "Guide-free time from particle life's end");
RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
- prop= RNA_def_property(srna, "guide_path_add", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_guide_path_add", PROP_BOOLEAN, PROP_NONE);
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 */
@@ -1302,7 +1355,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);
@@ -1326,7 +1379,7 @@ static void rna_def_game_softbody(BlenderRNA *brna)
/* Floats */
- prop= RNA_def_property(srna, "linstiff", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "linear_stiffness", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "linStiff");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Linear Stiffness", "Linear stiffness of the soft body links");
@@ -1336,24 +1389,24 @@ static void rna_def_game_softbody(BlenderRNA *brna)
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Friction", "Dynamic Friction");
- prop= RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "shape_threshold", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "kMT");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Threshold", "Shape matching threshold");
- prop= RNA_def_property(srna, "margin", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "collision_margin", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "margin");
RNA_def_property_range(prop, 0.01f, 1.0f);
RNA_def_property_ui_text(prop, "Margin", "Collision margin for soft body. Small value makes the algorithm unstable");
- prop= RNA_def_property(srna, "welding", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "weld_threshold", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "welding");
RNA_def_property_range(prop, 0.0f, 0.01f);
RNA_def_property_ui_text(prop, "Welding", "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)");
/* Integers */
- prop= RNA_def_property(srna, "position_iterations", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "location_iterations", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "piterations");
RNA_def_property_range(prop, 0, 10);
RNA_def_property_ui_text(prop, "Position Iterations", "Position solver iterations");
@@ -1365,19 +1418,19 @@ static void rna_def_game_softbody(BlenderRNA *brna)
/* Booleans */
- prop= RNA_def_property(srna, "shape_match", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_shape_match", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_BSB_SHAPE_MATCHING);
RNA_def_property_ui_text(prop, "Shape Match", "Enable soft body shape matching goal");
- prop= RNA_def_property(srna, "bending_const", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_bending_constraints", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_BSB_BENDING_CONSTRAINTS);
RNA_def_property_ui_text(prop, "Bending Const", "Enable bending constraints");
- prop= RNA_def_property(srna, "cluster_rigid_to_softbody", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_cluster_rigid_to_softbody", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "collisionflags", OB_BSB_COL_CL_RS);
RNA_def_property_ui_text(prop, "Rigid to Soft Body", "Enable cluster collision between soft and rigid body");
- prop= RNA_def_property(srna, "cluster_soft_to_softbody", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_cluster_soft_to_softbody", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "collisionflags", OB_BSB_COL_CL_SS);
RNA_def_property_ui_text(prop, "Soft to Soft Body", "Enable cluster collision between soft and soft body");
}
@@ -1396,6 +1449,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");
@@ -1488,7 +1546,7 @@ static void rna_def_softbody(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Push", "Edge spring stiffness when shorter than rest length");
RNA_def_property_update(prop, 0, "rna_softbody_update");
- prop= RNA_def_property(srna, "damp", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "damping", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "infrict");
RNA_def_property_range(prop, 0.0f, 50.0f);
RNA_def_property_ui_text(prop, "Damp", "Edge spring friction");
@@ -1512,7 +1570,7 @@ static void rna_def_softbody(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Plastic", "Permanent deform");
RNA_def_property_update(prop, 0, "rna_softbody_update");
- prop= RNA_def_property(srna, "bending", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "bend", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "secondspring");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Bending", "Bending Stiffness");
@@ -1548,7 +1606,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);
@@ -1559,19 +1617,19 @@ static void rna_def_softbody(BlenderRNA *brna)
/* Solver */
- prop= RNA_def_property(srna, "error_limit", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "error_threshold", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rklimit");
RNA_def_property_range(prop, 0.001f, 10.0f);
RNA_def_property_ui_text(prop, "Error Limit", "The Runge-Kutta ODE solver error limit, low value gives more precision, high values speed");
RNA_def_property_update(prop, 0, "rna_softbody_update");
- prop= RNA_def_property(srna, "minstep", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "step_min", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "minloops");
RNA_def_property_range(prop, 0, 30000);
RNA_def_property_ui_text(prop, "Min Step", "Minimal # solver steps/frame");
RNA_def_property_update(prop, 0, "rna_softbody_update");
- prop= RNA_def_property(srna, "maxstep", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "step_max", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "maxloops");
RNA_def_property_range(prop, 0, 30000);
RNA_def_property_ui_text(prop, "Max Step", "Maximal # solver steps/frame");
@@ -1586,21 +1644,21 @@ 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);
+ prop= RNA_def_property(srna, "use_auto_step", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "solverflags", SBSO_OLDERR);
RNA_def_property_ui_text(prop, "V", "Use velocities for automagic step sizes");
RNA_def_property_update(prop, 0, "rna_softbody_update");
- prop= RNA_def_property(srna, "diagnose", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_diagnose", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "solverflags", SBSO_MONITOR);
RNA_def_property_ui_text(prop, "Print Performance to Console", "Turn on SB diagnose console prints");
- prop= RNA_def_property(srna, "estimate_matrix", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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 ");
/***********************************************************************************/
@@ -1608,17 +1666,17 @@ static void rna_def_softbody(BlenderRNA *brna)
/* but i did not want to start a new property struct */
/* so rather rename this from SoftBodySettings to SoftBody */
/* translation */
- prop= RNA_def_property(srna, "lcom", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "location_mass_center", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "lcom");
RNA_def_property_ui_text(prop, "Center of mass", "Location of Center of mass");
/* matrix */
- prop= RNA_def_property(srna, "lrot", PROP_FLOAT, PROP_MATRIX);
+ prop= RNA_def_property(srna, "rotation_estimate", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "lrot");
RNA_def_property_multi_array(prop, 2, matrix_dimsize);
RNA_def_property_ui_text(prop, "Rot Matrix", "Estimated rotation matrix");
- prop= RNA_def_property(srna, "lscale", PROP_FLOAT, PROP_MATRIX);
+ prop= RNA_def_property(srna, "scale_estimate", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "lscale");
RNA_def_property_multi_array(prop, 2, matrix_dimsize);
RNA_def_property_ui_text(prop, "Scale Matrix", "Estimated scale matrix");
@@ -1639,28 +1697,29 @@ static void rna_def_softbody(BlenderRNA *brna)
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);
+ prop= RNA_def_property(srna, "use_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");
- prop= RNA_def_property(srna, "edge_collision", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_edge_collision", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_edge_collision_get", "rna_SoftBodySettings_edge_collision_set");
RNA_def_property_ui_text(prop, "Edge Collision", "Edges collide too");
RNA_def_property_update(prop, 0, "rna_softbody_update");
- prop= RNA_def_property(srna, "face_collision", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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);
+ prop= RNA_def_property(srna, "use_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");
diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c
index 4e8776eff6a..1151215f5f7 100644
--- a/source/blender/makesrna/intern/rna_particle.c
+++ b/source/blender/makesrna/intern/rna_particle.c
@@ -32,6 +32,7 @@
#include "rna_internal.h"
#include "DNA_modifier_types.h"
+#include "DNA_cloth_types.h"
#include "DNA_particle_types.h"
#include "DNA_object_force.h"
#include "DNA_object_types.h"
@@ -106,6 +107,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; i<psys->totpart; 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)
{
@@ -119,7 +206,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)
{
@@ -128,7 +215,7 @@ static void rna_Particle_redo(Main *bmain, Scene *scene, PointerRNA *ptr)
static void rna_Particle_redo_dependency(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
rna_Particle_redo(bmain, scene, ptr);
}
@@ -152,12 +239,25 @@ static void rna_Particle_redo_child(Main *bmain, Scene *scene, PointerRNA *ptr)
particle_recalc(bmain, scene, ptr, PSYS_RECALC_CHILD);
}
+static ParticleSystem *rna_particle_system_for_target(Object *ob, ParticleTarget *target)
+{
+ ParticleSystem *psys;
+ ParticleTarget *pt;
+
+ for(psys=ob->particlesystem.first; psys; psys=psys->next)
+ for(pt=psys->targets.first; pt; pt=pt->next)
+ if(pt == target)
+ return psys;
+
+ return NULL;
+}
+
static void rna_Particle_target_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
{
if(ptr->type==&RNA_ParticleTarget) {
- ParticleTarget *pt = (ParticleTarget*)ptr->data;
Object *ob = (Object*)ptr->id.data;
- ParticleSystem *kpsys=NULL, *psys=psys_get_current(ob);
+ ParticleTarget *pt = (ParticleTarget*)ptr->data;
+ ParticleSystem *kpsys=NULL, *psys=rna_particle_system_for_target(ob, pt);
if(pt->ob==ob || pt->ob==NULL) {
kpsys = BLI_findlink(&ob->particlesystem, pt->psys-1);
@@ -180,22 +280,23 @@ static void rna_Particle_target_reset(Main *bmain, Scene *scene, PointerRNA *ptr
psys->recalc = PSYS_RECALC_RESET;
DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, 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)
{
if(ptr->type==&RNA_ParticleTarget) {
Object *ob = (Object*)ptr->id.data;
- ParticleSystem *psys = psys_get_current(ob);
+ ParticleTarget *pt = (ParticleTarget*)ptr->data;
+ ParticleSystem *psys = rna_particle_system_for_target(ob, pt);
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);
}
}
@@ -211,20 +312,19 @@ 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)
{
- Object *ob= (Object*)ptr->id.data;
- ParticleSettings *part = psys_get_current(ob)->part;
+ ParticleSystem *psys= (ParticleSystem*)ptr->data;
+ ParticleSettings *part = psys->part;
return rna_pointer_inherit_refine(ptr, &RNA_ParticleSettings, part);
}
static void rna_particle_settings_set(PointerRNA *ptr, PointerRNA value)
{
- Object *ob= (Object*)ptr->id.data;
- ParticleSystem *psys = psys_get_current(ob);
+ ParticleSystem *psys= (ParticleSystem*)ptr->data;
if(psys->part)
psys->part->id.us--;
@@ -637,6 +737,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)
@@ -648,16 +749,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, "co", 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, "co_hair_space", 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)
@@ -757,7 +863,7 @@ static void rna_def_particle(BlenderRNA *brna)
/* Hair & Keyed Keys */
- prop= RNA_def_property(srna, "hair", PROP_COLLECTION, PROP_NONE);
+ prop= RNA_def_property(srna, "is_hair", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "hair", "totkey");
RNA_def_property_struct_type(prop, "ParticleHairKey");
RNA_def_property_ui_text(prop, "Hair", "");
@@ -770,7 +876,7 @@ static void rna_def_particle(BlenderRNA *brna)
// float fuv[4], foffset; /* coordinates on face/edge number "num" and depth along*/
// /* face normal for volume emission */
- prop= RNA_def_property(srna, "birthtime", PROP_FLOAT, PROP_TIME);
+ prop= RNA_def_property(srna, "birth_time", PROP_FLOAT, PROP_TIME);
RNA_def_property_float_sdna(prop, NULL, "time");
// RNA_def_property_range(prop, lowerLimitf, upperLimitf);
RNA_def_property_ui_text(prop, "Birth Time", "");
@@ -796,17 +902,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, "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, "is_exist", 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, "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");
@@ -846,7 +950,7 @@ static void rna_def_fluid_settings(BlenderRNA *brna)
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);
+ prop= RNA_def_property(srna, "spring_force", 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");
@@ -878,13 +982,13 @@ static void rna_def_fluid_settings(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* Double density relaxation */
- prop= RNA_def_property(srna, "stiffness_k", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "stiffness", 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);
+ prop= RNA_def_property(srna, "stiffness_near", 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");
@@ -968,13 +1072,14 @@ static void rna_def_particle_settings(BlenderRNA *brna)
};
//TODO: names, tooltips
+#if 0
static EnumPropertyItem rot_from_items[] = {
{PART_ROT_KEYS, "KEYS", 0, "keys", ""},
{PART_ROT_ZINCR, "ZINCR", 0, "zincr", ""},
{PART_ROT_IINCR, "IINCR", 0, "iincr", ""},
{0, NULL, 0, NULL, NULL}
};
-
+#endif
static EnumPropertyItem integrator_type_items[] = {
{PART_INT_EULER, "EULER", 0, "Euler", ""},
{PART_INT_VERLET, "VERLET", 0, "Verlet", ""},
@@ -1029,100 +1134,95 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_struct_ui_icon(srna, ICON_PARTICLE_DATA);
/* flag */
- prop= RNA_def_property(srna, "react_start_end", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_react_start_end", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_REACT_STA_END);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Start/End", "Give birth to unreacted particles eventually");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "react_multiple", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_react_multiple", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_REACT_MULTIPLE);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
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);
+ prop= RNA_def_property(srna, "show_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");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "died", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_dead", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_DIED);
RNA_def_property_ui_text(prop, "Died", "Show particles after they have died");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "trand", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_emit_random", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_TRAND);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Random", "Emit in random order of elements");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "even_distribution", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_even_distribution", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_EDISTR);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Even Distribution", "Use even distribution from faces based on face areas or edge lengths");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "die_on_collision", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_die_on_collision", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_DIE_ON_COL);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Die on hit", "Particles die when they collide with a deflector object");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "size_deflect", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_size_deflect", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_SIZE_DEFL);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Size Deflect", "Use particle's size in deflection");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "rotation_dynamic", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_dynamic_rotation", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_ROT_DYN);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Dynamic", "Sets rotation to dynamic/constant");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "sizemass", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_multiply_size_mass", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_SIZEMASS);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Mass from Size", "Multiply mass by particle size");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "boids_2d", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock_boids_to_surface", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_BOIDS_2D);
RNA_def_property_ui_text(prop, "Boids 2D", "Constrain boids to a surface");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "branching", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_branching", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_BRANCHING);
RNA_def_property_ui_text(prop, "Branching", "Branch child paths from each other");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "animate_branching", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_animate_branching", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_ANIM_BRANCHING);
RNA_def_property_ui_text(prop, "Animated", "Animate branching");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "symmetric_branching", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_symmetric_branching", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_SYMM_BRANCHING);
RNA_def_property_ui_text(prop, "Symmetric", "Start and end points are the same");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "hair_bspline", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_hair_bspline", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_HAIR_BSPLINE);
RNA_def_property_ui_text(prop, "B-Spline", "Interpolate hair using B-Splines");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "grid_invert", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_grid", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_GRID_INVERT);
RNA_def_property_ui_text(prop, "Invert", "Invert what is considered object and what is not");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "child_effector", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "apply_effector_to_children", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_CHILD_EFFECT);
RNA_def_property_ui_text(prop, "Children", "Apply effectors to children");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
@@ -1132,17 +1232,12 @@ 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);
+ prop= RNA_def_property(srna, "apply_guide_to_children", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_CHILD_GUIDE);
- RNA_def_property_ui_text(prop, "child_guide", "");
+ RNA_def_property_ui_text(prop, "apply_guide_to_children", "");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "self_effect", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_self_effect", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_SELF_EFFECT);
RNA_def_property_ui_text(prop, "Self Effect", "Particle effectors effect themselves");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
@@ -1199,7 +1294,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Particle_reset");
/*draw flag*/
- prop= RNA_def_property(srna, "velocity", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_velocity", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_VEL);
RNA_def_property_ui_text(prop, "Velocity", "Show particle velocity");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
@@ -1209,37 +1304,37 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Size", "Show particle size");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "emitter", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_render_emitter", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_EMITTER);
RNA_def_property_ui_text(prop, "Emitter", "Render emitter Object also");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "draw_health", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_health", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_HEALTH);
RNA_def_property_ui_text(prop, "Health", "Draw boid health");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "abs_path_time", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_absolute_path_time", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_ABS_PATH_TIME);
RNA_def_property_ui_text(prop, "Absolute Path Time", "Path timing is in absolute frames");
RNA_def_property_update(prop, 0, "rna_Particle_abspathtime_update");
- prop= RNA_def_property(srna, "billboard_lock", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock_billboard", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_BB_LOCK);
RNA_def_property_ui_text(prop, "Lock Billboard", "Lock the billboards align axis");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "parent", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_parent_particles", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_PARENT);
RNA_def_property_ui_text(prop, "Parents", "Render parent particles");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "num", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_number", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_NUM);
RNA_def_property_ui_text(prop, "Number", "Show particle number");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "rand_group", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_group_pick_random", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_RAND_GR);
RNA_def_property_ui_text(prop, "Pick Random", "Pick objects from group randomly");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
@@ -1254,39 +1349,39 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Use Global", "Use object's global coordinates for duplication");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "render_adaptive", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_render_adaptive", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_REN_ADAPT);
RNA_def_property_ui_text(prop, "Adaptive render", "Draw steps of the particle path");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "velocity_length", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_velocity_length", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_VEL_LENGTH);
RNA_def_property_ui_text(prop, "Speed", "Multiply line length by particle speed");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "material_color", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_material_color", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_MAT_COL);
RNA_def_property_ui_text(prop, "Material Color", "Draw particles using material's diffuse color");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "whole_group", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_whole_group", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_WHOLE_GR);
RNA_def_property_ui_text(prop, "Whole Group", "Use whole group at once");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "render_strand", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_strand_primitive", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_REN_STRAND);
RNA_def_property_ui_text(prop, "Strand render", "Use the strand primitive for rendering");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "draw_as", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "draw_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "draw_as");
RNA_def_property_enum_items(prop, part_draw_as_items);
RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Particle_draw_as_itemf");
RNA_def_property_ui_text(prop, "Particle Drawing", "How particles are drawn in viewport");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "ren_as", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "render_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "ren_as");
RNA_def_property_enum_items(prop, part_ren_as_items);
RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Particle_ren_as_itemf");
@@ -1334,12 +1429,12 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_range(prop, 0, 45);
RNA_def_property_ui_text(prop, "Degrees", "How many degrees path has to curve to make another render segment");
- prop= RNA_def_property(srna, "adaptive_pix", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "adaptive_pixel", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "adapt_pix");
RNA_def_property_range(prop, 0, 50);
RNA_def_property_ui_text(prop, "Pixel", "How many pixels path has to cover to make another render segment");
- prop= RNA_def_property(srna, "display", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "draw_percentage", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "disp");
RNA_def_property_range(prop, 0, 100);
RNA_def_property_ui_text(prop, "Display", "Percentage of particles to display in 3D view");
@@ -1352,11 +1447,13 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- //TODO: is this read only/internal?
+ // not used anywhere, why is this in DNA???
+#if 0
prop= RNA_def_property(srna, "rotate_from", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "rotfrom");
RNA_def_property_enum_items(prop, rot_from_items);
RNA_def_property_ui_text(prop, "Rotate From", "");
+#endif
prop= RNA_def_property(srna, "integrator", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, integrator_type_items);
@@ -1384,14 +1481,14 @@ 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");
RNA_def_property_enum_items(prop, bb_anim_items);
RNA_def_property_ui_text(prop, "Animate", "How to animate billboard textures");
- prop= RNA_def_property(srna, "billboard_split_offset", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "billboard_offset_split", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "bb_split_offset");
RNA_def_property_enum_items(prop, bb_split_offset_items);
RNA_def_property_ui_text(prop, "Offset", "How to offset billboard textures");
@@ -1402,7 +1499,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Tilt", "Tilt of the billboards");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "billboard_random_tilt", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "billboard_tilt_random", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "bb_rand_tilt");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Random Tilt", "Random tilt of the billboards");
@@ -1417,18 +1514,18 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Particle_redo");
/* simplification */
- prop= RNA_def_property(srna, "enable_simplify", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_simplify", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "simplify_flag", PART_SIMPLIFY_ENABLE);
RNA_def_property_ui_text(prop, "Child Simplification", "Remove child strands as the object becomes smaller on the screen");
- prop= RNA_def_property(srna, "viewport", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_simplify_viewport", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "simplify_flag", PART_SIMPLIFY_VIEWPORT);
RNA_def_property_ui_text(prop, "Viewport", "");
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);
@@ -1443,7 +1540,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);
@@ -1451,7 +1548,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);
@@ -1464,7 +1562,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Lifetime", "Specify the life span of the particles");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "random_lifetime", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "lifetime_random", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "randlife");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Random", "Give the particle life a random variation");
@@ -1476,6 +1574,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);
@@ -1487,10 +1590,10 @@ 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);
+ prop= RNA_def_property(srna, "count", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "totpart");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
/* This limit is for those freaks who have the machine power to handle it. */
@@ -1531,7 +1634,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Object", "Let the object give the particle a starting speed");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "random_factor", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "factor_random", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "randfac");//optional if prop names are the same
RNA_def_property_range(prop, 0.0f, 200.0f);
RNA_def_property_ui_range(prop, 0, 100, 1, 3);
@@ -1564,7 +1667,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Reactor", "Let the vector away from the target particles location give the particle a starting speed");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "object_aligned_factor", PROP_FLOAT, PROP_VELOCITY);
+ prop= RNA_def_property(srna, "object_align_factor", PROP_FLOAT, PROP_VELOCITY);
RNA_def_property_float_sdna(prop, NULL, "ob_vel");
RNA_def_property_array(prop, 3);
RNA_def_property_range(prop, -200.0f, 200.0f);
@@ -1585,13 +1688,13 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Phase", "Initial rotation phase");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "random_rotation_factor", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "rotation_factor_random", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "randrotfac");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Random Rotation", "Randomize rotation");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "random_phase_factor", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "phase_factor_random", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "randphasefac");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Random Phase", "Randomize rotation phase");
@@ -1611,7 +1714,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Size", "The size of the particles");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "random_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "size_random", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "randsize");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Random Size", "Give the particle size a random variation");
@@ -1635,17 +1738,17 @@ 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);
+ prop= RNA_def_property(srna, "damping", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "dampfac");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Damp", "Specify the amount of damping");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* random length */
- prop= RNA_def_property(srna, "random_length", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "length_random", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "randlength");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Random Length", "Give path length a random variation");
@@ -1659,7 +1762,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Children Per Parent", "Amount of children/parent");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "rendered_child_nbr", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "rendered_child_count", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "ren_child_nbr");
RNA_def_property_range(prop, 0, 100000);
RNA_def_property_ui_range(prop, 0, 10000, 1, 0);
@@ -1678,7 +1781,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Child Size", "A multiplier for the child particle size");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "child_random_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "child_size_random", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "childrandsize");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Random Child Size", "Random variation to the size of the child particles");
@@ -1703,7 +1806,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Clump", "Amount of clumping");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "clumppow", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "clump_shape", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "clumppow");
RNA_def_property_range(prop, -0.999f, 0.999f);
RNA_def_property_ui_text(prop, "Shape", "Shape of clumping");
@@ -1732,46 +1835,49 @@ static void rna_def_particle_settings(BlenderRNA *brna)
/* rough */
- prop= RNA_def_property(srna, "rough1", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "roughness_1", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "rough1");
RNA_def_property_range(prop, 0.0f, 100000.0f);
RNA_def_property_ui_range(prop, 0.0f, 10.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Rough1", "Amount of location dependent rough");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "rough1_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "roughness_1_size", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "rough1_size");
RNA_def_property_range(prop, 0.01f, 100000.0f);
RNA_def_property_ui_range(prop, 0.01f, 10.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Size1", "Size of location dependent rough");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "rough2", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "roughness_2", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rough2");
RNA_def_property_range(prop, 0.0f, 100000.0f);
RNA_def_property_ui_range(prop, 0.0f, 10.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Rough2", "Amount of random rough");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "rough2_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "roughness_2_size", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rough2_size");
RNA_def_property_range(prop, 0.01f, 100000.0f);
RNA_def_property_ui_range(prop, 0.01f, 10.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Size2", "Size of random rough");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "rough2_thres", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "roughness_2_threshold", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rough2_thres");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Threshold", "Amount of particles left untouched by random rough");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "rough_endpoint", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "roughness_endpoint", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rough_end");
RNA_def_property_range(prop, 0.0f, 100000.0f);
RNA_def_property_ui_range(prop, 0.0f, 10.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Rough Endpoint", "Amount of end point rough");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "rough_end_shape", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "roughness_end_shape", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "rough_end_shape");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Shape", "Shape of end point rough");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
@@ -1782,7 +1888,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Length", "Length of child paths");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "child_length_thres", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "child_length_threshold", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "clength_thres");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Threshold", "Amount of particles left untouched by child path length");
@@ -1857,13 +1963,14 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Dupli Group", "Show Objects in this Group in place of particles");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "dupliweights", PROP_COLLECTION, PROP_NONE);
+ prop= RNA_def_property(srna, "dupli_weights", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "dupliweights", NULL);
RNA_def_property_struct_type(prop, "ParticleDupliWeight");
RNA_def_property_ui_text(prop, "Dupli Group Weights", "Weights for all of the objects in the dupli group");
prop= RNA_def_property(srna, "active_dupliweight", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "ParticleDupliWeight");
- RNA_def_property_pointer_funcs(prop, "rna_ParticleDupliWeight_active_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_ParticleDupliWeight_active_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Active Dupli Object", "");
prop= RNA_def_property(srna, "active_dupliweight_index", PROP_INT, PROP_UNSIGNED);
@@ -1895,13 +2002,13 @@ static void rna_def_particle_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "force_field_1", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "pd");
RNA_def_property_struct_type(prop, "FieldSettings");
- RNA_def_property_pointer_funcs(prop, "rna_Particle_field1_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Particle_field1_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Force Field 1", "");
prop= RNA_def_property(srna, "force_field_2", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "pd2");
RNA_def_property_struct_type(prop, "FieldSettings");
- RNA_def_property_pointer_funcs(prop, "rna_Particle_field2_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Particle_field2_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Force Field 2", "");
}
@@ -1951,12 +2058,13 @@ static void rna_def_particle_target(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Duration", "");
RNA_def_property_update(prop, 0, "rna_Particle_target_redo");
- prop= RNA_def_property(srna, "valid", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_valid", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PTARGET_VALID);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Valid", "Keyed particles target is valid");
- prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "alliance", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "mode");
RNA_def_property_enum_items(prop, mode_items);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Mode", "");
@@ -1983,7 +2091,7 @@ static void rna_def_particle_system(BlenderRNA *brna)
//RNA_def_property_pointer_sdna(prop, NULL, "part");
RNA_def_property_struct_type(prop, "ParticleSettings");
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_NEVER_NULL);
- RNA_def_property_pointer_funcs(prop, "rna_particle_settings_get", "rna_particle_settings_set", NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_particle_settings_get", "rna_particle_settings_set", NULL, NULL);
RNA_def_property_ui_text(prop, "Settings", "Particle system settings");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
@@ -2002,12 +2110,12 @@ static void rna_def_particle_system(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* hair */
- prop= RNA_def_property(srna, "global_hair", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_global_hair", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PSYS_GLOBAL_HAIR);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Global Hair", "Hair keys are in global coordinate space");
- prop= RNA_def_property(srna, "hair_dynamics", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_hair_dynamics", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PSYS_HAIR_DYNAMICS);
RNA_def_property_ui_text(prop, "Hair Dynamics", "Enable hair dynamics using cloth simulation");
RNA_def_property_update(prop, 0, "rna_Particle_hair_dynamics");
@@ -2033,7 +2141,7 @@ static void rna_def_particle_system(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* keyed */
- prop= RNA_def_property(srna, "keyed_timing", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_keyed_timing", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PSYS_KEYED_TIMING);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Keyed timing", "Use key times");
@@ -2045,7 +2153,7 @@ static void rna_def_particle_system(BlenderRNA *brna)
prop= RNA_def_property(srna, "active_particle_target", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "ParticleTarget");
- RNA_def_property_pointer_funcs(prop, "rna_ParticleSystem_active_particle_target_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_ParticleSystem_active_particle_target_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Active Particle Target", "");
prop= RNA_def_property(srna, "active_particle_target_index", PROP_INT, PROP_UNSIGNED);
@@ -2084,7 +2192,7 @@ static void rna_def_particle_system(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Vertex Group Density", "Vertex group to control density");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "vertex_group_density_negate", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_vertex_group_density", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_DENSITY));
RNA_def_property_ui_text(prop, "Vertex Group Density Negate", "Negate the effect of the density vertex group");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
@@ -2094,7 +2202,7 @@ static void rna_def_particle_system(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Vertex Group Velocity", "Vertex group to control velocity");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "vertex_group_velocity_negate", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_vertex_group_velocity", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_VEL));
RNA_def_property_ui_text(prop, "Vertex Group Velocity Negate", "Negate the effect of the velocity vertex group");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
@@ -2104,7 +2212,7 @@ static void rna_def_particle_system(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Vertex Group Length", "Vertex group to control length");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "vertex_group_length_negate", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_vertex_group_length", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_LENGTH));
RNA_def_property_ui_text(prop, "Vertex Group Length Negate", "Negate the effect of the length vertex group");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
@@ -2114,7 +2222,7 @@ static void rna_def_particle_system(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Vertex Group Clump", "Vertex group to control clump");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "vertex_group_clump_negate", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_vertex_group_clump", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_CLUMP));
RNA_def_property_ui_text(prop, "Vertex Group Clump Negate", "Negate the effect of the clump vertex group");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
@@ -2124,27 +2232,27 @@ static void rna_def_particle_system(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Vertex Group Kink", "Vertex group to control kink");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "vertex_group_kink_negate", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_vertex_group_kink", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_KINK));
RNA_def_property_ui_text(prop, "Vertex Group Kink Negate", "Negate the effect of the kink vertex group");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "vertex_group_roughness1", PROP_STRING, PROP_NONE);
+ prop= RNA_def_property(srna, "vertex_group_roughness_1", PROP_STRING, PROP_NONE);
RNA_def_property_string_funcs(prop, "rna_ParticleVGroup_name_get_5", "rna_ParticleVGroup_name_len_5", "rna_ParticleVGroup_name_set_5");
RNA_def_property_ui_text(prop, "Vertex Group Roughness 1", "Vertex group to control roughness 1");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "vertex_group_roughness1_negate", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_vertex_group_roughness_1", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_ROUGH1));
RNA_def_property_ui_text(prop, "Vertex Group Roughness 1 Negate", "Negate the effect of the roughness 1 vertex group");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "vertex_group_roughness2", PROP_STRING, PROP_NONE);
+ prop= RNA_def_property(srna, "vertex_group_roughness_2", PROP_STRING, PROP_NONE);
RNA_def_property_string_funcs(prop, "rna_ParticleVGroup_name_get_6", "rna_ParticleVGroup_name_len_6", "rna_ParticleVGroup_name_set_6");
RNA_def_property_ui_text(prop, "Vertex Group Roughness 2", "Vertex group to control roughness 2");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "vertex_group_roughness2_negate", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_vertex_group_roughness_2", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_ROUGH2));
RNA_def_property_ui_text(prop, "Vertex Group Roughness 2 Negate", "Negate the effect of the roughness 2 vertex group");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
@@ -2154,7 +2262,7 @@ static void rna_def_particle_system(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Vertex Group Roughness End", "Vertex group to control roughness end");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop= RNA_def_property(srna, "vertex_group_roughness_end_negate", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_vertex_group_roughness_end", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_ROUGHE));
RNA_def_property_ui_text(prop, "Vertex Group Roughness End Negate", "Negate the effect of the roughness end vertex group");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
@@ -2164,7 +2272,7 @@ static void rna_def_particle_system(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Vertex Group Size", "Vertex group to control size");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "vertex_group_size_negate", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_vertex_group_size", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_SIZE));
RNA_def_property_ui_text(prop, "Vertex Group Size Negate", "Negate the effect of the size vertex group");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
@@ -2174,7 +2282,7 @@ static void rna_def_particle_system(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Vertex Group Tangent", "Vertex group to control tangent");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "vertex_group_tangent_negate", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_vertex_group_tangent", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_TAN));
RNA_def_property_ui_text(prop, "Vertex Group Tangent Negate", "Negate the effect of the tangent vertex group");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
@@ -2184,7 +2292,7 @@ static void rna_def_particle_system(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Vertex Group Rotation", "Vertex group to control rotation");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "vertex_group_rotation_negate", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_vertex_group_rotation", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_ROT));
RNA_def_property_ui_text(prop, "Vertex Group Rotation Negate", "Negate the effect of the rotation vertex group");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
@@ -2194,7 +2302,7 @@ static void rna_def_particle_system(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Vertex Group Field", "Vertex group to control field");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "vertex_group_field_negate", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_vertex_group_field", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_EFFECTOR));
RNA_def_property_ui_text(prop, "Vertex Group Field Negate", "Negate the effect of the field vertex group");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
@@ -2206,7 +2314,7 @@ static void rna_def_particle_system(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "PointCache");
RNA_def_property_ui_text(prop, "Point Cache", "");
- prop= RNA_def_property(srna, "multiple_caches", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "has_multiple_caches", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_ParticleSystem_multiple_caches_get", NULL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Multiple Caches", "Particle system has multiple point caches");
@@ -2219,12 +2327,12 @@ static void rna_def_particle_system(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Particle_redo");
/* hair or cache editing */
- prop= RNA_def_property(srna, "editable", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_editable", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_ParticleSystem_editable_get", NULL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Editable", "Particle system can be edited in particle mode");
- prop= RNA_def_property(srna, "edited", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_edited", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_ParticleSystem_edited_get", NULL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Edited", "Particle system has been edited in particle mode");
diff --git a/source/blender/makesrna/intern/rna_pose.c b/source/blender/makesrna/intern/rna_pose.c
index 0d31ec4776a..e4a3be023ca 100644
--- a/source/blender/makesrna/intern/rna_pose.c
+++ b/source/blender/makesrna/intern/rna_pose.c
@@ -37,7 +37,6 @@
#include "DNA_scene_types.h"
#include "BLI_math.h"
-#include "BLI_ghash.h"
#include "WM_types.h"
@@ -49,6 +48,10 @@
#include "DNA_userdef_types.h"
+#include "MEM_guardedalloc.h"
+
+#include "BLI_ghash.h"
+
#include "BKE_context.h"
#include "BKE_constraint.h"
#include "BKE_depsgraph.h"
@@ -59,6 +62,8 @@
#include "MEM_guardedalloc.h"
+#include "WM_api.h"
+
#include "RNA_access.h"
static void rna_Pose_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -117,7 +122,7 @@ static void rna_BoneGroup_color_set_set(PointerRNA *ptr, int value)
}
}
-static IDProperty *rna_PoseBone_idproperties(PointerRNA *ptr, int create)
+static IDProperty *rna_PoseBone_idprops(PointerRNA *ptr, int create)
{
bPoseChannel *pchan= ptr->data;
@@ -151,7 +156,7 @@ static void rna_Pose_ik_solver_update(Main *bmain, Scene *scene, PointerRNA *ptr
bPose *pose = ptr->data;
pose->flag |= POSE_RECALC; // checks & sorts pose channels
- DAG_scene_sort(scene);
+ DAG_scene_sort(bmain, scene);
update_pose_constraint_flags(pose);
@@ -431,7 +436,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,12 +444,17 @@ 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 void rna_PoseChannel_constraints_remove(ID *id, bPoseChannel *pchan, ReportList *reports, bConstraint *con)
{
+ if(BLI_findindex(&pchan->constraints, con) == -1) {
+ BKE_reportf(reports, RPT_ERROR, "Constraint '%s' not found in pose bone '%s'.", con->name, pchan->name);
+ return;
+ }
+
// TODO
- //ED_object_constraint_set_active(object, NULL);
- //WM_main_add_notifier(NC_OBJECT|ND_CONSTRAINT, object);
- return remove_constraint_index(&pchan->constraints, index);
+ //ED_object_constraint_set_active(id, NULL);
+ WM_main_add_notifier(NC_OBJECT|ND_CONSTRAINT, id);
+ remove_constraint(&pchan->constraints, con);
}
static int rna_PoseChannel_proxy_editable(PointerRNA *ptr)
@@ -632,14 +642,13 @@ static void rna_def_pose_channel_constraints(BlenderRNA *brna, PropertyRNA *cpro
/* Collection active property */
prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Constraint");
- RNA_def_property_pointer_funcs(prop, "rna_PoseChannel_active_constraint_get", "rna_PoseChannel_active_constraint_set", NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_PoseChannel_active_constraint_get", "rna_PoseChannel_active_constraint_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Active Constraint", "Active PoseChannel constraint");
/* 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.");
@@ -649,14 +658,11 @@ 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.");
- RNA_def_function_return(func, parm);
- /* object to add */
- parm= RNA_def_int(func, "index", 0, 0, INT_MAX, "Index", "", 0, INT_MAX);
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_function_flag(func, FUNC_USE_REPORTS|FUNC_USE_SELF_ID); /* ID needed for refresh */
+ /* constraint to remove */
+ parm= RNA_def_pointer(func, "constraint", "Constraint", "", "Removed constraint.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
static void rna_def_pose_channel(BlenderRNA *brna)
@@ -684,7 +690,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "bPoseChannel");
RNA_def_struct_ui_text(srna, "Pose Bone", "Channel defining pose data for a bone in a Pose");
RNA_def_struct_path_func(srna, "rna_PoseBone_path");
- RNA_def_struct_idproperties_func(srna, "rna_PoseBone_idproperties");
+ RNA_def_struct_idprops_func(srna, "rna_PoseBone_idprops");
/* Bone Constraints */
prop= RNA_def_property(srna, "constraints", PROP_COLLECTION, PROP_NONE);
@@ -700,9 +706,9 @@ static void rna_def_pose_channel(BlenderRNA *brna)
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
RNA_def_struct_name_property(srna, prop);
- prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "selectflag", BONE_SELECTED);
- RNA_def_property_ui_text(prop, "Selected", "");
+ RNA_def_property_ui_text(prop, "Select", "");
/* Baked Bone Path cache data */
rna_def_motionpath_common(srna);
@@ -805,55 +811,55 @@ static void rna_def_pose_channel(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Pose Tail Position", "Location of tail of the channel's bone");
/* IK Settings */
- prop= RNA_def_property(srna, "has_ik", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_in_ik_chain", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_PoseChannel_has_ik_get", NULL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Has IK", "Is part of an IK chain");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
- prop= RNA_def_property(srna, "ik_dof_x", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "ikflag", BONE_IK_NO_XDOF);
- RNA_def_property_ui_text(prop, "IK X DoF", "Allow movement around the X axis");
+ prop= RNA_def_property(srna, "lock_ik_x", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_NO_XDOF);
+ RNA_def_property_ui_text(prop, "IK X Lock", "Disallow movement around the X axis");
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
- prop= RNA_def_property(srna, "ik_dof_y", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "ikflag", BONE_IK_NO_YDOF);
- RNA_def_property_ui_text(prop, "IK Y DoF", "Allow movement around the Y axis");
+ prop= RNA_def_property(srna, "lock_ik_y", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_NO_YDOF);
+ RNA_def_property_ui_text(prop, "IK Y Lock", "Disallow movement around the Y axis");
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
- prop= RNA_def_property(srna, "ik_dof_z", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "ikflag", BONE_IK_NO_ZDOF);
- RNA_def_property_ui_text(prop, "IK Z DoF", "Allow movement around the Z axis");
+ prop= RNA_def_property(srna, "lock_ik_z", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_NO_ZDOF);
+ RNA_def_property_ui_text(prop, "IK Z Lock", "Disallow movement around the Z axis");
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
- prop= RNA_def_property(srna, "ik_limit_x", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_ik_limit_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_XLIMIT);
RNA_def_property_ui_text(prop, "IK X Limit", "Limit movement around the X axis");
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
- prop= RNA_def_property(srna, "ik_limit_y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_ik_limit_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_YLIMIT);
RNA_def_property_ui_text(prop, "IK Y Limit", "Limit movement around the Y axis");
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
- prop= RNA_def_property(srna, "ik_limit_z", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_ik_limit_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_ZLIMIT);
RNA_def_property_ui_text(prop, "IK Z Limit", "Limit movement around the Z axis");
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
- prop= RNA_def_property(srna, "ik_rot_control", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_ik_rotation_control", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_ROTCTL);
RNA_def_property_ui_text(prop, "IK rot control", "Apply channel rotation as IK constraint");
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
- prop= RNA_def_property(srna, "ik_lin_control", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_ik_linear_control", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_LINCTL);
RNA_def_property_ui_text(prop, "IK rot control", "Apply channel size as IK constraint if stretching is enabled");
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
@@ -929,14 +935,14 @@ static void rna_def_pose_channel(BlenderRNA *brna)
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
- prop= RNA_def_property(srna, "ik_rot_weight", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "ik_rotation_weight", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ikrotweight");
RNA_def_property_range(prop, 0.0f,1.0f);
RNA_def_property_ui_text(prop, "IK Rot Weight", "Weight of rotation constraint for IK");
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
- prop= RNA_def_property(srna, "ik_lin_weight", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "ik_linear_weight", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "iklinweight");
RNA_def_property_range(prop, 0.0f,1.0f);
RNA_def_property_ui_text(prop, "IK Lin Weight", "Weight of scale constraint for IK");
@@ -972,7 +978,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
prop= RNA_def_property(srna, "bone_group", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "BoneGroup");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_pointer_funcs(prop, "rna_PoseChannel_bone_group_get", "rna_PoseChannel_bone_group_set", NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_PoseChannel_bone_group_get", "rna_PoseChannel_bone_group_set", NULL, NULL);
RNA_def_property_ui_text(prop, "Bone Group", "Bone Group this pose channel belongs to");
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
@@ -982,6 +988,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");
@@ -989,6 +996,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");
@@ -996,6 +1004,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");
@@ -1010,6 +1019,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");
@@ -1041,13 +1051,13 @@ static void rna_def_pose_itasc(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Precision", "Precision of convergence in case of reiteration");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
- prop= RNA_def_property(srna, "num_iter", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "iterations", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "numiter");
RNA_def_property_range(prop, 1.f,1000.f);
RNA_def_property_ui_text(prop, "Iterations", "Maximum number of iterations for convergence in case of reiteration");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
- prop= RNA_def_property(srna, "num_step", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "step_count", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "numstep");
RNA_def_property_range(prop, 1.f, 50.f);
RNA_def_property_ui_text(prop, "Num steps", "Divides the frame interval into this many steps");
@@ -1059,24 +1069,24 @@ static void rna_def_pose_itasc(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Mode", NULL);
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update_rebuild");
- prop= RNA_def_property(srna, "reiteration", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "reiteration_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
RNA_def_property_enum_items(prop, prop_itasc_reiteration_items);
RNA_def_property_ui_text(prop, "Reiteration", "Defines if the solver is allowed to reiterate (converges until precision is met) on none, first or all frames");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
- prop= RNA_def_property(srna, "auto_step", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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);
+ prop= RNA_def_property(srna, "step_min", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "minstep");
RNA_def_property_range(prop, 0.0f,0.1f);
RNA_def_property_ui_text(prop, "Min step", "Lower bound for timestep in second in case of automatic substeps");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
- prop= RNA_def_property(srna, "max_step", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "step_max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "maxstep");
RNA_def_property_range(prop, 0.0f,1.0f);
RNA_def_property_ui_text(prop, "Max step", "Higher bound for timestep in second in case of automatic substeps");
@@ -1088,7 +1098,7 @@ static void rna_def_pose_itasc(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Feedback", "Feedback coefficient for error correction. Average response time=1/feedback. Default=20");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
- prop= RNA_def_property(srna, "max_velocity", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "velocity_max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "maxvel");
RNA_def_property_range(prop, 0.0f,100.0f);
RNA_def_property_ui_text(prop, "Max Velocity", "Maximum joint velocity in rad/s. Default=50");
@@ -1100,13 +1110,13 @@ static void rna_def_pose_itasc(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Solver", "Solving method selection: Automatic damping or manual damping");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update_rebuild");
- prop= RNA_def_property(srna, "dampmax", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "damping_max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "dampmax");
RNA_def_property_range(prop, 0.0f,1.0f);
RNA_def_property_ui_text(prop, "Damp", "Maximum damping coefficient when singular value is nearly 0. Higher values=more stability, less reactivity. Default=0.5");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
- prop= RNA_def_property(srna, "dampeps", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "damping_epsilon", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "dampeps");
RNA_def_property_range(prop, 0.0f,1.0f);
RNA_def_property_ui_text(prop, "Epsilon", "Singular value under which damping is progressively applied. Higher values=more stability, less reactivity. Default=0.1");
@@ -1130,6 +1140,34 @@ static void rna_def_pose_ikparam(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "IK Solver", "IK solver for which these parameters are defined, 0 for Legacy, 1 for iTaSC");
}
+/* pose.bone_groups */
+static void rna_def_bone_groups(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+// FunctionRNA *func;
+// PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "BoneGroups");
+ srna= RNA_def_struct(brna, "BoneGroups", NULL);
+ RNA_def_struct_sdna(srna, "bPose");
+ RNA_def_struct_ui_text(srna, "Bone Groups", "Collection of bone groups");
+
+ prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "BoneGroup");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, "rna_Pose_active_bone_group_get", "rna_Pose_active_bone_group_set", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Active Bone Group", "Active bone group for this pose");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+
+ prop= RNA_def_property(srna, "active_index", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "active_group");
+ RNA_def_property_int_funcs(prop, "rna_Pose_active_bone_group_index_get", "rna_Pose_active_bone_group_index_set", "rna_Pose_active_bone_group_index_range");
+ RNA_def_property_ui_text(prop, "Active Bone Group Index", "Active index in bone groups array");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+}
+
static void rna_def_pose(BlenderRNA *brna)
{
StructRNA *srna;
@@ -1151,19 +1189,7 @@ static void rna_def_pose(BlenderRNA *brna)
RNA_def_property_collection_sdna(prop, NULL, "agroups", NULL);
RNA_def_property_struct_type(prop, "BoneGroup");
RNA_def_property_ui_text(prop, "Bone Groups", "Groups of the bones");
-
- prop= RNA_def_property(srna, "active_bone_group", PROP_POINTER, PROP_NONE);
- RNA_def_property_struct_type(prop, "BoneGroup");
- RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_pointer_funcs(prop, "rna_Pose_active_bone_group_get", "rna_Pose_active_bone_group_set", NULL);
- RNA_def_property_ui_text(prop, "Active Bone Group", "Active bone group for this pose");
- RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
-
- prop= RNA_def_property(srna, "active_bone_group_index", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "active_group");
- RNA_def_property_int_funcs(prop, "rna_Pose_active_bone_group_index_get", "rna_Pose_active_bone_group_index_set", "rna_Pose_active_bone_group_index_range");
- RNA_def_property_ui_text(prop, "Active Bone Group Index", "Active index in bone groups array");
- RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+ rna_def_bone_groups(brna, prop);
/* ik solvers */
prop= RNA_def_property(srna, "ik_solver", PROP_ENUM, PROP_NONE);
@@ -1175,7 +1201,7 @@ static void rna_def_pose(BlenderRNA *brna)
prop= RNA_def_property(srna, "ik_param", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "IKParam");
- RNA_def_property_pointer_funcs(prop, "rna_Pose_ikparam_get", NULL, "rna_Pose_ikparam_typef");
+ RNA_def_property_pointer_funcs(prop, "rna_Pose_ikparam_get", NULL, "rna_Pose_ikparam_typef", NULL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "IK Param", "Parameters for IK solver");
diff --git a/source/blender/makesrna/intern/rna_property.c b/source/blender/makesrna/intern/rna_property.c
index 6de403f28d1..13f913b978b 100644
--- a/source/blender/makesrna/intern/rna_property.c
+++ b/source/blender/makesrna/intern/rna_property.c
@@ -30,6 +30,8 @@
#include "DNA_property_types.h"
+#include "WM_types.h"
+
#ifdef RNA_RUNTIME
#include "BKE_property.h"
@@ -108,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);
+ prop= RNA_def_property(srna, "show_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");
@@ -139,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");
@@ -150,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");
@@ -161,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");
@@ -171,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 d00507e8bcf..e4a89ed3121 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -277,11 +277,11 @@ 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);
+ prop= RNA_def_property(srna, "bl_use_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);
+ prop= RNA_def_property(srna, "bl_use_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);
diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c
index c75706b91bb..4bfd0e4fd41 100644
--- a/source/blender/makesrna/intern/rna_rna.c
+++ b/source/blender/makesrna/intern/rna_rna.c
@@ -53,7 +53,7 @@ EnumPropertyItem property_unit_items[] = {
{0, NULL, 0, NULL, NULL}};
#ifdef RNA_RUNTIME
-
+#include "MEM_guardedalloc.h"
#include "BLI_ghash.h"
/* Struct */
@@ -201,7 +201,7 @@ static void rna_Struct_properties_next(CollectionPropertyIterator *iter)
/* try id properties */
if(!iter->valid) {
- group= RNA_struct_idproperties(&iter->builtin_parent, 0);
+ group= RNA_struct_idprops(&iter->builtin_parent, 0);
if(group) {
rna_iterator_listbase_end(iter);
@@ -335,7 +335,7 @@ PointerRNA rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key
if(ptr->data) {
IDProperty *group, *idp;
- group= RNA_struct_idproperties(ptr, 0);
+ group= RNA_struct_idprops(ptr, 0);
if(group) {
for(idp=group->data.group.first; idp; idp=idp->next) {
@@ -811,6 +811,12 @@ static int rna_Function_registered_optional_get(PointerRNA *ptr)
return func->flag & FUNC_REGISTER_OPTIONAL;
}
+static int rna_Function_no_self_get(PointerRNA *ptr)
+{
+ FunctionRNA *func= (FunctionRNA*)ptr->data;
+ return !(func->flag & FUNC_NO_SELF);
+}
+
/* Blender RNA */
static void rna_BlenderRNA_structs_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
@@ -884,19 +890,19 @@ static void rna_def_struct(BlenderRNA *brna)
prop= RNA_def_property(srna, "base", PROP_POINTER, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "Struct");
- RNA_def_property_pointer_funcs(prop, "rna_Struct_base_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Struct_base_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Base", "Struct definition this is derived from");
prop= RNA_def_property(srna, "nested", PROP_POINTER, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "Struct");
- RNA_def_property_pointer_funcs(prop, "rna_Struct_nested_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Struct_nested_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Nested", "Struct in which this struct is always nested, and to which it logically belongs");
prop= RNA_def_property(srna, "name_property", PROP_POINTER, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "StringProperty");
- RNA_def_property_pointer_funcs(prop, "rna_Struct_name_property_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Struct_name_property_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Name Property", "Property that gives the name of the struct");
prop= RNA_def_property(srna, "properties", PROP_COLLECTION, PROP_NONE);
@@ -974,7 +980,7 @@ static void rna_def_property(BlenderRNA *brna)
prop= RNA_def_property(srna, "srna", PROP_POINTER, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "Struct");
- RNA_def_property_pointer_funcs(prop, "rna_Property_srna_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Property_srna_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Base", "Struct definition used for properties assigned to this item");
prop= RNA_def_property(srna, "unit", PROP_ENUM, PROP_NONE);
@@ -991,27 +997,27 @@ 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);
RNA_def_property_boolean_funcs(prop, "rna_Property_is_never_none_get", NULL);
RNA_def_property_ui_text(prop, "Never None", "True when this value can't be set to None");
- prop= RNA_def_property(srna, "use_output", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_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);
+ prop= RNA_def_property(srna, "is_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);
+ prop= RNA_def_property(srna, "is_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)
@@ -1040,15 +1046,20 @@ static void rna_def_function(BlenderRNA *brna)
RNA_def_property_collection_funcs(prop, "rna_Function_parameters_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0);
RNA_def_property_ui_text(prop, "Parameters", "Parameters for the function");
- prop= RNA_def_property(srna, "registered", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_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);
+ prop= RNA_def_property(srna, "is_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");
+
+ prop= RNA_def_property(srna, "use_self", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Function_no_self_get", NULL);
+ RNA_def_property_ui_text(prop, "No Self", "Function does not pass its self as an argument (becomes a class method in python)");
}
static void rna_def_number_property(StructRNA *srna, PropertyType type)
@@ -1151,7 +1162,7 @@ static void rna_def_string_property(StructRNA *srna)
RNA_def_property_string_funcs(prop, "rna_StringProperty_default_get", "rna_StringProperty_default_length", NULL);
RNA_def_property_ui_text(prop, "Default", "string default value");
- prop= RNA_def_property(srna, "max_length", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "length_max", PROP_INT, PROP_UNSIGNED);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_int_funcs(prop, "rna_StringProperty_max_length_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Maximum Length", "Maximum length of the string, 0 means unlimited");
@@ -1212,9 +1223,9 @@ static void rna_def_pointer_property(StructRNA *srna, PropertyType type)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "Struct");
if(type == PROP_POINTER)
- RNA_def_property_pointer_funcs(prop, "rna_PointerProperty_fixed_type_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_PointerProperty_fixed_type_get", NULL, NULL, NULL);
else
- RNA_def_property_pointer_funcs(prop, "rna_CollectionProperty_fixed_type_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_CollectionProperty_fixed_type_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Pointer Type", "Fixed pointer type, empty if variable type");
}
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index e0118945574..5ff1dbcd2b9 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -31,6 +31,7 @@
#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"
@@ -39,6 +40,7 @@
#ifdef WITH_QUICKTIME
#include "quicktime_export.h"
+#include "AUD_C-API.h"
#endif
#ifdef WITH_FFMPEG
@@ -92,31 +94,42 @@ EnumPropertyItem snap_element_items[] = {
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_BMP, "BMP", ICON_FILE_IMAGE, "BMP", ""},
{R_TARGA, "TARGA", ICON_FILE_IMAGE, "Targa", ""},
{R_RAWTGA, "TARGA_RAW", ICON_FILE_IMAGE, "Targa Raw", ""},
- //{R_DDS, "DDS", ICON_FILE_IMAGE, "DDS", ""}, // XXX not yet implemented
- //{R_HAMX, "HAMX", ICON_FILE_IMAGE, "HamX", ""}, // should remove this format, 8bits are so 80's
- {R_IRIS, "IRIS", ICON_FILE_IMAGE, "Iris", ""},
{0, "", 0, " ", NULL},
+#ifdef WITH_CINEON
+ {R_CINEON, "CINEON", ICON_FILE_IMAGE, "Cineon", ""},
+ {R_DPX, "DPX",ICON_FILE_IMAGE, "DPX", ""},
+#endif
#ifdef WITH_OPENEXR
- {R_OPENEXR, "OPEN_EXR", ICON_FILE_IMAGE, "OpenEXR", ""},
{R_MULTILAYER, "MULTILAYER", ICON_FILE_IMAGE, "MultiLayer", ""},
+ {R_OPENEXR, "OPEN_EXR", ICON_FILE_IMAGE, "OpenEXR", ""},
#endif
- {R_TIFF, "TIFF", ICON_FILE_IMAGE, "TIFF", ""}, // XXX only with G.have_libtiff
+#ifdef WITH_HDR
{R_RADHDR, "HDR", ICON_FILE_IMAGE, "Radiance HDR", ""},
- {R_CINEON, "CINEON", ICON_FILE_IMAGE, "Cineon", ""},
- {R_DPX, "DPX", ICON_FILE_IMAGE, "DPX", ""},
+#endif
+#ifdef WITH_TIFF
+ {R_TIFF, "TIFF", ICON_FILE_IMAGE, "TIFF", ""},
+#endif
{0, "", 0, "Movie", NULL},
- {R_AVIRAW, "AVI_RAW", ICON_FILE_MOVIE, "AVI Raw", ""},
- {R_AVIJPEG, "AVI_JPEG", ICON_FILE_MOVIE, "AVI JPEG", ""},
#ifdef _WIN32
- {R_AVICODEC, "AVICODEC", ICON_FILE_MOVIE, "AVI Codec", ""},
+ {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
@@ -125,16 +138,9 @@ EnumPropertyItem image_type_items[] = {
{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, "MPEG", ""},
#endif
- {R_FRAMESERVER, "FRAMESERVER", ICON_FILE_SCRIPT, "Frame Server", ""},
{0, NULL, 0, NULL, NULL}};
#ifdef RNA_RUNTIME
@@ -144,6 +150,8 @@ EnumPropertyItem image_type_items[] = {
#include "DNA_object_types.h"
#include "DNA_mesh_types.h"
+#include "MEM_guardedalloc.h"
+
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_image.h"
@@ -155,16 +163,17 @@ EnumPropertyItem image_type_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"
@@ -178,15 +187,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_object_link(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.", ob->id.name+2);
- 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;
@@ -196,34 +201,47 @@ static Base *rna_Scene_object_link(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;
+
+ /* slows down importers too much, run scene.update() */
+ /* DAG_scene_sort(G.main, scene); */
- DAG_scene_sort(scene);
+ WM_main_add_notifier(NC_SCENE|ND_OB_ACTIVE, scene);
return base;
}
-static void rna_Scene_object_unlink(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);
+ DAG_scene_sort(G.main, scene);
+ DAG_ids_flush_update(G.main, 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)
@@ -268,14 +286,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)
@@ -373,16 +391,24 @@ static void rna_Scene_active_keying_set_set(PointerRNA *ptr, PointerRNA value)
scene->active_keyingset= ANIM_scene_get_keyingset_index(scene, ks);
}
-#if 0 // XXX: these need to be fixed up first...
-static void rna_Scene_active_keying_set_index_range(PointerRNA *ptr, int *min, int *max)
+/* 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;
-
- // FIXME: would need access to builtin keyingsets list to count min...
- *min= 0;
- *max= 0;
+ Scene *scene= (Scene *)ptr->data;
+ return scene->active_keyingset-1;
+}
+
+/* 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;
}
-#endif
// XXX: evil... builtin_keyingsets is defined in keyingsets.c!
// TODO: make API function to retrieve this...
@@ -523,14 +549,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)
@@ -541,8 +567,8 @@ static EnumPropertyItem *rna_RenderSettings_qtcodecsettings_codecType_itemf(bCon
int i=1, totitem= 0;
char id[5];
- for(i=0;i<quicktime_get_num_codecs();i++) {
- codecTypeDesc = quicktime_get_codecType_desc(i);
+ for(i=0;i<quicktime_get_num_videocodecs();i++) {
+ codecTypeDesc = quicktime_get_videocodecType_desc(i);
if (!codecTypeDesc) break;
tmp.value= codecTypeDesc->rnatmpvalue;
@@ -557,8 +583,47 @@ static EnumPropertyItem *rna_RenderSettings_qtcodecsettings_codecType_itemf(bCon
*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;i<quicktime_get_num_audiocodecs();i++) {
+ codecTypeDesc = quicktime_get_audiocodecType_desc(i);
+ if (!codecTypeDesc) break;
+
+ tmp.value= codecTypeDesc->rnatmpvalue;
+ 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)
{
@@ -581,6 +646,22 @@ static void rna_RenderSettings_active_layer_index_range(PointerRNA *ptr, int *mi
*max= MAX2(0, *max);
}
+static PointerRNA rna_RenderSettings_active_layer_get(PointerRNA *ptr)
+{
+ RenderData *rd= (RenderData*)ptr->data;
+ SceneRenderLayer *srl = BLI_findlink(&rd->layers, rd->actlay);
+
+ return rna_pointer_inherit_refine(ptr, &RNA_SceneRenderLayer, srl);
+}
+
+static void rna_RenderSettings_active_layer_set(PointerRNA *ptr, PointerRNA value)
+{
+ RenderData *rd= (RenderData*)ptr->data;
+ SceneRenderLayer *srl= (SceneRenderLayer*)value.data;
+
+ rd->actlay = BLI_findindex(&rd->layers, srl);
+}
+
static void rna_RenderSettings_engine_set(PointerRNA *ptr, int value)
{
RenderData *rd= (RenderData*)ptr->data;
@@ -623,6 +704,13 @@ static int rna_RenderSettings_engine_get(PointerRNA *ptr)
return 0;
}
+static void rna_Scene_glsl_update(Main *bmain, Scene *unused, PointerRNA *ptr)
+{
+ Scene *scene= (Scene*)ptr->id.data;
+
+ DAG_id_flush_update(&scene->id, 0);
+}
+
static void rna_RenderSettings_color_management_update(Main *bmain, Scene *unused, PointerRNA *ptr)
{
/* reset image nodes */
@@ -641,6 +729,8 @@ static void rna_RenderSettings_color_management_update(Main *bmain, Scene *unuse
}
}
}
+
+ rna_Scene_glsl_update(bmain, unused, ptr);
}
static void rna_SceneRenderLayer_name_set(PointerRNA *ptr, const char *value)
@@ -683,7 +773,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)
@@ -748,10 +838,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;
@@ -761,17 +855,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);
+ DAG_ids_flush_update(bmain, 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;
@@ -904,7 +1005,7 @@ static void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "Sculpt");
RNA_def_property_ui_text(prop, "Sculpt", "");
- prop = RNA_def_property(srna, "auto_normalize", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_auto_normalize", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "auto_normalize", 1);
RNA_def_property_ui_text(prop, "WPaint Auto-Normalize",
"Ensure all bone-deforming vertex groups add up to 1.0 while "
@@ -927,13 +1028,19 @@ static void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Particle Edit", "");
/* Transform */
- prop= RNA_def_property(srna, "proportional_editing", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "proportional_edit", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "proportional");
RNA_def_property_enum_items(prop, proportional_editing_items);
RNA_def_property_ui_text(prop, "Proportional Editing", "Proportional editing mode");
RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); /* header redraw */
- prop= RNA_def_property(srna, "proportional_editing_falloff", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "use_proportional_edit_objects", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "proportional_objects", 0);
+ RNA_def_property_ui_text(prop, "Proportional Editing Objects", "Proportional editing object mode");
+ RNA_def_property_ui_icon(prop, ICON_PROP_OFF, 1);
+ RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); /* header redraw */
+
+ prop= RNA_def_property(srna, "proportional_edit_falloff", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "prop_mode");
RNA_def_property_enum_items(prop, proportional_falloff_items);
RNA_def_property_ui_text(prop, "Proportional Editing Falloff", "Falloff type for proportional editing mode");
@@ -946,17 +1053,17 @@ static void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_ui_range(prop, 0.01, 10.0, 10.0, 2);
RNA_def_property_update(prop, NC_GEOM|ND_DATA, NULL);
- prop= RNA_def_property(srna, "automerge_editing", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_mesh_automerge", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "automerge", 0);
RNA_def_property_ui_text(prop, "AutoMerge Editing", "Automatically merge vertices moved to the same location");
- prop= RNA_def_property(srna, "snap", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_snap", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "snap_flag", SCE_SNAP);
RNA_def_property_ui_text(prop, "Snap", "Snap during transform");
RNA_def_property_ui_icon(prop, ICON_SNAP_OFF, 1);
RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); /* header redraw */
- prop= RNA_def_property(srna, "snap_align_rotation", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_snap_align_rotation", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "snap_flag", SCE_SNAP_ROTATE);
RNA_def_property_ui_text(prop, "Snap Align Rotation", "Align rotation with the snapping target");
RNA_def_property_ui_icon(prop, ICON_SNAP_NORMAL, 0);
@@ -974,52 +1081,53 @@ static void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Snap Target", "Which part to snap onto the target");
RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); /* header redraw */
- prop= RNA_def_property(srna, "snap_peel_object", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_snap_peel_object", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "snap_flag", SCE_SNAP_PEEL_OBJECT);
RNA_def_property_ui_text(prop, "Snap Peel Object", "Consider objects as whole when finding volume center");
RNA_def_property_ui_icon(prop, ICON_SNAP_PEEL_OBJECT, 0);
RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); /* header redraw */
- prop= RNA_def_property(srna, "snap_project", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_snap_project", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "snap_flag", SCE_SNAP_PROJECT);
RNA_def_property_ui_text(prop, "Project Individual Elements", "Project vertices on the surface of other objects");
RNA_def_property_ui_icon(prop, ICON_RETOPO, 0);
RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); /* header redraw */
/* Auto Keying */
- prop= RNA_def_property(srna, "use_auto_keying", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_keyframe_insert_auto", 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);
+ prop= RNA_def_property(srna, "auto_keying_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "autokey_mode");
RNA_def_property_enum_items(prop, auto_key_items);
RNA_def_property_ui_text(prop, "Auto-Keying Mode", "Mode of automatic keyframe insertion for Objects and Bones");
- prop= RNA_def_property(srna, "record_with_nla", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_record_with_nla", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "autokey_flag", ANIMRECORD_FLAG_WITHNLA);
RNA_def_property_ui_text(prop, "Layered", "Add a new NLA Track + Strip for every loop/pass made over the animation to allow non-destructive tweaking");
/* UV */
- prop= RNA_def_property(srna, "uv_selection_mode", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "uv_select_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "uv_selectmode");
RNA_def_property_enum_items(prop, uv_select_mode_items);
RNA_def_property_ui_text(prop, "UV Selection Mode", "UV selection and display mode");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
- prop= RNA_def_property(srna, "uv_sync_selection", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_uv_select_sync", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uv_flag", UV_SYNC_SELECTION);
RNA_def_property_ui_text(prop, "UV Sync Selection", "Keep UV and edit mode mesh selection in sync");
RNA_def_property_ui_icon(prop, ICON_EDIT, 0);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
- prop= RNA_def_property(srna, "uv_local_view", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_uv_local_view", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uv_flag", UV_SHOW_SAME_IMAGE);
RNA_def_property_ui_text(prop, "UV Local View", "Draw only faces with the currently displayed image assigned");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
/* Mesh */
- prop= RNA_def_property(srna, "mesh_selection_mode", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "mesh_select_mode", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "selectmode", 1);
RNA_def_property_array(prop, 3);
RNA_def_property_boolean_funcs(prop, NULL, "rna_Scene_editmesh_select_mode_set");
@@ -1037,20 +1145,20 @@ static void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Edge Tag Mode", "The edge flag to tag when selecting the shortest path");
/* etch-a-ton */
- prop= RNA_def_property(srna, "bone_sketching", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_bone_sketching", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "bone_sketching", BONE_SKETCHING);
RNA_def_property_ui_text(prop, "Use Bone Sketching", "DOC BROKEN");
// RNA_def_property_ui_icon(prop, ICON_EDIT, 0);
- prop= RNA_def_property(srna, "etch_quick", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_etch_quick", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "bone_sketching", BONE_SKETCHING_QUICK);
RNA_def_property_ui_text(prop, "Quick Sketching", "DOC BROKEN");
- prop= RNA_def_property(srna, "etch_overdraw", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_etch_overdraw", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "bone_sketching", BONE_SKETCHING_ADJUST);
RNA_def_property_ui_text(prop, "Overdraw Sketching", "DOC BROKEN");
- prop= RNA_def_property(srna, "etch_autoname", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_etch_autoname", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "skgen_retarget_options", SK_RETARGET_AUTONAME);
RNA_def_property_ui_text(prop, "Autoname", "DOC BROKEN");
@@ -1066,7 +1174,7 @@ static void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_pointer_sdna(prop, NULL, "skgen_template");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "Object");
- RNA_def_property_pointer_funcs(prop, NULL, "rna_Scene_skgen_etch_template_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_Scene_skgen_etch_template_set", NULL, NULL);
RNA_def_property_ui_text(prop, "Template", "Template armature that will be retargeted to the stroke");
prop= RNA_def_property(srna, "etch_subdivision_number", PROP_INT, PROP_NONE);
@@ -1099,6 +1207,16 @@ static void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_enum_items(prop, sketch_convert_items);
RNA_def_property_ui_text(prop, "Stroke conversion method", "Method used to convert stroke to bones");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
+
+ /* Sculpt/Paint Unified Size and Strength */
+
+ 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");
}
@@ -1174,7 +1292,7 @@ void rna_def_render_layer_common(StructRNA *srna, int scene)
else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
/* 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_ui_text(prop, "Visible Layers", "Scene layers included in this render layer");
@@ -1183,7 +1301,7 @@ void rna_def_render_layer_common(StructRNA *srna, int scene)
if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- prop= RNA_def_property(srna, "zmask_layers", PROP_BOOLEAN, PROP_LAYER);
+ prop= RNA_def_property(srna, "layers_zmask", PROP_BOOLEAN, PROP_LAYER);
RNA_def_property_boolean_sdna(prop, NULL, "lay_zmask", 1);
RNA_def_property_array(prop, 20);
RNA_def_property_ui_text(prop, "Zmask Layers", "Zmask scene layers");
@@ -1191,214 +1309,222 @@ void rna_def_render_layer_common(StructRNA *srna, int scene)
else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
/* layer options */
- prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "layflag", SCE_LAY_DISABLE);
RNA_def_property_ui_text(prop, "Enabled", "Disable or enable the render layer");
if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- prop= RNA_def_property(srna, "zmask", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_zmask", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_ZMASK);
RNA_def_property_ui_text(prop, "Zmask", "Only render what's in front of the solid z values");
if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- prop= RNA_def_property(srna, "zmask_negate", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_zmask", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_NEG_ZMASK);
RNA_def_property_ui_text(prop, "Zmask Negate", "For Zmask, only render what is behind solid z values instead of in front");
if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- prop= RNA_def_property(srna, "all_z", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_all_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_ALL_Z);
RNA_def_property_ui_text(prop, "All Z", "Fill in Z values for solid faces in invisible layers, for masking");
if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- prop= RNA_def_property(srna, "solid", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_solid", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_SOLID);
RNA_def_property_ui_text(prop, "Solid", "Render Solid faces in this Layer");
if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- prop= RNA_def_property(srna, "halo", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_halo", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_HALO);
RNA_def_property_ui_text(prop, "Halo", "Render Halos in this Layer (on top of Solid)");
if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- prop= RNA_def_property(srna, "ztransp", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_ztransp", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_ZTRA);
RNA_def_property_ui_text(prop, "ZTransp", "Render Z-Transparent faces in this Layer (On top of Solid and Halos)");
if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- prop= RNA_def_property(srna, "sky", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_sky", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_SKY);
RNA_def_property_ui_text(prop, "Sky", "Render Sky in this Layer");
if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- prop= RNA_def_property(srna, "edge", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_edge_enhance", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_EDGE);
RNA_def_property_ui_text(prop, "Edge", "Render Edge-enhance in this Layer (only works for Solid faces)");
if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- prop= RNA_def_property(srna, "strand", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_strand", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_STRAND);
RNA_def_property_ui_text(prop, "Strand", "Render Strands in this Layer");
if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
/* passes */
- prop= RNA_def_property(srna, "pass_combined", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pass_combined", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_COMBINED);
RNA_def_property_ui_text(prop, "Combined", "Deliver full combined RGBA buffer");
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_z", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pass_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_Z);
RNA_def_property_ui_text(prop, "Z", "Deliver Z values pass");
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_vector", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pass_vector", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_VECTOR);
RNA_def_property_ui_text(prop, "Vector", "Deliver speed vector pass");
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_normal", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pass_normal", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_NORMAL);
RNA_def_property_ui_text(prop, "Normal", "Deliver normal pass");
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_uv", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pass_uv", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_UV);
RNA_def_property_ui_text(prop, "UV", "Deliver texture UV pass");
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_mist", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pass_mist", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_MIST);
RNA_def_property_ui_text(prop, "Mist", "Deliver mist factor pass (0.0-1.0)");
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_object_index", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pass_object_index", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_INDEXOB);
RNA_def_property_ui_text(prop, "Object Index", "Deliver object index pass");
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_color", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pass_color", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_RGBA);
RNA_def_property_ui_text(prop, "Color", "Deliver shade-less color pass");
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_diffuse", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pass_diffuse", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_DIFFUSE);
RNA_def_property_ui_text(prop, "Diffuse", "Deliver diffuse pass");
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_specular", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pass_specular", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_SPEC);
RNA_def_property_ui_text(prop, "Specular", "Deliver specular pass");
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", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pass_shadow", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_SHADOW);
RNA_def_property_ui_text(prop, "Shadow", "Deliver shadow pass");
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", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pass_ambient_occlusion", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_AO);
RNA_def_property_ui_text(prop, "AO", "Deliver AO pass");
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", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pass_reflection", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_REFLECT);
RNA_def_property_ui_text(prop, "Reflection", "Deliver raytraced reflection pass");
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", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pass_refraction", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_REFRACT);
RNA_def_property_ui_text(prop, "Refraction", "Deliver raytraced refraction pass");
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", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pass_emit", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_EMIT);
RNA_def_property_ui_text(prop, "Emit", "Deliver emission pass");
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", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pass_environment", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_ENVIRONMENT);
RNA_def_property_ui_text(prop, "Environment", "Deliver environment lighting pass");
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", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pass_indirect", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_INDIRECT);
RNA_def_property_ui_text(prop, "Indirect", "Deliver indirect lighting pass");
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_specular_exclude", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "exclude_specular", 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);
+ prop= RNA_def_property(srna, "exclude_shadow", 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);
+ prop= RNA_def_property(srna, "exclude_ambient_occlusion", 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);
+ prop= RNA_def_property(srna, "exclude_reflection", 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);
+ prop= RNA_def_property(srna, "exclude_refraction", 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);
+ prop= RNA_def_property(srna, "exclude_emit", 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);
+ prop= RNA_def_property(srna, "exclude_environment", 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);
+ prop= RNA_def_property(srna, "exclude_indirect", 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);
}
@@ -1469,7 +1595,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");
@@ -1482,19 +1608,19 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Freq", "Displays clock frequency of fullscreen display");
RNA_def_property_update(prop, NC_SCENE, NULL);
- prop= RNA_def_property(srna, "fullscreen", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_fullscreen", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "fullscreen", 1.0);
RNA_def_property_ui_text(prop, "Fullscreen", "Starts player in a new fullscreen display");
RNA_def_property_update(prop, NC_SCENE, NULL);
/* Framing */
- prop= RNA_def_property(srna, "framing_type", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "frame_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "framing.type");
RNA_def_property_enum_items(prop, framing_types_items);
RNA_def_property_ui_text(prop, "Framing Types", "Select the type of Framing you want");
RNA_def_property_update(prop, NC_SCENE, NULL);
- prop= RNA_def_property(srna, "framing_color", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "frame_color", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "framing.col");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Framing Color", "Set colour of the bars");
@@ -1513,7 +1639,7 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Stereo Mode", "Stereographic techniques");
RNA_def_property_update(prop, NC_SCENE, NULL);
- prop= RNA_def_property(srna, "eye_separation", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "stereo_eye_separation", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "eyeseparation");
RNA_def_property_range(prop, 0.01, 5.0);
RNA_def_property_ui_text(prop, "Eye Separation", "Set the distance between the eyes - the camera focal length/30 should be fine");
@@ -1529,7 +1655,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);
@@ -1573,7 +1699,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);
@@ -1607,10 +1733,10 @@ 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);
+ prop= RNA_def_property(srna, "use_activity_culling", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", (1 << 3)); //XXX mode hardcoded
RNA_def_property_ui_text(prop, "Activity Culling", "Activity culling is enabled");
@@ -1635,7 +1761,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);
@@ -1649,7 +1775,7 @@ 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);
+ prop= RNA_def_property(srna, "use_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");
@@ -1660,35 +1786,35 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Material Mode", "Material mode to use for rendering");
RNA_def_property_update(prop, NC_SCENE|NA_EDITED, NULL);
- prop= RNA_def_property(srna, "glsl_lights", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_glsl_lights", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GAME_GLSL_NO_LIGHTS);
RNA_def_property_ui_text(prop, "GLSL Lights", "Use lights for GLSL rendering");
- RNA_def_property_update(prop, NC_SCENE|NA_EDITED, NULL);
+ RNA_def_property_update(prop, NC_SCENE|NA_EDITED, "rna_Scene_glsl_update");
- prop= RNA_def_property(srna, "glsl_shaders", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_glsl_shaders", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GAME_GLSL_NO_SHADERS);
RNA_def_property_ui_text(prop, "GLSL Shaders", "Use shaders for GLSL rendering");
- RNA_def_property_update(prop, NC_SCENE|NA_EDITED, NULL);
+ RNA_def_property_update(prop, NC_SCENE|NA_EDITED, "rna_Scene_glsl_update");
- prop= RNA_def_property(srna, "glsl_shadows", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_glsl_shadows", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GAME_GLSL_NO_SHADOWS);
RNA_def_property_ui_text(prop, "GLSL Shadows", "Use shadows for GLSL rendering");
- RNA_def_property_update(prop, NC_SCENE|NA_EDITED, NULL);
+ RNA_def_property_update(prop, NC_SCENE|NA_EDITED, "rna_Scene_glsl_update");
- prop= RNA_def_property(srna, "glsl_ramps", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_glsl_ramps", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GAME_GLSL_NO_RAMPS);
RNA_def_property_ui_text(prop, "GLSL Ramps", "Use ramps for GLSL rendering");
- RNA_def_property_update(prop, NC_SCENE|NA_EDITED, NULL);
+ RNA_def_property_update(prop, NC_SCENE|NA_EDITED, "rna_Scene_glsl_update");
- prop= RNA_def_property(srna, "glsl_nodes", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_glsl_nodes", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GAME_GLSL_NO_NODES);
RNA_def_property_ui_text(prop, "GLSL Nodes", "Use nodes for GLSL rendering");
- RNA_def_property_update(prop, NC_SCENE|NA_EDITED, NULL);
+ RNA_def_property_update(prop, NC_SCENE|NA_EDITED, "rna_Scene_glsl_update");
- prop= RNA_def_property(srna, "glsl_extra_textures", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_glsl_extra_textures", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GAME_GLSL_NO_EXTRA_TEX);
RNA_def_property_ui_text(prop, "GLSL Extra Textures", "Use extra textures like normal or specular maps for GLSL rendering");
- RNA_def_property_update(prop, NC_SCENE|NA_EDITED, NULL);
+ RNA_def_property_update(prop, NC_SCENE|NA_EDITED, "rna_Scene_glsl_update");
}
static void rna_def_scene_render_layer(BlenderRNA *brna)
@@ -1697,10 +1823,40 @@ 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);
}
+/* curve.splines */
+static void rna_def_render_layers(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ // FunctionRNA *func;
+ // PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "RenderLayers");
+ srna= RNA_def_struct(brna, "RenderLayers", NULL);
+ RNA_def_struct_sdna(srna, "RenderData");
+ RNA_def_struct_ui_text(srna, "Render Layers", "Collection of render layers");
+
+ prop= RNA_def_property(srna, "active_index", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "actlay");
+ RNA_def_property_int_funcs(prop, "rna_RenderSettings_active_layer_index_get", "rna_RenderSettings_active_layer_index_set", "rna_RenderSettings_active_layer_index_range");
+ RNA_def_property_ui_text(prop, "Active Layer Index", "Active index in render layer array");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
+ prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_UNSIGNED);
+ RNA_def_property_struct_type(prop, "SceneRenderLayer");
+ RNA_def_property_pointer_funcs(prop, "rna_RenderSettings_active_layer_get", "rna_RenderSettings_active_layer_set", NULL, NULL);
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Active Render Layer", "Active Render Layer");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
+}
+
static void rna_def_scene_render_data(BlenderRNA *brna)
{
StructRNA *srna;
@@ -1824,6 +1980,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
@@ -1931,20 +2116,20 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
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");
+ RNA_def_property_range(prop, 0, 100); /* 0 is needed for compression. */
+ RNA_def_property_ui_text(prop, "Quality", "Quality of JPEG images, AVI Jpeg and SGI movies, Compression for PNG's");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
/* Tiff */
- prop= RNA_def_property(srna, "tiff_bit", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_tiff_16bit", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "subimtype", R_TIFF_16BIT);
RNA_def_property_ui_text(prop, "16 Bit", "Save TIFF with 16 bits per channel");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
/* Cineon and DPX */
- prop= RNA_def_property(srna, "cineon_log", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_cineon_log", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "subimtype", R_CINEON_LOG);
RNA_def_property_ui_text(prop, "Log", "Convert to logarithmic color space");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
@@ -1976,7 +2161,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Codec", "Codec settings for OpenEXR");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "exr_half", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_exr_half", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "subimtype", R_OPENEXR_HALF);
RNA_def_property_ui_text(prop, "Half", "Use 16 bit floats instead of 32 bit floats per channel");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
@@ -2031,8 +2216,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*/
@@ -2143,7 +2367,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Dither Intensity", "Amount of dithering noise added to the rendered image to break up banding");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "pixel_filter", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "pixel_filter_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "filtertype");
RNA_def_property_enum_items(prop, pixel_filter_items);
RNA_def_property_ui_text(prop, "Pixel Filter", "Reconstruction filter used for combining anti-aliasing samples");
@@ -2167,7 +2391,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Octree Resolution", "Resolution of raytrace accelerator. Use higher resolutions for larger scenes");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "raytrace_structure", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "raytrace_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "raytrace_structure");
RNA_def_property_enum_items(prop, raytrace_structure_items);
RNA_def_property_ui_text(prop, "Raytrace Acceleration Structure", "Type of raytrace accelerator structure");
@@ -2183,7 +2407,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, "use_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);
@@ -2194,7 +2418,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Anti-Aliasing Samples", "Amount of anti-aliasing samples per pixel");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "fields", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_fields", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", R_FIELDS);
RNA_def_property_ui_text(prop, "Fields", "Render image to two fields per frame, for interlaced TV output");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
@@ -2205,42 +2429,43 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Field Order", "Order of video fields. Select which lines get rendered first, to create smooth motion for TV output");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "fields_still", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_fields_still", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", R_FIELDSTILL);
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_raytrace", 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);
+ prop= RNA_def_property(srna, "use_edge_enhance", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", R_EDGE);
RNA_def_property_ui_text(prop, "Edge", "Create a toon outline around the edges of geometry");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
@@ -2257,6 +2482,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);
@@ -2270,7 +2496,8 @@ 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);
- prop= RNA_def_property(srna, "motion_blur", PROP_BOOLEAN, PROP_NONE);
+ /* motion blur */
+ prop= RNA_def_property(srna, "use_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");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
@@ -2281,6 +2508,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");
@@ -2310,7 +2545,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Border Maximum Y", "Sets maximum Y value for the render border");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "crop_to_border", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_crop_to_border", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", R_CROP);
RNA_def_property_ui_text(prop, "Crop to Border", "Crop the rendered frame to the defined border size");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
@@ -2335,10 +2570,11 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Sequencer", "Process the render (and composited) result through the video sequence editor pipeline, if sequencer strips exist");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "color_management", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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);
@@ -2362,29 +2598,29 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
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);
+ prop= RNA_def_property(srna, "use_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);
+ prop= RNA_def_property(srna, "use_free_unused_nodes", PROP_BOOLEAN, PROP_NONE);
+ 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);
- prop= RNA_def_property(srna, "save_buffers", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_save_buffers", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_EXR_TILE_FILE);
RNA_def_property_boolean_funcs(prop, "rna_RenderSettings_save_buffers_get", NULL);
RNA_def_property_ui_text(prop, "Save Buffers","Save tiles for all RenderLayers and SceneNodes to files in the temp directory (saves memory, required for Full Sample)");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "full_sample", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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_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);
- prop= RNA_def_property(srna, "backbuf", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_backbuf", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "bufflag", R_BACKBUF);
RNA_def_property_ui_text(prop, "Back Buffer", "Render backbuffer image");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
@@ -2395,7 +2631,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Display", "Select where rendered images will be displayed");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "output_path", PROP_STRING, PROP_DIRPATH);
+ prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_DIRPATH);
RNA_def_property_string_sdna(prop, NULL, "pic");
RNA_def_property_ui_text(prop, "Output Path", "Directory/name to save animations, # characters defines the position and length of frame numbers");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
@@ -2421,19 +2657,19 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
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);
+ prop= RNA_def_property(srna, "use_bake_selected_to_active", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "bake_flag", R_BAKE_TO_ACTIVE);
RNA_def_property_ui_text(prop, "Selected to Active", "Bake shading on the surface of selected objects to the active object");
- prop= RNA_def_property(srna, "bake_normalized", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_bake_normalize", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "bake_flag", R_BAKE_NORMALIZE);
RNA_def_property_ui_text(prop, "Normalized", "With displacement normalize to the distance, with ambient occlusion normalize without using material settings");
- prop= RNA_def_property(srna, "bake_clear", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_bake_clear", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "bake_flag", R_BAKE_CLEAR);
RNA_def_property_ui_text(prop, "Clear", "Clear Images before baking");
- prop= RNA_def_property(srna, "bake_enable_aa", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_bake_antialiasing", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "bake_flag", R_BAKE_OSA);
RNA_def_property_ui_text(prop, "Anti-Aliasing", "Enables Anti-aliasing");
@@ -2454,52 +2690,52 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
/* stamp */
- prop= RNA_def_property(srna, "stamp_time", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_stamp_time", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_TIME);
RNA_def_property_ui_text(prop, "Stamp Time", "Include the render frame as HH:MM:SS.FF in image metadata");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "stamp_date", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_stamp_date", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_DATE);
RNA_def_property_ui_text(prop, "Stamp Date", "Include the current date in image metadata");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "stamp_frame", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_stamp_frame", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_FRAME);
RNA_def_property_ui_text(prop, "Stamp Frame", "Include the frame number in image metadata");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "stamp_camera", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_stamp_camera", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_CAMERA);
RNA_def_property_ui_text(prop, "Stamp Camera", "Include the name of the active camera in image metadata");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "stamp_scene", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_stamp_scene", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_SCENE);
RNA_def_property_ui_text(prop, "Stamp Scene", "Include the name of the active scene in image metadata");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "stamp_note", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_stamp_note", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_NOTE);
RNA_def_property_ui_text(prop, "Stamp Note", "Include a custom note in image metadata");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "stamp_marker", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_stamp_marker", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_MARKER);
RNA_def_property_ui_text(prop, "Stamp Marker", "Include the name of the last marker in image metadata");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "stamp_filename", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_stamp_filename", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_FILENAME);
RNA_def_property_ui_text(prop, "Stamp Filename", "Include the filename of the .blend file in image metadata");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "stamp_sequencer_strip", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_stamp_sequencer_strip", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_SEQSTRIP);
RNA_def_property_ui_text(prop, "Stamp Sequence Strip", "Include the name of the foreground sequence strip in image metadata");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "stamp_render_time", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_stamp_render_time", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_RENDERTIME);
RNA_def_property_ui_text(prop, "Stamp Render Time", "Include the render time in the stamp image");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
@@ -2509,7 +2745,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Stamp Note Text", "Custom text to appear in the stamp note");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "render_stamp", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_stamp", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_DRAW);
RNA_def_property_ui_text(prop, "Render Stamp", "Render the stamp info text in the rendered image");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
@@ -2547,12 +2783,12 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
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_enum_items(prop, viewport_shade_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_enum_items(prop, viewport_shade_items);
RNA_def_property_ui_text(prop, "Sequencer Preview Shading", "Method to draw in the sequencer view");
/* layers */
@@ -2561,18 +2797,14 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_collection_sdna(prop, NULL, "layers", NULL);
RNA_def_property_struct_type(prop, "SceneRenderLayer");
RNA_def_property_ui_text(prop, "Render Layers", "");
+ rna_def_render_layers(brna, prop);
- prop= RNA_def_property(srna, "single_layer", PROP_BOOLEAN, PROP_NONE);
+
+ prop= RNA_def_property(srna, "use_single_layer", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_SINGLE_LAYER);
RNA_def_property_ui_text(prop, "Single Layer", "Only render the active layer");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "active_layer_index", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "actlay");
- RNA_def_property_int_funcs(prop, "rna_RenderSettings_active_layer_index_get", "rna_RenderSettings_active_layer_index_set", "rna_RenderSettings_active_layer_index_range");
- RNA_def_property_ui_text(prop, "Active Layer Index", "Active index in render layer array");
- RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
-
/* engine */
prop= RNA_def_property(srna, "engine", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, engine_items);
@@ -2580,7 +2812,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Engine", "Engine to use for rendering");
RNA_def_property_update(prop, NC_WINDOW, NULL);
- prop= RNA_def_property(srna, "multiple_engines", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "has_multiple_engines", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_RenderSettings_multiple_engines_get", NULL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Multiple Engines", "More than one rendering engine is available");
@@ -2594,9 +2826,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");
@@ -2618,7 +2850,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Simplify AO and SSS", "Global approximate AA and SSS quality factor");
RNA_def_property_update(prop, 0, "rna_Scene_simplify_update");
- prop= RNA_def_property(srna, "simplify_triangulate", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_simplify_triangulate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "simplify_flag", R_SIMPLE_NO_TRIANGULATE);
RNA_def_property_ui_text(prop, "Skip Quad to Triangles", "Disables non-planer quads being triangulated");
@@ -2641,8 +2873,8 @@ static void rna_def_scene_objects(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_struct_ui_text(srna, "Scene Objects", "Collection of scene objects");
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_ui_description(func, "Link object to scene, run scene.update() after.");
+ 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.");
@@ -2650,13 +2882,13 @@ static void rna_def_scene_objects(BlenderRNA *brna, PropertyRNA *cprop)
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);
prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Object");
- RNA_def_property_pointer_funcs(prop, "rna_Scene_active_object_get", "rna_Scene_active_object_set", NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Scene_active_object_get", "rna_Scene_active_object_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Active Object", "Active object for this scene");
/* Could call: ED_base_object_activate(C, scene->basact);
@@ -2716,6 +2948,75 @@ static void rna_def_timeline_markers(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
+/* scene.keying_sets */
+static void rna_def_scene_keying_sets(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+// FunctionRNA *func;
+// PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "KeyingSets");
+ srna= RNA_def_struct(brna, "KeyingSets", NULL);
+ RNA_def_struct_sdna(srna, "Scene");
+ RNA_def_struct_ui_text(srna, "Keying Sets", "Scene keying sets");
+
+ /*
+ 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_NEVER_NULL);
+ */
+
+ prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "KeyingSet");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, "rna_Scene_active_keying_set_get", "rna_Scene_active_keying_set_set", NULL, 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_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", 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);
+}
+
+static void rna_def_scene_keying_sets_all(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ RNA_def_property_srna(cprop, "KeyingSetsAll");
+ srna= RNA_def_struct(brna, "KeyingSetsAll", NULL);
+ RNA_def_struct_sdna(srna, "Scene");
+ RNA_def_struct_ui_text(srna, "Keying Sets All", "All available keying sets");
+
+ /* NOTE: no add/remove available here, without screwing up this amalgamated list... */
+
+ prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "KeyingSet");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, "rna_Scene_active_keying_set_get", "rna_Scene_active_keying_set_set", NULL, 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_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", 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);
+}
+
void RNA_def_scene(BlenderRNA *brna)
{
StructRNA *srna;
@@ -2747,14 +3048,15 @@ void RNA_def_scene(BlenderRNA *brna)
/* Global Settings */
prop= RNA_def_property(srna, "camera", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_Camera_object_poll");
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);
+ prop= RNA_def_property(srna, "background_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_pointer_funcs(prop, NULL, "rna_Scene_set_set", NULL, NULL);
RNA_def_property_ui_text(prop, "Background Scene", "Background set scene");
RNA_def_property_update(prop, NC_SCENE|NA_EDITED, NULL);
@@ -2763,14 +3065,14 @@ void RNA_def_scene(BlenderRNA *brna)
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);
RNA_def_property_update(prop, NC_WINDOW, NULL);
/* Bases/Objects */
- prop= RNA_def_property(srna, "bases", PROP_COLLECTION, PROP_NONE);
+ prop= RNA_def_property(srna, "object_bases", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "base", NULL);
RNA_def_property_struct_type(prop, "ObjectBase");
RNA_def_property_ui_text(prop, "Bases", "");
@@ -2784,12 +3086,12 @@ 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, "frame_current", PROP_INT, PROP_TIME);
@@ -2807,7 +3109,7 @@ void RNA_def_scene(BlenderRNA *brna)
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, "frame_end", PROP_INT, PROP_TIME);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
@@ -2815,7 +3117,7 @@ void RNA_def_scene(BlenderRNA *brna)
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);
@@ -2830,25 +3132,26 @@ 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_frame_start", PROP_INT, PROP_TIME);
+ prop= RNA_def_property(srna, "frame_preview_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_frame_end", PROP_INT, PROP_TIME);
+ prop= RNA_def_property(srna, "frame_preview_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 */
- prop= RNA_def_property(srna, "stamp_note", PROP_STRING, PROP_NONE);
+ prop= RNA_def_property(srna, "use_stamp_note", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "r.stamp_udata");
RNA_def_property_ui_text(prop, "Stamp Note", "User define note for the render stamping");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
@@ -2857,14 +3160,14 @@ void RNA_def_scene(BlenderRNA *brna)
rna_def_animdata_common(srna);
/* Readonly Properties */
- prop= RNA_def_property(srna, "nla_tweakmode_on", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_nla_tweakmode", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_NLA_EDIT_ON);
RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* DO NOT MAKE THIS EDITABLE, OR NLA EDITOR BREAKS */
RNA_def_property_ui_text(prop, "NLA TweakMode", "Indicates whether there is any action referenced by NLA being edited. Strictly read-only");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
/* Frame dropping flag for playback and sync enum */
- prop= RNA_def_property(srna, "frame_drop", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_frame_drop", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_FRAME_DROP);
RNA_def_property_ui_text(prop, "Frame Dropping", "Play back dropping frames if frame display is too slow");
RNA_def_property_update(prop, NC_SCENE, NULL);
@@ -2898,25 +3201,14 @@ void RNA_def_scene(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "KeyingSet");
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);
+ rna_def_scene_keying_sets(brna, prop);
- prop= RNA_def_property(srna, "all_keying_sets", PROP_COLLECTION, PROP_NONE);
+ prop= RNA_def_property(srna, "keying_sets_all", 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_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, NULL, NULL, "rna_Scene_active_keying_set_index_range"); // XXX
- RNA_def_property_ui_text(prop, "Active Keying Set Index", "Current Keying Set index (negative for 'builtin' and positive for 'absolute')");
+ 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);
+ rna_def_scene_keying_sets_all(brna, prop);
/* Tool Settings */
prop= RNA_def_property(srna, "tool_settings", PROP_POINTER, PROP_NONE);
@@ -2960,41 +3252,41 @@ void RNA_def_scene(BlenderRNA *brna)
rna_def_timeline_markers(brna, prop);
/* Audio Settings */
- prop= RNA_def_property(srna, "mute_audio", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "audio.flag", AUDIO_MUTE);
+ prop= RNA_def_property(srna, "use_audio", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "audio.flag", AUDIO_MUTE);
RNA_def_property_ui_text(prop, "Audio Muted", "Play back of audio from Sequence Editor will be muted");
RNA_def_property_update(prop, NC_SCENE, NULL);
- prop= RNA_def_property(srna, "sync_audio", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_audio_sync", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "audio.flag", AUDIO_SYNC);
RNA_def_property_ui_text(prop, "Audio Sync", "Play back and sync with audio clock, dropping frames if frame display is too slow");
RNA_def_property_update(prop, NC_SCENE, NULL);
- prop= RNA_def_property(srna, "scrub_audio", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_audio_scrub", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "audio.flag", AUDIO_SCRUB);
RNA_def_property_ui_text(prop, "Audio Scrubbing", "Play audio from Sequence Editor while scrubbing");
RNA_def_property_update(prop, NC_SCENE, NULL);
- prop= RNA_def_property(srna, "speed_of_sound", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "audio_doppler_speed", 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);
+ prop= RNA_def_property(srna, "audio_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);
+ prop= RNA_def_property(srna, "audio_distance_model", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "audio.distance_model");
RNA_def_property_enum_items(prop, audio_distance_model_items);
RNA_def_property_ui_text(prop, "Distance Model", "Distance model for distance attenuation calculation");
RNA_def_property_update(prop, NC_SCENE, NULL);
/* Game Settings */
- prop= RNA_def_property(srna, "game_data", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "game_settings", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "gm");
RNA_def_property_struct_type(prop, "SceneGameData");
diff --git a/source/blender/makesrna/intern/rna_scene_api.c b/source/blender/makesrna/intern/rna_scene_api.c
index 376ef54f4d8..498bd148508 100644
--- a/source/blender/makesrna/intern/rna_scene_api.c
+++ b/source/blender/makesrna/intern/rna_scene_api.c
@@ -39,22 +39,30 @@
#ifdef RNA_RUNTIME
#include "BKE_animsys.h"
-#include "BKE_scene.h"
-#include "BKE_image.h"
#include "BKE_depsgraph.h"
+#include "BKE_global.h"
+#include "BKE_image.h"
+#include "BKE_scene.h"
#include "BKE_writeavi.h"
-static void rna_Scene_set_frame(Scene *scene, bContext *C, int frame)
+static void rna_Scene_set_frame(Scene *scene, int frame, float subframe)
{
scene->r.cfra= frame;
+ scene->r.subframe= subframe;
+
CLAMP(scene->r.cfra, MINAFRAME, MAXFRAME);
- scene_update_for_newframe(scene, (1<<20) - 1);
+ scene_update_for_newframe(G.main, scene, (1<<20) - 1);
WM_main_add_notifier(NC_SCENE|ND_FRAME, scene);
}
+static void rna_Scene_update_tagged(Scene *scene)
+{
+ scene_update_tagged(G.main, scene);
+}
+
static KeyingSet *rna_Scene_add_keying_set(Scene *sce, ReportList *reports,
char name[], int absolute, int insertkey_needed, int insertkey_visual)
{
@@ -98,12 +106,12 @@ 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);
+ parm= RNA_def_float(func, "subframe", 0.0, 0.0, 1.0, "", "Sub-frame time, between 0.0 and 1.0", 0.0, 1.0);
- func= RNA_def_function(srna, "update", "scene_update_tagged");
+ func= RNA_def_function(srna, "update", "rna_Scene_update_tagged");
RNA_def_function_ui_description(func, "Update data tagged to be updated from previous access to data or operators.");
/* Add Keying Set */
@@ -118,8 +126,8 @@ void RNA_api_scene(StructRNA *srna)
/* flags */
RNA_def_boolean(func, "absolute", 1, "Absolute", "Keying Set defines specific paths/settings to be keyframed (i.e. is not reliant on context info)");
/* keying flags */
- RNA_def_boolean(func, "insertkey_needed", 0, "Insert Keyframes - Only Needed", "Only insert keyframes where they're needed in the relevant F-Curves.");
- RNA_def_boolean(func, "insertkey_visual", 0, "Insert Keyframes - Visual", "Insert keyframes based on 'visual transforms'.");
+ RNA_def_boolean(func, "use_insertkey_needed", 0, "Insert Keyframes - Only Needed", "Only insert keyframes where they're needed in the relevant F-Curves.");
+ RNA_def_boolean(func, "use_insertkey_visual", 0, "Insert Keyframes - Visual", "Insert keyframes based on 'visual transforms'.");
}
void RNA_api_scene_render(StructRNA *srna)
diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c
index d7dfd6fba9a..da8aab32f31 100644
--- a/source/blender/makesrna/intern/rna_screen.c
+++ b/source/blender/makesrna/intern/rna_screen.c
@@ -74,7 +74,7 @@ static void rna_Screen_scene_update(bContext *C, PointerRNA *ptr)
}
}
-static int rna_Screen_animation_playing_get(PointerRNA *ptr)
+static int rna_Screen_is_animation_playing_get(PointerRNA *ptr)
{
bScreen *sc= (bScreen*)ptr->data;
return (sc->animtimer != NULL);
@@ -161,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");
@@ -184,7 +184,7 @@ static void rna_def_screen(BlenderRNA *brna)
prop= RNA_def_property(srna, "scene", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_NEVER_NULL);
- RNA_def_property_pointer_funcs(prop, NULL, "rna_Screen_scene_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_Screen_scene_set", NULL, NULL);
RNA_def_property_ui_text(prop, "Scene", "Active scene to be edited in the screen");
RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
RNA_def_property_update(prop, 0, "rna_Screen_scene_update");
@@ -194,12 +194,12 @@ static void rna_def_screen(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "Area");
RNA_def_property_ui_text(prop, "Areas", "Areas the screen is subdivided into");
- prop= RNA_def_property(srna, "animation_playing", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_animation_playing", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_boolean_funcs(prop, "rna_Screen_animation_playing_get", NULL);
+ RNA_def_property_boolean_funcs(prop, "rna_Screen_is_animation_playing_get", NULL);
RNA_def_property_ui_text(prop, "Animation Playing", "Animation playback is active");
- prop= RNA_def_property(srna, "fullscreen", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_fullscreen", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_boolean_funcs(prop, "rna_Screen_fullscreen_get", NULL);
RNA_def_property_ui_text(prop, "Fullscreen", "An area is maximised, filling this screen");
diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.c b/source/blender/makesrna/intern/rna_sculpt_paint.c
index cafc9bb8f82..3b83ec2d3ad 100644
--- a/source/blender/makesrna/intern/rna_sculpt_paint.c
+++ b/source/blender/makesrna/intern/rna_sculpt_paint.c
@@ -30,6 +30,7 @@
#include "DNA_ID.h"
#include "DNA_scene_types.h"
+#include "DNA_brush_types.h"
#include "BKE_paint.h"
@@ -48,6 +49,7 @@ static EnumPropertyItem particle_edit_hair_brush_items[] = {
{0, NULL, 0, NULL, NULL}};
#ifdef RNA_RUNTIME
+#include "MEM_guardedalloc.h"
#include "BKE_context.h"
#include "BKE_pointcache.h"
@@ -88,29 +90,6 @@ static PointerRNA rna_ParticleBrush_curve_get(PointerRNA *ptr)
return rna_pointer_inherit_refine(ptr, &RNA_CurveMapping, NULL);
}
-static void rna_Paint_brushes_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
-{
- Paint *p= (Paint*)ptr->data;
- rna_iterator_array_begin(iter, (void*)p->brushes, sizeof(Brush*), p->brush_count, 0, NULL);
-}
-
-static int rna_Paint_brushes_length(PointerRNA *ptr)
-{
- Paint *p= (Paint*)ptr->data;
-
- return p->brush_count;
-}
-
-static PointerRNA rna_Paint_active_brush_get(PointerRNA *ptr)
-{
- return rna_pointer_inherit_refine(ptr, &RNA_Brush, paint_brush(ptr->data));
-}
-
-static void rna_Paint_active_brush_set(PointerRNA *ptr, PointerRNA value)
-{
- paint_brush_set(ptr->data, value.data);
-}
-
static void rna_ParticleEdit_redo(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Object *ob= (scene->basact)? scene->basact->object: NULL;
@@ -133,11 +112,11 @@ 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) {
+ if((pset->brushtype == PE_BRUSH_WEIGHT || value == PE_BRUSH_WEIGHT) && pset->scene) {
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_DATA, NULL);
+ WM_main_add_notifier(NC_OBJECT|ND_PARTICLE|NA_EDITED, NULL);
}
}
@@ -163,63 +142,28 @@ static int rna_ParticleEdit_editable_get(PointerRNA *ptr)
{
ParticleEditSettings *pset= (ParticleEditSettings*)ptr->data;
- return (pset->object && PE_get_current(pset->scene, pset->object));
+ return (pset->object && pset->scene && PE_get_current(pset->scene, pset->object));
}
static int rna_ParticleEdit_hair_get(PointerRNA *ptr)
{
ParticleEditSettings *pset= (ParticleEditSettings*)ptr->data;
- PTCacheEdit *edit = PE_get_current(pset->scene, pset->object);
-
- return (edit && edit->psys);
-}
+ if(pset->scene) {
+ PTCacheEdit *edit = PE_get_current(pset->scene, pset->object);
-static void rna_Paint_active_brush_index_set(PointerRNA *ptr, int value)
-{
- Paint *p= ptr->data;
- CLAMP(value, 0, p->brush_count-1);
- p->active_brush_index= value;
-}
-
-static void rna_Paint_active_brush_index_range(PointerRNA *ptr, int *min, int *max)
-{
- Paint *p= ptr->data;
- *min= 0;
- *max= MAX2(p->brush_count-1, 0);
-}
-
-static void rna_Paint_active_brush_name_get(PointerRNA *ptr, char *value)
-{
- Paint *p= ptr->data;
- Brush *br = paint_brush(p);
+ return (edit && edit->psys);
+ }
- BLI_strncpy(value, br->id.name+2, sizeof(br->id.name-2));
+ return 0;
}
-
-static int rna_Paint_active_brush_name_length(PointerRNA *ptr)
+static int rna_Brush_mode_poll(PointerRNA *ptr, PointerRNA value)
{
- Paint *p= ptr->data;
- Brush *br = paint_brush(p);
- return strlen(br->id.name+2);
+ Scene *scene= (Scene *)ptr->id.data;
+ Object *ob = OBACT;
+ Brush *brush= value.id.data;
+ return ob->mode & brush->ob_mode;
}
-
-static void rna_Paint_active_brush_name_set(PointerRNA *ptr, const char *value)
-{
- Paint *p= ptr->data;
- Brush *br;
- int i;
-
- 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;
- }
- }
-}
-
#else
static void rna_def_paint(BlenderRNA *brna)
@@ -230,39 +174,22 @@ static void rna_def_paint(BlenderRNA *brna)
srna= RNA_def_struct(brna, "Paint", NULL);
RNA_def_struct_ui_text(srna, "Paint", "");
- prop= RNA_def_property(srna, "brushes", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_struct_type(prop, "Brush");
- RNA_def_property_collection_funcs(prop, "rna_Paint_brushes_begin",
- "rna_iterator_array_next",
- "rna_iterator_array_end",
- "rna_iterator_array_dereference_get",
- "rna_Paint_brushes_length", 0, 0);
- RNA_def_property_ui_text(prop, "Brushes", "Brushes selected for this paint mode");
-
- prop= RNA_def_property(srna, "active_brush_index", PROP_INT, PROP_NONE);
- RNA_def_property_int_funcs(prop, NULL, "rna_Paint_active_brush_index_set", "rna_Paint_active_brush_index_range");
- RNA_def_property_range(prop, 0, INT_MAX);
- RNA_def_property_update(prop, NC_BRUSH|NA_EDITED, NULL);
-
- prop= RNA_def_property(srna, "active_brush_name", PROP_STRING, PROP_NONE);
- RNA_def_property_string_funcs(prop, "rna_Paint_active_brush_name_get", "rna_Paint_active_brush_name_length", "rna_Paint_active_brush_name_set");
- RNA_def_property_string_maxlength(prop, sizeof(((ID*)NULL)->name)-2);
- RNA_def_property_ui_text(prop, "Active Brush Name", "");
- RNA_def_property_update(prop, NC_BRUSH|NA_EDITED, NULL);
-
- /* Fake property to get active brush directly, rather than integer index */
+ /* Global Settings */
prop= RNA_def_property(srna, "brush", PROP_POINTER, PROP_NONE);
- RNA_def_property_struct_type(prop, "Brush");
- RNA_def_property_pointer_funcs(prop, "rna_Paint_active_brush_get", "rna_Paint_active_brush_set", NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Brush", "Active paint brush");
+ RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_Brush_mode_poll");
+ RNA_def_property_ui_text(prop, "Brush", "Active Brush");
RNA_def_property_update(prop, NC_BRUSH|NA_EDITED, NULL);
prop= RNA_def_property(srna, "show_brush", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", PAINT_SHOW_BRUSH);
RNA_def_property_ui_text(prop, "Show Brush", "");
- prop= RNA_def_property(srna, "fast_navigate", PROP_BOOLEAN, PROP_NONE);
+ 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, "show_low_resolution", 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");
}
@@ -274,16 +201,23 @@ 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, "symmetry_x", PROP_BOOLEAN, PROP_NONE);
+
+ prop= RNA_def_property(srna, "radial_symmetry", 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, "use_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");
- prop= RNA_def_property(srna, "symmetry_y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_symmetry_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_SYMM_Y);
RNA_def_property_ui_text(prop, "Symmetry Y", "Mirror brush across the Y axis");
- prop= RNA_def_property(srna, "symmetry_z", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_symmetry_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_SYMM_Z);
RNA_def_property_ui_text(prop, "Symmetry Z", "Mirror brush across the Z axis");
@@ -298,6 +232,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_threaded", 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)
@@ -309,15 +251,15 @@ static void rna_def_vertex_paint(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "VPaint");
RNA_def_struct_ui_text(srna, "Vertex Paint", "Properties of vertex and weight paint mode");
- prop= RNA_def_property(srna, "all_faces", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_all_faces", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_AREA);
RNA_def_property_ui_text(prop, "All Faces", "Paint on all faces inside brush");
-
- prop= RNA_def_property(srna, "normals", PROP_BOOLEAN, PROP_NONE);
+
+ prop= RNA_def_property(srna, "use_normal", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_NORMALS);
RNA_def_property_ui_text(prop, "Normals", "Applies the vertex normal before painting");
- prop= RNA_def_property(srna, "spray", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_spray", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_SPRAY);
RNA_def_property_ui_text(prop, "Spray", "Keep applying paint effect while holding mouse");
}
@@ -349,7 +291,7 @@ static void rna_def_image_paint(BlenderRNA *brna)
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_XRAY);
RNA_def_property_ui_text(prop, "Occlude", "Only paint onto the faces directly under the brush (slower)");
- prop= RNA_def_property(srna, "use_backface_cull", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_backface_culling", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_BACKFACE);
RNA_def_property_ui_text(prop, "Cull", "Ignore faces pointing away from the view (faster)");
@@ -377,7 +319,7 @@ 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);
@@ -424,21 +366,21 @@ static void rna_def_particle_edit(BlenderRNA *brna)
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);
+ prop= RNA_def_property(srna, "select_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "selectmode");
RNA_def_property_enum_items(prop, select_mode_items);
RNA_def_property_ui_text(prop, "Selection Mode", "Particle select and display mode");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_ParticleEdit_update");
- prop= RNA_def_property(srna, "keep_lengths", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_preserve_length", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_KEEP_LENGTHS);
RNA_def_property_ui_text(prop, "Keep Lengths", "Keep path lengths constant");
- prop= RNA_def_property(srna, "keep_root", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_preserve_root", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_LOCK_FIRST);
RNA_def_property_ui_text(prop, "Keep Root", "Keep root keys unmodified");
- prop= RNA_def_property(srna, "emitter_deflect", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_emitter_deflect", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_DEFLECT_EMITTER);
RNA_def_property_ui_text(prop, "Deflect Emitter", "Keep paths from intersecting the emitter");
@@ -447,25 +389,25 @@ static void rna_def_particle_edit(BlenderRNA *brna)
RNA_def_property_ui_range(prop, 0.0f, 10.0f, 10, 3);
RNA_def_property_ui_text(prop, "Emitter Distance", "Distance to keep particles away from the emitter");
- prop= RNA_def_property(srna, "fade_time", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_fade_time", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_FADE_TIME);
RNA_def_property_ui_text(prop, "Fade Time", "Fade paths and keys further away from current frame");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_ParticleEdit_update");
- prop= RNA_def_property(srna, "auto_velocity", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_auto_velocity", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_AUTO_VELOCITY);
RNA_def_property_ui_text(prop, "Auto Velocity", "Calculate point velocities automatically");
- prop= RNA_def_property(srna, "draw_particles", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_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, "rna_ParticleEdit_redo");
- prop= RNA_def_property(srna, "add_interpolate", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_default_interpolate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_INTERPOLATE_ADDED);
RNA_def_property_ui_text(prop, "Interpolate", "Interpolate new particles from the existing ones");
- prop= RNA_def_property(srna, "add_keys", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "default_key_count", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "totaddkey");
RNA_def_property_range(prop, 2, INT_MAX);
RNA_def_property_ui_range(prop, 2, 20, 10, 3);
@@ -473,7 +415,7 @@ static void rna_def_particle_edit(BlenderRNA *brna)
prop= RNA_def_property(srna, "brush", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "ParticleBrush");
- RNA_def_property_pointer_funcs(prop, "rna_ParticleEdit_brush_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_ParticleEdit_brush_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Brush", "");
prop= RNA_def_property(srna, "draw_step", PROP_INT, PROP_NONE);
@@ -492,12 +434,12 @@ static void rna_def_particle_edit(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Type", "");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_ParticleEdit_redo");
- prop= RNA_def_property(srna, "editable", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_editable", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_ParticleEdit_editable_get", NULL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Editable", "A valid edit mode exists");
- prop= RNA_def_property(srna, "hair", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_hair", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_ParticleEdit_hair_get", NULL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Hair", "Editing hair");
@@ -550,7 +492,7 @@ static void rna_def_particle_edit(BlenderRNA *brna)
/* dummy */
prop= RNA_def_property(srna, "curve", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "CurveMapping");
- RNA_def_property_pointer_funcs(prop, "rna_ParticleBrush_curve_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_ParticleBrush_curve_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Curve", "");
}
diff --git a/source/blender/makesrna/intern/rna_sensor.c b/source/blender/makesrna/intern/rna_sensor.c
index 533aab1a317..d20e5aebcfb 100644
--- a/source/blender/makesrna/intern/rna_sensor.c
+++ b/source/blender/makesrna/intern/rna_sensor.c
@@ -25,13 +25,39 @@
#include <stdlib.h>
#include "RNA_define.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;
@@ -72,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");
@@ -104,31 +251,60 @@ 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, "pin", 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, "show_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);
+ prop= RNA_def_property(srna, "use_level", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "level", 1);
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);
+ prop= RNA_def_property(srna, "use_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);
+ prop= RNA_def_property(srna, "use_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, "use_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)
@@ -150,16 +326,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)
@@ -186,6 +365,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)
@@ -201,7 +381,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, NULL);
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
}
static void rna_def_keyboard_sensor(BlenderRNA *brna)
@@ -213,34 +396,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_1", 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, "modifier_key_2", 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);
+ prop= RNA_def_property(srna, "use_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)
@@ -263,22 +453,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);
+ prop= RNA_def_property(srna, "value_min", 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);
+ prop= RNA_def_property(srna, "value_max", 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)
@@ -297,22 +492,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)
@@ -328,6 +527,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)
@@ -342,48 +542,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);
+ prop= RNA_def_property(srna, "use_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, "use_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, "use_material", 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)
@@ -406,19 +615,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)
@@ -433,6 +646,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)
@@ -447,24 +661,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);
@@ -472,23 +696,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);
+ prop= RNA_def_property(srna, "use_x_ray", 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)
@@ -502,6 +724,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)
@@ -513,6 +736,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[] ={
@@ -522,56 +746,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);
+ prop= RNA_def_property(srna, "use_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 <stdlib.h>
+#include <stdio.h>
+
+#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 be6bb1f00b8..d3207f14e24 100644
--- a/source/blender/makesrna/intern/rna_sequencer.c
+++ b/source/blender/makesrna/intern/rna_sequencer.c
@@ -30,19 +30,32 @@
#include "rna_internal.h"
+#include "DNA_anim_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_sequence_types.h"
#include "BKE_animsys.h"
+#include "BKE_global.h"
#include "BKE_sequencer.h"
#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)
{
@@ -130,7 +143,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(G.main, 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(G.main, 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;
@@ -139,7 +174,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);
@@ -219,6 +254,70 @@ static void rna_Sequence_use_crop_set(PointerRNA *ptr, int value)
seq->flag ^= SEQ_USE_CROP;
}
}
+
+static int transform_seq_cmp_cb(Sequence *seq, void *arg_pt)
+{
+ struct { Sequence *seq; void *transform; } *data= arg_pt;
+
+ if(seq->strip && seq->strip->transform == data->transform) {
+ data->seq= seq;
+ return -1; /* done so bail out */
+ }
+ return 1;
+}
+
+static char *rna_SequenceTransform_path(PointerRNA *ptr)
+{
+ Scene *scene= ptr->id.data;
+ Editing *ed= seq_give_editing(scene, FALSE);
+ Sequence *seq;
+
+ struct { Sequence *seq; void *transform; } data;
+ data.seq= NULL;
+ data.transform= ptr->data;
+
+ /* irritating we need to search for our sequence! */
+ seqbase_recursive_apply(&ed->seqbase, transform_seq_cmp_cb, &data);
+ seq= data.seq;
+
+ if (seq && seq->name+2)
+ return BLI_sprintfN("sequence_editor.sequences_all[\"%s\"].transform", seq->name+2);
+ else
+ return BLI_strdup("");
+}
+
+static int crop_seq_cmp_cb(Sequence *seq, void *arg_pt)
+{
+ struct { Sequence *seq; void *crop; } *data= arg_pt;
+
+ if(seq->strip && seq->strip->crop == data->crop) {
+ data->seq= seq;
+ return -1; /* done so bail out */
+ }
+ return 1;
+}
+
+static char *rna_SequenceCrop_path(PointerRNA *ptr)
+{
+ Scene *scene= ptr->id.data;
+ Editing *ed= seq_give_editing(scene, FALSE);
+ Sequence *seq;
+
+ struct { Sequence *seq; void *crop; } data;
+ data.seq= NULL;
+ data.crop= ptr->data;
+
+ /* irritating we need to search for our sequence! */
+ seqbase_recursive_apply(&ed->seqbase, crop_seq_cmp_cb, &data);
+ seq= data.seq;
+
+ if (seq && seq->name+2)
+ return BLI_sprintfN("sequence_editor.sequences_all[\"%s\"].crop", seq->name+2);
+ else
+ return BLI_strdup("");
+}
+
+
/* name functions that ignore the first two characters */
static void rna_Sequence_name_get(PointerRNA *ptr, char *value)
{
@@ -237,6 +336,7 @@ static void rna_Sequence_name_set(PointerRNA *ptr, const char *value)
Scene *scene= (Scene*)ptr->id.data;
Sequence *seq= (Sequence*)ptr->data;
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);
@@ -248,7 +348,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)
@@ -275,6 +380,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:
@@ -313,11 +420,22 @@ 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];
+ 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));
@@ -341,6 +459,49 @@ static int rna_Sequence_filepath_length(PointerRNA *ptr)
return strlen(path)+1;
}
+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);
@@ -364,7 +525,17 @@ static void rna_Sequence_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Editing *ed= seq_give_editing(scene, FALSE);
- free_imbuf_seq(scene, &ed->seqbase, FALSE);
+ free_imbuf_seq(scene, &ed->seqbase, FALSE, TRUE);
+
+ if(RNA_struct_is_a(ptr->type, &RNA_SoundSequence))
+ seq_update_sound(scene, ptr->data);
+}
+
+static void rna_Sequence_update_reopen_files(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Editing *ed= seq_give_editing(scene, FALSE);
+
+ free_imbuf_seq(scene, &ed->seqbase, FALSE, FALSE);
if(RNA_struct_is_a(ptr->type, &RNA_SoundSequence))
seq_update_sound(scene, ptr->data);
@@ -378,6 +549,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(G.main, 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;
@@ -386,6 +565,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)
@@ -399,9 +658,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");
}
@@ -414,25 +671,31 @@ static void rna_def_strip_crop(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Sequence Crop", "Cropping parameters for a sequence strip");
RNA_def_struct_sdna(srna, "StripCrop");
- prop= RNA_def_property(srna, "top", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "max_y", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "top");
RNA_def_property_ui_text(prop, "Top", "");
RNA_def_property_ui_range(prop, 0, 4096, 1, 0);
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "bottom", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "min_x", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "bottom");
RNA_def_property_ui_text(prop, "Bottom", "");
RNA_def_property_ui_range(prop, 0, 4096, 1, 0);
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "left", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "min_y", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "left");
RNA_def_property_ui_text(prop, "Left", "");
RNA_def_property_ui_range(prop, 0, 4096, 1, 0);
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "right", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "max_x", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "right");
RNA_def_property_ui_text(prop, "Right", "");
RNA_def_property_ui_range(prop, 0, 4096, 1, 0);
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
+
+ RNA_def_struct_path_func(srna, "rna_SequenceCrop_path");
}
static void rna_def_strip_transform(BlenderRNA *brna)
@@ -455,6 +718,9 @@ static void rna_def_strip_transform(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Offset Y", "");
RNA_def_property_ui_range(prop, -4096, 4096, 1, 0);
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
+
+ RNA_def_struct_path_func(srna, "rna_SequenceTransform_path");
+
}
static void rna_def_strip_proxy(BlenderRNA *brna)
@@ -468,12 +734,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");
}
@@ -488,31 +755,36 @@ 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);
+ prop= RNA_def_property(srna, "invert_gain", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_COLOR_BALANCE_INVERSE_GAIN);
RNA_def_property_ui_text(prop, "Inverse Gain", "");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "inverse_gamma", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_gamma", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_COLOR_BALANCE_INVERSE_GAMMA);
RNA_def_property_ui_text(prop, "Inverse Gamma", "");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "inverse_lift", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_lift", PROP_BOOLEAN, PROP_NONE);
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);
@@ -529,7 +801,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", ""},
@@ -551,6 +822,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[]= {
@@ -584,35 +856,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);
+ prop= RNA_def_property(srna, "select", 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_ui_text(prop, "Select", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER|NA_SELECTED, NULL);
- prop= RNA_def_property(srna, "left_handle_selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select_left_handle", 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);
+ prop= RNA_def_property(srna, "select_right_handle", 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");
@@ -620,13 +887,18 @@ 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_duration", 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_duration", 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, "frame_start", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "start");
@@ -638,7 +910,7 @@ static void rna_def_sequence(BlenderRNA *brna)
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");
@@ -658,7 +930,7 @@ static void rna_def_sequence(BlenderRNA *brna)
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, "frame_still_start", PROP_INT, PROP_TIME);
@@ -684,12 +956,13 @@ static void rna_def_sequence(BlenderRNA *brna)
/* blending */
- prop= RNA_def_property(srna, "blend_mode", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "blend_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "blend_mode");
RNA_def_property_enum_items(prop, blend_mode_items);
RNA_def_property_ui_text(prop, "Blend Mode", "");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "blend_opacity", PROP_FLOAT, PROP_FACTOR);
+ prop= RNA_def_property(srna, "blend_alpha", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Blend Opacity", "");
RNA_def_property_float_funcs(prop, "rna_Sequence_opacity_get", "rna_Sequence_opacity_set", NULL); // stupid 0-100 -> 0-1
@@ -701,9 +974,9 @@ static void rna_def_sequence(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Effect fader position", "");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "use_effect_default_fade", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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");
@@ -712,12 +985,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)
@@ -749,6 +1017,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");
}
@@ -756,41 +1042,49 @@ static void rna_def_filter_video(StructRNA *srna)
{
PropertyRNA *prop;
- prop= RNA_def_property(srna, "de_interlace", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_deinterlace", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_FILTERY);
RNA_def_property_ui_text(prop, "De-Interlace", "For video movies to remove fields");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update_reopen_files");
- prop= RNA_def_property(srna, "premultiply", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_premultiply", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_MAKE_PREMUL);
RNA_def_property_ui_text(prop, "Premultiply", "Convert RGB from key alpha to premultiplied alpha");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
- prop= RNA_def_property(srna, "flip_x", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_flip_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_FLIPX);
RNA_def_property_ui_text(prop, "Flip X", "Flip on the X axis");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "flip_y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_flip_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_FLIPY);
RNA_def_property_ui_text(prop, "Flip Y", "Flip on the Y axis");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "convert_float", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_float", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_MAKE_FLOAT);
RNA_def_property_ui_text(prop, "Convert Float", "Convert input to float data");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "reverse_frames", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_reverse_frames", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_REVERSE_FRAMES);
RNA_def_property_ui_text(prop, "Flip Time", "Reverse frame order");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "multiply_colors", PROP_FLOAT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "color_multiply", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_float_sdna(prop, NULL, "mul");
RNA_def_property_range(prop, 0.0f, 20.0f);
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");
@@ -840,25 +1134,33 @@ static void rna_def_proxy(StructRNA *srna)
RNA_def_property_pointer_sdna(prop, NULL, "strip->proxy");
RNA_def_property_ui_text(prop, "Proxy", "");
- prop= RNA_def_property(srna, "proxy_custom_directory", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_proxy_custom_directory", PROP_BOOLEAN, PROP_NONE);
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, "use_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)
{
PropertyRNA *prop;
- prop= RNA_def_property(srna, "animation_start_offset", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "animation_offset_start", 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);
+ prop= RNA_def_property(srna, "animation_offset_end", 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");
}
@@ -922,6 +1224,7 @@ static void rna_def_scene(BlenderRNA *brna)
prop= RNA_def_property(srna, "scene_camera", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_Camera_object_poll");
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");
@@ -949,7 +1252,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);
@@ -972,15 +1275,22 @@ 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",
"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_input(srna);
}
@@ -993,7 +1303,28 @@ 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)
@@ -1091,7 +1422,7 @@ static void rna_def_glow(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Boost Factor", "Brightness multiplier");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "blur_distance", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "blur_radius", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "dDist");
RNA_def_property_range(prop, 0.5f, 20.0f);
RNA_def_property_ui_text(prop, "Blur Distance", "Radius of glow effect");
@@ -1103,7 +1434,7 @@ static void rna_def_glow(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Quality", "Accuracy of the blur effect");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "only_boost", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_only_boost", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "bNoComp", 0);
RNA_def_property_ui_text(prop, "Only Boost", "Show the glow buffer only");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
@@ -1143,7 +1474,7 @@ static void rna_def_transform(BlenderRNA *brna)
RNA_def_property_ui_range(prop, 0, 10, 3, 10);
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "uniform_scale", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_uniform_scale", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uniform_scale", 0);
RNA_def_property_ui_text(prop, "Uniform Scale", "Scale uniformly, preserving aspect ratio");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
@@ -1186,7 +1517,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);
@@ -1211,17 +1542,17 @@ static void rna_def_speed_control(BlenderRNA *brna)
RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 0);
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "curve_velocity", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_curve_velocity", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", SEQ_SPEED_INTEGRATE);
RNA_def_property_ui_text(prop, "F-Curve Velocity", "Interpret the F-Curve value as a velocity instead of a frame number");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "frame_blending", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_frame_blend", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", SEQ_SPEED_BLEND);
RNA_def_property_ui_text(prop, "Frame Blending", "Blend two frames into the target for a smoother result");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "curve_compress_y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_curve_compress_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", SEQ_SPEED_COMPRESS_IPO_Y);
RNA_def_property_ui_text(prop, "F-Curve Compress Y", "Scale F-Curve value to get the target frame number, F-Curve value runs from 0.0 to 1.0");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
@@ -1244,6 +1575,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 <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#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 970abf92b08..53f27bc06fb 100644
--- a/source/blender/makesrna/intern/rna_smoke.c
+++ b/source/blender/makesrna/intern/rna_smoke.c
@@ -55,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(bmain, scene);
}
static void rna_Smoke_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -120,12 +120,18 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
{SM_CACHE_HEAVY, "CACHEHEAVY", 0, "Heavy", "Effective but slow compression"},
{0, NULL, 0, NULL, NULL}};
+ static EnumPropertyItem smoke_domain_colli_items[] = {
+ {SM_BORDER_OPEN, "BORDEROPEN", 0, "Open", "Smoke doesn't collide with any border"},
+ {SM_BORDER_VERTICAL, "BORDERVERTICAL", 0, "Vertically Open", "Smoke doesn't collide with top and bottom sides"},
+ {SM_BORDER_CLOSED, "BORDERCLOSED", 0, "Collide All", "Smoke collides with every side"},
+ {0, NULL, 0, NULL, NULL}};
+
srna = RNA_def_struct(brna, "SmokeDomainSettings", NULL);
RNA_def_struct_ui_text(srna, "Domain Settings", "Smoke domain settings");
RNA_def_struct_sdna(srna, "SmokeDomainSettings");
RNA_def_struct_path_func(srna, "rna_SmokeDomainSettings_path");
- prop= RNA_def_property(srna, "maxres", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "resolution_max", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "maxres");
RNA_def_property_range(prop, 24, 512);
RNA_def_property_ui_range(prop, 24, 512, 2, 0);
@@ -139,12 +145,12 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Amplification", "Enhance the resolution of smoke by this factor using noise");
RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
- prop= RNA_def_property(srna, "highres", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_high_resolution", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_HIGHRES);
RNA_def_property_ui_text(prop, "High res", "Enable high resolution (using amplification)");
RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
- prop= RNA_def_property(srna, "viewhighres", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_high_resolution", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "viewsettings", MOD_SMOKE_VIEW_SHOWBIG);
RNA_def_property_ui_text(prop, "Show High Resolution", "Show high resolution (using amplification)");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
@@ -169,7 +175,7 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Heat", "Higher value results in faster rising smoke");
RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
- prop= RNA_def_property(srna, "coll_group", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "collision_group", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "coll_group");
RNA_def_property_struct_type(prop, "Group");
RNA_def_property_flag(prop, PROP_EDITABLE);
@@ -183,7 +189,7 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Fluid Group", "Limit fluid objects to this group");
RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset_dependancy");
- prop= RNA_def_property(srna, "eff_group", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "effector_group", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "eff_group");
RNA_def_property_struct_type(prop, "Group");
RNA_def_property_flag(prop, PROP_EDITABLE);
@@ -192,29 +198,24 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "strength");
- RNA_def_property_range(prop, 1.0, 10.0);
- RNA_def_property_ui_range(prop, 1.0, 10.0, 1, 2);
+ RNA_def_property_range(prop, 0.0, 10.0);
+ RNA_def_property_ui_range(prop, 0.0, 10.0, 1, 2);
RNA_def_property_ui_text(prop, "Strength", "Strength of wavelet noise");
RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
prop= RNA_def_property(srna, "dissolve_speed", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "diss_speed");
- RNA_def_property_range(prop, 1.0, 100.0);
- RNA_def_property_ui_range(prop, 1.0, 1000.0, 1, 0);
+ RNA_def_property_range(prop, 1.0, 10000.0);
+ RNA_def_property_ui_range(prop, 1.0, 10000.0, 1, 0);
RNA_def_property_ui_text(prop, "Dissolve Speed", "Dissolve Speed");
RNA_def_property_update(prop, 0, NULL);
- prop= RNA_def_property(srna, "initial_velocity", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_INITVELOCITY);
- RNA_def_property_ui_text(prop, "Initial Velocity", "Smoke inherits it's velocity from the emitter particle");
- RNA_def_property_update(prop, 0, NULL);
-
- prop= RNA_def_property(srna, "dissolve_smoke", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_dissolve_smoke", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_DISSOLVE);
RNA_def_property_ui_text(prop, "Dissolve Smoke", "Enable smoke to disappear over time");
RNA_def_property_update(prop, 0, NULL);
- prop= RNA_def_property(srna, "dissolve_smoke_log", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_dissolve_smoke_log", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_DISSOLVE_LOG);
RNA_def_property_ui_text(prop, "Logarithmic dissolve", "Using 1/x ");
RNA_def_property_update(prop, 0, NULL);
@@ -229,24 +230,48 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
RNA_def_property_pointer_sdna(prop, NULL, "point_cache[1]");
RNA_def_property_ui_text(prop, "Point Cache", "");
- prop= RNA_def_property(srna, "smoke_cache_comp", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "point_cache_compress_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "cache_comp");
RNA_def_property_enum_items(prop, smoke_cache_comp_items);
RNA_def_property_ui_text(prop, "Cache Compression", "Compression method to be used");
RNA_def_property_update(prop, 0, NULL);
- prop= RNA_def_property(srna, "smoke_cache_high_comp", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "point_cache_compress_high_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "cache_high_comp");
RNA_def_property_enum_items(prop, smoke_cache_comp_items);
RNA_def_property_ui_text(prop, "Cache Compression", "Compression method to be used");
RNA_def_property_update(prop, 0, NULL);
+ prop= RNA_def_property(srna, "collision_extents", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "border_collisions");
+ RNA_def_property_enum_items(prop, smoke_domain_colli_items);
+ RNA_def_property_ui_text(prop, "Border Collisions", "Selects which domain border will be treated as collision object.");
+ RNA_def_property_update(prop, 0, NULL);
prop= RNA_def_property(srna, "effector_weights", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "EffectorWeights");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Effector Weights", "");
+ prop= RNA_def_property(srna, "smooth_emitter", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_HIGH_SMOOTH);
+ RNA_def_property_ui_text(prop, "Smooth Emitter", "Smoothens emitted smoke to avoid blockiness.");
+ RNA_def_property_update(prop, 0, NULL);
+
+ prop= RNA_def_property(srna, "time_scale", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "time_scale");
+ RNA_def_property_range(prop, 0.2, 1.5);
+ RNA_def_property_ui_range(prop, 0.2, 1.5, 0.02, 5);
+ RNA_def_property_ui_text(prop, "Time Scale", "Adjust simulation speed.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
+
+ prop= RNA_def_property(srna, "vorticity", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "vorticity");
+ RNA_def_property_range(prop, 0.01, 4.0);
+ RNA_def_property_ui_range(prop, 0.01, 4.0, 0.02, 5);
+ RNA_def_property_ui_text(prop, "Vorticity", "Amount of turbulence/rotation in fluid.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
+
}
static void rna_def_smoke_flow_settings(BlenderRNA *brna)
@@ -270,20 +295,37 @@ 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);
+ prop= RNA_def_property(srna, "particle_system", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "psys");
RNA_def_property_struct_type(prop, "ParticleSystem");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Particle Systems", "Particle systems emitted from the object");
RNA_def_property_update(prop, 0, "rna_Smoke_reset_dependancy");
- prop= RNA_def_property(srna, "outflow", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_outflow", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "type", MOD_SMOKE_FLOW_TYPE_OUTFLOW);
RNA_def_property_ui_text(prop, "Outflow", "Deletes smoke from simulation");
RNA_def_property_update(prop, 0, NULL);
+
+ prop= RNA_def_property(srna, "use_absolute", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_FLOW_ABSOLUTE);
+ RNA_def_property_ui_text(prop, "Absolute Density", "Only allows given density value in emitter area.");
+ RNA_def_property_update(prop, 0, NULL);
+
+ prop= RNA_def_property(srna, "initial_velocity", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_FLOW_INITVELOCITY);
+ RNA_def_property_ui_text(prop, "Initial Velocity", "Smoke inherits it's velocity from the emitter particle");
+ RNA_def_property_update(prop, 0, NULL);
+
+ prop= RNA_def_property(srna, "velocity_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "vel_multi");
+ RNA_def_property_range(prop, -2.0, 2.0);
+ RNA_def_property_ui_range(prop, -2.0, 2.0, 0.05, 5);
+ RNA_def_property_ui_text(prop, "Multiplier", "Multiplier to adjust velocity passed to smoke");
+ RNA_def_property_update(prop, 0, NULL);
}
static void rna_def_smoke_coll_settings(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_sound.c b/source/blender/makesrna/intern/rna_sound.c
index 3ff81df02f8..674fbbad9c6 100644
--- a/source/blender/makesrna/intern/rna_sound.c
+++ b/source/blender/makesrna/intern/rna_sound.c
@@ -36,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);
}
@@ -70,19 +70,19 @@ 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");
RNA_def_property_ui_text(prop, "Packed File", "");
- prop= RNA_def_property(srna, "caching", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_memory_cache", 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 8b3a54af4c2..214ef891724 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -89,7 +89,7 @@ EnumPropertyItem autosnap_items[] = {
{SACTSNAP_MARKER, "MARKER", 0, "Nearest Marker", "Snap to nearest marker"},
{0, NULL, 0, NULL, NULL}};
-EnumPropertyItem viewport_shading_items[] = {
+EnumPropertyItem viewport_shade_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"},
@@ -125,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:
@@ -227,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 */
@@ -256,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;
@@ -299,36 +299,46 @@ static void rna_View3D_CursorLocation_set(PointerRNA *ptr, const float *values)
copy_v3_v3(cursor, values);
}
-static void rna_Space3DView_layer_set(PointerRNA *ptr, const int *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)
{
View3D *v3d= (View3D*)(ptr->data);
ScrArea *sa= rna_area_from_space(ptr);
- ListBase *regionbase= (sa->spacedata.first == v3d)? &sa->regionbase: &v3d->regionbase;
- ARegion *ar= regionbase->last; /* always last in list, weak .. */
+ void *regiondata= NULL;
+ if(sa) {
+ ListBase *regionbase= (sa->spacedata.first == v3d)? &sa->regionbase: &v3d->regionbase;
+ ARegion *ar= regionbase->last; /* always last in list, weak .. */
+ regiondata= ar->regiondata;
+ }
- return rna_pointer_inherit_refine(ptr, &RNA_Region3DView, ar->regiondata);
+ return rna_pointer_inherit_refine(ptr, &RNA_RegionView3D, regiondata);
}
static PointerRNA rna_SpaceView3D_region_quadview_get(PointerRNA *ptr)
{
View3D *v3d= (View3D*)(ptr->data);
ScrArea *sa= rna_area_from_space(ptr);
- ListBase *regionbase= (sa->spacedata.first == v3d)? &sa->regionbase: &v3d->regionbase;
- ARegion *ar= regionbase->last; /* always before last in list, weak .. */
-
- ar= (ar->alignment == RGN_ALIGN_QSPLIT)? ar->prev: NULL;
+ void *regiondata= NULL;
+ if(sa) {
+ ListBase *regionbase= (sa->spacedata.first == v3d)? &sa->regionbase: &v3d->regionbase;
+ ARegion *ar= regionbase->last; /* always before last in list, weak .. */
+
+ ar= (ar->alignment == RGN_ALIGN_QSPLIT)? ar->prev: NULL;
+ if(ar) {
+ regiondata= ar->regiondata;
+ }
+ }
- return rna_pointer_inherit_refine(ptr, &RNA_Region3DView, (ar)? ar->regiondata: NULL);
+ return rna_pointer_inherit_refine(ptr, &RNA_RegionView3D, regiondata);
}
-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;
@@ -338,6 +348,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)
@@ -458,7 +480,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;
@@ -466,13 +488,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)
@@ -493,6 +514,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);
@@ -503,6 +531,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);
@@ -512,31 +567,30 @@ static void rna_SpaceProperties_align_set(PointerRNA *ptr, int value)
}
/* Space Console */
-static void rna_ConsoleLine_line_get(PointerRNA *ptr, char *value)
+static void rna_ConsoleLine_body_get(PointerRNA *ptr, char *value)
{
ConsoleLine *ci= (ConsoleLine*)ptr->data;
strcpy(value, ci->line);
}
-static int rna_ConsoleLine_line_length(PointerRNA *ptr)
+static int rna_ConsoleLine_body_length(PointerRNA *ptr)
{
ConsoleLine *ci= (ConsoleLine*)ptr->data;
return ci->len;
}
-static void rna_ConsoleLine_line_set(PointerRNA *ptr, const char *value)
+static void rna_ConsoleLine_body_set(PointerRNA *ptr, const char *value)
{
ConsoleLine *ci= (ConsoleLine*)ptr->data;
int len= strlen(value);
- if(len < ci->len_alloc) { /* allocated size is enough? */
- strcpy(ci->line, value);
- }
- else { /* allocate a new strnig */
+ if((len >= ci->len_alloc) || (len * 2 < ci->len_alloc) ) { /* allocate a new strnig */
MEM_freeN(ci->line);
- ci->line= BLI_strdup(value);
- ci->len_alloc= len;
+ ci->line= MEM_mallocN((len + 1) * sizeof(char), "rna_consoleline");
+ ci->len_alloc= len + 1;
}
+
+ memcpy(ci->line, value, len + 1);
ci->len= len;
if(ci->cursor > len) /* clamp the cursor */
@@ -558,7 +612,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 */
@@ -680,7 +734,7 @@ static void rna_def_space_image_uv(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Space UV Editor", "UV editor data for the image editor space");
/* selection */
- prop= RNA_def_property(srna, "sticky_selection_mode", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "sticky_select_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "sticky");
RNA_def_property_enum_items(prop, sticky_mode_items);
RNA_def_property_ui_text(prop, "Sticky Selection Mode", "Automatically select also UVs sharing the same vertex as the ones being selected");
@@ -693,12 +747,12 @@ static void rna_def_space_image_uv(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Edge Draw Type", "Draw type for drawing UV edges");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
- prop= RNA_def_property(srna, "draw_smooth_edges", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_smooth_edges", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_SMOOTH_UV);
RNA_def_property_ui_text(prop, "Draw Smooth Edges", "Draw UV edges anti-aliased");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
- prop= RNA_def_property(srna, "draw_stretch", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_stretch", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAW_STRETCH);
RNA_def_property_ui_text(prop, "Draw Stretch", "Draw faces colored according to the difference in shape between UVs and their 3D coordinates (blue for low distortion, red for high distortion)");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
@@ -709,17 +763,17 @@ static void rna_def_space_image_uv(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Draw Stretch Type", "Type of stretch to draw");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
- prop= RNA_def_property(srna, "draw_modified_edges", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_modified_edges", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAWSHADOW);
RNA_def_property_ui_text(prop, "Draw Modified Edges", "Draw edges after modifiers are applied");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
- prop= RNA_def_property(srna, "draw_other_objects", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_other_objects", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAW_OTHER);
RNA_def_property_ui_text(prop, "Draw Other Objects", "Draw other selected objects that share the same image");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
- prop= RNA_def_property(srna, "normalized_coordinates", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_normalized_coords", PROP_BOOLEAN, PROP_NONE);
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);
@@ -732,22 +786,22 @@ static void rna_def_space_image_uv(BlenderRNA *brna)
/* todo: move edge and face drawing options here from G.f */
- prop= RNA_def_property(srna, "snap_to_pixels", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_snap_to_pixels", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_PIXELSNAP);
RNA_def_property_ui_text(prop, "Snap to Pixels", "Snap UVs to pixel locations while editing");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
- prop= RNA_def_property(srna, "constrain_to_image_bounds", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "lock_bounds", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_CLIP_UV);
RNA_def_property_ui_text(prop, "Constrain to Image Bounds", "Constraint to stay within the image bounds while editing");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
- prop= RNA_def_property(srna, "live_unwrap", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_live_unwrap", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_LIVE_UNWRAP);
RNA_def_property_ui_text(prop, "Live Unwrap", "Continuously unwrap the selected UV island while transforming pinned vertices");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
- prop= RNA_def_property(srna, "pivot", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "pivot_point", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "around");
RNA_def_property_enum_items(prop, pivot_items);
RNA_def_property_ui_text(prop, "Pivot", "Rotation/Scaling Pivot");
@@ -760,20 +814,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");
@@ -783,12 +837,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, "show_restriction_columns", PROP_BOOLEAN, PROP_NONE);
+
+ prop= RNA_def_property(srna, "filter_text", 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, "use_filter_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, "use_filter_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_restrict_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)
@@ -866,7 +934,7 @@ 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;
@@ -879,8 +947,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");
@@ -901,9 +975,9 @@ static void rna_def_space_3dview(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Lock Bone", "3D View center is locked to this bone's position");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "viewport_shading", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "viewport_shade", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "drawtype");
- RNA_def_property_enum_items(prop, viewport_shading_items);
+ RNA_def_property_enum_items(prop, viewport_shade_items);
RNA_def_property_ui_text(prop, "Viewport Shading", "Method to display/shade objects in the 3D View");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
@@ -911,7 +985,7 @@ static void rna_def_space_3dview(BlenderRNA *brna)
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|PROP_UNIT_LENGTH);
+ 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)");
@@ -954,52 +1028,52 @@ static void rna_def_space_3dview(BlenderRNA *brna)
RNA_def_property_range(prop, 1, 1024);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "display_floor", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_floor", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gridflag", V3D_SHOW_FLOOR);
RNA_def_property_ui_text(prop, "Display Grid Floor", "Show the ground plane grid in perspective view");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "display_x_axis", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_axis_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gridflag", V3D_SHOW_X);
RNA_def_property_ui_text(prop, "Display X Axis", "Show the X axis line in perspective view");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "display_y_axis", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_axis_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gridflag", V3D_SHOW_Y);
RNA_def_property_ui_text(prop, "Display Y Axis", "Show the Y axis line in perspective view");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "display_z_axis", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_axis_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gridflag", V3D_SHOW_Z);
RNA_def_property_ui_text(prop, "Display Z Axis", "Show the Z axis line in perspective view");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "outline_selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_outline_selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SELECT_OUTLINE);
RNA_def_property_ui_text(prop, "Outline Selected", "Show an outline highlight around selected objects in non-wireframe views");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "all_object_origins", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_all_objects_origin", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_DRAW_CENTERS);
RNA_def_property_ui_text(prop, "All Object Origins", "Show the object origin center dot for all (selected and unselected) objects");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "relationship_lines", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_relationship_lines", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", V3D_HIDE_HELPLINES);
RNA_def_property_ui_text(prop, "Relationship Lines", "Show dashed lines indicating parent or constraint relationships");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "textured_solid", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_textured_solid", PROP_BOOLEAN, PROP_NONE);
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);
+ prop= RNA_def_property(srna, "show_only_render", 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);
+ prop= RNA_def_property(srna, "use_occlude_geometry", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_ZBUF_SELECT);
RNA_def_property_ui_text(prop, "Occlude Geometry", "Limit selection to visible (clipped with depth buffer)");
RNA_def_property_ui_icon(prop, ICON_ORTHO, 0);
@@ -1011,7 +1085,7 @@ static void rna_def_space_3dview(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Background Images", "List of background images");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "display_background_images", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_background_images", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_DISPBGPICS);
RNA_def_property_ui_text(prop, "Display Background Images", "Display reference images behind objects in the 3D View");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
@@ -1022,31 +1096,31 @@ static void rna_def_space_3dview(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Pivot Point", "Pivot center for rotation/scaling");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "pivot_point_align", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_pivot_point_align", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_ALIGN);
RNA_def_property_ui_text(prop, "Align", "Manipulate object centers only");
RNA_def_property_ui_icon(prop, ICON_ALIGN, 0);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "manipulator", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_manipulator", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "twflag", V3D_USE_MANIPULATOR);
RNA_def_property_ui_text(prop, "Manipulator", "Use a 3D manipulator widget for controlling transforms");
RNA_def_property_ui_icon(prop, ICON_MANIPUL, 0);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "manipulator_translate", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_manipulator_translate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "twtype", V3D_MANIP_TRANSLATE);
RNA_def_property_ui_text(prop, "Manipulator Translate", "Use the manipulator for movement transformations");
RNA_def_property_ui_icon(prop, ICON_MAN_TRANS, 0);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "manipulator_rotate", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_manipulator_rotate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "twtype", V3D_MANIP_ROTATE);
RNA_def_property_ui_text(prop, "Manipulator Rotate", "Use the manipulator for rotation transformations");
RNA_def_property_ui_icon(prop, ICON_MAN_ROT, 0);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "manipulator_scale", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_manipulator_scale", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "twtype", V3D_MANIP_SCALE);
RNA_def_property_ui_text(prop, "Manipulator Scale", "Use the manipulator for scale transformations");
RNA_def_property_ui_icon(prop, ICON_MAN_SCALE, 0);
@@ -1061,59 +1135,59 @@ static void rna_def_space_3dview(BlenderRNA *brna)
prop= RNA_def_property(srna, "current_orientation", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "TransformOrientation");
- RNA_def_property_pointer_funcs(prop, "rna_CurrentOrientation_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_CurrentOrientation_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Current Transform Orientation", "Current Transformation orientation");
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);
- prop= RNA_def_property(srna, "used_layers", PROP_BOOLEAN, PROP_LAYER_MEMBER);
+ prop= RNA_def_property(srna, "layers_used", PROP_BOOLEAN, PROP_LAYER_MEMBER);
RNA_def_property_boolean_sdna(prop, NULL, "lay_used", 1);
RNA_def_property_array(prop, 20);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
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_pointer_funcs(prop, "rna_SpaceView3D_region_3d_get", NULL, NULL);
+ RNA_def_property_struct_type(prop, "RegionView3D");
+ RNA_def_property_pointer_funcs(prop, "rna_SpaceView3D_region_3d_get", NULL, 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_pointer_funcs(prop, "rna_SpaceView3D_region_quadview_get", NULL, NULL);
+ RNA_def_property_struct_type(prop, "RegionView3D");
+ RNA_def_property_pointer_funcs(prop, "rna_SpaceView3D_region_quadview_get", NULL, 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);
+ prop= RNA_def_property(srna, "show_sync_view", 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);
+ prop= RNA_def_property(srna, "use_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");
@@ -1126,6 +1200,34 @@ static void rna_def_space_3dview(BlenderRNA *brna)
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_rotate_method", 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)
@@ -1171,7 +1273,7 @@ static void rna_def_space_buttons(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Align", "Arrangement of the panels");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_PROPERTIES, NULL);
- prop= RNA_def_property(srna, "brush_texture", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_brush_texture", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SB_BRUSH_TEX);
RNA_def_property_ui_text(prop, "Brush Texture", "Show brush textures");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_PROPERTIES, NULL);
@@ -1180,9 +1282,10 @@ 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", NULL);
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);
@@ -1200,7 +1303,7 @@ static void rna_def_space_image(BlenderRNA *brna)
/* image */
prop= RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);
- RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceImageEditor_image_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceImageEditor_image_set", NULL, NULL);
RNA_def_property_ui_text(prop, "Image", "Image displayed and edited in this space");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
@@ -1215,14 +1318,14 @@ 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, "image_pin", PROP_BOOLEAN, PROP_NONE);
+ 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, "use_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);
@@ -1234,7 +1337,7 @@ static void rna_def_space_image(BlenderRNA *brna)
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);
+ prop= RNA_def_property(srna, "show_repeat", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAW_TILE);
RNA_def_property_ui_text(prop, "Draw Repeated", "Draw the image repeated outside of the main view");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
@@ -1250,11 +1353,11 @@ static void rna_def_space_image(BlenderRNA *brna)
prop= RNA_def_property(srna, "uv_editor", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "SpaceUVEditor");
- RNA_def_property_pointer_funcs(prop, "rna_SpaceImageEditor_uvedit_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_SpaceImageEditor_uvedit_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "UV Editor", "UV editor settings");
/* paint */
- prop= RNA_def_property(srna, "image_painting", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_image_paint", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAWTOOL);
RNA_def_property_ui_text(prop, "Image Painting", "Enable image painting mode");
RNA_def_property_ui_icon(prop, ICON_TPAINT_HLT, 0);
@@ -1272,7 +1375,7 @@ static void rna_def_space_image(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Use Grease Pencil", "Display and edit the grease pencil freehand annotations overlay");
/* update */
- prop= RNA_def_property(srna, "update_automatically", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_realtime_update", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "lock", 0);
RNA_def_property_ui_text(prop, "Update Automatically", "Update other affected window spaces automatically to reflect changes during interactive operations such as transform");
@@ -1290,7 +1393,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);
}
@@ -1303,7 +1406,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[] = {
@@ -1312,6 +1415,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");
@@ -1321,7 +1433,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");
@@ -1333,14 +1445,14 @@ static void rna_def_space_sequencer(BlenderRNA *brna)
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
/* flag's */
- prop= RNA_def_property(srna, "show_cframe_indicator", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_frame_indicator", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SEQ_NO_DRAW_CFRANUM);
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_SEQUENCER, NULL);
- prop= RNA_def_property(srna, "draw_frames", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_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, "use_marker_sync", PROP_BOOLEAN, PROP_NONE);
@@ -1348,12 +1460,12 @@ static void rna_def_space_sequencer(BlenderRNA *brna)
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);
+ prop= RNA_def_property(srna, "show_separate_color", 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);
+ prop= RNA_def_property(srna, "show_safe_margin", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_DRAW_SAFE_MARGINS);
RNA_def_property_ui_text(prop, "Safe Margin", "Draw title safe margins in preview");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
@@ -1373,7 +1485,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);
@@ -1382,6 +1494,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);
@@ -1413,42 +1531,39 @@ static void rna_def_space_text(BlenderRNA *brna)
prop= RNA_def_property(srna, "text", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Text", "Text displayed and edited in this space");
- RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceTextEditor_text_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceTextEditor_text_set", NULL, NULL);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
/* display */
- prop= RNA_def_property(srna, "syntax_highlight", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "showsyntax", 0);
- RNA_def_property_ui_text(prop, "Syntax Highlight", "Syntax highlight for scripting");
- RNA_def_property_ui_icon(prop, ICON_SYNTAX_OFF, 1);
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
-
- prop= RNA_def_property(srna, "word_wrap", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_word_wrap", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "wordwrap", 0);
RNA_def_property_boolean_funcs(prop, NULL, "rna_SpaceTextEditor_word_wrap_set");
RNA_def_property_ui_text(prop, "Word Wrap", "Wrap words if there is not enough horizontal space");
RNA_def_property_ui_icon(prop, ICON_WORDWRAP_OFF, 1);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
- prop= RNA_def_property(srna, "line_numbers", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_line_numbers", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "showlinenrs", 0);
RNA_def_property_ui_text(prop, "Line Numbers", "Show line numbers next to the text");
RNA_def_property_ui_icon(prop, ICON_LINENUMBERS_OFF, 1);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
- prop= RNA_def_property(srna, "overwrite", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_ui_text(prop, "Overwrite", "Overwrite characters when typing rather than inserting them");
+ prop= RNA_def_property(srna, "show_syntax_highlight", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "showsyntax", 0);
+ RNA_def_property_ui_text(prop, "Syntax Highlight", "Syntax highlight for scripting");
+ RNA_def_property_ui_icon(prop, ICON_SYNTAX_OFF, 1);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
- prop= RNA_def_property(srna, "live_edit", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_ui_text(prop, "Live Edit", "Run python while editing");
+ prop= RNA_def_property(srna, "show_line_highlight", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "line_hlight", 0);
+ RNA_def_property_ui_text(prop, "Highlight Line", "Highlight the current line");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
prop= RNA_def_property(srna, "tab_width", PROP_INT, PROP_NONE);
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");
@@ -1456,13 +1571,24 @@ static void rna_def_space_text(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Font Size", "Font size to use for displaying the text");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
+ /* functionality options */
+ prop= RNA_def_property(srna, "use_overwrite", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overwrite", 1);
+ RNA_def_property_ui_text(prop, "Overwrite", "Overwrite characters when typing rather than inserting them");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
+
+ prop= RNA_def_property(srna, "use_live_edit", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "live_edit", 1);
+ RNA_def_property_ui_text(prop, "Live Edit", "Run python while editing");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
+
/* find */
- prop= RNA_def_property(srna, "find_all", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_find_all", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", ST_FIND_ALL);
RNA_def_property_ui_text(prop, "Find All", "Search in all text datablocks, instead of only the active one");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
- prop= RNA_def_property(srna, "find_wrap", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_find_wrap", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", ST_FIND_WRAP);
RNA_def_property_ui_text(prop, "Find Wrap", "Search again from the start of the file when reaching the end");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
@@ -1486,8 +1612,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}};
@@ -1498,9 +1624,9 @@ static void rna_def_space_dopesheet(BlenderRNA *brna)
/* data */
prop= RNA_def_property(srna, "action", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceDopeSheetEditor_action_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceDopeSheetEditor_action_set", NULL, 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);
@@ -1516,7 +1642,7 @@ static void rna_def_space_dopesheet(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show Seconds", "Show timing in seconds not frames");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_DOPESHEET, NULL);
- prop= RNA_def_property(srna, "show_cframe_indicator", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_frame_indicator", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SACTION_NODRAWCFRANUM);
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_DOPESHEET, NULL);
@@ -1527,12 +1653,12 @@ static void rna_def_space_dopesheet(BlenderRNA *brna)
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_DOPESHEET, NULL);
/* editing */
- prop= RNA_def_property(srna, "automerge_keyframes", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_auto_merge_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);
+ prop= RNA_def_property(srna, "use_realtime_update", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SACTION_NOREALTIMEUPDATES);
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);
@@ -1548,7 +1674,7 @@ static void rna_def_space_dopesheet(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "DopeSheet", "Settings for filtering animation data");
/* autosnap */
- prop= RNA_def_property(srna, "autosnap", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "auto_snap", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "autosnap");
RNA_def_property_enum_items(prop, autosnap_items);
RNA_def_property_ui_text(prop, "Auto Snap", "Automatic time snapping settings for transformations");
@@ -1594,7 +1720,7 @@ static void rna_def_space_graph(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show Seconds", "Show timing in seconds not frames");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
- prop= RNA_def_property(srna, "show_cframe_indicator", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_frame_indicator", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SIPO_NODRAWCFRANUM);
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_GRAPH, NULL);
@@ -1609,23 +1735,23 @@ static void rna_def_space_graph(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show Handles", "Show handles of Bezier control points");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
- prop= RNA_def_property(srna, "only_selected_curves_handles", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_only_selected_curves_handles", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SIPO_SELCUVERTSONLY);
RNA_def_property_ui_text(prop, "Only Selected Curve Keyframes", "Only keyframes of selected F-Curves are visible and editable");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
- prop= RNA_def_property(srna, "only_selected_keyframe_handles", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_only_selected_keyframe_handles", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SIPO_SELVHANDLESONLY);
RNA_def_property_ui_text(prop, "Only Selected Keyframes Handles", "Only show and edit handles of selected keyframes");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
/* editing */
- prop= RNA_def_property(srna, "automerge_keyframes", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_auto_merge_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);
+ prop= RNA_def_property(srna, "use_realtime_update", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SIPO_NOREALTIMEUPDATES);
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_GRAPH, NULL);
@@ -1636,7 +1762,7 @@ static void rna_def_space_graph(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show Cursor", "Show 2D cursor");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
- prop= RNA_def_property(srna, "cursor_value", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "cursor_position_y", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "cursorVal");
RNA_def_property_ui_text(prop, "Cursor Y-Value", "Graph Editor 2D-Value cursor - Y-Value component");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
@@ -1654,7 +1780,7 @@ static void rna_def_space_graph(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "DopeSheet", "Settings for filtering animation data");
/* autosnap */
- prop= RNA_def_property(srna, "autosnap", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "auto_snap", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "autosnap");
RNA_def_property_enum_items(prop, autosnap_items);
RNA_def_property_ui_text(prop, "Auto Snap", "Automatic time snapping settings for transformations");
@@ -1684,7 +1810,7 @@ static void rna_def_space_nla(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show Seconds", "Show timing in seconds not frames");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NLA, NULL);
- prop= RNA_def_property(srna, "show_cframe_indicator", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_frame_indicator", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SNLA_NODRAWCFRANUM);
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_NLA, NULL);
@@ -1695,7 +1821,7 @@ static void rna_def_space_nla(BlenderRNA *brna)
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NLA, NULL);
/* editing */
- prop= RNA_def_property(srna, "realtime_updates", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_realtime_update", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SNLA_NOREALTIMEUPDATES);
RNA_def_property_ui_text(prop, "Realtime Updates", "When transforming strips, changes to the animation data are flushed to other views");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NLA, NULL);
@@ -1707,7 +1833,7 @@ static void rna_def_space_nla(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "DopeSheet", "Settings for filtering animation data");
/* autosnap */
- prop= RNA_def_property(srna, "autosnap", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "auto_snap", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "autosnap");
RNA_def_property_enum_items(prop, autosnap_items);
RNA_def_property_ui_text(prop, "Auto Snap", "Automatic time snapping settings for transformations");
@@ -1724,51 +1850,77 @@ static void rna_def_space_time(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Space Timeline Editor", "Timeline editor space data");
/* Define Anim Playback Areas */
- prop= RNA_def_property(srna, "play_top_left", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_play_top_left_3d_editor", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_REGION);
RNA_def_property_ui_text(prop, "Top-Left 3D Editor", "");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
- prop= RNA_def_property(srna, "play_all_3d", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_play_3d_editors", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_ALL_3D_WIN);
RNA_def_property_ui_text(prop, "All 3D View Editors", "");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
- prop= RNA_def_property(srna, "play_anim", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_play_animation_editors", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_ALL_ANIM_WIN);
RNA_def_property_ui_text(prop, "Animation Editors", "");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
- prop= RNA_def_property(srna, "play_buttons", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_play_properties_editors", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_ALL_BUTS_WIN);
RNA_def_property_ui_text(prop, "Property Editors", "");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
- prop= RNA_def_property(srna, "play_image", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_play_image_editors", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_ALL_IMAGE_WIN);
RNA_def_property_ui_text(prop, "Image Editors", "");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
- prop= RNA_def_property(srna, "play_sequencer", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_play_sequence_editors", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_SEQ);
RNA_def_property_ui_text(prop, "Sequencer Editors", "");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
- prop= RNA_def_property(srna, "play_nodes", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_play_node_editors", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_NODES);
RNA_def_property_ui_text(prop, "Node Editors", "");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
/* Other options */
- prop= RNA_def_property(srna, "only_selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_only_selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TIME_ONLYACTSEL);
RNA_def_property_ui_text(prop, "Only Selected channels", "Show keyframes for active Object and/or its selected channels only");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, NULL);
- prop= RNA_def_property(srna, "show_cframe_indicator", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_frame_indicator", PROP_BOOLEAN, PROP_NONE);
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)
@@ -1780,8 +1932,8 @@ static void rna_def_console_line(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Console Input", "Input line for the interactive console");
// XXX using non-inited "prop", uh? RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE, NULL);
- prop= RNA_def_property(srna, "line", PROP_STRING, PROP_NONE);
- RNA_def_property_string_funcs(prop, "rna_ConsoleLine_line_get", "rna_ConsoleLine_line_length", "rna_ConsoleLine_line_set");
+ prop= RNA_def_property(srna, "body", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_funcs(prop, "rna_ConsoleLine_body_get", "rna_ConsoleLine_body_length", "rna_ConsoleLine_body_set");
RNA_def_property_ui_text(prop, "Line", "Text in the line");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE, NULL);
@@ -1818,11 +1970,11 @@ static void rna_def_space_console(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Type", "Console type");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE, NULL);
- prop= RNA_def_property(srna, "selection_start", PROP_INT, PROP_UNSIGNED); /* copied from text editor */
+ prop= RNA_def_property(srna, "select_start", PROP_INT, PROP_UNSIGNED); /* copied from text editor */
RNA_def_property_int_sdna(prop, NULL, "sel_start");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE, NULL);
- prop= RNA_def_property(srna, "selection_end", PROP_INT, PROP_UNSIGNED); /* copied from text editor */
+ prop= RNA_def_property(srna, "select_end", PROP_INT, PROP_UNSIGNED); /* copied from text editor */
RNA_def_property_int_sdna(prop, NULL, "sel_end");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE, NULL);
@@ -1842,7 +1994,7 @@ static void rna_def_space_console(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show Operator", "Display the operator log");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE_REPORT, NULL);
- prop= RNA_def_property(srna, "show_report_warn", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_report_warning", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", CONSOLE_RPT_WARN);
RNA_def_property_ui_text(prop, "Show Warn", "Display warnings");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE_REPORT, NULL);
@@ -1900,76 +2052,76 @@ static void rna_def_fileselect_params(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Directory", "Directory displayed in the file browser");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
- prop= RNA_def_property(srna, "file", PROP_STRING, PROP_NONE);
+ prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "file");
RNA_def_property_ui_text(prop, "File Name", "Active file in the file browser");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
- prop= RNA_def_property(srna, "display", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "display_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "display");
RNA_def_property_enum_items(prop, file_display_items);
RNA_def_property_ui_text(prop, "Display Mode", "Display mode for the file list");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
- prop= RNA_def_property(srna, "do_filter", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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_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");
+ prop= RNA_def_property(srna, "show_hidden", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", FILE_HIDE_DOT);
+ RNA_def_property_ui_text(prop, "Show Hidden", "Show hidden dot files");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS , NULL);
- prop= RNA_def_property(srna, "sort", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "sort_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "sort");
RNA_def_property_enum_items(prop, file_sort_items);
RNA_def_property_ui_text(prop, "Sort", "");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
- prop= RNA_def_property(srna, "filter_image", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_filter_image", PROP_BOOLEAN, PROP_NONE);
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_PARAMS, NULL);
- prop= RNA_def_property(srna, "filter_blender", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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_PARAMS, NULL);
- prop= RNA_def_property(srna, "filter_movie", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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_PARAMS, NULL);
- prop= RNA_def_property(srna, "filter_script", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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_PARAMS, NULL);
- prop= RNA_def_property(srna, "filter_font", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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_PARAMS, NULL);
- prop= RNA_def_property(srna, "filter_sound", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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_PARAMS, NULL);
- prop= RNA_def_property(srna, "filter_text", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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_PARAMS, NULL);
- prop= RNA_def_property(srna, "filter_folder", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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);
@@ -2003,10 +2155,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_text", 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)
@@ -2055,7 +2213,7 @@ static void rna_def_space_node(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Node Tree", "Node tree being displayed and edited");
- prop= RNA_def_property(srna, "backdrop", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_backdrop", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SNODE_BACKDRAW);
RNA_def_property_ui_text(prop, "Backdrop", "Use active Viewer Node output as backdrop for compositing nodes");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE_VIEW, NULL);
@@ -2064,10 +2222,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, "show_sensors_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, "show_sensors_active_object", 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, "show_sensors_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, "show_sensors_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, "show_controllers_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, "show_controllers_active_object", 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, "show_controllers_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, "show_actuators_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, "show_actuators_active_object", 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, "show_actuators_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, "show_actuators_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)
@@ -2080,7 +2298,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_text.c b/source/blender/makesrna/intern/rna_text.c
index ad90afb84a6..15e7ce525ba 100644
--- a/source/blender/makesrna/intern/rna_text.c
+++ b/source/blender/makesrna/intern/rna_text.c
@@ -76,7 +76,7 @@ static int rna_Text_modified_get(PointerRNA *ptr)
return text_file_modified(text);
}
-static void rna_TextLine_line_get(PointerRNA *ptr, char *value)
+static void rna_TextLine_body_get(PointerRNA *ptr, char *value)
{
TextLine *line= (TextLine*)ptr->data;
@@ -86,21 +86,23 @@ static void rna_TextLine_line_get(PointerRNA *ptr, char *value)
strcpy(value, "");
}
-static int rna_TextLine_line_length(PointerRNA *ptr)
+static int rna_TextLine_body_length(PointerRNA *ptr)
{
TextLine *line= (TextLine*)ptr->data;
return line->len;
}
-static void rna_TextLine_line_set(PointerRNA *ptr, const char *value)
+static void rna_TextLine_body_set(PointerRNA *ptr, const char *value)
{
TextLine *line= (TextLine*)ptr->data;
+ int len= strlen(value);
if(line->line)
MEM_freeN(line->line);
-
- line->line= BLI_strdup(value);
- line->len= strlen(line->line);
+
+ line->line= MEM_mallocN((len + 1) * sizeof(char), "rna_text_body");
+ line->len= len;
+ memcpy(line->line, value, len + 1);
if(line->format) {
MEM_freeN(line->format);
@@ -118,8 +120,8 @@ static void rna_def_text_line(BlenderRNA *brna)
srna = RNA_def_struct(brna, "TextLine", NULL);
RNA_def_struct_ui_text(srna, "Text Line", "Line of text in a Text datablock");
- prop= RNA_def_property(srna, "line", PROP_STRING, PROP_NONE);
- RNA_def_property_string_funcs(prop, "rna_TextLine_line_get", "rna_TextLine_line_length", "rna_TextLine_line_set");
+ prop= RNA_def_property(srna, "body", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_funcs(prop, "rna_TextLine_body_get", "rna_TextLine_body_length", "rna_TextLine_body_set");
RNA_def_property_ui_text(prop, "Line", "Text in the line");
RNA_def_property_update(prop, NC_TEXT|NA_EDITED, NULL);
}
@@ -137,11 +139,13 @@ static void rna_def_text_marker(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Line", "Line in which the marker is located");
- prop= RNA_def_property(srna, "start", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "character_index_start", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "start");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Start", "Start position of the marker in the line");
- prop= RNA_def_property(srna, "end", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "character_index_end", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "end");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "End", "Start position of the marker in the line");
@@ -150,12 +154,12 @@ static void rna_def_text_marker(BlenderRNA *brna)
RNA_def_property_range(prop, 0, (int)0xFFFF);
RNA_def_property_ui_text(prop, "Group", "");
- prop= RNA_def_property(srna, "temporary", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_temporary", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", TMARK_TEMP);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Temporary", "Marker is temporary");
- prop= RNA_def_property(srna, "edit_all", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_edit_all", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", TMARK_EDITALL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Edit All", "Edit all markers of the same group as one");
@@ -174,30 +178,30 @@ 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);
+ prop= RNA_def_property(srna, "is_dirty", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", TXT_ISDIRTY);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Dirty", "Text file has been edited since last save");
- prop= RNA_def_property(srna, "modified", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_modified", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_boolean_funcs(prop, "rna_Text_modified_get", NULL);
RNA_def_property_ui_text(prop, "Modified", "Text file on disk is different than the one in memory");
- prop= RNA_def_property(srna, "memory", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_in_memory", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", TXT_ISMEM);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Memory", "Text file is in memory, without a corresponding file on disk");
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);
+ prop= RNA_def_property(srna, "use_tabs_as_spaces", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", TXT_TABSTOSPACES);
RNA_def_property_ui_text(prop, "Tabs as Spaces", "Automatically converts all new tabs into spaces");
@@ -217,14 +221,14 @@ static void rna_def_text(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Current Character", "Index of current character in current line, and also start index of character in selection if one exists");
- prop= RNA_def_property(srna, "selection_end_line", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "select_end_line", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "sell");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "TextLine");
RNA_def_property_ui_text(prop, "Selection End Line", "End line of selection");
- prop= RNA_def_property(srna, "selection_end_character", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "select_end_character", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "selc");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Selection End Character", "Index of character after end of selection in the selection end line");
diff --git a/source/blender/makesrna/intern/rna_texture.c b/source/blender/makesrna/intern/rna_texture.c
index ba91cdf690a..567166fd15f 100644
--- a/source/blender/makesrna/intern/rna_texture.c
+++ b/source/blender/makesrna/intern/rna_texture.c
@@ -60,7 +60,7 @@ EnumPropertyItem texture_type_items[] = {
{TEX_MARBLE, "MARBLE", ICON_TEXTURE, "Marble", ""},
{TEX_MUSGRAVE, "MUSGRAVE", ICON_TEXTURE, "Musgrave", ""},
{TEX_NOISE, "NOISE", ICON_TEXTURE, "Noise", ""},
- {TEX_PLUGIN, "PLUGIN", ICON_PLUGIN, "Plugin", ""},
+ //{TEX_PLUGIN, "PLUGIN", ICON_PLUGIN, "Plugin", ""}, /* Nothing yet */
{TEX_POINTDENSITY, "POINT_DENSITY", ICON_TEXTURE, "Point Density", ""},
{TEX_STUCCI, "STUCCI", ICON_TEXTURE, "Stucci", ""},
{TEX_VORONOI, "VORONOI", ICON_TEXTURE, "Voronoi", ""},
@@ -75,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"
@@ -131,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)
{
@@ -143,24 +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;
-
- switch(value) {
-
- 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 = value;
+ tex_set_type(tex, value);
}
void rna_TextureSlot_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -387,22 +388,22 @@ static void rna_def_texmapping(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Scale", "");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "minimum", PROP_FLOAT, PROP_XYZ);
+ prop= RNA_def_property(srna, "min", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "min");
RNA_def_property_ui_text(prop, "Minimum", "Minimum value for clipping");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "maximum", PROP_FLOAT, PROP_XYZ);
+ prop= RNA_def_property(srna, "max", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "max");
RNA_def_property_ui_text(prop, "Maximum", "Maximum value for clipping");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "has_minimum", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_min", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TEXMAP_CLIP_MIN);
RNA_def_property_ui_text(prop, "Has Minimum", "Whether to use minimum clipping value");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "has_maximum", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_max", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TEXMAP_CLIP_MAX);
RNA_def_property_ui_text(prop, "Has Maximum", "Whether to use maximum clipping value");
RNA_def_property_update(prop, 0, "rna_Texture_update");
@@ -463,7 +464,8 @@ static void rna_def_mtex(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Offset", "Fine tunes texture mapping X, Y and Z locations");
RNA_def_property_update(prop, 0, "rna_TextureSlot_update");
- prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_XYZ);
+ prop= RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ);
+ RNA_def_property_float_sdna(prop, NULL, "size");
RNA_def_property_ui_range(prop, -100, 100, 10, 2);
RNA_def_property_ui_text(prop, "Size", "Sets scaling for the texture's X, Y and Z sizes");
RNA_def_property_update(prop, 0, "rna_TextureSlot_update");
@@ -480,17 +482,17 @@ static void rna_def_mtex(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Blend Type", "");
RNA_def_property_update(prop, 0, "rna_TextureSlot_update");
- prop= RNA_def_property(srna, "stencil", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_stencil", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "texflag", MTEX_STENCIL);
RNA_def_property_ui_text(prop, "Stencil", "Use this texture as a blending value on the next texture");
RNA_def_property_update(prop, 0, "rna_TextureSlot_update");
- prop= RNA_def_property(srna, "negate", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "texflag", MTEX_NEGATIVE);
RNA_def_property_ui_text(prop, "Negate", "Inverts the values of the texture to reverse its effect");
RNA_def_property_update(prop, 0, "rna_TextureSlot_update");
- prop= RNA_def_property(srna, "rgb_to_intensity", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_rgb_to_intensity", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "texflag", MTEX_RGBTOINT);
RNA_def_property_ui_text(prop, "RGB to Intensity", "Converts texture RGB values to intensity (gray) values");
RNA_def_property_update(prop, 0, "rna_TextureSlot_update");
@@ -513,18 +515,18 @@ static void rna_def_filter_common(StructRNA *srna)
{
PropertyRNA *prop;
- prop= RNA_def_property(srna, "mipmap", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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);
+ prop= RNA_def_property(srna, "use_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);
+ prop= RNA_def_property(srna, "filter_type", 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");
@@ -542,7 +544,7 @@ static void rna_def_filter_common(StructRNA *srna)
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);
+ prop= RNA_def_property(srna, "use_filter_size_min", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "imaflag", TEX_FILTER_MIN);
RNA_def_property_ui_text(prop, "Minimum Filter Size", "Use Filter Size as a minimal filter value in pixels");
RNA_def_property_update(prop, 0, "rna_Texture_update");
@@ -614,19 +616,19 @@ static void rna_def_environment_map(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Zoom", "");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "ignore_layers", PROP_BOOLEAN, PROP_LAYER_MEMBER);
+ prop= RNA_def_property(srna, "layers_ignore", 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");
@@ -665,7 +667,7 @@ static void rna_def_texture_clouds(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Clouds Texture", "Procedural noise texture");
RNA_def_struct_sdna(srna, "Tex");
- prop= RNA_def_property(srna, "noise_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "noise_scale", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "noisesize");
RNA_def_property_range(prop, 0.0001, FLT_MAX);
RNA_def_property_ui_range(prop, 0.0001, 2, 10, 2);
@@ -691,7 +693,7 @@ static void rna_def_texture_clouds(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Noise Type", "");
RNA_def_property_update(prop, 0, "rna_Texture_nodes_update");
- prop= RNA_def_property(srna, "stype", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "cloud_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "stype");
RNA_def_property_enum_items(prop, prop_clouds_stype);
RNA_def_property_ui_text(prop, "Color", "");
@@ -726,7 +728,7 @@ static void rna_def_texture_wood(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Wood Texture", "Procedural noise texture");
RNA_def_struct_sdna(srna, "Tex");
- prop= RNA_def_property(srna, "noise_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "noise_scale", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "noisesize");
RNA_def_property_range(prop, 0.0001, FLT_MAX);
RNA_def_property_ui_range(prop, 0.0001, 2, 10, 2);
@@ -752,13 +754,13 @@ static void rna_def_texture_wood(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Noise Type", "");
RNA_def_property_update(prop, 0, "rna_Texture_nodes_update");
- prop= RNA_def_property(srna, "stype", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "wood_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "stype");
RNA_def_property_enum_items(prop, prop_wood_stype);
RNA_def_property_ui_text(prop, "Pattern", "");
RNA_def_property_update(prop, 0, "rna_Texture_nodes_update");
- prop= RNA_def_property(srna, "noisebasis2", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "noisebasis_2", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "noisebasis2");
RNA_def_property_enum_items(prop, prop_wood_noisebasis2);
RNA_def_property_ui_text(prop, "Noise Basis 2", "");
@@ -793,7 +795,7 @@ static void rna_def_texture_marble(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Marble Texture", "Procedural noise texture");
RNA_def_struct_sdna(srna, "Tex");
- prop= RNA_def_property(srna, "noise_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "noise_scale", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "noisesize");
RNA_def_property_range(prop, 0.0001, FLT_MAX);
RNA_def_property_ui_range(prop, 0.0001, 2, 10, 2);
@@ -820,7 +822,7 @@ static void rna_def_texture_marble(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Noise Type", "");
RNA_def_property_update(prop, 0, "rna_Texture_nodes_update");
- prop= RNA_def_property(srna, "stype", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "marble_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "stype");
RNA_def_property_enum_items(prop, prop_marble_stype);
RNA_def_property_ui_text(prop, "Pattern", "");
@@ -832,7 +834,7 @@ static void rna_def_texture_marble(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Noise Basis", "Sets the noise basis used for turbulence");
RNA_def_property_update(prop, 0, "rna_Texture_nodes_update");
- prop= RNA_def_property(srna, "noisebasis2", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "noisebasis_2", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "noisebasis2");
RNA_def_property_enum_items(prop, prop_marble_noisebasis2);
RNA_def_property_ui_text(prop, "Noise Basis 2", "");
@@ -900,7 +902,7 @@ static void rna_def_texture_blend(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Progression", "Sets the style of the color blending");
RNA_def_property_update(prop, 0, "rna_Texture_nodes_update");
- prop= RNA_def_property(srna, "flip_axis", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "use_flip_axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
RNA_def_property_enum_items(prop, prop_flip_axis_items);
RNA_def_property_ui_text(prop, "Flip Axis", "Flips the texture's X and Y axis");
@@ -936,7 +938,7 @@ static void rna_def_texture_stucci(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Noise Basis", "Sets the noise basis used for turbulence");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "noise_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "noise_scale", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "noisesize");
RNA_def_property_range(prop, 0.0001, FLT_MAX);
RNA_def_property_ui_range(prop, 0.0001, 2, 10, 2);
@@ -949,7 +951,7 @@ static void rna_def_texture_stucci(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Noise Type", "");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "stype", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "stucci_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "stype");
RNA_def_property_enum_items(prop, prop_stucci_stype);
RNA_def_property_ui_text(prop, "Pattern", "");
@@ -989,13 +991,13 @@ 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, "interpolation", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_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");
RNA_def_property_update(prop, 0, "rna_Texture_update");
/* XXX: I think flip_axis should be a generic Texture property, enabled for all the texture types */
- prop= RNA_def_property(srna, "flip_axis", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_flip_axis", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "imaflag", TEX_IMAROT);
RNA_def_property_ui_text(prop, "Flip Axis", "Flips the texture's X and Y axis");
RNA_def_property_update(prop, 0, "rna_Texture_update");
@@ -1005,7 +1007,7 @@ static void rna_def_texture_image(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Use Alpha", "Uses the alpha channel information in the image");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "calculate_alpha", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_calculate_alpha", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "imaflag", TEX_CALCALPHA);
RNA_def_property_ui_text(prop, "Calculate Alpha", "Calculates an alpha channel based on RGB values in the image");
RNA_def_property_update(prop, 0, "rna_Texture_update");
@@ -1035,22 +1037,22 @@ static void rna_def_texture_image(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Repeat Y", "Sets a repetition multiplier in the Y direction");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "mirror_x", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_mirror_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TEX_REPEAT_XMIR);
RNA_def_property_ui_text(prop, "Mirror X", "Mirrors the image repetition on the X direction");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "mirror_y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_mirror_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TEX_REPEAT_YMIR);
RNA_def_property_ui_text(prop, "Mirror Y", "Mirrors the image repetition on the Y direction");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "checker_odd", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_checker_odd", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TEX_CHECKER_ODD);
RNA_def_property_ui_text(prop, "Checker Odd", "Sets odd checker tiles");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "checker_even", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_checker_even", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TEX_CHECKER_EVEN);
RNA_def_property_ui_text(prop, "Checker Even", "Sets even checker tiles");
RNA_def_property_update(prop, 0, "rna_Texture_update");
@@ -1117,7 +1119,7 @@ static void rna_def_texture_image(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Texture_update");
/* Normal Map */
- prop= RNA_def_property(srna, "normal_map", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_normal_map", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "imaflag", TEX_NORMALMAP);
RNA_def_property_ui_text(prop, "Normal Map", "Uses image RGB values for normal mapping");
RNA_def_property_update(prop, 0, "rna_Texture_update");
@@ -1196,7 +1198,7 @@ static void rna_def_texture_musgrave(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Type", "");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "highest_dimension", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "dimension_max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "mg_H");
RNA_def_property_range(prop, 0.0001, 2);
RNA_def_property_ui_text(prop, "Highest Dimension", "Highest fractal dimension");
@@ -1205,7 +1207,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);
@@ -1232,7 +1234,7 @@ static void rna_def_texture_musgrave(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Noise Intensity", "");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "noise_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "noise_scale", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "noisesize");
RNA_def_property_range(prop, 0.0001, FLT_MAX);
RNA_def_property_ui_range(prop, 0.0001, 2, 10, 2);
@@ -1315,7 +1317,7 @@ static void rna_def_texture_voronoi(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Distance Metric", "");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "coloring", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "color_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "vn_coltype");
RNA_def_property_enum_items(prop, prop_coloring_items);
RNA_def_property_ui_text(prop, "Coloring", "");
@@ -1327,7 +1329,7 @@ static void rna_def_texture_voronoi(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Noise Intensity", "");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "noise_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "noise_scale", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "noisesize");
RNA_def_property_range(prop, 0.0001, FLT_MAX);
RNA_def_property_ui_range(prop, 0.0001, 2, 10, 2);
@@ -1356,7 +1358,7 @@ static void rna_def_texture_distorted_noise(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Distortion Amount", "");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "noise_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "noise_scale", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "noisesize");
RNA_def_property_range(prop, 0.0001, FLT_MAX);
RNA_def_property_ui_range(prop, 0.0001, 2, 10, 2);
@@ -1446,17 +1448,17 @@ static void rna_def_texture_pointdensity(BlenderRNA *brna)
prop= RNA_def_property(srna, "particle_system", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Particle System", "Particle System to render as points");
RNA_def_property_struct_type(prop, "ParticleSystem");
- RNA_def_property_pointer_funcs(prop, "rna_PointDensity_psys_get", "rna_PointDensity_psys_set", NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_PointDensity_psys_get", "rna_PointDensity_psys_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "particle_cache", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "particle_cache_space", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "psys_cache_space");
RNA_def_property_enum_items(prop, particle_cache_items);
RNA_def_property_ui_text(prop, "Particle Cache", "Co-ordinate system to cache particles in");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "vertices_cache", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "vertex_cache_space", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "ob_cache_space");
RNA_def_property_enum_items(prop, vertice_cache_items);
RNA_def_property_ui_text(prop, "Vertices Cache", "Co-ordinate system to cache vertices in");
@@ -1474,7 +1476,7 @@ static void rna_def_texture_pointdensity(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Falloff", "Method of attenuating density by distance from the point");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "falloff_softness", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "falloff_soft", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "falloff_softness");
RNA_def_property_range(prop, 0.01, FLT_MAX);
RNA_def_property_ui_text(prop, "Softness", "Softness of the 'soft' falloff option");
@@ -1489,7 +1491,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);
@@ -1499,12 +1501,12 @@ static void rna_def_texture_pointdensity(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Texture_update");
/* Turbulence */
- prop= RNA_def_property(srna, "turbulence", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_turbulence", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TEX_PD_TURBULENCE);
RNA_def_property_ui_text(prop, "Turbulence", "Add directed noise to the density at render-time");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "turbulence_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "turbulence_scale", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "noise_size");
RNA_def_property_range(prop, 0.01, FLT_MAX);
RNA_def_property_ui_text(prop, "Size", "Scale of the added turbulent noise");
@@ -1531,7 +1533,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");
@@ -1539,7 +1541,7 @@ static void rna_def_texture_pointdensity(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "Tex");
RNA_def_struct_ui_text(srna, "Point Density", "Settings for the Point Density texture");
- prop= RNA_def_property(srna, "pointdensity", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "point_density", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "pd");
RNA_def_property_struct_type(prop, "PointDensity");
RNA_def_property_ui_text(prop, "Point Density", "The point density settings associated with this texture");
@@ -1593,7 +1595,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");
@@ -1611,41 +1613,41 @@ 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);
+ prop= RNA_def_property(srna, "filepath", 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);
+ prop= RNA_def_property(srna, "use_still_frame", 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);
+ prop= RNA_def_property(srna, "still_frame", 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");
RNA_def_struct_sdna(srna, "Tex");
RNA_def_struct_ui_text(srna, "Voxel Data", "Settings for the Voxel Data texture");
- prop= RNA_def_property(srna, "voxeldata", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "voxel_data", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "vd");
RNA_def_property_struct_type(prop, "VoxelData");
RNA_def_property_ui_text(prop, "Voxel Data", "The voxel data associated with this texture");
@@ -1656,12 +1658,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)
@@ -1695,7 +1697,7 @@ static void rna_def_texture(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Color Ramp", "");
RNA_def_property_update(prop, 0, "rna_Texture_update");
- prop= RNA_def_property(srna, "brightness", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "intensity", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "bright");
RNA_def_property_range(prop, 0, 2);
RNA_def_property_ui_text(prop, "Brightness", "");
@@ -1705,6 +1707,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);
diff --git a/source/blender/makesrna/intern/rna_timeline.c b/source/blender/makesrna/intern/rna_timeline.c
index afc1d087cf2..a436c746910 100644
--- a/source/blender/makesrna/intern/rna_timeline.c
+++ b/source/blender/makesrna/intern/rna_timeline.c
@@ -55,9 +55,9 @@ static void rna_def_timeline_marker(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Frame", "The frame on which the timeline marker appears");
RNA_def_property_update(prop, NC_ANIMATION, NULL);
- prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", 1 /*SELECT*/);
- RNA_def_property_ui_text(prop, "Selected", "Marker selection state");
+ RNA_def_property_ui_text(prop, "Select", "Marker selection state");
RNA_def_property_update(prop, NC_ANIMATION, NULL);
#ifdef DURIAN_CAMERA_SWITCH
diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c
index d25efd23da0..f2c33f354c2 100644
--- a/source/blender/makesrna/intern/rna_ui.c
+++ b/source/blender/makesrna/intern/rna_ui.c
@@ -207,6 +207,7 @@ static StructRNA *rna_Panel_register(const bContext *C, ReportList *reports, voi
pt->ext.call= call;
pt->ext.free= free;
RNA_struct_blender_type_set(pt->ext.srna, pt);
+ RNA_def_struct_flag(pt->ext.srna, STRUCT_NO_IDPROPERTIES);
pt->poll= (have_function[0])? panel_poll: NULL;
pt->draw= (have_function[1])? panel_draw: NULL;
@@ -418,6 +419,7 @@ static StructRNA *rna_Menu_register(const bContext *C, ReportList *reports, void
mt->ext.call= call;
mt->ext.free= free;
RNA_struct_blender_type_set(mt->ext.srna, mt);
+ RNA_def_struct_flag(mt->ext.srna, STRUCT_NO_IDPROPERTIES);
mt->poll= (have_function[0])? menu_poll: NULL;
mt->draw= (have_function[1])? menu_draw: NULL;
@@ -545,10 +547,11 @@ static void rna_def_ui_layout(BlenderRNA *brna)
prop= RNA_def_property(srna, "operator_context", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, operator_context_items);
RNA_def_property_enum_funcs(prop, "rna_UILayout_op_context_get", "rna_UILayout_op_context_set", NULL);
-
+
prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_UILayout_enabled_get", "rna_UILayout_enabled_set");
-
+ RNA_def_property_ui_text(prop, "Enabled", "When false, this (sub)layout is greyed out.");
+
#if 0
prop= RNA_def_property(srna, "red_alert", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_UILayout_red_alert_get", "rna_UILayout_red_alert_set");
@@ -565,10 +568,11 @@ static void rna_def_ui_layout(BlenderRNA *brna)
prop= RNA_def_property(srna, "scale_x", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_float_funcs(prop, "rna_UILayout_scale_x_get", "rna_UILayout_scale_x_set", NULL);
-
+ RNA_def_property_ui_text(prop, "Scale X", "Scale factor along the X for items in this (sub)layout.");
+
prop= RNA_def_property(srna, "scale_y", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_float_funcs(prop, "rna_UILayout_scale_y_get", "rna_UILayout_scale_y_set", NULL);
-
+ RNA_def_property_ui_text(prop, "Scale Y", "Scale factor along the Y for items in this (sub)layout.");
RNA_api_ui_layout(srna);
}
@@ -579,69 +583,79 @@ static void rna_def_panel(BlenderRNA *brna)
PropertyRNA *parm;
FunctionRNA *func;
+ static EnumPropertyItem panel_flag_items[] = {
+ {PNL_DEFAULT_CLOSED, "DEFAULT_CLOSED", 0, "Default Closed", "Defines if the panel has to be open or collapsed at the time of its creation."},
+ {PNL_NO_HEADER, "HIDE_HEADER", 0, "Show Header", "If set to True, the panel shows a header, which contains a clickable arrow to collapse the panel and the label (see bl_label)."},
+ {0, NULL, 0, NULL, NULL}};
+
srna= RNA_def_struct(brna, "Panel", NULL);
- RNA_def_struct_ui_text(srna, "Panel", "Panel containing buttons");
+ RNA_def_struct_ui_text(srna, "Panel", "Panel containing UI elements");
RNA_def_struct_sdna(srna, "Panel");
RNA_def_struct_refine_func(srna, "rna_Panel_refine");
RNA_def_struct_register_funcs(srna, "rna_Panel_register", "rna_Panel_unregister");
/* poll */
func= RNA_def_function(srna, "poll", NULL);
- RNA_def_function_ui_description(func, "Test if the panel is visible or not.");
- RNA_def_function_flag(func, FUNC_REGISTER|FUNC_REGISTER_OPTIONAL);
+ RNA_def_function_ui_description(func, "If this method returns a non-null output, then the panel can be drawn.");
+ RNA_def_function_flag(func, FUNC_NO_SELF|FUNC_REGISTER|FUNC_REGISTER_OPTIONAL);
RNA_def_function_return(func, RNA_def_boolean(func, "visible", 1, "", ""));
parm= RNA_def_pointer(func, "context", "Context", "", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
/* draw */
func= RNA_def_function(srna, "draw", NULL);
- RNA_def_function_ui_description(func, "Draw buttons into the panel UI layout.");
+ RNA_def_function_ui_description(func, "Draw UI elements into the panel UI layout.");
RNA_def_function_flag(func, FUNC_REGISTER);
parm= RNA_def_pointer(func, "context", "Context", "", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
func= RNA_def_function(srna, "draw_header", NULL);
- RNA_def_function_ui_description(func, "Draw buttons into the panel header UI layout.");
+ RNA_def_function_ui_description(func, "Draw UI elements into the panel's header UI layout.");
RNA_def_function_flag(func, FUNC_REGISTER);
parm= RNA_def_pointer(func, "context", "Context", "", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
prop= RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "UILayout");
-
+ RNA_def_property_ui_text(prop, "Layout", "Defines the structure of the panel in the UI.");
+
prop= RNA_def_property(srna, "text", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "drawname");
-
+ RNA_def_property_ui_text(prop, "Text", "XXX todo");
+
/* registration */
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->idname");
RNA_def_property_flag(prop, PROP_REGISTER);
-
+ RNA_def_property_ui_text(prop, "ID Name", "If this is set, the panel gets a custom ID, otherwise it takes the name of the class used to define the panel. For example, if the class name is \"OBJECT_PT_hello\", and bl_idname is not set by the script, then bl_idname = \"OBJECT_PT_hello\"");
+
prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->label");
RNA_def_property_flag(prop, PROP_REGISTER);
-
+ RNA_def_property_ui_text(prop, "Label", "The panel label, shows up in the panel header at the right of the triangle used to collapse the panel.");
+
prop= RNA_def_property(srna, "bl_space_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type->space_type");
RNA_def_property_enum_items(prop, space_type_items);
RNA_def_property_flag(prop, PROP_REGISTER);
-
+ RNA_def_property_ui_text(prop, "Space type", "The space where the panel is going to be used in.");
+
prop= RNA_def_property(srna, "bl_region_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type->region_type");
RNA_def_property_enum_items(prop, region_type_items);
RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_ui_text(prop, "Region Type", "The region where the panel is going to be used in.");
prop= RNA_def_property(srna, "bl_context", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->context");
RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); /* should this be optional? - Campbell */
-
- prop= RNA_def_property(srna, "bl_default_closed", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "type->flag", PNL_DEFAULT_CLOSED);
- RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
-
- prop= RNA_def_property(srna, "bl_show_header", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "type->flag", PNL_NO_HEADER);
- RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
+ RNA_def_property_ui_text(prop, "Context", "The context in which the panel belongs to. (TODO: explain the possible combinations bl_context/bl_region_type/bl_space_type)");
+
+ prop= RNA_def_property(srna, "bl_options", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "type->flag");
+ RNA_def_property_enum_items(prop, panel_flag_items);
+ RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL|PROP_ENUM_FLAG);
+ RNA_def_property_ui_text(prop, "Options", "Options for this panel type");
}
static void rna_def_header(BlenderRNA *brna)
@@ -652,14 +666,14 @@ static void rna_def_header(BlenderRNA *brna)
FunctionRNA *func;
srna= RNA_def_struct(brna, "Header", NULL);
- RNA_def_struct_ui_text(srna, "Header", "Editor header containing buttons");
+ RNA_def_struct_ui_text(srna, "Header", "Editor header containing UI elements.");
RNA_def_struct_sdna(srna, "Header");
RNA_def_struct_refine_func(srna, "rna_Header_refine");
RNA_def_struct_register_funcs(srna, "rna_Header_register", "rna_Header_unregister");
/* draw */
func= RNA_def_function(srna, "draw", NULL);
- RNA_def_function_ui_description(func, "Draw buttons into the header UI layout.");
+ RNA_def_function_ui_description(func, "Draw UI elements into the header UI layout.");
RNA_def_function_flag(func, FUNC_REGISTER);
parm= RNA_def_pointer(func, "context", "Context", "", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
@@ -669,16 +683,19 @@ static void rna_def_header(BlenderRNA *brna)
prop= RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "layout");
RNA_def_property_struct_type(prop, "UILayout");
+ RNA_def_property_ui_text(prop, "Layout", "Defines the structure of the header in the UI.");
/* registration */
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->idname");
RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_ui_text(prop, "ID Name", "If this is set, the header gets a custom ID, otherwise it takes the name of the class used to define the panel. For example, if the class name is \"OBJECT_HT_hello\", and bl_idname is not set by the script, then bl_idname = \"OBJECT_HT_hello\"");
prop= RNA_def_property(srna, "bl_space_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type->space_type");
RNA_def_property_enum_items(prop, space_type_items);
RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_ui_text(prop, "Space type", "The space where the header is going to be used in.");
RNA_define_verify_sdna(1);
}
@@ -698,15 +715,15 @@ static void rna_def_menu(BlenderRNA *brna)
/* poll */
func= RNA_def_function(srna, "poll", NULL);
- RNA_def_function_ui_description(func, "Test if the menu is visible or not.");
- RNA_def_function_flag(func, FUNC_REGISTER|FUNC_REGISTER_OPTIONAL);
+ RNA_def_function_ui_description(func, "If this method returns a non-null output, then the menu can be drawn.");
+ RNA_def_function_flag(func, FUNC_NO_SELF|FUNC_REGISTER|FUNC_REGISTER_OPTIONAL);
RNA_def_function_return(func, RNA_def_boolean(func, "visible", 1, "", ""));
parm= RNA_def_pointer(func, "context", "Context", "", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
/* draw */
func= RNA_def_function(srna, "draw", NULL);
- RNA_def_function_ui_description(func, "Draw buttons into the menu UI layout.");
+ RNA_def_function_ui_description(func, "Draw UI elements into the menu UI layout.");
RNA_def_function_flag(func, FUNC_REGISTER);
parm= RNA_def_pointer(func, "context", "Context", "", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
@@ -716,15 +733,18 @@ static void rna_def_menu(BlenderRNA *brna)
prop= RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "layout");
RNA_def_property_struct_type(prop, "UILayout");
+ RNA_def_property_ui_text(prop, "Layout", "Defines the structure of the menu in the UI.");
/* registration */
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->idname");
RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_ui_text(prop, "ID Name", "If this is set, the menu gets a custom ID, otherwise it takes the name of the class used to define the panel. For example, if the class name is \"OBJECT_MT_hello\", and bl_idname is not set by the script, then bl_idname = \"OBJECT_MT_hello\"");
prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->label");
RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_ui_text(prop, "Label", "The menu label");
RNA_define_verify_sdna(1);
}
diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c
index 89c7876f6e0..4f5c8094c14 100644
--- a/source/blender/makesrna/intern/rna_ui_api.c
+++ b/source/blender/makesrna/intern/rna_ui_api.c
@@ -35,13 +35,13 @@
#ifdef RNA_RUNTIME
-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 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;
if(!prop) {
- printf("rna_uiItemR: property not found: %s\n", propname);
+ printf("rna_uiItemR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -51,14 +51,16 @@ static void rna_uiItemR(uiLayout *layout, PointerRNA *ptr, char *propname, char
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, ptr, prop, index, 0, flag, name, icon);
}
-static PointerRNA rna_uiItemO(uiLayout *layout, char *opname, char *name, int icon)
+static PointerRNA rna_uiItemO(uiLayout *layout, char *opname, char *name, int icon, int emboss)
{
- return uiItemFullO(layout, opname, name, icon, 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
@@ -85,7 +87,7 @@ static void api_ui_item_op(FunctionRNA *func)
{
PropertyRNA *parm;
parm= RNA_def_string(func, "operator", "", 0, "", "Identifier of the operator.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
static void api_ui_item_op_common(FunctionRNA *func)
@@ -125,11 +127,13 @@ void RNA_api_ui_layout(StructRNA *srna)
func= RNA_def_function(srna, "row", "uiLayoutRow");
parm= RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in.");
RNA_def_function_return(func, parm);
+ RNA_def_function_ui_description(func, "Sub-layout. Items placed in this sublayout are placed next to each other in a row.");
RNA_def_boolean(func, "align", 0, "", "Align buttons to each other.");
-
+
func= RNA_def_function(srna, "column", "uiLayoutColumn");
parm= RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in.");
RNA_def_function_return(func, parm);
+ RNA_def_function_ui_description(func, "Sub-layout. Items placed in this sublayout are placed under each other in a column.");
RNA_def_boolean(func, "align", 0, "", "Align buttons to each other.");
func= RNA_def_function(srna, "column_flow", "uiLayoutColumnFlow");
@@ -142,7 +146,8 @@ void RNA_api_ui_layout(StructRNA *srna)
func= RNA_def_function(srna, "box", "uiLayoutBox");
parm= RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in.");
RNA_def_function_return(func, parm);
-
+ RNA_def_function_ui_description(func, "Sublayout. Items placed in this sublayout are placed under each other in a column and are surrounded by a box.");
+
/* split layout */
func= RNA_def_function(srna, "split", "uiLayoutSplit");
parm= RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in.");
@@ -152,6 +157,7 @@ void RNA_api_ui_layout(StructRNA *srna)
/* items */
func= RNA_def_function(srna, "prop", "rna_uiItemR");
+ RNA_def_function_ui_description(func, "Item. Exposes an RNA item and places it into the layout.");
api_ui_item_rna_common(func);
api_ui_item_common(func);
RNA_def_boolean(func, "expand", 0, "", "Expand button to show more detail.");
@@ -160,7 +166,7 @@ void RNA_api_ui_layout(StructRNA *srna)
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");
@@ -176,7 +182,7 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_property_flag(parm, PROP_REQUIRED);
api_ui_item_common(func);
- func= RNA_def_function(srna, "prop_object", "uiItemPointerR");
+ func= RNA_def_function(srna, "prop_search", "uiItemPointerR");
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);
@@ -186,9 +192,11 @@ void RNA_api_ui_layout(StructRNA *srna)
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);
+ RNA_def_function_ui_description(func, "Item. Places a button into the layout to call an Operator.");
/* func= RNA_def_function(srna, "operator_enum", "uiItemEnumO_string");
api_ui_item_op_common(func);
@@ -238,6 +246,7 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_property_flag(parm, PROP_REQUIRED); */
func= RNA_def_function(srna, "label", "uiItemL");
+ RNA_def_function_ui_description(func, "Item. Display text in the layout.");
api_ui_item_common(func);
func= RNA_def_function(srna, "menu", "uiItemM");
@@ -247,6 +256,7 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_property_flag(parm, PROP_REQUIRED);
func= RNA_def_function(srna, "separator", "uiItemS");
+ RNA_def_function_ui_description(func, "Item. Inserts empty space into the layout between items.");
/* context */
func= RNA_def_function(srna, "set_context_pointer", "uiLayoutSetContextPointer");
@@ -260,11 +270,6 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
RNA_def_boolean(func, "menus", 1, "", "The header has menus, and should show menu expander.");
- func= RNA_def_function(srna, "template_dopesheet_filter", "uiTemplateDopeSheetFilter");
- RNA_def_function_flag(func, FUNC_USE_CONTEXT);
- parm= RNA_def_pointer(func, "dopesheet", "DopeSheet", "", "DopeSheet settings holding filter options.");
- RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR|PROP_NEVER_NULL);
-
func= RNA_def_function(srna, "template_ID", "uiTemplateID");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
api_ui_item_rna_common(func);
@@ -303,35 +308,50 @@ void RNA_api_ui_layout(StructRNA *srna)
func= RNA_def_function(srna, "template_modifier", "uiTemplateModifier");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+ RNA_def_function_ui_description(func, "Layout . Generates the UI layout for modifiers.");
parm= RNA_def_pointer(func, "data", "Modifier", "", "Modifier data.");
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_constraint", "uiTemplateConstraint");
+ RNA_def_function_ui_description(func, "Layout . Generates the UI layout for constraints.");
parm= RNA_def_pointer(func, "data", "Constraint", "", "Constraint data.");
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);
func= RNA_def_function(srna, "template_preview", "uiTemplatePreview");
+ RNA_def_function_ui_description(func, "Item. A preview window for materials, textures, lamps, etc.");
parm= RNA_def_pointer(func, "id", "ID", "", "ID datablock.");
RNA_def_property_flag(parm, PROP_REQUIRED);
RNA_def_pointer(func, "parent", "ID", "", "ID datablock.");
RNA_def_pointer(func, "slot", "TextureSlot", "", "Texture slot.");
func= RNA_def_function(srna, "template_curve_mapping", "uiTemplateCurveMapping");
+ RNA_def_function_ui_description(func, "Item. A curve mapping widget used for e.g falloff curves for lamps.");
api_ui_item_rna_common(func);
RNA_def_enum(func, "type", curve_type_items, 0, "Type", "Type of curves to display.");
RNA_def_boolean(func, "levels", 0, "", "Show black/white levels.");
RNA_def_boolean(func, "brush", 0, "", "Show brush options.");
func= RNA_def_function(srna, "template_color_ramp", "uiTemplateColorRamp");
+ RNA_def_function_ui_description(func, "Item. A color ramp widget.");
api_ui_item_rna_common(func);
RNA_def_boolean(func, "expand", 0, "", "Expand button to show more detail.");
func= RNA_def_function(srna, "template_histogram", "uiTemplateHistogram");
+ RNA_def_function_ui_description(func, "Item. A histogramm widget to analyze imaga data.");
+ 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");
+ RNA_def_function_ui_description(func, "Item. A waveform widget to analyze imaga data.");
+ 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");
+ RNA_def_function_ui_description(func, "Item. A vectorscope widget to analyze imaga data.");
api_ui_item_rna_common(func);
RNA_def_boolean(func, "expand", 0, "", "Expand button to show more detail.");
@@ -345,12 +365,12 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_property_flag(parm, PROP_REQUIRED);
func= RNA_def_function(srna, "template_color_wheel", "uiTemplateColorWheel");
+ RNA_def_function_ui_description(func, "Item. A color wheel widget to pick colors.");
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");
-
- func= RNA_def_function(srna, "template_triColorSet", "uiTemplateTriColorSet");
- api_ui_item_rna_common(func);
+ 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_image_layers", "uiTemplateImageLayers");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
@@ -360,6 +380,7 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_property_flag(parm, PROP_REQUIRED);
func= RNA_def_function(srna, "template_image", "uiTemplateImage");
+ RNA_def_function_ui_description(func, "Item(s). User interface for selecting images and their source paths.");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
api_ui_item_rna_common(func);
parm= RNA_def_pointer(func, "image_user", "ImageUser", "", "");
@@ -367,6 +388,7 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_boolean(func, "compact", 0, "", "Use more compact layout.");
func= RNA_def_function(srna, "template_list", "uiTemplateList");
+ RNA_def_function_ui_description(func, "Item. A list widget to display data. e.g. vertexgroups.");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
parm= RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR);
@@ -390,10 +412,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 6b78ddaeae1..632d8c1be29 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -32,6 +32,7 @@
#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"
@@ -50,6 +51,7 @@
#include "BKE_global.h"
#include "MEM_guardedalloc.h"
+#include "MEM_CacheLimiterC-Api.h"
static void rna_userdef_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
@@ -170,6 +172,11 @@ static void rna_UserDef_audio_update(Main *bmain, Scene *scene, PointerRNA *ptr)
sound_init(bmain);
}
+static void rna_Userdef_memcache_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ MEM_CacheLimiter_set_maximum(U.memcachelimit * 1024 * 1024);
+}
+
static void rna_UserDef_weight_color_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Object *ob;
@@ -250,12 +257,14 @@ static void rna_def_userdef_theme_ui_font_style(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Shadow Size", "Shadow size in pixels (0, 3 and 5 supported)");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "shadx", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "shadow_offset_x", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "shadx");
RNA_def_property_range(prop, -10, 10);
RNA_def_property_ui_text(prop, "Shadow X Offset", "Shadow offset in pixels");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "shady", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "shadow_offset_y", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "shady");
RNA_def_property_range(prop, -10, 10);
RNA_def_property_ui_text(prop, "Shadow Y Offset", "Shadow offset in pixels");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -286,21 +295,21 @@ static void rna_def_userdef_theme_ui_style(BlenderRNA *brna)
RNA_def_property_range(prop, 0.5, 2.0);
RNA_def_property_ui_text(prop, "Panel Zoom", "Default zoom level for panel areas");
- prop= RNA_def_property(srna, "paneltitle", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "panel_title", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "paneltitle");
RNA_def_property_struct_type(prop, "ThemeFontStyle");
RNA_def_property_ui_text(prop, "Panel Font", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "grouplabel", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "group_label", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "grouplabel");
RNA_def_property_struct_type(prop, "ThemeFontStyle");
RNA_def_property_ui_text(prop, "Group Label Font", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "widgetlabel", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "widget_label", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "widgetlabel");
RNA_def_property_struct_type(prop, "ThemeFontStyle");
@@ -355,7 +364,7 @@ static void rna_def_userdef_theme_ui_wcol(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Text Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "shaded", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_shaded", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shaded", 1);
RNA_def_property_ui_text(prop, "Shaded", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -524,6 +533,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);
@@ -671,6 +687,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);
@@ -786,6 +807,12 @@ static void rna_def_userdef_theme_spaces_curves(StructRNA *srna, short incl_nurb
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)
@@ -849,7 +876,7 @@ 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);
@@ -1145,7 +1172,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);
@@ -1186,7 +1213,7 @@ static void rna_def_userdef_theme_space_node(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_NODE);
- prop= RNA_def_property(srna, "wires", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "wire", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "wire");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Wires", "");
@@ -1603,10 +1630,10 @@ static void rna_def_userdef_theme_colorset(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Normal", "Color used for the surface of bones");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "selected", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "select", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "select");
RNA_def_property_array(prop, 3);
- RNA_def_property_ui_text(prop, "Selected", "Color used for selected bones");
+ RNA_def_property_ui_text(prop, "Select", "Color used for selected bones");
RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "active", PROP_FLOAT, PROP_COLOR);
@@ -1614,7 +1641,7 @@ static void rna_def_userdef_theme_colorset(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Active", "Color used for active bones");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "colored_constraints", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_colored_constraints", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TH_WIRECOLOR_CONSTCOLS);
RNA_def_property_ui_text(prop, "Colored Constraints", "Allow the use of colors indicating constraints/keyed status");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -1818,7 +1845,7 @@ static void rna_def_userdef_solidlight(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "SolidLight");
RNA_def_struct_ui_text(srna, "Solid Light", "Light used for OpenGL lighting in solid draw mode");
- prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", 1);
RNA_def_property_ui_text(prop, "Enabled", "Enable this OpenGL light in solid draw mode");
RNA_def_property_update(prop, 0, "rna_UserDef_viewport_lights_update");
@@ -1863,21 +1890,21 @@ static void rna_def_userdef_view(BlenderRNA *brna)
/* View */
/* display */
- prop= RNA_def_property(srna, "tooltips", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_tooltips", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_TOOLTIPS);
RNA_def_property_ui_text(prop, "Tooltips", "Display tooltips");
- prop= RNA_def_property(srna, "display_object_info", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_object_info", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_DRAWVIEWINFO);
RNA_def_property_ui_text(prop, "Display Object Info", "Display objects name and frame number in 3D view");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "global_scene", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_global_scene", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_SCENEGLOBAL);
RNA_def_property_ui_text(prop, "Global Scene", "Forces the current Scene to be displayed in all Screens");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "use_large_cursors", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_large_cursors", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "curssize", 0);
RNA_def_property_ui_text(prop, "Large Cursors", "Use large mouse cursors when available");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -1897,7 +1924,7 @@ static void rna_def_userdef_view(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_userdef_update");
/* menus */
- prop= RNA_def_property(srna, "open_mouse_over", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_mouse_over_open", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_MENUOPENAUTO);
RNA_def_property_ui_text(prop, "Open On Mouse Over", "Open menu buttons and pulldowns automatically when the mouse is hovering");
@@ -1922,37 +1949,33 @@ 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);
+ prop= RNA_def_property(srna, "show_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");
- prop= RNA_def_property(srna, "directional_menus", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_directional_menus", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "uiflag", USER_MENUFIXEDORDER);
RNA_def_property_ui_text(prop, "Contents Follow Opening Direction", "Otherwise menus, etc will always be top to bottom, left to right, no matter opening direction");
- prop= RNA_def_property(srna, "global_pivot", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_global_pivot", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_LOCKAROUND);
RNA_def_property_ui_text(prop, "Global Pivot", "Lock the same rotation/scaling pivot in all 3D Views");
- prop= RNA_def_property(srna, "auto_depth", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_mouse_auto_depth", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_ORBIT_ZBUF);
RNA_def_property_ui_text(prop, "Auto Depth", "Use the depth under the mouse to improve view pan/rotate/zoom functionality");
/* view zoom */
- prop= RNA_def_property(srna, "zoom_to_mouse", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_zoom_to_mouse", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_ZOOM_TO_MOUSEPOS);
RNA_def_property_ui_text(prop, "Zoom To Mouse Position", "Zoom in towards the mouse pointer's position in the 3D view, rather than the 2D window center");
/* view rotation */
- prop= RNA_def_property(srna, "auto_perspective", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_auto_perspective", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_AUTOPERSP);
RNA_def_property_ui_text(prop, "Auto Perspective", "Automatically switch between orthographic and perspective when changing from top/front/side views");
- prop= RNA_def_property(srna, "rotate_around_selection", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_rotate_around_active", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_ORBIT_SELECTION);
RNA_def_property_ui_text(prop, "Rotate Around Selection", "Use selection as the pivot point");
@@ -1974,20 +1997,6 @@ static void rna_def_userdef_view(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Mini Axis Brightness", "The brightness of the icon");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- /* middle mouse button */
- prop= RNA_def_property(srna, "use_middle_mouse_paste", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_MMB_PASTE);
- RNA_def_property_ui_text(prop, "Middle Mouse Paste", "In text window, paste with middle mouse button instead of panning");
-
- prop= RNA_def_property(srna, "wheel_invert_zoom", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_WHEELZOOMDIR);
- RNA_def_property_ui_text(prop, "Wheel Invert Zoom", "Swap the Mouse Wheel zoom direction");
-
- prop= RNA_def_property(srna, "wheel_scroll_lines", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "wheellinescroll");
- RNA_def_property_range(prop, 0, 32);
- RNA_def_property_ui_text(prop, "Wheel Scroll Lines", "The number of lines scrolled at a time with the mouse wheel");
-
prop= RNA_def_property(srna, "smooth_view", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "smooth_viewtx");
RNA_def_property_range(prop, 0, 1000);
@@ -1999,7 +2008,7 @@ static void rna_def_userdef_view(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Rotation Angle", "The rotation step for numerical pad keys (2 4 6 8)");
/* 3D transform widget */
- prop= RNA_def_property(srna, "use_manipulator", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_manipulator", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "tw_flag", 1);
RNA_def_property_ui_text(prop, "Manipulator", "Use 3D transform manipulator");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -2028,7 +2037,7 @@ static void rna_def_userdef_view(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_userdef_update");
/* View2D Grid Displays */
- prop= RNA_def_property(srna, "view2d_grid_minimum_spacing", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "view2d_grid_spacing_min", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "v2d_min_gridsize");
RNA_def_property_range(prop, 1, 500); // XXX: perhaps the lower range should only go down to 5?
RNA_def_property_ui_text(prop, "2D View Minimum Grid Spacing", "Minimum number of pixels between each gridline in 2D Viewports");
@@ -2059,8 +2068,8 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
{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);
@@ -2078,13 +2087,13 @@ 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);
+ prop= RNA_def_property(srna, "use_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);
+ prop= RNA_def_property(srna, "use_drag_immediately", PROP_BOOLEAN, PROP_NONE);
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");
@@ -2099,43 +2108,31 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
RNA_def_property_range(prop, 0, 32767);
RNA_def_property_ui_text(prop, "Undo Memory Size", "Maximum memory usage in megabytes (0 means unlimited)");
- prop= RNA_def_property(srna, "global_undo", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_global_undo", PROP_BOOLEAN, PROP_NONE);
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);
RNA_def_property_enum_funcs(prop, "rna_userdef_autokeymode_get", "rna_userdef_autokeymode_set", NULL);
RNA_def_property_ui_text(prop, "Auto Keying Mode", "Mode of automatic keyframe insertion for Objects and Bones");
- prop= RNA_def_property(srna, "auto_keyframe_insert_available", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_keyframe_insert_available", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "autokey_flag", AUTOKEY_FLAG_INSERTAVAIL);
RNA_def_property_ui_text(prop, "Auto Keyframe Insert Available", "Automatic keyframe insertion in available curves");
- prop= RNA_def_property(srna, "auto_keyframe_insert_keyingset", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_keyframe_insert_keyingset", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "autokey_flag", AUTOKEY_FLAG_ONLYKEYINGSET);
RNA_def_property_ui_text(prop, "Auto Keyframe Insert Keying Set", "Automatic keyframe insertion using active Keying Set");
/* keyframing settings */
- prop= RNA_def_property(srna, "keyframe_insert_needed", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_keyframe_insert_needed", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "autokey_flag", AUTOKEY_FLAG_INSERTNEEDED);
RNA_def_property_ui_text(prop, "Keyframe Insert Needed", "Keyframe insertion only when keyframe needed");
@@ -2143,7 +2140,7 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "autokey_flag", AUTOKEY_FLAG_AUTOMATKEY);
RNA_def_property_ui_text(prop, "Visual Keying", "Use Visual keying automatically for constrained objects");
- prop= RNA_def_property(srna, "insertkey_xyz_to_rgb", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_insertkey_xyz_to_rgb", PROP_BOOLEAN, PROP_NONE);
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");
@@ -2173,11 +2170,11 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
RNA_def_property_range(prop, 0, 100);
RNA_def_property_ui_text(prop, "Grease Pencil Euclidean Distance", "Distance moved by mouse when drawing stroke (in pixels) to include");
- prop= RNA_def_property(srna, "grease_pencil_smooth_stroke", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_grease_pencil_smooth_stroke", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gp_settings", GP_PAINT_DOSMOOTH);
RNA_def_property_ui_text(prop, "Grease Pencil Smooth Stroke", "Smooth the final stroke");
- prop= RNA_def_property(srna, "grease_pencil_simplify_stroke", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_grease_pencil_simplify_stroke", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gp_settings", GP_PAINT_DOSIMPLIFY);
RNA_def_property_ui_text(prop, "Grease Pencil Simplify Stroke", "Simplify the final stroke");
@@ -2185,54 +2182,61 @@ 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_color", 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");
+
/* duplication linking */
- prop= RNA_def_property(srna, "duplicate_mesh", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_duplicate_mesh", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_MESH);
RNA_def_property_ui_text(prop, "Duplicate Mesh", "Causes mesh data to be duplicated with the object");
- prop= RNA_def_property(srna, "duplicate_surface", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_duplicate_surface", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_SURF);
RNA_def_property_ui_text(prop, "Duplicate Surface", "Causes surface data to be duplicated with the object");
- prop= RNA_def_property(srna, "duplicate_curve", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_duplicate_curve", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_CURVE);
RNA_def_property_ui_text(prop, "Duplicate Curve", "Causes curve data to be duplicated with the object");
- prop= RNA_def_property(srna, "duplicate_text", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_duplicate_text", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_FONT);
RNA_def_property_ui_text(prop, "Duplicate Text", "Causes text data to be duplicated with the object");
- prop= RNA_def_property(srna, "duplicate_metaball", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_duplicate_metaball", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_MBALL);
RNA_def_property_ui_text(prop, "Duplicate Metaball", "Causes metaball data to be duplicated with the object");
- prop= RNA_def_property(srna, "duplicate_armature", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_duplicate_armature", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_ARM);
RNA_def_property_ui_text(prop, "Duplicate Armature", "Causes armature data to be duplicated with the object");
- prop= RNA_def_property(srna, "duplicate_lamp", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_duplicate_lamp", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_LAMP);
RNA_def_property_ui_text(prop, "Duplicate Lamp", "Causes lamp data to be duplicated with the object");
- prop= RNA_def_property(srna, "duplicate_material", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_duplicate_material", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_MAT);
RNA_def_property_ui_text(prop, "Duplicate Material", "Causes material data to be duplicated with the object");
- prop= RNA_def_property(srna, "duplicate_texture", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_duplicate_texture", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_TEX);
RNA_def_property_ui_text(prop, "Duplicate Texture", "Causes texture data to be duplicated with the object");
// xxx
- prop= RNA_def_property(srna, "duplicate_fcurve", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_duplicate_fcurve", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_IPO);
RNA_def_property_ui_text(prop, "Duplicate F-Curve", "Causes F-curve data to be duplicated with the object");
// xxx
- prop= RNA_def_property(srna, "duplicate_action", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_duplicate_action", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_ACT);
RNA_def_property_ui_text(prop, "Duplicate Action", "Causes actions to be duplicated with the object");
- prop= RNA_def_property(srna, "duplicate_particle", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_duplicate_particle", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_PSYS);
RNA_def_property_ui_text(prop, "Duplicate Particle", "Causes particle systems to be duplicated with the object");
}
@@ -2356,7 +2360,7 @@ static void rna_def_userdef_system(BlenderRNA *brna)
/* Language */
- prop= RNA_def_property(srna, "international_fonts", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_international_fonts", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "transopts", USER_DOTRANSLATE);
RNA_def_property_ui_text(prop, "International Fonts", "Use international fonts");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -2372,6 +2376,11 @@ static void rna_def_userdef_system(BlenderRNA *brna)
RNA_def_property_range(prop, 32, 32768);
RNA_def_property_ui_text(prop, "Scrollback", "Maximum number of lines to store for the console buffer");
+ prop= RNA_def_property(srna, "author", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "author");
+ RNA_def_property_string_maxlength(prop, 80);
+ RNA_def_property_ui_text(prop, "Author", "Name that will be used in exported files when format supports such feature");
+
/* Language Selection */
prop= RNA_def_property(srna, "language", PROP_ENUM, PROP_NONE);
@@ -2379,17 +2388,17 @@ static void rna_def_userdef_system(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Language", "Language use for translation");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "translate_tooltips", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_translate_tooltips", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "transopts", USER_TR_TOOLTIPS);
RNA_def_property_ui_text(prop, "Translate Tooltips", "Translate Tooltips");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "translate_buttons", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_translate_buttons", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "transopts", USER_TR_BUTTONS);
RNA_def_property_ui_text(prop, "Translate Buttons", "Translate button labels");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "translate_toolbox", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_translate_toolbox", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "transopts", USER_TR_MENUS);
RNA_def_property_ui_text(prop, "Translate Toolbox", "Translate toolbox menu");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -2423,16 +2432,16 @@ static void rna_def_userdef_system(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "color_picker_type");
RNA_def_property_ui_text(prop, "Color Picker Type", "Different styles of displaying the color picker widget");
- prop= RNA_def_property(srna, "enable_all_codecs", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_preview_images", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_ALLWINCODECS);
RNA_def_property_ui_text(prop, "Enable All Codecs", "Enables automatic saving of preview images in the .blend file (Windows only)");
- prop= RNA_def_property(srna, "auto_execute_scripts", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_scripts_auto_execute", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", USER_SCRIPT_AUTOEXEC_DISABLE);
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);
+ prop= RNA_def_property(srna, "use_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");
@@ -2445,13 +2454,14 @@ static void rna_def_userdef_system(BlenderRNA *brna)
RNA_def_property_int_sdna(prop, NULL, "memcachelimit");
RNA_def_property_range(prop, 0, (sizeof(void *) ==8)? 1024*16: 1024); /* 32 bit 2 GB, 64 bit 16 GB */
RNA_def_property_ui_text(prop, "Memory Cache Limit", "Memory cache limit in sequencer (megabytes)");
+ RNA_def_property_update(prop, 0, "rna_Userdef_memcache_update");
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);
+ prop= RNA_def_property(srna, "gl_clip_alpha", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "glalphaclip");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Clip Alpha", "Clip alpha below this threshold in the 3D textured view");
@@ -2462,7 +2472,7 @@ static void rna_def_userdef_system(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Mipmaps", "Scale textures for the 3D View (looks nicer but uses more memory and slows image reloading)");
RNA_def_property_update(prop, 0, "rna_userdef_mipmap_update");
- prop= RNA_def_property(srna, "use_vbos", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_vertex_buffer_objects", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "gameflags", USER_DISABLE_VBO);
RNA_def_property_ui_text(prop, "VBOs", "Use Vertex Buffer Objects (or Vertex Arrays, if unsupported) for viewport rendering");
@@ -2580,26 +2590,26 @@ static void rna_def_userdef_input(BlenderRNA *brna)
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, "zoom_style", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "view_zoom_method", 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, "Zoom Style", "Which style to use for viewport scaling");
- prop= RNA_def_property(srna, "zoom_axis", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "view_zoom_axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "uiflag");
RNA_def_property_enum_items(prop, view_zoom_axes);
RNA_def_property_ui_text(prop, "Zoom Axis", "Axis of mouse movement to zoom in or out on");
- prop= RNA_def_property(srna, "invert_zoom_direction", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "invert_mouse_wheel_zoom", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_ZOOM_INVERT);
RNA_def_property_ui_text(prop, "Invert Zoom Direction", "Invert the axis of mouse movement for zooming");
- prop= RNA_def_property(srna, "view_rotation", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "view_rotate_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
RNA_def_property_enum_items(prop, view_rotation_items);
RNA_def_property_ui_text(prop, "View Rotation", "Rotation style in the viewport");
- prop= RNA_def_property(srna, "continuous_mouse", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_mouse_continuous", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_CONTINUOUS_MOUSE);
RNA_def_property_ui_text(prop, "Continuous Grab", "Allow moving the mouse outside the view on some manipulations (transform, ui control drag)");
@@ -2613,18 +2623,38 @@ static void rna_def_userdef_input(BlenderRNA *brna)
RNA_def_property_range(prop, 0, 200);
RNA_def_property_ui_text(prop, "NDof Rotation Speed", "The overall rotation speed of an NDOF device, as percent of standard");
- prop= RNA_def_property(srna, "double_click_time", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "mouse_double_click_time", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "dbl_click_time");
RNA_def_property_range(prop, 1, 1000);
RNA_def_property_ui_text(prop, "Double Click Timeout", "The time (in ms) for a double click");
- prop= RNA_def_property(srna, "emulate_3_button_mouse", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_mouse_emulate_3_button", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_TWOBUTTONMOUSE);
- 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);
+ prop= RNA_def_property(srna, "use_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)");
+
+ /* middle mouse button */
+ prop= RNA_def_property(srna, "use_mouse_mmb_paste", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_MMB_PASTE);
+ RNA_def_property_ui_text(prop, "Middle Mouse Paste", "In text window, paste with middle mouse button instead of panning");
+
+ prop= RNA_def_property(srna, "invert_zoom_wheel", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_WHEELZOOMDIR);
+ RNA_def_property_ui_text(prop, "Wheel Invert Zoom", "Swap the Mouse Wheel zoom direction");
+
+ prop= RNA_def_property(srna, "wheel_scroll_lines", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "wheellinescroll");
+ RNA_def_property_range(prop, 0, 32);
+ RNA_def_property_ui_text(prop, "Wheel Scroll Lines", "The number of lines scrolled at a time with the mouse wheel");
+
+ /* 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)
@@ -2647,11 +2677,11 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
RNA_def_struct_nested(brna, srna, "UserPreferences");
RNA_def_struct_ui_text(srna, "File Paths", "Default paths for external files");
- prop= RNA_def_property(srna, "hide_dot_files_datablocks", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_hidden_files_datablocks", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_HIDE_DOT);
RNA_def_property_ui_text(prop, "Hide Dot Files/Datablocks", "Hide files/datablocks that start with a dot(.*)");
- prop= RNA_def_property(srna, "filter_file_extensions", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_filter_files", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_FILTERFILEEXTS);
RNA_def_property_ui_text(prop, "Filter File Extensions", "Display only files with extensions in the image select window");
@@ -2659,19 +2689,19 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_RELPATHS);
RNA_def_property_ui_text(prop, "Relative Paths", "Default relative path option for the file selector");
- prop= RNA_def_property(srna, "compress_file", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_file_compression", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_FILECOMPRESS);
RNA_def_property_ui_text(prop, "Compress File", "Enable file compression when saving .blend files");
- prop= RNA_def_property(srna, "load_ui", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_load_ui", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", USER_FILENOUI);
RNA_def_property_ui_text(prop, "Load UI", "Load user interface setup when loading .blend files");
- prop= RNA_def_property(srna, "fonts_directory", PROP_STRING, PROP_DIRPATH);
+ prop= RNA_def_property(srna, "font_directory", PROP_STRING, PROP_DIRPATH);
RNA_def_property_string_sdna(prop, NULL, "fontdir");
RNA_def_property_ui_text(prop, "Fonts Directory", "The default directory to search for loading fonts");
- prop= RNA_def_property(srna, "textures_directory", PROP_STRING, PROP_DIRPATH);
+ prop= RNA_def_property(srna, "texture_directory", PROP_STRING, PROP_DIRPATH);
RNA_def_property_string_sdna(prop, NULL, "textudir");
RNA_def_property_ui_text(prop, "Textures Directory", "The default directory to search for textures");
@@ -2687,11 +2717,11 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
RNA_def_property_string_sdna(prop, NULL, "renderdir");
RNA_def_property_ui_text(prop, "Render Output Directory", "The default directory for rendering output");
- prop= RNA_def_property(srna, "python_scripts_directory", PROP_STRING, PROP_DIRPATH);
+ prop= RNA_def_property(srna, "script_directory", PROP_STRING, PROP_DIRPATH);
RNA_def_property_string_sdna(prop, NULL, "pythondir");
RNA_def_property_ui_text(prop, "Python Scripts Directory", "The default directory to search for Python scripts (resets python module search path: sys.path)");
- prop= RNA_def_property(srna, "sounds_directory", PROP_STRING, PROP_DIRPATH);
+ prop= RNA_def_property(srna, "sound_directory", PROP_STRING, PROP_DIRPATH);
RNA_def_property_string_sdna(prop, NULL, "sounddir");
RNA_def_property_ui_text(prop, "Sounds Directory", "The default directory to search for sounds");
@@ -2721,7 +2751,7 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
RNA_def_property_range(prop, 0, 32);
RNA_def_property_ui_text(prop, "Save Versions", "The number of old versions to maintain in the current directory, when manually saving");
- prop= RNA_def_property(srna, "auto_save_temporary_files", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_auto_save_temporary_files", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_AUTOSAVE);
RNA_def_property_ui_text(prop, "Auto Save Temporary Files", "Automatic saving of temporary files");
RNA_def_property_update(prop, 0, "rna_userdef_autosave_update");
@@ -2736,7 +2766,7 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
RNA_def_property_range(prop, 0, 30);
RNA_def_property_ui_text(prop, "Recent Files", "Maximum number of recently opened files to remember");
- prop= RNA_def_property(srna, "save_preview_images", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_save_preview_images", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_SAVE_PREVIEWS);
RNA_def_property_ui_text(prop, "Save Preview Images", "Enables automatic saving of preview images in the .blend file");
}
@@ -2762,7 +2792,7 @@ void rna_def_userdef_addon_collection(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_flag(func, FUNC_NO_SELF);
RNA_def_function_ui_description(func, "Remove addon.");
parm= RNA_def_pointer(func, "addon", "Addon", "", "Addon to remove.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
void RNA_def_userdef(BlenderRNA *brna)
@@ -2798,7 +2828,7 @@ void RNA_def_userdef(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "Theme");
RNA_def_property_ui_text(prop, "Themes", "");
- prop= RNA_def_property(srna, "uistyles", PROP_COLLECTION, PROP_NONE);
+ prop= RNA_def_property(srna, "ui_styles", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "uistyles", NULL);
RNA_def_property_struct_type(prop, "ThemeStyle");
RNA_def_property_ui_text(prop, "Styles", "");
@@ -2814,31 +2844,31 @@ void RNA_def_userdef(BlenderRNA *brna)
prop= RNA_def_property(srna, "view", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "UserPreferencesView");
- RNA_def_property_pointer_funcs(prop, "rna_UserDef_view_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_UserDef_view_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "View & Controls", "Preferences related to viewing data");
prop= RNA_def_property(srna, "edit", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "UserPreferencesEdit");
- RNA_def_property_pointer_funcs(prop, "rna_UserDef_edit_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_UserDef_edit_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Edit Methods", "Settings for interacting with Blender data");
prop= RNA_def_property(srna, "inputs", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "UserPreferencesInput");
- RNA_def_property_pointer_funcs(prop, "rna_UserDef_input_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_UserDef_input_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Inputs", "Settings for input devices");
prop= RNA_def_property(srna, "filepaths", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "UserPreferencesFilePaths");
- RNA_def_property_pointer_funcs(prop, "rna_UserDef_filepaths_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_UserDef_filepaths_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "File Paths", "Default paths for external files");
prop= RNA_def_property(srna, "system", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "UserPreferencesSystem");
- RNA_def_property_pointer_funcs(prop, "rna_UserDef_system_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_UserDef_system_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "System & OpenGL", "Graphics driver and operating system settings");
rna_def_userdef_view(brna);
@@ -2851,4 +2881,3 @@ void RNA_def_userdef(BlenderRNA *brna)
}
#endif
-
diff --git a/source/blender/makesrna/intern/rna_vfont.c b/source/blender/makesrna/intern/rna_vfont.c
index 1f8be906eb3..41387e806b9 100644
--- a/source/blender/makesrna/intern/rna_vfont.c
+++ b/source/blender/makesrna/intern/rna_vfont.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), Juho Vepsäläinen
+ * Contributor(s): Blender Foundation (2008), Juho Vepsäläinen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -44,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 b8d8a5ab790..d13e4f9f616 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -114,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", ""},
@@ -226,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", ""},
@@ -316,7 +324,7 @@ static StructRNA *rna_OperatorProperties_refine(PointerRNA *ptr)
return ptr->type;
}
-static IDProperty *rna_OperatorProperties_idproperties(PointerRNA *ptr, int create)
+static IDProperty *rna_OperatorProperties_idprops(PointerRNA *ptr, int create)
{
if(create && !ptr->data) {
IDPropertyTemplate val = {0};
@@ -353,7 +361,7 @@ static PointerRNA rna_Operator_properties_get(PointerRNA *ptr)
static PointerRNA rna_OperatorTypeMacro_properties_get(PointerRNA *ptr)
{
wmOperatorTypeMacro *otmacro= (wmOperatorTypeMacro*)ptr->data;
- wmOperatorType *ot = WM_operatortype_exists(otmacro->idname);
+ wmOperatorType *ot = WM_operatortype_find(otmacro->idname, TRUE);
return rna_pointer_inherit_refine(ptr, ot->srna, otmacro->properties);
}
@@ -604,6 +612,34 @@ static int rna_wmKeyMapItem_name_length(PointerRNA *ptr)
return 0;
}
+static void rna_wmClipboard_get(PointerRNA *ptr, char *value)
+{
+ char *pbuf;
+
+ pbuf= WM_clipboard_text_get(FALSE);
+ strcpy(value, pbuf);
+
+ MEM_freeN(pbuf);
+}
+
+static int rna_wmClipboard_length(PointerRNA *ptr)
+{
+ char *clipboard;
+ int length;
+
+ clipboard = WM_clipboard_text_get(FALSE);
+ length = (clipboard?strlen(clipboard):0);
+ MEM_freeN(clipboard);
+
+ return length;
+}
+
+static void rna_wmClipboard_set(PointerRNA *ptr, const char *value)
+{
+ WM_clipboard_text_set((void *) value, FALSE);
+}
+
+#ifndef DISABLE_PYTHON
static void rna_Operator_unregister(const bContext *C, StructRNA *type)
{
char *idname;
@@ -739,7 +775,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);
@@ -788,7 +823,7 @@ static StructRNA *rna_Operator_register(const bContext *C, ReportList *reports,
/* check if we have registered this operator type before, and remove it */
{
- wmOperatorType *ot= WM_operatortype_exists(dummyot.idname);
+ wmOperatorType *ot= WM_operatortype_find(dummyot.idname, TRUE);
if(ot && ot->ext.srna)
rna_Operator_unregister(C, ot->ext.srna);
}
@@ -857,7 +892,7 @@ static StructRNA *rna_MacroOperator_register(const bContext *C, ReportList *repo
/* check if we have registered this operator type before, and remove it */
{
- wmOperatorType *ot= WM_operatortype_exists(dummyot.idname);
+ wmOperatorType *ot= WM_operatortype_find(dummyot.idname, TRUE);
if(ot && ot->ext.srna)
rna_Operator_unregister(C, ot->ext.srna);
}
@@ -879,7 +914,7 @@ static StructRNA *rna_MacroOperator_register(const bContext *C, ReportList *repo
return dummyot.ext.srna;
}
-#endif
+#endif /* DISABLE_PYTHON */
static StructRNA* rna_Operator_refine(PointerRNA *opr)
{
@@ -953,7 +988,7 @@ static wmKeyMapItem *rna_KeyMap_add_modal_item(wmKeyMap *km, bContext *C, Report
return WM_modalkeymap_add_item(km, type, value, modifier, keymodifier, propvalue);
}
-#else
+#else /* RNA_RUNTIME */
static void rna_def_operator(BlenderRNA *brna)
{
@@ -972,13 +1007,12 @@ static void rna_def_operator(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_string_funcs(prop, "rna_Operator_name_get", "rna_Operator_name_length", NULL);
RNA_def_property_ui_text(prop, "Name", "");
- RNA_def_struct_name_property(srna, prop);
prop= RNA_def_property(srna, "properties", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "OperatorProperties");
RNA_def_property_ui_text(prop, "Properties", "");
- RNA_def_property_pointer_funcs(prop, "rna_Operator_properties_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Operator_properties_get", NULL, NULL, NULL);
prop= RNA_def_property(srna, "has_reports", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* this is 'virtual' property */
@@ -993,6 +1027,7 @@ static void rna_def_operator(BlenderRNA *brna)
RNA_def_property_string_sdna(prop, NULL, "type->idname");
RNA_def_property_string_maxlength(prop, OP_MAX_TYPENAME); /* else it uses the pointer size! */
RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_struct_name_property(srna, prop);
prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->name");
@@ -1015,7 +1050,7 @@ static void rna_def_operator(BlenderRNA *brna)
srna= RNA_def_struct(brna, "OperatorProperties", NULL);
RNA_def_struct_ui_text(srna, "Operator Properties", "Input properties of an Operator");
RNA_def_struct_refine_func(srna, "rna_OperatorProperties_refine");
- RNA_def_struct_idproperties_func(srna, "rna_OperatorProperties_idproperties");
+ RNA_def_struct_idprops_func(srna, "rna_OperatorProperties_idprops");
}
static void rna_def_macro_operator(BlenderRNA *brna)
@@ -1035,19 +1070,19 @@ static void rna_def_macro_operator(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_string_funcs(prop, "rna_Operator_name_get", "rna_Operator_name_length", NULL);
RNA_def_property_ui_text(prop, "Name", "");
- RNA_def_struct_name_property(srna, prop);
prop= RNA_def_property(srna, "properties", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "OperatorProperties");
RNA_def_property_ui_text(prop, "Properties", "");
- RNA_def_property_pointer_funcs(prop, "rna_Operator_properties_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Operator_properties_get", NULL, NULL, NULL);
/* Registration */
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->idname");
RNA_def_property_string_maxlength(prop, OP_MAX_TYPENAME); /* else it uses the pointer size! */
RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_struct_name_property(srna, prop);
prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->name");
@@ -1087,7 +1122,7 @@ static void rna_def_operator_type_macro(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "OperatorProperties");
RNA_def_property_ui_text(prop, "Properties", "");
- RNA_def_property_pointer_funcs(prop, "rna_OperatorTypeMacro_properties_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_OperatorTypeMacro_properties_get", NULL, NULL, NULL);
}
static void rna_def_operator_utils(BlenderRNA *brna)
@@ -1224,11 +1259,50 @@ static void rna_def_window(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "Screen");
RNA_def_property_ui_text(prop, "Screen", "Active screen showing in the window");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_pointer_funcs(prop, NULL, "rna_Window_screen_set", NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_Window_screen_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
RNA_def_property_update(prop, 0, "rna_Window_screen_update");
}
+/* curve.splines */
+static void rna_def_wm_keyconfigs(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ //FunctionRNA *func;
+ //PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "KeyConfigurations");
+ srna= RNA_def_struct(brna, "KeyConfigurations", NULL);
+ RNA_def_struct_sdna(srna, "wmWindowManager");
+ RNA_def_struct_ui_text(srna, "KeyConfigs", "Collection of KeyConfigs");
+/*
+ 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_NEVER_NULL);
+*/
+ prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "KeyConfig");
+ RNA_def_property_pointer_funcs(prop, "rna_WindowManager_active_keyconfig_get", "rna_WindowManager_active_keyconfig_set", NULL, NULL);
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Active KeyConfig", "Active wm KeyConfig");
+
+ prop= RNA_def_property(srna, "default", PROP_POINTER, PROP_NEVER_NULL);
+ RNA_def_property_pointer_sdna(prop, NULL, "defaultconf");
+ RNA_def_property_struct_type(prop, "KeyConfig");
+ RNA_def_property_ui_text(prop, "Default Key Configuration", "");
+}
+
static void rna_def_windowmanager(BlenderRNA *brna)
{
StructRNA *srna;
@@ -1250,17 +1324,11 @@ static void rna_def_windowmanager(BlenderRNA *brna)
prop= RNA_def_property(srna, "keyconfigs", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "KeyConfig");
RNA_def_property_ui_text(prop, "Key Configurations", "Registered key configurations");
+ rna_def_wm_keyconfigs(brna, prop);
- prop= RNA_def_property(srna, "active_keyconfig", PROP_POINTER, PROP_NEVER_NULL);
- RNA_def_property_struct_type(prop, "KeyConfig");
- RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_pointer_funcs(prop, "rna_WindowManager_active_keyconfig_get", "rna_WindowManager_active_keyconfig_set", 0);
- RNA_def_property_ui_text(prop, "Active Key Configuration", "");
-
- prop= RNA_def_property(srna, "default_keyconfig", PROP_POINTER, PROP_NEVER_NULL);
- RNA_def_property_pointer_sdna(prop, NULL, "defaultconf");
- RNA_def_property_struct_type(prop, "KeyConfig");
- RNA_def_property_ui_text(prop, "Default Key Configuration", "");
+ prop= RNA_def_property(srna, "clipboard", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_funcs(prop, "rna_wmClipboard_get", "rna_wmClipboard_length", "rna_wmClipboard_set");
+ RNA_def_property_ui_text(prop, "Text Clipboard", "");
RNA_api_wm(srna);
}
@@ -1340,15 +1408,11 @@ 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");
- prop= RNA_def_property(srna, "user_defined", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_user_defined", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYCONF_USER);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "User Defined", "Indicates that a keyconfig was defined by the user");
@@ -1383,21 +1447,21 @@ static void rna_def_keyconfig(BlenderRNA *brna)
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);
+ prop= RNA_def_property(srna, "is_user_defined", PROP_BOOLEAN, PROP_NEVER_NULL);
RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYMAP_USER);
RNA_def_property_ui_text(prop, "User Defined", "Keymap is defined by the user");
- prop= RNA_def_property(srna, "modal", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "is_modal", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYMAP_MODAL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Modal Keymap", "Indicates that a keymap is used for translate modal events for an operator");
- prop= RNA_def_property(srna, "items_expanded", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_expanded_items", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYMAP_EXPANDED);
RNA_def_property_ui_text(prop, "Items Expanded", "Expanded in the user interface");
RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1);
- prop= RNA_def_property(srna, "children_expanded", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_expanded_children", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYMAP_CHILDREN_EXPANDED);
RNA_def_property_ui_text(prop, "Children Expanded", "Children expanded in the user interface");
RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1);
@@ -1423,7 +1487,7 @@ static void rna_def_keyconfig(BlenderRNA *brna)
prop= RNA_def_property(srna, "properties", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "OperatorProperties");
- RNA_def_property_pointer_funcs(prop, "rna_KeyMapItem_properties_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_KeyMapItem_properties_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Properties", "Properties to set when the operator is called");
prop= RNA_def_property(srna, "map_type", PROP_ENUM, PROP_NONE);
@@ -1482,7 +1546,7 @@ static void rna_def_keyconfig(BlenderRNA *brna)
RNA_def_property_enum_items(prop, event_type_items);
RNA_def_property_ui_text(prop, "Key Modifier", "Regular key pressed as a modifier");
- prop= RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", KMI_EXPANDED);
RNA_def_property_ui_text(prop, "Expanded", "Show key map event and property details in the user interface");
RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1);
@@ -1514,5 +1578,5 @@ void RNA_def_wm(BlenderRNA *brna)
rna_def_keyconfig(brna);
}
-#endif
+#endif /* RNA_RUNTIME */
diff --git a/source/blender/makesrna/intern/rna_wm_api.c b/source/blender/makesrna/intern/rna_wm_api.c
index 5df35ed4210..0f72cfa8b9d 100644
--- a/source/blender/makesrna/intern/rna_wm_api.c
+++ b/source/blender/makesrna/intern/rna_wm_api.c
@@ -186,7 +186,7 @@ void RNA_api_operator(StructRNA *srna)
/* poll */
func= RNA_def_function(srna, "poll", NULL);
RNA_def_function_ui_description(func, "Test if the operator can be called or not.");
- RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
+ RNA_def_function_flag(func, FUNC_NO_SELF|FUNC_REGISTER_OPTIONAL);
RNA_def_function_return(func, RNA_def_boolean(func, "visible", 1, "", ""));
RNA_def_pointer(func, "context", "Context", "", "");
@@ -246,7 +246,7 @@ void RNA_api_macro(StructRNA *srna)
/* poll */
func= RNA_def_function(srna, "poll", NULL);
RNA_def_function_ui_description(func, "Test if the operator can be called or not.");
- RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
+ RNA_def_function_flag(func, FUNC_NO_SELF|FUNC_REGISTER_OPTIONAL);
RNA_def_function_return(func, RNA_def_boolean(func, "visible", 1, "", ""));
RNA_def_pointer(func, "context", "Context", "", "");
diff --git a/source/blender/makesrna/intern/rna_world.c b/source/blender/makesrna/intern/rna_world.c
index 3b0f53df43b..907042e7453 100644
--- a/source/blender/makesrna/intern/rna_world.c
+++ b/source/blender/makesrna/intern/rna_world.c
@@ -33,6 +33,8 @@
#include "DNA_texture_types.h"
#include "DNA_world_types.h"
+#include "WM_types.h"
+
#ifdef RNA_RUNTIME
#include "MEM_guardedalloc.h"
@@ -42,7 +44,6 @@
#include "BKE_texture.h"
#include "WM_api.h"
-#include "WM_types.h"
static PointerRNA rna_World_lighting_get(PointerRNA *ptr)
{
@@ -118,22 +119,22 @@ static void rna_def_world_mtex(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "World Texture Slot", "Texture slot for textures in a World datablock");
/* map to */
- prop= RNA_def_property(srna, "map_blend", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_blend", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_BLEND);
RNA_def_property_ui_text(prop, "Blend", "Affect the color progression of the background");
RNA_def_property_update(prop, 0, "rna_World_update");
- prop= RNA_def_property(srna, "map_horizon", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_horizon", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_HORIZ);
RNA_def_property_ui_text(prop, "Horizon", "Affect the color of the horizon");
RNA_def_property_update(prop, 0, "rna_World_update");
- prop= RNA_def_property(srna, "map_zenith_up", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_zenith_up", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_ZENUP);
RNA_def_property_ui_text(prop, "Zenith Up", "Affect the color of the zenith above");
RNA_def_property_update(prop, 0, "rna_World_update");
- prop= RNA_def_property(srna, "map_zenith_down", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_map_zenith_down", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_ZENDOWN);
RNA_def_property_ui_text(prop, "Zenith Down", "Affect the color of the zenith below");
RNA_def_property_update(prop, 0, "rna_World_update");
@@ -143,7 +144,7 @@ static void rna_def_world_mtex(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_MIST);
RNA_def_property_ui_text(prop, "Mist", "Causes the texture to affect the intensity of the mist");*/
- prop= RNA_def_property(srna, "texture_coordinates", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "texture_coords", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "texco");
RNA_def_property_enum_items(prop, texco_items);
RNA_def_property_ui_text(prop, "Texture Coordinates", "Texture coordinates used to map the texture onto the background");
@@ -226,21 +227,21 @@ static void rna_def_lighting(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Factor", "Factor for ambient occlusion blending");
RNA_def_property_update(prop, 0, "rna_World_update");
- prop= RNA_def_property(srna, "ao_blend_mode", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "ao_blend_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "aomix");
RNA_def_property_enum_items(prop, blend_mode_items);
RNA_def_property_ui_text(prop, "Blend Mode", "Defines how AO mixes with material shading");
RNA_def_property_update(prop, 0, "rna_World_update");
/* environment lighting */
- prop= RNA_def_property(srna, "use_environment_lighting", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_environment_light", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_ENV_LIGHT);
RNA_def_property_ui_text(prop, "Use Environment Lighting", "Add light coming from the environment");
RNA_def_property_update(prop, 0, "rna_World_update");
prop= RNA_def_property(srna, "environment_energy", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ao_env_energy");
- RNA_def_property_ui_range(prop, 0, FLT_MAX, 0.1, 2);
+ RNA_def_property_ui_range(prop, 0, FLT_MAX, 1, 3);
RNA_def_property_ui_text(prop, "Environment Color", "Defines the strength of environment light");
RNA_def_property_update(prop, 0, "rna_World_update");
@@ -251,7 +252,7 @@ static void rna_def_lighting(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_World_update");
/* indirect lighting */
- prop= RNA_def_property(srna, "use_indirect_lighting", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_indirect_light", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_INDIRECT_LIGHT);
RNA_def_property_ui_text(prop, "Use Indirect Lighting", "Add indirect light bouncing of surrounding objects");
RNA_def_property_update(prop, 0, "rna_World_update");
@@ -310,7 +311,7 @@ static void rna_def_lighting(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Adapt To Speed", "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)");
RNA_def_property_update(prop, 0, "rna_World_update");
- prop= RNA_def_property(srna, "error_tolerance", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "error_threshold", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ao_approx_error");
RNA_def_property_range(prop, 0.0001, 10);
RNA_def_property_ui_text(prop, "Error Tolerance", "Low values are slower and higher quality (for Approximate)");
@@ -323,12 +324,12 @@ static void rna_def_lighting(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Correction", "Ad-hoc correction for over-occlusion due to the approximation (for Approximate)");
RNA_def_property_update(prop, 0, "rna_World_update");
- prop= RNA_def_property(srna, "falloff", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_falloff", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "aomode", WO_AODIST);
RNA_def_property_ui_text(prop, "Falloff", "");
RNA_def_property_update(prop, 0, "rna_World_update");
- prop= RNA_def_property(srna, "pixel_cache", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_cache", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "aomode", WO_AOCACHE);
RNA_def_property_ui_text(prop, "Pixel Cache", "Cache AO results in pixels and interpolate over neighbouring pixels for speedup (for Approximate)");
RNA_def_property_update(prop, 0, "rna_World_update");
@@ -362,9 +363,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);
@@ -410,9 +411,9 @@ 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_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);
@@ -421,7 +422,7 @@ static void rna_def_world_stars(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Size", "Average screen dimension of stars");
RNA_def_property_update(prop, 0, "rna_World_update");
- prop= RNA_def_property(srna, "min_distance", PROP_FLOAT, PROP_DISTANCE);
+ prop= RNA_def_property(srna, "distance_min", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "starmindist");
RNA_def_property_range(prop, 0, 1000);
RNA_def_property_ui_text(prop, "Minimum Distance", "Minimum distance to the camera for stars");
@@ -433,7 +434,7 @@ static void rna_def_world_stars(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Average Separation", "Average distance between any two stars");
RNA_def_property_update(prop, 0, "rna_World_draw_update");
- prop= RNA_def_property(srna, "color_randomization", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "color_random", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "starcolnoise");
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_text(prop, "Color Randomization", "Randomize star colors");
@@ -476,7 +477,11 @@ void RNA_def_world(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "horr");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Horizon Color", "Color at the horizon");
- RNA_def_property_update(prop, 0, "rna_World_update");
+ /* RNA_def_property_update(prop, 0, "rna_World_update"); */
+ /* render-only uses this, the notifier could be made to be more spesific */
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, "rna_World_update");
+
+
prop= RNA_def_property(srna, "zenith_color", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "zenr");
@@ -497,45 +502,45 @@ void RNA_def_world(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Exposure", "Amount of exponential color correction for light");
RNA_def_property_update(prop, 0, "rna_World_update");
- prop= RNA_def_property(srna, "range", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "color_range", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "range");
RNA_def_property_range(prop, 0.2, 5.0);
RNA_def_property_ui_text(prop, "Range", "The color range that will be mapped to 0-1");
RNA_def_property_update(prop, 0, "rna_World_update");
/* sky type */
- prop= RNA_def_property(srna, "blend_sky", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_sky_blend", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "skytype", WO_SKYBLEND);
RNA_def_property_ui_text(prop, "Blend Sky", "Render background with natural progression from horizon to zenith");
RNA_def_property_update(prop, 0, "rna_World_update");
- prop= RNA_def_property(srna, "paper_sky", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_sky_paper", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "skytype", WO_SKYPAPER);
RNA_def_property_ui_text(prop, "Paper Sky", "Flatten blend or texture coordinates");
RNA_def_property_update(prop, 0, "rna_World_update");
- prop= RNA_def_property(srna, "real_sky", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_sky_real", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "skytype", WO_SKYREAL);
RNA_def_property_ui_text(prop, "Real Sky", "Render background with a real horizon, relative to the camera angle");
RNA_def_property_update(prop, 0, "rna_World_update");
/* nested structs */
- prop= RNA_def_property(srna, "lighting", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "light_settings", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "WorldLighting");
- RNA_def_property_pointer_funcs(prop, "rna_World_lighting_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_World_lighting_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Lighting", "World lighting settings");
- prop= RNA_def_property(srna, "mist", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "mist_settings", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "WorldMistSettings");
- RNA_def_property_pointer_funcs(prop, "rna_World_mist_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_World_mist_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Mist", "World mist settings");
- prop= RNA_def_property(srna, "stars", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "star_settings", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "WorldStarsSettings");
- RNA_def_property_pointer_funcs(prop, "rna_World_stars_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_World_stars_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Stars", "World stars settings");
rna_def_lighting(brna);
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..ae17ade36d7
--- /dev/null
+++ b/source/blender/makesrna/rna_cleanup/rna_cleaner.py
@@ -0,0 +1,321 @@
+#! /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]
+
+Geterate output format from blender run this:
+ ./blender.bin --background --python ./release/scripts/modules/rna_info.py 2> source/blender/makesrna/rna_cleanup/out.txt
+"""
+
+
+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, btype):
+ # reminder: props=[comment, changed, bclass, bfrom, bto, kwcheck, btype, description]
+ if btype == "boolean":
+ 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
+ else:
+ return ""
+
+
+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]
+
+ done_text = "+"
+ done = 0
+ tot = 0
+
+ for iii, line in enumerate(file_lines):
+
+ # debug
+ #print(line)
+ line_strip = line.strip()
+ # empty line or comment
+ if not line_strip:
+ continue
+
+ if line_strip == "EOF":
+ break
+
+ if line.startswith("#"):
+ line = line[1:]
+
+ # 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)
+ # make life easy and strip quotes
+ description = description.replace("'", "").replace('"', "").replace("\\", "").strip()
+ except ValueError:
+ [btype, description] = [tail,'NO DESCRIPTION']
+
+ # keyword-check
+ kwcheck = check_prefix(bto, btype)
+
+ # changed
+ changed = check_if_changed(bfrom, bto)
+
+ # lists formatting
+ props=[comment, changed, bclass, bfrom, bto, kwcheck, btype, description]
+ props_list.append(props)
+ props_length_max=list(map(max,zip(props_length_max,list(map(len,props)))))
+
+ if done_text in comment:
+ done += 1
+ tot += 1
+
+ print("Total done %.2f" % (done / tot * 100.0) )
+
+ 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, btype) # keyword-check
+ changed = check_if_changed(bfrom, bto) # changed?
+ description = repr(description)
+ description = description.replace("'", "").replace('"', "").replace("\\", "").strip()
+ 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
+ if sort_priority == "class.to":
+ props_list = sorted(props_list, key=lambda p: (p[2], p[4]))
+ else:
+ 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
+
+ # quick way we can tell if it changed
+ if props[3] == props[4]: txt += "#"
+ else: 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 already 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', 'class.to']
+ default_sort_choice = sort_choices[-1]
+ kw_prefixes = [ 'active','apply','bl','exclude','has','invert','is','lock', \
+ 'pressed','show','show_only','use','use_only','layers','states', 'select']
+ kw = ['active','hide','invert','select','layers','mute','states','use','lock']
+
+ 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_cleaner_merge.py b/source/blender/makesrna/rna_cleanup/rna_cleaner_merge.py
new file mode 100755
index 00000000000..8d2fe07b774
--- /dev/null
+++ b/source/blender/makesrna/rna_cleanup/rna_cleaner_merge.py
@@ -0,0 +1,61 @@
+#! /usr/bin/env python3.1
+
+import sys
+
+'''
+Example usage:
+ python3 rna_cleaner_merge.py out_work.py rna_booleans_work.py
+'''
+def main():
+
+ def work_line_id(line):
+ return line[2].split("|")[-1], line[3] # class/from
+
+
+ if not (sys.argv[-1].endswith(".py") and sys.argv[-2].endswith(".py")):
+ print("Only accepts 2 py files as arguments.")
+
+ sys.path.insert(0, ".")
+
+ mod_from = __import__(sys.argv[-1][:-3])
+ mod_to = __import__(sys.argv[-2][:-3])
+
+ mod_to_dict = dict([(work_line_id(line), line) for line in mod_to.rna_api])
+ mod_from_dict = dict([(work_line_id(line), line) for line in mod_from.rna_api])
+
+ rna_api_new = []
+
+ for key, val_orig in mod_to_dict.items():
+ try:
+ val_new = mod_from_dict.pop(key)
+ except:
+ # print("not found", key)
+ val_new = val_orig
+
+ # always take the class from the base
+ val = list(val_orig)
+ val[0] = val_new[0] # comment
+ val[4] = val_new[4] # -> to
+ val = tuple(val)
+ rna_api_new.append(val)
+
+ def write_work_file(file_path, rna_api):
+ rna_api = list(rna_api)
+ rna_api.sort(key=work_line_id)
+ file_out = open(file_path, "w")
+ file_out.write("rna_api = [\n")
+ for line in rna_api:
+ file_out.write(" %s,\n" % (repr(line)))
+ file_out.write("]\n")
+ file_out.close()
+
+ file_path = sys.argv[-2][:-3] + "_merged.py"
+ write_work_file(file_path, rna_api_new)
+
+ if mod_from_dict:
+ file_path = sys.argv[-2][:-3] + "_lost.py"
+ write_work_file(file_path, list(mod_from_dict.values()))
+ print("Warning '%s' contains lost %d items from module %s.py" % (file_path, len(mod_from_dict), mod_from.__name__))
+
+if __name__ == "__main__":
+ 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..92adbf4373e
--- /dev/null
+++ b/source/blender/makesrna/rna_cleanup/rna_properties.txt
@@ -0,0 +1,4605 @@
+ NOTE * CLASS.FROM -> TO: TYPE "DESCRIPTION"
+#+ * ActionGroup.channels -> channels: collection, "(read-only) F-Curves in this group"
+#+ * ActionGroup.custom_color -> custom_color: int "Index of custom color set"
+#+ * ActionGroup.lock -> lock: boolean "Action Group is locked"
+#+ * ActionGroup.name -> name: string "NO DESCRIPTION"
+#+ * ActionGroup.select -> select: boolean "Action Group is selected"
+#ActionGroup.show_expanded -> show_expanded: boolean "Action Group is expanded"
+#+ * Actuator.name -> name: string "NO DESCRIPTION"
+#Actuator.pin -> pin: boolean "Display when not linked to a visible states controller"
+#Actuator.show_expanded -> show_expanded: boolean "Set actuator expanded in the user interface"
+#+ * Actuator.type -> type: enum "NO DESCRIPTION"
+#+ * Actuator|ActionActuator.action -> action: pointer "NO DESCRIPTION"
+#Actuator|ActionActuator.frame_blend_in -> frame_blend_in: int "Number of frames of motion blending"
+#+ * Actuator|ActionActuator.frame_end -> frame_end: int "NO DESCRIPTION"
+#+ * Actuator|ActionActuator.frame_property -> frame_property: string "Assign the actions current frame number to this property"
+#+ * Actuator|ActionActuator.frame_start -> frame_start: int "NO DESCRIPTION"
+#Actuator|ActionActuator.play_mode -> play_mode: enum "Action playback type"
+#+ * Actuator|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"
+#+ * Actuator|ActionActuator.property -> property: string "Use this property to define the Action position"
+#Actuator|ActionActuator.use_continue_last_frame -> use_continue_last_frame: boolean "Restore last frame when switching on/off, otherwise play from the start each time"
+#+ * Actuator|ArmatureActuator.bone -> bone: string "Bone on which the constraint is defined"
+#+ * Actuator|ArmatureActuator.constraint -> constraint: string "Name of the constraint you want to control"
+#+ * Actuator|ArmatureActuator.mode -> mode: enum "NO DESCRIPTION"
+#+ * Actuator|ArmatureActuator.secondary_target -> secondary_target: pointer "Set weight of this constraint"
+#+ * Actuator|ArmatureActuator.target -> target: pointer "Set this object as the target of the constraint"
+#+ * Actuator|ArmatureActuator.weight -> weight: float "Set weight of this constraint"
+#+ * Actuator|CameraActuator.axis -> axis: enum "Specify the axis the Camera will try to get behind"
+#+ * Actuator|CameraActuator.height -> height: float "NO DESCRIPTION"
+#+ * Actuator|CameraActuator.max -> max: float "NO DESCRIPTION"
+#+ * Actuator|CameraActuator.min -> min: float "NO DESCRIPTION"
+#+ * Actuator|CameraActuator.object -> object: pointer "Look at this Object"
+#Actuator|ConstraintActuator.angle_max -> 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"
+#Actuator|ConstraintActuator.angle_min -> 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"
+#+ * Actuator|ConstraintActuator.damping -> damping: int "Damping factor: time constant (in frame) of low pass filter"
+#+ * Actuator|ConstraintActuator.damping_rotation -> damping_rotation: int "Use a different damping for orientation"
+#+ * Actuator|ConstraintActuator.direction -> direction: enum "Set the direction of the ray"
+#+ * Actuator|ConstraintActuator.direction_axis -> direction_axis: enum "Select the axis to be aligned along the reference direction"
+#+ * Actuator|ConstraintActuator.distance -> distance: float "Set the maximum length of ray"
+#+ * Actuator|ConstraintActuator.fh_damping -> fh_damping: float "Damping factor of the Fh spring force"
+#+ * Actuator|ConstraintActuator.fh_height -> fh_height: float "Height of the Fh area"
+#+ * Actuator|ConstraintActuator.limit -> limit: enum "NO DESCRIPTION"
+#+ * Actuator|ConstraintActuator.limit_max -> limit_max: float "NO DESCRIPTION"
+#+ * Actuator|ConstraintActuator.limit_min -> limit_min: float "NO DESCRIPTION"
+#+ * Actuator|ConstraintActuator.material -> material: string "Ray detects only Objects with this material"
+#+ * Actuator|ConstraintActuator.mode -> mode: enum "The type of the constraint"
+#+ * Actuator|ConstraintActuator.property -> property: string "Ray detect only Objects with this property"
+#+ * Actuator|ConstraintActuator.range -> range: float "Set the maximum length of ray"
+#Actuator|ConstraintActuator.rotation_max -> rotation_max: float[3] "Reference Direction"
+#+ * Actuator|ConstraintActuator.spring -> spring: float "Spring force within the Fh area"
+#+ * Actuator|ConstraintActuator.time -> time: int "Maximum activation time in frame, 0 for unlimited"
+#Actuator|ConstraintActuator.use_fh_normal -> use_fh_normal: boolean "Add a horizontal spring force on slopes"
+#Actuator|ConstraintActuator.use_fh_paralel_axis -> use_fh_paralel_axis: boolean "Keep object axis parallel to normal"
+#Actuator|ConstraintActuator.use_force_distance -> use_force_distance: boolean "Force distance of object to point of impact of ray"
+#Actuator|ConstraintActuator.use_local -> use_local: boolean "Set ray along objects axis or global axis"
+#Actuator|ConstraintActuator.use_material_detect -> use_material_detect: boolean "Detect material instead of property"
+#Actuator|ConstraintActuator.use_normal -> use_normal: boolean "Set object axis along (local axis) or parallel (global axis) to the normal at hit position"
+#Actuator|ConstraintActuator.use_persistent -> use_persistent: boolean "Persistent actuator: stays active even if ray does not reach target"
+#+ * Actuator|EditObjectActuator.angular_velocity -> angular_velocity: float[3] "Angular velocity upon creation"
+#+ * Actuator|EditObjectActuator.dynamic_operation -> dynamic_operation: enum "NO DESCRIPTION"
+#+ * Actuator|EditObjectActuator.linear_velocity -> linear_velocity: float[3] "Velocity upon creation"
+#+ * Actuator|EditObjectActuator.mass -> mass: float "The mass of the object"
+#+ * Actuator|EditObjectActuator.mesh -> mesh: pointer "Replace the existing, when left blank Phys will remake the existing physics mesh"
+#+ * Actuator|EditObjectActuator.mode -> mode: enum "The mode of the actuator"
+#+ * Actuator|EditObjectActuator.object -> object: pointer "Add this Object and all its children (cant be on an visible layer)"
+#+ * Actuator|EditObjectActuator.time -> time: int "Duration the new Object lives or the track takes"
+#+ * Actuator|EditObjectActuator.track_object -> track_object: pointer "Track to this Object"
+#Actuator|EditObjectActuator.use_3d_tracking -> use_3d_tracking: boolean "Enable 3D tracking"
+#Actuator|EditObjectActuator.use_local_angular_velocity -> use_local_angular_velocity: boolean "Apply the rotation locally"
+#Actuator|EditObjectActuator.use_local_linear_velocity -> use_local_linear_velocity: boolean "Apply the transformation locally"
+#Actuator|EditObjectActuator.use_replace_display_mesh -> use_replace_display_mesh: boolean "Replace the display mesh"
+#Actuator|EditObjectActuator.use_replace_physics_mesh -> use_replace_physics_mesh: boolean "Replace the physics mesh (triangle bounds only - compound shapes not supported)"
+#Actuator|FCurveActuator.apply_to_children -> apply_to_children: boolean "Update F-Curve on all children Objects as well"
+#Actuator|FCurveActuator.frame_end -> frame_end: int "NO DESCRIPTION"
+#Actuator|FCurveActuator.frame_property -> frame_property: string "Assign the actions current frame number to this property"
+#Actuator|FCurveActuator.frame_start -> frame_start: int "NO DESCRIPTION"
+#Actuator|FCurveActuator.play_type -> play_type: enum "Specify the way you want to play the animation"
+#Actuator|FCurveActuator.property -> property: string "Use this property to define the F-Curve position"
+#Actuator|FCurveActuator.use_additive -> use_additive: boolean "F-Curve is added to the current loc/rot/scale in global or local coordinate according to Local flag"
+#Actuator|FCurveActuator.use_force -> use_force: boolean "Apply F-Curve as a global or local force depending on the local option (dynamic objects only)"
+#Actuator|FCurveActuator.use_local -> use_local: boolean "Let the F-Curve act in local coordinates, used in Force and Add mode"
+#+ * Actuator|Filter2DActuator.filter_pass -> filter_pass: int "Set filter order"
+#+ * Actuator|Filter2DActuator.glsl_shader -> glsl_shader: pointer "NO DESCRIPTION"
+#+ * Actuator|Filter2DActuator.mode -> mode: enum "NO DESCRIPTION"
+#+ * Actuator|Filter2DActuator.motion_blur_factor -> motion_blur_factor: float "Set motion blur factor"
+#Actuator|Filter2DActuator.use_motion_blur -> use_motion_blur: boolean "Enable/Disable Motion Blur"
+#+ * Actuator|GameActuator.filename -> filename: string "Load this blend file, use the // prefix for a path relative to the current blend file"
+#+ * Actuator|GameActuator.mode -> mode: enum "NO DESCRIPTION"
+#+ * Actuator|MessageActuator.body_message -> body_message: string "Optional message body Text"
+#+ * Actuator|MessageActuator.body_property -> body_property: string "The message body will be set by the Property Value"
+#+ * Actuator|MessageActuator.body_type -> body_type: enum "Toggle message type: either Text or a PropertyName"
+#+ * Actuator|MessageActuator.subject -> subject: string "Optional message subject. This is what can be filtered on"
+#+ * Actuator|MessageActuator.to_property -> to_property: string "Optional send message to objects with this name only, or empty to broadcast"
+#+ * Actuator|ObjectActuator.angular_velocity -> angular_velocity: float[3] "Sets the angular velocity"
+#+ * Actuator|ObjectActuator.damping -> damping: int "Number of frames to reach the target velocity"
+#+ * Actuator|ObjectActuator.derivate_coefficient -> derivate_coefficient: float "Not required, high values can cause instability"
+#+ * Actuator|ObjectActuator.force -> force: float[3] "Sets the force"
+#+ * Actuator|ObjectActuator.force_max_x -> force_max_x: float "Set the upper limit for force"
+#+ * Actuator|ObjectActuator.force_max_y -> force_max_y: float "Set the upper limit for force"
+#+ * Actuator|ObjectActuator.force_max_z -> force_max_z: float "Set the upper limit for force"
+#+ * Actuator|ObjectActuator.force_min_x -> force_min_x: float "Set the lower limit for force"
+#+ * Actuator|ObjectActuator.force_min_y -> force_min_y: float "Set the lower limit for force"
+#+ * Actuator|ObjectActuator.force_min_z -> force_min_z: float "Set the lower limit for force"
+#+ * Actuator|ObjectActuator.integral_coefficient -> integral_coefficient: float "Low value (0.01) for slow response, high value (0.5) for fast response"
+#+ * Actuator|ObjectActuator.linear_velocity -> linear_velocity: float[3] "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)"
+#+ * Actuator|ObjectActuator.mode -> mode: enum "Specify the motion system"
+#Actuator|ObjectActuator.offset_location -> offset_location: float[3] "Sets the location"
+#Actuator|ObjectActuator.offset_rotation -> offset_rotation: float[3] "Sets the rotation"
+#+ * Actuator|ObjectActuator.proportional_coefficient -> proportional_coefficient: float "Typical value is 60x integral coefficient"
+#+ * Actuator|ObjectActuator.reference_object -> reference_object: pointer "Reference object for velocity calculation, leave empty for world reference"
+#+ * Actuator|ObjectActuator.torque -> torque: float[3] "Sets the torque"
+#Actuator|ObjectActuator.use_add_linear_velocity -> use_add_linear_velocity: boolean "Toggles between ADD and SET linV"
+#Actuator|ObjectActuator.use_local_angular_velocity -> use_local_angular_velocity: boolean "Angular velocity is defined in local coordinates"
+#Actuator|ObjectActuator.use_local_force -> use_local_force: boolean "Force is defined in local coordinates"
+#Actuator|ObjectActuator.use_local_linear_velocity -> use_local_linear_velocity: boolean "Velocity is defined in local coordinates"
+#Actuator|ObjectActuator.use_local_location -> use_local_location: boolean "Location is defined in local coordinates"
+#Actuator|ObjectActuator.use_local_rotation -> use_local_rotation: boolean "Rotation is defined in local coordinates"
+#Actuator|ObjectActuator.use_local_torque -> use_local_torque: boolean "Torque is defined in local coordinates"
+#Actuator|ObjectActuator.use_servo_limit_x -> use_servo_limit_x: boolean "Set limit to force along the X axis"
+#Actuator|ObjectActuator.use_servo_limit_y -> use_servo_limit_y: boolean "Set limit to force along the Y axis"
+#Actuator|ObjectActuator.use_servo_limit_z -> use_servo_limit_z: boolean "Set limit to force along the Z axis"
+#+ * Actuator|ParentActuator.mode -> mode: enum "NO DESCRIPTION"
+#+ * Actuator|ParentActuator.object -> object: pointer "Set this object as parent"
+#Actuator|ParentActuator.use_compound -> use_compound: boolean "Add this object shape to the parent shape (only if the parent shape is already compound)"
+#Actuator|ParentActuator.use_ghost -> use_ghost: boolean "Make this object ghost while parented (only if not compound)"
+#+ * Actuator|PropertyActuator.mode -> mode: enum "NO DESCRIPTION"
+#+ * Actuator|PropertyActuator.object -> object: pointer "Copy from this Object"
+#+ * Actuator|PropertyActuator.object_property -> object_property: string "Copy this property"
+#+ * Actuator|PropertyActuator.property -> property: string "The name of the property"
+#+ * Actuator|PropertyActuator.value -> value: string "The value to use, use around strings"
+#+ * Actuator|RandomActuator.chance -> chance: float "Pick a number between 0 and 1. Success if you stay below this value"
+#+ * Actuator|RandomActuator.distribution -> distribution: enum "Choose the type of distribution"
+#+ * Actuator|RandomActuator.float_max -> float_max: float "Choose a number from a range. Upper boundary of the range"
+#+ * Actuator|RandomActuator.float_mean -> float_mean: float "A normal distribution. Mean of the distribution"
+#+ * Actuator|RandomActuator.float_min -> float_min: float "Choose a number from a range. Lower boundary of the range"
+#+ * Actuator|RandomActuator.float_value -> float_value: float "Always return this number"
+#+ * Actuator|RandomActuator.half_life_time -> half_life_time: float "Negative exponential dropoff"
+#+ * Actuator|RandomActuator.int_max -> int_max: int "Choose a number from a range. Upper boundary of the range"
+#+ * Actuator|RandomActuator.int_mean -> int_mean: float "Expected mean value of the distribution"
+#+ * Actuator|RandomActuator.int_min -> int_min: int "Choose a number from a range. Lower boundary of the range"
+#+ * Actuator|RandomActuator.int_value -> int_value: int "Always return this number"
+#+ * Actuator|RandomActuator.property -> property: string "Assign the random value to this property"
+#+ * Actuator|RandomActuator.seed -> seed: int "Initial seed of the random generator. Use Python for more freedom (choose 0 for not random)"
+#+ * Actuator|RandomActuator.standard_derivation -> standard_derivation: float "A normal distribution. Standard deviation of the distribution"
+#Actuator|RandomActuator.use_always_true -> use_always_true: boolean "Always false or always true"
+#+ * Actuator|SceneActuator.camera -> camera: pointer "Set this Camera. Leave empty to refer to self object"
+#+ * Actuator|SceneActuator.mode -> mode: enum "NO DESCRIPTION"
+#+ * Actuator|SceneActuator.scene -> scene: pointer "Set the Scene to be added/removed/paused/resumed"
+#+ * Actuator|ShapeActionActuator.action -> action: pointer "NO DESCRIPTION"
+#Actuator|ShapeActionActuator.frame_blend_in -> frame_blend_in: int "Number of frames of motion blending"
+#+ * Actuator|ShapeActionActuator.frame_end -> frame_end: int "NO DESCRIPTION"
+#+ * Actuator|ShapeActionActuator.frame_property -> frame_property: string "Assign the actions current frame number to this property"
+#+ * Actuator|ShapeActionActuator.frame_start -> frame_start: int "NO DESCRIPTION"
+#+ * Actuator|ShapeActionActuator.mode -> mode: enum "Action playback type"
+#+ * Actuator|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"
+#+ * Actuator|ShapeActionActuator.property -> property: string "Use this property to define the Action position"
+#Actuator|ShapeActionActuator.use_continue_last_frame -> use_continue_last_frame: boolean "Restore last frame when switching on/off, otherwise play from the start each time"
+#+ * Actuator|SoundActuator.cone_inner_angle_3d -> cone_inner_angle_3d: float "The angle of the inner cone"
+#+ * Actuator|SoundActuator.cone_outer_angle_3d -> cone_outer_angle_3d: float "The angle of the outer cone"
+#+ * Actuator|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"
+#Actuator|SoundActuator.distance_3d_max -> distance_3d_max: float "The maximum distance at which you can hear the sound"
+#Actuator|SoundActuator.distance_3d_reference -> distance_3d_reference: float "The distance where the sound has a gain of 1.0"
+#Actuator|SoundActuator.gain_3d_max -> gain_3d_max: float "The maximum gain of the sound, no matter how near it is"
+#Actuator|SoundActuator.gain_3d_min -> gain_3d_min: float "The minimum gain of the sound, no matter how far it is away"
+#+ * Actuator|SoundActuator.mode -> mode: enum "NO DESCRIPTION"
+#+ * Actuator|SoundActuator.pitch -> pitch: float "Sets the pitch of the sound"
+#+ * Actuator|SoundActuator.rolloff_factor_3d -> rolloff_factor_3d: float "The influence factor on volume depending on distance"
+#+ * Actuator|SoundActuator.sound -> sound: pointer "NO DESCRIPTION"
+#Actuator|SoundActuator.use_sound_3d -> use_sound_3d: boolean "Enable/Disable 3D Sound"
+#+ * Actuator|SoundActuator.volume -> volume: float "Sets the initial volume of the sound"
+#+ * Actuator|StateActuator.operation -> operation: enum "Select the bit operation on object state mask"
+#Actuator|StateActuator.states -> states: boolean[30] "NO DESCRIPTION"
+#Actuator|VisibilityActuator.apply_to_children -> apply_to_children: boolean "Set all the children of this object to the same visibility/occlusion recursively"
+#Actuator|VisibilityActuator.use_occlusion -> use_occlusion: boolean "Set the object to occlude objects behind it. Initialized from the object type in physics button"
+#Actuator|VisibilityActuator.use_visible -> use_visible: boolean "Set the objects visible. Initialized from the objects render restriction toggle (access in the outliner)"
+#+ * Addon.module -> module: string "Module name"
+#+ * AnimData.action -> action: pointer "Active Action for this datablock"
+#AnimData.action_blend_type -> action_blend_type: enum "Method used for combining Active Actions result with result of NLA stack"
+#+ * AnimData.action_extrapolation -> action_extrapolation: enum "Action to take for gaps past the Active Actions 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)"
+#AnimData.use_nla -> use_nla: boolean "NLA stack is evaluated when evaluating this block"
+#AnimViz.motion_path -> motion_path: pointer, "(read-only) Motion Path settings for visualisation"
+#AnimViz.onion_skin_frames -> onion_skin_frames: pointer, "(read-only) Onion Skinning (ghosting) settings for visualisation"
+#+ * AnimVizMotionPaths.bake_location -> bake_location: enum "When calculating Bone Paths, use Head or Tips"
+#AnimVizMotionPaths.frame_after -> frame_after: int "Number of frames to show after the current frame (only for Around Current Frame Onion-skinning method)"
+#AnimVizMotionPaths.frame_before -> frame_before: 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.show_frame_numbers -> show_frame_numbers: boolean "Show frame numbers on Motion Paths"
+#AnimVizMotionPaths.show_keyframe_action_all -> 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_keyframe_highlight -> show_keyframe_highlight: boolean "Emphasize position of keyframes on Motion Paths"
+#+ * AnimVizMotionPaths.show_keyframe_numbers -> show_keyframe_numbers: boolean "Show frame numbers of Keyframes on Motion Paths"
+#+ * AnimVizMotionPaths.type -> type: enum "Type of range to show for Motion Paths"
+#AnimVizOnionSkinning.frame_after -> frame_after: int "Number of frames to show after the current frame (only for Around Current Frame Onion-skinning method)"
+#AnimVizOnionSkinning.frame_before -> frame_before: 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.show_only_selected -> show_only_selected: boolean "For Pose-Mode drawing, only draw ghosts for selected bones"
+#+ * AnimVizOnionSkinning.type -> type: enum "Method used for determining what ghosts get drawn"
+#MAKE PROPERTY OF A COLLECTION * 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.show_menus -> show_menus: boolean "Show menus in the header"
+#+ * Area.spaces -> spaces: collection, "(read-only) Spaces contained in this area, the first space is active"
+#+ * Area.type -> type: enum "Space type"
+#+ * ArmatureBones.active -> active: pointer "Armatures active bone"
+#+ * ArmatureEditBones.active -> active: pointer "Armatures active edit bone"
+#+ * 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.show_expanded -> show_expanded: boolean "Show the expanded in the user interface"
+#+ * 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"
+#+ * BezierSplinePoint.co -> co: float[3] "Coordinates of the control point"
+#BezierSplinePoint.handle_left -> handle_left: float[3] "Coordinates of the first handle"
+#BezierSplinePoint.handle_left_type -> handle_left_type: enum "Handle types"
+#BezierSplinePoint.handle_right -> handle_right: float[3] "Coordinates of the second handle"
+#BezierSplinePoint.handle_right_type -> handle_right_type: enum "Handle types"
+#+ * BezierSplinePoint.hide -> hide: boolean "Visibility status"
+#+ * BezierSplinePoint.radius -> radius: float, "(read-only) Radius for bevelling"
+#+ * BezierSplinePoint.select_control_point -> select_control_point: boolean "Control point selection status"
+#+ * BezierSplinePoint.select_left_handle -> select_left_handle: boolean "Handle 1 selection status"
+#+ * BezierSplinePoint.select_right_handle -> select_right_handle: boolean "Handle 2 selection status"
+#+ * BezierSplinePoint.tilt -> tilt: float "Tilt in 3D View"
+#+ * BezierSplinePoint.weight -> weight: float "Softbody goal weight"
+#+ * BlenderRNA.structs -> structs: collection, "(read-only)"
+#+ * BoidRule.name -> name: string "Boid rule name"
+#+ * BoidRule.type -> type: enum, "(read-only)"
+#BoidRule.use_in_air -> use_in_air: boolean "Use rule when boid is flying"
+#BoidRule.use_on_land -> use_on_land: boolean "Use rule when boid is on land"
+#+ * BoidRule|BoidRuleAverageSpeed.level -> level: float "How much velocitys z-component is kept constant"
+#+ * BoidRule|BoidRuleAverageSpeed.speed -> speed: float "Percentage of maximum speed"
+#+ * BoidRule|BoidRuleAverageSpeed.wander -> wander: float "How fast velocitys direction is randomized"
+#+ * BoidRule|BoidRuleAvoid.fear_factor -> fear_factor: float "Avoid object if danger from it is above this threshold"
+#+ * BoidRule|BoidRuleAvoid.object -> object: pointer "Object to avoid"
+#BoidRule|BoidRuleAvoid.use_predict -> use_predict: boolean "Predict target movement"
+#+ * BoidRule|BoidRuleAvoidCollision.look_ahead -> look_ahead: float "Time to look ahead in seconds"
+#BoidRule|BoidRuleAvoidCollision.use_avoid -> use_avoid: boolean "Avoid collision with other boids"
+#BoidRule|BoidRuleAvoidCollision.use_avoid_collision -> use_avoid_collision: boolean "Avoid collision with deflector objects"
+#+ * BoidRule|BoidRuleFight.distance -> distance: float "Attack boids at max this distance"
+#+ * BoidRule|BoidRuleFight.flee_distance -> flee_distance: float "Flee to this distance"
+#+ * BoidRule|BoidRuleFollowLeader.distance -> distance: float "Distance behind leader to follow"
+#+ * BoidRule|BoidRuleFollowLeader.object -> object: pointer "Follow this object instead of a boid"
+#BoidRule|BoidRuleFollowLeader.queue_count -> queue_count: int "How many boids in a line"
+#BoidRule|BoidRuleFollowLeader.use_line -> use_line: boolean "Follow leader in a line"
+#+ * BoidRule|BoidRuleGoal.object -> object: pointer "Goal object"
+#BoidRule|BoidRuleGoal.use_predict -> use_predict: boolean "Predict target movement"
+#+ * 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 "NO DESCRIPTION"
+#+ * BoidSettings.aggression -> aggression: float "Boid will fight this times stronger enemy"
+#BoidSettings.air_acc_max -> air_acc_max: float "Maximum acceleration in air (relative to maximum speed)"
+#BoidSettings.air_ave_max -> air_ave_max: float "Maximum angular velocity in air (relative to 180 degrees)"
+#+ * BoidSettings.air_personal_space -> air_personal_space: float "Radius of boids personal space in air (% of particle size)"
+#BoidSettings.air_speed_max -> air_speed_max: float "Maximum speed in air"
+#BoidSettings.air_speed_min -> air_speed_min: float "Minimum speed in air (relative to maximum speed)"
+#BoidSettings.bank -> 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_acc_max -> land_acc_max: float "Maximum acceleration on land (relative to maximum speed)"
+#BoidSettings.land_ave_max -> land_ave_max: float "Maximum angular velocity on land (relative to 180 degrees)"
+#+ * BoidSettings.land_jump_speed -> land_jump_speed: float "Maximum speed for jumping"
+#+ * BoidSettings.land_personal_space -> land_personal_space: float "Radius of boids personal space on land (% of particle size)"
+#BoidSettings.land_smooth -> land_smooth: float "How smoothly the boids land"
+#BoidSettings.land_speed_max -> land_speed_max: float "Maximum speed on land"
+#+ * BoidSettings.land_stick_force -> land_stick_force: float "How strong a force must be to start effecting a boid on 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"
+#BoidSettings.use_climb -> use_climb: boolean "Allow boids to climb goal objects"
+#BoidSettings.use_flight -> use_flight: boolean "Allow boids to move in air"
+#BoidSettings.use_land -> use_land: boolean "Allow boids to move on land"
+#+ * BoidState.active_boid_rule -> active_boid_rule: pointer, "(read-only)"
+#+ * BoidState.active_boid_rule_index -> active_boid_rule_index: int "NO DESCRIPTION"
+#+ * BoidState.falloff -> falloff: float "NO DESCRIPTION"
+#+ * BoidState.name -> name: string "Boid state name"
+#BoidState.rule_fuzzy -> rule_fuzzy: float "NO DESCRIPTION"
+#+ * BoidState.rules -> rules: collection, "(read-only)"
+#+ * BoidState.ruleset_type -> ruleset_type: enum "How the rules in the list are evaluated"
+#+ * BoidState.volume -> volume: float "NO DESCRIPTION"
+#+ * 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[3] "Location of head end of the bone relative to its parent"
+#+ * Bone.head_local -> head_local: float[3] "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.hide -> hide: boolean "Bone is not visible when it is not in Edit Mode (i.e. in Object or Pose Modes)"
+#+ * Bone.hide_select -> hide_select: boolean "Bone is able to be selected"
+#Bone.layers -> layers: boolean[32] "Layers bone exists in"
+#+ * Bone.matrix -> matrix: float[9] "3x3 bone matrix"
+#+ * Bone.matrix_local -> matrix_local: float[16] "4x4 bone matrix relative to armature"
+#+ * Bone.name -> name: string "NO DESCRIPTION"
+#+ * Bone.parent -> parent: pointer, "(read-only) Parent bone (in same Armature)"
+#+ * Bone.select -> select: boolean "NO DESCRIPTION"
+#Bone.show_wire -> show_wire: boolean "Bone is always drawn as Wireframe regardless of viewport draw mode. Useful for non-obstructive custom bone shapes"
+#+ * Bone.tail -> tail: float[3] "Location of tail end of the bone"
+#+ * Bone.tail_local -> tail_local: float[3] "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)"
+#Bone.use_connect -> use_connect: boolean, "(read-only) When bone has a parent, bones head is struck to the parents tail"
+#Bone.use_cyclic_offset -> use_cyclic_offset: boolean "When bone doesnt have a parent, it receives cyclic offset effects"
+#Bone.use_deform -> use_deform: boolean "Bone does not deform any geometry"
+#Bone.use_envelope_multiply -> use_envelope_multiply: boolean "When deforming bone, multiply effects of Vertex Group weights with Envelope influence"
+#Bone.use_hinge -> use_hinge: boolean "Bone inherits rotation or scale from parent bone"
+#Bone.use_inherit_scale -> use_inherit_scale: boolean "Bone inherits scaling from parent bone"
+#Bone.use_local_location -> use_local_location: boolean "Bone location is set in local space"
+#+ * BoneGroup.color_set -> color_set: enum "Custom color set to use"
+#+ * BoneGroup.colors -> colors: pointer, "(read-only) Copy of the colors associated with the groups color set"
+#+ * BoneGroup.name -> name: string "NO DESCRIPTION"
+#BoneGroups.active -> active: pointer "Active bone group for this pose"
+#+ * ClothCollisionSettings.collision_quality -> collision_quality: int "How many collision iterations should be done. (higher is better quality but slower)"
+#ClothCollisionSettings.distance_min -> distance_min: float "Minimum distance between collision objects before collision response takes in"
+#+ * ClothCollisionSettings.friction -> friction: float "Friction force if a collision happened. (higher = less movement)"
+#+ * ClothCollisionSettings.group -> group: pointer "Limit colliders to this Group"
+#+ * ClothCollisionSettings.self_collision_quality -> self_collision_quality: int "How many self collision iterations should be done. (higher is better quality but slower)"
+#ClothCollisionSettings.self_distance_min -> self_distance_min: float "0.5 means no distance at all, 1.0 is maximum distance"
+#+ * ClothCollisionSettings.self_friction -> self_friction: float "Friction/damping with self contact"
+#ClothCollisionSettings.use_collision -> use_collision: boolean "Enable collisions with other objects"
+#ClothCollisionSettings.use_self_collision -> use_self_collision: boolean "Enable self collisions"
+#+ * 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 "NO DESCRIPTION"
+#+ * 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[3] "Gravity or external force vector"
+#+ * ClothSettings.internal_friction -> internal_friction: float "NO DESCRIPTION"
+#+ * 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"
+#ClothSettings.use_pin_cloth -> use_pin_cloth: boolean "Enable pinning of cloth vertices to other objects/positions"
+#ClothSettings.use_stiffness_scale -> use_stiffness_scale: boolean "If enabled, stiffness can be scaled along a weight painted vertex group"
+#+ * 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.damping_random -> damping_random: float "Random variation of damping"
+#+ * CollisionSettings.friction_factor -> friction_factor: float "Amount of friction during particle collision"
+#CollisionSettings.friction_random -> friction_random: float "Random variation of friction"
+#+ * CollisionSettings.permeability -> permeability: float "Chance that the particle will pass through the mesh"
+#+ * CollisionSettings.stickness -> stickness: float "Amount of stickness to surface collision"
+#CollisionSettings.thickness_inner -> thickness_inner: float "Inner face thickness"
+#CollisionSettings.thickness_outer -> thickness_outer: float "Outer face thickness"
+#+ * CollisionSettings.use -> use: boolean "Enable this objects as a collider for physics systems"
+#CollisionSettings.use_particle_kill -> use_particle_kill: boolean "Kill collided particles"
+#+ * ColorRamp.elements -> elements: collection, "(read-only)"
+#+ * ColorRamp.interpolation -> interpolation: enum "NO DESCRIPTION"
+#+ * ColorRampElement.color -> color: float[4] "NO DESCRIPTION"
+#+ * ColorRampElement.position -> position: float "NO DESCRIPTION"
+#ConsoleLine.body -> body: string "Text in the line"
+#+ * ConsoleLine.current_character -> current_character: int "NO DESCRIPTION"
+#+ * Constraint.active -> active: boolean "Constraint is the one being edited"
+#Constraint.error_location -> error_location: float, "(read-only) Amount of residual error in Blender space unit for constraints that work on position"
+#Constraint.error_rotation -> error_rotation: float, "(read-only) Amount of residual error in radiant for constraints that work on orientation"
+#+ * Constraint.influence -> influence: float "Amount of influence constraint will have on the final solution"
+#Constraint.is_proxy_local -> is_proxy_local: boolean "Constraint was added in this proxy instance (i.e. did not belong to source Armature)"
+#Constraint.is_valid -> is_valid: boolean, "(read-only) Constraint has invalid settings and will not be evaluated"
+#+ * Constraint.mute -> mute: boolean "Enable/Disable Constraint"
+#+ * Constraint.name -> name: string "Constraint name"
+#+ * Constraint.owner_space -> owner_space: enum "Space that owner is evaluated in"
+#Constraint.show_expanded -> show_expanded: boolean "Constraints panel is expanded in UI"
+#+ * Constraint.target_space -> target_space: enum "Space that target is evaluated in"
+#+ * Constraint.type -> type: enum, "(read-only)"
+#+ * ConstraintTarget.subtarget -> subtarget: string "NO DESCRIPTION"
+#+ * ConstraintTarget.target -> target: pointer "Target Object"
+#+ * Constraint|ActionConstraint.action -> action: pointer "NO DESCRIPTION"
+#+ * Constraint|ActionConstraint.frame_end -> frame_end: int "Last frame of the Action to use"
+#+ * Constraint|ActionConstraint.frame_start -> frame_start: int "First frame of the Action to use"
+#Constraint|ActionConstraint.max -> max: float "Maximum value for target channel range"
+#Constraint|ActionConstraint.min -> min: float "Minimum value for target channel range"
+#+ * Constraint|ActionConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
+#+ * Constraint|ActionConstraint.target -> target: pointer "Target Object"
+#+ * Constraint|ActionConstraint.transform_channel -> transform_channel: enum "Transformation channel from the target that is used to key the Action"
+#+ * Constraint|ChildOfConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
+#+ * Constraint|ChildOfConstraint.target -> target: pointer "Target Object"
+#+ * Constraint|ChildOfConstraint.use_location_x -> use_location_x: boolean "Use X Location of Parent"
+#+ * Constraint|ChildOfConstraint.use_location_y -> use_location_y: boolean "Use Y Location of Parent"
+#+ * Constraint|ChildOfConstraint.use_location_z -> use_location_z: boolean "Use Z Location of Parent"
+#+ * Constraint|ChildOfConstraint.use_rotation_x -> use_rotation_x: boolean "Use X Rotation of Parent"
+#+ * Constraint|ChildOfConstraint.use_rotation_y -> use_rotation_y: boolean "Use Y Rotation of Parent"
+#+ * Constraint|ChildOfConstraint.use_rotation_z -> use_rotation_z: boolean "Use Z Rotation of Parent"
+#+ * Constraint|ChildOfConstraint.use_scale_x -> use_scale_x: boolean "Use X Scale of Parent"
+#+ * Constraint|ChildOfConstraint.use_scale_y -> use_scale_y: boolean "Use Y Scale of Parent"
+#+ * Constraint|ChildOfConstraint.use_scale_z -> use_scale_z: boolean "Use Z Scale of Parent"
+#+ * Constraint|ClampToConstraint.main_axis -> main_axis: enum "Main axis of movement"
+#+ * Constraint|ClampToConstraint.target -> target: pointer "Target Object"
+#Constraint|ClampToConstraint.use_cyclic -> use_cyclic: boolean "Treat curve as cyclic curve (no clamping to curve bounding box"
+#+ * Constraint|CopyLocationConstraint.head_tail -> head_tail: float "Target along length of bone: Head=0, Tail=1"
+#+ * Constraint|CopyLocationConstraint.invert_x -> invert_x: boolean "Invert the X location"
+#+ * Constraint|CopyLocationConstraint.invert_y -> invert_y: boolean "Invert the Y location"
+#+ * Constraint|CopyLocationConstraint.invert_z -> invert_z: boolean "Invert the Z location"
+#+ * Constraint|CopyLocationConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
+#+ * Constraint|CopyLocationConstraint.target -> target: pointer "Target Object"
+#+ * Constraint|CopyLocationConstraint.use_offset -> use_offset: boolean "Add original location into copied location"
+#+ * Constraint|CopyLocationConstraint.use_x -> use_x: boolean "Copy the targets X location"
+#+ * Constraint|CopyLocationConstraint.use_y -> use_y: boolean "Copy the targets Y location"
+#+ * Constraint|CopyLocationConstraint.use_z -> use_z: boolean "Copy the targets Z location"
+#+ * Constraint|CopyRotationConstraint.invert_x -> invert_x: boolean "Invert the X rotation"
+#+ * Constraint|CopyRotationConstraint.invert_y -> invert_y: boolean "Invert the Y rotation"
+#+ * Constraint|CopyRotationConstraint.invert_z -> invert_z: boolean "Invert the Z rotation"
+#+ * Constraint|CopyRotationConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
+#+ * Constraint|CopyRotationConstraint.target -> target: pointer "Target Object"
+#+ * Constraint|CopyRotationConstraint.use_offset -> use_offset: boolean "Add original rotation into copied rotation"
+#+ * Constraint|CopyRotationConstraint.use_x -> use_x: boolean "Copy the targets X rotation"
+#+ * Constraint|CopyRotationConstraint.use_y -> use_y: boolean "Copy the targets Y rotation"
+#+ * Constraint|CopyRotationConstraint.use_z -> use_z: boolean "Copy the targets Z rotation"
+#+ * Constraint|CopyScaleConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
+#+ * Constraint|CopyScaleConstraint.target -> target: pointer "Target Object"
+#+ * Constraint|CopyScaleConstraint.use_offset -> use_offset: boolean "Add original scale into copied scale"
+#+ * Constraint|CopyScaleConstraint.use_x -> use_x: boolean "Copy the targets X scale"
+#+ * Constraint|CopyScaleConstraint.use_y -> use_y: boolean "Copy the targets Y scale"
+#+ * Constraint|CopyScaleConstraint.use_z -> use_z: boolean "Copy the targets Z scale"
+#+ * Constraint|CopyTransformsConstraint.head_tail -> head_tail: float "Target along length of bone: Head=0, Tail=1"
+#+ * Constraint|CopyTransformsConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
+#+ * Constraint|CopyTransformsConstraint.target -> target: pointer "Target Object"
+#+ * Constraint|DampedTrackConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
+#+ * Constraint|DampedTrackConstraint.target -> target: pointer "Target Object"
+#Constraint|DampedTrackConstraint.track_axis -> track_axis: enum "Axis that points to the target object"
+#+ * Constraint|FloorConstraint.floor_location -> floor_location: enum "Location of target that object will not pass through"
+#+ * Constraint|FloorConstraint.offset -> offset: float "Offset of floor from object origin"
+#+ * Constraint|FloorConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
+#+ * Constraint|FloorConstraint.target -> target: pointer "Target Object"
+#+ * Constraint|FloorConstraint.use_rotation -> use_rotation: boolean "Use the targets rotation to determine floor"
+#Constraint|FloorConstraint.use_sticky -> use_sticky: boolean "Immobilize object while constrained"
+#Constraint|FollowPathConstraint.forward_axis -> forward_axis: enum "Axis that points forward along the path"
+#+ * Constraint|FollowPathConstraint.offset -> offset: int "Offset from the position corresponding to the time frame"
+#+ * Constraint|FollowPathConstraint.offset_factor -> offset_factor: float "Percentage value defining target position along length of bone"
+#+ * Constraint|FollowPathConstraint.target -> target: pointer "Target Object"
+#Constraint|FollowPathConstraint.up_axis -> up_axis: enum "Axis that points upward"
+#+ * Constraint|FollowPathConstraint.use_curve_follow -> use_curve_follow: boolean "Object will follow the heading and banking of the curve"
+#+ * Constraint|FollowPathConstraint.use_curve_radius -> use_curve_radius: boolean "Objects scale by the curve radius"
+#Constraint|FollowPathConstraint.use_fixed_location -> use_fixed_location: boolean "Object will stay locked to a single point somewhere along the length of the curve regardless of time"
+#Constraint|KinematicConstraint.chain_count -> chain_count: int "How many bones are included in the IK effect - 0 uses all bones"
+#+ * Constraint|KinematicConstraint.distance -> distance: float "Radius of limiting sphere"
+#+ * Constraint|KinematicConstraint.ik_type -> ik_type: enum "NO DESCRIPTION"
+#+ * Constraint|KinematicConstraint.iterations -> iterations: int "Maximum number of solving iterations"
+#+ * Constraint|KinematicConstraint.limit_mode -> limit_mode: enum "Distances in relation to sphere of influence to allow"
+#Constraint|KinematicConstraint.lock_location_x -> lock_location_x: boolean "Constraint position along X axis"
+#Constraint|KinematicConstraint.lock_location_y -> lock_location_y: boolean "Constraint position along Y axis"
+#Constraint|KinematicConstraint.lock_location_z -> lock_location_z: boolean "Constraint position along Z axis"
+#Constraint|KinematicConstraint.lock_rotation_x -> lock_rotation_x: boolean "Constraint rotation along X axis"
+#Constraint|KinematicConstraint.lock_rotation_y -> lock_rotation_y: boolean "Constraint rotation along Y axis"
+#Constraint|KinematicConstraint.lock_rotation_z -> lock_rotation_z: boolean "Constraint rotation along Z axis"
+#+ * Constraint|KinematicConstraint.orient_weight -> orient_weight: float "For Tree-IK: Weight of orientation control for this target"
+#+ * Constraint|KinematicConstraint.pole_angle -> pole_angle: float "Pole rotation offset"
+#+ * Constraint|KinematicConstraint.pole_subtarget -> pole_subtarget: string "NO DESCRIPTION"
+#+ * Constraint|KinematicConstraint.pole_target -> pole_target: pointer "Object for pole rotation"
+#Constraint|KinematicConstraint.reference_axis -> reference_axis: enum "Constraint axis Lock options relative to Bone or Target reference"
+#+ * Constraint|KinematicConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
+#+ * Constraint|KinematicConstraint.target -> target: pointer "Target Object"
+#Constraint|KinematicConstraint.use_location -> use_location: boolean "Chain follows position of target"
+#+ * Constraint|KinematicConstraint.use_rotation -> use_rotation: boolean "Chain follows rotation of target"
+#+ * Constraint|KinematicConstraint.use_stretch -> use_stretch: boolean "Enable IK Stretching"
+#+ * Constraint|KinematicConstraint.use_tail -> use_tail: boolean "Include bones tail as last element in chain"
+#+ * Constraint|KinematicConstraint.use_target -> use_target: boolean "Disable for targetless IK"
+#+ * Constraint|KinematicConstraint.weight -> weight: float "For Tree-IK: Weight of position control for this target"
+#+ * Constraint|LimitDistanceConstraint.distance -> distance: float "Radius of limiting sphere"
+#+ * Constraint|LimitDistanceConstraint.limit_mode -> limit_mode: enum "Distances in relation to sphere of influence to allow"
+#+ * Constraint|LimitDistanceConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
+#+ * Constraint|LimitDistanceConstraint.target -> target: pointer "Target Object"
+#Constraint|LimitLocationConstraint.max_x -> max_x: float "Highest X value to allow"
+#Constraint|LimitLocationConstraint.max_y -> max_y: float "Highest Y value to allow"
+#Constraint|LimitLocationConstraint.max_z -> max_z: float "Highest Z value to allow"
+#Constraint|LimitLocationConstraint.min_x -> min_x: float "Lowest X value to allow"
+#Constraint|LimitLocationConstraint.min_y -> min_y: float "Lowest Y value to allow"
+#Constraint|LimitLocationConstraint.min_z -> min_z: float "Lowest Z value to allow"
+#Constraint|LimitLocationConstraint.use_max_x -> use_max_x: boolean "Use the maximum X value"
+#Constraint|LimitLocationConstraint.use_max_y -> use_max_y: boolean "Use the maximum Y value"
+#Constraint|LimitLocationConstraint.use_max_z -> use_max_z: boolean "Use the maximum Z value"
+#Constraint|LimitLocationConstraint.use_min_x -> use_min_x: boolean "Use the minimum X value"
+#Constraint|LimitLocationConstraint.use_min_y -> use_min_y: boolean "Use the minimum Y value"
+#Constraint|LimitLocationConstraint.use_min_z -> use_min_z: boolean "Use the minimum Z value"
+#Constraint|LimitLocationConstraint.use_transform_limit -> use_transform_limit: boolean "Transforms are affected by this constraint as well"
+#Constraint|LimitRotationConstraint.max_x -> max_x: float "Highest X value to allow"
+#Constraint|LimitRotationConstraint.max_y -> max_y: float "Highest Y value to allow"
+#Constraint|LimitRotationConstraint.max_z -> max_z: float "Highest Z value to allow"
+#Constraint|LimitRotationConstraint.min_x -> min_x: float "Lowest X value to allow"
+#Constraint|LimitRotationConstraint.min_y -> min_y: float "Lowest Y value to allow"
+#Constraint|LimitRotationConstraint.min_z -> min_z: float "Lowest Z value to allow"
+#+ * Constraint|LimitRotationConstraint.use_limit_x -> use_limit_x: boolean "Use the minimum X value"
+#+ * Constraint|LimitRotationConstraint.use_limit_y -> use_limit_y: boolean "Use the minimum Y value"
+#+ * Constraint|LimitRotationConstraint.use_limit_z -> use_limit_z: boolean "Use the minimum Z value"
+#Constraint|LimitRotationConstraint.use_transform_limit -> use_transform_limit: boolean "Transforms are affected by this constraint as well"
+#Constraint|LimitScaleConstraint.max_x -> max_x: float "Highest X value to allow"
+#Constraint|LimitScaleConstraint.max_y -> max_y: float "Highest Y value to allow"
+#Constraint|LimitScaleConstraint.max_z -> max_z: float "Highest Z value to allow"
+#Constraint|LimitScaleConstraint.min_x -> min_x: float "Lowest X value to allow"
+#Constraint|LimitScaleConstraint.min_y -> min_y: float "Lowest Y value to allow"
+#Constraint|LimitScaleConstraint.min_z -> min_z: float "Lowest Z value to allow"
+#Constraint|LimitScaleConstraint.use_max_x -> use_max_x: boolean "Use the maximum X value"
+#Constraint|LimitScaleConstraint.use_max_y -> use_max_y: boolean "Use the maximum Y value"
+#Constraint|LimitScaleConstraint.use_max_z -> use_max_z: boolean "Use the maximum Z value"
+#Constraint|LimitScaleConstraint.use_min_x -> use_min_x: boolean "Use the minimum X value"
+#Constraint|LimitScaleConstraint.use_min_y -> use_min_y: boolean "Use the minimum Y value"
+#Constraint|LimitScaleConstraint.use_min_z -> use_min_z: boolean "Use the minimum Z value"
+#Constraint|LimitScaleConstraint.use_transform_limit -> use_transform_limit: boolean "Transforms are affected by this constraint as well"
+#Constraint|LockedTrackConstraint.lock_axis -> lock_axis: enum "Axis that points upward"
+#+ * Constraint|LockedTrackConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
+#+ * Constraint|LockedTrackConstraint.target -> target: pointer "Target Object"
+#Constraint|LockedTrackConstraint.track_axis -> track_axis: enum "Axis that points to the target object"
+#Constraint|MaintainVolumeConstraint.free_axis -> free_axis: enum "The free scaling axis of the object"
+#+ * Constraint|MaintainVolumeConstraint.volume -> volume: float "Volume of the bone at rest"
+#+ * Constraint|PivotConstraint.head_tail -> head_tail: float "Target along length of bone: Head=0, Tail=1"
+#+ * Constraint|PivotConstraint.offset -> offset: float[3] "Offset of pivot from target (when set), or from owners location (when Fixed Position is off), or the absolute pivot point"
+#Constraint|PivotConstraint.rotation_range -> rotation_range: enum "Rotation range on which pivoting should occur"
+#+ * Constraint|PivotConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
+#+ * Constraint|PivotConstraint.target -> target: pointer "Target Object, defining the position of the pivot when defined"
+#Constraint|PivotConstraint.use_relative_location -> use_relative_location: boolean "Offset will be an absolute point in space instead of relative to the target"
+#Constraint|PythonConstraint.has_script_error -> has_script_error: boolean, "(read-only) The linked Python script has thrown an error"
+#Constraint|PythonConstraint.target_count -> target_count: int "Usually only 1-3 are needed"
+#+ * Constraint|PythonConstraint.targets -> targets: collection, "(read-only) Target Objects"
+#+ * Constraint|PythonConstraint.text -> text: pointer "The text object that contains the Python script"
+#+ * Constraint|PythonConstraint.use_targets -> use_targets: boolean "Use the targets indicated in the constraint panel"
+#+ * Constraint|RigidBodyJointConstraint.axis_x -> axis_x: float "Rotate pivot on X axis in degrees"
+#+ * Constraint|RigidBodyJointConstraint.axis_y -> axis_y: float "Rotate pivot on Y axis in degrees"
+#+ * Constraint|RigidBodyJointConstraint.axis_z -> axis_z: float "Rotate pivot on Z axis in degrees"
+#+ * Constraint|RigidBodyJointConstraint.child -> child: pointer "Child object"
+#+ * Constraint|RigidBodyJointConstraint.pivot_type -> pivot_type: enum "NO DESCRIPTION"
+#+ * Constraint|RigidBodyJointConstraint.pivot_x -> pivot_x: float "Offset pivot on X"
+#+ * Constraint|RigidBodyJointConstraint.pivot_y -> pivot_y: float "Offset pivot on Y"
+#+ * Constraint|RigidBodyJointConstraint.pivot_z -> pivot_z: float "Offset pivot on Z"
+#Constraint|RigidBodyJointConstraint.show_pivot -> show_pivot: boolean "Display the pivot point and rotation in 3D view"
+#+ * Constraint|RigidBodyJointConstraint.target -> target: pointer "Target Object"
+#Constraint|RigidBodyJointConstraint.use_linked_collision -> use_linked_collision: boolean "Disable collision between linked bodies"
+#+ * Constraint|ShrinkwrapConstraint.distance -> distance: float "Distance to Target"
+#+ * Constraint|ShrinkwrapConstraint.shrinkwrap_type -> shrinkwrap_type: enum "Selects type of shrinkwrap algorithm for target position"
+#+ * Constraint|ShrinkwrapConstraint.target -> target: pointer "Target Object"
+#+ * Constraint|ShrinkwrapConstraint.use_x -> use_x: boolean "Projection over X Axis"
+#+ * Constraint|ShrinkwrapConstraint.use_y -> use_y: boolean "Projection over Y Axis"
+#+ * Constraint|ShrinkwrapConstraint.use_z -> use_z: boolean "Projection over Z Axis"
+#Constraint|SplineIKConstraint.chain_count -> chain_count: int "How many bones are included in the chain"
+#+ * Constraint|SplineIKConstraint.joint_bindings -> joint_bindings: float[32] "(EXPERIENCED USERS ONLY) The relative positions of the joints along the chain as percentages"
+#+ * Constraint|SplineIKConstraint.target -> target: pointer "Curve that controls this relationship"
+#Constraint|SplineIKConstraint.use_chain_offset -> use_chain_offset: boolean "Offset the entire chain relative to the root joint"
+#+ * Constraint|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"
+#Constraint|SplineIKConstraint.use_even_divisions -> use_even_divisions: boolean "Ignore the relative lengths of the bones when fitting to the curve"
+#Constraint|SplineIKConstraint.use_y_stretch -> use_y_stretch: boolean "Stretch the Y axis of the bones to fit the curve"
+#Constraint|SplineIKConstraint.xz_scale_mode -> xz_scale_mode: enum "Method used for determining the scaling of the X and Z axes of the bones"
+#+ * Constraint|StretchToConstraint.bulge -> bulge: float "Factor between volume variation and stretching"
+#+ * Constraint|StretchToConstraint.head_tail -> head_tail: float "Target along length of bone: Head=0, Tail=1"
+#+ * Constraint|StretchToConstraint.keep_axis -> keep_axis: enum "Axis to maintain during stretch"
+#Constraint|StretchToConstraint.rest_length -> rest_length: float "Length at rest position"
+#+ * Constraint|StretchToConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
+#+ * Constraint|StretchToConstraint.target -> target: pointer "Target Object"
+#+ * Constraint|StretchToConstraint.volume -> volume: enum "Maintain the objects volume as it stretches"
+#+ * Constraint|TrackToConstraint.head_tail -> head_tail: float "Target along length of bone: Head=0, Tail=1"
+#+ * Constraint|TrackToConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
+#+ * Constraint|TrackToConstraint.target -> target: pointer "Target Object"
+#Constraint|TrackToConstraint.track_axis -> track_axis: enum "Axis that points to the target object"
+#Constraint|TrackToConstraint.up_axis -> up_axis: enum "Axis that points upward"
+#Constraint|TrackToConstraint.use_target_z -> use_target_z: boolean "Targets Z axis, not World Z axis, will constraint the Up direction"
+#+ * Constraint|TransformConstraint.from_max_x -> from_max_x: float "Top range of X axis source motion"
+#+ * Constraint|TransformConstraint.from_max_y -> from_max_y: float "Top range of Y axis source motion"
+#+ * Constraint|TransformConstraint.from_max_z -> from_max_z: float "Top range of Z axis source motion"
+#+ * Constraint|TransformConstraint.from_min_x -> from_min_x: float "Bottom range of X axis source motion"
+#+ * Constraint|TransformConstraint.from_min_y -> from_min_y: float "Bottom range of Y axis source motion"
+#+ * Constraint|TransformConstraint.from_min_z -> from_min_z: float "Bottom range of Z axis source motion"
+#+ * Constraint|TransformConstraint.map_from -> map_from: enum "The transformation type to use from the target"
+#+ * Constraint|TransformConstraint.map_to -> map_to: enum "The transformation type to affect of the constrained object"
+#+ * Constraint|TransformConstraint.map_to_x_from -> map_to_x_from: enum "The source axis constrained objects X axis uses"
+#+ * Constraint|TransformConstraint.map_to_y_from -> map_to_y_from: enum "The source axis constrained objects Y axis uses"
+#+ * Constraint|TransformConstraint.map_to_z_from -> map_to_z_from: enum "The source axis constrained objects Z axis uses"
+#+ * Constraint|TransformConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
+#+ * Constraint|TransformConstraint.target -> target: pointer "Target Object"
+#+ * Constraint|TransformConstraint.to_max_x -> to_max_x: float "Top range of X axis destination motion"
+#+ * Constraint|TransformConstraint.to_max_y -> to_max_y: float "Top range of Y axis destination motion"
+#+ * Constraint|TransformConstraint.to_max_z -> to_max_z: float "Top range of Z axis destination motion"
+#+ * Constraint|TransformConstraint.to_min_x -> to_min_x: float "Bottom range of X axis destination motion"
+#+ * Constraint|TransformConstraint.to_min_y -> to_min_y: float "Bottom range of Y axis destination motion"
+#+ * Constraint|TransformConstraint.to_min_z -> to_min_z: float "Bottom range of Z axis destination motion"
+#Constraint|TransformConstraint.use_motion_extrapolate -> use_motion_extrapolate: boolean "Extrapolate ranges"
+#+ * Context.area -> area: pointer, "(read-only)"
+#+ * Context.main -> main: pointer, "(read-only)"
+#+ * Context.mode -> mode: enum, "(read-only)"
+#+ * Context.region -> region: pointer, "(read-only)"
+#+ * Context.region_data -> region_data: 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)"
+ + * Context.manager -> wm: pointer, "(read-only)"
+#+ * Controller.name -> name: string "NO DESCRIPTION"
+#Controller.show_expanded -> show_expanded: boolean "Set controller expanded in the user interface"
+#Controller.states -> states: int "Set Controller state index (1 to 30)"
+#+ * Controller.type -> type: enum "NO DESCRIPTION"
+#Controller.use_priority -> use_priority: boolean "Mark controller for execution before all non-marked controllers (good for startup scripts)"
+#+ * Controller|ExpressionController.expression -> expression: string "NO DESCRIPTION"
+#+ * Controller|PythonController.mode -> mode: enum "Python script type (textblock or module - faster)"
+#+ * Controller|PythonController.module -> module: string "Module name and function to run e.g. someModule.main. Internal texts and external python files can be used"
+#+ * Controller|PythonController.text -> text: pointer "Text datablock with the python script"
+#Controller|PythonController.use_debug -> use_debug: boolean "Continuously reload the module from disk for editing external modules without restarting"
+#+ * 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[2], "(read-only) X/Y coordinates of the curve point"
+#+ * CurveMapPoint.select -> select: boolean "Selection state of the curve point"
+#+ * CurveMapping.black_level -> black_level: float[3] "For RGB curves, the color that black is mapped to"
+#+ * CurveMapping.clip_max_x -> clip_max_x: float "NO DESCRIPTION"
+#+ * CurveMapping.clip_max_y -> clip_max_y: float "NO DESCRIPTION"
+#+ * CurveMapping.clip_min_x -> clip_min_x: float "NO DESCRIPTION"
+#+ * CurveMapping.clip_min_y -> clip_min_y: float "NO DESCRIPTION"
+#+ * CurveMapping.curves -> curves: collection, "(read-only)"
+#CurveMapping.use_clip -> use_clip: boolean "Force the curve view to fit a defined boundary"
+#+ * CurveMapping.white_level -> white_level: float[3] "For RGB curves, the color that white is mapped to"
+#+ * CurveSplines.active -> active: pointer "Active curve spline"
+#DopeSheet.filter_group -> filter_group: pointer "Group that included Object should be a member of"
+#DopeSheet.show_armatures -> show_armatures: boolean "Include visualization of Armature related Animation data"
+#DopeSheet.show_cameras -> show_cameras: boolean "Include visualization of Camera related Animation data"
+#DopeSheet.show_curves -> show_curves: boolean "Include visualization of Curve related Animation data"
+#DopeSheet.show_expanded_summary -> show_expanded_summary: boolean "Collapse summary when shown, so all other channels get hidden. (DopeSheet Editors Only)"
+#DopeSheet.show_hidden -> show_hidden: boolean "Include channels from objects/bone that arent visible"
+#DopeSheet.show_lamps -> show_lamps: boolean "Include visualization of Lamp related Animation data"
+#DopeSheet.show_materials -> show_materials: boolean "Include visualization of Material related Animation data"
+#DopeSheet.show_meshes -> show_meshes: boolean "Include visualization of Mesh related Animation data"
+#DopeSheet.show_metaballs -> show_metaballs: boolean "Include visualization of Metaball related Animation data"
+#DopeSheet.show_missing_nla -> show_missing_nla: boolean "Include Animation Data blocks with no NLA data. (NLA Editor only)"
+#DopeSheet.show_nodes -> show_nodes: boolean "Include visualization of Node related Animation data"
+#DopeSheet.show_only_group_objects -> show_only_group_objects: boolean "Only include channels from Objects in the specified Group"
+#DopeSheet.show_only_selected -> show_only_selected: boolean "Only include channels relating to selected objects and data"
+#DopeSheet.show_particles -> show_particles: boolean "Include visualization of Particle related Animation data"
+#DopeSheet.show_scenes -> show_scenes: boolean "Include visualization of Scene related Animation data"
+#DopeSheet.show_shapekeys -> show_shapekeys: boolean "Include visualization of ShapeKey related Animation data"
+#DopeSheet.show_summary -> show_summary: boolean "Display an additional summary line. (DopeSheet Editors only)"
+#DopeSheet.show_textures -> show_textures: boolean "Include visualization of Texture related Animation data"
+#DopeSheet.show_transforms -> show_transforms: boolean "Include visualization of Object-level Animation data (mostly Transforms)"
+#DopeSheet.show_worlds -> show_worlds: boolean "Include visualization of World related Animation data"
+#+ * 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.is_valid -> 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"
+#+ * 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"
+#DriverTarget.use_local_space_transform -> use_local_space_transform: boolean "Use transforms in Local Space (as opposed to the worldspace default)"
+#+ * 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[16] "Object duplicate transformation matrix"
+#+ * DupliObject.matrix_original -> matrix_original: float[16] "The original matrix of this object before it was duplicated"
+#+ * DupliObject.object -> object: pointer, "(read-only) Object being duplicated"
+#+ * 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[3] "Location of head end of the bone"
+#+ * EditBone.head_radius -> head_radius: float "Radius of head of bone (for Envelope deform only)"
+#+ * EditBone.hide -> hide: boolean "Bone is not visible when in Edit Mode"
+#+ * EditBone.hide_select -> hide_select: boolean "Bone is able to be selected"
+#EditBone.layers -> layers: boolean[32] "Layers bone exists in"
+#+ * EditBone.lock -> lock: boolean "Bone is not able to be transformed when in Edit Mode"
+#+ * EditBone.matrix -> matrix: float[16], "(read-only) Read-only matrix calculated from the roll (armature space)"
+#+ * EditBone.name -> name: string "NO DESCRIPTION"
+#+ * EditBone.parent -> parent: pointer "Parent edit bone (in same Armature)"
+#+ * EditBone.roll -> roll: float "Bone rotation around head-tail axis"
+#+ * EditBone.select -> select: boolean "NO DESCRIPTION"
+#+ * EditBone.select_head -> select_head: boolean "NO DESCRIPTION"
+#+ * EditBone.select_tail -> select_tail: boolean "NO DESCRIPTION"
+#EditBone.show_wire -> show_wire: boolean "Bone is always drawn as Wireframe regardless of viewport draw mode. Useful for non-obstructive custom bone shapes"
+#+ * EditBone.tail -> tail: float[3] "Location of tail end of the bone"
+#+ * EditBone.tail_radius -> tail_radius: float "Radius of tail of bone (for Envelope deform only)"
+#EditBone.use_connect -> use_connect: boolean "When bone has a parent, bones head is struck to the parents tail"
+#EditBone.use_cyclic_offset -> use_cyclic_offset: boolean "When bone doesnt have a parent, it receives cyclic offset effects"
+#EditBone.use_deform -> use_deform: boolean "Bone does not deform any geometry"
+#EditBone.use_envelope_multiply -> use_envelope_multiply: boolean "When deforming bone, multiply effects of Vertex Group weights with Envelope influence"
+#EditBone.use_hinge -> use_hinge: boolean "Bone inherits rotation or scale from parent bone"
+#EditBone.use_inherit_scale -> use_inherit_scale: boolean "Bone inherits scaling from parent bone"
+#EditBone.use_local_location -> use_local_location: boolean "Bone location is set in local space"
+#+ * EffectorWeights.all -> all: float "All effectors weight"
+#EffectorWeights.apply_to_hair_growing -> apply_to_hair_growing: boolean "Use force fields when growing hair"
+#+ * EffectorWeights.boid -> boid: float "Boid effector weight"
+#+ * EffectorWeights.charge -> charge: float "Charge effector weight"
+#EffectorWeights.curve_guide -> curve_guide: 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"
+#+ * EnumPropertyItem.description -> description: string, "(read-only) Description of the items 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.layers_ignore -> layers_ignore: boolean[20] "Hide objects on these layers when generating the Environment Map"
+#+ * EnvironmentMap.mapping -> mapping: enum "NO DESCRIPTION"
+#+ * EnvironmentMap.resolution -> resolution: int "Pixel resolution of the rendered environment map"
+#+ * EnvironmentMap.source -> source: enum "NO DESCRIPTION"
+#+ * EnvironmentMap.viewpoint_object -> viewpoint_object: pointer "Object to use as the environment maps viewpoint location"
+#+ * EnvironmentMap.zoom -> zoom: float "NO DESCRIPTION"
+#+ * Event.ascii -> ascii: string, "(read-only) Single ASCII character for this event"
+ + * Event.alt -> is_pressed_alt: boolean, "(read-only) True when the Alt/Option key is held"
+ + * Event.oskey -> is_pressed_cmd: boolean, "(read-only) True when the Cmd key is held"
+ + * Event.ctrl -> is_pressed_ctrl: boolean, "(read-only) True when the Ctrl key is held"
+ + * Event.shift -> is_pressed_shift: boolean, "(read-only) True when the Shift key is held"
+#+ * 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"
+#+ * FCurve.array_index -> array_index: int "Index to the specific property affected by F-Curve if applicable"
+#+ * FCurve.color -> color: float[3] "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 "NO DESCRIPTION"
+#+ * FCurve.group -> group: pointer "Action Group that this F-Curve belongs to"
+#+ * FCurve.hide -> hide: boolean "F-Curve and its keyframes are hidden in the Graph Editor graphs"
+#+ * FCurve.is_valid -> is_valid: boolean "False when F-Curve could not be evaluated in past, so should be skipped when evaluating"
+#+ * FCurve.keyframe_points -> keyframe_points: collection, "(read-only) User-editable keyframes"
+#+ * FCurve.lock -> lock: boolean "F-Curves settings cannot be edited"
+#+ * FCurve.modifiers -> modifiers: collection, "(read-only) Modifiers affecting the shape of the F-Curve"
+#+ * FCurve.mute -> mute: boolean "F-Curve is not evaluated"
+#+ * FCurve.sampled_points -> sampled_points: collection, "(read-only) Sampled animation data"
+#+ * FCurve.select -> select: boolean "F-Curve is selected for editing"
+#+ * FCurve.use_auto_handle_clamp -> use_auto_handle_clamp: boolean "All auto-handles for F-Curve are clamped"
+#+ * FCurveModifiers.active -> active: pointer "Active F-Curve Modifier"
+#+ * FCurveSample.co -> co: float[2] "Point coordinates"
+#+ * FCurveSample.select -> select: boolean "Selection status"
+#REMOVE * FModifier.active -> active: boolean "F-Curve Modifier is the one being edited"
+#FModifier.is_valid -> is_valid: boolean, "(read-only) F-Curve Modifier has invalid settings and will not be evaluated"
+#+ * FModifier.mute -> mute: boolean "F-Curve Modifier will not be evaluated"
+#FModifier.show_expanded -> show_expanded: boolean "F-Curve Modifiers panel is expanded in UI"
+#+ * FModifier.type -> type: enum, "(read-only) F-Curve Modifier Type"
+#+ * FModifierEnvelopeControlPoint.frame -> frame: float "Frame this control-point occurs on"
+#FModifierEnvelopeControlPoint.max -> max: float "Upper bound of envelope at this control-point"
+#FModifierEnvelopeControlPoint.min -> min: float "Lower bound of envelope at this control-point"
+#FModifier|FModifierCycles.cycles_after -> cycles_after: float "Maximum number of cycles to allow after last keyframe. (0 = infinite)"
+#FModifier|FModifierCycles.cycles_before -> cycles_before: float "Maximum number of cycles to allow before first keyframe. (0 = infinite)"
+#FModifier|FModifierCycles.mode_after -> mode_after: enum "Cycling mode to use after last keyframe"
+#FModifier|FModifierCycles.mode_before -> mode_before: enum "Cycling mode to use before first keyframe"
+#+ * FModifier|FModifierEnvelope.control_points -> control_points: collection, "(read-only) Control points defining the shape of the envelope"
+#FModifier|FModifierEnvelope.default_max -> default_max: float "Upper distance from Reference Value for 1:1 default influence"
+#FModifier|FModifierEnvelope.default_min -> default_min: float "Lower distance from Reference Value for 1:1 default influence"
+#+ * FModifier|FModifierEnvelope.reference_value -> reference_value: float "Value that envelopes influence is centered around / based on"
+#+ * FModifier|FModifierFunctionGenerator.amplitude -> amplitude: float "Scale factor determining the maximum/minimum values"
+#+ * FModifier|FModifierFunctionGenerator.function_type -> function_type: enum "Type of built-in function to use"
+#+ * FModifier|FModifierFunctionGenerator.phase_multiplier -> phase_multiplier: float "Scale factor determining the speed of the function"
+#+ * FModifier|FModifierFunctionGenerator.phase_offset -> phase_offset: float "Constant factor to offset time by for function"
+#FModifier|FModifierFunctionGenerator.use_additive -> use_additive: boolean "Values generated by this modifier are applied on top of the existing values instead of overwriting them"
+#+ * FModifier|FModifierFunctionGenerator.value_offset -> value_offset: float "Constant factor to offset values by"
+#+ * FModifier|FModifierGenerator.coefficients -> coefficients: float[32] "Coefficients for x (starting from lowest power of x^0)"
+#+ * FModifier|FModifierGenerator.mode -> mode: enum "Type of generator to use"
+#+ * FModifier|FModifierGenerator.poly_order -> poly_order: int "The highest power of x for this polynomial. (number of coefficients - 1)"
+#FModifier|FModifierGenerator.use_additive -> use_additive: boolean "Values generated by this modifier are applied on top of the existing values instead of overwriting them"
+#FModifier|FModifierLimits.max_x -> max_x: float "Highest X value to allow"
+#FModifier|FModifierLimits.max_y -> max_y: float "Highest Y value to allow"
+#FModifier|FModifierLimits.min_x -> min_x: float "Lowest X value to allow"
+#FModifier|FModifierLimits.min_y -> min_y: float "Lowest Y value to allow"
+#FModifier|FModifierLimits.use_max_x -> use_max_x: boolean "Use the maximum X value"
+#FModifier|FModifierLimits.use_max_y -> use_max_y: boolean "Use the maximum Y value"
+#FModifier|FModifierLimits.use_min_x -> use_min_x: boolean "Use the minimum X value"
+#FModifier|FModifierLimits.use_min_y -> use_min_y: boolean "Use the minimum Y value"
+#FModifier|FModifierNoise.blend_type -> blend_type: enum "Method of modifying the existing F-Curve"
+#+ * FModifier|FModifierNoise.depth -> depth: int "Amount of fine level detail present in the noise"
+#+ * FModifier|FModifierNoise.phase -> phase: float "A random seed for the noise effect"
+#FModifier|FModifierNoise.scale -> scale: float "Scaling (in time) of the noise"
+#+ * FModifier|FModifierNoise.strength -> strength: float "Amplitude of the noise - the amount that it modifies the underlying curve"
+#+ * FModifier|FModifierStepped.frame_end -> frame_end: float "Frame that modifiers influence ends (if applicable)"
+#FModifier|FModifierStepped.frame_offset -> frame_offset: float "Reference number of frames before frames get held. Use to get hold for 1-3 vs 5-7 holding patterns"
+#+ * FModifier|FModifierStepped.frame_start -> frame_start: float "Frame that modifiers influence starts (if applicable)"
+#FModifier|FModifierStepped.frame_step -> frame_step: float "Number of frames to hold each value"
+#+ * FModifier|FModifierStepped.use_frame_end -> use_frame_end: boolean "Restrict modifier to only act before its end frame"
+#+ * FModifier|FModifierStepped.use_frame_start -> use_frame_start: boolean "Restrict modifier to only act after its start frame"
+#FieldSettings.apply_to_location -> apply_to_location: boolean "Effect particles location"
+#FieldSettings.apply_to_rotation -> apply_to_rotation: boolean "Effect particles dynamic rotation"
+#FieldSettings.distance_max -> distance_max: float "Maximum distance for the field to work"
+#FieldSettings.distance_min -> distance_min: float "Minimum distance for the fields fall-off"
+#+ * 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 lifes 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.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_max -> radial_max: float "Maximum radial distance for the field to work"
+#FieldSettings.radial_min -> radial_min: float "Minimum radial distance for the fields 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.use_2d_force -> use_2d_force: boolean "Apply force only in 2d"
+#FieldSettings.use_absorption -> use_absorption: boolean "Force gets absorbed by collision objects"
+#FieldSettings.use_global_coords -> use_global_coords: boolean "Use effector/global coordinates for turbulence"
+#FieldSettings.use_guide_path_add -> use_guide_path_add: boolean "Based on distance/falloff it adds a portion of the entire path"
+#+ * 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 fields fall-off"
+#FieldSettings.use_multiple_springs -> use_multiple_springs: boolean "Every point is effected by multiple springs"
+#FieldSettings.use_object_coords -> use_object_coords: boolean "Use object/global coordinates for texture"
+#+ * 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 fields fall-off"
+#FieldSettings.use_root_coords -> use_root_coords: boolean "Texture coordinates from root particle locations"
+#+ * 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_type -> display_type: enum "Display mode for the file list"
+#FileSelectParams.filename -> filename: string "Active file in the file browser"
+#FileSelectParams.show_hidden -> show_hidden: boolean "Hide hidden dot files"
+#FileSelectParams.sort_method -> sort_method: enum "NO DESCRIPTION"
+#+ * FileSelectParams.title -> title: string, "(read-only) Title for the file browser"
+#FileSelectParams.use_filter -> use_filter: boolean "Enable filtering of files"
+#FileSelectParams.use_filter_blender -> use_filter_blender: boolean "Show .blend files"
+#FileSelectParams.use_filter_folder -> use_filter_folder: boolean "Show folders"
+#FileSelectParams.use_filter_font -> use_filter_font: boolean "Show font files"
+#FileSelectParams.use_filter_image -> use_filter_image: boolean "Show image files"
+#FileSelectParams.use_filter_movie -> use_filter_movie: boolean "Show movie files"
+#FileSelectParams.use_filter_script -> use_filter_script: boolean "Show script files"
+#FileSelectParams.use_filter_sound -> use_filter_sound: boolean "Show sound files"
+#FileSelectParams.use_filter_text -> use_filter_text: boolean "Show text files"
+#+ * FluidSettings.type -> type: enum "Type of participation in the fluid simulation"
+#+ * FluidSettings|ControlFluidSettings.attraction_radius -> attraction_radius: float "Specifies the force field radius around the control object"
+#+ * FluidSettings|ControlFluidSettings.attraction_strength -> attraction_strength: float "Force strength for directional attraction towards the control object"
+#+ * FluidSettings|ControlFluidSettings.end_time -> end_time: float "Specifies time when the control particles are deactivated"
+#+ * FluidSettings|ControlFluidSettings.quality -> quality: float "Specifies the quality which is used for object sampling. (higher = better but slower)"
+#+ * FluidSettings|ControlFluidSettings.start_time -> start_time: float "Specifies time when the control particles are activated"
+#FluidSettings|ControlFluidSettings.use -> use: boolean "Object contributes to the fluid simulation"
+#FluidSettings|ControlFluidSettings.use_reverse_frames -> use_reverse_frames: boolean "Reverse control object movement"
+#+ * FluidSettings|ControlFluidSettings.velocity_radius -> velocity_radius: float "Specifies the force field radius around the control object"
+#+ * FluidSettings|ControlFluidSettings.velocity_strength -> velocity_strength: float "Force strength of how much of the control objects velocity is influencing the fluid velocity"
+#+ * FluidSettings|DomainFluidSettings.compressibility -> compressibility: float "Allowed compressibility due to gravitational force for standing fluid. (directly affects simulation step size)"
+#+ * FluidSettings|DomainFluidSettings.end_time -> end_time: float "Simulation time of the last blender frame (in seconds)"
+#FluidSettings|DomainFluidSettings.filepath -> filepath: string "Directory (and/or filename prefix) to store baked fluid simulation files in"
+#+ * FluidSettings|DomainFluidSettings.generate_particles -> generate_particles: float "Amount of particles to generate (0=off, 1=normal, >1=more)"
+#+ * FluidSettings|DomainFluidSettings.gravity -> gravity: float[3] "Gravity in X, Y and Z direction"
+#+ * FluidSettings|DomainFluidSettings.grid_levels -> grid_levels: int "Number of coarsened grids to use (-1 for automatic)"
+#+ * FluidSettings|DomainFluidSettings.memory_estimate -> memory_estimate: string, "(read-only) Estimated amount of memory needed for baking the domain"
+#+ * FluidSettings|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"
+#+ * FluidSettings|DomainFluidSettings.preview_resolution -> preview_resolution: int "Preview resolution in X,Y and Z direction"
+#+ * FluidSettings|DomainFluidSettings.render_display_mode -> render_display_mode: enum "How to display the mesh for rendering"
+#+ * FluidSettings|DomainFluidSettings.resolution -> resolution: int "Domain resolution in X,Y and Z direction"
+#FluidSettings|DomainFluidSettings.simulation_scale -> simulation_scale: float "Size of the simulation domain in metres"
+#+ * FluidSettings|DomainFluidSettings.slip_type -> slip_type: enum "NO DESCRIPTION"
+#+ * FluidSettings|DomainFluidSettings.start_time -> start_time: float "Simulation time of the first blender frame (in seconds)"
+#FluidSettings|DomainFluidSettings.surface_smooth -> surface_smooth: float "Amount of surface smoothing. A value of 0 is off, 1 is normal smoothing and more than 1 is extra smoothing"
+#+ * FluidSettings|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!"
+#+ * FluidSettings|DomainFluidSettings.tracer_particles -> tracer_particles: int "Number of tracer particles to generate"
+#FluidSettings|DomainFluidSettings.use_reverse_frames -> use_reverse_frames: boolean "Reverse fluid frames"
+#FluidSettings|DomainFluidSettings.use_speed_vectors -> use_speed_vectors: boolean "Generate speed vectors for vector blur"
+#FluidSettings|DomainFluidSettings.use_time_override -> use_time_override: boolean "Use a custom start and end time (in seconds) instead of the scenes timeline"
+#+ * FluidSettings|DomainFluidSettings.viewport_display_mode -> viewport_display_mode: enum "How to display the mesh in the viewport"
+#+ * FluidSettings|DomainFluidSettings.viscosity_base -> viscosity_base: float "Viscosity setting: value that is multiplied by 10 to the power of (exponent*-1)"
+#+ * FluidSettings|DomainFluidSettings.viscosity_exponent -> viscosity_exponent: int "Negative exponent for the viscosity value (to simplify entering small values e.g. 5*10^-6.)"
+#+ * FluidSettings|DomainFluidSettings.viscosity_preset -> viscosity_preset: enum "Set viscosity of the fluid to a preset value, or use manual input"
+#+ * FluidSettings|FluidFluidSettings.initial_velocity -> initial_velocity: float[3] "Initial velocity of fluid"
+#FluidSettings|FluidFluidSettings.use -> use: boolean "Object contributes to the fluid simulation"
+#FluidSettings|FluidFluidSettings.use_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"
+#+ * FluidSettings|FluidFluidSettings.volume_initialization -> volume_initialization: enum "Volume initialization type"
+#+ * FluidSettings|InflowFluidSettings.inflow_velocity -> inflow_velocity: float[3] "Initial velocity of fluid"
+#FluidSettings|InflowFluidSettings.use -> use: boolean "Object contributes to the fluid simulation"
+#FluidSettings|InflowFluidSettings.use_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"
+#FluidSettings|InflowFluidSettings.use_local_coords -> use_local_coords: boolean "Use local coordinates for inflow. (e.g. for rotating objects)"
+#+ * FluidSettings|InflowFluidSettings.volume_initialization -> volume_initialization: enum "Volume initialization type"
+#+ * FluidSettings|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"
+#+ * FluidSettings|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"
+#+ * FluidSettings|ObstacleFluidSettings.slip_type -> slip_type: enum "NO DESCRIPTION"
+#FluidSettings|ObstacleFluidSettings.use -> use: boolean "Object contributes to the fluid simulation"
+#FluidSettings|ObstacleFluidSettings.use_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"
+#+ * FluidSettings|ObstacleFluidSettings.volume_initialization -> volume_initialization: enum "Volume initialization type"
+#FluidSettings|OutflowFluidSettings.use -> use: boolean "Object contributes to the fluid simulation"
+#FluidSettings|OutflowFluidSettings.use_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"
+#+ * FluidSettings|OutflowFluidSettings.volume_initialization -> volume_initialization: enum "Volume initialization type"
+#+ * FluidSettings|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)"
+#FluidSettings|ParticleFluidSettings.filepath -> filepath: string "Directory (and/or filename prefix) to store and load particles from"
+#+ * FluidSettings|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"
+#FluidSettings|ParticleFluidSettings.show_tracer -> show_tracer: boolean "Show tracer particles"
+#FluidSettings|ParticleFluidSettings.use_drops -> use_drops: boolean "Show drop particles"
+#FluidSettings|ParticleFluidSettings.use_floats -> use_floats: boolean "Show floating foam particles"
+#+ * Function.description -> description: string, "(read-only) Description of the Functions purpose"
+#+ * Function.identifier -> identifier: string, "(read-only) Unique name used in the code and scripting"
+#Function.is_registered -> is_registered: boolean, "(read-only) Function is registered as callback as part of type registration"
+#Function.is_registered_optional -> is_registered_optional: boolean, "(read-only) Function is optionally registered as callback part of type registration"
+#+ * Function.parameters -> parameters: collection, "(read-only) Parameters for the function"
+#Function.use_self -> use_self: boolean, "(read-only) Function does not pass its self as an argument (becomes a class method in python)"
+#+ * GPencilFrame.frame_number -> frame_number: int "The frame on which this sketch appears"
+#GPencilFrame.is_edited -> is_edited: boolean "Frame is being edited (painted on)"
+#+ * GPencilFrame.select -> select: boolean "Frame is selected for editing in the DopeSheet"
+#+ * GPencilFrame.strokes -> strokes: collection, "(read-only) Freehand curves defining the sketch on this frame"
+#+ * GPencilLayer.active -> active: boolean "Set active layer for editing"
+#+ * GPencilLayer.active_frame -> active_frame: pointer, "(read-only) Frame currently being displayed for this layer"
+#GPencilLayer.alpha -> alpha: float "Layer Opacity"
+#+ * GPencilLayer.color -> color: float[3] "Color for all strokes in this layer"
+#+ * GPencilLayer.frames -> frames: collection, "(read-only) Sketches for this layer on different frames"
+#GPencilLayer.ghost_range_max -> 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.hide -> hide: boolean "Set layer Visibility"
+#+ * GPencilLayer.info -> info: string "Layer name"
+#GPencilLayer.line_width -> line_width: int "Thickness of strokes (in pixels)"
+#+ * GPencilLayer.lock -> lock: boolean "Protect layer from further editing and/or frame changes"
+#GPencilLayer.lock_frame -> lock_frame: boolean "Lock current frame displayed by layer"
+#+ * GPencilLayer.select -> 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"
+#+ * GPencilStroke.points -> points: collection, "(read-only) Stroke data points"
+#+ * GPencilStrokePoint.co -> co: float[3] "NO DESCRIPTION"
+#+ * GPencilStrokePoint.pressure -> pressure: float "Pressure of tablet at point when drawing it"
+#+ * GameObjectSettings.actuators -> actuators: collection, "(read-only) Game engine actuators to act on events"
+#GameObjectSettings.collision_bounds_type -> collision_bounds_type: 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[3] "Relative friction coefficient in the in the X, Y and Z directions, when anisotropic friction is enabled"
+#GameObjectSettings.lock_location_x -> lock_location_x: boolean "Disable simulation of linear motion along the X axis"
+#GameObjectSettings.lock_location_y -> lock_location_y: boolean "Disable simulation of linear motion along the Y axis"
+#GameObjectSettings.lock_location_z -> lock_location_z: boolean "Disable simulation of linear motion along the Z axis"
+#GameObjectSettings.lock_rotation_x -> lock_rotation_x: boolean "Disable simulation of angular motion along the X axis"
+#GameObjectSettings.lock_rotation_y -> lock_rotation_y: boolean "Disable simulation of angular motion along the Y axis"
+#GameObjectSettings.lock_rotation_z -> lock_rotation_z: boolean "Disable simulation of angular motion along the Z axis"
+#+ * GameObjectSettings.mass -> mass: float "Mass of the object"
+#+ * 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.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_debug_state -> show_debug_state: boolean "Print state debug info in the game engine"
+#+ * 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.soft_body -> soft_body: pointer, "(read-only) Settings for Bullet soft body simulation"
+#GameObjectSettings.states_initial -> states_initial: boolean[30] "Initial state when the game starts"
+#GameObjectSettings.states_visible -> states_visible: boolean[30] "State determining which controllers are displayed"
+#+ * GameObjectSettings.use_activity_culling -> use_activity_culling: boolean "Disable simulation of angular motion along the Z axis"
+#GameObjectSettings.use_actor -> use_actor: boolean "Object is detected by the Near and Radar sensor"
+#GameObjectSettings.use_all_states -> use_all_states: boolean "Set all state bits"
+#GameObjectSettings.use_anisotropic_friction -> use_anisotropic_friction: boolean "Enable anisotropic friction"
+#+ * GameObjectSettings.use_collision_bounds -> use_collision_bounds: boolean "Specify a collision bounds type other than the default"
+#GameObjectSettings.use_collision_compound -> use_collision_compound: boolean "Add children to form a compound collision object"
+#GameObjectSettings.use_ghost -> use_ghost: boolean "Object does not restitute collisions, like a ghost"
+#GameObjectSettings.use_material_physics -> use_material_physics: boolean "Use physics settings in materials"
+#GameObjectSettings.use_rotate_from_normal -> use_rotate_from_normal: boolean "Use face normal to rotate object, so that it points away from the surface"
+#GameObjectSettings.use_sleep -> use_sleep: boolean "Disable auto (de)activation in physics simulation"
+#GameObjectSettings.used_states -> used_states: boolean[30], "(read-only) States which are being used by controllers"
+#GameObjectSettings.velocity_max -> velocity_max: float "Clamp velocity to this maximum speed"
+#GameObjectSettings.velocity_min -> velocity_min: float "Clamp velocity to this minimum speed (except when totally still)"
+#+ * GameProperty.name -> name: string "Available as GameObject attributes in the game engines python API"
+#GameProperty.show_debug -> show_debug: boolean "Print debug information for this property"
+#+ * GameProperty.type -> type: enum "NO DESCRIPTION"
+#+ * GameProperty|GameBooleanProperty.value -> value: boolean "Property value"
+#+ * GameProperty|GameFloatProperty.value -> value: float "Property value"
+#+ * GameProperty|GameIntProperty.value -> value: int "Property value"
+#+ * GameProperty|GameStringProperty.value -> value: string "Property value"
+#+ * GameProperty|GameTimerProperty.value -> value: float "Property value"
+#+ * GameSoftBodySettings.cluster_iterations -> cluster_iterations: int "Specify the number of cluster iterations"
+#GameSoftBodySettings.collision_margin -> collision_margin: float "Collision margin for soft body. Small value makes the algorithm unstable"
+#+ * GameSoftBodySettings.dynamic_friction -> dynamic_friction: float "Dynamic Friction"
+#GameSoftBodySettings.linear_stiffness -> linear_stiffness: float "Linear stiffness of the soft body links"
+#GameSoftBodySettings.location_iterations -> location_iterations: int "Position solver iterations"
+#GameSoftBodySettings.shape_threshold -> shape_threshold: float "Shape matching threshold"
+#GameSoftBodySettings.use_bending_constraints -> use_bending_constraints: boolean "Enable bending constraints"
+#GameSoftBodySettings.use_cluster_rigid_to_softbody -> use_cluster_rigid_to_softbody: boolean "Enable cluster collision between soft and rigid body"
+#GameSoftBodySettings.use_cluster_soft_to_softbody -> use_cluster_soft_to_softbody: boolean "Enable cluster collision between soft and soft body"
+#GameSoftBodySettings.use_shape_match -> use_shape_match: boolean "Enable soft body shape matching goal"
+#GameSoftBodySettings.weld_threshold -> 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)"
+#+ * Header.bl_idname -> bl_idname: string "If this is set, the header gets a custom ID, otherwise it takes the name of the class used to define the panel. For example, if the class name is OBJECT_HT_hello, and bl_idname is not set by the script, then bl_idname = OBJECT_HT_hello"
+#+ * Header.bl_space_type -> bl_space_type: enum "The space where the header is going to be used in."
+#+ * Header.layout -> layout: pointer, "(read-only) Defines the structure of the header in the UI."
+#+ * Histogram.mode -> mode: enum "Channels to display when drawing the histogram"
+#+ * ID.library -> library: pointer, "(read-only) Library file the datablock is linked from"
+#+ * ID.name -> name: string "Unique datablock ID name"
+#+ * ID.tag -> tag: boolean "Tools can use this to tag data, (initial state is undefined)"
+#ID.use_fake_user -> use_fake_user: boolean "Saves this datablock even if it has no users"
+#+ * ID.users -> users: int, "(read-only) Number of times this datablock is referenced"
+#+ * IDProperty.collection -> collection: collection, "(read-only)"
+#+ * IDProperty.double -> double: float "NO DESCRIPTION"
+#+ * IDProperty.double_array -> double_array: float[1] "NO DESCRIPTION"
+#+ * IDProperty.float -> float: float "NO DESCRIPTION"
+#+ * IDProperty.float_array -> float_array: float[1] "NO DESCRIPTION"
+#+ * IDProperty.group -> group: pointer, "(read-only)"
+#+ * IDProperty.int -> int: int "NO DESCRIPTION"
+#+ * IDProperty.int_array -> int_array: int[1] "NO DESCRIPTION"
+#+ * IDProperty.string -> string: string "NO DESCRIPTION"
+#+ * IDPropertyGroup.name -> name: string "Unique name used in the code and scripting"
+#+ * IDPropertyGroup|NetRenderJob.name -> name: string "NO DESCRIPTION"
+#+ * IDPropertyGroup|NetRenderSettings.active_blacklisted_slave_index -> active_blacklisted_slave_index: int "NO DESCRIPTION"
+#+ * IDPropertyGroup|NetRenderSettings.active_job_index -> active_job_index: int "NO DESCRIPTION"
+#+ * IDPropertyGroup|NetRenderSettings.active_slave_index -> active_slave_index: int "NO DESCRIPTION"
+#+ * IDPropertyGroup|NetRenderSettings.chunks -> chunks: int "Number of frame to dispatch to each slave in one chunk"
+#+ * IDPropertyGroup|NetRenderSettings.job_category -> job_category: string "Category of the job"
+#+ * IDPropertyGroup|NetRenderSettings.job_id -> job_id: string "id of the last sent render job"
+#+ * IDPropertyGroup|NetRenderSettings.job_name -> job_name: string "Name of the job"
+#+ * IDPropertyGroup|NetRenderSettings.jobs -> jobs: collection, "(read-only)"
+#+ * IDPropertyGroup|NetRenderSettings.mode -> mode: enum "Mode of operation of this instance"
+#+ * IDPropertyGroup|NetRenderSettings.path -> path: string "Path for temporary files"
+#+ * IDPropertyGroup|NetRenderSettings.priority -> priority: int "Priority of the job"
+#+ * IDPropertyGroup|NetRenderSettings.server_address -> server_address: string "IP or name of the master render server"
+#+ * IDPropertyGroup|NetRenderSettings.server_port -> server_port: int "port of the master render server"
+#+ * IDPropertyGroup|NetRenderSettings.slaves -> slaves: collection, "(read-only)"
+#+ * IDPropertyGroup|NetRenderSettings.slaves_blacklist -> slaves_blacklist: collection, "(read-only)"
+#IDPropertyGroup|NetRenderSettings.use_master_broadcast -> use_master_broadcast: boolean "broadcast master server address on local network"
+#IDPropertyGroup|NetRenderSettings.use_master_clear -> use_master_clear: boolean "delete saved files on exit"
+#IDPropertyGroup|NetRenderSettings.use_slave_clear -> use_slave_clear: boolean "delete downloaded files on exit"
+#IDPropertyGroup|NetRenderSettings.use_slave_output_log -> use_slave_output_log: boolean "Output render text log to console as well as sending it to the master"
+#IDPropertyGroup|NetRenderSettings.use_slave_thumb -> use_slave_thumb: boolean "Generate thumbnails on slaves instead of master"
+#+ * IDPropertyGroup|NetRenderSlave.name -> name: string "NO DESCRIPTION"
+#+ * IDPropertyGroup|OperatorFileListElement.name -> name: string "the name of a file or directory within a file list"
+#+ * IDPropertyGroup|OperatorMousePath.loc -> loc: float[2] "Mouse location"
+#+ * IDPropertyGroup|OperatorMousePath.time -> time: float "Time of mouse location"
+#+ * IDPropertyGroup|OperatorStrokeElement.location -> location: float[3] "NO DESCRIPTION"
+#+ * IDPropertyGroup|OperatorStrokeElement.mouse -> mouse: float[2] "NO DESCRIPTION"
+#+ * IDPropertyGroup|OperatorStrokeElement.pen_flip -> pen_flip: boolean "NO DESCRIPTION"
+#+ * IDPropertyGroup|OperatorStrokeElement.pressure -> pressure: float "Tablet pressure"
+#+ * IDPropertyGroup|OperatorStrokeElement.time -> time: float "NO DESCRIPTION"
+#+ * IDPropertyGroup|PoseTemplate.name -> name: string "NO DESCRIPTION"
+#+ * IDPropertyGroup|PoseTemplateSettings.active_template_index -> active_template_index: int "NO DESCRIPTION"
+#+ * IDPropertyGroup|PoseTemplateSettings.templates -> templates: collection, "(read-only)"
+#IDPropertyGroup|PoseTemplateSettings.use_generate_deform_rig -> use_generate_deform_rig: boolean "Create a copy of the metarig, constrainted by the generated rig"
+#+ * ID|Action.fcurves -> fcurves: collection, "(read-only) The individual F-Curves that make up the Action"
+#+ * ID|Action.groups -> groups: collection, "(read-only) Convenient groupings of F-Curves"
+#+ * ID|Action.pose_markers -> pose_markers: collection, "(read-only) Markers specific to this Action, for labeling poses"
+#+ * ID|Armature.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
+#+ * ID|Armature.bones -> bones: collection, "(read-only)"
+#ID|Armature.draw_type -> draw_type: enum "NO DESCRIPTION"
+#+ * ID|Armature.edit_bones -> edit_bones: collection, "(read-only)"
+#+ * ID|Armature.ghost_frame_end -> ghost_frame_end: int "End frame of range of Ghosts to display (not for Around Current Frame Onion-skinning method)"
+#+ * ID|Armature.ghost_frame_start -> ghost_frame_start: int "Starting frame of range of Ghosts to display (not for Around Current Frame Onion-skinning method)"
+#+ * ID|Armature.ghost_size -> ghost_size: int "Frame step for Ghosts (not for On Keyframes Onion-skinning method)"
+#+ * ID|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)"
+#+ * ID|Armature.ghost_type -> ghost_type: enum "Method of Onion-skinning for active Action"
+#ID|Armature.layers -> layers: boolean[32] "Armature layer visibility"
+#ID|Armature.layers_protected -> layers_protected: boolean[32] "Protected layers in Proxy Instances are restored to Proxy settings on file reload and undo"
+#+ * ID|Armature.pose_position -> pose_position: enum "Show armature in binding pose or final posed state"
+#ID|Armature.show_axes -> show_axes: boolean "Draw bone axes"
+#ID|Armature.show_bone_custom_shapes -> show_bone_custom_shapes: boolean "Draw bones with their custom shapes"
+#ID|Armature.show_group_colors -> show_group_colors: boolean "Draw bone group colors"
+#ID|Armature.show_names -> show_names: boolean "Draw bone names"
+#ID|Armature.show_only_ghost_selected -> show_only_ghost_selected: boolean "NO DESCRIPTION"
+#ID|Armature.use_auto_ik -> use_auto_ik: boolean "Add temporaral IK constraints while grabbing bones in Pose Mode"
+#ID|Armature.use_deform_delay -> use_deform_delay: boolean "Dont deform children when manipulating bones in Pose Mode"
+#ID|Armature.use_deform_envelopes -> use_deform_envelopes: boolean "Enable Bone Envelopes when defining deform"
+#ID|Armature.use_deform_preserve_volume -> use_deform_preserve_volume: boolean "Enable deform rotation with Quaternions"
+#ID|Armature.use_deform_vertex_groups -> use_deform_vertex_groups: boolean "Enable Vertex Groups when defining deform"
+#ID|Armature.use_mirror_x -> use_mirror_x: boolean "Apply changes to matching bone on opposite side of X-Axis"
+#ID|Brush.auto_smooth_factor -> auto_smooth_factor: float "Amount of smoothing to automatically apply to each stroke"
+#+ * ID|Brush.blend -> blend: enum "Brush blending mode"
+#+ * ID|Brush.clone_alpha -> clone_alpha: float "Opacity of clone image display"
+#+ * ID|Brush.clone_image -> clone_image: pointer "Image for clone tool"
+#+ * ID|Brush.clone_offset -> clone_offset: float[2] "NO DESCRIPTION"
+#+ * ID|Brush.color -> color: float[3] "NO DESCRIPTION"
+#+ * ID|Brush.crease_pinch_factor -> crease_pinch_factor: float "How much the crease brush pinches"
+#ID|Brush.cursor_color_add -> cursor_color_add: float[3] "Color of cursor when adding"
+#ID|Brush.cursor_color_subtract -> cursor_color_subtract: float[3] "Color of cursor when subtracting"
+#+ * ID|Brush.curve -> curve: pointer, "(read-only) Editable falloff curve"
+#+ * ID|Brush.direction -> direction: enum "NO DESCRIPTION"
+#+ * ID|Brush.icon_filepath -> icon_filepath: string "File path to brush icon"
+#+ * ID|Brush.imagepaint_tool -> imagepaint_tool: enum "NO DESCRIPTION"
+#+ * ID|Brush.jitter -> jitter: float "Jitter the position of the brush while painting"
+#+ * ID|Brush.normal_weight -> normal_weight: float "How much grab will pull vertexes out of surface during a grab"
+#+ * ID|Brush.plane_offset -> plane_offset: float "Adjusts plane on which the brush acts towards or away from the object surface"
+#+ * ID|Brush.plane_trim -> plane_trim: float "If a vertex is further from offset plane than this then it is not affected"
+#+ * ID|Brush.rate -> rate: float "Interval between paints for Airbrush"
+#+ * ID|Brush.sculpt_plane -> sculpt_plane: enum "NO DESCRIPTION"
+#+ * ID|Brush.sculpt_tool -> sculpt_tool: enum "NO DESCRIPTION"
+#+ * ID|Brush.size -> size: int "Radius of the brush in pixels"
+#+ * ID|Brush.smooth_stroke_factor -> smooth_stroke_factor: float "Higher values give a smoother stroke"
+#+ * ID|Brush.smooth_stroke_radius -> smooth_stroke_radius: int "Minimum distance from last point before stroke continues"
+#ID|Brush.spacing -> spacing: int "Spacing between brush daubs as a percentage of brush diameter"
+#+ * ID|Brush.strength -> strength: float "How powerful the effect of the brush is when applied"
+#+ * ID|Brush.stroke_method -> stroke_method: enum "NO DESCRIPTION"
+#+ * ID|Brush.texture -> texture: pointer "NO DESCRIPTION"
+#ID|Brush.texture_angle_source_no_random -> texture_angle_source_no_random: enum "NO DESCRIPTION"
+#ID|Brush.texture_angle_source_random -> texture_angle_source_random: enum "NO DESCRIPTION"
+#+ * ID|Brush.texture_overlay_alpha -> texture_overlay_alpha: int "NO DESCRIPTION"
+#+ * ID|Brush.texture_sample_bias -> texture_sample_bias: float "Value added to texture samples"
+#+ * ID|Brush.texture_slot -> texture_slot: pointer, "(read-only)"
+#+ * ID|Brush.unprojected_radius -> unprojected_radius: float "Radius of brush in Blender units"
+#+ * ID|Brush.use_accumulate -> use_accumulate: boolean "Accumulate stroke dabs on top of each other"
+#+ * ID|Brush.use_adaptive_space -> use_adaptive_space: boolean "Space daubs according to surface orientation instead of screen space"
+#+ * ID|Brush.use_airbrush -> use_airbrush: boolean "Keep applying paint effect while holding mouse (spray)"
+#+ * ID|Brush.use_alpha -> use_alpha: boolean "When this is disabled, lock alpha while painting"
+#+ * ID|Brush.use_anchor -> use_anchor: boolean "Keep the brush anchored to the initial location"
+#+ * ID|Brush.use_custom_icon -> use_custom_icon: boolean "Set the brush icon from an image file"
+#ID|Brush.use_edge_to_edge -> use_edge_to_edge: boolean "Drag anchor brush from edge-to-edge"
+#+ * ID|Brush.use_frontface -> use_frontface: boolean "Brush only affects vertexes that face the viewer"
+#+ * ID|Brush.use_inverse_smooth_pressure -> use_inverse_smooth_pressure: boolean "Lighter pressure causes more smoothing to be applied"
+#+ * ID|Brush.use_locked_size -> use_locked_size: boolean "When locked brush stays same size relative to object; when unlocked brush size is given in pixels"
+#+ * ID|Brush.use_offset_pressure -> use_offset_pressure: boolean "Enable tablet pressure sensitivity for offset"
+#+ * ID|Brush.use_original_normal -> use_original_normal: boolean "When locked keep using normal of surface where stroke was initiated"
+#+ * ID|Brush.use_paint_sculpt -> use_paint_sculpt: boolean "Use this brush in sculpt mode"
+#+ * ID|Brush.use_paint_texture -> use_paint_texture: boolean "Use this brush in texture paint mode"
+#+ * ID|Brush.use_paint_vertex -> use_paint_vertex: boolean "Use this brush in vertex paint mode"
+#+ * ID|Brush.use_paint_weight -> use_paint_weight: boolean "Use this brush in weight paint mode"
+#+ * ID|Brush.use_persistent -> use_persistent: boolean "Sculpts on a persistent layer of the mesh"
+#+ * ID|Brush.use_plane_trim -> use_plane_trim: boolean "Enable Plane Trim"
+#ID|Brush.use_pressure_jitter -> use_pressure_jitter: boolean "Enable tablet pressure sensitivity for jitter"
+#ID|Brush.use_pressure_size -> use_pressure_size: boolean "Enable tablet pressure sensitivity for size"
+#ID|Brush.use_pressure_spacing -> use_pressure_spacing: boolean "Enable tablet pressure sensitivity for spacing"
+#ID|Brush.use_pressure_strength -> use_pressure_strength: boolean "Enable tablet pressure sensitivity for strength"
+#+ * ID|Brush.use_rake -> use_rake: boolean "Rotate the brush texture to match the stroke direction"
+#+ * ID|Brush.use_random_rotation -> use_random_rotation: boolean "Rotate the brush texture at random"
+#ID|Brush.use_restore_mesh -> use_restore_mesh: boolean "Allows a single dot to be carefully positioned"
+#+ * ID|Brush.use_smooth_stroke -> use_smooth_stroke: boolean "Brush lags behind mouse and follows a smoother path"
+#+ * ID|Brush.use_space -> use_space: boolean "Limit brush application to the distance specified by spacing"
+#+ * ID|Brush.use_space_atten -> use_space_atten: boolean "Automatically adjusts strength to give consistent results for different spacings"
+#+ * ID|Brush.use_texture_overlay -> use_texture_overlay: boolean "Show texture in viewport"
+#+ * ID|Brush.use_wrap -> use_wrap: boolean "Enable torus wrapping while painting"
+#+ * ID|Brush.vertexpaint_tool -> vertexpaint_tool: enum "NO DESCRIPTION"
+#+ * ID|Camera.angle -> angle: float "Perspective Camera lens field of view in degrees"
+#+ * ID|Camera.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
+#+ * ID|Camera.clip_end -> clip_end: float "Camera far clipping distance"
+#+ * ID|Camera.clip_start -> clip_start: float "Camera near clipping distance"
+#+ * ID|Camera.dof_distance -> dof_distance: float "Distance to the focus point for depth of field"
+#+ * ID|Camera.dof_object -> dof_object: pointer "Use this object to define the depth of field focal point"
+#+ * ID|Camera.draw_size -> draw_size: float "Apparent size of the Camera object in the 3D View"
+#+ * ID|Camera.lens -> lens: float "Perspective Camera lens value in millimeters"
+#+ * ID|Camera.lens_unit -> lens_unit: enum "Unit to edit lens in for the user interface"
+#+ * ID|Camera.ortho_scale -> ortho_scale: float "Orthographic Camera scale (similar to zoom)"
+#+ * ID|Camera.passepartout_alpha -> passepartout_alpha: float "Opacity (alpha) of the darkened overlay in Camera view"
+#+ * ID|Camera.shift_x -> shift_x: float "Perspective Camera horizontal shift"
+#+ * ID|Camera.shift_y -> shift_y: float "Perspective Camera vertical shift"
+#+ * ID|Camera.show_limits -> show_limits: boolean "Draw the clipping range and focus point on the camera"
+#+ * ID|Camera.show_mist -> show_mist: boolean "Draw a line from the Camera to indicate the mist area"
+#+ * ID|Camera.show_name -> show_name: boolean "Show the active Cameras name in Camera view"
+#+ * ID|Camera.show_passepartout -> show_passepartout: boolean "Show a darkened overlay outside the image area in Camera view"
+#+ * ID|Camera.show_title_safe -> show_title_safe: boolean "Show indicators for the title safe zone in Camera view"
+#+ * ID|Camera.type -> type: enum "Camera types"
+#ID|Camera.use_panorama -> use_panorama: boolean "Render the scene with a cylindrical camera for pseudo-fisheye lens effects"
+#+ * ID|Curve.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
+#+ * ID|Curve.bevel_depth -> bevel_depth: float "Bevel depth when not using a bevel object"
+#+ * ID|Curve.bevel_object -> bevel_object: pointer "Curve object name that defines the bevel shape"
+#+ * ID|Curve.bevel_resolution -> bevel_resolution: int "Bevel resolution when depth is non-zero and no specific bevel object has been defined"
+#+ * ID|Curve.dimensions -> dimensions: enum "Select 2D or 3D curve type"
+#+ * ID|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"
+#+ * ID|Curve.extrude -> extrude: float "Amount of curve extrusion when not using a bevel object"
+#+ * ID|Curve.materials -> materials: collection, "(read-only)"
+#ID|Curve.offset -> offset: float "Scale the original width (1.0) based on given factor"
+#ID|Curve.path_duration -> path_duration: int "The number of frames that are needed to traverse the path, defining the maximum value for the Evaluation Time setting"
+#+ * ID|Curve.render_resolution_u -> render_resolution_u: int "Surface resolution in U direction used while rendering. Zero skips this property"
+#+ * ID|Curve.render_resolution_v -> render_resolution_v: int "Surface resolution in V direction used while rendering. Zero skips this property"
+#+ * ID|Curve.resolution_u -> resolution_u: int "Surface resolution in U direction"
+#+ * ID|Curve.resolution_v -> resolution_v: int "Surface resolution in V direction"
+#+ * ID|Curve.shape_keys -> shape_keys: pointer, "(read-only)"
+#ID|Curve.show_handles -> show_handles: boolean "Display bezier handles in editmode"
+#ID|Curve.show_normal_face -> show_normal_face: boolean "Display 3D curve normals in editmode"
+#+ * ID|Curve.splines -> splines: collection, "(read-only) Collection of splines in this curve data object"
+#+ * ID|Curve.taper_object -> taper_object: pointer "Curve object name that defines the taper (width)"
+#ID|Curve.texspace_location -> texspace_location: float[3] "Texture space location"
+#+ * ID|Curve.texspace_size -> texspace_size: float[3] "Texture space size"
+#+ * ID|Curve.twist_mode -> twist_mode: enum "The type of tilt calculation for 3D Curves"
+#+ * ID|Curve.twist_smooth -> twist_smooth: float "Smoothing iteration for tangents"
+#ID|Curve.use_auto_texspace -> use_auto_texspace: boolean "Adjusts active objects texture space automatically when transforming object"
+#+ * ID|Curve.use_deform_bounds -> use_deform_bounds: boolean "Use the mesh bounds to clamp the deformation"
+#ID|Curve.use_fill_back -> use_fill_back: boolean "Draw filled back for extruded/beveled curves"
+#ID|Curve.use_fill_deform -> use_fill_deform: boolean "Fill curve after applying deformation"
+#ID|Curve.use_fill_front -> use_fill_front: boolean "Draw filled front for extruded/beveled curves"
+#ID|Curve.use_map_on_length -> use_map_on_length: boolean "Generate texture mapping coordinates following the curve direction, rather than the local bounding box"
+#+ * ID|Curve.use_path -> use_path: boolean "Enable the curve to become a translation path"
+#+ * ID|Curve.use_path_follow -> use_path_follow: boolean "Make curve path children to rotate along the path"
+#+ * ID|Curve.use_radius -> use_radius: boolean "Option for paths: apply the curve radius with path following it and deforming"
+#+ * ID|Curve.use_stretch -> use_stretch: boolean "Option for curve-deform: makes deformed child to stretch along entire path"
+#+ * ID|Curve.use_time_offset -> use_time_offset: boolean "Children will use TimeOffs value as path distance offset"
+#ID|Curve|SurfaceCurve.use_map_on_length -> use_map_on_length: boolean "Generate texture mapping coordinates following the curve direction, rather than the local bounding box"
+#MAKE COLLECTION ATTR * ID|Curve|TextCurve.active_textbox -> active_textbox: int "NO DESCRIPTION"
+#ID|Curve|TextCurve.align -> align: enum "Text align from the object center"
+#+ * ID|Curve|TextCurve.body -> body: string "contents of this text object"
+#+ * ID|Curve|TextCurve.body_format -> body_format: collection, "(read-only) Stores the style of each character"
+#+ * ID|Curve|TextCurve.edit_format -> edit_format: pointer, "(read-only) Editing settings character formatting"
+#+ * ID|Curve|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"
+#ID|Curve|TextCurve.follow_curve -> follow_curve: pointer "Curve deforming text object"
+#+ * ID|Curve|TextCurve.font -> font: pointer "NO DESCRIPTION"
+#+ * ID|Curve|TextCurve.offset_x -> offset_x: float "Horizontal offset from the object origin"
+#+ * ID|Curve|TextCurve.offset_y -> offset_y: float "Vertical offset from the object origin"
+#+ * ID|Curve|TextCurve.shear -> shear: float "Italic angle of the characters"
+#ID|Curve|TextCurve.size -> size: float "NO DESCRIPTION"
+#+ * ID|Curve|TextCurve.small_caps_scale -> small_caps_scale: float "Scale of small capitals"
+#ID|Curve|TextCurve.space_character -> space_character: float "NO DESCRIPTION"
+#ID|Curve|TextCurve.space_line -> space_line: float "NO DESCRIPTION"
+#ID|Curve|TextCurve.space_word -> space_word: float "NO DESCRIPTION"
+#ID|Curve|TextCurve.text_boxes -> text_boxes: collection, "(read-only)"
+#ID|Curve|TextCurve.underline_height -> underline_height: float "NO DESCRIPTION"
+#ID|Curve|TextCurve.underline_position -> underline_position: float "Vertical position of underline"
+#ID|Curve|TextCurve.use_fast_edit -> use_fast_edit: boolean "Dont fill polygons while editing"
+#ID|Curve|TextCurve.use_map_on_length -> use_map_on_length: boolean "Generate texture mapping coordinates following the curve direction, rather than the local bounding box"
+#+ * ID|GreasePencil.draw_mode -> draw_mode: enum "NO DESCRIPTION"
+#+ * ID|GreasePencil.layers -> layers: collection, "(read-only)"
+#+ * ID|GreasePencil.use_stroke_endpoints -> use_stroke_endpoints: boolean "Only use the first and last parts of the stroke for snapping"
+#+ * ID|Group.dupli_offset -> dupli_offset: float[3] "Offset from the origin to use when instancing as DupliGroup"
+#ID|Group.layers -> layers: boolean[20] "Layers visible when this groups is instanced as a dupli"
+#+ * ID|Group.objects -> objects: collection, "(read-only) A collection of this groups objects"
+#+ * ID|Image.bindcode -> bindcode: int, "(read-only) OpenGL bindcode"
+#+ * ID|Image.depth -> depth: int, "(read-only) Image bit depth"
+#+ * ID|Image.display_aspect -> display_aspect: float[2] "Display Aspect for this image, does not affect rendering"
+#+ * ID|Image.field_order -> field_order: enum "Order of video fields. Select which lines are displayed first"
+#+ * ID|Image.file_format -> file_format: enum "Format used for re-saving this file"
+#+ * ID|Image.filepath -> filepath: string "Image/Movie file name"
+#+ * ID|Image.filepath_raw -> filepath_raw: string "Image/Movie file name (without data refreshing)"
+#ID|Image.fps -> fps: int "Speed of the animation in frames per second"
+#ID|Image.frame_end -> frame_end: int "End frame of an animated texture"
+#ID|Image.frame_start -> frame_start: int "Start frame of an animated texture"
+#+ * ID|Image.generated_height -> generated_height: int "Generated image height"
+#+ * ID|Image.generated_type -> generated_type: enum "Generated image type"
+#+ * ID|Image.generated_width -> generated_width: int "Generated image width"
+#+ * ID|Image.has_data -> has_data: boolean, "(read-only) True if this image has data"
+#ID|Image.is_dirty -> is_dirty: boolean, "(read-only) Image has changed and is not saved"
+#+ * ID|Image.mapping -> mapping: enum "Mapping type to use for this image in the game engine"
+#+ * ID|Image.packed_file -> packed_file: pointer, "(read-only)"
+#+ * ID|Image.size -> size: int[2], "(read-only) Width and height in pixels, zero when image data cant be loaded"
+#+ * ID|Image.source -> source: enum "Where the image comes from"
+#+ * ID|Image.tiles_x -> tiles_x: int "Degree of repetition in the X direction"
+#+ * ID|Image.tiles_y -> tiles_y: int "Degree of repetition in the Y direction"
+#+ * ID|Image.type -> type: enum, "(read-only) How to generate the image"
+#ID|Image.use_animation -> use_animation: boolean "Use as animated texture in the game engine"
+#ID|Image.use_clamp_x -> use_clamp_x: boolean "Disable texture repeating horizontally"
+#ID|Image.use_clamp_y -> use_clamp_y: boolean "Disable texture repeating vertically"
+#ID|Image.use_fields -> use_fields: boolean "Use fields of the image"
+#ID|Image.use_premultiply -> use_premultiply: boolean "Convert RGB from key alpha to premultiplied alpha"
+#ID|Image.use_tiles -> use_tiles: boolean "Use of tilemode for faces (default shift-LMB to pick the tile for selected faces)"
+#+ * ID|Key.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
+#+ * ID|Key.keys -> keys: collection, "(read-only) Shape keys"
+#+ * ID|Key.reference_key -> reference_key: pointer, "(read-only)"
+#+ * ID|Key.slurph -> slurph: int "Creates a delay in amount of frames in applying keypositions, first vertex goes first"
+#ID|Key.use_relative -> use_relative: boolean "Makes shape keys relative"
+#+ * ID|Key.user -> user: pointer, "(read-only) Datablock using these shape keys"
+#+ * ID|Lamp.active_texture -> active_texture: pointer "Active texture slot being displayed"
+#+ * ID|Lamp.active_texture_index -> active_texture_index: int "Index of active texture slot"
+#+ * ID|Lamp.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
+#+ * ID|Lamp.color -> color: float[3] "Light color"
+#+ * ID|Lamp.distance -> distance: float "Falloff distance - the light is at half the original intensity at this point"
+#+ * ID|Lamp.energy -> energy: float "Amount of light that the lamp emits"
+#+ * ID|Lamp.texture_slots -> texture_slots: collection, "(read-only) Texture slots defining the mapping and influence of textures"
+#+ * ID|Lamp.type -> type: enum "Type of Lamp"
+#ID|Lamp.use_diffuse -> use_diffuse: boolean "Lamp does diffuse shading"
+#ID|Lamp.use_negative -> use_negative: boolean "Lamp casts negative light"
+#ID|Lamp.use_own_layer -> use_own_layer: boolean "Illuminates objects only on the same layer the lamp is on"
+#ID|Lamp.use_specular -> use_specular: boolean "Lamp creates specular highlights"
+#+ * ID|Lamp|AreaLamp.gamma -> gamma: float "Light gamma correction value"
+#+ * ID|Lamp|AreaLamp.shadow_adaptive_threshold -> shadow_adaptive_threshold: float "Threshold for Adaptive Sampling (Raytraced shadows)"
+#+ * ID|Lamp|AreaLamp.shadow_color -> shadow_color: float[3] "Color of shadows cast by the lamp"
+#+ * ID|Lamp|AreaLamp.shadow_method -> shadow_method: enum "Method to compute lamp shadow with"
+#ID|Lamp|AreaLamp.shadow_ray_sample_method -> shadow_ray_sample_method: enum "Method for generating shadow samples: Adaptive QMC is fastest, Constant QMC is less noisy but slower"
+#+ * ID|Lamp|AreaLamp.shadow_ray_samples_x -> shadow_ray_samples_x: int "Amount of samples taken extra (samples x samples)"
+#+ * ID|Lamp|AreaLamp.shadow_ray_samples_y -> shadow_ray_samples_y: int "Amount of samples taken extra (samples x samples)"
+#+ * ID|Lamp|AreaLamp.shadow_soft_size -> shadow_soft_size: float "Light size for ray shadow sampling (Raytraced shadows)"
+#+ * ID|Lamp|AreaLamp.shape -> shape: enum "Shape of the area lamp"
+#+ * ID|Lamp|AreaLamp.size -> size: float "Size of the area of the area Lamp, X direction size for Rectangle shapes"
+#+ * ID|Lamp|AreaLamp.size_y -> size_y: float "Size of the area of the area Lamp in the Y direction for Rectangle shapes"
+#ID|Lamp|AreaLamp.use_dither -> use_dither: boolean "Use 2x2 dithering for sampling (Constant Jittered sampling)"
+#ID|Lamp|AreaLamp.use_jitter -> use_jitter: boolean "Use noise for sampling (Constant Jittered sampling)"
+#ID|Lamp|AreaLamp.use_only_shadow -> use_only_shadow: boolean "Causes light to cast shadows only without illuminating objects"
+#ID|Lamp|AreaLamp.use_shadow_layer -> use_shadow_layer: boolean "Causes only objects on the same layer to cast shadows"
+#ID|Lamp|AreaLamp.use_umbra -> use_umbra: boolean "Emphasize parts that are fully shadowed (Constant Jittered sampling)"
+#+ * ID|Lamp|PointLamp.falloff_curve -> falloff_curve: pointer, "(read-only) Custom Lamp Falloff Curve"
+#+ * ID|Lamp|PointLamp.falloff_type -> falloff_type: enum "Intensity Decay with distance"
+#+ * ID|Lamp|PointLamp.linear_attenuation -> linear_attenuation: float "Linear distance attenuation"
+#+ * ID|Lamp|PointLamp.quadratic_attenuation -> quadratic_attenuation: float "Quadratic distance attenuation"
+#+ * ID|Lamp|PointLamp.shadow_adaptive_threshold -> shadow_adaptive_threshold: float "Threshold for Adaptive Sampling (Raytraced shadows)"
+#+ * ID|Lamp|PointLamp.shadow_color -> shadow_color: float[3] "Color of shadows cast by the lamp"
+#+ * ID|Lamp|PointLamp.shadow_method -> shadow_method: enum "Method to compute lamp shadow with"
+#ID|Lamp|PointLamp.shadow_ray_sample_method -> shadow_ray_sample_method: enum "Method for generating shadow samples: Adaptive QMC is fastest, Constant QMC is less noisy but slower"
+#+ * ID|Lamp|PointLamp.shadow_ray_samples -> shadow_ray_samples: int "Amount of samples taken extra (samples x samples)"
+#+ * ID|Lamp|PointLamp.shadow_soft_size -> shadow_soft_size: float "Light size for ray shadow sampling (Raytraced shadows)"
+#ID|Lamp|PointLamp.use_only_shadow -> use_only_shadow: boolean "Causes light to cast shadows only without illuminating objects"
+#ID|Lamp|PointLamp.use_shadow_layer -> use_shadow_layer: boolean "Causes only objects on the same layer to cast shadows"
+#ID|Lamp|PointLamp.use_sphere -> use_sphere: boolean "Sets light intensity to zero beyond lamp distance"
+#+ * ID|Lamp|SpotLamp.compression_threshold -> compression_threshold: float "Deep shadow map compression threshold"
+#+ * ID|Lamp|SpotLamp.falloff_curve -> falloff_curve: pointer, "(read-only) Custom Lamp Falloff Curve"
+#+ * ID|Lamp|SpotLamp.falloff_type -> falloff_type: enum "Intensity Decay with distance"
+#+ * ID|Lamp|SpotLamp.halo_intensity -> halo_intensity: float "Brightness of the spotlights halo cone (Buffer Shadows)"
+#+ * ID|Lamp|SpotLamp.halo_step -> halo_step: int "Volumetric halo sampling frequency"
+#+ * ID|Lamp|SpotLamp.linear_attenuation -> linear_attenuation: float "Linear distance attenuation"
+#+ * ID|Lamp|SpotLamp.quadratic_attenuation -> quadratic_attenuation: float "Quadratic distance attenuation"
+#+ * ID|Lamp|SpotLamp.shadow_adaptive_threshold -> shadow_adaptive_threshold: float "Threshold for Adaptive Sampling (Raytraced shadows)"
+#+ * ID|Lamp|SpotLamp.shadow_buffer_bias -> shadow_buffer_bias: float "Shadow buffer sampling bias"
+#+ * ID|Lamp|SpotLamp.shadow_buffer_clip_end -> shadow_buffer_clip_end: float "Shadow map clip end beyond which objects will not generate shadows"
+#+ * ID|Lamp|SpotLamp.shadow_buffer_clip_start -> shadow_buffer_clip_start: float "Shadow map clip start: objects closer will not generate shadows"
+#+ * ID|Lamp|SpotLamp.shadow_buffer_samples -> shadow_buffer_samples: int "Number of shadow buffer samples"
+#+ * ID|Lamp|SpotLamp.shadow_buffer_size -> shadow_buffer_size: int "Resolution of the shadow buffer, higher values give crisper shadows but use more memory"
+#+ * ID|Lamp|SpotLamp.shadow_buffer_soft -> shadow_buffer_soft: float "Size of shadow buffer sampling area"
+#+ * ID|Lamp|SpotLamp.shadow_buffer_type -> shadow_buffer_type: enum "Type of shadow buffer"
+#+ * ID|Lamp|SpotLamp.shadow_color -> shadow_color: float[3] "Color of shadows cast by the lamp"
+#+ * ID|Lamp|SpotLamp.shadow_filter_type -> shadow_filter_type: enum "Type of shadow filter (Buffer Shadows)"
+#+ * ID|Lamp|SpotLamp.shadow_method -> shadow_method: enum "Method to compute lamp shadow with"
+#ID|Lamp|SpotLamp.shadow_ray_sample_method -> shadow_ray_sample_method: enum "Method for generating shadow samples: Adaptive QMC is fastest, Constant QMC is less noisy but slower"
+#+ * ID|Lamp|SpotLamp.shadow_ray_samples -> shadow_ray_samples: int "Amount of samples taken extra (samples x samples)"
+#+ * ID|Lamp|SpotLamp.shadow_sample_buffers -> shadow_sample_buffers: enum "Number of shadow buffers to render for better AA, this increases memory usage"
+#+ * ID|Lamp|SpotLamp.shadow_soft_size -> shadow_soft_size: float "Light size for ray shadow sampling (Raytraced shadows)"
+#+ * ID|Lamp|SpotLamp.show_cone -> show_cone: boolean "Draw transparent cone in 3D view to visualize which objects are contained in it"
+#+ * ID|Lamp|SpotLamp.spot_blend -> spot_blend: float "The softness of the spotlight edge"
+#+ * ID|Lamp|SpotLamp.spot_size -> spot_size: float "Angle of the spotlight beam in degrees"
+#ID|Lamp|SpotLamp.use_auto_clip_end -> use_auto_clip_end: boolean "Automatic calculation of clipping-end, based on visible vertices"
+#ID|Lamp|SpotLamp.use_auto_clip_start -> use_auto_clip_start: boolean "Automatic calculation of clipping-start, based on visible vertices"
+#ID|Lamp|SpotLamp.use_halo -> use_halo: boolean "Renders spotlight with a volumetric halo (Buffer Shadows)"
+#ID|Lamp|SpotLamp.use_only_shadow -> use_only_shadow: boolean "Causes light to cast shadows only without illuminating objects"
+#ID|Lamp|SpotLamp.use_shadow_layer -> use_shadow_layer: boolean "Causes only objects on the same layer to cast shadows"
+#ID|Lamp|SpotLamp.use_sphere -> use_sphere: boolean "Sets light intensity to zero beyond lamp distance"
+#ID|Lamp|SpotLamp.use_square -> use_square: boolean "Casts a square spot light shape"
+#+ * ID|Lamp|SunLamp.shadow_adaptive_threshold -> shadow_adaptive_threshold: float "Threshold for Adaptive Sampling (Raytraced shadows)"
+#+ * ID|Lamp|SunLamp.shadow_color -> shadow_color: float[3] "Color of shadows cast by the lamp"
+#+ * ID|Lamp|SunLamp.shadow_method -> shadow_method: enum "Method to compute lamp shadow with"
+#ID|Lamp|SunLamp.shadow_ray_sample_method -> shadow_ray_sample_method: enum "Method for generating shadow samples: Adaptive QMC is fastest, Constant QMC is less noisy but slower"
+#+ * ID|Lamp|SunLamp.shadow_ray_samples -> shadow_ray_samples: int "Amount of samples taken extra (samples x samples)"
+#+ * ID|Lamp|SunLamp.shadow_soft_size -> shadow_soft_size: float "Light size for ray shadow sampling (Raytraced shadows)"
+#+ * ID|Lamp|SunLamp.sky -> sky: pointer, "(read-only) Sky related settings for sun lamps"
+#ID|Lamp|SunLamp.use_only_shadow -> use_only_shadow: boolean "Causes light to cast shadows only without illuminating objects"
+#ID|Lamp|SunLamp.use_shadow_layer -> use_shadow_layer: boolean "Causes only objects on the same layer to cast shadows"
+#+ * ID|Lattice.interpolation_type_u -> interpolation_type_u: enum "NO DESCRIPTION"
+#+ * ID|Lattice.interpolation_type_v -> interpolation_type_v: enum "NO DESCRIPTION"
+#+ * ID|Lattice.interpolation_type_w -> interpolation_type_w: enum "NO DESCRIPTION"
+#+ * ID|Lattice.points -> points: collection, "(read-only) Points of the lattice"
+#+ * ID|Lattice.points_u -> points_u: int "Points in U direction (cant be changed when there are shape keys)"
+#+ * ID|Lattice.points_v -> points_v: int "Points in V direction (cant be changed when there are shape keys)"
+#+ * ID|Lattice.points_w -> points_w: int "Points in W direction (cant be changed when there are shape keys)"
+#+ * ID|Lattice.shape_keys -> shape_keys: pointer, "(read-only)"
+#ID|Lattice.use_outside -> use_outside: boolean "Only draw, and take into account, the outer vertices"
+#+ * ID|Lattice.vertex_group -> vertex_group: string "Vertex group to apply the influence of the lattice"
+#+ * ID|Library.filepath -> filepath: string "Path to the library .blend file"
+#+ * ID|Library.parent -> parent: pointer, "(read-only)"
+#+ * ID|Material.active_node_material -> active_node_material: pointer "Active node material"
+#+ * ID|Material.active_texture -> active_texture: pointer "Active texture slot being displayed"
+#+ * ID|Material.active_texture_index -> active_texture_index: int "Index of active texture slot"
+#+ * ID|Material.alpha -> alpha: float "Alpha transparency of the material"
+#+ * ID|Material.ambient -> ambient: float "Amount of global ambient color the material receives"
+#+ * ID|Material.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
+#+ * ID|Material.darkness -> darkness: float "Minnaert darkness"
+#+ * ID|Material.diffuse_color -> diffuse_color: float[3] "NO DESCRIPTION"
+#+ * ID|Material.diffuse_fresnel -> diffuse_fresnel: float "Power of Fresnel"
+#+ * ID|Material.diffuse_fresnel_factor -> diffuse_fresnel_factor: float "Blending factor of Fresnel"
+#+ * ID|Material.diffuse_intensity -> diffuse_intensity: float "Amount of diffuse reflection"
+#+ * ID|Material.diffuse_ramp -> diffuse_ramp: pointer, "(read-only) Color ramp used to affect diffuse shading"
+#+ * ID|Material.diffuse_ramp_blend -> diffuse_ramp_blend: enum "NO DESCRIPTION"
+#+ * ID|Material.diffuse_ramp_factor -> diffuse_ramp_factor: float "Blending factor (also uses alpha in Colorband)"
+#+ * ID|Material.diffuse_ramp_input -> diffuse_ramp_input: enum "NO DESCRIPTION"
+#+ * ID|Material.diffuse_shader -> diffuse_shader: enum "NO DESCRIPTION"
+#+ * ID|Material.diffuse_toon_size -> diffuse_toon_size: float "Size of diffuse toon area"
+#+ * ID|Material.diffuse_toon_smooth -> diffuse_toon_smooth: float "Smoothness of diffuse toon area"
+#+ * ID|Material.emit -> emit: float "Amount of light to emit"
+#+ * ID|Material.halo -> halo: pointer, "(read-only) Halo settings for the material"
+#+ * ID|Material.invert_z -> invert_z: boolean "Renders materials faces with an inverted Z buffer (scanline only)"
+#+ * ID|Material.light_group -> light_group: pointer "Limit lighting to lamps in this Group"
+#+ * ID|Material.mirror_color -> mirror_color: float[3] "Mirror color of the material"
+#+ * ID|Material.node_tree -> node_tree: pointer, "(read-only) Node tree for node based materials"
+#ID|Material.offset_z -> offset_z: float "Gives faces an artificial offset in the Z buffer for Z transparency"
+#+ * ID|Material.physics -> physics: pointer, "(read-only) Game physics settings"
+#+ * ID|Material.preview_render_type -> preview_render_type: enum "Type of preview render"
+#+ * ID|Material.raytrace_mirror -> raytrace_mirror: pointer, "(read-only) Raytraced reflection settings for the material"
+#+ * ID|Material.raytrace_transparency -> raytrace_transparency: pointer, "(read-only) Raytraced transparency settings for the material"
+#+ * ID|Material.roughness -> roughness: float "Oren-Nayar Roughness"
+#+ * ID|Material.shadow_buffer_bias -> shadow_buffer_bias: float "Factor to multiply shadow buffer bias with (0 is ignore.)"
+#ID|Material.shadow_cast_alpha -> shadow_cast_alpha: float "Shadow casting alpha, in use for Irregular and Deep shadow buffer"
+#+ * ID|Material.shadow_ray_bias -> shadow_ray_bias: float "Shadow raytracing bias to prevent terminator problems on shadow boundary"
+#+ * ID|Material.specular_alpha -> specular_alpha: float "Alpha transparency for specular areas"
+#+ * ID|Material.specular_color -> specular_color: float[3] "Specular color of the material"
+#+ * ID|Material.specular_hardness -> specular_hardness: int "NO DESCRIPTION"
+#+ * ID|Material.specular_intensity -> specular_intensity: float "NO DESCRIPTION"
+#+ * ID|Material.specular_ior -> specular_ior: float "NO DESCRIPTION"
+#+ * ID|Material.specular_ramp -> specular_ramp: pointer, "(read-only) Color ramp used to affect specular shading"
+#+ * ID|Material.specular_ramp_blend -> specular_ramp_blend: enum "NO DESCRIPTION"
+#+ * ID|Material.specular_ramp_factor -> specular_ramp_factor: float "Blending factor (also uses alpha in Colorband)"
+#+ * ID|Material.specular_ramp_input -> specular_ramp_input: enum "NO DESCRIPTION"
+#+ * ID|Material.specular_shader -> specular_shader: enum "NO DESCRIPTION"
+#+ * ID|Material.specular_slope -> specular_slope: float "The standard deviation of surface slope"
+#+ * ID|Material.specular_toon_size -> specular_toon_size: float "Size of specular toon area"
+#+ * ID|Material.specular_toon_smooth -> specular_toon_smooth: float "Smoothness of specular toon area"
+#+ * ID|Material.strand -> strand: pointer, "(read-only) Strand settings for the material"
+#+ * ID|Material.subsurface_scattering -> subsurface_scattering: pointer, "(read-only) Subsurface scattering settings for the material"
+#+ * ID|Material.texture_slots -> texture_slots: collection, "(read-only) Texture slots defining the mapping and influence of textures"
+#+ * ID|Material.translucency -> translucency: float "Amount of diffuse shading on the back side"
+#+ * ID|Material.transparency_method -> transparency_method: enum "Method to use for rendering transparency"
+#+ * ID|Material.type -> type: enum "Material type defining how the object is rendered"
+#ID|Material.use_cast_approximate -> use_cast_approximate: boolean "Allow this material to cast shadows when using approximate ambient occlusion."
+#ID|Material.use_cast_buffer_shadows -> use_cast_buffer_shadows: boolean "Allow this material to cast shadows from shadow buffer lamps"
+#ID|Material.use_cast_shadows_only -> use_cast_shadows_only: boolean "Makes objects with this material appear invisible, only casting shadows (not rendered)"
+#ID|Material.use_cubic -> use_cubic: boolean "Use cubic interpolation for diffuse values, for smoother transitions"
+#+ * ID|Material.use_diffuse_ramp -> use_diffuse_ramp: boolean "Toggle diffuse ramp operations"
+#ID|Material.use_face_texture -> use_face_texture: boolean "Replaces the objects base color with color from face assigned image textures"
+#ID|Material.use_face_texture_alpha -> use_face_texture_alpha: boolean "Replaces the objects base alpha value with alpha from face assigned image textures"
+#ID|Material.use_full_oversampling -> use_full_oversampling: boolean "Force this material to render full shading/textures for all anti-aliasing samples"
+#ID|Material.use_light_group_exclusive -> use_light_group_exclusive: boolean "Material uses the light group exclusively - these lamps are excluded from other scene lighting"
+#ID|Material.use_mist -> use_mist: boolean "Use mist with this material (in world settings)"
+#+ * ID|Material.use_nodes -> use_nodes: boolean "Use shader nodes to render the material"
+#ID|Material.use_object_color -> use_object_color: boolean "Modulate the result with a per-object color"
+#ID|Material.use_only_shadow -> use_only_shadow: boolean "Renders shadows as the materials alpha value, making materials transparent except for shadowed areas"
+#ID|Material.use_ray_shadow_bias -> use_ray_shadow_bias: boolean "Prevents raytraced shadow errors on surfaces with smooth shaded normals (terminator problem)"
+#ID|Material.use_raytrace -> use_raytrace: boolean "Include this material and geometry that uses it in ray tracing calculations"
+#ID|Material.use_shadeless -> use_shadeless: boolean "Makes this material insensitive to light or shadow"
+#ID|Material.use_shadows -> use_shadows: boolean "Allows this material to receive shadows"
+#+ * ID|Material.use_sky -> use_sky: boolean "Renders this material with zero alpha, with sky background in place (scanline only)"
+#+ * ID|Material.use_specular_ramp -> use_specular_ramp: boolean "Toggle specular ramp operations"
+#ID|Material.use_tangent_shading -> use_tangent_shading: boolean "Use the materials tangent vector instead of the normal for shading - for anisotropic shading effects"
+#+ * ID|Material.use_textures -> use_textures: boolean[18] "Enable/Disable each texture"
+#ID|Material.use_transparency -> use_transparency: boolean "Render material as transparent"
+#ID|Material.use_transparent_shadows -> use_transparent_shadows: boolean "Allow this object to receive transparent shadows casted through other objects"
+#ID|Material.use_vertex_color_light -> use_vertex_color_light: boolean "Add vertex colors as additional lighting"
+#ID|Material.use_vertex_color_paint -> use_vertex_color_paint: boolean "Replaces object base color with vertex colors (multiplies with texture face face assigned textures)"
+#+ * ID|Material.volume -> volume: pointer, "(read-only) Volume settings for the material"
+#+ * ID|Mesh.active_uv_texture_index -> active_uv_texture_index: int "Active UV texture index"
+#+ * ID|Mesh.active_vertex_color_index -> active_vertex_color_index: int "Active vertex color index"
+#+ * ID|Mesh.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
+#ID|Mesh.auto_smooth_angle -> auto_smooth_angle: int "Defines maximum angle between face normals that Auto Smooth will operate on"
+#+ * ID|Mesh.edges -> edges: collection, "(read-only) Edges of the mesh"
+#+ * ID|Mesh.faces -> faces: collection, "(read-only) Faces of the mesh"
+#ID|Mesh.layers_float -> layers_float: collection, "(read-only)"
+#ID|Mesh.layers_int -> layers_int: collection, "(read-only)"
+#ID|Mesh.layers_string -> layers_string: collection, "(read-only)"
+#+ * ID|Mesh.materials -> materials: collection, "(read-only)"
+#+ * ID|Mesh.shape_keys -> shape_keys: pointer, "(read-only)"
+#ID|Mesh.show_all_edges -> show_all_edges: boolean "Displays all edges for wireframe in all view modes in the 3D view"
+#ID|Mesh.show_double_sided -> show_double_sided: boolean "Render/display the mesh with double or single sided lighting"
+#ID|Mesh.show_edge_bevel_weight -> show_edge_bevel_weight: boolean "Displays weights created for the Bevel modifier"
+#ID|Mesh.show_edge_crease -> show_edge_crease: boolean "Displays creases created for subsurf weighting"
+#ID|Mesh.show_edge_seams -> show_edge_seams: boolean "Displays UV unwrapping seams"
+#ID|Mesh.show_edge_sharp -> show_edge_sharp: boolean "Displays sharp edges, used with the EdgeSplit modifier"
+#ID|Mesh.show_edges -> show_edges: boolean "Displays selected edges using highlights in the 3D view and UV editor"
+#ID|Mesh.show_extra_edge_angle -> show_extra_edge_angle: boolean "Displays the angles in the selected edges in degrees, Using global values when set in the transform panel"
+#ID|Mesh.show_extra_edge_length -> show_extra_edge_length: boolean "Displays selected edge lengths, Using global values when set in the transform panel"
+#ID|Mesh.show_extra_face_area -> show_extra_face_area: boolean "Displays the area of selected faces, Using global values when set in the transform panel"
+#ID|Mesh.show_faces -> show_faces: boolean "Displays all faces as shades in the 3D view and UV editor"
+#ID|Mesh.show_normal_face -> show_normal_face: boolean "Displays face normals as lines"
+#ID|Mesh.show_normal_vertex -> show_normal_vertex: boolean "Displays vertex normals as lines"
+#+ * ID|Mesh.sticky -> sticky: collection, "(read-only) Sticky texture coordinates"
+#+ * ID|Mesh.texco_mesh -> texco_mesh: pointer "Derive texture coordinates from another mesh"
+#ID|Mesh.texspace_location -> texspace_location: float[3] "Texture space location"
+#+ * ID|Mesh.texspace_size -> texspace_size: float[3] "Texture space size"
+#+ * ID|Mesh.texture_mesh -> texture_mesh: pointer "Use another mesh for texture indices (vertex indices must be aligned)"
+#+ * ID|Mesh.total_edge_sel -> total_edge_sel: int, "(read-only) Selected edge count in editmode"
+#+ * ID|Mesh.total_face_sel -> total_face_sel: int, "(read-only) Selected face count in editmode"
+#+ * ID|Mesh.total_vert_sel -> total_vert_sel: int, "(read-only) Selected vertex count in editmode"
+#ID|Mesh.use_auto_smooth -> use_auto_smooth: boolean "Treats all set-smoothed faces with angles less than the specified angle as smooth during render"
+#ID|Mesh.use_auto_texspace -> use_auto_texspace: boolean "Adjusts active objects texture space automatically when transforming object"
+#+ * ID|Mesh.use_mirror_topology -> use_mirror_topology: boolean "Use topology based mirroring"
+#+ * ID|Mesh.use_mirror_x -> use_mirror_x: boolean "X Axis mirror editing"
+#+ * ID|Mesh.use_paint_mask -> use_paint_mask: boolean "Face selection masking for painting"
+#+ * ID|Mesh.uv_texture_clone -> uv_texture_clone: pointer "UV texture to be used as cloning source"
+#+ * ID|Mesh.uv_texture_clone_index -> uv_texture_clone_index: int "Clone UV texture index"
+#+ * ID|Mesh.uv_texture_stencil -> uv_texture_stencil: pointer "UV texture to mask the painted area"
+#+ * ID|Mesh.uv_texture_stencil_index -> uv_texture_stencil_index: int "Mask UV texture index"
+#+ * ID|Mesh.uv_textures -> uv_textures: collection, "(read-only)"
+#+ * ID|Mesh.vertex_colors -> vertex_colors: collection, "(read-only)"
+#ID|Mesh.vertices -> vertices: collection, "(read-only) Vertices of the mesh"
+#+ * ID|MetaBall.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
+#+ * ID|MetaBall.elements -> elements: collection, "(read-only) Meta elements"
+#+ * ID|MetaBall.materials -> materials: collection, "(read-only)"
+#ID|MetaBall.render_resolution -> render_resolution: float "Polygonization resolution in rendering"
+#ID|MetaBall.resolution -> resolution: float "Polygonization resolution in the 3D viewport"
+#ID|MetaBall.texspace_location -> texspace_location: float[3] "Texture space location"
+#+ * ID|MetaBall.texspace_size -> texspace_size: float[3] "Texture space size"
+#+ * ID|MetaBall.threshold -> threshold: float "Influence of meta elements"
+#ID|MetaBall.update_method -> update_method: enum "Metaball edit update behavior"
+#ID|MetaBall.use_auto_texspace -> use_auto_texspace: boolean "Adjusts active objects texture space automatically when transforming object"
+#+ * ID|NodeTree.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
+#+ * ID|NodeTree.grease_pencil -> grease_pencil: pointer "Grease Pencil datablock"
+#+ * ID|NodeTree.nodes -> nodes: collection, "(read-only)"
+#+ * ID|Object.active_material -> active_material: pointer "Active material being displayed"
+#+ * ID|Object.active_material_index -> active_material_index: int "Index of active material slot"
+#+ * ID|Object.active_particle_system -> active_particle_system: pointer, "(read-only) Active particle system being displayed"
+#+ * ID|Object.active_particle_system_index -> active_particle_system_index: int "Index of active particle system slot"
+#+ * ID|Object.active_shape_key -> active_shape_key: pointer, "(read-only) Current shape key"
+#+ * ID|Object.active_shape_key_index -> active_shape_key_index: int "Current shape key index"
+#+ * ID|Object.active_vertex_group -> active_vertex_group: pointer, "(read-only) Vertex groups of the object"
+#+ * ID|Object.active_vertex_group_index -> active_vertex_group_index: int "Active index in vertex group array"
+#+ * ID|Object.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
+#+ * ID|Object.animation_visualisation -> animation_visualisation: pointer, "(read-only) Animation data for this datablock"
+#+ * ID|Object.bound_box -> bound_box: float[24], "(read-only) Objects bound box in object-space coordinates"
+#+ * ID|Object.collision -> collision: pointer, "(read-only) Settings for using the objects as a collider in physics simulation"
+#+ * ID|Object.color -> color: float[4] "Object color and alpha, used when faces have the ObColor mode enabled"
+#+ * ID|Object.constraints -> constraints: collection, "(read-only) Constraints affecting the transformation of the object"
+#+ * ID|Object.data -> data: pointer "Object data"
+#+ * ID|Object.delta_location -> delta_location: float[3] "Extra translation added to the location of the object"
+#+ * ID|Object.delta_rotation_euler -> delta_rotation_euler: float[3] "Extra rotation added to the rotation of the object (when using Euler rotations)"
+#+ * ID|Object.delta_rotation_quaternion -> delta_rotation_quaternion: float[4] "Extra rotation added to the rotation of the object (when using Quaternion rotations)"
+#+ * ID|Object.delta_scale -> delta_scale: float[3] "Extra scaling added to the scale of the object"
+#+ * ID|Object.dimensions -> dimensions: float[3] "Absolute bounding box dimensions of the object"
+#+ * ID|Object.draw_bounds_type -> draw_bounds_type: enum "Object boundary display type"
+#ID|Object.draw_type -> draw_type: enum "Maximum draw type to display object with in viewport"
+#+ * ID|Object.dupli_faces_scale -> dupli_faces_scale: float "Scale the DupliFace objects"
+#+ * ID|Object.dupli_frames_end -> dupli_frames_end: int "End frame for DupliFrames"
+#+ * ID|Object.dupli_frames_off -> dupli_frames_off: int "Recurring frames to exclude from the Dupliframes"
+#+ * ID|Object.dupli_frames_on -> dupli_frames_on: int "Number of frames to use between DupOff frames"
+#+ * ID|Object.dupli_frames_start -> dupli_frames_start: int "Start frame for DupliFrames"
+#+ * ID|Object.dupli_group -> dupli_group: pointer "Instance an existing group"
+#+ * ID|Object.dupli_list -> dupli_list: collection, "(read-only) Object duplis"
+#+ * ID|Object.dupli_type -> dupli_type: enum "If not None, object duplication method to use"
+#+ * ID|Object.empty_draw_size -> empty_draw_size: float "Size of display for empties in the viewport"
+#+ * ID|Object.empty_draw_type -> empty_draw_type: enum "Viewport display style for empties"
+#+ * ID|Object.field -> field: pointer, "(read-only) Settings for using the objects as a field in physics simulation"
+#+ * ID|Object.game -> game: pointer, "(read-only) Game engine related settings for the object"
+#+ * ID|Object.grease_pencil -> grease_pencil: pointer "Grease Pencil datablock"
+#+ * ID|Object.hide -> hide: boolean "Restrict visibility in the viewport"
+#+ * ID|Object.hide_render -> hide_render: boolean "Restrict renderability"
+#+ * ID|Object.hide_select -> hide_select: boolean "Restrict selection in the viewport"
+#ID|Object.is_duplicator -> is_duplicator: boolean, "(read-only)"
+#+ * ID|Object.layers -> layers: boolean[20] "Layers the object is on"
+#+ * ID|Object.location -> location: float[3] "Location of the object"
+#+ * ID|Object.lock_location -> lock_location: boolean[3] "Lock editing of location in the interface"
+#+ * ID|Object.lock_rotation -> lock_rotation: boolean[3] "Lock editing of rotation in the interface"
+#+ * ID|Object.lock_rotation_w -> lock_rotation_w: boolean "Lock editing of angle component of four-component rotations in the interface"
+#+ * ID|Object.lock_rotations_4d -> lock_rotations_4d: boolean "Lock editing of four component rotations by components (instead of as Eulers)"
+#+ * ID|Object.lock_scale -> lock_scale: boolean[3] "Lock editing of scale in the interface"
+#+ * ID|Object.material_slots -> material_slots: collection, "(read-only) Material slots in the object"
+#+ * ID|Object.matrix_local -> matrix_local: float[16] "Parent relative transformation matrix"
+#+ * ID|Object.matrix_world -> matrix_world: float[16] "Worldspace transformation matrix"
+#+ * ID|Object.mode -> mode: enum, "(read-only) Object interaction mode"
+#+ * ID|Object.modifiers -> modifiers: collection, "(read-only) Modifiers affecting the geometric data of the object"
+#+ * ID|Object.motion_path -> motion_path: pointer, "(read-only) Motion Path for this element"
+#+ * ID|Object.parent -> parent: pointer "Parent Object"
+#+ * ID|Object.parent_bone -> parent_bone: string "Name of parent bone in case of a bone parenting relation"
+#+ * ID|Object.parent_type -> parent_type: enum "Type of parent relation"
+#+ * ID|Object.parent_vertices -> parent_vertices: int[3], "(read-only) Indices of vertices in cases of a vertex parenting relation"
+#+ * ID|Object.particle_systems -> particle_systems: collection, "(read-only) Particle systems emitted from the object"
+#+ * ID|Object.pass_index -> pass_index: int "Index # for the IndexOB render pass"
+#+ * ID|Object.pose -> pose: pointer, "(read-only) Current pose for armatures"
+#+ * ID|Object.pose_library -> pose_library: pointer, "(read-only) Action used as a pose library for armatures"
+#+ * ID|Object.proxy -> proxy: pointer, "(read-only) Library object this proxy object controls"
+#+ * ID|Object.proxy_group -> proxy_group: pointer, "(read-only) Library group duplicator object this proxy object controls"
+#+ * ID|Object.rotation_axis_angle -> rotation_axis_angle: float[4] "Angle of Rotation for Axis-Angle rotation representation"
+#+ * ID|Object.rotation_euler -> rotation_euler: float[3] "Rotation in Eulers"
+#+ * ID|Object.rotation_mode -> rotation_mode: enum "NO DESCRIPTION"
+#+ * ID|Object.rotation_quaternion -> rotation_quaternion: float[4] "Rotation in Quaternions"
+#+ * ID|Object.scale -> scale: float[3] "Scaling of the object"
+#+ * ID|Object.select -> select: boolean "Object selection state"
+#ID|Object.show_axis -> show_axis: boolean "Displays the objects origin and axis"
+#ID|Object.show_bounds -> show_bounds: boolean "Displays the objects bounds"
+#ID|Object.show_name -> show_name: boolean "Displays the objects name"
+#ID|Object.show_shape_key -> show_shape_key: boolean "Always show the current Shape for this Object"
+#ID|Object.show_texture_space -> show_texture_space: boolean "Displays the objects texture space"
+#ID|Object.show_transparent -> show_transparent: boolean "Enables transparent materials for the object (Mesh only)"
+#ID|Object.show_wire -> show_wire: boolean "Adds the objects wireframe over solid drawing"
+#ID|Object.show_x_ray -> show_x_ray: boolean "Makes the object draw in front of others"
+#+ * ID|Object.soft_body -> soft_body: pointer, "(read-only) Settings for soft body simulation"
+#+ * ID|Object.time_offset -> time_offset: float "Animation offset in frames for F-Curve and dupligroup instances"
+#+ * ID|Object.track_axis -> track_axis: enum "Axis that points in forward direction"
+#+ * ID|Object.type -> type: enum, "(read-only) Type of Object"
+#+ * ID|Object.up_axis -> up_axis: enum "Axis that points in the upward direction"
+#+ * ID|Object.use_dupli_faces_scale -> use_dupli_faces_scale: boolean "Scale dupli based on face size"
+#+ * ID|Object.use_dupli_frames_speed -> use_dupli_frames_speed: boolean "Set dupliframes to use the frame"
+#ID|Object.use_dupli_vertices_rotation -> use_dupli_vertices_rotation: boolean "Rotate dupli according to vertex normal"
+#ID|Object.use_shape_key_edit_mode -> use_shape_key_edit_mode: boolean "Apply shape keys in edit mode (for Meshes only)"
+#ID|Object.use_slow_parent -> use_slow_parent: boolean "Create a delay in the parent relationship"
+#ID|Object.use_time_offset_add_parent -> use_time_offset_add_parent: boolean "Add the parents time offset value"
+#ID|Object.use_time_offset_edit -> use_time_offset_edit: boolean "Use time offset when inserting keys and display time offset for F-Curve and action views"
+#ID|Object.use_time_offset_parent -> use_time_offset_parent: boolean "Apply the time offset to this objects parent relationship"
+#ID|Object.use_time_offset_particle -> use_time_offset_particle: boolean "Let the time offset work on the particle effect"
+#+ * ID|Object.vertex_groups -> vertex_groups: collection, "(read-only) Vertex groups of the object"
+#+ * ID|ParticleSettings.active_dupliweight -> active_dupliweight: pointer, "(read-only)"
+#+ * ID|ParticleSettings.active_dupliweight_index -> active_dupliweight_index: int "NO DESCRIPTION"
+#+ * ID|ParticleSettings.adaptive_angle -> adaptive_angle: int "How many degrees path has to curve to make another render segment"
+#ID|ParticleSettings.adaptive_pixel -> adaptive_pixel: int "How many pixels path has to cover to make another render segment"
+#+ * ID|ParticleSettings.angular_velocity_factor -> angular_velocity_factor: float "Angular velocity amount"
+#+ * ID|ParticleSettings.angular_velocity_mode -> angular_velocity_mode: enum "Particle angular velocity mode"
+#+ * ID|ParticleSettings.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
+#ID|ParticleSettings.apply_effector_to_children -> apply_effector_to_children: boolean "Apply effectors to children"
+#ID|ParticleSettings.apply_guide_to_children -> apply_guide_to_children: boolean "NO DESCRIPTION"
+#+ * ID|ParticleSettings.billboard_align -> billboard_align: enum "In respect to what the billboards are aligned"
+#+ * ID|ParticleSettings.billboard_animation -> billboard_animation: enum "How to animate billboard textures"
+#+ * ID|ParticleSettings.billboard_object -> billboard_object: pointer "Billboards face this object (default is active camera)"
+#+ * ID|ParticleSettings.billboard_offset -> billboard_offset: float[2] "NO DESCRIPTION"
+#ID|ParticleSettings.billboard_offset_split -> billboard_offset_split: enum "How to offset billboard textures"
+#+ * ID|ParticleSettings.billboard_tilt -> billboard_tilt: float "Tilt of the billboards"
+#ID|ParticleSettings.billboard_tilt_random -> billboard_tilt_random: float "Random tilt of the billboards"
+#+ * ID|ParticleSettings.billboard_uv_split -> billboard_uv_split: int "Amount of rows/columns to split UV coordinates for billboards"
+#+ * ID|ParticleSettings.boids -> boids: pointer, "(read-only)"
+#+ * ID|ParticleSettings.branch_threshold -> branch_threshold: float "Threshold of branching"
+#+ * ID|ParticleSettings.brownian_factor -> brownian_factor: float "Specify the amount of Brownian motion"
+#+ * ID|ParticleSettings.child_length -> child_length: float "Length of child paths"
+#ID|ParticleSettings.child_length_threshold -> child_length_threshold: float "Amount of particles left untouched by child path length"
+#+ * ID|ParticleSettings.child_nbr -> child_nbr: int "Amount of children/parent"
+#+ * ID|ParticleSettings.child_radius -> child_radius: float "Radius of children around parent"
+#+ * ID|ParticleSettings.child_roundness -> child_roundness: float "Roundness of children around parent"
+#+ * ID|ParticleSettings.child_size -> child_size: float "A multiplier for the child particle size"
+#ID|ParticleSettings.child_size_random -> child_size_random: float "Random variation to the size of the child particles"
+#+ * ID|ParticleSettings.child_type -> child_type: enum "Create child particles"
+#+ * ID|ParticleSettings.clump_factor -> clump_factor: float "Amount of clumping"
+#ID|ParticleSettings.clump_shape -> clump_shape: float "Shape of clumping"
+#ID|ParticleSettings.count -> count: int "Total number of particles"
+#ID|ParticleSettings.damping -> damping: float "Specify the amount of damping"
+#+ * ID|ParticleSettings.distribution -> distribution: enum "How to distribute particles on selected element"
+#+ * ID|ParticleSettings.drag_factor -> drag_factor: float "Specify the amount of air-drag"
+#ID|ParticleSettings.draw_method -> draw_method: enum "How particles are drawn in viewport"
+#ID|ParticleSettings.draw_percentage -> draw_percentage: int "Percentage of particles to display in 3D view"
+#+ * ID|ParticleSettings.draw_size -> draw_size: int "Size of particles on viewport in pixels (0=default)"
+#+ * ID|ParticleSettings.draw_step -> draw_step: int "How many steps paths are drawn with (power of 2)"
+#+ * ID|ParticleSettings.dupli_group -> dupli_group: pointer "Show Objects in this Group in place of particles"
+#+ * ID|ParticleSettings.dupli_object -> dupli_object: pointer "Show this Object in place of particles"
+#ID|ParticleSettings.dupli_weights -> dupli_weights: collection, "(read-only) Weights for all of the objects in the dupli group"
+#+ * ID|ParticleSettings.effect_hair -> effect_hair: float "Hair stiffness for effectors"
+#+ * ID|ParticleSettings.effector_weights -> effector_weights: pointer, "(read-only)"
+#+ * ID|ParticleSettings.emit_from -> emit_from: enum "Where to emit particles from"
+#ID|ParticleSettings.factor_random -> factor_random: float "Give the starting speed a random variation"
+#+ * ID|ParticleSettings.fluid -> fluid: pointer, "(read-only)"
+#+ * ID|ParticleSettings.force_field_1 -> force_field_1: pointer, "(read-only)"
+#+ * ID|ParticleSettings.force_field_2 -> force_field_2: pointer, "(read-only)"
+#+ * ID|ParticleSettings.frame_end -> frame_end: float "Frame # to stop emitting particles"
+#+ * ID|ParticleSettings.frame_start -> frame_start: float "Frame # to start emitting particles"
+#+ * ID|ParticleSettings.grid_resolution -> grid_resolution: int "The resolution of the particle grid"
+#+ * ID|ParticleSettings.hair_step -> hair_step: int "Number of hair segments"
+#+ * ID|ParticleSettings.integrator -> integrator: enum "Select physics integrator type"
+#ID|ParticleSettings.invert_grid -> invert_grid: boolean "Invert what is considered object and what is not"
+#+ * ID|ParticleSettings.jitter_factor -> jitter_factor: float "Amount of jitter applied to the sampling"
+#+ * ID|ParticleSettings.keyed_loops -> keyed_loops: int "Number of times the keys are looped"
+#+ * ID|ParticleSettings.keys_step -> keys_step: int "NO DESCRIPTION"
+#+ * ID|ParticleSettings.kink -> kink: enum "Type of periodic offset on the path"
+#+ * ID|ParticleSettings.kink_amplitude -> kink_amplitude: float "The amplitude of the offset"
+#+ * ID|ParticleSettings.kink_axis -> kink_axis: enum "Which axis to use for offset"
+#+ * ID|ParticleSettings.kink_frequency -> kink_frequency: float "The frequency of the offset (1/total length)"
+#+ * ID|ParticleSettings.kink_shape -> kink_shape: float "Adjust the offset to the beginning/end"
+#ID|ParticleSettings.length_random -> length_random: float "Give path length a random variation"
+#+ * ID|ParticleSettings.lifetime -> lifetime: float "Specify the life span of the particles"
+#ID|ParticleSettings.lifetime_random -> lifetime_random: float "Give the particle life a random variation"
+#+ * ID|ParticleSettings.line_length_head -> line_length_head: float "Length of the lines head"
+#+ * ID|ParticleSettings.line_length_tail -> line_length_tail: float "Length of the lines tail"
+#ID|ParticleSettings.lock_billboard -> lock_billboard: boolean "Lock the billboards align axis"
+#ID|ParticleSettings.lock_boids_to_surface -> lock_boids_to_surface: boolean "Constrain boids to a surface"
+#+ * ID|ParticleSettings.mass -> mass: float "Specify the mass of the particles"
+#+ * ID|ParticleSettings.material -> material: int "Specify material used for the particles"
+#+ * ID|ParticleSettings.normal_factor -> normal_factor: float "Let the surface normal give the particle a starting speed"
+#ID|ParticleSettings.object_align_factor -> object_align_factor: float[3] "Let the emitter object orientation give the particle a starting speed"
+#+ * ID|ParticleSettings.object_factor -> object_factor: float "Let the object give the particle a starting speed"
+#+ * ID|ParticleSettings.particle_factor -> particle_factor: float "Let the target particle give the particle a starting speed"
+#+ * ID|ParticleSettings.particle_size -> particle_size: float "The size of the particles"
+#+ * ID|ParticleSettings.path_end -> path_end: float "End time of drawn path"
+#+ * ID|ParticleSettings.path_start -> path_start: float "Starting time of drawn path"
+#+ * ID|ParticleSettings.phase_factor -> phase_factor: float "Initial rotation phase"
+#ID|ParticleSettings.phase_factor_random -> phase_factor_random: float "Randomize rotation phase"
+#+ * ID|ParticleSettings.physics_type -> physics_type: enum "Particle physics type"
+#+ * ID|ParticleSettings.react_event -> react_event: enum "The event of target particles to react on"
+#+ * ID|ParticleSettings.reaction_shape -> reaction_shape: float "Power of reaction strength dependence on distance to target"
+#+ * ID|ParticleSettings.reactor_factor -> reactor_factor: float "Let the vector away from the target particles location give the particle a starting speed"
+#+ * ID|ParticleSettings.render_step -> render_step: int "How many steps paths are rendered with (power of 2)"
+#ID|ParticleSettings.render_type -> render_type: enum "How particles are rendered"
+#ID|ParticleSettings.rendered_child_count -> rendered_child_count: int "Amount of children/parent for rendering"
+#ID|ParticleSettings.rotation_factor_random -> rotation_factor_random: float "Randomize rotation"
+#+ * ID|ParticleSettings.rotation_mode -> rotation_mode: enum "Particles initial rotation"
+#ID|ParticleSettings.roughness_1 -> roughness_1: float "Amount of location dependent rough"
+#ID|ParticleSettings.roughness_1_size -> roughness_1_size: float "Size of location dependent rough"
+#ID|ParticleSettings.roughness_2 -> roughness_2: float "Amount of random rough"
+#ID|ParticleSettings.roughness_2_size -> roughness_2_size: float "Size of random rough"
+#ID|ParticleSettings.roughness_2_threshold -> roughness_2_threshold: float "Amount of particles left untouched by random rough"
+#ID|ParticleSettings.roughness_end_shape -> roughness_end_shape: float "Shape of end point rough"
+#ID|ParticleSettings.roughness_endpoint -> roughness_endpoint: float "Amount of end point rough"
+#ID|ParticleSettings.show_health -> show_health: boolean "Draw boid health"
+#ID|ParticleSettings.show_material_color -> show_material_color: boolean "Draw particles using materials diffuse color"
+#ID|ParticleSettings.show_number -> show_number: boolean "Show particle number"
+#+ * ID|ParticleSettings.show_size -> show_size: boolean "Show particle size"
+#ID|ParticleSettings.show_unborn -> show_unborn: boolean "Show particles before they are emitted"
+#ID|ParticleSettings.show_velocity -> show_velocity: boolean "Show particle velocity"
+#+ * ID|ParticleSettings.simplify_rate -> simplify_rate: float "Speed of simplification"
+#+ * ID|ParticleSettings.simplify_refsize -> simplify_refsize: int "Reference size in pixels, after which simplification begins"
+#+ * ID|ParticleSettings.simplify_transition -> simplify_transition: float "Transition period for fading out strands"
+#+ * ID|ParticleSettings.simplify_viewport -> simplify_viewport: float "Speed of Simplification"
+#ID|ParticleSettings.size_random -> size_random: float "Give the particle size a random variation"
+#+ * ID|ParticleSettings.subframes -> subframes: int "Subframes to simulate for improved stability and finer granularity simulations"
+#+ * ID|ParticleSettings.tangent_factor -> tangent_factor: float "Let the surface tangent give the particle a starting speed"
+#+ * ID|ParticleSettings.tangent_phase -> tangent_phase: float "Rotate the surface tangent"
+#+ * ID|ParticleSettings.time_tweak -> time_tweak: float "A multiplier for physics timestep (1.0 means one frame = 1/25 seconds)"
+#+ * ID|ParticleSettings.trail_count -> trail_count: int "Number of trail particles"
+#+ * ID|ParticleSettings.type -> type: enum "NO DESCRIPTION"
+#ID|ParticleSettings.use_absolute_path_time -> use_absolute_path_time: boolean "Path timing is in absolute frames"
+#ID|ParticleSettings.use_animate_branching -> use_animate_branching: boolean "Animate branching"
+#ID|ParticleSettings.use_branching -> use_branching: boolean "Branch child paths from each other"
+#ID|ParticleSettings.use_dead -> use_dead: boolean "Show particles after they have died"
+#ID|ParticleSettings.use_die_on_collision -> use_die_on_collision: boolean "Particles die when they collide with a deflector object"
+#ID|ParticleSettings.use_dynamic_rotation -> use_dynamic_rotation: boolean "Sets rotation to dynamic/constant"
+#ID|ParticleSettings.use_emit_random -> use_emit_random: boolean "Emit in random order of elements"
+#ID|ParticleSettings.use_even_distribution -> use_even_distribution: boolean "Use even distribution from faces based on face areas or edge lengths"
+#+ * ID|ParticleSettings.use_global_dupli -> use_global_dupli: boolean "Use objects global coordinates for duplication"
+#+ * ID|ParticleSettings.use_group_count -> use_group_count: boolean "Use object multiple times in the same group"
+#ID|ParticleSettings.use_group_pick_random -> use_group_pick_random: boolean "Pick objects from group randomly"
+#ID|ParticleSettings.use_hair_bspline -> use_hair_bspline: boolean "Interpolate hair using B-Splines"
+#ID|ParticleSettings.use_multiply_size_mass -> use_multiply_size_mass: boolean "Multiply mass by particle size"
+#ID|ParticleSettings.use_parent_particles -> use_parent_particles: boolean "Render parent particles"
+#ID|ParticleSettings.use_react_multiple -> use_react_multiple: boolean "React multiple times"
+#ID|ParticleSettings.use_react_start_end -> use_react_start_end: boolean "Give birth to unreacted particles eventually"
+#ID|ParticleSettings.use_render_adaptive -> use_render_adaptive: boolean "Draw steps of the particle path"
+#ID|ParticleSettings.use_render_emitter -> use_render_emitter: boolean "Render emitter Object also"
+#ID|ParticleSettings.use_self_effect -> use_self_effect: boolean "Particle effectors effect themselves"
+#ID|ParticleSettings.use_simplify -> use_simplify: boolean "Remove child strands as the object becomes smaller on the screen"
+#ID|ParticleSettings.use_simplify_viewport -> use_simplify_viewport: boolean "NO DESCRIPTION"
+#ID|ParticleSettings.use_size_deflect -> use_size_deflect: boolean "Use particles size in deflection"
+#ID|ParticleSettings.use_strand_primitive -> use_strand_primitive: boolean "Use the strand primitive for rendering"
+#ID|ParticleSettings.use_symmetric_branching -> use_symmetric_branching: boolean "Start and end points are the same"
+#ID|ParticleSettings.use_velocity_length -> use_velocity_length: boolean "Multiply line length by particle speed"
+#ID|ParticleSettings.use_whole_group -> use_whole_group: boolean "Use whole group at once"
+#+ * ID|ParticleSettings.userjit -> userjit: int "Emission locations / face (0 = automatic)"
+#+ * ID|ParticleSettings.virtual_parents -> virtual_parents: float "Relative amount of virtual parents"
+#+ * ID|Scene.active_keying_set_index -> active_keying_set_index: int "Current Keying Set index (negative for builtin and positive for absolute)"
+#+ * ID|Scene.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
+#ID|Scene.audio_distance_model -> audio_distance_model: enum "Distance model for distance attenuation calculation"
+#ID|Scene.audio_doppler_factor -> audio_doppler_factor: float "Pitch factor for Doppler effect calculation"
+#ID|Scene.audio_doppler_speed -> audio_doppler_speed: float "Speed of sound for Doppler effect calculation"
+#ID|Scene.background_set -> background_set: pointer "Background set scene"
+#+ * ID|Scene.camera -> camera: pointer "Active camera used for rendering the scene"
+#+ * ID|Scene.cursor_location -> cursor_location: float[3] "3D cursor location"
+#+ * ID|Scene.frame_current -> frame_current: int "NO DESCRIPTION"
+#+ * ID|Scene.frame_end -> frame_end: int "Final frame of the playback/rendering range"
+#ID|Scene.frame_preview_end -> frame_preview_end: int "Alternative end frame for UI playback"
+#ID|Scene.frame_preview_start -> frame_preview_start: int "Alternative start frame for UI playback"
+#+ * ID|Scene.frame_start -> frame_start: int "First frame of the playback/rendering range"
+#+ * ID|Scene.frame_step -> frame_step: int "Number of frames to skip forward while rendering/playing back each frame"
+#ID|Scene.game_settings -> game_settings: pointer, "(read-only)"
+#+ * ID|Scene.gravity -> gravity: float[3] "Constant acceleration in a given direction"
+#+ * ID|Scene.grease_pencil -> grease_pencil: pointer "Grease Pencil datablock"
+#ID|Scene.is_nla_tweakmode -> is_nla_tweakmode: boolean, "(read-only) Indicates whether there is any action referenced by NLA being edited. Strictly read-only"
+#+ * ID|Scene.keying_sets -> keying_sets: collection, "(read-only) Absolute Keying Sets for this Scene"
+#ID|Scene.keying_sets_all -> keying_sets_all: collection, "(read-only) All Keying Sets available for use (builtins and Absolute Keying Sets for this Scene)"
+#+ * ID|Scene.layers -> layers: boolean[20] "Layers visible when rendering the scene"
+#+ * ID|Scene.network_render -> network_render: pointer, "(read-only) Network Render Settings"
+#+ * ID|Scene.nodetree -> nodetree: pointer, "(read-only) Compositing node tree"
+#ID|Scene.object_bases -> object_bases: collection, "(read-only)"
+#+ * ID|Scene.objects -> objects: collection, "(read-only)"
+#+ * ID|Scene.orientations -> orientations: collection, "(read-only)"
+#+ * ID|Scene.pose_templates -> pose_templates: pointer, "(read-only) Pose Template Settings"
+#+ * ID|Scene.render -> render: pointer, "(read-only)"
+#+ * ID|Scene.sequence_editor -> sequence_editor: pointer, "(read-only)"
+#+ * ID|Scene.sync_mode -> sync_mode: enum "How to sync playback"
+#+ * ID|Scene.timeline_markers -> timeline_markers: collection, "(read-only) Markers used in all timelines for the current scene"
+#+ * ID|Scene.tool_settings -> tool_settings: pointer, "(read-only)"
+#+ * ID|Scene.unit_settings -> unit_settings: pointer, "(read-only) Unit editing settings"
+#ID|Scene.use_audio -> use_audio: boolean "Play back of audio from Sequence Editor will be muted"
+#ID|Scene.use_audio_scrub -> use_audio_scrub: boolean "Play audio from Sequence Editor while scrubbing"
+#ID|Scene.use_audio_sync -> use_audio_sync: boolean "Play back and sync with audio clock, dropping frames if frame display is too slow"
+#ID|Scene.use_frame_drop -> use_frame_drop: boolean "Play back dropping frames if frame display is too slow"
+#+ * ID|Scene.use_gravity -> use_gravity: boolean "Use global gravity for all dynamics"
+#+ * ID|Scene.use_nodes -> use_nodes: boolean "Enable the compositing node tree"
+#+ * ID|Scene.use_preview_range -> use_preview_range: boolean "Use an alternative start/end frame for UI playback, rather than the scene start/end frame"
+#ID|Scene.use_stamp_note -> use_stamp_note: string "User define note for the render stamping"
+#+ * ID|Scene.world -> world: pointer "World used for rendering the scene"
+#+ * ID|Screen.areas -> areas: collection, "(read-only) Areas the screen is subdivided into"
+#ID|Screen.is_animation_playing -> is_animation_playing: boolean, "(read-only) Animation playback is active"
+#+ * ID|Screen.scene -> scene: pointer "Active scene to be edited in the screen"
+#ID|Screen.show_fullscreen -> show_fullscreen: boolean, "(read-only) An area is maximised, filling this screen"
+#+ * ID|Sound.filepath -> filepath: string "Sound sample file used by this Sound datablock"
+#+ * ID|Sound.packed_file -> packed_file: pointer, "(read-only)"
+#ID|Sound.use_memory_cache -> use_memory_cache: boolean "The sound file is decoded and loaded into RAM"
+#+ * ID|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"
+#+ * ID|Text.current_line -> current_line: pointer, "(read-only) Current line, and start line of selection if one exists"
+#+ * ID|Text.filepath -> filepath: string "Filename of the text file"
+#ID|Text.is_dirty -> is_dirty: boolean, "(read-only) Text file has been edited since last save"
+#ID|Text.is_in_memory -> is_in_memory: boolean, "(read-only) Text file is in memory, without a corresponding file on disk"
+#ID|Text.is_modified -> is_modified: boolean, "(read-only) Text file on disk is different than the one in memory"
+#+ * ID|Text.lines -> lines: collection, "(read-only) Lines of text"
+#+ * ID|Text.markers -> markers: collection, "(read-only) Text markers highlighting part of the text"
+#ID|Text.select_end_character -> select_end_character: int, "(read-only) Index of character after end of selection in the selection end line"
+#ID|Text.select_end_line -> select_end_line: pointer, "(read-only) End line of selection"
+#+ * ID|Text.use_module -> use_module: boolean "Register this text as a module on loading, Text name must end with .py"
+#ID|Text.use_tabs_as_spaces -> use_tabs_as_spaces: boolean "Automatically converts all new tabs into spaces"
+#+ * ID|Texture.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
+#+ * ID|Texture.color_ramp -> color_ramp: pointer, "(read-only)"
+#+ * ID|Texture.contrast -> contrast: float "NO DESCRIPTION"
+#+TODO MAKE COLOR * ID|Texture.factor_blue -> factor_blue: float "NO DESCRIPTION"
+#+TODO MAKE COLOR * ID|Texture.factor_green -> factor_green: float "NO DESCRIPTION"
+#+TODO MAKE COLOR * ID|Texture.factor_red -> factor_red: float "NO DESCRIPTION"
+#ID|Texture.intensity -> intensity: float "NO DESCRIPTION"
+#+ * ID|Texture.node_tree -> node_tree: pointer, "(read-only) Node tree for node-based textures"
+#+ * ID|Texture.saturation -> saturation: float "NO DESCRIPTION"
+#+ * ID|Texture.type -> type: enum "NO DESCRIPTION"
+#+ * ID|Texture.use_color_ramp -> use_color_ramp: boolean "Toggle color ramp operations"
+#+ * ID|Texture.use_nodes -> use_nodes: boolean "Make this a node-based texture"
+#+ * ID|Texture.use_preview_alpha -> use_preview_alpha: boolean "Show Alpha in Preview Render"
+#+ * ID|Texture|BlendTexture.progression -> progression: enum "Sets the style of the color blending"
+#ID|Texture|BlendTexture.use_flip_axis -> use_flip_axis: enum "Flips the textures X and Y axis"
+#ID|Texture|CloudsTexture.cloud_type -> cloud_type: enum "NO DESCRIPTION"
+#+ * ID|Texture|CloudsTexture.nabla -> nabla: float "Size of derivative offset used for calculating normal"
+#+ * ID|Texture|CloudsTexture.noise_basis -> noise_basis: enum "Sets the noise basis used for turbulence"
+#+ * ID|Texture|CloudsTexture.noise_depth -> noise_depth: int "Sets the depth of the cloud calculation"
+#ID|Texture|CloudsTexture.noise_scale -> noise_scale: float "Sets scaling for noise input"
+#+ * ID|Texture|CloudsTexture.noise_type -> noise_type: enum "NO DESCRIPTION"
+#+ * ID|Texture|DistortedNoiseTexture.distortion -> distortion: float "NO DESCRIPTION"
+#+ * ID|Texture|DistortedNoiseTexture.nabla -> nabla: float "Size of derivative offset used for calculating normal"
+#+ * ID|Texture|DistortedNoiseTexture.noise_basis -> noise_basis: enum "Sets the noise basis used for turbulence"
+#+ * ID|Texture|DistortedNoiseTexture.noise_distortion -> noise_distortion: enum "Sets the noise basis for the distortion"
+#ID|Texture|DistortedNoiseTexture.noise_scale -> noise_scale: float "Sets scaling for noise input"
+#+ * ID|Texture|EnvironmentMapTexture.environment_map -> environment_map: pointer, "(read-only) Gets the environment map associated with this texture"
+#+ * ID|Texture|EnvironmentMapTexture.filter_eccentricity -> filter_eccentricity: int "Maximum eccentricity. Higher gives less blur at distant/oblique angles, but is also slower"
+#+ * ID|Texture|EnvironmentMapTexture.filter_probes -> filter_probes: int "Maximum number of samples. Higher gives less blur at distant/oblique angles, but is also slower"
+#+ * ID|Texture|EnvironmentMapTexture.filter_size -> filter_size: float "Multiplies the filter size used by MIP Map and Interpolation"
+#ID|Texture|EnvironmentMapTexture.filter_type -> filter_type: enum "Texture filter to use for sampling image"
+#+ * ID|Texture|EnvironmentMapTexture.image -> image: pointer "Source image file to read the environment map from"
+#+ * ID|Texture|EnvironmentMapTexture.image_user -> image_user: pointer, "(read-only) Parameters defining which layer, pass and frame of the image is displayed"
+#ID|Texture|EnvironmentMapTexture.use_filter_size_min -> use_filter_size_min: boolean "Use Filter Size as a minimal filter value in pixels"
+#ID|Texture|EnvironmentMapTexture.use_mipmap -> use_mipmap: boolean "Uses auto-generated MIP maps for the image"
+#ID|Texture|EnvironmentMapTexture.use_mipmap_gauss -> use_mipmap_gauss: boolean "Uses Gauss filter to sample down MIP maps"
+#+ * ID|Texture|ImageTexture.checker_distance -> checker_distance: float "Sets distance between checker tiles"
+#+ * ID|Texture|ImageTexture.crop_max_x -> crop_max_x: float "Sets maximum X value to crop the image"
+#+ * ID|Texture|ImageTexture.crop_max_y -> crop_max_y: float "Sets maximum Y value to crop the image"
+#+ * ID|Texture|ImageTexture.crop_min_x -> crop_min_x: float "Sets minimum X value to crop the image"
+#+ * ID|Texture|ImageTexture.crop_min_y -> crop_min_y: float "Sets minimum Y value to crop the image"
+#+ * ID|Texture|ImageTexture.extension -> extension: enum "Sets how the image is extrapolated past its original bounds"
+#+ * ID|Texture|ImageTexture.filter_eccentricity -> filter_eccentricity: int "Maximum eccentricity. Higher gives less blur at distant/oblique angles, but is also slower"
+#+ * ID|Texture|ImageTexture.filter_probes -> filter_probes: int "Maximum number of samples. Higher gives less blur at distant/oblique angles, but is also slower"
+#+ * ID|Texture|ImageTexture.filter_size -> filter_size: float "Multiplies the filter size used by MIP Map and Interpolation"
+#ID|Texture|ImageTexture.filter_type -> filter_type: enum "Texture filter to use for sampling image"
+#+ * ID|Texture|ImageTexture.image -> image: pointer "NO DESCRIPTION"
+#+ * ID|Texture|ImageTexture.image_user -> image_user: pointer, "(read-only) Parameters defining which layer, pass and frame of the image is displayed"
+#+ * ID|Texture|ImageTexture.invert_alpha -> invert_alpha: boolean "Inverts all the alpha values in the image"
+#+ * ID|Texture|ImageTexture.normal_space -> normal_space: enum "Sets space of normal map image"
+#+ * ID|Texture|ImageTexture.repeat_x -> repeat_x: int "Sets a repetition multiplier in the X direction"
+#+ * ID|Texture|ImageTexture.repeat_y -> repeat_y: int "Sets a repetition multiplier in the Y direction"
+#+ * ID|Texture|ImageTexture.use_alpha -> use_alpha: boolean "Uses the alpha channel information in the image"
+#ID|Texture|ImageTexture.use_calculate_alpha -> use_calculate_alpha: boolean "Calculates an alpha channel based on RGB values in the image"
+#ID|Texture|ImageTexture.use_checker_even -> use_checker_even: boolean "Sets even checker tiles"
+#ID|Texture|ImageTexture.use_checker_odd -> use_checker_odd: boolean "Sets odd checker tiles"
+#ID|Texture|ImageTexture.use_filter_size_min -> use_filter_size_min: boolean "Use Filter Size as a minimal filter value in pixels"
+#ID|Texture|ImageTexture.use_flip_axis -> use_flip_axis: boolean "Flips the textures X and Y axis"
+#ID|Texture|ImageTexture.use_interpolation -> use_interpolation: boolean "Interpolates pixels using Area filter"
+#ID|Texture|ImageTexture.use_mipmap -> use_mipmap: boolean "Uses auto-generated MIP maps for the image"
+#ID|Texture|ImageTexture.use_mipmap_gauss -> use_mipmap_gauss: boolean "Uses Gauss filter to sample down MIP maps"
+#ID|Texture|ImageTexture.use_mirror_x -> use_mirror_x: boolean "Mirrors the image repetition on the X direction"
+#ID|Texture|ImageTexture.use_mirror_y -> use_mirror_y: boolean "Mirrors the image repetition on the Y direction"
+#ID|Texture|ImageTexture.use_normal_map -> use_normal_map: boolean "Uses image RGB values for normal mapping"
+#+ * ID|Texture|MagicTexture.noise_depth -> noise_depth: int "Sets the depth of the cloud calculation"
+#+ * ID|Texture|MagicTexture.turbulence -> turbulence: float "Sets the turbulence of the bandnoise and ringnoise types"
+#ID|Texture|MarbleTexture.marble_type -> marble_type: enum "NO DESCRIPTION"
+#+ * ID|Texture|MarbleTexture.nabla -> nabla: float "Size of derivative offset used for calculating normal"
+#+ * ID|Texture|MarbleTexture.noise_basis -> noise_basis: enum "Sets the noise basis used for turbulence"
+#+ * ID|Texture|MarbleTexture.noise_depth -> noise_depth: int "Sets the depth of the cloud calculation"
+#ID|Texture|MarbleTexture.noise_scale -> noise_scale: float "Sets scaling for noise input"
+#+ * ID|Texture|MarbleTexture.noise_type -> noise_type: enum "NO DESCRIPTION"
+#ID|Texture|MarbleTexture.noisebasis_2 -> noisebasis_2: enum "NO DESCRIPTION"
+#+ * ID|Texture|MarbleTexture.turbulence -> turbulence: float "Sets the turbulence of the bandnoise and ringnoise types"
+#ID|Texture|MusgraveTexture.dimension_max -> dimension_max: float "Highest fractal dimension"
+#+ * ID|Texture|MusgraveTexture.gain -> gain: float "The gain multiplier"
+#+ * ID|Texture|MusgraveTexture.lacunarity -> lacunarity: float "Gap between successive frequencies"
+#+ * ID|Texture|MusgraveTexture.musgrave_type -> musgrave_type: enum "NO DESCRIPTION"
+#+ * ID|Texture|MusgraveTexture.nabla -> nabla: float "Size of derivative offset used for calculating normal"
+#+ * ID|Texture|MusgraveTexture.noise_basis -> noise_basis: enum "Sets the noise basis used for turbulence"
+#+ * ID|Texture|MusgraveTexture.noise_intensity -> noise_intensity: float "NO DESCRIPTION"
+#ID|Texture|MusgraveTexture.noise_scale -> noise_scale: float "Sets scaling for noise input"
+#+ * ID|Texture|MusgraveTexture.octaves -> octaves: float "Number of frequencies used"
+#+ * ID|Texture|MusgraveTexture.offset -> offset: float "The fractal offset"
+#ID|Texture|PointDensityTexture.point_density -> point_density: pointer, "(read-only) The point density settings associated with this texture"
+#+ * ID|Texture|StucciTexture.noise_basis -> noise_basis: enum "Sets the noise basis used for turbulence"
+#ID|Texture|StucciTexture.noise_scale -> noise_scale: float "Sets scaling for noise input"
+#+ * ID|Texture|StucciTexture.noise_type -> noise_type: enum "NO DESCRIPTION"
+#ID|Texture|StucciTexture.stucci_type -> stucci_type: enum "NO DESCRIPTION"
+#+ * ID|Texture|StucciTexture.turbulence -> turbulence: float "Sets the turbulence of the bandnoise and ringnoise types"
+#ID|Texture|VoronoiTexture.color_mode -> color_mode: enum "NO DESCRIPTION"
+#+ * ID|Texture|VoronoiTexture.distance_metric -> distance_metric: enum "NO DESCRIPTION"
+#+ * ID|Texture|VoronoiTexture.minkovsky_exponent -> minkovsky_exponent: float "Minkovsky exponent"
+#+ * ID|Texture|VoronoiTexture.nabla -> nabla: float "Size of derivative offset used for calculating normal"
+#+ * ID|Texture|VoronoiTexture.noise_intensity -> noise_intensity: float "NO DESCRIPTION"
+#ID|Texture|VoronoiTexture.noise_scale -> noise_scale: float "Sets scaling for noise input"
+#+ * ID|Texture|VoronoiTexture.weight_1 -> weight_1: float "Voronoi feature weight 1"
+#+ * ID|Texture|VoronoiTexture.weight_2 -> weight_2: float "Voronoi feature weight 2"
+#+ * ID|Texture|VoronoiTexture.weight_3 -> weight_3: float "Voronoi feature weight 3"
+#+ * ID|Texture|VoronoiTexture.weight_4 -> weight_4: float "Voronoi feature weight 4"
+#+ * ID|Texture|VoxelDataTexture.image -> image: pointer "NO DESCRIPTION"
+#+ * ID|Texture|VoxelDataTexture.image_user -> image_user: pointer, "(read-only) Parameters defining which layer, pass and frame of the image is displayed"
+#ID|Texture|VoxelDataTexture.voxel_data -> voxel_data: pointer, "(read-only) The voxel data associated with this texture"
+#+ * ID|Texture|WoodTexture.nabla -> nabla: float "Size of derivative offset used for calculating normal"
+#+ * ID|Texture|WoodTexture.noise_basis -> noise_basis: enum "Sets the noise basis used for turbulence"
+#ID|Texture|WoodTexture.noise_scale -> noise_scale: float "Sets scaling for noise input"
+#+ * ID|Texture|WoodTexture.noise_type -> noise_type: enum "NO DESCRIPTION"
+#ID|Texture|WoodTexture.noisebasis_2 -> noisebasis_2: enum "NO DESCRIPTION"
+#+ * ID|Texture|WoodTexture.turbulence -> turbulence: float "Sets the turbulence of the bandnoise and ringnoise types"
+#ID|Texture|WoodTexture.wood_type -> wood_type: enum "NO DESCRIPTION"
+#+ * ID|VectorFont.filepath -> filepath: string, "(read-only)"
+#+ * ID|VectorFont.packed_file -> packed_file: pointer, "(read-only)"
+#+ * ID|WindowManager.keyconfigs -> keyconfigs: collection, "(read-only) Registered key configurations"
+#+ * ID|WindowManager.operators -> operators: collection, "(read-only) Operator registry"
+#+ * ID|WindowManager.windows -> windows: collection, "(read-only) Open windows"
+#+ * ID|World.active_texture -> active_texture: pointer "Active texture slot being displayed"
+#+ * ID|World.active_texture_index -> active_texture_index: int "Index of active texture slot"
+#+ * ID|World.ambient_color -> ambient_color: float[3] "NO DESCRIPTION"
+#+ * ID|World.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
+#ID|World.color_range -> color_range: float "The color range that will be mapped to 0-1"
+#+ * ID|World.exposure -> exposure: float "Amount of exponential color correction for light"
+#+ * ID|World.horizon_color -> horizon_color: float[3] "Color at the horizon"
+#ID|World.light_settings -> light_settings: pointer, "(read-only) World lighting settings"
+#ID|World.mist_settings -> mist_settings: pointer, "(read-only) World mist settings"
+#ID|World.star_settings -> star_settings: pointer, "(read-only) World stars settings"
+#+ * ID|World.texture_slots -> texture_slots: collection, "(read-only) Texture slots defining the mapping and influence of textures"
+#ID|World.use_sky_blend -> use_sky_blend: boolean "Render background with natural progression from horizon to zenith"
+#ID|World.use_sky_paper -> use_sky_paper: boolean "Flatten blend or texture coordinates"
+#ID|World.use_sky_real -> use_sky_real: boolean "Render background with a real horizon, relative to the camera angle"
+#+ * ID|World.zenith_color -> zenith_color: float[3] "Color at the zenith"
+#+ * IKParam.ik_solver -> ik_solver: enum, "(read-only) IK solver for which these parameters are defined, 0 for Legacy, 1 for iTaSC"
+#IKParam|Itasc.damping_epsilon -> damping_epsilon: float "Singular value under which damping is progressively applied. Higher values=more stability, less reactivity. Default=0.1"
+#IKParam|Itasc.damping_max -> damping_max: float "Maximum damping coefficient when singular value is nearly 0. Higher values=more stability, less reactivity. Default=0.5"
+#+ * IKParam|Itasc.feedback -> feedback: float "Feedback coefficient for error correction. Average response time=1/feedback. Default=20"
+#IKParam|Itasc.iterations -> iterations: int "Maximum number of iterations for convergence in case of reiteration"
+#+ * IKParam|Itasc.mode -> mode: enum "NO DESCRIPTION"
+#+ * IKParam|Itasc.precision -> precision: float "Precision of convergence in case of reiteration"
+#IKParam|Itasc.reiteration_method -> reiteration_method: enum "Defines if the solver is allowed to reiterate (converges until precision is met) on none, first or all frames"
+#+ * IKParam|Itasc.solver -> solver: enum "Solving method selection: Automatic damping or manual damping"
+#IKParam|Itasc.step_count -> step_count: int "Divides the frame interval into this many steps"
+#IKParam|Itasc.step_max -> step_max: float "Higher bound for timestep in second in case of automatic substeps"
+#IKParam|Itasc.step_min -> step_min: float "Lower bound for timestep in second in case of automatic substeps"
+#IKParam|Itasc.use_auto_step -> use_auto_step: boolean "Automatically determine the optimal number of steps for best performance/accuracy trade off"
+#IKParam|Itasc.velocity_max -> velocity_max: float "Maximum joint velocity in rad/s. Default=50"
+#+ * ImageUser.fields_per_frame -> fields_per_frame: int "The number of fields per rendered frame (2 fields is 1 image)"
+#ImageUser.frame_duration -> frame_duration: int "Sets the number of images of a movie to use"
+#ImageUser.frame_offset -> frame_offset: int "Offsets the number of the frame to use in the animation"
+#+ * ImageUser.frame_start -> frame_start: int "Sets the global starting frame of the movie"
+#+ * 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.use_auto_refresh -> use_auto_refresh: boolean "Always refresh image on frame changes"
+#ImageUser.use_cyclic -> use_cyclic: boolean "Cycle the images in the movie"
+#KeyConfig.is_user_defined -> is_user_defined: boolean, "(read-only) Indicates that a keyconfig was defined by the user"
+#+ * KeyConfig.keymaps -> keymaps: collection, "(read-only) Key maps configured as part of this configuration"
+#+ * KeyConfig.name -> name: string "Name of the key configuration"
+#KeyConfigurations.active -> active: pointer "Active wm KeyConfig"
+#KeyConfigurations.default -> default: pointer, "(read-only)"
+#KeyMap.is_modal -> is_modal: boolean, "(read-only) Indicates that a keymap is used for translate modal events for an operator"
+#KeyMap.is_user_defined -> is_user_defined: boolean "Keymap is defined by the user"
+#+ * 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.show_expanded_children -> show_expanded_children: boolean "Children expanded in the user interface"
+#KeyMap.show_expanded_items -> show_expanded_items: boolean "Expanded in the user interface"
+#+ * KeyMap.space_type -> space_type: enum, "(read-only) Optional space type keymap is associated with"
+#TODO MOVE TO COLLECTION * KeyMapItem.active -> active: boolean "Activate or deactivate item"
+#+ * 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.alt -> pressed_alt: boolean "Alt key pressed"
+ + * KeyMapItem.any -> pressed_any: boolean "Any modifier keys pressed"
+ + * KeyMapItem.ctrl -> pressed_ctrl: boolean "Control key pressed"
+ + * KeyMapItem.oskey -> pressed_oskey: boolean "Operating system key pressed"
+ + * KeyMapItem.shift -> pressed_shift: boolean "Shift key pressed"
+#+ * KeyMapItem.properties -> properties: pointer, "(read-only) Properties to set when the operator is called"
+#TODO * KeyMapItem.propvalue -> propvalue: enum "The value this event translates to in a modal keymap"
+#KeyMapItem.show_expanded -> show_expanded: boolean "Show key map event and property details in the user interface"
+#+ * KeyMapItem.type -> type: enum "Type of event"
+#+ * KeyMapItem.value -> value: enum "NO DESCRIPTION"
+#+ * Keyframe.co -> co: float[2] "Coordinates of the control point"
+#Keyframe.handle_left -> handle_left: float[2] "Coordinates of the first handle"
+#Keyframe.handle_left_type -> handle_left_type: enum "Handle types"
+#Keyframe.handle_right -> handle_right: float[2] "Coordinates of the second handle"
+#Keyframe.handle_right_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.select_control_point -> select_control_point: boolean "Control point selection status"
+#+ * Keyframe.select_left_handle -> select_left_handle: boolean "Handle 1 selection status"
+#+ * Keyframe.select_right_handle -> select_right_handle: boolean "Handle 2 selection status"
+#+ * Keyframe.type -> type: enum "The type of keyframe"
+#+ * KeyingSet.active_path_index -> active_path_index: int "Current Keying Set index"
+#KeyingSet.is_path_absolute -> is_path_absolute: boolean, "(read-only) Keying Set defines specific paths/settings to be keyframed (i.e. is not reliant on context info)"
+#+ * KeyingSet.name -> name: string "NO DESCRIPTION"
+#+ * 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"
+#KeyingSet.use_insertkey_needed -> use_insertkey_needed: boolean "Only insert keyframes where theyre needed in the relevant F-Curves"
+#KeyingSet.use_insertkey_visual -> use_insertkey_visual: boolean "Insert keyframes based on visual transforms"
+#KeyingSet.use_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.bl_idname -> bl_idname: string "NO DESCRIPTION"
+#+ * KeyingSetInfo.bl_label -> bl_label: string "NO DESCRIPTION"
+#KeyingSetInfo.use_insertkey_needed -> use_insertkey_needed: boolean "Only insert keyframes where theyre needed in the relevant F-Curves"
+#KeyingSetInfo.use_insertkey_visual -> use_insertkey_visual: boolean "Insert keyframes based on visual transforms"
+#KeyingSetInfo.use_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.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.group_method -> 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"
+#KeyingSetPath.use_entire_array -> use_entire_array: boolean "When an array/vector type is chosen (Location, Rotation, Color, etc.), entire array is to be used"
+#KeyingSetPath.use_insertkey_needed -> use_insertkey_needed: boolean "Only insert keyframes where theyre needed in the relevant F-Curves"
+#KeyingSetPath.use_insertkey_visual -> use_insertkey_visual: boolean "Insert keyframes based on visual transforms"
+#KeyingSetPath.use_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"
+#KeyingSetPaths.active -> active: pointer "Active Keying Set used to insert/delete keyframes"
+#KeyingSets.active -> active: pointer "Active Keying Set used to insert/delete keyframes"
+#+ * 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_brightness: 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_brightness: float "Sun brightness"
+#+ * LampSkySettings.sun_intensity -> sun_intensity: float "Sun intensity"
+#+ * LampSkySettings.sun_size -> sun_size: float "Sun size"
+#+ * LampSkySettings.use_atmosphere -> use_atmosphere: boolean "Apply sun effect on atmosphere"
+#+ * LampSkySettings.use_sky -> use_sky: boolean "Apply sun effect on sky"
+#+ * LatticePoint.co -> co: float[3], "(read-only)"
+#LatticePoint.co_deform -> co_deform: float[3] "NO DESCRIPTION"
+#+ * LatticePoint.groups -> groups: collection, "(read-only) Weights for the vertex groups this point is member of"
+#+ * Macro.bl_description -> bl_description: string "NO DESCRIPTION"
+#+ * Macro.bl_idname -> bl_idname: string "NO DESCRIPTION"
+#+ * Macro.bl_label -> bl_label: string "NO DESCRIPTION"
+#+ * Macro.bl_options -> bl_options: enum "Options for this operator type"
+#+ * Macro.name -> name: string, "(read-only)"
+#+ * Macro.properties -> properties: pointer, "(read-only)"
+#+ * 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.grease_pencil -> grease_pencil: collection, "(read-only) Grease Pencil datablocks."
+#+ * Main.groups -> groups: collection, "(read-only) Group datablocks."
+#+ * Main.images -> images: collection, "(read-only) Image datablocks."
+#Main.is_dirty -> is_dirty: boolean, "(read-only) Has the current session been saved to disk as a .blend file"
+#+ * 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.debug -> show_debug: boolean "Print debugging information in console"
+#+ * 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."
+#+ * 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_subflare_count -> flare_subflare_count: int "Sets the number of subflares"
+#MaterialHalo.flare_subflare_size -> flare_subflare_size: float "Sets the dimension of the subflares, dots and circles"
+#+ * MaterialHalo.hardness -> hardness: int "Sets the hardness of the halo"
+#MaterialHalo.line_count -> line_count: int "Sets the number of star shaped lines rendered over the halo"
+#MaterialHalo.ring_count -> ring_count: 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_tip_count -> star_tip_count: int "Sets the number of points on the star shaped halo"
+#MaterialHalo.use_extreme_alpha -> use_extreme_alpha: boolean "Uses extreme alpha"
+#MaterialHalo.use_flare_mode -> use_flare_mode: boolean "Renders halo as a lensflare"
+#MaterialHalo.use_lines -> use_lines: boolean "Renders star shaped lines over halo"
+#MaterialHalo.use_ring -> use_ring: boolean "Renders rings over halo"
+#MaterialHalo.use_shaded -> use_shaded: boolean "Lets halo receive light and shadows from external objects"
+#MaterialHalo.use_soft -> use_soft: boolean "Softens the edges of halos at intersections with other geometry"
+#MaterialHalo.use_star -> use_star: boolean "Renders halo as a star"
+#MaterialHalo.use_texture -> use_texture: boolean "Gives halo a texture"
+#MaterialHalo.use_vertex_normal -> use_vertex_normal: boolean "Uses the vertex normal to specify the dimension of the halo"
+#MaterialPhysics.damping -> damping: 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"
+#MaterialPhysics.use_normal_align -> use_normal_align: boolean "Align dynamic game objects along the surface normal, 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"
+#+ * MaterialRaytraceMirror.use -> use: boolean "Enable raytraced reflections"
+#+ * MaterialRaytraceTransparency.depth -> depth: int "Maximum allowed number of light inter-refractions"
+#MaterialRaytraceTransparency.depth_max -> depth_max: float "Maximum depth for light to travel through the transparent material before becoming fully filtered (0.0 is disabled)"
+#+ * MaterialRaytraceTransparency.falloff -> falloff: float "Falloff power for transmissivity filter effect (1.0 is linear)"
+#+ * MaterialRaytraceTransparency.filter -> filter: float "Amount to blend in the materials 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"
+#+ * MaterialSlot.link -> link: enum "Link material to object or the objects 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.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.size_min -> size_min: float "Minimum size of strands in pixels"
+#+ * MaterialStrand.tip_size -> tip_size: float "End size of strands in pixels or Blender units"
+#MaterialStrand.use_blender_units -> use_blender_units: boolean "Use Blender units for widths instead of pixels"
+#MaterialStrand.use_surface_diffuse -> use_surface_diffuse: boolean "Make diffuse shading more similar to shading the surface"
+#MaterialStrand.use_tangent_shading -> use_tangent_shading: boolean "Uses direction of strands as normal for tangent-shading"
+#+ * 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[3] "Scattering color"
+#+ * MaterialSubsurfaceScattering.color_factor -> color_factor: float "Blend factor for SSS colors"
+#MaterialSubsurfaceScattering.error_threshold -> error_threshold: 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[3] "Mean red/green/blue scattering path length"
+#+ * MaterialSubsurfaceScattering.scale -> scale: float "Object scale factor"
+#+ * MaterialSubsurfaceScattering.texture_factor -> texture_factor: float "Texture scatting blend factor"
+#+ * MaterialSubsurfaceScattering.use -> use: boolean "Enable diffuse subsurface scatting effects in a material"
+#+ * 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 materials density"
+#MaterialVolume.depth_threshold -> depth_threshold: 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[3] "NO DESCRIPTION"
+#MaterialVolume.light_method -> light_method: 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[3] "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_method -> step_method: 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[3] "Result color of the volume, after other light has been scattered/absorbed"
+#MaterialVolume.use_external_shadows -> use_external_shadows: boolean "Receive shadows from sources outside the volume (temporary)"
+#MaterialVolume.use_light_cache -> use_light_cache: boolean "Pre-calculate the shading information into a voxel grid, speeds up shading at slightly less accuracy"
+#+ * Menu.bl_idname -> bl_idname: string "If this is set, the menu gets a custom ID, otherwise it takes the name of the class used to define the panel. For example, if the class name is OBJECT_MT_hello, and bl_idname is not set by the script, then bl_idname = OBJECT_MT_hello"
+#+ * Menu.bl_label -> bl_label: string "The menu label"
+#+ * Menu.layout -> layout: pointer, "(read-only) Defines the structure of the menu in the UI."
+#+ * MeshColor.color1 -> color1: float[3] "NO DESCRIPTION"
+#+ * MeshColor.color2 -> color2: float[3] "NO DESCRIPTION"
+#+ * MeshColor.color3 -> color3: float[3] "NO DESCRIPTION"
+#+ * MeshColor.color4 -> color4: float[3] "NO DESCRIPTION"
+#+ * 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"
+#+ * MeshColorLayer.data -> data: collection, "(read-only)"
+#+ * MeshColorLayer.name -> name: string "NO DESCRIPTION"
+#+ * 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.hide -> hide: boolean "NO DESCRIPTION"
+#+ * MeshEdge.index -> index: int, "(read-only) Index number of the vertex"
+#MeshEdge.is_fgon -> is_fgon: boolean "Fgon edge"
+#MeshEdge.is_loose -> is_loose: boolean "Loose edge"
+#+ * MeshEdge.select -> select: boolean "NO DESCRIPTION"
+#MeshEdge.use_edge_sharp -> use_edge_sharp: boolean "Sharp edge for the EdgeSplit modifier"
+#MeshEdge.use_seam -> use_seam: boolean "Seam edge for UV unwrapping"
+#MeshEdge.vertices -> vertices: int[2] "Vertex indices"
+#+ * MeshFace.area -> area: float, "(read-only) read only area of the face"
+#+ * MeshFace.hide -> hide: boolean "NO DESCRIPTION"
+#+ * MeshFace.index -> index: int, "(read-only) Index number of the vertex"
+#+ * MeshFace.material_index -> material_index: int "NO DESCRIPTION"
+#+ * MeshFace.normal -> normal: float[3], "(read-only) local space unit length normal vector for this face"
+#+ * MeshFace.select -> select: boolean "NO DESCRIPTION"
+#MeshFace.use_smooth -> use_smooth: boolean "NO DESCRIPTION"
+#MeshFace.vertices -> vertices: int[4] "Vertex indices"
+#MeshFace.vertices_raw -> vertices_raw: int[4] "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 "NO DESCRIPTION"
+#+ * MeshFloatPropertyLayer.data -> data: collection, "(read-only)"
+#+ * MeshFloatPropertyLayer.name -> name: string "NO DESCRIPTION"
+#+ * MeshIntProperty.value -> value: int "NO DESCRIPTION"
+#+ * MeshIntPropertyLayer.data -> data: collection, "(read-only)"
+#+ * MeshIntPropertyLayer.name -> name: string "NO DESCRIPTION"
+#+ * MeshSticky.co -> co: float[2] "Sticky texture coordinate location"
+#+ * MeshStringProperty.value -> value: string "NO DESCRIPTION"
+#+ * MeshStringPropertyLayer.data -> data: collection, "(read-only)"
+#+ * MeshStringPropertyLayer.name -> name: string "NO DESCRIPTION"
+#MeshTextureFace.blend_type -> blend_type: enum "Transparency blending mode"
+#MeshTextureFace.hide -> hide: boolean "Make face invisible"
+#+ * MeshTextureFace.image -> image: pointer "NO DESCRIPTION"
+#MeshTextureFace.pin_uv -> pin_uv: boolean[4] "NO DESCRIPTION"
+#+ * MeshTextureFace.select_uv -> select_uv: boolean[4] "NO DESCRIPTION"
+#MeshTextureFace.use_alpha_sort -> use_alpha_sort: boolean "Enable sorting of faces for correct alpha drawing (slow, use Clip Alpha instead when possible)"
+#MeshTextureFace.use_billboard -> use_billboard: boolean "Billboard with Z-axis constraint"
+#MeshTextureFace.use_bitmap_text -> use_bitmap_text: boolean "Enable bitmap text on face"
+#MeshTextureFace.use_blend_shared -> use_blend_shared: boolean "Blend vertex colors across face when vertices are shared"
+#MeshTextureFace.use_collision -> use_collision: boolean "Use face for collision and ray-sensor detection"
+#MeshTextureFace.use_halo -> use_halo: boolean "Screen aligned billboard"
+#MeshTextureFace.use_image -> use_image: boolean "Render face with texture"
+#MeshTextureFace.use_light -> use_light: boolean "Use light for face"
+#MeshTextureFace.use_object_color -> use_object_color: boolean "Use ObColor instead of vertex colors"
+#MeshTextureFace.use_shadow_cast -> use_shadow_cast: boolean "Face is used for shadow"
+#MeshTextureFace.use_twoside -> use_twoside: boolean "Render face two-sided"
+#+ * MeshTextureFace.uv -> uv: float[8] "NO DESCRIPTION"
+#+ * MeshTextureFace.uv1 -> uv1: float[2] "NO DESCRIPTION"
+#+ * MeshTextureFace.uv2 -> uv2: float[2] "NO DESCRIPTION"
+#+ * MeshTextureFace.uv3 -> uv3: float[2] "NO DESCRIPTION"
+#+ * MeshTextureFace.uv4 -> uv4: float[2] "NO DESCRIPTION"
+#+ * MeshTextureFace.uv_raw -> uv_raw: float[8] "Fixed size UV coordinates array"
+#+ * 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"
+#+ * MeshTextureFaceLayer.data -> data: collection, "(read-only)"
+#+ * MeshTextureFaceLayer.name -> name: string "NO DESCRIPTION"
+#+ * MeshVertex.bevel_weight -> bevel_weight: float "Weight used by the Bevel modifier Only Vertices option"
+#+ * MeshVertex.co -> co: float[3] "NO DESCRIPTION"
+#+ * MeshVertex.groups -> groups: collection, "(read-only) Weights for the vertex groups this vertex is member of"
+#+ * MeshVertex.hide -> hide: boolean "NO DESCRIPTION"
+#+ * MeshVertex.index -> index: int, "(read-only) Index number of the vertex"
+#+ * MeshVertex.normal -> normal: float[3] "Vertex Normal"
+#+ * MeshVertex.select -> select: boolean "NO DESCRIPTION"
+#MetaBallElements.active -> active: pointer, "(read-only) Last selected element"
+#MetaElement.co -> co: float[3] "NO DESCRIPTION"
+#+ * MetaElement.hide -> hide: boolean "Hide element"
+#+ * MetaElement.radius -> radius: float "NO DESCRIPTION"
+#+ * MetaElement.rotation -> rotation: float[4] "NO DESCRIPTION"
+#+ * 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"
+#MetaElement.use_negative -> use_negative: boolean "Set metaball as negative one"
+#+ * Modifier.name -> name: string "Modifier name"
+#Modifier.show_expanded -> show_expanded: boolean "Set modifier expanded in the user interface"
+#Modifier.show_in_editmode -> show_in_editmode: boolean "Use modifier while in the edit mode"
+#Modifier.show_on_cage -> show_on_cage: boolean "Enable direct editing of modifier control cage"
+#Modifier.show_render -> show_render: boolean "Use modifier during rendering"
+#Modifier.show_viewport -> show_viewport: boolean "Realtime display of a modifier"
+#+ * Modifier.type -> type: enum, "(read-only)"
+#Modifier|ArmatureModifier.invert_vertex_group -> invert_vertex_group: boolean "Invert vertex group influence"
+#+ * Modifier|ArmatureModifier.object -> object: pointer "Armature object to deform with"
+#+ * Modifier|ArmatureModifier.use_bone_envelopes -> use_bone_envelopes: boolean "NO DESCRIPTION"
+#Modifier|ArmatureModifier.use_deform_preserve_volume -> use_deform_preserve_volume: boolean "Deform rotation interpolation with quaternions"
+#Modifier|ArmatureModifier.use_multi_modifier -> use_multi_modifier: boolean "Use same input as previous modifier, and mix results using overall vgroup"
+#+ * Modifier|ArmatureModifier.use_vertex_groups -> use_vertex_groups: boolean "NO DESCRIPTION"
+#+ * Modifier|ArmatureModifier.vertex_group -> vertex_group: string "Vertex group name"
+#Modifier|ArrayModifier.constant_offset_displace -> constant_offset_displace: float[3] "NO DESCRIPTION"
+#+ * Modifier|ArrayModifier.count -> count: int "Number of duplicates to make"
+#+ * Modifier|ArrayModifier.curve -> curve: pointer "Curve object to fit array length to"
+#+ * Modifier|ArrayModifier.end_cap -> end_cap: pointer "Mesh object to use as an end cap"
+#Modifier|ArrayModifier.fit_length -> fit_length: float "Length to fit array within"
+#+ * Modifier|ArrayModifier.fit_type -> fit_type: enum "Array length calculation method"
+#Modifier|ArrayModifier.merge_threshold -> merge_threshold: float "Limit below which to merge vertices"
+#+ * Modifier|ArrayModifier.offset_object -> offset_object: pointer "NO DESCRIPTION"
+#Modifier|ArrayModifier.relative_offset_displace -> relative_offset_displace: float[3] "NO DESCRIPTION"
+#+ * Modifier|ArrayModifier.start_cap -> start_cap: pointer "Mesh object to use as a start cap"
+#Modifier|ArrayModifier.use_constant_offset -> use_constant_offset: boolean "Add a constant offset"
+#Modifier|ArrayModifier.use_merge_vertices -> use_merge_vertices: boolean "Merge vertices in adjacent duplicates"
+#Modifier|ArrayModifier.use_merge_vertices_cap -> use_merge_vertices_cap: boolean "Merge vertices in first and last duplicates"
+#Modifier|ArrayModifier.use_object_offset -> use_object_offset: boolean "Add another objects transformation to the total offset"
+#Modifier|ArrayModifier.use_relative_offset -> use_relative_offset: boolean "Add an offset relative to the objects bounding box"
+#Modifier|BevelModifier.angle_limit -> angle_limit: float "Angle above which to bevel edges"
+#+ * Modifier|BevelModifier.edge_weight_method -> edge_weight_method: enum "What edge weight to use for weighting a vertex"
+#+ * Modifier|BevelModifier.limit_method -> limit_method: enum "NO DESCRIPTION"
+#Modifier|BevelModifier.use_only_vertices -> use_only_vertices: boolean "Bevel verts/corners, not edges"
+#+ * Modifier|BevelModifier.width -> width: float "Bevel value/amount"
+#+ * Modifier|BooleanModifier.object -> object: pointer "Mesh object to use for Boolean operation"
+#+ * Modifier|BooleanModifier.operation -> operation: enum "NO DESCRIPTION"
+#Modifier|BuildModifier.frame_duration -> frame_duration: float "Specify the total time the build effect requires"
+#+ * Modifier|BuildModifier.frame_start -> frame_start: float "Specify the start frame of the effect"
+#+ * Modifier|BuildModifier.seed -> seed: int "Specify the seed for random if used"
+#Modifier|BuildModifier.use_random_order -> use_random_order: boolean "Randomize the faces or edges during build"
+#+ * Modifier|CastModifier.cast_type -> cast_type: enum "NO DESCRIPTION"
+#+ * Modifier|CastModifier.factor -> factor: float "NO DESCRIPTION"
+#+ * Modifier|CastModifier.object -> object: pointer "Control object: if available, its location determines the center of the effect"
+#+ * Modifier|CastModifier.radius -> radius: float "Only deform vertices within this distance from the center of the effect (leave as 0 for infinite.)"
+#+ * Modifier|CastModifier.size -> size: float "Size of projection shape (leave as 0 for auto.)"
+#Modifier|CastModifier.use_radius_as_size -> use_radius_as_size: boolean "Use radius as size of projection shape (0 = auto)"
+#+ * Modifier|CastModifier.use_transform -> use_transform: boolean "Use object transform to control projection shape"
+#Modifier|CastModifier.use_x -> use_x: boolean "NO DESCRIPTION"
+#Modifier|CastModifier.use_y -> use_y: boolean "NO DESCRIPTION"
+#Modifier|CastModifier.use_z -> use_z: boolean "NO DESCRIPTION"
+#+ * Modifier|CastModifier.vertex_group -> vertex_group: string "Vertex group name"
+#+ * Modifier|ClothModifier.collision_settings -> collision_settings: pointer, "(read-only)"
+#+ * Modifier|ClothModifier.point_cache -> point_cache: pointer, "(read-only)"
+#+ * Modifier|ClothModifier.settings -> settings: pointer, "(read-only)"
+#+ * Modifier|CollisionModifier.settings -> settings: pointer, "(read-only)"
+#+ * Modifier|CurveModifier.deform_axis -> deform_axis: enum "The axis that the curve deforms along"
+#+ * Modifier|CurveModifier.object -> object: pointer "Curve object to deform with"
+#+ * Modifier|CurveModifier.vertex_group -> vertex_group: string "Vertex group name"
+#+ * Modifier|DecimateModifier.face_count -> face_count: int, "(read-only) The current number of faces in the decimated mesh"
+#+ * Modifier|DecimateModifier.ratio -> ratio: float "Defines the ratio of triangles to reduce to"
+#+ * Modifier|DisplaceModifier.direction -> direction: enum "NO DESCRIPTION"
+#Modifier|DisplaceModifier.mid_level -> mid_level: float "Material value that gives no displacement"
+#+ * Modifier|DisplaceModifier.strength -> strength: float "NO DESCRIPTION"
+#+ * Modifier|DisplaceModifier.texture -> texture: pointer "NO DESCRIPTION"
+#+ * Modifier|DisplaceModifier.texture_coordinate_object -> texture_coordinate_object: pointer "NO DESCRIPTION"
+#Modifier|DisplaceModifier.texture_coords -> texture_coords: enum "NO DESCRIPTION"
+#+ * Modifier|DisplaceModifier.uv_layer -> uv_layer: string "UV layer name"
+#+ * Modifier|DisplaceModifier.vertex_group -> vertex_group: string "Vertex group name"
+#+ * Modifier|EdgeSplitModifier.split_angle -> split_angle: float "Angle above which to split edges"
+#+ * Modifier|EdgeSplitModifier.use_edge_angle -> use_edge_angle: boolean "Split edges with high angle between faces"
+#Modifier|EdgeSplitModifier.use_edge_sharp -> use_edge_sharp: boolean "Split edges that are marked as sharp"
+#+ * Modifier|ExplodeModifier.protect -> protect: float "Clean vertex group edges"
+#Modifier|ExplodeModifier.show_alive -> show_alive: boolean "Show mesh when particles are alive"
+#Modifier|ExplodeModifier.show_dead -> show_dead: boolean "Show mesh when particles are dead"
+#Modifier|ExplodeModifier.show_unborn -> show_unborn: boolean "Show mesh when particles are unborn"
+#Modifier|ExplodeModifier.use_edge_split -> use_edge_split: boolean "Split face edges for nicer shrapnel"
+#Modifier|ExplodeModifier.use_size -> use_size: boolean "Use particle size for the shrapnel"
+#+ * Modifier|ExplodeModifier.vertex_group -> vertex_group: string "NO DESCRIPTION"
+#+ * Modifier|FluidSimulationModifier.settings -> settings: pointer, "(read-only) Settings for how this object is used in the fluid simulation"
+#+ * Modifier|HookModifier.falloff -> falloff: float "If not zero, the distance from the hook where influence ends"
+#+ * Modifier|HookModifier.force -> force: float "Relative force of the hook"
+#+ * Modifier|HookModifier.object -> object: pointer "Parent Object for hook, also recalculates and clears offset"
+#+ * Modifier|HookModifier.subtarget -> subtarget: string "Name of Parent Bone for hook (if applicable), also recalculates and clears offset"
+#+ * Modifier|HookModifier.vertex_group -> vertex_group: string "Vertex group name"
+#+ * Modifier|LatticeModifier.object -> object: pointer "Lattice object to deform with"
+#+ * Modifier|LatticeModifier.vertex_group -> vertex_group: string "Vertex group name"
+#+ * Modifier|MaskModifier.armature -> armature: pointer "Armature to use as source of bones to mask"
+#Modifier|MaskModifier.invert_vertex_group -> invert_vertex_group: boolean "Use vertices that are not part of region defined"
+#+ * Modifier|MaskModifier.mode -> mode: enum "NO DESCRIPTION"
+#+ * Modifier|MaskModifier.vertex_group -> vertex_group: string "Vertex group name"
+#Modifier|MeshDeformModifier.invert_vertex_group -> invert_vertex_group: boolean "Invert vertex group influence"
+#+ * Modifier|MeshDeformModifier.is_bound -> is_bound: boolean, "(read-only) Whether geometry has been bound to control cage"
+#+ * Modifier|MeshDeformModifier.object -> object: pointer "Mesh object to deform with"
+#+ * Modifier|MeshDeformModifier.precision -> precision: int "The grid size for binding"
+#Modifier|MeshDeformModifier.use_dynamic_bind -> use_dynamic_bind: boolean "Recompute binding dynamically on top of other deformers (slower and more memory consuming.)"
+#+ * Modifier|MeshDeformModifier.vertex_group -> vertex_group: string "Vertex group name"
+#Modifier|MirrorModifier.merge_threshold -> merge_threshold: float "Distance from axis within which mirrored vertices are merged"
+#+ * Modifier|MirrorModifier.mirror_object -> mirror_object: pointer "Object to use as mirror"
+#Modifier|MirrorModifier.use_clip -> use_clip: boolean "Prevents vertices from going through the mirror during transform"
+#Modifier|MirrorModifier.use_mirror_u -> use_mirror_u: boolean "Mirror the U texture coordinate around the 0.5 point"
+#Modifier|MirrorModifier.use_mirror_v -> use_mirror_v: boolean "Mirror the V texture coordinate around the 0.5 point"
+#Modifier|MirrorModifier.use_mirror_vertex_groups -> use_mirror_vertex_groups: boolean "Mirror vertex groups (e.g. .R->.L)"
+#Modifier|MirrorModifier.use_x -> use_x: boolean "Enable X axis mirror"
+#Modifier|MirrorModifier.use_y -> use_y: boolean "Enable Y axis mirror"
+#Modifier|MirrorModifier.use_z -> use_z: boolean "Enable Z axis mirror"
+#+ * Modifier|MultiresModifier.filepath -> filepath: string "Path to external displacements file"
+#Modifier|MultiresModifier.is_external -> is_external: boolean, "(read-only) Store multires displacements outside the .blend file, to save memory"
+#+ * Modifier|MultiresModifier.levels -> levels: int "Number of subdivisions to use in the viewport"
+#+ * Modifier|MultiresModifier.render_levels -> render_levels: int "NO DESCRIPTION"
+#+ * Modifier|MultiresModifier.sculpt_levels -> sculpt_levels: int "Number of subdivisions to use in sculpt mode"
+#Modifier|MultiresModifier.show_only_control_edges -> show_only_control_edges: boolean "Skip drawing/rendering of interior subdivided edges"
+#+ * Modifier|MultiresModifier.subdivision_type -> subdivision_type: enum "Selects type of subdivision algorithm"
+#+ * Modifier|MultiresModifier.total_levels -> total_levels: int, "(read-only) Number of subdivisions for which displacements are stored"
+#+ * Modifier|ParticleInstanceModifier.axis -> axis: enum "Pole axis for rotation"
+#+ * Modifier|ParticleInstanceModifier.object -> object: pointer "Object that has the particle system"
+#Modifier|ParticleInstanceModifier.particle_system_index -> particle_system_index: int "NO DESCRIPTION"
+#+ * Modifier|ParticleInstanceModifier.position -> position: float "Position along path"
+#+ * Modifier|ParticleInstanceModifier.random_position -> random_position: float "Randomize position along path"
+#Modifier|ParticleInstanceModifier.show_alive -> show_alive: boolean "Show instances when particles are alive"
+#Modifier|ParticleInstanceModifier.show_dead -> show_dead: boolean "Show instances when particles are dead"
+#Modifier|ParticleInstanceModifier.show_unborn -> show_unborn: boolean "Show instances when particles are unborn"
+#Modifier|ParticleInstanceModifier.use_children -> use_children: boolean "Create instances from child particles"
+#Modifier|ParticleInstanceModifier.use_normal -> use_normal: boolean "Create instances from normal particles"
+#+ * Modifier|ParticleInstanceModifier.use_path -> use_path: boolean "Create instances along particle paths"
+#Modifier|ParticleInstanceModifier.use_preserve_shape -> use_preserve_shape: boolean "Dont stretch the object"
+#Modifier|ParticleInstanceModifier.use_size -> use_size: boolean "Use particle size to scale the instances"
+#+ * Modifier|ParticleSystemModifier.particle_system -> particle_system: pointer, "(read-only) Particle System that this modifier controls"
+#+ * Modifier|ScrewModifier.angle -> angle: float "Angle of revolution"
+#+ * Modifier|ScrewModifier.axis -> axis: enum "Screw axis"
+#+ * Modifier|ScrewModifier.iterations -> iterations: int "Number of times to apply the screw operation"
+#+ * Modifier|ScrewModifier.object -> object: pointer "Object to define the screw axis"
+#+ * Modifier|ScrewModifier.render_steps -> render_steps: int "Number of steps in the revolution"
+#+ * Modifier|ScrewModifier.screw_offset -> screw_offset: float "Offset the revolution along its axis"
+#+ * Modifier|ScrewModifier.steps -> steps: int "Number of steps in the revolution"
+#+ * Modifier|ScrewModifier.use_normal_calculate -> use_normal_calculate: boolean "Calculate the order of edges (needed for meshes, but not curves)"
+#+ * Modifier|ScrewModifier.use_normal_flip -> use_normal_flip: boolean "Flip normals of lathed faces"
+#+ * Modifier|ScrewModifier.use_object_screw_offset -> use_object_screw_offset: boolean "Use the distance between the objects to make a screw"
+#+ * Modifier|ShrinkwrapModifier.auxiliary_target -> auxiliary_target: pointer "Additional mesh target to shrink to"
+#+ * Modifier|ShrinkwrapModifier.offset -> offset: float "Distance to keep from the target"
+#+ * Modifier|ShrinkwrapModifier.subsurf_levels -> subsurf_levels: int "Number of subdivisions that must be performed before extracting vertices positions and normals"
+#+ * Modifier|ShrinkwrapModifier.target -> target: pointer "Mesh target to shrink to"
+#Modifier|ShrinkwrapModifier.use_cull_back_faces -> use_cull_back_faces: boolean "Stop vertices from projecting to a back face on the target"
+#Modifier|ShrinkwrapModifier.use_cull_front_faces -> use_cull_front_faces: boolean "Stop vertices from projecting to a front face on the target"
+#Modifier|ShrinkwrapModifier.use_keep_above_surface -> use_keep_above_surface: boolean "NO DESCRIPTION"
+#Modifier|ShrinkwrapModifier.use_negative_direction -> use_negative_direction: boolean "Allow vertices to move in the negative direction of axis"
+#Modifier|ShrinkwrapModifier.use_positive_direction -> use_positive_direction: boolean "Allow vertices to move in the positive direction of axis"
+#Modifier|ShrinkwrapModifier.use_project_x -> use_project_x: boolean "NO DESCRIPTION"
+#Modifier|ShrinkwrapModifier.use_project_y -> use_project_y: boolean "NO DESCRIPTION"
+#Modifier|ShrinkwrapModifier.use_project_z -> use_project_z: boolean "NO DESCRIPTION"
+#+ * Modifier|ShrinkwrapModifier.vertex_group -> vertex_group: string "Vertex group name"
+#Modifier|ShrinkwrapModifier.wrap_method -> wrap_method: enum "NO DESCRIPTION"
+#Modifier|SimpleDeformModifier.deform_method -> deform_method: enum "NO DESCRIPTION"
+#+ * Modifier|SimpleDeformModifier.factor -> factor: float "NO DESCRIPTION"
+#+ * Modifier|SimpleDeformModifier.limits -> limits: float[2] "Lower/Upper limits for deform"
+#Modifier|SimpleDeformModifier.lock_x -> lock_x: boolean "NO DESCRIPTION"
+#Modifier|SimpleDeformModifier.lock_y -> lock_y: boolean "NO DESCRIPTION"
+#+ * Modifier|SimpleDeformModifier.origin -> origin: pointer "Origin of modifier space coordinates"
+#Modifier|SimpleDeformModifier.use_relative -> use_relative: boolean "Sets the origin of deform space to be relative to the object"
+#+ * Modifier|SimpleDeformModifier.vertex_group -> vertex_group: string "Vertex group name"
+#+ * Modifier|SmokeModifier.coll_settings -> coll_settings: pointer, "(read-only)"
+#+ * Modifier|SmokeModifier.domain_settings -> domain_settings: pointer, "(read-only)"
+#+ * Modifier|SmokeModifier.flow_settings -> flow_settings: pointer, "(read-only)"
+#Modifier|SmokeModifier.smoke_type -> smoke_type: enum "NO DESCRIPTION"
+#+ * Modifier|SmoothModifier.factor -> factor: float "NO DESCRIPTION"
+#Modifier|SmoothModifier.iterations -> iterations: int "NO DESCRIPTION"
+#Modifier|SmoothModifier.use_x -> use_x: boolean "NO DESCRIPTION"
+#Modifier|SmoothModifier.use_y -> use_y: boolean "NO DESCRIPTION"
+#Modifier|SmoothModifier.use_z -> use_z: boolean "NO DESCRIPTION"
+#+ * Modifier|SmoothModifier.vertex_group -> vertex_group: string "Vertex group name"
+#+ * Modifier|SoftBodyModifier.point_cache -> point_cache: pointer, "(read-only)"
+#+ * Modifier|SoftBodyModifier.settings -> settings: pointer, "(read-only)"
+#+ * Modifier|SolidifyModifier.edge_crease_inner -> edge_crease_inner: float "Assign a crease to inner edges"
+#+ * Modifier|SolidifyModifier.edge_crease_outer -> edge_crease_outer: float "Assign a crease to outer edges"
+#+ * Modifier|SolidifyModifier.edge_crease_rim -> edge_crease_rim: float "Assign a crease to the edges making up the rim"
+#Modifier|SolidifyModifier.invert_vertex_group -> invert_vertex_group: boolean "Invert the vertex group influence"
+#+ * Modifier|SolidifyModifier.offset -> offset: float "Offset the thickness from the center"
+#+ * Modifier|SolidifyModifier.thickness -> thickness: float "Thickness of the shell"
+#+ * Modifier|SolidifyModifier.use_even_offset -> use_even_offset: boolean "Maintain thickness by adjusting for sharp corners (slow, disable when not needed)"
+#+ * Modifier|SolidifyModifier.use_quality_normals -> use_quality_normals: boolean "Calculate normals which result in more even thickness (slow, disable when not needed)"
+#+ * Modifier|SolidifyModifier.use_rim -> use_rim: boolean "Create edge loops between the inner and outer surfaces on face edges (slow, disable when not needed)"
+#+ * Modifier|SolidifyModifier.use_rim_material -> use_rim_material: boolean "Use in the next material for rim faces"
+#+ * Modifier|SolidifyModifier.vertex_group -> vertex_group: string "Vertex group name"
+#+ * Modifier|SubsurfModifier.levels -> levels: int "Number of subdivisions to perform"
+#+ * Modifier|SubsurfModifier.render_levels -> render_levels: int "Number of subdivisions to perform when rendering"
+#Modifier|SubsurfModifier.show_only_control_edges -> show_only_control_edges: boolean "Skip drawing/rendering of interior subdivided edges"
+#+ * Modifier|SubsurfModifier.subdivision_type -> subdivision_type: enum "Selects type of subdivision algorithm"
+#Modifier|SubsurfModifier.use_subsurf_uv -> use_subsurf_uv: boolean "Use subsurf to subdivide UVs"
+#+ * Modifier|UVProjectModifier.aspect_x -> aspect_x: float "NO DESCRIPTION"
+#+ * Modifier|UVProjectModifier.aspect_y -> aspect_y: float "NO DESCRIPTION"
+#+ * Modifier|UVProjectModifier.image -> image: pointer "NO DESCRIPTION"
+#Modifier|UVProjectModifier.projector_count -> projector_count: int "Number of projectors to use"
+#+ * Modifier|UVProjectModifier.projectors -> projectors: collection, "(read-only)"
+#+ * Modifier|UVProjectModifier.scale_x -> scale_x: float "NO DESCRIPTION"
+#+ * Modifier|UVProjectModifier.scale_y -> scale_y: float "NO DESCRIPTION"
+#Modifier|UVProjectModifier.use_image_override -> use_image_override: boolean "Override faces current images with the given image"
+#+ * Modifier|UVProjectModifier.uv_layer -> uv_layer: string "UV layer name"
+#+ * Modifier|WaveModifier.damping_time -> damping_time: float "NO DESCRIPTION"
+#+ * Modifier|WaveModifier.falloff_radius -> falloff_radius: float "NO DESCRIPTION"
+#+ * Modifier|WaveModifier.height -> height: float "NO DESCRIPTION"
+#+ * Modifier|WaveModifier.lifetime -> lifetime: float "NO DESCRIPTION"
+#+ * Modifier|WaveModifier.narrowness -> narrowness: float "NO DESCRIPTION"
+#+ * Modifier|WaveModifier.speed -> speed: float "NO DESCRIPTION"
+#+ * Modifier|WaveModifier.start_position_object -> start_position_object: pointer "NO DESCRIPTION"
+#+ * Modifier|WaveModifier.start_position_x -> start_position_x: float "NO DESCRIPTION"
+#+ * Modifier|WaveModifier.start_position_y -> start_position_y: float "NO DESCRIPTION"
+#+ * Modifier|WaveModifier.texture -> texture: pointer "Texture for modulating the wave"
+#Modifier|WaveModifier.texture_coords -> texture_coords: enum "Texture coordinates used for modulating input"
+#Modifier|WaveModifier.texture_coords_object -> texture_coords_object: pointer "NO DESCRIPTION"
+#+ * Modifier|WaveModifier.time_offset -> time_offset: float "Either the starting frame (for positive speed) or ending frame (for negative speed.)"
+#Modifier|WaveModifier.use_cyclic -> use_cyclic: boolean "Cyclic wave effect"
+#Modifier|WaveModifier.use_normal -> use_normal: boolean "Displace along normals"
+#Modifier|WaveModifier.use_normal_x -> use_normal_x: boolean "Enable displacement along the X normal"
+#Modifier|WaveModifier.use_normal_y -> use_normal_y: boolean "Enable displacement along the Y normal"
+#Modifier|WaveModifier.use_normal_z -> use_normal_z: boolean "Enable displacement along the Z normal"
+#Modifier|WaveModifier.use_x -> use_x: boolean "X axis motion"
+#Modifier|WaveModifier.use_y -> use_y: boolean "Y axis motion"
+#+ * Modifier|WaveModifier.uv_layer -> uv_layer: string "UV layer name"
+#+ * Modifier|WaveModifier.vertex_group -> vertex_group: string "Vertex group name for modulating the wave"
+#+ * Modifier|WaveModifier.width -> width: float "NO DESCRIPTION"
+#+ * 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.is_modified -> is_modified: boolean "Path is being edited"
+#+ * MotionPath.length -> length: int, "(read-only) Number of frames cached"
+#+ * MotionPath.points -> points: collection, "(read-only) Cached positions per frame"
+#+ * MotionPath.use_bone_head -> use_bone_head: boolean, "(read-only) For PoseBone paths, use the bone head location when calculating this path"
+#+ * MotionPathVert.co -> co: float[3] "NO DESCRIPTION"
+#+ * MotionPathVert.select -> select: boolean "Path point is selected for editing"
+#+ * NlaStrip.action -> action: pointer "Action referenced by this strip"
+#NlaStrip.action_frame_end -> action_frame_end: float "NO DESCRIPTION"
+#NlaStrip.action_frame_start -> action_frame_start: float "NO DESCRIPTION"
+#+ * NlaStrip.active -> active: boolean, "(read-only) NLA Strip is active"
+#+ * NlaStrip.blend_in -> blend_in: float "Number of frames at start of strip to fade in influence"
+#+ * NlaStrip.blend_out -> blend_out: float "NO DESCRIPTION"
+#NlaStrip.blend_type -> blend_type: enum "Method used for combining strips 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 strips influence and timing"
+#+ * NlaStrip.frame_end -> frame_end: float "NO DESCRIPTION"
+#+ * NlaStrip.frame_start -> frame_start: float "NO DESCRIPTION"
+#+ * 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.mute -> mute: boolean "NLA Strip is not evaluated"
+#+ * NlaStrip.name -> name: string "NO DESCRIPTION"
+#+ * NlaStrip.repeat -> repeat: float "Number of times to repeat the action range"
+#+ * NlaStrip.scale -> scale: float "Scaling factor for action"
+#+ * NlaStrip.select -> select: boolean "NLA Strip is selected"
+#+ * 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"
+#NlaStrip.use_animated_influence -> use_animated_influence: boolean "Influence setting is controlled by an F-Curve rather than automatically determined"
+#NlaStrip.use_animated_time -> use_animated_time: boolean "Strip time is controlled by an F-Curve rather than automatically determined"
+#NlaStrip.use_animated_time_cyclic -> use_animated_time_cyclic: boolean "Cycle the animated time within the action start & end"
+#NlaStrip.use_auto_blend -> use_auto_blend: boolean "Number of frames for Blending In/Out is automatically determined from overlapping strips"
+#NlaStrip.use_reverse -> use_reverse: boolean "NLA Strip is played back in reverse order (only when timing is automatically determined)"
+#+ * NlaTrack.active -> active: boolean, "(read-only) NLA Track is active"
+#NlaTrack.is_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)"
+#+ * NlaTrack.lock -> lock: boolean "NLA Track is locked"
+#+ * NlaTrack.mute -> mute: boolean "NLA Track is not evaluated"
+#+ * NlaTrack.name -> name: string "NO DESCRIPTION"
+#+ * NlaTrack.select -> select: boolean "NLA Track is selected"
+#+ * NlaTrack.strips -> strips: collection, "(read-only) NLA Strips on this NLA-track"
+#+ * Node.inputs -> inputs: collection, "(read-only)"
+#+ * Node.location -> location: float[2] "NO DESCRIPTION"
+#+ * Node.name -> name: string "Node name"
+#+ * Node.outputs -> outputs: collection, "(read-only)"
+#+ * Node|CompositorNode.type -> type: enum, "(read-only)"
+#+ * Node|CompositorNode|CompositorNodeAlphaOver.premul -> premul: float "Mix Factor"
+#Node|CompositorNode|CompositorNodeAlphaOver.use_premultiply -> use_premultiply: boolean "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeBilateralblur.iterations -> iterations: int "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeBilateralblur.sigma_color -> sigma_color: float "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeBilateralblur.sigma_space -> sigma_space: float "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeBlur.factor -> factor: float "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeBlur.factor_x -> factor_x: float "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeBlur.factor_y -> factor_y: float "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeBlur.filter_type -> filter_type: enum "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeBlur.size_x -> size_x: int "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeBlur.size_y -> size_y: int "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeBlur.use_bokeh -> use_bokeh: boolean "Uses circular filter (slower)"
+#Node|CompositorNode|CompositorNodeBlur.use_gamma_correction -> use_gamma_correction: boolean "Applies filter on gamma corrected values"
+#Node|CompositorNode|CompositorNodeBlur.use_relative -> use_relative: boolean "Use relative (percent) values to define blur radius"
+#+ * Node|CompositorNode|CompositorNodeChannelMatte.color_space -> color_space: enum "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeChannelMatte.limit_channel -> limit_channel: enum "Limit by this channels value"
+#Node|CompositorNode|CompositorNodeChannelMatte.limit_max -> limit_max: float "Values higher than this setting are 100% opaque"
+#Node|CompositorNode|CompositorNodeChannelMatte.limit_method -> limit_method: enum "Algorithm to use to limit channel"
+#Node|CompositorNode|CompositorNodeChannelMatte.limit_min -> limit_min: float "Values lower than this setting are 100% keyed"
+#Node|CompositorNode|CompositorNodeChannelMatte.matte_channel -> matte_channel: enum "Channel used to determine matte"
+#+ * Node|CompositorNode|CompositorNodeChromaMatte.gain -> gain: float "Alpha gain"
+#+ * Node|CompositorNode|CompositorNodeChromaMatte.lift -> lift: float "Alpha lift"
+#+ * Node|CompositorNode|CompositorNodeChromaMatte.shadow_adjust -> shadow_adjust: float "Adjusts the brightness of any shadows captured"
+#Node|CompositorNode|CompositorNodeChromaMatte.threshold -> threshold: float "Tolerance below which colors will be considered as exact matches"
+#Node|CompositorNode|CompositorNodeChromaMatte.tolerance -> tolerance: float "Tolerance for a color to be considered a keying color"
+#Node|CompositorNode|CompositorNodeColorBalance.correction_method -> correction_method: enum "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeColorBalance.gain -> gain: float[3] "Correction for Highlights"
+#+ * Node|CompositorNode|CompositorNodeColorBalance.gamma -> gamma: float[3] "Correction for Midtones"
+#+ * Node|CompositorNode|CompositorNodeColorBalance.lift -> lift: float[3] "Correction for Shadows"
+#+ * Node|CompositorNode|CompositorNodeColorBalance.offset -> offset: float[3] "Correction for Shadows"
+#+ * Node|CompositorNode|CompositorNodeColorBalance.power -> power: float[3] "Correction for Midtones"
+#+ * Node|CompositorNode|CompositorNodeColorBalance.slope -> slope: float[3] "Correction for Highlights"
+#Node|CompositorNode|CompositorNodeColorMatte.color_hue -> color_hue: float "Hue tolerance for colors to be considered a keying color"
+#Node|CompositorNode|CompositorNodeColorMatte.color_saturation -> color_saturation: float "Saturation Tolerance for the color"
+#Node|CompositorNode|CompositorNodeColorMatte.color_value -> color_value: float "Value Tolerance for the color"
+#+ * Node|CompositorNode|CompositorNodeColorSpill.channel -> channel: enum "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeColorSpill.limit_channel -> limit_channel: enum "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeColorSpill.limit_method -> limit_method: enum "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeColorSpill.ratio -> ratio: float "Scale limit by value"
+#+ * Node|CompositorNode|CompositorNodeColorSpill.unspill_blue -> unspill_blue: float "Blue spillmap scale"
+#+ * Node|CompositorNode|CompositorNodeColorSpill.unspill_green -> unspill_green: float "Green spillmap scale"
+#+ * Node|CompositorNode|CompositorNodeColorSpill.unspill_red -> unspill_red: float "Red spillmap scale"
+#Node|CompositorNode|CompositorNodeColorSpill.use_unspill -> use_unspill: boolean "Compensate all channels (diffenrently) by hand"
+#Node|CompositorNode|CompositorNodeCrop.max_x -> max_x: int "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeCrop.max_y -> max_y: int "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeCrop.min_x -> min_x: int "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeCrop.min_y -> min_y: int "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeCrop.use_crop_size -> use_crop_size: boolean "Whether to crop the size of the input image"
+#+ * Node|CompositorNode|CompositorNodeCurveRGB.mapping -> mapping: pointer, "(read-only)"
+#+ * Node|CompositorNode|CompositorNodeCurveVec.mapping -> mapping: pointer, "(read-only)"
+#+ * Node|CompositorNode|CompositorNodeDBlur.angle -> angle: float "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeDBlur.center_x -> center_x: float "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeDBlur.center_y -> center_y: float "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeDBlur.distance -> distance: float "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeDBlur.iterations -> iterations: int "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeDBlur.spin -> spin: float "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeDBlur.use_wrap -> use_wrap: boolean "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeDBlur.zoom -> zoom: float "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeDefocus.angle -> angle: int "Bokeh shape rotation offset in degrees"
+#Node|CompositorNode|CompositorNodeDefocus.blur_max -> blur_max: float "blur limit, maximum CoC radius, 0=no limit"
+#+ * Node|CompositorNode|CompositorNodeDefocus.bokeh -> bokeh: enum "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeDefocus.f_stop -> f_stop: float "Amount of focal blur, 128=infinity=perfect focus, half the value doubles the blur radius"
+#+ * Node|CompositorNode|CompositorNodeDefocus.samples -> samples: int "Number of samples (16=grainy, higher=less noise)"
+#+ * Node|CompositorNode|CompositorNodeDefocus.threshold -> threshold: float "CoC radius threshold, prevents background bleed on in-focus midground, 0=off"
+#Node|CompositorNode|CompositorNodeDefocus.use_gamma_correction -> use_gamma_correction: boolean "Enable gamma correction before and after main process"
+#Node|CompositorNode|CompositorNodeDefocus.use_preview -> use_preview: boolean "Enable sampling mode, useful for preview when using low samplecounts"
+#+ * Node|CompositorNode|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)"
+#+ * Node|CompositorNode|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"
+#+ * Node|CompositorNode|CompositorNodeDiffMatte.falloff -> falloff: float "Color distances below this additional threshold are partially keyed"
+#+ * Node|CompositorNode|CompositorNodeDiffMatte.tolerance -> tolerance: float "Color distances below this threshold are keyed"
+#+ * Node|CompositorNode|CompositorNodeDilateErode.distance -> distance: int "Distance to grow/shrink (number of iterations)"
+#+ * Node|CompositorNode|CompositorNodeDistanceMatte.falloff -> falloff: float "Color distances below this additional threshold are partially keyed"
+#+ * Node|CompositorNode|CompositorNodeDistanceMatte.tolerance -> tolerance: float "Color distances below this threshold are keyed"
+#+ * Node|CompositorNode|CompositorNodeFilter.filter_type -> filter_type: enum "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeFlip.axis -> axis: enum "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeGlare.angle_offset -> angle_offset: float "Streak angle offset in degrees"
+#+ * Node|CompositorNode|CompositorNodeGlare.color_modulation -> color_modulation: float "Amount of Color Modulation, modulates colors of streaks and ghosts for a spectral dispersion effect"
+#+ * Node|CompositorNode|CompositorNodeGlare.fade -> fade: float "Streak fade-out factor"
+#+ * Node|CompositorNode|CompositorNodeGlare.glare_type -> glare_type: enum "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeGlare.iterations -> iterations: int "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeGlare.mix -> mix: float "-1 is original image only, 0 is exact 50/50 mix, 1 is processed image only"
+#+ * Node|CompositorNode|CompositorNodeGlare.quality -> quality: enum "If not set to high quality, the effect will be applied to a low-res copy of the source image"
+#+ * Node|CompositorNode|CompositorNodeGlare.size -> size: int "Glow/glare size (not actual size; relative to initial size of bright area of pixels)"
+#+ * Node|CompositorNode|CompositorNodeGlare.streaks -> streaks: int "Total number of streaks"
+#+ * Node|CompositorNode|CompositorNodeGlare.threshold -> threshold: float "The glare filter will only be applied to pixels brighter than this value"
+#Node|CompositorNode|CompositorNodeGlare.use_rotate_45 -> use_rotate_45: boolean "Simple star filter: add 45 degree rotation offset"
+#+ * Node|CompositorNode|CompositorNodeHueCorrect.mapping -> mapping: pointer, "(read-only)"
+#Node|CompositorNode|CompositorNodeHueSat.color_hue -> color_hue: float "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeHueSat.color_saturation -> color_saturation: float "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeHueSat.color_value -> color_value: float "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeIDMask.index -> index: int "Pass index number to convert to alpha"
+#Node|CompositorNode|CompositorNodeImage.frame_duration -> frame_duration: int "Number of images used in animation"
+#Node|CompositorNode|CompositorNodeImage.frame_offset -> frame_offset: int "Offsets the number of the frame to use in the animation"
+#Node|CompositorNode|CompositorNodeImage.frame_start -> frame_start: int "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeImage.image -> image: pointer "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeImage.layer -> layer: enum "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeImage.use_auto_refresh -> use_auto_refresh: boolean "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeImage.use_cyclic -> use_cyclic: boolean "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeInvert.invert_alpha -> invert_alpha: boolean "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeInvert.invert_rgb -> invert_rgb: boolean "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeLensdist.use_fit -> use_fit: boolean "For positive distortion factor only: scale image such that black areas are not visible"
+#Node|CompositorNode|CompositorNodeLensdist.use_jitter -> use_jitter: boolean "Enable/disable jittering; faster, but also noisier"
+#Node|CompositorNode|CompositorNodeLensdist.use_projector -> use_projector: boolean "Enable/disable projector mode. Effect is applied in horizontal direction only"
+#+ * Node|CompositorNode|CompositorNodeLevels.channel -> channel: enum "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeLumaMatte.limit_max -> limit_max: float "Values higher than this setting are 100% opaque"
+#Node|CompositorNode|CompositorNodeLumaMatte.limit_min -> limit_min: float "Values lower than this setting are 100% keyed"
+#+ * Node|CompositorNode|CompositorNodeMapUV.alpha -> alpha: int "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeMapValue.max -> max: float[1] "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeMapValue.min -> min: float[1] "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeMapValue.offset -> offset: float[1] "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeMapValue.size -> size: float[1] "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeMapValue.use_max -> use_max: boolean "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeMapValue.use_min -> use_min: boolean "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeMath.operation -> operation: enum "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeMixRGB.blend_type -> blend_type: enum "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeMixRGB.use_alpha -> use_alpha: boolean "Include alpha of second input in this operation"
+#+ * Node|CompositorNode|CompositorNodeOutputFile.exr_codec -> exr_codec: enum "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeOutputFile.filepath -> filepath: string "Output path for the image, same functionality as render output."
+#+ * Node|CompositorNode|CompositorNodeOutputFile.frame_end -> frame_end: int "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeOutputFile.frame_start -> frame_start: int "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeOutputFile.image_type -> image_type: enum "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeOutputFile.quality -> quality: int "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeOutputFile.use_exr_half -> use_exr_half: boolean "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodePremulKey.mapping -> mapping: enum "Conversion between premultiplied alpha and key alpha"
+#+ * Node|CompositorNode|CompositorNodeRLayers.layer -> layer: enum "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeRLayers.scene -> scene: pointer "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeRotate.filter_type -> filter_type: enum "Method to use to filter rotation"
+#+ * Node|CompositorNode|CompositorNodeScale.space -> space: enum "Coordinate space to scale relative to"
+#+ * Node|CompositorNode|CompositorNodeSplitViewer.axis -> axis: enum "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeSplitViewer.factor -> factor: int "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeTexture.node_output -> node_output: int "For node-based textures, which output node to use"
+#+ * Node|CompositorNode|CompositorNodeTexture.texture -> texture: pointer "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeTime.curve -> curve: pointer, "(read-only)"
+#Node|CompositorNode|CompositorNodeTime.frame_end -> frame_end: int "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeTime.frame_start -> frame_start: int "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeTonemap.adaptation -> adaptation: float "If 0, global; if 1, based on pixel intensity"
+#+ * Node|CompositorNode|CompositorNodeTonemap.contrast -> contrast: float "Set to 0 to use estimate from input image"
+#+ * Node|CompositorNode|CompositorNodeTonemap.correction -> correction: float "If 0, same for all channels; if 1, each independent"
+#+ * Node|CompositorNode|CompositorNodeTonemap.gamma -> gamma: float "If not used, set to 1"
+#+ * Node|CompositorNode|CompositorNodeTonemap.intensity -> intensity: float "If less than zero, darkens image; otherwise, makes it brighter"
+#+ * Node|CompositorNode|CompositorNodeTonemap.key -> key: float "The value the average luminance is mapped to"
+#+ * Node|CompositorNode|CompositorNodeTonemap.offset -> offset: float "Normally always 1, but can be used as an extra control to alter the brightness curve"
+#+ * Node|CompositorNode|CompositorNodeTonemap.tonemap_type -> tonemap_type: enum "NO DESCRIPTION"
+#+ * Node|CompositorNode|CompositorNodeValToRGB.color_ramp -> color_ramp: pointer, "(read-only)"
+#+ * Node|CompositorNode|CompositorNodeVecBlur.factor -> factor: float "Scaling factor for motion vectors; actually shutter speed in frames"
+#+ * Node|CompositorNode|CompositorNodeVecBlur.samples -> samples: int "NO DESCRIPTION"
+#Node|CompositorNode|CompositorNodeVecBlur.speed_max -> speed_max: int "Maximum speed, or zero for none"
+#Node|CompositorNode|CompositorNodeVecBlur.speed_min -> speed_min: int "Minimum speed for a pixel to be blurred; used to separate background from foreground"
+#Node|CompositorNode|CompositorNodeVecBlur.use_curved -> use_curved: boolean "Interpolate between frames in a bezier curve, rather than linearly"
+#+ * Node|NodeGroup.nodetree -> nodetree: pointer "NO DESCRIPTION"
+#+ * Node|ShaderNode.type -> type: enum, "(read-only)"
+#+ * Node|ShaderNode|ShaderNodeExtendedMaterial.invert_normal -> invert_normal: boolean "Material Node uses inverted normal"
+#+ * Node|ShaderNode|ShaderNodeExtendedMaterial.material -> material: pointer "NO DESCRIPTION"
+#Node|ShaderNode|ShaderNodeExtendedMaterial.use_diffuse -> use_diffuse: boolean "Material Node outputs Diffuse"
+#Node|ShaderNode|ShaderNodeExtendedMaterial.use_specular -> use_specular: boolean "Material Node outputs Specular"
+#+ * Node|ShaderNode|ShaderNodeGeometry.color_layer -> color_layer: string "NO DESCRIPTION"
+#+ * Node|ShaderNode|ShaderNodeGeometry.uv_layer -> uv_layer: string "NO DESCRIPTION"
+#+ * Node|ShaderNode|ShaderNodeMapping.location -> location: float[3] "Location offset for the input coordinate"
+#Node|ShaderNode|ShaderNodeMapping.max -> max: float[3] "Maximum value to clamp coordinate to"
+#Node|ShaderNode|ShaderNodeMapping.min -> min: float[3] "Minimum value to clamp coordinate to"
+#+ * Node|ShaderNode|ShaderNodeMapping.rotation -> rotation: float[3] "Rotation offset for the input coordinate"
+#+ * Node|ShaderNode|ShaderNodeMapping.scale -> scale: float[3] "Scale adjustment for the input coordinate"
+#Node|ShaderNode|ShaderNodeMapping.use_max -> use_max: boolean "Clamp the output coordinate to a maximum value"
+#Node|ShaderNode|ShaderNodeMapping.use_min -> use_min: boolean "Clamp the output coordinate to a minimum value"
+#+ * Node|ShaderNode|ShaderNodeMaterial.invert_normal -> invert_normal: boolean "Material Node uses inverted normal"
+#+ * Node|ShaderNode|ShaderNodeMaterial.material -> material: pointer "NO DESCRIPTION"
+#Node|ShaderNode|ShaderNodeMaterial.use_diffuse -> use_diffuse: boolean "Material Node outputs Diffuse"
+#Node|ShaderNode|ShaderNodeMaterial.use_specular -> use_specular: boolean "Material Node outputs Specular"
+#+ * Node|ShaderNode|ShaderNodeMath.operation -> operation: enum "NO DESCRIPTION"
+#+ * Node|ShaderNode|ShaderNodeMixRGB.blend_type -> blend_type: enum "NO DESCRIPTION"
+#Node|ShaderNode|ShaderNodeMixRGB.use_alpha -> use_alpha: boolean "Include alpha of second input in this operation"
+#+ * Node|ShaderNode|ShaderNodeRGBCurve.mapping -> mapping: pointer, "(read-only)"
+#+ * Node|ShaderNode|ShaderNodeTexture.node_output -> node_output: int "For node-based textures, which output node to use"
+#+ * Node|ShaderNode|ShaderNodeTexture.texture -> texture: pointer "NO DESCRIPTION"
+#+ * Node|ShaderNode|ShaderNodeValToRGB.color_ramp -> color_ramp: pointer, "(read-only)"
+#+ * Node|ShaderNode|ShaderNodeVectorCurve.mapping -> mapping: pointer, "(read-only)"
+#+ * Node|ShaderNode|ShaderNodeVectorMath.operation -> operation: enum "NO DESCRIPTION"
+#+ * Node|TextureNode.type -> type: enum, "(read-only)"
+#+ * Node|TextureNode|TextureNodeBricks.offset -> offset: float "NO DESCRIPTION"
+#+ * Node|TextureNode|TextureNodeBricks.offset_frequency -> offset_frequency: int "Offset every N rows"
+#+ * Node|TextureNode|TextureNodeBricks.squash -> squash: float "NO DESCRIPTION"
+#+ * Node|TextureNode|TextureNodeBricks.squash_frequency -> squash_frequency: int "Squash every N rows"
+#+ * Node|TextureNode|TextureNodeCurveRGB.mapping -> mapping: pointer, "(read-only)"
+#+ * Node|TextureNode|TextureNodeCurveTime.curve -> curve: pointer, "(read-only)"
+#Node|TextureNode|TextureNodeCurveTime.frame_end -> frame_end: int "NO DESCRIPTION"
+#Node|TextureNode|TextureNodeCurveTime.frame_start -> frame_start: int "NO DESCRIPTION"
+#+ * Node|TextureNode|TextureNodeImage.image -> image: pointer "NO DESCRIPTION"
+#+ * Node|TextureNode|TextureNodeMath.operation -> operation: enum "NO DESCRIPTION"
+#+ * Node|TextureNode|TextureNodeMixRGB.blend_type -> blend_type: enum "NO DESCRIPTION"
+#Node|TextureNode|TextureNodeMixRGB.use_alpha -> use_alpha: boolean "Include alpha of second input in this operation"
+#Node|TextureNode|TextureNodeOutput.filepath -> filepath: string "NO DESCRIPTION"
+#+ * Node|TextureNode|TextureNodeTexture.node_output -> node_output: int "For node-based textures, which output node to use"
+#+ * Node|TextureNode|TextureNodeTexture.texture -> texture: pointer "NO DESCRIPTION"
+#+ * Node|TextureNode|TextureNodeValToRGB.color_ramp -> color_ramp: pointer, "(read-only)"
+#+ * ObjectBase.layers -> layers: boolean[20] "Layers the object base is on"
+#+ * ObjectBase.object -> object: pointer, "(read-only) Object this base links to"
+#+ * ObjectBase.select -> select: boolean "Object base selection state"
+#+ * ObjectConstraints.active -> active: pointer "Active Object constraint"
+#+ * Operator.bl_description -> bl_description: string "NO DESCRIPTION"
+#+ * Operator.bl_idname -> bl_idname: string "NO DESCRIPTION"
+#+ * Operator.bl_label -> bl_label: string "NO DESCRIPTION"
+#+ * Operator.bl_options -> bl_options: enum "Options for this operator type"
+#+ * Operator.has_reports -> has_reports: boolean, "(read-only) Operator has a set of reports (warnings and errors) from last execution"
+#+ * Operator.layout -> layout: pointer, "(read-only)"
+#+ * Operator.name -> name: string, "(read-only)"
+#+ * Operator.properties -> properties: pointer, "(read-only)"
+#+ * OperatorTypeMacro.properties -> properties: pointer, "(read-only)"
+#+ * PackedFile.size -> size: int, "(read-only) Size of packed file in bytes"
+#+ * Paint.brush -> brush: pointer "Active Brush"
+#+ * Paint.show_brush -> show_brush: boolean "NO DESCRIPTION"
+#+ * Paint.show_brush_on_surface -> show_brush_on_surface: boolean "NO DESCRIPTION"
+#Paint.show_low_resolution -> show_low_resolution: boolean "For multires, show low resolution while navigating the view"
+#+ * Paint|ImagePaint.invert_stencil -> invert_stencil: boolean "Invert the stencil layer"
+#+ * Paint|ImagePaint.normal_angle -> normal_angle: int "Paint most on faces pointing towards the view according to this angle"
+#+ * Paint|ImagePaint.screen_grab_size -> screen_grab_size: int[2] "Size to capture the image for re-projecting"
+#+ * Paint|ImagePaint.seam_bleed -> seam_bleed: int "Extend paint beyond the faces UVs to reduce seams (in pixels, slower)"
+#+ * Paint|ImagePaint.show_brush -> show_brush: boolean "Enables brush shape while not drawing"
+#+ * Paint|ImagePaint.show_brush_draw -> show_brush_draw: boolean "Enables brush shape while drawing"
+#Paint|ImagePaint.use_backface_culling -> use_backface_culling: boolean "Ignore faces pointing away from the view (faster)"
+#+ * Paint|ImagePaint.use_clone_layer -> use_clone_layer: boolean "Use another UV layer as clone source, otherwise use 3D the cursor as the source"
+#+ * Paint|ImagePaint.use_normal_falloff -> use_normal_falloff: boolean "Paint most on faces pointing towards the view"
+#+ * Paint|ImagePaint.use_occlude -> use_occlude: boolean "Only paint onto the faces directly under the brush (slower)"
+#+ * Paint|ImagePaint.use_projection -> use_projection: boolean "Use projection painting for improved consistency in the brush strokes"
+#+ * Paint|ImagePaint.use_stencil_layer -> use_stencil_layer: boolean "Set the mask layer from the UV layer buttons"
+#+ * Paint|Sculpt.lock_x -> lock_x: boolean "Disallow changes to the X axis of vertices"
+#+ * Paint|Sculpt.lock_y -> lock_y: boolean "Disallow changes to the Y axis of vertices"
+#+ * Paint|Sculpt.lock_z -> lock_z: boolean "Disallow changes to the Z axis of vertices"
+#Paint|Sculpt.radial_symmetry -> radial_symmetry: int[3] "Number of times to copy strokes across the surface"
+#+ * Paint|Sculpt.use_symmetry_feather -> use_symmetry_feather: boolean "Reduce the strength of the brush where it overlaps symmetrical daubs"
+#Paint|Sculpt.use_symmetry_x -> use_symmetry_x: boolean "Mirror brush across the X axis"
+#Paint|Sculpt.use_symmetry_y -> use_symmetry_y: boolean "Mirror brush across the Y axis"
+#Paint|Sculpt.use_symmetry_z -> use_symmetry_z: boolean "Mirror brush across the Z axis"
+#Paint|Sculpt.use_threaded -> use_threaded: boolean "Take advantage of multiple CPU cores to improve sculpting performance"
+#Paint|VertexPaint.use_all_faces -> use_all_faces: boolean "Paint on all faces inside brush"
+#Paint|VertexPaint.use_normal -> use_normal: boolean "Applies the vertex normal before painting"
+#Paint|VertexPaint.use_spray -> use_spray: boolean "Keep applying paint effect while holding mouse"
+#+ * Panel.bl_context -> bl_context: string "The context in which the panel belongs to. (TODO: explain the possible combinations bl_context/bl_region_type/bl_space_type)"
+#+ * Panel.bl_idname -> bl_idname: string "If this is set, the panel gets a custom ID, otherwise it takes the name of the class used to define the panel. For example, if the class name is OBJECT_PT_hello, and bl_idname is not set by the script, then bl_idname = OBJECT_PT_hello"
+#+ * Panel.bl_label -> bl_label: string "The panel label, shows up in the panel header at the right of the triangle used to collapse the panel."
+#+ * Panel.bl_region_type -> bl_region_type: enum "The region where the panel is going to be used in."
+#+ * Panel.bl_show_header -> bl_show_header: boolean "If set to True, the panel shows a header, which contains a clickable arrow to collapse the panel and the label (see bl_label)."
+#+ * Panel.bl_space_type -> bl_space_type: enum "The space where the panel is going to be used in."
+ + * Panel.bl_default_closed -> bl_use_closed: boolean "Defines if the panel has to be open or collapsed at the time of its creation. Note that once the panel has been created with bl_default_closed = True, at reload (F8) it stays open."
+#+ * Panel.layout -> layout: pointer, "(read-only) Defines the structure of the panel in the UI."
+#TODO SHOULD THIS BE HERE * Panel.text -> text: string "XXX todo"
+#+ * Particle.alive_state -> alive_state: enum "NO DESCRIPTION"
+#+ * Particle.angular_velocity -> angular_velocity: float[3] "NO DESCRIPTION"
+#Particle.birth_time -> birth_time: float "NO DESCRIPTION"
+#+ * Particle.die_time -> die_time: float "NO DESCRIPTION"
+#Particle.is_exist -> is_exist: boolean, "(read-only)"
+#Particle.is_hair -> is_hair: collection, "(read-only)"
+#+ * Particle.is_visible -> is_visible: boolean, "(read-only)"
+#+ * Particle.keys -> keys: collection, "(read-only)"
+#+ * Particle.lifetime -> lifetime: float "NO DESCRIPTION"
+#+ * Particle.location -> location: float[3] "NO DESCRIPTION"
+#+ * Particle.prev_angular_velocity -> prev_angular_velocity: float[3] "NO DESCRIPTION"
+#+ * Particle.prev_location -> prev_location: float[3] "NO DESCRIPTION"
+#+ * Particle.prev_rotation -> prev_rotation: float[4] "NO DESCRIPTION"
+#+ * Particle.prev_velocity -> prev_velocity: float[3] "NO DESCRIPTION"
+#+ * Particle.rotation -> rotation: float[4] "NO DESCRIPTION"
+#+ * Particle.size -> size: float "NO DESCRIPTION"
+#+ * Particle.velocity -> velocity: float[3] "NO DESCRIPTION"
+#+ * ParticleBrush.count -> count: int "Particle count"
+#+ * ParticleBrush.curve -> curve: pointer, "(read-only)"
+#+ * ParticleBrush.length_mode -> length_mode: enum "NO DESCRIPTION"
+#+ * ParticleBrush.puff_mode -> puff_mode: enum "NO DESCRIPTION"
+#+ * ParticleBrush.size -> size: int "Brush size"
+#+ * ParticleBrush.steps -> steps: int "Brush steps"
+#+ * ParticleBrush.strength -> strength: float "Brush strength"
+#+ * ParticleBrush.use_puff_volume -> use_puff_volume: boolean "Apply puff to unselected end-points, (helps maintain hair volume when puffing root)"
+#+ * 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.brush -> brush: pointer, "(read-only)"
+#ParticleEdit.default_key_count -> default_key_count: int "How many keys to make new particles with"
+#+ * 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.is_editable -> is_editable: boolean, "(read-only) A valid edit mode exists"
+#ParticleEdit.is_hair -> is_hair: boolean, "(read-only) Editing hair"
+#+ * ParticleEdit.object -> object: pointer, "(read-only) The edited object"
+#ParticleEdit.select_mode -> select_mode: enum "Particle select and display mode"
+#ParticleEdit.show_particles -> show_particles: boolean "Draw actual particles"
+#+ * ParticleEdit.tool -> tool: enum "NO DESCRIPTION"
+#+ * ParticleEdit.type -> type: enum "NO DESCRIPTION"
+#ParticleEdit.use_auto_velocity -> use_auto_velocity: boolean "Calculate point velocities automatically"
+#ParticleEdit.use_default_interpolate -> use_default_interpolate: boolean "Interpolate new particles from the existing ones"
+#ParticleEdit.use_emitter_deflect -> use_emitter_deflect: boolean "Keep paths from intersecting the emitter"
+#ParticleEdit.use_fade_time -> use_fade_time: boolean "Fade paths and keys further away from current frame"
+#ParticleEdit.use_preserve_length -> use_preserve_length: boolean "Keep path lengths constant"
+#ParticleEdit.use_preserve_root -> use_preserve_root: boolean "Keep root keys unmodified"
+#ParticleHairKey.co -> co: float[3] "Location of the hair key in object space"
+#ParticleHairKey.co_hair_space -> co_hair_space: float[3] "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"
+#+ * ParticleKey.angular_velocity -> angular_velocity: float[3] "Key angular velocity"
+#+ * ParticleKey.location -> location: float[3] "Key location"
+#+ * ParticleKey.rotation -> rotation: float[4] "Key rotation quaterion"
+#+ * ParticleKey.time -> time: float "Time of key over the simulation"
+#+ * ParticleKey.velocity -> velocity: float[3] "Key velocity"
+#+ * ParticleSystem.active_particle_target -> active_particle_target: pointer, "(read-only)"
+#+ * ParticleSystem.active_particle_target_index -> active_particle_target_index: int "NO DESCRIPTION"
+#+ * 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.has_multiple_caches -> has_multiple_caches: boolean, "(read-only) Particle system has multiple point caches"
+#ParticleSystem.invert_vertex_group_clump -> invert_vertex_group_clump: boolean "Negate the effect of the clump vertex group"
+#ParticleSystem.invert_vertex_group_density -> invert_vertex_group_density: boolean "Negate the effect of the density vertex group"
+#ParticleSystem.invert_vertex_group_field -> invert_vertex_group_field: boolean "Negate the effect of the field vertex group"
+#ParticleSystem.invert_vertex_group_kink -> invert_vertex_group_kink: boolean "Negate the effect of the kink vertex group"
+#ParticleSystem.invert_vertex_group_length -> invert_vertex_group_length: boolean "Negate the effect of the length vertex group"
+#ParticleSystem.invert_vertex_group_rotation -> invert_vertex_group_rotation: boolean "Negate the effect of the rotation vertex group"
+#ParticleSystem.invert_vertex_group_roughness_1 -> invert_vertex_group_roughness_1: boolean "Negate the effect of the roughness 1 vertex group"
+#ParticleSystem.invert_vertex_group_roughness_2 -> invert_vertex_group_roughness_2: boolean "Negate the effect of the roughness 2 vertex group"
+#ParticleSystem.invert_vertex_group_roughness_end -> invert_vertex_group_roughness_end: boolean "Negate the effect of the roughness end vertex group"
+#ParticleSystem.invert_vertex_group_size -> invert_vertex_group_size: boolean "Negate the effect of the size vertex group"
+#ParticleSystem.invert_vertex_group_tangent -> invert_vertex_group_tangent: boolean "Negate the effect of the tangent vertex group"
+#ParticleSystem.invert_vertex_group_velocity -> invert_vertex_group_velocity: boolean "Negate the effect of the velocity vertex group"
+#ParticleSystem.is_editable -> is_editable: boolean, "(read-only) Particle system can be edited in particle mode"
+#ParticleSystem.is_edited -> is_edited: boolean, "(read-only) Particle system has been edited in particle mode"
+#ParticleSystem.is_global_hair -> is_global_hair: boolean, "(read-only) Hair keys are in global coordinate space"
+#+ * ParticleSystem.name -> name: string "Particle system name"
+#+ * ParticleSystem.parent -> parent: pointer "Use this objects 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.use_hair_dynamics -> use_hair_dynamics: boolean "Enable hair dynamics using cloth simulation"
+#ParticleSystem.use_keyed_timing -> use_keyed_timing: boolean "Use key times"
+#+ * 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_roughness_1 -> vertex_group_roughness_1: string "Vertex group to control roughness 1"
+#ParticleSystem.vertex_group_roughness_2 -> vertex_group_roughness_2: string "Vertex group to control roughness 2"
+#+ * ParticleSystem.vertex_group_roughness_end -> vertex_group_roughness_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"
+#ParticleTarget.alliance -> alliance: enum "NO DESCRIPTION"
+#+ * ParticleTarget.duration -> duration: float "NO DESCRIPTION"
+#ParticleTarget.is_valid -> is_valid: boolean "Keyed particles target is valid"
+#+ * 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 "NO DESCRIPTION"
+#+ * PointCache.active_point_cache_index -> active_point_cache_index: int "NO DESCRIPTION"
+#+ * 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.frame_step -> frame_step: int "Number of frames between cached frames"
+#+ * PointCache.frames_skipped -> frames_skipped: boolean, "(read-only)"
+#+ * PointCache.index -> index: int "Index number of cache files"
+#+ * PointCache.info -> info: string, "(read-only) Info on current cache status"
+#PointCache.is_baked -> is_baked: boolean, "(read-only)"
+#PointCache.is_baking -> is_baking: boolean, "(read-only)"
+#PointCache.is_outdated -> is_outdated: boolean, "(read-only)"
+#+ * PointCache.name -> name: string "Cache name"
+#PointCache.point_caches -> point_caches: collection, "(read-only) Point cache list"
+#PointCache.use_disk_cache -> use_disk_cache: boolean "Save cache files to disk (.blend file must be saved first)"
+#PointCache.use_external -> use_external: boolean "Read cache from an external location"
+#+ * PointCache.use_library_path -> use_library_path: boolean "Use this files path when library linked into another file."
+#PointCache.use_quick_cache -> use_quick_cache: boolean "Update simulation with cache steps"
+#+ * 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_soft -> 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_space -> particle_cache_space: 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_scale -> turbulence_scale: float "Scale of the added turbulent noise"
+#+ * PointDensity.turbulence_strength -> turbulence_strength: float "NO DESCRIPTION"
+#PointDensity.use_turbulence -> use_turbulence: boolean "Add directed noise to the density at render-time"
+#PointDensity.vertex_cache_space -> vertex_cache_space: enum "Co-ordinate system to cache vertices in"
+#+ * 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[3], "(read-only) Location of head of the channels bone"
+#PoseBone.ik_linear_weight -> ik_linear_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_rotation_weight -> ik_rotation_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.is_in_ik_chain -> is_in_ik_chain: boolean, "(read-only) Is part of an IK chain"
+#+ * PoseBone.location -> location: float[3] "NO DESCRIPTION"
+#PoseBone.lock_ik_x -> lock_ik_x: boolean "Disallow movement around the X axis"
+#PoseBone.lock_ik_y -> lock_ik_y: boolean "Disallow movement around the Y axis"
+#PoseBone.lock_ik_z -> lock_ik_z: boolean "Disallow movement around the Z axis"
+#+ * PoseBone.lock_location -> lock_location: boolean[3] "Lock editing of location in the interface"
+#+ * PoseBone.lock_rotation -> lock_rotation: boolean[3] "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[3] "Lock editing of scale in the interface"
+#+ * PoseBone.matrix -> matrix: float[16], "(read-only) Final 4x4 matrix for this channel"
+#+ * PoseBone.matrix_channel -> matrix_channel: float[16], "(read-only) 4x4 matrix, before constraints"
+#+ * PoseBone.matrix_local -> matrix_local: float[16] "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 "NO DESCRIPTION"
+#+ * PoseBone.parent -> parent: pointer, "(read-only) Parent of this pose bone"
+#+ * PoseBone.rotation_axis_angle -> rotation_axis_angle: float[4] "Angle of Rotation for Axis-Angle rotation representation"
+#+ * PoseBone.rotation_euler -> rotation_euler: float[3] "Rotation in Eulers"
+#+ * PoseBone.rotation_mode -> rotation_mode: enum "NO DESCRIPTION"
+#+ * PoseBone.rotation_quaternion -> rotation_quaternion: float[4] "Rotation in Quaternions"
+#+ * PoseBone.scale -> scale: float[3] "NO DESCRIPTION"
+#+ * PoseBone.select -> select: boolean "NO DESCRIPTION"
+#+ * PoseBone.tail -> tail: float[3], "(read-only) Location of tail of the channels bone"
+#PoseBone.use_ik_limit_x -> use_ik_limit_x: boolean "Limit movement around the X axis"
+#PoseBone.use_ik_limit_y -> use_ik_limit_y: boolean "Limit movement around the Y axis"
+#PoseBone.use_ik_limit_z -> use_ik_limit_z: boolean "Limit movement around the Z axis"
+#PoseBone.use_ik_linear_control -> use_ik_linear_control: boolean "Apply channel size as IK constraint if stretching is enabled"
+#PoseBone.use_ik_rotation_control -> use_ik_rotation_control: boolean "Apply channel rotation as IK constraint"
+#+ * PoseBoneConstraints.active -> active: pointer "Active PoseChannel constraint"
+#+ * 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.is_never_none -> is_never_none: boolean, "(read-only) True when this value cant be set to None"
+#Property.is_output -> is_output: boolean, "(read-only) True when this property is an output value from an RNA function"
+#+ * Property.is_readonly -> is_readonly: boolean, "(read-only) Property is editable through RNA"
+#Property.is_registered -> is_registered: boolean, "(read-only) Property is registered as part of type registration"
+#Property.is_registered_optional -> is_registered_optional: boolean, "(read-only) Property is optionally registered as part of type registration"
+#+ * Property.is_required -> is_required: boolean, "(read-only) False when this property is an optional argument in an RNA function"
+#+ * 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"
+#+ * Property|BooleanProperty.array_length -> array_length: int, "(read-only) Maximum length of the array, 0 means unlimited"
+#+ * Property|BooleanProperty.default -> default: boolean, "(read-only) Default value for this number"
+#+ * Property|BooleanProperty.default_array -> default_array: boolean[3], "(read-only) Default value for this array"
+#+ * Property|CollectionProperty.fixed_type -> fixed_type: pointer, "(read-only) Fixed pointer type, empty if variable type"
+#+ * Property|EnumProperty.default -> default: enum, "(read-only) Default value for this enum"
+#+ * Property|EnumProperty.items -> items: collection, "(read-only) Possible values for the property"
+#+ * Property|FloatProperty.array_length -> array_length: int, "(read-only) Maximum length of the array, 0 means unlimited"
+#+ * Property|FloatProperty.default -> default: float, "(read-only) Default value for this number"
+#+ * Property|FloatProperty.default_array -> default_array: float[3], "(read-only) Default value for this array"
+#+ * Property|FloatProperty.hard_max -> hard_max: float, "(read-only) Maximum value used by buttons"
+#+ * Property|FloatProperty.hard_min -> hard_min: float, "(read-only) Minimum value used by buttons"
+#+ * Property|FloatProperty.precision -> precision: int, "(read-only) Number of digits after the dot used by buttons"
+#+ * Property|FloatProperty.soft_max -> soft_max: float, "(read-only) Maximum value used by buttons"
+#+ * Property|FloatProperty.soft_min -> soft_min: float, "(read-only) Minimum value used by buttons"
+#+ * Property|FloatProperty.step -> step: float, "(read-only) Step size used by number buttons, for floats 1/100th of the step size"
+#+ * Property|IntProperty.array_length -> array_length: int, "(read-only) Maximum length of the array, 0 means unlimited"
+#+ * Property|IntProperty.default -> default: int, "(read-only) Default value for this number"
+#+ * Property|IntProperty.default_array -> default_array: int[3], "(read-only) Default value for this array"
+#+ * Property|IntProperty.hard_max -> hard_max: int, "(read-only) Maximum value used by buttons"
+#+ * Property|IntProperty.hard_min -> hard_min: int, "(read-only) Minimum value used by buttons"
+#+ * Property|IntProperty.soft_max -> soft_max: int, "(read-only) Maximum value used by buttons"
+#+ * Property|IntProperty.soft_min -> soft_min: int, "(read-only) Minimum value used by buttons"
+#+ * Property|IntProperty.step -> step: int, "(read-only) Step size used by number buttons, for floats 1/100th of the step size"
+#+ * Property|PointerProperty.fixed_type -> fixed_type: pointer, "(read-only) Fixed pointer type, empty if variable type"
+#+ * Property|StringProperty.default -> default: string, "(read-only) string default value"
+#Property|StringProperty.length_max -> length_max: int, "(read-only) Maximum length of the string, 0 means unlimited"
+#+ * RGBANodeSocket.default_value -> default_value: float[4] "Default value of the socket when no link is attached"
+#+ * RGBANodeSocket.name -> name: string, "(read-only) Socket name"
+#+ * 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.lock_rotation -> lock_rotation: boolean "Lock view rotation in side views"
+#+ * RegionView3D.perspective_matrix -> perspective_matrix: float[16], "(read-only) Current perspective matrix of the 3D region"
+#RegionView3D.show_sync_view -> show_sync_view: boolean "Sync view position between side views"
+#RegionView3D.use_box_clip -> use_box_clip: boolean "Clip objects based on whats visible in other side views"
+#+ * RegionView3D.view_distance -> view_distance: float "Distance to the view location"
+#+ * RegionView3D.view_location -> view_location: float[3] "View pivot location"
+#+ * RegionView3D.view_matrix -> view_matrix: float[16], "(read-only) Current view matrix of the 3D region"
+#+ * RegionView3D.view_perspective -> view_perspective: enum "View Perspective"
+#RegionView3D.view_rotate_method -> view_rotate_method: float[4] "Rotation in quaternions (keep normalized)"
+#+ * RenderEngine.bl_idname -> bl_idname: string "NO DESCRIPTION"
+#+ * RenderEngine.bl_label -> bl_label: string "NO DESCRIPTION"
+#RenderEngine.bl_use_postprocess -> bl_use_postprocess: boolean "NO DESCRIPTION"
+#RenderEngine.bl_use_preview -> bl_use_preview: boolean "NO DESCRIPTION"
+#RenderLayer.exclude_ambient_occlusion -> exclude_ambient_occlusion: boolean, "(read-only) Exclude AO pass from combined"
+#RenderLayer.exclude_emit -> exclude_emit: boolean, "(read-only) Exclude emission pass from combined"
+#RenderLayer.exclude_environment -> exclude_environment: boolean, "(read-only) Exclude environment pass from combined"
+#RenderLayer.exclude_indirect -> exclude_indirect: boolean, "(read-only) Exclude indirect pass from combined"
+#RenderLayer.exclude_reflection -> exclude_reflection: boolean, "(read-only) Exclude raytraced reflection pass from combined"
+#RenderLayer.exclude_refraction -> exclude_refraction: boolean, "(read-only) Exclude raytraced refraction pass from combined"
+#RenderLayer.exclude_shadow -> exclude_shadow: boolean, "(read-only) Exclude shadow pass from combined"
+#RenderLayer.exclude_specular -> exclude_specular: boolean, "(read-only) Exclude specular pass from combined"
+#RenderLayer.invert_zmask -> invert_zmask: boolean, "(read-only) For Zmask, only render what is behind solid z values instead of in front"
+#RenderLayer.layers -> layers: boolean[20], "(read-only) Scene layers included in this render layer"
+#RenderLayer.layers_zmask -> layers_zmask: boolean[20], "(read-only) Zmask scene layers"
+#+ * 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 "NO DESCRIPTION"
+#+ * RenderLayer.use -> use: boolean, "(read-only) Disable or enable the render layer"
+#RenderLayer.use_all_z -> use_all_z: boolean, "(read-only) Fill in Z values for solid faces in invisible layers, for masking"
+#RenderLayer.use_edge_enhance -> use_edge_enhance: boolean, "(read-only) Render Edge-enhance in this Layer (only works for Solid faces)"
+#RenderLayer.use_halo -> use_halo: boolean, "(read-only) Render Halos in this Layer (on top of Solid)"
+#RenderLayer.use_pass_ambient_occlusion -> use_pass_ambient_occlusion: boolean, "(read-only) Deliver AO pass"
+#RenderLayer.use_pass_color -> use_pass_color: boolean, "(read-only) Deliver shade-less color pass"
+#RenderLayer.use_pass_combined -> use_pass_combined: boolean, "(read-only) Deliver full combined RGBA buffer"
+#RenderLayer.use_pass_diffuse -> use_pass_diffuse: boolean, "(read-only) Deliver diffuse pass"
+#RenderLayer.use_pass_emit -> use_pass_emit: boolean, "(read-only) Deliver emission pass"
+#RenderLayer.use_pass_environment -> use_pass_environment: boolean, "(read-only) Deliver environment lighting pass"
+#RenderLayer.use_pass_indirect -> use_pass_indirect: boolean, "(read-only) Deliver indirect lighting pass"
+#RenderLayer.use_pass_mist -> use_pass_mist: boolean, "(read-only) Deliver mist factor pass (0.0-1.0)"
+#RenderLayer.use_pass_normal -> use_pass_normal: boolean, "(read-only) Deliver normal pass"
+#RenderLayer.use_pass_object_index -> use_pass_object_index: boolean, "(read-only) Deliver object index pass"
+#RenderLayer.use_pass_reflection -> use_pass_reflection: boolean, "(read-only) Deliver raytraced reflection pass"
+#RenderLayer.use_pass_refraction -> use_pass_refraction: boolean, "(read-only) Deliver raytraced refraction pass"
+#RenderLayer.use_pass_shadow -> use_pass_shadow: boolean, "(read-only) Deliver shadow pass"
+#RenderLayer.use_pass_specular -> use_pass_specular: boolean, "(read-only) Deliver specular pass"
+#RenderLayer.use_pass_uv -> use_pass_uv: boolean, "(read-only) Deliver texture UV pass"
+#RenderLayer.use_pass_vector -> use_pass_vector: boolean, "(read-only) Deliver speed vector pass"
+#RenderLayer.use_pass_z -> use_pass_z: boolean, "(read-only) Deliver Z values pass"
+#RenderLayer.use_sky -> use_sky: boolean, "(read-only) Render Sky in this Layer"
+#RenderLayer.use_solid -> use_solid: boolean, "(read-only) Render Solid faces in this Layer"
+#RenderLayer.use_strand -> use_strand: boolean, "(read-only) Render Strands in this Layer"
+#RenderLayer.use_zmask -> use_zmask: boolean, "(read-only) Only render whats in front of the solid z values"
+#RenderLayer.use_ztransp -> use_ztransp: boolean, "(read-only) Render Z-Transparent faces in this Layer (On top of Solid and Halos)"
+#+ * RenderPass.channel_id -> channel_id: string, "(read-only)"
+#+ * RenderPass.channels -> channels: int, "(read-only)"
+#+ * RenderPass.name -> name: string, "(read-only)"
+#+ * RenderPass.rect -> rect: float "NO DESCRIPTION"
+#+ * 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 "NO DESCRIPTION"
+#+ * 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[3] "NO DESCRIPTION"
+#+ * 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, Compression for PNGs"
+#RenderSettings.filepath -> filepath: string "Directory/name to save animations, # characters defines the position and length of frame numbers"
+#+ * 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.has_multiple_engines -> has_multiple_engines: boolean, "(read-only) More than one rendering engine is available"
+#+ * RenderSettings.is_movie_format -> is_movie_format: boolean, "(read-only) When true the format is a movie"
+#+ * 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.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_type -> pixel_filter_type: enum "Reconstruction filter used for combining anti-aliasing samples"
+#RenderSettings.raytrace_method -> raytrace_method: 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[4] "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[4] "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"
+#RenderSettings.use_antialiasing -> use_antialiasing: boolean "Render and combine multiple samples per pixel to prevent jagged edges"
+#RenderSettings.use_backbuf -> use_backbuf: boolean "Render backbuffer image"
+#RenderSettings.use_bake_antialiasing -> use_bake_antialiasing: boolean "Enables Anti-aliasing"
+#RenderSettings.use_bake_clear -> use_bake_clear: boolean "Clear Images before baking"
+#RenderSettings.use_bake_normalize -> use_bake_normalize: boolean "With displacement normalize to the distance, with ambient occlusion normalize without using material settings"
+#RenderSettings.use_bake_selected_to_active -> use_bake_selected_to_active: boolean "Bake shading on the surface of selected objects to the active object"
+#+ * 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_cineon_log -> use_cineon_log: boolean "Convert to logarithmic color space"
+#RenderSettings.use_color_management -> use_color_management: boolean "Use linear workflow - gamma corrected imaging pipeline"
+#+ * RenderSettings.use_compositing -> use_compositing: boolean "Process the render result through the compositing pipeline, if compositing nodes are enabled"
+#RenderSettings.use_crop_to_border -> use_crop_to_border: boolean "Crop the rendered frame to the defined border size"
+#RenderSettings.use_edge_enhance -> use_edge_enhance: boolean "Create a toon outline around the edges of geometry"
+#+ * RenderSettings.use_envmaps -> use_envmaps: boolean "Calculate environment maps while rendering"
+#RenderSettings.use_fields -> use_fields: boolean "Render image to two fields per frame, for interlaced TV output"
+#RenderSettings.use_fields_still -> use_fields_still: boolean "Disable the time difference between fields"
+#+ * RenderSettings.use_file_extension -> use_file_extension: boolean "Add the file format extensions to the rendered file name (eg: filename + .jpg)"
+#RenderSettings.use_free_image_textures -> use_free_image_textures: boolean "Free all image texture from memory after render, to save memory before compositing"
+#RenderSettings.use_free_unused_nodes -> use_free_unused_nodes: boolean "Free Nodes that are not used while compositing, to save memory"
+#RenderSettings.use_full_sample -> use_full_sample: boolean "Save for every anti-aliasing sample the entire RenderLayer results. This solves anti-aliasing issues with compositing"
+#+ * 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_motion_blur -> use_motion_blur: boolean "Use multi-sampled 3D scene motion blur"
+#+ * 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_raytrace -> use_raytrace: boolean "Pre-calculate the raytrace accelerator and render raytracing effects"
+#RenderSettings.use_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.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 "NO DESCRIPTION"
+#+ * RenderSettings.use_sequencer_gl_render -> use_sequencer_gl_render: boolean "NO DESCRIPTION"
+#+ * 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_simplify_triangulate -> use_simplify_triangulate: boolean "Disables non-planer quads being triangulated"
+#RenderSettings.use_single_layer -> use_single_layer: boolean "Only render the active layer"
+#+ * RenderSettings.use_sss -> use_sss: boolean "Calculate sub-surface scattering in materials rendering"
+#RenderSettings.use_stamp -> use_stamp: boolean "Render the stamp info text in the rendered image"
+#RenderSettings.use_stamp_camera -> use_stamp_camera: boolean "Include the name of the active camera in image metadata"
+#RenderSettings.use_stamp_date -> use_stamp_date: boolean "Include the current date in image metadata"
+#RenderSettings.use_stamp_filename -> use_stamp_filename: boolean "Include the filename of the .blend file in image metadata"
+#RenderSettings.use_stamp_frame -> use_stamp_frame: boolean "Include the frame number in image metadata"
+#RenderSettings.use_stamp_marker -> use_stamp_marker: boolean "Include the name of the last marker in image metadata"
+#RenderSettings.use_stamp_note -> use_stamp_note: boolean "Include a custom note in image metadata"
+#RenderSettings.use_stamp_render_time -> use_stamp_render_time: boolean "Include the render time in the stamp image"
+#RenderSettings.use_stamp_scene -> use_stamp_scene: boolean "Include the name of the active scene in image metadata"
+#RenderSettings.use_stamp_sequencer_strip -> use_stamp_sequencer_strip: boolean "Include the name of the foreground sequence strip in image metadata"
+#RenderSettings.use_stamp_time -> use_stamp_time: boolean "Include the render frame as HH:MM:SS.FF in image metadata"
+#+ * RenderSettings.use_textures -> use_textures: boolean "Use textures to affect material properties"
+#RenderSettings.use_tiff_16bit -> use_tiff_16bit: boolean "Save TIFF with 16 bits per channel"
+#+ * SPHFluidSettings.buoyancy -> buoyancy: float "NO DESCRIPTION"
+#+ * 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_force -> spring_force: float "Spring force constant"
+#SPHFluidSettings.stiffness -> stiffness: float "Constant K - Stiffness"
+#SPHFluidSettings.stiffness_near -> stiffness_near: float "Repulsion factor: stiffness_knear"
+#+ * SPHFluidSettings.viscosity_beta -> viscosity_beta: float "Square viscosity factor"
+#+ * SPHFluidSettings.viscosity_omega -> viscosity_omega: float "Linear viscosity"
+#+ * 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.fps -> fps: int "The nominal number of game frames per second. Physics fixed timestep = 1/fps, independently of actual frame rate"
+#SceneGameData.frame_color -> frame_color: float[3] "Set colour of the bars"
+#SceneGameData.frame_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.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_fullscreen -> show_fullscreen: boolean "Starts player in a new fullscreen display"
+#+ * SceneGameData.show_physics_visualization -> show_physics_visualization: boolean "Show a visualization of physics bounds and interactions"
+#+ * SceneGameData.stereo -> stereo: enum "NO DESCRIPTION"
+#SceneGameData.stereo_eye_separation -> stereo_eye_separation: float "Set the distance between the eyes - the camera focal length/30 should be fine"
+#+ * SceneGameData.stereo_mode -> stereo_mode: enum "Stereographic techniques"
+#SceneGameData.use_activity_culling -> use_activity_culling: boolean "Activity culling is enabled"
+#+ * SceneGameData.use_animation_record -> use_animation_record: boolean "Record animation to fcurves"
+#SceneGameData.use_auto_start -> use_auto_start: boolean "Automatically start game at load time"
+#+ * 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_glsl_extra_textures -> use_glsl_extra_textures: boolean "Use extra textures like normal or specular maps for GLSL rendering"
+#SceneGameData.use_glsl_lights -> use_glsl_lights: boolean "Use lights for GLSL rendering"
+#SceneGameData.use_glsl_nodes -> use_glsl_nodes: boolean "Use nodes for GLSL rendering"
+#SceneGameData.use_glsl_ramps -> use_glsl_ramps: boolean "Use ramps for GLSL rendering"
+#SceneGameData.use_glsl_shaders -> use_glsl_shaders: boolean "Use shaders for GLSL rendering"
+#SceneGameData.use_glsl_shadows -> use_glsl_shadows: boolean "Use shadows for GLSL rendering"
+#+ * SceneGameData.use_occlusion_culling -> use_occlusion_culling: boolean "Use optimized Bullet DBVT tree for view frustum and occlusion culling"
+#+ * SceneObjects.active -> active: pointer "Active object for this scene"
+#SceneRenderLayer.exclude_ambient_occlusion -> exclude_ambient_occlusion: boolean "Exclude AO pass from combined"
+#SceneRenderLayer.exclude_emit -> exclude_emit: boolean "Exclude emission pass from combined"
+#SceneRenderLayer.exclude_environment -> exclude_environment: boolean "Exclude environment pass from combined"
+#SceneRenderLayer.exclude_indirect -> exclude_indirect: boolean "Exclude indirect pass from combined"
+#SceneRenderLayer.exclude_reflection -> exclude_reflection: boolean "Exclude raytraced reflection pass from combined"
+#SceneRenderLayer.exclude_refraction -> exclude_refraction: boolean "Exclude raytraced refraction pass from combined"
+#SceneRenderLayer.exclude_shadow -> exclude_shadow: boolean "Exclude shadow pass from combined"
+#SceneRenderLayer.exclude_specular -> exclude_specular: boolean "Exclude specular pass from combined"
+#SceneRenderLayer.invert_zmask -> invert_zmask: boolean "For Zmask, only render what is behind solid z values instead of in front"
+#SceneRenderLayer.layers -> layers: boolean[20] "Scene layers included in this render layer"
+#SceneRenderLayer.layers_zmask -> layers_zmask: boolean[20] "Zmask scene layers"
+#+ * 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"
+#+ * SceneRenderLayer.use -> use: boolean "Disable or enable the render layer"
+#SceneRenderLayer.use_all_z -> use_all_z: boolean "Fill in Z values for solid faces in invisible layers, for masking"
+#SceneRenderLayer.use_edge_enhance -> use_edge_enhance: boolean "Render Edge-enhance in this Layer (only works for Solid faces)"
+#SceneRenderLayer.use_halo -> use_halo: boolean "Render Halos in this Layer (on top of Solid)"
+#SceneRenderLayer.use_pass_ambient_occlusion -> use_pass_ambient_occlusion: boolean "Deliver AO pass"
+#SceneRenderLayer.use_pass_color -> use_pass_color: boolean "Deliver shade-less color pass"
+#SceneRenderLayer.use_pass_combined -> use_pass_combined: boolean "Deliver full combined RGBA buffer"
+#SceneRenderLayer.use_pass_diffuse -> use_pass_diffuse: boolean "Deliver diffuse pass"
+#SceneRenderLayer.use_pass_emit -> use_pass_emit: boolean "Deliver emission pass"
+#SceneRenderLayer.use_pass_environment -> use_pass_environment: boolean "Deliver environment lighting pass"
+#SceneRenderLayer.use_pass_indirect -> use_pass_indirect: boolean "Deliver indirect lighting pass"
+#SceneRenderLayer.use_pass_mist -> use_pass_mist: boolean "Deliver mist factor pass (0.0-1.0)"
+#SceneRenderLayer.use_pass_normal -> use_pass_normal: boolean "Deliver normal pass"
+#SceneRenderLayer.use_pass_object_index -> use_pass_object_index: boolean "Deliver object index pass"
+#SceneRenderLayer.use_pass_reflection -> use_pass_reflection: boolean "Deliver raytraced reflection pass"
+#SceneRenderLayer.use_pass_refraction -> use_pass_refraction: boolean "Deliver raytraced refraction pass"
+#SceneRenderLayer.use_pass_shadow -> use_pass_shadow: boolean "Deliver shadow pass"
+#SceneRenderLayer.use_pass_specular -> use_pass_specular: boolean "Deliver specular pass"
+#SceneRenderLayer.use_pass_uv -> use_pass_uv: boolean "Deliver texture UV pass"
+#SceneRenderLayer.use_pass_vector -> use_pass_vector: boolean "Deliver speed vector pass"
+#SceneRenderLayer.use_pass_z -> use_pass_z: boolean "Deliver Z values pass"
+#SceneRenderLayer.use_sky -> use_sky: boolean "Render Sky in this Layer"
+#SceneRenderLayer.use_solid -> use_solid: boolean "Render Solid faces in this Layer"
+#SceneRenderLayer.use_strand -> use_strand: boolean "Render Strands in this Layer"
+#SceneRenderLayer.use_zmask -> use_zmask: boolean "Only render whats in front of the solid z values"
+#SceneRenderLayer.use_ztransp -> use_ztransp: boolean "Render Z-Transparent faces in this Layer (On top of Solid and Halos)"
+#+ * 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.use_full_resolution -> use_full_resolution: boolean "Sample every pixel of the image"
+#+ * 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 "NO DESCRIPTION"
+#+ * Sensor.frequency -> frequency: int "Delay between repeated pulses(in logic tics, 0=no delay)"
+#+ * Sensor.invert -> invert: boolean "Invert the level(output) of this sensor"
+#+ * Sensor.name -> name: string "Sensor name"
+#Sensor.pin -> pin: boolean "Display when not linked to a visible states controller"
+#Sensor.show_expanded -> show_expanded: boolean "Set sensor expanded in the user interface"
+#+ * Sensor.type -> type: enum "NO DESCRIPTION"
+#Sensor.use_level -> use_level: boolean "Level detector, trigger controllers of new states(only applicable upon logic state transition)"
+#Sensor.use_pulse_false_level -> use_pulse_false_level: boolean "Activate FALSE level triggering (pulse mode)"
+#Sensor.use_pulse_true_level -> use_pulse_true_level: boolean "Activate TRUE level triggering (pulse mode)"
+#Sensor.use_tap -> use_tap: boolean "Trigger controllers only for an instant, even while the sensor remains true"
+#+ * Sensor|ActuatorSensor.actuator -> actuator: string "Actuator name, actuator active state modifications will be detected"
+#+ * Sensor|ArmatureSensor.bone -> bone: string "Identify the bone to check value from"
+#+ * Sensor|ArmatureSensor.constraint -> constraint: string "Identify the bone constraint to check value from"
+#+ * Sensor|ArmatureSensor.test_type -> test_type: enum "Type of value and test"
+#+ * Sensor|ArmatureSensor.value -> value: float "Specify value to be used in comparison"
+#+ * Sensor|CollisionSensor.material -> material: string "Only look for Objects with this material"
+#+ * Sensor|CollisionSensor.property -> property: string "Only look for Objects with this property"
+#Sensor|CollisionSensor.use_material -> use_material: boolean "Toggle collision on material or property"
+#Sensor|CollisionSensor.use_pulse -> use_pulse: boolean "Changes to the set of colliding objects generates pulse"
+#+ * Sensor|DelaySensor.delay -> delay: int "Delay in number of logic tics before the positive trigger (default 60 per second)"
+#+ * Sensor|DelaySensor.duration -> duration: int "If >0, delay in number of logic tics before the negative trigger following the positive trigger"
+#Sensor|DelaySensor.use_repeat -> use_repeat: boolean "Toggle repeat option. If selected, the sensor restarts after Delay+Dur logic tics"
+#+ * Sensor|JoystickSensor.axis_direction -> axis_direction: enum "The direction of the axis"
+#+ * Sensor|JoystickSensor.axis_number -> axis_number: int "Specify which axis pair to use, 1 is usually the main direction input"
+#+ * Sensor|JoystickSensor.axis_threshold -> axis_threshold: int "Specify the precision of the axis"
+#+ * Sensor|JoystickSensor.button_number -> button_number: int "Specify which button to use"
+#+ * Sensor|JoystickSensor.event_type -> event_type: enum "The type of event this joystick sensor is triggered on"
+#+ * Sensor|JoystickSensor.hat_direction -> hat_direction: enum "Specify hat direction"
+#+ * Sensor|JoystickSensor.hat_number -> hat_number: int "Specify which hat to use"
+#+ * Sensor|JoystickSensor.joystick_index -> joystick_index: int "Specify which joystick to use"
+#+ * Sensor|JoystickSensor.single_axis_number -> single_axis_number: int "Specify a single axis (verticle/horizontal/other) to detect"
+#Sensor|JoystickSensor.use_all_events -> use_all_events: boolean "Triggered by all events on this joysticks current type (axis/button/hat)"
+#+ * Sensor|KeyboardSensor.key -> key: enum "NO DESCRIPTION"
+#+ * Sensor|KeyboardSensor.log -> log: string "Property that receive the keystrokes in case a string is logged"
+#Sensor|KeyboardSensor.modifier_key_1 -> modifier_key_1: enum "Modifier key code"
+#Sensor|KeyboardSensor.modifier_key_2 -> modifier_key_2: enum "Modifier key code"
+#+ * Sensor|KeyboardSensor.target -> target: string "Property that indicates whether to log keystrokes as a string"
+#Sensor|KeyboardSensor.use_all_keys -> use_all_keys: boolean "Trigger this sensor on any keystroke"
+#+ * Sensor|MessageSensor.subject -> subject: string "Optional subject filter: only accept messages with this subject, or empty for all"
+#+ * Sensor|MouseSensor.mouse_event -> mouse_event: enum "Specify the type of event this mouse sensor should trigger on"
+#+ * Sensor|NearSensor.distance -> distance: float "Trigger distance"
+#+ * Sensor|NearSensor.property -> property: string "Only look for objects with this property"
+#+ * Sensor|NearSensor.reset_distance -> reset_distance: float "NO DESCRIPTION"
+#+ * Sensor|PropertySensor.evaluation_type -> evaluation_type: enum "Type of property evaluation"
+#+ * Sensor|PropertySensor.property -> property: string "NO DESCRIPTION"
+#+ * Sensor|PropertySensor.value -> value: string "Check for this value in types in Equal or Not Equal types"
+#Sensor|PropertySensor.value_max -> value_max: string "Specify maximum value in Interval type"
+#Sensor|PropertySensor.value_min -> value_min: string "Specify minimum value in Interval type"
+#+ * Sensor|RadarSensor.angle -> angle: float "Opening angle of the radar cone"
+#+ * Sensor|RadarSensor.axis -> axis: enum "Specify along which axis the radar cone is cast"
+#+ * Sensor|RadarSensor.distance -> distance: float "Depth of the radar cone"
+#+ * Sensor|RadarSensor.property -> property: string "Only look for Objects with this property"
+#+ * Sensor|RandomSensor.seed -> seed: int "Initial seed of the generator. (Choose 0 for not random)"
+#+ * Sensor|RaySensor.axis -> axis: enum "Specify along which axis the ray is cast"
+#+ * Sensor|RaySensor.material -> material: string "Only look for Objects with this material"
+#+ * Sensor|RaySensor.property -> property: string "Only look for Objects with this property"
+#+ * Sensor|RaySensor.range -> range: float "Sense objects no farther than this distance"
+#+ * Sensor|RaySensor.ray_type -> ray_type: enum "Toggle collision on material or property"
+#Sensor|RaySensor.use_x_ray -> use_x_ray: boolean "Toggle X-Ray option (see through objects that dont have the property)"
+#+ * Sensor|TouchSensor.material -> material: pointer "Only look for objects with this material"
+#Sequence.blend_alpha -> blend_alpha: float "NO DESCRIPTION"
+#Sequence.blend_type -> blend_type: enum "NO DESCRIPTION"
+#+ * Sequence.channel -> channel: int "Y position of the sequence strip"
+#+ * Sequence.effect_fader -> effect_fader: float "NO DESCRIPTION"
+#Sequence.frame_duration -> frame_duration: int, "(read-only) The length of the contents of this strip before the handles are applied"
+#Sequence.frame_final_duration -> frame_final_duration: int "The length of the contents of this strip before the handles are applied"
+#+ * Sequence.frame_final_end -> frame_final_end: int "End frame displayed in the sequence editor after offsets 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_offset_end -> frame_offset_end: int, "(read-only)"
+#+ * Sequence.frame_offset_start -> frame_offset_start: int, "(read-only)"
+#+ * Sequence.frame_start -> frame_start: int "NO DESCRIPTION"
+#+ * Sequence.frame_still_end -> frame_still_end: int, "(read-only)"
+#+ * Sequence.frame_still_start -> frame_still_start: int, "(read-only)"
+#+ * Sequence.lock -> lock: boolean "Lock strip so that it cant be transformed"
+#+ * Sequence.mute -> mute: boolean "NO DESCRIPTION"
+#+ * Sequence.name -> name: string "NO DESCRIPTION"
+#+ * Sequence.select -> select: boolean "NO DESCRIPTION"
+#+ * Sequence.select_left_handle -> select_left_handle: boolean "NO DESCRIPTION"
+#+ * Sequence.select_right_handle -> select_right_handle: boolean "NO DESCRIPTION"
+#+ * Sequence.speed_fader -> speed_fader: float "NO DESCRIPTION"
+#+ * Sequence.type -> type: enum, "(read-only)"
+#Sequence.use_default_fade -> use_default_fade: boolean "Fade effect using the built-in default (usually make transition as long as effect strip)"
+#+ * SequenceColorBalance.gain -> gain: float[3] "Color balance gain (highlights)"
+#+ * SequenceColorBalance.gamma -> gamma: float[3] "Color balance gamma (midtones)"
+#SequenceColorBalance.invert_gain -> invert_gain: boolean "NO DESCRIPTION"
+#SequenceColorBalance.invert_gamma -> invert_gamma: boolean "NO DESCRIPTION"
+#SequenceColorBalance.invert_lift -> invert_lift: boolean "NO DESCRIPTION"
+#+ * SequenceColorBalance.lift -> lift: float[3] "Color balance lift (shadows)"
+#SequenceCrop.max_x -> max_x: int "NO DESCRIPTION"
+#SequenceCrop.max_y -> max_y: int "NO DESCRIPTION"
+#SequenceCrop.min_x -> min_x: int "NO DESCRIPTION"
+#SequenceCrop.min_y -> min_y: int "NO DESCRIPTION"
+#+ * SequenceEditor.active_strip -> active_strip: pointer "NO DESCRIPTION"
+#+ * 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.overlay_lock -> overlay_lock: boolean "NO DESCRIPTION"
+#+ * SequenceEditor.sequences -> sequences: collection, "(read-only)"
+#+ * SequenceEditor.sequences_all -> sequences_all: collection, "(read-only)"
+#+ * SequenceEditor.show_overlay -> show_overlay: boolean "Partial overlay ontop of the sequencer"
+#+ * SequenceElement.filename -> filename: string "NO DESCRIPTION"
+#+ * 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 "NO DESCRIPTION"
+#+ * SequenceTransform.offset_y -> offset_y: int "NO DESCRIPTION"
+#+ * Sequence|EffectSequence.color_balance -> color_balance: pointer, "(read-only)"
+#Sequence|EffectSequence.color_multiply -> color_multiply: float "NO DESCRIPTION"
+#+ * Sequence|EffectSequence.color_saturation -> color_saturation: float "NO DESCRIPTION"
+#+ * Sequence|EffectSequence.crop -> crop: pointer, "(read-only)"
+#+ * Sequence|EffectSequence.proxy -> proxy: pointer, "(read-only)"
+#+ * Sequence|EffectSequence.strobe -> strobe: float "Only display every nth frame"
+#+ * Sequence|EffectSequence.transform -> transform: pointer, "(read-only)"
+#+ * Sequence|EffectSequence.use_color_balance -> use_color_balance: boolean "(3-Way color correction) on input"
+#+ * Sequence|EffectSequence.use_crop -> use_crop: boolean "Crop image before processing"
+#Sequence|EffectSequence.use_deinterlace -> use_deinterlace: boolean "For video movies to remove fields"
+#Sequence|EffectSequence.use_flip_x -> use_flip_x: boolean "Flip on the X axis"
+#Sequence|EffectSequence.use_flip_y -> use_flip_y: boolean "Flip on the Y axis"
+#Sequence|EffectSequence.use_float -> use_float: boolean "Convert input to float data"
+#Sequence|EffectSequence.use_premultiply -> use_premultiply: boolean "Convert RGB from key alpha to premultiplied alpha"
+#+ * Sequence|EffectSequence.use_proxy -> use_proxy: boolean "Use a preview proxy for this strip"
+#Sequence|EffectSequence.use_proxy_custom_directory -> use_proxy_custom_directory: boolean "Use a custom directory to store data"
+#Sequence|EffectSequence.use_proxy_custom_file -> use_proxy_custom_file: boolean "Use a custom file to read proxy data from"
+#Sequence|EffectSequence.use_reverse_frames -> use_reverse_frames: boolean "Reverse frame order"
+#+ * Sequence|EffectSequence.use_translation -> use_translation: boolean "Translate image before processing"
+#+ * Sequence|EffectSequence|ColorSequence.color -> color: float[3] "NO DESCRIPTION"
+#Sequence|EffectSequence|GlowSequence.blur_radius -> blur_radius: float "Radius of glow effect"
+#+ * Sequence|EffectSequence|GlowSequence.boost_factor -> boost_factor: float "Brightness multiplier"
+#+ * Sequence|EffectSequence|GlowSequence.clamp -> clamp: float "rightness limit of intensity"
+#+ * Sequence|EffectSequence|GlowSequence.quality -> quality: int "Accuracy of the blur effect"
+#+ * Sequence|EffectSequence|GlowSequence.threshold -> threshold: float "Minimum intensity to trigger a glow"
+#Sequence|EffectSequence|GlowSequence.use_only_boost -> use_only_boost: boolean "Show the glow buffer only"
+#+ * Sequence|EffectSequence|PluginSequence.filename -> filename: string, "(read-only)"
+#+ * Sequence|EffectSequence|SpeedControlSequence.global_speed -> global_speed: float "NO DESCRIPTION"
+#Sequence|EffectSequence|SpeedControlSequence.use_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"
+#Sequence|EffectSequence|SpeedControlSequence.use_curve_velocity -> use_curve_velocity: boolean "Interpret the F-Curve value as a velocity instead of a frame number"
+#Sequence|EffectSequence|SpeedControlSequence.use_frame_blend -> use_frame_blend: boolean "Blend two frames into the target for a smoother result"
+#+ * Sequence|EffectSequence|TransformSequence.interpolation -> interpolation: enum "NO DESCRIPTION"
+#+ * Sequence|EffectSequence|TransformSequence.rotation_start -> rotation_start: float "NO DESCRIPTION"
+#+ * Sequence|EffectSequence|TransformSequence.scale_start_x -> scale_start_x: float "NO DESCRIPTION"
+#+ * Sequence|EffectSequence|TransformSequence.scale_start_y -> scale_start_y: float "NO DESCRIPTION"
+#+ * Sequence|EffectSequence|TransformSequence.translate_start_x -> translate_start_x: float "NO DESCRIPTION"
+#+ * Sequence|EffectSequence|TransformSequence.translate_start_y -> translate_start_y: float "NO DESCRIPTION"
+#+ * Sequence|EffectSequence|TransformSequence.translation_unit -> translation_unit: enum "NO DESCRIPTION"
+#Sequence|EffectSequence|TransformSequence.use_uniform_scale -> use_uniform_scale: boolean "Scale uniformly, preserving aspect ratio"
+#+ * Sequence|EffectSequence|WipeSequence.angle -> angle: float "Edge angle"
+#+ * Sequence|EffectSequence|WipeSequence.blur_width -> blur_width: float "Width of the blur edge, in percentage relative to the image size"
+#+ * Sequence|EffectSequence|WipeSequence.direction -> direction: enum "Wipe direction"
+#+ * Sequence|EffectSequence|WipeSequence.transition_type -> transition_type: enum "NO DESCRIPTION"
+#Sequence|ImageSequence.animation_offset_end -> animation_offset_end: int "Animation end offset (trim end)"
+#Sequence|ImageSequence.animation_offset_start -> animation_offset_start: int "Animation start offset (trim start)"
+#+ * Sequence|ImageSequence.color_balance -> color_balance: pointer, "(read-only)"
+#Sequence|ImageSequence.color_multiply -> color_multiply: float "NO DESCRIPTION"
+#+ * Sequence|ImageSequence.color_saturation -> color_saturation: float "NO DESCRIPTION"
+#+ * Sequence|ImageSequence.crop -> crop: pointer, "(read-only)"
+#+ * Sequence|ImageSequence.directory -> directory: string "NO DESCRIPTION"
+#+ * Sequence|ImageSequence.elements -> elements: collection, "(read-only)"
+#+ * Sequence|ImageSequence.proxy -> proxy: pointer, "(read-only)"
+#+ * Sequence|ImageSequence.strobe -> strobe: float "Only display every nth frame"
+#+ * Sequence|ImageSequence.transform -> transform: pointer, "(read-only)"
+#+ * Sequence|ImageSequence.use_color_balance -> use_color_balance: boolean "(3-Way color correction) on input"
+#+ * Sequence|ImageSequence.use_crop -> use_crop: boolean "Crop image before processing"
+#Sequence|ImageSequence.use_deinterlace -> use_deinterlace: boolean "For video movies to remove fields"
+#Sequence|ImageSequence.use_flip_x -> use_flip_x: boolean "Flip on the X axis"
+#Sequence|ImageSequence.use_flip_y -> use_flip_y: boolean "Flip on the Y axis"
+#Sequence|ImageSequence.use_float -> use_float: boolean "Convert input to float data"
+#Sequence|ImageSequence.use_premultiply -> use_premultiply: boolean "Convert RGB from key alpha to premultiplied alpha"
+#+ * Sequence|ImageSequence.use_proxy -> use_proxy: boolean "Use a preview proxy for this strip"
+#Sequence|ImageSequence.use_proxy_custom_directory -> use_proxy_custom_directory: boolean "Use a custom directory to store data"
+#Sequence|ImageSequence.use_proxy_custom_file -> use_proxy_custom_file: boolean "Use a custom file to read proxy data from"
+#Sequence|ImageSequence.use_reverse_frames -> use_reverse_frames: boolean "Reverse frame order"
+#+ * Sequence|ImageSequence.use_translation -> use_translation: boolean "Translate image before processing"
+#Sequence|MetaSequence.animation_offset_end -> animation_offset_end: int "Animation end offset (trim end)"
+#Sequence|MetaSequence.animation_offset_start -> animation_offset_start: int "Animation start offset (trim start)"
+#+ * Sequence|MetaSequence.color_balance -> color_balance: pointer, "(read-only)"
+#Sequence|MetaSequence.color_multiply -> color_multiply: float "NO DESCRIPTION"
+#+ * Sequence|MetaSequence.color_saturation -> color_saturation: float "NO DESCRIPTION"
+#+ * Sequence|MetaSequence.crop -> crop: pointer, "(read-only)"
+#+ * Sequence|MetaSequence.proxy -> proxy: pointer, "(read-only)"
+#+ * Sequence|MetaSequence.sequences -> sequences: collection, "(read-only)"
+#+ * Sequence|MetaSequence.strobe -> strobe: float "Only display every nth frame"
+#+ * Sequence|MetaSequence.transform -> transform: pointer, "(read-only)"
+#+ * Sequence|MetaSequence.use_color_balance -> use_color_balance: boolean "(3-Way color correction) on input"
+#+ * Sequence|MetaSequence.use_crop -> use_crop: boolean "Crop image before processing"
+#Sequence|MetaSequence.use_deinterlace -> use_deinterlace: boolean "For video movies to remove fields"
+#Sequence|MetaSequence.use_flip_x -> use_flip_x: boolean "Flip on the X axis"
+#Sequence|MetaSequence.use_flip_y -> use_flip_y: boolean "Flip on the Y axis"
+#Sequence|MetaSequence.use_float -> use_float: boolean "Convert input to float data"
+#Sequence|MetaSequence.use_premultiply -> use_premultiply: boolean "Convert RGB from key alpha to premultiplied alpha"
+#+ * Sequence|MetaSequence.use_proxy -> use_proxy: boolean "Use a preview proxy for this strip"
+#Sequence|MetaSequence.use_proxy_custom_directory -> use_proxy_custom_directory: boolean "Use a custom directory to store data"
+#Sequence|MetaSequence.use_proxy_custom_file -> use_proxy_custom_file: boolean "Use a custom file to read proxy data from"
+#Sequence|MetaSequence.use_reverse_frames -> use_reverse_frames: boolean "Reverse frame order"
+#+ * Sequence|MetaSequence.use_translation -> use_translation: boolean "Translate image before processing"
+#Sequence|MovieSequence.animation_offset_end -> animation_offset_end: int "Animation end offset (trim end)"
+#Sequence|MovieSequence.animation_offset_start -> animation_offset_start: int "Animation start offset (trim start)"
+#+ * Sequence|MovieSequence.color_balance -> color_balance: pointer, "(read-only)"
+#Sequence|MovieSequence.color_multiply -> color_multiply: float "NO DESCRIPTION"
+#+ * Sequence|MovieSequence.color_saturation -> color_saturation: float "NO DESCRIPTION"
+#+ * Sequence|MovieSequence.crop -> crop: pointer, "(read-only)"
+#+ * Sequence|MovieSequence.filepath -> filepath: string "NO DESCRIPTION"
+#+ * Sequence|MovieSequence.mpeg_preseek -> mpeg_preseek: int "For MPEG movies, preseek this many frames"
+#+ * Sequence|MovieSequence.proxy -> proxy: pointer, "(read-only)"
+#+ * Sequence|MovieSequence.strobe -> strobe: float "Only display every nth frame"
+#+ * Sequence|MovieSequence.transform -> transform: pointer, "(read-only)"
+#+ * Sequence|MovieSequence.use_color_balance -> use_color_balance: boolean "(3-Way color correction) on input"
+#+ * Sequence|MovieSequence.use_crop -> use_crop: boolean "Crop image before processing"
+#Sequence|MovieSequence.use_deinterlace -> use_deinterlace: boolean "For video movies to remove fields"
+#Sequence|MovieSequence.use_flip_x -> use_flip_x: boolean "Flip on the X axis"
+#Sequence|MovieSequence.use_flip_y -> use_flip_y: boolean "Flip on the Y axis"
+#Sequence|MovieSequence.use_float -> use_float: boolean "Convert input to float data"
+#Sequence|MovieSequence.use_premultiply -> use_premultiply: boolean "Convert RGB from key alpha to premultiplied alpha"
+#+ * Sequence|MovieSequence.use_proxy -> use_proxy: boolean "Use a preview proxy for this strip"
+#Sequence|MovieSequence.use_proxy_custom_directory -> use_proxy_custom_directory: boolean "Use a custom directory to store data"
+#Sequence|MovieSequence.use_proxy_custom_file -> use_proxy_custom_file: boolean "Use a custom file to read proxy data from"
+#Sequence|MovieSequence.use_reverse_frames -> use_reverse_frames: boolean "Reverse frame order"
+#+ * Sequence|MovieSequence.use_translation -> use_translation: boolean "Translate image before processing"
+#Sequence|MulticamSequence.animation_offset_end -> animation_offset_end: int "Animation end offset (trim end)"
+#Sequence|MulticamSequence.animation_offset_start -> animation_offset_start: int "Animation start offset (trim start)"
+#+ * Sequence|MulticamSequence.color_balance -> color_balance: pointer, "(read-only)"
+#Sequence|MulticamSequence.color_multiply -> color_multiply: float "NO DESCRIPTION"
+#+ * Sequence|MulticamSequence.color_saturation -> color_saturation: float "NO DESCRIPTION"
+#+ * Sequence|MulticamSequence.crop -> crop: pointer, "(read-only)"
+#+ * Sequence|MulticamSequence.multicam_source -> multicam_source: int "NO DESCRIPTION"
+#+ * Sequence|MulticamSequence.proxy -> proxy: pointer, "(read-only)"
+#+ * Sequence|MulticamSequence.strobe -> strobe: float "Only display every nth frame"
+#+ * Sequence|MulticamSequence.transform -> transform: pointer, "(read-only)"
+#+ * Sequence|MulticamSequence.use_color_balance -> use_color_balance: boolean "(3-Way color correction) on input"
+#+ * Sequence|MulticamSequence.use_crop -> use_crop: boolean "Crop image before processing"
+#Sequence|MulticamSequence.use_deinterlace -> use_deinterlace: boolean "For video movies to remove fields"
+#Sequence|MulticamSequence.use_flip_x -> use_flip_x: boolean "Flip on the X axis"
+#Sequence|MulticamSequence.use_flip_y -> use_flip_y: boolean "Flip on the Y axis"
+#Sequence|MulticamSequence.use_float -> use_float: boolean "Convert input to float data"
+#Sequence|MulticamSequence.use_premultiply -> use_premultiply: boolean "Convert RGB from key alpha to premultiplied alpha"
+#+ * Sequence|MulticamSequence.use_proxy -> use_proxy: boolean "Use a preview proxy for this strip"
+#Sequence|MulticamSequence.use_proxy_custom_directory -> use_proxy_custom_directory: boolean "Use a custom directory to store data"
+#Sequence|MulticamSequence.use_proxy_custom_file -> use_proxy_custom_file: boolean "Use a custom file to read proxy data from"
+#Sequence|MulticamSequence.use_reverse_frames -> use_reverse_frames: boolean "Reverse frame order"
+#+ * Sequence|MulticamSequence.use_translation -> use_translation: boolean "Translate image before processing"
+#Sequence|SceneSequence.animation_offset_end -> animation_offset_end: int "Animation end offset (trim end)"
+#Sequence|SceneSequence.animation_offset_start -> animation_offset_start: int "Animation start offset (trim start)"
+#+ * Sequence|SceneSequence.color_balance -> color_balance: pointer, "(read-only)"
+#Sequence|SceneSequence.color_multiply -> color_multiply: float "NO DESCRIPTION"
+#+ * Sequence|SceneSequence.color_saturation -> color_saturation: float "NO DESCRIPTION"
+#+ * Sequence|SceneSequence.crop -> crop: pointer, "(read-only)"
+#+ * Sequence|SceneSequence.proxy -> proxy: pointer, "(read-only)"
+#+ * Sequence|SceneSequence.scene -> scene: pointer "Scene that this sequence uses"
+#+ * Sequence|SceneSequence.scene_camera -> scene_camera: pointer "Override the scenes active camera"
+#+ * Sequence|SceneSequence.strobe -> strobe: float "Only display every nth frame"
+#+ * Sequence|SceneSequence.transform -> transform: pointer, "(read-only)"
+#+ * Sequence|SceneSequence.use_color_balance -> use_color_balance: boolean "(3-Way color correction) on input"
+#+ * Sequence|SceneSequence.use_crop -> use_crop: boolean "Crop image before processing"
+#Sequence|SceneSequence.use_deinterlace -> use_deinterlace: boolean "For video movies to remove fields"
+#Sequence|SceneSequence.use_flip_x -> use_flip_x: boolean "Flip on the X axis"
+#Sequence|SceneSequence.use_flip_y -> use_flip_y: boolean "Flip on the Y axis"
+#Sequence|SceneSequence.use_float -> use_float: boolean "Convert input to float data"
+#Sequence|SceneSequence.use_premultiply -> use_premultiply: boolean "Convert RGB from key alpha to premultiplied alpha"
+#+ * Sequence|SceneSequence.use_proxy -> use_proxy: boolean "Use a preview proxy for this strip"
+#Sequence|SceneSequence.use_proxy_custom_directory -> use_proxy_custom_directory: boolean "Use a custom directory to store data"
+#Sequence|SceneSequence.use_proxy_custom_file -> use_proxy_custom_file: boolean "Use a custom file to read proxy data from"
+#Sequence|SceneSequence.use_reverse_frames -> use_reverse_frames: boolean "Reverse frame order"
+#+ * Sequence|SceneSequence.use_translation -> use_translation: boolean "Translate image before processing"
+#Sequence|SoundSequence.animation_offset_end -> animation_offset_end: int "Animation end offset (trim end)"
+#Sequence|SoundSequence.animation_offset_start -> animation_offset_start: int "Animation start offset (trim start)"
+#+ * Sequence|SoundSequence.attenuation -> attenuation: float "Attenuation in dezibel"
+#+ * Sequence|SoundSequence.filepath -> filepath: string "NO DESCRIPTION"
+#+ * Sequence|SoundSequence.sound -> sound: pointer, "(read-only) Sound datablock used by this sequence"
+#+ * Sequence|SoundSequence.volume -> volume: float "Playback volume of the sound"
+#+ * ShapeKey.data -> data: collection, "(read-only)"
+#+ * ShapeKey.frame -> frame: float, "(read-only) Frame for absolute keys"
+#+ * ShapeKey.interpolation -> interpolation: enum "Interpolation type"
+#+ * ShapeKey.mute -> mute: boolean "Mute this shape key"
+#+ * ShapeKey.name -> name: string "NO DESCRIPTION"
+#+ * 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[3] "NO DESCRIPTION"
+#ShapeKeyBezierPoint.handle_left -> handle_left: float[3] "NO DESCRIPTION"
+#ShapeKeyBezierPoint.handle_right -> handle_right: float[3] "NO DESCRIPTION"
+#+ * ShapeKeyCurvePoint.co -> co: float[3] "NO DESCRIPTION"
+#+ * ShapeKeyCurvePoint.tilt -> tilt: float "NO DESCRIPTION"
+#+ * ShapeKeyPoint.co -> co: float[3] "NO DESCRIPTION"
+#TODO BETTER 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"
+#TODO BETTER NAME * SmokeDomainSettings.beta -> beta: float "Higher value results in faster rising smoke"
+#SmokeDomainSettings.collision_extents -> collision_extents: enum "Selects which domain border will be treated as collision object."
+#SmokeDomainSettings.collision_group -> collision_group: pointer "Limit collisions to this group"
+#+ * SmokeDomainSettings.dissolve_speed -> dissolve_speed: int "Dissolve Speed"
+#SmokeDomainSettings.effector_group -> effector_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.noise_type -> noise_type: enum "Noise method which is used for creating the high resolution"
+#SmokeDomainSettings.point_cache_compress_high_type -> point_cache_compress_high_type: enum "Compression method to be used"
+#SmokeDomainSettings.point_cache_compress_type -> point_cache_compress_type: enum "Compression method to be used"
+#+ * SmokeDomainSettings.point_cache_high -> point_cache_high: pointer, "(read-only)"
+#+ * SmokeDomainSettings.point_cache_low -> point_cache_low: pointer, "(read-only)"
+#SmokeDomainSettings.resolution_max -> resolution_max: int "Maximal resolution used in the fluid domain"
+#SmokeDomainSettings.show_high_resolution -> show_high_resolution: boolean "Show high resolution (using amplification)"
+#SmokeDomainSettings.smooth_emitter -> smooth_emitter: boolean "Smoothens emitted smoke to avoid blockiness."
+#+ * SmokeDomainSettings.strength -> strength: float "Strength of wavelet noise"
+#+ * SmokeDomainSettings.time_scale -> time_scale: float "Adjust simulation speed."
+#SmokeDomainSettings.use_dissolve_smoke -> use_dissolve_smoke: boolean "Enable smoke to disappear over time"
+#SmokeDomainSettings.use_dissolve_smoke_log -> use_dissolve_smoke_log: boolean "Using 1/x"
+#SmokeDomainSettings.use_high_resolution -> use_high_resolution: boolean "Enable high resolution (using amplification)"
+#+ * SmokeDomainSettings.vorticity -> vorticity: float "Amount of turbulence/rotation in fluid."
+#+ * SmokeFlowSettings.density -> density: float "NO DESCRIPTION"
+#+ * SmokeFlowSettings.initial_velocity -> initial_velocity: boolean "Smoke inherits its velocity from the emitter particle"
+#SmokeFlowSettings.particle_system -> particle_system: pointer "Particle systems emitted from the object"
+#+ * SmokeFlowSettings.temperature -> temperature: float "Temperature difference to ambient temperature"
+#SmokeFlowSettings.use_absolute -> use_absolute: boolean "Only allows given density value in emitter area."
+#SmokeFlowSettings.use_outflow -> use_outflow: boolean "Deletes smoke from simulation"
+#SmokeFlowSettings.velocity_factor -> velocity_factor: float "Multiplier to adjust velocity passed to smoke"
+#+ * 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.bend -> bend: float "Bending Stiffness"
+#+ * SoftBodySettings.choke -> choke: int "Viscosity inside collision target"
+#+ * SoftBodySettings.collision_type -> collision_type: enum "Choose Collision Type"
+#SoftBodySettings.damping -> damping: float "Edge spring friction"
+#+ * SoftBodySettings.effector_weights -> effector_weights: pointer, "(read-only)"
+#SoftBodySettings.error_threshold -> error_threshold: 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.location_mass_center -> location_mass_center: float[3] "Location of Center of mass"
+#+ * SoftBodySettings.mass -> mass: float "General Mass value"
+#+ * SoftBodySettings.mass_vertex_group -> mass_vertex_group: string "Control point mass values"
+#+ * 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.rotation_estimate -> rotation_estimate: float[9] "Estimated rotation matrix"
+#SoftBodySettings.scale_estimate -> scale_estimate: float[9] "Estimated scale matrix"
+#+ * 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"
+#SoftBodySettings.step_max -> step_max: int "Maximal # solver steps/frame"
+#SoftBodySettings.step_min -> step_min: int "Minimal # solver steps/frame"
+#SoftBodySettings.use_auto_step -> use_auto_step: boolean "Use velocities for automagic step sizes"
+#SoftBodySettings.use_diagnose -> use_diagnose: boolean "Turn on SB diagnose console prints"
+#SoftBodySettings.use_edge_collision -> use_edge_collision: boolean "Edges collide too"
+#+ * SoftBodySettings.use_edges -> use_edges: boolean "Use Edges as springs"
+#SoftBodySettings.use_estimate_matrix -> use_estimate_matrix: boolean "estimate matrix .. split to COM , ROT ,SCALE"
+#SoftBodySettings.use_face_collision -> use_face_collision: boolean "Faces collide too, can be very slow"
+#+ * SoftBodySettings.use_goal -> use_goal: boolean "Define forces for vertices to stick to animated position"
+#SoftBodySettings.use_self_collision -> use_self_collision: boolean "Enable naive vertex ball self collision"
+#SoftBodySettings.use_stiff_quads -> use_stiff_quads: boolean "Adds diagonal springs on 4-gons"
+#+ * Space.type -> type: enum, "(read-only) Space data type"
+#+ * SpaceUVEditor.cursor_location -> cursor_location: float[2] "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.lock_bounds -> lock_bounds: boolean "Constraint to stay within the image bounds while editing"
+#SpaceUVEditor.pivot_point -> pivot_point: enum "Rotation/Scaling Pivot"
+#SpaceUVEditor.show_modified_edges -> show_modified_edges: boolean "Draw edges after modifiers are applied"
+#SpaceUVEditor.show_normalized_coords -> show_normalized_coords: boolean "Display UV coordinates from 0.0 to 1.0 rather than in pixels"
+#SpaceUVEditor.show_other_objects -> show_other_objects: boolean "Draw other selected objects that share the same image"
+#SpaceUVEditor.show_smooth_edges -> show_smooth_edges: boolean "Draw UV edges anti-aliased"
+#SpaceUVEditor.show_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.sticky_select_mode -> sticky_select_mode: enum "Automatically select also UVs sharing the same vertex as the ones being selected"
+#SpaceUVEditor.use_live_unwrap -> use_live_unwrap: boolean "Continuously unwrap the selected UV island while transforming pinned vertices"
+#SpaceUVEditor.use_snap_to_pixels -> use_snap_to_pixels: boolean "Snap UVs to pixel locations while editing"
+#+ * Space|SpaceConsole.console_type -> console_type: enum "Console type"
+#+ * Space|SpaceConsole.font_size -> font_size: int "Font size to use for displaying the text"
+#+ * Space|SpaceConsole.history -> history: collection, "(read-only) Command history"
+#+ * Space|SpaceConsole.language -> language: string "Command line prompt language"
+#+ * Space|SpaceConsole.prompt -> prompt: string "Command line prompt"
+#+ * Space|SpaceConsole.scrollback -> scrollback: collection, "(read-only) Command output"
+#Space|SpaceConsole.select_end -> select_end: int "NO DESCRIPTION"
+#Space|SpaceConsole.select_start -> select_start: int "NO DESCRIPTION"
+#+ * Space|SpaceConsole.show_report_debug -> show_report_debug: boolean "Display debug reporting info"
+#+ * Space|SpaceConsole.show_report_error -> show_report_error: boolean "Display error text"
+#+ * Space|SpaceConsole.show_report_info -> show_report_info: boolean "Display general information"
+#+ * Space|SpaceConsole.show_report_operator -> show_report_operator: boolean "Display the operator log"
+#Space|SpaceConsole.show_report_warning -> show_report_warning: boolean "Display warnings"
+#+ * Space|SpaceDopeSheetEditor.action -> action: pointer "Action displayed and edited in this space"
+#Space|SpaceDopeSheetEditor.auto_snap -> auto_snap: enum "Automatic time snapping settings for transformations"
+#+ * Space|SpaceDopeSheetEditor.dopesheet -> dopesheet: pointer, "(read-only) Settings for filtering animation data"
+#+ * Space|SpaceDopeSheetEditor.mode -> mode: enum "Editing context being displayed"
+#Space|SpaceDopeSheetEditor.show_frame_indicator -> show_frame_indicator: boolean "Show frame number beside the current frame indicator line"
+#+ * Space|SpaceDopeSheetEditor.show_seconds -> show_seconds: boolean, "(read-only) Show timing in seconds not frames"
+#+ * Space|SpaceDopeSheetEditor.show_sliders -> show_sliders: boolean "Show sliders beside F-Curve channels"
+#Space|SpaceDopeSheetEditor.use_auto_merge_keyframes -> use_auto_merge_keyframes: boolean "Automatically merge nearby keyframes"
+#+ * Space|SpaceDopeSheetEditor.use_marker_sync -> use_marker_sync: boolean "Sync Markers with keyframe edits"
+#Space|SpaceDopeSheetEditor.use_realtime_update -> use_realtime_update: boolean "When transforming keyframes, changes to the animation data are flushed to other views"
+#+ * Space|SpaceFileBrowser.params -> params: pointer, "(read-only) Parameters and Settings for the Filebrowser"
+#Space|SpaceGraphEditor.auto_snap -> auto_snap: enum "Automatic time snapping settings for transformations"
+#Space|SpaceGraphEditor.cursor_position_y -> cursor_position_y: float "Graph Editor 2D-Value cursor - Y-Value component"
+#+ * Space|SpaceGraphEditor.dopesheet -> dopesheet: pointer, "(read-only) Settings for filtering animation data"
+#+ * Space|SpaceGraphEditor.has_ghost_curves -> has_ghost_curves: boolean "Graph Editor instance has some ghost curves stored"
+#+ * Space|SpaceGraphEditor.mode -> mode: enum "Editing context being displayed"
+#+ * Space|SpaceGraphEditor.pivot_point -> pivot_point: enum "Pivot center for rotation/scaling"
+#+ * Space|SpaceGraphEditor.show_cursor -> show_cursor: boolean "Show 2D cursor"
+#Space|SpaceGraphEditor.show_frame_indicator -> show_frame_indicator: boolean "Show frame number beside the current frame indicator line"
+#+ * Space|SpaceGraphEditor.show_handles -> show_handles: boolean "Show handles of Bezier control points"
+#+ * Space|SpaceGraphEditor.show_seconds -> show_seconds: boolean, "(read-only) Show timing in seconds not frames"
+#+ * Space|SpaceGraphEditor.show_sliders -> show_sliders: boolean "Show sliders beside F-Curve channels"
+#Space|SpaceGraphEditor.use_auto_merge_keyframes -> use_auto_merge_keyframes: boolean "Automatically merge nearby keyframes"
+#Space|SpaceGraphEditor.use_only_selected_curves_handles -> use_only_selected_curves_handles: boolean "Only keyframes of selected F-Curves are visible and editable"
+#Space|SpaceGraphEditor.use_only_selected_keyframe_handles -> use_only_selected_keyframe_handles: boolean "Only show and edit handles of selected keyframes"
+#Space|SpaceGraphEditor.use_realtime_update -> use_realtime_update: boolean "When transforming keyframes, changes to the animation data are flushed to other views"
+#+ * Space|SpaceImageEditor.curves -> curves: pointer, "(read-only) Color curve mapping to use for displaying the image"
+#+ * Space|SpaceImageEditor.draw_channels -> draw_channels: enum "Channels of the image to draw"
+#+ * Space|SpaceImageEditor.grease_pencil -> grease_pencil: pointer "Grease pencil data for this space"
+#+ * Space|SpaceImageEditor.image -> image: pointer "Image displayed and edited in this space"
+#+ * Space|SpaceImageEditor.image_user -> image_user: pointer, "(read-only) Parameters defining which layer, pass and frame of the image is displayed"
+#+ * Space|SpaceImageEditor.sample_histogram -> sample_histogram: pointer, "(read-only) Sampled colors along line"
+#+ * Space|SpaceImageEditor.scopes -> scopes: pointer, "(read-only) Scopes to visualize image statistics."
+#+ * Space|SpaceImageEditor.show_paint -> show_paint: boolean, "(read-only) Show paint related properties"
+#+ * Space|SpaceImageEditor.show_render -> show_render: boolean, "(read-only) Show render related properties"
+#Space|SpaceImageEditor.show_repeat -> show_repeat: boolean "Draw the image repeated outside of the main view"
+#+ * Space|SpaceImageEditor.show_uvedit -> show_uvedit: boolean, "(read-only) Show UV editing related properties"
+#+ * Space|SpaceImageEditor.use_grease_pencil -> use_grease_pencil: boolean "Display and edit the grease pencil freehand annotations overlay"
+#Space|SpaceImageEditor.use_image_paint -> use_image_paint: boolean "Enable image painting mode"
+#Space|SpaceImageEditor.use_image_pin -> use_image_pin: boolean "Display current image regardless of object selection"
+#Space|SpaceImageEditor.use_realtime_update -> use_realtime_update: boolean "Update other affected window spaces automatically to reflect changes during interactive operations such as transform"
+#+ * Space|SpaceImageEditor.uv_editor -> uv_editor: pointer, "(read-only) UV editor settings"
+#Space|SpaceLogicEditor.show_actuators_active_object -> show_actuators_active_object: boolean "Show actuators of active object"
+#Space|SpaceLogicEditor.show_actuators_active_states -> show_actuators_active_states: boolean "Show only actuators connected to active states"
+#Space|SpaceLogicEditor.show_actuators_linked_controller -> show_actuators_linked_controller: boolean "Show linked objects to the actuator"
+#Space|SpaceLogicEditor.show_actuators_selected_objects -> show_actuators_selected_objects: boolean "Show actuators of all selected objects"
+#Space|SpaceLogicEditor.show_controllers_active_object -> show_controllers_active_object: boolean "Show controllers of active object"
+#Space|SpaceLogicEditor.show_controllers_linked_controller -> show_controllers_linked_controller: boolean "Show linked objects to sensor/actuator"
+#Space|SpaceLogicEditor.show_controllers_selected_objects -> show_controllers_selected_objects: boolean "Show controllers of all selected objects"
+#Space|SpaceLogicEditor.show_sensors_active_object -> show_sensors_active_object: boolean "Show sensors of active object"
+#Space|SpaceLogicEditor.show_sensors_active_states -> show_sensors_active_states: boolean "Show only sensors connected to active states"
+#Space|SpaceLogicEditor.show_sensors_linked_controller -> show_sensors_linked_controller: boolean "Show linked objects to the controller"
+#Space|SpaceLogicEditor.show_sensors_selected_objects -> show_sensors_selected_objects: boolean "Show sensors of all selected objects"
+#Space|SpaceNLA.auto_snap -> auto_snap: enum "Automatic time snapping settings for transformations"
+#+ * Space|SpaceNLA.dopesheet -> dopesheet: pointer, "(read-only) Settings for filtering animation data"
+#Space|SpaceNLA.show_frame_indicator -> show_frame_indicator: boolean "Show frame number beside the current frame indicator line"
+#+ * Space|SpaceNLA.show_seconds -> show_seconds: boolean, "(read-only) Show timing in seconds not frames"
+#+ * Space|SpaceNLA.show_strip_curves -> show_strip_curves: boolean "Show influence curves on strips"
+#Space|SpaceNLA.use_realtime_update -> use_realtime_update: boolean "When transforming strips, changes to the animation data are flushed to other views"
+#+ * Space|SpaceNodeEditor.id -> id: pointer, "(read-only) Datablock whose nodes are being edited"
+#+ * Space|SpaceNodeEditor.id_from -> id_from: pointer, "(read-only) Datablock from which the edited datablock is linked"
+#+ * Space|SpaceNodeEditor.nodetree -> nodetree: pointer, "(read-only) Node tree being displayed and edited"
+#Space|SpaceNodeEditor.show_backdrop -> show_backdrop: boolean "Use active Viewer Node output as backdrop for compositing nodes"
+#+ * Space|SpaceNodeEditor.texture_type -> texture_type: enum "Type of data to take texture from"
+#+ * Space|SpaceNodeEditor.tree_type -> tree_type: enum "Node tree type to display and edit"
+#+ * Space|SpaceOutliner.display_mode -> display_mode: enum "Type of information to display"
+#Space|SpaceOutliner.filter_text -> filter_text: string "Live search filtering string"
+#Space|SpaceOutliner.show_restrict_columns -> show_restrict_columns: boolean "Show column"
+#Space|SpaceOutliner.use_filter_case_sensitive -> use_filter_case_sensitive: boolean "Only use case sensitive matches of search string"
+#Space|SpaceOutliner.use_filter_complete -> use_filter_complete: boolean "Only use complete matches of search string"
+#+ * Space|SpaceProperties.align -> align: enum "Arrangement of the panels"
+#+ * Space|SpaceProperties.context -> context: enum "Type of active data to display and edit"
+#+ * Space|SpaceProperties.pin_id -> pin_id: pointer "NO DESCRIPTION"
+#Space|SpaceProperties.show_brush_texture -> show_brush_texture: boolean "Show brush textures"
+#+ * Space|SpaceProperties.use_pin_id -> use_pin_id: boolean "Use the pinned context"
+#+ * Space|SpaceSequenceEditor.display_channel -> display_channel: int "The channel number shown in the image preview. 0 is the result of all strips combined"
+#+ * Space|SpaceSequenceEditor.display_mode -> display_mode: enum "The view mode to use for displaying sequencer output"
+#+ * Space|SpaceSequenceEditor.draw_overexposed -> draw_overexposed: int "Show overexposed areas with zebra stripes"
+#+ * Space|SpaceSequenceEditor.grease_pencil -> grease_pencil: pointer, "(read-only) Grease pencil data for this space"
+#+ * Space|SpaceSequenceEditor.offset_x -> offset_x: float "Offsets image horizontally from the view center"
+#+ * Space|SpaceSequenceEditor.offset_y -> offset_y: float "Offsets image horizontally from the view center"
+#+ * Space|SpaceSequenceEditor.proxy_render_size -> proxy_render_size: enum "Draw preview using full resolution or different proxy resolutions"
+#Space|SpaceSequenceEditor.show_frame_indicator -> show_frame_indicator: boolean "Show frame number beside the current frame indicator line"
+#Space|SpaceSequenceEditor.show_frames -> show_frames: boolean "Draw frames rather than seconds"
+#Space|SpaceSequenceEditor.show_safe_margin -> show_safe_margin: boolean "Draw title safe margins in preview"
+#Space|SpaceSequenceEditor.show_separate_color -> show_separate_color: boolean "Separate color channels in preview"
+#+ * Space|SpaceSequenceEditor.use_grease_pencil -> use_grease_pencil: boolean "Display and edit the grease pencil freehand annotations overlay"
+#+ * Space|SpaceSequenceEditor.use_marker_sync -> use_marker_sync: boolean "Transform markers as well as strips"
+#+ * Space|SpaceSequenceEditor.view_type -> view_type: enum "The type of the Sequencer view (sequencer, preview or both)"
+#+ * Space|SpaceSequenceEditor.zoom -> zoom: float "Display zoom level"
+#+ * Space|SpaceTextEditor.find_text -> find_text: string "Text to search for with the find tool"
+#+ * Space|SpaceTextEditor.font_size -> font_size: int "Font size to use for displaying the text"
+#+ * Space|SpaceTextEditor.replace_text -> replace_text: string "Text to replace selected text with using the replace tool"
+#Space|SpaceTextEditor.show_line_highlight -> show_line_highlight: boolean "Highlight the current line"
+#+ * Space|SpaceTextEditor.show_line_numbers -> show_line_numbers: boolean "Show line numbers next to the text"
+#+ * Space|SpaceTextEditor.show_syntax_highlight -> show_syntax_highlight: boolean "Syntax highlight for scripting"
+#+ * Space|SpaceTextEditor.show_word_wrap -> show_word_wrap: boolean "Wrap words if there is not enough horizontal space"
+#+ * Space|SpaceTextEditor.tab_width -> tab_width: int "Number of spaces to display tabs with"
+#+ * Space|SpaceTextEditor.text -> text: pointer "Text displayed and edited in this space"
+#Space|SpaceTextEditor.use_find_all -> use_find_all: boolean "Search in all text datablocks, instead of only the active one"
+#Space|SpaceTextEditor.use_find_wrap -> use_find_wrap: boolean "Search again from the start of the file when reaching the end"
+#Space|SpaceTextEditor.use_live_edit -> use_live_edit: boolean "Run python while editing"
+#Space|SpaceTextEditor.use_overwrite -> use_overwrite: boolean "Overwrite characters when typing rather than inserting them"
+#+ * Space|SpaceTimeline.cache_cloth -> cache_cloth: boolean "Show the active objects cloth point cache"
+#+ * Space|SpaceTimeline.cache_particles -> cache_particles: boolean "Show the active objects particle point cache"
+#+ * Space|SpaceTimeline.cache_smoke -> cache_smoke: boolean "Show the active objects smoke cache"
+#+ * Space|SpaceTimeline.cache_softbody -> cache_softbody: boolean "Show the active objects softbody point cache"
+#+ * Space|SpaceTimeline.show_cache -> show_cache: boolean "Show the status of cached frames in the timeline"
+#Space|SpaceTimeline.show_frame_indicator -> show_frame_indicator: boolean "Show frame number beside the current frame indicator line"
+#Space|SpaceTimeline.show_only_selected -> show_only_selected: boolean "Show keyframes for active Object and/or its selected channels only"
+#Space|SpaceTimeline.use_play_3d_editors -> use_play_3d_editors: boolean "NO DESCRIPTION"
+#Space|SpaceTimeline.use_play_animation_editors -> use_play_animation_editors: boolean "NO DESCRIPTION"
+#Space|SpaceTimeline.use_play_image_editors -> use_play_image_editors: boolean "NO DESCRIPTION"
+#Space|SpaceTimeline.use_play_node_editors -> use_play_node_editors: boolean "NO DESCRIPTION"
+#Space|SpaceTimeline.use_play_properties_editors -> use_play_properties_editors: boolean "NO DESCRIPTION"
+#Space|SpaceTimeline.use_play_sequence_editors -> use_play_sequence_editors: boolean "NO DESCRIPTION"
+#Space|SpaceTimeline.use_play_top_left_3d_editor -> use_play_top_left_3d_editor: boolean "NO DESCRIPTION"
+#Space|SpaceUserPreferences.filter_text -> filter_text: string "Search term for filtering in the UI"
+#+ * Space|SpaceView3D.background_images -> background_images: collection, "(read-only) List of background images"
+#+ * Space|SpaceView3D.camera -> camera: pointer "Active camera used in this view (when unlocked from the scenes active camera)"
+#+ * Space|SpaceView3D.clip_end -> clip_end: float "3D View far clipping distance"
+#+ * Space|SpaceView3D.clip_start -> clip_start: float "3D View near clipping distance"
+#+ * Space|SpaceView3D.current_orientation -> current_orientation: pointer, "(read-only) Current Transformation orientation"
+#+ * Space|SpaceView3D.cursor_location -> cursor_location: float[3] "3D cursor location for this view (dependent on local view setting)"
+#+ * Space|SpaceView3D.grid_lines -> grid_lines: int "The number of grid lines to display in perspective view"
+#+ * Space|SpaceView3D.grid_spacing -> grid_spacing: float "The distance between 3D View grid lines"
+#+ * Space|SpaceView3D.grid_subdivisions -> grid_subdivisions: int "The number of subdivisions between grid lines"
+#+ * Space|SpaceView3D.layers -> layers: boolean[20] "Layers visible in this 3D View"
+#Space|SpaceView3D.layers_used -> layers_used: boolean[20], "(read-only) Layers that contain something"
+#+ * Space|SpaceView3D.lens -> lens: float "Lens angle (mm) in perspective view"
+#+ * Space|SpaceView3D.local_view -> local_view: pointer, "(read-only) Display an isolated sub-set of objects, apart from the scene visibility"
+#+ * Space|SpaceView3D.lock_bone -> lock_bone: string "3D View center is locked to this bones position"
+#+ * Space|SpaceView3D.lock_camera_and_layers -> lock_camera_and_layers: boolean "Use the scenes active camera and layers in this view, rather than local layers"
+#+ * Space|SpaceView3D.lock_object -> lock_object: pointer "3D View center is locked to this objects position"
+#+ * Space|SpaceView3D.pivot_point -> pivot_point: enum "Pivot center for rotation/scaling"
+#+ * Space|SpaceView3D.region_3d -> region_3d: pointer, "(read-only) 3D region in this space, in case of quad view the camera region"
+#+ * Space|SpaceView3D.region_quadview -> region_quadview: pointer, "(read-only) 3D region that defines the quad view settings"
+#Space|SpaceView3D.show_all_objects_origin -> show_all_objects_origin: boolean "Show the object origin center dot for all (selected and unselected) objects"
+#Space|SpaceView3D.show_axis_x -> show_axis_x: boolean "Show the X axis line in perspective view"
+#Space|SpaceView3D.show_axis_y -> show_axis_y: boolean "Show the Y axis line in perspective view"
+#Space|SpaceView3D.show_axis_z -> show_axis_z: boolean "Show the Z axis line in perspective view"
+#Space|SpaceView3D.show_background_images -> show_background_images: boolean "Display reference images behind objects in the 3D View"
+#Space|SpaceView3D.show_floor -> show_floor: boolean "Show the ground plane grid in perspective view"
+#Space|SpaceView3D.show_manipulator -> show_manipulator: boolean "Use a 3D manipulator widget for controlling transforms"
+#Space|SpaceView3D.show_only_render -> show_only_render: boolean "Display only objects which will be rendered"
+#Space|SpaceView3D.show_outline_selected -> show_outline_selected: boolean "Show an outline highlight around selected objects in non-wireframe views"
+#Space|SpaceView3D.show_relationship_lines -> show_relationship_lines: boolean "Show dashed lines indicating parent or constraint relationships"
+#Space|SpaceView3D.show_textured_solid -> show_textured_solid: boolean "Display face-assigned textures in solid view"
+#+ * Space|SpaceView3D.transform_orientation -> transform_orientation: enum "Transformation orientation"
+#Space|SpaceView3D.use_manipulator_rotate -> use_manipulator_rotate: boolean "Use the manipulator for rotation transformations"
+#Space|SpaceView3D.use_manipulator_scale -> use_manipulator_scale: boolean "Use the manipulator for scale transformations"
+#Space|SpaceView3D.use_manipulator_translate -> use_manipulator_translate: boolean "Use the manipulator for movement transformations"
+#Space|SpaceView3D.use_occlude_geometry -> use_occlude_geometry: boolean "Limit selection to visible (clipped with depth buffer)"
+#Space|SpaceView3D.use_pivot_point_align -> use_pivot_point_align: boolean "Manipulate object centers only"
+#Space|SpaceView3D.viewport_shade -> viewport_shade: enum "Method to display/shade objects in the 3D View"
+#+ * 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.hide -> hide: boolean "Hide this curve in editmode"
+#+ * Spline.material_index -> material_index: int "NO DESCRIPTION"
+#+ * 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"
+#Spline.use_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.use_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.use_cyclic_u -> use_cyclic_u: boolean "Make this curve or surface a closed loop in the U direction"
+#Spline.use_cyclic_v -> use_cyclic_v: boolean "Make this surface a closed loop in the V direction"
+#Spline.use_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.use_endpoint_v -> use_endpoint_v: boolean "Make this nurbs surface meet the endpoints in the V direction (Cyclic V must be disabled)"
+#Spline.use_smooth -> use_smooth: boolean "Smooth the normals of the surface or beveled curve"
+#+ * SplinePoint.co -> co: float[4] "Point coordinates"
+#+ * SplinePoint.hide -> hide: boolean "Visibility status"
+#+ * SplinePoint.radius -> radius: float, "(read-only) Radius for bevelling"
+#+ * SplinePoint.select -> select: boolean "Selection status"
+#+ * SplinePoint.tilt -> tilt: float "Tilt in 3D View"
+#+ * SplinePoint.weight -> weight: float "Nurbs weight"
+#+ * SplinePoint.weight_softbody -> weight_softbody: float "Softbody goal weight"
+#+ * Struct.base -> base: pointer, "(read-only) Struct definition this is derived from"
+#+ * Struct.description -> description: string, "(read-only) Description of the Structs 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"
+#+ * TexMapping.location -> location: float[3] "NO DESCRIPTION"
+#TexMapping.max -> max: float[3] "Maximum value for clipping"
+#TexMapping.min -> min: float[3] "Minimum value for clipping"
+#+ * TexMapping.rotation -> rotation: float[3] "NO DESCRIPTION"
+#+ * TexMapping.scale -> scale: float[3] "NO DESCRIPTION"
+#TexMapping.use_max -> use_max: boolean "Whether to use maximum clipping value"
+#TexMapping.use_min -> use_min: boolean "Whether to use minimum clipping value"
+#+ * TextBox.height -> height: float "NO DESCRIPTION"
+#+ * TextBox.width -> width: float "NO DESCRIPTION"
+#+ * TextBox.x -> x: float "NO DESCRIPTION"
+#+ * TextBox.y -> y: float "NO DESCRIPTION"
+#TextCharacterFormat.use_bold -> use_bold: boolean "NO DESCRIPTION"
+#TextCharacterFormat.use_italic -> use_italic: boolean "NO DESCRIPTION"
+#+ * TextCharacterFormat.use_small_caps -> use_small_caps: boolean "NO DESCRIPTION"
+#TextCharacterFormat.use_underline -> use_underline: boolean "NO DESCRIPTION"
+#+ * TextLine.body -> body: string "Text in the line"
+#TextMarker.character_index_end -> character_index_end: int, "(read-only) Start position of the marker in the line"
+#TextMarker.character_index_start -> character_index_start: int, "(read-only) Start position of the marker in the line"
+#+ * TextMarker.color -> color: float[4] "Color to display the marker with"
+#+ * TextMarker.group -> group: int, "(read-only)"
+#TextMarker.is_temporary -> is_temporary: boolean, "(read-only) Marker is temporary"
+#+ * TextMarker.line -> line: int, "(read-only) Line in which the marker is located"
+#TextMarker.use_edit_all -> use_edit_all: boolean, "(read-only) Edit all markers of the same group as one"
+#+ * TextureSlot.blend_type -> blend_type: enum "NO DESCRIPTION"
+#+ * TextureSlot.color -> color: float[3] "The default color for textures that dont return RGB"
+#+ * TextureSlot.default_value -> default_value: float "Value to use for Ref, Spec, Amb, Emit, Alpha, RayMir, TransLu and Hard"
+#TextureSlot.invert -> invert: boolean "Inverts the values of the texture to reverse its effect"
+#+ * TextureSlot.name -> name: string, "(read-only) Texture slot name"
+#+ * TextureSlot.offset -> offset: float[3] "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.scale -> scale: float[3] "Sets scaling for the textures X, Y and Z sizes"
+#+ * TextureSlot.texture -> texture: pointer "Texture datablock used by this texture slot"
+#TextureSlot.use_rgb_to_intensity -> use_rgb_to_intensity: boolean "Converts texture RGB values to intensity (gray) values"
+#TextureSlot.use_stencil -> use_stencil: boolean "Use this texture as a blending value on the next texture"
+#+ * TextureSlot|BrushTextureSlot.angle -> angle: float "Defines brush texture rotation"
+#+ * TextureSlot|BrushTextureSlot.map_mode -> map_mode: enum "NO DESCRIPTION"
+#+ * TextureSlot|LampTextureSlot.color_factor -> color_factor: float "Amount texture affects color values"
+#+ * TextureSlot|LampTextureSlot.object -> object: pointer "Object to use for mapping with Object texture coordinates"
+#+ * TextureSlot|LampTextureSlot.shadow_factor -> shadow_factor: float "Amount texture affects shadow"
+#TextureSlot|LampTextureSlot.texture_coords -> texture_coords: enum "NO DESCRIPTION"
+#TextureSlot|LampTextureSlot.use_map_color -> use_map_color: boolean "Lets the texture affect the basic color of the lamp"
+#TextureSlot|LampTextureSlot.use_map_shadow -> use_map_shadow: boolean "Lets the texture affect the shadow color of the lamp"
+#+ * TextureSlot|MaterialTextureSlot.alpha_factor -> alpha_factor: float "Amount texture affects alpha"
+#+ * TextureSlot|MaterialTextureSlot.ambient_factor -> ambient_factor: float "Amount texture affects ambient"
+#TextureSlot|MaterialTextureSlot.color_emission_factor -> color_emission_factor: float "Amount texture affects emission color"
+#+ * TextureSlot|MaterialTextureSlot.density_factor -> density_factor: float "Amount texture affects density"
+#TextureSlot|MaterialTextureSlot.diffuse_color_factor -> diffuse_color_factor: float "Amount texture affects diffuse color"
+#+ * TextureSlot|MaterialTextureSlot.diffuse_factor -> diffuse_factor: float "Amount texture affects diffuse reflectivity"
+#+ * TextureSlot|MaterialTextureSlot.displacement_factor -> displacement_factor: float "Amount texture displaces the surface"
+#+ * TextureSlot|MaterialTextureSlot.emission_factor -> emission_factor: float "Amount texture affects emission"
+#+ * TextureSlot|MaterialTextureSlot.emit_factor -> emit_factor: float "Amount texture affects emission"
+#+ * TextureSlot|MaterialTextureSlot.hardness_factor -> hardness_factor: float "Amount texture affects hardness"
+#+ * TextureSlot|MaterialTextureSlot.mapping -> mapping: enum "NO DESCRIPTION"
+#TextureSlot|MaterialTextureSlot.mapping_x -> mapping_x: enum "NO DESCRIPTION"
+#TextureSlot|MaterialTextureSlot.mapping_y -> mapping_y: enum "NO DESCRIPTION"
+#TextureSlot|MaterialTextureSlot.mapping_z -> mapping_z: enum "NO DESCRIPTION"
+#+ * TextureSlot|MaterialTextureSlot.mirror_factor -> mirror_factor: float "Amount texture affects mirror color"
+#+ * TextureSlot|MaterialTextureSlot.normal_factor -> normal_factor: float "Amount texture affects normal values"
+#+ * TextureSlot|MaterialTextureSlot.normal_map_space -> normal_map_space: enum "NO DESCRIPTION"
+#+ * TextureSlot|MaterialTextureSlot.object -> object: pointer "Object to use for mapping with Object texture coordinates"
+#+ * TextureSlot|MaterialTextureSlot.raymir_factor -> raymir_factor: float "Amount texture affects ray mirror"
+#TextureSlot|MaterialTextureSlot.reflection_color_factor -> reflection_color_factor: float "Amount texture affects color of out-scattered light"
+#+ * TextureSlot|MaterialTextureSlot.reflection_factor -> reflection_factor: float "Amount texture affects brightness of out-scattered light"
+#+ * TextureSlot|MaterialTextureSlot.scattering_factor -> scattering_factor: float "Amount texture affects scattering"
+#TextureSlot|MaterialTextureSlot.specular_color_factor -> specular_color_factor: float "Amount texture affects specular color"
+#+ * TextureSlot|MaterialTextureSlot.specular_factor -> specular_factor: float "Amount texture affects specular reflectivity"
+#TextureSlot|MaterialTextureSlot.texture_coords -> texture_coords: enum "NO DESCRIPTION"
+#+ * TextureSlot|MaterialTextureSlot.translucency_factor -> translucency_factor: float "Amount texture affects translucency"
+#TextureSlot|MaterialTextureSlot.transmission_color_factor -> transmission_color_factor: float "Amount texture affects result color after light has been scattered/absorbed"
+#+ * TextureSlot|MaterialTextureSlot.use -> use: boolean "Enable this material texture slot"
+#TextureSlot|MaterialTextureSlot.use_from_dupli -> use_from_dupli: boolean "Duplis instanced from verts, faces or particles, inherit texture coordinate from their parent"
+#TextureSlot|MaterialTextureSlot.use_from_original -> use_from_original: boolean "Duplis derive their object coordinates from the original objects transformation"
+#TextureSlot|MaterialTextureSlot.use_map_alpha -> use_map_alpha: boolean "Causes the texture to affect the alpha value"
+#TextureSlot|MaterialTextureSlot.use_map_ambient -> use_map_ambient: boolean "Causes the texture to affect the value of ambient"
+#TextureSlot|MaterialTextureSlot.use_map_color_diffuse -> use_map_color_diffuse: boolean "Causes the texture to affect basic color of the material"
+#TextureSlot|MaterialTextureSlot.use_map_color_emission -> use_map_color_emission: boolean "Causes the texture to affect the color of emission"
+#TextureSlot|MaterialTextureSlot.use_map_color_reflection -> use_map_color_reflection: boolean "Causes the texture to affect the color of scattered light"
+#TextureSlot|MaterialTextureSlot.use_map_color_spec -> use_map_color_spec: boolean "Causes the texture to affect the specularity color"
+#TextureSlot|MaterialTextureSlot.use_map_color_transmission -> use_map_color_transmission: boolean "Causes the texture to affect the result color after other light has been scattered/absorbed"
+#TextureSlot|MaterialTextureSlot.use_map_density -> use_map_density: boolean "Causes the texture to affect the volumes density"
+#TextureSlot|MaterialTextureSlot.use_map_diffuse -> use_map_diffuse: boolean "Causes the texture to affect the value of the materials diffuse reflectivity"
+#TextureSlot|MaterialTextureSlot.use_map_displacement -> use_map_displacement: boolean "Let the texture displace the surface"
+#TextureSlot|MaterialTextureSlot.use_map_emission -> use_map_emission: boolean "Causes the texture to affect the volumes emission"
+#TextureSlot|MaterialTextureSlot.use_map_emit -> use_map_emit: boolean "Causes the texture to affect the emit value"
+#TextureSlot|MaterialTextureSlot.use_map_hardness -> use_map_hardness: boolean "Causes the texture to affect the hardness value"
+#TextureSlot|MaterialTextureSlot.use_map_mirror -> use_map_mirror: boolean "Causes the texture to affect the mirror color"
+#TextureSlot|MaterialTextureSlot.use_map_normal -> use_map_normal: boolean "Causes the texture to affect the rendered normal"
+#TextureSlot|MaterialTextureSlot.use_map_raymir -> use_map_raymir: boolean "Causes the texture to affect the ray-mirror value"
+#TextureSlot|MaterialTextureSlot.use_map_reflect -> use_map_reflect: boolean "Causes the texture to affect the reflected lights brightness"
+#TextureSlot|MaterialTextureSlot.use_map_scatter -> use_map_scatter: boolean "Causes the texture to affect the volumes scattering"
+#TextureSlot|MaterialTextureSlot.use_map_specular -> use_map_specular: boolean "Causes the texture to affect the value of specular reflectivity"
+#TextureSlot|MaterialTextureSlot.use_map_translucency -> use_map_translucency: boolean "Causes the texture to affect the translucency value"
+#TextureSlot|MaterialTextureSlot.use_map_warp -> use_map_warp: boolean "Let the texture warp texture coordinates of next channels"
+#TextureSlot|MaterialTextureSlot.use_old_bump -> use_old_bump: boolean "Use old bump mapping (backwards compatibility option)"
+#+ * TextureSlot|MaterialTextureSlot.uv_layer -> uv_layer: string "UV layer to use for mapping with UV texture coordinates"
+#+ * TextureSlot|MaterialTextureSlot.warp_factor -> warp_factor: float "Amount texture affects texture coordinates of next channels"
+#+ * TextureSlot|WorldTextureSlot.blend_factor -> blend_factor: float "Amount texture affects color progression of the background"
+#+ * TextureSlot|WorldTextureSlot.horizon_factor -> horizon_factor: float "Amount texture affects color of the horizon"
+#+ * TextureSlot|WorldTextureSlot.object -> object: pointer "Object to use for mapping with Object texture coordinates"
+#TextureSlot|WorldTextureSlot.texture_coords -> texture_coords: enum "Texture coordinates used to map the texture onto the background"
+#TextureSlot|WorldTextureSlot.use_map_blend -> use_map_blend: boolean "Affect the color progression of the background"
+#TextureSlot|WorldTextureSlot.use_map_horizon -> use_map_horizon: boolean "Affect the color of the horizon"
+#TextureSlot|WorldTextureSlot.use_map_zenith_down -> use_map_zenith_down: boolean "Affect the color of the zenith below"
+#TextureSlot|WorldTextureSlot.use_map_zenith_up -> use_map_zenith_up: boolean "Affect the color of the zenith above"
+#+ * TextureSlot|WorldTextureSlot.zenith_down_factor -> zenith_down_factor: float "Amount texture affects color of the zenith below"
+#+ * TextureSlot|WorldTextureSlot.zenith_up_factor -> zenith_up_factor: float "Amount texture affects color of the zenith above"
+#+ * 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 "NO DESCRIPTION"
+#+ * 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[3] "NO DESCRIPTION"
+#+ * ThemeAudioWindow.button -> button: float[3] "NO DESCRIPTION"
+#+ * ThemeAudioWindow.button_text -> button_text: float[3] "NO DESCRIPTION"
+#+ * ThemeAudioWindow.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeAudioWindow.button_title -> button_title: float[3] "NO DESCRIPTION"
+#+ * ThemeAudioWindow.frame_current -> frame_current: float[3] "NO DESCRIPTION"
+#+ * ThemeAudioWindow.grid -> grid: float[3] "NO DESCRIPTION"
+#+ * ThemeAudioWindow.header -> header: float[3] "NO DESCRIPTION"
+#+ * ThemeAudioWindow.header_text -> header_text: float[3] "NO DESCRIPTION"
+#+ * ThemeAudioWindow.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeAudioWindow.text -> text: float[3] "NO DESCRIPTION"
+#+ * ThemeAudioWindow.text_hi -> text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeAudioWindow.title -> title: float[3] "NO DESCRIPTION"
+#+ * ThemeAudioWindow.window_sliders -> window_sliders: float[3] "NO DESCRIPTION"
+#+ * ThemeBoneColorSet.active -> active: float[3] "Color used for active bones"
+#+ * ThemeBoneColorSet.normal -> normal: float[3] "Color used for the surface of bones"
+#+ * ThemeBoneColorSet.select -> select: float[3] "Color used for selected bones"
+#ThemeBoneColorSet.show_colored_constraints -> show_colored_constraints: boolean "Allow the use of colors indicating constraints/keyed status"
+#+ * ThemeConsole.back -> back: float[3] "NO DESCRIPTION"
+#+ * ThemeConsole.button -> button: float[3] "NO DESCRIPTION"
+#+ * ThemeConsole.button_text -> button_text: float[3] "NO DESCRIPTION"
+#+ * ThemeConsole.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeConsole.button_title -> button_title: float[3] "NO DESCRIPTION"
+#+ * ThemeConsole.cursor -> cursor: float[3] "NO DESCRIPTION"
+#+ * ThemeConsole.header -> header: float[3] "NO DESCRIPTION"
+#+ * ThemeConsole.header_text -> header_text: float[3] "NO DESCRIPTION"
+#+ * ThemeConsole.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeConsole.line_error -> line_error: float[3] "NO DESCRIPTION"
+#+ * ThemeConsole.line_info -> line_info: float[3] "NO DESCRIPTION"
+#+ * ThemeConsole.line_input -> line_input: float[3] "NO DESCRIPTION"
+#+ * ThemeConsole.line_output -> line_output: float[3] "NO DESCRIPTION"
+#+ * ThemeConsole.text -> text: float[3] "NO DESCRIPTION"
+#+ * ThemeConsole.text_hi -> text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeConsole.title -> title: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.active_channels_group -> active_channels_group: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.back -> back: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.button -> button: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.button_text -> button_text: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.button_title -> button_title: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.channel_group -> channel_group: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.channels -> channels: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.channels_selected -> channels_selected: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.dopesheet_channel -> dopesheet_channel: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.dopesheet_subchannel -> dopesheet_subchannel: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.frame_current -> frame_current: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.grid -> grid: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.header -> header: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.header_text -> header_text: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.list -> list: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.list_text -> list_text: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.list_text_hi -> list_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.list_title -> list_title: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.long_key -> long_key: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.long_key_selected -> long_key_selected: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.text -> text: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.text_hi -> text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.title -> title: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.value_sliders -> value_sliders: float[3] "NO DESCRIPTION"
+#+ * ThemeDopeSheet.view_sliders -> view_sliders: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.active_file -> active_file: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.active_file_text -> active_file_text: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.back -> back: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.button -> button: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.button_text -> button_text: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.button_title -> button_title: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.header -> header: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.header_text -> header_text: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.list -> list: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.list_text -> list_text: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.list_text_hi -> list_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.list_title -> list_title: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.scroll_handle -> scroll_handle: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.scrollbar -> scrollbar: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.selected_file -> selected_file: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.text -> text: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.text_hi -> text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.tiles -> tiles: float[3] "NO DESCRIPTION"
+#+ * ThemeFileBrowser.title -> title: float[3] "NO DESCRIPTION"
+#+ * ThemeFontStyle.font_kerning_style -> font_kerning_style: enum "Which style to use for font kerning"
+#+ * ThemeFontStyle.points -> points: int "NO DESCRIPTION"
+#+ * ThemeFontStyle.shadow -> shadow: int "Shadow size in pixels (0, 3 and 5 supported)"
+#ThemeFontStyle.shadow_offset_x -> shadow_offset_x: int "Shadow offset in pixels"
+#ThemeFontStyle.shadow_offset_y -> shadow_offset_y: int "Shadow offset in pixels"
+#+ * ThemeFontStyle.shadowalpha -> shadowalpha: float "NO DESCRIPTION"
+#+ * ThemeFontStyle.shadowcolor -> shadowcolor: float "Shadow color in grey value"
+#+ * ThemeGraphEditor.active_channels_group -> active_channels_group: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.back -> back: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.button -> button: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.button_text -> button_text: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.button_title -> button_title: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.channel_group -> channel_group: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.channels_region -> channels_region: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.dopesheet_channel -> dopesheet_channel: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.dopesheet_subchannel -> dopesheet_subchannel: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.frame_current -> frame_current: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.grid -> grid: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.handle_align -> handle_align: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.handle_auto -> handle_auto: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.handle_free -> handle_free: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.handle_sel_align -> handle_sel_align: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.handle_sel_auto -> handle_sel_auto: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.handle_sel_free -> handle_sel_free: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.handle_sel_vect -> handle_sel_vect: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.handle_vect -> handle_vect: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.handle_vertex -> handle_vertex: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.handle_vertex_select -> handle_vertex_select: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.handle_vertex_size -> handle_vertex_size: int "NO DESCRIPTION"
+#+ * ThemeGraphEditor.header -> header: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.header_text -> header_text: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.lastsel_point -> lastsel_point: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.list -> list: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.list_text -> list_text: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.list_text_hi -> list_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.list_title -> list_title: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.panel -> panel: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.text -> text: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.text_hi -> text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.title -> title: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.vertex -> vertex: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.vertex_select -> vertex_select: float[3] "NO DESCRIPTION"
+#+ * ThemeGraphEditor.vertex_size -> vertex_size: int "NO DESCRIPTION"
+#+ * ThemeGraphEditor.window_sliders -> window_sliders: float[3] "NO DESCRIPTION"
+#+ * ThemeImageEditor.back -> back: float[3] "NO DESCRIPTION"
+#+ * ThemeImageEditor.button -> button: float[3] "NO DESCRIPTION"
+#+ * ThemeImageEditor.button_text -> button_text: float[3] "NO DESCRIPTION"
+#+ * ThemeImageEditor.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeImageEditor.button_title -> button_title: float[3] "NO DESCRIPTION"
+#+ * ThemeImageEditor.editmesh_active -> editmesh_active: float[4] "NO DESCRIPTION"
+#+ * ThemeImageEditor.face -> face: float[4] "NO DESCRIPTION"
+#+ * ThemeImageEditor.face_dot -> face_dot: float[3] "NO DESCRIPTION"
+#+ * ThemeImageEditor.face_select -> face_select: float[4] "NO DESCRIPTION"
+#+ * ThemeImageEditor.facedot_size -> facedot_size: int "NO DESCRIPTION"
+#+ * ThemeImageEditor.header -> header: float[3] "NO DESCRIPTION"
+#+ * ThemeImageEditor.header_text -> header_text: float[3] "NO DESCRIPTION"
+#+ * ThemeImageEditor.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeImageEditor.scope_back -> scope_back: float[4] "NO DESCRIPTION"
+#+ * ThemeImageEditor.text -> text: float[3] "NO DESCRIPTION"
+#+ * ThemeImageEditor.text_hi -> text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeImageEditor.title -> title: float[3] "NO DESCRIPTION"
+#+ * ThemeImageEditor.vertex -> vertex: float[3] "NO DESCRIPTION"
+#+ * ThemeImageEditor.vertex_select -> vertex_select: float[3] "NO DESCRIPTION"
+#+ * ThemeImageEditor.vertex_size -> vertex_size: int "NO DESCRIPTION"
+#+ * ThemeInfo.back -> back: float[3] "NO DESCRIPTION"
+#+ * ThemeInfo.button -> button: float[3] "NO DESCRIPTION"
+#+ * ThemeInfo.button_text -> button_text: float[3] "NO DESCRIPTION"
+#+ * ThemeInfo.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeInfo.button_title -> button_title: float[3] "NO DESCRIPTION"
+#+ * ThemeInfo.header -> header: float[3] "NO DESCRIPTION"
+#+ * ThemeInfo.header_text -> header_text: float[3] "NO DESCRIPTION"
+#+ * ThemeInfo.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeInfo.text -> text: float[3] "NO DESCRIPTION"
+#+ * ThemeInfo.text_hi -> text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeInfo.title -> title: float[3] "NO DESCRIPTION"
+#+ * ThemeLogicEditor.back -> back: float[3] "NO DESCRIPTION"
+#+ * ThemeLogicEditor.button -> button: float[3] "NO DESCRIPTION"
+#+ * ThemeLogicEditor.button_text -> button_text: float[3] "NO DESCRIPTION"
+#+ * ThemeLogicEditor.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeLogicEditor.button_title -> button_title: float[3] "NO DESCRIPTION"
+#+ * ThemeLogicEditor.header -> header: float[3] "NO DESCRIPTION"
+#+ * ThemeLogicEditor.header_text -> header_text: float[3] "NO DESCRIPTION"
+#+ * ThemeLogicEditor.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeLogicEditor.panel -> panel: float[3] "NO DESCRIPTION"
+#+ * ThemeLogicEditor.text -> text: float[3] "NO DESCRIPTION"
+#+ * ThemeLogicEditor.text_hi -> text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeLogicEditor.title -> title: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.back -> back: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.bars -> bars: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.bars_selected -> bars_selected: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.button -> button: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.button_text -> button_text: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.button_title -> button_title: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.frame_current -> frame_current: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.grid -> grid: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.header -> header: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.header_text -> header_text: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.list -> list: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.list_text -> list_text: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.list_text_hi -> list_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.list_title -> list_title: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.strips -> strips: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.strips_selected -> strips_selected: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.text -> text: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.text_hi -> text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.title -> title: float[3] "NO DESCRIPTION"
+#+ * ThemeNLAEditor.view_sliders -> view_sliders: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.back -> back: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.button -> button: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.button_text -> button_text: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.button_title -> button_title: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.converter_node -> converter_node: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.group_node -> group_node: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.header -> header: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.header_text -> header_text: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.in_out_node -> in_out_node: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.list -> list: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.list_text -> list_text: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.list_text_hi -> list_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.list_title -> list_title: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.node_backdrop -> node_backdrop: float[4] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.operator_node -> operator_node: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.selected_text -> selected_text: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.text -> text: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.text_hi -> text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.title -> title: float[3] "NO DESCRIPTION"
+#ThemeNodeEditor.wire -> wire: float[3] "NO DESCRIPTION"
+#+ * ThemeNodeEditor.wire_select -> wire_select: float[3] "NO DESCRIPTION"
+#+ * ThemeOutliner.back -> back: float[3] "NO DESCRIPTION"
+#+ * ThemeOutliner.button -> button: float[3] "NO DESCRIPTION"
+#+ * ThemeOutliner.button_text -> button_text: float[3] "NO DESCRIPTION"
+#+ * ThemeOutliner.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeOutliner.button_title -> button_title: float[3] "NO DESCRIPTION"
+#+ * ThemeOutliner.header -> header: float[3] "NO DESCRIPTION"
+#+ * ThemeOutliner.header_text -> header_text: float[3] "NO DESCRIPTION"
+#+ * ThemeOutliner.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeOutliner.text -> text: float[3] "NO DESCRIPTION"
+#+ * ThemeOutliner.text_hi -> text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeOutliner.title -> title: float[3] "NO DESCRIPTION"
+#+ * ThemeProperties.back -> back: float[3] "NO DESCRIPTION"
+#+ * ThemeProperties.button -> button: float[3] "NO DESCRIPTION"
+#+ * ThemeProperties.button_text -> button_text: float[3] "NO DESCRIPTION"
+#+ * ThemeProperties.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeProperties.button_title -> button_title: float[3] "NO DESCRIPTION"
+#+ * ThemeProperties.header -> header: float[3] "NO DESCRIPTION"
+#+ * ThemeProperties.header_text -> header_text: float[3] "NO DESCRIPTION"
+#+ * ThemeProperties.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeProperties.panel -> panel: float[3] "NO DESCRIPTION"
+#+ * ThemeProperties.text -> text: float[3] "NO DESCRIPTION"
+#+ * ThemeProperties.text_hi -> text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeProperties.title -> title: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.audio_strip -> audio_strip: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.back -> back: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.button -> button: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.button_text -> button_text: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.button_title -> button_title: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.draw_action -> draw_action: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.effect_strip -> effect_strip: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.frame_current -> frame_current: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.grid -> grid: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.header -> header: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.header_text -> header_text: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.image_strip -> image_strip: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.keyframe -> keyframe: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.meta_strip -> meta_strip: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.movie_strip -> movie_strip: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.plugin_strip -> plugin_strip: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.scene_strip -> scene_strip: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.text -> text: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.text_hi -> text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.title -> title: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.transition_strip -> transition_strip: float[3] "NO DESCRIPTION"
+#+ * ThemeSequenceEditor.window_sliders -> window_sliders: float[3] "NO DESCRIPTION"
+#ThemeStyle.group_label -> group_label: pointer, "(read-only)"
+#ThemeStyle.panel_title -> panel_title: pointer, "(read-only)"
+#+ * ThemeStyle.panelzoom -> panelzoom: float "Default zoom level for panel areas"
+#+ * ThemeStyle.widget -> widget: pointer, "(read-only)"
+#ThemeStyle.widget_label -> widget_label: pointer, "(read-only)"
+#+ * ThemeTextEditor.back -> back: float[3] "NO DESCRIPTION"
+#+ * ThemeTextEditor.button -> button: float[3] "NO DESCRIPTION"
+#+ * ThemeTextEditor.button_text -> button_text: float[3] "NO DESCRIPTION"
+#+ * ThemeTextEditor.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeTextEditor.button_title -> button_title: float[3] "NO DESCRIPTION"
+#+ * ThemeTextEditor.cursor -> cursor: float[3] "NO DESCRIPTION"
+#+ * ThemeTextEditor.header -> header: float[3] "NO DESCRIPTION"
+#+ * ThemeTextEditor.header_text -> header_text: float[3] "NO DESCRIPTION"
+#+ * ThemeTextEditor.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeTextEditor.line_numbers_background -> line_numbers_background: float[3] "NO DESCRIPTION"
+#+ * ThemeTextEditor.scroll_bar -> scroll_bar: float[3] "NO DESCRIPTION"
+#+ * ThemeTextEditor.selected_text -> selected_text: float[3] "NO DESCRIPTION"
+#+ * ThemeTextEditor.syntax_builtin -> syntax_builtin: float[3] "NO DESCRIPTION"
+#+ * ThemeTextEditor.syntax_comment -> syntax_comment: float[3] "NO DESCRIPTION"
+#+ * ThemeTextEditor.syntax_numbers -> syntax_numbers: float[3] "NO DESCRIPTION"
+#+ * ThemeTextEditor.syntax_special -> syntax_special: float[3] "NO DESCRIPTION"
+#+ * ThemeTextEditor.syntax_string -> syntax_string: float[3] "NO DESCRIPTION"
+#+ * ThemeTextEditor.text -> text: float[3] "NO DESCRIPTION"
+#+ * ThemeTextEditor.text_hi -> text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeTextEditor.title -> title: float[3] "NO DESCRIPTION"
+#+ * ThemeTimeline.back -> back: float[3] "NO DESCRIPTION"
+#+ * ThemeTimeline.button -> button: float[3] "NO DESCRIPTION"
+#+ * ThemeTimeline.button_text -> button_text: float[3] "NO DESCRIPTION"
+#+ * ThemeTimeline.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeTimeline.button_title -> button_title: float[3] "NO DESCRIPTION"
+#+ * ThemeTimeline.frame_current -> frame_current: float[3] "NO DESCRIPTION"
+#+ * ThemeTimeline.grid -> grid: float[3] "NO DESCRIPTION"
+#+ * ThemeTimeline.header -> header: float[3] "NO DESCRIPTION"
+#+ * ThemeTimeline.header_text -> header_text: float[3] "NO DESCRIPTION"
+#+ * ThemeTimeline.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeTimeline.text -> text: float[3] "NO DESCRIPTION"
+#+ * ThemeTimeline.text_hi -> text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeTimeline.title -> title: float[3] "NO DESCRIPTION"
+#+ * ThemeUserInterface.icon_file -> icon_file: string "NO DESCRIPTION"
+#+ * 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[3] "NO DESCRIPTION"
+#+ * ThemeUserPreferences.button -> button: float[3] "NO DESCRIPTION"
+#+ * ThemeUserPreferences.button_text -> button_text: float[3] "NO DESCRIPTION"
+#+ * ThemeUserPreferences.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeUserPreferences.button_title -> button_title: float[3] "NO DESCRIPTION"
+#+ * ThemeUserPreferences.header -> header: float[3] "NO DESCRIPTION"
+#+ * ThemeUserPreferences.header_text -> header_text: float[3] "NO DESCRIPTION"
+#+ * ThemeUserPreferences.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeUserPreferences.text -> text: float[3] "NO DESCRIPTION"
+#+ * ThemeUserPreferences.text_hi -> text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeUserPreferences.title -> title: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.act_spline -> act_spline: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.back -> back: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.bone_pose -> bone_pose: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.bone_solid -> bone_solid: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.button -> button: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.button_text -> button_text: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.button_title -> button_title: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.edge_crease -> edge_crease: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.edge_facesel -> edge_facesel: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.edge_seam -> edge_seam: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.edge_select -> edge_select: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.edge_sharp -> edge_sharp: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.editmesh_active -> editmesh_active: float[4] "NO DESCRIPTION"
+#+ * ThemeView3D.face -> face: float[4] "NO DESCRIPTION"
+#+ * ThemeView3D.face_dot -> face_dot: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.face_select -> face_select: float[4] "NO DESCRIPTION"
+#+ * ThemeView3D.facedot_size -> facedot_size: int "NO DESCRIPTION"
+#+ * ThemeView3D.frame_current -> frame_current: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.grid -> grid: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.handle_align -> handle_align: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.handle_auto -> handle_auto: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.handle_free -> handle_free: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.handle_sel_align -> handle_sel_align: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.handle_sel_auto -> handle_sel_auto: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.handle_sel_free -> handle_sel_free: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.handle_sel_vect -> handle_sel_vect: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.handle_vect -> handle_vect: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.header -> header: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.header_text -> header_text: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.lamp -> lamp: float[4] "NO DESCRIPTION"
+#+ * ThemeView3D.lastsel_point -> lastsel_point: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.normal -> normal: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.nurb_sel_uline -> nurb_sel_uline: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.nurb_sel_vline -> nurb_sel_vline: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.nurb_uline -> nurb_uline: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.nurb_vline -> nurb_vline: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.object_active -> object_active: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.object_grouped -> object_grouped: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.object_grouped_active -> object_grouped_active: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.object_selected -> object_selected: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.panel -> panel: float[4] "NO DESCRIPTION"
+#+ * ThemeView3D.text -> text: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.text_hi -> text_hi: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.title -> title: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.transform -> transform: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.vertex -> vertex: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.vertex_normal -> vertex_normal: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.vertex_select -> vertex_select: float[3] "NO DESCRIPTION"
+#+ * ThemeView3D.vertex_size -> vertex_size: int "NO DESCRIPTION"
+#+ * ThemeView3D.wire -> wire: float[3] "NO DESCRIPTION"
+#+ * ThemeWidgetColors.inner -> inner: float[4] "NO DESCRIPTION"
+#+ * ThemeWidgetColors.inner_sel -> inner_sel: float[4] "NO DESCRIPTION"
+#+ * ThemeWidgetColors.item -> item: float[4] "NO DESCRIPTION"
+#+ * ThemeWidgetColors.outline -> outline: float[3] "NO DESCRIPTION"
+#+ * ThemeWidgetColors.shadedown -> shadedown: int "NO DESCRIPTION"
+#+ * ThemeWidgetColors.shadetop -> shadetop: int "NO DESCRIPTION"
+#ThemeWidgetColors.show_shaded -> show_shaded: boolean "NO DESCRIPTION"
+#+ * ThemeWidgetColors.text -> text: float[3] "NO DESCRIPTION"
+#+ * ThemeWidgetColors.text_sel -> text_sel: float[3] "NO DESCRIPTION"
+#+ * ThemeWidgetStateColors.blend -> blend: float "NO DESCRIPTION"
+#+ * ThemeWidgetStateColors.inner_anim -> inner_anim: float[3] "NO DESCRIPTION"
+#+ * ThemeWidgetStateColors.inner_anim_sel -> inner_anim_sel: float[3] "NO DESCRIPTION"
+#+ * ThemeWidgetStateColors.inner_driven -> inner_driven: float[3] "NO DESCRIPTION"
+#+ * ThemeWidgetStateColors.inner_driven_sel -> inner_driven_sel: float[3] "NO DESCRIPTION"
+#+ * ThemeWidgetStateColors.inner_key -> inner_key: float[3] "NO DESCRIPTION"
+#+ * ThemeWidgetStateColors.inner_key_sel -> inner_key_sel: float[3] "NO DESCRIPTION"
+#+ * 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 "NO DESCRIPTION"
+#+ * TimelineMarker.select -> select: boolean "Marker selection state"
+#ToolSettings.auto_keying_mode -> auto_keying_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.mesh_select_mode -> mesh_select_mode: boolean[3] "Which mesh elements selection works on"
+#+ * ToolSettings.normal_size -> normal_size: float "Display size for normals in the 3D view"
+#+ * ToolSettings.particle_edit -> particle_edit: pointer, "(read-only)"
+#ToolSettings.proportional_edit -> proportional_edit: enum "Proportional editing mode"
+#ToolSettings.proportional_edit_falloff -> proportional_edit_falloff: enum "Falloff type for proportional editing mode"
+#+ * ToolSettings.sculpt -> sculpt: pointer, "(read-only)"
+#+ * ToolSettings.sculpt_paint_use_unified_size -> sculpt_paint_use_unified_size: boolean "Instead of per brush radius, the radius is shared across brushes"
+#+ * ToolSettings.sculpt_paint_use_unified_strength -> sculpt_paint_use_unified_strength: boolean "Instead of per brush strength, the strength is shared across brushes"
+#ToolSettings.show_uv_local_view -> show_uv_local_view: boolean "Draw only faces with the currently displayed image assigned"
+#+ * 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.use_auto_normalize -> use_auto_normalize: boolean "Ensure all bone-deforming vertex groups add up to 1.0 while weight painting"
+#ToolSettings.use_bone_sketching -> use_bone_sketching: boolean "DOC BROKEN"
+#ToolSettings.use_etch_autoname -> use_etch_autoname: boolean "DOC BROKEN"
+#ToolSettings.use_etch_overdraw -> use_etch_overdraw: boolean "DOC BROKEN"
+#ToolSettings.use_etch_quick -> use_etch_quick: boolean "DOC BROKEN"
+#ToolSettings.use_keyframe_insert_auto -> use_keyframe_insert_auto: boolean "Automatic keyframe insertion for Objects and Bones"
+#ToolSettings.use_mesh_automerge -> use_mesh_automerge: boolean "Automatically merge vertices moved to the same location"
+#ToolSettings.use_proportional_edit_objects -> use_proportional_edit_objects: boolean "Proportional editing object mode"
+#ToolSettings.use_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.use_snap -> use_snap: boolean "Snap during transform"
+#ToolSettings.use_snap_align_rotation -> use_snap_align_rotation: boolean "Align rotation with the snapping target"
+#ToolSettings.use_snap_peel_object -> use_snap_peel_object: boolean "Consider objects as whole when finding volume center"
+#ToolSettings.use_snap_project -> use_snap_project: boolean "Project vertices on the surface of other objects"
+#ToolSettings.use_uv_select_sync -> use_uv_select_sync: boolean "Keep UV and edit mode mesh selection in sync"
+#ToolSettings.uv_select_mode -> uv_select_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)"
+#+ * TransformOrientation.matrix -> matrix: float[9] "NO DESCRIPTION"
+#+ * TransformOrientation.name -> name: string "NO DESCRIPTION"
+#+ * UILayout.alignment -> alignment: enum "NO DESCRIPTION"
+#+ * UILayout.operator_context -> operator_context: enum "NO DESCRIPTION"
+#+ * UILayout.scale_x -> scale_x: float "Scale factor along the X for items in this (sub)layout."
+#+ * UILayout.scale_y -> scale_y: float "Scale factor along the Y for items in this (sub)layout."
+ + * UILayout.active -> show_active: boolean "NO DESCRIPTION"
+ + * UILayout.enabled -> show_enabled: boolean "When false, this (sub)layout is greyed out."
+#+ * UVProjector.object -> object: pointer "Object to use as projector transform"
+#UVTextures.active -> active: pointer "Active UV texture"
+#+ * 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"
+#+ * UnitSettings.use_separate -> use_separate: boolean "Display units in pairs"
+#+ * 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.ui_styles -> ui_styles: 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 "NO DESCRIPTION"
+#+ * UserPreferencesEdit.keyframe_new_interpolation_type -> keyframe_new_interpolation_type: enum "NO DESCRIPTION"
+#+ * 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 views direction or the world coordinates"
+#UserPreferencesEdit.sculpt_paint_overlay_color -> sculpt_paint_overlay_color: float[3] "Color of texture overlay"
+#+ * 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)"
+#+ * UserPreferencesEdit.use_auto_keying -> use_auto_keying: boolean "Automatic keyframe insertion for Objects and Bones"
+#UserPreferencesEdit.use_drag_immediately -> use_drag_immediately: boolean "Moving things with a mouse drag confirms when releasing the button"
+#UserPreferencesEdit.use_duplicate_action -> use_duplicate_action: boolean "Causes actions to be duplicated with the object"
+#UserPreferencesEdit.use_duplicate_armature -> use_duplicate_armature: boolean "Causes armature data to be duplicated with the object"
+#UserPreferencesEdit.use_duplicate_curve -> use_duplicate_curve: boolean "Causes curve data to be duplicated with the object"
+#UserPreferencesEdit.use_duplicate_fcurve -> use_duplicate_fcurve: boolean "Causes F-curve data to be duplicated with the object"
+#UserPreferencesEdit.use_duplicate_lamp -> use_duplicate_lamp: boolean "Causes lamp data to be duplicated with the object"
+#UserPreferencesEdit.use_duplicate_material -> use_duplicate_material: boolean "Causes material data to be duplicated with the object"
+#UserPreferencesEdit.use_duplicate_mesh -> use_duplicate_mesh: boolean "Causes mesh data to be duplicated with the object"
+#UserPreferencesEdit.use_duplicate_metaball -> use_duplicate_metaball: boolean "Causes metaball data to be duplicated with the object"
+#UserPreferencesEdit.use_duplicate_particle -> use_duplicate_particle: boolean "Causes particle systems to be duplicated with the object"
+#UserPreferencesEdit.use_duplicate_surface -> use_duplicate_surface: boolean "Causes surface data to be duplicated with the object"
+#UserPreferencesEdit.use_duplicate_text -> use_duplicate_text: boolean "Causes text data to be duplicated with the object"
+#UserPreferencesEdit.use_duplicate_texture -> use_duplicate_texture: boolean "Causes texture data to be duplicated with the object"
+#UserPreferencesEdit.use_enter_edit_mode -> use_enter_edit_mode: boolean "Enter Edit Mode automatically after adding a new object"
+#UserPreferencesEdit.use_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.use_grease_pencil_simplify_stroke -> use_grease_pencil_simplify_stroke: boolean "Simplify the final stroke"
+#UserPreferencesEdit.use_grease_pencil_smooth_stroke -> use_grease_pencil_smooth_stroke: boolean "Smooth the final stroke"
+#UserPreferencesEdit.use_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.use_keyframe_insert_available -> use_keyframe_insert_available: boolean "Automatic keyframe insertion in available curves"
+#UserPreferencesEdit.use_keyframe_insert_keyingset -> use_keyframe_insert_keyingset: boolean "Automatic keyframe insertion using active Keying Set"
+#UserPreferencesEdit.use_keyframe_insert_needed -> use_keyframe_insert_needed: boolean "Keyframe insertion only when keyframe needed"
+#+ * 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.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.font_directory -> font_directory: string "The default directory to search for loading fonts"
+#+ * UserPreferencesFilePaths.image_editor -> image_editor: string "Path to an image editor"
+#+ * 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.script_directory -> script_directory: string "The default directory to search for Python scripts (resets python module search path: sys.path)"
+#+ * UserPreferencesFilePaths.sequence_plugin_directory -> sequence_plugin_directory: string "The default directory to search for sequence plugins"
+#UserPreferencesFilePaths.show_hidden_files_datablocks -> show_hidden_files_datablocks: boolean "Hide files/datablocks that start with a dot(.*)"
+#UserPreferencesFilePaths.sound_directory -> sound_directory: string "The default directory to search for sounds"
+#+ * UserPreferencesFilePaths.temporary_directory -> temporary_directory: string "The directory for storing temporary save files"
+#UserPreferencesFilePaths.texture_directory -> texture_directory: string "The default directory to search for textures"
+#+ * UserPreferencesFilePaths.texture_plugin_directory -> texture_plugin_directory: string "The default directory to search for texture plugins"
+#UserPreferencesFilePaths.use_auto_save_temporary_files -> use_auto_save_temporary_files: boolean "Automatic saving of temporary files"
+#UserPreferencesFilePaths.use_file_compression -> use_file_compression: boolean "Enable file compression when saving .blend files"
+#UserPreferencesFilePaths.use_filter_files -> use_filter_files: boolean "Display only files with extensions in the image select window"
+#UserPreferencesFilePaths.use_load_ui -> use_load_ui: boolean "Load user interface setup when loading .blend files"
+#+ * UserPreferencesFilePaths.use_relative_paths -> use_relative_paths: boolean "Default relative path option for the file selector"
+#UserPreferencesFilePaths.use_save_preview_images -> use_save_preview_images: boolean "Enables automatic saving of preview images in the .blend file"
+#+ * UserPreferencesInput.edited_keymaps -> edited_keymaps: collection, "(read-only)"
+#UserPreferencesInput.invert_mouse_wheel_zoom -> invert_mouse_wheel_zoom: boolean "Invert the axis of mouse movement for zooming"
+#UserPreferencesInput.invert_zoom_wheel -> invert_zoom_wheel: boolean "Swap the Mouse Wheel zoom direction"
+#UserPreferencesInput.mouse_double_click_time -> mouse_double_click_time: int "The time (in ms) for a double click"
+#+ * 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.use_emulate_numpad -> use_emulate_numpad: boolean "Causes the 1 to 0 keys to act as the numpad (useful for laptops)"
+#UserPreferencesInput.use_mouse_continuous -> use_mouse_continuous: boolean "Allow moving the mouse outside the view on some manipulations (transform, ui control drag)"
+#UserPreferencesInput.use_mouse_emulate_3_button -> use_mouse_emulate_3_button: boolean "Emulates Middle Mouse with Alt+LeftMouse (doesnt work with Left Mouse Select option)"
+#UserPreferencesInput.use_mouse_mmb_paste -> use_mouse_mmb_paste: boolean "In text window, paste with middle mouse button instead of panning"
+#UserPreferencesInput.view_rotate_method -> view_rotate_method: enum "Rotation style in the viewport"
+#UserPreferencesInput.view_zoom_axis -> view_zoom_axis: enum "Axis of mouse movement to zoom in or out on"
+#UserPreferencesInput.view_zoom_method -> view_zoom_method: enum "Which style to use for viewport scaling"
+#+ * UserPreferencesInput.wheel_scroll_lines -> wheel_scroll_lines: int "The number of lines scrolled at a time with the mouse wheel"
+#+ * 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.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_clip_alpha -> gl_clip_alpha: float "Clip alpha below this threshold in the 3D textured view"
+#+ * 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.use_antialiasing -> use_antialiasing: boolean "Use anti-aliasing for the 3D view (may impact redraw performance)"
+#UserPreferencesSystem.use_international_fonts -> use_international_fonts: boolean "Use international fonts"
+#+ * UserPreferencesSystem.use_mipmaps -> use_mipmaps: boolean "Scale textures for the 3D View (looks nicer but uses more memory and slows image reloading)"
+#UserPreferencesSystem.use_preview_images -> use_preview_images: boolean "Enables automatic saving of preview images in the .blend file (Windows only)"
+#UserPreferencesSystem.use_scripts_auto_execute -> use_scripts_auto_execute: boolean "Allow any .blend file to run scripts automatically (unsafe with blend files from an untrusted source)"
+#UserPreferencesSystem.use_tabs_as_spaces -> use_tabs_as_spaces: boolean "Automatically converts all new tabs into spaces for new and loaded text files"
+#+ * UserPreferencesSystem.use_textured_fonts -> use_textured_fonts: boolean "Use textures for drawing international fonts"
+#UserPreferencesSystem.use_translate_buttons -> use_translate_buttons: boolean "Translate button labels"
+#UserPreferencesSystem.use_translate_toolbox -> use_translate_toolbox: boolean "Translate toolbox menu"
+#UserPreferencesSystem.use_translate_tooltips -> use_translate_tooltips: boolean "Translate Tooltips"
+#UserPreferencesSystem.use_vertex_buffer_objects -> 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"
+#+ * 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 icons 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.rotation_angle -> rotation_angle: int "The rotation step for numerical pad keys (2 4 6 8)"
+#UserPreferencesView.show_column_layout -> show_column_layout: boolean "Use a column layout for toolbox"
+#UserPreferencesView.show_large_cursors -> show_large_cursors: boolean "Use large mouse cursors when available"
+#UserPreferencesView.show_manipulator -> show_manipulator: boolean "Use 3D transform manipulator"
+#+ * 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_object_info -> show_object_info: boolean "Display objects name and frame number in 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_tooltips -> show_tooltips: boolean "Display tooltips"
+#+ * UserPreferencesView.show_view_name -> show_view_name: boolean "Show the name of the views direction in each 3D View"
+#+ * 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.use_auto_perspective -> use_auto_perspective: boolean "Automatically switch between orthographic and perspective when changing from top/front/side views"
+#UserPreferencesView.use_directional_menus -> use_directional_menus: boolean "Otherwise menus, etc will always be top to bottom, left to right, no matter opening direction"
+#UserPreferencesView.use_global_pivot -> use_global_pivot: boolean "Lock the same rotation/scaling pivot in all 3D Views"
+#UserPreferencesView.use_global_scene -> use_global_scene: boolean "Forces the current Scene to be displayed in all Screens"
+#UserPreferencesView.use_mouse_auto_depth -> use_mouse_auto_depth: boolean "Use the depth under the mouse to improve view pan/rotate/zoom functionality"
+#UserPreferencesView.use_mouse_over_open -> use_mouse_over_open: boolean "Open menu buttons and pulldowns automatically when the mouse is hovering"
+#UserPreferencesView.use_rotate_around_active -> use_rotate_around_active: boolean "Use selection as the pivot point"
+#UserPreferencesView.use_zoom_to_mouse -> use_zoom_to_mouse: boolean "Zoom in towards the mouse pointers position in the 3D view, rather than the 2D window center"
+#UserPreferencesView.view2d_grid_spacing_min -> view2d_grid_spacing_min: int "Minimum number of pixels between each gridline in 2D Viewports"
+#+ * UserSolidLight.diffuse_color -> diffuse_color: float[3] "The diffuse color of the OpenGL light"
+#+ * UserSolidLight.direction -> direction: float[3] "The direction that the OpenGL light is shining"
+#+ * UserSolidLight.specular_color -> specular_color: float[3] "The color of the lights specular highlight"
+#+ * UserSolidLight.use -> use: boolean "Enable this OpenGL light in solid draw mode"
+#+ * ValueNodeSocket.default_value -> default_value: float[1] "Default value of the socket when no link is attached"
+#+ * ValueNodeSocket.name -> name: string, "(read-only) Socket name"
+#+ * VectorNodeSocket.default_value -> default_value: float[3] "Default value of the socket when no link is attached"
+#+ * VectorNodeSocket.name -> name: string, "(read-only) Socket name"
+#VertexColors.active -> active: pointer "Active vertex color layer"
+#+ * 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"
+#+ * 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.filepath -> filepath: string "The external source data file to use"
+#+ * VoxelData.intensity -> intensity: float "Multiplier for intensity values"
+#+ * VoxelData.interpolation -> interpolation: enum "Method to interpolate/smooth values between voxel cells"
+#+ * VoxelData.resolution -> resolution: int[3] "Resolution of the voxel grid"
+#+ * VoxelData.smoke_data_type -> smoke_data_type: enum "Simulation value to be used as a texture"
+#VoxelData.still_frame -> still_frame: int "The frame number to always use"
+#VoxelData.use_still_frame -> use_still_frame: boolean "Always render a still frame from the voxel data sequence"
+#+ * Window.screen -> screen: pointer "Active screen showing in the window"
+#+ * 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_type -> 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_threshold -> error_threshold: 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 "NO DESCRIPTION"
+#+ * 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)"
+#+ * WorldLighting.use_ambient_occlusion -> use_ambient_occlusion: boolean "Use Ambient Occlusion to add shadowing based on distance between objects"
+#WorldLighting.use_cache -> use_cache: boolean "Cache AO results in pixels and interpolate over neighbouring pixels for speedup (for Approximate)"
+#WorldLighting.use_environment_light -> use_environment_light: boolean "Add light coming from the environment"
+#WorldLighting.use_falloff -> use_falloff: boolean "NO DESCRIPTION"
+#WorldLighting.use_indirect_light -> use_indirect_light: boolean "Add indirect light bouncing of surrounding objects"
+#+ * 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"
+#+ * WorldMistSettings.use_mist -> use_mist: boolean "Occlude objects with the environment color as they are further away"
+#+ * WorldStarsSettings.average_separation -> average_separation: float "Average distance between any two stars"
+#WorldStarsSettings.color_random -> color_random: float "Randomize star colors"
+#WorldStarsSettings.distance_min -> distance_min: float "Minimum distance to the camera for stars"
+#+ * WorldStarsSettings.size -> size: float "Average screen dimension of stars"
+#+ * WorldStarsSettings.use_stars -> use_stars: boolean "Enable starfield generation"
diff --git a/source/blender/makesrna/rna_cleanup/rna_update.sh b/source/blender/makesrna/rna_cleanup/rna_update.sh
new file mode 100755
index 00000000000..04d4bbcb0e4
--- /dev/null
+++ b/source/blender/makesrna/rna_cleanup/rna_update.sh
@@ -0,0 +1,13 @@
+cd ../../../../
+./blender.bin --background --python ./release/scripts/modules/rna_info.py 2> source/blender/makesrna/rna_cleanup/out.txt
+cd ./source/blender/makesrna/rna_cleanup/
+./rna_cleaner.py out.txt
+./rna_cleaner.py rna_properties.txt
+./rna_cleaner_merge.py out_work.py rna_properties_work.py
+./rna_cleaner.py out_work_merged.py
+./rna_cleaner.py out_work_lost.py
+mv out_work_merged_work.txt rna_properties.txt # overwrite
+mv out_work_lost_work.txt rna_properties_lost.txt
+cat rna_properties.txt | grep -v "^#" > rna_properties_edits.txt
+./rna_cleaner.py rna_properties.txt
+echo "Updated: rna_properties.txt rna_properties_edits.txt rna_properties_lost.txt " \ No newline at end of file
diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt
new file mode 100644
index 00000000000..b6dcc9c03f9
--- /dev/null
+++ b/source/blender/modifiers/CMakeLists.txt
@@ -0,0 +1,48 @@
+# ***** 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
+ ../render/extern/include
+ ../../../intern/guardedalloc
+ ../../../intern/decimation/extern
+ ../../../intern/elbeem/extern
+ ../../../intern/bsp/extern
+ ${ZLIB_INC}
+)
+
+IF(NOT WITH_FLUID)
+ ADD_DEFINITIONS(-DDISABLE_ELBEEM)
+ENDIF(NOT WITH_FLUID)
+
+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..a792b163eea
--- /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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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..ddcddb90186
--- /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., 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): 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..78ee16a3690
--- /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 = 'bf_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..d0e36f90ff5
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_armature.c
@@ -0,0 +1,179 @@
+/*
+* $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 "DNA_object_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..a6fefbcd863
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_array.c
@@ -0,0 +1,780 @@
+/*
+* $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 "MEM_guardedalloc.h"
+
+#include "BLI_math.h"
+#include "BLI_ghash.h"
+#include "BLI_edgehash.h"
+
+#include "DNA_curve_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+
+#include "BKE_cdderivedmesh.h"
+#include "BKE_displist.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_object.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;
+}
+
+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,
+ struct 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_v3(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->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);
+ }
+ result = CDDM_from_template(dm, finalVerts, finalEdges, finalFaces);
+
+ /* 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;
+
+ copy_v3_v3(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];
+ mul_v3_m4v3(tmp_co, offset, mv->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) {
+ copy_v3_v3(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);
+ copy_v3_v3(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->getNumFaces(dm);
+ mface = CDDM_get_faces(result);
+ for (i=0; i < maxFaces; i++) {
+ MFace inMF;
+ MFace *mf = &mface[numFaces];
+
+ dm->getFace(dm, i, &inMF);
+
+ DM_copy_face_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_face_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->getNumFaces(start_cap);
+ cap_mvert = start_cap->getVertArray(start_cap);
+ cap_medge = start_cap->getEdgeArray(start_cap);
+ cap_mface = start_cap->getFaceArray(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;
+
+ copy_v3_v3(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->getFaceDataArray(result, CD_ORIGINDEX);
+ for(i = 0; i < capFaces; i++) {
+ DM_copy_face_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->getNumFaces(end_cap);
+ cap_mvert = end_cap->getVertArray(end_cap);
+ cap_medge = end_cap->getEdgeArray(end_cap);
+ cap_mface = end_cap->getFaceArray(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;
+
+ copy_v3_v3(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->getFaceDataArray(result, CD_ORIGINDEX);
+ for(i = 0; i < capFaces; i++) {
+ DM_copy_face_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);
+
+ return result;
+}
+
+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..62c7dfa5600
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_bevel.c
@@ -0,0 +1,141 @@
+/*
+* $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 "MEM_guardedalloc.h"
+
+#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)
+{
+ 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);
+
+ return result;
+}
+
+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..4e8e3117b7e
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_boolean.c
@@ -0,0 +1,140 @@
+/*
+* $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_object_types.h"
+
+#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/blenkernel/intern/booleanops.c b/source/blender/modifiers/intern/MOD_boolean_util.c
index 3e43dfbb4d5..2fba4c6a603 100644
--- a/source/blender/blenkernel/intern/booleanops.c
+++ b/source/blender/modifiers/intern/MOD_boolean_util.c
@@ -28,21 +28,16 @@
* CSG operations.
*/
-#include <string.h>
-#include <math.h>
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_math.h"
-#include "BLI_ghash.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 "CSG_BooleanOps.h"
+#include "MEM_guardedalloc.h"
+
+#include "BLI_math.h"
+#include "BLI_ghash.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_depsgraph.h"
@@ -50,7 +45,7 @@
#include "BKE_mesh.h"
#include "BKE_object.h"
-
+#include "CSG_BooleanOps.h"
/**
* Here's the vertex iterator structure used to walk through
@@ -373,7 +368,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, "CSG_mat gh");
*totmat = 0;
}
@@ -592,4 +587,3 @@ DerivedMesh *NewBooleanDerivedMesh(DerivedMesh *dm, struct Object *ob, DerivedMe
{
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
index dcf71645db3..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..8fc1be7d5ee
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_build.c
@@ -0,0 +1,300 @@
+/*
+* $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 "MEM_guardedalloc.h"
+
+#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->getNumFaces(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->getNumFaces(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->getFace(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);
+
+ /* 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->getFace(dm, faceMap[i], &source);
+ dest = CDDM_get_face(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);
+
+ return result;
+}
+
+
+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..10843cf9677
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_cast.c
@@ -0,0 +1,628 @@
+/*
+* $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_object_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..bfb5f6ee028
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_cloth.c
@@ -0,0 +1,206 @@
+/*
+* $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_cloth_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#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..32fbd58839a
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_collision.c
@@ -0,0 +1,253 @@
+/*
+* $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 "MEM_guardedalloc.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);
+ 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->dupFaceArray(dm);
+ collmd->numfaces = dm->getNumFaces(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..97c7a4b01d6
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_curve.c
@@ -0,0 +1,150 @@
+/*
+* $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 "DNA_object_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..9163a9771f0
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_decimate.c
@@ -0,0 +1,199 @@
+/*
+* $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->getFaceArray(dm);
+ totvert = dm->getNumVerts(dm);
+ totface = dm->getNumFaces(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];
+
+ copy_v3_v3(vbCo, mv->co);
+ normal_short_to_float_v3(vbNo, mv->no);
+ }
+
+ 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);
+ dmd->faceCount = lod.face_num;
+ }
+ else
+ result = CDDM_new(lod.vertex_num, 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];
+
+ copy_v3_v3(mv->co, vbCo);
+ }
+
+ if(lod.vertex_num>2) {
+ mface = CDDM_get_faces(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);
+ }
+ 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;
+}
+
+
+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..29ace805543
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_displace.c
@@ -0,0 +1,354 @@
+/*
+* $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_object_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->getFaceArray(dm);
+ MFace *mf;
+ char *done = MEM_callocN(sizeof(*done) * numVerts,
+ "get_texture_coords done");
+ int numFaces = dm->getNumFaces(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..6614625a650
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_edgesplit.c
@@ -0,0 +1,1295 @@
+/*
+* $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 *****
+*
+*/
+
+/* 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 "BKE_cdderivedmesh.h"
+#include "BKE_modifier.h"
+#include "BKE_particle.h"
+
+#include "MEM_guardedalloc.h"
+
+
+#if 0
+#define EDGESPLIT_DEBUG_3
+#define EDGESPLIT_DEBUG_2
+#define EDGESPLIT_DEBUG_1
+#define EDGESPLIT_DEBUG_0
+#endif
+
+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;
+}
+
+/* Mesh data for edgesplit operation */
+typedef struct SmoothVert {
+ LinkNode *faces; /* all faces which use this vert */
+ int oldIndex; /* the index of the original DerivedMesh vert */
+ int newIndex; /* the index of the new DerivedMesh vert */
+} SmoothVert;
+
+#define SMOOTHEDGE_NUM_VERTS 2
+
+typedef struct SmoothEdge {
+ SmoothVert *verts[SMOOTHEDGE_NUM_VERTS]; /* the verts used by this edge */
+ LinkNode *faces; /* all faces which use this edge */
+ int oldIndex; /* the index of the original DerivedMesh edge */
+ int newIndex; /* the index of the new DerivedMesh edge */
+ short flag; /* the flags from the original DerivedMesh edge */
+} SmoothEdge;
+
+#define SMOOTHFACE_MAX_EDGES 4
+
+typedef struct SmoothFace {
+ SmoothEdge *edges[SMOOTHFACE_MAX_EDGES]; /* nonexistent edges == NULL */
+ int flip[SMOOTHFACE_MAX_EDGES]; /* 1 = flip edge dir, 0 = don't flip */
+ float normal[3]; /* the normal of this face */
+ int oldIndex; /* the index of the original DerivedMesh face */
+ int newIndex; /* the index of the new DerivedMesh face */
+} SmoothFace;
+
+typedef struct SmoothMesh {
+ SmoothVert *verts;
+ SmoothEdge *edges;
+ SmoothFace *faces;
+ int num_verts, num_edges, num_faces;
+ int max_verts, max_edges, max_faces;
+ DerivedMesh *dm;
+ float threshold; /* the cosine of the smoothing angle */
+ int flags;
+ MemArena *arena;
+ ListBase propagatestack, reusestack;
+} SmoothMesh;
+
+static SmoothVert *smoothvert_copy(SmoothVert *vert, SmoothMesh *mesh)
+{
+ SmoothVert *copy = &mesh->verts[mesh->num_verts];
+
+ if(mesh->num_verts >= mesh->max_verts) {
+ printf("Attempted to add a SmoothMesh vert beyond end of array\n");
+ return NULL;
+ }
+
+ *copy = *vert;
+ copy->faces = NULL;
+ copy->newIndex = mesh->num_verts;
+ ++mesh->num_verts;
+
+#ifdef EDGESPLIT_DEBUG_2
+ printf("copied vert %4d to vert %4d\n", vert->newIndex, copy->newIndex);
+#endif
+ return copy;
+}
+
+static SmoothEdge *smoothedge_copy(SmoothEdge *edge, SmoothMesh *mesh)
+{
+ SmoothEdge *copy = &mesh->edges[mesh->num_edges];
+
+ if(mesh->num_edges >= mesh->max_edges) {
+ printf("Attempted to add a SmoothMesh edge beyond end of array\n");
+ return NULL;
+ }
+
+ *copy = *edge;
+ copy->faces = NULL;
+ copy->newIndex = mesh->num_edges;
+ ++mesh->num_edges;
+
+#ifdef EDGESPLIT_DEBUG_2
+ printf("copied edge %4d to edge %4d\n", edge->newIndex, copy->newIndex);
+#endif
+ return copy;
+}
+
+static int smoothedge_has_vert(SmoothEdge *edge, SmoothVert *vert)
+{
+ int i;
+ for(i = 0; i < SMOOTHEDGE_NUM_VERTS; i++)
+ if(edge->verts[i] == vert) return 1;
+
+ return 0;
+}
+
+static SmoothMesh *smoothmesh_new(int num_verts, int num_edges, int num_faces,
+ int max_verts, int max_edges, int max_faces)
+{
+ SmoothMesh *mesh = MEM_callocN(sizeof(*mesh), "smoothmesh");
+ mesh->verts = MEM_callocN(sizeof(*mesh->verts) * max_verts,
+ "SmoothMesh.verts");
+ mesh->edges = MEM_callocN(sizeof(*mesh->edges) * max_edges,
+ "SmoothMesh.edges");
+ mesh->faces = MEM_callocN(sizeof(*mesh->faces) * max_faces,
+ "SmoothMesh.faces");
+
+ mesh->num_verts = num_verts;
+ mesh->num_edges = num_edges;
+ mesh->num_faces = num_faces;
+
+ mesh->max_verts = max_verts;
+ mesh->max_edges = max_edges;
+ mesh->max_faces = max_faces;
+
+ return mesh;
+}
+
+static void smoothmesh_free(SmoothMesh *mesh)
+{
+ int i;
+
+ for(i = 0; i < mesh->num_verts; ++i)
+ BLI_linklist_free(mesh->verts[i].faces, NULL);
+
+ for(i = 0; i < mesh->num_edges; ++i)
+ BLI_linklist_free(mesh->edges[i].faces, NULL);
+
+ if(mesh->arena)
+ BLI_memarena_free(mesh->arena);
+
+ MEM_freeN(mesh->verts);
+ MEM_freeN(mesh->edges);
+ MEM_freeN(mesh->faces);
+ MEM_freeN(mesh);
+}
+
+static void smoothmesh_resize_verts(SmoothMesh *mesh, int max_verts)
+{
+ int i;
+ SmoothVert *tmp;
+
+ if(max_verts <= mesh->max_verts) return;
+
+ tmp = MEM_callocN(sizeof(*tmp) * max_verts, "SmoothMesh.verts");
+
+ memcpy(tmp, mesh->verts, sizeof(*tmp) * mesh->num_verts);
+
+ /* remap vert pointers in edges */
+ for(i = 0; i < mesh->num_edges; ++i) {
+ int j;
+ SmoothEdge *edge = &mesh->edges[i];
+
+ for(j = 0; j < SMOOTHEDGE_NUM_VERTS; ++j)
+ /* pointer arithmetic to get vert array index */
+ edge->verts[j] = &tmp[edge->verts[j] - mesh->verts];
+ }
+
+ MEM_freeN(mesh->verts);
+ mesh->verts = tmp;
+ mesh->max_verts = max_verts;
+}
+
+static void smoothmesh_resize_edges(SmoothMesh *mesh, int max_edges)
+{
+ int i;
+ SmoothEdge *tmp;
+
+ if(max_edges <= mesh->max_edges) return;
+
+ tmp = MEM_callocN(sizeof(*tmp) * max_edges, "SmoothMesh.edges");
+
+ memcpy(tmp, mesh->edges, sizeof(*tmp) * mesh->num_edges);
+
+ /* remap edge pointers in faces */
+ for(i = 0; i < mesh->num_faces; ++i) {
+ int j;
+ SmoothFace *face = &mesh->faces[i];
+
+ for(j = 0; j < SMOOTHFACE_MAX_EDGES; ++j)
+ if(face->edges[j])
+ /* pointer arithmetic to get edge array index */
+ face->edges[j] = &tmp[face->edges[j] - mesh->edges];
+ }
+
+ MEM_freeN(mesh->edges);
+ mesh->edges = tmp;
+ mesh->max_edges = max_edges;
+}
+
+#ifdef EDGESPLIT_DEBUG_0
+static void smoothmesh_print(SmoothMesh *mesh)
+{
+ int i, j;
+ DerivedMesh *dm = mesh->dm;
+
+ printf("--- SmoothMesh ---\n");
+ printf("--- Vertices ---\n");
+ for(i = 0; i < mesh->num_verts; i++) {
+ SmoothVert *vert = &mesh->verts[i];
+ LinkNode *node;
+ MVert mv;
+
+ dm->getVert(dm, vert->oldIndex, &mv);
+
+ printf("%3d: ind={%3d, %3d}, pos={% 5.1f, % 5.1f, % 5.1f}",
+ i, vert->oldIndex, vert->newIndex,
+ mv.co[0], mv.co[1], mv.co[2]);
+ printf(", faces={");
+ for(node = vert->faces; node != NULL; node = node->next) {
+ printf(" %d", ((SmoothFace *)node->link)->newIndex);
+ }
+ printf("}\n");
+ }
+
+ printf("\n--- Edges ---\n");
+ for(i = 0; i < mesh->num_edges; i++) {
+ SmoothEdge *edge = &mesh->edges[i];
+ LinkNode *node;
+
+ printf("%4d: indices={%4d, %4d}, verts={%4d, %4d}",
+ i,
+ edge->oldIndex, edge->newIndex,
+ edge->verts[0]->newIndex, edge->verts[1]->newIndex);
+ if(edge->verts[0] == edge->verts[1]) printf(" <- DUPLICATE VERTEX");
+ printf(", faces={");
+ for(node = edge->faces; node != NULL; node = node->next) {
+ printf(" %d", ((SmoothFace *)node->link)->newIndex);
+ }
+ printf("}\n");
+ }
+
+ printf("\n--- Faces ---\n");
+ for(i = 0; i < mesh->num_faces; i++) {
+ SmoothFace *face = &mesh->faces[i];
+
+ printf("%4d: indices={%4d, %4d}, edges={", i,
+ face->oldIndex, face->newIndex);
+ for(j = 0; j < SMOOTHFACE_MAX_EDGES && face->edges[j]; j++) {
+ if(face->flip[j])
+ printf(" -%-2d", face->edges[j]->newIndex);
+ else
+ printf(" %-2d", face->edges[j]->newIndex);
+ }
+ printf("}, verts={");
+ for(j = 0; j < SMOOTHFACE_MAX_EDGES && face->edges[j]; j++) {
+ printf(" %d", face->edges[j]->verts[face->flip[j]]->newIndex);
+ }
+ printf("}\n");
+ }
+}
+#endif
+
+static SmoothMesh *smoothmesh_from_derivedmesh(DerivedMesh *dm)
+{
+ SmoothMesh *mesh;
+ EdgeHash *edges = BLI_edgehash_new();
+ int i;
+ int totvert, totedge, totface;
+
+ totvert = dm->getNumVerts(dm);
+ totedge = dm->getNumEdges(dm);
+ totface = dm->getNumFaces(dm);
+
+ mesh = smoothmesh_new(totvert, totedge, totface,
+ totvert, totedge, totface);
+
+ mesh->dm = dm;
+
+ for(i = 0; i < totvert; i++) {
+ SmoothVert *vert = &mesh->verts[i];
+
+ vert->oldIndex = vert->newIndex = i;
+ }
+
+ for(i = 0; i < totedge; i++) {
+ SmoothEdge *edge = &mesh->edges[i];
+ MEdge med;
+
+ dm->getEdge(dm, i, &med);
+ edge->verts[0] = &mesh->verts[med.v1];
+ edge->verts[1] = &mesh->verts[med.v2];
+ edge->oldIndex = edge->newIndex = i;
+ edge->flag = med.flag;
+
+ BLI_edgehash_insert(edges, med.v1, med.v2, edge);
+ }
+
+ for(i = 0; i < totface; i++) {
+ SmoothFace *face = &mesh->faces[i];
+ MFace mf;
+ MVert v1, v2, v3;
+ int j;
+
+ dm->getFace(dm, i, &mf);
+
+ dm->getVert(dm, mf.v1, &v1);
+ dm->getVert(dm, mf.v2, &v2);
+ dm->getVert(dm, mf.v3, &v3);
+ face->edges[0] = BLI_edgehash_lookup(edges, mf.v1, mf.v2);
+ if(face->edges[0]->verts[1]->oldIndex == mf.v1) face->flip[0] = 1;
+ face->edges[1] = BLI_edgehash_lookup(edges, mf.v2, mf.v3);
+ if(face->edges[1]->verts[1]->oldIndex == mf.v2) face->flip[1] = 1;
+ if(mf.v4) {
+ MVert v4;
+ dm->getVert(dm, mf.v4, &v4);
+ face->edges[2] = BLI_edgehash_lookup(edges, mf.v3, mf.v4);
+ if(face->edges[2]->verts[1]->oldIndex == mf.v3) face->flip[2] = 1;
+ face->edges[3] = BLI_edgehash_lookup(edges, mf.v4, mf.v1);
+ if(face->edges[3]->verts[1]->oldIndex == mf.v4) face->flip[3] = 1;
+ normal_quad_v3( face->normal,v1.co, v2.co, v3.co, v4.co);
+ } else {
+ face->edges[2] = BLI_edgehash_lookup(edges, mf.v3, mf.v1);
+ if(face->edges[2]->verts[1]->oldIndex == mf.v3) face->flip[2] = 1;
+ face->edges[3] = NULL;
+ normal_tri_v3( face->normal,v1.co, v2.co, v3.co);
+ }
+
+ for(j = 0; j < SMOOTHFACE_MAX_EDGES && face->edges[j]; j++) {
+ SmoothEdge *edge = face->edges[j];
+ BLI_linklist_prepend(&edge->faces, face);
+ BLI_linklist_prepend(&edge->verts[face->flip[j]]->faces, face);
+ }
+
+ face->oldIndex = face->newIndex = i;
+ }
+
+ BLI_edgehash_free(edges, NULL);
+
+ return mesh;
+}
+
+static DerivedMesh *CDDM_from_smoothmesh(SmoothMesh *mesh)
+{
+ DerivedMesh *result = CDDM_from_template(mesh->dm,
+ mesh->num_verts,
+ mesh->num_edges,
+ mesh->num_faces);
+ MVert *new_verts = CDDM_get_verts(result);
+ MEdge *new_edges = CDDM_get_edges(result);
+ MFace *new_faces = CDDM_get_faces(result);
+ int i;
+
+ for(i = 0; i < mesh->num_verts; ++i) {
+ SmoothVert *vert = &mesh->verts[i];
+ MVert *newMV = &new_verts[vert->newIndex];
+
+ DM_copy_vert_data(mesh->dm, result,
+ vert->oldIndex, vert->newIndex, 1);
+ mesh->dm->getVert(mesh->dm, vert->oldIndex, newMV);
+ }
+
+ for(i = 0; i < mesh->num_edges; ++i) {
+ SmoothEdge *edge = &mesh->edges[i];
+ MEdge *newME = &new_edges[edge->newIndex];
+
+ DM_copy_edge_data(mesh->dm, result,
+ edge->oldIndex, edge->newIndex, 1);
+ mesh->dm->getEdge(mesh->dm, edge->oldIndex, newME);
+ newME->v1 = edge->verts[0]->newIndex;
+ newME->v2 = edge->verts[1]->newIndex;
+ }
+
+ for(i = 0; i < mesh->num_faces; ++i) {
+ SmoothFace *face = &mesh->faces[i];
+ MFace *newMF = &new_faces[face->newIndex];
+
+ DM_copy_face_data(mesh->dm, result,
+ face->oldIndex, face->newIndex, 1);
+ mesh->dm->getFace(mesh->dm, face->oldIndex, newMF);
+
+ newMF->v1 = face->edges[0]->verts[face->flip[0]]->newIndex;
+ newMF->v2 = face->edges[1]->verts[face->flip[1]]->newIndex;
+ newMF->v3 = face->edges[2]->verts[face->flip[2]]->newIndex;
+
+ if(face->edges[3]) {
+ newMF->v4 = face->edges[3]->verts[face->flip[3]]->newIndex;
+ } else {
+ newMF->v4 = 0;
+ }
+ }
+
+ return result;
+}
+
+/* returns the other vert in the given edge
+ */
+static SmoothVert *other_vert(SmoothEdge *edge, SmoothVert *vert)
+{
+ if(edge->verts[0] == vert) return edge->verts[1];
+ else return edge->verts[0];
+}
+
+/* returns the other edge in the given face that uses the given vert
+ * returns NULL if no other edge in the given face uses the given vert
+ * (this should never happen)
+ */
+static SmoothEdge *other_edge(SmoothFace *face, SmoothVert *vert,
+ SmoothEdge *edge)
+{
+ int i,j;
+ for(i = 0; i < SMOOTHFACE_MAX_EDGES && face->edges[i]; i++) {
+ SmoothEdge *tmp_edge = face->edges[i];
+ if(tmp_edge == edge) continue;
+
+ for(j = 0; j < SMOOTHEDGE_NUM_VERTS; j++)
+ if(tmp_edge->verts[j] == vert) return tmp_edge;
+ }
+
+ /* if we get to here, something's wrong (there should always be 2 edges
+ * which use the same vert in a face)
+ */
+ return NULL;
+}
+
+/* returns a face attached to the given edge which is not the given face.
+ * returns NULL if no other faces use this edge.
+ */
+static SmoothFace *other_face(SmoothEdge *edge, SmoothFace *face)
+{
+ LinkNode *node;
+
+ for(node = edge->faces; node != NULL; node = node->next)
+ if(node->link != face) return node->link;
+
+ return NULL;
+}
+
+#if 0
+/* copies source list to target, overwriting target (target is not freed)
+ * nodes in the copy will be in the same order as in source
+ */
+static void linklist_copy(LinkNode **target, LinkNode *source)
+{
+ LinkNode *node = NULL;
+ *target = NULL;
+
+ for(; source; source = source->next) {
+ if(node) {
+ node->next = MEM_mallocN(sizeof(*node->next), "nlink_copy");
+ node = node->next;
+} else {
+ node = *target = MEM_mallocN(sizeof(**target), "nlink_copy");
+}
+ node->link = source->link;
+ node->next = NULL;
+}
+}
+#endif
+
+ /* appends source to target if it's not already in target */
+ static void linklist_append_unique(LinkNode **target, void *source)
+{
+ LinkNode *node;
+ LinkNode *prev = NULL;
+
+ /* check if source value is already in the list */
+ for(node = *target; node; prev = node, node = node->next)
+ if(node->link == source) return;
+
+ node = MEM_mallocN(sizeof(*node), "nlink");
+ node->next = NULL;
+ node->link = source;
+
+ if(prev) prev->next = node;
+ else *target = node;
+}
+
+/* appends elements of source which aren't already in target to target */
+static void linklist_append_list_unique(LinkNode **target, LinkNode *source)
+{
+ for(; source; source = source->next)
+ linklist_append_unique(target, source->link);
+}
+
+#if 0 /* this is no longer used, it should possibly be removed */
+/* prepends prepend to list - doesn't copy nodes, just joins the lists */
+static void linklist_prepend_linklist(LinkNode **list, LinkNode *prepend)
+{
+ if(prepend) {
+ LinkNode *node = prepend;
+ while(node->next) node = node->next;
+
+ node->next = *list;
+ *list = prepend;
+}
+}
+#endif
+
+/* returns 1 if the linked list contains the given pointer, 0 otherwise
+ */
+static int linklist_contains(LinkNode *list, void *ptr)
+{
+ LinkNode *node;
+
+ for(node = list; node; node = node->next)
+ if(node->link == ptr) return 1;
+
+ return 0;
+}
+
+/* returns 1 if the first linked list is a subset of the second (comparing
+ * pointer values), 0 if not
+ */
+static int linklist_subset(LinkNode *list1, LinkNode *list2)
+{
+ for(; list1; list1 = list1->next)
+ if(!linklist_contains(list2, list1->link))
+ return 0;
+
+ return 1;
+}
+
+#if 0
+/* empties the linked list
+ * frees pointers with freefunc if freefunc is not NULL
+ */
+static void linklist_empty(LinkNode **list, LinkNodeFreeFP freefunc)
+{
+ BLI_linklist_free(*list, freefunc);
+ *list = NULL;
+}
+#endif
+
+/* removes the first instance of value from the linked list
+ * frees the pointer with freefunc if freefunc is not NULL
+ */
+static void linklist_remove_first(LinkNode **list, void *value,
+ LinkNodeFreeFP freefunc)
+{
+ LinkNode *node = *list;
+ LinkNode *prev = NULL;
+
+ while(node && node->link != value) {
+ prev = node;
+ node = node->next;
+ }
+
+ if(node) {
+ if(prev)
+ prev->next = node->next;
+ else
+ *list = node->next;
+
+ if(freefunc)
+ freefunc(node->link);
+
+ MEM_freeN(node);
+ }
+}
+
+/* removes all elements in source from target */
+static void linklist_remove_list(LinkNode **target, LinkNode *source,
+ LinkNodeFreeFP freefunc)
+{
+ for(; source; source = source->next)
+ linklist_remove_first(target, source->link, freefunc);
+}
+
+#ifdef EDGESPLIT_DEBUG_0
+static void print_ptr(void *ptr)
+{
+ printf("%p\n", ptr);
+}
+
+static void print_edge(void *ptr)
+{
+ SmoothEdge *edge = ptr;
+ printf(" %4d", edge->newIndex);
+}
+
+static void print_face(void *ptr)
+{
+ SmoothFace *face = ptr;
+ printf(" %4d", face->newIndex);
+}
+#endif
+
+typedef struct ReplaceData {
+ void *find;
+ void *replace;
+} ReplaceData;
+
+static void edge_replace_vert(void *ptr, void *userdata)
+{
+ SmoothEdge *edge = ptr;
+ SmoothVert *find = ((ReplaceData *)userdata)->find;
+ SmoothVert *replace = ((ReplaceData *)userdata)->replace;
+ int i;
+
+#ifdef EDGESPLIT_DEBUG_3
+ printf("replacing vert %4d with %4d in edge %4d",
+ find->newIndex, replace->newIndex, edge->newIndex);
+ printf(": {%4d, %4d}", edge->verts[0]->newIndex, edge->verts[1]->newIndex);
+#endif
+
+ for(i = 0; i < SMOOTHEDGE_NUM_VERTS; i++) {
+ if(edge->verts[i] == find) {
+ linklist_append_list_unique(&replace->faces, edge->faces);
+ linklist_remove_list(&find->faces, edge->faces, NULL);
+
+ edge->verts[i] = replace;
+ }
+ }
+
+#ifdef EDGESPLIT_DEBUG_3
+ printf(" -> {%4d, %4d}\n", edge->verts[0]->newIndex, edge->verts[1]->newIndex);
+#endif
+}
+
+static void face_replace_vert(void *ptr, void *userdata)
+{
+ SmoothFace *face = ptr;
+ int i;
+
+ for(i = 0; i < SMOOTHFACE_MAX_EDGES && face->edges[i]; i++)
+ edge_replace_vert(face->edges[i], userdata);
+}
+
+static void face_replace_edge(void *ptr, void *userdata)
+{
+ SmoothFace *face = ptr;
+ SmoothEdge *find = ((ReplaceData *)userdata)->find;
+ SmoothEdge *replace = ((ReplaceData *)userdata)->replace;
+ int i;
+
+#ifdef EDGESPLIT_DEBUG_3
+ printf("replacing edge %4d with %4d in face %4d",
+ find->newIndex, replace->newIndex, face->newIndex);
+ if(face->edges[3])
+ printf(": {%2d %2d %2d %2d}",
+ face->edges[0]->newIndex, face->edges[1]->newIndex,
+ face->edges[2]->newIndex, face->edges[3]->newIndex);
+ else
+ printf(": {%2d %2d %2d}",
+ face->edges[0]->newIndex, face->edges[1]->newIndex,
+ face->edges[2]->newIndex);
+#endif
+
+ for(i = 0; i < SMOOTHFACE_MAX_EDGES && face->edges[i]; i++) {
+ if(face->edges[i] == find) {
+ linklist_remove_first(&face->edges[i]->faces, face, NULL);
+ BLI_linklist_prepend(&replace->faces, face);
+ face->edges[i] = replace;
+ }
+ }
+
+#ifdef EDGESPLIT_DEBUG_3
+ if(face->edges[3])
+ printf(" -> {%2d %2d %2d %2d}\n",
+ face->edges[0]->newIndex, face->edges[1]->newIndex,
+ face->edges[2]->newIndex, face->edges[3]->newIndex);
+ else
+ printf(" -> {%2d %2d %2d}\n",
+ face->edges[0]->newIndex, face->edges[1]->newIndex,
+ face->edges[2]->newIndex);
+#endif
+}
+
+static int edge_is_loose(SmoothEdge *edge)
+{
+ return !(edge->faces && edge->faces->next);
+}
+
+static int edge_is_sharp(SmoothEdge *edge, int flags,
+ float threshold)
+{
+#ifdef EDGESPLIT_DEBUG_1
+ printf("edge %d: ", edge->newIndex);
+#endif
+ if(edge->flag & ME_SHARP) {
+ /* edge can only be sharp if it has at least 2 faces */
+ if(!edge_is_loose(edge)) {
+#ifdef EDGESPLIT_DEBUG_1
+ printf("sharp\n");
+#endif
+ return 1;
+ } else {
+ /* edge is loose, so it can't be sharp */
+ edge->flag &= ~ME_SHARP;
+ }
+ }
+
+#ifdef EDGESPLIT_DEBUG_1
+ printf("not sharp\n");
+#endif
+ return 0;
+}
+
+/* finds another sharp edge which uses vert, by traversing faces around the
+ * vert until it does one of the following:
+ * - hits a loose edge (the edge is returned)
+ * - hits a sharp edge (the edge is returned)
+ * - returns to the start edge (NULL is returned)
+ */
+static SmoothEdge *find_other_sharp_edge(SmoothVert *vert, SmoothEdge *edge,
+ LinkNode **visited_faces, float threshold, int flags)
+{
+ SmoothFace *face = NULL;
+ SmoothEdge *edge2 = NULL;
+ /* holds the edges we've seen so we can avoid looping indefinitely */
+ LinkNode *visited_edges = NULL;
+#ifdef EDGESPLIT_DEBUG_1
+ printf("=== START === find_other_sharp_edge(edge = %4d, vert = %4d)\n",
+ edge->newIndex, vert->newIndex);
+#endif
+
+ /* get a face on which to start */
+ if(edge->faces) face = edge->faces->link;
+ else return NULL;
+
+ /* record this edge as visited */
+ BLI_linklist_prepend(&visited_edges, edge);
+
+ /* get the next edge */
+ edge2 = other_edge(face, vert, edge);
+
+ /* record this face as visited */
+ if(visited_faces)
+ BLI_linklist_prepend(visited_faces, face);
+
+ /* search until we hit a loose edge or a sharp edge or an edge we've
+ * seen before
+ */
+ while(face && !edge_is_sharp(edge2, flags, threshold)
+ && !linklist_contains(visited_edges, edge2)) {
+#ifdef EDGESPLIT_DEBUG_3
+ printf("current face %4d; current edge %4d\n", face->newIndex,
+ edge2->newIndex);
+#endif
+ /* get the next face */
+ face = other_face(edge2, face);
+
+ /* if face == NULL, edge2 is a loose edge */
+ if(face) {
+ /* record this face as visited */
+ if(visited_faces)
+ BLI_linklist_prepend(visited_faces, face);
+
+ /* record this edge as visited */
+ BLI_linklist_prepend(&visited_edges, edge2);
+
+ /* get the next edge */
+ edge2 = other_edge(face, vert, edge2);
+#ifdef EDGESPLIT_DEBUG_3
+ printf("next face %4d; next edge %4d\n",
+ face->newIndex, edge2->newIndex);
+ } else {
+ printf("loose edge: %4d\n", edge2->newIndex);
+#endif
+ }
+ }
+
+ /* either we came back to the start edge or we found a sharp/loose edge */
+ if(linklist_contains(visited_edges, edge2))
+ /* we came back to the start edge */
+ edge2 = NULL;
+
+ BLI_linklist_free(visited_edges, NULL);
+
+#ifdef EDGESPLIT_DEBUG_1
+ printf("=== END === find_other_sharp_edge(edge = %4d, vert = %4d), "
+ "returning edge %d\n",
+ edge->newIndex, vert->newIndex, edge2 ? edge2->newIndex : -1);
+#endif
+ return edge2;
+}
+
+static void split_single_vert(SmoothVert *vert, SmoothFace *face,
+ SmoothMesh *mesh)
+{
+ SmoothVert *copy_vert;
+ ReplaceData repdata;
+
+ copy_vert = smoothvert_copy(vert, mesh);
+
+ repdata.find = vert;
+ repdata.replace = copy_vert;
+ face_replace_vert(face, &repdata);
+}
+
+typedef struct PropagateEdge {
+ struct PropagateEdge *next, *prev;
+ SmoothEdge *edge;
+ SmoothVert *vert;
+} PropagateEdge;
+
+static void push_propagate_stack(SmoothEdge *edge, SmoothVert *vert, SmoothMesh *mesh)
+{
+ PropagateEdge *pedge = mesh->reusestack.first;
+
+ if(pedge) {
+ BLI_remlink(&mesh->reusestack, pedge);
+ }
+ else {
+ if(!mesh->arena) {
+ mesh->arena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "edgesplit arena");
+ BLI_memarena_use_calloc(mesh->arena);
+ }
+
+ pedge = BLI_memarena_alloc(mesh->arena, sizeof(PropagateEdge));
+ }
+
+ pedge->edge = edge;
+ pedge->vert = vert;
+ BLI_addhead(&mesh->propagatestack, pedge);
+}
+
+static void pop_propagate_stack(SmoothEdge **edge, SmoothVert **vert, SmoothMesh *mesh)
+{
+ PropagateEdge *pedge = mesh->propagatestack.first;
+
+ if(pedge) {
+ *edge = pedge->edge;
+ *vert = pedge->vert;
+ BLI_remlink(&mesh->propagatestack, pedge);
+ BLI_addhead(&mesh->reusestack, pedge);
+ }
+ else {
+ *edge = NULL;
+ *vert = NULL;
+ }
+}
+
+static void split_edge(SmoothEdge *edge, SmoothVert *vert, SmoothMesh *mesh);
+
+static void propagate_split(SmoothEdge *edge, SmoothVert *vert,
+ SmoothMesh *mesh)
+{
+ SmoothEdge *edge2;
+ LinkNode *visited_faces = NULL;
+#ifdef EDGESPLIT_DEBUG_1
+ printf("=== START === propagate_split(edge = %4d, vert = %4d)\n",
+ edge->newIndex, vert->newIndex);
+#endif
+
+ edge2 = find_other_sharp_edge(vert, edge, &visited_faces,
+ mesh->threshold, mesh->flags);
+
+ if(!edge2) {
+ /* didn't find a sharp or loose edge, so we've hit a dead end */
+ } else if(!edge_is_loose(edge2)) {
+ /* edge2 is not loose, so it must be sharp */
+ if(edge_is_loose(edge)) {
+ /* edge is loose, so we can split edge2 at this vert */
+ split_edge(edge2, vert, mesh);
+ } else if(edge_is_sharp(edge, mesh->flags, mesh->threshold)) {
+ /* both edges are sharp, so we can split the pair at vert */
+ split_edge(edge, vert, mesh);
+ } else {
+ /* edge is not sharp, so try to split edge2 at its other vert */
+ split_edge(edge2, other_vert(edge2, vert), mesh);
+ }
+ } else { /* edge2 is loose */
+ if(edge_is_loose(edge)) {
+ SmoothVert *vert2;
+ ReplaceData repdata;
+
+ /* can't split edge, what should we do with vert? */
+ if(linklist_subset(vert->faces, visited_faces)) {
+ /* vert has only one fan of faces attached; don't split it */
+ } else {
+ /* vert has more than one fan of faces attached; split it */
+ vert2 = smoothvert_copy(vert, mesh);
+
+ /* replace vert with its copy in visited_faces */
+ repdata.find = vert;
+ repdata.replace = vert2;
+ BLI_linklist_apply(visited_faces, face_replace_vert, &repdata);
+ }
+ } else {
+ /* edge is not loose, so it must be sharp; split it */
+ split_edge(edge, vert, mesh);
+ }
+ }
+
+ BLI_linklist_free(visited_faces, NULL);
+#ifdef EDGESPLIT_DEBUG_1
+ printf("=== END === propagate_split(edge = %4d, vert = %4d)\n",
+ edge->newIndex, vert->newIndex);
+#endif
+}
+
+static void split_edge(SmoothEdge *edge, SmoothVert *vert, SmoothMesh *mesh)
+{
+ SmoothEdge *edge2;
+ SmoothVert *vert2;
+ ReplaceData repdata;
+ /* the list of faces traversed while looking for a sharp edge */
+ LinkNode *visited_faces = NULL;
+#ifdef EDGESPLIT_DEBUG_1
+ printf("=== START === split_edge(edge = %4d, vert = %4d)\n",
+ edge->newIndex, vert->newIndex);
+#endif
+
+ edge2 = find_other_sharp_edge(vert, edge, &visited_faces,
+ mesh->threshold, mesh->flags);
+
+ if(!edge2) {
+ /* didn't find a sharp or loose edge, so try the other vert */
+ vert2 = other_vert(edge, vert);
+ push_propagate_stack(edge, vert2, mesh);
+ } else if(!edge_is_loose(edge2)) {
+ /* edge2 is not loose, so it must be sharp */
+ SmoothEdge *copy_edge = smoothedge_copy(edge, mesh);
+ SmoothEdge *copy_edge2 = smoothedge_copy(edge2, mesh);
+ SmoothVert *vert2;
+
+ /* replace edge with its copy in visited_faces */
+ repdata.find = edge;
+ repdata.replace = copy_edge;
+ BLI_linklist_apply(visited_faces, face_replace_edge, &repdata);
+
+ /* replace edge2 with its copy in visited_faces */
+ repdata.find = edge2;
+ repdata.replace = copy_edge2;
+ BLI_linklist_apply(visited_faces, face_replace_edge, &repdata);
+
+ vert2 = smoothvert_copy(vert, mesh);
+
+ /* replace vert with its copy in visited_faces (must be done after
+ * edge replacement so edges have correct vertices)
+ */
+ repdata.find = vert;
+ repdata.replace = vert2;
+ BLI_linklist_apply(visited_faces, face_replace_vert, &repdata);
+
+ /* all copying and replacing is done; the mesh should be consistent.
+ * now propagate the split to the vertices at either end
+ */
+ push_propagate_stack(copy_edge, other_vert(copy_edge, vert2), mesh);
+ push_propagate_stack(copy_edge2, other_vert(copy_edge2, vert2), mesh);
+
+ if(smoothedge_has_vert(edge, vert))
+ push_propagate_stack(edge, vert, mesh);
+ } else {
+ /* edge2 is loose */
+ SmoothEdge *copy_edge = smoothedge_copy(edge, mesh);
+ SmoothVert *vert2;
+
+ /* replace edge with its copy in visited_faces */
+ repdata.find = edge;
+ repdata.replace = copy_edge;
+ BLI_linklist_apply(visited_faces, face_replace_edge, &repdata);
+
+ vert2 = smoothvert_copy(vert, mesh);
+
+ /* replace vert with its copy in visited_faces (must be done after
+ * edge replacement so edges have correct vertices)
+ */
+ repdata.find = vert;
+ repdata.replace = vert2;
+ BLI_linklist_apply(visited_faces, face_replace_vert, &repdata);
+
+ /* copying and replacing is done; the mesh should be consistent.
+ * now propagate the split to the vertex at the other end
+ */
+ push_propagate_stack(copy_edge, other_vert(copy_edge, vert2), mesh);
+
+ if(smoothedge_has_vert(edge, vert))
+ push_propagate_stack(edge, vert, mesh);
+ }
+
+ BLI_linklist_free(visited_faces, NULL);
+#ifdef EDGESPLIT_DEBUG_1
+ printf("=== END === split_edge(edge = %4d, vert = %4d)\n",
+ edge->newIndex, vert->newIndex);
+#endif
+}
+
+static void tag_and_count_extra_edges(SmoothMesh *mesh, float split_angle,
+ int flags, int *extra_edges)
+{
+ /* if normal1 dot normal2 < threshold, angle is greater, so split */
+ /* FIXME not sure if this always works */
+ /* 0.00001 added for floating-point rounding */
+ float threshold = cos((split_angle + 0.00001) * M_PI / 180.0);
+ int i;
+
+ *extra_edges = 0;
+
+ /* loop through edges, counting potential new ones */
+ for(i = 0; i < mesh->num_edges; i++) {
+ SmoothEdge *edge = &mesh->edges[i];
+ int sharp = 0;
+
+ /* treat all non-manifold edges (3 or more faces) as sharp */
+ if(edge->faces && edge->faces->next && edge->faces->next->next) {
+ LinkNode *node;
+
+ /* this edge is sharp */
+ sharp = 1;
+
+ /* add an extra edge for every face beyond the first */
+ *extra_edges += 2;
+ for(node = edge->faces->next->next->next; node; node = node->next)
+ (*extra_edges)++;
+ } else if((flags & (MOD_EDGESPLIT_FROMANGLE | MOD_EDGESPLIT_FROMFLAG))
+ && !edge_is_loose(edge)) {
+ /* (the edge can only be sharp if we're checking angle or flag,
+ * and it has at least 2 faces) */
+
+ /* if we're checking the sharp flag and it's set, good */
+ if((flags & MOD_EDGESPLIT_FROMFLAG) && (edge->flag & ME_SHARP)) {
+ /* this edge is sharp */
+ sharp = 1;
+
+ (*extra_edges)++;
+ } else if(flags & MOD_EDGESPLIT_FROMANGLE) {
+ /* we know the edge has 2 faces, so check the angle */
+ SmoothFace *face1 = edge->faces->link;
+ SmoothFace *face2 = edge->faces->next->link;
+ float edge_angle_cos = dot_v3v3(face1->normal,
+ face2->normal);
+
+ if(edge_angle_cos < threshold) {
+ /* this edge is sharp */
+ sharp = 1;
+
+ (*extra_edges)++;
+ }
+ }
+ }
+
+ /* set/clear sharp flag appropriately */
+ if(sharp) edge->flag |= ME_SHARP;
+ else edge->flag &= ~ME_SHARP;
+ }
+}
+
+static void split_sharp_edges(SmoothMesh *mesh, float split_angle, int flags)
+{
+ SmoothVert *vert;
+ int i;
+ /* if normal1 dot normal2 < threshold, angle is greater, so split */
+ /* FIXME not sure if this always works */
+ /* 0.00001 added for floating-point rounding */
+ mesh->threshold = cos((split_angle + 0.00001) * M_PI / 180.0);
+ mesh->flags = flags;
+
+ /* loop through edges, splitting sharp ones */
+ /* can't use an iterator here, because we'll be adding edges */
+ for(i = 0; i < mesh->num_edges; i++) {
+ SmoothEdge *edge = &mesh->edges[i];
+
+ if(edge_is_sharp(edge, flags, mesh->threshold)) {
+ split_edge(edge, edge->verts[0], mesh);
+
+ do {
+ pop_propagate_stack(&edge, &vert, mesh);
+ if(edge && smoothedge_has_vert(edge, vert))
+ propagate_split(edge, vert, mesh);
+ } while(edge);
+ }
+ }
+}
+
+static int count_bridge_verts(SmoothMesh *mesh)
+{
+ int i, j, count = 0;
+
+ for(i = 0; i < mesh->num_faces; i++) {
+ SmoothFace *face = &mesh->faces[i];
+
+ for(j = 0; j < SMOOTHFACE_MAX_EDGES && face->edges[j]; j++) {
+ SmoothEdge *edge = face->edges[j];
+ SmoothEdge *next_edge;
+ SmoothVert *vert = edge->verts[1 - face->flip[j]];
+ int next = (j + 1) % SMOOTHFACE_MAX_EDGES;
+
+ /* wrap next around if at last edge */
+ if(!face->edges[next]) next = 0;
+
+ next_edge = face->edges[next];
+
+ /* if there are other faces sharing this vertex but not
+ * these edges, the vertex will be split, so count it
+ */
+ /* vert has to have at least one face (this one), so faces != 0 */
+ if(!edge->faces->next && !next_edge->faces->next
+ && vert->faces->next) {
+ count++;
+ }
+ }
+ }
+
+ /* each bridge vert will be counted once per face that uses it,
+ * so count is too high, but it's ok for now
+ */
+ return count;
+}
+
+static void split_bridge_verts(SmoothMesh *mesh)
+{
+ int i,j;
+
+ for(i = 0; i < mesh->num_faces; i++) {
+ SmoothFace *face = &mesh->faces[i];
+
+ for(j = 0; j < SMOOTHFACE_MAX_EDGES && face->edges[j]; j++) {
+ SmoothEdge *edge = face->edges[j];
+ SmoothEdge *next_edge;
+ SmoothVert *vert = edge->verts[1 - face->flip[j]];
+ int next = (j + 1) % SMOOTHFACE_MAX_EDGES;
+
+ /* wrap next around if at last edge */
+ if(!face->edges[next]) next = 0;
+
+ next_edge = face->edges[next];
+
+ /* if there are other faces sharing this vertex but not
+ * these edges, split the vertex
+ */
+ /* vert has to have at least one face (this one), so faces != 0 */
+ if(!edge->faces->next && !next_edge->faces->next
+ && vert->faces->next)
+ /* FIXME this needs to find all faces that share edges with
+ * this one and split off together
+ */
+ split_single_vert(vert, face, mesh);
+ }
+ }
+}
+
+static DerivedMesh *edgesplitModifier_do(EdgeSplitModifierData *emd,
+ Object *ob, DerivedMesh *dm)
+{
+ SmoothMesh *mesh;
+ DerivedMesh *result;
+ int max_verts, max_edges;
+
+ if(!(emd->flags & (MOD_EDGESPLIT_FROMANGLE | MOD_EDGESPLIT_FROMFLAG)))
+ return dm;
+
+ /* 1. make smoothmesh with initial number of elements */
+ mesh = smoothmesh_from_derivedmesh(dm);
+
+ /* 2. count max number of elements to add */
+ tag_and_count_extra_edges(mesh, emd->split_angle, emd->flags, &max_edges);
+ max_verts = max_edges * 2 + mesh->max_verts;
+ max_verts += count_bridge_verts(mesh);
+ max_edges += mesh->max_edges;
+
+ /* 3. reallocate smoothmesh arrays & copy elements across */
+ /* 4. remap copied elements' pointers to point into the new arrays */
+ smoothmesh_resize_verts(mesh, max_verts);
+ smoothmesh_resize_edges(mesh, max_edges);
+
+#ifdef EDGESPLIT_DEBUG_1
+ printf("********** Pre-split **********\n");
+ smoothmesh_print(mesh);
+#endif
+
+ split_sharp_edges(mesh, emd->split_angle, emd->flags);
+#ifdef EDGESPLIT_DEBUG_1
+ printf("********** Post-edge-split **********\n");
+ smoothmesh_print(mesh);
+#endif
+
+ split_bridge_verts(mesh);
+
+#ifdef EDGESPLIT_DEBUG_1
+ printf("********** Post-vert-split **********\n");
+ smoothmesh_print(mesh);
+#endif
+
+#ifdef EDGESPLIT_DEBUG_0
+ printf("Edgesplit: Estimated %d verts & %d edges, "
+ "found %d verts & %d edges\n", max_verts, max_edges,
+ mesh->num_verts, mesh->num_edges);
+#endif
+
+ result = CDDM_from_smoothmesh(mesh);
+ smoothmesh_free(mesh);
+
+ return result;
+}
+
+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, struct EditMesh *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..7d506ebfae0
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_explode.c
@@ -0,0 +1,903 @@
+/*
+* $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->getFaceArray(dm);
+ totface= dm->getNumFaces(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){
+ int defgrp_index= emd->vgroup-1;
+ for(i=0; i<totvert; i++, dvert++){
+ val = BLI_frand();
+ val = (1.0f-emd->protect)*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; 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_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_faces(dm);
+ MVert *dupve, *mv;
+ EdgeHash *edgehash;
+ EdgeHashIterator *ehi;
+ int totvert=dm->getNumVerts(dm);
+ int totface=dm->getNumFaces(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->getFaceData(dm,i,CD_MFACE);//CDDM_get_face(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);
+
+ /* 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->getFace(dm, i, &source);
+ dest = CDDM_get_face(splitdm, i);
+
+ DM_copy_face_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; i<totface; i++,fs++){
+ if(*fs){
+ mf=CDDM_get_face(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_face(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_face(splitdm,curdupface);
+ DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
+ *df1=*mf;
+ curdupface++;
+
+ df2=CDDM_get_face(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_face(splitdm,curdupface);
+ DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
+ *df1=*mf;
+ curdupface++;
+
+ df2=CDDM_get_face(splitdm,curdupface);
+ DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
+ *df2=*mf;
+ curdupface++;
+
+ df3=CDDM_get_face(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_face(splitdm,curdupface);
+ DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
+ *df1=*mf;
+ curdupface++;
+
+ df2=CDDM_get_face(splitdm,curdupface);
+ DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
+ *df2=*mf;
+ curdupface++;
+
+ df3=CDDM_get_face(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_face(splitdm,curdupface);
+ DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
+ *df1=*mf;
+ curdupface++;
+
+ df2=CDDM_get_face(splitdm,curdupface);
+ DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
+ *df2=*mf;
+ curdupface++;
+
+ df3=CDDM_get_face(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);
+
+ return splitdm;
+
+}
+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->getNumFaces(dm);
+ totvert= dm->getNumVerts(dm);
+ mface= dm->getFaceArray(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; 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= &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);
+ /*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; 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->getFace(dm,i,&source);
+ mf=CDDM_get_face(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;
+ }
+
+ 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->getNumFaces(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..c683bee0b35
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_fluidsim.c
@@ -0,0 +1,158 @@
+/*
+* $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 "DNA_object_types.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..0c5428cc9d8
--- /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 <stddef.h>
+#include <zlib.h>
+
+#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; 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);
+
+ 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_faces(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_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; i<totvert;i++)
+ {
+ for(j=0; j<3; j++)
+ {
+ gzread(gzf, &wrf, sizeof( wrf ));
+ velarray[3*i + j] = wrf;
+ }
+ }
+
+ gzclose(gzf);
+}
+
+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_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->getFaceArray(orgdm);
+ mat_nr = mface[0].mat_nr;
+ flag = mface[0].flag;
+
+ mface = dm->getFaceArray(dm);
+ numfaces = dm->getNumFaces(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;
+}
+
+#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);
+
+ 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
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..2c9ae311585
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_hook.c
@@ -0,0 +1,279 @@
+/*
+* $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 "DNA_object_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..4270f2ff6e8
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_lattice.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 <string.h>
+
+#include "DNA_object_types.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..94eb2380b66
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_mask.c
@@ -0,0 +1,409 @@
+/*
+* $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 "MEM_guardedalloc.h"
+
+#include "BLI_ghash.h"
+
+#include "DNA_armature_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.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->getNumFaces(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->getFace(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);
+
+
+ /* 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->getFace(dm, oldIndex, &source);
+ dest = CDDM_get_face(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 */
+ return result;
+}
+
+
+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..fa1ee7e3159
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_meshdeform.c
@@ -0,0 +1,452 @@
+/*
+* $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_object_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 "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;
+
+ zero_v3(co);
+ 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;
+ }
+ }
+
+ 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;
+ struct EditMesh *em = (me)? BKE_mesh_get_editmesh(me): 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= editmesh_get_derived_cage_and_final(md->scene, ob, em, &cagedm, 0);
+ if(tmpdm)
+ tmpdm->release(tmpdm);
+ BKE_mesh_end_editmesh(me, em);
+ }
+ 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; a<totcagevert; a++) {
+ /* get cage vertex in world space with binding transform */
+ copy_v3_v3(co, cagecos[a]);
+
+ if(G.rt != 527) {
+ mul_m4_v3(mmd->bindmat, 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; 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 */
+ mul_v3_m4v3(co, cagemat, vertexCos[b]);
+ totweight= meshdeform_dynamic_bind(mmd, dco, co);
+ }
+ else {
+ totweight= 0.0f;
+ zero_v3(co);
+
+ for(a=offsets[b]; a<offsets[b+1]; a++) {
+ weight= influences[a].weight;
+ madd_v3_v3fl(co, dco[influences[a].vertex], weight);
+ totweight += weight;
+ }
+ }
+
+ if(totweight > 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 EditMesh *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<totvert; b++) {
+ for(a=0; a<totcagevert; a++) {
+ weight= weights[a + b*totcagevert];
+
+ if(weight > 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; b<totvert; b++) {
+ mmd->bindoffsets[b]= totinfluence;
+ totweight= 0.0f;
+
+ /* sum total weight */
+ for(a=0; a<totcagevert; a++) {
+ weight= weights[a + b*totcagevert];
+
+ if(weight > MESHDEFORM_MIN_INFLUENCE)
+ totweight += weight;
+ }
+
+ /* assign weights normalized */
+ for(a=0; a<totcagevert; a++) {
+ weight= weights[a + b*totcagevert];
+
+ if(weight > 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..06c93eefc59
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_mirror.c
@@ -0,0 +1,349 @@
+/*
+* $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_object_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 "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");
+ }
+}
+
+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->getNumFaces(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);
+
+
+ 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_m4_v3(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_m4_v3(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_m4_v3(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_face(result, numFaces);
+
+ dm->getFace(dm, i, &inMF);
+
+ DM_copy_face_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_face(result, numFaces);
+ static int corner_indices[4] = {2, 1, 0, 3};
+
+ DM_copy_face_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->getFaceData(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_face_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);
+
+ 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..766a3756d4a
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_multires.c
@@ -0,0 +1,123 @@
+/*
+* $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 "BKE_cdderivedmesh.h"
+#include "BKE_multires.h"
+#include "BKE_modifier.h"
+#include "BKE_paint.h"
+#include "BKE_particle.h"
+
+#include "DNA_mesh_types.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;
+ Mesh *me= (Mesh*)ob->data;
+
+ if(mmd->totlvl) {
+ if(!CustomData_get_layer(&me->fdata, CD_MDISPS)) {
+ /* multires can't work without displacement layer */
+ modifier_setError(md, "Modifier needs mesh with displacement data.");
+ return dm;
+ }
+ }
+
+ 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);
+ 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..0c749b79f5a
--- /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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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..4f5acc60cda
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_particleinstance.c
@@ -0,0 +1,341 @@
+/*
+* $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 "MEM_guardedalloc.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; 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->getNumFaces(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);
+
+ 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*/
+ copy_v3_v3(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->getFaceArray(result);
+ orig_mface=dm->getFaceArray(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_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);
+
+ return result;
+}
+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..02480b8d2a3
--- /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; 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 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);
+ 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->getNumFaces(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->getNumFaces(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..d65d0b6039a
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_screw.c
@@ -0,0 +1,899 @@
+/*
+* $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 "DNA_object_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;
+
+
+static void screwvert_iter_init(ScrewVertIter *iter, ScrewVertConnect *array, int v_init, int 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];
+ iter->e = iter->v_poin->e[!dir];
+ }
+ else {
+ iter->v_poin= NULL;
+ iter->e= NULL;
+ }
+}
+
+
+static void screwvert_iter_step(ScrewVertIter *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];
+ iter->e= iter->v_poin->e[(iter->v_poin->e[0] == iter->e)];
+ }
+ 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 step;
+ int i, j;
+ int i1,i2;
+ int step_tot= ltmd->steps;
+ const int do_flip = ltmd->flag & MOD_SCREW_NORMAL_FLIP ? 1 : 0;
+ 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);
+
+ step_tot= 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) {
+ /* 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);
+
+ /* calc the axis vec */
+ mul_mat3_m4_v3(mtx_tx, axis_vec); /* only rotation component */
+ 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 mtx3_tx[3][3];
+ copy_m3_m4(mtx3_tx, mtx_tx);
+
+ 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 */
+ step_tot = ((step_tot + 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;
+ step_tot--;
+ if(step_tot < 2) step_tot= 2;
+
+ maxVerts = totvert * step_tot; /* -1 because we're joining back up */
+ maxEdges = (totvert * step_tot) + /* these are the edges between new verts */
+ (totedge * step_tot); /* -1 because vert edges join */
+ maxFaces = totedge * step_tot;
+
+ screw_ofs= 0.0f;
+ }
+ else {
+ close= 0;
+ if(step_tot < 2) step_tot= 2;
+
+ maxVerts = totvert * step_tot; /* -1 because we're joining back up */
+ maxEdges = (totvert * (step_tot-1)) + /* these are the edges between new verts */
+ (totedge * step_tot); /* -1 because vert edges join */
+ maxFaces = totedge * (step_tot-1);
+ }
+
+ result= CDDM_from_template(dm, maxVerts, maxEdges, maxFaces);
+
+ /* copy verts from mesh */
+ mvert_orig = dm->getVertArray(dm);
+ medge_orig = dm->getEdgeArray(dm);
+
+ mvert_new = result->getVertArray(result);
+ mface_new = result->getFaceArray(result);
+ medge_new = result->getEdgeArray(result);
+
+ origindex= result->getFaceDataArray(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; i<totedge; i++, med_new++) {
+ vc= &vert_connect[med_new->v1];
+
+ 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 v_best=-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);*/
+ screwvert_iter_init(&lt_iter, vert_connect, i, j);
+ if (j == 1) {
+ screwvert_iter_step(&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;
+ v_best= lt_iter.v;
+ /*printf("\t\t\tVERT BEST: %i\n", v_best);*/
+ }
+ screwvert_iter_step(&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 (v_best != -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[v_best];
+
+ 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_vec2, 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
+ * note: flip is now done at face level so copying vgroup slizes is easier */
+ /*
+ if (do_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);*/
+
+ screwvert_iter_init(&lt_iter, vert_connect, v_best, 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");
+ }*/
+ screwvert_iter_step(&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 {
+ 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 */
+
+ DM_copy_vert_data(dm, result, 0, 0, totvert);
+
+ /* Add Faces */
+ for (step=1; step < step_tot; step++) {
+ const int varray_stride= totvert * step;
+ float step_angle;
+ float nor_tx[3];
+ /* Rotation Matrix */
+ step_angle= (angle / (step_tot - (!close))) * step;
+
+ 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)step / (float)(step_tot-1)));
+
+ /* copy a slice */
+ DM_copy_vert_data(dm, result, 0, varray_stride, totvert);
+
+ mv_new_base= mvert_new;
+ mv_new= &mvert_new[varray_stride]; /* advance to the next slice */
+
+ for (j=0; j<totvert; j++, mv_new_base++, mv_new++) {
+ /* set normal */
+ if(vert_connect) {
+ mul_v3_m3v3(nor_tx, mat3, vert_connect[j].no);
+
+ /* set the normal now its transformed */
+ normal_float_to_short_v3(mv_new->no, nor_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= varray_stride + j;
+ 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 */
+ const int varray_stride= (step_tot - 1) * totvert;
+
+ for (i=0; i<totvert; i++) {
+ med_new->v1= i;
+ med_new->v2= varray_stride + i;
+ 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 (step=0; step < step_tot-1; step++) {
+
+ /* new face */
+ if(do_flip) {
+ mf_new->v4= i1;
+ mf_new->v3= i2;
+ mf_new->v2= i2 + totvert;
+ mf_new->v1= i1 + totvert;
+ }
+ else {
+ 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 (step) { /* The first set is already 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) {
+ if(do_flip) {
+ mf_new->v4= i1;
+ mf_new->v3= i2;
+ mf_new->v2= med_new_firstloop->v2;
+ mf_new->v1= med_new_firstloop->v1;
+ }
+ else {
+ 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);
+ }
+
+ return 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, &ltmd->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; a<numVerts; a++)
+ copy_m3_m3(defMats[a], scale);
+ }
+}
+
+
+ModifierTypeInfo modifierType_ShapeKey = {
+ /* name */ "ShapeKey",
+ /* structName */ "ShapeKeyModifierData",
+ /* structSize */ sizeof(ShapeKeyModifierData),
+ /* type */ eModifierTypeType_OnlyDeform,
+ /* flags */ eModifierTypeFlag_AcceptsCVs
+ | eModifierTypeFlag_SupportsEditmode,
+
+ /* copyData */ 0,
+ /* deformVerts */ deformVerts,
+ /* deformVertsEM */ deformVertsEM,
+ /* deformMatricesEM */ deformMatricesEM,
+ /* applyModifier */ 0,
+ /* applyModifierEM */ 0,
+ /* initData */ 0,
+ /* requiredDataMask */ 0,
+ /* freeData */ 0,
+ /* isDisabled */ 0,
+ /* updateDepgraph */ 0,
+ /* dependsOnTime */ 0,
+ /* foreachObjectLink */ 0,
+ /* foreachIDLink */ 0,
+};
diff --git a/source/blender/modifiers/intern/MOD_shrinkwrap.c b/source/blender/modifiers/intern/MOD_shrinkwrap.c
new file mode 100644
index 00000000000..6526be4cb53
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_shrinkwrap.c
@@ -0,0 +1,171 @@
+/*
+* $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_modifier.h"
+#include "BKE_shrinkwrap.h"
+
+#include "DNA_object_types.h"
+
+#include "depsgraph_private.h"
+
+#include "MOD_util.h"
+
+
+static void 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 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
index 8ceb327b63c..c64fec4075d 100644
--- a/source/blender/blenkernel/intern/simple_deform.c
+++ b/source/blender/modifiers/intern/MOD_simpledeform.c
@@ -1,48 +1,55 @@
-/**
- * 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 "DNA_object_types.h"
-#include "BKE_DerivedMesh.h"
+#include "BLI_math.h"
+
+#include "BKE_cdderivedmesh.h"
#include "BKE_lattice.h"
+#include "BKE_modifier.h"
#include "BKE_deform.h"
-#include "BKE_utildefines.h"
-#include "BLI_math.h"
#include "BKE_shrinkwrap.h"
+#include "BKE_utildefines.h"
+
+#include "depsgraph_private.h"
+
+#include "MOD_util.h"
-#include <string.h>
-#include <math.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];
@@ -86,7 +93,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];
}
}
@@ -132,7 +139,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];
}
}
@@ -144,7 +151,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
@@ -163,7 +170,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);
@@ -246,10 +253,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..25153de7be4
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_smoke.c
@@ -0,0 +1,146 @@
+/*
+* $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 "DNA_object_types.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..a6d99ad72ae
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_solidify.c
@@ -0,0 +1,666 @@
+/*
+* $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->getFaceArray(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;
+ 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->getFaceArray(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) { \
+ 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; 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);
+
+ mface = result->getFaceArray(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_face_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;
+ }
+
+ /* 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; i<numVerts; i++, mv++) {
+ if(dv) {
+ if(defgrp_invert) scalar_short_vgroup = scalar_short * (1.0f - defvert_find_weight(dv, defgrp_index));
+ else scalar_short_vgroup = scalar_short * defvert_find_weight(dv, defgrp_index);
+ dv++;
+ }
+ VECADDFAC(mv->co, 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; i<numVerts; i++, mv++) {
+ if(dv) {
+ if(defgrp_invert) scalar_short_vgroup = scalar_short * (1.0f - defvert_find_weight(dv, defgrp_index));
+ else scalar_short_vgroup = scalar_short * defvert_find_weight(dv, defgrp_index);
+ dv++;
+ }
+ VECADDFAC(mv->co, 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; 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];
+ }
+ }
+
+ /* vertex group support */
+ if(dvert) {
+ dv= dvert;
+ if(defgrp_invert) {
+ for(i=0; i<numVerts; i++, dv++) {
+ vert_angles[i] *= (1.0f - defvert_find_weight(dv, defgrp_index));
+ }
+ }
+ else {
+ for(i=0; i<numVerts; i++, dv++) {
+ vert_angles[i] *= defvert_find_weight(dv, defgrp_index);
+ }
+ }
+ }
+
+ if(ofs_new) {
+ mv= mvert + ((ofs_new >= ofs_orig) ? 0 : numVerts);
+
+ for(i=0; i<numVerts; i++, mv++) {
+ if(vert_accum[i]) { /* zero if unselected */
+ madd_v3_v3fl(mv->co, 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; i<numVerts; i++, mv++) {
+ if(vert_accum[i]) { /* zero if unselected */
+ madd_v3_v3fl(mv->co, 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; i<numVerts; i++, mv++) {
+ mv->no[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; i<newEdges; i++, ed++) {
+ ed->v1= 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<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_face_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_face_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; i<newEdges; i++, ed++) {
+ float nor_cpy[3];
+ short *nor_short;
+ int j;
+
+ /* note, only the first vertex (lower half of the index) is calculated */
+ normalize_v3_v3(nor_cpy, edge_vert_nos[ed->v1]);
+
+ 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);
+ }
+
+ return result;
+}
+
+#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..799df64b2b5
--- /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);
+ 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..223d8e7792f
--- /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);
+ 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);
+ }
+}
+
+
+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..754b18bc282
--- /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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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);
+ 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..5750e042199
--- /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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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..1a595cbf051
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_uvproject.c
@@ -0,0 +1,423 @@
+/*
+* $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 "DNA_object_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->getFaceArray(dm);
+ numFaces = dm->getNumFaces(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..191c702903a
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_wave.c
@@ -0,0 +1,460 @@
+/*
+* $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 "DNA_object_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->getFaceArray(dm);
+ MFace *mf;
+ char *done = MEM_callocN(sizeof(*done) * numVerts,
+ "get_texture_coords done");
+ int numFaces = dm->getNumFaces(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..94ea068a1bc
--- /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., 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 *****
+#
+#
+
+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 a173908aeb1..f997e640a17 100644
--- a/source/blender/nodes/Makefile
+++ b/source/blender/nodes/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) Blender Foundation.
# All rights reserved.
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
index b081880b87b..e502129c3d3 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
@@ -44,20 +44,38 @@ 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], 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;
+ rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601);
+
+ //normalize to 0..1.0
+ out[0]=out[0]/255.0;
+ out[1]=out[1]/255.0;
+ out[2]=out[2]/255.0;
+
+ //rescale to -1.0..1.0
+ out[0]=(out[0]*2.0)-1.0;
+ out[1]=(out[1]*2.0)-1.0;
+ out[2]=(out[2]*2.0)-1.0;
+
+// out[0]=((out[0])-16)/255.0;
+// out[1]=((out[1])-128)/255.0;
+// out[2]=((out[2])-128)/255.0;
out[3]=in[3];
}
static void do_ycca_to_rgba_normalized(bNode *node, float *out, float *in)
{
- /*un-normalize the normalize from above */
- in[0]=(in[0]*255.0)+16;
- in[1]=(in[1]*255.0)+128;
- in[2]=(in[2]*255.0)+128;
+ /*un-normalize the normalize from above */
+ in[0]=(in[0]+1.0)/2.0;
+ in[1]=(in[1]+1.0)/2.0;
+ in[2]=(in[2]+1.0)/2.0;
+
+ in[0]=(in[0]*255.0);
+ in[1]=(in[1]*255.0);
+ in[2]=(in[2]*255.0);
+
+// 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], BLI_YCC_ITU_BT601);
out[3]=in[3];
}
@@ -65,47 +83,41 @@ static void do_ycca_to_rgba_normalized(bNode *node, float *out, float *in)
static void do_chroma_key(bNode *node, float *out, float *in)
{
NodeChroma *c;
- float x, z, alpha;
- float theta, beta, angle;
- float kfg, newY, newCb, newCr;
+ float x, z, alpha;
+ float theta, beta, angle, angle2;
+ float kfg;
c=node->storage;
- /* Algorithm from book "Video Demistified" */
+ /* Algorithm from book "Video Demistified," does not include the spill reduction part */
/* find theta, the angle that the color space should be rotated based on key*/
- theta=atan2(c->key[2],c->key[1]);
+ theta=atan2(c->key[2], c->key[1]);
/*rotate the cb and cr into x/z space */
- x=in[1]*cos(theta)+in[2]*sin(theta);
- z=in[2]*cos(theta)-in[1]*sin(theta);
+ x=in[1]*cos(theta)+in[2]*sin(theta);
+ z=in[2]*cos(theta)-in[1]*sin(theta);
- /*if within the acceptance angle */
- angle=c->t1*M_PI/180.0; /* convert to radians */
+ /*if within the acceptance angle */
+ angle=c->t1*M_PI/180.0; /* convert to radians */
- /* if kfg is <0 then the pixel is outside of the key color */
- kfg=x-(fabs(z)/tan(angle/2.0));
+ /* if kfg is <0 then the pixel is outside of the key color */
+ kfg=x-(fabs(z)/tan(angle/2.0));
- if(kfg>0.0) { /* found a pixel that is within key color */
+ out[0]=in[0];
+ out[1]=in[1];
+ out[2]=in[2];
- newY=in[0]-(1-c->t3)*kfg;
- newCb=in[1]-kfg*cos((double)theta);
- newCr=in[2]-kfg*sin((double)theta);
- alpha=(kfg+c->fsize)*(c->fstrength);
+ if(kfg>0.0) { /* found a pixel that is within key color */
+ alpha=(1.0-kfg)*(c->fstrength);
- beta=atan2(newCr,newCb);
- beta=beta*180.0/M_PI; /* convert to degrees for compare*/
-
- /* if beta is within the clippin angle */
- if(fabs(beta)<(c->t2/2.0)) {
- newCb=0.0;
- newCr=0.0;
- alpha=0.0;
- }
+ beta=atan2(z,x);
+ angle2=c->t2*M_PI/180.0;
- out[0]=newY;
- out[1]=newCb;
- out[2]=newCr;
+ /* if beta is within the cutoff angle */
+ if(fabs(beta)<(angle2/2.0)) {
+ alpha=0.0;
+ }
/* don't make something that was more transparent less transparent */
if (alpha<in[3]) {
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c b/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c
index 54fb1e384c3..3191ad757a0 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c
@@ -34,7 +34,8 @@
/* ******************* Color Spill Supression ********************************* */
static bNodeSocketType cmp_node_color_spill_in[]={
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ {SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
{-1,0,""}
};
@@ -50,6 +51,14 @@ static void do_simple_spillmap_red(bNode *node, float* out, float *in)
out[0]=in[0]-( ncs->limscale * in[ncs->limchan] );
}
+static void do_simple_spillmap_red_fac(bNode *node, float* out, float *in, float *fac)
+{
+ NodeColorspill *ncs;
+ ncs=node->storage;
+
+ out[0] = *fac * (in[0]-( ncs->limscale * in[ncs->limchan]));
+}
+
static void do_simple_spillmap_green(bNode *node, float* out, float *in)
{
NodeColorspill *ncs;
@@ -57,6 +66,14 @@ static void do_simple_spillmap_green(bNode *node, float* out, float *in)
out[0]=in[1]-( ncs->limscale * in[ncs->limchan] );
}
+static void do_simple_spillmap_green_fac(bNode *node, float* out, float *in, float *fac)
+{
+ NodeColorspill *ncs;
+ ncs=node->storage;
+
+ out[0] = *fac * (in[1]-( ncs->limscale * in[ncs->limchan]));
+}
+
static void do_simple_spillmap_blue(bNode *node, float* out, float *in)
{
NodeColorspill *ncs;
@@ -64,6 +81,14 @@ static void do_simple_spillmap_blue(bNode *node, float* out, float *in)
out[0]=in[2]-( ncs->limscale * in[ncs->limchan] );
}
+static void do_simple_spillmap_blue_fac(bNode *node, float* out, float *in, float *fac)
+{
+ NodeColorspill *ncs;
+ ncs=node->storage;
+
+ out[0] = *fac * (in[2]-( ncs->limscale * in[ncs->limchan]));
+}
+
static void do_average_spillmap_red(bNode *node, float* out, float *in)
{
NodeColorspill *ncs;
@@ -71,6 +96,14 @@ static void do_average_spillmap_red(bNode *node, float* out, float *in)
out[0]=in[0]-(ncs->limscale * avg(in[1], in[2]) );
}
+static void do_average_spillmap_red_fac(bNode *node, float* out, float *in, float *fac)
+{
+ NodeColorspill *ncs;
+ ncs=node->storage;
+
+ out[0] = *fac * (in[0]-(ncs->limscale * avg(in[1], in[2]) ));
+}
+
static void do_average_spillmap_green(bNode *node, float* out, float *in)
{
NodeColorspill *ncs;
@@ -78,6 +111,14 @@ static void do_average_spillmap_green(bNode *node, float* out, float *in)
out[0]=in[1]-(ncs->limscale * avg(in[0], in[2]) );
}
+static void do_average_spillmap_green_fac(bNode *node, float* out, float *in, float *fac)
+{
+ NodeColorspill *ncs;
+ ncs=node->storage;
+
+ out[0] = *fac * (in[0]-(ncs->limscale * avg(in[0], in[2]) ));
+}
+
static void do_average_spillmap_blue(bNode *node, float* out, float *in)
{
NodeColorspill *ncs;
@@ -85,6 +126,14 @@ static void do_average_spillmap_blue(bNode *node, float* out, float *in)
out[0]=in[2]-(ncs->limscale * avg(in[0], in[1]) );
}
+static void do_average_spillmap_blue_fac(bNode *node, float* out, float *in, float *fac)
+{
+ NodeColorspill *ncs;
+ ncs=node->storage;
+
+ out[0] = *fac * (in[0]-(ncs->limscale * avg(in[0], in[1]) ));
+}
+
static void do_apply_spillmap_red(bNode *node, float* out, float *in, float *map)
{
NodeColorspill *ncs;
@@ -109,7 +158,7 @@ static void do_apply_spillmap_green(bNode *node, float* out, float *in, float *m
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];
@@ -125,7 +174,7 @@ static void do_apply_spillmap_blue(bNode *node, float* out, float *in, float *ma
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];
@@ -138,16 +187,20 @@ static void node_composit_exec_color_spill(void *data, bNode *node, bNodeStack *
/*
Originally based on the information from the book "The Art and Science of Digital Composition" and
discussions from vfxtalk.com.*/
- CompBuf *cbuf;
+ CompBuf *cbuf;
+ CompBuf *mask;
CompBuf *rgbbuf;
CompBuf *spillmap;
NodeColorspill *ncs;
ncs=node->storage;
+
+ /* early out for missing connections */
+ if(out[0]->hasoutput==0 ) return;
+ if(in[0]->hasinput==0) return;
+ if(in[0]->data==NULL) return;
- if(out[0]->hasoutput==0 || in[0]->hasinput==0) return;
- if(in[0]->data==NULL) return;
-
- cbuf=typecheck_compbuf(in[0]->data, CB_RGBA);
+ cbuf=typecheck_compbuf(in[0]->data, CB_RGBA);
+ mask=typecheck_compbuf(in[1]->data, CB_VAL);
spillmap=alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1);
rgbbuf=dupalloc_compbuf(cbuf);
@@ -157,14 +210,22 @@ static void node_composit_exec_color_spill(void *data, bNode *node, bNodeStack *
{
switch(node->custom2)
{
- case 0: /* simple limit */
- {
- composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_simple_spillmap_red, CB_RGBA);
+ case 0: /* simple limit */
+ {
+ if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) {
+ composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_simple_spillmap_red, CB_RGBA);
+ } else {
+ composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_simple_spillmap_red_fac, CB_RGBA, CB_VAL);
+ }
break;
}
- case 1: /* average limit */
- {
- composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_average_spillmap_red, CB_RGBA);
+ case 1: /* average limit */
+ {
+ if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) {
+ composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_average_spillmap_red, CB_RGBA);
+ } else {
+ composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_average_spillmap_red_fac, CB_RGBA, CB_VAL);
+ }
break;
}
}
@@ -180,22 +241,30 @@ static void node_composit_exec_color_spill(void *data, bNode *node, bNodeStack *
{
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;
- }
+ case 0: /* simple limit */
+ {
+ if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) {
+ composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_simple_spillmap_green, CB_RGBA);
+ } else {
+ composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_simple_spillmap_green_fac, CB_RGBA, CB_VAL);
+ }
+ break;
+ }
+ case 1: /* average limit */
+ {
+ if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) {
+ composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_average_spillmap_green, CB_RGBA);
+ } else {
+ composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_average_spillmap_green_fac, CB_RGBA, CB_VAL);
+ }
+ 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;
}
@@ -203,16 +272,24 @@ static void node_composit_exec_color_spill(void *data, bNode *node, bNodeStack *
{
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;
- }
+ case 0: /* simple limit */
+ {
+ if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) {
+ composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_simple_spillmap_blue, CB_RGBA);
+ } else {
+ composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_simple_spillmap_blue_fac, CB_RGBA, CB_VAL);
+ }
+ break;
+ }
+ case 1: /* average limit */
+ {
+ if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) {
+ composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_average_spillmap_blue, CB_RGBA);
+ } else {
+ composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_average_spillmap_blue_fac, CB_RGBA, CB_VAL);
+ }
+ break;
+ }
}
if(ncs->unspill==0) {
ncs->uspillr=0.0f;
@@ -246,19 +323,18 @@ static void node_composit_init_color_spill(bNode *node)
}
bNodeType cmp_node_color_spill={
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_COLOR_SPILL,
- /* name */ "Color Spill",
- /* width+range */ 140, 80, 200,
- /* class+opts */ NODE_CLASS_MATTE, NODE_OPTIONS,
- /* input sock */ cmp_node_color_spill_in,
- /* output sock */ cmp_node_color_spill_out,
- /* storage */ "NodeColorspill",
- /* execfunc */ node_composit_exec_color_spill,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_color_spill,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
+ /* *next,*prev */ NULL, NULL,
+ /* type code */ CMP_NODE_COLOR_SPILL,
+ /* name */ "Color Spill",
+ /* width+range */ 140, 80, 200,
+ /* class+opts */ NODE_CLASS_MATTE, NODE_OPTIONS,
+ /* input sock */ cmp_node_color_spill_in,
+ /* output sock */ cmp_node_color_spill_out,
+ /* storage */ "NodeColorspill",
+ /* execfunc */ node_composit_exec_color_spill,
+ /* butfunc */ NULL,
+ /* initfunc */ node_composit_init_color_spill,
+ /* freestoragefunc */ node_free_standard_storage,
+ /* copystoragefunc */ node_copy_standard_storage,
};
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c b/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
index b40b27e06ee..43c6c6d791e 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
@@ -54,14 +54,19 @@ 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)
+/* note: lift_lgg is just 2-lift, gamma_inv is 1.0/gamma */
+DO_INLINE float colorbalance_lgg(float in, float lift_lgg, float gamma_inv, float gain)
{
- float x = gain*(in+(lift-1)*(1-in));
-
+ /* 1:1 match with the sequencer with linear/srgb conversions, the conversion isnt pretty
+ * but best keep it this way, sice testing for durian shows a similar calculation
+ * without lin/srgb conversions gives bad results (over-saturated shadows) with colors
+ * slightly below 1.0. some correction can be done but it ends up looking bad for shadows or lighter tones - campbell */
+ float x= (((linearrgb_to_srgb(in) - 1.0f) * lift_lgg) + 1.0f) * gain;
+
/* prevent NaN */
if (x < 0.f) x = 0.f;
-
- return powf(x, (1.f/gamma));
+
+ return powf(srgb_to_linearrgb(x), gamma_inv);
}
static void do_colorbalance_cdl(bNode *node, float* out, float *in)
@@ -88,10 +93,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_inv[0], n->gain[0]);
+ out[1] = colorbalance_lgg(in[1], n->lift_lgg[1], n->gamma_inv[1], n->gain[1]);
+ out[2] = colorbalance_lgg(in[2], n->lift_lgg[2], n->gamma_inv[2], n->gain[2]);
out[3] = in[3];
}
@@ -99,10 +104,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_inv[0], n->gain[0]);
+ out[1] = mfac*in[1] + *fac * colorbalance_lgg(in[1], n->lift_lgg[1], n->gamma_inv[1], n->gain[1]);
+ out[2] = mfac*in[2] + *fac * colorbalance_lgg(in[2], n->lift_lgg[2], n->gamma_inv[2], n->gain[2]);
out[3] = in[3];
}
@@ -119,7 +124,17 @@ 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;
+
+ for (c = 0; c < 3; c++) {
+ n->lift_lgg[c] = 2.0f - n->lift[c];
+ n->gamma_inv[c] = (n->gamma[c] != 0.0f) ? 1.0f/n->gamma[c] : 1000000.0f;
+ }
+ }
+
if (cbuf) {
stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* create output based on image input */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_crop.c b/source/blender/nodes/intern/CMP_nodes/CMP_crop.c
index c2edb3dd52f..dd5ce88bd36 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_crop.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_crop.c
@@ -48,7 +48,14 @@ static void node_composit_exec_crop(void *data, bNode *node, bNodeStack **in, bN
CompBuf *stackbuf;
int x, y;
float *srcfp, *outfp;
- rcti outputrect;
+ rcti outputrect;
+
+ if(node->custom2) {
+ ntxy->x1= cbuf->x* ntxy->fac_x1;
+ ntxy->x2= cbuf->x* ntxy->fac_x2;
+ ntxy->y1= cbuf->y* ntxy->fac_y1;
+ ntxy->y2= cbuf->y* ntxy->fac_y2;
+ }
/* check input image size */
if(cbuf->x <= ntxy->x1 + 1)
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; y<img->y; y++) {
- p = y * img->x;
+ unsigned int p = y * img->x;
+ int x;
for (x=0; x<img->x; 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; y<img->y; y++) {
- p = y*img->x;
+ unsigned int p = y*img->x;
+ int x;
+
for (x=0; x<img->x; 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; y<img->y; 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; x<img->x; 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; y<new->y; 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; x<new->x; 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_displace.c b/source/blender/nodes/intern/CMP_nodes/CMP_displace.c
index 877f71bfbfb..7d64d4e719c 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_displace.c
@@ -44,94 +44,96 @@ 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)
+static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float *veccol, CompBuf *xbuf, CompBuf *ybuf, 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 xs, ys;
+ 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; y<sy; y++) {
- for(x= 0; x< sx; x++, out+=4, in+=4, vec+=3) {
+ for(y=0; y < stackbuf->y; y++) {
+ for(x=0; x < stackbuf->x; x++) {
+ /* calc pixel coordinates */
+ qd_getPixel(vecbuf, x-vecbuf->xof, y-vecbuf->yof, vec);
- 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;
+ if (xbuf)
+ qd_getPixel(xbuf, x-xbuf->xof, y-xbuf->yof, &xs);
+ else
+ xs = xscale[0];
- /* 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]));
+ if (ybuf)
+ qd_getPixel(ybuf, x-ybuf->xof, y-ybuf->yof, &ys);
+ else
+ ys = yscale[0];
- 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;
+
+ p_dx = vec[0] * xs;
+ p_dy = vec[1] * ys;
+
+ /* 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] * xs;
+ d_dy = vecdy[0] * ys;
+
+ /* 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);
+ }
+ }
+*/
}
@@ -143,13 +145,18 @@ static void node_composit_exec_displace(void *data, bNode *node, bNodeStack **in
if(in[0]->data && in[1]->data) {
CompBuf *cbuf= in[0]->data;
CompBuf *vecbuf= in[1]->data;
+ CompBuf *xbuf= in[2]->data;
+ CompBuf *ybuf= in[3]->data;
CompBuf *stackbuf;
cbuf= typecheck_compbuf(cbuf, CB_RGBA);
vecbuf= typecheck_compbuf(vecbuf, CB_VEC3);
+ xbuf= typecheck_compbuf(xbuf, CB_VAL);
+ ybuf= typecheck_compbuf(ybuf, CB_VAL);
+
stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
- do_displace(stackbuf, cbuf, vecbuf, in[1]->vec, in[2]->vec, in[3]->vec);
+ do_displace(stackbuf, cbuf, vecbuf, in[1]->vec, xbuf, ybuf, in[2]->vec, in[3]->vec);
out[0]->data= stackbuf;
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c b/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c
index 58850cf3568..9eb79bb8c36 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);
@@ -143,7 +141,7 @@ static void node_composit_init_huecorrect(bNode* node)
for (c=0; c<3; c++) {
CurveMap *cuma = &cumapping->cm[c];
- curvemap_reset(cuma, &cumapping->clipr, cumapping->preset);
+ curvemap_reset(cuma, &cumapping->clipr, cumapping->preset, CURVEMAP_SLOPE_POSITIVE);
}
/* default to showing Saturation */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c b/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c
index d2eb27d13c6..6f29548fcc3 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c
@@ -47,7 +47,12 @@ static void node_composit_exec_output_file(void *data, bNode *node, bNodeStack *
if(nif->sfra!=nif->efra && (rd->cfra<nif->sfra || 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];
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 d80dd9b0a4b..0ac47c58ab3 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c
@@ -64,7 +64,7 @@ static void node_composit_exec_sephsva(void *data, bNode *node, bNodeStack **in,
if(in[0]->data==NULL) {
float h, s, v;
- rgb_to_hsv(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &h, &s, &v);
+ rgb_to_hsv(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &h, &s, &v);
out[0]->vec[0] = h;
out[1]->vec[0] = s;
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_value.c b/source/blender/nodes/intern/CMP_nodes/CMP_value.c
index 576fb37dc45..14a3b6fe15c 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_value.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_value.c
@@ -31,7 +31,7 @@
/* **************** VALUE ******************** */
static bNodeSocketType cmp_node_value_out[]= {
- { SOCK_VALUE, 0, "Value", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_VALUE, 0, "Value", 0.5f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f},
{ -1, 0, "" }
};
diff --git a/source/blender/nodes/intern/CMP_nodes/Makefile b/source/blender/nodes/intern/CMP_nodes/Makefile
index 5e8753570af..5e97864fb95 100644
--- a/source/blender/nodes/intern/CMP_nodes/Makefile
+++ b/source/blender/nodes/intern/CMP_nodes/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/nodes/intern/CMP_util.c b/source/blender/nodes/intern/CMP_util.c
index f66b13a1937..bcb038bccc3 100644
--- a/source/blender/nodes/intern/CMP_util.c
+++ b/source/blender/nodes/intern/CMP_util.c
@@ -578,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;
@@ -1125,7 +1125,19 @@ void convolve(CompBuf* dst, CompBuf* in1, CompBuf* in2)
// sets fcol to pixelcolor at (x, y)
void qd_getPixel(CompBuf* src, int x, int y, float* col)
{
- if ((x >= 0) && (x < src->x) && (y >= 0) && (y < src->y)) {
+ if(src->rect_procedural) {
+ float bc[4];
+ src->rect_procedural(src, bc, (float)x/(float)src->xrad, (float)y/(float)src->yrad);
+
+ switch(src->type){
+ /* these fallthrough to get all the channels */
+ case CB_RGBA: col[3]=bc[3];
+ case CB_VEC3: col[2]=bc[2];
+ case CB_VEC2: col[1]=bc[1];
+ case CB_VAL: col[0]=bc[0];
+ }
+ }
+ else if ((x >= 0) && (x < src->x) && (y >= 0) && (y < src->y)) {
float* bc = &src->rect[(x + y*src->x)*src->type];
switch(src->type){
/* these fallthrough to get all the channels */
diff --git a/source/blender/nodes/intern/Makefile b/source/blender/nodes/intern/Makefile
index 08f4b936c76..1ffc09bce2c 100644
--- a/source/blender/nodes/intern/Makefile
+++ b/source/blender/nodes/intern/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/nodes/intern/SHD_nodes/Makefile b/source/blender/nodes/intern/SHD_nodes/Makefile
index b6b21d5f5f8..666ffd4a7d3 100644
--- a/source/blender/nodes/intern/SHD_nodes/Makefile
+++ b/source/blender/nodes/intern/SHD_nodes/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/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 3182fca8272..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) {
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_value.c b/source/blender/nodes/intern/SHD_nodes/SHD_value.c
index 77e0ec3bba3..1663ea352aa 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_value.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_value.c
@@ -31,7 +31,7 @@
/* **************** VALUE ******************** */
static bNodeSocketType sh_node_value_out[]= {
- { SOCK_VALUE, 0, "Value", 0.5f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f},
+ { SOCK_VALUE, 0, "Value", 0.5f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f},
{ -1, 0, "" }
};
diff --git a/source/blender/nodes/intern/TEX_nodes/Makefile b/source/blender/nodes/intern/TEX_nodes/Makefile
index f42660bd562..74eabe7932a 100644
--- a/source/blender/nodes/intern/TEX_nodes/Makefile
+++ b/source/blender/nodes/intern/TEX_nodes/Makefile
@@ -18,7 +18,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/python/BPY_extern.h b/source/blender/python/BPY_extern.h
index 11208d54a73..40d544ac17e 100644
--- a/source/blender/python/BPY_extern.h
+++ b/source/blender/python/BPY_extern.h
@@ -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/CMakeLists.txt b/source/blender/python/CMakeLists.txt
index 3c79e9d3056..dcfc8678faa 100644
--- a/source/blender/python/CMakeLists.txt
+++ b/source/blender/python/CMakeLists.txt
@@ -36,6 +36,7 @@ SET(INC
../windowmanager
../editors/include
../../../intern/guardedalloc
+ ../../../intern/audaspace/intern
${PYTHON_INC}
)
diff --git a/source/blender/python/Makefile b/source/blender/python/Makefile
index 8e2a04b8449..43b6f91369b 100644
--- a/source/blender/python/Makefile
+++ b/source/blender/python/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) Blender Foundation.
# All rights reserved.
diff --git a/source/blender/python/SConscript b/source/blender/python/SConscript
index ca742a3646a..097f69155d5 100644
--- a/source/blender/python/SConscript
+++ b/source/blender/python/SConscript
@@ -6,10 +6,13 @@ sources = env.Glob('intern/*.c')
incs = '. ../editors/include ../makesdna ../makesrna ../blenlib ../blenkernel ../nodes'
incs += ' ../imbuf ../blenloader ../render/extern/include ../windowmanager'
incs += ' #intern/guardedalloc #intern/memutil #extern/glew/include'
-incs += ' ' + env['BF_PYTHON_INC']
+incs += ' #intern/audaspace/intern ' + env['BF_PYTHON_INC']
defs = []
+if env['BF_BUILDINFO']:
+ defs.append('BUILD_DATE')
+
if env['OURPLATFORM'] in ('win32-mingw', 'win32-vc','win64-vc') and env['BF_DEBUG']:
defs.append('_DEBUG')
@@ -18,4 +21,4 @@ env.BlenderLib( libname = 'bf_python', sources = Split(sources), includes = Spli
# generic
sources = env.Glob('generic/*.c')
-env.BlenderLib( libname = 'bf_gen_python', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core','player'], priority = [362,165]) # ketsji is 360
+env.BlenderLib( libname = 'bf_python_ext', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core','player'], priority = [362,165]) # ketsji is 360
diff --git a/source/blender/python/doc/epy/Geometry.py b/source/blender/python/doc/epy/Geometry.py
index 237cd8c3443..f8752a135c3 100644
--- a/source/blender/python/doc/epy/Geometry.py
+++ b/source/blender/python/doc/epy/Geometry.py
@@ -90,7 +90,7 @@ def LineIntersect(vec1, vec2, vec3, vec4):
def PolyFill(polylines):
"""
Takes a list of polylines and calculates triangles that would fill in the polylines.
- Multiple lines can be used to make holes inside a polyline, or fill in 2 seperate lines at once.
+ Multiple lines can be used to make holes inside a polyline, or fill in 2 separate lines at once.
@type polylines: List of lists containing vectors, each representing a closed polyline.
@rtype: list
@return: a list if tuples each a tuple of 3 ints representing a triangle indexing the points given.
@@ -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
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..0b30a0f4505
--- /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.Matrix.Rotation(radians(90), 4, 'X')
+mat_trans = mathutils.Matrix.Translation(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 944dbb082a6..06d1a9021b8 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,30 @@ import bpy
import rna_info
reload(rna_info)
+# lame, python wont give some access
+ClassMethodDescriptorType = type(dict.__dict__['fromkeys'])
+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 " \
+ "<http://wiki.blender.org/index.php/Dev:2.5/Py/API/Documentation/Contribute" \
+ "?action=edit&section=new&preload=Dev:2.5/Py/API/Documentation/Contribute/Howto-message" \
+ "&preloadtitle=%s.%s.%s>`_)\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 +76,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 +86,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 +142,28 @@ 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):
+ if identifier.startswith("_"):
+ return
+
+ 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) in (MethodDescriptorType, ClassMethodDescriptorType):
+ write_indented_lines(ident, fw, doc, False)
+ else:
+ raise TypeError("type was not GetSetDescriptorType, MethodDescriptorType or ClassMethodDescriptorType")
+
+ 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 +174,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 +193,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 +214,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 +243,45 @@ 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) == ClassMethodDescriptorType:
+ py_descr2sphinx(" ", fw, descr, module_name, type_name, key)
+
+ for key, descr in descr_items:
+ if type(descr) == MethodDescriptorType:
+ 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")
-
- 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")
-
+ py_descr2sphinx(" ", fw, descr, module_name, type_name, key)
+
fw("\n\n")
file.close()
@@ -251,11 +307,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,7 +334,7 @@ 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 <http://wiki.blender.org/index.php/Dev:2.5/Py/API/Intro>\n")
+ fw("An introduction to Blender and Python can be found at <http://wiki.blender.org/index.php/Dev:2.5/Py/API/Intro>\n")
fw("\n")
fw("`A PDF version of this document is also available <blender_python_reference_250.pdf>`__\n")
fw("\n")
@@ -283,6 +342,7 @@ def rna2sphinx(BASEPATH):
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")
@@ -292,22 +352,52 @@ 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(" * game engine modules\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")
# py modules
fw(" bpy.utils.rst\n\n")
+ fw(" bpy.path.rst\n\n")
fw(" bpy.app.rst\n\n")
# 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")
+ fw(" aud.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()
@@ -315,8 +405,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")
@@ -325,19 +415,44 @@ 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
pymodule2sphinx(BASEPATH, "bpy.utils", module, "Utilities (bpy.utils)")
+ from bpy import path as module
+ pymodule2sphinx(BASEPATH, "bpy.path", module, "Path Utilities (bpy.path)")
+
# C modules
from bpy import app as module
pymodule2sphinx(BASEPATH, "bpy.app", module, "Application Data (bpy.app)")
@@ -345,14 +460,27 @@ 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
+
+ import aud as module
+ pymodule2sphinx(BASEPATH, "aud", module, "Audio System (aud)")
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")
@@ -393,8 +521,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
@@ -402,37 +536,53 @@ 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)
+
+ # properties sorted in alphabetical order
+ sorted_struct_properties = struct.properties[:]
+ sorted_struct_properties.sort(key=lambda prop: prop.identifier)
- for prop in struct.properties:
- fw(" .. attribute:: %s\n\n" % prop.identifier)
+ 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()
@@ -444,7 +594,7 @@ def rna2sphinx(BASEPATH):
for func in struct.functions:
args_str = ", ".join([prop.get_arg_default(force=False) for prop in func.args])
- fw(" .. method:: %s(%s)\n\n" % (func.identifier, args_str))
+ fw(" .. %s:: %s(%s)\n\n" % ("classmethod" if func.is_classmethod else "method", func.identifier, args_str))
fw(" %s\n\n" % func.description)
for prop in func.args:
@@ -472,6 +622,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")
@@ -489,11 +695,43 @@ def rna2sphinx(BASEPATH):
if "_OT_" in struct.identifier:
continue
write_struct(struct)
+
+ # 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)
- # oeprators
+ 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()):
@@ -509,11 +747,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:
@@ -521,13 +766,14 @@ 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()
file.close()
-if __name__ == '__main__':
+def main():
+ import bpy
if 'bpy' not in dir():
print("\nError, this script must run from inside blender2.5")
print(script_help_msg)
@@ -535,22 +781,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)
@@ -560,3 +843,6 @@ if __name__ == '__main__':
import sys
sys.exit()
+
+if __name__ == '__main__':
+ main()
diff --git a/source/blender/python/doc/sphinx_doc_gen.sh b/source/blender/python/doc/sphinx_doc_gen.sh
index 3f5460a0626..4f5f55af2bd 100755
--- a/source/blender/python/doc/sphinx_doc_gen.sh
+++ b/source/blender/python/doc/sphinx_doc_gen.sh
@@ -1,15 +1,14 @@
#!/bin/sh
# run from the blender source dir
# bash source/blender/python/doc/sphinx_doc_gen.sh
-# ssh upload means you need a login into the server
+# 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"
-# clear doc dir
-rm -rf ./source/blender/python/doc/sphinx-in ./source/blender/python/doc/sphinx-out
-$BLENDER -b -P ./source/blender/python/doc/sphinx_doc_gen.py
+# 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
diff --git a/source/blender/python/generic/CMakeLists.txt b/source/blender/python/generic/CMakeLists.txt
index b6985458d0c..1a91abfbec8 100644
--- a/source/blender/python/generic/CMakeLists.txt
+++ b/source/blender/python/generic/CMakeLists.txt
@@ -31,4 +31,4 @@ SET(INC
${PYTHON_INC}
)
-BLENDERLIB(bf_gen_python "${SRC}" "${INC}")
+BLENDERLIB(bf_python_ext "${SRC}" "${INC}")
diff --git a/source/blender/python/generic/Makefile b/source/blender/python/generic/Makefile
index dc674478dab..0df98046f63 100644
--- a/source/blender/python/generic/Makefile
+++ b/source/blender/python/generic/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/python/generic/Mathutils.c b/source/blender/python/generic/Mathutils.c
deleted file mode 100644
index 542bf7a6ca9..00000000000
--- a/source/blender/python/generic/Mathutils.c
+++ /dev/null
@@ -1,721 +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.
- *
- * This is a new part of Blender.
- *
- * Contributor(s): Joseph Gilbert, Campbell Barton
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/* Note: Changes to Mathutils since 2.4x
- * use radians rather then degrees
- * - Mathutils.MidpointVecs --> vector.lerp(other, fac)
- * - Mathutils.AngleBetweenVecs --> vector.angle(other)
- * - Mathutils.ProjectVecs --> vector.project(other)
- * - Mathutils.DifferenceQuats --> quat.difference(other)
- * - Mathutils.Slerp --> quat.slerp(other, fac)
- * - Mathutils.Rand: removed, use pythons random module
- * - Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- * - Matrix.scalePart --> Matrix.scale_part
- * - Matrix.translationPart --> Matrix.translation_part
- * - Matrix.rotationPart --> Matrix.rotation_part
- * - toMatrix --> to_matrix
- * - toEuler --> to_euler
- * - toQuat --> to_quat
- * - Vector.toTrackQuat --> Vector.to_track_quat
- *
- * Moved to Geometry module: Intersect, TriangleArea, TriangleNormal, QuadNormal, LineIntersect
- */
-
-#include "Mathutils.h"
-
-#include "BLI_math.h"
-
-//-------------------------DOC STRINGS ---------------------------
-static char M_Mathutils_doc[] =
-"This module provides access to matrices, eulers, quaternions and vectors.";
-
-//-----------------------------METHODS----------------------------
-//-----------------quat_rotation (internal)-----------
-//This function multiplies a vector/point * quat or vice versa
-//to rotate the point/vector by the quaternion
-//arguments should all be 3D
-PyObject *quat_rotation(PyObject *arg1, PyObject *arg2)
-{
- float rot[3];
- QuaternionObject *quat = NULL;
- VectorObject *vec = NULL;
-
- if(QuaternionObject_Check(arg1)){
- quat = (QuaternionObject*)arg1;
- if(!BaseMath_ReadCallback(quat))
- return NULL;
-
- if(VectorObject_Check(arg2)){
- vec = (VectorObject*)arg2;
-
- if(!BaseMath_ReadCallback(vec))
- return NULL;
-
- rot[0] = quat->quat[0]*quat->quat[0]*vec->vec[0] + 2*quat->quat[2]*quat->quat[0]*vec->vec[2] -
- 2*quat->quat[3]*quat->quat[0]*vec->vec[1] + quat->quat[1]*quat->quat[1]*vec->vec[0] +
- 2*quat->quat[2]*quat->quat[1]*vec->vec[1] + 2*quat->quat[3]*quat->quat[1]*vec->vec[2] -
- quat->quat[3]*quat->quat[3]*vec->vec[0] - quat->quat[2]*quat->quat[2]*vec->vec[0];
- rot[1] = 2*quat->quat[1]*quat->quat[2]*vec->vec[0] + quat->quat[2]*quat->quat[2]*vec->vec[1] +
- 2*quat->quat[3]*quat->quat[2]*vec->vec[2] + 2*quat->quat[0]*quat->quat[3]*vec->vec[0] -
- quat->quat[3]*quat->quat[3]*vec->vec[1] + quat->quat[0]*quat->quat[0]*vec->vec[1] -
- 2*quat->quat[1]*quat->quat[0]*vec->vec[2] - quat->quat[1]*quat->quat[1]*vec->vec[1];
- rot[2] = 2*quat->quat[1]*quat->quat[3]*vec->vec[0] + 2*quat->quat[2]*quat->quat[3]*vec->vec[1] +
- quat->quat[3]*quat->quat[3]*vec->vec[2] - 2*quat->quat[0]*quat->quat[2]*vec->vec[0] -
- quat->quat[2]*quat->quat[2]*vec->vec[2] + 2*quat->quat[0]*quat->quat[1]*vec->vec[1] -
- quat->quat[1]*quat->quat[1]*vec->vec[2] + quat->quat[0]*quat->quat[0]*vec->vec[2];
- return newVectorObject(rot, 3, Py_NEW, NULL);
- }
- }else if(VectorObject_Check(arg1)){
- vec = (VectorObject*)arg1;
-
- if(!BaseMath_ReadCallback(vec))
- return NULL;
-
- if(QuaternionObject_Check(arg2)){
- quat = (QuaternionObject*)arg2;
- if(!BaseMath_ReadCallback(quat))
- return NULL;
-
- rot[0] = quat->quat[0]*quat->quat[0]*vec->vec[0] + 2*quat->quat[2]*quat->quat[0]*vec->vec[2] -
- 2*quat->quat[3]*quat->quat[0]*vec->vec[1] + quat->quat[1]*quat->quat[1]*vec->vec[0] +
- 2*quat->quat[2]*quat->quat[1]*vec->vec[1] + 2*quat->quat[3]*quat->quat[1]*vec->vec[2] -
- quat->quat[3]*quat->quat[3]*vec->vec[0] - quat->quat[2]*quat->quat[2]*vec->vec[0];
- rot[1] = 2*quat->quat[1]*quat->quat[2]*vec->vec[0] + quat->quat[2]*quat->quat[2]*vec->vec[1] +
- 2*quat->quat[3]*quat->quat[2]*vec->vec[2] + 2*quat->quat[0]*quat->quat[3]*vec->vec[0] -
- quat->quat[3]*quat->quat[3]*vec->vec[1] + quat->quat[0]*quat->quat[0]*vec->vec[1] -
- 2*quat->quat[1]*quat->quat[0]*vec->vec[2] - quat->quat[1]*quat->quat[1]*vec->vec[1];
- rot[2] = 2*quat->quat[1]*quat->quat[3]*vec->vec[0] + 2*quat->quat[2]*quat->quat[3]*vec->vec[1] +
- quat->quat[3]*quat->quat[3]*vec->vec[2] - 2*quat->quat[0]*quat->quat[2]*vec->vec[0] -
- quat->quat[2]*quat->quat[2]*vec->vec[2] + 2*quat->quat[0]*quat->quat[1]*vec->vec[1] -
- quat->quat[1]*quat->quat[1]*vec->vec[2] + quat->quat[0]*quat->quat[0]*vec->vec[2];
- return newVectorObject(rot, 3, Py_NEW, NULL);
- }
- }
-
- PyErr_SetString(PyExc_RuntimeError, "quat_rotation(internal): internal problem rotating vector/point\n");
- return NULL;
-
-}
-
-//----------------------------------MATRIX FUNCTIONS--------------------
-//----------------------------------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"
-" :type angle: float\n"
-" :arg size: The size of the rotation matrix to construct [2, 4].\n"
-" :type size: int\n"
-" :arg axis: a string in ['X', 'Y', 'Z'] or a 3D Vector Object (optional when size is 2).\n"
-" :type axis: string or :class:`Vector`\n"
-" :return: A new rotation matrix.\n"
-" :rtype: :class:`Matrix`\n";
-
-static PyObject *M_Mathutils_RotationMatrix(PyObject * self, PyObject * args)
-{
- VectorObject *vec= NULL;
- char *axis= NULL;
- int matSize;
- float angle = 0.0f;
- float mat[16] = {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};
-
- 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");
- 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");
- return NULL;
- }
- else {
- /* use the string */
- vec= NULL;
- }
- }
-
- while (angle<-(Py_PI*2))
- angle+=(Py_PI*2);
- while (angle>(Py_PI*2))
- 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");
- return NULL;
- }
- if(matSize == 2 && (vec != NULL)) {
- 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");
- return NULL;
- }
- if(vec) {
- if(vec->size != 3) {
- PyErr_SetString(PyExc_AttributeError, "Mathutils.RotationMatrix(): the vector axis must be a 3D vector\n");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec))
- return NULL;
-
- }
-
- /* check for valid vector/axis above */
- if(vec) {
- axis_angle_to_mat3( (float (*)[3])mat,vec->vec, angle);
- }
- else if(matSize == 2) {
- //2D rotation matrix
- mat[0] = (float) cos (angle);
- mat[1] = (float) sin (angle);
- mat[2] = -((float) sin(angle));
- mat[3] = (float) cos(angle);
- } else if(strcmp(axis, "X") == 0) {
- //rotation around X
- mat[0] = 1.0f;
- mat[4] = (float) cos(angle);
- mat[5] = (float) sin(angle);
- mat[7] = -((float) sin(angle));
- mat[8] = (float) cos(angle);
- } else if(strcmp(axis, "Y") == 0) {
- //rotation around Y
- mat[0] = (float) cos(angle);
- mat[2] = -((float) sin(angle));
- mat[4] = 1.0f;
- mat[6] = (float) sin(angle);
- mat[8] = (float) cos(angle);
- } else if(strcmp(axis, "Z") == 0) {
- //rotation around Z
- mat[0] = (float) cos(angle);
- mat[1] = (float) sin(angle);
- mat[3] = -((float) sin(angle));
- mat[4] = (float) cos(angle);
- mat[8] = 1.0f;
- }
- else {
- /* should never get here */
- PyErr_SetString(PyExc_AttributeError, "Mathutils.RotationMatrix(): unknown error\n");
- return NULL;
- }
-
- if(matSize == 4) {
- //resize matrix
- mat[10] = mat[8];
- mat[9] = mat[7];
- mat[8] = mat[6];
- mat[7] = 0.0f;
- mat[6] = mat[5];
- mat[5] = mat[4];
- mat[4] = mat[3];
- mat[3] = 0.0f;
- }
- //pass to matrix creation
- return newMatrixObject(mat, matSize, matSize, Py_NEW, NULL);
-}
-
-static char M_Mathutils_TranslationMatrix_doc[] =
-".. function:: TranslationMatrix(vector)\n"
-"\n"
-" Create a matrix representing a translation.\n"
-"\n"
-" :arg vector: The translation vector.\n"
-" :type vector: :class:`Vector`\n"
-" :return: An identity matrix with a translation.\n"
-" :rtype: :class:`Matrix`\n";
-
-static PyObject *M_Mathutils_TranslationMatrix(PyObject * self, VectorObject * vec)
-{
- float mat[16] = {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};
-
- if(!VectorObject_Check(vec)) {
- 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");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec))
- return NULL;
-
- //create a identity matrix and add translation
- unit_m4((float(*)[4]) mat);
- mat[12] = vec->vec[0];
- mat[13] = vec->vec[1];
- mat[14] = vec->vec[2];
-
- return newMatrixObject(mat, 4, 4, Py_NEW, NULL);
-}
-//----------------------------------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"
-"\n"
-" Create a matrix representing a scaling.\n"
-"\n"
-" :arg factor: The factor of scaling to apply.\n"
-" :type factor: float\n"
-" :arg size: The size of the scale matrix to construct [2, 4].\n"
-" :type size: int\n"
-" :arg axis: Direction to influence scale. (optional).\n"
-" :type axis: :class:`Vector`\n"
-" :return: A new scale matrix.\n"
-" :rtype: :class:`Matrix`\n";
-
-static PyObject *M_Mathutils_ScaleMatrix(PyObject * self, PyObject * args)
-{
- VectorObject *vec = NULL;
- float norm = 0.0f, factor;
- int matSize, x;
- float mat[16] = {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};
-
- if(!PyArg_ParseTuple(args, "fi|O!", &factor, &matSize, &vector_Type, &vec)) {
- 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");
- 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");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec))
- return NULL;
-
- }
- if(vec == NULL) { //scaling along axis
- if(matSize == 2) {
- mat[0] = factor;
- mat[3] = factor;
- } else {
- mat[0] = factor;
- mat[4] = factor;
- mat[8] = factor;
- }
- } else { //scaling in arbitrary direction
- //normalize arbitrary axis
- for(x = 0; x < vec->size; x++) {
- norm += vec->vec[x] * vec->vec[x];
- }
- norm = (float) sqrt(norm);
- for(x = 0; x < vec->size; x++) {
- vec->vec[x] /= norm;
- }
- if(matSize == 2) {
- mat[0] = 1 +((factor - 1) *(vec->vec[0] * vec->vec[0]));
- mat[1] =((factor - 1) *(vec->vec[0] * vec->vec[1]));
- mat[2] =((factor - 1) *(vec->vec[0] * vec->vec[1]));
- mat[3] = 1 + ((factor - 1) *(vec->vec[1] * vec->vec[1]));
- } else {
- mat[0] = 1 + ((factor - 1) *(vec->vec[0] * vec->vec[0]));
- mat[1] =((factor - 1) *(vec->vec[0] * vec->vec[1]));
- mat[2] =((factor - 1) *(vec->vec[0] * vec->vec[2]));
- mat[3] =((factor - 1) *(vec->vec[0] * vec->vec[1]));
- mat[4] = 1 + ((factor - 1) *(vec->vec[1] * vec->vec[1]));
- mat[5] =((factor - 1) *(vec->vec[1] * vec->vec[2]));
- mat[6] =((factor - 1) *(vec->vec[0] * vec->vec[2]));
- mat[7] =((factor - 1) *(vec->vec[1] * vec->vec[2]));
- mat[8] = 1 + ((factor - 1) *(vec->vec[2] * vec->vec[2]));
- }
- }
- if(matSize == 4) {
- //resize matrix
- mat[10] = mat[8];
- mat[9] = mat[7];
- mat[8] = mat[6];
- mat[7] = 0.0f;
- mat[6] = mat[5];
- mat[5] = mat[4];
- mat[4] = mat[3];
- mat[3] = 0.0f;
- }
- //pass to matrix creation
- return newMatrixObject(mat, matSize, matSize, Py_NEW, NULL);
-}
-//----------------------------------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"
-"\n"
-" Create a matrix to represent an orthographic projection.\n"
-"\n"
-" :arg plane: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ', 'R'], where a single axis is for a 2D matrix and 'R' requires axis is given.\n"
-" :type plane: string\n"
-" :arg size: The size of the projection matrix to construct [2, 4].\n"
-" :type size: int\n"
-" :arg axis: Arbitrary perpendicular plane vector (optional).\n"
-" :type axis: :class:`Vector`\n"
-" :return: A new projection matrix.\n"
-" :rtype: :class:`Matrix`\n";
-static PyObject *M_Mathutils_OrthoProjectionMatrix(PyObject * self, PyObject * args)
-{
- VectorObject *vec = NULL;
- char *plane;
- int matSize, x;
- float norm = 0.0f;
- float mat[16] = {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};
-
- 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");
- 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");
- 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");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec))
- return NULL;
-
- }
- if(vec == NULL) { //ortho projection onto cardinal plane
- if((strcmp(plane, "X") == 0) && matSize == 2) {
- mat[0] = 1.0f;
- } else if((strcmp(plane, "Y") == 0) && matSize == 2) {
- mat[3] = 1.0f;
- } else if((strcmp(plane, "XY") == 0) && matSize > 2) {
- mat[0] = 1.0f;
- mat[4] = 1.0f;
- } else if((strcmp(plane, "XZ") == 0) && matSize > 2) {
- mat[0] = 1.0f;
- mat[8] = 1.0f;
- } else if((strcmp(plane, "YZ") == 0) && matSize > 2) {
- mat[4] = 1.0f;
- mat[8] = 1.0f;
- } else {
- PyErr_SetString(PyExc_AttributeError, "Mathutils.OrthoProjectionMatrix(): unknown plane - expected: X, Y, XY, XZ, YZ\n");
- return NULL;
- }
- } else { //arbitrary plane
- //normalize arbitrary axis
- for(x = 0; x < vec->size; x++) {
- norm += vec->vec[x] * vec->vec[x];
- }
- norm = (float) sqrt(norm);
- for(x = 0; x < vec->size; x++) {
- vec->vec[x] /= norm;
- }
- if((strcmp(plane, "R") == 0) && matSize == 2) {
- mat[0] = 1 - (vec->vec[0] * vec->vec[0]);
- mat[1] = -(vec->vec[0] * vec->vec[1]);
- mat[2] = -(vec->vec[0] * vec->vec[1]);
- mat[3] = 1 - (vec->vec[1] * vec->vec[1]);
- } else if((strcmp(plane, "R") == 0) && matSize > 2) {
- mat[0] = 1 - (vec->vec[0] * vec->vec[0]);
- mat[1] = -(vec->vec[0] * vec->vec[1]);
- mat[2] = -(vec->vec[0] * vec->vec[2]);
- mat[3] = -(vec->vec[0] * vec->vec[1]);
- mat[4] = 1 - (vec->vec[1] * vec->vec[1]);
- mat[5] = -(vec->vec[1] * vec->vec[2]);
- mat[6] = -(vec->vec[0] * vec->vec[2]);
- 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");
- return NULL;
- }
- }
- if(matSize == 4) {
- //resize matrix
- mat[10] = mat[8];
- mat[9] = mat[7];
- mat[8] = mat[6];
- mat[7] = 0.0f;
- mat[6] = mat[5];
- mat[5] = mat[4];
- mat[4] = mat[3];
- mat[3] = 0.0f;
- }
- //pass to matrix creation
- return newMatrixObject(mat, matSize, matSize, Py_NEW, NULL);
-}
-
-static char M_Mathutils_ShearMatrix_doc[] =
-".. function:: ShearMatrix(plane, factor, size)\n"
-"\n"
-" Create a matrix to represent an shear transformation.\n"
-"\n"
-" :arg plane: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ'], where a single axis is for a 2D matrix.\n"
-" :type plane: string\n"
-" :arg factor: The factor of shear to apply.\n"
-" :type factor: float\n"
-" :arg size: The size of the shear matrix to construct [2, 4].\n"
-" :type size: int\n"
-" :return: A new shear matrix.\n"
-" :rtype: :class:`Matrix`\n";
-
-static PyObject *M_Mathutils_ShearMatrix(PyObject * self, PyObject * args)
-{
- int matSize;
- char *plane;
- float factor;
- float mat[16] = {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};
-
- if(!PyArg_ParseTuple(args, "sfi", &plane, &factor, &matSize)) {
- 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");
- return NULL;
- }
-
- if((strcmp(plane, "X") == 0)
- && matSize == 2) {
- mat[0] = 1.0f;
- mat[2] = factor;
- mat[3] = 1.0f;
- } else if((strcmp(plane, "Y") == 0) && matSize == 2) {
- mat[0] = 1.0f;
- mat[1] = factor;
- mat[3] = 1.0f;
- } else if((strcmp(plane, "XY") == 0) && matSize > 2) {
- mat[0] = 1.0f;
- mat[4] = 1.0f;
- mat[6] = factor;
- mat[7] = factor;
- } else if((strcmp(plane, "XZ") == 0) && matSize > 2) {
- mat[0] = 1.0f;
- mat[3] = factor;
- mat[4] = 1.0f;
- mat[5] = factor;
- mat[8] = 1.0f;
- } else if((strcmp(plane, "YZ") == 0) && matSize > 2) {
- mat[0] = 1.0f;
- mat[1] = factor;
- mat[2] = factor;
- 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");
- return NULL;
- }
- if(matSize == 4) {
- //resize matrix
- mat[10] = mat[8];
- mat[9] = mat[7];
- mat[8] = mat[6];
- mat[7] = 0.0f;
- mat[6] = mat[5];
- mat[5] = mat[4];
- mat[4] = mat[3];
- mat[3] = 0.0f;
- }
- //pass to matrix creation
- return newMatrixObject(mat, matSize, matSize, Py_NEW, NULL);
-}
-
-/* Utility functions */
-
-// LomontRRDCompare4, Ever Faster Float Comparisons by Randy Dillon
-#define SIGNMASK(i) (-(int)(((unsigned int)(i))>>31))
-
-int EXPP_FloatsAreEqual(float af, float bf, int maxDiff)
-{ // solid, fast routine across all platforms
- // with constant time behavior
- int ai = *(int *)(&af);
- int bi = *(int *)(&bf);
- int test = SIGNMASK(ai^bi);
- int diff, v1, v2;
-
- assert((0 == test) || (0xFFFFFFFF == test));
- diff = (ai ^ (test & 0x7fffffff)) - bi;
- v1 = maxDiff + diff;
- v2 = maxDiff - diff;
- return (v1|v2) >= 0;
-}
-
-/*---------------------- EXPP_VectorsAreEqual -------------------------
- Builds on EXPP_FloatsAreEqual to test vectors */
-int EXPP_VectorsAreEqual(float *vecA, float *vecB, int size, int floatSteps)
-{
- int x;
- for (x=0; x< size; x++){
- if (EXPP_FloatsAreEqual(vecA[x], vecB[x], floatSteps) == 0)
- return 0;
- }
- return 1;
-}
-
-
-/* Mathutils Callbacks */
-
-/* for mathutils internal use only, eventually should re-alloc but to start with we only have a few users */
-Mathutils_Callback *mathutils_callbacks[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
-
-int Mathutils_RegisterCallback(Mathutils_Callback *cb)
-{
- int i;
-
- /* find the first free slot */
- for(i= 0; mathutils_callbacks[i]; i++) {
- if(mathutils_callbacks[i]==cb) /* alredy registered? */
- return i;
- }
-
- mathutils_callbacks[i] = cb;
- return i;
-}
-
-/* use macros to check for NULL */
-int _BaseMathObject_ReadCallback(BaseMathObject *self)
-{
- Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
- if(cb->get(self->cb_user, self->cb_subtype, self->data))
- return 1;
-
- 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))
- return 1;
-
- 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))
- return 1;
-
- 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))
- return 1;
-
- PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name);
- return 0;
-}
-
-/* BaseMathObject generic functions for all mathutils types */
-char BaseMathObject_Owner_doc[] = "The item this is wrapping or None (readonly).";
-PyObject *BaseMathObject_getOwner( BaseMathObject * self, void *type )
-{
- PyObject *ret= self->cb_user ? self->cb_user : Py_None;
- Py_INCREF(ret);
- return ret;
-}
-
-char BaseMathObject_Wrapped_doc[] = "True when this object wraps external data (readonly). **type** boolean";
-PyObject *BaseMathObject_getWrapped( BaseMathObject *self, void *type )
-{
- return PyBool_FromLong((self->wrapped == Py_WRAP) ? 1:0);
-}
-
-void BaseMathObject_dealloc(BaseMathObject * self)
-{
- /* only free non wrapped */
- if(self->wrapped != Py_WRAP)
- PyMem_Free(self->data);
-
- Py_XDECREF(self->cb_user);
- Py_TYPE(self)->tp_free(self); // PyObject_DEL(self); // breaks subtypes
-}
-
-/*----------------------------MODULE INIT-------------------------*/
-struct PyMethodDef M_Mathutils_methods[] = {
- {"RotationMatrix", (PyCFunction) M_Mathutils_RotationMatrix, METH_VARARGS, M_Mathutils_RotationMatrix_doc},
- {"ScaleMatrix", (PyCFunction) M_Mathutils_ScaleMatrix, METH_VARARGS, M_Mathutils_ScaleMatrix_doc},
- {"ShearMatrix", (PyCFunction) M_Mathutils_ShearMatrix, METH_VARARGS, M_Mathutils_ShearMatrix_doc},
- {"TranslationMatrix", (PyCFunction) M_Mathutils_TranslationMatrix, METH_O, M_Mathutils_TranslationMatrix_doc},
- {"OrthoProjectionMatrix", (PyCFunction) M_Mathutils_OrthoProjectionMatrix, METH_VARARGS, M_Mathutils_OrthoProjectionMatrix_doc},
- {NULL, NULL, 0, NULL}
-};
-
-static struct PyModuleDef M_Mathutils_module_def = {
- PyModuleDef_HEAD_INIT,
- "Mathutils", /* m_name */
- M_Mathutils_doc, /* m_doc */
- 0, /* m_size */
- M_Mathutils_methods, /* m_methods */
- 0, /* m_reload */
- 0, /* m_traverse */
- 0, /* m_clear */
- 0, /* m_free */
-};
-
-PyObject *Mathutils_Init(void)
-{
- PyObject *submodule;
-
- if( PyType_Ready( &vector_Type ) < 0 )
- return NULL;
- if( PyType_Ready( &matrix_Type ) < 0 )
- return NULL;
- if( PyType_Ready( &euler_Type ) < 0 )
- return NULL;
- if( PyType_Ready( &quaternion_Type ) < 0 )
- return NULL;
-
- submodule = PyModule_Create(&M_Mathutils_module_def);
- PyDict_SetItemString(PySys_GetObject("modules"), M_Mathutils_module_def.m_name, submodule);
-
- /* each type has its own new() function */
- PyModule_AddObject( submodule, "Vector", (PyObject *)&vector_Type );
- PyModule_AddObject( submodule, "Matrix", (PyObject *)&matrix_Type );
- PyModule_AddObject( submodule, "Euler", (PyObject *)&euler_Type );
- PyModule_AddObject( submodule, "Quaternion", (PyObject *)&quaternion_Type );
-
- mathutils_matrix_vector_cb_index= Mathutils_RegisterCallback(&mathutils_matrix_vector_cb);
-
- return (submodule);
-}
diff --git a/source/blender/python/generic/bgl.c b/source/blender/python/generic/bgl.c
index 63c518c8721..8ac2107f8d2 100644
--- a/source/blender/python/generic/bgl.c
+++ b/source/blender/python/generic/bgl.c
@@ -27,9 +27,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/* This file is the Blender.BGL part of opy_draw.c, from the old
- * bpython/intern dir, with minor changes to adapt it to the new Python
- * implementation. The BGL submodule "wraps" OpenGL functions and constants,
+/* This file is the 'bgl' module.
+ * The BGL submodule "wraps" OpenGL functions and constants,
* allowing script writers to make OpenGL calls in their Python scripts. */
#include "bgl.h" /*This must come first */
@@ -64,13 +63,16 @@ static int Buffer_ass_slice( PyObject * self, int begin, int end,
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 +321,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;
@@ -1115,7 +1117,7 @@ PyObject *BGL_Init(void)
{
PyObject *mod, *dict, *item;
mod = PyModule_Create(&BGL_module_def);
- PyDict_SetItemString(PySys_GetObject("modules"), BGL_module_def.m_name, mod);
+ PyDict_SetItemString(PyImport_GetModuleDict(), BGL_module_def.m_name, mod);
dict= PyModule_GetDict(mod);
if( PyType_Ready( &BGL_bufferType) < 0)
diff --git a/source/blender/python/generic/bgl.h b/source/blender/python/generic/bgl.h
index 89bade930ce..80b0b90f643 100644
--- a/source/blender/python/generic/bgl.h
+++ b/source/blender/python/generic/bgl.h
@@ -36,10 +36,6 @@
#ifndef EXPP_BGL_H
#define EXPP_BGL_H
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include <Python.h>
PyObject *BGL_Init(void);
diff --git a/source/blender/python/generic/blf.c b/source/blender/python/generic/blf_api.c
index eda13db57b5..a5f5f8815c7 100644
--- a/source/blender/python/generic/blf.c
+++ b/source/blender/python/generic/blf_api.c
@@ -23,33 +23,45 @@
*/
#include <Python.h>
-#include "blf.h"
+#include "blf_api.h"
#include "../../blenfont/BLF_api.h"
static char py_blf_position_doc[] =
-".. function:: position(x, y, z)\n"
+".. function:: position(fontid, x, y, z)\n"
"\n"
-" Set the position for drawing text.\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 z: float\n";
static PyObject *py_blf_position(PyObject *self, PyObject *args)
{
+ int fontid;
float x, y, z;
- if (!PyArg_ParseTuple(args, "fff:BLF.position", &x, &y, &z))
+ if (!PyArg_ParseTuple(args, "ifff:blf.position", &fontid, &x, &y, &z))
return NULL;
- BLF_position(x, y, z);
+ BLF_position(fontid, x, y, z);
Py_RETURN_NONE;
}
static char py_blf_size_doc[] =
-".. function:: size(size, dpi)\n"
+".. 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"
@@ -57,84 +69,94 @@ static char py_blf_size_doc[] =
static PyObject *py_blf_size(PyObject *self, PyObject *args)
{
- int size, dpi;
+ int fontid, size, dpi;
- if (!PyArg_ParseTuple(args, "ii:BLF.size", &size, &dpi))
+ if (!PyArg_ParseTuple(args, "iii:blf.size", &fontid, &size, &dpi))
return NULL;
- BLF_size(size, dpi);
+ BLF_size(fontid, size, dpi);
Py_RETURN_NONE;
}
static char py_blf_aspect_doc[] =
-".. function:: aspect(aspect)\n"
+".. 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, "f:BLF.aspect", &aspect))
+ if (!PyArg_ParseTuple(args, "if:blf.aspect", &fontid, &aspect))
return NULL;
- BLF_aspect(aspect);
+ BLF_aspect(fontid, aspect);
Py_RETURN_NONE;
}
static char py_blf_blur_doc[] =
-".. function:: blur(radius)\n"
+".. 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;
+ int blur, fontid;
- if (!PyArg_ParseTuple(args, "i:BLF.blur", &blur))
+ if (!PyArg_ParseTuple(args, "ii:blf.blur", &fontid, &blur))
return NULL;
- BLF_blur(blur);
+ BLF_blur(fontid, blur);
Py_RETURN_NONE;
}
static char py_blf_draw_doc[] =
-".. function:: draw(text)\n"
+".. 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, "s:BLF.draw", &text))
+ if (!PyArg_ParseTuple(args, "is:blf.draw", &fontid, &text))
return NULL;
- BLF_draw(text);
+ BLF_draw(fontid, text);
Py_RETURN_NONE;
}
static char py_blf_dimensions_doc[] =
-".. function:: dimensions(text)\n"
+".. function:: dimensions(fontid, text)\n"
"\n"
-" Return the width and hight of the text.\n"
+" Return the width and height 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"
@@ -145,11 +167,12 @@ static PyObject *py_blf_dimensions(PyObject *self, PyObject *args)
char *text;
float r_width, r_height;
PyObject *ret;
+ int fontid;
- if (!PyArg_ParseTuple(args, "s:BLF.dimensions", &text))
+ if (!PyArg_ParseTuple(args, "is:blf.dimensions", &fontid, &text))
return NULL;
- BLF_width_and_height(text, &r_width, &r_height);
+ BLF_width_and_height(fontid, text, &r_width, &r_height);
ret= PyTuple_New(2);
PyTuple_SET_ITEM(ret, 0, PyFloat_FromDouble(r_width));
@@ -158,96 +181,125 @@ static PyObject *py_blf_dimensions(PyObject *self, PyObject *args)
}
static char py_blf_clipping_doc[] =
-".. function:: clipping(xmin, ymin, xmax, ymax)\n"
+".. function:: clipping(fontid, xmin, ymin, xmax, ymax)\n"
+"\n"
+" Set the clipping, enable/disable using CLIPPING.\n"
"\n"
-" Set the clipping, enable/disable using CLIPPING.\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, "ffff:BLF.clipping", &xmin, &ymin, &xmax, &ymax))
+ if (!PyArg_ParseTuple(args, "iffff:blf.clipping", &fontid, &xmin, &ymin, &xmax, &ymax))
return NULL;
- BLF_clipping(xmin, ymin, xmax, ymax);
+ BLF_clipping(fontid, xmin, ymin, xmax, ymax);
Py_RETURN_NONE;
}
static char py_blf_disable_doc[] =
-".. function:: disable(option)\n"
+".. 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;
+ int option, fontid;
- if (!PyArg_ParseTuple(args, "i:BLF.disable", &option))
+ if (!PyArg_ParseTuple(args, "ii:blf.disable", &fontid, &option))
return NULL;
- BLF_disable(option);
+ BLF_disable(fontid, option);
Py_RETURN_NONE;
}
static char py_blf_enable_doc[] =
-".. function:: enable(option)\n"
+".. 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;
+ int option, fontid;
- if (!PyArg_ParseTuple(args, "i:BLF.enable", &option))
+ if (!PyArg_ParseTuple(args, "ii:blf.enable", &fontid, &option))
return NULL;
- BLF_enable(option);
+ BLF_enable(fontid, option);
Py_RETURN_NONE;
}
static char py_blf_rotation_doc[] =
-".. function:: rotation(angle)\n"
+".. 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";
+" :type angle: float\n";
static PyObject *py_blf_rotation(PyObject *self, PyObject *args)
{
float angle;
+ int fontid;
- if (!PyArg_ParseTuple(args, "f:BLF.rotation", &angle))
+ if (!PyArg_ParseTuple(args, "if:blf.rotation", &fontid, &angle))
return NULL;
- BLF_rotation(angle);
+ BLF_rotation(fontid, angle);
Py_RETURN_NONE;
}
static char py_blf_shadow_doc[] =
-".. function:: shadow(level, r, g, b, a)\n"
+".. 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";
+" :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;
+ int level, fontid;
float r, g, b, a;
- if (!PyArg_ParseTuple(args, "iffff:BLF.shadow", &level, &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) {
@@ -255,28 +307,55 @@ static PyObject *py_blf_shadow(PyObject *self, PyObject *args)
return NULL;
}
- BLF_shadow(level, r, g, b, a);
+ BLF_shadow(fontid, level, r, g, b, a);
Py_RETURN_NONE;
}
static char py_blf_shadow_offset_doc[] =
-".. function:: shadow_offset(x, y)\n"
+".. function:: shadow_offset(fontid, x, y)\n"
+"\n"
+" Set the offset for shadow text.\n"
"\n"
-" Set the offset for shadow text.\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;
+ int x, y, fontid;
- if (!PyArg_ParseTuple(args, "ii:BLF.shadow_offset", &x, &y))
+ if (!PyArg_ParseTuple(args, "iii:blf.shadow_offset", &fontid, &x, &y))
return NULL;
- BLF_shadow_offset(x, y);
+ 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},
@@ -291,6 +370,7 @@ struct PyMethodDef BLF_methods[] = {
{"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}
};
@@ -314,7 +394,7 @@ PyObject *BLF_Init(void)
PyObject *submodule;
submodule = PyModule_Create(&BLF_module_def);
- PyDict_SetItemString(PySys_GetObject("modules"), BLF_module_def.m_name, submodule);
+ PyDict_SetItemString(PyImport_GetModuleDict(), BLF_module_def.m_name, submodule);
PyModule_AddIntConstant(submodule, "ROTATION", BLF_ROTATION);
PyModule_AddIntConstant(submodule, "CLIPPING", BLF_CLIPPING);
diff --git a/source/blender/python/generic/blf.h b/source/blender/python/generic/blf_api.h
index fae20ace996..fae20ace996 100644
--- a/source/blender/python/generic/blf.h
+++ b/source/blender/python/generic/blf_api.h
diff --git a/source/blender/python/generic/bpy_internal_import.c b/source/blender/python/generic/bpy_internal_import.c
index 6b79945ccd8..1951e72567c 100644
--- a/source/blender/python/generic/bpy_internal_import.c
+++ b/source/blender/python/generic/bpy_internal_import.c
@@ -32,7 +32,9 @@
#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 <stddef.h>
static Main *bpy_import_main= NULL;
@@ -55,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;
@@ -62,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( ) ) {
@@ -119,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;
@@ -133,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 )
@@ -189,7 +200,7 @@ static PyObject *blender_import( PyObject * self, PyObject * args, PyObject * k
&name, &globals, &locals, &fromlist, &dummy_val) )
return NULL;
- /* import existing builtin modules or modules that have been imported alredy */
+ /* import existing builtin modules or modules that have been imported already */
newmodule = PyImport_ImportModuleEx( name, globals, locals, fromlist );
if(newmodule)
@@ -226,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 );
@@ -269,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.
@@ -298,7 +304,7 @@ PyMethodDef bpy_reload_meth[] = { {"bpy_reload_meth", (PyCFunction)blender_reloa
void bpy_text_clear_modules(int clear_all)
{
- PyObject *modules= PySys_GetObject("modules");
+ PyObject *modules= PyImport_GetModuleDict();
char *fname;
char *file_extension;
@@ -344,3 +350,26 @@ void bpy_text_clear_modules(int clear_all)
Py_DECREF(list); /* removes all references from append */
}
#endif
+
+
+/*****************************************************************************
+* Description: This function creates a new Python dictionary object.
+* note: dict is owned by sys.modules["__main__"] module, reference is borrowed
+* note: important we use the dict from __main__, this is what python expects
+ for 'pickle' to work as well as strings like this...
+ >> foo = 10
+ >> print(__import__("__main__").foo)
+*****************************************************************************/
+PyObject *bpy_namespace_dict_new(const char *filename)
+{
+ PyInterpreterState *interp= PyThreadState_GET()->interp;
+ PyObject *mod_main= PyModule_New("__main__");
+ PyDict_SetItemString(interp->modules, "__main__", mod_main);
+ Py_DECREF(mod_main); /* sys.modules owns now */
+ PyModule_AddStringConstant(mod_main, "__name__", "__main__");
+ if(filename)
+ PyModule_AddStringConstant(mod_main, "__file__", filename); /* __file__ only for nice UI'ness */
+ PyModule_AddObject(mod_main, "__builtins__", interp->builtins);
+ Py_INCREF(interp->builtins); /* AddObject steals a reference */
+ return PyModule_GetDict(mod_main);
+}
diff --git a/source/blender/python/generic/bpy_internal_import.h b/source/blender/python/generic/bpy_internal_import.h
index 947e0dfc29d..83e05fd6ded 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[];
@@ -57,5 +60,7 @@ extern PyMethodDef bpy_reload_meth[];
struct Main *bpy_import_main_get(void);
void bpy_import_main_set(struct Main *maggie);
+/* name namespace function for bpy & bge */
+PyObject *bpy_namespace_dict_new(const char *filename);
#endif /* EXPP_bpy_import_h */
diff --git a/source/blender/python/generic/Geometry.c b/source/blender/python/generic/geometry.c
index 158b07b1be5..0e98760314d 100644
--- a/source/blender/python/generic/Geometry.c
+++ b/source/blender/python/generic/geometry.c
@@ -27,7 +27,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "Geometry.h"
+#include "geometry.h"
/* Used for PolyFill */
#include "BKE_displist.h"
@@ -44,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";
@@ -59,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;
@@ -131,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 )
{
@@ -200,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;
@@ -251,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;
@@ -288,7 +288,7 @@ 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;
@@ -333,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 )
{
@@ -363,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;
}
@@ -373,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
@@ -414,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 */
@@ -428,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;
}
@@ -634,7 +634,7 @@ static int boxPack_FromPyObject(PyObject * value, boxPack **boxarray )
boxPack *box;
- /* Error checking must alredy be done */
+ /* Error checking must already be done */
if( !PyList_Check( value ) ) {
PyErr_SetString( PyExc_TypeError, "can only back a list of [x,y,x,w]" );
return -1;
@@ -819,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 */
@@ -835,7 +835,7 @@ PyObject *Geometry_Init(void)
PyObject *submodule;
submodule = PyModule_Create(&M_Geometry_module_def);
- PyDict_SetItemString(PySys_GetObject("modules"), M_Geometry_module_def.m_name, submodule);
+ PyDict_SetItemString(PyImport_GetModuleDict(), M_Geometry_module_def.m_name, submodule);
return (submodule);
}
diff --git a/source/blender/python/generic/Geometry.h b/source/blender/python/generic/geometry.h
index 1e17ca6bf27..401efcc7888 100644
--- a/source/blender/python/generic/Geometry.h
+++ b/source/blender/python/generic/geometry.h
@@ -32,7 +32,7 @@
#define EXPP_Geometry_H
#include <Python.h>
-#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
new file mode 100644
index 00000000000..a643e6621b2
--- /dev/null
+++ b/source/blender/python/generic/mathutils.c
@@ -0,0 +1,273 @@
+/*
+ * $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.
+ *
+ * This is a new part of Blender.
+ *
+ * Contributor(s): Joseph Gilbert, Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/* 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)
+ * - Mathutils.DifferenceQuats --> quat.difference(other)
+ * - Mathutils.Slerp --> quat.slerp(other, fac)
+ * - Mathutils.Rand: removed, use pythons random module
+ * - Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
+ * - Matrix.scalePart --> Matrix.scale_part
+ * - Matrix.translationPart --> Matrix.translation_part
+ * - Matrix.rotationPart --> Matrix.rotation_part
+ * - toMatrix --> to_matrix
+ * - toEuler --> to_euler
+ * - toQuat --> to_quat
+ * - Vector.toTrackQuat --> Vector.to_track_quat
+ * - Quaternion * Quaternion --> cross product (not dot product)
+ *
+ * moved into class functions.
+ * - Mathutils.RotationMatrix -> mathutils.Matrix.Rotation
+ * - Mathutils.ScaleMatrix -> mathutils.Matrix.Scale
+ * - Mathutils.ShearMatrix -> mathutils.Matrix.Shear
+ * - Mathutils.TranslationMatrix -> mathutils.Matrix.Translation
+ * - Mathutils.OrthoProjectionMatrix -> mathutils.Matrix.OrthoProjection
+ *
+ * Moved to Geometry module: Intersect, TriangleArea, TriangleNormal, QuadNormal, LineIntersect
+ */
+
+#include "mathutils.h"
+
+#include "BLI_math.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;
+}
+
+//----------------------------------MATRIX FUNCTIONS--------------------
+
+
+/* Utility functions */
+
+// LomontRRDCompare4, Ever Faster Float Comparisons by Randy Dillon
+#define SIGNMASK(i) (-(int)(((unsigned int)(i))>>31))
+
+int EXPP_FloatsAreEqual(float af, float bf, int maxDiff)
+{ // solid, fast routine across all platforms
+ // with constant time behavior
+ int ai = *(int *)(&af);
+ int bi = *(int *)(&bf);
+ int test = SIGNMASK(ai^bi);
+ int diff, v1, v2;
+
+ assert((0 == test) || (0xFFFFFFFF == test));
+ diff = (ai ^ (test & 0x7fffffff)) - bi;
+ v1 = maxDiff + diff;
+ v2 = maxDiff - diff;
+ return (v1|v2) >= 0;
+}
+
+/*---------------------- EXPP_VectorsAreEqual -------------------------
+ Builds on EXPP_FloatsAreEqual to test vectors */
+int EXPP_VectorsAreEqual(float *vecA, float *vecB, int size, int floatSteps)
+{
+ int x;
+ for (x=0; x< size; x++){
+ if (EXPP_FloatsAreEqual(vecA[x], vecB[x], floatSteps) == 0)
+ return 0;
+ }
+ return 1;
+}
+
+
+/* Mathutils Callbacks */
+
+/* for mathutils internal use only, eventually should re-alloc but to start with we only have a few users */
+Mathutils_Callback *mathutils_callbacks[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
+
+int Mathutils_RegisterCallback(Mathutils_Callback *cb)
+{
+ int i;
+
+ /* find the first free slot */
+ for(i= 0; mathutils_callbacks[i]; i++) {
+ if(mathutils_callbacks[i]==cb) /* already registered? */
+ return i;
+ }
+
+ mathutils_callbacks[i] = cb;
+ return i;
+}
+
+/* use macros to check for NULL */
+int _BaseMathObject_ReadCallback(BaseMathObject *self)
+{
+ Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
+ if(cb->get(self, self->cb_subtype))
+ return 1;
+
+ 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, self->cb_subtype))
+ return 1;
+
+ 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, self->cb_subtype, index))
+ return 1;
+
+ 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, self->cb_subtype, index))
+ return 1;
+
+ if(!PyErr_Occurred())
+ PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name);
+ return 0;
+}
+
+/* BaseMathObject generic functions for all mathutils types */
+char BaseMathObject_Owner_doc[] = "The item this is wrapping or None (readonly).";
+PyObject *BaseMathObject_getOwner( BaseMathObject * self, void *type )
+{
+ PyObject *ret= self->cb_user ? self->cb_user : Py_None;
+ Py_INCREF(ret);
+ return ret;
+}
+
+char BaseMathObject_Wrapped_doc[] = "True when this object wraps external data (readonly).\n\n:type: boolean";
+PyObject *BaseMathObject_getWrapped( BaseMathObject *self, void *type )
+{
+ return PyBool_FromLong((self->wrapped == Py_WRAP) ? 1:0);
+}
+
+void BaseMathObject_dealloc(BaseMathObject * self)
+{
+ /* only free non wrapped */
+ if(self->wrapped != Py_WRAP)
+ PyMem_Free(self->data);
+
+ Py_XDECREF(self->cb_user);
+ Py_TYPE(self)->tp_free(self); // PyObject_DEL(self); // breaks subtypes
+}
+
+/*----------------------------MODULE INIT-------------------------*/
+struct PyMethodDef M_Mathutils_methods[] = {
+ {NULL, NULL, 0, NULL}
+};
+
+static struct PyModuleDef M_Mathutils_module_def = {
+ PyModuleDef_HEAD_INIT,
+ "mathutils", /* m_name */
+ M_Mathutils_doc, /* m_doc */
+ 0, /* m_size */
+ M_Mathutils_methods, /* m_methods */
+ 0, /* m_reload */
+ 0, /* m_traverse */
+ 0, /* m_clear */
+ 0, /* m_free */
+};
+
+PyObject *Mathutils_Init(void)
+{
+ PyObject *submodule;
+
+ if( PyType_Ready( &vector_Type ) < 0 )
+ return NULL;
+ if( PyType_Ready( &matrix_Type ) < 0 )
+ return NULL;
+ if( PyType_Ready( &euler_Type ) < 0 )
+ 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(PyImport_GetModuleDict(), M_Mathutils_module_def.m_name, submodule);
+
+ /* each type has its own new() function */
+ PyModule_AddObject( submodule, "Vector", (PyObject *)&vector_Type );
+ 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);
+
+ return (submodule);
+}
diff --git a/source/blender/python/generic/Mathutils.h b/source/blender/python/generic/mathutils.h
index 869ac4d70df..85fbe3225ba 100644
--- a/source/blender/python/generic/Mathutils.h
+++ b/source/blender/python/generic/mathutils.h
@@ -33,32 +33,35 @@
#include <Python.h>
-#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);
PyObject *Mathutils_Init(void);
-
-PyObject *quat_rotation(PyObject *arg1, PyObject *arg2);
+PyObject *Noise_Init(void); /* lazy, saves having own header */
int EXPP_FloatsAreEqual(float A, float B, int floatSteps);
int EXPP_VectorsAreEqual(float *vecA, float *vecB, int size, int floatSteps);
@@ -69,33 +72,20 @@ int EXPP_VectorsAreEqual(float *vecA, float *vecB, int size, int floatSteps);
#define Py_NEW 1
#define Py_WRAP 2
-
-/* Mathutils is used by the BGE and Blender so have to define
- * some things here for luddite mac users of py2.3 */
-#ifndef Py_RETURN_NONE
-#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
-#endif
-#ifndef Py_RETURN_FALSE
-#define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False
-#endif
-#ifndef Py_RETURN_TRUE
-#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True
-#endif
-
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 +101,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..57d2838238c
--- /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.\n\n:type: float", (void *)0},
+ {"g", (getter)Color_getChannel, (setter)Color_setChannel, "Green color channel.\n\n:type: float", (void *)1},
+ {"b", (getter)Color_getChannel, (setter)Color_setChannel, "Blue color channel.\n\n:type: float", (void *)2},
+
+ {"h", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, "HSV Hue component in [0, 1].\n\n:type: float", (void *)0},
+ {"s", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, "HSV Saturation component in [0, 1].\n\n:type: float", (void *)1},
+ {"v", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, "HSV Value component in [0, 1].\n\n:type: float", (void *)2},
+
+ {"hsv", (getter)Color_getHSV, (setter)Color_setHSV, "HSV Values in [0, 1].\n\n: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
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
+
+#include <Python.h>
-struct ImBuf;
+extern PyTypeObject color_Type;
+#define ColorObject_Check(_v) PyObject_TypeCheck((_v), &color_Type)
-int imb_is_a_targa(void *buf);
+typedef struct {
+ BASE_MATH_MEMBERS(col)
+} ColorObject;
-struct ImBuf *imb_loadtarga(unsigned char *mem, int size, int flags);
-short imb_savetarga(struct ImBuf * ibuf, char *name, int flags);
+/*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*/
-#endif
+//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
index 892e42657b7..b36eb7803f1 100644
--- a/source/blender/python/generic/euler.c
+++ b/source/blender/python/generic/mathutils_euler.c
@@ -26,7 +26,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "Mathutils.h"
+#include "mathutils.h"
#include "BLI_math.h"
#include "BKE_utildefines.h"
@@ -35,52 +35,32 @@
#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
-
- 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;
- }
+ PyObject *seq= NULL;
+ char *order_str= NULL;
- if (size != 3) { // Invalid euler size
- PyErr_SetString(PyExc_AttributeError, "Mathutils.Euler(): 3d numeric sequence expected\n");
+ float eul[EULER_SIZE]= {0.0f, 0.0f, 0.0f};
+ short order= EULER_ORDER_XYZ;
+
+ if(!PyArg_ParseTuple(args, "|Os:mathutils.Euler", &seq, &order_str))
return NULL;
- }
- for (i=0; i<size; i++) {
- e = PySequence_GetItem(listObject, i);
- if (e == NULL) { // Failed to read sequence
- Py_DECREF(listObject);
- PyErr_SetString(PyExc_RuntimeError, "Mathutils.Euler(): 3d numeric sequence expected\n");
+ switch(PyTuple_GET_SIZE(args)) {
+ case 0:
+ break;
+ case 2:
+ if((order=euler_order_from_string(order_str, "mathutils.Euler()")) == -1)
return NULL;
- }
-
- eul[i]= (float)PyFloat_AsDouble(e);
- Py_DECREF(e);
-
- if(eul[i]==-1 && PyErr_Occurred()) { // parsed item is not a number
- PyErr_SetString(PyExc_TypeError, "Mathutils.Euler(): 3d numeric sequence expected\n");
+ /* intentionally pass through */
+ case 1:
+ if (mathutils_array_parse(eul, EULER_SIZE, EULER_SIZE, seq, "mathutils.Euler()") == -1)
return NULL;
- }
+ break;
}
return newEulerObject(eul, order, Py_NEW, NULL);
}
@@ -89,12 +69,12 @@ short euler_order_from_string(const char *str, const char *error_prefix)
{
if((str[0] && str[1] && str[2] && str[3]=='\0')) {
switch(*((int32_t *)str)) {
- case 'X'|'Y'<<8|'Z'<<16: return 0;
- case 'X'|'Z'<<8|'Y'<<16: return 1;
- case 'Y'|'X'<<8|'Z'<<16: return 2;
- case 'Y'|'Z'<<8|'X'<<16: return 3;
- case 'Z'|'X'<<8|'Y'<<16: return 4;
- case 'Z'|'Y'<<8|'X'<<16: return 5;
+ case 'X'|'Y'<<8|'Z'<<16: return EULER_ORDER_XYZ;
+ case 'X'|'Z'<<8|'Y'<<16: return EULER_ORDER_XZY;
+ case 'Y'|'X'<<8|'Z'<<16: return EULER_ORDER_YXZ;
+ case 'Y'|'Z'<<8|'X'<<16: return EULER_ORDER_YZX;
+ case 'Z'|'X'<<8|'Y'<<16: return EULER_ORDER_ZXY;
+ case 'Z'|'Y'<<8|'X'<<16: return EULER_ORDER_ZYX;
}
}
@@ -102,8 +82,29 @@ short euler_order_from_string(const char *str, const char *error_prefix)
return -1;
}
+/* note: BaseMath_ReadCallback must be called beforehand */
+static PyObject *Euler_ToTupleExt(EulerObject *self, int ndigits)
+{
+ PyObject *ret;
+ int i;
+
+ ret= PyTuple_New(EULER_SIZE);
+
+ if(ndigits >= 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[] =
@@ -121,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"
@@ -143,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[] =
@@ -207,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"
@@ -227,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);
@@ -312,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)
@@ -352,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");
@@ -373,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;
}
@@ -403,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;
}
@@ -427,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);
@@ -442,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;
+ 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;
+ }
+}
+
- eul[i] = (float)PyFloat_AsDouble(e);
- Py_DECREF(e);
+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(eul[i]==-1 && PyErr_Occurred()) { // parsed item not a number
- PyErr_SetString(PyExc_TypeError, "euler[begin:end] = []: sequence argument not a number");
+ 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;
}
}
- //parsed well - now set in vector
- for(y = 0; y < 3; y++){
- self->eul[begin + y] = eul[y];
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "euler indices must be integers, not %.200s",
+ item->ob_type->tp_name);
+ return -1;
}
-
- BaseMath_WriteCallback(self);
- return 0;
}
+
//-----------------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 )
{
@@ -514,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 )
@@ -523,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;
}
@@ -539,13 +615,13 @@ static int Euler_setOrder( EulerObject * self, PyObject * value, void * type )
/* Python attributes get/set structure: */
/*****************************************************************************/
static PyGetSetDef Euler_getseters[] = {
- {"x", (getter)Euler_getAxis, (setter)Euler_setAxis, "Euler X axis in radians. **type** float", (void *)0},
- {"y", (getter)Euler_getAxis, (setter)Euler_setAxis, "Euler Y axis in radians. **type** float", (void *)1},
- {"z", (getter)Euler_getAxis, (setter)Euler_setAxis, "Euler Z axis in radians. **type** float", (void *)2},
- {"order", (getter)Euler_getOrder, (setter)Euler_setOrder, "Euler rotation order. **type** string in ['XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX']", (void *)NULL},
+ {"x", (getter)Euler_getAxis, (setter)Euler_setAxis, "Euler X axis in radians.\n\n:type: float", (void *)0},
+ {"y", (getter)Euler_getAxis, (setter)Euler_setAxis, "Euler Y axis in radians.\n\n:type: float", (void *)1},
+ {"z", (getter)Euler_getAxis, (setter)Euler_setAxis, "Euler Z axis in radians.\n\n:type: float", (void *)2},
+ {"order", (getter)Euler_getOrder, (setter)Euler_setOrder, "Euler rotation order.\n\n:type: string in ['XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX']", (void *)NULL},
{"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, BaseMathObject_Wrapped_doc, NULL},
- {"_owner", (getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
+ {"owner", (getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
};
@@ -556,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},
@@ -580,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
@@ -624,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);
@@ -633,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
index 994a5f1780e..b8523c3b661 100644
--- a/source/blender/python/generic/euler.h
+++ b/source/blender/python/generic/mathutils_euler.h
@@ -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
index 216139dc44f..3b8c7d3122a 100644
--- a/source/blender/python/generic/matrix.c
+++ b/source/blender/python/generic/mathutils_matrix.c
@@ -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; i<self->colSize; 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; i<self->colSize; 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;
}
@@ -181,6 +181,438 @@ static PyObject *Matrix_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return newMatrixObject(matrix, argSize, seqSize, Py_NEW, NULL);
}
+/*-----------------------CLASS-METHODS----------------------------*/
+
+//----------------------------------mathutils.RotationMatrix() ----------
+//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
+static char C_Matrix_Rotation_doc[] =
+".. classmethod:: Rotation(angle, size, axis)\n"
+"\n"
+" Create a matrix representing a rotation.\n"
+"\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"
+" :arg axis: a string in ['X', 'Y', 'Z'] or a 3D Vector Object (optional when size is 2).\n"
+" :type axis: string or :class:`Vector`\n"
+" :return: A new rotation matrix.\n"
+" :rtype: :class:`Matrix`\n";
+
+static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args)
+{
+ VectorObject *vec= NULL;
+ char *axis= NULL;
+ int matSize;
+ float angle = 0.0f;
+ float mat[16] = {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};
+
+ 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");
+ 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");
+ return NULL;
+ }
+ else {
+ /* use the string */
+ vec= NULL;
+ }
+ }
+
+ while (angle<-(Py_PI*2))
+ angle+=(Py_PI*2);
+ while (angle>(Py_PI*2))
+ 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");
+ return NULL;
+ }
+ if(matSize == 2 && (vec != NULL)) {
+ 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");
+ return NULL;
+ }
+ if(vec) {
+ if(vec->size != 3) {
+ PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): the vector axis must be a 3D vector\n");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(vec))
+ return NULL;
+
+ }
+
+ /* check for valid vector/axis above */
+ if(vec) {
+ axis_angle_to_mat3( (float (*)[3])mat,vec->vec, angle);
+ }
+ else if(matSize == 2) {
+ //2D rotation matrix
+ mat[0] = (float) cos (angle);
+ mat[1] = (float) sin (angle);
+ mat[2] = -((float) sin(angle));
+ mat[3] = (float) cos(angle);
+ } else if(strcmp(axis, "X") == 0) {
+ //rotation around X
+ mat[0] = 1.0f;
+ mat[4] = (float) cos(angle);
+ mat[5] = (float) sin(angle);
+ mat[7] = -((float) sin(angle));
+ mat[8] = (float) cos(angle);
+ } else if(strcmp(axis, "Y") == 0) {
+ //rotation around Y
+ mat[0] = (float) cos(angle);
+ mat[2] = -((float) sin(angle));
+ mat[4] = 1.0f;
+ mat[6] = (float) sin(angle);
+ mat[8] = (float) cos(angle);
+ } else if(strcmp(axis, "Z") == 0) {
+ //rotation around Z
+ mat[0] = (float) cos(angle);
+ mat[1] = (float) sin(angle);
+ mat[3] = -((float) sin(angle));
+ mat[4] = (float) cos(angle);
+ mat[8] = 1.0f;
+ }
+ else {
+ /* should never get here */
+ PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): unknown error\n");
+ return NULL;
+ }
+
+ if(matSize == 4) {
+ //resize matrix
+ mat[10] = mat[8];
+ mat[9] = mat[7];
+ mat[8] = mat[6];
+ mat[7] = 0.0f;
+ mat[6] = mat[5];
+ mat[5] = mat[4];
+ mat[4] = mat[3];
+ mat[3] = 0.0f;
+ }
+ //pass to matrix creation
+ return newMatrixObject(mat, matSize, matSize, Py_NEW, (PyTypeObject *)cls);
+}
+
+
+static char C_Matrix_Translation_doc[] =
+".. classmethod:: Translation(vector)\n"
+"\n"
+" Create a matrix representing a translation.\n"
+"\n"
+" :arg vector: The translation vector.\n"
+" :type vector: :class:`Vector`\n"
+" :return: An identity matrix with a translation.\n"
+" :rtype: :class:`Matrix`\n";
+
+static PyObject *C_Matrix_Translation(PyObject *cls, VectorObject * vec)
+{
+ float mat[16] = {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};
+
+ if(!VectorObject_Check(vec)) {
+ 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");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(vec))
+ return NULL;
+
+ //create a identity matrix and add translation
+ unit_m4((float(*)[4]) mat);
+ mat[12] = vec->vec[0];
+ mat[13] = vec->vec[1];
+ mat[14] = vec->vec[2];
+
+ return newMatrixObject(mat, 4, 4, Py_NEW, (PyTypeObject *)cls);
+}
+//----------------------------------mathutils.ScaleMatrix() -------------
+//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
+static char C_Matrix_Scale_doc[] =
+".. classmethod:: Scale(factor, size, axis)\n"
+"\n"
+" Create a matrix representing a scaling.\n"
+"\n"
+" :arg factor: The factor of scaling to apply.\n"
+" :type factor: float\n"
+" :arg size: The size of the scale matrix to construct [2, 4].\n"
+" :type size: int\n"
+" :arg axis: Direction to influence scale. (optional).\n"
+" :type axis: :class:`Vector`\n"
+" :return: A new scale matrix.\n"
+" :rtype: :class:`Matrix`\n";
+
+static PyObject *C_Matrix_Scale(PyObject *cls, PyObject *args)
+{
+ VectorObject *vec = NULL;
+ float norm = 0.0f, factor;
+ int matSize, x;
+ float mat[16] = {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};
+
+ if(!PyArg_ParseTuple(args, "fi|O!", &factor, &matSize, &vector_Type, &vec)) {
+ 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");
+ 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");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(vec))
+ return NULL;
+
+ }
+ if(vec == NULL) { //scaling along axis
+ if(matSize == 2) {
+ mat[0] = factor;
+ mat[3] = factor;
+ } else {
+ mat[0] = factor;
+ mat[4] = factor;
+ mat[8] = factor;
+ }
+ } else { //scaling in arbitrary direction
+ //normalize arbitrary axis
+ for(x = 0; x < vec->size; x++) {
+ norm += vec->vec[x] * vec->vec[x];
+ }
+ norm = (float) sqrt(norm);
+ for(x = 0; x < vec->size; x++) {
+ vec->vec[x] /= norm;
+ }
+ if(matSize == 2) {
+ mat[0] = 1 +((factor - 1) *(vec->vec[0] * vec->vec[0]));
+ mat[1] =((factor - 1) *(vec->vec[0] * vec->vec[1]));
+ mat[2] =((factor - 1) *(vec->vec[0] * vec->vec[1]));
+ mat[3] = 1 + ((factor - 1) *(vec->vec[1] * vec->vec[1]));
+ } else {
+ mat[0] = 1 + ((factor - 1) *(vec->vec[0] * vec->vec[0]));
+ mat[1] =((factor - 1) *(vec->vec[0] * vec->vec[1]));
+ mat[2] =((factor - 1) *(vec->vec[0] * vec->vec[2]));
+ mat[3] =((factor - 1) *(vec->vec[0] * vec->vec[1]));
+ mat[4] = 1 + ((factor - 1) *(vec->vec[1] * vec->vec[1]));
+ mat[5] =((factor - 1) *(vec->vec[1] * vec->vec[2]));
+ mat[6] =((factor - 1) *(vec->vec[0] * vec->vec[2]));
+ mat[7] =((factor - 1) *(vec->vec[1] * vec->vec[2]));
+ mat[8] = 1 + ((factor - 1) *(vec->vec[2] * vec->vec[2]));
+ }
+ }
+ if(matSize == 4) {
+ //resize matrix
+ mat[10] = mat[8];
+ mat[9] = mat[7];
+ mat[8] = mat[6];
+ mat[7] = 0.0f;
+ mat[6] = mat[5];
+ mat[5] = mat[4];
+ mat[4] = mat[3];
+ mat[3] = 0.0f;
+ }
+ //pass to matrix creation
+ return newMatrixObject(mat, matSize, matSize, Py_NEW, (PyTypeObject *)cls);
+}
+//----------------------------------mathutils.OrthoProjectionMatrix() ---
+//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
+static char C_Matrix_OrthoProjection_doc[] =
+".. classmethod:: OrthoProjection(plane, size, axis)\n"
+"\n"
+" Create a matrix to represent an orthographic projection.\n"
+"\n"
+" :arg plane: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ', 'R'], where a single axis is for a 2D matrix and 'R' requires axis is given.\n"
+" :type plane: string\n"
+" :arg size: The size of the projection matrix to construct [2, 4].\n"
+" :type size: int\n"
+" :arg axis: Arbitrary perpendicular plane vector (optional).\n"
+" :type axis: :class:`Vector`\n"
+" :return: A new projection matrix.\n"
+" :rtype: :class:`Matrix`\n";
+static PyObject *C_Matrix_OrthoProjection(PyObject *cls, PyObject *args)
+{
+ VectorObject *vec = NULL;
+ char *plane;
+ int matSize, x;
+ float norm = 0.0f;
+ float mat[16] = {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};
+
+ 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");
+ 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");
+ 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");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(vec))
+ return NULL;
+
+ }
+ if(vec == NULL) { //ortho projection onto cardinal plane
+ if((strcmp(plane, "X") == 0) && matSize == 2) {
+ mat[0] = 1.0f;
+ } else if((strcmp(plane, "Y") == 0) && matSize == 2) {
+ mat[3] = 1.0f;
+ } else if((strcmp(plane, "XY") == 0) && matSize > 2) {
+ mat[0] = 1.0f;
+ mat[4] = 1.0f;
+ } else if((strcmp(plane, "XZ") == 0) && matSize > 2) {
+ mat[0] = 1.0f;
+ mat[8] = 1.0f;
+ } else if((strcmp(plane, "YZ") == 0) && matSize > 2) {
+ mat[4] = 1.0f;
+ mat[8] = 1.0f;
+ } else {
+ PyErr_SetString(PyExc_AttributeError, "mathutils.OrthoProjectionMatrix(): unknown plane - expected: X, Y, XY, XZ, YZ\n");
+ return NULL;
+ }
+ } else { //arbitrary plane
+ //normalize arbitrary axis
+ for(x = 0; x < vec->size; x++) {
+ norm += vec->vec[x] * vec->vec[x];
+ }
+ norm = (float) sqrt(norm);
+ for(x = 0; x < vec->size; x++) {
+ vec->vec[x] /= norm;
+ }
+ if((strcmp(plane, "R") == 0) && matSize == 2) {
+ mat[0] = 1 - (vec->vec[0] * vec->vec[0]);
+ mat[1] = -(vec->vec[0] * vec->vec[1]);
+ mat[2] = -(vec->vec[0] * vec->vec[1]);
+ mat[3] = 1 - (vec->vec[1] * vec->vec[1]);
+ } else if((strcmp(plane, "R") == 0) && matSize > 2) {
+ mat[0] = 1 - (vec->vec[0] * vec->vec[0]);
+ mat[1] = -(vec->vec[0] * vec->vec[1]);
+ mat[2] = -(vec->vec[0] * vec->vec[2]);
+ mat[3] = -(vec->vec[0] * vec->vec[1]);
+ mat[4] = 1 - (vec->vec[1] * vec->vec[1]);
+ mat[5] = -(vec->vec[1] * vec->vec[2]);
+ mat[6] = -(vec->vec[0] * vec->vec[2]);
+ 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");
+ return NULL;
+ }
+ }
+ if(matSize == 4) {
+ //resize matrix
+ mat[10] = mat[8];
+ mat[9] = mat[7];
+ mat[8] = mat[6];
+ mat[7] = 0.0f;
+ mat[6] = mat[5];
+ mat[5] = mat[4];
+ mat[4] = mat[3];
+ mat[3] = 0.0f;
+ }
+ //pass to matrix creation
+ return newMatrixObject(mat, matSize, matSize, Py_NEW, (PyTypeObject *)cls);
+}
+
+static char C_Matrix_Shear_doc[] =
+".. classmethod:: Shear(plane, factor, size)\n"
+"\n"
+" Create a matrix to represent an shear transformation.\n"
+"\n"
+" :arg plane: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ'], where a single axis is for a 2D matrix.\n"
+" :type plane: string\n"
+" :arg factor: The factor of shear to apply.\n"
+" :type factor: float\n"
+" :arg size: The size of the shear matrix to construct [2, 4].\n"
+" :type size: int\n"
+" :return: A new shear matrix.\n"
+" :rtype: :class:`Matrix`\n";
+
+static PyObject *C_Matrix_Shear(PyObject *cls, PyObject *args)
+{
+ int matSize;
+ char *plane;
+ float factor;
+ float mat[16] = {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};
+
+ if(!PyArg_ParseTuple(args, "sfi", &plane, &factor, &matSize)) {
+ 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");
+ return NULL;
+ }
+
+ if((strcmp(plane, "X") == 0)
+ && matSize == 2) {
+ mat[0] = 1.0f;
+ mat[2] = factor;
+ mat[3] = 1.0f;
+ } else if((strcmp(plane, "Y") == 0) && matSize == 2) {
+ mat[0] = 1.0f;
+ mat[1] = factor;
+ mat[3] = 1.0f;
+ } else if((strcmp(plane, "XY") == 0) && matSize > 2) {
+ mat[0] = 1.0f;
+ mat[4] = 1.0f;
+ mat[6] = factor;
+ mat[7] = factor;
+ } else if((strcmp(plane, "XZ") == 0) && matSize > 2) {
+ mat[0] = 1.0f;
+ mat[3] = factor;
+ mat[4] = 1.0f;
+ mat[5] = factor;
+ mat[8] = 1.0f;
+ } else if((strcmp(plane, "YZ") == 0) && matSize > 2) {
+ mat[0] = 1.0f;
+ mat[1] = factor;
+ mat[2] = factor;
+ 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");
+ return NULL;
+ }
+ if(matSize == 4) {
+ //resize matrix
+ mat[10] = mat[8];
+ mat[9] = mat[7];
+ mat[8] = mat[6];
+ mat[7] = 0.0f;
+ mat[6] = mat[5];
+ mat[5] = mat[4];
+ mat[4] = mat[3];
+ mat[3] = 0.0f;
+ }
+ //pass to matrix creation
+ return newMatrixObject(mat, matSize, matSize, Py_NEW, (PyTypeObject *)cls);
+}
+
/* assumes rowsize == colsize is checked and the read callback has run */
static float matrix_determinant(MatrixObject * self)
{
@@ -245,7 +677,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 +694,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 +711,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 +753,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 +1155,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);
}
@@ -1101,7 +1526,6 @@ static PyObject *Matrix_mul(PyObject * m1, PyObject * m2)
return NULL;
}
else /* if(mat1) { */ {
-
if(VectorObject_Check(m2)) { /* MATRIX*VECTOR */
return column_vector_multiplication(mat1, (VectorObject *)m2); /* vector update done inside the function */
}
@@ -1133,13 +1557,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 */
};
@@ -1304,12 +1731,12 @@ static PyObject *Matrix_getIsNegative( MatrixObject * self, void *type )
/* Python attributes get/set structure: */
/*****************************************************************************/
static PyGetSetDef Matrix_getseters[] = {
- {"row_size", (getter)Matrix_getRowSize, (setter)NULL, "The row size of the matrix (readonly). **type** int", NULL},
- {"col_size", (getter)Matrix_getColSize, (setter)NULL, "The column size of the matrix (readonly). **type** int", NULL},
- {"median_scale", (getter)Matrix_getMedianScale, (setter)NULL, "The average scale applied to each axis (readonly). **type** float", NULL},
- {"is_negative", (getter)Matrix_getIsNegative, (setter)NULL, "True if this matrix results in a negative scale, 3x3 and 4x4 only, (readonly). **type** bool", NULL},
+ {"row_size", (getter)Matrix_getRowSize, (setter)NULL, "The row size of the matrix (readonly).\n\n:type: int", NULL},
+ {"col_size", (getter)Matrix_getColSize, (setter)NULL, "The column size of the matrix (readonly).\n\n:type: int", NULL},
+ {"median_scale", (getter)Matrix_getMedianScale, (setter)NULL, "The average scale applied to each axis (readonly).\n\n:type: float", NULL},
+ {"is_negative", (getter)Matrix_getIsNegative, (setter)NULL, "True if this matrix results in a negative scale, 3x3 and 4x4 only, (readonly).\n\n:type: bool", NULL},
{"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, BaseMathObject_Wrapped_doc, NULL},
- {"_owner",(getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
+ {"owner",(getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
};
@@ -1330,6 +1757,13 @@ static struct PyMethodDef Matrix_methods[] = {
{"to_quat", (PyCFunction) Matrix_toQuat, METH_NOARGS, Matrix_toQuat_doc},
{"copy", (PyCFunction) Matrix_copy, METH_NOARGS, Matrix_copy_doc},
{"__copy__", (PyCFunction) Matrix_copy, METH_NOARGS, Matrix_copy_doc},
+
+ /* class methods */
+ {"Rotation", (PyCFunction) C_Matrix_Rotation, METH_VARARGS | METH_CLASS, C_Matrix_Rotation_doc},
+ {"Scale", (PyCFunction) C_Matrix_Scale, METH_VARARGS | METH_CLASS, C_Matrix_Scale_doc},
+ {"Shear", (PyCFunction) C_Matrix_Shear, METH_VARARGS | METH_CLASS, C_Matrix_Shear_doc},
+ {"Translation", (PyCFunction) C_Matrix_Translation, METH_O | METH_CLASS, C_Matrix_Translation_doc},
+ {"OrthoProjection", (PyCFunction) C_Matrix_OrthoProjection, METH_VARARGS | METH_CLASS, C_Matrix_OrthoProjection_doc},
{NULL, NULL, 0, NULL}
};
@@ -1425,12 +1859,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 +1870,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
index b18a3e8e6fe..21538f8168e 100644
--- a/source/blender/python/generic/matrix.h
+++ b/source/blender/python/generic/mathutils_matrix.h
@@ -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
index 36d01e7aa9f..553844b6ee5 100644
--- a/source/blender/python/generic/quat.c
+++ b/source/blender/python/generic/mathutils_quat.c
@@ -26,12 +26,37 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "Mathutils.h"
+#include "mathutils.h"
#include "BLI_math.h"
#include "BKE_utildefines.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"
@@ -48,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))
@@ -60,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;
}
@@ -72,19 +97,19 @@ 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);
}
//----------------------------Quaternion.toMatrix()------------------
static char Quaternion_ToMatrix_doc[] =
-".. method:: to_matrix(other)\n"
+".. method:: to_matrix()\n"
"\n"
" Return a matrix representation of the quaternion.\n"
"\n"
@@ -115,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" );
@@ -165,9 +190,7 @@ static char Quaternion_Difference_doc[] =
static PyObject *Quaternion_Difference(QuaternionObject * self, QuaternionObject * value)
{
- float quat[4], tempQuat[4];
- double dot = 0.0f;
- int x;
+ float quat[QUAT_SIZE];
if (!QuaternionObject_Check(value)) {
PyErr_SetString( PyExc_TypeError, "quat.difference(value): expected a quaternion argument" );
@@ -177,18 +200,8 @@ 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];
+ rotation_between_quats_to_quat(quat, self->quat, value->quat);
- dot = sqrt(tempQuat[0] * tempQuat[0] + tempQuat[1] * tempQuat[1] +
- tempQuat[2] * tempQuat[2] + tempQuat[3] * tempQuat[3]);
-
- for(x = 0; x < 4; x++) {
- tempQuat[x] /= (float)(dot * dot);
- }
- mul_qt_qtqt(quat, tempQuat, value->quat);
return newQuaternionObject(quat, Py_NEW, NULL);
}
@@ -207,7 +220,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");
@@ -351,14 +364,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)
@@ -387,10 +405,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{
@@ -413,15 +431,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;
}
@@ -442,9 +460,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;
}
@@ -465,9 +483,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);
@@ -482,52 +500,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;
+ /* 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;
+ }
+}
- 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");
+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);
}
- //parsed well - now set in vector
- for(y = 0; y < size; y++)
- self->quat[begin + y] = quat[y];
+ else if (PySlice_Check(item)) {
+ Py_ssize_t start, stop, step, slicelength;
- BaseMath_WriteCallback(self);
- return 0;
+ 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)) {
@@ -548,7 +621,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)) {
@@ -562,7 +635,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];
}
@@ -572,7 +645,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;
@@ -587,8 +660,9 @@ static PyObject *Quaternion_mul(PyObject * q1, PyObject * q2)
return NULL;
}
- if(quat1 && quat2) { /* QUAT*QUAT (dot product) */
- return PyFloat_FromDouble(dot_qtqt(quat1->quat, quat2->quat));
+ if(quat1 && quat2) { /* QUAT*QUAT (cross product) */
+ mul_qt_qtqt(quat, quat1->quat, quat2->quat);
+ return newQuaternionObject(quat, Py_NEW, NULL);
}
/* the only case this can happen (for a supported type is "FLOAT*QUAT" ) */
@@ -604,12 +678,19 @@ static PyObject *Quaternion_mul(PyObject * q1, PyObject * q2)
}
else { /* QUAT*SOMETHING */
if(VectorObject_Check(q2)){ /* QUAT*VEC */
+ float tvec[3];
vec = (VectorObject*)q2;
if(vec->size != 3){
PyErr_SetString(PyExc_TypeError, "Quaternion multiplication: only 3D vector rotations currently supported\n");
return NULL;
}
- return quat_rotation((PyObject*)quat1, (PyObject*)vec); /* vector updating done inside the func */
+ if(!BaseMath_ReadCallback(vec)) {
+ return NULL;
+ }
+
+ copy_v3_v3(tvec, vec->vec);
+ mul_qt_v3(quat1->quat, tvec);
+ return newVectorObject(tvec, 3, Py_NEW, NULL);
}
scalar= PyFloat_AsDouble(q2);
@@ -626,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 )
@@ -684,125 +774,128 @@ static int Quaternion_setAxis( QuaternionObject * self, PyObject * value, void *
static PyObject *Quaternion_getMagnitude( QuaternionObject * self, void *type )
{
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
return PyFloat_FromDouble(sqrt(dot_qtqt(self->quat, self->quat)));
}
static PyObject *Quaternion_getAngle( QuaternionObject * self, void *type )
{
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
return PyFloat_FromDouble(2.0 * (saacos(self->quat[0])));
}
-static PyObject *Quaternion_getAxisVec( QuaternionObject * self, void *type )
+static int Quaternion_setAngle(QuaternionObject * self, PyObject * value, 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
- if( EXPP_FloatsAreEqual(vec[0], 0.0f, 10) &&
- EXPP_FloatsAreEqual(vec[1], 0.0f, 10) &&
- EXPP_FloatsAreEqual(vec[2], 0.0f, 10) ){
- vec[0] = 1.0f;
+ float axis[3];
+ float angle;
+
+ if(!BaseMath_ReadCallback(self))
+ return -1;
+
+ quat_to_axis_angle(axis, &angle, self->quat);
+
+ angle = PyFloat_AsDouble(value);
+
+ if(angle==-1.0f && PyErr_Occurred()) { /* parsed item not a number */
+ PyErr_SetString(PyExc_TypeError, "quaternion.angle = value: float expected");
+ return -1;
}
- return (PyObject *) newVectorObject(vec, 3, Py_NEW, NULL);
+
+ /* If the axis of rotation is 0,0,0 set it to 1,0,0 - for zero-degree rotations */
+ if( EXPP_FloatsAreEqual(axis[0], 0.0f, 10) &&
+ EXPP_FloatsAreEqual(axis[1], 0.0f, 10) &&
+ EXPP_FloatsAreEqual(axis[2], 0.0f, 10)
+ ) {
+ axis[0] = 1.0f;
+ }
+
+ axis_angle_to_quat(self->quat, axis, angle);
+
+ if(!BaseMath_WriteCallback(self))
+ return -1;
+
+ return 0;
}
-//----------------------------------Mathutils.Quaternion() --------------
-static PyObject *Quaternion_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+static PyObject *Quaternion_getAxisVec(QuaternionObject *self, void *type)
{
- PyObject *listObject = NULL, *n, *q;
- int size, i;
- float quat[4];
- double angle = 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;
- }
-
- 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;
+ float axis[3];
+ float angle;
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ quat_to_axis_angle(axis, &angle, self->quat);
+
+ /* If the axis of rotation is 0,0,0 set it to 1,0,0 - for zero-degree rotations */
+ if( EXPP_FloatsAreEqual(axis[0], 0.0f, 10) &&
+ EXPP_FloatsAreEqual(axis[1], 0.0f, 10) &&
+ EXPP_FloatsAreEqual(axis[2], 0.0f, 10)
+ ) {
+ axis[0] = 1.0f;
}
- 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");
- return NULL;
- }
- }else{
- if(size != 4){
- PyErr_SetString(PyExc_AttributeError, "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n");
- return NULL;
- }
+ return (PyObject *) newVectorObject(axis, 3, Py_NEW, NULL);
+}
+
+static int Quaternion_setAxisVec(QuaternionObject *self, PyObject *value, void *type)
+{
+ float axis[3];
+ float angle;
+
+ VectorObject *vec;
+
+ if(!BaseMath_ReadCallback(self))
+ return -1;
+
+ quat_to_axis_angle(axis, &angle, self->quat);
+
+ if(!VectorObject_Check(value)) {
+ PyErr_SetString(PyExc_TypeError, "quaternion.axis = value: expected a 3D Vector");
+ return -1;
}
+
+ vec= (VectorObject *)value;
+ if(!BaseMath_ReadCallback(vec))
+ return -1;
- for (i=0; i<size; i++) { //parse
- q = PySequence_GetItem(listObject, i);
- if (q == NULL) { // Failed to read sequence
- PyErr_SetString(PyExc_RuntimeError, "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n");
- return NULL;
- }
+ axis_angle_to_quat(self->quat, vec->vec, angle);
+
+ if(!BaseMath_WriteCallback(self))
+ return -1;
+
+ return 0;
+}
+
+//----------------------------------mathutils.Quaternion() --------------
+static PyObject *Quaternion_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ PyObject *seq= NULL;
+ float angle = 0.0f;
+ float quat[QUAT_SIZE]= {0.0f, 0.0f, 0.0f, 0.0f};
- quat[i] = PyFloat_AsDouble(q);
- Py_DECREF(q);
+ if(!PyArg_ParseTuple(args, "|Of:mathutils.Quaternion", &seq, &angle))
+ return NULL;
- if (quat[i]==-1 && PyErr_Occurred()) {
- PyErr_SetString(PyExc_TypeError, "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;
+ break;
+ case 2:
+ if (mathutils_array_parse(quat, 3, 3, seq, "mathutils.Quaternion()") == -1)
return NULL;
- }
- }
- if(size == 3) //calculate the quat based on axis/angle
axis_angle_to_quat(quat, quat, angle);
-
+ break;
+ /* PyArg_ParseTuple assures no more then 2 */
+ }
return newQuaternionObject(quat, Py_NEW, NULL);
}
@@ -829,15 +922,15 @@ static struct PyMethodDef Quaternion_methods[] = {
/* Python attributes get/set structure: */
/*****************************************************************************/
static PyGetSetDef Quaternion_getseters[] = {
- {"w", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, "Quaternion W value. **type** float", (void *)0},
- {"x", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, "Quaternion X axis. **type** float", (void *)1},
- {"y", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, "Quaternion Y axis. **type** float", (void *)2},
- {"z", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, "Quaternion Z axis. **type** float", (void *)3},
- {"magnitude", (getter)Quaternion_getMagnitude, (setter)NULL, "Size of the quaternion (readonly). **type** float", NULL},
- {"angle", (getter)Quaternion_getAngle, (setter)NULL, "angle of the quaternion (readonly). **type** float", NULL},
- {"axis",(getter)Quaternion_getAxisVec, (setter)NULL, "quaternion axis as a vector (readonly). **type** :class:`Vector`", NULL},
+ {"w", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, "Quaternion W value.\n\n:type: float", (void *)0},
+ {"x", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, "Quaternion X axis.\n\n:type: float", (void *)1},
+ {"y", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, "Quaternion Y axis.\n\n:type: float", (void *)2},
+ {"z", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, "Quaternion Z axis.\n\n:type: float", (void *)3},
+ {"magnitude", (getter)Quaternion_getMagnitude, (setter)NULL, "Size of the quaternion (readonly).\n\n:type: float", NULL},
+ {"angle", (getter)Quaternion_getAngle, (setter)Quaternion_setAngle, "angle of the quaternion.\n\n:type: float", NULL},
+ {"axis",(getter)Quaternion_getAxisVec, (setter)Quaternion_setAxisVec, "quaternion axis as a vector.\n\n:type: :class:`Vector`", NULL},
{"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, BaseMathObject_Wrapped_doc, NULL},
- {"_owner", (getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
+ {"owner", (getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
};
@@ -855,10 +948,10 @@ PyTypeObject quaternion_Type = {
0, //tp_getattr
0, //tp_setattr
0, //tp_compare
- (reprfunc) Quaternion_repr, //tp_repr
- &Quaternion_NumMethods, //tp_as_number
- &Quaternion_SeqMethods, //tp_as_sequence
- 0, //tp_as_mapping
+ (reprfunc) Quaternion_repr, //tp_repr
+ &Quaternion_NumMethods, //tp_as_number
+ &Quaternion_SeqMethods, //tp_as_sequence
+ &Quaternion_AsMapping, //tp_as_mapping
0, //tp_hash
0, //tp_call
0, //tp_str
@@ -914,7 +1007,7 @@ PyObject *newQuaternionObject(float *quat, int type, PyTypeObject *base_type)
self->quat = 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
index 6e0c9d6dd1f..c9ec12d6152 100644
--- a/source/blender/python/generic/quat.h
+++ b/source/blender/python/generic/mathutils_quat.h
@@ -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
index fa26946a682..7b73a7501bb 100644
--- a/source/blender/python/generic/vector.c
+++ b/source/blender/python/generic/mathutils_vector.c
@@ -25,7 +25,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "Mathutils.h"
+#include "mathutils.h"
#include "BLI_blenlib.h"
#include "BKE_utildefines.h"
@@ -39,56 +39,28 @@
#define SWIZZLE_VALID_AXIS 0x4
#define SWIZZLE_AXIS 0x3
-static PyObject *row_vector_multiplication(VectorObject* vec, MatrixObject * mat); /* utility func */
+static int row_vector_multiplication(float rvec[4], 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;
-
- 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");
+ float vec[4]= {0.0f, 0.0f, 0.0f, 0.0f};
+ int size= 3; /* default to a 3D vector */
+
+ 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; i<size; i++) {
- v=PySequence_GetItem(listObject, i);
- if (v==NULL) { // Failed to read sequence
- PyErr_SetString(PyExc_RuntimeError, "Mathutils.Vector(): 2-4 floats or ints expected (optionally in a sequence)\n");
- return NULL;
- }
-
- f= PyFloat_AsDouble(v);
- if(f==-1 && PyErr_Occurred()) { // parsed item not a number
- Py_DECREF(v);
- PyErr_SetString(PyExc_TypeError, "Mathutils.Vector(): 2-4 floats or ints expected (optionally in a sequence)\n");
- return NULL;
- }
-
- vec[i]= f;
- Py_DECREF(v);
- }
return newVectorObject(vec, size, Py_NEW, type);
}
@@ -101,7 +73,7 @@ static char Vector_Zero_doc[] =
" :return: an instance of itself\n"
" :rtype: :class:`Vector`\n";
-static PyObject *Vector_Zero(VectorObject * self)
+static PyObject *Vector_Zero(VectorObject *self)
{
int i;
for(i = 0; i < self->size; 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");
- return NULL;
+ 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]));
+ }
}
- if(!BaseMath_ReadCallback(self))
- return NULL;
+ return ret;
+}
- ret= PyTuple_New(self->size);
+static PyObject *Vector_ToTuple(VectorObject *self, PyObject *args)
+{
+ int ndigits= 0;
- for(x = 0; x < self->size; x++) {
- PyTuple_SET_ITEM(ret, x, PyFloat_FromDouble(double_round((double)self->vec[x], ndigits)));
+ 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;
}
- return ret;
+ if(PyTuple_GET_SIZE(args)==0)
+ ndigits= -1;
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ 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,29 @@ 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"
+" :type fallback: any\n"
+" :return: 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)
{
+ 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 +544,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 +578,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];
@@ -603,11 +608,12 @@ static char Vector_Project_doc[] =
"\n"
" Return the projection of this vector onto the *other*.\n"
"\n"
+" :arg other: second vector.\n"
" :type other: :class:`Vector`\n"
-" :return projection: the parallel projection vector\n"
+" :return: 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 +649,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 +661,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 +697,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 +707,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 +746,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 +769,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,7 +791,7 @@ 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,
+static int Vector_ass_slice(VectorObject *self, int begin, int end,
PyObject * seq)
{
int i, y, size = 0;
@@ -824,8 +819,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;
@@ -1008,7 +1002,11 @@ static PyObject *Vector_mul(PyObject * v1, PyObject * v2)
return PyFloat_FromDouble(dot);
}
- /*swap so vec1 is always the vector */
+ /* swap so vec1 is always the vector */
+ /* note: it would seem from this code that the matrix multiplication below
+ * is communicative. however the matrix class will always handle the
+ * (matrix * vector) case so we can ignore it here.
+ * This is NOT so for Quaternions: TODO, check if communicative (vec * quat) is correct */
if (vec2) {
vec1= vec2;
v2= v1;
@@ -1016,15 +1014,25 @@ static PyObject *Vector_mul(PyObject * v1, PyObject * v2)
if (MatrixObject_Check(v2)) {
/* VEC * MATRIX */
- return row_vector_multiplication(vec1, (MatrixObject*)v2);
+ float tvec[4];
+ if(row_vector_multiplication(tvec, vec1, (MatrixObject*)v2) == -1)
+ return NULL;
+ return newVectorObject(tvec, vec1->size, Py_NEW, NULL);
} else if (QuaternionObject_Check(v2)) {
- QuaternionObject *quat = (QuaternionObject*)v2; /* quat_rotation validates */
+ /* VEC * QUAT */
+ QuaternionObject *quat2 = (QuaternionObject*)v2;
+ float tvec[4];
if(vec1->size != 3) {
PyErr_SetString(PyExc_TypeError, "Vector multiplication: only 3D vector rotations (with quats) currently supported\n");
return NULL;
}
- return quat_rotation((PyObject*)vec1, (PyObject*)quat);
+ if(!BaseMath_ReadCallback(quat2)) {
+ return NULL;
+ }
+ copy_v3_v3(tvec, vec1->vec);
+ mul_qt_v3(quat2->quat, tvec);
+ return newVectorObject(tvec, 3, Py_NEW, NULL);
}
else if (((scalar= PyFloat_AsDouble(v2)) == -1.0 && PyErr_Occurred())==0) { /* VEC*FLOAT */
int i;
@@ -1055,42 +1063,20 @@ static PyObject *Vector_imul(PyObject * v1, PyObject * v2)
/* only support vec*=float and vec*=mat
vec*=vec result is a float so that wont work */
if (MatrixObject_Check(v2)) {
- float vecCopy[4];
- int x,y, size = vec->size;
- MatrixObject *mat= (MatrixObject*)v2;
-
- if(!BaseMath_ReadCallback(mat))
+ float tvec[4];
+ if(row_vector_multiplication(tvec, vec, (MatrixObject*)v2) == -1)
return NULL;
-
- if(mat->colSize != size){
- if(mat->rowSize == 4 && vec->size != 3){
- PyErr_SetString(PyExc_AttributeError, "vector * matrix: matrix column size and the vector size must be the same");
- return NULL;
- } else {
- vecCopy[3] = 1.0f;
- }
- }
-
- for(i = 0; i < size; i++){
- vecCopy[i] = vec->vec[i];
- }
-
- size = MIN2(size, mat->colSize);
-
- /*muliplication*/
- for(x = 0, i = 0; x < size; x++, i++) {
- double dot = 0.0f;
- for(y = 0; y < mat->rowSize; y++) {
- dot += mat->matrix[y][x] * vecCopy[y];
- }
- vec->vec[i] = (float)dot;
- }
+
+ i= vec->size - 1;
+ do {
+ vec->vec[i] = tvec[i];
+ } while(i--);
}
else if (((scalar= PyFloat_AsDouble(v2)) == -1.0 && PyErr_Occurred())==0) { /* VEC*=FLOAT */
-
- for(i = 0; i < vec->size; i++) {
+ i= vec->size - 1;
+ do {
vec->vec[i] *= scalar;
- }
+ } while(i--);
}
else {
PyErr_SetString(PyExc_TypeError, "Vector multiplication: arguments not acceptable for this operation\n");
@@ -1118,14 +1104,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 +1132,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 +1267,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)
@@ -1408,18 +1395,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 +1420,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;
}
@@ -1476,7 +1462,7 @@ static int Vector_setLength( VectorObject * self, PyObject * value )
self->vec[i]= self->vec[i] / (float)dot;
}
- BaseMath_WriteCallback(self); /* checked alredy */
+ BaseMath_WriteCallback(self); /* checked already */
return 0;
}
@@ -1484,10 +1470,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,22 +1481,22 @@ 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.
@@ -1523,18 +1509,18 @@ static PyObject *Vector_getSwizzle(VectorObject * self, void *closure)
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 +1528,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;
- }
-
- 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;
- }
+ if (((scalarVal=PyFloat_AsDouble(value)) == -1 && PyErr_Occurred())==0) {
+ int i;
+ for(i=0; i < MAX_DIMENSIONS; i++)
+ vec_assign[i]= scalarVal;
- memcpy(self->vec, vecTemp, axisB * sizeof(float));
- /* continue with BaseMathObject_WriteCallback at the end */
+ size_from= axis_from;
+ }
+ else if((size_from=mathutils_array_parse(vec_assign, 2, 4, value, "mathutils.Vector.**** = swizzle assignment")) == -1) {
+ return -1;
}
- 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 */
+ if(axis_from != size_from) {
+ PyErr_SetString(PyExc_AttributeError, "Error: vector size does not match swizzle.\n");
+ return -1;
}
- else if (((scalarVal = (float)PyFloat_AsDouble(value)) == -1.0 && PyErr_Occurred())==0)
+
+ /* Copy vector contents onto swizzled axes. */
+ axis_from = 0;
+ swizzleClosure = GET_INT_FROM_POINTER(closure);
+ while (swizzleClosure & SWIZZLE_VALID_AXIS)
{
- /* 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." );
- return -1;
+ 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;
@@ -1642,14 +1581,14 @@ static int Vector_setSwizzle(VectorObject * self, PyObject * value, void *closur
/* Python attributes get/set structure: */
/*****************************************************************************/
static PyGetSetDef Vector_getseters[] = {
- {"x", (getter)Vector_getAxis, (setter)Vector_setAxis, "Vector X axis. **type** float", (void *)0},
- {"y", (getter)Vector_getAxis, (setter)Vector_setAxis, "Vector Y axis. **type** float", (void *)1},
- {"z", (getter)Vector_getAxis, (setter)Vector_setAxis, "Vector Z axis (3D Vectors only). **type** float", (void *)2},
- {"w", (getter)Vector_getAxis, (setter)Vector_setAxis, "Vector W axis (4D Vectors only). **type** float", (void *)3},
- {"length", (getter)Vector_getLength, (setter)Vector_setLength, "Vector Length. **type** float", NULL},
- {"magnitude", (getter)Vector_getLength, (setter)Vector_setLength, "Vector Length. **type** float", NULL},
+ {"x", (getter)Vector_getAxis, (setter)Vector_setAxis, "Vector X axis.\n\n:type: float", (void *)0},
+ {"y", (getter)Vector_getAxis, (setter)Vector_setAxis, "Vector Y axis.\n\n:type: float", (void *)1},
+ {"z", (getter)Vector_getAxis, (setter)Vector_setAxis, "Vector Z axis (3D Vectors only).\n\n:type: float", (void *)2},
+ {"w", (getter)Vector_getAxis, (setter)Vector_setAxis, "Vector W axis (4D Vectors only).\n\n:type: float", (void *)3},
+ {"length", (getter)Vector_getLength, (setter)Vector_setLength, "Vector Length.\n\n:type: float", NULL},
+ {"magnitude", (getter)Vector_getLength, (setter)Vector_setLength, "Vector Length.\n\n:type: float", NULL},
{"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, BaseMathObject_Wrapped_doc, NULL},
- {"_owner", (getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
+ {"owner", (getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
/* autogenerated swizzle attrs, see python script below */
{"xx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 36
@@ -2038,37 +1977,37 @@ if len(unique) != len(items):
// [2][5][8]
// [3][6][9]
//vector/matrix multiplication IS NOT COMMUTATIVE!!!!
-static PyObject *row_vector_multiplication(VectorObject* vec, MatrixObject * mat)
+static int row_vector_multiplication(float rvec[4], VectorObject* vec, MatrixObject * mat)
{
- float vecNew[4], vecCopy[4];
+ float vecCopy[4];
double dot = 0.0f;
int x, y, z = 0, vec_size = vec->size;
if(mat->colSize != vec_size){
if(mat->colSize == 4 && vec_size != 3){
PyErr_SetString(PyExc_AttributeError, "vector * matrix: matrix column size and the vector size must be the same");
- return NULL;
+ return -1;
}else{
vecCopy[3] = 1.0f;
}
}
if(!BaseMath_ReadCallback(vec) || !BaseMath_ReadCallback(mat))
- return NULL;
+ return -1;
for(x = 0; x < vec_size; x++){
vecCopy[x] = vec->vec[x];
}
- vecNew[3] = 1.0f;
+ rvec[3] = 1.0f;
//muliplication
for(x = 0; x < mat->rowSize; x++) {
for(y = 0; y < mat->colSize; y++) {
dot += mat->matrix[x][y] * vecCopy[y];
}
- vecNew[z++] = (float)dot;
+ rvec[z++] = (float)dot;
dot = 0.0f;
}
- return newVectorObject(vecNew, vec_size, Py_NEW, NULL);
+ return 0;
}
/*----------------------------Vector.negate() -------------------- */
@@ -2080,7 +2019,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))
@@ -2089,7 +2028,7 @@ static PyObject *Vector_Negate(VectorObject * self)
for(i = 0; i < self->size; i++)
self->vec[i] = -(self->vec[i]);
- BaseMath_WriteCallback(self); // alredy checked for error
+ BaseMath_WriteCallback(self); // already checked for error
Py_INCREF(self);
return (PyObject*)self;
@@ -2102,12 +2041,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 +2069,7 @@ PyTypeObject vector_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
/* For printing, in format "<module>.<name>" */
"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
index fd95f5a6750..42b9849dd3f 100644
--- a/source/blender/python/generic/vector.h
+++ b/source/blender/python/generic/mathutils_vector.h
@@ -1,4 +1,5 @@
-/* $Id$
+/*
+ * $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/generic/noise.c b/source/blender/python/generic/noise.c
new file mode 100644
index 00000000000..4a09cbb58d8
--- /dev/null
+++ b/source/blender/python/generic/noise.c
@@ -0,0 +1,760 @@
+/**
+ * $Id$
+ *
+ * Blender.Noise BPython module implementation.
+ * This submodule has functions to generate noise of various types.
+ *
+ * ***** 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.
+ *
+ * This is a new part of Blender.
+ *
+ * Contributor(s): eeshlo
+ *
+ * ***** END GPL LICENSE BLOCK *****
+*/
+
+/************************/
+/* Blender Noise Module */
+/************************/
+
+#include <Python.h>
+#include "structseq.h"
+
+#include "BLI_blenlib.h"
+#include "DNA_texture_types.h"
+/*-----------------------------------------*/
+/* 'mersenne twister' random number generator */
+
+/*
+ A C-program for MT19937, with initialization improved 2002/2/10.
+ Coded by Takuji Nishimura and Makoto Matsumoto.
+ This is a faster version by taking Shawn Cokus's optimization,
+ Matthe Bellew's simplification, Isaku Wada's real version.
+
+ Before using, initialize the state by using init_genrand(seed)
+ or init_by_array(init_key, key_length).
+
+ Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. The names of its contributors may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+ Any feedback is very welcome.
+ http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
+ email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space)
+*/
+
+/* 2.5 update
+ * Noise.setRandomSeed --> seed_set
+ * Noise.randuvec --> random_unit_vector
+ * Noise.vNoise --> noise_vector
+ * Noise.vTurbulence --> turbulence_vector
+ * Noise.multiFractal --> multi_fractal
+ * Noise.cellNoise --> cell
+ * Noise.cellNoiseV --> cell_vector
+ * Noise.vlNoise --> vl_vector
+ * Noise.heteroTerrain --> hetero_terrain
+ * Noise.hybridMFractal --> hybrid_multi_fractal
+ * Noise.fBm --> fractal
+ * Noise.ridgedMFractal --> ridged_multi_fractal
+ *
+ * Const's *
+ * Noise.NoiseTypes --> types
+ * Noise.DistanceMetrics --> distance_metrics
+ */
+
+/* Period parameters */
+#define N 624
+#define M 397
+#define MATRIX_A 0x9908b0dfUL /* constant vector a */
+#define UMASK 0x80000000UL /* most significant w-r bits */
+#define LMASK 0x7fffffffUL /* least significant r bits */
+#define MIXBITS(u,v) (((u) & UMASK) | ((v) & LMASK))
+#define TWIST(u,v) ((MIXBITS(u,v) >> 1) ^ ((v)&1UL ? MATRIX_A : 0UL))
+
+static unsigned long state[N]; /* the array for the state vector */
+static int left = 1;
+static int initf = 0;
+static unsigned long *next;
+
+PyObject *Noise_Init(void);
+
+/* initializes state[N] with a seed */
+static void init_genrand(unsigned long s)
+{
+ int j;
+ state[0] = s & 0xffffffffUL;
+ for(j = 1; j < N; j++) {
+ state[j] =
+ (1812433253UL *
+ (state[j - 1] ^ (state[j - 1] >> 30)) + j);
+ /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
+ /* In the previous versions, MSBs of the seed affect */
+ /* only MSBs of the array state[]. */
+ /* 2002/01/09 modified by Makoto Matsumoto */
+ state[j] &= 0xffffffffUL; /* for >32 bit machines */
+ }
+ left = 1;
+ initf = 1;
+}
+
+static void next_state(void)
+{
+ unsigned long *p = state;
+ int j;
+
+ /* if init_genrand() has not been called, */
+ /* a default initial seed is used */
+ if(initf == 0)
+ init_genrand(5489UL);
+
+ left = N;
+ next = state;
+
+ for(j = N - M + 1; --j; p++)
+ *p = p[M] ^ TWIST(p[0], p[1]);
+
+ for(j = M; --j; p++)
+ *p = p[M - N] ^ TWIST(p[0], p[1]);
+
+ *p = p[M - N] ^ TWIST(p[0], state[0]);
+}
+
+/*------------------------------------------------------------*/
+
+static void setRndSeed(int seed)
+{
+ if(seed == 0)
+ init_genrand(time(NULL));
+ else
+ init_genrand(seed);
+}
+
+/* float number in range [0, 1) using the mersenne twister rng */
+static float frand()
+{
+ unsigned long y;
+
+ if(--left == 0)
+ next_state();
+ y = *next++;
+
+ /* Tempering */
+ y ^= (y >> 11);
+ y ^= (y << 7) & 0x9d2c5680UL;
+ y ^= (y << 15) & 0xefc60000UL;
+ y ^= (y >> 18);
+
+ return (float) y / 4294967296.f;
+}
+
+/*------------------------------------------------------------*/
+
+/* returns random unit vector */
+static void randuvec(float v[3])
+{
+ float r;
+ v[2] = 2.f * frand() - 1.f;
+ if((r = 1.f - v[2] * v[2]) > 0.f) {
+ float a = (float)(6.283185307f * frand());
+ r = (float)sqrt(r);
+ v[0] = (float)(r * cos(a));
+ v[1] = (float)(r * sin(a));
+ } else
+ v[2] = 1.f;
+}
+
+static PyObject *Noise_random(PyObject * self)
+{
+ return PyFloat_FromDouble(frand());
+}
+
+static PyObject *Noise_random_unit_vector(PyObject * self)
+{
+ float v[3] = {0.0f, 0.0f, 0.0f};
+ randuvec(v);
+ return Py_BuildValue("[fff]", v[0], v[1], v[2]);
+}
+
+/*---------------------------------------------------------------------*/
+
+/* Random seed init. Only used for MT random() & randuvec() */
+
+static PyObject *Noise_seed_set(PyObject * self, PyObject * args)
+{
+ int s;
+ if(!PyArg_ParseTuple(args, "i:seed_set", &s))
+ return NULL;
+ setRndSeed(s);
+ Py_RETURN_NONE;
+}
+
+/*-------------------------------------------------------------------------*/
+
+/* General noise */
+
+static PyObject *Noise_noise(PyObject * self, PyObject * args)
+{
+ float x, y, z;
+ int nb = 1;
+ if(!PyArg_ParseTuple(args, "(fff)|i:noise", &x, &y, &z, &nb))
+ return NULL;
+
+ return PyFloat_FromDouble((2.0 * BLI_gNoise(1.0, x, y, z, 0, nb) - 1.0));
+}
+
+/*-------------------------------------------------------------------------*/
+
+/* General Vector noise */
+
+static void noise_vector(float x, float y, float z, int nb, float v[3])
+{
+ /* Simply evaluate noise at 3 different positions */
+ v[0] = (float)(2.0 * BLI_gNoise(1.f, x + 9.321f, y - 1.531f, z - 7.951f, 0,
+ nb) - 1.0);
+ v[1] = (float)(2.0 * BLI_gNoise(1.f, x, y, z, 0, nb) - 1.0);
+ v[2] = (float)(2.0 * BLI_gNoise(1.f, x + 6.327f, y + 0.1671f, z - 2.672f, 0,
+ nb) - 1.0);
+}
+
+static PyObject *Noise_vector(PyObject * self, PyObject * args)
+{
+ float x, y, z, v[3];
+ int nb = 1;
+ if(!PyArg_ParseTuple(args, "(fff)|i:vector", &x, &y, &z, &nb))
+ return NULL;
+ noise_vector(x, y, z, nb, v);
+ return Py_BuildValue("[fff]", v[0], v[1], v[2]);
+}
+
+/*---------------------------------------------------------------------------*/
+
+/* General turbulence */
+
+static float turb(float x, float y, float z, int oct, int hard, int nb,
+ float ampscale, float freqscale)
+{
+ float amp, out, t;
+ int i;
+ amp = 1.f;
+ out = (float)(2.0 * BLI_gNoise(1.f, x, y, z, 0, nb) - 1.0);
+ if(hard)
+ out = (float)fabs(out);
+ for(i = 1; i < oct; i++) {
+ amp *= ampscale;
+ x *= freqscale;
+ y *= freqscale;
+ z *= freqscale;
+ t = (float)(amp * (2.0 * BLI_gNoise(1.f, x, y, z, 0, nb) - 1.0));
+ if(hard)
+ t = (float)fabs(t);
+ out += t;
+ }
+ return out;
+}
+
+static PyObject *Noise_turbulence(PyObject * self, PyObject * args)
+{
+ float x, y, z;
+ int oct, hd, nb = 1;
+ float as = 0.5, fs = 2.0;
+ if(!PyArg_ParseTuple(args, "(fff)ii|iff:turbulence", &x, &y, &z, &oct, &hd, &nb, &as, &fs))
+ return NULL;
+
+ return PyFloat_FromDouble(turb(x, y, z, oct, hd, nb, as, fs));
+}
+
+/*--------------------------------------------------------------------------*/
+
+/* Turbulence Vector */
+
+static void vTurb(float x, float y, float z, int oct, int hard, int nb,
+ float ampscale, float freqscale, float v[3])
+{
+ float amp, t[3];
+ int i;
+ amp = 1.f;
+ noise_vector(x, y, z, nb, v);
+ if(hard) {
+ v[0] = (float)fabs(v[0]);
+ v[1] = (float)fabs(v[1]);
+ v[2] = (float)fabs(v[2]);
+ }
+ for(i = 1; i < oct; i++) {
+ amp *= ampscale;
+ x *= freqscale;
+ y *= freqscale;
+ z *= freqscale;
+ noise_vector(x, y, z, nb, t);
+ if(hard) {
+ t[0] = (float)fabs(t[0]);
+ t[1] = (float)fabs(t[1]);
+ t[2] = (float)fabs(t[2]);
+ }
+ v[0] += amp * t[0];
+ v[1] += amp * t[1];
+ v[2] += amp * t[2];
+ }
+}
+
+static PyObject *Noise_turbulence_vector(PyObject * self, PyObject * args)
+{
+ float x, y, z, v[3];
+ int oct, hd, nb = 1;
+ float as = 0.5, fs = 2.0;
+ if(!PyArg_ParseTuple(args, "(fff)ii|iff:turbulence_vector", &x, &y, &z, &oct, &hd, &nb, &as, &fs))
+ return NULL;
+ vTurb(x, y, z, oct, hd, nb, as, fs, v);
+ return Py_BuildValue("[fff]", v[0], v[1], v[2]);
+}
+
+/*---------------------------------------------------------------------*/
+
+/* F. Kenton Musgrave's fractal functions */
+
+static PyObject *Noise_fractal(PyObject * self, PyObject * args)
+{
+ float x, y, z, H, lac, oct;
+ int nb = 1;
+ if(!PyArg_ParseTuple(args, "(fff)fff|i:fractal", &x, &y, &z, &H, &lac, &oct, &nb))
+ return NULL;
+ return PyFloat_FromDouble(mg_fBm(x, y, z, H, lac, oct, nb));
+}
+
+/*------------------------------------------------------------------------*/
+
+static PyObject *Noise_multi_fractal(PyObject * self, PyObject * args)
+{
+ float x, y, z, H, lac, oct;
+ int nb = 1;
+ if(!PyArg_ParseTuple(args, "(fff)fff|i:multi_fractal", &x, &y, &z, &H, &lac, &oct, &nb))
+ return NULL;
+
+ return PyFloat_FromDouble(mg_MultiFractal(x, y, z, H, lac, oct, nb));
+}
+
+/*------------------------------------------------------------------------*/
+
+static PyObject *Noise_vl_vector(PyObject * self, PyObject * args)
+{
+ float x, y, z, d;
+ int nt1 = 1, nt2 = 1;
+ if(!PyArg_ParseTuple(args, "(fff)f|ii:vl_vector", &x, &y, &z, &d, &nt1, &nt2))
+ return NULL;
+ return PyFloat_FromDouble(mg_VLNoise(x, y, z, d, nt1, nt2));
+}
+
+/*-------------------------------------------------------------------------*/
+
+static PyObject *Noise_hetero_terrain(PyObject * self, PyObject * args)
+{
+ float x, y, z, H, lac, oct, ofs;
+ int nb = 1;
+ if(!PyArg_ParseTuple(args, "(fff)ffff|i:hetero_terrain", &x, &y, &z, &H, &lac, &oct, &ofs, &nb))
+ return NULL;
+
+ return PyFloat_FromDouble(mg_HeteroTerrain(x, y, z, H, lac, oct, ofs, nb));
+}
+
+/*-------------------------------------------------------------------------*/
+
+static PyObject *Noise_hybrid_multi_fractal(PyObject * self, PyObject * args)
+{
+ float x, y, z, H, lac, oct, ofs, gn;
+ int nb = 1;
+ if(!PyArg_ParseTuple(args, "(fff)fffff|i:hybrid_multi_fractal", &x, &y, &z, &H, &lac, &oct, &ofs, &gn, &nb))
+ return NULL;
+
+ return PyFloat_FromDouble(mg_HybridMultiFractal(x, y, z, H, lac, oct, ofs, gn, nb));
+}
+
+/*------------------------------------------------------------------------*/
+
+static PyObject *Noise_ridged_multi_fractal(PyObject * self, PyObject * args)
+{
+ float x, y, z, H, lac, oct, ofs, gn;
+ int nb = 1;
+ if(!PyArg_ParseTuple(args, "(fff)fffff|i:ridged_multi_fractal", &x, &y, &z, &H, &lac, &oct, &ofs, &gn, &nb))
+ return NULL;
+ return PyFloat_FromDouble(mg_RidgedMultiFractal(x, y, z, H, lac, oct, ofs, gn, nb));
+}
+
+/*-------------------------------------------------------------------------*/
+
+static PyObject *Noise_voronoi(PyObject * self, PyObject * args)
+{
+ float x, y, z, da[4], pa[12];
+ int dtype = 0;
+ float me = 2.5; /* default minkovsky exponent */
+ if(!PyArg_ParseTuple(args, "(fff)|if:voronoi", &x, &y, &z, &dtype, &me))
+ return NULL;
+ voronoi(x, y, z, da, pa, me, dtype);
+ return Py_BuildValue("[[ffff][[fff][fff][fff][fff]]]",
+ da[0], da[1], da[2], da[3],
+ pa[0], pa[1], pa[2],
+ pa[3], pa[4], pa[5],
+ pa[6], pa[7], pa[8], pa[9], pa[10], pa[11]);
+}
+
+/*-------------------------------------------------------------------------*/
+
+static PyObject *Noise_cell(PyObject * self, PyObject * args)
+{
+ float x, y, z;
+ if(!PyArg_ParseTuple(args, "(fff):cell", &x, &y, &z))
+ return NULL;
+
+ return PyFloat_FromDouble(cellNoise(x, y, z));
+}
+
+/*--------------------------------------------------------------------------*/
+
+static PyObject *Noise_cell_vector(PyObject * self, PyObject * args)
+{
+ float x, y, z, ca[3];
+ if(!PyArg_ParseTuple(args, "(fff):cell_vector", &x, &y, &z))
+ return NULL;
+ cellNoiseV(x, y, z, ca);
+ return Py_BuildValue("[fff]", ca[0], ca[1], ca[2]);
+}
+
+/*--------------------------------------------------------------------------*/
+/* For all other Blender modules, this stuff seems to be put in a header file.
+ This doesn't seem really appropriate to me, so I just put it here, feel free to change it.
+ In the original module I actually kept the docs stings with the functions themselves,
+ but I grouped them here so that it can easily be moved to a header if anyone thinks that is necessary. */
+
+static char random__doc__[] = "() No arguments.\n\n\
+Returns a random floating point number in the range [0, 1)";
+
+static char random_unit_vector__doc__[] =
+ "() No arguments.\n\nReturns a random unit vector (3-float list).";
+
+static char seed_set__doc__[] = "(seed value)\n\n\
+Initializes random number generator.\n\
+if seed is zero, the current time will be used instead.";
+
+static char noise__doc__[] = "((x,y,z) tuple, [noisetype])\n\n\
+Returns general noise of the optional specified type.\n\
+Optional argument noisetype determines the type of noise, STDPERLIN by default, see NoiseTypes.";
+
+static char noise_vector__doc__[] = "((x,y,z) tuple, [noisetype])\n\n\
+Returns noise vector (3-float list) of the optional specified type.\
+Optional argument noisetype determines the type of noise, STDPERLIN by default, see NoiseTypes.";
+
+static char turbulence__doc__[] =
+ "((x,y,z) tuple, octaves, hard, [noisebasis], [ampscale], [freqscale])\n\n\
+Returns general turbulence value using the optional specified noisebasis function.\n\
+octaves (integer) is the number of noise values added.\n\
+hard (bool), when false (0) returns 'soft' noise, when true (1) returns 'hard' noise (returned value always positive).\n\
+Optional arguments:\n\
+noisebasis determines the type of noise used for the turbulence, STDPERLIN by default, see NoiseTypes.\n\
+ampscale sets the amplitude scale value of the noise frequencies added, 0.5 by default.\n\
+freqscale sets the frequency scale factor, 2.0 by default.";
+
+static char turbulence_vector__doc__[] =
+ "((x,y,z) tuple, octaves, hard, [noisebasis], [ampscale], [freqscale])\n\n\
+Returns general turbulence vector (3-float list) using the optional specified noisebasis function.\n\
+octaves (integer) is the number of noise values added.\n\
+hard (bool), when false (0) returns 'soft' noise, when true (1) returns 'hard' noise (returned vector always positive).\n\
+Optional arguments:\n\
+noisebasis determines the type of noise used for the turbulence, STDPERLIN by default, see NoiseTypes.\n\
+ampscale sets the amplitude scale value of the noise frequencies added, 0.5 by default.\n\
+freqscale sets the frequency scale factor, 2.0 by default.";
+
+static char fractal__doc__[] =
+ "((x,y,z) tuple, H, lacunarity, octaves, [noisebasis])\n\n\
+Returns Fractal Brownian Motion noise value(fBm).\n\
+H is the fractal increment parameter.\n\
+lacunarity is the gap between successive frequencies.\n\
+octaves is the number of frequencies in the fBm.\n\
+Optional argument noisebasis determines the type of noise used for the turbulence, STDPERLIN by default, see NoiseTypes.";
+
+static char multi_fractal__doc__[] =
+ "((x,y,z) tuple, H, lacunarity, octaves, [noisebasis])\n\n\
+Returns Multifractal noise value.\n\
+H determines the highest fractal dimension.\n\
+lacunarity is gap between successive frequencies.\n\
+octaves is the number of frequencies in the fBm.\n\
+Optional argument noisebasis determines the type of noise used for the turbulence, STDPERLIN by default, see NoiseTypes.";
+
+static char vl_vector__doc__[] =
+ "((x,y,z) tuple, distortion, [noisetype1], [noisetype2])\n\n\
+Returns Variable Lacunarity Noise value, a distorted variety of noise.\n\
+distortion sets the amount of distortion.\n\
+Optional arguments noisetype1 and noisetype2 set the noisetype to distort and the noisetype used for the distortion respectively.\n\
+See NoiseTypes, both are STDPERLIN by default.";
+
+static char hetero_terrain__doc__[] =
+ "((x,y,z) tuple, H, lacunarity, octaves, offset, [noisebasis])\n\n\
+returns Heterogeneous Terrain value\n\
+H determines the fractal dimension of the roughest areas.\n\
+lacunarity is the gap between successive frequencies.\n\
+octaves is the number of frequencies in the fBm.\n\
+offset raises the terrain from 'sea level'.\n\
+Optional argument noisebasis determines the type of noise used for the turbulence, STDPERLIN by default, see NoiseTypes.";
+
+static char hybrid_multi_fractal__doc__[] =
+ "((x,y,z) tuple, H, lacunarity, octaves, offset, gain, [noisebasis])\n\n\
+returns Hybrid Multifractal value.\n\
+H determines the fractal dimension of the roughest areas.\n\
+lacunarity is the gap between successive frequencies.\n\
+octaves is the number of frequencies in the fBm.\n\
+offset raises the terrain from 'sea level'.\n\
+gain scales the values.\n\
+Optional argument noisebasis determines the type of noise used for the turbulence, STDPERLIN by default, see NoiseTypes.";
+
+static char ridged_multi_fractal__doc__[] =
+ "((x,y,z) tuple, H, lacunarity, octaves, offset, gain [noisebasis])\n\n\
+returns Ridged Multifractal value.\n\
+H determines the fractal dimension of the roughest areas.\n\
+lacunarity is the gap between successive frequencies.\n\
+octaves is the number of frequencies in the fBm.\n\
+offset raises the terrain from 'sea level'.\n\
+gain scales the values.\n\
+Optional argument noisebasis determines the type of noise used for the turbulence, STDPERLIN by default, see NoiseTypes.";
+
+static char voronoi__doc__[] =
+ "((x,y,z) tuple, distance_metric, [exponent])\n\n\
+returns a list, containing a list of distances in order of closest feature,\n\
+and a list containing the positions of the four closest features\n\
+Optional arguments:\n\
+distance_metric: see DistanceMetrics, default is DISTANCE\n\
+exponent is only used with MINKOVSKY, default is 2.5.";
+
+static char cell__doc__[] = "((x,y,z) tuple)\n\n\
+returns cellnoise float value.";
+
+static char cell_vector__doc__[] = "((x,y,z) tuple)\n\n\
+returns cellnoise vector/point/color (3-float list).";
+
+static char Noise__doc__[] = "Blender Noise and Turbulence Module\n\n\
+This module can be used to generate noise of various types.\n\
+This can be used for terrain generation, to create textures,\n\
+make animations more 'animated', object deformation, etc.\n\
+As an example, this code segment when scriptlinked to a framechanged event,\n\
+will make the camera sway randomly about, by changing parameters this can\n\
+look like anything from an earthquake to a very nervous or maybe even drunk cameraman...\n\
+(the camera needs an ipo with at least one Loc & Rot key for this to work!):\n\
+\n\
+\tfrom Blender import Get, Scene, Noise\n\
+\n\
+\t####################################################\n\
+\t# This controls jitter speed\n\
+\tsl = 0.025\n\
+\t# This controls the amount of position jitter\n\
+\tsp = 0.1\n\
+\t# This controls the amount of rotation jitter\n\
+\tsr = 0.25\n\
+\t####################################################\n\
+\n\
+\ttime = Get('curtime')\n\
+\tob = Scene.GetCurrent().getCurrentCamera()\n\
+\tps = (sl*time, sl*time, sl*time)\n\
+\t# To add jitter only when the camera moves, use this next line instead\n\
+\t#ps = (sl*ob.LocX, sl*ob.LocY, sl*ob.LocZ)\n\
+\trv = Noise.turbulence_vector(ps, 3, 0, Noise.NoiseTypes.NEWPERLIN)\n\
+\tob.dloc = (sp*rv[0], sp*rv[1], sp*rv[2])\n\
+\tob.drot = (sr*rv[0], sr*rv[1], sr*rv[2])\n\
+\n";
+
+/* Just in case, declarations for a header file */
+/*
+static PyObject *Noise_random(PyObject *self);
+static PyObject *Noise_random_unit_vector(PyObject *self);
+static PyObject *Noise_seed_set(PyObject *self, PyObject *args);
+static PyObject *Noise_noise(PyObject *self, PyObject *args);
+static PyObject *Noise_vector(PyObject *self, PyObject *args);
+static PyObject *Noise_turbulence(PyObject *self, PyObject *args);
+static PyObject *Noise_turbulence_vector(PyObject *self, PyObject *args);
+static PyObject *Noise_fractal(PyObject *self, PyObject *args);
+static PyObject *Noise_multi_fractal(PyObject *self, PyObject *args);
+static PyObject *Noise_vl_vector(PyObject *self, PyObject *args);
+static PyObject *Noise_hetero_terrain(PyObject *self, PyObject *args);
+static PyObject *Noise_hybrid_multi_fractal(PyObject *self, PyObject *args);
+static PyObject *Noise_ridged_multi_fractal(PyObject *self, PyObject *args);
+static PyObject *Noise_voronoi(PyObject *self, PyObject *args);
+static PyObject *Noise_cell(PyObject *self, PyObject *args);
+static PyObject *Noise_cell_vector(PyObject *self, PyObject *args);
+*/
+
+static PyMethodDef NoiseMethods[] = {
+ {"seed_set", (PyCFunction) Noise_seed_set, METH_VARARGS, seed_set__doc__},
+ {"random", (PyCFunction) Noise_random, METH_NOARGS, random__doc__},
+ {"random_unit_vector", (PyCFunction) Noise_random_unit_vector, METH_NOARGS, random_unit_vector__doc__},
+ {"noise", (PyCFunction) Noise_noise, METH_VARARGS, noise__doc__},
+ {"vector", (PyCFunction) Noise_vector, METH_VARARGS, noise_vector__doc__},
+ {"turbulence", (PyCFunction) Noise_turbulence, METH_VARARGS, turbulence__doc__},
+ {"turbulence_vector", (PyCFunction) Noise_turbulence_vector, METH_VARARGS, turbulence_vector__doc__},
+ {"fractal", (PyCFunction) Noise_fractal, METH_VARARGS, fractal__doc__},
+ {"multi_fractal", (PyCFunction) Noise_multi_fractal, METH_VARARGS, multi_fractal__doc__},
+ {"vl_vector", (PyCFunction) Noise_vl_vector, METH_VARARGS, vl_vector__doc__},
+ {"hetero_terrain", (PyCFunction) Noise_hetero_terrain, METH_VARARGS, hetero_terrain__doc__},
+ {"hybrid_multi_fractal", (PyCFunction) Noise_hybrid_multi_fractal, METH_VARARGS, hybrid_multi_fractal__doc__},
+ {"ridged_multi_fractal", (PyCFunction) Noise_ridged_multi_fractal, METH_VARARGS, ridged_multi_fractal__doc__},
+ {"voronoi", (PyCFunction) Noise_voronoi, METH_VARARGS, voronoi__doc__},
+ {"cell", (PyCFunction) Noise_cell, METH_VARARGS, cell__doc__},
+ {"cell_vector", (PyCFunction) Noise_cell_vector, METH_VARARGS, cell_vector__doc__},
+ {NULL, NULL, 0, NULL}
+};
+
+/*----------------------------------------------------------------------*/
+
+static struct PyModuleDef noise_module_def = {
+ PyModuleDef_HEAD_INIT,
+ "noise", /* m_name */
+ Noise__doc__, /* m_doc */
+ 0, /* m_size */
+ NoiseMethods, /* m_methods */
+ 0, /* m_reload */
+ 0, /* m_traverse */
+ 0, /* m_clear */
+ 0, /* m_free */
+};
+
+PyObject *Noise_Init(void)
+{
+ PyObject *submodule = PyModule_Create(&noise_module_def);
+ PyDict_SetItemString(PyImport_GetModuleDict(), noise_module_def.m_name, submodule);
+
+ /* use current time as seed for random number generator by default */
+ setRndSeed(0);
+
+ /* Constant noisetype dictionary */
+ if(submodule) {
+ static PyStructSequence_Field noise_types_fields[] = {
+ {"BLENDER", ""},
+ {"STDPERLIN", ""},
+ {"NEWPERLIN", ""},
+ {"VORONOI_F1", ""},
+ {"VORONOI_F2", ""},
+ {"VORONOI_F3", ""},
+ {"VORONOI_F4", ""},
+ {"VORONOI_F2F1", ""},
+ {"VORONOI_CRACKLE", ""},
+ {"CELLNOISE", ""},
+ {0}
+ };
+
+ static PyStructSequence_Desc noise_types_info_desc = {
+ "noise.types", /* name */
+ "Noise type", /* doc */
+ noise_types_fields, /* fields */
+ (sizeof(noise_types_fields)/sizeof(PyStructSequence_Field)) - 1
+ };
+
+ static PyTypeObject NoiseType;
+
+ PyObject *noise_types;
+
+ int pos = 0;
+
+ PyStructSequence_InitType(&NoiseType, &noise_types_info_desc);
+
+ noise_types = PyStructSequence_New(&NoiseType);
+ if (noise_types == NULL) {
+ return NULL;
+ }
+
+ PyStructSequence_SET_ITEM(noise_types, pos++, PyLong_FromLong(TEX_BLENDER));
+ PyStructSequence_SET_ITEM(noise_types, pos++, PyLong_FromLong(TEX_STDPERLIN));
+ PyStructSequence_SET_ITEM(noise_types, pos++, PyLong_FromLong(TEX_NEWPERLIN));
+ PyStructSequence_SET_ITEM(noise_types, pos++, PyLong_FromLong(TEX_VORONOI_F1));
+ PyStructSequence_SET_ITEM(noise_types, pos++, PyLong_FromLong(TEX_VORONOI_F2));
+ PyStructSequence_SET_ITEM(noise_types, pos++, PyLong_FromLong(TEX_VORONOI_F3));
+ PyStructSequence_SET_ITEM(noise_types, pos++, PyLong_FromLong(TEX_VORONOI_F4));
+ PyStructSequence_SET_ITEM(noise_types, pos++, PyLong_FromLong(TEX_VORONOI_F2F1));
+ PyStructSequence_SET_ITEM(noise_types, pos++, PyLong_FromLong(TEX_VORONOI_CRACKLE));
+ PyStructSequence_SET_ITEM(noise_types, pos++, PyLong_FromLong(TEX_CELLNOISE));
+
+ PyModule_AddObject(submodule, "types", noise_types);
+ }
+
+ if(submodule) {
+ static PyStructSequence_Field distance_metrics_fields[] = {
+ {"DISTANCE", ""},
+ {"DISTANCE_SQUARED", ""},
+ {"MANHATTAN", ""},
+ {"CHEBYCHEV", ""},
+ {"MINKOVSKY_HALF", ""},
+ {"MINKOVSKY_FOUR", ""},
+ {"MINKOVSKY", ""},
+ {0}
+ };
+
+ static PyStructSequence_Desc noise_types_info_desc = {
+ "noise.distance_metrics", /* name */
+ "Distance Metrics for noise module.", /* doc */
+ distance_metrics_fields, /* fields */
+ (sizeof(distance_metrics_fields)/sizeof(PyStructSequence_Field)) - 1
+ };
+
+ static PyTypeObject DistanceMetrics;
+
+ PyObject *distance_metrics;
+
+ int pos = 0;
+
+ PyStructSequence_InitType(&DistanceMetrics, &noise_types_info_desc);
+
+ distance_metrics = PyStructSequence_New(&DistanceMetrics);
+ if (distance_metrics == NULL) {
+ return NULL;
+ }
+
+ PyStructSequence_SET_ITEM(distance_metrics, pos++, PyLong_FromLong(TEX_DISTANCE));
+ PyStructSequence_SET_ITEM(distance_metrics, pos++, PyLong_FromLong(TEX_DISTANCE_SQUARED));
+ PyStructSequence_SET_ITEM(distance_metrics, pos++, PyLong_FromLong(TEX_MANHATTAN));
+ PyStructSequence_SET_ITEM(distance_metrics, pos++, PyLong_FromLong(TEX_CHEBYCHEV));
+ PyStructSequence_SET_ITEM(distance_metrics, pos++, PyLong_FromLong(TEX_MINKOVSKY_HALF));
+ PyStructSequence_SET_ITEM(distance_metrics, pos++, PyLong_FromLong(TEX_MINKOVSKY_FOUR));
+ PyStructSequence_SET_ITEM(distance_metrics, pos++, PyLong_FromLong(TEX_MINKOVSKY));
+
+ PyModule_AddObject(submodule, "distance_metrics", distance_metrics);
+ }
+
+ return submodule;
+}
diff --git a/source/blender/python/intern/Makefile b/source/blender/python/intern/Makefile
index 419092cbe21..6c0b7b4d14e 100644
--- a/source/blender/python/intern/Makefile
+++ b/source/blender/python/intern/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.
@@ -57,6 +57,7 @@ CPPFLAGS += -I../../imbuf
CPPFLAGS += -I../../blenloader
CPPFLAGS += -I../../windowmanager
CPPFLAGS += -I../../render/extern/include
+CPPFLAGS += -I$(NAN_AUDASPACE)/include
# path to the guarded memory allocator
CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
diff --git a/source/blender/python/intern/bpy.c b/source/blender/python/intern/bpy.c
index 3f8daec0161..03c1a012575 100644
--- a/source/blender/python/intern/bpy.c
+++ b/source/blender/python/intern/bpy.c
@@ -31,47 +31,89 @@
#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/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"
+#include "AUD_PyInit.h"
+
+static char bpy_script_paths_doc[] =
+".. function:: script_paths()\n"
"\n"
-" return 3 paths to blender home directories.\n"
+" Return 2 paths to blender scripts directories.\n"
"\n"
-" :arg subfolder: The name of a subfolder to find within the blenders home directory.\n"
-" :type subfolder: string\n"
-" :return: (system, local, user) strings will be empty when not found.\n"
+" :return: (system, user) strings will be empty when not found.\n"
" :rtype: tuple of strigs\n";
-PyObject *bpy_home_paths(PyObject *self, PyObject *args)
+PyObject *bpy_script_paths(PyObject *self)
{
- PyObject *ret= PyTuple_New(3);
+ PyObject *ret= PyTuple_New(2);
char *path;
- char *subfolder= "";
- if (!PyArg_ParseTuple(args, "|s:blender_homes", &subfolder))
- return NULL;
-
- path= BLI_gethome_folder(subfolder, BLI_GETHOME_SYSTEM);
+ path= BLI_get_folder(BLENDER_USER_SCRIPTS, NULL);
PyTuple_SET_ITEM(ret, 0, PyUnicode_FromString(path?path:""));
-
- path= BLI_gethome_folder(subfolder, BLI_GETHOME_LOCAL);
+ path= BLI_get_folder(BLENDER_SYSTEM_SCRIPTS, NULL);
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:""));
return ret;
}
-static PyMethodDef meth_bpy_home_paths[] = {{ "home_paths", (PyCFunction)bpy_home_paths, METH_VARARGS, bpy_home_paths_doc}};
+static char bpy_blend_paths_doc[] =
+".. function:: blend_paths(absolute=False)\n"
+"\n"
+" Returns a list of paths to external files referenced by the loaded .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_script_paths[] = {{ "script_paths", (PyCFunction)bpy_script_paths, METH_NOARGS, bpy_script_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)
{
@@ -91,29 +133,34 @@ 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();
+ Noise_Init();
BGL_Init();
BLF_Init();
IDProp_Init_Types();
-
+ AUD_initPython();
mod = PyModule_New("_bpy");
/* add the module so we can import it */
- PyDict_SetItemString(PySys_GetObject("modules"), "_bpy", mod);
+ PyDict_SetItemString(PyImport_GetModuleDict(), "_bpy", mod);
Py_DECREF(mod);
/* run first, initializes rna types */
@@ -128,13 +175,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_script_paths->ml_name, (PyObject *)PyCFunction_New(meth_bpy_script_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_app.c b/source/blender/python/intern/bpy_app.c
index 15c6ad09e69..78658a611a3 100644
--- a/source/blender/python/intern/bpy_app.c
+++ b/source/blender/python/intern/bpy_app.c
@@ -43,9 +43,9 @@ static PyTypeObject BlenderAppType;
static PyStructSequence_Field app_info_fields[] = {
{"version", "The Blender version as a tuple of 3 numbers. eg. (2, 50, 11)"},
{"version_string", "The Blender version formatted as a string"},
- {"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"},
@@ -60,7 +60,7 @@ 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 PyObject *make_app_info(void)
@@ -84,9 +84,9 @@ static PyObject *make_app_info(void)
SetObjItem(Py_BuildValue("(iii)", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION));
SetObjItem(PyUnicode_FromFormat("%d.%02d (sub %d)", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION));
- SetStrItem(BLI_gethome());
SetStrItem(bprogname);
SetObjItem(PyBool_FromLong(G.f & G_DEBUG));
+ SetObjItem(PyBool_FromLong(G.background));
/* build info */
#ifdef BUILD_DATE
diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c
index 00ea556792e..e5719a84fdd 100644
--- a/source/blender/python/intern/bpy_driver.c
+++ b/source/blender/python/intern/bpy_driver.c
@@ -24,6 +24,8 @@
/* ****************************************** */
/* Drivers - PyExpression Evaluation */
+#include <Python.h>
+
#include "DNA_anim_types.h"
#include "BLI_listbase.h"
@@ -32,8 +34,6 @@
#include "BKE_fcurve.h"
#include "BKE_global.h"
-#include <Python.h>
-
/* 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,14 +144,19 @@ 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;
double result = 0.0; /* default return */
@@ -168,13 +174,17 @@ float BPY_pydriver_eval (ChannelDriver *driver)
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);
+ if(use_gil)
+ PyGILState_Release(gilstate);
return 0.0f;
}
}
@@ -232,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();
@@ -269,13 +279,14 @@ float BPY_pydriver_eval (ChannelDriver *driver)
Py_DECREF(retval);
}
- PyGILState_Release(gilstate);
+ if(use_gil)
+ PyGILState_Release(gilstate);
if(finite(result)) {
return (float)result;
}
else {
- fprintf(stderr, "\tBPY_pydriver_eval() - driver '%s' evaluates to '%f'\n", dvar->name, result);
+ 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 285dbb78874..af2b5b41961 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -44,6 +44,7 @@
#include "BKE_context.h"
#include "BKE_text.h"
+#include "BKE_font.h" /* only for utf8towchar */
#include "BKE_main.h"
#include "BKE_global.h" /* only for script checking */
@@ -145,39 +146,10 @@ void BPY_update_modules( void )
bpy_context_module->ptr.data= (void *)BPy_GetContext();
}
-/*****************************************************************************
-* Description: This function creates a new Python dictionary object.
-*****************************************************************************/
-static PyObject *CreateGlobalDictionary( bContext *C, const char *filename )
-{
- PyObject *mod;
- PyObject *item;
- PyObject *dict = PyDict_New( );
- PyDict_SetItemString( dict, "__builtins__", PyEval_GetBuiltins( ) );
-
- item = PyUnicode_FromString( "__main__" );
- PyDict_SetItemString( dict, "__name__", item );
- Py_DECREF(item);
-
- /* __file__ only for nice UI'ness */
- if(filename) {
- PyObject *item = PyUnicode_FromString( filename );
- PyDict_SetItemString( dict, "__file__", item );
- 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;
@@ -210,10 +182,15 @@ void BPY_start_python_path(void)
#endif
{
- static wchar_t py_path_bundle_wchar[FILE_MAXDIR];
+ static wchar_t py_path_bundle_wchar[FILE_MAX];
+
+ /* cant use this, on linux gives bug: #23018, TODO: try LANG="en_US.UTF-8" /usr/bin/blender, suggested 22008 */
+ /* mbstowcs(py_path_bundle_wchar, py_path_bundle, FILE_MAXDIR); */
+
+ utf8towchar(py_path_bundle_wchar, py_path_bundle);
- mbstowcs(py_path_bundle_wchar, py_path_bundle, FILE_MAXDIR);
Py_SetPythonHome(py_path_bundle_wchar);
+ // printf("found python (wchar_t) '%ls'\n", py_path_bundle_wchar);
}
}
@@ -229,6 +206,11 @@ void BPY_start_python( int argc, char **argv )
{
PyThreadState *py_tstate = NULL;
+ /* not essential but nice to set our name */
+ static wchar_t bprogname_wchar[FILE_MAXDIR+FILE_MAXFILE]; /* python holds a reference */
+ utf8towchar(bprogname_wchar, bprogname);
+ Py_SetProgramName(bprogname_wchar);
+
BPY_start_python_path(); /* allow to use our own included python */
Py_Initialize( );
@@ -325,18 +307,19 @@ int BPY_run_python_script( bContext *C, const char *fn, struct Text *text, struc
if (fn==NULL && text==NULL) {
return 0;
}
-
+
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 = bpy_namespace_dict_new(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 );
@@ -347,8 +330,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 = bpy_namespace_dict_new(fn);
+
if(fp) {
#ifdef _WIN32
/* Previously we used PyRun_File to run directly the code on a FILE
@@ -382,7 +369,7 @@ int BPY_run_python_script( bContext *C, const char *fn, struct Text *text, struc
Py_DECREF( py_result );
}
- Py_DECREF(py_dict);
+ PyDict_SetItemString(PyThreadState_GET()->interp->modules, "__main__", Py_None);
bpy_context_clear(C, &gilstate);
@@ -491,7 +478,7 @@ int BPY_run_python_script_space(const char *modulename, const char *func)
gilstate = PyGILState_Ensure();
- py_dict = CreateGlobalDictionary(C);
+ py_dict = bpy_namespace_dict_new("<dummy>");
PyObject *module = PyImport_ImportModule(scpt->script.filename);
if (module==NULL) {
@@ -520,7 +507,7 @@ int BPY_run_python_script_space(const char *modulename, const char *func)
Py_XDECREF(module);
- Py_DECREF(py_dict);
+ PyDict_SetItemString(PyThreadState_GET()->interp->modules, "__main__", Py_None);
PyGILState_Release(gilstate);
return 1;
@@ -528,10 +515,10 @@ int BPY_run_python_script_space(const char *modulename, const char *func)
#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;
+ PyObject *py_dict, *mod, *retval;
int error_ret = 0;
if (!value || !expr) return -1;
@@ -543,11 +530,11 @@ int BPY_button_eval(bContext *C, char *expr, double *value)
bpy_context_set(C, &gilstate);
- dict= CreateGlobalDictionary(C, NULL);
+ py_dict= bpy_namespace_dict_new("<blender button>");
mod = PyImport_ImportModule("math");
if (mod) {
- PyDict_Merge(dict, PyModule_GetDict(mod), 0); /* 0 - dont overwrite existing values */
+ PyDict_Merge(py_dict, PyModule_GetDict(mod), 0); /* 0 - dont overwrite existing values */
Py_DECREF(mod);
}
else { /* highly unlikely but possibly */
@@ -555,7 +542,7 @@ int BPY_button_eval(bContext *C, char *expr, double *value)
PyErr_Clear();
}
- retval = PyRun_String(expr, Py_eval_input, dict, dict);
+ retval = PyRun_String(expr, Py_eval_input, py_dict, py_dict);
if (retval == NULL) {
error_ret= -1;
@@ -592,13 +579,49 @@ int BPY_button_eval(bContext *C, char *expr, double *value)
if(error_ret) {
BPy_errors_to_report(CTX_wm_reports(C));
}
+
+ PyDict_SetItemString(PyThreadState_GET()->interp->modules, "__main__", Py_None);
- Py_DECREF(dict);
bpy_context_clear(C, &gilstate);
return error_ret;
}
+int BPY_eval_string(bContext *C, const char *expr)
+{
+ PyGILState_STATE gilstate;
+ PyObject *py_dict, *retval;
+ int error_ret = 0;
+
+ if (!expr) return -1;
+
+ if(expr[0]=='\0') {
+ return error_ret;
+ }
+
+ bpy_context_set(C, &gilstate);
+
+ py_dict= bpy_namespace_dict_new("<blender string>");
+
+ retval = PyRun_String(expr, Py_eval_input, py_dict, py_dict);
+
+ if (retval == NULL) {
+ error_ret= -1;
+
+ BPy_errors_to_report(CTX_wm_reports(C));
+ }
+ else {
+ Py_DECREF(retval);
+ }
+
+ PyDict_SetItemString(PyThreadState_GET()->interp->modules, "__main__", Py_None);
+
+ 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 0e54f158ac4..c6c34fbcaf5 100644
--- a/source/blender/python/intern/bpy_operator.c
+++ b/source/blender/python/intern/bpy_operator.c
@@ -63,7 +63,7 @@ static PyObject *pyop_call( PyObject * self, PyObject * args)
if (!PyArg_ParseTuple(args, "sO|O!s:_bpy.ops.call", &opname, &context_dict, &PyDict_Type, &kw, &context_str))
return NULL;
- ot= WM_operatortype_exists(opname);
+ ot= WM_operatortype_find(opname, TRUE);
if (ot == NULL) {
PyErr_Format( PyExc_SystemError, "Calling operator \"bpy.ops.%s\" error, could not be found", opname);
@@ -259,7 +259,7 @@ PyObject *BPY_operator_module( void )
static PyMethodDef pyop_macro_def_meth ={"macro_define", (PyCFunction) PYOP_wrap_macro_define, METH_VARARGS, NULL};
PyObject *submodule = PyModule_New("_bpy.ops");
- PyDict_SetItemString(PySys_GetObject("modules"), "_bpy.ops", submodule);
+ PyDict_SetItemString(PyImport_GetModuleDict(), "_bpy.ops", submodule);
PyModule_AddObject( submodule, "call", PyCFunction_New(&pyop_call_meth, NULL) );
PyModule_AddObject( submodule, "as_string",PyCFunction_New(&pyop_as_string_meth,NULL) );
diff --git a/source/blender/python/intern/bpy_operator_wrap.c b/source/blender/python/intern/bpy_operator_wrap.c
index 0c1eafb4948..6d16896fb16 100644
--- a/source/blender/python/intern/bpy_operator_wrap.c
+++ b/source/blender/python/intern/bpy_operator_wrap.c
@@ -34,22 +34,15 @@
static void operator_properties_init(wmOperatorType *ot)
{
PyObject *py_class = ot->ext.data;
- PyObject *item= ((PyTypeObject*)py_class)->tp_dict; /* getattr(..., "__dict__") returns a proxy */
-
RNA_struct_blender_type_set(ot->ext.srna, ot);
- if(item) {
- /* only call this so pyrna_deferred_register_props gives a useful error
- * WM_operatortype_append_ptr will call RNA_def_struct_identifier
- * later */
- RNA_def_struct_identifier(ot->srna, ot->idname);
+ /* only call this so pyrna_deferred_register_class gives a useful error
+ * WM_operatortype_append_ptr will call RNA_def_struct_identifier
+ * later */
+ RNA_def_struct_identifier(ot->srna, ot->idname);
- if(pyrna_deferred_register_props(ot->srna, item) != 0) {
- PyErr_Print(); /* failed to register operator props */
- PyErr_Clear();
- }
- }
- else {
+ if(pyrna_deferred_register_class(ot->srna, py_class) != 0) {
+ PyErr_Print(); /* failed to register operator props */
PyErr_Clear();
}
}
@@ -105,7 +98,7 @@ PyObject *PYOP_wrap_macro_define(PyObject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "Os:_bpy.ops.macro_define", &macro, &opname))
return NULL;
- if (WM_operatortype_exists(opname) == NULL) {
+ if (WM_operatortype_find(opname, TRUE) == NULL) {
PyErr_Format(PyExc_ValueError, "Macro Define: '%s' is not a valid operator id", opname);
return NULL;
}
@@ -114,7 +107,7 @@ PyObject *PYOP_wrap_macro_define(PyObject *self, PyObject *args)
srna= srna_from_self(macro, "Macro Define:");
macroname = RNA_struct_identifier(srna);
- ot = WM_operatortype_exists(macroname);
+ ot = WM_operatortype_find(macroname, TRUE);
if (!ot) {
PyErr_Format(PyExc_ValueError, "Macro Define: '%s' is not a valid macro or hasn't been registered yet", macroname);
diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c
index 85935c05cb1..9afe638908c 100644
--- a/source/blender/python/intern/bpy_props.c
+++ b/source/blender/python/intern/bpy_props.c
@@ -86,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"
@@ -132,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={...}):"))
@@ -163,7 +164,7 @@ 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"
@@ -200,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={...}):"))
@@ -240,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"
@@ -275,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={...}):"))
@@ -307,7 +306,7 @@ 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"
@@ -344,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={...}):"))
@@ -386,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"
@@ -426,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={...}):"))
@@ -463,7 +460,7 @@ 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"
@@ -500,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={...}):"))
@@ -541,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"
@@ -576,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={...}):"))
@@ -591,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);
@@ -653,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"
@@ -688,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={...}):"))
@@ -738,7 +732,7 @@ static StructRNA *pointer_type_from_py(PyObject *value, const char *error_prefix
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"
@@ -772,10 +766,9 @@ 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={...}):"))
@@ -799,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"
@@ -833,10 +826,9 @@ 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={...}):"))
@@ -860,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},
@@ -871,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}
};
@@ -888,7 +919,7 @@ PyObject *BPY_rna_props( void )
{
PyObject *submodule;
submodule= PyModule_Create(&props_module);
- PyDict_SetItemString(PySys_GetObject("modules"), props_module.m_name, submodule);
+ PyDict_SetItemString(PyImport_GetModuleDict(), props_module.m_name, submodule);
/* INCREF since its its assumed that all these functions return the
* module with a new ref like PyDict_New, since they are passed to
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 4792d284ca7..3bce1f83d6e 100644
--- a/source/blender/python/intern/bpy_rna.c
+++ b/source/blender/python/intern/bpy_rna.c
@@ -1,4 +1,3 @@
-
/**
* $Id$
*
@@ -36,6 +35,7 @@
#include "MEM_guardedalloc.h"
#include "BKE_utildefines.h"
+#include "BKE_idcode.h"
#include "BKE_context.h"
#include "BKE_global.h" /* evil G.* */
#include "BKE_report.h"
@@ -51,63 +51,100 @@
#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 */
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 */
-/* not used yet but may want to use the subtype below */
+/* subtype not used much yet */
#define MATHUTILS_CB_SUBTYPE_EUL 0
#define MATHUTILS_CB_SUBTYPE_VEC 1
#define MATHUTILS_CB_SUBTYPE_QUAT 2
+#define MATHUTILS_CB_SUBTYPE_COLOR 3
-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; i<len; i++) {
+ CLAMP(bmo->data[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;
}
@@ -124,31 +161,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 */
@@ -164,7 +205,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)
{
@@ -232,13 +273,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) {
@@ -248,11 +294,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;
}
@@ -275,6 +333,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;
@@ -346,25 +419,50 @@ static PyObject *pyrna_prop_richcmp(PyObject *a, PyObject *b, int op)
}
/*----------------------repr--------------------------------------------*/
-static PyObject *pyrna_struct_repr( BPy_StructRNA *self )
+static PyObject *pyrna_struct_str( BPy_StructRNA *self )
{
- PyObject *pyob;
+ PyObject *ret;
char *name;
/* print name if available */
name= RNA_struct_name_get_alloc(&self->ptr, NULL, FALSE);
if(name) {
- pyob= PyUnicode_FromFormat( "<bpy_struct, %.200s(\"%.200s\")>", RNA_struct_identifier(self->ptr.type), name);
+ ret= PyUnicode_FromFormat( "<bpy_struct, %.200s(\"%.200s\")>", RNA_struct_identifier(self->ptr.type), name);
MEM_freeN(name);
- return pyob;
+ return ret;
}
return PyUnicode_FromFormat( "<bpy_struct, %.200s at %p>", RNA_struct_identifier(self->ptr.type), self->ptr.data);
}
-static PyObject *pyrna_prop_repr( BPy_PropertyRNA *self )
+static PyObject *pyrna_struct_repr(BPy_StructRNA *self)
+{
+ ID *id= self->ptr.id.data;
+ if(id == NULL)
+ return pyrna_struct_str(self); /* fallback */
+
+ if(RNA_struct_is_ID(self->ptr.type)) {
+ return PyUnicode_FromFormat( "bpy.data.%s[\"%s\"]", BKE_idcode_to_name_plural(GS(id->name)), id->name+2);
+ }
+ else {
+ PyObject *ret;
+ char *path;
+ path= RNA_path_from_ID_to_struct(&self->ptr);
+ if(path) {
+ ret= PyUnicode_FromFormat( "bpy.data.%s[\"%s\"].%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, path);
+ MEM_freeN(path);
+ }
+ else { /* cant find, print something sane */
+ ret= PyUnicode_FromFormat( "bpy.data.%s[\"%s\"]...%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, RNA_struct_identifier(self->ptr.type));
+ }
+
+ return ret;
+ }
+}
+
+static PyObject *pyrna_prop_str( BPy_PropertyRNA *self )
{
- PyObject *pyob;
+ PyObject *ret;
PointerRNA ptr;
char *name;
const char *type_id= NULL;
@@ -398,18 +496,59 @@ static PyObject *pyrna_prop_repr( BPy_PropertyRNA *self )
name= RNA_struct_name_get_alloc(&ptr, NULL, FALSE);
if(name) {
- pyob= PyUnicode_FromFormat( "<bpy_%.200s, %.200s.%.200s(\"%.200s\")>", type_fmt, RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop), name);
+ ret= PyUnicode_FromFormat( "<bpy_%.200s, %.200s.%.200s(\"%.200s\")>", type_fmt, RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop), name);
MEM_freeN(name);
- return pyob;
+ return ret;
}
}
return PyUnicode_FromFormat( "<bpy_%.200s, %.200s.%.200s>", type_fmt, RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop));
}
+static PyObject *pyrna_prop_repr(BPy_PropertyRNA *self)
+{
+ ID *id= self->ptr.id.data;
+ PyObject *ret;
+ char *path;
+
+ if(id == NULL)
+ return pyrna_prop_str(self); /* fallback */
+
+ path= RNA_path_from_ID_to_property(&self->ptr, self->prop);
+ if(path) {
+ ret= PyUnicode_FromFormat( "bpy.data.%s[\"%s\"].%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, path);
+ MEM_freeN(path);
+ }
+ else { /* cant find, print something sane */
+ ret= PyUnicode_FromFormat( "bpy.data.%s[\"%s\"]...%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, RNA_property_identifier(self->prop));
+ }
+
+ return ret;
+}
+
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 */
@@ -833,11 +972,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 %.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);
}
@@ -876,6 +1016,8 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, v
}
case PROP_POINTER:
{
+ PyObject *value_new= NULL;
+
StructRNA *ptype= RNA_property_pointer_type(ptr, prop);
int flag = RNA_property_flag(prop);
@@ -885,15 +1027,29 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, v
return pyrna_pydict_to_props(&opptr, value, 0, error_prefix);
}
+ /* another exception, allow to pass a collection as an RNA property */
+ if(Py_TYPE(value)==&pyrna_prop_collection_Type) {
+ PointerRNA c_ptr;
+ BPy_PropertyRNA *value_prop= (BPy_PropertyRNA *)value;
+ if(RNA_property_collection_type_get(&value_prop->ptr, value_prop->prop, &c_ptr)) {
+ value= pyrna_struct_CreatePyObject(&c_ptr);
+ value_new= value;
+ }
+ else {
+ PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s collection has no type, cant be used as a %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(ptype));
+ return -1;
+ }
+ }
+
if(!BPy_StructRNA_Check(value) && value != Py_None) {
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;
+ Py_XDECREF(value_new); return -1;
} else if((flag & PROP_NEVER_NULL) && value == Py_None) {
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;
+ Py_XDECREF(value_new); 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 %.200s.%.200s ID type does not support assignment to its self", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop));
- return -1;
+ Py_XDECREF(value_new); return -1;
} else {
BPy_StructRNA *param= (BPy_StructRNA*)value;
int raise_error= FALSE;
@@ -929,7 +1085,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, v
PointerRNA tmp;
RNA_pointer_create(NULL, ptype, NULL, &tmp);
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;
+ Py_XDECREF(value_new); return -1;
}
}
@@ -937,9 +1093,10 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, v
PointerRNA tmp;
RNA_pointer_create(NULL, ptype, NULL, &tmp);
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;
+ Py_XDECREF(value_new); return -1;
}
}
+
break;
}
case PROP_COLLECTION:
@@ -1077,6 +1234,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;
}
@@ -1095,22 +1255,42 @@ static Py_ssize_t pyrna_prop_collection_length( BPy_PropertyRNA *self )
return RNA_property_collection_length(&self->ptr, self->prop);
}
+/* bool funcs are for speed, so we can avoid getting the length
+ * of 1000's of items in a linked list for eg. */
+static int pyrna_prop_array_bool(BPy_PropertyRNA *self)
+{
+ return RNA_property_array_length(&self->ptr, self->prop) ? 1 : 0;
+}
+
+static int pyrna_prop_collection_bool( BPy_PropertyRNA *self )
+{
+ /* no callback defined, just iterate and find the nth item */
+ CollectionPropertyIterator iter;
+ int test;
+
+ RNA_property_collection_begin(&self->ptr, self->prop, &iter);
+ test = iter.valid;
+ RNA_property_collection_end(&iter);
+ return test;
+}
+
/* internal use only */
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);
+ int len= RNA_property_collection_length(&self->ptr, self->prop);
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);
+ if(keynum >= 0 && keynum < len) {
+ if(RNA_property_collection_lookup_int(&self->ptr, self->prop, keynum, &newptr)) {
+ return pyrna_struct_CreatePyObject(&newptr);
+ }
+ else { /* fail's if ptr.data == NULL, valid for mesh.materials */
+ Py_RETURN_NONE;
+ }
+ }
+ PyErr_Format(PyExc_IndexError, "bpy_prop_collection[index]: index %d out of range, size %d", keynum, len);
return NULL;
}
@@ -1321,7 +1501,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;
}
@@ -1427,43 +1607,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 */
@@ -1479,6 +1666,31 @@ static PyMappingMethods pyrna_prop_collection_as_mapping = {
( objobjargproc ) NULL, /* mp_ass_subscript */
};
+/* only for fast bool's, large structs, assign nb_bool on init */
+static PyNumberMethods pyrna_prop_array_as_number = {
+ NULL, /* nb_add */
+ NULL, /* nb_subtract */
+ NULL, /* nb_multiply */
+ NULL, /* nb_remainder */
+ NULL, /* nb_divmod */
+ NULL, /* nb_power */
+ NULL, /* nb_negative */
+ NULL, /* nb_positive */
+ NULL, /* nb_absolute */
+ (inquiry) pyrna_prop_array_bool, /* nb_bool */
+};
+static PyNumberMethods pyrna_prop_collection_as_number = {
+ NULL, /* nb_add */
+ NULL, /* nb_subtract */
+ NULL, /* nb_multiply */
+ NULL, /* nb_remainder */
+ NULL, /* nb_divmod */
+ NULL, /* nb_power */
+ NULL, /* nb_negative */
+ NULL, /* nb_positive */
+ NULL, /* nb_absolute */
+ (inquiry) pyrna_prop_collection_bool, /* nb_bool */
+};
static int pyrna_prop_array_contains(BPy_PropertyRNA *self, PyObject *value)
{
@@ -1513,12 +1725,12 @@ static int pyrna_struct_contains(BPy_StructRNA *self, PyObject *value)
return -1;
}
- if(RNA_struct_idproperties_check(self->ptr.type)==0) {
+ if(RNA_struct_idprops_check(self->ptr.type)==0) {
PyErr_SetString( PyExc_TypeError, "bpy_struct: this type doesnt support IDProperties");
return -1;
}
- group= RNA_struct_idproperties(&self->ptr, 0);
+ group= RNA_struct_idprops(&self->ptr, 0);
if(!group)
return 0;
@@ -1535,6 +1747,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 = {
@@ -1546,6 +1760,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 = {
@@ -1557,6 +1773,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 )
@@ -1565,7 +1783,7 @@ static PyObject *pyrna_struct_subscript( BPy_StructRNA *self, PyObject *key )
IDProperty *group, *idprop;
char *name= _PyUnicode_AsString(key);
- if(RNA_struct_idproperties_check(self->ptr.type)==0) {
+ if(RNA_struct_idprops_check(self->ptr.type)==0) {
PyErr_SetString( PyExc_TypeError, "this type doesn't support IDProperties");
return NULL;
}
@@ -1575,7 +1793,7 @@ static PyObject *pyrna_struct_subscript( BPy_StructRNA *self, PyObject *key )
return NULL;
}
- group= RNA_struct_idproperties(&self->ptr, 0);
+ group= RNA_struct_idprops(&self->ptr, 0);
if(group==NULL) {
PyErr_Format( PyExc_KeyError, "bpy_struct[key]: key \"%s\" not found", name);
@@ -1594,7 +1812,7 @@ static PyObject *pyrna_struct_subscript( BPy_StructRNA *self, PyObject *key )
static int pyrna_struct_ass_subscript( BPy_StructRNA *self, PyObject *key, PyObject *value )
{
- IDProperty *group= RNA_struct_idproperties(&self->ptr, 1);
+ IDProperty *group= RNA_struct_idprops(&self->ptr, 1);
if(group==NULL) {
PyErr_SetString(PyExc_TypeError, "bpy_struct[key] = val: id properties not supported for this type");
@@ -1610,16 +1828,26 @@ 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;
- if(RNA_struct_idproperties_check(self->ptr.type)==0) {
+ if(RNA_struct_idprops_check(self->ptr.type)==0) {
PyErr_SetString( PyExc_TypeError, "bpy_struct.keys(): this type doesn't support IDProperties");
return NULL;
}
- group= RNA_struct_idproperties(&self->ptr, 0);
+ group= RNA_struct_idprops(&self->ptr, 0);
if(group==NULL)
return PyList_New(0);
@@ -1627,16 +1855,26 @@ 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;
- if(RNA_struct_idproperties_check(self->ptr.type)==0) {
+ if(RNA_struct_idprops_check(self->ptr.type)==0) {
PyErr_SetString( PyExc_TypeError, "bpy_struct.items(): this type doesn't support IDProperties");
return NULL;
}
- group= RNA_struct_idproperties(&self->ptr, 0);
+ group= RNA_struct_idprops(&self->ptr, 0);
if(group==NULL)
return PyList_New(0);
@@ -1644,17 +1882,26 @@ 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)
{
IDProperty *group;
- if(RNA_struct_idproperties_check(self->ptr.type)==0) {
+ if(RNA_struct_idprops_check(self->ptr.type)==0) {
PyErr_SetString( PyExc_TypeError, "bpy_struct.values(): this type doesn't support IDProperties");
return NULL;
}
- group= RNA_struct_idproperties(&self->ptr, 0);
+ group= RNA_struct_idprops(&self->ptr, 0);
if(group==NULL)
return PyList_New(0);
@@ -1662,36 +1909,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;
- int array_len;
-
- 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) {
@@ -1699,85 +1956,120 @@ int pyrna_struct_keyframe_parse(PointerRNA *ptr, PyObject *args, char *error_pre
return -1;
}
- 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 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);
- 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);
+ if(pyrna_struct_anim_args_parse(&self->ptr, "bpy_struct.driver_add():", path, &path_full, &index) < 0)
return NULL;
- }
if(ANIM_add_driver((ID *)self->ptr.id.data, path_full, index, 0, DRIVER_TYPE_PYTHON)) {
ID *id= self->ptr.id.data;
@@ -1804,8 +2096,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);
@@ -1813,62 +2105,161 @@ 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)
{
+ PropertyRNA *prop;
char *name;
+ int ret;
if (!PyArg_ParseTuple(args, "s:is_property_set", &name))
return NULL;
- return PyBool_FromLong(RNA_property_is_set(&self->ptr, name));
+ if((prop= RNA_struct_find_property(&self->ptr, name)) == NULL) {
+ PyErr_Format(PyExc_TypeError, "%.200s.is_property_set(\"%.200s\") not found", RNA_struct_identifier(self->ptr.type), name);
+ return NULL;
+ }
+
+ /* double property lookup, could speed up */
+ /* return PyBool_FromLong(RNA_property_is_set(&self->ptr, name)); */
+ if(RNA_property_flag(prop) & PROP_IDPROPERTY) {
+ IDProperty *group= RNA_struct_idprops(&self->ptr, 0);
+ if(group) {
+ ret= IDP_GetPropertyFromGroup(group, name) ? 1:0;
+ }
+ else {
+ ret= 0;
+ }
+ }
+ else {
+ ret= 1;
+ }
+
+ return PyBool_FromLong(ret);
}
+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;
char *name;
- int hidden;
if (!PyArg_ParseTuple(args, "s:is_property_hidden", &name))
return NULL;
-
- prop= RNA_struct_find_property(&self->ptr, name);
- hidden= (prop)? (RNA_property_flag(prop) & PROP_HIDDEN): 1;
- return PyBool_FromLong(hidden);
+ if((prop= RNA_struct_find_property(&self->ptr, name)) == NULL) {
+ PyErr_Format(PyExc_TypeError, "%.200s.is_property_hidden(\"%.200s\") not found", RNA_struct_identifier(self->ptr.type), name);
+ return NULL;
+ }
+
+ return PyBool_FromLong(RNA_property_flag(prop) & PROP_HIDDEN);
}
-static PyObject *pyrna_struct_path_resolve(BPy_StructRNA *self, PyObject *value)
+static char pyrna_struct_path_resolve_doc[] =
+".. method:: path_resolve(path, coerce=True)\n"
+"\n"
+" Returns the property from the path, raise an exception when not found.\n"
+"\n"
+" :arg path: path which this property resolves.\n"
+" :type path: string\n"
+" :arg coerce: optional argument, when True, the property will be converted into its python representation.\n"
+" :type coerce: boolean\n";
+
+static PyObject *pyrna_struct_path_resolve(BPy_StructRNA *self, PyObject *args)
{
- char *path= _PyUnicode_AsString(value);
+ char *path;
+ PyObject *coerce= Py_True;
PointerRNA r_ptr;
PropertyRNA *r_prop;
- if(path==NULL) {
- PyErr_SetString( PyExc_TypeError, "bpy_struct.items(): is only valid for collection types" );
+ if (!PyArg_ParseTuple(args, "s|O!:path_resolve", &path, &PyBool_Type, &coerce))
return NULL;
- }
- if (RNA_path_resolve(&self->ptr, path, &r_ptr, &r_prop))
- return pyrna_prop_CreatePyObject(&r_ptr, r_prop);
-
- Py_RETURN_NONE;
+ if (RNA_path_resolve(&self->ptr, path, &r_ptr, &r_prop)) {
+ if(coerce == Py_False) {
+ return pyrna_prop_CreatePyObject(&r_ptr, r_prop);
+ }
+ else {
+ return pyrna_prop_to_py(&r_ptr, r_prop);
+ }
+ }
+ else {
+ PyErr_Format(PyExc_TypeError, "%.200s.path_resolve(\"%.200s\") could not be resolved", RNA_struct_identifier(self->ptr.type), path);
+ return NULL;
+ }
}
-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;
}
@@ -1879,8 +2270,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", RNA_struct_identifier(self->ptr.type));
+ 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;
}
@@ -1890,14 +2281,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;
@@ -1906,7 +2298,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;
}
@@ -1916,6 +2308,21 @@ static PyObject *pyrna_prop_path_to_id(BPy_PropertyRNA *self)
return ret;
}
+static char pyrna_struct_type_recast_doc[] =
+".. method:: type_recast()\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_type_recast(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;
@@ -2026,7 +2433,7 @@ static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname )
if(name[0]=='_') { // rna can't start with a "_", so for __dict__ and similar we can skip using rna lookups
/* annoying exception, maybe we need to have different types for this... */
- if((strcmp(name, "__getitem__")==0 || strcmp(name, "__setitem__")==0) && !RNA_struct_idproperties_check(self->ptr.type)) {
+ if((strcmp(name, "__getitem__")==0 || strcmp(name, "__setitem__")==0) && !RNA_struct_idprops_check(self->ptr.type)) {
PyErr_SetString(PyExc_AttributeError, "bpy_struct: no __getitem__ support for this type");
ret = NULL;
}
@@ -2036,7 +2443,7 @@ 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);
- }
+ }
/* 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);
@@ -2050,28 +2457,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 */
@@ -2119,17 +2537,49 @@ 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) {
+ if(value == NULL) {
+ PyErr_SetString(PyExc_AttributeError, "bpy_struct: del not supported");
+ return -1;
+ }
+ 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)
@@ -2194,6 +2644,11 @@ static int pyrna_prop_collection_setattro( BPy_PropertyRNA *self, PyObject *pyna
PropertyRNA *prop;
PointerRNA r_ptr;
+ if(value == NULL) {
+ PyErr_SetString(PyExc_AttributeError, "bpy_prop: del not supported");
+ return -1;
+ }
+
if(RNA_property_collection_type_get(&self->ptr, self->prop, &r_ptr)) {
if ((prop = RNA_struct_find_property(&r_ptr, name))) {
/* pyrna_py_to_prop sets its own exceptions */
@@ -2262,8 +2717,9 @@ static PyObject *pyrna_prop_move(BPy_PropertyRNA *self, PyObject *args)
return ret;
}
-static PyObject *pyrna_struct_get_id_data(BPy_StructRNA *self)
+static PyObject *pyrna_struct_get_id_data(BPy_DummyPointerRNA *self)
{
+ /* used for struct and pointer since both have a ptr */
if(self->ptr.id.data) {
PointerRNA id_ptr;
RNA_id_pointer_create((ID *)self->ptr.id.data, &id_ptr);
@@ -2276,15 +2732,15 @@ static PyObject *pyrna_struct_get_id_data(BPy_StructRNA *self)
/*****************************************************************************/
/* Python attributes get/set structure: */
/*****************************************************************************/
-#if 0
+
static PyGetSetDef pyrna_prop_getseters[] = {
- {"active", (getter)pyrna_prop_get_active, (setter)pyrna_prop_set_active, "", 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 */
};
-#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 */
};
@@ -2361,6 +2817,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;
@@ -2372,12 +2840,12 @@ static PyObject *pyrna_struct_get(BPy_StructRNA *self, PyObject *args)
return NULL;
/* mostly copied from BPy_IDGroup_Map_GetItem */
- if(RNA_struct_idproperties_check(self->ptr.type)==0) {
+ if(RNA_struct_idprops_check(self->ptr.type)==0) {
PyErr_SetString( PyExc_TypeError, "this type doesn't support IDProperties");
return NULL;
}
- group= RNA_struct_idproperties(&self->ptr, 0);
+ group= RNA_struct_idprops(&self->ptr, 0);
if(group) {
idprop= IDP_GetPropertyFromGroup(group, key);
@@ -2389,6 +2857,16 @@ 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)
@@ -2705,41 +3183,53 @@ 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},
-
- {"get", (PyCFunction)pyrna_struct_get, METH_VARARGS, NULL},
-
- {"as_pointer", (PyCFunction)pyrna_struct_as_pointer, METH_NOARGS, NULL},
-
- /* 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},
+ {"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, pyrna_struct_get_doc},
+
+ {"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_VARARGS, pyrna_struct_path_resolve_doc},
+ {"path_from_id", (PyCFunction)pyrna_struct_path_from_id, METH_VARARGS, pyrna_struct_path_from_id_doc},
+ {"type_recast", (PyCFunction)pyrna_struct_type_recast, METH_NOARGS, pyrna_struct_type_recast_doc},
{"__dir__", (PyCFunction)pyrna_struct_dir, METH_NOARGS, NULL},
/* experemental */
{"callback_add", (PyCFunction)pyrna_callback_add, METH_VARARGS, NULL},
{"callback_remove", (PyCFunction)pyrna_callback_remove, METH_VARARGS, NULL},
+ /* class methods, only valid for subclasses */
+ {"BoolProperty", (PyCFunction)BPy_BoolProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_BoolProperty_doc},
+ {"BoolVectorProperty", (PyCFunction)BPy_BoolVectorProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_BoolVectorProperty_doc},
+ {"IntProperty", (PyCFunction)BPy_IntProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_IntProperty_doc},
+ {"IntVectorProperty", (PyCFunction)BPy_IntVectorProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_IntVectorProperty_doc},
+ {"FloatProperty", (PyCFunction)BPy_FloatProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_FloatProperty_doc},
+ {"FloatVectorProperty", (PyCFunction)BPy_FloatVectorProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_FloatVectorProperty_doc},
+ {"StringProperty", (PyCFunction)BPy_StringProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_StringProperty_doc},
+ {"EnumProperty", (PyCFunction)BPy_EnumProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_EnumProperty_doc},
+ {"PointerProperty", (PyCFunction)BPy_PointerProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_PointerProperty_doc},
+ {"CollectionProperty", (PyCFunction)BPy_CollectionProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_CollectionProperty_doc},
+
+ {"RemoveProperty", (PyCFunction)BPy_RemoveProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_RemoveProperty_doc},
+
{NULL, NULL, 0, NULL}
};
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}
};
static struct PyMethodDef pyrna_prop_array_methods[] = {
- {"foreach_get", (PyCFunction)pyrna_prop_foreach_get, METH_VARARGS, NULL},
- {"foreach_set", (PyCFunction)pyrna_prop_foreach_set, METH_VARARGS, NULL},
{NULL, NULL, 0, NULL}
};
@@ -2764,37 +3254,47 @@ static struct PyMethodDef pyrna_prop_collection_methods[] = {
* todo - also accept useful args */
static PyObject * pyrna_struct_new(PyTypeObject *type, PyObject *args, PyObject *kwds) {
- BPy_StructRNA *base = NULL;
+ BPy_StructRNA *base;
if (!PyArg_ParseTuple(args, "O!:bpy_struct.__new__", &pyrna_struct_Type, &base))
return NULL;
-
- if (type == &pyrna_struct_Type) {
- return pyrna_struct_CreatePyObject(&base->ptr);
- } else {
+
+ if (type == Py_TYPE(base)) {
+ Py_INCREF(base);
+ return (PyObject *)base;
+ } else if (PyType_IsSubtype(type, &pyrna_struct_Type)) {
BPy_StructRNA *ret = (BPy_StructRNA *) type->tp_alloc(type, 0);
ret->ptr = base->ptr;
return (PyObject *)ret;
}
+ else {
+ PyErr_Format(PyExc_TypeError, "bpy_struct.__new__(type): type '%.200s' is not a subtype of bpy_struct.", type->tp_name);
+ return NULL;
+ }
}
/* only needed for subtyping, so a new class gets a valid BPy_StructRNA
* todo - also accept useful args */
static PyObject * pyrna_prop_new(PyTypeObject *type, PyObject *args, PyObject *kwds) {
- BPy_PropertyRNA *base = NULL;
+ BPy_PropertyRNA *base;
- if (!PyArg_ParseTuple(args, "O!:Base BPy_PropertyRNA", &pyrna_prop_Type, &base))
+ if (!PyArg_ParseTuple(args, "O!:bpy_prop.__new__", &pyrna_prop_Type, &base))
return NULL;
- if (ELEM3(type, &pyrna_prop_Type, &pyrna_prop_array_Type, &pyrna_prop_collection_Type)) {
- return pyrna_prop_CreatePyObject(&base->ptr, base->prop);
- } else {
+ if (type == Py_TYPE(base)) {
+ Py_INCREF(base);
+ return (PyObject *)base;
+ } else if (PyType_IsSubtype(type, &pyrna_prop_Type)) {
BPy_PropertyRNA *ret = (BPy_PropertyRNA *) type->tp_alloc(type, 0);
ret->ptr = base->ptr;
ret->prop = base->prop;
return (PyObject *)ret;
}
+ else {
+ PyErr_Format(PyExc_TypeError, "bpy_prop.__new__(type): type '%.200s' is not a subtype of bpy_prop.", type->tp_name);
+ return NULL;
+ }
}
PyObject *pyrna_param_to_py(PointerRNA *ptr, ParameterList *parms, PropertyRNA *prop, void *data)
@@ -3198,7 +3698,7 @@ PyTypeObject pyrna_struct_Type = {
( hashfunc )pyrna_struct_hash, /* hashfunc tp_hash; */
NULL, /* ternaryfunc tp_call; */
- NULL, /* reprfunc tp_str; */
+ (reprfunc) pyrna_struct_str, /* reprfunc tp_str; */
( getattrofunc ) pyrna_struct_getattro, /* getattrofunc tp_getattro; */
( setattrofunc ) pyrna_struct_setattro, /* setattrofunc tp_setattro; */
@@ -3261,11 +3761,11 @@ 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! */
- ( reprfunc ) pyrna_prop_repr, /* tp_repr */
+ (reprfunc) pyrna_prop_repr, /* tp_repr */
/* Method suites for standard classes */
@@ -3275,9 +3775,9 @@ 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; */
+ (reprfunc) pyrna_prop_str, /* reprfunc tp_str; */
/* will only use these if this is a subtype of a py class */
NULL, /* getattrofunc tp_getattro; */
@@ -3312,7 +3812,7 @@ PyTypeObject pyrna_prop_Type = {
/*** Attribute descriptor and subclassing stuff ***/
pyrna_prop_methods, /* struct PyMethodDef *tp_methods; */
NULL, /* struct PyMemberDef *tp_members; */
- NULL /*pyrna_prop_getseters*/, /* struct PyGetSetDef *tp_getset; */
+ pyrna_prop_getseters, /* struct PyGetSetDef *tp_getset; */
NULL, /* struct _typeobject *tp_base; */
NULL, /* PyObject *tp_dict; */
NULL, /* descrgetfunc tp_descr_get; */
@@ -3349,7 +3849,7 @@ PyTypeObject pyrna_prop_array_Type = {
/* Method suites for standard classes */
- NULL, /* PyNumberMethods *tp_as_number; */
+ &pyrna_prop_array_as_number, /* PyNumberMethods *tp_as_number; */
&pyrna_prop_array_as_sequence, /* PySequenceMethods *tp_as_sequence; */
&pyrna_prop_array_as_mapping, /* PyMappingMethods *tp_as_mapping; */
@@ -3429,7 +3929,7 @@ PyTypeObject pyrna_prop_collection_Type = {
/* Method suites for standard classes */
- NULL, /* PyNumberMethods *tp_as_number; */
+ &pyrna_prop_collection_as_number, /* PyNumberMethods *tp_as_number; */
&pyrna_prop_collection_as_sequence, /* PySequenceMethods *tp_as_sequence; */
&pyrna_prop_collection_as_mapping, /* PyMappingMethods *tp_as_mapping; */
@@ -3494,26 +3994,11 @@ PyTypeObject pyrna_prop_collection_Type = {
NULL
};
-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, ""},
-
-// {"__get_rna", (PyCFunction)BPy_GetStructRNA, METH_NOARGS, ""},
- {NULL, NULL, 0, NULL}
-};
-
static void pyrna_subtype_set_rna(PyObject *newclass, StructRNA *srna)
{
PointerRNA ptr;
PyObject *item;
+ PyObject *newclass_dict= ((PyTypeObject *)newclass)->tp_dict;
Py_INCREF(newclass);
@@ -3532,20 +4017,9 @@ static void pyrna_subtype_set_rna(PyObject *newclass, StructRNA *srna)
item = pyrna_struct_CreatePyObject(&ptr);
//item = PyCapsule_New(srna, NULL, NULL);
- PyDict_SetItemString(((PyTypeObject *)newclass)->tp_dict, "bl_rna", item);
+ PyDict_SetItemString(newclass_dict, "bl_rna", item);
Py_DECREF(item);
/* done with rna instance */
-
- /* attach functions into the class
- * so you can do... bpy.types.Scene.SomeFunction()
- */
- {
- PyMethodDef *ml;
-
- for(ml= pyrna_struct_subtype_methods; ml->ml_name; ml++){
- PyObject_SetAttrString(newclass, ml->ml_name, PyCFunction_New(ml, newclass));
- }
- }
}
static PyObject* pyrna_srna_Subtype(StructRNA *srna);
@@ -3632,30 +4106,37 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna)
{
PyObject *newclass = NULL;
+ /* stupid/simple case */
if (srna == NULL) {
newclass= NULL; /* Nothing to do */
- } else if ((newclass= RNA_struct_py_type_get(srna))) {
+ } /* the class may have alredy been declared & allocated */
+ else if ((newclass= RNA_struct_py_type_get(srna))) {
Py_INCREF(newclass);
- } else if ((newclass= pyrna_srna_ExternalType(srna))) {
+ } /* check if bpy_types.py module has the class defined in it */
+ else if ((newclass= pyrna_srna_ExternalType(srna))) {
pyrna_subtype_set_rna(newclass, srna);
Py_INCREF(newclass);
- } else {
+ } /* create a new class instance with the C api
+ * maintly for the purposing of matching the C/rna type hierarchy */
+ else {
/* subclass equivelents
- class myClass(myBase):
some='value' # or ...
- myClass = type(name='myClass', bases=(myBase,), dict={'__module__':'bpy.types'})
*/
- /* Assume RNA_struct_py_type_get(srna) was alredy checked */
+ /* Assume RNA_struct_py_type_get(srna) was already checked */
PyObject *py_base= pyrna_srna_PyBase(srna);
const char *idname= RNA_struct_identifier(srna);
- const char *descr= RNA_struct_ui_description(srna);
-
- if(!descr) descr= "(no docs)";
+
+ /* remove __doc__ for now */
+ // const char *descr= RNA_struct_ui_description(srna);
+ // if(!descr) descr= "(no docs)";
+ // "__doc__",descr
/* always use O not N when calling, N causes refcount errors */
- newclass = PyObject_CallFunction( (PyObject*)&PyType_Type, "s(O){sssss()}", idname, py_base, "__module__","bpy.types", "__doc__",descr, "__slots__");
+ newclass = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){sss()}", idname, py_base, "__module__","bpy.types", "__slots__");
/* newclass will now have 2 ref's, ???, probably 1 is internal since decrefing here segfaults */
/* PyObSpit("new class ref", newclass); */
@@ -3664,7 +4145,8 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna)
/* srna owns one, and the other is owned by the caller */
pyrna_subtype_set_rna(newclass, srna);
- Py_DECREF(newclass); /* let srna own */
+ // XXX, adding this back segfaults blender on load.
+ // Py_DECREF(newclass); /* let srna own */
}
else {
/* this should not happen */
@@ -3697,7 +4179,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;
}
@@ -3838,6 +4321,9 @@ static PyObject *pyrna_basetype_getattro( BPy_BaseTypeRNA *self, PyObject *pynam
}
static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self);
+static PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class);
+static PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class);
+
static struct PyMethodDef pyrna_basetype_methods[] = {
{"__dir__", (PyCFunction)pyrna_basetype_dir, METH_NOARGS, ""},
{"register", (PyCFunction)pyrna_basetype_register, METH_O, ""},
@@ -3907,18 +4393,18 @@ StructRNA *pyrna_struct_as_srna(PyObject *self, int parent, const char *error_pr
}
if(py_srna==NULL) {
- 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);
+ PyErr_Format(PyExc_SystemError, "%.200s, missing bl_rna attribute from '%.200s' instance (may not be registered)", error_prefix, Py_TYPE(self)->tp_name);
return NULL;
}
if(!BPy_StructRNA_Check(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);
+ PyErr_Format(PyExc_SystemError, "%.200s, bl_rna attribute wrong type '%.200s' on '%.200s'' instance", error_prefix, Py_TYPE(py_srna)->tp_name, Py_TYPE(self)->tp_name);
Py_DECREF(py_srna);
return NULL;
}
if(py_srna->ptr.type != &RNA_Struct) {
- PyErr_Format(PyExc_SystemError, "%.200s internal error, bl_rna was not a RNA_Struct type of rna struct", error_prefix);
+ PyErr_Format(PyExc_SystemError, "%.200s, bl_rna attribute not a RNA_Struct, on '%.200s'' instance", error_prefix, Py_TYPE(self)->tp_name);
Py_DECREF(py_srna);
return NULL;
}
@@ -3966,7 +4452,6 @@ static int deferred_register_prop(StructRNA *srna, PyObject *item, PyObject *key
if(*_PyUnicode_AsString(key)=='_') {
PyErr_Format(PyExc_ValueError, "bpy_struct \"%.200s\" registration error: %.200s could not register because the property starts with an '_'\n", RNA_struct_identifier(srna), _PyUnicode_AsString(key));
- Py_DECREF(dummy_args);
return -1;
}
pyfunc = PyCapsule_GetPointer(py_func_ptr, NULL);
@@ -3987,8 +4472,6 @@ static int deferred_register_prop(StructRNA *srna, PyObject *item, PyObject *key
// PyLineSpit();
PyErr_Format(PyExc_ValueError, "bpy_struct \"%.200s\" registration error: %.200s could not register\n", RNA_struct_identifier(srna), _PyUnicode_AsString(key));
-
- Py_DECREF(dummy_args);
return -1;
}
}
@@ -4005,7 +4488,7 @@ static int deferred_register_prop(StructRNA *srna, PyObject *item, PyObject *key
return 0;
}
-int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict)
+static int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict)
{
PyObject *item, *key;
PyObject *order;
@@ -4015,12 +4498,10 @@ int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict)
dummy_args = PyTuple_New(0);
- order= PyDict_GetItemString(class_dict, "order");
-
- if(order==NULL)
- PyErr_Clear();
-
- if(order && PyList_Check(order)) {
+ if( !PyDict_CheckExact(class_dict) &&
+ (order= PyDict_GetItemString(class_dict, "order")) &&
+ PyList_CheckExact(order)
+ ) {
for(pos= 0; pos<PyList_GET_SIZE(order); pos++) {
key= PyList_GET_ITEM(order, pos);
item= PyDict_GetItem(class_dict, key);
@@ -4043,6 +4524,49 @@ int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict)
return 0;
}
+static int pyrna_deferred_register_class_recursive(StructRNA *srna, PyTypeObject *py_class)
+{
+ const int len= PyTuple_GET_SIZE(py_class->tp_bases);
+ int i, ret;
+
+ /* first scan base classes for registerable properties */
+ for(i=0; i<len; i++) {
+ PyTypeObject *py_superclass= (PyTypeObject *)PyTuple_GET_ITEM(py_class->tp_bases, i);
+
+ /* the rules for using these base classes are not clear,
+ * 'object' is ofcourse not worth looking into and
+ * existing subclasses of RNA would cause a lot more dictionary
+ * looping then is needed (SomeOperator would scan Operator.__dict__)
+ * which is harmless but not at all useful.
+ *
+ * So only scan base classes which are not subclasses if blender types.
+ * This best fits having 'mix-in' classes for operators and render engines.
+ * */
+ if( py_superclass != &PyBaseObject_Type &&
+ !PyObject_IsSubclass((PyObject *)py_superclass, (PyObject *)&pyrna_struct_Type)
+ ) {
+ ret= pyrna_deferred_register_class_recursive(srna, py_superclass);
+
+ if(ret != 0) {
+ return ret;
+ }
+ }
+ }
+
+ /* not register out own properties */
+ return pyrna_deferred_register_props(srna, py_class->tp_dict); /* getattr(..., "__dict__") returns a proxy */
+}
+
+int pyrna_deferred_register_class(StructRNA *srna, PyObject *py_class)
+{
+ /* Panels and Menus dont need this
+ * save some time and skip the checks here */
+ if(!RNA_struct_idprops_register_check(srna))
+ return 0;
+
+ return pyrna_deferred_register_class_recursive(srna, (PyTypeObject *)py_class);
+}
+
/*-------------------- Type Registration ------------------------*/
static int rna_function_arg_count(FunctionRNA *func)
@@ -4050,7 +4574,7 @@ static int rna_function_arg_count(FunctionRNA *func)
const ListBase *lb= RNA_function_defined_parameters(func);
PropertyRNA *parm;
Link *link;
- int count= 1;
+ int count= (RNA_function_flag(func) & FUNC_NO_SELF) ? 0 : 1;
for(link=lb->first; link; link=link->next) {
parm= (PropertyRNA*)link;
@@ -4071,7 +4595,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
const char *class_type= RNA_struct_identifier(srna);
PyObject *py_class= (PyObject*)py_data;
PyObject *base_class= RNA_struct_py_type_get(srna);
- PyObject *item, *fitem;
+ PyObject *item;
PyObject *py_arg_count;
int i, flag, arg_count, func_arg_count;
const char *py_class_name = ((PyTypeObject *)py_class)->tp_name; // __name__
@@ -4108,25 +4632,33 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
PyErr_Clear();
}
else {
- Py_DECREF(item); /* no need to keep a ref, the class owns it */
-
- if (PyMethod_Check(item))
- fitem= PyMethod_Function(item); /* py 2.x */
- else
- fitem= item; /* py 3.x */
-
- if (PyFunction_Check(fitem)==0) {
- PyErr_Format( PyExc_TypeError, "expected %.200s, %.200s class \"%.200s\" attribute to be a function", class_type, py_class_name, RNA_function_identifier(func));
- return -1;
+ Py_DECREF(item); /* no need to keep a ref, the class owns it (technically we should keep a ref but...) */
+ if(flag & FUNC_NO_SELF) {
+ if (PyMethod_Check(item)==0) {
+ PyErr_Format( PyExc_TypeError, "expected %.200s, %.200s class \"%.200s\" attribute to be a method, not a %.200s", class_type, py_class_name, RNA_function_identifier(func), Py_TYPE(item)->tp_name);
+ return -1;
+ }
+ item= ((PyMethodObject *)item)->im_func;
+ }
+ else {
+ if (PyFunction_Check(item)==0) {
+ PyErr_Format( PyExc_TypeError, "expected %.200s, %.200s class \"%.200s\" attribute to be a function, not a %.200s", class_type, py_class_name, RNA_function_identifier(func), Py_TYPE(item)->tp_name);
+ return -1;
+ }
}
func_arg_count= rna_function_arg_count(func);
if (func_arg_count >= 0) { /* -1 if we dont care*/
- py_arg_count = PyObject_GetAttrString(PyFunction_GET_CODE(fitem), "co_argcount");
+ py_arg_count = PyObject_GetAttrString(PyFunction_GET_CODE(item), "co_argcount");
arg_count = PyLong_AsSsize_t(py_arg_count);
Py_DECREF(py_arg_count);
+ /* note, the number of args we check for and the number of args we give to
+ * @classmethods are different (quirk of python), this is why rna_function_arg_count() doesn't return the value -1*/
+ if(flag & FUNC_NO_SELF)
+ func_arg_count++;
+
if (arg_count != func_arg_count) {
PyErr_Format( PyExc_AttributeError, "expected %.200s, %.200s class \"%.200s\" function to have %d args, found %d", class_type, py_class_name, RNA_function_identifier(func), func_arg_count, arg_count);
return -1;
@@ -4199,6 +4731,7 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
ParameterIterator iter;
PointerRNA funcptr;
int err= 0, i, flag, ret_len=0;
+ int is_static = RNA_function_flag(func) & FUNC_NO_SELF;
PropertyRNA *pret_single= NULL;
void *retdata_single= NULL;
@@ -4206,52 +4739,64 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
PyGILState_STATE gilstate;
bContext *C= BPy_GetContext(); // XXX - NEEDS FIXING, QUITE BAD.
- bpy_context_set(C, &gilstate);
-
+
py_class= RNA_struct_py_type_get(ptr->type);
- /* exception, operators store their PyObjects for re-use */
- if(ptr->data) {
- if(RNA_struct_is_a(ptr->type, &RNA_Operator)) {
- wmOperator *op= ptr->data;
- if(op->py_instance) {
- py_class_instance= op->py_instance;
- Py_INCREF(py_class_instance);
- }
- else {
- /* store the instance here once its created */
- py_class_instance_store= &op->py_instance;
- }
- }
+ /* rare case. can happen when registering subclasses */
+ if(py_class==NULL) {
+ fprintf(stderr, "bpy_class_call(): unable to get python class for rna struct '%.200s'\n", RNA_struct_identifier(ptr->type));
+ return -1;
}
- /* end exception */
-
- if(py_class_instance==NULL)
- py_srna= pyrna_struct_CreatePyObject(ptr);
- if(py_class_instance) {
- /* special case, instance is cached */
- }
- else if(py_srna == NULL) {
- py_class_instance = NULL;
- }
- else if(py_srna == Py_None) { /* probably wont ever happen but possible */
- Py_DECREF(py_srna);
- py_class_instance = NULL;
- }
- else {
- args = PyTuple_New(1);
- PyTuple_SET_ITEM(args, 0, py_srna);
- py_class_instance = PyObject_Call(py_class, args, NULL);
- Py_DECREF(args);
+ bpy_context_set(C, &gilstate);
- if(py_class_instance_store) {
- *py_class_instance_store = py_class_instance;
- Py_INCREF(py_class_instance);
+ if (!is_static) {
+ /* exception, operators store their PyObjects for re-use */
+ if(ptr->data) {
+ if(RNA_struct_is_a(ptr->type, &RNA_Operator)) {
+ wmOperator *op= ptr->data;
+ if(op->py_instance) {
+ py_class_instance= op->py_instance;
+ Py_INCREF(py_class_instance);
+ }
+ else {
+ /* store the instance here once its created */
+ py_class_instance_store= &op->py_instance;
+ }
+ }
+ }
+ /* end exception */
+
+ if(py_class_instance==NULL)
+ py_srna= pyrna_struct_CreatePyObject(ptr);
+
+ if(py_class_instance) {
+ /* special case, instance is cached */
+ }
+ else if(py_srna == NULL) {
+ py_class_instance = NULL;
+ }
+ else if(py_srna == Py_None) { /* probably wont ever happen but possible */
+ Py_DECREF(py_srna);
+ py_class_instance = NULL;
+ }
+ else {
+ args = PyTuple_New(1);
+ PyTuple_SET_ITEM(args, 0, py_srna);
+ py_class_instance= PyObject_Call(py_class, args, NULL);
+ Py_DECREF(args);
+
+ if(py_class_instance == NULL) {
+ err= -1; /* so the error is not overridden below */
+ }
+ else if(py_class_instance_store) {
+ *py_class_instance_store = py_class_instance;
+ Py_INCREF(py_class_instance);
+ }
}
}
- if (py_class_instance) { /* Initializing the class worked, now run its invoke function */
+ if (is_static || py_class_instance) { /* Initializing the class worked, now run its invoke function */
PyObject *item= PyObject_GetAttrString(py_class, RNA_function_identifier(func));
// flag= RNA_function_flag(func);
@@ -4259,12 +4804,19 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
RNA_pointer_create(NULL, &RNA_Function, func, &funcptr);
args = PyTuple_New(rna_function_arg_count(func)); /* first arg is included in 'item' */
- PyTuple_SET_ITEM(args, 0, py_class_instance);
+
+ if(is_static) {
+ i= 0;
+ }
+ else {
+ PyTuple_SET_ITEM(args, 0, py_class_instance);
+ i= 1;
+ }
RNA_parameter_list_begin(parms, &iter);
/* parse function parameters */
- for (i= 1; iter.valid; RNA_parameter_list_next(&iter)) {
+ for (; iter.valid; RNA_parameter_list_next(&iter)) {
parm= iter.parm;
flag= RNA_property_flag(parm);
@@ -4298,8 +4850,11 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
}
}
else {
- PyErr_Format(PyExc_RuntimeError, "could not create instance of %.200s to call callback function %.200s.", RNA_struct_identifier(ptr->type), RNA_function_identifier(func));
- err= -1;
+ /* the error may be alredy set if the class instance couldnt be created */
+ if(err != -1) {
+ PyErr_Format(PyExc_RuntimeError, "could not create instance of %.200s to call callback function %.200s.", RNA_struct_identifier(ptr->type), RNA_function_identifier(func));
+ err= -1;
+ }
}
if (ret == NULL) { /* covers py_class_instance failing too */
@@ -4392,7 +4947,16 @@ void pyrna_alloc_types(void)
prop = RNA_struct_find_property(&ptr, "structs");
RNA_PROP_BEGIN(&ptr, itemptr, prop) {
- Py_DECREF(pyrna_struct_Subtype(&itemptr));
+ PyObject *item= pyrna_struct_Subtype(&itemptr);
+ if(item == NULL) {
+ if(PyErr_Occurred()) {
+ PyErr_Print();
+ PyErr_Clear();
+ }
+ }
+ else {
+ Py_DECREF(item);
+ }
}
RNA_PROP_END;
@@ -4435,15 +4999,14 @@ void pyrna_free_types(void)
* - Should still be fixed - Campbell
* */
-PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class)
+static PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class)
{
bContext *C= NULL;
ReportList reports;
StructRegisterFunc reg;
StructRNA *srna;
StructRNA *srna_new;
- PyObject *item;
- const char *identifier= "";
+ 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.");
@@ -4455,11 +5018,19 @@ PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class)
if(srna==NULL)
return NULL;
+ /* fails in cases, cant use this check but would like to :| */
+ /*
+ if(RNA_struct_py_type_get(srna)) {
+ PyErr_Format(PyExc_ValueError, "bpy.types.register(...): %.200s's parent class %.200s is alredy registered, this is not allowed.", ((PyTypeObject*)py_class)->tp_name, RNA_struct_identifier(srna));
+ return NULL;
+ }
+ */
+
/* check that we have a register callback for this type */
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_Format(PyExc_ValueError, "bpy.types.register(...): expected a subclass of a registerable rna type (%.200s does not support registration).", RNA_struct_identifier(srna));
return NULL;
}
@@ -4469,12 +5040,7 @@ PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class)
/* call the register callback with reports & identifier */
BKE_reports_init(&reports, RPT_STORE);
- item= PyObject_GetAttrString(py_class, "__name__");
-
- if(item) {
- identifier= _PyUnicode_AsString(item);
- Py_DECREF(item); /* no need to keep a ref, the class owns it */
- }
+ identifier= ((PyTypeObject*)py_class)->tp_name;
srna_new= reg(C, &reports, py_class, identifier, bpy_class_validate, bpy_class_call, bpy_class_free);
@@ -4498,27 +5064,47 @@ PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class)
*
* item= PyObject_GetAttrString(py_class, "__dict__");
*/
- item= ((PyTypeObject*)py_class)->tp_dict;
- if(item) {
- if(pyrna_deferred_register_props(srna_new, item)!=0) {
- return NULL;
- }
- }
- else {
- PyErr_Clear();
- }
+ if(pyrna_deferred_register_class(srna_new, py_class)!=0)
+ return NULL;
Py_RETURN_NONE;
}
-PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class)
+
+static int pyrna_srna_contains_pointer_prop_srna(StructRNA *srna_props, StructRNA *srna, const char **prop_identifier)
+{
+ PointerRNA tptr;
+ PropertyRNA *iterprop;
+ RNA_pointer_create(NULL, &RNA_Struct, srna_props, &tptr);
+
+ iterprop= RNA_struct_find_property(&tptr, "properties");
+
+ RNA_PROP_BEGIN(&tptr, itemptr, iterprop) {
+ PropertyRNA *prop= itemptr.data;
+ if(RNA_property_type(prop) == PROP_POINTER) {
+ if (strcmp(RNA_property_identifier(prop), "rna_type") == 0) {
+ /* pass */
+ }
+ else if(RNA_property_pointer_type(&tptr, prop) == srna) {
+ *prop_identifier= RNA_property_identifier(prop);
+ return 1;
+ }
+ }
+ }
+ RNA_PROP_END;
+
+ return 0;
+}
+
+static PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class)
{
bContext *C= NULL;
StructUnregisterFunc unreg;
StructRNA *srna;
/*if(PyDict_GetItemString(((PyTypeObject*)py_class)->tp_dict, "bl_rna")==NULL) {
- PyErr_SetString(PyExc_ValueError, "bpy.types.unregister(): not a registered as a subclass.");
+ PWM_cursor_wait(0);
+yErr_SetString(PyExc_ValueError, "bpy.types.unregister(): not a registered as a subclass.");
return NULL;
}*/
@@ -4534,6 +5120,34 @@ PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class)
return NULL;
}
+ /* should happen all the time but very slow */
+ if(G.f & G_DEBUG) {
+ /* remove all properties using this class */
+ StructRNA *srna_iter;
+ PointerRNA ptr_rna;
+ PropertyRNA *prop_rna;
+ const char *prop_identifier= NULL;
+
+ RNA_blender_rna_pointer_create(&ptr_rna);
+ prop_rna = RNA_struct_find_property(&ptr_rna, "structs");
+
+
+
+ /* loop over all structs */
+ RNA_PROP_BEGIN(&ptr_rna, itemptr, prop_rna) {
+ srna_iter = itemptr.data;
+ if(pyrna_srna_contains_pointer_prop_srna(srna_iter, srna, &prop_identifier)) {
+ break;
+ }
+ }
+ RNA_PROP_END;
+
+ if(prop_identifier) {
+ PyErr_Format(PyExc_SystemError, "bpy.types.unregister(...): Cant unregister %s because %s.%s pointer property is using this.", RNA_struct_identifier(srna), RNA_struct_identifier(srna_iter), prop_identifier);
+ return NULL;
+ }
+ }
+
/* get the context, so register callback can do necessary refreshes */
C= BPy_GetContext();
diff --git a/source/blender/python/intern/bpy_rna.h b/source/blender/python/intern/bpy_rna.h
index 9892ed6989b..63f6997d82c 100644
--- a/source/blender/python/intern/bpy_rna.h
+++ b/source/blender/python/intern/bpy_rna.h
@@ -86,11 +86,7 @@ int pyrna_set_to_enum_bitfield(EnumPropertyItem *items, PyObject *value, int *r_
int pyrna_enum_value_from_id(EnumPropertyItem *item, const char *identifier, int *value, const char *error_prefix);
-/* function for registering types */
-PyObject *pyrna_basetype_register(PyObject *self, PyObject *args);
-PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *args);
-
-int pyrna_deferred_register_props(struct StructRNA *srna, PyObject *class_dict);
+int pyrna_deferred_register_class(struct StructRNA *srna, PyObject *py_class);
/* called before stopping python */
void pyrna_alloc_types(void);
diff --git a/source/blender/python/intern/bpy_rna_callback.c b/source/blender/python/intern/bpy_rna_callback.c
index 2404442dc18..b2a7511f998 100644
--- a/source/blender/python/intern/bpy_rna_callback.c
+++ b/source/blender/python/intern/bpy_rna_callback.c
@@ -64,19 +64,28 @@ PyObject *pyrna_callback_add(BPy_StructRNA *self, PyObject *args)
char *cb_event_str= NULL;
int cb_event;
- if (!PyArg_ParseTuple(args, "OO|s:bpy_struct.callback_add", &cb_func, &cb_args, &cb_event_str))
+ if (!PyArg_ParseTuple(args, "OO!|s:bpy_struct.callback_add", &cb_func, &PyTuple_Type, &cb_args, &cb_event_str))
return NULL;
+
+ if(!PyCallable_Check(cb_func)) {
+ PyErr_SetString(PyExc_TypeError, "callback_add(): first argument isn't callable");
+ return NULL;
+ }
if(RNA_struct_is_a(self->ptr.type, &RNA_Region)) {
-
- static EnumPropertyItem region_draw_mode_items[] = {
- {REGION_DRAW_POST_VIEW, "POST_VIEW", 0, "Pose View", ""},
- {REGION_DRAW_POST_PIXEL, "POST_PIXEL", 0, "Post Pixel", ""},
- {REGION_DRAW_PRE_VIEW, "PRE_VIEW", 0, "Pre View", ""},
- {0, NULL, 0, NULL, NULL}};
-
- if(pyrna_enum_value_from_id(region_draw_mode_items, cb_event_str, &cb_event, "bpy_struct.callback_add()") < 0)
- return NULL;
+ if(cb_event_str) {
+ static EnumPropertyItem region_draw_mode_items[] = {
+ {REGION_DRAW_POST_PIXEL, "POST_PIXEL", 0, "Post Pixel", ""},
+ {REGION_DRAW_POST_VIEW, "POST_VIEW", 0, "Post View", ""},
+ {REGION_DRAW_PRE_VIEW, "PRE_VIEW", 0, "Pre View", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ if(pyrna_enum_value_from_id(region_draw_mode_items, cb_event_str, &cb_event, "bpy_struct.callback_add()") < 0)
+ return NULL;
+ }
+ else {
+ cb_event= REGION_DRAW_POST_PIXEL;
+ }
handle= ED_region_draw_cb_activate(((ARegion *)self->ptr.data)->type, cb_region_draw, (void *)args, cb_event);
Py_INCREF(args);
diff --git a/source/blender/python/intern/bpy_util.c b/source/blender/python/intern/bpy_util.c
index 38462d1b176..1d14ab67510 100644
--- a/source/blender/python/intern/bpy_util.c
+++ b/source/blender/python/intern/bpy_util.c
@@ -54,7 +54,7 @@ void PyObSpit(char *name, PyObject *var) {
}
void PyLineSpit(void) {
- char *filename;
+ const char *filename;
int lineno;
PyErr_Clear();
@@ -63,7 +63,7 @@ void PyLineSpit(void) {
fprintf(stderr, "%s:%d\n", filename, lineno);
}
-void BPY_getFileAndNum(char **filename, int *lineno)
+void BPY_getFileAndNum(const char **filename, int *lineno)
{
PyObject *getframe, *frame;
PyObject *f_lineno= NULL, *co_filename= NULL;
@@ -83,6 +83,7 @@ void BPY_getFileAndNum(char **filename, int *lineno)
return;
}
+ /* when executing a script */
if (filename) {
co_filename= PyObject_GetAttrStringArgs(frame, 1, "f_code", "co_filename");
if (co_filename==NULL) {
@@ -95,6 +96,25 @@ void BPY_getFileAndNum(char **filename, int *lineno)
Py_DECREF(co_filename);
}
+ /* when executing a module */
+ if(filename && *filename == NULL) {
+ /* try an alternative method to get the filename - module based
+ * references below are all borrowed (double checked) */
+ PyObject *mod_name= PyDict_GetItemString(PyEval_GetGlobals(), "__name__");
+ if(mod_name) {
+ PyObject *mod= PyDict_GetItem(PyImport_GetModuleDict(), mod_name);
+ if(mod) {
+ *filename= PyModule_GetFilename(mod);
+ }
+
+ /* unlikely, fallback */
+ if(*filename == NULL) {
+ *filename= _PyUnicode_AsString(mod_name);
+ }
+ }
+ }
+
+
if (lineno) {
f_lineno= PyObject_GetAttrString(frame, "f_lineno");
if (f_lineno==NULL) {
@@ -330,7 +350,7 @@ int BPy_errors_to_report(ReportList *reports)
PyObject *pystring_format= NULL; // workaround, see below
char *cstring;
- char *filename;
+ const char *filename;
int lineno;
if (!PyErr_Occurred())
diff --git a/source/blender/python/intern/bpy_util.h b/source/blender/python/intern/bpy_util.h
index e7e7bb09419..cfe820b53b0 100644
--- a/source/blender/python/intern/bpy_util.h
+++ b/source/blender/python/intern/bpy_util.h
@@ -38,7 +38,7 @@ struct ReportList;
void PyObSpit(char *name, PyObject *var);
void PyLineSpit(void);
-void BPY_getFileAndNum(char **filename, int *lineno);
+void BPY_getFileAndNum(const char **filename, int *lineno);
PyObject *BPY_exception_buffer(void);
diff --git a/source/blender/quicktime/CMakeLists.txt b/source/blender/quicktime/CMakeLists.txt
index f1b2a121b50..63b6558e997 100644
--- a/source/blender/quicktime/CMakeLists.txt
+++ b/source/blender/quicktime/CMakeLists.txt
@@ -45,17 +45,10 @@ SET(INC
../render/extern/include
../include
../windowmanager
+ ../../../intern/audaspace/intern
)
SET(INC ${INC} ${QUICKTIME_INC})
ADD_DEFINITIONS(-DWITH_QUICKTIME)
BLENDERLIB(bf_quicktime "${SRC}" "${INC}")
-#if env['OURPLATFORM'] in ['win32-vc', 'darwin']:
-# types = ['core', 'player']
-# priorities = [95, 200]
-#else:
-# types = ['core']
-# priorities = [95]
-#
-#env.BlenderLib ('bf_quicktime', sources=source_files, includes=incs, defines=['WITH_QUICKTIME'], libtype=types, priority=priorities)
diff --git a/source/blender/quicktime/Makefile b/source/blender/quicktime/Makefile
index 3d8ab2f0adc..d0055780556 100644
--- a/source/blender/quicktime/Makefile
+++ b/source/blender/quicktime/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/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..cdb00ab9ef2 100644
--- a/source/blender/quicktime/apple/Makefile
+++ b/source/blender/quicktime/apple/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.
@@ -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$(NAN_AUDASPACE)/include
diff --git a/source/blender/quicktime/apple/qtkit_export.m b/source/blender/quicktime/apple/qtkit_export.m
index 06082832b1e..35f3629cb61 100644
--- a/source/blender/quicktime/apple/qtkit_export.m
+++ b/source/blender/quicktime/apple/qtkit_export.m
@@ -36,6 +36,9 @@
#include <string.h>
#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 <Cocoa/Cocoa.h>
#import <QTKit/QTKit.h>
+#include <AudioToolbox/AudioToolbox.h>
#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;
-#pragma mark rna helper functions
+#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<qtCodecCount;i++) {
- if (qtCodecList[i].codecType == codecType)
- return qtCodecList[i].rnatmpvalue;
+ for (i=0;i<qtVideoCodecCount;i++) {
+ if (qtVideoCodecList[i].codecType == codecType)
+ return qtVideoCodecList[i].rnatmpvalue;
}
return 0;
}
-int quicktime_codecType_from_rnatmpvalue(int rnatmpvalue) {
+int quicktime_videocodecType_from_rnatmpvalue(int rnatmpvalue) {
int i;
- for (i=0;i<qtCodecCount;i++) {
- if (qtCodecList[i].rnatmpvalue == rnatmpvalue)
- return qtCodecList[i].codecType;
+ for (i=0;i<qtVideoCodecCount;i++) {
+ if (qtVideoCodecList[i].rnatmpvalue == rnatmpvalue)
+ return qtVideoCodecList[i].codecType;
+ }
+
+ return 0;
+}
+
+/* Audio codec */
+static QuicktimeCodecTypeDesc qtAudioCodecList[] = {
+ {0, 0, "No audio"},
+ {kAudioFormatLinearPCM, 1, "LPCM"},
+ {kAudioFormatAppleLossless, 2, "Apple Lossless"},
+ {kAudioFormatMPEG4AAC, 3, "AAC"},
+ {0,0,NULL}};
+
+static int qtAudioCodecCount = 4;
+
+int quicktime_get_num_audiocodecs() {
+ return qtAudioCodecCount;
+}
+
+QuicktimeCodecTypeDesc* quicktime_get_audiocodecType_desc(int indexValue) {
+ if ((indexValue>=0) && (indexValue < qtAudioCodecCount))
+ return &qtAudioCodecList[indexValue];
+ else
+ return NULL;
+}
+
+int quicktime_rnatmpvalue_from_audiocodectype(int codecType) {
+ int i;
+ for (i=0;i<qtAudioCodecCount;i++) {
+ if (qtAudioCodecList[i].codecType == codecType)
+ return qtAudioCodecList[i].rnatmpvalue;
+ }
+
+ return 0;
+}
+
+int quicktime_audiocodecType_from_rnatmpvalue(int rnatmpvalue) {
+ int i;
+ for (i=0;i<qtAudioCodecCount;i++) {
+ if (qtAudioCodecList[i].rnatmpvalue == rnatmpvalue)
+ return qtAudioCodecList[i].codecType;
}
return 0;
@@ -172,14 +237,68 @@ void filepath_qt(char *string, RenderData *rd) {
}
+#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 aaf2634bbf6..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;i<qtCodecCount;i++) {
- if (qtCodecList[i].codecType == codecType)
- return qtCodecList[i].rnatmpvalue;
+ for (i=0;i<qtVideoCodecCount;i++) {
+ if (qtVideoCodecList[i].codecType == codecType)
+ return qtVideoCodecList[i].rnatmpvalue;
}
return 0;
}
-int quicktime_codecType_from_rnatmpvalue(int rnatmpvalue) {
+int quicktime_videocodecType_from_rnatmpvalue(int rnatmpvalue) {
int i;
- for (i=0;i<qtCodecCount;i++) {
- if (qtCodecList[i].rnatmpvalue == rnatmpvalue)
- return qtCodecList[i].codecType;
+ for (i=0;i<qtVideoCodecCount;i++) {
+ if (qtVideoCodecList[i].rnatmpvalue == rnatmpvalue)
+ return qtVideoCodecList[i].codecType;
}
return 0;
diff --git a/source/blender/quicktime/apple/quicktime_import.c b/source/blender/quicktime/apple/quicktime_import.c
index 10b45cafa91..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
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 <config.h>
-#endif
-
#include "../imbuf/IMB_imbuf.h"
#include "../imbuf/IMB_imbuf_types.h"
diff --git a/source/blender/readblenfile/CMakeLists.txt b/source/blender/readblenfile/CMakeLists.txt
index 306544fec78..a6522ffa758 100644
--- a/source/blender/readblenfile/CMakeLists.txt
+++ b/source/blender/readblenfile/CMakeLists.txt
@@ -31,4 +31,3 @@ SET(INC
)
BLENDERLIB(bf_readblenfile "${SRC}" "${INC}")
-#env.BlenderLib ( 'bf_readblenfile', sources, Split(incs), [], libtype=['common','player'], priority = [0, 220] )
diff --git a/source/blender/readblenfile/Makefile b/source/blender/readblenfile/Makefile
index d291cb84315..f0a46d077a8 100644
--- a/source/blender/readblenfile/Makefile
+++ b/source/blender/readblenfile/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/readblenfile/intern/BLO_readblenfile.c b/source/blender/readblenfile/intern/BLO_readblenfile.c
index dcb9464775b..7c876c96a86 100644
--- a/source/blender/readblenfile/intern/BLO_readblenfile.c
+++ b/source/blender/readblenfile/intern/BLO_readblenfile.c
@@ -36,10 +36,7 @@
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
+#include <errno.h>
#ifdef WIN32
#include <io.h> // 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/intern/Makefile b/source/blender/readblenfile/intern/Makefile
index 54316903f23..dc59ca3b9ed 100644
--- a/source/blender/readblenfile/intern/Makefile
+++ b/source/blender/readblenfile/intern/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/readblenfile/stub/Makefile b/source/blender/readblenfile/stub/Makefile
index a2b0fe88f6a..94a55407418 100644
--- a/source/blender/readblenfile/stub/Makefile
+++ b/source/blender/readblenfile/stub/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/readblenfile/test/Makefile b/source/blender/readblenfile/test/Makefile
index 50f50f5c54c..cc294ac60b3 100644
--- a/source/blender/readblenfile/test/Makefile
+++ b/source/blender/readblenfile/test/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/readblenfile/test/test.c b/source/blender/readblenfile/test/test.c
index 1706da59d92..1cb4f7e92f3 100644
--- a/source/blender/readblenfile/test/test.c
+++ b/source/blender/readblenfile/test/test.c
@@ -29,10 +29,6 @@
#include <string.h> // strlen
#include "BLO_readblenfile.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
struct streamGlueControlStruct *Global_streamGlueControl;
int
diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt
index 5dc89af5632..1b6a29b616a 100644
--- a/source/blender/render/CMakeLists.txt
+++ b/source/blender/render/CMakeLists.txt
@@ -38,9 +38,9 @@ IF(WIN32)
SET(INC ${INC} ${PTHREADS_INC})
ENDIF(WIN32)
-IF(WITH_OPENEXR)
+IF(WITH_IMAGE_OPENEXR)
ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_OPENEXR)
+ENDIF(WITH_IMAGE_OPENEXR)
IF(WITH_QUICKTIME)
SET(INC ${INC} ../quicktime ${QUICKTIME_INC})
@@ -54,13 +54,4 @@ 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'
-
-BLENDERLIB_NOLIST(blender_render "${SRC}" "${INC}")
-#env.BlenderLib ( libname = 'blender_render', sources = sources, includes = Split(incs), defines=defs, libtype='core', priority=45, compileflags=cflags )
+BLENDERLIB_NOLIST(bf_render "${SRC}" "${INC}")
diff --git a/source/blender/render/Makefile b/source/blender/render/Makefile
index 11ddbad0b94..7be54ac359f 100644
--- a/source/blender/render/Makefile
+++ b/source/blender/render/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/SConscript b/source/blender/render/SConscript
index 366f6bd723c..bce24fe38a1 100644
--- a/source/blender/render/SConscript
+++ b/source/blender/render/SConscript
@@ -8,36 +8,37 @@ incs = 'intern/include #/intern/guardedalloc ../blenlib ../makesdna ../makesrna'
incs += ' extern/include ../blenkernel ../radiosity/extern/include ../imbuf'
incs += ' ../include ../blenloader ../../../intern/smoke/extern'
-cflags = env['CCFLAGS']
-cxxflags = env['CXXFLAGS']
+cflags_raytrace = env['CCFLAGS']
+cxxflags_raytrace = env['CXXFLAGS']
defs = []
+defs_raytrace = []
if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
if env['WITH_BF_RAYOPTIMIZATION']:
- cflags = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
- cxxflags = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
+ cflags_raytrace = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
+ cxxflags_raytrace = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
if env['OURPLATFORM'] == 'win32-mingw':
if env['WITH_BF_RAYOPTIMIZATION']:
- cflags = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
- cxxflags = env['CXXFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
+ cflags_raytrace = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
+ cxxflags_raytrace = env['CXXFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
if env['OURPLATFORM'] == 'darwin':
if env['MACOSX_ARCHITECTURE'] in ('i386', 'x86_64') and env['WITH_BF_RAYOPTIMIZATION']:
- cflags = env['CFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
- cxxflags = env['CXXFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
+ cflags_raytrace = env['CFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
+ cxxflags_raytrace = env['CXXFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
if env['OURPLATFORM'] == 'linux2':
if env['WITH_BF_RAYOPTIMIZATION']:
- cflags = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
- cxxflags = env['CXXFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
+ cflags_raytrace = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
+ cxxflags_raytrace = env['CXXFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
incs += ' ../../../extern/binreloc/include'
if env['OURPLATFORM'] == 'linuxcross':
if env['WITH_BF_RAYOPTIMIZATION']:
- cflags = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
- cxxflags = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
+ cflags_raytrace = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
+ cxxflags_raytrace = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
if env['WITH_BF_QUICKTIME']:
defs.append('WITH_QUICKTIME')
@@ -53,10 +54,12 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
# HACK: To fix problem with error 'MMX instruction set not enabled' from mmintrin.h
#
if env['OURPLATFORM'] == 'linuxcross':
- defs.append('__MMX__')
+ defs.append('__SSE__')
+ defs_raytrace.append('__MMX__')
if env['WITH_BF_RAYOPTIMIZATION']:
defs.append('__SSE__')
+ defs_raytrace.append('__SSE__')
-env.BlenderLib ( libname = 'bf_render', sources = sources, includes = Split(incs), defines=defs, libtype='core', priority=145, compileflags=cflags )
-env.BlenderLib ( libname = 'bf_render_raytrace', sources = raysources, includes = Split(incs), defines=defs, libtype='core', priority=145, compileflags=cflags, cxx_compileflags=cxxflags )
+env.BlenderLib ( libname = 'bf_render', sources = sources, includes = Split(incs), defines=defs, libtype='core', priority=145 )
+env.BlenderLib ( libname = 'bf_render_raytrace', sources = raysources, includes = Split(incs), defines=defs_raytrace, libtype='core', priority=145, compileflags=cflags_raytrace, cxx_compileflags=cxxflags_raytrace )
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index 0d8161c9a7a..b12e45ecd9c 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -37,14 +37,15 @@
struct bNodeTree;
struct Image;
+struct Main;
struct NodeBlurData;
struct Object;
-struct ReportList;
struct RenderData;
struct RenderEngine;
struct RenderEngineType;
struct RenderResult;
struct ReportList;
+struct ReportList;
struct Scene;
struct SceneRenderLayer;
@@ -130,8 +131,8 @@ typedef struct RenderResult {
/* for render results in Image, verify validity for sequences */
int framenr;
- /* for acquire image, to indicate if it is compo/seq result */
- int compo_seq;
+ /* for acquire image, to indicate if it there is a combined layer */
+ int have_combined;
/* render info text */
char *text;
@@ -192,7 +193,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, unsigned int lay, int use_camera_view);
+void RE_Database_FromScene(struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, int use_camera_view);
void RE_Database_Free (struct Render *re);
/* project dbase again, when viewplane/perspective changed */
@@ -208,11 +209,11 @@ void RE_init_threadcount(Render *re);
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, 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);
+void RE_BlenderFrame(struct Render *re, struct Main *bmain, struct Scene *scene, struct SceneRenderLayer *srl, unsigned int lay, int frame);
+void RE_BlenderAnim(struct Render *re, struct Main *bmain, 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_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene);
void RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
void RE_WriteRenderResult(RenderResult *rr, char *filename, int compress);
@@ -230,7 +231,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));
@@ -248,7 +249,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, unsigned int lay, int type, struct Object *actob);
+void RE_Database_Baking(struct Render *re, struct Main *bmain, 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]);
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/Makefile b/source/blender/render/intern/Makefile
index 4fce37df175..4043902a40f 100644
--- a/source/blender/render/intern/Makefile
+++ b/source/blender/render/intern/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/include/render_types.h b/source/blender/render/intern/include/render_types.h
index 127fbce20eb..b124102f50b 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -55,6 +55,7 @@ struct RenderBuckets;
struct ObjectInstanceRen;
struct RayObject;
struct RayFace;
+struct Main;
#define TABLEINITSIZE 1024
#define LAMPINITSIZE 256
@@ -170,7 +171,8 @@ struct Render
/* shadow counter, detect shadow-reuse for shaders */
int shadowsamplenr[BLENDER_MAX_THREADS];
- /* scene, and its full copy of renderdata and world */
+ /* main, scene, and its full copy of renderdata and world */
+ struct Main *main;
Scene *scene;
RenderData r;
World wrld;
@@ -189,7 +191,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;
@@ -234,8 +237,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;
@@ -463,6 +466,7 @@ typedef struct VolPrecachePart
struct RayObject *tree;
struct ShadeInput *shi;
struct ObjectInstanceRen *obi;
+ float viewmat[4][4];
int num;
int minx, maxx;
int miny, maxy;
@@ -476,6 +480,7 @@ typedef struct VolPrecachePart
typedef struct VolumePrecache
{
int res[3];
+ float *bbmin, *bbmax;
float *data_r;
float *data_g;
float *data_b;
@@ -564,13 +569,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];
@@ -591,23 +589,21 @@ typedef struct LampRen {
#define R_HALO 2
#define R_SEC_FIELD 4
#define R_LAMPHALO 8
-#define R_GLOB_NOPUNOFLIP 16
-#define R_NEED_TANGENT 32
-#define R_BAKE_TRACE 128
-#define R_BAKING 256
+#define R_NEED_TANGENT 16
+#define R_BAKE_TRACE 32
+#define R_BAKING 64
/* vlakren->flag (vlak = face in dutch) char!!! */
#define R_SMOOTH 1
#define R_HIDDEN 2
/* strand flag, means special handling */
#define R_STRAND 4
-#define R_NOPUNOFLIP 8
-#define R_FULL_OSA 16
-#define R_FACE_SPLIT 32
+#define R_FULL_OSA 8
+#define R_FACE_SPLIT 16
/* Tells render to divide face other way. */
-#define R_DIVIDE_24 64
+#define R_DIVIDE_24 32
/* vertex normals are tangent or view-corrected vector, for hair strands */
-#define R_TANGENT 128
+#define R_TANGENT 64
/* strandbuffer->flag */
#define R_STRAND_BSPLINE 1
diff --git a/source/blender/render/intern/include/renderdatabase.h b/source/blender/render/intern/include/renderdatabase.h
index 2a0086b436c..4c80616665d 100644
--- a/source/blender/render/intern/include/renderdatabase.h
+++ b/source/blender/render/intern/include/renderdatabase.h
@@ -34,6 +34,7 @@ struct Object;
struct VlakRen;
struct VertRen;
struct HaloRen;
+struct Main;
struct Material;
struct Render;
struct MCol;
@@ -115,7 +116,7 @@ struct MCol *RE_vlakren_get_mcol(struct ObjectRen *obr, VlakRen *ren, int n, cha
float *RE_vlakren_get_surfnor(struct ObjectRen *obr, VlakRen *ren, int verify);
float *RE_vlakren_get_nmap_tangent(struct ObjectRen *obr, VlakRen *ren, int verify);
RadFace **RE_vlakren_get_radface(struct ObjectRen *obr, VlakRen *ren, int verify);
-int RE_vlakren_get_normal(struct Render *re, struct ObjectInstanceRen *obi, struct VlakRen *vlr, float *nor);
+void RE_vlakren_get_normal(struct Render *re, struct ObjectInstanceRen *obi, struct VlakRen *vlr, float *nor);
float *RE_strandren_get_surfnor(struct ObjectRen *obr, struct StrandRen *strand, int verify);
float *RE_strandren_get_uv(struct ObjectRen *obr, struct StrandRen *strand, int n, char **name, int verify);
@@ -137,7 +138,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, unsigned int lay);
+void RE_Database_FromScene_Vectors(Render *re, struct Main *bmain, struct Scene *sce, unsigned int lay);
#endif /* RENDERDATABASE_H */
diff --git a/source/blender/render/intern/include/texture.h b/source/blender/render/intern/include/texture.h
index 3e6fc8c5677..fb941d1b7f3 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;
@@ -59,7 +65,7 @@ void do_lamp_tex(LampRen *la, float *lavec, struct ShadeInput *shi, float *colf,
void do_volume_tex(struct ShadeInput *shi, float *xyz, int mapto_flag, float *col, float *val);
void init_render_textures(Render *re);
-void end_render_textures(void);
+void end_render_textures(Render *re);
void render_realtime_texture(struct ShadeInput *shi, struct Image *ima);
diff --git a/source/blender/render/intern/include/volume_precache.h b/source/blender/render/intern/include/volume_precache.h
index 73e0a3e0415..3ddf8380241 100644
--- a/source/blender/render/intern/include/volume_precache.h
+++ b/source/blender/render/intern/include/volume_precache.h
@@ -25,9 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-
+
+void global_bounds_obi(Render *re, ObjectInstanceRen *obi, float *bbmin, float *bbmax);
+int point_inside_volume_objectinstance(Render *re, ObjectInstanceRen *obi, float *co);
+
void volume_precache(Render *re);
void free_volume_precache(Render *re);
-int point_inside_volume_objectinstance(Render *re, ObjectInstanceRen *obi, float *co);
#define VOL_MS_TIMESTEP 0.1f
diff --git a/source/blender/render/intern/raytrace/Makefile b/source/blender/render/intern/raytrace/Makefile
index 6e40c544c6f..2da8038c610 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.
@@ -63,3 +63,7 @@ endif
ifeq ($(WITH_OPENEXR),true)
CPPFLAGS += -DWITH_OPENEXR
endif
+
+ifeq ($(WITH_BF_RAYOPTIMIZATION), true)
+ CPPFLAGS += -D__SSE__
+endif
diff --git a/source/blender/render/intern/raytrace/bvh.h b/source/blender/render/intern/raytrace/bvh.h
index e3efb90ec04..133a3d4a005 100644
--- a/source/blender/render/intern/raytrace/bvh.h
+++ b/source/blender/render/intern/raytrace/bvh.h
@@ -28,7 +28,6 @@
*/
#include "rayobject.h"
#include "raycounter.h"
-#include "MEM_guardedalloc.h"
#include "rayobject_rtbuild.h"
#include "rayobject_hint.h"
diff --git a/source/blender/render/intern/raytrace/rayobject.cpp b/source/blender/render/intern/raytrace/rayobject.cpp
index b9e9a46b1a9..84ec56e131a 100644
--- a/source/blender/render/intern/raytrace/rayobject.cpp
+++ b/source/blender/render/intern/raytrace/rayobject.cpp
@@ -497,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);
+
+ 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( 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 );
+ 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..c510af540db 100644
--- a/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
@@ -26,6 +26,7 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+#include "MEM_guardedalloc.h"
#include "vbvh.h"
#include "svbvh.h"
#include "reorganize.h"
@@ -52,10 +53,10 @@ void bvh_done<QBVHTree>(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..647c5771e4f 100644
--- a/source/blender/render/intern/raytrace/rayobject_svbvh.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_svbvh.cpp
@@ -26,6 +26,8 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+#include "MEM_guardedalloc.h"
+
#include "vbvh.h"
#include "svbvh.h"
#include "reorganize.h"
@@ -63,10 +65,10 @@ void bvh_done<SVBVHTree>(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>(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>(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/raytrace/reorganize.h b/source/blender/render/intern/raytrace/reorganize.h
index 92667d8de62..7ef7296945c 100644
--- a/source/blender/render/intern/raytrace/reorganize.h
+++ b/source/blender/render/intern/raytrace/reorganize.h
@@ -269,7 +269,7 @@ void pushdown(Node *parent)
/*
* BVH refit
- * reajust nodes BB (useful if nodes childs where modified)
+ * readjust nodes BB (useful if nodes childs where modified)
*/
template<class Node>
float bvh_refit(Node *node)
@@ -295,7 +295,7 @@ float bvh_refit(Node *node)
/*
- * this finds the best way to packing a tree acording to a given test cost function
+ * this finds the best way to packing a tree according to a given test cost function
* with the purpose to reduce the expected cost (eg.: number of BB tests).
*/
#include <vector>
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 db242b0b1d9..149890f830d 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -356,17 +356,6 @@ static void split_v_renderfaces(ObjectRen *obr, int startvlak, int startvert, in
}
/* ------------------------------------------------------------------------- */
-
-static int check_vnormal(float *n, float *veno)
-{
- float inp;
-
- inp=n[0]*veno[0]+n[1]*veno[1]+n[2]*veno[2];
- if(inp < -FLT_EPSILON10) return 1;
- return 0;
-}
-
-/* ------------------------------------------------------------------------- */
/* Stress, tangents and normals */
/* ------------------------------------------------------------------------- */
@@ -512,7 +501,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");
@@ -536,9 +525,6 @@ static void calc_vertexnormals(Render *re, ObjectRen *obr, int do_tangent, int d
float n1[3], n2[3], n3[3], n4[3];
float fac1, fac2, fac3, fac4=0.0f;
- if(re->flag & R_GLOB_NOPUNOFLIP)
- vlr->flag |= R_NOPUNOFLIP;
-
sub_v3_v3v3(n1, v2->co, v1->co);
normalize_v3(n1);
sub_v3_v3v3(n2, v3->co, v2->co);
@@ -562,21 +548,11 @@ static void calc_vertexnormals(Render *re, ObjectRen *obr, int do_tangent, int d
fac3= saacos(-n2[0]*n3[0]-n2[1]*n3[1]-n2[2]*n3[2]);
fac4= saacos(-n3[0]*n4[0]-n3[1]*n4[1]-n3[2]*n4[2]);
- if(!(vlr->flag & R_NOPUNOFLIP)) {
- if( check_vnormal(vlr->n, v4->n) ) fac4= -fac4;
- }
-
v4->n[0] +=fac4*vlr->n[0];
v4->n[1] +=fac4*vlr->n[1];
v4->n[2] +=fac4*vlr->n[2];
}
- if(!(vlr->flag & R_NOPUNOFLIP)) {
- if( check_vnormal(vlr->n, v1->n) ) fac1= -fac1;
- if( check_vnormal(vlr->n, v2->n) ) fac2= -fac2;
- if( check_vnormal(vlr->n, v3->n) ) fac3= -fac3;
- }
-
v1->n[0] +=fac1*vlr->n[0];
v1->n[1] +=fac1*vlr->n[1];
v1->n[2] +=fac1*vlr->n[2];
@@ -851,32 +827,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);
}
@@ -1023,7 +997,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par
else width= 1.0f;
if(ma->mode & MA_TANGENT_STR)
- flag= R_SMOOTH|R_NOPUNOFLIP|R_TANGENT;
+ flag= R_SMOOTH|R_TANGENT;
else
flag= R_SMOOTH;
@@ -1041,7 +1015,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 +1027,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 +1089,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 +1151,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 +1494,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 +1506,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 +1526,11 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
if(part->phystype==PART_PHYS_KEYED)
psys_count_keyed_targets(&sim);
+ totchild=psys->totchild;
+
+ /* can happen for disconnected/global hair */
+ if(part->type==PART_HAIR && !psys->childcache)
+ totchild= 0;
if(G.rendering == 0) { /* preview render */
totchild = (int)((float)totchild * (float)part->disp / 100.0f);
@@ -1639,7 +1616,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){
@@ -2366,6 +2343,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 +2358,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; a<dl->nr; a++, data+=3, nors+=3, orco+=3) {
@@ -2425,7 +2411,7 @@ static void init_render_mball(Render *re, ObjectRen *obr)
normal_tri_v3( vlr->n,vlr->v3->co, vlr->v2->co, vlr->v1->co);
vlr->mat= ma;
- vlr->flag= ME_SMOOTH+R_NOPUNOFLIP;
+ vlr->flag= ME_SMOOTH;
vlr->ec= 0;
/* mball -too bad- always has triangles, because quads can be non-planar */
@@ -2444,10 +2430,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);
}
/* ------------------------------------------------------------------------- */
@@ -2457,10 +2440,8 @@ static void init_render_mball(Render *re, ObjectRen *obr)
/* returns amount of vertices added for orco */
static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar, float *orco, float mat[4][4])
{
- Object *ob= obr->ob;
VertRen *v1, *v2, *v3, *v4, *ver;
VlakRen *vlr, *vlr1, *vlr2, *vlr3;
- Curve *cu= ob->data;
float *data, n1[3];
int u, v, orcoret= 0;
int p1, p2, p3, p4, a;
@@ -2540,14 +2521,11 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar,
vlr->mat= matar[ dl->col];
vlr->ec= ME_V1V2+ME_V2V3;
vlr->flag= dl->rt;
- if( (cu->flag & CU_NOPUNOFLIP) ) {
- 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 +2539,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 +2552,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 +2581,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);
@@ -2691,9 +2669,6 @@ static void init_render_dm(DerivedMesh *dm, Render *re, ObjectRen *obr,
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--;
@@ -2845,7 +2820,10 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
}
while(dl) {
- if(dl->type==DL_INDEX3) {
+ if(dl->col > ob->totcol) {
+ /* pass */
+ }
+ else if(dl->type==DL_INDEX3) {
int *index;
startvert= obr->totvert;
@@ -2898,9 +2876,6 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
vlr->mat= matar[ dl->col ];
vlr->flag= 0;
- if( (cu->flag & CU_NOPUNOFLIP) ) {
- vlr->flag |= R_NOPUNOFLIP;
- }
vlr->ec= 0;
}
}
@@ -2986,10 +2961,10 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
for(a= startvlak; a<obr->totvlak; 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);
+ 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; a<obr->totvert; a++) {
ver= RE_findOrAddVert(obr, a);
@@ -3385,9 +3360,6 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
vlr->mat= ma;
vlr->flag= flag;
- if((me->flag & ME_NOPUNOFLIP) ) {
- vlr->flag |= R_NOPUNOFLIP;
- }
vlr->ec= 0; /* mesh edges rendered separately */
if(len==0) obr->totvlak--;
@@ -3887,12 +3859,12 @@ static void set_material_lightgroups(Render *re)
if(re->scene->r.scemode & R_PREVIEWBUTS)
return;
- for(group= G.main->group.first; group; group=group->id.next)
+ for(group= re->main->group.first; group; group=group->id.next)
group->id.flag |= LIB_DOIT;
/* it's a bit too many loops in loops... but will survive */
/* hola! materials not in use...? */
- for(ma= G.main->mat.first; ma; ma=ma->id.next) {
+ for(ma= re->main->mat.first; ma; ma=ma->id.next) {
if(ma->group && (ma->group->id.flag & LIB_DOIT))
add_lightgroup(re, ma->group, ma->mode & MA_GROUP_NOLAY);
}
@@ -4542,7 +4514,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 */
@@ -4569,30 +4540,16 @@ 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();
#endif
- end_render_materials();
- end_render_textures();
+ end_render_materials(re->main);
+ end_render_textures(re);
free_pointdensities(re);
- free_voxeldata(re);
free_camera_inside_volumes(re);
@@ -4788,7 +4745,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 */
@@ -4815,7 +4772,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) {
@@ -4915,7 +4872,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
/* objects in groups with OB_RENDER_DUPLI set still need to be created,
* since they may not be part of the scene */
- for(group= G.main->group.first; group; group=group->id.next)
+ for(group= re->main->group.first; group; group=group->id.next)
add_group_render_dupli_obs(re, group, nolamps, onlyselected, actob, timeoffset, renderlay, 0);
/* imat objects has to be done again, since groups can mess it up */
@@ -4932,13 +4889,14 @@ 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, unsigned int lay, int use_camera_view)
+void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int lay, int use_camera_view)
{
extern int slurph_opt; /* key.c */
Scene *sce;
float mat[4][4];
float amb[3];
+ re->main= bmain;
re->scene= scene;
re->lay= lay;
@@ -4949,7 +4907,7 @@ void RE_Database_FromScene(Render *re, Scene *scene, unsigned int lay, int use_c
/* 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;
@@ -4963,10 +4921,15 @@ void RE_Database_FromScene(Render *re, Scene *scene, unsigned int lay, int use_c
/* applies changes fully */
if((re->r.scemode & R_PREVIEWBUTS)==0)
- scene_update_for_newframe(re->scene, lay);
+ scene_update_for_newframe(re->main, re->scene, lay);
/* 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);
@@ -4985,7 +4948,7 @@ void RE_Database_FromScene(Render *re, Scene *scene, unsigned int lay, int use_c
/* still bad... doing all */
init_render_textures(re);
VECCOPY(amb, &re->wrld.ambr);
- init_render_materials(re->r.mode, amb);
+ init_render_materials(re->main, re->r.mode, amb);
set_node_shader_lamp_loop(shade_material_loop);
/* MAKE RENDER DATA */
@@ -5099,7 +5062,7 @@ static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int la
/* 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;
@@ -5112,7 +5075,7 @@ static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int la
/* applies changes fully */
scene->r.cfra += timeoffset;
- scene_update_for_newframe(re->scene, lay);
+ scene_update_for_newframe(re->main, re->scene, lay);
/* if no camera, viewmat should have been set! */
if(re->scene->camera) {
@@ -5471,7 +5434,7 @@ static void free_dbase_object_vectors(ListBase *lb)
BLI_freelistN(lb);
}
-void RE_Database_FromScene_Vectors(Render *re, Scene *sce, unsigned int lay)
+void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned int lay)
{
ObjectInstanceRen *obi, *oldobi;
StrandSurface *mesh;
@@ -5513,7 +5476,7 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce, unsigned int lay)
re->strandsurface= strandsurface;
if(!re->test_break(re->tbh))
- RE_Database_FromScene(re, sce, lay, 1);
+ RE_Database_FromScene(re, bmain, sce, lay, 1);
if(!re->test_break(re->tbh)) {
for(step= 0; step<2; step++) {
@@ -5602,12 +5565,13 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce, unsigned int lay)
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, unsigned int lay, int type, Object *actob)
+void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, int type, Object *actob)
{
float mat[4][4];
float amb[3];
int onlyselected, nolamps;
+ re->main= bmain;
re->scene= scene;
re->lay= lay;
@@ -5616,7 +5580,6 @@ void RE_Database_Baking(Render *re, Scene *scene, unsigned int lay, int type, Ob
RE_init_threadcount(re);
- re->flag |= R_GLOB_NOPUNOFLIP;
re->flag |= R_BAKING;
re->excludeob= actob;
if(actob)
@@ -5635,7 +5598,7 @@ void RE_Database_Baking(Render *re, Scene *scene, unsigned int lay, int type, Ob
}
/* 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;
@@ -5669,7 +5632,7 @@ void RE_Database_Baking(Render *re, Scene *scene, unsigned int lay, int type, Ob
init_render_textures(re);
VECCOPY(amb, &re->wrld.ambr);
- init_render_materials(re->r.mode, amb);
+ init_render_materials(re->main, re->r.mode, amb);
set_node_shader_lamp_loop(shade_material_loop);
diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c
index 1a34868b9fd..8977bc7f379 100644
--- a/source/blender/render/intern/source/envmap.c
+++ b/source/blender/render/intern/source/envmap.c
@@ -46,7 +46,6 @@
#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_global.h"
#include "BKE_image.h" // BKE_write_ibuf
#include "BKE_texture.h"
#include "BKE_utildefines.h"
@@ -508,7 +507,7 @@ void make_envmaps(Render *re)
/* 5 = hardcoded max recursion level */
while(depth<5) {
- tex= G.main->tex.first;
+ tex= re->main->tex.first;
while(tex) {
if(tex->id.us && tex->type==TEX_ENVMAP) {
if(tex->env && tex->env->object) {
@@ -719,9 +718,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];
@@ -732,9 +731,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 afb7fbb74dc..818c3c72118 100644
--- a/source/blender/render/intern/source/gammaCorrectionTables.c
+++ b/source/blender/render/intern/source/gammaCorrectionTables.c
@@ -33,10 +33,6 @@
#include <stdlib.h>
#include <math.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
/* WARNING; optimized, cannot be used to do gamma(invgamma()) and expect */
/* result remain identical (ton) */
@@ -121,7 +117,7 @@ void makeGammaTables(float gamma)
/* The end of the table should match 1.0 carefully. In order to avoid */
/* rounding errors, we just set this explicitly. The last segment may */
- /* have a different lenght than the other segments, but our */
+ /* have a different length than the other segments, but our */
/* interpolation is insensitive to that. */
color_domain_table[RE_GAMMA_TABLE_SIZE] = 1.0;
gamma_range_table[RE_GAMMA_TABLE_SIZE] = 1.0;
diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c
index 21077c289c3..f08529b3f2c 100644
--- a/source/blender/render/intern/source/imagetexture.c
+++ b/source/blender/render/intern/source/imagetexture.c
@@ -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;
}
@@ -586,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);
- 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);
- 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};
@@ -713,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;
@@ -1358,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
@@ -1388,6 +1346,8 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec,
texres->tb *= fx;
}
+ BRICONTRGB;
+
return retval;
}
@@ -1745,8 +1705,6 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
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);
}
@@ -1773,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/occlusion.c b/source/blender/render/intern/source/occlusion.c
index ab656ad1c3b..fb69519236a 100644
--- a/source/blender/render/intern/source/occlusion.c
+++ b/source/blender/render/intern/source/occlusion.c
@@ -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)
@@ -1390,8 +1390,7 @@ static void sample_occ_tree(Render *re, OcclusionTree *tree, OccFace *exclude, f
if(onlyshadow)
envcolor= WO_AOPLAIN;
- VECCOPY(nn, n);
- negate_v3(nn);
+ negate_v3_v3(nn, n);
occ_lookup(tree, thread, exclude, co, nn, &occ, (tree->doindirect)? rad: NULL, (env && envcolor)? bn: NULL);
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index f9089e7399b..44c6a6f008f 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -39,6 +39,8 @@
#include "DNA_sequence_types.h"
#include "DNA_userdef_types.h"
+#include "MEM_guardedalloc.h"
+
#include "BKE_utildefines.h"
#include "BKE_global.h"
#include "BKE_image.h"
@@ -52,8 +54,6 @@
#include "BKE_pointcache.h"
#include "BKE_animsys.h" /* <------ should this be here?, needed for sequencer update */
-#include "MEM_guardedalloc.h"
-
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_rand.h"
@@ -131,17 +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;}
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);
@@ -918,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;
}
@@ -1061,7 +1074,6 @@ void RE_AcquireResultImage(Render *re, RenderResult *rr)
rr->rectf= re->result->rectf;
rr->rectz= re->result->rectz;
rr->rect32= re->result->rect32;
- rr->compo_seq= (rr->rectf != NULL);
/* active layer */
rl= render_get_active_layer(re, re->result);
@@ -1073,6 +1085,7 @@ void RE_AcquireResultImage(Render *re, RenderResult *rr)
rr->rectz= RE_RenderLayerGetPass(rl, SCE_PASS_Z);
}
+ rr->have_combined= (re->result->rectf != NULL);
rr->layers= re->result->layers;
}
}
@@ -1149,7 +1162,7 @@ Render *RE_NewRender(const char *name)
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)
@@ -1157,7 +1170,7 @@ Render *RE_NewRender(const char *name)
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,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);
}
@@ -1361,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))
@@ -1564,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;
@@ -1681,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;
}
}
@@ -1748,12 +1764,13 @@ static void do_render_3d(Render *re)
/* 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->lay);
+ RE_Database_FromScene_Vectors(re, re->main, re->scene, re->lay);
else
- RE_Database_FromScene(re, re->scene, re->lay, 1);
+ RE_Database_FromScene(re, re->main, re->scene, re->lay, 1);
threaded_tile_processor(re);
@@ -1764,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 */
@@ -1863,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 */
@@ -1881,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... */
@@ -1961,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;
}
@@ -2121,11 +2142,12 @@ static void render_scene(Render *re, Scene *sce, int cfra)
RE_InitState(resc, re, &sce->r, NULL, winx, winy, &re->disprect);
/* still unsure entity this... */
+ resc->main= re->main;
resc->scene= sce;
resc->lay= sce->lay;
/* ensure scene has depsgraph, base flags etc OK */
- set_scene_bg(sce);
+ set_scene_bg(re->main, sce);
/* copy callbacks */
resc->display_draw= re->display_draw;
@@ -2143,7 +2165,7 @@ static void tag_scenes_for_render(Render *re)
bNode *node;
Scene *sce;
- for(sce= G.main->scene.first; sce; sce= sce->id.next)
+ for(sce= re->main->scene.first; sce; sce= sce->id.next)
sce->id.flag &= ~LIB_DOIT;
re->scene->id.flag |= LIB_DOIT;
@@ -2298,7 +2320,7 @@ void RE_MergeFullSample(Render *re, Scene *sce, bNodeTree *ntree)
/* first call RE_ReadRenderResult on every renderlayer scene. this creates Render structs */
/* tag scenes unread */
- for(scene= G.main->scene.first; scene; scene= scene->id.next)
+ for(scene= re->main->scene.first; scene; scene= scene->id.next)
scene->id.flag |= LIB_DOIT;
for(node= ntree->nodes.first; node; node= node->next) {
@@ -2363,14 +2385,17 @@ static void do_render_composite_fields_blur_3d(Render *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;
+
/* 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);
+ scene_update_for_newframe(re->main, re->scene, re->lay);
if(re->r.scemode & R_FULL_SAMPLE)
do_merge_fullsample(re, ntree);
@@ -2380,7 +2405,8 @@ static void do_render_composite_fields_blur_3d(Render *re)
ntree->stats_draw= NULL;
ntree->test_break= NULL;
- ntree->tbh= ntree->sdh= NULL;
+ ntree->progress= NULL;
+ ntree->tbh= ntree->sdh= ntree->prh= NULL;
}
}
else if(re->r.scemode & R_FULL_SAMPLE)
@@ -2403,6 +2429,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;
@@ -2410,14 +2454,16 @@ static void do_render_seq(Render * re)
RenderResult *rr = re->result;
int cfra = re->r.cfra;
+ re->i.cfra= cfra;
+
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(re->main, (float)cfra); // XXX, was BKE_curframe(re->scene)
}
recurs_depth++;
- ibuf= give_ibuf_seq(re->scene, rr->rectx, rr->recty, cfra, 0, 100.0);
+ ibuf= give_ibuf_seq(re->main, re->scene, rr->rectx, rr->recty, cfra, 0, 100.0);
recurs_depth--;
@@ -2428,7 +2474,21 @@ static void do_render_seq(Render * re)
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);
+ /* color management: when off ensure rectf is non-lin, since thats what the internal
+ * render engine delivers */
+ if(re->r.color_mgt_flag & R_COLOR_MANAGEMENT) {
+ if(ibuf->profile == IB_PROFILE_LINEAR_RGB)
+ memcpy(rr->rectf, ibuf->rect_float, 4*sizeof(float)*rr->rectx*rr->recty);
+ else
+ srgb_to_linearrgb_rgba_rgba_buf(rr->rectf, ibuf->rect_float, rr->rectx*rr->recty);
+
+ }
+ else {
+ if(ibuf->profile != IB_PROFILE_LINEAR_RGB)
+ memcpy(rr->rectf, ibuf->rect_float, 4*sizeof(float)*rr->rectx*rr->recty);
+ else
+ linearrgb_to_srgb_rgba_rgba_buf(rr->rectf, ibuf->rect_float, rr->rectx*rr->recty);
+ }
/* 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 */
@@ -2452,9 +2512,10 @@ static void do_render_seq(Render * re)
if (recurs_depth == 0) { /* with nested scenes, only free on toplevel... */
Editing * ed = re->scene->ed;
if (ed) {
- free_imbuf_seq(re->scene, &ed->seqbase, TRUE);
+ free_imbuf_seq(re->scene, &ed->seqbase, TRUE, TRUE);
}
}
+ IMB_freeImBuf(ibuf);
}
else {
/* render result is delivered empty in most cases, nevertheless we handle all cases */
@@ -2484,7 +2545,7 @@ static void do_render_all_options(Render *re)
if(external_render_3d(re, 1)) {
/* in this case external render overrides all */
}
- else if((re->r.scemode & R_DOSEQ) && re->scene->ed && re->scene->ed->seqbase.first) {
+ 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);
@@ -2620,6 +2681,7 @@ static void update_physics_cache(Render *re, Scene *scene, int anim_init)
{
PTCacheBaker baker;
+ baker.main = re->main;
baker.scene = scene;
baker.pid = NULL;
baker.bake = 0;
@@ -2633,7 +2695,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, unsigned int lay, int anim, int anim_init)
+static int render_initialize_from_main(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *srl, unsigned int lay, int anim, int anim_init)
{
int winx, winy;
rcti disprect;
@@ -2659,6 +2721,7 @@ static int render_initialize_from_scene(Render *re, Scene *scene, SceneRenderLay
disprect.ymax= winy;
}
+ re->main= bmain;
re->scene= scene;
re->lay= lay;
@@ -2701,17 +2764,18 @@ 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, unsigned int lay, int frame)
+void RE_BlenderFrame(Render *re, Main *bmain, 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 */
G.rendering= 1;
scene->r.cfra= frame;
- if(render_initialize_from_scene(re, scene, srl, lay, 0, 0)) {
+ if(render_initialize_from_main(re, bmain, scene, srl, lay, 0, 0)) {
+ MEM_reset_peak_memory();
do_render_all_options(re);
}
-
+
/* UGLY WARNING */
G.rendering= 0;
}
@@ -2803,14 +2867,14 @@ 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, unsigned int lay, int sfra, int efra, int tfra, ReportList *reports)
+void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, unsigned int lay, int sfra, int efra, int tfra, ReportList *reports)
{
bMovieHandle *mh= BKE_get_movie_handle(scene->r.imtype);
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, lay, 0, 1))
+ if(!render_initialize_from_main(re, bmain, scene, NULL, lay, 0, 1))
return;
/* ugly global still... is to prevent renderwin events and signal subsurfs etc to make full resol */
@@ -2843,7 +2907,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, unsigned int lay, int sfra, int ef
char name[FILE_MAX];
/* only border now, todo: camera lens. (ton) */
- render_initialize_from_scene(re, scene, NULL, lay, 1, 0);
+ render_initialize_from_main(re, bmain, scene, NULL, lay, 1, 0);
if(nfra!=scene->r.cfra) {
/*
@@ -2858,7 +2922,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, unsigned int lay, int sfra, int ef
else
updatelay= re->lay;
- scene_update_for_newframe(scene, updatelay);
+ scene_update_for_newframe(bmain, scene, updatelay);
continue;
}
else
@@ -2909,12 +2973,12 @@ void RE_BlenderAnim(Render *re, Scene *scene, unsigned int lay, int sfra, int ef
mh->end_movie();
scene->r.cfra= cfrao;
-
+
/* UGLY WARNING */
G.rendering= 0;
}
-void RE_PreviewRender(Render *re, Scene *sce)
+void RE_PreviewRender(Render *re, Main *bmain, Scene *sce)
{
int winx, winy;
@@ -2923,6 +2987,7 @@ void RE_PreviewRender(Render *re, Scene *sce)
RE_InitState(re, NULL, &sce->r, NULL, winx, winy, NULL);
+ re->main = bmain;
re->scene = sce;
re->lay = sce->lay;
diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c
index d22b24bf544..a09c16b7ed9 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:
@@ -227,6 +226,9 @@ static void pointdensity_cache_object(Render *re, PointDensity *pd, Object *ob)
static void cache_pointdensity(Render *re, Tex *tex)
{
PointDensity *pd = tex->pd;
+
+ if(!pd)
+ return;
if (pd->point_tree) {
BLI_bvhtree_free(pd->point_tree);
@@ -280,7 +282,7 @@ void make_pointdensities(Render *re)
re->i.infostr= "Caching Point Densities";
re->stats_draw(re->sdh, &re->i);
- for (tex= G.main->tex.first; tex; tex= tex->id.next) {
+ for (tex= re->main->tex.first; tex; tex= tex->id.next) {
if(tex->id.us && tex->type==TEX_POINTDENSITY) {
cache_pointdensity(re, tex);
}
@@ -297,7 +299,7 @@ void free_pointdensities(Render *re)
if(re->scene->r.scemode & R_PREVIEWBUTS)
return;
- for (tex= G.main->tex.first; tex; tex= tex->id.next) {
+ for (tex= re->main->tex.first; tex; tex= tex->id.next) {
if(tex->id.us && tex->type==TEX_POINTDENSITY) {
free_pointdensity(re, tex);
}
diff --git a/source/blender/render/intern/source/rayobject_instance.c b/source/blender/render/intern/source/rayobject_instance.c
index c36ab454f3d..25765c4763a 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 015922216f9..724fd9a3110 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
{
@@ -523,10 +531,6 @@ void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
shade_input_set_normals(shi);
- /* point normals to viewing direction */
- if(INPR(shi->facenor, shi->view) < 0.0f)
- shade_input_flip_normals(shi);
-
shade_input_set_shade_texco(shi);
if (shi->mat->material_type == MA_TYPE_VOLUME) {
if(ELEM(is->mode, RE_RAY_SHADOW, RE_RAY_SHADOW_TRA)) {
@@ -550,19 +554,9 @@ void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
shi->mat= vlr->mat; /* shi->mat is being set in nodetree */
}
else {
- int tempdepth;
- /* XXX dodgy business here, set ray depth to -1
- * to ignore raytrace in shade_material_loop()
- * this could really use a refactor --Matt */
- if (shi->volume_depth == 0) {
- tempdepth = shi->depth;
- shi->depth = -1;
- shade_material_loop(shi, shr);
- shi->depth = tempdepth;
- } else {
- shade_material_loop(shi, shr);
- }
+ shade_material_loop(shi, shr);
}
+
/* raytrace likes to separate the spec color */
VECSUB(shr->diff, shr->combined, shr->spec);
}
@@ -1310,7 +1304,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 +1399,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 +1722,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);
}
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index 047bbd7629f..8e1a959abef 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -2619,7 +2619,7 @@ 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;
ListBase threads;
@@ -2634,7 +2634,7 @@ 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 */
@@ -2680,12 +2680,18 @@ 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; a<re->r.threads; a++)
+ /* calculate progress */
+ for(vdone=0, a=0; a<re->r.threads; a++)
+ vdone+= handles[a].vdone;
+ if (progress)
+ *progress = (float)(vdone / (float)re->totvlak);
+
+ for(a=0; a<re->r.threads; a++) {
if(handles[a].ready==0)
break;
+ }
}
/* filter and refresh images */
@@ -2733,12 +2739,10 @@ int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_up
}
/* calculate return value */
- for(a=0; a<re->r.threads; a++) {
- vdone+= handles[a].vdone;
-
+ for(a=0; a<re->r.threads; a++) {
zbuf_free_span(handles[a].zspan);
MEM_freeN(handles[a].zspan);
- }
+ }
MEM_freeN(handles);
diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c
index 2bfc8f6c1ef..ce55935d392 100644
--- a/source/blender/render/intern/source/renderdatabase.c
+++ b/source/blender/render/intern/source/renderdatabase.c
@@ -440,10 +440,9 @@ VlakRen *RE_vlakren_copy(ObjectRen *obr, VlakRen *vlr)
return vlr1;
}
-int RE_vlakren_get_normal(Render *re, ObjectInstanceRen *obi, VlakRen *vlr, float *nor)
+void RE_vlakren_get_normal(Render *re, ObjectInstanceRen *obi, VlakRen *vlr, float *nor)
{
- float v1[3], (*nmat)[3]= obi->nmat;
- int flipped= 0;
+ float (*nmat)[3]= obi->nmat;
if(obi->flag & R_TRANSFORMED) {
VECCOPY(nor, vlr->n);
@@ -453,29 +452,6 @@ int RE_vlakren_get_normal(Render *re, ObjectInstanceRen *obi, VlakRen *vlr, floa
}
else
VECCOPY(nor, vlr->n);
-
- if((vlr->flag & R_NOPUNOFLIP)==0) {
- if(re->r.mode & R_ORTHO) {
- if(nor[2] > 0.0f)
- flipped= 1;
- }
- else {
- VECCOPY(v1, vlr->v1->co);
- if(obi->flag & R_TRANSFORMED)
- mul_m4_v3(obi->mat, v1);
- if(INPR(v1, nor) < 0.0f) {
- flipped= 1;
- }
- }
-
- if(flipped) {
- nor[0]= -nor[0];
- nor[1]= -nor[1];
- nor[2]= -nor[2];
- }
- }
-
- return flipped;
}
void RE_set_customdata_names(ObjectRen *obr, CustomData *data)
diff --git a/source/blender/render/intern/source/shadbuf.c b/source/blender/render/intern/source/shadbuf.c
index 35d969f9f21..7101ce5daaf 100644
--- a/source/blender/render/intern/source/shadbuf.c
+++ b/source/blender/render/intern/source/shadbuf.c
@@ -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 17ca087c52e..56ab56d0411 100644
--- a/source/blender/render/intern/source/shadeinput.c
+++ b/source/blender/render/intern/source/shadeinput.c
@@ -130,7 +130,7 @@ void shade_material_loop(ShadeInput *shi, ShadeResult *shr)
}
/* depth >= 1 when ray-shading */
- if(shi->depth==0) {
+ if(shi->depth==0 || shi->volume_depth > 0) {
if(R.r.mode & R_RAYTRACE) {
if(shi->ray_mirror!=0.0f || ((shi->mat->mode & MA_TRANSP) && (shi->mat->mode & MA_RAYTRANSP) && shr->alpha!=1.0f)) {
/* ray trace works on combined, but gives pass info */
@@ -142,11 +142,6 @@ void shade_material_loop(ShadeInput *shi, ShadeResult *shr)
if((shi->layflag & SCE_LAY_SKY) && (R.r.alphamode==R_ADDSKY))
shr->alpha= 1.0f;
}
-
- if(R.r.mode & R_RAYTRACE) {
- if (R.render_volumes_inside.first)
- shade_volume_inside(shi, shr);
- }
}
@@ -168,8 +163,12 @@ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr)
shade_input_init_material(shi);
if (shi->mat->material_type == MA_TYPE_VOLUME) {
- if(R.r.mode & R_RAYTRACE)
- shade_volume_outside(shi, shr);
+ if(R.r.mode & R_RAYTRACE) {
+ if (R.render_volumes_inside.first)
+ shade_volume_inside(shi, shr);
+ else
+ shade_volume_outside(shi, shr);
+ }
} else { /* MA_TYPE_SURFACE, MA_TYPE_WIRE */
shade_material_loop(shi, shr);
}
@@ -274,12 +273,8 @@ void shade_input_set_triangle_i(ShadeInput *shi, ObjectInstanceRen *obi, VlakRen
shi->mode= shi->mat->mode_l; /* or-ed result for all nodes */
/* 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);
+ shi->flippednor= 0;
+ RE_vlakren_get_normal(&R, obi, vlr, shi->facenor);
/* calculate vertexnormals */
if(vlr->flag & R_SMOOTH) {
@@ -292,24 +287,6 @@ void shade_input_set_triangle_i(ShadeInput *shi, ObjectInstanceRen *obi, VlakRen
mul_m3_v3(obi->nmat, shi->n2);
mul_m3_v3(obi->nmat, shi->n3);
}
-
- if(!(vlr->flag & (R_NOPUNOFLIP|R_TANGENT))) {
- if(INPR(shi->facenor, shi->n1) < 0.0f) {
- shi->n1[0]= -shi->n1[0];
- shi->n1[1]= -shi->n1[1];
- shi->n1[2]= -shi->n1[2];
- }
- if(INPR(shi->facenor, shi->n2) < 0.0f) {
- shi->n2[0]= -shi->n2[0];
- shi->n2[1]= -shi->n2[1];
- shi->n2[2]= -shi->n2[2];
- }
- if(INPR(shi->facenor, shi->n3) < 0.0f) {
- shi->n3[0]= -shi->n3[0];
- shi->n3[1]= -shi->n3[1];
- shi->n3[2]= -shi->n3[2];
- }
- }
}
}
@@ -372,7 +349,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) {
@@ -833,6 +809,10 @@ void shade_input_set_normals(ShadeInput *shi)
/* used in nodes */
VECCOPY(shi->vno, shi->vn);
+ /* flip normals to viewing direction */
+ if(!(shi->vlr->flag & R_TANGENT))
+ if(dot_v3v3(shi->facenor, shi->view) < 0.0f)
+ shade_input_flip_normals(shi);
}
/* use by raytrace, sss, bake to flip into the right direction */
diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c
index 806cafaf89b..81de553b209 100644
--- a/source/blender/render/intern/source/shadeoutput.c
+++ b/source/blender/render/intern/source/shadeoutput.c
@@ -1644,7 +1644,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
if(((passflag & SCE_PASS_COMBINED) && (shi->combinedflag & (SCE_PASS_AO|SCE_PASS_ENVIRONMENT|SCE_PASS_INDIRECT)))
|| (passflag & (SCE_PASS_AO|SCE_PASS_ENVIRONMENT|SCE_PASS_INDIRECT))) {
/* AO was calculated for scanline already */
- if(shi->depth)
+ if(shi->depth || shi->volume_depth)
ambient_occlusion(shi);
VECCOPY(shr->ao, shi->ao);
VECCOPY(shr->env, shi->env); // XXX multiply
diff --git a/source/blender/render/intern/source/sss.c b/source/blender/render/intern/source/sss.c
index 836a60ef4f9..e8c95a34ac4 100644
--- a/source/blender/render/intern/source/sss.c
+++ b/source/blender/render/intern/source/sss.c
@@ -56,7 +56,6 @@
#include "DNA_material_types.h"
#include "BKE_colortools.h"
-#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_node.h"
@@ -779,7 +778,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 */
@@ -988,12 +987,12 @@ 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);
- for(mat= G.main->mat.first; mat; mat= mat->id.next)
+ for(mat= re->main->mat.first; mat; mat= mat->id.next)
if(mat->id.us && (mat->flag & MA_IS_USED) && (mat->sss_flag & MA_DIFF_SSS))
sss_create_tree_mat(re, mat);
}
diff --git a/source/blender/render/intern/source/strand.c b/source/blender/render/intern/source/strand.c
index 1bf1f1fe582..88d042e7b97 100644
--- a/source/blender/render/intern/source/strand.c
+++ b/source/blender/render/intern/source/strand.c
@@ -318,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;
}
@@ -818,7 +818,7 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, APixstrand *apixbuf, ListBa
bounds[2]= (2*pa->disprect.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/texture.c b/source/blender/render/intern/source/texture.c
index 8b33753c2b1..0e98069f884 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
}
}
}
@@ -131,7 +131,7 @@ void init_render_textures(Render *re)
{
Tex *tex;
- tex= G.main->tex.first;
+ tex= re->main->tex.first;
while(tex) {
if(tex->id.us) init_render_texture(re, tex);
tex= tex->id.next;
@@ -144,10 +144,10 @@ void end_render_texture(Tex *tex)
ntreeEndExecTree(tex->nodetree);
}
-void end_render_textures(void)
+void end_render_textures(Render *re)
{
Tex *tex;
- for(tex= G.main->tex.first; tex; tex= tex->id.next)
+ for(tex= re->main->tex.first; tex; tex= tex->id.next)
if(tex->id.us)
end_render_texture(tex);
}
@@ -1731,7 +1731,7 @@ void do_material_tex(ShadeInput *shi)
co= shi->tang; dx= shi->dxno; dy= shi->dyno;
}
else if(mtex->texco==TEXCO_GLOB) {
- co= shi->gl; dx= shi->dxco; dy= shi->dyco;
+ co= shi->gl; dx= shi->dxgl; dy= shi->dygl;
}
else if(mtex->texco==TEXCO_UV) {
if(mtex->texflag & MTEX_DUPLI_MAPTO) {
@@ -1762,7 +1762,7 @@ void do_material_tex(ShadeInput *shi)
// NOTE: test for shi->obr->ob here, since vlr/obr/obi can be 'fake' when called from fastshade(), another reason to move it..
// NOTE: shi->v1 is NULL when called from displace_render_vert, assigning verts in this case is not trivial because the shi quad face side is not know.
if ((mtex->texflag & MTEX_NEW_BUMP) && shi->obr && shi->obr->ob && shi->v1) {
- if(mtex->mapto & (MAP_NORM|MAP_DISPLACE|MAP_WARP) && !((tex->type==TEX_IMAGE) && (tex->imaflag & TEX_NORMALMAP))) {
+ if(mtex->mapto & (MAP_NORM|MAP_WARP) && !((tex->type==TEX_IMAGE) && (tex->imaflag & TEX_NORMALMAP))) {
MTFace* tf = RE_vlakren_get_tface(shi->obr, shi->vlr, i, NULL, 0);
int j1 = shi->i1, j2 = shi->i2, j3 = shi->i3;
@@ -1833,7 +1833,7 @@ void do_material_tex(ShadeInput *shi)
else continue; // can happen when texco defines disappear and it renders old files
/* the pointer defines if bumping happens */
- if(mtex->mapto & (MAP_NORM|MAP_DISPLACE|MAP_WARP)) {
+ if(mtex->mapto & (MAP_NORM|MAP_WARP)) {
texres.nor= norvec;
norvec[0]= norvec[1]= norvec[2]= 0.0;
}
@@ -2219,8 +2219,7 @@ void do_material_tex(ShadeInput *shi)
}
if(rgbnor & TEX_RGB) {
- if(texres.talpha) texres.tin= texres.ta;
- else texres.tin= (0.35f*texres.tr+0.45f*texres.tg+0.2f*texres.tb);
+ texres.tin= (0.35f*texres.tr+0.45f*texres.tg+0.2f*texres.tb);
}
factt= (0.5f-texres.tin)*mtex->dispfac*stencilTin; facmm= 1.0f-factt;
@@ -2510,6 +2509,7 @@ void do_halo_tex(HaloRen *har, float xn, float yn, float *colf)
if (R.r.scemode & R_NO_TEX) return;
mtex= har->mat->mtex[0];
+ if(har->mat->septex & (1<<0)) return;
if(mtex->tex==NULL) return;
/* no normal mapping */
@@ -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;
@@ -2881,6 +2882,9 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef
if(la->type==LA_SPOT) {
tempvec[0]*= la->spottexfac;
tempvec[1]*= la->spottexfac;
+ /* project from 3d to 2d */
+ tempvec[0] /= -tempvec[2];
+ tempvec[1] /= -tempvec[2];
}
co= tempvec;
diff --git a/source/blender/render/intern/source/volume_precache.c b/source/blender/render/intern/source/volume_precache.c
index 0af05c3cdee..d3e8f4058c5 100644
--- a/source/blender/render/intern/source/volume_precache.c
+++ b/source/blender/render/intern/source/volume_precache.c
@@ -115,6 +115,47 @@ int point_inside_obi(RayObject *tree, ObjectInstanceRen *obi, float *co)
else return 1;
}
+/* find the bounding box of an objectinstance in global space */
+void global_bounds_obi(Render *re, ObjectInstanceRen *obi, float *bbmin, float *bbmax)
+{
+ ObjectRen *obr = obi->obr;
+ VolumePrecache *vp = obi->volume_precache;
+ VertRen *ver= NULL;
+ float co[3];
+ int a;
+
+ if (vp->bbmin != NULL && vp->bbmax != NULL) {
+ copy_v3_v3(bbmin, vp->bbmin);
+ copy_v3_v3(bbmax, vp->bbmax);
+ return;
+ }
+
+ vp->bbmin = MEM_callocN(sizeof(float)*3, "volume precache min boundbox corner");
+ vp->bbmax = MEM_callocN(sizeof(float)*3, "volume precache max boundbox corner");
+
+ INIT_MINMAX(bbmin, bbmax);
+
+ for(a=0; a<obr->totvert; a++) {
+ if((a & 255)==0) ver= obr->vertnodes[a>>8].vert;
+ else ver++;
+
+ copy_v3_v3(co, ver->co);
+
+ /* transformed object instance in camera space */
+ if(obi->flag & R_TRANSFORMED)
+ mul_m4_v3(obi->mat, co);
+
+ /* convert to global space */
+ mul_m4_v3(re->viewinv, co);
+
+ DO_MINMAX(co, vp->bbmin, vp->bbmax);
+ }
+
+ copy_v3_v3(bbmin, vp->bbmin);
+ copy_v3_v3(bbmax, vp->bbmax);
+
+}
+
/* *** light cache filtering *** */
static float get_avg_surrounds(float *cache, int *res, int xx, int yy, int zz)
@@ -443,7 +484,7 @@ static void *vol_precache_part(void *data)
RayObject *tree = pa->tree;
ShadeInput *shi = pa->shi;
float scatter_col[3] = {0.f, 0.f, 0.f};
- float co[3];
+ float co[3], cco[3];
int x, y, z, i;
const int res[3]= {pa->res[0], pa->res[1], pa->res[2]};
@@ -455,24 +496,29 @@ static void *vol_precache_part(void *data)
for (x=pa->minx; x < pa->maxx; x++) {
co[0] = pa->bbmin[0] + (pa->voxel[0] * (x + 0.5f));
-
+
+ /* convert from world->camera space for shading */
+ mul_v3_m4v3(cco, pa->viewmat, co);
+
i= V_I(x, y, z, res);
// don't bother if the point is not inside the volume mesh
- if (!point_inside_obi(tree, obi, co)) {
+ if (!point_inside_obi(tree, obi, cco)) {
obi->volume_precache->data_r[i] = -1.0f;
obi->volume_precache->data_g[i] = -1.0f;
obi->volume_precache->data_b[i] = -1.0f;
continue;
}
- copy_v3_v3(shi->view, co);
+ /* this view coordinate is very wrong! */
+ copy_v3_v3(shi->view, cco);
normalize_v3(shi->view);
- vol_get_scattering(shi, scatter_col, co);
+ vol_get_scattering(shi, scatter_col, cco);
obi->volume_precache->data_r[i] = scatter_col[0];
obi->volume_precache->data_g[i] = scatter_col[1];
obi->volume_precache->data_b[i] = scatter_col[2];
+
}
}
}
@@ -503,7 +549,7 @@ static void precache_init_parts(Render *re, RayObject *tree, ShadeInput *shi, Ob
int i=0, x, y, z;
float voxel[3];
int sizex, sizey, sizez;
- float *bbmin=obi->obr->boundbox[0], *bbmax=obi->obr->boundbox[1];
+ float bbmin[3], bbmax[3];
int *res;
int minx, maxx;
int miny, maxy;
@@ -517,11 +563,13 @@ static void precache_init_parts(Render *re, RayObject *tree, ShadeInput *shi, Ob
parts[0] = parts[1] = parts[2] = totthread;
res = vp->res;
+ /* using boundbox in worldspace */
+ global_bounds_obi(re, obi, bbmin, bbmax);
sub_v3_v3v3(voxel, bbmax, bbmin);
- voxel[0] /= res[0];
- voxel[1] /= res[1];
- voxel[2] /= res[2];
+ voxel[0] /= (float)res[0];
+ voxel[1] /= (float)res[1];
+ voxel[2] /= (float)res[2];
for (x=0; x < parts[0]; x++) {
sizex = ceil(res[0] / (float)parts[0]);
@@ -550,8 +598,10 @@ static void precache_init_parts(Render *re, RayObject *tree, ShadeInput *shi, Ob
pa->tree = tree;
pa->shi = shi;
pa->obi = obi;
- VECCOPY(pa->bbmin, bbmin);
- VECCOPY(pa->voxel, voxel);
+ copy_m4_m4(pa->viewmat, re->viewmat);
+
+ copy_v3_v3(pa->bbmin, bbmin);
+ copy_v3_v3(pa->voxel, voxel);
VECCOPY(pa->res, res);
pa->minx = minx; pa->maxx = maxx;
@@ -582,10 +632,14 @@ static VolPrecachePart *precache_get_new_part(Render *re)
return nextpa;
}
-static int precache_resolution(VolumePrecache *vp, float *bbmin, float *bbmax, int res)
+/* calculate resolution from bounding box in world space */
+static int precache_resolution(Render *re, VolumePrecache *vp, ObjectInstanceRen *obi, int res)
{
float dim[3], div;
+ float bbmin[3], bbmax[3];
+ /* bound box in global space */
+ global_bounds_obi(re, obi, bbmin, bbmax);
sub_v3_v3v3(dim, bbmax, bbmin);
div = MAX3(dim[0], dim[1], dim[2]);
@@ -593,9 +647,9 @@ static int precache_resolution(VolumePrecache *vp, float *bbmin, float *bbmax, i
dim[1] /= div;
dim[2] /= div;
- vp->res[0] = dim[0] * (float)res;
- vp->res[1] = dim[1] * (float)res;
- vp->res[2] = dim[2] * (float)res;
+ vp->res[0] = ceil(dim[0] * res);
+ vp->res[1] = ceil(dim[1] * res);
+ vp->res[2] = ceil(dim[2] * res);
if ((vp->res[0] < 1) || (vp->res[1] < 1) || (vp->res[2] < 1))
return 0;
@@ -615,7 +669,6 @@ void vol_precache_objectinstance_threads(Render *re, ObjectInstanceRen *obi, Mat
RayObject *tree;
ShadeInput shi;
ListBase threads;
- float *bbmin=obi->obr->boundbox[0], *bbmax=obi->obr->boundbox[1];
int parts[3] = {1, 1, 1}, totparts;
int caching=1, counter=0;
@@ -627,15 +680,13 @@ void vol_precache_objectinstance_threads(Render *re, ObjectInstanceRen *obi, Mat
/* create a raytree with just the faces of the instanced ObjectRen,
* used for checking if the cached point is inside or outside. */
- //tree = create_raytree_obi(obi, bbmin, bbmax);
tree = makeraytree_object(&R, obi);
if (!tree) return;
- INIT_MINMAX(bbmin, bbmax);
- RE_rayobject_merge_bb( tree, bbmin, bbmax);
vp = MEM_callocN(sizeof(VolumePrecache), "volume light cache");
+ obi->volume_precache = vp;
- if (!precache_resolution(vp, bbmin, bbmax, ma->vol.precache_resolution)) {
+ if (!precache_resolution(re, vp, obi, ma->vol.precache_resolution)) {
MEM_freeN(vp);
vp = NULL;
return;
@@ -649,7 +700,6 @@ void vol_precache_objectinstance_threads(Render *re, ObjectInstanceRen *obi, Mat
vp = NULL;
return;
}
- obi->volume_precache = vp;
/* Need a shadeinput to calculate scattering */
precache_setup_shadeinput(re, obi, ma, &shi);
@@ -749,6 +799,8 @@ void free_volume_precache(Render *re)
MEM_freeN(obi->volume_precache->data_r);
MEM_freeN(obi->volume_precache->data_g);
MEM_freeN(obi->volume_precache->data_b);
+ MEM_freeN(obi->volume_precache->bbmin);
+ MEM_freeN(obi->volume_precache->bbmax);
MEM_freeN(obi->volume_precache);
obi->volume_precache = NULL;
}
diff --git a/source/blender/render/intern/source/volumetric.c b/source/blender/render/intern/source/volumetric.c
index 99c27aaf81e..a58d96736d5 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]);
}
@@ -197,7 +193,7 @@ static void vol_trace_behind(ShadeInput *shi, VlakRen *vlr, float *co, float *co
isect.labda = FLT_MAX;
isect.mode= RE_RAY_MIRROR;
- isect.skip = RE_SKIP_VLR_NEIGHBOUR | RE_SKIP_VLR_RENDER_CHECK;
+ isect.skip = RE_SKIP_VLR_NEIGHBOUR;
isect.orig.ob = (void*) shi->obi;
isect.orig.face = (void*)vlr;
isect.last_hit = NULL;
@@ -209,27 +205,28 @@ static void vol_trace_behind(ShadeInput *shi, VlakRen *vlr, float *co, float *co
} else {
shadeSkyView(col, co, shi->view, NULL, shi->thread);
shadeSunView(col, shi->view);
- }
+ }
}
/* trilinear interpolation */
-static void vol_get_precached_scattering(ShadeInput *shi, float *scatter_col, float *co)
+static void vol_get_precached_scattering(Render *re, ShadeInput *shi, float *scatter_col, float *co)
{
VolumePrecache *vp = shi->obi->volume_precache;
float bbmin[3], bbmax[3], dim[3];
- float sample_co[3];
+ float world_co[3], sample_co[3];
if (!vp) return;
- /* convert input coords to 0.0, 1.0 */
- VECCOPY(bbmin, shi->obi->obr->boundbox[0]);
- VECCOPY(bbmax, shi->obi->obr->boundbox[1]);
+ /* find sample point in global space bounding box 0.0-1.0 */
+ global_bounds_obi(re, shi->obi, bbmin, bbmax);
sub_v3_v3v3(dim, bbmax, bbmin);
+ mul_v3_m4v3(world_co, re->viewinv, co);
- sample_co[0] = ((co[0] - bbmin[0]) / dim[0]);
- sample_co[1] = ((co[1] - bbmin[1]) / dim[1]);
- sample_co[2] = ((co[2] - bbmin[2]) / dim[2]);
+ /* sample_co in 0.0-1.0 */
+ sample_co[0] = (world_co[0] - bbmin[0]) / dim[0];
+ sample_co[1] = (world_co[1] - bbmin[1]) / dim[1];
+ sample_co[2] = (world_co[2] - bbmin[2]) / dim[2];
scatter_col[0] = voxel_sample_triquadratic(vp->data_r, vp->res, sample_co);
scatter_col[1] = voxel_sample_triquadratic(vp->data_g, vp->res, sample_co);
@@ -449,13 +446,13 @@ static void vol_get_transmittance(ShadeInput *shi, float *tr, float *co, float *
const float stepd = (t0 - pt0) * d;
float sigma_t[3];
- vol_get_sigma_t(shi, sigma_t, co);
+ vol_get_sigma_t(shi, sigma_t, p);
tau[0] += stepd * sigma_t[0];
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 +558,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);
}
}
}
@@ -606,13 +603,16 @@ static void volumeintegrate(struct ShadeInput *shi, float *col, float *co, float
const float density = vol_get_density(shi, p);
if (density > 0.01f) {
- float scatter_col[3], emit_col[3];
+ float scatter_col[3] = {0.f, 0.f, 0.f}, emit_col[3];
const float stepd = (t0 - pt0) * density;
/* transmittance component (alpha) */
vol_get_transmittance_seg(shi, tr, stepsize, co, density);
- if (luminance(tr) < shi->mat->vol.depth_cutoff) break;
+ if (t0 > t1 * 0.25) {
+ /* only use depth cutoff after we've traced a little way into the volume */
+ if (luminance(tr) < shi->mat->vol.depth_cutoff) break;
+ }
vol_get_emission(shi, emit_col, p);
@@ -623,7 +623,7 @@ static void volumeintegrate(struct ShadeInput *shi, float *col, float *co, float
p2[1] = p[1] + (step_vec[1] * 0.5);
p2[2] = p[2] + (step_vec[2] * 0.5);
- vol_get_precached_scattering(shi, scatter_col, p2);
+ vol_get_precached_scattering(&R, shi, scatter_col, p2);
} else
vol_get_scattering(shi, scatter_col, p);
@@ -631,12 +631,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);
@@ -786,10 +786,7 @@ void shade_volume_inside(ShadeInput *shi, ShadeResult *shr)
MatInside *m;
Material *mat_backup;
ObjectInstanceRen *obi_backup;
- float prev_alpha = shr->alpha;
-
- //if (BLI_countlist(&R.render_volumes_inside) == 0) return;
-
+
/* XXX: extend to multiple volumes perhaps later */
mat_backup = shi->mat;
obi_backup = shi->obi;
@@ -799,10 +796,10 @@ void shade_volume_inside(ShadeInput *shi, ShadeResult *shr)
shi->obi = m->obi;
shi->obr = m->obi->obr;
- volume_trace(shi, shr, VOL_SHADE_INSIDE);
- shr->alpha += prev_alpha;
- CLAMP(shr->alpha, 0.f, 1.f);
+ memset(shr, 0, sizeof(ShadeResult));
+ volume_trace(shi, shr, VOL_SHADE_INSIDE);
+
shi->mat = mat_backup;
shi->obi = obi_backup;
shi->obr = obi_backup->obr;
diff --git a/source/blender/render/intern/source/voxeldata.c b/source/blender/render/intern/source/voxeldata.c
index 762848c402a..076d6355585 100644
--- a/source/blender/render/intern/source/voxeldata.c
+++ b/source/blender/render/intern/source/voxeldata.c
@@ -39,7 +39,6 @@
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
-#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_modifier.h"
@@ -57,58 +56,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; i<size; i++) {
- F[i] = (float)tmp[i] / 256.f;
+ vd->dataset[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 +129,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 +147,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 +178,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,53 +248,65 @@ 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;
+ /* only re-cache if dataset needs updating */
+ if ((vd->flag & TEX_VD_STILL) || (vd->cachedframe == re->r.cfra))
+ if (vd->ok) return;
+
+ /* 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 (!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;
- }
- }
-
- 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;
+ 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)
@@ -289,7 +317,7 @@ void make_voxeldata(struct Render *re)
re->stats_draw(re->sdh, &re->i);
/* XXX: should be doing only textures used in this render */
- for (tex= G.main->tex.first; tex; tex= tex->id.next) {
+ for (tex= re->main->tex.first; tex; tex= tex->id.next) {
if(tex->id.us && tex->type==TEX_VOXELDATA) {
cache_voxeldata(re, tex);
}
@@ -300,29 +328,6 @@ 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;
@@ -339,7 +344,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/verify/Makefile b/source/blender/verify/Makefile
index 88ac835c505..4451d5baf22 100644
--- a/source/blender/verify/Makefile
+++ b/source/blender/verify/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/verify/intern/BLO_verify.c b/source/blender/verify/intern/BLO_verify.c
index 33e48185e81..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 <config.h>
-#endif
-
static struct BLO_SignerInfo g_SignerInfo = {"", "", ""};
struct verifyStructType {
diff --git a/source/blender/verify/intern/Makefile b/source/blender/verify/intern/Makefile
index 5f1cac41e28..009fd1c6e28 100644
--- a/source/blender/verify/intern/Makefile
+++ b/source/blender/verify/intern/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/windowmanager/CMakeLists.txt b/source/blender/windowmanager/CMakeLists.txt
index 6db32f8bba9..ce7474af477 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 90621f66057..1596921b5ee 100644
--- a/source/blender/windowmanager/Makefile
+++ b/source/blender/windowmanager/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) Blender Foundation.
# All rights reserved.
diff --git a/source/blender/windowmanager/SConscript b/source/blender/windowmanager/SConscript
index 0a86133e614..179b1ddc998 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 c005fd5828c..9fe09c0836c 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -57,7 +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);
+int WM_init_game (struct bContext *C);
void WM_init_splash (struct bContext *C);
@@ -78,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, int copy);
void WM_read_autosavefile(struct bContext *C);
void WM_autosave_init (struct wmWindowManager *wm);
@@ -184,7 +184,7 @@ 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);
@@ -201,7 +201,6 @@ void WM_operator_free (struct wmOperator *op);
void WM_operator_stack_clear(struct bContext *C);
struct wmOperatorType *WM_operatortype_find(const char *idnamem, int quiet);
-struct wmOperatorType *WM_operatortype_exists(const char *idname);
struct wmOperatorType *WM_operatortype_first(void);
void WM_operatortype_append (void (*opfunc)(struct wmOperatorType*));
void WM_operatortype_append_ptr (void (*opfunc)(struct wmOperatorType*, void *), void *userdata);
@@ -223,7 +222,7 @@ 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);
@@ -234,6 +233,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);
@@ -299,26 +307,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_kill(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 78b19db5fc8..c84a5e64889 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -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 */
@@ -277,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 ************** */
@@ -327,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 */
@@ -496,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/Makefile b/source/blender/windowmanager/intern/Makefile
index 18085194405..60be5fed4b2 100644
--- a/source/blender/windowmanager/intern/Makefile
+++ b/source/blender/windowmanager/intern/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/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c
index cfeccfd7f62..8d36711032b 100644
--- a/source/blender/windowmanager/intern/wm.c
+++ b/source/blender/windowmanager/intern/wm.c
@@ -26,12 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "string.h"
+#include <string.h>
+#include <stddef.h>
#include "DNA_windowmanager_types.h"
-#include "MEM_guardedalloc.h"
-
#include "GHOST_C-api.h"
#include "BLI_blenlib.h"
@@ -53,6 +52,8 @@
#include "wm_draw.h"
#include "wm.h"
+#include "MEM_guardedalloc.h"
+
#include "ED_screen.h"
#include "BPY_extern.h"
@@ -98,13 +99,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);
@@ -116,14 +122,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);
}
@@ -137,6 +138,7 @@ void WM_operator_stack_clear(bContext *C)
WM_operator_free(op);
}
+ WM_event_add_notifier(C, NC_WM|ND_HISTORY, NULL);
}
/* ****************************************** */
@@ -148,9 +150,9 @@ MenuType *WM_menutype_find(const char *idname, int quiet)
MenuType* mt;
if (idname[0]) {
- for(mt=menutypes.first; mt; mt=mt->next)
- if(strcmp(idname, mt->idname)==0)
- return mt;
+ mt= BLI_findstring(&menutypes, idname, offsetof(MenuType, idname));
+ if(mt)
+ return mt;
}
if(!quiet)
@@ -307,7 +309,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_dragdrop.c b/source/blender/windowmanager/intern/wm_dragdrop.c
index 3d519a5609b..18b1e7239ed 100644
--- a/source/blender/windowmanager/intern/wm_dragdrop.c
+++ b/source/blender/windowmanager/intern/wm_dragdrop.c
@@ -26,7 +26,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "string.h"
+#include <string.h>
#include "DNA_windowmanager_types.h"
#include "DNA_screen_types.h"
diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c
index 008abceba4c..aa26d4444b1 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -48,6 +48,7 @@
#include "ED_screen.h"
+#include "GPU_draw.h"
#include "GPU_extensions.h"
#include "WM_api.h"
@@ -100,6 +101,14 @@ static void wm_area_mark_invalid_backbuf(ScrArea *sa)
((View3D*)sa->spacedata.first)->flag |= V3D_INVALID_BACKBUF;
}
+static int wm_area_test_invalid_backbuf(ScrArea *sa)
+{
+ if(sa->spacetype == SPACE_VIEW3D)
+ return (((View3D*)sa->spacedata.first)->flag & V3D_INVALID_BACKBUF);
+ else
+ return 1;
+}
+
/********************** draw all **************************/
/* - reference method, draw all each time */
@@ -188,6 +197,12 @@ static void wm_method_draw_overlap_all(bContext *C, wmWindow *win, int exchange)
ARegion *ar;
static rcti rect= {0, 0, 0, 0};
+ /* after backbuffer selection draw, we need to redraw */
+ for(sa= screen->areabase.first; sa; sa= sa->next)
+ for(ar= sa->regionbase.first; ar; ar= ar->next)
+ if(ar->swinid && !wm_area_test_invalid_backbuf(sa))
+ ED_region_tag_redraw(ar);
+
/* flush overlapping regions */
if(screen->regionbase.first) {
/* flush redraws of area regions up to overlapping regions */
@@ -388,6 +403,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 +575,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 +658,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;
@@ -667,14 +691,27 @@ static int wm_draw_update_test_window(wmWindow *win)
static int wm_automatic_draw_method(wmWindow *win)
{
+ /* Ideally all cards would work well with triple buffer, since if it works
+ well gives the least redraws and is considerably faster at partial redraw
+ for sculpting or drawing overlapping menus. For typically lower end cards
+ copy to texture is slow though and so we use overlap instead there. */
+
if(win->drawmethod == USER_DRAW_AUTOMATIC) {
/* ATI opensource driver is known to be very slow at this */
if(GPU_type_matches(GPU_DEVICE_ATI, GPU_OS_UNIX, GPU_DRIVER_OPENSOURCE))
return USER_DRAW_OVERLAP;
+ /* also Intel drivers are slow */
+ else if(GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_UNIX, GPU_DRIVER_ANY))
+ return USER_DRAW_OVERLAP;
+ else if(GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_WIN, GPU_DRIVER_ANY))
+ return USER_DRAW_OVERLAP_FLIP;
+ else if(GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_MAC, GPU_DRIVER_ANY))
+ return USER_DRAW_OVERLAP_FLIP;
/* 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_24bit_color_support())
+ /* drawing lower color depth again degrades colors each time */
+ else if(GPU_color_depth() < 24)
return USER_DRAW_OVERLAP;
else
return USER_DRAW_TRIPLE;
@@ -686,8 +723,11 @@ static int wm_automatic_draw_method(wmWindow *win)
void wm_tag_redraw_overlay(wmWindow *win, ARegion *ar)
{
/* for draw triple gestures, paint cursors don't need region redraw */
- if(ar && win && wm_automatic_draw_method(win) != USER_DRAW_TRIPLE)
- ED_region_tag_redraw(ar);
+ 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)
@@ -695,6 +735,8 @@ 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) {
@@ -766,3 +808,11 @@ void wm_draw_region_clear(wmWindow *win, ARegion *ar)
win->screen->do_draw= 1;
}
+void wm_draw_region_modified(wmWindow *win, ARegion *ar)
+{
+ int drawmethod= wm_automatic_draw_method(win);
+
+ if(ELEM(drawmethod, USER_DRAW_OVERLAP, USER_DRAW_OVERLAP_FLIP))
+ ED_region_tag_redraw(ar);
+}
+
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 19a7ae38b7f..e1fc934ee3e 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -234,8 +234,15 @@ void wm_event_do_notifiers(bContext *C)
}
}
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);
+ }
}
}
@@ -289,7 +296,7 @@ void wm_event_do_notifiers(bContext *C)
/* XXX make lock in future, or separated derivedmesh users in scene */
if(!G.rendering)
/* depsgraph & animation: update tagged datablocks */
- scene_update_tagged(win->screen->scene);
+ scene_update_tagged(CTX_data_main(C), win->screen->scene);
}
CTX_wm_window_set(C, NULL);
@@ -372,15 +379,66 @@ 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;
+ }
+}
+
+/* this function is mainly to check that the rules for freeing
+ * an operator are kept in sync.
+ */
+static int wm_operator_register_check(wmWindowManager *wm, wmOperatorType *ot)
+{
+ return (wm->op_undo_depth == 0) && (ot->flag & OPTYPE_REGISTER);
+}
+
static void wm_operator_finished(bContext *C, wmOperator *op, int repeat)
{
wmWindowManager *wm= CTX_wm_manager(C);
op->customdata= NULL;
- /* add reports to the global list, otherwise they are not seen */
- addlisttolist(&CTX_wm_reports(C)->list, &op->reports->list);
-
/* we don't want to do undo pushes for operators that are being
called from operators that already do an undo push. usually
this will happen for python operators that call C operators */
@@ -395,7 +453,7 @@ static void wm_operator_finished(bContext *C, wmOperator *op, int repeat)
MEM_freeN(buf);
}
- if((wm->op_undo_depth == 0) && (op->type->flag & OPTYPE_REGISTER))
+ if(wm_operator_register_check(wm, op->type))
wm_operator_register(C, op);
else
WM_operator_free(op);
@@ -420,13 +478,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);
@@ -534,13 +591,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);
@@ -570,7 +620,7 @@ int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, PointerR
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) {
@@ -579,23 +629,19 @@ int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, PointerR
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) {
@@ -763,17 +809,17 @@ int WM_operator_name_call(bContext *C, const char *opstring, int context, Pointe
}
/* Similar to WM_operator_name_call called with WM_OP_EXEC_DEFAULT context.
- - wmOperatorType is used instead of operator name since python alredy has the operator type
+ - wmOperatorType is used instead of operator name since python already has the operator type
- poll() must be called by python before this runs.
- reports can be passed to this function (so python can report them as exceptions)
*/
int WM_operator_call_py(bContext *C, wmOperatorType *ot, int context, PointerRNA *properties, ReportList *reports)
{
+ wmWindowManager *wm= CTX_wm_manager(C);
int retval= OPERATOR_CANCELLED;
#if 0
wmOperator *op;
- wmWindowManager *wm= CTX_wm_manager(C);
op= wm_operator_create(wm, ot, properties, reports);
if (op->type->exec) {
@@ -782,7 +828,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
@@ -792,9 +838,9 @@ int WM_operator_call_py(bContext *C, wmOperatorType *ot, int context, PointerRNA
retval= wm_operator_call_internal(C, ot, context, properties, reports);
/* keep the reports around if needed later */
- if (retval & OPERATOR_RUNNING_MODAL || ot->flag & OPTYPE_REGISTER)
+ if (retval & OPERATOR_RUNNING_MODAL || wm_operator_register_check(wm, ot))
{
- reports->flag |= RPT_FREE;
+ reports->flag |= RPT_FREE; /* let blender manage freeing */
}
return retval;
@@ -1072,7 +1118,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! */
@@ -1084,17 +1130,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;
@@ -1187,7 +1227,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));
@@ -1206,8 +1245,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;
@@ -1217,7 +1259,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)
@@ -1240,6 +1282,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);
}
@@ -1263,8 +1309,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;
}
@@ -1397,6 +1441,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);
}
@@ -1544,31 +1590,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 = sound_sync_scene(scene) * FPS + 0.5;
+ 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);
@@ -1579,6 +1624,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);
@@ -1627,7 +1675,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);
}
@@ -1681,6 +1729,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 */
@@ -1693,6 +1743,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;
@@ -1957,7 +2009,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) {
@@ -2100,6 +2152,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
@@ -2118,6 +2171,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);
@@ -2127,11 +2186,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 f79b083857e..b24e0333bac 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -30,6 +30,7 @@
*/
#include <stdio.h>
#include <string.h>
+#include <errno.h>
#ifdef WIN32
#include <windows.h> /* 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"
@@ -77,10 +79,15 @@
#include "RNA_access.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"
@@ -97,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:
@@ -172,21 +179,23 @@ static void wm_window_match_do(bContext *C, ListBase *oldwmlist)
/* we've read file without wm..., keep current one entirely alive */
if(G.main->wm.first==NULL) {
- bScreen *screen= CTX_wm_screen(C);
-
- /* match oldwm to new dbase, only old files */
-
- for(wm= oldwmlist->first; wm; wm= wm->id.next) {
-
- for(win= wm->windows.first; win; win= win->next) {
- /* all windows get active screen from file */
- if(screen->winid==0)
- win->screen= screen;
- else
- win->screen= ED_screen_duplicate(win, screen);
+ /* when loading without UI, no matching needed */
+ if(!(G.fileflags & G_FILE_NO_UI)) {
+ bScreen *screen= CTX_wm_screen(C);
+
+ /* match oldwm to new dbase, only old files */
+ for(wm= oldwmlist->first; wm; wm= wm->id.next) {
- BLI_strncpy(win->screenname, win->screen->id.name+2, 21);
- win->screen->winid= win->winid;
+ for(win= wm->windows.first; win; win= win->next) {
+ /* all windows get active screen from file */
+ if(screen->winid==0)
+ win->screen= screen;
+ else
+ win->screen= ED_screen_duplicate(win, screen);
+
+ BLI_strncpy(win->screenname, win->screen->id.name+2, 21);
+ win->screen->winid= win->winid;
+ }
}
}
@@ -215,7 +224,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;
@@ -244,8 +255,8 @@ static void wm_init_userdef(bContext *C)
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);
}
@@ -254,6 +265,9 @@ 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) */
@@ -286,7 +300,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();
@@ -296,17 +311,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(CTX_data_main(C));
+
#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");
}
}
@@ -314,21 +334,30 @@ void WM_read_file(bContext *C, char *name, ReportList *reports)
/* called on startup, (context entirely filled with NULLs) */
/* or called for 'New File' */
/* op can be NULL */
+/* note: G.sce is used to store the last saved path so backup and restore after loading
+ * G.main->name is similar to G.sce but when loading from memory set the name to startup.blend
+ * ...this could be changed but seems better then setting to "" */
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 */
@@ -341,7 +370,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);
}
@@ -350,7 +379,8 @@ int WM_read_homefile(bContext *C, wmOperator *op)
WM_check(C); /* opens window(s), checks keymaps */
strcpy(G.sce, scestr); /* restore */
-
+ G.main->name[0]= '\0';
+
wm_init_userdef(C);
/* When loading factory settings, the reset solid OpenGL lights need to be applied. */
@@ -358,7 +388,7 @@ int WM_read_homefile(bContext *C, wmOperator *op)
/* XXX */
G.save_over = 0; // start with save preference untitled.blend
- G.fileflags &= ~G_FILE_AUTOPLAY; /* disable autoplay in .B.blend... */
+ G.fileflags &= ~G_FILE_AUTOPLAY; /* disable autoplay in startup.blend... */
// mainwindow_set_filename_to_title(""); // empty string re-initializes title to "Blender"
// refresh_interface_font();
@@ -366,6 +396,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(CTX_data_main(C));
WM_event_add_notifier(C, NC_WM|ND_FILEREAD, NULL);
CTX_wm_window_set(C, NULL); /* exits queues */
@@ -374,20 +407,24 @@ 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;
- /* read list of recent opend files from .Blog to memory */
+ /* read list of recent opend files from recent-files.txt to memory */
for (l= lines, num= 0; l && (num<U.recent_files); l= l->next) {
line = l->link;
if (line[0] && BLI_exists(line)) {
@@ -396,55 +433,52 @@ 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++;
}
}
-
- if(G.sce[0] == 0)
- BLI_make_file_string("/", G.sce, BLI_gethome(), "untitled.blend");
BLI_free_file_lines(lines);
}
-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)) {
+ /* refresh recent-files.txt of recent opened files, when current file was changed */
+ 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);
+ /* write current file to recent-files.txt */
+ fprintf(fp, "%s\n", recent->filepath);
recent = recent->next;
i=1;
- /* write rest of recent opened files to .Blog */
+ /* write rest of recent opened files to recent-files.txt */
while((i<U.recent_files) && (recent)){
/* this prevents to have duplicities in list */
- if (strcmp(recent->filename, 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;
}
@@ -480,25 +514,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, IB_rect, 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, int copy)
{
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;
}
}
@@ -520,14 +619,20 @@ void WM_write_file(bContext *C, char *target, int fileflags, ReportList *reports
ED_object_exit_editmode(C, EM_DO_UNDO);
ED_sculpt_force_update(C);
+ /* blend file thumbnail */
+ ibuf_thumb= blend_file_thumb(di, CTX_data_scene(C), &thumb);
+
+ /* rename to .blend1, do this as last before write */
do_history(di, reports);
-
- if (BLO_write_file(CTX_data_main(C), di, fileflags, reports)) {
- strcpy(G.sce, di);
- G.relbase_valid = 1;
- strcpy(G.main->name, di); /* is guaranteed current file */
- G.save_over = 1; /* disable untitled.blend convention */
+ if (BLO_write_file(CTX_data_main(C), di, fileflags, reports, thumb)) {
+ if(!copy) {
+ strcpy(G.sce, di);
+ G.relbase_valid = 1;
+ strcpy(G.main->name, di); /* is guaranteed current file */
+
+ G.save_over = 1; /* disable untitled.blend convention */
+ }
if(fileflags & G_FILE_COMPRESS) G.fileflags |= G_FILE_COMPRESS;
else G.fileflags &= ~G_FILE_COMPRESS;
@@ -535,10 +640,24 @@ void WM_write_file(bContext *C, char *target, int fileflags, ReportList *reports
if(fileflags & G_FILE_AUTOPLAY) G.fileflags |= G_FILE_AUTOPLAY;
else G.fileflags &= ~G_FILE_AUTOPLAY;
- writeBlog();
+ 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 */
@@ -553,12 +672,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_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;
@@ -571,21 +691,22 @@ void wm_autosave_location(char *filename)
{
char pidstr[32];
#ifdef WIN32
- char subdir[9];
- char savedir[FILE_MAXDIR];
+ char *savedir;
#endif
sprintf(pidstr, "%d.blend", abs(getpid()));
#ifdef WIN32
+ /* XXX Need to investigate how to handle default location of '/tmp/'
+ * This is a relative directory on Windows, and it may be
+ * found. Example:
+ * Blender installed on D:\ drive, D:\ drive has D:\tmp\
+ * Now, BLI_exists() will find '/tmp/' exists, but
+ * BLI_make_file_string will create string that has it most likely on C:\
+ * through get_default_root().
+ * If there is no C:\tmp autosave fails. */
if (!BLI_exists(U.tempdir)) {
- BLI_strncpy(subdir, "autosave", sizeof(subdir));
- BLI_make_file_string("/", savedir, BLI_gethome(), subdir);
-
- /* create a new autosave dir
- * function already checks for existence or not */
- BLI_recurdir_fileops(savedir);
-
+ savedir = BLI_get_folder_create(BLENDER_USER_AUTOSAVE, NULL);
BLI_make_file_string("/", filename, savedir, pidstr);
return;
}
@@ -627,7 +748,7 @@ void wm_autosave_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt)
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_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c
index 862255d7cd5..4d4e399a1c7 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -49,6 +49,7 @@
#include "BKE_font.h"
#include "BKE_global.h"
#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_mball.h"
#include "BKE_report.h"
#include "BKE_utildefines.h"
@@ -88,12 +89,13 @@
#include "UI_interface.h"
#include "BLF_api.h"
-#include "gpu_buffers.h"
+#include "GPU_buffers.h"
#include "GPU_extensions.h"
#include "GPU_draw.h"
#include "BKE_depsgraph.h"
#include "BKE_sound.h"
+#include "GHOST_C-api.h"
static void wm_init_reports(bContext *C)
{
@@ -163,7 +165,11 @@ void WM_init(bContext *C, int argc, char **argv)
G.ndofdevice = -1; /* XXX bad initializer, needs set otherwise buttons show! */
- read_Blog();
+ read_history();
+
+ if(G.sce[0] == 0)
+ BLI_make_file_string("/", G.sce, BLI_getDefaultDocumentFolder(), "untitled.blend");
+
BLI_strncpy(G.lib, G.sce, FILE_MAX);
}
@@ -182,18 +188,115 @@ void WM_init_splash(bContext *C)
}
}
-void WM_init_game(bContext *C)
+static ScrArea *biggest_view3d(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) {
+ if(sa->spacetype==SPACE_VIEW3D) {
+ size= sa->winx * sa->winy;
+ if(size > maxsize) {
+ maxsize= size;
+ big= sa;
+ }
+ }
+ }
+ return big;
+}
+
+int 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);
+ wmWindow* win;
+
+ ScrArea *sa;
+ ARegion *ar;
+
+ Scene *scene= CTX_data_scene(C);
+
+ if (!scene) {
+ // XXX, this should not be needed.
+ Main *bmain = CTX_data_main(C);
+ scene= bmain->scene.first;
+ }
+
+ win = wm->windows.first;
+
+ //first to get a valid window
+ if(win)
+ CTX_wm_window_set(C, win);
+
+ sa = biggest_view3d(C);
+
+ if(sa)
+ {
+ for(ar=sa->regionbase.first; ar; ar=ar->next) {
+ if(ar->regiontype == RGN_TYPE_WINDOW) {
+ break;
+ }
+ }
+ }
+
+ // if we have a valid 3D view
+ if (sa && ar) {
+ ARegion *arhide;
+
+ CTX_wm_area_set(C, sa);
+ CTX_wm_region_set(C, ar);
+
+ /* disable quad view */
+ if(ar->alignment == RGN_ALIGN_QSPLIT)
+ WM_operator_name_call(C, "SCREEN_OT_region_quadview", WM_OP_EXEC_DEFAULT, NULL);
+
+ /* toolbox, properties panel and header are hidden */
+ for(arhide=sa->regionbase.first; arhide; arhide=arhide->next) {
+ if(arhide->regiontype != RGN_TYPE_WINDOW) {
+ if(!(arhide->flag & RGN_FLAG_HIDDEN)) {
+ ED_region_toggle_hidden(C, arhide);
+ }
+ }
+ }
+
+ /* full screen the area */
+ if(!sa->full) {
+ ED_screen_full_toggle(C, wm->windows.first, sa);
+ }
+
+ /* Fullscreen */
+ if(scene->gm.fullscreen) {
+ WM_operator_name_call(C, "WM_OT_window_fullscreen_toggle", WM_OP_EXEC_DEFAULT, NULL);
+ wm_get_screensize(&ar->winrct.xmax, &ar->winrct.ymax);
+ }
+ else
+ {
+ GHOST_RectangleHandle rect = GHOST_GetClientBounds(win->ghostwin);
+ ar->winrct.ymax = GHOST_GetHeightRectangle(rect);
+ ar->winrct.xmax = GHOST_GetWidthRectangle(rect);
+ GHOST_DisposeRectangle(rect);
+ }
+
WM_operator_name_call(C, "VIEW3D_OT_game_start", WM_OP_EXEC_DEFAULT, NULL);
- CTX_wm_window_set(C, prevwin);
+
+ return 1;
+ }
+ else
+ {
+ ReportTimerInfo *rti;
+
+ BKE_report(&wm->reports, RPT_ERROR, "No valid 3D View found. Game auto start is not possible.");
+
+ /* After adding the report to the global list, reset the report timer. */
+ WM_event_remove_timer(wm, NULL, wm->reports.reporttimer);
+
+ /* Records time since last report was added */
+ wm->reports.reporttimer = WM_event_add_timer(wm, CTX_wm_window(C), TIMER, 0.02);
+
+ rti = MEM_callocN(sizeof(ReportTimerInfo), "ReportTimerInfo");
+ wm->reports.reporttimer->customdata = rti;
}
+ return 0;
}
/* free strings of open recent files */
@@ -202,7 +305,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));
}
@@ -301,23 +404,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 343b1f68c7f..3ebfac4928c 100644
--- a/source/blender/windowmanager/intern/wm_jobs.c
+++ b/source/blender/windowmanager/intern/wm_jobs.c
@@ -26,6 +26,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <string.h>
+
#include "DNA_windowmanager_types.h"
#include "MEM_guardedalloc.h"
@@ -89,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;
@@ -107,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;
@@ -117,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");
@@ -137,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;
@@ -154,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 */
@@ -177,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;
@@ -244,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);
@@ -266,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)
@@ -290,28 +339,32 @@ 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 WM_jobs_kill(wmWindowManager *wm, void *owner, void *startjob)
{
wmJob *steve;
- for(steve= wm->jobs.first; steve; steve= steve->next)
- if(steve->owner==owner)
- break;
-
- if (steve)
- wm_jobs_kill_job(wm, steve);
+ steve= wm->jobs.first;
+ while(steve) {
+ if(steve->owner==owner || steve->startjob==startjob) {
+ wmJob* bill = steve;
+ steve= steve->next;
+ wm_jobs_kill_job(wm, bill);
+ } else {
+ steve= steve->next;
+ }
+ }
}
@@ -332,6 +385,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;
@@ -347,10 +403,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;
@@ -365,6 +427,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);
@@ -377,6 +441,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) {
@@ -384,5 +452,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 ca6cabe3cce..e79d08dc2f1 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -708,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 8590a8ccbc0..e1d4406f0ac 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -30,6 +30,8 @@
#include <string.h>
#include <ctype.h>
#include <stdio.h>
+#include <stddef.h>
+
#include "DNA_ID.h"
#include "DNA_object_types.h"
@@ -61,6 +63,7 @@
#include "BKE_scene.h"
#include "BKE_screen.h" /* BKE_ST_MAXNAME */
#include "BKE_utildefines.h"
+#include "BKE_idcode.h"
#include "BIF_gl.h"
#include "BIF_glutil.h" /* for paint cursor */
@@ -86,8 +89,6 @@
#include "wm_subwindow.h"
#include "wm_window.h"
-
-
static ListBase global_ops= {NULL, NULL};
/* ************ operator API, exported ********** */
@@ -99,11 +100,11 @@ wmOperatorType *WM_operatortype_find(const char *idname, int quiet)
char idname_bl[OP_MAX_TYPENAME]; // XXX, needed to support python style names without the _OT_ syntax
WM_operator_bl_idname(idname_bl, idname);
-
+
if (idname_bl[0]) {
- for(ot= global_ops.first; ot; ot= ot->next) {
- if(strncmp(ot->idname, idname_bl, OP_MAX_TYPENAME)==0)
- return ot;
+ ot= (wmOperatorType *)BLI_findstring_ptr(&global_ops, idname_bl, offsetof(wmOperatorType, idname));
+ if(ot) {
+ return ot;
}
}
@@ -113,22 +114,6 @@ wmOperatorType *WM_operatortype_find(const char *idname, int quiet)
return NULL;
}
-wmOperatorType *WM_operatortype_exists(const char *idname)
-{
- wmOperatorType *ot;
-
- char idname_bl[OP_MAX_TYPENAME]; // XXX, needed to support python style names without the _OT_ syntax
- WM_operator_bl_idname(idname_bl, idname);
-
- if(idname_bl[0]) {
- for(ot= global_ops.first; ot; ot= ot->next) {
- if(strncmp(ot->idname, idname_bl, OP_MAX_TYPENAME)==0)
- return ot;
- }
- }
- return NULL;
-}
-
wmOperatorType *WM_operatortype_first(void)
{
return global_ops.first;
@@ -329,7 +314,7 @@ wmOperatorType *WM_operatortype_append_macro(char *idname, char *name, int flag)
{
wmOperatorType *ot;
- if(WM_operatortype_exists(idname)) {
+ if(WM_operatortype_find(idname, TRUE)) {
printf("Macro error: operator %s exists\n", idname);
return NULL;
}
@@ -774,7 +759,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 +769,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");
@@ -822,6 +813,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) {
@@ -1016,9 +1010,12 @@ 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);
@@ -1128,6 +1125,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;
@@ -1136,7 +1146,9 @@ 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;
@@ -1151,51 +1163,56 @@ 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);
- 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_EMBOSSP);
+ 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);
+ }
- layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_MENU, 10, 10, 480, 110, style);
-
+ uiBlockSetEmboss(block, UI_EMBOSSP);
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, "Donations", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/blenderorg/blender-foundation/donation-payment/");
+ 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);
}
uiItemS(col);
- uiItemO(col, NULL, ICON_HELP, "WM_OT_recover_last_session");
+ uiItemO(col, NULL, ICON_RECOVER_LAST, "WM_OT_recover_last_session");
uiItemL(col, "", 0);
-
+
uiCenteredBoundsBlock(block, 0.0f);
uiEndBlock(C, block);
@@ -1404,7 +1421,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);
@@ -1417,7 +1434,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);
@@ -1450,7 +1467,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");
@@ -1463,12 +1480,12 @@ static int wm_link_append_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, "path")) {
+ 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;
}
@@ -1483,6 +1500,7 @@ static short wm_link_append_flag(wmOperator *op)
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;
}
@@ -1492,7 +1510,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 */
@@ -1551,10 +1569,18 @@ static int wm_link_append_exec(bContext *C, wmOperator *op)
scene_deselect_all(scene);
bh = BLO_blendhandle_from_file(libname);
- idcode = BLO_idcode_from_name(group);
+ idcode = BKE_idcode_from_name(group);
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
*
@@ -1587,8 +1613,8 @@ static int wm_link_append_exec(bContext *C, wmOperator *op)
flag_all_listbases_ids(LIB_PRE_EXISTING, 0);
/* recreate dependency graph to include new objects */
- DAG_scene_sort(scene);
- DAG_ids_flush_update(0);
+ DAG_scene_sort(bmain, scene);
+ DAG_ids_flush_update(bmain, 0);
BLO_blendhandle_close(bh);
@@ -1612,13 +1638,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_path", 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", "");
}
@@ -1640,7 +1665,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;
}
@@ -1660,7 +1684,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;
@@ -1681,7 +1705,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;
@@ -1697,7 +1721,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 **************** */
@@ -1732,7 +1756,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);
@@ -1744,16 +1768,20 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op)
{
char path[FILE_MAX];
int fileflags;
+ int copy=0;
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);
}
+ if(RNA_property_is_set(op->ptr, "copy"))
+ copy = RNA_boolean_get(op->ptr, "copy");
+
fileflags= G.fileflags;
/* set compression flag */
@@ -1762,11 +1790,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, copy) != 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)
@@ -1779,9 +1808,10 @@ 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");
+ RNA_def_boolean(ot->srna, "copy", 0, "Save Copy", "Save a copy of the actual working state but does not make saved file active.");
}
/* *************** save file directly ******** */
@@ -1799,7 +1829,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)
@@ -1809,7 +1839,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);
@@ -1828,31 +1858,26 @@ 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");
}
-
/* XXX: move these collada operators to a more appropriate place */
#ifdef WITH_COLLADA
#include "../../collada/collada.h"
static int wm_collada_export_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
- char *path;
- /* RNA_string_set(op->ptr, "path", "/tmp/test.dae"); */
-
- if(!RNA_property_is_set(op->ptr, "path")) {
- path = BLI_replacestr(G.sce, ".blend", ".dae");
- RNA_string_set(op->ptr, "path", path);
+{
+ 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);
}
-
+
WM_event_add_fileselect(C, op);
-
- if (path) MEM_freeN(path);
-
+
return OPERATOR_RUNNING_MODAL;
}
@@ -1861,12 +1886,12 @@ static int wm_collada_export_exec(bContext *C, wmOperator *op)
{
char filename[FILE_MAX];
- if(!RNA_property_is_set(op->ptr, "path")) {
+ if(!RNA_property_is_set(op->ptr, "filepath")) {
BKE_report(op->reports, RPT_ERROR, "No filename given");
return OPERATOR_CANCELLED;
}
- RNA_string_get(op->ptr, "path", filename);
+ RNA_string_get(op->ptr, "filepath", filename);
collada_export(CTX_data_scene(C), filename);
return OPERATOR_FINISHED;
@@ -1881,7 +1906,7 @@ static void WM_OT_collada_export(wmOperatorType *ot)
ot->exec= wm_collada_export_exec;
ot->poll= WM_operator_winactive;
- WM_operator_properties_filesel(ot, FOLDERFILE|COLLADAFILE, FILE_BLENDER, FILE_SAVE);
+ WM_operator_properties_filesel(ot, FOLDERFILE|COLLADAFILE, FILE_BLENDER, FILE_SAVE, WM_FILESEL_FILEPATH);
}
/* function used for WM_OT_save_mainfile too */
@@ -1889,12 +1914,12 @@ static int wm_collada_import_exec(bContext *C, wmOperator *op)
{
char filename[FILE_MAX];
- if(!RNA_property_is_set(op->ptr, "path")) {
+ if(!RNA_property_is_set(op->ptr, "filepath")) {
BKE_report(op->reports, RPT_ERROR, "No filename given");
return OPERATOR_CANCELLED;
}
- RNA_string_get(op->ptr, "path", filename);
+ RNA_string_get(op->ptr, "filepath", filename);
collada_import(C, filename);
return OPERATOR_FINISHED;
@@ -1909,7 +1934,7 @@ static void WM_OT_collada_import(wmOperatorType *ot)
ot->exec= wm_collada_import_exec;
ot->poll= WM_operator_winactive;
- WM_operator_properties_filesel(ot, FOLDERFILE|COLLADAFILE, FILE_BLENDER, FILE_OPENFILE);
+ WM_operator_properties_filesel(ot, FOLDERFILE|COLLADAFILE, FILE_BLENDER, FILE_OPENFILE, WM_FILESEL_FILEPATH);
}
#endif
@@ -2233,6 +2258,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);
@@ -2363,6 +2389,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);
@@ -2554,6 +2581,7 @@ const int WM_RADIAL_CONTROL_DISPLAY_SIZE = 200;
typedef struct wmRadialControl {
int mode;
float initial_value, value, max_value;
+ float col[4], tex_col[4];
int initial_mouse[2];
void *cursor;
GLuint tex;
@@ -2565,13 +2593,10 @@ static void wm_radial_control_paint(bContext *C, int x, int y, void *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;
-
- glPushMatrix();
+ // int hit = 0;
- glTranslatef((float)x, (float)y, 0.0f);
+ if(rc->mode == WM_RADIALCONTROL_STRENGTH)
+ rc->tex_col[3]= (rc->value + 0.5);
if(rc->mode == WM_RADIALCONTROL_SIZE) {
r1= rc->value;
@@ -2579,29 +2604,25 @@ 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 );
- glEnable(GL_BLEND);
+ /* Keep cursor in the original place */
+ x = rc->initial_mouse[0] - ar->winrct.xmin;
+ y = rc->initial_mouse[1] - ar->winrct.ymin;
- if(rc->mode == WM_RADIALCONTROL_ANGLE)
- fdrawline(0, 0, WM_RADIAL_CONTROL_DISPLAY_SIZE, 0);
+ glTranslatef((float)x, (float)y, 0.0f);
- if(rc->tex) {
- const float str = rc->mode == WM_RADIALCONTROL_STRENGTH ? (rc->value + 0.5) : 1;
+ glEnable(GL_BLEND);
- 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);
@@ -2609,7 +2630,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(rc->tex_col[0], rc->tex_col[1], rc->tex_col[2], rc->tex_col[3]);
glTexCoord2f(0,0);
glVertex2f(-r3, -r3);
glTexCoord2f(1,0);
@@ -2622,11 +2643,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(rc->col[0], rc->col[1], rc->col[2], rc->col[3]);
+ 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(rc->col[0], rc->col[1], rc->col[2], rc->col[3]);
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();
}
@@ -2638,6 +2668,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);
@@ -2646,6 +2677,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)
@@ -2692,6 +2733,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;
}
@@ -2699,10 +2745,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;
@@ -2728,6 +2779,9 @@ int WM_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *event)
MEM_freeN(im);
}
+ RNA_float_get_array(op->ptr, "color", rc->col);
+ RNA_float_get_array(op->ptr, "texture_color", rc->tex_col);
+
RNA_int_set_array(op->ptr, "initial_mouse", mouse);
RNA_float_set(op->ptr, "new_value", initial_value);
@@ -2739,6 +2793,8 @@ int WM_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *event)
rc->cursor = WM_paint_cursor_activate(CTX_wm_manager(C), op->type->poll,
wm_radial_control_paint, op->customdata);
+ //WM_cursor_modal(win, CURSOR_NONE);
+
/* add modal handler */
WM_event_add_modal_handler(C, op);
@@ -2770,6 +2826,8 @@ void WM_OT_radial_control_partial(wmOperatorType *ot)
{WM_RADIALCONTROL_STRENGTH, "STRENGTH", 0, "Strength", ""},
{WM_RADIALCONTROL_ANGLE, "ANGLE", 0, "Angle", ""},
{0, NULL, 0, NULL, NULL}};
+ static float color[4] = {1.0f, 1.0f, 1.0f, 0.5f};
+ static float tex_color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
/* Should be set in custom invoke() */
RNA_def_float(ot->srna, "initial_value", 0, 0, FLT_MAX, "Initial Value", "", 0, FLT_MAX);
@@ -2781,7 +2839,10 @@ void WM_OT_radial_control_partial(wmOperatorType *ot)
RNA_def_enum(ot->srna, "mode", radial_mode_items, 0, "Mode", "");
/* Internal */
- RNA_def_int_vector(ot->srna, "initial_mouse", 2, NULL, INT_MIN, INT_MAX, "initial_mouse", "", INT_MIN, INT_MAX);
+ RNA_def_int_vector(ot->srna, "initial_mouse", 2, NULL, INT_MIN, INT_MAX, "Initial Mouse", "", INT_MIN, INT_MAX);
+
+ RNA_def_float_color(ot->srna, "color", 4, color, 0.0f, FLT_MAX, "Color", "Radial control color", 0.0f, 1.0f);
+ RNA_def_float_color(ot->srna, "texture_color", 4, tex_color, 0.0f, FLT_MAX, "Texture Color", "Radial control texture color", 0.0f, 1.0f);
}
@@ -2789,6 +2850,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);
@@ -2797,7 +2880,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);
@@ -2838,39 +2921,45 @@ 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) {
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
if(a & 1) scene->r.cfra--;
else scene->r.cfra++;
- scene_update_for_newframe(scene, scene->lay);
+ scene_update_for_newframe(bmain, scene, scene->lay);
}
- else {
+ else if (type==5) {
+
+ /* play anim, return on same frame as started with */
+ Main *bmain= CTX_data_main(C);
+ 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(bmain, 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;
@@ -2878,24 +2967,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);
}
@@ -3067,7 +3147,7 @@ static void gesture_border_modal_keymap(wmKeyConfig *keyconf)
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);
+ 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_BEGIN);
@@ -3089,6 +3169,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");
@@ -3153,11 +3234,14 @@ 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);
WM_keymap_add_item(keymap, "WM_OT_save_as_mainfile", SKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
WM_keymap_add_item(keymap, "WM_OT_save_as_mainfile", F2KEY, KM_PRESS, 0, 0);
+ kmi= WM_keymap_add_item(keymap, "WM_OT_save_as_mainfile", SKEY, KM_PRESS, KM_ALT|KM_CTRL, 0);
+ RNA_boolean_set(kmi->ptr, "copy", 1);
WM_keymap_verify_item(keymap, "WM_OT_window_fullscreen_toggle", F11KEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "WM_OT_exit_blender", QKEY, KM_PRESS, KM_CTRL, 0);
@@ -3171,47 +3255,47 @@ 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);
@@ -3221,7 +3305,7 @@ void wm_window_keymap(wmKeyConfig *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;
@@ -3230,9 +3314,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);
@@ -3244,17 +3330,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);
+ 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 f512434a141..207b6cebfe6 100644
--- a/source/blender/windowmanager/intern/wm_subwindow.c
+++ b/source/blender/windowmanager/intern/wm_subwindow.c
@@ -45,6 +45,8 @@
#include "BIF_gl.h"
+#include "GPU_extensions.h"
+
#include "WM_api.h"
#include "wm_subwindow.h"
#include "wm_window.h"
@@ -301,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 */
@@ -331,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! */
@@ -361,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;
@@ -398,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 150e6db35cb..45234464ef0 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -73,7 +73,7 @@ static int prefsizx= 0, prefsizy= 0, prefstax= 0, prefstay= 0;
/* XXX this one should correctly check for apple top header...
done for Cocoa : returns window contents (and not frame) max size*/
-static void wm_get_screensize(int *width_r, int *height_r)
+void wm_get_screensize(int *width_r, int *height_r)
{
unsigned int uiwidth;
unsigned int uiheight;
@@ -258,7 +258,7 @@ void wm_window_title(wmWindowManager *wm, wmWindow *win)
}
else {
- /* this is set to 1 if you don't have .B.blend open */
+ /* this is set to 1 if you don't have startup.blend open */
if(G.save_over) {
char *str= MEM_mallocN(strlen(G.sce) + 16, "title");
@@ -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;
+
+ wm_event_add(win, &event);
- printf("Drop detected\n");
+ /* 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; a<stra->count; 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)
diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h
index 47bb11f4dd7..6cb3971bd21 100644
--- a/source/blender/windowmanager/wm_event_types.h
+++ b/source/blender/windowmanager/wm_event_types.h
@@ -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 ********************* */
diff --git a/source/blender/windowmanager/wm_files.h b/source/blender/windowmanager/wm_files.h
index c633ed8388e..15a38251795 100644
--- a/source/blender/windowmanager/wm_files.h
+++ b/source/blender/windowmanager/wm_files.h
@@ -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 fa244036645..d57fd0e75d8 100644
--- a/source/blender/windowmanager/wm_window.h
+++ b/source/blender/windowmanager/wm_window.h
@@ -36,6 +36,8 @@ struct wmOperator;
void wm_ghost_init (bContext *C);
void wm_ghost_exit(void);
+void wm_get_screensize(int *width_r, int *height_r);
+
wmWindow *wm_window_new (bContext *C);
void wm_window_free (bContext *C, wmWindowManager *wm, wmWindow *win);
void wm_window_close (bContext *C, wmWindowManager *wm, wmWindow *win);
diff --git a/source/blenderplayer/CMakeLists.txt b/source/blenderplayer/CMakeLists.txt
index 60ea3347c3e..8fcea674ebb 100644
--- a/source/blenderplayer/CMakeLists.txt
+++ b/source/blenderplayer/CMakeLists.txt
@@ -64,8 +64,8 @@ IF(UNIX)
SET(BLENDER_SORTED_LIBS
gp_ghost
gp_common
- bf_string
- bf_ghost
+ bf_intern_string
+ bf_intern_ghost
bf_rna
bf_blenkernel
bf_blenloader
@@ -81,11 +81,12 @@ IF(UNIX)
bf_oglrasterizer
bf_expressions
bf_scenegraph
- bf_ikplugin
- bf_ITASC
- bf_IK
- bf_smoke
- bf_moto
+ bf_ikplugin
+ bf_intern_itasc
+ bf_intern_ik
+ bf_intern_smoke
+ bf_modifiers
+ bf_intern_moto
bf_kernel
bf_nodes
bf_gpu
@@ -95,31 +96,31 @@ IF(UNIX)
bf_ngnetwork
bf_loopbacknetwork
extern_bullet
- bf_guardedalloc
- bf_memutil
+ bf_intern_guardedalloc
+ bf_intern_memutil
bf_python
- bf_gen_python
+ bf_python_ext
bf_blenlib
- bf_cineon
+ bf_cineon
bf_openexr
- extern_libopenjpeg
+ extern_openjpeg
bf_dds
bf_readblenfile
bf_dna
bf_videotex
bf_blenfont
- bf_audaspace
+ bf_intern_audaspace
blenkernel_blc
extern_binreloc
extern_glew
)
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)
- SET(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} bf_guardedalloc_cpp)
+ SET(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} bf_intern_guardedalloc_cpp)
ENDIF(WITH_CXX_GUARDEDALLOC)
FOREACH(SORTLIB ${BLENDER_SORTED_LIBS})
diff --git a/source/blenderplayer/bad_level_call_stubs/Makefile b/source/blenderplayer/bad_level_call_stubs/Makefile
index 1d9f6a27327..49efd08c710 100644
--- a/source/blenderplayer/bad_level_call_stubs/Makefile
+++ b/source/blenderplayer/bad_level_call_stubs/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/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c
index f0d532f4356..ed1b97e0a6e 100644
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@ -36,14 +36,17 @@
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;
@@ -53,16 +56,20 @@ 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;
@@ -133,10 +140,14 @@ 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){}
+char *WM_clipboard_text_get(int selection){return (char*)0;}
+void WM_clipboard_text_set(char *buf, int selection){}
+
struct wmKeyMapItem *WM_keymap_item_find_id(struct wmKeyMap *keymap, int id){return (struct wmKeyMapItem *) NULL;}
int WM_enum_search_invoke(struct bContext *C, struct wmOperator *op, struct wmEvent *event){return 0;}
void WM_event_add_notifier(const struct bContext *C, unsigned int type, void *reference){}
@@ -148,7 +159,7 @@ 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;} /* XXX this one looks wierd */
+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 weird */
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){}
@@ -186,6 +197,7 @@ 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;}
@@ -195,6 +207,7 @@ 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 (char *) NULL;}
@@ -245,10 +258,22 @@ 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){}
+struct ListBase *ED_curve_editnurbs(struct Curve *cu){return NULL;}
+void free_curve_editNurb (struct Curve *cu){};
+
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 make_editLatt(struct Object *obedit){}
+void load_editLatt(struct Object *obedit){}
+
+void load_editNurb (struct Object *obedit){}
+void make_editNurb (struct Object *obedit){}
+
+
void uiItemR(struct uiLayout *layout, struct PointerRNA *ptr, char *propname, int flag, char *name, int icon){}
struct PointerRNA uiItemFullO(struct uiLayout *layout, char *idname, char *name, int icon, struct IDProperty *properties, int context, int flag){struct PointerRNA a; return a;}
@@ -261,6 +286,7 @@ void uiItemsEnumR(struct uiLayout *layout, struct PointerRNA *ptr, char *propnam
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 uiItemPointerSubR(struct uiLayout *layout, struct PointerRNA *ptr, char *propname, 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 *opname, char *propname, char *name, int icon){}
@@ -287,7 +313,6 @@ void uiTemplateIDPreview(struct uiLayout *layout, struct bContext *C, struct Poi
void uiTemplateCurveMapping(struct uiLayout *layout, struct CurveMapping *cumap, int type, int compact){}
void uiTemplateColorRamp(struct uiLayout *layout, struct ColorBand *coba, int expand){}
void uiTemplateLayers(struct uiLayout *layout, struct PointerRNA *ptr, char *propname){}
-void uiTemplateTriColorSet(struct uiLayout *layout, struct PointerRNA *ptr, char *propname){}
void uiTemplateImageLayers(struct uiLayout *layout, struct bContext *C, struct Image *ima, struct ImageUser *iuser){}
ListBase uiTemplateList(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, struct PointerRNA *activeptr, char *activepropname, int rows, int listtype){struct ListBase b = {0,0}; return b;}
void uiTemplateRunningJobs(struct uiLayout *layout, struct bContext *C){}
@@ -299,6 +324,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;}
@@ -345,9 +372,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;}
@@ -369,6 +394,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 */
diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt
index 1afae47e21f..9920752f9d2 100644
--- a/source/creator/CMakeLists.txt
+++ b/source/creator/CMakeLists.txt
@@ -29,35 +29,48 @@ 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
)
-
+IF(WIN32)
+ INCLUDE_DIRECTORIES(${PTHREADS_INC})
+ENDIF(WIN32)
IF(WITH_QUICKTIME)
ADD_DEFINITIONS(-DWITH_QUICKTIME)
ENDIF(WITH_QUICKTIME)
-IF(WITH_OPENEXR)
+IF(WITH_IMAGE_OPENEXR)
ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_OPENEXR)
+ENDIF(WITH_IMAGE_OPENEXR)
+
+IF(WITH_IMAGE_TIFF)
+ ADD_DEFINITIONS(-DWITH_TIFF)
+ENDIF(WITH_IMAGE_TIFF)
+
+IF(WITH_IMAGE_DDS)
+ ADD_DEFINITIONS(-DWITH_DDS)
+ENDIF(WITH_IMAGE_DDS)
+
+IF(WITH_IMAGE_CINEON)
+ ADD_DEFINITIONS(-DWITH_CINEON)
+ENDIF(WITH_IMAGE_CINEON)
+
+IF(WITH_IMAGE_HDR)
+ ADD_DEFINITIONS(-DWITH_HDR)
+ENDIF(WITH_IMAGE_HDR)
IF(WITH_PYTHON)
INCLUDE_DIRECTORIES(../blender/python)
@@ -122,16 +135,16 @@ IF(WITH_INSTALL)
ADD_CUSTOM_COMMAND(
TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMAND rm -Rf ${TARGETDIR}/.blender
- COMMAND mkdir ${TARGETDIR}/.blender/
- COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.bfont.ttf ${TARGETDIR}/.blender/
+ COMMAND rm -Rf ${TARGETDIR}/${BLENDER_VERSION}
+ COMMAND mkdir ${TARGETDIR}/${BLENDER_VERSION}/
+ COMMAND cp ${CMAKE_SOURCE_DIR}/release/bin/.blender/.bfont.ttf ${TARGETDIR}/${BLENDER_VERSION}/
)
IF(WITH_INTERNATIONAL)
ADD_CUSTOM_COMMAND(
TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.Blanguages ${TARGETDIR}/.blender/
- COMMAND cp -R ${CMAKE_SOURCE_DIR}/bin/.blender/locale ${TARGETDIR}/.blender/
+ COMMAND cp ${CMAKE_SOURCE_DIR}/release/bin/.blender/.Blanguages ${TARGETDIR}/${BLENDER_VERSION}/
+ COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/bin/.blender/locale ${TARGETDIR}/${BLENDER_VERSION}/
)
ENDIF(WITH_INTERNATIONAL)
@@ -139,35 +152,35 @@ IF(WITH_INSTALL)
ADD_CUSTOM_COMMAND(
TARGET blender POST_BUILD MAIN_DEPENDENCY blender
COMMENT "copying blender scripts..."
- COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/.blender/
+ COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/${BLENDER_VERSION}/
COMMAND find ${TARGETDIR} -name "*.py?" -prune -exec rm -rf {} "\;"
)
-
- # Copy the systems python into the install directory
- # Scons copy in tools/Blender.py
- ADD_CUSTOM_COMMAND(
- TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMENT "copying a subset of the systems python..."
-
- COMMAND mkdir ${TARGETDIR}/.blender/python # PYTHONPATH and PYTHONHOME is set here
- COMMAND mkdir ${TARGETDIR}/.blender/python/lib/
- COMMAND cp -R ${PYTHON_LIBPATH}/python${PYTHON_VERSION} ${TARGETDIR}/.blender/python/lib/
-
- COMMAND rm -rf ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION}/distutils
- COMMAND rm -rf ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION}/lib2to3
- COMMAND rm -rf ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION}/idlelib
- COMMAND rm -rf ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION}/tkinter
- COMMAND rm -rf ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION}/config
-
- COMMAND rm -rf ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION}/site-packages
- COMMAND mkdir ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION}/site-packages # python needs it.
-
- COMMAND rm -f ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION}/lib-dynload/_tkinter.so
- COMMAND find ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION} -name "test" -prune -exec rm -rf {} "\;"
- COMMAND find ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION} -name "*.py?" -exec rm -rf {} "\;"
- COMMAND find ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION} -name "*.so"-exec strip -s {} "\;"
- )
-
+ IF(WITH_PYTHON_INSTALL)
+ # Copy the systems python into the install directory
+ # Scons copy in tools/Blender.py
+ ADD_CUSTOM_COMMAND(
+ TARGET blender POST_BUILD MAIN_DEPENDENCY blender
+ COMMENT "copying a subset of the systems python..."
+
+ COMMAND mkdir ${TARGETDIR}/${BLENDER_VERSION}/python # PYTHONPATH and PYTHONHOME is set here
+ COMMAND mkdir ${TARGETDIR}/${BLENDER_VERSION}/python/lib/
+ COMMAND cp -R ${PYTHON_LIBPATH}/python${PYTHON_VERSION} ${TARGETDIR}/${BLENDER_VERSION}/python/lib/
+
+ COMMAND rm -rf ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/distutils
+ COMMAND rm -rf ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/lib2to3
+ COMMAND rm -rf ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/idlelib
+ COMMAND rm -rf ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/tkinter
+ COMMAND rm -rf ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/config
+
+ COMMAND rm -rf ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/site-packages
+ COMMAND mkdir ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/site-packages # python needs it.
+
+ COMMAND rm -f ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/lib-dynload/_tkinter.so
+ COMMAND find ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION} -name "test" -prune -exec rm -rf {} "\;"
+ COMMAND find ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION} -name "*.py?" -exec rm -rf {} "\;"
+ COMMAND find ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION} -name "*.so"-exec strip -s {} "\;"
+ )
+ ENDIF(WITH_PYTHON_INSTALL)
ENDIF(WITH_PYTHON)
ADD_CUSTOM_COMMAND(
@@ -176,7 +189,7 @@ IF(WITH_INSTALL)
)
- # Above we bundle a portable distrobution in ./bin
+ # Above we bundle a portable distribution in ./bin
# This is an optional "make install" which installs blender on the system.
INSTALL(
PROGRAMS ${TARGETDIR}/blender
@@ -191,9 +204,45 @@ IF(WITH_INSTALL)
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(
+ PROGRAMS ${CMAKE_SOURCE_DIR}/release/bin/blender-thumbnailer.py
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
+ )
+ INSTALL(
+ FILES ${CMAKE_SOURCE_DIR}/doc/blender.1
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/share/man/man1
+ )
+ 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
+ PATTERN "*.pyc" EXCLUDE
+ )
+ INSTALL(
+ DIRECTORY ${CMAKE_SOURCE_DIR}/release/datafiles/brushicons/
+ DESTINATION ${BLENDERPATH}/datafiles/brushicons
+ PATTERN ".svn" EXCLUDE
)
+ IF(WITH_INTERNATIONAL)
+ INSTALL(
+ DIRECTORY ${CMAKE_SOURCE_DIR}/release/bin/.blender/locale/
+ DESTINATION ${BLENDERPATH}/datafiles/locale
+ PATTERN ".svn" EXCLUDE
+ )
+ ENDIF(WITH_INTERNATIONAL)
+
# end "make install"
ENDIF(UNIX AND NOT APPLE)
@@ -209,32 +258,27 @@ IF(WITH_INSTALL)
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}/release/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}/release/bin/.blender/.Blanguages ${TARGETDIR}/blender.app/Contents/MacOS/datafiles/
+ COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/release/bin/.blender/locale ${TARGETDIR}/blender.app/Contents/MacOS/datafiles/
)
ENDIF(WITH_INTERNATIONAL)
IF(WITH_PYTHON)
- IF(WITH_LIBS10.5)
- SET(PYTHON_ZIP "python_${CMAKE_OSX_ARCHITECTURES}.zip")
- ELSE(WITH_LIBS10.5)
- SET(PYTHON_ZIP "python.zip")
- ENDIF(WITH_LIBS10.5)
+ SET(PYTHON_ZIP "python_${CMAKE_OSX_ARCHITECTURES}.zip")
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/
+ 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)
@@ -248,8 +292,6 @@ IF(WITH_INSTALL)
ENDIF(APPLE)
IF(WIN32)
- FILE(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} WIN_SOURCE_DIR)
-
ADD_CUSTOM_COMMAND(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
@@ -257,39 +299,36 @@ IF(WITH_INSTALL)
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}\\release\\bin\\.blender\\.Blanguages\" \"${TARGETDIR}\\.blender\\\"
+ COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\.bfont.ttf\" \"${TARGETDIR}\\.blender\\\"
+ COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\release\\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)
@@ -297,16 +336,16 @@ IF(WITH_INSTALL)
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)
@@ -314,7 +353,7 @@ IF(WITH_INSTALL)
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)
@@ -322,7 +361,7 @@ IF(WITH_INSTALL)
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)
@@ -330,8 +369,8 @@ IF(WITH_INSTALL)
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)
@@ -344,11 +383,11 @@ 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 bf_render)
-IF(WITH_ELBEEM)
- SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} bf_elbeem)
-ENDIF(WITH_ELBEEM)
+IF(WITH_FLUID)
+ SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} bf_intern_elbeem)
+ENDIF(WITH_FLUID)
IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} extern_binreloc)
@@ -358,48 +397,85 @@ ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
# Sort libraries
SET(BLENDER_SORTED_LIBS
bf_windowmanager
- bf_editors
- bf_decimation
- blender_BSP
- bf_ghost
- bf_string
- blender_render
- blender_ONL
+
+ 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
+
+ bf_intern_bsp
+ bf_render
+ bf_intern_opennl
bf_python
- bf_gen_python
+ bf_python_ext
bf_ikplugin
- bf_blenkernel
+ bf_modifiers
+ bf_blenkernel
bf_nodes
bf_gpu
- bf_blenloader
+ bf_blenloader
+ bf_blenlib
+ bf_intern_ghost
+ bf_intern_string
bf_blenpluginapi
bf_imbuf
- bf_blenlib
bf_avi
bf_cineon
bf_openexr
bf_dds
bf_readblenfile
bf_collada
- blender_BSP
- blender_bop
+ bf_intern_bsp
+ bf_intern_bop
bf_kernel
- bf_decimation
- bf_elbeem
- bf_IK
- bf_memutil
- bf_guardedalloc
- blender_CTR
- bf_moto
+ bf_intern_decimate
+ bf_intern_elbeem
+ bf_intern_ik
+ bf_intern_memutil
+ bf_intern_guardedalloc
+ bf_intern_ctr
+ bf_intern_moto
bf_windowmanager
- bf_editors
bf_blroutines
bf_converter
bf_dummy
bf_bullet
- bf_smoke
- bf_minilzo
- bf_lzma
+ bf_intern_smoke
+ extern_minilzo
+ extern_lzma
bf_common
bf_ketsji
bf_logic
@@ -407,30 +483,32 @@ ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
bf_oglrasterizer
bf_expressions
bf_scenegraph
- bf_moto
+ bf_intern_moto
bf_blroutines
kx_network
bf_kernel
bf_ngnetwork
extern_bullet
bf_loopbacknetwork
- bf_ITASC
+ bf_intern_itasc
bf_common
- bf_moto
+ bf_intern_moto
bf_python
- bf_gen_python
+ bf_python_ext
extern_binreloc
extern_glew
- extern_libopenjpeg
+ extern_openjpeg
bf_videotex
bf_rna
bf_dna
bf_blenfont
- bf_audaspace
+ bf_intern_audaspace
+ bf_intern_decimate
+
)
IF(WITH_CXX_GUARDEDALLOC)
- SET(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} bf_guardedalloc_cpp)
+ SET(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} bf_intern_guardedalloc_cpp)
ENDIF(WITH_CXX_GUARDEDALLOC)
IF(WITH_QUICKTIME)
diff --git a/source/creator/Makefile b/source/creator/Makefile
index 592cf913dfa..08f732ad486 100644
--- a/source/creator/Makefile
+++ b/source/creator/Makefile
@@ -17,7 +17,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.
@@ -69,4 +69,16 @@ ifeq ($(WITH_BINRELOC), true)
CPPFLAGS += -I$(NANBLENDERHOME)/extern/binreloc/include -DWITH_BINRELOC
endif
+ifeq ($(WITH_TIFF), true)
+ CPPFLAGS += -DWITH_TIFF
+endif
+
+ifeq ($(WITH_CINEON), true)
+ CPPFLAGS += -DWITH_CINEON
+endif
+
+ifeq ($(WITH_HDR), true)
+ CPPFLAGS += -DWITH_HDR
+endif
+
CPPFLAGS += -I$(OPENGL_HEADERS)
diff --git a/source/creator/SConscript b/source/creator/SConscript
index 8c71e0e8566..01e62d33269 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')
@@ -32,12 +35,15 @@ if env['WITH_BF_PYTHON']:
defs.append('_DEBUG')
else:
defs.append('DISABLE_PYTHON')
-
-if env['WITH_BF_FHS']: # /usr -> /usr/share/blender/2.5
- defs.append('BLENDERPATH=\\"' + os.path.join(env['BF_INSTALLDIR'], 'share', 'blender', env['BF_VERSION']) + '\\"')
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 8b02dde1a5f..d745d826bd6 100644
--- a/source/creator/buildinfo.c
+++ b/source/creator/buildinfo.c
@@ -27,10 +27,6 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#define STRINGIFY(x) XSTRINGIFY(x)
#define XSTRINGIFY(x) #x
diff --git a/source/creator/creator.c b/source/creator/creator.c
index 185c98c3f44..e99935f64a3 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -32,6 +32,12 @@
#include <fenv.h>
#endif
+#define OSX_SSE_FPE (defined(__APPLE__) && (defined(__i386__) || defined(__x86_64__)))
+
+#if OSX_SSE_FPE
+#include <xmmintrin.h>
+#endif
+
#include <stdlib.h>
#include <string.h>
@@ -50,6 +56,7 @@
#endif
#include "BLI_args.h"
+#include "BLI_threads.h"
#include "GEN_messaging.h"
@@ -71,7 +78,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"
@@ -124,19 +131,11 @@ extern int pluginapi_force_ref(void); /* from blenpluginapi:pluginapi.c */
char bprogname[FILE_MAXDIR+FILE_MAXFILE]; /* from blenpluginapi:pluginapi.c */
char btempdir[FILE_MAXDIR+FILE_MAXFILE];
-/* unix path support.
- * defined by the compiler. eg "/usr/share/blender/2.5" "/opt/blender/2.5" */
-#ifndef BLENDERPATH
-#define BLENDERPATH ""
-#endif
-
-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");
@@ -194,101 +193,110 @@ static int print_version(int argc, char **argv, void *data)
static int print_help(int argc, char **argv, void *data)
{
+ 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");
- printf ("\nRender options:\n");
- printf (" -b <file>\tLoad <file> in background (often used for background rendering)\n");
- printf (" -a render frames from start to end (inclusive), only works when used after -b\n");
- printf (" -S <name>\tSet scene <name>\n");
- printf (" -f <frame>\tRender frame <frame> and save it\n");
- printf (" -s <frame>\tSet start to frame <frame> (use before the -a argument)\n");
- printf (" -e <frame>\tSet end to frame <frame> (use before the -a argument)\n");
- printf (" -o <path>\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 <engine>\tSpecify the render engine.\n");
- printf (" use -E help to list available engines.\n");
- printf ("\nFormat options:\n");
- printf (" -F <format>\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 <bool>\tSet option to add the file extension to the end of the file.\n");
- printf (" -t <threads>\tUse amount of <threads> for rendering (background mode only).\n");
- printf (" [1-8], 0 for systems processor count.\n");
- printf ("\nAnimation playback options:\n");
- printf (" -a <options> <file(s)>\tPlayback <file(s)>, only operates this way when -b is not used.\n");
- printf (" -p <sx> <sy>\tOpen with lower left corner at <sx>, <sy>\n");
- printf (" -m\t\tRead from disk (Don't buffer)\n");
- printf (" -f <fps> <fps-base>\t\tSpecify FPS to start with\n");
- printf (" -j <frame>\tSet frame step to <frame>\n");
+ 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 ("\nWindow options:\n");
- printf (" -w\t\tForce opening with borders (default)\n");
- printf (" -W\t\tForce opening without borders\n");
- printf (" -p <sx> <sy> <w> <h>\tOpen with lower left corner at <sx>, <sy>\n");
- printf (" \tand width and height <w>, <h>\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");
-
- printf ("\nMisc options:\n");
- printf (" -d\t\tTurn debugging on\n");
- printf (" \t\t * prints every operator call and their arguments\n");
- printf (" \t\t * disables mouse grab (to interact with a debugger in some cases)\n");
- printf (" \t\t * keeps python sys.stdin rather then setting it to None\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 <filename>\tRun the given Python script (filename or Blender Text)\n");
+ 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");
+
#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 (" $BLENDER_USER_CONFIG Directory for user configuration files.\n");
+ printf (" $BLENDER_SYSTEM_CONFIG Directory for system wide configuration files.\n");
+ printf (" $BLENDER_USER_SCRIPTS Directory for user scripts.\n");
+ printf (" $BLENDER_SYSTEM_SCRIPTS Directory for system wide scripts.\n");
+ printf (" $BLENDER_USER_DATAFILES Directory for user data files (icons, translations, ..).\n");
+ printf (" $BLENDER_SYSTEM_DATAFILES Directory for system wide data files.\n");
+ printf (" $BLENDER_SYSTEM_PYTHON Directory for system python libraries.\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, 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);
@@ -315,29 +323,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;
}
@@ -363,15 +357,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;
}
@@ -379,8 +384,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);
@@ -478,11 +481,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;
}
}
@@ -506,7 +509,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
{
@@ -539,17 +542,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;
@@ -558,24 +559,30 @@ static int set_image_type(int argc, char **argv, void *data)
else if (!strcmp(imtype,"AVICODEC")) scene->r.imtype = R_AVICODEC;
else if (!strcmp(imtype,"QUICKTIME")) scene->r.imtype = R_QUICKTIME;
else if (!strcmp(imtype,"BMP")) scene->r.imtype = R_BMP;
+#ifdef WITH_HDR
else if (!strcmp(imtype,"HDR")) scene->r.imtype = R_RADHDR;
+#endif
+#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;
#endif
else if (!strcmp(imtype,"MPEG")) scene->r.imtype = R_FFMPEG;
else if (!strcmp(imtype,"FRAMESERVER")) scene->r.imtype = R_FRAMESERVER;
+#ifdef WITH_CINEON
else if (!strcmp(imtype,"CINEON")) scene->r.imtype = R_CINEON;
else if (!strcmp(imtype,"DPX")) scene->r.imtype = R_DPX;
+#endif
#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;
}
}
@@ -590,7 +597,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;
}
}
@@ -606,7 +613,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");
@@ -675,25 +682,38 @@ static int render_frame(int argc, char **argv, void *data)
{
bContext *C = data;
if (CTX_data_scene(C)) {
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
if (argc > 1) {
- int frame = atoi(argv[1]);
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, scene->lay, frame, frame, scene->r.frame_step, &reports);
+ RE_BlenderAnim(re, bmain, 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;
}
}
@@ -702,11 +722,12 @@ static int render_animation(int argc, char **argv, void *data)
{
bContext *C = data;
if (CTX_data_scene(C)) {
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Render *re= RE_NewRender(scene->id.name);
ReportList reports;
BKE_reports_init(&reports, RPT_PRINT);
- RE_BlenderAnim(re, scene, scene->lay, scene->r.sfra, scene->r.efra, scene->r.frame_step, &reports);
+ RE_BlenderAnim(re, bmain, scene, scene->lay, scene->r.sfra, scene->r.efra, scene->r.frame_step, &reports);
} else {
printf("\nError: no blend loaded. cannot use '-a'.\n");
}
@@ -716,10 +737,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(CTX_data_main(C), 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;
}
}
@@ -734,11 +759,11 @@ static int set_start_frame(int argc, char **argv, void *data)
(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;
}
}
@@ -753,11 +778,11 @@ static int set_end_frame(int argc, char **argv, void *data)
(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;
}
}
@@ -772,49 +797,53 @@ static int set_skip_frame(int argc, char **argv, void *data)
(scene->r.frame_step) = CLAMPIS(frame, 1, MAXFRAME);
return 1;
} else {
- printf("\nError: number of frames to step 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_path_cwd(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);
- Scene *prevscene= CTX_data_scene(C);
-
- if(wm->windows.first) {
- CTX_wm_window_set(C, wm->windows.first);
-
- 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?
- }
+ /* 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);
- CTX_data_scene_set(C, prevscene);
+ BPY_CTX_SETUP( BPY_run_python_script(C, filename, NULL, NULL) )
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
@@ -823,6 +852,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;
@@ -838,11 +882,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 */
@@ -859,56 +911,94 @@ 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[] = "<path>"
+ "\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[] = "<format>"
+ "\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[] = "<options> <file(s)>"
+ "\n\tPlayback <file(s)>, only operates this way when not running in background."
+ "\n\t\t-p <sx> <sy>\tOpen with lower left corner at <sx>, <sy>"
+ "\n\t\t-m\t\tRead from disk (Don't buffer)"
+ "\n\t\t-f <fps> <fps-base>\t\tSpecify FPS to start with"
+ "\n\t\t-j <frame>\tSet frame step to <frame>";
+
+ 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, -1, "--", NULL, "\n\tEnds option processing, following arguments passed unchanged. Access via python's sys.argv", end_arguments, 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", "<file>\n\tLoad <file> 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", "<sx> <sy> <w> <h>\n\tOpen with lower left corner at <sx>, <sy> and width and height as <w>, <h>", 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", "<frame>\n\tRender frame <frame> and save it.\n\t+<frame> start frame relative, -<frame> 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", "<name>\n\tSet the active scene <name> for rendering", set_scene, C);
+ BLI_argsAdd(ba, 4, "-s", "--frame-start", "<frame>\n\tSet start to frame <frame> (use before the -a argument)", set_start_frame, C);
+ BLI_argsAdd(ba, 4, "-e", "--frame-end", "<frame>\n\tSet end to frame <frame> (use before the -a argument)", set_end_frame, C);
+ BLI_argsAdd(ba, 4, "-j", "--frame-jump", "<frames>\n\tSet number of frames to step forward after each rendered frame", set_skip_frame, C);
+ BLI_argsAdd(ba, 4, "-P", "--python", "<filename>\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", "<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", "<threads>\n\tUse amount of <threads> 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", "<bool>\n\tSet option to add the file extension to the end of the file", set_extension, C);
}
@@ -948,12 +1038,6 @@ int main(int argc, char **argv)
BLI_where_am_i(bprogname, argv[0]);
- { /* override the hard coded blender path */
- char *blender_path_env = getenv("BLENDERPATH");
- 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);
@@ -962,6 +1046,8 @@ int main(int argc, char **argv)
strip_quotes(build_type);
#endif
+ BLI_threadapi_init();
+
RNA_init();
RE_engines_init();
@@ -974,13 +1060,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);
@@ -996,6 +1081,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();
@@ -1006,15 +1095,17 @@ int main(int argc, char **argv)
WM_init(C, argc, argv);
/* 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 */
+ BLI_where_is_temp( btempdir, 1 ); /* call after loading the startup.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 {
@@ -1022,7 +1113,7 @@ int main(int argc, char **argv)
WM_init(C, argc, argv);
- BLI_where_is_temp( btempdir, 0 ); /* call after loading the .B.blend so we can read U.tempdir */
+ BLI_where_is_temp( btempdir, 0 ); /* call after loading the startup.blend so we can read U.tempdir */
}
#ifndef DISABLE_PYTHON
/**
@@ -1041,20 +1132,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);
@@ -1067,8 +1144,10 @@ int main(int argc, char **argv)
else {
if((G.fileflags & G_FILE_AUTOPLAY) && (G.f & G_SCRIPT_AUTOEXEC))
- WM_init_game(C);
-
+ {
+ if(WM_init_game(C))
+ return 0;
+ }
else if(!G.file_loaded)
WM_init_splash(C);
}
diff --git a/source/darwin/Makefile b/source/darwin/Makefile
index 6007ff4d91c..5c68f43f606 100644
--- a/source/darwin/Makefile
+++ b/source/darwin/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.
@@ -45,11 +45,11 @@ all::
@chmod +x $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/$(APPLICATION)
ifeq ($(APPLICATION), blender)
@echo "---> copying message files"
- @cp -R $(NANBLENDERHOME)/bin/.blender/locale $(DIR)/bin/$(APPLICATION).app/Contents/Resources
+ @cp -R $(NANBLENDERHOME)/release/bin/.blender/locale $(DIR)/bin/$(APPLICATION).app/Contents/Resources
@echo "---> copying .Blanguages"
- @cp $(NANBLENDERHOME)/bin/.blender/.Blanguages $(DIR)/bin/$(APPLICATION).app/Contents/Resources
+ @cp $(NANBLENDERHOME)/release/bin/.blender/.Blanguages $(DIR)/bin/$(APPLICATION).app/Contents/Resources
@echo "---> copying .blender/ scripts"
- @cp -R $(NANBLENDERHOME)/bin/.blender $(DIR)/bin/$(APPLICATION).app/Contents/MacOS
+ @cp -R $(NANBLENDERHOME)/release/bin/.blender $(DIR)/bin/$(APPLICATION).app/Contents/MacOS
@cp -R $(NANBLENDERHOME)/release/scripts $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/.blender/
@echo "---> copying python modules"
@mkdir $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/.blender/python
diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
index 00f556b3e96..01a9e621304 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 <config.h>
-#endif
-
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
@@ -76,6 +72,7 @@ extern "C" {
/***/
#include "DNA_view3d_types.h"
#include "DNA_screen_types.h"
+#include "DNA_userdef_types.h"
#include "DNA_windowmanager_types.h"
#include "BKE_global.h"
#include "BKE_report.h"
@@ -88,6 +85,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 +122,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 +135,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;
@@ -157,6 +155,10 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
bgl::InitExtensions(true);
+ // VBO code for derived mesh is not compatible with BGE (couldn't find why), so disable
+ int disableVBO = (U.gameflags & USER_DISABLE_VBO);
+ U.gameflags |= USER_DISABLE_VBO;
+
do
{
View3D *v3d= CTX_wm_view3d(C);
@@ -170,12 +172,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 +226,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 +252,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 {
@@ -319,22 +323,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 +367,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 +389,19 @@ 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_setSpeedOfSound(scene->audio.speed_of_sound);
+ AUD_setDopplerFactor(scene->audio.doppler_factor);
+ AUD_setDistanceModel(AUD_DistanceModel(scene->audio.distance_model));
+
+ // from see blender.c:
+ // 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 (blenderdata->versionfile < 250)
+ do_versions_ipos_to_animato(blenderdata);
if (sceneconverter)
{
@@ -506,8 +517,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
@@ -557,6 +568,9 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
} while (exitrequested == KX_EXIT_REQUEST_RESTART_GAME || exitrequested == KX_EXIT_REQUEST_START_OTHER_GAME);
+ if (!disableVBO)
+ U.gameflags &= ~USER_DISABLE_VBO;
+
if (bfd) BLO_blendfiledata_free(bfd);
BLI_strncpy(G.sce, oldsce, sizeof(G.sce));
diff --git a/source/gameengine/BlenderRoutines/CMakeLists.txt b/source/gameengine/BlenderRoutines/CMakeLists.txt
index 625ad006e0c..57d28561647 100644
--- a/source/gameengine/BlenderRoutines/CMakeLists.txt
+++ b/source/gameengine/BlenderRoutines/CMakeLists.txt
@@ -50,4 +50,3 @@ ELSE(WITH_PYTHON)
ENDIF(WITH_PYTHON)
BLENDERLIB(bf_blroutines "${SRC}" "${INC}")
-#env.BlenderLib ( 'bf_bloutines', sources, Split(incs), [], libtype=['game', 'game2', 'player'], priority=[0, 0, 55] , compileflags=cxxflags)
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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#endif
-
#ifdef WIN32
#pragma warning (disable :4786)
#include <windows.h>
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/BlenderRoutines/Makefile b/source/gameengine/BlenderRoutines/Makefile
index 4a437aff97d..3d0f5344c74 100644
--- a/source/gameengine/BlenderRoutines/Makefile
+++ b/source/gameengine/BlenderRoutines/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/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 <config.h>
-#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 47e1a50857a..82b8307a2bc 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 d4ecc5098d8..8f5ec230486 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 <config.h>
-#endif
-
#include "DNA_armature_types.h"
#include "BL_ArmatureChannel.h"
#include "BL_ArmatureObject.h"
@@ -124,7 +120,7 @@ PyAttributeDef BL_ArmatureChannel::AttributesPtr[] = {
KX_PYATTRIBUTE_FLOAT_VECTOR_RW("location",-FLT_MAX,FLT_MAX,bPoseChannel,loc,3),
KX_PYATTRIBUTE_FLOAT_VECTOR_RW("scale",-FLT_MAX,FLT_MAX,bPoseChannel,size,3),
KX_PYATTRIBUTE_FLOAT_VECTOR_RW("rotation_quaternion",-1.0f,1.0f,bPoseChannel,quat,4),
- KX_PYATTRIBUTE_FLOAT_VECTOR_RW("rotaion_euler",-10.f,10.f,bPoseChannel,eul,3),
+ KX_PYATTRIBUTE_FLOAT_VECTOR_RW("rotation_euler",-10.f,10.f,bPoseChannel,eul,3),
KX_PYATTRIBUTE_SHORT_RW("rotation_mode",0,ROT_MODE_MAX-1,false,bPoseChannel,rotmode),
KX_PYATTRIBUTE_FLOAT_MATRIX_RO("channel_matrix",bPoseChannel,chan_mat,4),
KX_PYATTRIBUTE_FLOAT_MATRIX_RO("pose_matrix",bPoseChannel,pose_mat,4),
@@ -201,8 +197,7 @@ int BL_ArmatureChannel::py_attr_setattr(void *self_v, const struct KX_PYATTRIBUT
PyObject* BL_ArmatureChannel::py_attr_get_joint_rotation(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef)
{
- BL_ArmatureChannel* self= static_cast<BL_ArmatureChannel*>(self_v);
- bPoseChannel* pchan = self->m_posechannel;
+ bPoseChannel* pchan = static_cast<bPoseChannel*>(self_v);
// decompose the pose matrix in euler rotation
float rest_mat[3][3];
float pose_mat[3][3];
@@ -436,13 +431,13 @@ PyAttributeDef BL_ArmatureBone::AttributesPtr[] = {
KX_PYATTRIBUTE_FLOAT_MATRIX_RO("arm_mat",Bone,arm_mat,4),
KX_PYATTRIBUTE_FLOAT_MATRIX_RO("bone_mat",Bone,bone_mat,4),
KX_PYATTRIBUTE_RO_FUNCTION("parent",BL_ArmatureBone,py_bone_get_parent),
- KX_PYATTRIBUTE_RO_FUNCTION("children",BL_ArmatureBone,py_bone_get_parent),
+ KX_PYATTRIBUTE_RO_FUNCTION("children",BL_ArmatureBone,py_bone_get_children),
{ NULL } //Sentinel
};
PyObject *BL_ArmatureBone::py_bone_get_parent(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
{
- Bone* bone = reinterpret_cast<Bone*>BGE_PROXY_PTR(self);
+ Bone* bone = reinterpret_cast<Bone*>(self);
if (bone->parent) {
// create a proxy unconnected to any GE object
return NewProxyPlus_Ext(NULL,&Type,bone->parent,false);
@@ -452,7 +447,7 @@ PyObject *BL_ArmatureBone::py_bone_get_parent(void *self, const struct KX_PYATTR
PyObject *BL_ArmatureBone::py_bone_get_children(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
{
- Bone* bone = reinterpret_cast<Bone*>BGE_PROXY_PTR(self);
+ Bone* bone = reinterpret_cast<Bone*>(self);
Bone* child;
int count = 0;
for (child=(Bone*)bone->childbase.first; child; child=(Bone*)child->next)
diff --git a/source/gameengine/Converter/BL_ArmatureConstraint.cpp b/source/gameengine/Converter/BL_ArmatureConstraint.cpp
index f9455d37622..0b7ab043d16 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 <config.h>
-#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 18204d1deab..97d6b6efd27 100644
--- a/source/gameengine/Converter/BL_ArmatureObject.cpp
+++ b/source/gameengine/Converter/BL_ArmatureObject.cpp
@@ -30,6 +30,7 @@
#include "BL_ArmatureObject.h"
#include "BL_ActionActuator.h"
#include "KX_BlenderSceneConverter.h"
+#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_ghash.h"
#include "BLI_math.h"
@@ -53,10 +54,6 @@
#include "MT_Matrix4x4.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
/**
* Move here pose function for game engine so that we can mix with GE objects
* Principle is as follow:
@@ -97,7 +94,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;
@@ -112,12 +109,17 @@ 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;
pchan->constraints.last = NULL;
}
+
+ // fails to link, props are not used in the BGE yet.
+ /* if(pchan->prop)
+ pchan->prop= IDP_CopyProperty(pchan->prop); */
+ pchan->prop= NULL;
}
BLI_ghash_free(ghash, NULL, NULL);
diff --git a/source/gameengine/Converter/BL_ArmatureObject.h b/source/gameengine/Converter/BL_ArmatureObject.h
index 6ad7de03489..646e9d45365 100644
--- a/source/gameengine/Converter/BL_ArmatureObject.h
+++ b/source/gameengine/Converter/BL_ArmatureObject.h
@@ -94,7 +94,7 @@ public:
BL_ArmatureConstraint* GetConstraint(int index);
// for pose channel python API
void LoadChannels();
- size_t GetChannelNumber() const { return m_constraintNumber; }
+ size_t GetChannelNumber() const { return m_channelNumber; }
BL_ArmatureChannel* GetChannel(bPoseChannel* channel);
BL_ArmatureChannel* GetChannel(const char* channel);
BL_ArmatureChannel* GetChannel(int index);
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index d8484559d91..fa32cfdb866 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 <config.h>
-#endif
-
#ifdef WIN32
#pragma warning (disable : 4786)
#endif
@@ -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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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/CMakeLists.txt b/source/gameengine/Converter/CMakeLists.txt
index 26689be644f..97c367dd1f1 100644
--- a/source/gameengine/Converter/CMakeLists.txt
+++ b/source/gameengine/Converter/CMakeLists.txt
@@ -70,4 +70,3 @@ ELSE(WITH_PYTHON)
ENDIF(WITH_PYTHON)
BLENDERLIB(bf_converter "${SRC}" "${INC}")
-#env.BlenderLib ( 'bf_converter', sources, Split(incs), [], libtype=['game','player'], priority=[5,70] )
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 3a5bb92b4fa..b4ddc4f9e54 100644
--- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
+++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
@@ -100,6 +100,7 @@ extern "C"
extern "C" {
#include "BKE_context.h"
#include "BLO_readfile.h"
+ #include "BKE_idcode.h"
#include "BKE_report.h"
#include "DNA_space_types.h"
#include "DNA_windowmanager_types.h" /* report api */
@@ -752,22 +753,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;g<numObjects;g++)
{
KX_GameObject* gameObj = (KX_GameObject*)parentList->GetValue(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();
@@ -939,7 +939,7 @@ bool KX_BlenderSceneConverter::LinkBlendFile(const char *path, char *group, KX_S
Main *main_tmp= NULL; /* created only for linking, then freed */
LinkNode *names = NULL;
BlendHandle *bpy_openlib = NULL; /* ptr to the open .blend file */
- int idcode= BLO_idcode_from_name(group);
+ int idcode= BKE_idcode_from_name(group);
short flag= 0; /* dont need any special options */
ReportList reports;
static char err_local[255];
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..a6b62ecb7b0 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 <config.h>
-#endif
-
/* This little block needed for linking to Blender... */
#ifdef WIN32
#include "BLI_winstuff.h"
@@ -180,11 +176,11 @@ void BL_ConvertControllers(
/* let the controller print any warnings here when importing */
pyctrl->SetScriptText(STR_String(pycont->module));
pyctrl->SetScriptName(pycont->module); /* will be something like module.func so using it as the name is OK */
- }
- if(pycont->flag & CONT_PY_DEBUG) {
- printf("\nDebuging \"%s\", module for object %s\n\texpect worse performance.\n", pycont->module, blenderobject->id.name+2);
- pyctrl->SetDebug(true);
+ if(pycont->flag & CONT_PY_DEBUG) {
+ printf("\nDebuging \"%s\", module for object %s\n\texpect worse performance.\n", pycont->module, blenderobject->id.name+2);
+ pyctrl->SetDebug(true);
+ }
}
#endif // DISABLE_PYTHON
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 <config.h>
-#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 <stdio.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <config.h>
-#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/Converter/Makefile b/source/gameengine/Converter/Makefile
index b6da47930d3..142841b2b36 100644
--- a/source/gameengine/Converter/Makefile
+++ b/source/gameengine/Converter/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/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 <config.h>
-#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/CMakeLists.txt b/source/gameengine/Expressions/CMakeLists.txt
index 41f771e12bd..85b5daa3b4a 100644
--- a/source/gameengine/Expressions/CMakeLists.txt
+++ b/source/gameengine/Expressions/CMakeLists.txt
@@ -43,4 +43,3 @@ ELSE(WITH_PYTHON)
ENDIF(WITH_PYTHON)
BLENDERLIB(bf_expressions "${SRC}" "${INC}")
-#env.BlenderLib ( 'bf_expressions', sources, Split(incs), [], libtype=['game','player'], priority = [45,125] )
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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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/Makefile b/source/gameengine/Expressions/Makefile
index 09512c3ae87..892a8c2b246 100644
--- a/source/gameengine/Expressions/Makefile
+++ b/source/gameengine/Expressions/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/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 <config.h>
-#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 <config.h>
-#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..32bf4ba95c4 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 <config.h>
-#endif
-
/*------------------------------
* PyObjectPlus cpp
*
@@ -170,7 +166,7 @@ PyObject * PyObjectPlus::py_base_new(PyTypeObject *type, PyObject *args, PyObjec
return NULL;
}
- /* use base_type rather then Py_TYPE(base) because we could alredy be subtyped */
+ /* use base_type rather then Py_TYPE(base) because we could already be subtyped */
if(!PyType_IsSubtype(type, base_type)) {
PyErr_Format(PyExc_TypeError, "can't subclass blender game type <%s> from <%s> because it is not a subclass", base_type->tp_name, type->tp_name);
return NULL;
@@ -282,7 +278,7 @@ PyObject *PyObjectPlus::py_get_attrdef(PyObject *self_py, const PyAttributeDef *
// the attribute has no field correspondance, handover processing to function.
if (attrdef->m_getFunction == NULL)
return NULL;
- return (*attrdef->m_getFunction)(ref, attrdef);
+ return (*attrdef->m_getFunction)(ptr, attrdef);
}
ptr += attrdef->m_offset;
if (attrdef->m_length > 1)
diff --git a/source/gameengine/Expressions/PyObjectPlus.h b/source/gameengine/Expressions/PyObjectPlus.h
index d81753ce64d..625549a272e 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
@@ -319,9 +319,6 @@ typedef struct KX_PYATTRIBUTE_DEF {
} m_typeCheck;
} PyAttributeDef;
-#define KX_PYATTRIBUTE_DUMMY(name) \
- { name, KX_PYATTRIBUTE_TYPE_DUMMY, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, false, 0, 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, NULL} }
-
#define KX_PYATTRIBUTE_BOOL_RW(name,object,field) \
{ name, KX_PYATTRIBUTE_TYPE_BOOL, KX_PYATTRIBUTE_RW, 0, 1, 0.f, 0.f, false, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {&((object *)0)->field, NULL, NULL, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_BOOL_RW_CHECK(name,object,field,function) \
@@ -466,16 +463,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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 3ffba14ec95..93183dafeee 100644
--- a/source/gameengine/GameLogic/CMakeLists.txt
+++ b/source/gameengine/GameLogic/CMakeLists.txt
@@ -49,4 +49,3 @@ ELSE(WITH_PYTHON)
ENDIF(WITH_PYTHON)
BLENDERLIB(bf_logic "${SRC}" "${INC}")
-#env.BlenderLib ( 'bf_logic', sources, Split(incs), [], libtype=['game','player'], priority=[30, 110] )
diff --git a/source/gameengine/GameLogic/Joystick/Makefile b/source/gameengine/GameLogic/Joystick/Makefile
index 02def1cec62..5ab297824dd 100644
--- a/source/gameengine/GameLogic/Joystick/Makefile
+++ b/source/gameengine/GameLogic/Joystick/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/gameengine/GameLogic/Makefile b/source/gameengine/GameLogic/Makefile
index a1794a60452..9c8bd73cdc0 100644
--- a/source/gameengine/GameLogic/Makefile
+++ b/source/gameengine/GameLogic/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.
@@ -38,10 +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$(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 24f919b7364..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 <config.h>
-#endif
#include <iostream>
SCA_2DFilterActuator::~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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <vector>
#include "SCA_ISensor.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <config.h>
-#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 f07d3309386..2fdb1a96216 100644
--- a/source/gameengine/GameLogic/SCA_BasicEventManager.cpp
+++ b/source/gameengine/GameLogic/SCA_BasicEventManager.cpp
@@ -35,10 +35,6 @@
#include <vector>
#include "SCA_ISensor.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 a0fae4958c1..db67b180fd8 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 <config.h>
-#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 <config.h>
-#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 <stdio.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <stdio.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <stdio.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 7fd04e9d27f..93b040c9a31 100644
--- a/source/gameengine/GameLogic/SCA_IScene.h
+++ b/source/gameengine/GameLogic/SCA_IScene.h
@@ -72,7 +72,7 @@ public:
#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..fada69848b2 100644
--- a/source/gameengine/GameLogic/SCA_ISensor.cpp
+++ b/source/gameengine/GameLogic/SCA_ISensor.cpp
@@ -37,10 +37,6 @@
#include <stdio.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
/* Native functions */
void SCA_ISensor::ReParent(SCA_IObject* parent)
{
@@ -361,9 +357,8 @@ PyAttributeDef SCA_ISensor::Attributes[] = {
KX_PYATTRIBUTE_RO_FUNCTION("triggered", SCA_ISensor, pyattr_get_triggered),
KX_PYATTRIBUTE_RO_FUNCTION("positive", SCA_ISensor, pyattr_get_positive),
KX_PYATTRIBUTE_RO_FUNCTION("status", SCA_ISensor, pyattr_get_status),
- //KX_PYATTRIBUTE_TODO("links"),
- //KX_PYATTRIBUTE_TODO("posTicks"),
- //KX_PYATTRIBUTE_TODO("negTicks"),
+ KX_PYATTRIBUTE_RO_FUNCTION("pos_ticks", SCA_ISensor, pyattr_get_posTicks),
+ KX_PYATTRIBUTE_RO_FUNCTION("neg_ticks", SCA_ISensor, pyattr_get_negTicks),
{ NULL } //Sentinel
};
@@ -405,6 +400,18 @@ PyObject* SCA_ISensor::pyattr_get_status(void *self_v, const KX_PYATTRIBUTE_DEF
return PyLong_FromSsize_t(status);
}
+PyObject* SCA_ISensor::pyattr_get_posTicks(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ SCA_ISensor* self= static_cast<SCA_ISensor*>(self_v);
+ return PyLong_FromLong(self->GetPosTicks());
+}
+
+PyObject* SCA_ISensor::pyattr_get_negTicks(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ SCA_ISensor* self= static_cast<SCA_ISensor*>(self_v);
+ return PyLong_FromLong(self->GetNegTicks());
+}
+
int SCA_ISensor::pyattr_check_level(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
SCA_ISensor* self= static_cast<SCA_ISensor*>(self_v);
diff --git a/source/gameengine/GameLogic/SCA_ISensor.h b/source/gameengine/GameLogic/SCA_ISensor.h
index 42d06d856b6..2d3a3ef08a0 100644
--- a/source/gameengine/GameLogic/SCA_ISensor.h
+++ b/source/gameengine/GameLogic/SCA_ISensor.h
@@ -167,6 +167,18 @@ public:
return m_prev_state;
}
+ /** get the number of ticks since the last positive pulse */
+ int GetPosTicks()
+ {
+ return m_pos_ticks;
+ }
+
+ /** get the number of ticks since the last negative pulse */
+ int GetNegTicks()
+ {
+ return m_neg_ticks;
+ }
+
/** Resume sensing. */
void Resume();
@@ -185,6 +197,9 @@ public:
static PyObject* pyattr_get_triggered(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_positive(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_status(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_posTicks(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_negTicks(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+
static int pyattr_check_level(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_check_tap(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
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 <vector>
#include "SCA_ISensor.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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..29a6a73b865 100644
--- a/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
@@ -36,10 +36,6 @@
#include <iostream>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
SCA_JoystickSensor::SCA_JoystickSensor(class SCA_JoystickManager* eventmgr,
SCA_IObject* gameobj,
@@ -294,7 +290,6 @@ PyAttributeDef SCA_JoystickSensor::Attributes[] = {
KX_PYATTRIBUTE_RO_FUNCTION("numButtons", SCA_JoystickSensor, pyattr_get_num_buttons),
KX_PYATTRIBUTE_RO_FUNCTION("numHats", SCA_JoystickSensor, pyattr_get_num_hats),
KX_PYATTRIBUTE_RO_FUNCTION("connected", SCA_JoystickSensor, pyattr_get_connected),
- //KX_PYATTRIBUTE_TODO("events"),
{ NULL } //Sentinel
};
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 <config.h>
-#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 <set>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <config.h>
-#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 <iostream>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 24dbdb94f95..be86b976a70 100644
--- a/source/gameengine/GameLogic/SCA_PropertySensor.cpp
+++ b/source/gameengine/GameLogic/SCA_PropertySensor.cpp
@@ -41,10 +41,6 @@
#include "FloatValue.h"
#include <stdio.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
SCA_PropertySensor::SCA_PropertySensor(SCA_EventManager* eventmgr,
SCA_IObject* gameobj,
const STR_String& propname,
diff --git a/source/gameengine/GameLogic/SCA_PythonController.cpp b/source/gameengine/GameLogic/SCA_PythonController.cpp
index b7367221f80..1f05846abe4 100644
--- a/source/gameengine/GameLogic/SCA_PythonController.cpp
+++ b/source/gameengine/GameLogic/SCA_PythonController.cpp
@@ -43,10 +43,6 @@
#include <algorithm>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
// initialize static member variables
SCA_PythonController* SCA_PythonController::m_sCurrentController = NULL;
@@ -182,7 +178,7 @@ PyObject* SCA_PythonController::sPyGetCurrentController(PyObject *self)
{
if(m_sCurrentController==NULL)
{
- PyErr_SetString(PyExc_SystemError, "GameLogic.getCurrentController(), this function is being run outside the python controllers context, or blenders internal state is corrupt.");
+ PyErr_SetString(PyExc_SystemError, "bge.logic.getCurrentController(), this function is being run outside the python controllers context, or blenders internal state is corrupt.");
return NULL;
}
return m_sCurrentController->GetProxy();
@@ -268,7 +264,7 @@ void SCA_PythonController::ErrorPrint(const char *error_msg)
/* Added in 2.48a, the last_traceback can reference Objects for example, increasing
* their user count. Not to mention holding references to wrapped data.
* This is especially bad when the PyObject for the wrapped data is free'd, after blender
- * has alredy dealocated the pointer */
+ * has already dealocated the pointer */
PySys_SetObject( (char *)"last_traceback", NULL);
PyErr_Clear(); /* just to be sure */
}
@@ -299,49 +295,47 @@ bool SCA_PythonController::Import()
{
//printf("py module modified '%s'\n", m_scriptName.Ptr());
m_bModified= false;
-
+
/* incase we re-import */
Py_XDECREF(m_function);
m_function= NULL;
- vector<STR_String> py_function_path = m_scriptText.Explode('.');
-
- if(py_function_path.size() < 2) {
+ STR_String mod_path_str= m_scriptText; /* just for storage, use C style string access */
+ char *mod_path= mod_path_str.Ptr();
+ char *function_string;
+
+ function_string= strrchr(mod_path, '.');
+
+ if(function_string == NULL) {
printf("Python module name formatting error \"%s\":\n\texpected \"SomeModule.Func\", got \"%s\"\n", GetName().Ptr(), m_scriptText.Ptr());
return false;
}
-
- PyObject *mod = PyImport_ImportModule((char *)py_function_path[0].Ptr());
- /* Dont reload yet, do this within the loop so packages reload too */
-
- if(mod==NULL) {
- ErrorPrint("Python module not found");
+
+ *function_string= '\0';
+ function_string++;
+
+ // Import the module and print an error if it's not found
+ PyObject *mod = PyImport_ImportModule(mod_path);
+
+ if (mod == NULL) {
+ ErrorPrint("Python module can't be imported");
return false;
}
- /* 'mod' will be DECREF'd as 'base'
- * 'm_function' will be left holding a reference that the controller owns */
-
- PyObject *base= mod;
-
- for(unsigned int i=1; i < py_function_path.size(); i++) {
- if(m_debug && PyModule_Check(base)) { /* base could be a class */
- Py_DECREF(base); /* getting a new one so dont hold a ref to the old one */
- base= PyImport_ReloadModule(base);
- if (base==NULL) {
- m_function= NULL;
- break;
- }
- }
-
- m_function = PyObject_GetAttrString(base, py_function_path[i].Ptr());
- Py_DECREF(base);
- base = m_function; /* for the next loop if there is on */
-
- if(m_function==NULL) {
- break;
- }
+
+ if(m_debug)
+ mod = PyImport_ReloadModule(mod);
+
+ if (mod == NULL) {
+ ErrorPrint("Python module can't be reloaded");
+ return false;
}
-
+
+ // Get the function object
+ m_function = PyObject_GetAttrString(mod, function_string);
+
+ // DECREF the module as we don't need it anymore
+ Py_DECREF(mod);
+
if(m_function==NULL) {
if(PyErr_Occurred())
ErrorPrint("Python controller found the module but could not access the function");
@@ -456,7 +450,7 @@ void SCA_PythonController::Trigger(SCA_LogicManager* logicmgr)
/* Added in 2.48a, the last_traceback can reference Objects for example, increasing
* their user count. Not to mention holding references to wrapped data.
* This is especially bad when the PyObject for the wrapped data is free'd, after blender
- * has alredy dealocated the pointer */
+ * has already dealocated the pointer */
PySys_SetObject( (char *)"last_traceback", NULL);
PyErr_Clear(); /* just to be sure */
}
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<SCA_PythonKeyboard*>(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
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<SCA_PythonMouse*>(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<SCA_PythonMouse*>(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<SCA_PythonMouse*>(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<SCA_PythonMouse*>(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<SCA_PythonMouse*>(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 <config.h>
-#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 <iostream>
#include <stdio.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <limits.h>
#include "SCA_RandomNumberGenerator.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <iostream>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#endif
-
/* ------------------------------------------------------------------------- */
/* Native functions */
/* ------------------------------------------------------------------------- */
diff --git a/source/gameengine/GamePlayer/Makefile b/source/gameengine/GamePlayer/Makefile
index c4f78f23117..30a13f26503 100644
--- a/source/gameengine/GamePlayer/Makefile
+++ b/source/gameengine/GamePlayer/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/gameengine/GamePlayer/common/CMakeLists.txt b/source/gameengine/GamePlayer/common/CMakeLists.txt
index 418b77357a4..08a4aa50a00 100644
--- a/source/gameengine/GamePlayer/common/CMakeLists.txt
+++ b/source/gameengine/GamePlayer/common/CMakeLists.txt
@@ -74,4 +74,3 @@ SET(INC
ADD_DEFINITIONS(-DGLEW_STATIC)
BLENDERLIB_NOLIST(gp_common "${SRC}" "${INC}")
-#env.BlenderLib (libname='gp_common', sources=source_files, includes=incs, defines = [], libtype='player', priority=5, compileflags=cflags)
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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#endif
-
GPC_System::GPC_System()
// : m_ndi(0)
{
diff --git a/source/gameengine/GamePlayer/common/Makefile b/source/gameengine/GamePlayer/common/Makefile
index e1b07a226f6..e28cacb826a 100644
--- a/source/gameengine/GamePlayer/common/Makefile
+++ b/source/gameengine/GamePlayer/common/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/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 <config.h>
-#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 <iostream>
#include "GPU_Canvas.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <config.h>
-#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 <X11/Intrinsic.h>
#include <X11/StringDefs.h>
-#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 <sys/time.h>
#include "GPU_System.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
static struct timeval startTime;
static int startTimeDone = 0;
diff --git a/source/gameengine/GamePlayer/common/unix/Makefile b/source/gameengine/GamePlayer/common/unix/Makefile
index c86f61b45d8..db29a087b28 100644
--- a/source/gameengine/GamePlayer/common/unix/Makefile
+++ b/source/gameengine/GamePlayer/common/unix/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/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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <windows.h>
#include "GPW_System.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
GPW_System::GPW_System(void)
{
m_freq = 0;
diff --git a/source/gameengine/GamePlayer/common/windows/Makefile b/source/gameengine/GamePlayer/common/windows/Makefile
index 3f1deb05f3a..200f84dd3e6 100644
--- a/source/gameengine/GamePlayer/common/windows/Makefile
+++ b/source/gameengine/GamePlayer/common/windows/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/gameengine/GamePlayer/ghost/CMakeLists.txt b/source/gameengine/GamePlayer/ghost/CMakeLists.txt
index 848c2f73f06..8164878762c 100644
--- a/source/gameengine/GamePlayer/ghost/CMakeLists.txt
+++ b/source/gameengine/GamePlayer/ghost/CMakeLists.txt
@@ -73,4 +73,3 @@ IF(WITH_FFMPEG)
ENDIF(WITH_FFMPEG)
BLENDERLIB_NOLIST(gp_ghost "${SRC}" "${INC}")
-#env.BlenderLib (libname='gp_ghost', sources=source_files, includes = incs, defines = [], libtype='player',priority=0, compileflags=cflags)
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 <config.h>
-#endif
-
#ifdef WIN32
#pragma warning (disable:4786) // suppress stl-MSVC debug info warning
#include <windows.h>
@@ -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 <assert.h>
#include "GHOST_ISystem.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <config.h>
-#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 <assert.h>
#include "GHOST_ISystem.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 9d87adb7400..9cdee2a340c 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
@@ -664,7 +660,7 @@ int main(int argc, char** argv)
system->getMainDisplayDimensions(fullScreenWidth, fullScreenHeight);
// process first batch of events. If the user
// drops a file on top off the blenderplayer icon, we
- // recieve an event with the filename
+ // receive an event with the filename
system->processEvents(0);
diff --git a/source/gameengine/GamePlayer/ghost/Makefile b/source/gameengine/GamePlayer/ghost/Makefile
index a7fcf46b695..b2fcd2ac1ff 100644
--- a/source/gameengine/GamePlayer/ghost/Makefile
+++ b/source/gameengine/GamePlayer/ghost/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/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/CMakeLists.txt b/source/gameengine/Ketsji/CMakeLists.txt
index c4af701f87b..d8f6e3164ec 100644
--- a/source/gameengine/Ketsji/CMakeLists.txt
+++ b/source/gameengine/Ketsji/CMakeLists.txt
@@ -80,4 +80,3 @@ IF(WITH_FFMPEG)
ENDIF(WITH_FFMPEG)
BLENDERLIB(bf_ketsji "${SRC}" "${INC}")
-#env.BlenderLib ( 'bf_ketsji', sources, Split(incs), [], libtype=['game','player'], priority=[25, 72], compileflags = cflags )
diff --git a/source/gameengine/Ketsji/KXNetwork/CMakeLists.txt b/source/gameengine/Ketsji/KXNetwork/CMakeLists.txt
index 40079f3f83e..ce3d8fa22fc 100644
--- a/source/gameengine/Ketsji/KXNetwork/CMakeLists.txt
+++ b/source/gameengine/Ketsji/KXNetwork/CMakeLists.txt
@@ -45,4 +45,3 @@ ELSE(WITH_PYTHON)
ENDIF(WITH_PYTHON)
BLENDERLIB(kx_network "${SRC}" "${INC}")
-#env.BlenderLib ( 'kx_network', Split(sources), Split(incs), defines=[],libtype=['game2', 'player'], priority=[5, 155] )
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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#endif
-
#ifdef NAN_NET_DEBUG
#include <iostream>
#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 <config.h>
-#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 <config.h>
-#endif
-
diff --git a/source/gameengine/Ketsji/KXNetwork/Makefile b/source/gameengine/Ketsji/KXNetwork/Makefile
index 365ed8fc9c3..aebbd7921cb 100644
--- a/source/gameengine/Ketsji/KXNetwork/Makefile
+++ b/source/gameengine/Ketsji/KXNetwork/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/gameengine/Ketsji/KX_ArmatureSensor.cpp b/source/gameengine/Ketsji/KX_ArmatureSensor.cpp
index 31b92232de6..a47a1972beb 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 <config.h>
-#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..d88997e2128 100644
--- a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
+++ b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
@@ -2,10 +2,6 @@
// ------------------------------------
// ...
// ------------------------------------
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "GL/glew.h"
#include "KX_BlenderMaterial.h"
@@ -798,9 +794,9 @@ PyMethodDef KX_BlenderMaterial::Methods[] =
};
PyAttributeDef KX_BlenderMaterial::Attributes[] = {
- //KX_PYATTRIBUTE_TODO("shader"),
- //KX_PYATTRIBUTE_TODO("materialIndex"),
- //KX_PYATTRIBUTE_TODO("blending"),
+ KX_PYATTRIBUTE_RO_FUNCTION("shader", KX_BlenderMaterial, pyattr_get_shader),
+ KX_PYATTRIBUTE_RO_FUNCTION("material_index", KX_BlenderMaterial, pyattr_get_materialIndex),
+ KX_PYATTRIBUTE_RW_FUNCTION("blending", KX_BlenderMaterial, pyattr_get_blending, pyattr_set_blending),
{ NULL } //Sentinel
};
@@ -826,6 +822,37 @@ PyTypeObject KX_BlenderMaterial::Type = {
py_base_new
};
+PyObject* KX_BlenderMaterial::pyattr_get_shader(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_BlenderMaterial* self= static_cast<KX_BlenderMaterial*>(self_v);
+ return self->PygetShader(NULL, NULL);
+}
+
+PyObject* KX_BlenderMaterial::pyattr_get_materialIndex(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_BlenderMaterial* self= static_cast<KX_BlenderMaterial*>(self_v);
+ return PyLong_FromSsize_t(self->GetMaterialIndex());
+}
+
+PyObject* KX_BlenderMaterial::pyattr_get_blending(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_BlenderMaterial* self= static_cast<KX_BlenderMaterial*>(self_v);
+ unsigned int* bfunc = self->getBlendFunc();
+ return Py_BuildValue("(ll)", (long int)bfunc[0], (long int)bfunc[1]);
+}
+
+int KX_BlenderMaterial::pyattr_set_blending(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_BlenderMaterial* self= static_cast<KX_BlenderMaterial*>(self_v);
+ PyObject* obj = self->PysetBlending(value, NULL);
+ if(obj)
+ {
+ Py_DECREF(obj);
+ return 0;
+ }
+ return -1;
+}
+
KX_PYMETHODDEF_DOC( KX_BlenderMaterial, getShader , "getShader()")
{
if( !GLEW_ARB_fragment_shader) {
@@ -912,7 +939,7 @@ static unsigned int GL_array[11] = {
GL_SRC_ALPHA_SATURATE
};
-KX_PYMETHODDEF_DOC( KX_BlenderMaterial, setBlending , "setBlending( GameLogic.src, GameLogic.dest)")
+KX_PYMETHODDEF_DOC( KX_BlenderMaterial, setBlending , "setBlending( bge.logic.src, bge.logic.dest)")
{
unsigned int b[2];
if(PyArg_ParseTuple(args, "ii:setBlending", &b[0], &b[1]))
diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.h b/source/gameengine/Ketsji/KX_BlenderMaterial.h
index c5f5e23c6e7..239e334f68a 100644
--- a/source/gameengine/Ketsji/KX_BlenderMaterial.h
+++ b/source/gameengine/Ketsji/KX_BlenderMaterial.h
@@ -79,6 +79,9 @@ public:
Image * getImage (unsigned int idx) {
return (idx < MAXTEX && mMaterial) ? mMaterial->img[idx] : NULL;
}
+ unsigned int* getBlendFunc() {
+ return mBlendFunc;
+ }
// for ipos
void UpdateIPO(
MT_Vector4 rgba, MT_Vector3 specrgb,
@@ -88,13 +91,22 @@ public:
virtual void Replace_IScene(SCA_IScene *val)
{
- mScene= static_cast<KX_Scene *>(val);
+ if (mBlenderShader)
+ {
+ mScene= static_cast<KX_Scene *>(val);
+ mBlenderShader->SetScene(mScene);
+ }
};
#ifndef DISABLE_PYTHON
// --------------------------------
virtual PyObject* py_repr(void) { return PyUnicode_FromString(mMaterial->matname.ReadPtr()); }
+ static PyObject* pyattr_get_shader(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_materialIndex(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_blending(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static int pyattr_set_blending(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+
KX_PYMETHOD_DOC( KX_BlenderMaterial, getShader );
KX_PYMETHOD_DOC( KX_BlenderMaterial, getMaterialIndex );
KX_PYMETHOD_DOC( KX_BlenderMaterial, getTexture );
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..2402baf92ac 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 <config.h>
-#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),
@@ -556,8 +553,8 @@ KX_PYMETHODDEF_DOC_VARARGS(KX_Camera, sphereInsideFrustum,
"\tcenter = the center of the sphere (in world coordinates.)\n"
"\tradius = the radius of the sphere\n\n"
"\tExample:\n"
-"\timport GameLogic\n\n"
-"\tco = GameLogic.getCurrentController()\n"
+"\timport bge.logic\n\n"
+"\tco = bge.logic.getCurrentController()\n"
"\tcam = co.GetOwner()\n\n"
"\t# A sphere of radius 4.0 located at [x, y, z] = [1.0, 1.0, 1.0]\n"
"\tif (cam.sphereInsideFrustum([1.0, 1.0, 1.0], 4) != cam.OUTSIDE):\n"
@@ -589,8 +586,8 @@ KX_PYMETHODDEF_DOC_O(KX_Camera, boxInsideFrustum,
"\tinside/outside/intersects this camera's viewing frustum.\n\n"
"\tbox = a list of the eight (8) corners of the box (in world coordinates.)\n\n"
"\tExample:\n"
-"\timport GameLogic\n\n"
-"\tco = GameLogic.getCurrentController()\n"
+"\timport bge.logic\n\n"
+"\tco = bge.logic.getCurrentController()\n"
"\tcam = co.GetOwner()\n\n"
"\tbox = []\n"
"\tbox.append([-1.0, -1.0, -1.0])\n"
@@ -633,8 +630,8 @@ KX_PYMETHODDEF_DOC_O(KX_Camera, pointInsideFrustum,
"\treturns 1 if the given point is inside this camera's viewing frustum.\n\n"
"\tpoint = The point to test (in world coordinates.)\n\n"
"\tExample:\n"
-"\timport GameLogic\n\n"
-"\tco = GameLogic.getCurrentController()\n"
+"\timport bge.logic\n\n"
+"\tco = bge.logic.getCurrentController()\n"
"\tcam = co.GetOwner()\n\n"
"\t# Test point [0.0, 0.0, 0.0]"
"\tif (cam.pointInsideFrustum([0.0, 0.0, 0.0])):\n"
@@ -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<KX_Camera*>(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<KX_Camera*>(self_v);
+ float param = PyFloat_AsDouble(value);
+ if (param == -1) {
+ PyErr_SetString(PyExc_AttributeError, "camera.ortho_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<KX_Camera*>(self_v);
diff --git a/source/gameengine/Ketsji/KX_Camera.h b/source/gameengine/Ketsji/KX_Camera.h
index e209f0461b9..ad2460d34ef 100644
--- a/source/gameengine/Ketsji/KX_Camera.h
+++ b/source/gameengine/Ketsji/KX_Camera.h
@@ -51,7 +51,7 @@ class KX_Camera : public KX_GameObject
Py_Header;
protected:
friend class KX_Scene;
- /** Camera parameters (clips distances, focal lenght). These
+ /** Camera parameters (clips distances, focal length). These
* params are closely tied to Blender. In the gameengine, only the
* projection and modelview matrices are relevant. There's a
* conversion being done in the engine class. Why is it stored
@@ -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 <config.h>
-#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 <config.h>
-#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 <stdio.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
/* ------------------------------------------------------------------------- */
/* Native functions */
/* ------------------------------------------------------------------------- */
diff --git a/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp b/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
index de6530bf54a..b1baa5fe9e1 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 <config.h>
-#endif
-
KX_ConstraintWrapper::KX_ConstraintWrapper(
PHY_ConstraintType ctype,
int constraintId,
@@ -114,8 +110,14 @@ PyMethodDef KX_ConstraintWrapper::Methods[] = {
};
PyAttributeDef KX_ConstraintWrapper::Attributes[] = {
- //KX_PYATTRIBUTE_TODO("constraintId"),
+ KX_PYATTRIBUTE_RO_FUNCTION("constraint_id", KX_ConstraintWrapper, pyattr_get_constraintId),
{ NULL } //Sentinel
};
+PyObject* KX_ConstraintWrapper::pyattr_get_constraintId(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_ConstraintWrapper* self= static_cast<KX_ConstraintWrapper*>(self_v);
+ return self->PyGetConstraintId();
+}
+
#endif // DISABLE_PYTHON
diff --git a/source/gameengine/Ketsji/KX_ConstraintWrapper.h b/source/gameengine/Ketsji/KX_ConstraintWrapper.h
index 530ecf16fed..db9543c23ae 100644
--- a/source/gameengine/Ketsji/KX_ConstraintWrapper.h
+++ b/source/gameengine/Ketsji/KX_ConstraintWrapper.h
@@ -44,6 +44,8 @@ public:
KX_PYMETHOD_NOARGS(KX_ConstraintWrapper,GetConstraintId);
KX_PYMETHOD(KX_ConstraintWrapper,SetParam);
KX_PYMETHOD(KX_ConstraintWrapper,GetParam);
+
+ static PyObject* pyattr_get_constraintId(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
#endif
private:
diff --git a/source/gameengine/Ketsji/KX_Dome.cpp b/source/gameengine/Ketsji/KX_Dome.cpp
index b62593b7911..94258088e9f 100644
--- a/source/gameengine/Ketsji/KX_Dome.cpp
+++ b/source/gameengine/Ketsji/KX_Dome.cpp
@@ -754,7 +754,7 @@ So I came out with this formula:
verts_height = tan((rad_ang/2) - (MT_PI/2))*sqrt(2.0);
Here we take half the sphere(rad_ang/2) and subtract a quarter of it (MT_PI/2)
-Therefore we have the lenght in radians of the dome/sphere over the horizon.
+Therefore we have the length in radians of the dome/sphere over the horizon.
Once we take the tangent of that angle, you have the verts coordinate corresponding to the verts on the side faces.
Then we need to multiply it by sqrt(2.0) to get the coordinate of the verts on the diagonal of the original cube.
*/
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 <config.h>
-#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 <stdio.h>
#include <stdlib.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
/* ------------------------------------------------------------------------- */
/* Native functions */
/* ------------------------------------------------------------------------- */
diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp
index 637b874ef5e..e44aac2699c 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 <config.h>
-#endif
-
#if defined(_WIN64)
typedef unsigned __int64 uint_ptr;
#else
@@ -850,7 +846,7 @@ void KX_GameObject::AlignAxisToVect(const MT_Vector3& dir, int axis, float fac)
{
case 0: //x axis
ori.setValue(orimat[0][2], orimat[1][2], orimat[2][2]); //pivot axis
- if (MT_abs(vect.dot(ori)) > 1.0-3.0*MT_EPSILON) //is the vector paralell to the pivot?
+ if (MT_abs(vect.dot(ori)) > 1.0-3.0*MT_EPSILON) //is the vector parallel to the pivot?
ori.setValue(orimat[0][1], orimat[1][1], orimat[2][1]); //change the pivot!
if (fac == 1.0) {
x = vect;
@@ -1256,56 +1252,56 @@ void KX_GameObject::Relink(GEN_Map<GEN_HashedPtr, void*> *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_cast<KX_GameObject*>BGE_PROXY_REF(self_v);
+ KX_GameObject* self= static_cast<KX_GameObject*>BGE_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_cast<KX_GameObject*>BGE_PROXY_REF(self_v);
+ KX_GameObject* self= static_cast<KX_GameObject*>BGE_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;
}
@@ -1313,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_cast<KX_GameObject*>BGE_PROXY_REF(self_v);
+ KX_GameObject* self= static_cast<KX_GameObject*>BGE_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 = {
@@ -1396,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_cast<KX_GameObject*>BGE_PROXY_REF(self_v);
+ KX_GameObject* self= static_cast<KX_GameObject*>BGE_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;
}
@@ -1415,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_cast<KX_GameObject*>BGE_PROXY_REF(self_v);
+ KX_GameObject* self= static_cast<KX_GameObject*>BGE_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;
@@ -1746,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 = {
@@ -2740,7 +2734,7 @@ KX_PYMETHODDEF_DOC(KX_GameObject, rayCastTo,
KX_RayCast::Callback<KX_GameObject> 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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#endif
-
#include "KX_KetsjiEngine.h"
/* ------------------------------------------------------------------------- */
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
index a13cd71fdac..1a6ae69f792 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
@@ -235,7 +235,7 @@ void KX_KetsjiEngine::SetRasterizer(RAS_IRasterizer* rasterizer)
#ifndef DISABLE_PYTHON
/*
- * At the moment the GameLogic module is imported into 'pythondictionary' after this function is called.
+ * At the moment the bge.logic module is imported into 'pythondictionary' after this function is called.
* if this function ever changes to assign a copy, make sure the game logic module is imported into this dictionary before hand.
*/
void KX_KetsjiEngine::SetPyNamespace(PyObject* pythondictionary)
@@ -966,44 +966,17 @@ void KX_KetsjiEngine::DoSound(KX_Scene* scene)
KX_Camera* cam = scene->GetActiveCamera();
if (!cam)
return;
- MT_Point3 listenerposition = cam->NodeGetWorldPosition();
- MT_Vector3 listenervelocity = cam->GetLinearVelocity();
- MT_Matrix3x3 listenerorientation = cam->NodeGetWorldOrientation();
- {
- AUD_3DData data;
- float f;
-
- listenerorientation.getValue3x3(data.orientation);
- listenerposition.getValue(data.position);
- listenervelocity.getValue(data.velocity);
-
- f = data.position[1];
- data.position[1] = data.position[2];
- data.position[2] = -f;
-
- f = data.velocity[1];
- data.velocity[1] = data.velocity[2];
- data.velocity[2] = -f;
+ float f[4];
- f = data.orientation[1];
- data.orientation[1] = data.orientation[2];
- data.orientation[2] = -f;
+ cam->NodeGetWorldPosition().getValue(f);
+ AUD_setListenerLocation(f);
- f = data.orientation[3];
- data.orientation[3] = -data.orientation[6];
- data.orientation[6] = f;
+ cam->GetLinearVelocity().getValue(f);
+ AUD_setListenerVelocity(f);
- f = data.orientation[4];
- data.orientation[4] = -data.orientation[8];
- data.orientation[8] = -f;
-
- f = data.orientation[5];
- data.orientation[5] = data.orientation[7];
- data.orientation[7] = f;
-
- AUD_updateListener(&data);
- }
+ cam->NodeGetWorldOrientation().getRotation().getValue(f);
+ AUD_setListenerOrientation(f);
}
@@ -1626,7 +1599,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..f52ec8192cc 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.h
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.h
@@ -71,6 +71,7 @@ private:
class KX_ISceneConverter* m_sceneconverter;
class NG_NetworkDeviceInterface* m_networkdevice;
#ifndef DISABLE_PYTHON
+ /* borrowed from sys.modules["__main__"], dont manage ref's */
PyObject* m_pythondictionary;
#endif
class SCA_IInputDevice* m_keyboarddevice;
@@ -213,6 +214,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 +413,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..ac20b4f2f56 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 <config.h>
-#endif
-
#ifdef WIN32
#pragma warning (disable : 4786)
@@ -70,7 +66,7 @@ KX_LightObject::~KX_LightObject()
if((lamp = GetGPULamp())) {
float obmat[4][4] = {{0}};
- GPU_lamp_update(lamp, 0, obmat);
+ GPU_lamp_update(lamp, 0, 0, obmat);
}
m_rendertools->RemoveLight(&m_lightobj);
@@ -203,7 +199,7 @@ void KX_LightObject::Update()
for(int j=0; j<4; j++, dobmat++)
obmat[i][j] = (float)*dobmat;
- GPU_lamp_update(lamp, m_lightobj.m_layer, obmat);
+ GPU_lamp_update(lamp, m_lightobj.m_layer, 0, obmat);
GPU_lamp_update_colors(lamp, m_lightobj.m_red, m_lightobj.m_green,
m_lightobj.m_blue, m_lightobj.m_energy);
}
@@ -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_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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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_cast<KX_ObjectActuator*>BGE_PROXY_REF(self_v);
+ KX_ObjectActuator* self= static_cast<KX_ObjectActuator*>BGE_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_cast<KX_ObjectActuator*>BGE_PROXY_REF(self_v);
+ KX_ObjectActuator* self= static_cast<KX_ObjectActuator*>BGE_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_cast<KX_ObjectActuator*>BGE_PROXY_REF(self_v);
+ KX_ObjectActuator* self= static_cast<KX_ObjectActuator*>BGE_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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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..9395e57e68b 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 <config.h>
-#endif
-
#include "KX_PolyProxy.h"
#include "KX_MeshProxy.h"
#include "RAS_MeshObject.h"
@@ -76,90 +72,19 @@ PyMethodDef KX_PolyProxy::Methods[] = {
};
PyAttributeDef KX_PolyProxy::Attributes[] = {
- /* All dummy's so they come up in a dir() */
- //KX_PYATTRIBUTE_TODO("DummyProps"),
- KX_PYATTRIBUTE_DUMMY("matname"),
- KX_PYATTRIBUTE_DUMMY("texture"),
- KX_PYATTRIBUTE_DUMMY("material"),
- KX_PYATTRIBUTE_DUMMY("matid"),
- KX_PYATTRIBUTE_DUMMY("v1"),
- KX_PYATTRIBUTE_DUMMY("v2"),
- KX_PYATTRIBUTE_DUMMY("v3"),
- KX_PYATTRIBUTE_DUMMY("v4"),
- KX_PYATTRIBUTE_DUMMY("visible"),
- KX_PYATTRIBUTE_DUMMY("collide"),
+ KX_PYATTRIBUTE_RO_FUNCTION("material_name", KX_PolyProxy, pyattr_get_material_name),
+ KX_PYATTRIBUTE_RO_FUNCTION("texture_name", KX_PolyProxy, pyattr_get_texture_name),
+ KX_PYATTRIBUTE_RO_FUNCTION("material", KX_PolyProxy, pyattr_get_material),
+ KX_PYATTRIBUTE_RO_FUNCTION("material_id", KX_PolyProxy, pyattr_get_material_id),
+ KX_PYATTRIBUTE_RO_FUNCTION("v1", KX_PolyProxy, pyattr_get_v1),
+ KX_PYATTRIBUTE_RO_FUNCTION("v2", KX_PolyProxy, pyattr_get_v2),
+ KX_PYATTRIBUTE_RO_FUNCTION("v3", KX_PolyProxy, pyattr_get_v3),
+ KX_PYATTRIBUTE_RO_FUNCTION("v4", KX_PolyProxy, pyattr_get_v4),
+ KX_PYATTRIBUTE_RO_FUNCTION("visible", KX_PolyProxy, pyattr_get_visible),
+ KX_PYATTRIBUTE_RO_FUNCTION("collide", KX_PolyProxy, pyattr_get_collide),
{ NULL } //Sentinel
};
-#if 0
-PyObject* KX_PolyProxy::py_getattro(PyObject *attr)
-{
- char *attr_str= _PyUnicode_AsString(attr);
- if (!strcmp(attr_str, "matname"))
- {
- return PyUnicode_FromString(m_polygon->GetMaterial()->GetPolyMaterial()->GetMaterialName());
- }
- if (!strcmp(attr_str, "texture"))
- {
- return PyUnicode_FromString(m_polygon->GetMaterial()->GetPolyMaterial()->GetTextureName());
- }
- if (!strcmp(attr_str, "material"))
- {
- RAS_IPolyMaterial *polymat = m_polygon->GetMaterial()->GetPolyMaterial();
- if(polymat->GetFlag() & RAS_BLENDERMAT)
- {
- KX_BlenderMaterial* mat = static_cast<KX_BlenderMaterial*>(polymat);
- return mat->GetProxy();
- }
- else
- {
- KX_PolygonMaterial* mat = static_cast<KX_PolygonMaterial*>(polymat);
- return mat->GetProxy();
- }
- }
- if (!strcmp(attr_str, "matid"))
- {
- // we'll have to scan through the material bucket of the mes and compare with
- // the one of the polygon
- RAS_MaterialBucket* polyBucket = m_polygon->GetMaterial();
- unsigned int matid;
- for (matid=0; matid<(unsigned int)m_mesh->NumMaterials(); matid++)
- {
- RAS_MeshMaterial* meshMat = m_mesh->GetMeshMaterial(matid);
- if (meshMat->m_bucket == polyBucket)
- // found it
- break;
- }
- return PyLong_FromSsize_t(matid);
- }
- if (!strcmp(attr_str, "v1"))
- {
- return PyLong_FromSsize_t(m_polygon->GetVertexOffsetAbs(m_mesh, 0));
- }
- if (!strcmp(attr_str, "v2"))
- {
- return PyLong_FromSsize_t(m_polygon->GetVertexOffsetAbs(m_mesh, 1));
- }
- if (!strcmp(attr_str, "v3"))
- {
- return PyLong_FromSsize_t(m_polygon->GetVertexOffsetAbs(m_mesh, 2));
- }
- if (!strcmp(attr_str, "v4"))
- {
- return PyLong_FromSsize_t(((m_polygon->VertexCount()>3)?m_polygon->GetVertexOffsetAbs(m_mesh, 3):0));
- }
- if (!strcmp(attr_str, "visible"))
- {
- return PyLong_FromSsize_t(m_polygon->IsVisible());
- }
- if (!strcmp(attr_str, "collide"))
- {
- return PyLong_FromSsize_t(m_polygon->IsCollider());
- }
- // py_getattro_up(CValue); // XXX -- todo, make all these attributes
-}
-#endif
-
KX_PolyProxy::KX_PolyProxy(const RAS_MeshObject*mesh, RAS_Polygon* polygon)
: m_polygon(polygon),
m_mesh((RAS_MeshObject*)mesh)
@@ -183,7 +108,75 @@ CValue* KX_PolyProxy::GetReplica() { return NULL;}
// stuff for python integration
-KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getMaterialIndex,
+PyObject* KX_PolyProxy::pyattr_get_material_name(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
+ return self->PygetMaterialName();
+}
+
+PyObject* KX_PolyProxy::pyattr_get_texture_name(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
+ return self->PygetTextureName();
+}
+
+PyObject* KX_PolyProxy::pyattr_get_material(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
+ return self->PygetMaterial();
+}
+
+PyObject* KX_PolyProxy::pyattr_get_material_id(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
+ return self->PygetMaterialIndex();
+}
+
+PyObject* KX_PolyProxy::pyattr_get_v1(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
+
+ return PyLong_FromSsize_t(self->m_polygon->GetVertexOffsetAbs(self->m_mesh, 0));
+}
+
+PyObject* KX_PolyProxy::pyattr_get_v2(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
+
+ return PyLong_FromSsize_t(self->m_polygon->GetVertexOffsetAbs(self->m_mesh, 1));
+}
+
+PyObject* KX_PolyProxy::pyattr_get_v3(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
+
+ return PyLong_FromSsize_t(self->m_polygon->GetVertexOffsetAbs(self->m_mesh, 2));
+}
+
+PyObject* KX_PolyProxy::pyattr_get_v4(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
+
+ if (3 < self->m_polygon->VertexCount())
+ {
+ return PyLong_FromSsize_t(self->m_polygon->GetVertexOffsetAbs(self->m_mesh, 3));
+ }
+ return PyLong_FromSsize_t(0);
+}
+
+PyObject* KX_PolyProxy::pyattr_get_visible(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
+ return self->PyisVisible();
+}
+
+PyObject* KX_PolyProxy::pyattr_get_collide(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
+ return self->PyisCollider();
+}
+
+KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getMaterialIndex,
"getMaterialIndex() : return the material index of the polygon in the mesh\n")
{
RAS_MaterialBucket* polyBucket = m_polygon->GetMaterial();
diff --git a/source/gameengine/Ketsji/KX_PolyProxy.h b/source/gameengine/Ketsji/KX_PolyProxy.h
index 97d89b37435..3e669630e30 100644
--- a/source/gameengine/Ketsji/KX_PolyProxy.h
+++ b/source/gameengine/Ketsji/KX_PolyProxy.h
@@ -54,6 +54,16 @@ public:
// stuff for python integration
+ static PyObject* pyattr_get_material_name(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_texture_name(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_material(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_material_id(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_v1(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_v2(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_v3(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_v4(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_visible(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_collide(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
KX_PYMETHOD_DOC_NOARGS(KX_PolyProxy,getMaterialIndex)
KX_PYMETHOD_DOC_NOARGS(KX_PolyProxy,getNumVertex)
diff --git a/source/gameengine/Ketsji/KX_PolygonMaterial.cpp b/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
index b94f3ee6c27..63204b16e8b 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 <config.h>
-#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);
@@ -237,7 +233,7 @@ PyAttributeDef KX_PolygonMaterial::Attributes[] = {
KX_PYATTRIBUTE_FLOAT_RW("shininess", 0.0f, 1000.0f, KX_PolygonMaterial, m_shininess),
KX_PYATTRIBUTE_FLOAT_RW("specularity", 0.0f, 1000.0f, KX_PolygonMaterial, m_specularity),
- KX_PYATTRIBUTE_RW_FUNCTION("diffuse", KX_PolygonMaterial, pyattr_get_texture, pyattr_set_diffuse),
+ KX_PYATTRIBUTE_RW_FUNCTION("diffuse", KX_PolygonMaterial, pyattr_get_diffuse, pyattr_set_diffuse),
KX_PYATTRIBUTE_RW_FUNCTION("specular",KX_PolygonMaterial, pyattr_get_specular, pyattr_set_specular),
KX_PYATTRIBUTE_RO_FUNCTION("tface", KX_PolygonMaterial, pyattr_get_tface), /* How the heck is this even useful??? - Campbell */
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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 7dec4e4f97f..3785f715803 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInit.cpp
@@ -38,12 +38,17 @@
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 */
}
+
+#define WITH_PYTHON
+#include "AUD_PyInit.h"
+
#endif
#include "KX_PythonInit.h"
@@ -73,6 +78,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"
@@ -115,21 +122,24 @@ extern "C" {
#include "KX_BlenderSceneConverter.h"
#include "KX_MeshProxy.h" /* for creating a new library of mesh objects */
extern "C" {
- #include "BLO_readfile.h"
+ #include "BKE_idcode.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)
{
@@ -256,8 +266,8 @@ static PyObject* gPyRestartGame(PyObject*)
}
static char gPySaveGlobalDict_doc[] =
-"saveGlobalDict()\n\
-Saves GameLogic.globalDict to a file";
+ "saveGlobalDict()\n"
+ "Saves bge.logic.globalDict to a file";
static PyObject* gPySaveGlobalDict(PyObject*)
{
@@ -293,8 +303,8 @@ static PyObject* gPySaveGlobalDict(PyObject*)
}
static char gPyLoadGlobalDict_doc[] =
-"LoadGlobalDict()\n\
-Loads GameLogic.globalDict from a file";
+ "LoadGlobalDict()\n"
+ "Loads bge.logic.globalDict from a file";
static PyObject* gPyLoadGlobalDict(PyObject*)
{
@@ -369,15 +379,6 @@ static PyObject* gPyGetSpectrum(PyObject*)
return resultlist;
}
-
-static PyObject* gPyStopDSP(PyObject*, PyObject* args)
-{
- PyErr_SetString(PyExc_RuntimeError, "no audio device available");
- return NULL;
-
- Py_RETURN_NONE;
-}
-
static PyObject* gPySetLogicTicRate(PyObject*, PyObject* args)
{
float ticrate;
@@ -660,7 +661,7 @@ static PyObject *gLibNew(PyObject*, PyObject* args)
return NULL;
}
- idcode= BLO_idcode_from_name(group);
+ idcode= BKE_idcode_from_name(group);
if(idcode==0) {
PyErr_Format(PyExc_ValueError, "invalid group given \"%s\"", group);
return NULL;
@@ -746,7 +747,6 @@ static struct PyMethodDef game_methods[] = {
{"getRandomFloat",(PyCFunction) gPyGetRandomFloat, METH_NOARGS, (const char *)gPyGetRandomFloat_doc},
{"setGravity",(PyCFunction) gPySetGravity, METH_O, (const char *)"set Gravitation"},
{"getSpectrum",(PyCFunction) gPyGetSpectrum, METH_NOARGS, (const char *)"get audio spectrum"},
- {"stopDSP",(PyCFunction) gPyStopDSP, METH_VARARGS, (const char *)"stop using the audio dsp (for performance reasons)"},
{"getMaxLogicFrame", (PyCFunction) gPyGetMaxLogicFrame, METH_NOARGS, (const char *)"Gets the max number of logic frame per render frame"},
{"setMaxLogicFrame", (PyCFunction) gPySetMaxLogicFrame, METH_VARARGS, (const char *)"Sets the max number of logic frame per render frame"},
{"getMaxPhysicsFrame", (PyCFunction) gPyGetMaxPhysicsFrame, METH_NOARGS, (const char *)"Gets the max number of physics frame per render frame"},
@@ -929,7 +929,6 @@ static PyObject* gPyDisableMist(PyObject*)
Py_RETURN_NONE;
}
-
static PyObject* gPySetMistStart(PyObject*, PyObject* args)
{
@@ -1226,7 +1225,7 @@ static struct PyMethodDef rasterizer_methods[] = {
// Initialization function for the module (*must* be called initGameLogic)
static char GameLogic_module_documentation[] =
-"This is the Python API for the game engine of GameLogic"
+"This is the Python API for the game engine of bge.logic"
;
static char Rasterizer_module_documentation[] =
@@ -1280,6 +1279,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);
@@ -1308,19 +1314,25 @@ 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);
- KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_FHPX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPX);
- KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_FHPY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPY);
- KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_FHPZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPZ);
- 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_CONSTRAINTACT_FHPX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPX);
+ KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHPY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPY);
+ KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHPZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPZ);
+ KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHNX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNX);
+ KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHNY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNY);
+ KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHNZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNZ);
+ KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_NORMAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_NORMAL);
+ KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_MATERIAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_MATERIAL);
+ KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_PERMANENT, KX_ConstraintActuator::KX_ACT_CONSTRAINT_PERMANENT);
+ KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DISTANCE, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DISTANCE);
+ KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCAL);
+ KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_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 +1471,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 +1487,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 +1496,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);
@@ -1566,7 +1574,7 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack
// Check for errors
if (PyErr_Occurred())
{
- Py_FatalError("can't initialize module GameLogic");
+ Py_FatalError("can't initialize module bge.logic");
}
return m;
@@ -1622,7 +1630,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 +1699,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);
@@ -1818,7 +1826,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;
}
@@ -1896,9 +1904,8 @@ PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecur
first_time = false;
PyObjectPlus::ClearDeprecationWarning();
-
- PyObject* moduleobj = PyImport_AddModule("__main__");
- return PyModule_GetDict(moduleobj);
+
+ return bpy_namespace_dict_new(NULL);
}
void exitGamePlayerPythonScripting()
@@ -1933,9 +1940,8 @@ PyObject* initGamePythonScripting(const STR_String& progname, TPythonSecurityLev
initPySysObjects(maggie);
PyObjectPlus::NullDeprecationWarning();
-
- PyObject* moduleobj = PyImport_AddModule("__main__");
- return PyModule_GetDict(moduleobj);
+
+ return bpy_namespace_dict_new(NULL);
}
void exitGamePythonScripting()
@@ -1965,20 +1971,18 @@ void setupGamePython(KX_KetsjiEngine* ketsjiengine, KX_Scene* startscene, Main *
PyDict_SetItemString(PyModule_GetDict(*gameLogic), "globalDict", pyGlobalDict); // Same as importing the module.
*gameLogic_keys = PyDict_Keys(PyModule_GetDict(*gameLogic));
- PyDict_SetItemString(dictionaryobject, "GameLogic", *gameLogic); // Same as importing the module.
initGameKeys();
initPythonConstraintBinding();
initMathutils();
initGeometry();
initBGL();
-
-#ifdef WITH_FFMPEG
+ initBLF();
+ AUD_initPython();
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("sys = __import__('sys');mod = sys.modules['bge'] = type(sys)('bge');mod.__dict__.update({'logic':__import__('GameLogic'), 'render':__import__('Rasterizer'), 'events':__import__('GameKeys'), 'constraints':__import__('PhysicsConstraints'), 'types':__import__('GameTypes')});import bge");
}
static struct PyModuleDef Rasterizer_module_def = {
@@ -2249,6 +2253,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 +2268,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 +2301,11 @@ PyObject* initBGL()
return BGL_Init();
}
+PyObject* initBLF()
+{
+ return BLF_Init();
+}
+
// utility function for loading and saving the globalDict
int saveGamePythonConfig( char **marshal_buffer)
{
@@ -2305,15 +2330,15 @@ int saveGamePythonConfig( char **marshal_buffer)
memcpy(*marshal_buffer, marshal_cstring, marshal_length);
Py_DECREF(pyGlobalDictMarshal);
} else {
- printf("Error, GameLogic.globalDict could not be marshal'd\n");
+ printf("Error, bge.logic.globalDict could not be marshal'd\n");
}
} else {
- printf("Error, GameLogic.globalDict was removed\n");
+ printf("Error, bge.logic.globalDict was removed\n");
}
Py_DECREF(gameLogic);
} else {
PyErr_Clear();
- printf("Error, GameLogic failed to import GameLogic.globalDict will be lost\n");
+ printf("Error, bge.logic failed to import bge.logic.globalDict will be lost\n");
}
return marshal_length;
}
@@ -2345,7 +2370,7 @@ int loadGamePythonConfig(char *marshal_buffer, int marshal_length)
}
} else {
PyErr_Clear();
- printf("Error, GameLogic failed to import GameLogic.globalDict will be lost\n");
+ printf("Error, bge.logic failed to import bge.logic.globalDict will be lost\n");
}
}
return 0;
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 f28c9518ac4..5c87fe2e757 100644
--- a/source/gameengine/Ketsji/KX_PythonSeq.cpp
+++ b/source/gameengine/Ketsji/KX_PythonSeq.cpp
@@ -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 = {
@@ -349,7 +351,7 @@ static PyObject *KX_PythonSeq_getIter(KX_PythonSeq *self)
return NULL;
}
- /* create a new iterator if were alredy using this one */
+ /* create a new iterator if were already using this one */
if (self->iter == -1) {
self->iter = 0;
Py_INCREF(self);
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 <config.h>
-#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 <iostream>
#include <stdio.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
void KX_RayEventManager::NextFrame()
{
SG_DList::iterator<SCA_ISensor> 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 <stdio.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 5bcaa3ee01e..d4936d7054c 100644
--- a/source/gameengine/Ketsji/KX_Scene.cpp
+++ b/source/gameengine/Ketsji/KX_Scene.cpp
@@ -68,7 +68,6 @@
#include "SG_Tree.h"
#include "DNA_group_types.h"
#include "DNA_scene_types.h"
-#include "BKE_anim.h"
#include "KX_SG_NodeRelationships.h"
@@ -139,7 +138,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 +170,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);
@@ -529,7 +529,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.
@@ -961,8 +961,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++)
{
@@ -1066,12 +1066,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));
@@ -1753,7 +1753,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);
@@ -1998,6 +1998,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)
diff --git a/source/gameengine/Ketsji/KX_Scene.h b/source/gameengine/Ketsji/KX_Scene.h
index 407f3f1cf1a..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();
@@ -608,8 +614,6 @@ public:
//void PrintStats(int verbose_level) {
// m_bucketmanager->PrintStats(verbose_level)
//}
-
-
};
typedef std::vector<KX_Scene*> 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 <config.h>
-#endif
-
/* ------------------------------------------------------------------------- */
/* Native functions */
/* ------------------------------------------------------------------------- */
diff --git a/source/gameengine/Ketsji/KX_SoundActuator.cpp b/source/gameengine/Ketsji/KX_SoundActuator.cpp
index 08f235801a0..9ebb36578c4 100644
--- a/source/gameengine/Ketsji/KX_SoundActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SoundActuator.cpp
@@ -31,14 +31,11 @@
*/
#include "KX_SoundActuator.h"
+#include "AUD_C-API.h"
#include "KX_GameObject.h"
#include "KX_PyMath.h" // needed for PyObjectFrom()
#include <iostream>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
/* ------------------------------------------------------------------------- */
/* Native functions */
/* ------------------------------------------------------------------------- */
@@ -79,23 +76,20 @@ void KX_SoundActuator::play()
// this is the sound that will be played and not deleted afterwards
AUD_Sound* sound = m_sound;
- // this sounds are for temporary stacked sounds, will be deleted if not NULL
+ // this sound is for temporary stacked sounds, will be deleted if not NULL
AUD_Sound* sound2 = NULL;
- AUD_Sound* sound3 = NULL;
+
+ bool loop = false;
switch (m_type)
{
case KX_SOUNDACT_LOOPBIDIRECTIONAL:
case KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP:
- // create a ping pong sound on sound2 stacked on the orignal sound
- sound2 = AUD_pingpongSound(sound);
- // create a loop sound on sound3 stacked on the pingpong sound and let that one play (save it to sound)
- sound = sound3 = AUD_loopSound(sound2);
- break;
+ sound = sound2 = AUD_pingpongSound(sound);
+ // fall through
case KX_SOUNDACT_LOOPEND:
case KX_SOUNDACT_LOOPSTOP:
- // create a loop sound on sound2 stacked on the pingpong sound and let that one play (save it to sound)
- sound = sound2 = AUD_loopSound(sound);
+ loop = true;
break;
case KX_SOUNDACT_PLAYSTOP:
case KX_SOUNDACT_PLAYEND:
@@ -106,28 +100,27 @@ void KX_SoundActuator::play()
if(m_is3d)
{
// sound shall be played 3D
- m_handle = AUD_play3D(sound, 0);
-
- AUD_set3DSourceSetting(m_handle, AUD_3DSS_MAX_GAIN, m_3d.max_gain);
- AUD_set3DSourceSetting(m_handle, AUD_3DSS_MIN_GAIN, m_3d.min_gain);
- AUD_set3DSourceSetting(m_handle, AUD_3DSS_REFERENCE_DISTANCE, m_3d.reference_distance);
- AUD_set3DSourceSetting(m_handle, AUD_3DSS_MAX_DISTANCE, m_3d.max_distance);
- AUD_set3DSourceSetting(m_handle, AUD_3DSS_ROLLOFF_FACTOR, m_3d.rolloff_factor);
- AUD_set3DSourceSetting(m_handle, AUD_3DSS_CONE_INNER_ANGLE, m_3d.cone_inner_angle);
- AUD_set3DSourceSetting(m_handle, AUD_3DSS_CONE_OUTER_ANGLE, m_3d.cone_outer_angle);
- AUD_set3DSourceSetting(m_handle, AUD_3DSS_CONE_OUTER_GAIN, m_3d.cone_outer_gain);
+ m_handle = AUD_play(sound, 0);
+
+ AUD_setRelative(m_handle, false);
+ AUD_setVolumeMaximum(m_handle, m_3d.max_gain);
+ AUD_setVolumeMinimum(m_handle, m_3d.min_gain);
+ AUD_setDistanceReference(m_handle, m_3d.reference_distance);
+ AUD_setDistanceMaximum(m_handle, m_3d.max_distance);
+ AUD_setAttenuation(m_handle, m_3d.rolloff_factor);
+ AUD_setConeAngleInner(m_handle, m_3d.cone_inner_angle);
+ AUD_setConeAngleOuter(m_handle, m_3d.cone_outer_angle);
+ AUD_setConeVolumeOuter(m_handle, m_3d.cone_outer_gain);
}
else
m_handle = AUD_play(sound, 0);
+ if(loop)
+ AUD_setLoop(m_handle, -1);
AUD_setSoundPitch(m_handle, m_pitch);
AUD_setSoundVolume(m_handle, m_volume);
m_isplaying = true;
- // now we unload the pingpong and loop sounds, as we don't need them anymore
- // the started sound will continue playing like it was created, don't worry!
- if(sound3)
- AUD_unload(sound3);
if(sound2)
AUD_unload(sound2);
}
@@ -187,7 +180,7 @@ bool KX_SoundActuator::Update(double curtime, bool frame)
case KX_SOUNDACT_LOOPBIDIRECTIONAL:
{
// stop the looping so that the sound stops when it finished
- AUD_setLoop(m_handle, 0, -1);
+ AUD_setLoop(m_handle, 0);
break;
}
default:
@@ -219,39 +212,15 @@ bool KX_SoundActuator::Update(double curtime, bool frame)
{
if(m_is3d)
{
- AUD_3DData data;
- float f;
- ((KX_GameObject*)this->GetParent())->NodeGetWorldPosition().getValue(data.position);
- ((KX_GameObject*)this->GetParent())->GetLinearVelocity().getValue(data.velocity);
- ((KX_GameObject*)this->GetParent())->NodeGetWorldOrientation().getValue3x3(data.orientation);
-
- /*
- * The 3D data from blender has to be transformed for OpenAL:
- * - In blender z is up and y is forwards
- * - In OpenAL y is up and z is backwards
- * We have to do that for all 5 vectors.
- */
- f = data.position[1];
- data.position[1] = data.position[2];
- data.position[2] = -f;
-
- f = data.velocity[1];
- data.velocity[1] = data.velocity[2];
- data.velocity[2] = -f;
-
- f = data.orientation[1];
- data.orientation[1] = data.orientation[2];
- data.orientation[2] = -f;
-
- f = data.orientation[4];
- data.orientation[4] = data.orientation[5];
- data.orientation[5] = -f;
-
- f = data.orientation[7];
- data.orientation[7] = data.orientation[8];
- data.orientation[8] = -f;
-
- AUD_update3DSource(m_handle, &data);
+ KX_GameObject* obj = (KX_GameObject*)this->GetParent();
+ float f[4];
+
+ obj->NodeGetWorldPosition().getValue(f);
+ AUD_setSourceLocation(m_handle, f);
+ obj->GetLinearVelocity().getValue(f);
+ AUD_setSourceVelocity(m_handle, f);
+ obj->NodeGetWorldOrientation().getRotation().getValue(f);
+ AUD_setSourceOrientation(m_handle, f);
}
result = true;
}
@@ -299,24 +268,23 @@ 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[] = {
KX_PYATTRIBUTE_BOOL_RO("is3D", KX_SoundActuator, m_is3d),
- KX_PYATTRIBUTE_RW_FUNCTION("maxGain3D", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property),
- KX_PYATTRIBUTE_RW_FUNCTION("minGain3D", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property),
- KX_PYATTRIBUTE_RW_FUNCTION("referenceDistance3D", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property),
- KX_PYATTRIBUTE_RW_FUNCTION("maxDistance3D", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property),
- KX_PYATTRIBUTE_RW_FUNCTION("rolloffFactor3D", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property),
- KX_PYATTRIBUTE_RW_FUNCTION("coneInnerAngle3D", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property),
- KX_PYATTRIBUTE_RW_FUNCTION("coneOuterAngle3D", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property),
- KX_PYATTRIBUTE_RW_FUNCTION("coneOuterGain3D", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property),
-
+ KX_PYATTRIBUTE_RW_FUNCTION("volume_maximum", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property),
+ KX_PYATTRIBUTE_RW_FUNCTION("volume_minimum", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property),
+ KX_PYATTRIBUTE_RW_FUNCTION("distance_reference", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property),
+ KX_PYATTRIBUTE_RW_FUNCTION("distance_maximum", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property),
+ KX_PYATTRIBUTE_RW_FUNCTION("attenuation", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property),
+ KX_PYATTRIBUTE_RW_FUNCTION("cone_angle_inner", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property),
+ KX_PYATTRIBUTE_RW_FUNCTION("cone_angle_outer", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property),
+ KX_PYATTRIBUTE_RW_FUNCTION("cone_volume_outer", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property),
+
KX_PYATTRIBUTE_RW_FUNCTION("time", KX_SoundActuator, pyattr_get_audposition, pyattr_set_audposition),
KX_PYATTRIBUTE_RW_FUNCTION("volume", KX_SoundActuator, pyattr_get_gain, pyattr_set_gain),
KX_PYATTRIBUTE_RW_FUNCTION("pitch", KX_SoundActuator, pyattr_get_pitch, pyattr_set_pitch),
- KX_PYATTRIBUTE_RW_FUNCTION("rollOffFactor", KX_SoundActuator, pyattr_get_rollOffFactor, pyattr_set_rollOffFactor),
KX_PYATTRIBUTE_ENUM_RW("mode",KX_SoundActuator::KX_SOUNDACT_NODEF+1,KX_SoundActuator::KX_SOUNDACT_MAX-1,false,KX_SoundActuator,m_type),
{ NULL } //Sentinel
};
@@ -362,28 +330,28 @@ PyObject* KX_SoundActuator::pyattr_get_3d_property(void *self, const struct KX_P
const char* prop = attrdef->m_name;
float result_value = 0.0;
- if(!strcmp(prop, "maxGain3D")) {
+ if(!strcmp(prop, "volume_maximum")) {
result_value = actuator->m_3d.max_gain;
- } else if (!strcmp(prop, "minGain3D")) {
+ } else if (!strcmp(prop, "volume_minimum")) {
result_value = actuator->m_3d.min_gain;
- } else if (!strcmp(prop, "referenceDistance3D")) {
+ } else if (!strcmp(prop, "distance_reference")) {
result_value = actuator->m_3d.reference_distance;
- } else if (!strcmp(prop, "maxDistance3D")) {
+ } else if (!strcmp(prop, "distance_maximum")) {
result_value = actuator->m_3d.max_distance;
- } else if (!strcmp(prop, "rolloffFactor3D")) {
+ } else if (!strcmp(prop, "attenuation")) {
result_value = actuator->m_3d.rolloff_factor;
- } else if (!strcmp(prop, "coneInnerAngle3D")) {
+ } else if (!strcmp(prop, "cone_angle_inner")) {
result_value = actuator->m_3d.cone_inner_angle;
- } else if (!strcmp(prop, "coneOuterAngle3D")) {
+ } else if (!strcmp(prop, "cone_angle_outer")) {
result_value = actuator->m_3d.cone_outer_angle;
- } else if (!strcmp(prop, "coneOuterGain3D")) {
+ } else if (!strcmp(prop, "cone_volume_outer")) {
result_value = actuator->m_3d.cone_outer_gain;
} else {
@@ -427,66 +395,63 @@ PyObject* KX_SoundActuator::pyattr_get_pitch(void *self, const struct KX_PYATTRI
return result;
}
-PyObject* KX_SoundActuator::pyattr_get_rollOffFactor(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
-{
- KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self);
- float rollofffactor = actuator->m_3d.rolloff_factor;
- PyObject* result = PyFloat_FromDouble(rollofffactor);
-
- return result;
-}
-
int KX_SoundActuator::pyattr_set_3d_property(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
{
KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self);
const char* prop = attrdef->m_name;
float prop_value = 0.0;
- AUD_3DSourceSetting setting = AUD_3DSS_NONE;
if (!PyArg_Parse(value, "f", &prop_value))
return PY_SET_ATTR_FAIL;
- // update the internal value
- if(!strcmp(prop, "maxGain3D")) {
+ // if sound is working and 3D, set the new setting
+ if(!actuator->m_is3d)
+ return PY_SET_ATTR_FAIL;
+
+ if(!strcmp(prop, "volume_maximum")) {
actuator->m_3d.max_gain = prop_value;
- setting = AUD_3DSS_MAX_GAIN;
+ if(actuator->m_handle)
+ AUD_setVolumeMaximum(actuator->m_handle, prop_value);
- } else if (!strcmp(prop, "minGain3D")) {
+ } else if (!strcmp(prop, "volume_minimum")) {
actuator->m_3d.min_gain = prop_value;
- setting = AUD_3DSS_MIN_GAIN;
+ if(actuator->m_handle)
+ AUD_setVolumeMinimum(actuator->m_handle, prop_value);
- } else if (!strcmp(prop, "referenceDistance3D")) {
+ } else if (!strcmp(prop, "distance_reference")) {
actuator->m_3d.reference_distance = prop_value;
- setting = AUD_3DSS_REFERENCE_DISTANCE;
+ if(actuator->m_handle)
+ AUD_setDistanceReference(actuator->m_handle, prop_value);
- } else if (!strcmp(prop, "maxDistance3D")) {
+ } else if (!strcmp(prop, "distance_maximum")) {
actuator->m_3d.max_distance = prop_value;
- setting = AUD_3DSS_MAX_DISTANCE;
+ if(actuator->m_handle)
+ AUD_setDistanceMaximum(actuator->m_handle, prop_value);
- } else if (!strcmp(prop, "rolloffFactor3D")) {
+ } else if (!strcmp(prop, "attenuation")) {
actuator->m_3d.rolloff_factor = prop_value;
- setting = AUD_3DSS_ROLLOFF_FACTOR;
+ if(actuator->m_handle)
+ AUD_setAttenuation(actuator->m_handle, prop_value);
- } else if (!!strcmp(prop, "coneInnerAngle3D")) {
+ } else if (!!strcmp(prop, "cone_angle_inner")) {
actuator->m_3d.cone_inner_angle = prop_value;
- setting = AUD_3DSS_CONE_INNER_ANGLE;
+ if(actuator->m_handle)
+ AUD_setConeAngleInner(actuator->m_handle, prop_value);
- } else if (!strcmp(prop, "coneOuterAngle3D")) {
+ } else if (!strcmp(prop, "cone_angle_outer")) {
actuator->m_3d.cone_outer_angle = prop_value;
- setting = AUD_3DSS_CONE_OUTER_ANGLE;
+ if(actuator->m_handle)
+ AUD_setConeAngleOuter(actuator->m_handle, prop_value);
- } else if (!strcmp(prop, "coneOuterGain3D")) {
+ } else if (!strcmp(prop, "cone_volume_outer")) {
actuator->m_3d.cone_outer_gain = prop_value;
- setting = AUD_3DSS_CONE_OUTER_GAIN;
+ if(actuator->m_handle)
+ AUD_setConeVolumeOuter(actuator->m_handle, prop_value);
} else {
return PY_SET_ATTR_FAIL;
- }
+ }
- // if sound is working and 3D, set the new setting
- if(actuator->m_handle && actuator->m_is3d && setting != AUD_3DSS_NONE)
- AUD_set3DSourceSetting(actuator->m_handle, setting, prop_value);
-
return PY_SET_ATTR_SUCCESS;
}
@@ -531,18 +496,4 @@ int KX_SoundActuator::pyattr_set_pitch(void *self, const struct KX_PYATTRIBUTE_D
return PY_SET_ATTR_SUCCESS;
}
-int KX_SoundActuator::pyattr_set_rollOffFactor(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
-{
- KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self);
- float rollofffactor = 1.0;
- if (!PyArg_Parse(value, "f", &rollofffactor))
- return PY_SET_ATTR_FAIL;
-
- actuator->m_3d.rolloff_factor = rollofffactor;
- if(actuator->m_handle)
- AUD_set3DSourceSetting(actuator->m_handle, AUD_3DSS_ROLLOFF_FACTOR, rollofffactor);
-
- return PY_SET_ATTR_SUCCESS;
-}
-
#endif // DISABLE_PYTHON
diff --git a/source/gameengine/Ketsji/KX_SoundActuator.h b/source/gameengine/Ketsji/KX_SoundActuator.h
index 1eaea276191..c175a184a15 100644
--- a/source/gameengine/Ketsji/KX_SoundActuator.h
+++ b/source/gameengine/Ketsji/KX_SoundActuator.h
@@ -58,7 +58,7 @@ class KX_SoundActuator : public SCA_IActuator
float m_pitch;
bool m_is3d;
KX_3DSoundSettings m_3d;
- AUD_Handle* m_handle;
+ AUD_Channel* m_handle;
void play();
@@ -107,14 +107,12 @@ public:
static int pyattr_set_audposition(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static int pyattr_set_gain(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static int pyattr_set_pitch(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
- static int pyattr_set_rollOffFactor(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static int pyattr_set_type(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_3d_property(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_audposition(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_gain(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_pitch(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
- static PyObject* pyattr_get_rollOffFactor(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_type(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
#endif // DISABLE_PYTHON
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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <iostream>
#include "PHY_IPhysicsEnvironment.h"
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <config.h>
-#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 <config.h>
-#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..09630ad2851 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 <config.h>
-#endif
-
#include "KX_VertexProxy.h"
#include "KX_MeshProxy.h"
#include "RAS_TexVert.h"
@@ -77,247 +73,359 @@ PyMethodDef KX_VertexProxy::Methods[] = {
};
PyAttributeDef KX_VertexProxy::Attributes[] = {
- //KX_PYATTRIBUTE_TODO("DummyProps"),
-
- KX_PYATTRIBUTE_DUMMY("x"),
- KX_PYATTRIBUTE_DUMMY("y"),
- KX_PYATTRIBUTE_DUMMY("z"),
-
- KX_PYATTRIBUTE_DUMMY("r"),
- KX_PYATTRIBUTE_DUMMY("g"),
- KX_PYATTRIBUTE_DUMMY("b"),
- KX_PYATTRIBUTE_DUMMY("a"),
+ KX_PYATTRIBUTE_RW_FUNCTION("x", KX_VertexProxy, pyattr_get_x, pyattr_set_x),
+ KX_PYATTRIBUTE_RW_FUNCTION("y", KX_VertexProxy, pyattr_get_y, pyattr_set_y),
+ KX_PYATTRIBUTE_RW_FUNCTION("z", KX_VertexProxy, pyattr_get_z, pyattr_set_z),
- KX_PYATTRIBUTE_DUMMY("u"),
- KX_PYATTRIBUTE_DUMMY("v"),
+ KX_PYATTRIBUTE_RW_FUNCTION("r", KX_VertexProxy, pyattr_get_r, pyattr_set_r),
+ KX_PYATTRIBUTE_RW_FUNCTION("g", KX_VertexProxy, pyattr_get_g, pyattr_set_g),
+ KX_PYATTRIBUTE_RW_FUNCTION("b", KX_VertexProxy, pyattr_get_b, pyattr_set_b),
+ KX_PYATTRIBUTE_RW_FUNCTION("a", KX_VertexProxy, pyattr_get_a, pyattr_set_a),
- KX_PYATTRIBUTE_DUMMY("u2"),
- KX_PYATTRIBUTE_DUMMY("v2"),
+ KX_PYATTRIBUTE_RW_FUNCTION("u", KX_VertexProxy, pyattr_get_u, pyattr_set_u),
+ KX_PYATTRIBUTE_RW_FUNCTION("v", KX_VertexProxy, pyattr_get_v, pyattr_set_v),
- KX_PYATTRIBUTE_DUMMY("XYZ"),
- KX_PYATTRIBUTE_DUMMY("UV"),
+ KX_PYATTRIBUTE_RW_FUNCTION("u2", KX_VertexProxy, pyattr_get_u2, pyattr_set_u2),
+ KX_PYATTRIBUTE_RW_FUNCTION("v2", KX_VertexProxy, pyattr_get_v2, pyattr_set_v2),
- KX_PYATTRIBUTE_DUMMY("color"),
- KX_PYATTRIBUTE_DUMMY("colour"),
+ KX_PYATTRIBUTE_RW_FUNCTION("XYZ", KX_VertexProxy, pyattr_get_XYZ, pyattr_set_XYZ),
+ KX_PYATTRIBUTE_RW_FUNCTION("UV", KX_VertexProxy, pyattr_get_UV, pyattr_set_UV),
- KX_PYATTRIBUTE_DUMMY("normal"),
+ KX_PYATTRIBUTE_RW_FUNCTION("color", KX_VertexProxy, pyattr_get_color, pyattr_set_color),
+ KX_PYATTRIBUTE_RW_FUNCTION("normal", KX_VertexProxy, pyattr_get_normal, pyattr_set_normal),
{ NULL } //Sentinel
};
-#if 0
-PyObject*
-KX_VertexProxy::py_getattro(PyObject *attr)
-{
- char *attr_str= _PyUnicode_AsString(attr);
- if (attr_str[1]=='\0') { // Group single letters
- // pos
- if (attr_str[0]=='x')
- return PyFloat_FromDouble(m_vertex->getXYZ()[0]);
- if (attr_str[0]=='y')
- return PyFloat_FromDouble(m_vertex->getXYZ()[1]);
- if (attr_str[0]=='z')
- return PyFloat_FromDouble(m_vertex->getXYZ()[2]);
-
- // Col
- if (attr_str[0]=='r')
- return PyFloat_FromDouble(m_vertex->getRGBA()[0]/255.0);
- if (attr_str[0]=='g')
- return PyFloat_FromDouble(m_vertex->getRGBA()[1]/255.0);
- if (attr_str[0]=='b')
- return PyFloat_FromDouble(m_vertex->getRGBA()[2]/255.0);
- if (attr_str[0]=='a')
- return PyFloat_FromDouble(m_vertex->getRGBA()[3]/255.0);
-
- // UV
- if (attr_str[0]=='u')
- return PyFloat_FromDouble(m_vertex->getUV1()[0]);
- if (attr_str[0]=='v')
- return PyFloat_FromDouble(m_vertex->getUV1()[1]);
- }
-
-
- if (!strcmp(attr_str, "XYZ"))
- return PyObjectFrom(MT_Vector3(m_vertex->getXYZ()));
-
- if (!strcmp(attr_str, "UV"))
- return PyObjectFrom(MT_Point2(m_vertex->getUV1()));
-
- if (!strcmp(attr_str, "color") || !strcmp(attr_str, "colour"))
- {
- const unsigned char *colp = m_vertex->getRGBA();
- MT_Vector4 color(colp[0], colp[1], colp[2], colp[3]);
- color /= 255.0;
- return PyObjectFrom(color);
- }
+PyObject* KX_VertexProxy::pyattr_get_x(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ return PyFloat_FromDouble(self->m_vertex->getXYZ()[0]);
+}
- if (!strcmp(attr_str, "normal"))
- {
- return PyObjectFrom(MT_Vector3(m_vertex->getNormal()));
- }
+PyObject* KX_VertexProxy::pyattr_get_y(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ return PyFloat_FromDouble(self->m_vertex->getXYZ()[1]);
+}
- py_getattro_up(CValue);
+PyObject* KX_VertexProxy::pyattr_get_z(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ return PyFloat_FromDouble(self->m_vertex->getXYZ()[2]);
}
-#endif
+PyObject* KX_VertexProxy::pyattr_get_r(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ return PyFloat_FromDouble(self->m_vertex->getRGBA()[0]/255.0);
+}
-#if 0
-int KX_VertexProxy::py_setattro(PyObject *attr, PyObject *pyvalue)
+PyObject* KX_VertexProxy::pyattr_get_g(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
- char *attr_str= _PyUnicode_AsString(attr);
- if (PySequence_Check(pyvalue))
- {
- if (!strcmp(attr_str, "XYZ"))
- {
- MT_Point3 vec;
- if (PyVecTo(pyvalue, vec))
- {
- m_vertex->SetXYZ(vec);
- m_mesh->SetMeshModified(true);
- return PY_SET_ATTR_SUCCESS;
- }
- return PY_SET_ATTR_FAIL;
- }
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ return PyFloat_FromDouble(self->m_vertex->getRGBA()[1]/255.0);
+}
- if (!strcmp(attr_str, "UV"))
- {
- MT_Point2 vec;
- if (PyVecTo(pyvalue, vec))
- {
- m_vertex->SetUV(vec);
- m_mesh->SetMeshModified(true);
- return PY_SET_ATTR_SUCCESS;
- }
- return PY_SET_ATTR_FAIL;
- }
+PyObject* KX_VertexProxy::pyattr_get_b(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ return PyFloat_FromDouble(self->m_vertex->getRGBA()[2]/255.0);
+}
- if (!strcmp(attr_str, "color") || !strcmp(attr_str, "colour"))
- {
- MT_Vector4 vec;
- if (PyVecTo(pyvalue, vec))
- {
- m_vertex->SetRGBA(vec);
- m_mesh->SetMeshModified(true);
- return PY_SET_ATTR_SUCCESS;
- }
- return PY_SET_ATTR_FAIL;
- }
+PyObject* KX_VertexProxy::pyattr_get_a(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ return PyFloat_FromDouble(self->m_vertex->getRGBA()[3]/255.0);
+}
- if (!strcmp(attr_str, "normal"))
- {
- MT_Vector3 vec;
- if (PyVecTo(pyvalue, vec))
- {
- m_vertex->SetNormal(vec);
- m_mesh->SetMeshModified(true);
- return PY_SET_ATTR_SUCCESS;
- }
- return PY_SET_ATTR_FAIL;
- }
- }
-
- if (PyFloat_Check(pyvalue))
- {
- float val = PyFloat_AsDouble(pyvalue);
- // pos
- MT_Point3 pos(m_vertex->getXYZ());
- if (!strcmp(attr_str, "x"))
+PyObject* KX_VertexProxy::pyattr_get_u(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ return PyFloat_FromDouble(self->m_vertex->getUV1()[0]);
+}
+
+PyObject* KX_VertexProxy::pyattr_get_v(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ return PyFloat_FromDouble(self->m_vertex->getUV1()[1]);
+}
+
+PyObject* KX_VertexProxy::pyattr_get_u2(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ return PyFloat_FromDouble(self->m_vertex->getUV2()[0]);
+}
+
+PyObject* KX_VertexProxy::pyattr_get_v2(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ return PyFloat_FromDouble(self->m_vertex->getUV2()[1]);
+}
+
+PyObject* KX_VertexProxy::pyattr_get_XYZ(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ return PyObjectFrom(MT_Vector3(self->m_vertex->getXYZ()));
+}
+
+PyObject* KX_VertexProxy::pyattr_get_UV(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ return PyObjectFrom(MT_Point2(self->m_vertex->getUV1()));
+}
+
+PyObject* KX_VertexProxy::pyattr_get_color(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ const unsigned char *colp = self->m_vertex->getRGBA();
+ MT_Vector4 color(colp[0], colp[1], colp[2], colp[3]);
+ color /= 255.0;
+ return PyObjectFrom(color);
+}
+
+PyObject* KX_VertexProxy::pyattr_get_normal(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ return PyObjectFrom(MT_Vector3(self->m_vertex->getNormal()));
+}
+
+int KX_VertexProxy::pyattr_set_x(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ if (PyFloat_Check(value))
{
+ float val = PyFloat_AsDouble(value);
+ MT_Point3 pos(self->m_vertex->getXYZ());
pos.x() = val;
- m_vertex->SetXYZ(pos);
- m_mesh->SetMeshModified(true);
+ self->m_vertex->SetXYZ(pos);
+ self->m_mesh->SetMeshModified(true);
return PY_SET_ATTR_SUCCESS;
}
+ return PY_SET_ATTR_FAIL;
+}
- if (!strcmp(attr_str, "y"))
+int KX_VertexProxy::pyattr_set_y(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ if (PyFloat_Check(value))
{
+ float val = PyFloat_AsDouble(value);
+ MT_Point3 pos(self->m_vertex->getXYZ());
pos.y() = val;
- m_vertex->SetXYZ(pos);
- m_mesh->SetMeshModified(true);
+ self->m_vertex->SetXYZ(pos);
+ self->m_mesh->SetMeshModified(true);
return PY_SET_ATTR_SUCCESS;
}
+ return PY_SET_ATTR_FAIL;
+}
- if (!strcmp(attr_str, "z"))
+int KX_VertexProxy::pyattr_set_z(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ if (PyFloat_Check(value))
{
+ float val = PyFloat_AsDouble(value);
+ MT_Point3 pos(self->m_vertex->getXYZ());
pos.z() = val;
- m_vertex->SetXYZ(pos);
- m_mesh->SetMeshModified(true);
+ self->m_vertex->SetXYZ(pos);
+ self->m_mesh->SetMeshModified(true);
return PY_SET_ATTR_SUCCESS;
}
+ return PY_SET_ATTR_FAIL;
+}
- // uv
- MT_Point2 uv = m_vertex->getUV1();
- if (!strcmp(attr_str, "u"))
+int KX_VertexProxy::pyattr_set_u(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ if (PyFloat_Check(value))
{
+ float val = PyFloat_AsDouble(value);
+ MT_Point2 uv = self->m_vertex->getUV1();
uv[0] = val;
- m_vertex->SetUV(uv);
- m_mesh->SetMeshModified(true);
+ self->m_vertex->SetUV(uv);
+ self->m_mesh->SetMeshModified(true);
return PY_SET_ATTR_SUCCESS;
}
+ return PY_SET_ATTR_FAIL;
+}
- if (!strcmp(attr_str, "v"))
+int KX_VertexProxy::pyattr_set_v(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ if (PyFloat_Check(value))
{
+ float val = PyFloat_AsDouble(value);
+ MT_Point2 uv = self->m_vertex->getUV1();
uv[1] = val;
- m_vertex->SetUV(uv);
- m_mesh->SetMeshModified(true);
+ self->m_vertex->SetUV(uv);
+ self->m_mesh->SetMeshModified(true);
return PY_SET_ATTR_SUCCESS;
}
+ return PY_SET_ATTR_FAIL;
+}
- // uv
- MT_Point2 uv2 = m_vertex->getUV2();
- if (!strcmp(attr_str, "u2"))
+int KX_VertexProxy::pyattr_set_u2(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ if (PyFloat_Check(value))
{
+ float val = PyFloat_AsDouble(value);
+ MT_Point2 uv = self->m_vertex->getUV2();
uv[0] = val;
- m_vertex->SetUV2(uv);
- m_mesh->SetMeshModified(true);
- return 0;
+ self->m_vertex->SetUV2(uv);
+ self->m_mesh->SetMeshModified(true);
+ return PY_SET_ATTR_SUCCESS;
}
+ return PY_SET_ATTR_FAIL;
+}
- if (!strcmp(attr_str, "v2"))
+int KX_VertexProxy::pyattr_set_v2(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ if (PyFloat_Check(value))
{
+ float val = PyFloat_AsDouble(value);
+ MT_Point2 uv = self->m_vertex->getUV2();
uv[1] = val;
- m_vertex->SetUV2(uv);
- m_mesh->SetMeshModified(true);
+ self->m_vertex->SetUV2(uv);
+ self->m_mesh->SetMeshModified(true);
return PY_SET_ATTR_SUCCESS;
}
+ return PY_SET_ATTR_FAIL;
+}
- // col
- unsigned int icol = *((const unsigned int *)m_vertex->getRGBA());
- unsigned char *cp = (unsigned char*) &icol;
- val *= 255.0;
- if (!strcmp(attr_str, "r"))
+int KX_VertexProxy::pyattr_set_r(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ if (PyFloat_Check(value))
{
+ float val = PyFloat_AsDouble(value);
+ unsigned int icol = *((const unsigned int *)self->m_vertex->getRGBA());
+ unsigned char *cp = (unsigned char*) &icol;
+ val *= 255.0;
cp[0] = (unsigned char) val;
- m_vertex->SetRGBA(icol);
- m_mesh->SetMeshModified(true);
+ self->m_vertex->SetRGBA(icol);
+ self->m_mesh->SetMeshModified(true);
return PY_SET_ATTR_SUCCESS;
}
- if (!strcmp(attr_str, "g"))
+ return PY_SET_ATTR_FAIL;
+}
+
+int KX_VertexProxy::pyattr_set_g(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ if (PyFloat_Check(value))
{
+ float val = PyFloat_AsDouble(value);
+ unsigned int icol = *((const unsigned int *)self->m_vertex->getRGBA());
+ unsigned char *cp = (unsigned char*) &icol;
+ val *= 255.0;
cp[1] = (unsigned char) val;
- m_vertex->SetRGBA(icol);
- m_mesh->SetMeshModified(true);
+ self->m_vertex->SetRGBA(icol);
+ self->m_mesh->SetMeshModified(true);
return PY_SET_ATTR_SUCCESS;
}
- if (!strcmp(attr_str, "b"))
+ return PY_SET_ATTR_FAIL;
+}
+
+int KX_VertexProxy::pyattr_set_b(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ if (PyFloat_Check(value))
{
+ float val = PyFloat_AsDouble(value);
+ unsigned int icol = *((const unsigned int *)self->m_vertex->getRGBA());
+ unsigned char *cp = (unsigned char*) &icol;
+ val *= 255.0;
cp[2] = (unsigned char) val;
- m_vertex->SetRGBA(icol);
- m_mesh->SetMeshModified(true);
+ self->m_vertex->SetRGBA(icol);
+ self->m_mesh->SetMeshModified(true);
return PY_SET_ATTR_SUCCESS;
}
- if (!strcmp(attr_str, "a"))
+ return PY_SET_ATTR_FAIL;
+}
+
+int KX_VertexProxy::pyattr_set_a(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ if (PyFloat_Check(value))
{
+ float val = PyFloat_AsDouble(value);
+ unsigned int icol = *((const unsigned int *)self->m_vertex->getRGBA());
+ unsigned char *cp = (unsigned char*) &icol;
+ val *= 255.0;
cp[3] = (unsigned char) val;
- m_vertex->SetRGBA(icol);
- m_mesh->SetMeshModified(true);
+ self->m_vertex->SetRGBA(icol);
+ self->m_mesh->SetMeshModified(true);
return PY_SET_ATTR_SUCCESS;
}
- }
+ return PY_SET_ATTR_FAIL;
+}
+
+int KX_VertexProxy::pyattr_set_XYZ(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ if (PySequence_Check(value))
+ {
+ MT_Point3 vec;
+ if (PyVecTo(value, vec))
+ {
+ self->m_vertex->SetXYZ(vec);
+ self->m_mesh->SetMeshModified(true);
+ return PY_SET_ATTR_SUCCESS;
+ }
+ }
+ return PY_SET_ATTR_FAIL;
+}
+
+int KX_VertexProxy::pyattr_set_UV(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ if (PySequence_Check(value))
+ {
+ MT_Point2 vec;
+ if (PyVecTo(value, vec))
+ {
+ self->m_vertex->SetUV(vec);
+ self->m_mesh->SetMeshModified(true);
+ return PY_SET_ATTR_SUCCESS;
+ }
+ }
+ return PY_SET_ATTR_FAIL;
+}
- return CValue::py_setattro(attr, pyvalue);
+int KX_VertexProxy::pyattr_set_color(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ if (PySequence_Check(value))
+ {
+ MT_Vector4 vec;
+ if (PyVecTo(value, vec))
+ {
+ self->m_vertex->SetRGBA(vec);
+ self->m_mesh->SetMeshModified(true);
+ return PY_SET_ATTR_SUCCESS;
+ }
+ }
+ return PY_SET_ATTR_FAIL;
+}
+
+int KX_VertexProxy::pyattr_set_normal(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_VertexProxy* self= static_cast<KX_VertexProxy*>(self_v);
+ if (PySequence_Check(value))
+ {
+ MT_Vector3 vec;
+ if (PyVecTo(value, vec))
+ {
+ self->m_vertex->SetNormal(vec);
+ self->m_mesh->SetMeshModified(true);
+ return PY_SET_ATTR_SUCCESS;
+ }
+ }
+ return PY_SET_ATTR_FAIL;
}
-#endif
KX_VertexProxy::KX_VertexProxy(KX_MeshProxy*mesh, RAS_TexVert* vertex)
: m_vertex(vertex),
diff --git a/source/gameengine/Ketsji/KX_VertexProxy.h b/source/gameengine/Ketsji/KX_VertexProxy.h
index 08fe0e7e2f8..b39d3ecb7d4 100644
--- a/source/gameengine/Ketsji/KX_VertexProxy.h
+++ b/source/gameengine/Ketsji/KX_VertexProxy.h
@@ -56,6 +56,37 @@ public:
// stuff for python integration
+ static PyObject* pyattr_get_x(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_y(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_z(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_r(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_g(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_b(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_a(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_u(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_v(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_u2(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_v2(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_XYZ(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_UV(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_color(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_normal(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static int pyattr_set_x(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static int pyattr_set_y(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static int pyattr_set_z(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static int pyattr_set_u(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static int pyattr_set_v(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static int pyattr_set_u2(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static int pyattr_set_v2(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static int pyattr_set_r(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static int pyattr_set_g(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static int pyattr_set_b(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static int pyattr_set_a(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static int pyattr_set_XYZ(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static int pyattr_set_UV(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static int pyattr_set_color(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static int pyattr_set_normal(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+
KX_PYMETHOD_NOARGS(KX_VertexProxy,GetXYZ);
KX_PYMETHOD_O(KX_VertexProxy,SetXYZ);
KX_PYMETHOD_NOARGS(KX_VertexProxy,GetUV);
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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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/Ketsji/Makefile b/source/gameengine/Ketsji/Makefile
index 4ecd23fc1a2..79c8626d295 100644
--- a/source/gameengine/Ketsji/Makefile
+++ b/source/gameengine/Ketsji/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.
@@ -65,6 +65,10 @@ CPPFLAGS += -I../../blender/imbuf
CPPFLAGS += -I../../blender/gpu
CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
+ifeq ($(WITH_FFMPEG), true)
+ CPPFLAGS += -DWITH_FFMPEG
+endif
+
###########################
SOURCEDIR = source/gameengine/Ketsji
diff --git a/source/gameengine/Makefile b/source/gameengine/Makefile
index bcb4b9098e7..0fdac2acce2 100644
--- a/source/gameengine/Makefile
+++ b/source/gameengine/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/gameengine/Network/CMakeLists.txt b/source/gameengine/Network/CMakeLists.txt
index 2478715e0ab..795e63b47c3 100644
--- a/source/gameengine/Network/CMakeLists.txt
+++ b/source/gameengine/Network/CMakeLists.txt
@@ -34,4 +34,3 @@ SET(INC
)
BLENDERLIB(bf_ngnetwork "${SRC}" "${INC}")
-#env.BlenderLib ( 'bf_ngnetwork', sources, Split(incs), [], libtype=['game2', 'player'], priority=[15, 160] )
diff --git a/source/gameengine/Network/LoopBackNetwork/CMakeLists.txt b/source/gameengine/Network/LoopBackNetwork/CMakeLists.txt
index 6b43a1561a1..e7c34f5a2a0 100644
--- a/source/gameengine/Network/LoopBackNetwork/CMakeLists.txt
+++ b/source/gameengine/Network/LoopBackNetwork/CMakeLists.txt
@@ -34,4 +34,3 @@ SET(INC
)
BLENDERLIB(bf_loopbacknetwork "${SRC}" "${INC}")
-#env.BlenderLib ( 'bf_loopbacknetwork', Split(sources), Split(incs), defines=[],libtype=['game2', 'player'], priority=[25, 165] )
diff --git a/source/gameengine/Network/LoopBackNetwork/Makefile b/source/gameengine/Network/LoopBackNetwork/Makefile
index 690fd644094..236c28b0f23 100644
--- a/source/gameengine/Network/LoopBackNetwork/Makefile
+++ b/source/gameengine/Network/LoopBackNetwork/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/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 <config.h>
-#endif
-
// temporary debugging printf's
#ifdef NAN_NET_DEBUG
#include <stdio.h>
@@ -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<NG_NetworkMessage*> m_messages[2];
int m_currentQueue;
@@ -58,8 +54,6 @@ public:
virtual void SendNetworkMessage(class NG_NetworkMessage* msg);
virtual vector<NG_NetworkMessage*> RetrieveNetworkMessages();
-
- STR_String GetNetworkVersion();
};
#endif //NG_LOOPBACKNETWORKDEVICEINTERFACE_H
diff --git a/source/gameengine/Network/Makefile b/source/gameengine/Network/Makefile
index c6b22276113..99a047c8b95 100644
--- a/source/gameengine/Network/Makefile
+++ b/source/gameengine/Network/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/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<NG_NetworkMessage*> 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 <assert.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <config.h>
-#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..976ce0d367e 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 <config.h>
-#endif
-
NG_NetworkScene::NG_NetworkScene(NG_NetworkDeviceInterface* nic)
{
m_networkdevice = nic;
@@ -191,7 +187,7 @@ vector<NG_NetworkMessage*> NG_NetworkScene::FindMessages(
if (!notfound)
notfound = (subject.IsEmpty() ? notfound : m_messagesBySubject[subject] == NULL);
if (notfound) {
- // it's definately NOT in the scene, so stop looking
+ // it's definitely NOT in the scene, so stop looking
} else { // narrow phase
// possibly it's there, but maybe not (false hit)
if (to.IsEmpty()) {
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/Makefile b/source/gameengine/Network/TerraplayNetwork/Makefile
index d987263d433..d5a4c86740b 100644
--- a/source/gameengine/Network/TerraplayNetwork/Makefile
+++ b/source/gameengine/Network/TerraplayNetwork/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/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 <config.h>
-#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<NG_NetworkMessage*> RetrieveNetworkMessages(void);
-
- STR_String GetNetworkVersion(void);
int mytest(void);
};
diff --git a/source/gameengine/Physics/Bullet/CMakeLists.txt b/source/gameengine/Physics/Bullet/CMakeLists.txt
index 11a535b35c8..95888967b78 100644
--- a/source/gameengine/Physics/Bullet/CMakeLists.txt
+++ b/source/gameengine/Physics/Bullet/CMakeLists.txt
@@ -47,4 +47,3 @@ SET(INC
)
BLENDERLIB(bf_bullet "${SRC}" "${INC}")
-#env.BlenderLib ( 'bf_bullet', Split(sources), Split(incs), [], libtype=['game','player'], priority=[15,90] )
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.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
index fe429200dd4..fd1a62d8997 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
@@ -507,7 +507,7 @@ bool CcdPhysicsController::DeleteControllerShape( )
bool CcdPhysicsController::ReplaceControllerShape(btCollisionShape *newShape)
{
- /* Note, deleting the previous collision shape must be done alredy */
+ /* Note, deleting the previous collision shape must be done already */
/* if (m_collisionShape) DeleteControllerShape(); */
m_object->setCollisionShape(newShape);
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/Bullet/Makefile b/source/gameengine/Physics/Bullet/Makefile
index 433d1df3d2f..0514565534d 100644
--- a/source/gameengine/Physics/Bullet/Makefile
+++ b/source/gameengine/Physics/Bullet/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/gameengine/Physics/Dummy/CMakeLists.txt b/source/gameengine/Physics/Dummy/CMakeLists.txt
index cb7a467dde9..18330392cd7 100644
--- a/source/gameengine/Physics/Dummy/CMakeLists.txt
+++ b/source/gameengine/Physics/Dummy/CMakeLists.txt
@@ -32,4 +32,3 @@ SET(INC
)
BLENDERLIB(bf_dummy "${SRC}" "${INC}")
-#env.BlenderLib ( 'bf_dummy', Split(sources), Split(incs), [], libtype=['game','player'], priority=[10,100] )
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 <config.h>
-#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/Dummy/Makefile b/source/gameengine/Physics/Dummy/Makefile
index 0e36266ae09..9a600a0365f 100644
--- a/source/gameengine/Physics/Dummy/Makefile
+++ b/source/gameengine/Physics/Dummy/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/gameengine/Physics/Makefile b/source/gameengine/Physics/Makefile
index da0d4cafd2e..f5f914c2ac2 100644
--- a/source/gameengine/Physics/Makefile
+++ b/source/gameengine/Physics/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/gameengine/Physics/common/CMakeLists.txt b/source/gameengine/Physics/common/CMakeLists.txt
index 3618725c2bf..0f8f59f3b78 100644
--- a/source/gameengine/Physics/common/CMakeLists.txt
+++ b/source/gameengine/Physics/common/CMakeLists.txt
@@ -33,4 +33,3 @@ SET(INC
)
BLENDERLIB(bf_common "${SRC}" "${INC}")
-#env.BlenderLib ( 'bf_common', Split(sources), Split(incs), [], libtype=['game', 'game2','player'], priority=[20, 35, 95] )
diff --git a/source/gameengine/Physics/common/Makefile b/source/gameengine/Physics/common/Makefile
index f87da383520..369699e1b90 100644
--- a/source/gameengine/Physics/common/Makefile
+++ b/source/gameengine/Physics/common/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/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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#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<GameTypes.SCA_DelaySensor>}
- - L{JoystickSensor<GameTypes.SCA_JoystickSensor>}
- - L{KeyboardSensor<GameTypes.SCA_KeyboardSensor>}
- - L{MouseFocusSensor<GameTypes.KX_MouseFocusSensor>}
- - L{MouseSensor<GameTypes.SCA_MouseSensor>}
- - L{NearSensor<GameTypes.KX_NearSensor>}
- - L{NetworkMessageSensor<GameTypes.KX_NetworkMessageSensor>}
- - L{PropertySensor<GameTypes.SCA_PropertySensor>}
- - L{RadarSensor<GameTypes.KX_RadarSensor>}
- - L{RandomSensor<GameTypes.SCA_RandomSensor>}
- - L{RaySensor<GameTypes.KX_RaySensor>}
- - L{TouchSensor<GameTypes.KX_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<GameTypes.SCA_2DFilterActuator>}
- - L{ActionActuator<GameTypes.BL_ActionActuator>}
- - L{AddObjectActuator<GameTypes.KX_SCA_AddObjectActuator>}
- - L{CameraActuator<GameTypes.KX_CameraActuator>}
- - L{ConstraintActuator<GameTypes.KX_ConstraintActuator>}
- - L{DynamicActuator<GameTypes.KX_SCA_DynamicActuator>}
- - L{EndObjectActuator<GameTypes.KX_SCA_EndObjectActuator>}
- - L{GameActuator<GameTypes.KX_GameActuator>}
- - L{IpoActuator<GameTypes.KX_IpoActuator>}
- - L{NetworkMessageActuator<GameTypes.KX_NetworkMessageActuator>}
- - L{ObjectActuator<GameTypes.KX_ObjectActuator>}
- - L{ParentActuator<GameTypes.KX_ParentActuator>}
- - L{PropertyActuator<GameTypes.SCA_PropertyActuator>}
- - L{RandomActuator<GameTypes.SCA_RandomActuator>}
- - L{ReplaceMeshActuator<GameTypes.KX_SCA_ReplaceMeshActuator>}
- - L{SceneActuator<GameTypes.KX_SceneActuator>}
- - L{ShapeActionActuator<GameTypes.BL_ShapeActionActuator>}
- - L{SoundActuator<GameTypes.KX_SoundActuator>}
- - L{StateActuator<GameTypes.KX_StateActuator>}
- - L{TrackToActuator<GameTypes.KX_TrackToActuator>}
- - L{VisibilityActuator<GameTypes.KX_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 7045e6cb88e..00000000000
--- a/source/gameengine/PyDoc/GameTypes.py
+++ /dev/null
@@ -1,6147 +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: L{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, L{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: L{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: L{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, L{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: L{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: L{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: L{KX_GameObject} or None
- @ivar objectLastCreated: the last added object from this actuator (read-only).
- @type objectLastCreated: L{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, L{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 suspend():
- """
- Suspends this scene.
- """
-
- def resume():
- """
- Resume this scene.
- """
-
- 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: L{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, L{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()<SCA_JoystickSensor.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()<SCA_JoystickSensor.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()<SCA_JoystickSensor.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()<SCA_JoystickSensor.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()<SCA_JoystickSensor.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
- @ivar min: the minimum value of the range used to evaluate the property when in interval mode.
- @type min: string
- @ivar max: the maximum value of the range used to evaluate the property when in interval mode.
- @type max: 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 '<bone_name>:<constraint_name>'
- @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 <bone_name>:<constraint_name>
- 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/PhysicsConstraints.py b/source/gameengine/PyDoc/PhysicsConstraints.py
index d78a32f4f79..2859aedd2d1 100644
--- a/source/gameengine/PyDoc/PhysicsConstraints.py
+++ b/source/gameengine/PyDoc/PhysicsConstraints.py
@@ -1,126 +1,294 @@
# $Id$
"""
Documentation for the PhysicsConstraints module.
+================================================
-Example:
+Example::
+
+
+ # Adding a point constraint #
+ ###############################
+
+
+ # import BGE internal module
+ import PhysicsConstraints
+
+ # get object list
+ obj_list = GameLogic.getCurrentScene().objects
+
+ # get object named Obj_1
+ root = obj_list["root"]
+ obj = obj_list["obj"]
+
+ # get object physics ID
+ phido = obj.getPhysicsId()
+
+ # get root physics ID
+ phidr = root.getPhysicsId()
+
+ # want to use point constraint type
+ constraint_type = 1
+
+ # Use bottom right front corner of object for point constraint position
+ point_pos_x = 1.0
+ point_pos_y = -1.0
+ point_pos_z = -1.0
+
+ # create a point constraint
+ const = PhysicsConstraints.createConstraint( phido, phidr, constraint_type, point_pos_x, point_pos_y, point_pos_z)
+
+ # stores the new constraint ID to be used later
+ obj["constraint_ID"] = const.getConstraintId()
+
+
+Example::
+
+
+ # Removing a point constraint #
+ #################################
+
+
+ # import BGE internal module
import PhysicsConstraints
- import GameLogic
+
+ # get object list
+ obj_list = GameLogic.getCurrentScene().objects
+
+ # get object 1
+ obj = obj_list["obj"]
+
+ # get constraint ID that was saved as an obj property
+ # when the constraint was created
+ constraint_ID = obj["constraint_ID"]
+
+ # remove constraint
+ PhysicsConstraints.removeConstraint(constraint_ID)
"""
-# TODO
-# error
-def createConstraint():
- """
- Does something
+def createConstraint(obj_PhysicsID, root_PhysicsID, constraintType, pointPos_x, pointPos_y, pointPos_z, edgePos_x, edgePos_y, edgePos_z, edgeAngle_x, edgeAngle_y, edgeAngle_z):
+ """
+ Create a point constraint between two objects, an edge constraint between two objects, or a vehicle constraint on an object.
- @rtype:
- """
-def getAppliedImpulse():
- """
- Does something
+ You only have to input the needed parammeters depending on the type of constraint you are trying to create.
- @rtype:
- """
-def getVehicleConstraint():
- """
- Does something
+
+ B{Point Constraint} ::
- @rtype:
- """
-def removeConstraint():
- """
- Does something
+ While creating a point constraint, the "pointPos" values define where you want the pivot point to be located.
+ If you are creating a point constraint be sure to assing the integer "1" as the constraintType value.
- @rtype:
- """
-def setCcdMode():
- """
- Does something
+ Parameters to use:
+ obj_PhysicsID, root_PhysicsID, constraintType, pointPos_x, pointPos_y, pointPos_z
- @rtype:
- """
-def setContactBreakingTreshold():
- """
- Does something
+ B{Edge Constraint} ::
+
+ While creating an edge constraint, the "edgePos" values define where you want the center of the edge constraint to be.
+ Also, the "edgeAngle" values define in which direction you want the edge constraint to point (As a 3 dimensions vector).
+ If you want to create an edge constraint be sure to assing the integer "2" as the constraintType value.
+
+ Parameters to use:
+ obj_PhysicsID, root_PhysicsID, constraintType, edgePos_x, edgePos_y, edgePos_z, edgeAngle_x, edgeAngle_y, edgeAngle_z}
- @rtype:
- """
-def setDeactivationAngularTreshold():
- """
- Does something
+ B{Vehicle Constraint} ::
+
+ While creating a point constraint, the "pointPos" values define where you want the pivot point to be located.
+ If you want to create an edge constraint be sure to assing the integer "0" as the constraintType value.
+
+ Parameters to use :
+ obj_PhysicsID, root_PhysicsID, constraintType
- @rtype:
- """
-def setDeactivationLinearTreshold():
+ @type obj_PhysicsID: integer
+ @param obj_PhysicsID: The physic ID of the first object to constraint.
+
+ @type root_PhysicsID: integer
+ @param root_PhysicsID: The physic ID of the second object to constraint.
+
+ @type constraintType: integer
+ @param constraintType: The type of constraint.
+
+ @type pointPos_x: float
+ @param pointPos_x: The X position of the point constraint.
+
+ @type pointPos_y: float
+ @param pointPos_y: The Y position of the point constraint.
+
+ @type pointPos_z: float
+ @param pointPos_z: The Z position of the point constraint.
+
+ @type edgePos_x: float
+ @param edgePos_x: The X value of the center of the edge constraint.
+
+ @type edgePos_y: float
+ @param edgePos_y: The Y value of the center of the edge constraint.
+
+ @type edgePos_z: float
+ @param edgePos_z: The Z value of the center of the edge constraint.
+
+ @type edgeAngle_x: float
+ @param edgeAngle_x: The X value of the edge's orientation vector.
+
+ @type edgeAngle_y: float
+ @param edgeAngle_y: The Y value of the edge's orientation vector.
+
+ @type edgeAngle_z: float
+ @param edgeAngle_z: The Z value of the edge's orientation vector.
+
+ @rtype: integer
+ @return: The created constraint ID
"""
- Does something
- @rtype:
- """
-def setDeactivationTime():
+
+def getAppliedImpulse(constraint_ID):
"""
- Does something
+ Returns the applied impulse.
- @rtype:
+ @param constraint_ID: The constraint ID that was saved on the creation of the constraint.
+ @type constraint_ID: integer
+ @rtype: float
+ @return: Measure the stress on a constraint.
"""
-def setDebugMode():
+
+
+def getVehicleConstraint(constraint_ID):
"""
- Does something
+ Returns the vehicle constraint ID.
- @rtype:
+ @param constraint_ID: The constraint ID that was saved on the creation of the constraint.
+ @type constraint_ID: integer
+ @rtype: integer
"""
-def setGravity():
+def removeConstraint(constraint_ID):
"""
- Does something
- @rtype:
- """
-def setLinearAirDamping():
- """
- Does something
+ Removes the constraint between 2 game objects (point and edge constraints).
+
+ It does not remove vehicle constraints.
- @rtype:
+ @param constraint_ID: The constraint ID that was saved on the creation of the constraint.
+ @type constraint_ID: integer
"""
-def setNumIterations():
+def setDeactivationLinearTreshold(linearTreshold):
"""
- Does something
- @rtype:
+ Sets the linear velocity that an object must be below before the deactivation timer can start.
+
+ This affects every object in the scene, except for game objects that have 'No sleeping' turned on.
+
+ @param linearTreshold: The linear velocity.
+ @type linearTreshold: float
"""
-def setNumTimeSubSteps():
+def setDeactivationAngularTreshold(angularTreshold):
"""
- Does something
- @rtype:
+ Sets the angular velocity that an object must be below before the deactivation timer can start.
+
+ This affects every object in the scene, except for game objects that have 'No sleeping' turned on.
+
+ @param angularTreshold: The angular velocity.
+ @type angularTreshold: float
"""
-def setSolverDamping():
+def setDeactivationTime(time):
"""
- Does something
- @rtype:
+ Time (in seconds) after objects with velocity less then thresholds (see below) are deactivated.
+
+ This affects every object in the scene, except for game objects that have 'No sleeping' turned on.
+
+ This function is directly related with the 2 above functions.
+
+
+ @param time: The time in seconds.
+ @type time: float
"""
-def setSolverTau():
+def setGravity(gx, gy, gz):
"""
- Does something
+ Sets the gravity for the actual scene only.
+
+ All other scenes remain unaffected.
- @rtype:
+ This affects every object in the scene that has physics enabled.
+
+ @param gx: The force of gravity on world x axis.
+ @type gx: float
+ @param gy: The force of gravity on world y axis.
+ @type gy: float
+ @param gz: The force of gravity on world z axis.
+ @type gz: float
"""
-def setSolverType():
+def setLinearAirDamping(damping):
"""
- Does something
- @rtype:
+ Sets the linear air resistance for all objects in the scene.
+
+ @param damping: The linear air resistance.
+ @type damping: float
"""
-def setSorConstant():
+def setNumIterations(numIter):
"""
- Does something
+ Sets the number of times an iterative constraint solver is repeated.
- @rtype:
+ Increasing the number of iterations improves the constraint solver at the cost of performances & the speed of the game engine.
+
+ @param numIter: The number of timesubsteps. (Input 0 to suspend simulation numSubStep)
+ @type numIter: integer
"""
-def setUseEpa():
+def setNumTimeSubSteps(numSubStep):
"""
- Does something
+ Set the quality of the entire physics simulation including collision detection and constraint solver.
+
+ Increase the number of time substeps to improves the quality of the entire physics simulation at the cost of the performance & the speed of the game engine.
- @rtype:
- """ \ No newline at end of file
+ @param numSubStep: The number of timesubsteps. (Input 0 to suspend simulation numSubStep)
+ @type numSubStep: integer
+ """
+#def setDebugMode():
+# """
+#
+#
+#
+# @param numIter:
+# @type numIter:
+# """
+#def setCcdMode():
+# """
+# Does something
+#
+# @rtype:
+# """
+#def setContactBreakingTreshold():
+# """
+# Does something
+#
+# @rtype:
+# """
+#def setSolverDamping():
+# """
+# Does something
+#
+# @rtype:
+# """
+#def setSolverTau():
+# """
+# Does something
+#
+# @rtype:
+# """
+#def setSolverType():
+# """
+# Does something
+#
+# @rtype:
+# """
+#def setSorConstant():
+# """
+# Does something
+#
+# @rtype:
+# """
+#def setUseEpa():
+# """
+# Does something
+#
+# @rtype:
+# """ \ No newline at end of file
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/SConscript b/source/gameengine/PyDoc/SConscript
deleted file mode 100644
index dabe004ae6a..00000000000
--- a/source/gameengine/PyDoc/SConscript
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/python
-Import ('env')
-import os
-
-if env['WITH_BF_FHS']:
- BLENDERPATH = os.path.join(env['BF_INSTALLDIR'], 'share', 'blender', env['BF_VERSION'])
-else:
- BLENDERPATH = env['BF_INSTALLDIR']
-
-from optparse import OptionParser
-import epydoc
-from epydoc.docbuilder import build_doc_index
-from epydoc import cli
-names = env.Glob("source/gameengine/PyDoc/*.py")
-docindex = build_doc_index(names)
-optvalues = cli.OPTION_DEFAULTS
-optvalues["verbose"] = 1
-optvalues["quiet"] = 0
-optvalues["include_source_code"] = 0
-optvalues["inheritance"] = "included"
-optvalues["show_private"] = 0
-optvalues["target"] = os.path.join(BLENDERPATH, 'doc')
-optvalues["url"] = "http://www.blender.org"
-optvalues["top"] = "Game Engine API"
-optvalues["name"] = "Blender"
-optvalues["noprivate"] = 1
-optvalues["noframes"] = 1
-optvalues["names"] = names
-optparser = OptionParser()
-optparser.set_defaults(**optvalues)
-(options, args) = optparser.parse_args([])
-print "Writing Game Engine epydocs to \"%s\"" % optvalues["target"]
-cli.write_html(docindex, options)
-
diff --git a/source/gameengine/PyDoc/VideoTexture.py b/source/gameengine/PyDoc/VideoTexture.py
index 73809a7a15c..c74bd4f0f16 100644
--- a/source/gameengine/PyDoc/VideoTexture.py
+++ b/source/gameengine/PyDoc/VideoTexture.py
@@ -1,32 +1,38 @@
# $Id$
"""
-The VideoTexture module allows you to manipulate textures during the game.
+The VideoTexture module allows you to manipulate textures during the game.
+
Several sources for texture are possible: video files, image files,
-video capture, memory buffer, camera render or a mix of that.
+video capture, memory buffer, camera render or a mix of that.
+
The video and image files can be loaded from the internet using an URL
-instead of a file name. In addition, you can apply filters on the images
-before sending them to the GPU, allowing video effect: blue screen,
-color band, gray, normal map.
+instead of a file name.
+
+In addition, you can apply filters on the images before sending them to the GPU, allowing video effect: blue screen,
+color band, gray, normal map.
+
VideoTexture uses FFmpeg to load images and videos. All the formats and codecs
-that FFmpeg supports are supported by VideoTexture, including but not limited to:
+that FFmpeg supports are supported by VideoTexture, including but not limited to::
- * AVI
- * Ogg
- * Xvid
- * Theora
- * dv1394 camera
- * video4linux capture card (this includes many webcams)
- * videoForWindows capture card (this includes many webcams)
- * JPG
+ * AVI
+ * Ogg
+ * Xvid
+ * Theora
+ * dv1394 camera
+ * video4linux capture card (this includes many webcams)
+ * videoForWindows capture card (this includes many webcams)
+ * JPG
The principle is simple: first you identify a texture on an existing object using
the L{materialID} function, then you create a new texture with dynamic content
-and swap the two textures in the GPU.
+and swap the two textures in the GPU.
+
The GE is not aware of the substitution and continues to display the object as always,
-except that you are now in control of the texture. When the texture object is deleted,
-the new texture is deleted and the old texture restored.
+except that you are now in control of the texture.
-Example:
+When the texture object is deleted, the new texture is deleted and the old texture restored.
+
+Example::
import VideoTexture
import GameLogic
@@ -58,7 +64,7 @@ Example:
"""
def getLastError():
"""
- Returns the description of the last error that occured in a VideoTexture function.
+ Returns the description of the last error that occurred in a VideoTexture function.
@rtype: string
"""
@@ -71,15 +77,18 @@ def imageToArray(image,mode):
@param mode: optional argument representing the pixel format.
You can use the characters R, G, B for the 3 color channels, A for the alpha channel,
0 to force a fixed 0 color channel and 1 to force a fixed 255 color channel.
- Example: "BGR" will return 3 bytes per pixel with the Blue, Green and Red channels in that order.
+ Example: "BGR" will return 3 bytes per pixel with the Blue, Green and Red channels in that order. \
"RGB1" will return 4 bytes per pixel with the Red, Green, Blue channels in that order and the alpha channel forced to 255.
The default mode is "RGBA".
@type mode: string
- @rtype: BGL.buffer object representing the image as one dimensional array of bytes of size (pixel_size*width*height), line by line starting from the bottom of the image. The pixel size and format is determined by the mode parameter.
+ @rtype: BGL.buffer
+ @returns: object representing the image as one dimensional array of bytes of size (pixel_size*width*height), line by line starting from the bottom of the image. The pixel size and format is determined by the mode parameter.
"""
+
def materialID(object,name):
"""
Returns a numeric value that can be used in L{Texture} to create a dynamic texture.
+
The value corresponds to an internal material number that uses the texture identified
by name. name is a string representing a texture name with IM prefix if you want to
identify the texture directly. This method works for basic tex face and for material,
@@ -87,6 +96,7 @@ def materialID(object,name):
position of the texture stack. name can also have MA prefix if you want to identify
the texture by material. In that case the material must have a texture channel in first
position.
+
If the object has no material that matches name, it generates a runtime error. Use try/except to catch the exception.
Ex: VideoTexture.materialID(obj, 'IMvideo.png')
@@ -198,7 +208,7 @@ def Texture():
"""
Does something
- @rtype:
+ @rtype: L{Texture}
"""
def VideoFFmpeg():
"""
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..a10733569f3
--- /dev/null
+++ b/source/gameengine/PyDoc/bge.logic.rst
@@ -0,0 +1,930 @@
+
+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:: startGame(blend)
+
+ Loads the blend file.
+
+ :arg blend: The name of the blend file
+ :type blend: string
+
+.. function:: endGame()
+
+ Ends the current game.
+
+.. function:: restartGame()
+
+ Restarts the current game by reloading the .blend file (the last saved version, not what is currently running).
+
+.. function:: LibLoad(blend, type)
+
+ Converts the all of the datablocks of the given type from the given blend.
+
+ :arg blend: The path to the blend file
+ :type blend: string
+ :arg type: The datablock type (currently only "Scene" and "Mesh" are supported)
+ :type type: string
+
+.. function:: LibNew(name, type, data)
+
+ Uses existing datablock data and loads in as a new library.
+
+ :arg name: A unique library name used for removal later
+ :type name: string
+ :arg type: The datablock type (currently only "Mesh" is supported)
+ :type type: string
+ :arg data: A list of names of the datablocks to load
+ :type data: list of strings
+
+.. function:: LibFree(name)
+
+ Frees a library, removing all objects and meshes from the currently active scenes.
+
+ :arg name: The name of the library to free (the name used in LibNew)
+ :type name: string
+
+.. 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 frames per render frame.
+
+ :return: The maximum number of logic frames per render frame
+ :rtype: integer
+
+.. function:: setMaxLogicFrame(maxlogic)
+
+ Sets the maximum number of logic frames 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 frames per render frame. Valid values: 1..5
+ :type maxlogic: integer
+
+.. function:: getMaxPhysicsFrame()
+
+ Gets the maximum number of physics frames per render frame.
+
+ :return: The maximum number of physics frames 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
+
+*****************
+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..9f17455601b
--- /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 blur effect.
+
+ :arg factor: the ammount of motion blur to display.
+ :type factor: float [0.0 - 1.0]
+
+
+.. function:: disableMotionBlur()
+
+ Disable the motion blur effect.
+
diff --git a/source/gameengine/PyDoc/bge.types.rst b/source/gameengine/PyDoc/bge.types.rst
new file mode 100644
index 00000000000..028b4fa72f3
--- /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<keyboard-keys>`, :ref:`status<input-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<mouse-keys>`, :ref:`status<input-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<sensor-status>`.
+
+ :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<action-actuator>`.
+
+ :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<shape-action-actuator>`.
+
+ :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 <constraint-actuator-option>`
+
+ :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 <constraint-actuator-limit>`
+
+ :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 <game-actuator>`
+
+ :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 <ipo-actuator>`
+
+ :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<mouse-keys>`
+ :type button: int
+ :return: The state of the given key, can be one of :ref:`these constants<input-status>`
+ :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 <http://pyopengl.sourceforge.net>`_ and `GLEWPy <http://glewpy.sourceforge.net>`_
+
+ .. 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<logic-sound-actuator>`
+
+ :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 <state-actuator-operation>`
+
+ :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 <Two-D-FilterActuator-mode>`
+
+ :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<keyboard-keys>`, :ref:`status<input-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<keyboard-keys>`
+ :type keycode: integer
+ :return: The state of the given key, can be one of :ref:`these constants<input-status>`
+ :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 <logic-property-sensor>`
+
+ :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 <logic-random-distributions>`
+
+ :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 '<bone_name>:<constraint_name>'.
+
+ :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 <armatureactuator-constants-type>`
+
+ :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 <armaturesensor-type>`
+
+ :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<armatureconstraint-constants-type>`.
+
+ :type: integer, one of CONSTRAINT_TYPE_* constants
+
+ .. attribute:: name
+
+ Name of constraint constructed as <bone_name>:<constraint_name>. 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<armatureconstraint-constants-ik-type>`.
+
+ :type: integer.
+
+ .. attribute:: ik_flag
+
+ Combination of IK constraint option flags, read-only.
+
+ Use one of :ref:`these constants<armatureconstraint-constants-ik-flag>`.
+
+ :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<armatureconstraint-constants-ik-mode>`.
+
+ 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_quaternion
+
+ 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:: rotation_euler
+
+ 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/Rasterizer/CMakeLists.txt b/source/gameengine/Rasterizer/CMakeLists.txt
index 096b1583e3e..d718bf3e507 100644
--- a/source/gameengine/Rasterizer/CMakeLists.txt
+++ b/source/gameengine/Rasterizer/CMakeLists.txt
@@ -43,4 +43,3 @@ SET(INC
ADD_DEFINITIONS(-DGLEW_STATIC)
BLENDERLIB(bf_rasterizer "${SRC}" "${INC}")
-#env.BlenderLib ( 'bf_rasterizer', sources, Split(incs), [], libtype=['game','player'], priority=[35,115], compileflags = cflags )
diff --git a/source/gameengine/Rasterizer/Makefile b/source/gameengine/Rasterizer/Makefile
index a12d599b60b..d800a02b181 100644
--- a/source/gameengine/Rasterizer/Makefile
+++ b/source/gameengine/Rasterizer/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.
@@ -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 <stdio.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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 <stdio.h>
-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 <config.h>
-#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 <config.h>
-#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/CMakeLists.txt b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
index 5d6f61ebfa1..cc48952dc20 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
@@ -44,4 +44,3 @@ SET(INC
ADD_DEFINITIONS(-DGLEW_STATIC)
BLENDERLIB(bf_oglrasterizer "${SRC}" "${INC}")
-#env.BlenderLib ( 'bf_oglrasterizer', Split(sources), Split(incs), [], libtype=['game','player'], priority=[40, 120] )
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/Makefile b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/Makefile
index 0327714dc5f..357bdf9d99b 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/Makefile
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/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.
@@ -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.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
index d3c14b4758c..28c56b92c3c 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
@@ -72,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..622ba852934 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 <config.h>
-#endif
-
#include "RAS_VAOpenGLRasterizer.h"
#include <stdlib.h>
@@ -95,8 +91,8 @@ void RAS_VAOpenGLRasterizer::SetDrawingMode(int drawingmode)
void RAS_VAOpenGLRasterizer::Exit()
{
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_NORMAL_ARRAY);
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
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 <config.h>
-#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/CMakeLists.txt b/source/gameengine/SceneGraph/CMakeLists.txt
index 3242ec57d94..a73130531c0 100644
--- a/source/gameengine/SceneGraph/CMakeLists.txt
+++ b/source/gameengine/SceneGraph/CMakeLists.txt
@@ -32,4 +32,3 @@ SET(INC
)
BLENDERLIB(bf_scenegraph "${SRC}" "${INC}")
-#env.BlenderLib ( 'bf_scenegraph', sources, Split(incs), [], libtype=['game','player'], priority=[50,130] )
diff --git a/source/gameengine/SceneGraph/Makefile b/source/gameengine/SceneGraph/Makefile
index acec1b729e8..8a797ae5a0e 100644
--- a/source/gameengine/SceneGraph/Makefile
+++ b/source/gameengine/SceneGraph/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/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 <config.h>
-#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 <config.h>
-#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 706568fc3fe..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 <algorithm>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
using namespace std;
diff --git a/source/gameengine/SceneGraph/SG_Node.h b/source/gameengine/SceneGraph/SG_Node.h
index 5d2bac2b955..30d09b5bdfd 100644
--- a/source/gameengine/SceneGraph/SG_Node.h
+++ b/source/gameengine/SceneGraph/SG_Node.h
@@ -269,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 <config.h>
-#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/CMakeLists.txt b/source/gameengine/VideoTexture/CMakeLists.txt
index eaee00753ff..3af514ca0de 100644
--- a/source/gameengine/VideoTexture/CMakeLists.txt
+++ b/source/gameengine/VideoTexture/CMakeLists.txt
@@ -64,4 +64,3 @@ ELSE(WITH_PYTHON)
ENDIF(WITH_PYTHON)
BLENDERLIB(bf_videotex "${SRC}" "${INC}")
-#env.BlenderLib ( 'bf_videotex', sources, Split(incs), [], libtype=['game','player'], priority=[25, 72], compileflags = cflags )
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/Makefile b/source/gameengine/VideoTexture/Makefile
index 1cb147860cd..af3417eef02 100644
--- a/source/gameengine/VideoTexture/Makefile
+++ b/source/gameengine/VideoTexture/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/gameengine/VideoTexture/VideoFFmpeg.cpp b/source/gameengine/VideoTexture/VideoFFmpeg.cpp
index 290af8e63c5..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 <stdint.h>
@@ -937,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/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/icons/Makefile b/source/icons/Makefile
index a31ae9a56c7..5832a098592 100644
--- a/source/icons/Makefile
+++ b/source/icons/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/kernel/CMakeLists.txt b/source/kernel/CMakeLists.txt
index 4cf3f7ac7c1..46c5ea89ce5 100644
--- a/source/kernel/CMakeLists.txt
+++ b/source/kernel/CMakeLists.txt
@@ -35,4 +35,3 @@ FILE(GLOB SRC
)
BLENDERLIB(bf_kernel "${SRC}" "${INC}")
-#env.BlenderLib ( 'bf_kernel', Split(sources), Split(incs), [], libtype = ['common','game2', 'player'], priority = [15, 10, 150] )
diff --git a/source/kernel/Makefile b/source/kernel/Makefile
index b71491b46d1..aa0b3dd3bf1 100644
--- a/source/kernel/Makefile
+++ b/source/kernel/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/kernel/gen_messaging/Makefile b/source/kernel/gen_messaging/Makefile
index f94f6f082dd..a1d203bcf18 100644
--- a/source/kernel/gen_messaging/Makefile
+++ b/source/kernel/gen_messaging/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/kernel/gen_messaging/intern/Makefile b/source/kernel/gen_messaging/intern/Makefile
index f88bcd53c6e..7b6b2169540 100644
--- a/source/kernel/gen_messaging/intern/Makefile
+++ b/source/kernel/gen_messaging/intern/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/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 <config.h>
-#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 <config.h>
-#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 <config.h>
-#endif
-
GEN_Matrix4x4::GEN_Matrix4x4()
{
Identity();
diff --git a/source/kernel/gen_system/Makefile b/source/kernel/gen_system/Makefile
index 31535ad2a97..45f491cbeb4 100644
--- a/source/kernel/gen_system/Makefile
+++ b/source/kernel/gen_system/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/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 <config.h>
-#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 <config.h>
-#endif
-
SYS_SystemHandle SYS_GetSystem()
{
return (SYS_SystemHandle) SYS_SingletonSystem::Instance();